Index: /soft/giet_vm/Makefile
===================================================================
--- /soft/giet_vm/Makefile	(revision 294)
+++ /soft/giet_vm/Makefile	(revision 295)
@@ -11,5 +11,5 @@
 ### partition sectors    = 524832 
 
-MAP_XML      = mappings/4c_1p_iob_four.xml
+MAP_XML      = mappings/4c_4p_sort_leti_ext.xml
 
 ### Objects to be linked for kernel.elf
@@ -18,4 +18,5 @@
                build/fat32/fat32.o        \
                build/drivers/dma_driver.o \
+               build/drivers/cma_driver.o \
                build/drivers/fbf_driver.o \
                build/drivers/xcu_driver.o \
@@ -26,4 +27,5 @@
                build/drivers/sdc_driver.o \
                build/drivers/spi_driver.o \
+               build/drivers/rdk_driver.o \
                build/drivers/iob_driver.o \
                build/drivers/mmc_driver.o \
@@ -32,4 +34,5 @@
                build/drivers/tim_driver.o \
                build/drivers/tty_driver.o \
+               build/drivers/pic_driver.o \
                build/kernel/giet.o        \
                build/kernel/switch.o      \
@@ -44,15 +47,15 @@
                build/common/vmem.o        \
                build/fat32/fat32.o        \
+               build/drivers/dma_driver.o \
                build/drivers/tty_driver.o \
+               build/drivers/pic_driver.o \
                build/drivers/xcu_driver.o \
-               build/drivers/dma_driver.o \
-               build/drivers/mwr_driver.o \
                build/drivers/ioc_driver.o \
                build/drivers/bdv_driver.o \
-               build/drivers/hba_driver.o \
                build/drivers/sdc_driver.o \
                build/drivers/spi_driver.o \
-               build/drivers/nic_driver.o \
+               build/drivers/rdk_driver.o \
                build/drivers/mmc_driver.o \
+               build/drivers/mwr_driver.o \
                build/kernel/ctx_handler.o \
                build/kernel/switch.o      \
@@ -96,4 +99,10 @@
               build/libs/barrier.o
 
+### Objects to be linked for transpose.elf
+TRANSPOSE_OBJS = build/transpose/main.o  \
+                 build/libs/stdio.o      \
+                 build/libs/malloc.o     \
+                 build/libs/spin_lock.o  \
+                 build/libs/barrier.o
 
 CFLAGS = -Wall -ffreestanding -mno-gpopt -mips32
@@ -123,4 +132,5 @@
      build/gameoflife/gameoflife.elf \
      build/sort/sort.elf             \
+     build/transpose/transpose.elf   \
      hdd/virt_hdd.dmg
 
@@ -128,13 +138,16 @@
 ### This requires the generic LINUX/MacOS script "create_dmg" script 
 ### written by C.Fuguet. (should be installed in GIET-VM root directory).
-hdd/virt_hdd.dmg: map.bin                   \
-         build/boot/boot.elf            \
-         build/kernel/kernel.elf        \
-         build/display/display.elf      \
-         build/hello/hello.elf          \
-         build/pgcd/pgcd.elf            \
-         build/router/router.elf        \
-         build/dhrystone/dhrystone.elf  \
-         build/gameoflife/gameoflife.elf
+hdd/virt_hdd.dmg: map.bin                \
+         build/boot/boot.elf             \
+         build/kernel/kernel.elf         \
+         build/display/display.elf       \
+         build/hello/hello.elf           \
+         build/pgcd/pgcd.elf             \
+         build/router/router.elf         \
+         build/dhrystone/dhrystone.elf   \
+         build/gameoflife/gameoflife.elf \
+         build/sort/sort.elf             \
+         build/transpose/transpose.elf 
+
 ### remove all content of virtual disk virt_hdd
 	rm -rf hdd/virt_hdd/*
@@ -162,4 +175,10 @@
 
 ### drivers compilation
+build/drivers/cma_driver.o: giet_drivers/cma_driver.c  \
+                            giet_drivers/cma_driver.h  \
+                            giet_config.h              \
+                            $(MAP_XML)
+	$(CC) $(GIET_INCLUDE) $(CFLAGS)  -c -o $@ $<
+
 build/drivers/dma_driver.o: giet_drivers/dma_driver.c  \
                             giet_drivers/dma_driver.h  \
@@ -216,4 +235,10 @@
 	$(CC) $(GIET_INCLUDE) $(CFLAGS)  -c -o $@ $<
 
+build/drivers/rdk_driver.o: giet_drivers/rdk_driver.c  \
+                            giet_drivers/rdk_driver.h  \
+                            giet_config.h              \
+                            $(MAP_XML)
+	$(CC) $(GIET_INCLUDE) $(CFLAGS)  -c -o $@ $<
+
 build/drivers/iob_driver.o: giet_drivers/iob_driver.c  \
                             giet_drivers/iob_driver.h  \
@@ -248,4 +273,10 @@
 build/drivers/tty_driver.o: giet_drivers/tty_driver.c  \
                             giet_drivers/tty_driver.h  \
+                            giet_config.h              \
+                            $(MAP_XML)
+	$(CC) $(GIET_INCLUDE) $(CFLAGS)  -c -o $@ $<
+
+build/drivers/pic_driver.o: giet_drivers/pic_driver.c  \
+                            giet_drivers/pic_driver.h  \
                             giet_config.h              \
                             $(MAP_XML)
@@ -399,4 +430,12 @@
 
 build/sort/main.o: sort/main.c
+	$(CC) $(USER_INCLUDE) $(CFLAGS) -c -o $@ $<
+
+### transpose compilation
+build/transpose/transpose.elf: $(TRANSPOSE_OBJS) transpose/transpose.ld 
+	$(LD) -o $@ -T transpose/transpose.ld $(TRANSPOSE_OBJS)
+	$(DU) -D $@ > $@.txt
+
+build/transpose/main.o: transpose/main.c
 	$(CC) $(USER_INCLUDE) $(CFLAGS) -c -o $@ $<
 
@@ -419,4 +458,5 @@
 	rm -rf build/dhrystone/*
 	rm -rf build/sort/*
+	rm -rf build/transpose/*
 	rm -rf build/map.bin
 	rm -rf hdd/virt_hdd/*
Index: /soft/giet_vm/display/main.c
===================================================================
--- /soft/giet_vm/display/main.c	(revision 294)
+++ /soft/giet_vm/display/main.c	(revision 295)
@@ -1,3 +1,4 @@
-#include <stdio.h>
+#include "stdio.h"
+#include "hard_config.h"
 
 #define NBLOCKS 32   // (128 * 128) / 512
@@ -7,11 +8,17 @@
 __attribute__((constructor)) void main()
 {  
-    int           fd;
-    int           blocks;
-    unsigned int  ko;
-    unsigned int  blocks_to_skip = 8*NBLOCKS;
+    int             fd;
+    int             blocks;
+    unsigned int    ko;
+    unsigned int    blocks_to_skip = 8*NBLOCKS;
 
-    giet_tty_printf("\nStarting task DISPLAY on processor %d at cycle %d\n",
-                    giet_procid(), giet_proctime() );
+    unsigned int    procid     = giet_procid();
+    unsigned int    cluster_xy = procid/NB_PROCS_MAX;
+    unsigned int    lpid       = procid%NB_PROCS_MAX;
+    unsigned int    x          = cluster_xy >> Y_WIDTH;
+    unsigned int    y          = cluster_xy & ((1<<Y_WIDTH)-1);
+
+    giet_tty_printf( "*** Starting task display on processor[%d,%d,%d] at cycle %d\n\n", 
+                      x, y, lpid, giet_proctime() );
 
     ///////////////////////////////////////////
Index: /soft/giet_vm/display/main_cma.c
===================================================================
--- /soft/giet_vm/display/main_cma.c	(revision 294)
+++ /soft/giet_vm/display/main_cma.c	(revision 295)
@@ -1,3 +1,4 @@
-#include <stdio.h>
+#include "stdio.h"
+#include "hard_config.h"
 
 #define NBLOCKS 32
@@ -8,11 +9,14 @@
 __attribute__((constructor)) void main(void)
 {
-    unsigned int ko;
-    int          blocks;
-    int          fd;
-    unsigned int blocks_to_skip = 0;
+    int             fd;
+    unsigned int    blocks_to_skip = 0;
+    unsigned int    procid         = giet_procid();
+    unsigned int    cluster_xy     = procid/NB_PROCS_MAX;
+    unsigned int    lpid           = procid%NB_PROCS_MAX;
+    unsigned int    x              = cluster_xy >> Y_WIDTH;
+    unsigned int    y              = cluster_xy & ((1<<Y_WIDTH)-1);
 
-    giet_tty_printf("\nStarting task DISPLAY on processor %d at cycle %d\n",
-                    giet_procid(), giet_proctime() );
+    giet_tty_printf( "*** Starting task display on processor[%d,%d,%d] at cycle %d\n\n", 
+                      x, y, lpid, giet_proctime() );
 
     //////////////////////////////////////////
@@ -30,78 +34,38 @@
     }
 
-    ////////////////////////////////////////////
-    ko = giet_fb_cma_init( buf0, buf1, 128*128 );
-    if ( ko )
-    {
-        giet_tty_printf("\n*** echec giet_cma_init at cycle %d\n", 
+    ////////////////////////////////////////
+    giet_fb_cma_init( buf0, buf1, 128*128 );
+
+    giet_tty_printf("\ngiet_cma_init completed at cycle %d\n", 
                         giet_proctime() );
-        giet_exit();
-    }
-    else
-    {
-        giet_tty_printf("\ngiet_cma_init completed at cycle %d\n", 
-                        giet_proctime() );
-    }
-
  
     while ( blocks_to_skip < 10 * NBLOCKS )
     {
-        ////////////////////////////////////////////////////////////
-        blocks = giet_fat_read( fd, buf0, NBLOCKS, blocks_to_skip );
-        if ( blocks != NBLOCKS )
-        {
-            giet_tty_printf("\nechec giet_fat_read to buf0 at cycle %d\n",
+        ///////////////////////////////////////////////////
+        giet_fat_read( fd, buf0, NBLOCKS, blocks_to_skip );
+
+        giet_tty_printf("\ngiet_fat_read to buf0 completed at cycle = %d\n",
                             giet_proctime() );
-            giet_exit();
-        }
-        else
-        {
-            giet_tty_printf("\ngiet_fat_read to buf0 completed at cycle = %d\n",
+
+        ///////////////////////
+        giet_fb_cma_write( 0 );
+
+        giet_tty_printf("giet_cma_write for buf0 completed at cycle = %d\n",
                             giet_proctime() );
-        }
-
-        ///////////////////////////
-        ko = giet_fb_cma_write( 0 );
-        if ( ko )
-        {
-            giet_tty_printf("echec giet_cma_write for buf0 at cycle %d\n",
-                            giet_proctime() );
-            giet_exit();
-        }
-        else
-        {
-            giet_tty_printf("giet_cma_write for buf0 completed at cycle = %d\n",
-                            giet_proctime() );
-        }
 
         blocks_to_skip = blocks_to_skip + NBLOCKS;
 
-        ///////////////////////////////////////////////////////
-        blocks = giet_fat_read( fd, buf1, NBLOCKS, blocks_to_skip );
-        if ( blocks != NBLOCKS )
-        {
-            giet_tty_printf("echec giet_fat_read to buf1 at cycle %d\n",
+        ///////////////////////////////////////////////////
+        giet_fat_read( fd, buf1, NBLOCKS, blocks_to_skip );
+
+        giet_tty_printf("giet_fat_read to buf1 completed at cycle = %d\n",
                             giet_proctime() );
-            giet_exit();
-        }
-        else
-        {
-            giet_tty_printf("giet_fat_read to buf1 completed at cycle = %d\n",
+
+        ///////////////////////
+        giet_fb_cma_write( 1 );
+        
+        giet_tty_printf("giet_cma_write for buf1 completed at cycle = %d\n",
                             giet_proctime() );
-        }
 
-        ////////////////////////////
-        ko = giet_fb_cma_write( 1 );
-        if ( ko )
-        {
-            giet_tty_printf("echec giet_cma_write for buf1 at cycle %d\n",
-                            giet_proctime() );
-            giet_exit();
-        }
-        else
-        {
-            giet_tty_printf("giet_cma_write for buf1 completed at cycle = %d\n",
-                            giet_proctime() );
-        }
         blocks_to_skip = blocks_to_skip + NBLOCKS;
     }
Index: /soft/giet_vm/gameoflife/main.c
===================================================================
--- /soft/giet_vm/gameoflife/main.c	(revision 294)
+++ /soft/giet_vm/gameoflife/main.c	(revision 295)
@@ -20,4 +20,6 @@
 
 giet_barrier_t barriers[2];
+
+unsigned int init_ok = 1;
 
 #define NEW 0
@@ -80,9 +82,12 @@
 }
 
+//////////////////////////////////////////////////////
 void compute_new_gen(size_t base_line, size_t nb_line)
 {
    size_t x,y;
-   for (y = base_line; y < base_line + nb_line; y++){
-      for(x = 0; x < WIDTH ; x++) {
+   for (y = base_line; y < base_line + nb_line; y++)
+   {
+      for(x = 0; x < WIDTH ; x++) 
+      {
          world[NEW][y][x] = compute_cell(x,y);  
       }
@@ -90,4 +95,5 @@
 }
 
+////////////////////////////////////////////////////
 void display_world(size_t base_line, size_t nb_line)
 {
@@ -100,28 +106,21 @@
    }
 
-   if (giet_fb_sync_write(base_line * WIDTH , &world[NEW][base_line][0], nb_line * WIDTH))
-   {
-      PRINTF("Echec fb_sync_write\n");
-      giet_exit();
-   }
-   // TODO COLOR !
-   /*if (giet_fb_sync_write(base_line * WIDTH + WIDTH*HEIGHT , &world_yuv[base_line][0], nb_line * WIDTH))
-   {
-      PRINTF("Echec fb_sync_write\n");
-      giet_exit();
-   }*/
+   giet_fb_sync_write( base_line * WIDTH , 
+                       &world[NEW][base_line][0], 
+                       nb_line * WIDTH);
 }
 
+/////////////////////////////////////////////////////
 void grow_old_world(size_t base_line, size_t nb_line)
 {
    size_t x,y;
-   for (y = base_line; y < base_line + nb_line; y++){
-      for(x = 0; x < WIDTH ; x++) {
+   for (y = base_line; y < base_line + nb_line; y++)
+   {
+      for(x = 0; x < WIDTH ; x++) 
+      {
          world[OLD][y][x] = world[NEW][y][x];  
       }
    }
 }
-
-
 
 ////////////////////////////////////////
@@ -131,6 +130,4 @@
    unsigned int nlocal_procs  = NB_PROCS_MAX;               // processors per cluster
    unsigned int nclusters     = X_SIZE*Y_SIZE;              // number of clusters
-   unsigned int local_id      = proc_id % nlocal_procs;     // local processor id
-   unsigned int cluster_id    = proc_id / nlocal_procs;     // cluster id
    unsigned int nglobal_procs = nclusters * nlocal_procs;   // number of tasks
    size_t i;
@@ -142,6 +139,16 @@
 
    //  barriers initialization
-   barrier_init(&barriers[0], nglobal_procs);
-   barrier_init(&barriers[1], nglobal_procs);
+   if ( proc_id == 0 )
+   {
+      barrier_init(&barriers[0], nglobal_procs);
+      barrier_init(&barriers[1], nglobal_procs);
+
+      init_ok = 0;
+   }
+   else
+   {
+      while ( init_ok == 1 );
+   }
+
    init_world(base_line, nb_line);
 
Index: /soft/giet_vm/giet_boot/boot.c
===================================================================
--- /soft/giet_vm/giet_boot/boot.c	(revision 294)
+++ /soft/giet_vm/giet_boot/boot.c	(revision 295)
@@ -68,5 +68,4 @@
 ///////////////////////////////////////////////////////////////////////////////////////
 
-// for vobjs initialisation
 #include <giet_config.h>
 #include <mwmr_channel.h>
@@ -80,4 +79,5 @@
 #include <nic_driver.h>
 #include <ioc_driver.h>
+#include <pic_driver.h>
 #include <mwr_driver.h>
 #include <ctx_handler.h>
@@ -874,5 +874,5 @@
         _putx( curr->length );
         _puts(" / vbase ");
-        _putl( curr->vbase );
+        _putx( curr->vbase );
         _puts(" / pbase ");
         _putl( curr->pbase );
@@ -894,7 +894,7 @@
         boot_vspace_pt_build(vspace_id);
 
-        _puts("\n[BOOT] Page Table for vspace ");
+        _puts("\n[BOOT] Page Table for vspace \"");
         _puts( vspace[vspace_id].name );
-        _puts(" completed at cycle ");
+        _puts("\" completed at cycle ");
         _putd( _get_proctime() );
         _puts("\n");
@@ -1149,9 +1149,9 @@
     mapping_task_t*    task    = _get_task_base(header);
     mapping_vobj_t*    vobj    = _get_vobj_base(header);
-    mapping_proc_t*    proc    = _get_proc_base(header);
+    mapping_periph_t*  periph  = _get_periph_base(header);
     mapping_irq_t*     irq     = _get_irq_base(header);
 
     unsigned int cluster_id;    // cluster index in mapping_info 
-    unsigned int proc_id;       // processor index in mapping_info 
+    unsigned int periph_id;     // peripheral index in mapping_info
     unsigned int irq_id;        // irq index in mapping_info
     unsigned int vspace_id;     // vspace index in mapping_info
@@ -1163,11 +1163,9 @@
     //   are reserved for the kernel (context switch)
 
-    unsigned int alloc_tty_channel = 0;            // TTY channel allocator
-    unsigned int alloc_nic_channel = 0;            // NIC channel allocator
-    unsigned int alloc_cma_channel = 0;            // CMA channel allocator
-    unsigned int alloc_hba_channel = 0;            // IOC channel allocator
-    unsigned int alloc_tim_channel[X_SIZE*Y_SIZE]; // user TIMER allocators
-
-    if (NB_TTY_CHANNELS > 1) alloc_tty_channel++;
+    unsigned int alloc_tty_channel = 1;             // TTY channel allocator
+    unsigned int alloc_nic_channel = 0;             // NIC channel allocator
+    unsigned int alloc_cma_channel = 0;             // CMA channel allocator
+    unsigned int alloc_hba_channel = 0;             // HBA channel allocator
+    unsigned int alloc_tim_channel[X_SIZE*Y_SIZE];  // user TIMER allocators
 
     /////////////////////////////////////////////////////////////////////////
@@ -1198,13 +1196,6 @@
         alloc_tim_channel[cluster_id] = NB_PROCS_MAX;
 
-        unsigned int  lpid;          // processor local index in cluster
-        unsigned int  sched_vbase;   // schedulers segment virtual base address
-        unsigned int  sched_length;  // schedulers segment length
-        unsigned int  nprocs;        // number of processors in cluster
-
-        nprocs = cluster[cluster_id].procs;
-
         // checking processors number
-        if ( nprocs > NB_PROCS_MAX )
+        if ( cluster[cluster_id].procs > NB_PROCS_MAX )
         {
             _puts("\n[BOOT ERROR] Too much processors in cluster[");
@@ -1216,105 +1207,165 @@
         }
  
-        // get scheduler array virtual base address and length
-        boot_get_sched_vaddr( cluster_id, &sched_vbase, &sched_length );
-
-        // each processor scheduler requires 4 Kbytes
-        if ( sched_length < (nprocs<<12) ) 
-        {
-            _puts("\n[BOOT ERROR] Schedulers segment too small in cluster[");
-            _putd( x );
-            _puts(",");
-            _putd( y );
-            _puts("]\n");
-            _exit();
-        }
-
-        // loop on processors
-        for ( proc_id = cluster[cluster_id].proc_offset, lpid = 0 ;
-              proc_id < cluster[cluster_id].proc_offset + cluster[cluster_id].procs;
-              proc_id++, lpid++ ) 
-        {
-            // current processor scheduler pointer : psched
-            static_scheduler_t* psched = (static_scheduler_t*)(sched_vbase+(lpid<<12));
-
-            // set the schedulers pointers array
-            _schedulers[cluster_xy * NB_PROCS_MAX + lpid] = psched;
+        static_scheduler_t* psched;  // schedulers array base address in cluster
+
+        // no schedulers initialisation if nprocs == 0
+        if ( cluster[cluster_id].procs > 0 )
+        {
+            // get scheduler array virtual base address and length 
+            unsigned int        sched_vbase;   // schedulers segment virtual base address
+            unsigned int        sched_length;  // schedulers segment length
+            boot_get_sched_vaddr( cluster_id, &sched_vbase, &sched_length );
+
+            if ( sched_length < (cluster[cluster_id].procs<<12) ) // 4 Kbytes per scheduler
+            {
+                _puts("\n[BOOT ERROR] Schedulers segment too small in cluster[");
+                _putd( x );
+                _puts(",");
+                _putd( y );
+                _puts("]\n");
+                _exit();
+            }
+
+            psched = (static_scheduler_t*)sched_vbase;
+
+            // scan cluster peripherals to find the ICU/XCU 
+            unsigned int found = 0;
+            for ( periph_id = cluster[cluster_id].periph_offset ;
+                  periph_id < cluster[cluster_id].periph_offset + cluster[cluster_id].periphs;
+                  periph_id++ )
+            {
+                if( (periph[periph_id].type == PERIPH_TYPE_XCU) || 
+                    (periph[periph_id].type == PERIPH_TYPE_ICU) )
+                {
+                    found = 1;
+                    break;
+                }
+            } 
+            if ( found == 0 )
+            {         
+                _puts("\n[BOOT ERROR] No ICU / XCU component in cluster[");
+                _putd( x );
+                _puts(",");
+                _putd( y );
+                _puts("]\n");
+                _exit();
+            }
+
+            // loop on schedulers for default values initialisation
+            unsigned int lpid;
+            for ( lpid = 0 ; lpid < cluster[cluster_id].procs ; lpid++ )
+            {
+                // set the schedulers pointers array
+                _schedulers[cluster_xy * NB_PROCS_MAX + lpid] = 
+                      (static_scheduler_t*)&psched[lpid];
 
 #if BOOT_DEBUG_SCHED
-_puts("\nProc_");
+_puts("\nProc[");
 _putd( x );
-_puts("_");
+_puts(",");
 _putd( y );
-_puts("_");
+_puts(",");
 _putd( lpid );
-_puts(" : scheduler virtual base address = ");
-_putx( sched_vbase + (lpid<<12) );
-_puts("\n");
-#endif
-
-            // initialise the "tasks" variable : default value is 0 
-            psched->tasks = 0;
-
-            // initialise the "current" variable : default value is idle_task
-            psched->current = IDLE_TASK_INDEX;
-
-            // initialise interrupt_vector with default value (valid bit = 0)
-            unsigned int slot;
-            for (slot = 0; slot < 32; slot++) psched->interrupt_vector[slot] = 0;
-
-            // initialise interrupt vector with the IRQs actually allocated
-            for (irq_id = proc[proc_id].irq_offset;
-                 irq_id < proc[proc_id].irq_offset + proc[proc_id].irqs;
-                 irq_id++) 
+_puts("] : scheduler virtual base address = ");
+_putx( (unsigned int)&psched[lpid] );
+_puts("\n");
+#endif
+                // initialise the "tasks" and "current" variables default values
+                psched[lpid].tasks   = 0;
+                psched[lpid].current = IDLE_TASK_INDEX;
+
+                // initialise HWI / PTI / SWI vectors (valid bit = 0)
+                unsigned int slot;
+                for (slot = 0; slot < 32; slot++)
+                {
+                    psched[lpid].hwi_vector[slot] = 0;
+                    psched[lpid].pti_vector[slot] = 0;
+                    psched[lpid].wti_vector[slot] = 0;
+                }
+
+                // initializes the idle_task context in scheduler:
+                // - the SR slot is 0xFF03 because this task run in kernel mode.
+                // - it uses the page table of vspace[0]
+                // - it uses the kernel TTY terminal
+                // - slots containing addresses (SP, RA, EPC, PTAB, PTPR)
+                //   must be re-initialised by kernel_parallel_init()
+
+                psched[lpid].context[IDLE_TASK_INDEX][CTX_CR_ID]    = 0;
+                psched[lpid].context[IDLE_TASK_INDEX][CTX_SR_ID]    = 0xFF03;
+                psched[lpid].context[IDLE_TASK_INDEX][CTX_PTPR_ID]  = _ptabs_paddr[0]>>13;
+                psched[lpid].context[IDLE_TASK_INDEX][CTX_PTAB_ID]  = _ptabs_vaddr[0];
+                psched[lpid].context[IDLE_TASK_INDEX][CTX_TTY_ID]   = 0;
+                psched[lpid].context[IDLE_TASK_INDEX][CTX_LTID_ID]  = IDLE_TASK_INDEX;
+                psched[lpid].context[IDLE_TASK_INDEX][CTX_VSID_ID]  = 0;
+                psched[lpid].context[IDLE_TASK_INDEX][CTX_RUN_ID]   = 1;
+            }
+
+           
+            // loop on irqs for actual HWI / PTI / WTI vectors initialisation      
+            for ( irq_id = periph[periph_id].irq_offset ;
+                  irq_id < periph[periph_id].irq_offset + periph[periph_id].irqs ;
+                  irq_id++ )
             {
-                unsigned int type    = irq[irq_id].type;
-                unsigned int icu_id  = irq[irq_id].icuid;
-                unsigned int isr_id  = irq[irq_id].isr;
+                unsigned int lpid    = irq[irq_id].dstid;
+                unsigned int dstx    = irq[irq_id].dstx;
+                unsigned int dsty    = irq[irq_id].dsty;
+                if ( (dstx != x) || (dsty != y) )
+                {
+                    _puts("\n[BOOT ERROR] Bad IRQ cluster coordinates in cluster[");
+                    _putd( x );
+                    _puts(",");
+                    _putd( y );
+                    _puts("]\n - dstx  = ");
+                    _putd( dstx );
+                    _puts("\n - dsty  = ");
+                    _putd( dsty );
+                    _puts("\n - x     = ");
+                    _putd( x );
+                    _puts("\n - y     = ");
+                    _putd( y );
+                    _puts("\n");
+                    _exit();
+                }
+                if ( lpid >= cluster[cluster_id].procs )
+                {
+                    _puts("\n[BOOT ERROR] Bad IRQ processor index in cluster[");
+                    _putd( x );
+                    _puts(",");
+                    _putd( y );
+                    _puts("]\n");
+                    _exit();
+                }
+                unsigned int type    = irq[irq_id].srctype;
+                unsigned int index   = irq[irq_id].srcid;
+                unsigned int isr     = irq[irq_id].isr;
                 unsigned int channel = irq[irq_id].channel;
 
-                unsigned int value = ((isr_id  & 0xFF)        ) | 
-                                     ((type    & 0xFF)   <<  8) | 
+                unsigned int entry = ((isr & 0xFFFF)          ) | 
                                      ((channel & 0x7FFF) << 16) | 
                                      0x80000000;                    // Valid entry
 
-                psched->interrupt_vector[icu_id] = value;
+                if      (type == IRQ_TYPE_HWI) psched[lpid].hwi_vector[index] = entry;
+                else if (type == IRQ_TYPE_PTI) psched[lpid].pti_vector[index] = entry;
+                else if (type == IRQ_TYPE_WTI) psched[lpid].wti_vector[index] = entry;
 
 #if BOOT_DEBUG_SCHED
-_puts("- IRQ : icu = ");
-_putd(icu_id);
-_puts(" / type = ");
-_putd(type);
+_puts("- IRQ : type = ");
+_putd( type );
+_puts(" / index = ");
+_putd( index );
 _puts(" / isr = ");
-_putd(isr_id);
+_putd( isr );
 _puts(" / channel = ");
-_putd(channel);
-_puts(" => vector_entry = ");
-_putx( value );
-_puts("\n");
-#endif
-            }
-
-            // initializes the idle_task context in scheduler:
-            // - the SR slot is 0xFF03 because this task run in kernel mode.
-            // - it uses the page table of vspace[0]
-            // - it uses the kernel TTY terminal
-            // - slots containing addresses (SP, RA, EPC, PTAB, PTPR)
-            //   must be re-initialised by kernel_parallel_init()
-
-            psched->context[IDLE_TASK_INDEX][CTX_CR_ID]    = 0;
-            psched->context[IDLE_TASK_INDEX][CTX_SR_ID]    = 0xFF03;
-            psched->context[IDLE_TASK_INDEX][CTX_PTPR_ID]  = _ptabs_paddr[0]>>13;
-            psched->context[IDLE_TASK_INDEX][CTX_PTAB_ID]  = _ptabs_vaddr[0];
-            psched->context[IDLE_TASK_INDEX][CTX_TTY_ID]   = 0;
-            psched->context[IDLE_TASK_INDEX][CTX_LTID_ID]  = IDLE_TASK_INDEX;
-            psched->context[IDLE_TASK_INDEX][CTX_VSID_ID]  = 0;
-            psched->context[IDLE_TASK_INDEX][CTX_RUN_ID]   = 1;
-
-        } // end for procs
+_putd( channel );
+_puts("\n");
+#endif
+
+            } // end for irqs
+        } // end if nprocs > 0
     } // end for clusters
 
     ///////////////////////////////////////////////////////////////////
-    // Step 2 : loop on the vspaces and the tasks 
-    //          to initialise the schedulers and the task contexts.
+    // Step 2 : loop on the vspaces and the tasks  to complete
+    //          the schedulers and task contexts initialisation.
 
     for (vspace_id = 0; vspace_id < header->vspaces; vspace_id++) 
@@ -1329,9 +1380,9 @@
              task_id++) 
         {
-
-            // compute the cluster coordinates
+            // compute the cluster coordinates & local processor index
             unsigned int x          = cluster[task[task_id].clusterid].x;
             unsigned int y          = cluster[task[task_id].clusterid].y;
             unsigned int cluster_xy = (x<<Y_WIDTH) + y;
+            unsigned int lpid       = task[task_id].proclocid;                 
 
 #if BOOT_DEBUG_SCHED
@@ -1347,5 +1398,5 @@
 #endif
             // compute gpid (global processor index) and scheduler base address
-            unsigned int gpid = cluster_xy * NB_PROCS_MAX + task[task_id].proclocid;
+            unsigned int gpid = cluster_xy * NB_PROCS_MAX + lpid;
             static_scheduler_t* psched = _schedulers[gpid];
 
@@ -1360,4 +1411,6 @@
 
             // ctx_tty : TTY terminal global index provided by the global allocator
+            //           Each user terminal is a private ressource: the number of
+            //           requested terminal cannot be larger than NB_TTY_CHANNELS.             
             unsigned int ctx_tty = 0xFFFFFFFF;
             if (task[task_id].use_tty) 
@@ -1365,5 +1418,5 @@
                 if (alloc_tty_channel >= NB_TTY_CHANNELS) 
                 {
-                    _puts("\n[BOOT ERROR] TTY index too large for task ");
+                    _puts("\n[BOOT ERROR] TTY channel index too large for task ");
                     _puts(task[task_id].name);
                     _puts(" in vspace ");
@@ -1373,7 +1426,10 @@
                 }
                 ctx_tty = alloc_tty_channel;
-                if (NB_TTY_CHANNELS > 1) alloc_tty_channel++;
-            }
+                alloc_tty_channel++;
+             }
+
             // ctx_nic : NIC channel global index provided by the global allocator
+            //           Each channel is a private ressource: the number of
+            //           requested channels cannot be larger than NB_NIC_CHANNELS.
             unsigned int ctx_nic = 0xFFFFFFFF;
             if (task[task_id].use_nic) 
@@ -1391,5 +1447,8 @@
                 alloc_nic_channel++;
             }
+
             // ctx_cma : CMA channel global index provided by the global allocator
+            //           Each channel is a private ressource: the number of
+            //           requested channels cannot be larger than NB_NIC_CHANNELS.
             unsigned int ctx_cma = 0xFFFFFFFF;
             if (task[task_id].use_cma) 
@@ -1407,9 +1466,12 @@
                 alloc_cma_channel++;
             }
+
             // ctx_hba : HBA channel global index provided by the global allocator
+            //           Each channel is a private ressource: the number of
+            //           requested channels cannot be larger than NB_NIC_CHANNELS.
             unsigned int ctx_hba = 0xFFFFFFFF;
             if (task[task_id].use_hba) 
             {
-                if (alloc_hba_channel >= NB_HBA_CHANNELS) 
+                if (alloc_hba_channel >= NB_IOC_CHANNELS) 
                 {
                     _puts("\n[BOOT ERROR] IOC channel index too large for task ");
@@ -1423,5 +1485,6 @@
                 alloc_hba_channel++;
             }
-            // ctx_tim : TIM local channel index provided by the cluster allocator 
+            // ctx_tim : TIMER local channel index provided by the cluster allocator 
+            //           Each timer is a private ressource
             unsigned int ctx_tim = 0xFFFFFFFF;
             if (task[task_id].use_tim) 
@@ -1438,29 +1501,6 @@
                     _exit();
                 }
-
-                // checking that there is an ISR_TIMER installed
-                unsigned int found = 0;
-                for ( irq_id = 0 ; irq_id < 32 ; irq_id++ )  
-                {
-                    unsigned int entry   = psched->interrupt_vector[irq_id];
-                    unsigned int isr     = entry & 0x000000FF;
-                    unsigned int channel = entry>>16;
-                    if ( (isr == ISR_TIMER) && (channel == alloc_tim_channel[cluster_id]) ) 
-                    {
-                        found     = 1;
-                        ctx_tim =  alloc_tim_channel[cluster_id];
-                        alloc_tim_channel[cluster_id]++;
-                        break;
-                    }
-                }
-                if (!found) 
-                {
-                    _puts("\n[BOOT ERROR] No ISR_TIMER installed for task ");
-                    _puts(task[task_id].name);
-                    _puts(" in vspace ");
-                    _puts(vspace[vspace_id].name);
-                    _puts("\n");
-                    _exit();
-                }
+                ctx_tim =  alloc_tim_channel[cluster_id];
+                alloc_tim_channel[cluster_id]++;
             }
             // ctx_epc : Get the virtual address of the memory location containing
@@ -1520,7 +1560,11 @@
 _puts("\nTask ");
 _putd( task_id );
-_puts(" allocated to processor ");
-_putd( gpid );
-_puts("\n  - ctx[LTID]   = ");
+_puts(" allocated to processor[");
+_putd( x )
+_puts(",");
+_putd( y )
+_puts(",");
+_putd( lpid )
+_puts("]\n  - ctx[LTID]   = ");
 _putd( psched->context[ltid][CTX_LTID_ID] );
 _puts("\n  - ctx[SR]     = ");
@@ -1533,21 +1577,21 @@
 _putx( psched->context[ltid][CTX_PTPR_ID] );
 _puts("\n  - ctx[TTY]    = ");
-_putd( psched->context[ltid][CTX_TTY_ID] );
+_putx( psched->context[ltid][CTX_TTY_ID] );
 _puts("\n  - ctx[NIC]    = ");
-_putd( psched->context[ltid][CTX_NIC_ID] );
+_putx( psched->context[ltid][CTX_NIC_ID] );
 _puts("\n  - ctx[CMA]    = ");
-_putd( psched->context[ltid][CTX_CMA_ID] );
+_putx( psched->context[ltid][CTX_CMA_ID] );
 _puts("\n  - ctx[IOC]    = ");
-_putd( psched->context[ltid][CTX_HBA_ID] );
+_putx( psched->context[ltid][CTX_HBA_ID] );
 _puts("\n  - ctx[TIM]    = ");
-_putd( psched->context[ltid][CTX_TIM_ID] );
+_putx( psched->context[ltid][CTX_TIM_ID] );
 _puts("\n  - ctx[PTAB]   = ");
 _putx( psched->context[ltid][CTX_PTAB_ID] );
 _puts("\n  - ctx[GTID]   = ");
-_putd( psched->context[ltid][CTX_GTID_ID] );
+_putx( psched->context[ltid][CTX_GTID_ID] );
 _puts("\n  - ctx[VSID]   = ");
-_putd( psched->context[ltid][CTX_VSID_ID] );
+_putx( psched->context[ltid][CTX_VSID_ID] );
 _puts("\n  - ctx[TRDID]  = ");
-_putd( psched->context[ltid][CTX_TRDID_ID] );
+_putx( psched->context[ltid][CTX_TRDID_ID] );
 _puts("\n");
 #endif
@@ -1565,5 +1609,5 @@
     _ioc_init( 0 );
 
-    int fd_id = _fat_open( IOC_BOOT_PA_MODE,
+    int fd_id = _fat_open( IOC_BOOT_MODE,
                            "map.bin",
                            0 );         // no creation
@@ -1586,5 +1630,5 @@
     if ( offset ) nblocks++;
 
-    unsigned int ok = _fat_read( IOC_BOOT_PA_MODE,
+    unsigned int ok = _fat_read( IOC_BOOT_MODE,
                                  fd_id, 
                                  (unsigned int*)( &seg_boot_mapping_base), 
@@ -1781,5 +1825,5 @@
 // The "preloader.elf" file is not loaded, because it has been burned in the ROM.
 // The "boot.elf" file is not loaded, because it has been loaded by the preloader.
-// It scans all vobjs defined in the map.bin data structure to collect
+// This function scans all vobjs defined in the map.bin data structure to collect
 // all .elf files pathnames, and calls the load_one_elf_file() function to
 // load all loadable segments at the virtual address found in the .elf file.
@@ -1813,11 +1857,11 @@
     }
 
-    load_one_elf_file( IOC_BOOT_VA_MODE,
+    load_one_elf_file( IOC_BOOT_MODE,
                        vobj[vobj_id].binpath,
                        0 );                         // vspace 0
 
-    _puts("\n[BOOT] File ");
+    _puts("\n[BOOT] File \"");
     _puts( vobj[vobj_id].binpath );
-    _puts(" loaded at cycle ");
+    _puts("\" loaded at cycle ");
     _putd( _get_proctime() );
     _puts("\n");
@@ -1852,11 +1896,11 @@
         }
 
-        load_one_elf_file( IOC_BOOT_VA_MODE,
+        load_one_elf_file( IOC_BOOT_MODE,
                            vobj[vobj_id].binpath,
                            vspace_id );
 
-        _puts("\n[BOOT] File ");
+        _puts("\n[BOOT] File \"");
         _puts( vobj[vobj_id].binpath );
-        _puts(" loaded at cycle ");
+        _puts("\" loaded at cycle ");
         _putd( _get_proctime() );
         _puts("\n");
@@ -1882,4 +1926,5 @@
     mapping_coproc_t * coproc   = _get_coproc_base(header);
     mapping_cp_port_t * cp_port = _get_cp_port_base(header);
+    mapping_irq_t * irq         = _get_irq_base(header);
 
     unsigned int cluster_id;
@@ -2001,4 +2046,5 @@
                 case PERIPH_TYPE_TTY:    // vci_multi_tty component
                 {
+                    // nothing to do
 #if BOOT_DEBUG_PERI
 _puts("- TTY / channels = ");
@@ -2025,4 +2071,44 @@
 _puts("\n");
 #endif
+                    break;
+                }
+                case PERIPH_TYPE_PIC:    // vci_iopic component
+                {
+                          
+#if BOOT_DEBUG_PERI
+_puts("- PIC / channels = ");
+_putd(channels);
+_puts("\n");
+#endif
+                    // scan all HWI IRQs defined in mapping for PIC component,
+                    // and initialises addresses for WTI IRQs
+                    for ( channel_id = periph[periph_id].irq_offset ;
+                          channel_id < periph[periph_id].irq_offset + periph[periph_id].irqs ;
+                          channel_id++ )
+                    {
+                        unsigned int hwi_id  = irq[channel_id].srcid;  // HWI index in PIC
+                        unsigned int wti_id  = irq[channel_id].dstid;  // WTI index in XCU
+                        unsigned int x       = irq[channel_id].dstx;   // XCU X coordinate
+                        unsigned int y       = irq[channel_id].dsty;   // XCU Y coordinate
+                        unsigned int cluster = (x<<Y_WIDTH) + y;       // XCU cluster
+                        unsigned int vaddr;
+
+                        _xcu_get_wti_address( wti_id, &vaddr );
+
+                        _pic_init( hwi_id, vaddr, cluster ); 
+#if BOOT_DEBUG_PERI
+_puts("    hwi_index = ");
+_putd( hwi_id );
+_puts(" / wti_index = ");
+_putd( wti_id );
+_puts(" / vaddr = ");
+_putx( vaddr );
+_puts(" in cluster[");
+_putd( x );
+_puts(",");
+_putd( y );
+_puts("]\n");
+#endif
+                    }
                     break;
                 }
@@ -2089,8 +2175,7 @@
 void boot_init() 
 {
-    mapping_header_t* header     = (mapping_header_t *) & seg_boot_mapping_base;
-    unsigned int      gpid       = _get_procid();
-    unsigned int      cluster_xy = gpid / NB_PROCS_MAX;
-    unsigned int      lpid       = gpid % NB_PROCS_MAX;
+    mapping_header_t*  header     = (mapping_header_t *) & seg_boot_mapping_base;
+    mapping_cluster_t* cluster    = _get_cluster_base(header);
+    unsigned int       gpid       = _get_procid();
  
     if ( gpid == 0 )    // only Processor 0 does it
@@ -2103,7 +2188,7 @@
         boot_mapping_init();
 
-        _puts("\n[BOOT] Mapping ");
+        _puts("\n[BOOT] Mapping \"");
         _puts( header->name );
-        _puts(" loaded at cycle ");
+        _puts("\" loaded at cycle ");
         _putd(_get_proctime());
         _puts("\n");
@@ -2111,8 +2196,4 @@
         // Building all page tables
         boot_pt_init();
-
-        _puts("\n[BOOT] Page Tables initialisation completed at cycle ");
-        _putd(_get_proctime());
-        _puts("\n");
 
         // Activating proc 0 MMU 
@@ -2134,5 +2215,5 @@
         boot_schedulers_init();
 
-        _puts("\n[BOOT] All schedulers initialised at cycle ");
+        _puts("\n[BOOT] Schedulers initialised at cycle ");
         _putd(_get_proctime());
         _puts("\n");
@@ -2144,5 +2225,5 @@
         boot_peripherals_init();
 
-        _puts("\n[BOOT] All peripherals initialised at cycle ");
+        _puts("\n[BOOT] Non replicated peripherals initialised at cycle ");
         _putd(_get_proctime());
         _puts("\n");
@@ -2151,25 +2232,23 @@
         boot_elf_load();
 
-        _puts("\n[BOOT] All ELF files loaded at cycle ");
-        _putd(_get_proctime());
-        _puts("\n");
-
         // P0 starts all other processors
-        unsigned int x,y,p;
-        for (x = 0 ; x < X_SIZE ; x++) 
-        {
-            for (y = 0 ; y < Y_SIZE ; y++) 
+        unsigned int clusterid, p;
+
+        for ( clusterid = 0 ; clusterid < X_SIZE*Y_SIZE ; clusterid++ ) 
+        {
+            unsigned int nprocs     = cluster[clusterid].procs;
+            unsigned int xdest      = cluster[clusterid].x;
+            unsigned int ydest      = cluster[clusterid].y;
+            unsigned int cluster_xy = (xdest<<Y_WIDTH) + ydest;
+
+            for ( p = 0 ; p < nprocs; p++ ) 
             {
-                for(p = 0; p < NB_PROCS_MAX; p++) 
-                {
-                    if ( (x != 0) || (y != 0) || (p != 0) )
-                    {
-                        _xcu_send_ipi( (x<<Y_WIDTH) + y, 
-                                       p,
-                                       (unsigned int)boot_init );
-                    }
+                if ( (nprocs > 0) && ((clusterid != 0) || (p != 0)) )
+                {
+                    _xcu_send_wti( cluster_xy, p, (unsigned int)boot_init );
                 }
             }
         }
+  
     }  // end monoprocessor boot
 
@@ -2186,37 +2265,8 @@
         _set_mmu_ptpr( (unsigned int)(_ptabs_paddr[0]>>13) );
         _set_mmu_mode( 0xF );
-
-        _tty_get_lock( 0 );
-        _puts("\n[BOOT] Processor[");
-        _putd( cluster_xy >> Y_WIDTH );
-        _puts(",");
-        _putd( cluster_xy & ((1<<Y_WIDTH)-1) );
-        _puts(",");
-        _putd( lpid );
-        _puts("] : MMU activation at cycle ");
-        _putd(_get_proctime());
-        _puts("\n");
-        _tty_release_lock( 0 );
     }
 
     // all processors jump to kernel_init
     unsigned int kernel_entry = (unsigned int)&seg_kernel_init_base;
-
-#if GIET_DEBUG_INIT
-    _tty_get_lock( 0 );
-    _puts("\n[BOOT DEBUG] Processor[");
-    _putd( cluster_xy >> Y_WIDTH );
-    _puts(",");
-    _putd( cluster_xy & ((1<<Y_WIDTH)-1) );
-    _puts(",");
-    _putd( lpid );
-    _puts("] enters kernel at cycle ");
-    _putd( _get_proctime() );
-    _puts(" / kernel entry = ");
-    _putx( kernel_entry );
-    _puts("\n");
-    _tty_release_lock( 0 );
-#endif
-
     asm volatile( "jr   %0" ::"r"(kernel_entry) );
 
Index: /soft/giet_vm/giet_common/mips32_registers.h
===================================================================
--- /soft/giet_vm/giet_common/mips32_registers.h	(revision 294)
+++ /soft/giet_vm/giet_common/mips32_registers.h	(revision 295)
@@ -54,4 +54,5 @@
 #define CP0_PROCID     $15,1
 #define CP0_SCHED      $4,2
+#define CP0_SRSAVE     $8
 
 /* CP2 registers */
Index: /soft/giet_vm/giet_common/utils.c
===================================================================
--- /soft/giet_vm/giet_common/utils.c	(revision 294)
+++ /soft/giet_vm/giet_common/utils.c	(revision 295)
@@ -47,19 +47,19 @@
                       unsigned int size )    // bytes
 {
-    unsigned int*       dst = dest;
-    const unsigned int* src = source;
+    unsigned int* idst = (unsigned int*)dest;
+    unsigned int* isrc = (unsigned int*)source;
 
     // word-by-word copy
-    if (!((unsigned int) dst & 3) && !((unsigned int) src & 3)) 
+    if (!((unsigned int) idst & 3) && !((unsigned int) isrc & 3)) 
     {
         while (size > 3) 
         {
-            *dst++ = *src++;
+            *idst++ = *isrc++;
             size -= 4;
         }
     }
 
-    unsigned char * cdst = (unsigned char *) dst;
-    unsigned char * csrc = (unsigned char *) src;
+    unsigned char* cdst = (unsigned char*)dest;
+    unsigned char* csrc = (unsigned char*)source;
 
     /* byte-by-byte copy */
@@ -73,14 +73,44 @@
 // Fill a byte string with a byte value.
 //////////////////////////////////////////////////////////////////////////////////
-inline void * _memset( void*        dst, 
+inline void * _memset( void*        dest, 
                        int          value, 
                        unsigned int count ) 
 {
-    char * a = (char *) dst;
+    // word-by-word copy
+    unsigned int* idst = dest;
+    unsigned int  data = (((unsigned char)value)      ) |
+                         (((unsigned char)value) <<  8) |
+                         (((unsigned char)value) << 16) |
+                         (((unsigned char)value) << 24) ;
+
+    if ( ! ((unsigned int)idst & 3) )
+    {
+        while ( count > 3 )
+        {
+            *idst++ = data;
+            count -= 4;
+        }
+    }
+   
+    // byte-by-byte copy
+    unsigned char* cdst = dest;
     while (count--) 
     {
-        *a++ = (char)value;
-    }
-    return dst;
+        *cdst++ = (unsigned char)value;
+    }
+    return dest;
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+// This function implements an interactive break for debug.
+// Execution continue when typing any character on TTY0. 
+// The "str" argument is supposed to indicate the break location.
+//////////////////////////////////////////////////////////////////////////////////
+inline void _break( char* string ) 
+{
+    char byte;
+
+    _printf("\n[GIET DEBUG] break from %s / continue ?\n", string );
+    _getc( &byte );
 }
 
@@ -90,4 +120,13 @@
 inline void _exit() 
 {
+    unsigned int procid     = _get_procid();
+    unsigned int lpid       = procid % NB_PROCS_MAX;
+    unsigned int cluster_xy = procid / NB_PROCS_MAX;
+    unsigned int x          = cluster_xy >> Y_WIDTH;
+    unsigned int y          = cluster_xy & ((1<<Y_WIDTH)-1);
+
+
+    _printf("\n[GIET PANIC] processor[%d,%d,%d] suicide...\n", x, y, lpid );
+
     while (1) { asm volatile ("nop"); }
 }
@@ -103,5 +142,6 @@
 {
     unsigned int ret;
-    asm volatile("mfc0      %0,     $4, 2\n" : "=r"(ret) );
+    asm volatile( "mfc0      %0,     $4,2    \n" 
+                  : "=r"(ret) );
     return ret;
 }
@@ -112,8 +152,19 @@
 {
     unsigned int ret;
-    asm volatile("mfc2      %0,     $0" : "=r"(ret));
+    asm volatile( "mfc2      %0,     $0      \n"
+                  : "=r"(ret) );
     return ret;
 }
 ///////////////////////////////////////////////////////////////////////////////////
+// Returns MODE register content.
+///////////////////////////////////////////////////////////////////////////////////
+inline unsigned int _get_mmu_mode() 
+{
+    unsigned int ret;
+    asm volatile( "mfc2      %0,     $1      \n"
+                  : "=r"(ret) );
+    return ret;
+}
+///////////////////////////////////////////////////////////////////////////////////
 // Returns EPC register content.
 ///////////////////////////////////////////////////////////////////////////////////
@@ -121,5 +172,6 @@
 {
     unsigned int ret;
-    asm volatile("mfc0      %0,     $14" : "=r"(ret));
+    asm volatile( "mfc0      %0,    $14     \n"
+                  : "=r"(ret) );
     return ret;
 }
@@ -130,5 +182,6 @@
 {
     unsigned int ret;
-    asm volatile("mfc0      %0,     $8" : "=r"(ret));
+    asm volatile( "mfc0      %0,    $8     \n"
+                  : "=r"(ret));
     return ret;
 }
@@ -139,5 +192,6 @@
 {
     unsigned int ret;
-    asm volatile("mfc0      %0,     $13" : "=r"(ret));
+    asm volatile( "mfc0      %0,    $13    \n"
+                  : "=r"(ret));
     return ret;
 }
@@ -148,5 +202,6 @@
 {
     unsigned int ret;
-    asm volatile("mfc0      %0,     $12" : "=r"(ret));
+    asm volatile( "mfc0      %0,     $12   \n"
+                  : "=r"(ret));
     return ret;
 }
@@ -156,29 +211,33 @@
 inline void _set_sr(unsigned int val) 
 {
-    asm volatile("mtc0      %0,     $12" ::"r" (val));
-}
-//////////////////////////////////////////////////////////////////////////////////
+    asm volatile( "mtc0      %0,     $12    \n"
+                  :
+                  :"r" (val) );
+}
+//////////////////////////////////////////////////////////////////////////////
 // Returns processor index
-//////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
 inline unsigned int _get_procid() 
 {
     unsigned int ret;
-    asm volatile ("mfc0     %0,     $15, 1":"=r" (ret));
+    asm volatile ( "mfc0     %0,     $15, 1  \n"
+                   :"=r" (ret) );
     return (ret & 0x3FF);
 }
-///////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
 // Returns local time (32 bits value)
 // boot_proctime() 
-///////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
 inline unsigned int _get_proctime() 
 {
     unsigned int ret;
-    asm volatile ("mfc0     %0,     $9":"=r" (ret));
+    asm volatile ( "mfc0     %0,     $9      \n"
+                   :"=r" (ret) );
     return ret;
 }
-///////////////////////////////////////////////////////////////////////////////////
-// Returns index of the currently running task from the sheduler.
-///////////////////////////////////////////////////////////////////////////////////
-unsigned int _get_proc_task_id() 
+//////////////////////////////////////////////////////////////////////////////
+// Returns index of the currently running task from the processor scheduler.
+//////////////////////////////////////////////////////////////////////////////
+unsigned int _get_current_task_id() 
 {
     static_scheduler_t * psched = (static_scheduler_t *) _get_sched();
@@ -186,27 +245,40 @@
 }
 
-///////////////////////////////////////////////////////////////////////////////////
-// Disables IRQs
-///////////////////////////////////////////////////////////////////////////////////
-inline void _it_disable() 
-{
-    asm volatile(
-            "li      $3,        0xFFFFFFFE    \n"
-            "mfc0    $4,        $12           \n"
-            "and     $3,        $3, $4        \n"
-            "mtc0    $3,        $12           \n"
-            ::: "$3", "$4");
-}
-///////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+// Save SR value into save_sr_ptr variable and disable IRQs. 
+//////////////////////////////////////////////////////////////////////////////
+inline void _it_disable( unsigned int * save_sr_ptr) 
+{
+    unsigned int sr;
+    asm volatile( "li      $3,        0xFFFFFFFE    \n"
+                  "mfc0    %0,        $12           \n"
+                  "and     $3,        $3,   %0      \n"  
+                  "mtc0    $3,        $12           \n" 
+                  : "=r"(sr)
+                  :
+                  : "$3" );
+    *save_sr_ptr = sr;
+}
+//////////////////////////////////////////////////////////////////////////////
 // Enables IRQs
-///////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
 inline void _it_enable() 
 {
-    asm volatile(
-            "li      $3,        0x00000001    \n"
-            "mfc0    $4,        $12           \n"
-            "or      $3,        $3, $4        \n"
-            "mtc0    $3,        $12           \n"
-            ::: "$3", "$4");
+    asm volatile( "li      $3,        0x00000001    \n"
+                  "mfc0    $4,        $12           \n"
+                  "or      $3,        $3, $4        \n"
+                  "mtc0    $3,        $12           \n"  
+                  ::: "$3", "$4" );
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Restores previous SR value.
+//////////////////////////////////////////////////////////////////////////////
+inline void _it_restore( unsigned int * save_sr_ptr ) 
+{
+    unsigned int sr = *save_sr_ptr;
+    asm volatile( "mtc0    %0,        $12           \n" 
+                  :
+                  : "r"(sr) );
 }
 
@@ -216,5 +288,7 @@
 inline void _set_mmu_ptpr(unsigned int val) 
 {
-    asm volatile ("mtc2     %0,     $0"::"r" (val));
+    asm volatile ( "mtc2     %0,     $0            \n"
+                   :
+                   :"r" (val) );
 }
 //////////////////////////////////////////////////////////////////////////////
@@ -223,5 +297,7 @@
 inline void _set_mmu_mode(unsigned int val) 
 {
-    asm volatile ("mtc2     %0,     $1"::"r" (val));
+    asm volatile ( "mtc2     %0,     $1             \n"
+                   :
+                   :"r" (val) );
 }
 //////////////////////////////////////////////////////////////////////////////
@@ -231,5 +307,7 @@
 inline void _set_sched(unsigned int val) 
 {
-    asm volatile ("mtc0     %0,     $4, 2"::"r" (val));
+    asm volatile ( "mtc0     %0,     $4, 2          \n"
+                   :
+                   :"r" (val) );
 }
 
@@ -249,4 +327,9 @@
 
     asm volatile(
+            "li     $3,     0xFFFFFFFE         \n"
+            "mfc0   $2,     $12                \n"
+            "and    $3,     $2,        $3      \n"
+            "mtc0   $3,     $12                \n"     /* IRQ disabled     */
+
             "mfc2   $2,     $1                 \n"     /* $2 <= MMU_MODE   */
             "andi   $3,     $2,        0xb     \n"
@@ -258,4 +341,9 @@
 
             "mtc2   $2,     $1                 \n"     /* restore MMU_MODE */
+
+            "li     $3,     0x00000001         \n"
+            "mfc0   $2,     $12                \n"
+            "or     $3,     $3,        $2      \n"
+            "mtc0   $3,     $12                \n"     /* IRQ enabled      */
             : "=r" (value)
             : "r" (lsb), "r" (msb)
@@ -268,5 +356,5 @@
 ////////////////////////////////////////////////////////////////////////////
 inline void _physical_write( unsigned long long paddr, 
-                      unsigned int       value ) 
+                             unsigned int       value ) 
 {
     unsigned int lsb = (unsigned int)paddr;
@@ -274,4 +362,9 @@
 
     asm volatile(
+            "li     $3,     0xFFFFFFFE         \n"
+            "mfc0   $2,     $12                \n"
+            "and    $3,     $2,        $3      \n"
+            "mtc0   $3,     $12                \n"     /* IRQ disabled     */
+
             "mfc2   $2,     $1                 \n"     /* $2 <= MMU_MODE   */
             "andi   $3,     $2,        0xb     \n"
@@ -283,7 +376,56 @@
 
             "mtc2   $2,     $1                 \n"     /* restore MMU_MODE */
+
+            "li     $3,     0x00000001         \n"
+            "mfc0   $2,     $12                \n"
+            "or     $3,     $3,        $2      \n"
+            "mtc0   $3,     $12                \n"     /* IRQ enabled      */
             :
             : "r" (value), "r" (lsb), "r" (msb)
             : "$2", "$3");
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// This function is used by all drivers (_xxx_set_register() function)
+// If the MMU is not activated, the virtual address is extended using
+// X_IO and Y_IO to reach the cluster_io.
+///////////////////////////////////////////////////////////////////////////////////
+inline void _io_extended_write( unsigned int*  vaddr,
+                                unsigned int   value )
+{
+    unsigned long long paddr;
+
+    if ( _get_mmu_mode() & 0x4 )  // MMU activated : use virtual address
+    {
+        *vaddr = value;
+    }
+    else                          // use paddr extension for IO
+    {
+        paddr = (unsigned long long)(unsigned int)vaddr +
+                (((unsigned long long)((X_IO<<Y_WIDTH) + Y_IO))<<32); 
+        _physical_write( paddr, value );
+    }
+    asm volatile("sync" ::: "memory");
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// This function is used by all drivers (_xxx_get_register() function)
+// If the MMU is not activated, the virtual address is extended using
+// X_IO and Y_IO to reach the cluster_io.
+///////////////////////////////////////////////////////////////////////////////////
+inline unsigned int _io_extended_read( unsigned int*  vaddr )
+{
+    unsigned long long paddr;
+
+    if ( _get_mmu_mode() & 0x4 )  // MMU activated : use virtual address
+    {
+        return *(volatile unsigned int*)vaddr;
+    }
+    else                          // use paddr extension for IO
+    {
+        paddr = (unsigned long long)(unsigned int)vaddr +
+                (((unsigned long long)((X_IO<<Y_WIDTH) + Y_IO))<<32); 
+        return _physical_read( paddr );
+    }
 }
 
@@ -323,4 +465,5 @@
             :"$2", "$3", "$4");
 }
+
 ///////////////////////////////////////////////////////////////////////////////////
 // Release a previouly taken lock.
@@ -328,30 +471,38 @@
 inline void _release_lock(unsigned int * plock) 
 {
-    asm volatile ( "sync\n" ); // necessary because of the TSAR consistency model 
+    asm volatile ( "sync\n" ::: "memory" ); 
+    // sync is necessary because of the TSAR consistency model 
     *plock = 0;
 }
 
 ///////////////////////////////////////////////////////////////////////////////////
-// Display a string on TTY0 / used for system code debug and log.
-// It does not use the TTY driver, but uses the seg_tty_base variable...
-///////////////////////////////////////////////////////////////////////////////////
-void _puts(char * buffer) 
-{
-    unsigned int n;
-    for (n = 0; n < 1000; n++) 
-    {
-        if (buffer[n] == 0)  break; 
-    }
-    _tty_write( buffer, n, 0 );   // last argument is TTY channel
-}
-
-///////////////////////////////////////////////////////////////////////////////////
 //           Access functions to system terminal TTY0
 ///////////////////////////////////////////////////////////////////////////////////
 
 ///////////////////////////////////////////////////////////////////////////////////
-// Display a 32 bits unsigned int as an hexadecimal string on TTY0 
-///////////////////////////////////////////////////////////////////////////////////
-void _putx(unsigned int val) 
+// Display "string" argument on TTY0.
+// It uses the low level access functions from TTY driver, using a busy waiting
+// policy if TTY buffer is full.
+// The exclusive access lock should be taken by the caller.
+///////////////////////////////////////////////////////////////////////////////////
+void _puts( char* string ) 
+{
+    unsigned int n = 0;
+
+    while ( string[n] > 0 )
+    {
+        // test status register
+        while ( (_tty_get_register( 0, TTY_STATUS ) & 0x2) );
+
+        // write one byte
+        _tty_set_register( 0, TTY_WRITE, (unsigned int)string[n] );
+        n++;
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// Display a 32 bits unsigned int as an hexadecimal string on TTY0.
+///////////////////////////////////////////////////////////////////////////////////
+void _putx( unsigned int val )
 {
     static const char HexaTab[] = "0123456789ABCDEF";
@@ -368,11 +519,11 @@
         val = val >> 4;
     }
-    _puts(buf);
-}
-
-///////////////////////////////////////////////////////////////////////////////////
-// Display a 64 bits unsigned long as an hexadecimal string on TTY0 
-///////////////////////////////////////////////////////////////////////////////////
-void _putl(unsigned long long val)
+    _puts( buf );
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// Display a 64 bits unsigned long as an hexadecimal string on TTY0.
+///////////////////////////////////////////////////////////////////////////////////
+void _putl( unsigned long long val )
 {
     static const char HexaTab[] = "0123456789ABCDEF";
@@ -389,11 +540,11 @@
         val = val >> 4;
     }
-    _puts(buf);
-}
-
-///////////////////////////////////////////////////////////////////////////////////
-// Display a 32 bits unsigned int as a decimal string on TTY0
-///////////////////////////////////////////////////////////////////////////////////
-void _putd(unsigned int val) 
+    _puts( buf );
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// Display a 32 bits unsigned int as a decimal string on TTY0.
+///////////////////////////////////////////////////////////////////////////////////
+void _putd( unsigned int val ) 
 {
     static const char DecTab[] = "0123456789";
@@ -414,5 +565,180 @@
         val /= 10;
     }
-    _puts(&buf[first]);
+    _puts( &buf[first] );
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// Display a format on TTY0.
+// To provide an atomic display, this function takes the lock protecting
+// exclusive access to TTY0, entering a critical section until the lock
+// is released.
+// Only a limited number of formats are supported:
+//   - %d : 32 bits signed   decimal
+//   - %u : 32 bits unsigned decimal
+//   - %x : 32 bits unsigned hexa
+//   - %l : 64 bits unsigned hexa
+//   - %c : char
+//   - %s : string
+///////////////////////////////////////////////////////////////////////////////////
+void _printf( char * format, ... ) 
+{
+    va_list ap;
+    va_start(ap, format);
+    unsigned int save_sr;     // used to save the SR value in critical section
+
+    // get TTY0 lock
+    _tty_get_lock( 0, &save_sr );
+
+printf_text:
+
+    while (*format) 
+    {
+        unsigned int i;
+        for (i = 0 ; format[i] && (format[i] != '%') ; i++);
+        if (i) 
+        {
+            if ( _tty_write( format, i, 0 ) != i ) goto return_error;
+            format += i;
+        }
+        if (*format == '%') 
+        {
+            format++;
+            goto printf_arguments;
+        }
+    }
+
+    // release TTY0 lock
+    _tty_release_lock( 0, &save_sr );
+
+    va_end(ap);
+    return;
+
+printf_arguments:
+
+    {
+        char buf[20];
+        char * pbuf;
+        unsigned int len = 0;
+        static const char HexaTab[] = "0123456789ABCDEF";
+        unsigned int i;
+
+        switch (*format++) 
+        {
+            case ('c'):             /* char conversion */
+            {
+                int val = va_arg( ap, int );
+                len = 1;
+                buf[0] = val;
+                pbuf = &buf[0];
+                break;
+            }
+            case ('d'):             /* 32 bits decimal signed  */
+            {
+                int val = va_arg( ap, int );
+                if (val < 0) 
+                {
+                    val = -val;
+                    if ( _tty_write( "-" , 1, 0 ) != 1 ) goto return_error;
+                }
+                for(i = 0; i < 10; i++) 
+                {
+                    buf[9 - i] = HexaTab[val % 10];
+                    if (!(val /= 10)) break;
+                }
+                len =  i + 1;
+                pbuf = &buf[9 - i];
+                break;
+            }
+            case ('u'):             /* 32 bits decimal unsigned  */
+            {
+                unsigned int val = va_arg( ap, unsigned int );
+                for(i = 0; i < 10; i++) 
+                {
+                    buf[9 - i] = HexaTab[val % 10];
+                    if (!(val /= 10)) break;
+                }
+                len =  i + 1;
+                pbuf = &buf[9 - i];
+                break;
+            }
+            case ('x'):             /* 32 bits hexadecimal unsigned */
+            {
+                unsigned int val = va_arg( ap, unsigned int );
+                if ( _tty_write( "0x" , 2, 0 ) != 2 ) goto return_error;
+                for(i = 0; i < 8; i++) 
+                {
+                    buf[7 - i] = HexaTab[val % 16];
+                    if (!(val /= 16))  break;
+                }
+                len =  i + 1;
+                pbuf = &buf[7 - i];
+                break;
+            }
+            case ('l'):            /* 64 bits hexadecimal unsigned */
+            {
+                unsigned long long val = va_arg( ap, unsigned long long );
+                if ( _tty_write( "0x" , 2, 0 ) != 2 ) goto return_error;
+                for(i = 0; i < 16; i++) 
+                {
+                    buf[15 - i] = HexaTab[val % 16];
+                    if (!(val /= 16))  break;
+                }
+                len =  i + 1;
+                pbuf = &buf[15 - i];
+                break;
+            }
+            case ('s'):             /* string */
+            {
+                char* str = va_arg( ap, char* );
+                while (str[len]) 
+                {
+                    len++;
+                }
+                pbuf = str;
+                break;
+            }
+            default:
+                goto return_error;
+        }
+
+        if ( _tty_write( pbuf, len, 0 ) != len ) goto return_error;
+        
+        goto printf_text;
+    }
+
+return_error:
+
+    {
+        unsigned int procid     = _get_procid();
+        unsigned int lpid       = procid % NB_PROCS_MAX;
+        unsigned int cluster_xy = procid / NB_PROCS_MAX;
+        unsigned int x          = cluster_xy >> Y_WIDTH;
+        unsigned int y          = cluster_xy & ((1<<Y_WIDTH)-1);
+
+        _puts("\n\n[GIET ERROR] in _printf() for processor[");
+        _putd( x );
+        _puts(",");
+        _putd( y );
+        _puts(",");
+        _putd( lpid );
+        _puts("]\n");
+
+        // release TTY0 lock
+        _tty_release_lock( 0, &save_sr );
+
+        _exit();
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// Get a character from TTY0.
+///////////////////////////////////////////////////////////////////////////////////
+void _getc( char*        byte )
+{
+    // test status register
+    while ( _tty_get_register( 0, TTY_STATUS ) == 0 );
+
+    // read one byte
+    *byte = (char)_tty_get_register( 0, TTY_READ );
 }
 
@@ -452,5 +778,5 @@
 // register, to be more processor independant.
 ///////////////////////////////////////////////////////////////////////////////////
-void _dcache_buf_invalidate( const void * buffer, 
+void _dcache_buf_invalidate( void * buffer, 
                              unsigned int size) 
 {
Index: /soft/giet_vm/giet_common/utils.h
===================================================================
--- /soft/giet_vm/giet_common/utils.h	(revision 294)
+++ /soft/giet_vm/giet_common/utils.h	(revision 295)
@@ -23,19 +23,20 @@
 typedef struct _ld_symbol_s _ld_symbol_t;
 
-// peripheral base addresses
+// non replicated peripherals
 extern _ld_symbol_t seg_iob_base;
 extern _ld_symbol_t seg_nic_base;
+extern _ld_symbol_t seg_cma_base;
+extern _ld_symbol_t seg_tty_base;
+extern _ld_symbol_t seg_fbf_base;
+extern _ld_symbol_t seg_pic_base;
+extern _ld_symbol_t seg_ioc_base;
+extern _ld_symbol_t seg_sim_base;
+
+// replicated peripherals
 extern _ld_symbol_t seg_icu_base;
 extern _ld_symbol_t seg_xcu_base;
 extern _ld_symbol_t seg_tim_base;
-extern _ld_symbol_t seg_tty_base;
-extern _ld_symbol_t seg_gcd_base;
 extern _ld_symbol_t seg_dma_base;
-extern _ld_symbol_t seg_fbf_base;
-extern _ld_symbol_t seg_ioc_base;
 extern _ld_symbol_t seg_mmc_base;
-extern _ld_symbol_t seg_cma_base;
-extern _ld_symbol_t seg_hba_base;
-extern _ld_symbol_t seg_sim_base;
 
 // for replicated peripherals
@@ -70,5 +71,9 @@
 extern _ld_symbol_t seg_kernel_init_size;
 
-
+extern _ld_symbol_t seg_ram_disk_base;
+extern _ld_symbol_t seg_ram_disk_size;
+
+extern _ld_symbol_t seg_reset_code_base;
+extern _ld_symbol_t seg_reset_code_size;
 
 ///////////////////////////////////////////////////////////////////////////////////
@@ -85,4 +90,10 @@
 
 ///////////////////////////////////////////////////////////////////////////////////
+//     Break function
+///////////////////////////////////////////////////////////////////////////////////
+
+extern void _break( char* str);
+
+///////////////////////////////////////////////////////////////////////////////////
 //     Suicide function
 ///////////////////////////////////////////////////////////////////////////////////
@@ -102,4 +113,5 @@
 extern unsigned int _get_sched(void);
 extern unsigned int _get_mmu_ptpr(void);
+extern unsigned int _get_mmu_mode(void);
 extern unsigned int _get_epc(void);
 extern unsigned int _get_bvar(void);
@@ -108,8 +120,9 @@
 extern unsigned int _get_procid(void);
 extern unsigned int _get_proctime(void);
-extern unsigned int _get_proc_task_id(void);
-
-extern void         _it_disable(void);
+extern unsigned int _get_current_task_id(void);
+
+extern void         _it_disable( unsigned int* save_sr_ptr );
 extern void         _it_enable(void);
+extern void         _it_restore( unsigned int* save_sr_ptr );
 
 extern void         _set_mmu_ptpr(unsigned int value);
@@ -127,4 +140,9 @@
                                      unsigned int       value );
 
+extern unsigned int _io_extended_read(  unsigned int* vaddr );
+
+extern void         _io_extended_write( unsigned int* vaddr,
+                                        unsigned int  value );
+
 ///////////////////////////////////////////////////////////////////////////////////
 //     Locks access functions
@@ -135,11 +153,18 @@
 
 ///////////////////////////////////////////////////////////////////////////////////
-//     Display functions
-///////////////////////////////////////////////////////////////////////////////////
-
-extern void         _puts(char *string);             // display a string
-extern void         _putx(unsigned int val);         // display a 32 bits value (hexa) 
-extern void         _putd(unsigned int val);         // display a 32 bits value (dec)
-extern void         _putl(unsigned long long val);   // display a 64 bits value (hexa)
+//     TTY0 access functions
+///////////////////////////////////////////////////////////////////////////////////
+
+extern void         _puts( char*        string );
+
+extern void         _putx( unsigned int val );
+
+extern void         _putd( unsigned int val ); 
+
+extern void         _putl( unsigned long long val );
+
+extern void         _printf(char* format, ...); 
+
+extern void         _getc( char*        byte );       
 
 ///////////////////////////////////////////////////////////////////////////////////
@@ -158,5 +183,5 @@
 ///////////////////////////////////////////////////////////////////////////////////
 
-extern void  _dcache_buf_invalidate( const void * buffer, 
+extern void  _dcache_buf_invalidate( void * buffer, 
                                      unsigned int size );
 
Index: /soft/giet_vm/giet_common/vmem.c
===================================================================
--- /soft/giet_vm/giet_common/vmem.c	(revision 294)
+++ /soft/giet_vm/giet_common/vmem.c	(revision 295)
@@ -25,9 +25,8 @@
 // _iommu_add_pte2()
 //////////////////////////////////////////////////////////////////////////////
-void _iommu_add_pte2(
-        unsigned int ix1,
-        unsigned int ix2,
-        unsigned int ppn,
-        unsigned int flags) 
+void _iommu_add_pte2( unsigned int ix1,
+                      unsigned int ix2,
+                      unsigned int ppn,
+                      unsigned int flags ) 
 {
     unsigned int ptba;
@@ -41,10 +40,6 @@
     if ((pt->pt1[ix1] & PTE_V) == 0) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in iommu_add_pte2 function\n");
-        _puts("the IOMMU PT1 entry is not mapped / ix1 = ");
-        _putx( ix1 );
-        _puts("\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in iommu_add_pte2() : "
+                "IOMMU PT1 entry not mapped / ix1 = %d\n", ix1 );
         _exit();
     }
@@ -63,5 +58,7 @@
 // _iommu_inval_pte2()
 //////////////////////////////////////////////////////////////////////////////
-void _iommu_inval_pte2(unsigned int ix1, unsigned int ix2) {
+void _iommu_inval_pte2( unsigned int ix1, 
+                        unsigned int ix2 ) 
+{
     unsigned int ptba;
     unsigned int * pt_flags;
@@ -73,8 +70,6 @@
     if ((pt->pt1[ix1] & PTE_V) == 0)
     {
-        _puts("\n[GIET ERROR] in iommu_inval_pte2 function\n");
-        _puts("the IOMMU PT1 entry is not mapped / ix1 = ");
-        _putx( ix1 );
-        _puts("\n");
+        _printf("\n[GIET ERROR] in iommu_inval_pte2() "
+              "IOMMU PT1 entry not mapped / ix1 = %d\n", ix1 );
         _exit();
     }
@@ -95,5 +90,5 @@
                              unsigned int   vpn,
                              unsigned int*  ppn,
-                             unsigned int*  flags) 
+                             unsigned int*  flags ) 
 {
     unsigned long long ptba;
Index: /soft/giet_vm/giet_config.h
===================================================================
--- /soft/giet_vm/giet_config.h	(revision 294)
+++ /soft/giet_vm/giet_config.h	(revision 295)
@@ -23,8 +23,10 @@
 
 #define GIET_DEBUG_INIT		     0			/* trace parallel kernel initialisation */
-
 #define GIET_DEBUG_FAT           0          /* trace fat accesses */ 
-#define GIET_DEBUG_SWITCH	     0			/* trace context switchs  */
+#define GIET_DEBUG_SWITCH	     0	        /* trace context switchs  */
+#define GIET_DEBUG_IRQS          0	        /* trace interrupts */
 #define GIET_DEBUG_IOC_DRIVER    0          /* trace IOC accesses */
+#define GIET_DEBUG_BDV_DRIVER    0          /* trace BDV accesses */
+#define GIET_DEBUG_TTY_DRIVER    0          /* trace TTY accesses */
 #define GIET_DEBUG_DMA_DRIVER    0          /* trace DMA accesses */
 #define GIET_DEBUG_FBF_DRIVER    0          /* trace FBF accesses */
@@ -34,11 +36,9 @@
 /* software parameters */
 
-#define GIET_IDLE_TASK_PERIOD    10000000   /* Idle Task message period */
-#define GIET_IDLE_TASK_VERBOSITY 1
-
+#define GIET_IDLE_TASK_PERIOD    0xFFFFFFFF /* Idle Task message period */
 #define GIET_MAX_ELF_FILES       20         /* max .elf files loaded by boot-loader */
 #define GIET_OPEN_FILES_MAX      16         /* max simultaneously open files */
 #define GIET_NB_VSPACE_MAX	     64			/* max number of virtual spaces */
-#define GIET_TICK_VALUE	         100000 	/* context switch period (number of cycles) */
+#define GIET_TICK_VALUE	         0x8000     /* context switch period (number of cycles) */
 #define GIET_USE_IOMMU           0          /* IOMMU activated when non zero */
 #define GIET_NO_HARD_CC          0          /* No hard cache coherence when non zero */
Index: /soft/giet_vm/giet_drivers/bdv_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/bdv_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/bdv_driver.c	(revision 295)
@@ -10,30 +10,24 @@
 // a single channel, block oriented, external storage contrÃŽler.
 //
-// It can exist only one block-device controler in the architecture.
-//
-// The _bdv_read() and _bdv_write() functions use the _bdv_access() function,
-// that is always blocking, but can be called in 4 modes:
-//
-// - In BOOT_PA mode, the _bdv_access() function uses a polling policy on the
-//   IOC_STATUS register to detect transfer completion, as hardware interrupts
-//   are not activated. This mode is used by the boot code to load the map.bin
-//   file into memory.
-//
-// - In BOOT_VA mode, the _bdv_access() function uses a polling policy on
-//   IOC_STATUS register to detect transfer completion. This mode is used by
-//   the boot code to load the various .elf files into memory.
-//
-// - In KERNEL mode, the _bdv_access() function uses a descheduling strategy:
+// The _bdv_read() and _bdv_write() functions are always blocking.
+// They can be called in 3 modes:
+//
+// - In BOOT mode, these functions use a polling policy on the BDV STATUS 
+//   register to detect transfer completion, as interrupts are not activated. 
+//   This mode is used by the boot code to load the map.bin file into memory
+//   (before MMU activation), or to load the .elf files (after MMU activation). 
+//
+// - In KERNEL mode, these functions use a descheduling strategy:
 //   The ISR executed when transfer completes should restart the calling task.
-//   There is no checking of user access right to the memory buffer. This mode
-//   must be used to access IOC, for an "open" system call.
-//
-// - In USER mode, the _bdv_access() function uses a descheduling strategy:
+//   There is no checking of user access right to the memory buffer. 
+//   This mode must be used, for an "open" system call.
+//
+// - In USER mode, these functions use a descheduling strategy:
 //   The ISR executed when transfer completes should restart the calling task, 
 //   The user access right to the memory buffer must be checked.
-//   This mode must be used to access IOC, for a "read/write" system call.
+//   This mode must be used for a "read/write" system call.
 //
 // As the BDV component can be used by several programs running in parallel,
-// the _ioc_lock variable guaranties exclusive access to the device.  The
+// the _bdv_lock variable guaranties exclusive access to the device.  The
 // _bdv_read() and _bdv_write() functions use atomic LL/SC to get the lock.
 //
@@ -47,11 +41,21 @@
 //   if the IOMMU is not activated.
 // An error code is returned if these conditions are not verified.
-///////////////////////////////////////////////////////////////////////////////////
-// The seg_ioc_base virtual base addresses must be defined in giet_vsegs.ld file.
+//
+// The "seg_ioc_base" must be defined in giet_vsegs.ld file.
+///////////////////////////////////////////////////////////////////////////////////
+// Implementation notes:
+//
+// 1. In order to share code, the two _bdv_read() and _bdv_write() functions
+//    call the same _bdv_access() function.
+//
+// 2. All accesses to BDV registers are done by the two
+//    _bdv_set_register() and _bdv_get_register() low-level functions,
+//    that are handling virtual / physical extended addressing.
 ///////////////////////////////////////////////////////////////////////////////////
 
 #include <giet_config.h>
+#include <bdv_driver.h>
+#include <xcu_driver.h>
 #include <ioc_driver.h>
-#include <bdv_driver.h>
 #include <utils.h>
 #include <tty_driver.h>
@@ -59,5 +63,33 @@
 
 ///////////////////////////////////////////////////////////////////////////////
-//      _bdv_access()
+// BDV global variables
+///////////////////////////////////////////////////////////////////////////////
+
+#define in_unckdata __attribute__((section (".unckdata")))
+
+in_unckdata unsigned int          _bdv_lock = 0;
+in_unckdata volatile unsigned int _bdv_status = 0;
+in_unckdata volatile unsigned int _bdv_gtid;
+
+///////////////////////////////////////////////////////////////////////////////
+// This low_level function returns the value contained in register (index).
+///////////////////////////////////////////////////////////////////////////////
+unsigned int _bdv_get_register( unsigned int index )
+{
+    unsigned int* vaddr = (unsigned int*)&seg_ioc_base + index;
+    return _io_extended_read( vaddr );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// This low-level function set a new value in register (index).
+///////////////////////////////////////////////////////////////////////////////
+void _bdv_set_register( unsigned int index,
+                        unsigned int value ) 
+{
+    unsigned int* vaddr = (unsigned int*)&seg_ioc_base + index;
+    _io_extended_write( vaddr, value );
+}
+
+///////////////////////////////////////////////////////////////////////////////
 // This function transfer data between a memory buffer and the block device.
 // The buffer lentgth is (count*block_size) bytes.
@@ -70,62 +102,52 @@
 // Returns 0 if success, > 0 if error.
 ///////////////////////////////////////////////////////////////////////////////
-static unsigned int _bdv_access( unsigned int to_mem,
-                                 unsigned int mode,
-                                 unsigned int lba,
-                                 paddr_t buf_paddr,
-                                 unsigned int count) 
-{
-
-#if GIET_DEBUG_IOC_DRIVER
-_tty_get_lock( 0 );
-_puts("\n[IOC DEBUG] Enter _bdv_access() at cycle ");
-_putd( _get_proctime() );
-_puts(" for processor ");
-_putd( _get_procid() );
-_puts("\n - mode    = ");
-_putd( mode );
-_puts("\n - paddr   = ");
-_putx( buf_paddr );
-_puts("\n - sectors = ");
-_putd( count );
-_puts("\n - lba     = ");
-_putx( lba );
-_puts("\n");
-_tty_release_lock( 0 );
+static unsigned int _bdv_access( unsigned int       to_mem,
+                                 unsigned int       mode,
+                                 unsigned int       lba,
+                                 unsigned long long buf_paddr,
+                                 unsigned int       count) 
+{
+
+#if GIET_DEBUG_BDV_DRIVER
+unsigned int procid  = _get_procid();
+unsigned int cxy     = procid / NB_PROCS_MAX;
+unsigned int lpid    = procid % NB_PROCS_MAX;
+unsigned int x       = cxy >> Y_WIDTH;
+unsigned int y       = cxy & ((1<<Y_WIDTH) - 1);
+
+_printf("\n[BDV DEBUG] Processor[%d,%d,%d] enters _bdv_access() at cycle %d\n"
+        " - mode    = %d\n"
+        " - paddr   = %l\n"
+        " - sectors = %x\n"
+        " - lba     = %x\n",
+        x, y, lpid, _get_proctime(), mode, buf_paddr, count, lba );
 #endif
 
-    volatile unsigned int * ioc_address = (unsigned int *) &seg_ioc_base ;
-    unsigned int error = 0;
-
-    // get the lock protecting IOC
-    _get_lock(&_ioc_lock);
-
-    // set the _ioc_status polling variable
-    _ioc_status = BLOCK_DEVICE_BUSY;
-
-    ioc_address[BLOCK_DEVICE_BUFFER]     = (unsigned int)buf_paddr;
-    ioc_address[BLOCK_DEVICE_BUFFER_EXT] = (unsigned int)(buf_paddr>>32);
-    ioc_address[BLOCK_DEVICE_COUNT]      = count;
-    ioc_address[BLOCK_DEVICE_LBA]        = lba;
-
-    // There are two policies for transfer completion 
-	// detection, depending on the mode argument:
-
-    if ( (mode == IOC_BOOT_PA_MODE) ||    // We poll directly the IOC_STATUS register
-         (mode == IOC_BOOT_VA_MODE) )     // as IRQs are masked.
+    unsigned int       error = 0;
+
+    // get the lock protecting BDV
+    _get_lock(&_bdv_lock);
+
+    // set device registers
+    _bdv_set_register( BLOCK_DEVICE_BUFFER    , (unsigned int)buf_paddr );
+    _bdv_set_register( BLOCK_DEVICE_BUFFER_EXT, (unsigned int)(buf_paddr>>32) );
+    _bdv_set_register( BLOCK_DEVICE_COUNT     , count );
+    _bdv_set_register( BLOCK_DEVICE_LBA       , lba );
+
+    // In BOOT mode, we launch transfer, and poll the BDV_STATUS 
+    // register because IRQs are masked.
+    if ( mode == IOC_BOOT_MODE ) 
     {
         // Launch transfert
-        if (to_mem == 0) ioc_address[BLOCK_DEVICE_OP] = BLOCK_DEVICE_WRITE;
-        else             ioc_address[BLOCK_DEVICE_OP] = BLOCK_DEVICE_READ;
+        if (to_mem == 0) _bdv_set_register( BLOCK_DEVICE_OP, BLOCK_DEVICE_WRITE );
+        else             _bdv_set_register( BLOCK_DEVICE_OP, BLOCK_DEVICE_READ );
 
         unsigned int status;
         do
         {
-            if ( _bdv_get_status( 0, &status ) ) return 1;
-
-#if GIET_DEBUG_IOC_DRIVER
-_tty_get_lock( 0 );
-_puts("\n[IOC DEBUG] _bdv_access() : ... waiting on IOC_STATUS register ...\n");
-_tty_release_lock( 0 );
+            status = _bdv_get_register( BLOCK_DEVICE_STATUS );
+
+#if GIET_DEBUG_BDV_DRIVER
+_printf("\n[BDV DEBUG] _bdv_access() : ... waiting on BDV_STATUS register ...\n");
 #endif
         }
@@ -133,5 +155,5 @@
                (status != BLOCK_DEVICE_READ_ERROR)    &&
                (status != BLOCK_DEVICE_WRITE_SUCCESS) &&
-               (status != BLOCK_DEVICE_WRITE_ERROR)   );
+               (status != BLOCK_DEVICE_WRITE_ERROR)   );      // busy waiting
 
         // analyse status
@@ -140,49 +162,53 @@
 
         // release lock
-        _release_lock(&_ioc_lock);      
+        _release_lock(&_bdv_lock);      
     }
-    else                           // in USER or KERNEL mode, we deschedule the task.
-                                   // When the task is rescheduled by the ISR, we reset 
-                                   // the _ioc_status variable, and release the lock
+    // in USER or KERNEL mode, we deschedule the task.
+    // When the task is rescheduled, we check the _bdv_status variable, 
+    // and release the lock.
+    // We need a critical section, because we must reset the RUN bit
+	// before to launch the transfer, and we don't want to be descheduled
+	// between these two operations. 
+    else
     {
-        // We need a critical section, because we must reset the RUN bit
-		// before to launch the transfer, and we want to avoid to be descheduled
-		// between these two operations. 
-
-        // Enter critical section
-        _it_disable(); 
+        unsigned int save_sr;
+        unsigned int ltid = _get_current_task_id();
+        unsigned int gpid = _get_procid();
+
+        // activates BDV interrupts
+        _bdv_set_register( BLOCK_DEVICE_IRQ_ENABLE, 1 );
+
+        // set the _bdv_status variable
+        _bdv_status = BLOCK_DEVICE_BUSY;
+
+        // enters critical section
+        _it_disable( &save_sr ); 
         
-        // set _ioc_gtid and reset runnable 
-        unsigned int ltid = _get_proc_task_id();
-        unsigned int pid = _get_procid();
-        _ioc_gtid = (pid<<16) + ltid;
-        _set_task_slot( pid, ltid, CTX_RUN_ID, 0 );  
+        // set _bdv_gtid and reset runnable 
+        _bdv_gtid = (gpid<<16) + ltid;
+        _set_task_slot( gpid, ltid, CTX_RUN_ID, 0 );  
         
-        // Launch transfert
-        if (to_mem == 0) ioc_address[BLOCK_DEVICE_OP] = BLOCK_DEVICE_WRITE;
-        else             ioc_address[BLOCK_DEVICE_OP] = BLOCK_DEVICE_READ;
+        // launch transfer
+        if (to_mem == 0) _bdv_set_register( BLOCK_DEVICE_OP, BLOCK_DEVICE_WRITE );
+        else             _bdv_set_register( BLOCK_DEVICE_OP, BLOCK_DEVICE_READ  );
 
         // deschedule task
         _ctx_switch();                      
 
+        // restore SR
+        _it_restore( &save_sr );
+
         // analyse status
-        error = ( (_ioc_status == BLOCK_DEVICE_READ_ERROR) ||
-                  (_ioc_status == BLOCK_DEVICE_WRITE_ERROR) );
-
-        // reset _ioc_status and release lock
-        _ioc_status = BLOCK_DEVICE_IDLE; 
-        _release_lock(&_ioc_lock);      
+        error = ( (_bdv_status == BLOCK_DEVICE_READ_ERROR) ||
+                  (_bdv_status == BLOCK_DEVICE_WRITE_ERROR) );
+
+        // reset _bdv_status and release lock
+        _bdv_status = BLOCK_DEVICE_IDLE; 
+        _release_lock(&_bdv_lock);      
     }
 
-#if GIET_DEBUG_IOC_DRIVER
-_tty_get_lock( 0 );
-_puts("\n[IOC DEBUG] _bdv_access completed at cycle ");
-_putd( _get_proctime() );
-_puts(" for processor ");
-_putd( _get_procid() );
-_puts(" : error = ");
-_putd( (unsigned int)error );
-_puts("\n");
-_tty_release_lock( 0 );
+#if GIET_DEBUG_BDV_DRIVER
+_printf("\n[BDV DEBUG] Processor[%d,%d,%d] exit _bdv_access() at cycle %d\n",
+        x, y, lpid, _get_proctime() );
 #endif
 
@@ -191,35 +217,20 @@
 
 ///////////////////////////////////////////////////////////////////////////////
-//       _bdv_init()
-// This function cheks block size, and activates the IOC interrupts.
+// This function cheks block size, and desactivates the interrupts.
 // Return 0 for success, > 0 if error
 ///////////////////////////////////////////////////////////////////////////////
-unsigned int _bdv_init( unsigned int channel )
-{
-    volatile unsigned int * ioc_address = (unsigned int *) &seg_ioc_base ;
-    
-    if ( ioc_address[BLOCK_DEVICE_BLOCK_SIZE] != 512 )
+unsigned int _bdv_init()
+{
+    if ( _bdv_get_register( BLOCK_DEVICE_BLOCK_SIZE ) != 512 )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _bdv_init() : block size must be 512 bytes\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _bdv_init() : block size must be 512 bytes\n");
         return 1; 
     }
 
-    if ( channel != 0 )
-    {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _bdv_init() : illegal channel\n");
-        _tty_release_lock( 0 );
-
-        return 1;
-    }
-
-    ioc_address[BLOCK_DEVICE_IRQ_ENABLE] = 1;
+    _bdv_set_register( BLOCK_DEVICE_IRQ_ENABLE, 0 );
     return 0;
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-//     _bdv_read()
 // Transfer data from the block device to a memory buffer. 
 // - mode     : BOOT / KERNEL / USER
@@ -229,8 +240,8 @@
 // Returns 0 if success, > 0 if error.
 ///////////////////////////////////////////////////////////////////////////////
-unsigned int _bdv_read( unsigned int mode,  
-                        unsigned int lba, 
-                        paddr_t      buffer, 
-                        unsigned int count) 
+unsigned int _bdv_read( unsigned int       mode,  
+                        unsigned int       lba, 
+                        unsigned long long buffer, 
+                        unsigned int       count) 
 {
     return _bdv_access( 1,        // read access
@@ -242,5 +253,4 @@
 
 ///////////////////////////////////////////////////////////////////////////////
-//     _bdv_write()
 // Transfer data from a memory buffer to the block device. 
 // - mode     : BOOT / KERNEL / USER
@@ -250,8 +260,8 @@
 // Returns 0 if success, > 0 if error.
 ///////////////////////////////////////////////////////////////////////////////
-unsigned int _bdv_write( unsigned int mode,  
-                         unsigned int lba, 
-                         paddr_t  buffer, 
-                         unsigned int count ) 
+unsigned int _bdv_write( unsigned int       mode,  
+                         unsigned int       lba, 
+                         unsigned long long buffer, 
+                         unsigned int       count ) 
 {
     return _bdv_access( 0,        // write access
@@ -263,38 +273,84 @@
 
 ///////////////////////////////////////////////////////////////////////////////
-//     _bdv_get_status()
-// This function returns in the status variable, the transfert status, and
-// acknowledge the IRQ if the IOC controler is not busy.
-// Returns 0 if success, > 0 if error
-///////////////////////////////////////////////////////////////////////////////
-unsigned int _bdv_get_status( unsigned int  channel,
-                              unsigned int* status )
-{
-    if ( channel != 0 )
-    {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _bdv_get_status() : illegal channel\n");
-        _tty_release_lock( 0 );
-
-        return 1;
-    }
-
-    // get IOC base address
-    volatile unsigned int * ioc_address = (unsigned int *) &seg_ioc_base;
-    *status = ioc_address[BLOCK_DEVICE_STATUS];
-
-    return 0;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//     _bdv_get_block_size()
-// This function returns the block_size with which the IOC has been configured.
-///////////////////////////////////////////////////////////////////////////////
-unsigned int _bdv_get_block_size() 
-{
-    // get IOC base address
-    volatile unsigned int * ioc_address = (unsigned int *) &seg_ioc_base;
-    
-    return  ioc_address[BLOCK_DEVICE_BLOCK_SIZE];
+// Returns device status.
+///////////////////////////////////////////////////////////////////////////////
+unsigned int _bdv_get_status()
+{
+    return _bdv_get_register( BLOCK_DEVICE_STATUS );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Returns block size.
+///////////////////////////////////////////////////////////////////////////////
+unsigned int _bdv_get_block_size()
+{
+    return _bdv_get_register( BLOCK_DEVICE_BLOCK_SIZE );
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// This ISR save the status, acknowledge the IRQ,
+// and activates the task waiting on IO transfer.
+// It can be an HWI or a SWI.
+//
+// TODO the _set_task_slot access should be replaced by an atomic LL/SC
+//      when the CTX_RUN bool will be replaced by a bit_vector. 
+///////////////////////////////////////////////////////////////////////////////////
+void _bdv_isr( unsigned int irq_type,   // HWI / WTI
+               unsigned int irq_id,     // index returned by ICU
+               unsigned int channel )   // unused 
+{
+    unsigned int procid     = _get_procid();
+    unsigned int cluster_xy = procid / NB_PROCS_MAX;
+    unsigned int lpid       = procid % NB_PROCS_MAX;
+
+    // acknowledge WTI in local XCU if required 
+    unsigned int value;
+    if ( irq_type == IRQ_TYPE_WTI ) _xcu_get_wti_value( cluster_xy, irq_id, &value );
+
+    // save status in _bdv_status variable and reset IRQ
+    _bdv_status = _bdv_get_register( BLOCK_DEVICE_STATUS ); 
+
+    // identify task waiting on BDV
+    unsigned int rprocid    = _bdv_gtid>>16;
+    unsigned int ltid       = _bdv_gtid & 0xFFFF;
+    unsigned int remote_xy  = rprocid / NB_PROCS_MAX;
+
+#if GIET_DEBUG_IRQS  // we don't take the TTY lock to avoid deadlock
+unsigned int x              = cluster_xy >> Y_WIDTH;
+unsigned int y              = cluster_xy & ((1<<Y_WIDTH)-1);
+unsigned int rx             = remote_xy >> Y_WIDTH;
+unsigned int ry             = remote_xy & ((1<<Y_WIDTH)-1);
+unsigned int rlpid          = rprocid % NB_PROCS_MAX;
+_puts("\n[IRQS DEBUG] Processor[");
+_putd(x );
+_puts(",");
+_putd(y );
+_puts(",");
+_putd(lpid );
+_puts("] enters _bdv_isr() at cycle ");
+_putd(_get_proctime() );
+_puts("\n  for task ");
+_putd(ltid );
+_puts(" running on processor[");
+_putd(rx );
+_puts(",");
+_putd(ry );
+_puts(",");
+_putd(rlpid );
+_puts(" / bdv status = ");
+_putx(_bdv_status );
+_puts("\n");
+#endif
+
+    // re-activates sleeping task
+    _set_task_slot( rprocid,     // global processor index
+                    ltid,        // local task index on processor
+                    CTX_RUN_ID,  // CTX_RUN slot 
+                    1 );         // running
+
+    // requires a context switch for remote processor running the waiting task 
+    _xcu_send_wti( remote_xy,    // cluster index
+                   lpid,         // local processor index
+                   0 );          // don't force context switch if not idle
 }
 
Index: /soft/giet_vm/giet_drivers/bdv_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/bdv_driver.h	(revision 294)
+++ /soft/giet_vm/giet_drivers/bdv_driver.h	(revision 295)
@@ -7,29 +7,73 @@
 ///////////////////////////////////////////////////////////////////////////////////
 
-#ifndef _GIET_BDV_DRIVERS_H_
-#define _GIET_BDV_DRIVERS_H_
-
-#include <mapping_info.h>
+#ifndef _GIET_BDV_DRIVER_H_
+#define _GIET_BDV_DRIVER_H_
 
 ///////////////////////////////////////////////////////////////////////////////////
-// BDV access functions and variables (vci_block_device)
+// BDV global variables
 ///////////////////////////////////////////////////////////////////////////////////
 
-extern unsigned int _bdv_init( unsigned int channel );
+extern unsigned int          _bdv_lock;    // BDV is a shared ressource
+extern volatile unsigned int _bdv_status;  // required for IRQ signaling
+extern volatile unsigned int _bdv_gtid;    // descheduled task id = gpid<<16 + ltid
 
-extern unsigned int _bdv_write( unsigned int mode,
-                                unsigned int lba, 
-                                paddr_t      buffer, 
-                                unsigned int count );
+///////////////////////////////////////////////////////////////////////////////////
+// BDV registers, operations and status values
+///////////////////////////////////////////////////////////////////////////////////
 
-extern unsigned int _bdv_read(  unsigned int mode,
-                                unsigned int lba, 
-                                paddr_t      buffer,
-                                unsigned int count );
+enum BDV_registers 
+{
+    BLOCK_DEVICE_BUFFER,
+    BLOCK_DEVICE_LBA,
+    BLOCK_DEVICE_COUNT,
+    BLOCK_DEVICE_OP,
+    BLOCK_DEVICE_STATUS,
+    BLOCK_DEVICE_IRQ_ENABLE,
+    BLOCK_DEVICE_SIZE,
+    BLOCK_DEVICE_BLOCK_SIZE,
+    BLOCK_DEVICE_BUFFER_EXT,
+};
 
-extern unsigned int _bdv_get_status( unsigned int  channel,
-                                     unsigned int* status );
+enum BDV_operations 
+{
+    BLOCK_DEVICE_NOOP,
+    BLOCK_DEVICE_READ,
+    BLOCK_DEVICE_WRITE,
+};
+
+enum BDV_status
+{
+    BLOCK_DEVICE_IDLE,
+    BLOCK_DEVICE_BUSY,
+    BLOCK_DEVICE_READ_SUCCESS,
+    BLOCK_DEVICE_WRITE_SUCCESS,
+    BLOCK_DEVICE_READ_ERROR,
+    BLOCK_DEVICE_WRITE_ERROR,
+    BLOCK_DEVICE_ERROR,
+};
+
+///////////////////////////////////////////////////////////////////////////////////
+// BDV access functions (vci_block_device)
+///////////////////////////////////////////////////////////////////////////////////
+
+extern unsigned int _bdv_init();
+
+extern unsigned int _bdv_write( unsigned int       mode,
+                                unsigned int       lba, 
+                                unsigned long long buffer, 
+                                unsigned int       count );
+
+extern unsigned int _bdv_read(  unsigned int       mode,
+                                unsigned int       lba, 
+                                unsigned long long buffer,
+                                unsigned int       count );
+
+extern unsigned int _bdv_get_status();
 
 extern unsigned int _bdv_get_block_size();
+
+extern void _bdv_isr( unsigned irq_type,
+                      unsigned irq_id,
+                      unsigned channel );
 
 ///////////////////////////////////////////////////////////////////////////////////
Index: /soft/giet_vm/giet_drivers/cma_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/cma_driver.h	(revision 294)
+++ /soft/giet_vm/giet_drivers/cma_driver.h	(revision 295)
@@ -29,4 +29,21 @@
 };
 
+///////////////////////////////////////////////////////////////////////////////////
+// CMA (vci_chbuf_dma) low-level access functions
+///////////////////////////////////////////////////////////////////////////////////
+
+extern unsigned int _cma_get_register( unsigned int channel,
+                                       unsigned int index );
+
+extern void _cma_set_register( unsigned int channel,
+                               unsigned int index,
+                               unsigned int value );
+
+extern void _cma_isr( unsigned int irq_type,
+                      unsigned int irq_id,
+                      unsigned int channel );
+
+///////////////////////////////////////////////////////////////////////////////////
+
 #endif
 
Index: /soft/giet_vm/giet_drivers/dma_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/dma_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/dma_driver.c	(revision 295)
@@ -196,4 +196,6 @@
     unsigned int procid    = _get_procid();
     unsigned int cluster_xy = procid/NB_PROCS_MAX;
+    unsigned int x          = cluster_xy >> Y_WIDTH;
+    unsigned int y          = cluster_xy & ((1<<Y_WIDTH)-1);
     unsigned int channel_id = procid%NB_PROCS_MAX;
 
@@ -203,20 +205,16 @@
 
 #if GIET_DEBUG_DMA_DRIVER
-_tty_get_lock( 0 );
-_puts("\n[DMA DEBUG] Enter _dma_copy() at cycle ");
-_putd( _get_proctime() );
-_puts("\n - vspace_id  = ");
-_putx( vspace_id );
-_puts("\n - cluster_xy = ");
-_putx( cluster_xy );
-_puts("\n - channel_id = ");
-_putx( channel_id );
-_puts("\n - dest       = ");
-_putx( (unsigned int)dest );
-_puts("\n - source     = ");
-_putx( (unsigned int)source );
-_puts("\n - bytes      = ");
-_putd( size );
-_tty_release_lock( 0 );
+unsigned int x          = cluster_xy >> Y_WIDTH;
+unsigned int y          = cluster_xy & ((1<<Y_WIDTH)-1);
+
+_printf("\n[DMA DEBUG] Processor[%d,%d,%d] enters _dma_copy() at cycle %d\n"
+        " - vspace_id  = %d\n"
+        " - cluster_xy = %x\n"
+        " - channel_id = %d\n"
+        " - dest       = %x\n"
+        " - source     = %x\n"
+        " - bytes      = %x\n",
+        x, y, channel_id, _get_proctime(), vspace_id, cluster_xy,
+        (unsigned int)dest, (unsigned int)source, size );
 #endif
 
@@ -226,7 +224,5 @@
          (size & 0x3) )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _dma_copy() : buffer unaligned\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _dma_copy() : buffer unaligned\n");
         _exit();
     }
@@ -242,7 +238,5 @@
     if ( ko ) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _dma_copy() : source buffer unmapped\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _dma_copy() : source buffer unmapped\n");
         _exit();
     }
@@ -257,7 +251,5 @@
     if ( ko ) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _dma_copy() : dest buffer unmapped\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _dma_copy() : dest buffer unmapped\n");
         _exit();
     }
@@ -266,11 +258,7 @@
 
 #if GIET_DEBUG_DMA_DRIVER
-_tty_get_lock( 0 );
-_puts("\n - src_paddr  = ");
-_putl( src_paddr );
-_puts("\n - dst_paddr  = ");
-_putl( dst_paddr );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf(" - src_paddr  = %llx\n"
+        " - dst_paddr  = %llx\n",
+        src_paddr, dst_paddr );
 #endif
 
@@ -282,7 +270,5 @@
     if ( ko ) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _dma_copy() : cannot start transfer\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _dma_copy() : cannot start transfer\n");
         _exit();
     }
@@ -297,7 +283,5 @@
 
 #if GIET_DEBUG_DMA_DRIVER
-_tty_get_lock( 0 );
-_puts("\n[DMA DEBUG] _dma_copy() : ... waiting on DMA_STATUS register ...\n");
-_tty_release_lock( 0 );
+_printf("\n[DMA DEBUG] _dma_copy() : ... waiting on DMA_STATUS register ...\n");
 #endif
 
@@ -307,9 +291,5 @@
     if( status != DMA_SUCCESS )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _dma_copy() : DMA_STATUS error = ");
-        _putd( status );
-        _puts("\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _dma_copy() : DMA_STATUS = %x\n", status );
         _exit();
     }
@@ -318,15 +298,9 @@
 
 #if GIET_DEBUG_DMA_DRIVER
-_tty_get_lock( 0 );
-_puts("\n[DMA DEBUG] _dma_copy() completed at cycle ");
-_putd( _get_proctime() );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf("\n[DMA DEBUG] _dma_copy() completed at cycle %d\n", _get_proctime() );
 #endif
 
 #else // NB_DMA_CHANNELS == 0
-    _tty_get_lock( 0 );
-    _puts("\n[GIET ERROR] in _dma_copy() : NB_DMA_CHANNELS = 0 !\n");
-    _tty_release_lock( 0 );
+    _printf("\n[GIET ERROR] in _dma_copy() : NB_DMA_CHANNELS = 0 !\n");
     _exit();
 #endif
Index: /soft/giet_vm/giet_drivers/fbf_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/fbf_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/fbf_driver.c	(revision 295)
@@ -7,6 +7,4 @@
 // The fbf_driver.c and fbf_driver.h files are part ot the GIET-VM kernel.
 // This driver supports the SoCLib vci_framebuffer component.
-//
-// It can exist only one frame buffer in the architecture.
 //
 // There exist two methods to access the VciFrameBuffer device:
@@ -59,6 +57,8 @@
                             unsigned int length) 
 {
-    char* fb_address = (char *)&seg_fbf_base + offset;
-    _memcpy( fb_address, buffer, length);
+    char* fbf_address = (char *)&seg_fbf_base + offset;
+
+    _memcpy( fbf_address, buffer, length);
+
     return 0;
 }
@@ -74,6 +74,8 @@
                             unsigned int   length) 
 {
-    char* fb_address = (char *)&seg_fbf_base + offset;
-    _memcpy( buffer, fb_address, length);
+    char* fbf_address = (char *)&seg_fbf_base + offset;
+
+    _memcpy( buffer, fbf_address, length);
+
     return 0;
 }
@@ -145,7 +147,5 @@
     if ( channel_id >= NB_CMA_CHANNELS )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _fb_cma_init() : CMA channel index too large\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _fb_cma_init() : CMA channel index too large\n");
         return 1;
     }
@@ -154,7 +154,5 @@
     if ( sizeof(fb_cma_channel_t) != 32 )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _fb_cma_init() : bad fb_cma_channel size\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _fb_cma_init() : bad fb_cma_channel size\n");
         return 1;
     }
@@ -163,7 +161,5 @@
     if ( (unsigned int)(&_fb_cma_channel[channel_id]) & 0x1F ) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _fb_cma_init() : bad fb_cma_channel alignment\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _fb_cma_init() : bad fb_cma_channel alignment\n");
         return 1;
     }
@@ -172,7 +168,5 @@
     if ( ((unsigned int)vbase0 & 0x3) || ((unsigned int)vbase1 & 0x3) || (length & 0x3) ) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _fb_cma_init() : user buffer not word aligned\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _fb_cma_init() : user buffer not word aligned\n");
         return 1;
     }
@@ -189,7 +183,5 @@
     if (ko) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _fb_cma_init() : frame buffer unmapped\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _fb_cma_init() : frame buffer unmapped\n");
         return 1;
     }
@@ -204,14 +196,10 @@
     if (ko) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _fb_cma_init() : user buffer 0 unmapped\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _fb_cma_init() : user buffer 0 unmapped\n");
         return 1;
     } 
     if ((flags & PTE_U) == 0) 
     {
-        _tty_get_lock( 0 );
-        _puts("[GIET ERROR] in _fb_cma_init() : user buffer 0 not in user space\n");
-        _tty_release_lock( 0 );
+        _printf("[GIET ERROR] in _fb_cma_init() : user buffer 0 not in user space\n");
         return 1; 
     }
@@ -226,14 +214,10 @@
     if (ko) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _fb_cma_init() : user buffer 1 unmapped\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _fb_cma_init() : user buffer 1 unmapped\n");
         return 1;
     } 
     if ((flags & PTE_U) == 0) 
     {
-        _tty_get_lock( 0 );
-        _puts("[GIET ERROR] in _fb_cma_init() : user buffer 1 not in user space\n");
-        _tty_release_lock( 0 );
+        _printf("[GIET ERROR] in _fb_cma_init() : user buffer 1 not in user space\n");
         return 1; 
     }
@@ -251,7 +235,5 @@
     if (ko) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _fb_cma_init() : channel descriptor unmapped\n");
-        _tty_release_lock( 0 );
+        _printf("\n[GIET ERROR] in _fb_cma_init() : channel descriptor unmapped\n");
         return 1;
     } 
@@ -262,16 +244,13 @@
 
 #if GIET_DEBUG_FBF_DRIVER
-_tty_get_lock( 0 );
-_puts("\n[CMA DEBUG] fb_cma_init()");
-_puts("\n - fbf       pbase = ");
-_putl( _fb_cma_channel[channel_id].fbf );
-_puts("\n - buf0      pbase = ");
-_putl( _fb_cma_channel[channel_id].buf0 );
-_puts("\n - buf1      pbase = ");
-_putl( _fb_cma_channel[channel_id].buf1 );
-_puts("\n - channel   pbase = ");
-_putl( _fb_cma_desc_paddr[channel_id] );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf("\n[CMA DEBUG] enters _fb_cma_init()\n"
+        " - fbf       pbase = %l\n"
+        " - buf0      pbase = %l\n"
+        " - buf1      pbase = %l\n"
+        " - channel   pbase = %l\n"
+        _fb_cma_channel[channel_id].fbf,
+        _fb_cma_channel[channel_id].buf0,
+        _fb_cma_channel[channel_id].buf1,
+        _fb_cma_desc_paddr[channel_id] );
 #endif
 
@@ -283,28 +262,21 @@
 
     // CMA channel activation
-    unsigned int* cma_vbase = (unsigned int *)&seg_cma_base;
-    unsigned int  offset    = channel_id * CHBUF_CHANNEL_SPAN;
-
-    cma_vbase[offset + CHBUF_SRC_DESC]  = (unsigned int)(desc_paddr & 0xFFFFFFFF);
-    cma_vbase[offset + CHBUF_SRC_EXT]   = (unsigned int)(desc_paddr >> 32);
-    cma_vbase[offset + CHBUF_SRC_NBUFS] = 2;
-    cma_vbase[offset + CHBUF_DST_DESC]  = (unsigned int)(desc_paddr & 0xFFFFFFFF) + 16;
-    cma_vbase[offset + CHBUF_DST_EXT]   = (unsigned int)(desc_paddr >> 32);
-    cma_vbase[offset + CHBUF_DST_NBUFS] = 1;
-    cma_vbase[offset + CHBUF_BUF_SIZE]  = length;
-    cma_vbase[offset + CHBUF_PERIOD]    = 300;
-    cma_vbase[offset + CHBUF_RUN]       = 1;
-
+    _cma_set_register( channel_id, CHBUF_SRC_DESC , (unsigned int)(desc_paddr & 0xFFFFFFFF) );
+    _cma_set_register( channel_id, CHBUF_SRC_EXT  , (unsigned int)(desc_paddr >> 32) );
+    _cma_set_register( channel_id, CHBUF_SRC_NBUFS, 2 );
+    _cma_set_register( channel_id, CHBUF_DST_DESC , (unsigned int)(desc_paddr & 0xFFFFFFFF) + 16 );
+    _cma_set_register( channel_id, CHBUF_DST_EXT  , (unsigned int)(desc_paddr >> 32) );
+    _cma_set_register( channel_id, CHBUF_DST_NBUFS, 1 );
+    _cma_set_register( channel_id, CHBUF_BUF_SIZE , length );
+    _cma_set_register( channel_id, CHBUF_PERIOD   , 300 );
+    _cma_set_register( channel_id, CHBUF_RUN      , 1 );
     return 0;
 
 #else
-
-    _tty_get_lock( 0 );
-    _puts("\n[GIET ERROR] in _fb_cma_init() : no CMA channel allocated\n");
-    _tty_release_lock( 0 );
-
+    _printf("\n[GIET ERROR] in _fb_cma_init() : no CMA channel allocated\n");
     return 1;
 #endif
 }
+
 ////////////////////////////////////////////////////////////////////////////////////
 // _fb_cma_write()
@@ -330,5 +302,4 @@
 
     volatile paddr_t buf_paddr;
-    unsigned int     buf_length;
     unsigned int     full = 1;
 
@@ -339,11 +310,6 @@
 
 #if GIET_DEBUG_FBF_DRIVER
-_tty_get_lock( 0 );
-_puts("\n[CMA DEBUG] fb_cma_write() for CMA channel ");
-_putd( channel_id );
-_puts(" / buf_id = ");
-_putd( buffer_id );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf("\n[CMA DEBUG] _fb_cma_write() for CMA channel %d / bufid = %d at cycle %d\n",
+        channel_id, buffer_id, _get_proctime() );
 #endif
 
@@ -357,5 +323,5 @@
 
             // INVAL L1 cache for the channel descriptor,
-            _dcache_buf_invalidate( &_fb_cma_channel[channel_id], 32 );
+            _dcache_buf_invalidate( (void*)&_fb_cma_channel[channel_id], 32 );
         }
 
@@ -367,15 +333,4 @@
         count++;
         if ( count == 10 ) _exit();
-
-#if GIET_DEBUG_FBF_DRIVER
-_tty_get_lock( 0 );
-_puts(" - buffer descriptor = ");
-_putl( buf_paddr );
-_puts(" at cycle ");
-_putd( _get_proctime() );
-_puts("\n");
-_tty_release_lock( 0 );
-#endif
-
     }
 
@@ -408,7 +363,5 @@
 #else
 
-    _tty_get_lock( 0 );
-    _puts("\n[GIET ERROR] in _fb_cma_channel() : no CMA channel allocated\n");
-    _tty_release_lock( 0 );
+    _printf("\n[GIET ERROR] in _fb_cma_channel() : no CMA channel allocated\n");
     return 1;
 
@@ -427,15 +380,17 @@
     unsigned int channel_id = _get_context_slot(CTX_CMA_ID);
 
+#if GIET_DEBUG_FBF_DRIVER
+_printf("\n[CMA DEBUG] _fb_cma_stop() for CMA channel %d at cycle %d\n",
+        channel_id, _get_proctime() );
+#endif
+
     // CMA channel desactivation
-    unsigned int* cma_vbase = (unsigned int *)&seg_cma_base;
-    unsigned int  offset     = channel_id * CHBUF_CHANNEL_SPAN;
-    cma_vbase[offset + CHBUF_RUN] = 0;
+    _cma_set_register( channel_id, CHBUF_RUN, 0 );
+
     return 0;
 
 #else
 
-    _tty_get_lock( 0 );
-    _puts("\n[GIET ERROR] in _fb_cma_stop() : no CMA channel allocated\n");
-    _tty_release_lock( 0 );
+    _printf("\n[GIET ERROR] in _fb_cma_stop() : no CMA channel allocated\n");
     return 1;
 
Index: /soft/giet_vm/giet_drivers/hba_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/hba_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/hba_driver.c	(revision 295)
@@ -2,5 +2,5 @@
 // File     : hba_driver.c
 // Date     : 23/11/2013
-// Author   : alain greiner and zhang
+// Author   : alain greiner
 // Copyright (c) UPMC-LIP6
 ///////////////////////////////////////////////////////////////////////////////////
@@ -9,63 +9,15 @@
 // block oriented, external storage contrÃŽler, respecting the AHCI standard.
 //
-// It can exist only one ahci-device controler in the architecture.
+// The seg_ioc_base (standard HBA virtual base address) and seg_ioc_base_bis
+// (backup HBA virtual base address) must be defined in giet_vsegs.ld file.
+//////////////////////////////////////////////////////////////////////////////////
+// Implementation notes:
 //
-// The _ioc_read() and _ioc_write() functions use the _ioc_access() function,
-// that is always blocking, but can be called in 4 modes:
+// 1. In order to share code, the two _hba_read() and _hba_write() functions
+//    call the same _hba_set_cmd() function.
 //
-// - In BOOT_PA mode, the _ioc_access() function use the buffer virtual address 
-//   as a physical address (as the page tables are not build) and use a polling
-//   policy on the IOC_STATUS register to detect transfer completion, as
-//   hardware interrupts are not activated. This mode is used by the
-//   boot code to load the map.bin file into memory.
-//
-// - In BOOT_VA mode, the _ioc_access() function makes a V2P translation to
-//   compute the buffer physical address, and use a polling policy on IOC_STATUS
-//   register to detect transfer completion. This mode is used by the boot code
-//   to load the various .elf files into memory.
-//
-// - In KERNEL mode, the _ioc_access() function makes a V2P translation to
-//   compute the buffer physical address, and use a descheduling strategy:
-//   The ISR executed when transfer completes should restart the calling task. 
-//   There is no checking of user access right to the memory buffer.
-//   This mode must be used to access IOC, for an "open" system call.
-//
-// - In USER mode, the _ioc_access() function makes a V2P translation to
-//   compute the buffer physical address, and use a descheduling strategy:
-//   The ISR executed when transfer completes should restart the calling task, 
-//   The user access right to the memory buffer must be checked.
-//   This mode must be used to access IOC, for a "read/write" system call.
-//
-// As the IOC component can be used by several programs running in parallel,
-// the _ioc_lock variable guaranties exclusive access to the device.  The
-// _ioc_read() and _ioc_write() functions use atomic LL/SC to get the lock.
-//
-// The IOMMU can be activated or not:
-// 
-// 1) When the IOMMU is used, a fixed size 2Mbytes vseg is allocated to 
-// the IOC peripheral, in the I/O virtual space, and the user buffer is
-// dynamically remapped in the IOMMU page table. The corresponding entry 
-// in the IOMMU PT1 is defined by the kernel _ioc_iommu_ix1 variable.
-// The number of pages to be unmapped is stored in the _ioc_npages variable.
-// The number of PT2 entries is dynamically computed and stored in the
-// kernel _ioc_iommu_npages variable. It cannot be larger than 512.
-// The user buffer is unmapped by the _ioc_completed() function when 
-// the transfer is completed.
-//
-// 2/ If the IOMMU is not used, we check that  the user buffer is mapped to a
-// contiguous physical buffer (this is generally true because the user space
-// page tables are statically constructed to use contiguous physical memory).
-//
-// Finally, the memory buffer must fulfill the following conditions:
-// - The buffer must be word aligned, 
-// - The buffer must be mapped in user space for an user access, 
-// - The buffer must be writable in case of (to_mem) access,
-// - The total number of physical pages occupied by the user buffer cannot
-//   be larger than 512 pages if the IOMMU is activated,
-// - All physical pages occupied by the user buffer must be contiguous
-//   if the IOMMU is not activated.
-// An error code is returned if these conditions are not verified.
-///////////////////////////////////////////////////////////////////////////////////
-// The seg_ioc_base virtual base addresses must be defined in giet_vsegs.ld file.
+// 2. All accesses to HBA registers are done by the two
+//    _hba_set_register() and _hba_get_register() low-level functions,
+//    that are handling virtual / physical extended addressing.
 ///////////////////////////////////////////////////////////////////////////////////
 
@@ -80,18 +32,10 @@
 #include <vmem.h>
 
-#if !defined( NB_HBA_CHANNELS )
-# error: You must define NB_HBA_CHANNELS in the hard_config.h file
-#endif
-
-#if ( NB_HBA_CHANNELS > 8 )
-# error: NB_HBA_CHANNELS cannot be larger than 8
-#endif
-
-#if !defined( USE_IOB )
-# error: You must define USE_IOB in the hard_config.h file
-#endif
-
-#if !defined(GIET_USE_IOMMU) 
-# error: You must define GIET_USE_IOMMU in the giet_config.h file
+#if !defined( NB_IOC_CHANNELS )
+# error: You must define NB_IOC_CHANNELS in the hard_config.h file
+#endif
+
+#if ( NB_IOC_CHANNELS > 8 )
+# error: NB_IOC_CHANNELS cannot be larger than 8
 #endif
 
@@ -103,63 +47,40 @@
 
 // command list array (one per channel)
-hba_cmd_list_t   hba_cmd_list[NB_HBA_CHANNELS] __attribute__((aligned(0x1000)));   
+hba_cmd_list_t   hba_cmd_list[NB_IOC_CHANNELS] __attribute__((aligned(0x1000)));   
 
 // command tables array (32 command tables per channel)
-hba_cmd_table_t  hba_cmd_table[NB_HBA_CHANNELS][32] __attribute__((aligned(0x1000))); 
+hba_cmd_table_t  hba_cmd_table[NB_IOC_CHANNELS][32] __attribute__((aligned(0x1000))); 
 
 // command list physical addresses array (one per channel)
-paddr_t          hba_cmd_list_paddr[NB_HBA_CHANNELS];
+paddr_t          hba_cmd_list_paddr[NB_IOC_CHANNELS];
 
 // command tables physical addresses array (32 command tables per channel)
-paddr_t          hba_cmd_table_paddr[NB_HBA_CHANNELS][32];
+paddr_t          hba_cmd_table_paddr[NB_IOC_CHANNELS][32];
 
 // command list pointer array (one per channel)
-unsigned int     hba_cmd_slot[NB_HBA_CHANNELS];
-
-//////////////////////////////////////////////////////////////////
-// This function returns the status of a given channel.
-// return 0 if success, >0 if error
-//////////////////////////////////////////////////////////////////
-unsigned int _hba_get_status( unsigned int   channel, 
-                              unsigned int*  status )
-{
-    volatile unsigned int* hba_address;
-    hba_address = (unsigned int*)(&seg_ioc_base) + (HBA_SPAN*channel);
-
-    if( channel >= NB_HBA_CHANNELS )
-    {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _hba_get_status() : illegal channel\n");
-        _tty_release_lock( 0 );
-        return 1;
-    }
-    else
-    {
-        *status = hba_address[HBA_PXIS];
-        return 0;
-    }
-}
-//////////////////////////////////////////////////////////////////
-// This function reset the status resgister for a given channel.
-// return 0 if success, >0 if error
-//////////////////////////////////////////////////////////////////
-unsigned int _hba_reset_status( unsigned int channel )
-{
-    volatile unsigned int* hba_address;
-    hba_address = (unsigned int*)(&seg_ioc_base) + (HBA_SPAN*channel);
-
-    if( channel >= NB_HBA_CHANNELS )
-    {   
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _hba_reset_status() : illegal channel\n");
-        _tty_release_lock( 0 );
-        return 1;
-    }
-    else
-    {
-        hba_address[HBA_PXIS] = 0;
-        return 0;
-    }
-}
+unsigned int     hba_cmd_slot[NB_IOC_CHANNELS];
+
+//////////////////////////////////////////////////////////////////////////////
+// This low level function returns the value of register (channel / index)
+//////////////////////////////////////////////////////////////////////////////
+unsigned int _hba_get_register( unsigned int channel,
+                                unsigned int index )
+{
+    unsigned int* vaddr = (unsigned int*)&seg_ioc_base + channel*HBA_SPAN + index;
+    return _io_extended_read( vaddr );
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// This low level function set a new value in register (channel / index)  
+//////////////////////////////////////////////////////////////////////////////
+void _hba_set_register( unsigned int channel,
+                        unsigned int index,
+                        unsigned int value )
+{
+    unsigned int* vaddr = (unsigned int*)&seg_ioc_base + channel*HBA_SPAN + index;
+    _io_extended_write( vaddr, value );
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////
 // This function register a command in both the command list
@@ -171,22 +92,14 @@
 // return 0 if success, > 0 if error
 ///////////////////////////////////////////////////////////////////////////////
-unsigned int _hba_cmd_set( unsigned int  is_read,     // to memory
+unsigned int _hba_cmd_set( unsigned int  channel,     // channel index
+                           unsigned int  is_read,     // to memory
                            unsigned int  lba,         // logic block address
-                           unsigned int  buf_vaddr,   // buffer virtual address
+                           paddr_t       buffer,      // buffer physical address
                            unsigned int  count )      // number of blocks
 {
-    volatile unsigned int *hba_address;
-
     unsigned int       block_size;     // defined by the block device (bytes)
-    unsigned int       channel_id;     // channel index
     unsigned int       pxci;           // command list status
     unsigned int       cmd_id;         // command index in command list
-    unsigned int       buf_id;         // for physical buffers covering user buffer
-    unsigned int       user_pt_vbase;  // user page table virtual base address
-    unsigned int       vpn;            // for all pages covering the userbuffer
-    unsigned int       vpn_min;        // first virtual page index for user buffer
-    unsigned int       vpn_max;        // last  virtual page index for user buffer
-    unsigned int       offset;         // unaligned bytes in page frame: buf_vaddr & 0xFFF 
-    unsigned int       offset_last;    // unaligned bytes in last frame
+
     hba_cmd_desc_t*    cmd_desc;       // command descriptor pointer   
     hba_cmd_table_t*   cmd_table;      // command table pointer
@@ -195,43 +108,57 @@
 
     // check buffer alignment
-    if( buf_vaddr & (block_size-1) )
-    {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _hba_set_cmd() : user buffer not block aligned\n");
-        _tty_release_lock( 0 );
+    if( buffer & (block_size-1) )
+    {
+        _printf("\n[GIET ERROR] in _hba_set_cmd() : user buffer not block aligned\n");
         return 1;
     }
 
-    // get channel index
-    channel_id = _get_context_slot(CTX_HBA_ID);
-    if ( channel_id == 0xFFFFFFFF )
-    {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _hba_set_cmd() : no HBA channel allocated\n");
-        _tty_release_lock( 0 );
+    // get command list status from PXCI register
+    pxci = _hba_get_register( channel, HBA_PXCI );
+
+    // get command index and return error if command list full
+    cmd_id = hba_cmd_slot[channel];
+    if( pxci & (1<<cmd_id ) ) 
+    {
+        _printf("\n[GIET ERROR] in _hba_set_cmd() : command list full for channel %d\n",
+                channel );
         return 1;
     }
 
-    // get hba device address
-    hba_address = (unsigned int*)(&seg_ioc_base) + (HBA_SPAN * channel_id);
-
-    // get command list status
-    pxci = hba_address[HBA_PXCI];
-
-    // get command index and return error if command list full
-    cmd_id = hba_cmd_slot[channel_id];
-    if( pxci & (1<<cmd_id ) ) 
-    {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _hba_set_cmd() : command list full in channel \n");
-        _putd( channel_id );
-        _puts("\n");
-        _tty_release_lock( 0 );
-        return 1;
-    }
-
     // compute pointers on command descriptor and command table    
-    cmd_desc  = (hba_cmd_desc_t*)(&(hba_cmd_list[channel_id].desc[cmd_id]));
-    cmd_table = (hba_cmd_table_t*)(&(hba_cmd_table[channel_id][cmd_id]));
+    cmd_desc  = (hba_cmd_desc_t*)(&(hba_cmd_list[channel].desc[cmd_id]));
+    cmd_table = (hba_cmd_table_t*)(&(hba_cmd_table[channel][cmd_id]));
+
+    // set  buffer descriptor in command table 
+    cmd_table->entry[0].dba  = (unsigned int)(buffer);
+    cmd_table->entry[0].dbau = (unsigned int)(buffer >> 32);
+    cmd_table->entry[0].dbc  = count * block_size;
+
+    // initialize command table header
+    cmd_table->header.lba0 = (char)lba;
+    cmd_table->header.lba1 = (char)(lba>>8);
+    cmd_table->header.lba2 = (char)(lba>>16);
+    cmd_table->header.lba3 = (char)(lba>>24);
+    cmd_table->header.lba4 = 0;
+    cmd_table->header.lba5 = 0;
+
+    // initialise command descriptor
+    cmd_desc->prdtl[0] = 1;
+    cmd_desc->prdtl[1] = 0;
+    cmd_desc->ctba     = (unsigned int)(hba_cmd_table_paddr[channel][cmd_id]);
+    cmd_desc->ctbau    = (unsigned int)(hba_cmd_table_paddr[channel][cmd_id]>>32);
+    if( is_read ) cmd_desc->flag[0] = 0x00;
+    else          cmd_desc->flag[0] = 0x40;     
+   
+    // update PXCI register
+    _hba_set_register( channel, HBA_PXCI, (1<<cmd_id) );
+
+    // update command pointer 
+    hba_cmd_slot[channel] = (cmd_id + 1)%32;
+
+    return  0;
+} 
+
+/* This can be used for a future use with buffer in virtual space
 
     // get user space page table virtual address
@@ -262,21 +189,15 @@
         if ( ko )
         {
-            _tty_get_lock( 0 );
-            _puts("[GIET ERROR] in _hba_set_cmd() : user buffer unmapped\n");
-            _tty_release_lock( 0 );
+            _printf("[GIET ERROR] in _hba_set_cmd() : user buffer unmapped\n");
             return 1;
         }
         if ((flags & PTE_U) == 0)
         {
-            _tty_get_lock( 0 );
-            _puts("[GIET ERROR] in _hba_set_cmd() : user buffer not in user space\n");
-            _tty_release_lock( 0 );
+            _printf("[GIET ERROR] in _hba_set_cmd() : user buffer not in user space\n");
             return 1;
         }
         if (((flags & PTE_W) == 0 ) && (is_read == 0) )
         {
-            _tty_get_lock( 0 );
-            _puts("[GIET ERROR] in _hba_set_cmd() : user buffer not writable\n");
-            _tty_release_lock( 0 );
+            _printf("[GIET ERROR] in _hba_set_cmd() : user buffer not writable\n");
             return 1;
         }
@@ -285,7 +206,5 @@
         if( buf_id > 245 )
         {
-            _tty_get_lock( 0 );
-            _puts("[GIET ERROR] in _hba_set_cmd() : max number of buffers is 248\n");
-            _tty_release_lock( 0 );
+            _printf("[GIET ERROR] in _hba_set_cmd() : max number of buffers is 248\n");
             return 1;
         }
@@ -301,11 +220,11 @@
 
 #if GIET_DEBUG_HBA_DRIVER
-_puts("\n- buf_index = ");
+_printf("\n- buf_index = ");
 _putd( buf_id );
-_puts(" / paddr = ");
+_printf(" / paddr = ");
 _putl( paddr );
-_puts(" / count = ");
+_printf(" / count = ");
 _putd( count );
-_puts("\n");
+_printf("\n");
 #endif
             buf_id++;
@@ -320,11 +239,11 @@
 
 #if GIET_DEBUG_HBA_DRIVER
-_puts("\n- buf_index = ");
+_printf("\n- buf_index = ");
 _putd( buf_id );
-_puts(" / paddr = ");
+_printf(" / paddr = ");
 _putl( paddr );
-_puts(" / count = ");
+_printf(" / count = ");
 _putd( count );
-_puts("\n");
+_printf("\n");
 #endif
             buf_id++;
@@ -340,11 +259,11 @@
 
 #if GIET_DEBUG_HBA_DRIVER
-_puts("\n- buf_index = ");
+_printf("\n- buf_index = ");
 _putd( buf_id );
-_puts(" / paddr = ");
+_printf(" / paddr = ");
 _putl( paddr );
-_puts(" / count = ");
+_printf(" / count = ");
 _putd( count );
-_puts("\n");
+_printf("\n");
 #endif
             buf_id++;
@@ -357,11 +276,11 @@
 
 #if GIET_DEBUG_HBA_DRIVER
-_puts("\n- buf_index = ");
+_printf("\n- buf_index = ");
 _putd( buf_id );
-_puts(" / paddr = ");
+_printf(" / paddr = ");
 _putl( paddr );
-_puts(" / count = ");
+_printf(" / count = ");
 _putd( count );
-_puts("\n");
+_printf("\n");
 #endif
             buf_id++;
@@ -376,63 +295,54 @@
 
 #if GIET_DEBUG_HBA_DRIVER
-_puts("\n- buf_index = ");
+_printf("\n- buf_index = ");
 _putd( buf_id );
-_puts(" / paddr = ");
+_printf(" / paddr = ");
 _putl( paddr );
-_puts(" / count = ");
+_printf(" / count = ");
 _putd( count );
-_puts("\n");
+_printf("\n");
 #endif
             buf_id++;
         }
     }
-
-    // initialize command table header
-    cmd_table->header.lba0 = (char)lba;
-    cmd_table->header.lba1 = (char)(lba>>8);
-    cmd_table->header.lba2 = (char)(lba>>16);
-    cmd_table->header.lba3 = (char)(lba>>24);
-
-    // initialise command descriptor
-    cmd_desc->prdtl[0] = (unsigned char)(buf_id);
-    cmd_desc->prdtl[1] = (unsigned char)(buf_id>>8);
-    cmd_desc->ctba     = (unsigned int)(hba_cmd_table_paddr[channel_id][cmd_id]);
-    cmd_desc->ctbau    = (unsigned int)(hba_cmd_table_paddr[channel_id][cmd_id]>>32);
-    if( is_read ) cmd_desc->flag[0] = 0x00;
-    else          cmd_desc->flag[0] = 0x40;     
-   
-    // update PXCI register
-    hba_address[HBA_PXCI] = (1<<cmd_id);
-
-    // update command pointer 
-    hba_cmd_slot[channel_id] = (cmd_id + 1)%32;
-
-    return  0;
-} 
+*/
+
+
 ///////////////////////////////////////////////////////////////////
 // Register a write command in Command List and Command Table
-// for a single buffer.
+// for a single physical buffer.
 // Returns 0 if success, > 0 if error.
 ///////////////////////////////////////////////////////////////////
-unsigned int _hba_write( unsigned int  mode,
+unsigned int _hba_write( unsigned int  channel,
+                         unsigned int  mode,
                          unsigned int  lba,
-                         void*         buffer, 
+                         paddr_t       buffer, 
                          unsigned int  count )
 {
-    return _hba_cmd_set( 0, lba, (unsigned int)buffer, count );
+    return _hba_cmd_set( channel, 
+                         0,         // write 
+                         lba, 
+                         buffer, 
+                         count );
 }
 
 ///////////////////////////////////////////////////////////////////
 // Register a read command in Command List and Command Table
-// for a single buffer.
+// for a single physical buffer.
 // Returns 0 if success, > 0 if error.
 ///////////////////////////////////////////////////////////////////
-unsigned int _hba_read( unsigned int  mode,
+unsigned int _hba_read( unsigned int  channel,
+                        unsigned int  mode,
                         unsigned int  lba, 
-                        void*         buffer, 
+                        paddr_t       buffer, 
                         unsigned int  count )
 {
-    return _hba_cmd_set( 1, lba, (unsigned int)buffer, count );
-}
+    return _hba_cmd_set( channel,
+                         1,          // read
+                         lba, 
+                         buffer, 
+                         count );
+}
+
 //////////////////////////////////////////////////////////////////
 // This function initializes for a given channel
@@ -453,14 +363,11 @@
     unsigned int pt = _get_context_slot(CTX_PTAB_ID);
 
-    // HBA registers
-    unsigned int*  hba_address;
-    hba_address = (unsigned int*)&seg_ioc_base + HBA_SPAN * channel;
-
-    hba_address[HBA_PXCLB]  = (unsigned int)(&hba_cmd_list[channel]);
-    hba_address[HBA_PXCLBU] = 0;
-    hba_address[HBA_PXIE]   = 0x40000001;
-    hba_address[HBA_PXIS]   = 0;
-    hba_address[HBA_PXCI]   = 0;
-    hba_address[HBA_PXCMD]  = 1;
+    // HBA registers TODO: ne faut_il pas un V2P pour PXCLB/PXCLBU ? (AG)
+    _hba_set_register( channel, HBA_PXCLB , (unsigned int)&hba_cmd_list[channel] );
+    _hba_set_register( channel, HBA_PXCLBU, 0 );
+    _hba_set_register( channel, HBA_PXIE  , 0x40000001 );
+    _hba_set_register( channel, HBA_PXIS  , 0 );
+    _hba_set_register( channel, HBA_PXCI  , 0 );
+    _hba_set_register( channel, HBA_PXCMD , 1 );
 
     // command list pointer       
@@ -475,7 +382,5 @@
     if ( fail )
     {
-        _tty_get_lock( 0 );
-        _puts("[GIET ERROR] in _hba_init() : command list unmapped\n");
-        _tty_release_lock( 0 );
+        _printf("[GIET ERROR] in _hba_init() : command list unmapped\n");
         return 1;
     }
@@ -492,7 +397,5 @@
         if ( fail )
         {
-            _tty_get_lock( 0 );
-            _puts("[GIET ERROR] in _hba_init() : command table unmapped\n");
-            _tty_release_lock( 0 );
+            _printf("[GIET ERROR] in _hba_init() : command table unmapped\n");
             return 1;
         }
@@ -513,4 +416,26 @@
 }
 
+/////////////////////////////////////////////////////////////////////////////////////
+// This function returns the content of the HBA_PXIS register for a given channel, 
+// and reset this register to acknoledge IRQ.
+// return 0 if success, > 0 if error
+/////////////////////////////////////////////////////////////////////////////////////
+unsigned int _hba_get_status( unsigned int channel ) 
+{
+
+    if( channel >= NB_IOC_CHANNELS )
+    {
+        _printf("\n[GIET ERROR] in _hba_get_status() : illegal channel\n");
+        _exit();
+    }
+
+    // get HBA_PXIS value
+    unsigned int status = _hba_get_register( channel, HBA_PXIS );
+
+    // reset HBA_PXIS
+    _hba_set_register( channel, HBA_PXIS, 0 );
+
+    return status;
+}
 
 // Local Variables:
Index: /soft/giet_vm/giet_drivers/hba_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/hba_driver.h	(revision 294)
+++ /soft/giet_vm/giet_drivers/hba_driver.h	(revision 295)
@@ -59,5 +59,5 @@
 } hba_cmd_entry_t;
 
-typedef struct hba_cmd_table_s  // size = 256 bytes
+typedef struct hba_cmd_table_s  // size = 4096 bytes
 {
 
@@ -97,22 +97,21 @@
 ///////////////////////////////////////////////////////////////////////////////////
 
-unsigned int _hba_write( unsigned int mode,
-                         unsigned int lba,       // logic bloc address on device
-                         void*        buffer,    // memory buffer base address
-                         unsigned int count );   // number of blocs
+extern unsigned int _hba_init ( unsigned int channel ); 
 
-unsigned int _hba_read ( unsigned int mode,
-                         unsigned int lba,       // logic bloc address on device
-                         void*        buffer,    // memory buffer base address
-                         unsigned int count );   // number of blocks
+extern unsigned int _hba_write( unsigned int channel,     // channel index
+                                unsigned int mode,        // BOOT / KERNEL / USER
+                                unsigned int lba,         // logic bloc address on device
+                                unsigned long long paddr, // memory buffer base address
+                                unsigned int count );     // number of blocs
 
-unsigned int _hba_init ( unsigned int channel ); 
+extern unsigned int _hba_read ( unsigned int channel,     // channel index
+                                unsigned int mode,        // BOOT / KERNEL / USER
+                                unsigned int lba,         // logic bloc address on device
+                                unsigned long long paddr, // memory buffer base address
+                                unsigned int count );     // number of blocks
 
-unsigned int _hba_get_status( unsigned int   channel,
-                              unsigned int*  status );
+extern unsigned int _hba_get_status( unsigned int   channel );
 
-unsigned int _hba_reset_status( unsigned int channel );
-
-unsigned int _hba_get_block_size ();
+extern unsigned int _hba_get_block_size ();
 
 
Index: /soft/giet_vm/giet_drivers/icu_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/icu_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/icu_driver.c	(revision 295)
@@ -70,5 +70,5 @@
 
 #if USE_XICU
-    _puts("[GIET ERROR] _icu_set_mask() should not be used if USE_XICU is set\n");
+    _printf("[GIET ERROR] _icu_set_mask() should not be used if USE_XICU is set\n");
     return 1;
 #else
@@ -98,5 +98,5 @@
 
 #if USE_XICU
-    _puts("[GIET ERROR] _icu_get_index() should not be used if USE_XICU is set\n");
+    _printf("[GIET ERROR] _icu_set_mask() should not be used if USE_XICU is set\n");
     return 1;
 #else
Index: /soft/giet_vm/giet_drivers/ioc_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/ioc_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/ioc_driver.c	(revision 295)
@@ -7,31 +7,45 @@
 ///////////////////////////////////////////////////////////////////////////////////
 // The ioc_driver.c and ioc_driver.h files are part ot the GIET-VM kernel.
-// This driver supports the SocLib vci_block_device component, that is
-// a single channel, block oriented, external storage contrÃŽler.
-//
-// It can exist only one block-device controler in the architecture.
-//
-// The _ioc_read() and _ioc_write() functions use the _ioc_access() function,
-// that is always blocking. The _ioc_access function will call the read or
-// write function in the driver of the choosen IOC peripheral, which can be for
-// now: BDV, HBA and SPI. This function can be called in 4 modes:
-//
-// - In BOOT_PA mode, the _ioc_access() function use the buffer virtual address
-//   as a physical address (as the page tables are not build). This mode is
-//   used by the boot code to load the map.bin file into memory.
-//
-// - In BOOT_VA mode, the _ioc_access() function makes a V2P translation to
-//   compute the buffer physical address. This mode is used by the boot code to
-//   load the various .elf files into memory.
-//
-// - In KERNEL mode, the _ioc_access() function makes a V2P translation to
-//   compute the buffer physical address. There is no checking of user access
-//   right to the memory buffer.  This mode must be used to access IOC, for an
-//   "open" system call.
-//
-// - In USER mode, the _ioc_access() function makes a V2P translation to
-//   compute the buffer physical address. The user access right to the memory
-//   buffer must be checked.  This mode must be used to access IOC, for a
-//   "read/write" system call.
+//
+// This abstact driver define a generic API, supporting various physical
+// block device controlers, including:
+// - vci_block_device : single channel)                    => bdv_driver
+// - vci_ahci         : multi channels                     => hba_driver
+// - sd_card          : single channel                     => sdc_driver
+// - ramdisk (single channel meory mapped virtual disk)    => rdk_driver
+//
+// It can exist only one block-device type in the architecture, that must be
+// defined by one of the following configuration variables in hard_config.h file:
+// USE_IOC_BDV, USE_IOC_SDC, USE_IOC_HBA, USE_IOC_RDK.
+//
+// Any physical driver xxx must provide the following API:
+// - _xxx_init()
+// - _xxx_read()
+// - _xxx_write()
+// - _xxx_get_status()
+// - _xxx_get_block_size()
+// The "channel" parameter is no transmited to single channel devices.
+//
+// The _ioc_read() and _ioc_write() functions are always blocking for
+// the calling user program.
+//
+// These functions compute the physical address of the memory buffer before 
+// calling the proper physical device. They can be called in 3 modes:
+//
+// - In BOOT mode, these functions use the buffer virtual address
+//   as a physical address if the MMU is not activated.
+//   They make a V2P translation if the MMU is activated.
+//   This mode is used to load the map.bin file (before memory activation),
+//   or to load the various .elf files (after MMU activation).
+//
+// - In KERNEL mode, these functions make a V2P translation to
+//   compute the buffer physical address.
+//   There is no checking of user access right to the memory buffer.  
+//   This mode must be used for an "open" system call.
+//
+// - In USER mode, these functions make a V2P translation to
+//   compute the buffer physical address. 
+//   The user access right to the memory buffer are checked.  
+//   This mode must be used for a "read" or "write" system call.
 //
 // The IOMMU can be activated or not:
@@ -60,10 +74,21 @@
 //   if the IOMMU is not activated.
 // An error code is returned if these conditions are not verified.
+//
+// The "seg_ioc_base" virtual base address of the segment containing the
+// memory-mapped registers of the device must be defined in the giet_vsegs.ld file.
+// If the RAMDISK is used, an extra memory segment with virtual base address
+// "seg_ramdisk_base" must be defined in the giet_vsegs.ld file.
 ///////////////////////////////////////////////////////////////////////////////////
-// The seg_ioc_base virtual base addresses must be defined in giet_vsegs.ld file.
+// Implementation note:
+// In order to share the code, the two _ioc_read() and _ioc_write() functions
+// call the same _ioc_access() function.
 ///////////////////////////////////////////////////////////////////////////////////
 
 #include <giet_config.h>
 #include <ioc_driver.h>
+#include <bdv_driver.h>
+#include <hba_driver.h>
+#include <sdc_driver.h>
+#include <rdk_driver.h>
 #include <utils.h>
 #include <tty_driver.h>
@@ -81,38 +106,39 @@
 #endif
 
-#if (USE_BDV + USE_SPI + USE_HBA) != 1
-# error: You must use only one IOC controller (BDV or SPI or HBA)
-#endif
-
-#if USE_BDV
+#if (USE_IOC_BDV + USE_IOC_SPI + USE_IOC_HBA + USE_IOC_RDK) != 1
+# error: You must use only one IOC controller type (BDV or SPI or HBA or RDK)
+#endif
+
+#if USE_IOC_BDV
 # include <bdv_driver.h>
 #endif
 
-#if USE_SPI
+#if USE_IOC_SPI
 # include <sdc_driver.h>
 #endif
 
-#if USE_HBA
+#if USE_IOC_HBA
 # include <hba_driver.h>
 #endif
 
+#if USE_IOC_RDK
+# include <rdk_driver.h>
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// IOC global variables
+///////////////////////////////////////////////////////////////////////////////
 
 #define in_unckdata __attribute__((section (".unckdata")))
 
-///////////////////// IOC global variables
-
-in_unckdata unsigned int _ioc_lock = 0;
-in_unckdata unsigned int _ioc_status = 0;
-in_unckdata volatile unsigned int _ioc_gtid;
 in_unckdata volatile unsigned int _ioc_iommu_ix1 = 0;
 in_unckdata volatile unsigned int _ioc_iommu_npages; 
 
 ///////////////////////////////////////////////////////////////////////////////
-//      _ioc_access()
 // This function transfer data between a memory buffer and the block device.
 // The buffer lentgth is (count*block_size) bytes.
 // Arguments are:
 // - to_mem     : from external storage to memory when non 0.
-// - kernel     : kernel buffer with identity mapping when non 0. 
+// - mode       : BOOT_PA / BOOT_VA / KERNEL / USER 
 // - lba        : first block index on the external storage.
 // - buf_vaddr  : virtual base address of the memory buffer.
@@ -121,4 +147,5 @@
 ///////////////////////////////////////////////////////////////////////////////
 static unsigned int _ioc_access( unsigned int to_mem,
+                                 unsigned int channel,
                                  unsigned int mode,
                                  unsigned int lba,
@@ -128,19 +155,17 @@
 
 #if GIET_DEBUG_IOC_DRIVER
-_tty_get_lock( 0 );
-_puts("\n[IOC DEBUG] Enter _ioc_access() at cycle ");
-_putd( _get_proctime() );
-_puts(" for processor ");
-_putd( _get_procid() );
-_puts("\n - mode    = ");
-_putd( mode );
-_puts("\n - vaddr   = ");
-_putx( buf_vaddr );
-_puts("\n - sectors = ");
-_putd( count );
-_puts("\n - lba     = ");
-_putx( lba );
-_puts("\n");
-_tty_release_lock( 0 );
+unsigned int procid  = _get_procid();
+unsigned int cid     = procid / NB_PROCS_MAX;
+unsigned int lpid    = procid % NB_PROCS_MAX;
+unsigned int x       = cid >> Y_WIDTH;
+unsigned int y       = cid & ((1<<Y_WIDTH) - 1);
+
+_printf("\n[IOC DEBUG] Processor[%d,%d,%d] enters _ioc_access() at cycle %d\n"
+        " - channel  = %d\n"
+        " - mode     = %d\n"
+        " - vaddr    = %d\n"
+        " - sectors  = %d\n"
+        " - lba      = %d\n",
+        x, y, lpid, _get_proctime(), channel, mode, buf_vaddr, count, lba );
 #endif
 
@@ -160,28 +185,31 @@
     if ((unsigned int) buf_vaddr & 0x3)
     {
-        _tty_get_lock( 0 );
-        _puts("\n[GIET ERROR] in _ioc_access() : buffer not word aligned\n");
-        _tty_release_lock( 0 );
-        return 1; 
+        _printf("\n[GIET ERROR] in _ioc_access() : buffer not word aligned\n");
+        _exit(); 
+    }
+
+    // check channel 
+    if ( (USE_IOC_HBA == 0) && (channel > 0) )
+    {
+        _printf("\n[GIET ERROR] in _ioc_access() : channel must be 0 when HBA not used\n");
+        _exit(); 
     }
 
     unsigned int length = count << 9;  // count * 512 bytes
 
-    // computing target buffer physical address
-    if ( mode == IOC_BOOT_PA_MODE )                // identity mapping
+    // computing memory buffer physical address
+    if ( (mode == IOC_BOOT_MODE) && ((_get_mmu_mode() & 0x4) == 0) ) // identity mapping
     {
         buf_paddr = (paddr_t)buf_vaddr;
     }
-    else                                           // V2P translation
+    else                                                    // V2P translation required
     {
         // get page table virtual address
         pt_vbase = _get_context_slot(CTX_PTAB_ID);
-        vpn_min = buf_vaddr >> 12;
-        vpn_max = (buf_vaddr + length - 1) >> 12;
+        vpn_min  = buf_vaddr >> 12;
+        vpn_max  = (buf_vaddr + length - 1) >> 12;
 
         // loop on all virtual pages covering the user buffer
-        for (vpn = vpn_min, ix2 = 0 ; 
-             vpn <= vpn_max ; 
-             vpn++, ix2++ ) 
+        for (vpn = vpn_min, ix2 = 0 ; vpn <= vpn_max ; vpn++, ix2++ ) 
         {
             // get ppn and flags for each vpn
@@ -193,7 +221,5 @@
             if ( ko )
             {
-                _tty_get_lock( 0 );
-                _puts("\n[GIET ERROR] in _ioc_access() : buffer unmapped\n");
-                _tty_release_lock( 0 );
+                _printf("\n[GIET ERROR] in _ioc_access() : buffer unmapped\n");
                 return 1; 
             }
@@ -201,7 +227,5 @@
             if ( (mode == IOC_USER_MODE) && ((flags & PTE_U) == 0) )
             {
-                _tty_get_lock( 0 );
-                _puts("\n[GIET ERROR] in _ioc_access() : buffer not user accessible\n");
-                _tty_release_lock( 0 );
+                _printf("\n[GIET ERROR] in _ioc_access() : buffer not user accessible\n");
                 return 1; 
             }
@@ -209,7 +233,5 @@
             if ( ((flags & PTE_W) == 0 ) && to_mem )
             {
-                _tty_get_lock( 0 );
-                _puts("\n[GIET ERROR] in _ioc_access() : buffer not writable\n");
-                _tty_release_lock( 0 );
+                _printf("\n[GIET ERROR] in _ioc_access() : buffer not writable\n");
                 return 1; 
             }
@@ -223,7 +245,5 @@
             if (ix2 > 511) // check buffer length < 2 Mbytes
             {
-                _tty_get_lock( 0 );
-                _puts("\n[GIET ERROR] in _ioc_access() : user buffer > 2 Mbytes\n");
-                _tty_release_lock( 0 );
+                _printf("\n[GIET ERROR] in _ioc_access() : user buffer > 2 Mbytes\n");
                 return 1; 
             }
@@ -242,7 +262,5 @@
             if ((ppn - ppn_first) != ix2) 
             {
-                _tty_get_lock( 0 );
-                _puts("[GIET ERROR] in _ioc_access() : split physical buffer\n");
-                _tty_release_lock( 0 );
+                _printf("[GIET ERROR] in _ioc_access() : split physical buffer\n");
                 return 1; 
             }
@@ -272,5 +290,5 @@
     else         // memory read : update data caches
     {
-        // L1 cache : nothing to do if L1 write-through
+        // L1 cache : nothing to do for L1 write-through
 
         // L2 cache (only if IOB used)
@@ -280,13 +298,40 @@
     if ( GIET_USE_IOMMU ) buf_paddr = (paddr_t) buf_xaddr;
 
-#if   USE_BDV
-    if (to_mem) error = _bdv_read (mode, lba, buf_paddr, count);
-    else        error = _bdv_write(mode, lba, buf_paddr, count);
-#elif USE_SPI
-    if (to_mem) error = _sdc_read (mode, lba, buf_paddr, count);
-    else        error = _sdc_write(mode, lba, buf_paddr, count);
-#elif USE_HBA
-    if (to_mem) error = _hba_read (mode, lba, buf_paddr, count);
-    else        error = _hba_write(mode, lba, buf_paddr, count);
+    ///////////////////////////////////////////
+    // select the proper physical device 
+    ///////////////////////////////////////////
+
+#if       ( USE_IOC_BDV )
+
+#if GIET_DEBUG_IOC_DRIVER
+_printf("\n[IOC DEBUG] Calling BDV driver\n");
+#endif
+        if (to_mem) error = _bdv_read ( mode, lba, buf_paddr, count);
+        else        error = _bdv_write( mode, lba, buf_paddr, count);
+
+#elif ( USE_IOC_SPI )
+
+#if GIET_DEBUG_IOC_DRIVER
+_printf("\n[IOC DEBUG] Calling SPI driver\n");
+#endif
+        if (to_mem) error = _sdc_read (mode, lba, buf_paddr, count);
+        else        error = _sdc_write(mode, lba, buf_paddr, count);
+
+#elif ( USE_IOC_HBA )
+
+#if GIET_DEBUG_IOC_DRIVER
+_printf("\n[IOC DEBUG] Calling HBA driver\n");
+#endif
+        if (to_mem) error = _hba_read (channel, mode, lba, buf_paddr, count);
+        else        error = _hba_write(channel, mode, lba, buf_paddr, count);
+
+#elif ( USE_IOC_RDK )
+
+#if GIET_DEBUG_IOC_DRIVER
+_printf("\n[IOC DEBUG] Calling RDK driver\n");
+#endif
+        if (to_mem) error = _rdk_read (lba, buf_vaddr, count);
+        else        error = _rdk_write(lba, buf_vaddr, count);
+
 #endif
 
@@ -295,5 +340,4 @@
 
 ///////////////////////////////////////////////////////////////////////////////
-//       _ioc_init()
 // This function cheks block size, and activates the IOC interrupts.
 // Return 0 for success.
@@ -301,17 +345,28 @@
 unsigned int _ioc_init( unsigned int channel )
 {
-#if   USE_BDV
-    return _bdv_init( channel );
-#elif USE_SPI
-    return _sdc_init( channel );
-#elif USE_HBA
+
+#if   ( USE_IOC_BDV ) 
+
+    return _bdv_init();
+
+#elif ( USE_IOC_SPI ) 
+
+    return _sdc_init();
+    
+#elif ( USE_IOC_HBA ) 
+
     return _hba_init( channel );
-#endif
+    
+#elif ( USE_IOC_RDK ) 
+
+    return _rdk_init();
+    
+#endif
+    
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-//     _ioc_read()
 // Transfer data from the block device to a memory buffer. 
-// - mode     : BOOT / KERNEL / USER
+// - mode     : BOOT_PA / BOOT_VA / KERNEL / USER 
 // - lba      : first block index on the block device
 // - buffer   : base address of the memory buffer (must be word aligned)
@@ -319,5 +374,6 @@
 // Returns 0 if success, > 0 if error.
 ///////////////////////////////////////////////////////////////////////////////
-unsigned int _ioc_read( unsigned int mode,  
+unsigned int _ioc_read( unsigned int channel,
+                        unsigned int mode,  
                         unsigned int lba, 
                         void*        buffer, 
@@ -325,4 +381,5 @@
 {
     return _ioc_access( 1,        // read access
+                        channel,
                         mode,  
                         lba,
@@ -332,7 +389,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////
-//     _ioc_write()
 // Transfer data from a memory buffer to the block device. 
-// - mode     : BOOT / KERNEL / USER
+// - mode     : BOOT_PA / BOOT_VA / KERNEL / USER 
 // - lba      : first block index on the block device
 // - buffer   : base address of the memory buffer (must be word aligned)
@@ -340,5 +396,6 @@
 // Returns 0 if success, > 0 if error.
 ///////////////////////////////////////////////////////////////////////////////
-unsigned int _ioc_write( unsigned int mode,  
+unsigned int _ioc_write( unsigned int channel,
+                         unsigned int mode,  
                          unsigned int lba, 
                          const void*  buffer, 
@@ -346,4 +403,5 @@
 {
     return _ioc_access( 0,        // write access
+                        channel,
                         mode,  
                         lba,
@@ -353,34 +411,59 @@
 
 ///////////////////////////////////////////////////////////////////////////////
-//     _ioc_get_status()
 // This function returns in the status variable, the transfert status, and
 // acknowledge the IRQ if the IOC controler is not busy.
 // Returns 0 if success, > 0 if error
 ///////////////////////////////////////////////////////////////////////////////
-unsigned int _ioc_get_status( unsigned int  channel,
-                              unsigned int* status )
-{
-#if   USE_BDV
-    return _bdv_get_status(channel, status);
-#elif USE_SPI
-    return _sdc_get_status(channel, status);
-#elif USE_HBA
-    return _hba_get_status(channel, status);
-#endif
+unsigned int _ioc_get_status( unsigned int  channel )
+{
+
+#if   ( USE_IOC_BDV ) 
+
+    return _bdv_get_status( );
+
+#elif ( USE_IOC_SPI ) 
+
+    return _sdc_get_status( );
+
+#elif ( USE_IOC_HBA ) 
+
+    return _hba_get_status( channel );
+
+#elif ( USE_IOC_RDK )
+
+    _printf("[GIET ERROR] _ioc_get_status() should not be called");
+    _printf(" when RAMDISK  is used...\n");
+    _exit();
+
+    return 0;
+
+#endif
+
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-//     _ioc_get_block_size()
 // This function returns the block_size with which the IOC has been configured.
 ///////////////////////////////////////////////////////////////////////////////
 unsigned int _ioc_get_block_size() 
 {
-#if   USE_BDV
+
+#if   ( USE_IOC_BDV ) 
+
     return _bdv_get_block_size();
-#elif USE_SPI
+    
+#elif ( USE_IOC_SPI ) 
+
     return _sdc_get_block_size();
-#elif USE_HBA
+    
+#elif ( USE_IOC_HBA ) 
+
     return _hba_get_block_size();
-#endif
+    
+#elif ( USE_IOC_RDK ) 
+
+    return 512;
+
+#endif
+
 }
 
Index: /soft/giet_vm/giet_drivers/ioc_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/ioc_driver.h	(revision 294)
+++ /soft/giet_vm/giet_drivers/ioc_driver.h	(revision 295)
@@ -13,64 +13,37 @@
 ///////////////////////////////////////////////////////////////////////////////////
 
-enum IOC_registers 
-{
-    BLOCK_DEVICE_BUFFER,
-    BLOCK_DEVICE_LBA,
-    BLOCK_DEVICE_COUNT,
-    BLOCK_DEVICE_OP,
-    BLOCK_DEVICE_STATUS,
-    BLOCK_DEVICE_IRQ_ENABLE,
-    BLOCK_DEVICE_SIZE,
-    BLOCK_DEVICE_BLOCK_SIZE,
-    BLOCK_DEVICE_BUFFER_EXT,
-};
-enum IOC_operations 
-{
-    BLOCK_DEVICE_NOOP,
-    BLOCK_DEVICE_READ,
-    BLOCK_DEVICE_WRITE,
-};
-enum IOC_status
-{
-    BLOCK_DEVICE_IDLE,
-    BLOCK_DEVICE_BUSY,
-    BLOCK_DEVICE_READ_SUCCESS,
-    BLOCK_DEVICE_WRITE_SUCCESS,
-    BLOCK_DEVICE_READ_ERROR,
-    BLOCK_DEVICE_WRITE_ERROR,
-    BLOCK_DEVICE_ERROR,
-};
 enum IOC_driver_modes
 {
-    IOC_BOOT_PA_MODE,  // No V2P translation / Polling IOC_STATUS / no access checking
-    IOC_BOOT_VA_MODE,  // V2P translation    / Polling IOC_STATUS / no access checking
-    IOC_KERNEL_MODE,   // V2P translation    / Descheduling + IRQ / no access checking
-    IOC_USER_MODE,     // V2P translation    / Descheduling + IRQ / access checking
+    IOC_BOOT_MODE   = 0,     //  Polling IOC_STATUS / no access right checking
+    IOC_KERNEL_MODE = 1,     //  Descheduling + IRQ / no access right checking
+    IOC_USER_MODE   = 2,     //  Descheduling + IRQ / access right checking
 };
 
 ///////////////////////////////////////////////////////////////////////////////////
-// IOC access functions and variables (vci_block_device)
+// IOC global variables (generic disk controller)
 ///////////////////////////////////////////////////////////////////////////////////
 
-extern unsigned int _ioc_lock;
-extern unsigned int _ioc_status;
-extern volatile unsigned int _ioc_gtid;
 extern volatile unsigned int _ioc_iommu_ix1;
 extern volatile unsigned int _ioc_iommu_npages; 
 
+///////////////////////////////////////////////////////////////////////////////////
+// IOC access functions  (generic disk controller)
+///////////////////////////////////////////////////////////////////////////////////
+
 extern unsigned int _ioc_init( unsigned int channel );
 
-extern unsigned int _ioc_write( unsigned int mode,
+extern unsigned int _ioc_write( unsigned int channel,
+                                unsigned int mode,
                                 unsigned int lba, 
                                 const void*  buffer, 
                                 unsigned int count );
 
-extern unsigned int _ioc_read(  unsigned int mode,
+extern unsigned int _ioc_read(  unsigned int channel,
+                                unsigned int mode,
                                 unsigned int lba, 
                                 void*        buffer,
                                 unsigned int count );
 
-extern unsigned int _ioc_get_status( unsigned int  channel,
-                                     unsigned int* status );
+extern unsigned int _ioc_get_status( unsigned int channel );
 
 extern unsigned int _ioc_get_block_size();
Index: /soft/giet_vm/giet_drivers/mmc_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/mmc_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/mmc_driver.c	(revision 295)
@@ -57,14 +57,6 @@
     if ( (x >= X_SIZE) || (y >= Y_SIZE) )
     {
-        _puts("\n[GIET ERROR] in _memc_inval() : illegal cluster index[");
-        _putd( x );
-        _puts(",");
-        _putd( y );
-        _puts("]\n");
-        _puts("   - paddr      = ");
-        _putl( buf_paddr );
-        _puts("\n   - cluster_xy = ");
-        _putx( cluster_xy );
-        _puts("\n");
+        _printf("\n[GIET ERROR] in _memc_inval() : illegal cluster_xy for paddr %l\n",
+                 buf_paddr );
         _exit();
     }
@@ -102,14 +94,6 @@
     if ( (x >= X_SIZE) || (y >= Y_SIZE) )
     {
-        _puts("\n[GIET ERROR] in _memc_sync() : illegal cluster index[");
-        _putd( x );
-        _puts(",");
-        _putd( y );
-        _puts("]\n");
-        _puts("   - paddr      = ");
-        _putl( buf_paddr );
-        _puts("\n   - cluster_xy = ");
-        _putx( cluster_xy );
-        _puts("\n");
+        _printf( "\n[GIET ERROR] in _memc_sync() : illegal cluster_xy for paddr %l\n",
+                 buf_paddr );
         _exit();
     }
Index: /soft/giet_vm/giet_drivers/mwr_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/mwr_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/mwr_driver.c	(revision 295)
@@ -56,5 +56,5 @@
                            paddr_t                channel_pbase ) 
 {
-    _puts(" [GIET_ERROR] _mwr_hw_init() function not supported yet\n");
+    _printf(" [GIET_ERROR] _mwr_hw_init() function not supported yet\n");
     _exit();
 
Index: /soft/giet_vm/giet_drivers/nic_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/nic_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/nic_driver.c	(revision 295)
@@ -56,6 +56,28 @@
 #define in_unckdata __attribute__((section (".unckdata")))
 
+///////////////////////////////////////////////////////////////////////////////
+// This low_level function returns the value contained in register (index).
+///////////////////////////////////////////////////////////////////////////////
+unsigned int _nic_get_register( unsigned int channel,
+                                unsigned int index )
+{
+    unsigned int* vaddr = (unsigned int*)&seg_nic_base + 
+                           NIC_CHANNEL_SPAN*channel + index;
+    return _io_extended_read( vaddr );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// This low-level function set a new value in register (index).
+///////////////////////////////////////////////////////////////////////////////
+void _nic_set_register( unsigned int channel,
+                        unsigned int index,
+                        unsigned int value ) 
+{
+    unsigned int* vaddr = (unsigned int*)&seg_nic_base + 
+                           NIC_CHANNEL_SPAN*channel + index;
+    _io_extended_write( vaddr, value );
+}
+
 //////////////////////////////////////////////////////////////////////////////////
-// _nic_sync_write()
 // Transfer data from an memory buffer to the NIC device using a memcpy.
 // - buffer : base address of the memory buffer.
@@ -65,5 +87,5 @@
                               unsigned int   length ) 
 {
-    _puts("[GIET ERROR] _nic_sync_write function not implemented\n");
+    _printf("[GIET ERROR] _nic_sync_write function not implemented\n");
     _exit();
 
@@ -73,5 +95,4 @@
 }
 //////////////////////////////////////////////////////////////////////////////////
-// _nic_sync_read()
 // Transfer data from the NIC device to a memory buffer using a memcpy. 
 // - buffer : base address of the memory buffer.
@@ -81,5 +102,5 @@
                              unsigned int   length ) 
 {
-    _puts("[GIET ERROR] _nic_sync_read function not implemented\n");
+    _printf("[GIET ERROR] _nic_sync_read function not implemented\n");
     _exit();
 
@@ -89,10 +110,9 @@
 }
 //////////////////////////////////////////////////////////////////////////////////
-// _nic_cma_start()
 // Returns 0 if success, > 0 if error.
 //////////////////////////////////////////////////////////////////////////////////
 unsigned int _nic_cma_start( )
 {
-    _puts("[GIET ERROR] _nic_cma_start function not implemented\n");
+    _printf("[GIET ERROR] _nic_cma_start() not implemented\n");
     _exit();
 
@@ -101,10 +121,9 @@
 }
 //////////////////////////////////////////////////////////////////////////////////
-// _nic_cma_stop()
 // Returns 0 if success, > 0 if error.
 //////////////////////////////////////////////////////////////////////////////////
 unsigned int _nic_cma_stop()
 {
-    _puts("[GIET ERROR] _nic_cma_stop function not implemented\n");
+    _printf("[GIET ERROR] _nic_cma_stop() not implemented\n");
     _exit();
 
@@ -113,4 +132,25 @@
 }
 
+//////////////////////////////////////////////////////////////////////////////////
+// This ISR handles IRQx from a NIC RX channeL
+//////////////////////////////////////////////////////////////////////////////////
+void _nic_rx_isr( unsigned int irq_type,
+                  unsigned int irq_id,
+                  unsigned int channel )
+{
+    _printf("[GIET ERROR] _nic_rx_isr() not implemented\n");
+    _exit();
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+// This ISR handles IRQx from a NIC RX channeL
+//////////////////////////////////////////////////////////////////////////////////
+void _nic_tx_isr( unsigned int irq_type,
+                  unsigned int irq_id,
+                  unsigned int channel )
+{
+    _printf("[GIET ERROR] _nic_tx_isr() not implemented\n");
+    _exit();
+}
 
 // Local Variables:
Index: /soft/giet_vm/giet_drivers/nic_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/nic_driver.h	(revision 294)
+++ /soft/giet_vm/giet_drivers/nic_driver.h	(revision 295)
@@ -8,4 +8,67 @@
 #ifndef _GIET_NIC_DRIVERS_H_
 #define _GIET_NIC_DRIVERS_H_
+
+///////////////////////////////////////////////////////////////////////////////////
+// NIC Registers  (vci_multi_nic)
+///////////////////////////////////////////////////////////////////////////////////
+
+enum SoclibMultiNicHyperviseurRegisters {
+    NIC_G_VIS                        = 0,   // bitfield : bit N = 0 -> channel N disabled
+    NIC_G_ON                         = 1,   // boolean : NIC component activated
+    NIC_G_NB_CHAN                    = 2,   // Number of channels present in this NIC (read only)
+    NIC_G_BC_ENABLE                  = 3,   // boolean : Enable Broadcast if non zero
+    NIC_G_TDM_ENABLE                 = 4,   // boolean : TDM Scheduler if non zero
+    NIC_G_TDM_PERIOD                 = 5,   // TDM time slot value
+    NIC_G_BYPASS_ENABLE              = 6,   // boolean : Enable bypass for TX packets
+    // alignment
+    NIC_G_MAC_4                      = 8,   // channel mac address 32 LSB bits array[8]
+    NIC_G_MAC_2                      = 16,  // channel mac address 16 MSB bits array[8]
+    // alignment 
+    NIC_G_NPKT_RX_G2S_RECEIVED       = 32,  // number of packets received on GMII RX port
+    NIC_G_NPKT_RX_G2S_DISCARDED      = 33,  // number of RX packets discarded by RX_G2S FSM
+
+    NIC_G_NPKT_RX_DES_SUCCESS        = 34,  // number of RX packets transmited by RX_DES FSM
+    NIC_G_NPKT_RX_DES_TOO_SMALL      = 35,  // number of discarded too small RX packets (<60B)
+    NIC_G_NPKT_RX_DES_TOO_BIG        = 36,  // number of discarded too big RX packets (>1514B)
+    NIC_G_NPKT_RX_DES_MFIFO_FULL     = 37,  // number of discarded RX packets because fifo full
+    NIC_G_NPKT_RX_DES_CRC_FAIL       = 38,  // number of discarded RX packets because CRC32 failure
+
+    NIC_G_NPKT_RX_DISPATCH_RECEIVED  = 39,  // number of packets received by RX_DISPATCH FSM
+    NIC_G_NPKT_RX_DISPATCH_BROADCAST = 40,  // number of broadcast RX packets received
+    NIC_G_NPKT_RX_DISPATCH_DST_FAIL  = 41,  // number of discarded RX packets for DST MAC not found
+    NIC_G_NPKT_RX_DISPATCH_CH_FULL   = 42,  // number of discarded RX packets for channel full
+
+    NIC_G_NPKT_TX_DISPATCH_RECEIVED  = 43,  // number of packets received by TX_DISPATCH FSM
+    NIC_G_NPKT_TX_DISPATCH_TOO_SMALL = 44,  // number of discarded too small TX packets (<60B)
+    NIC_G_NPKT_TX_DISPATCH_TOO_BIG   = 45,  // number of discarded too big TX packets (>1514B)
+    NIC_G_NPKT_TX_DISPATCH_SRC_FAIL  = 46,  // number of discarded TX packets for SRC MAC failed
+    NIC_G_NPKT_TX_DISPATCH_BROADCAST = 47,  // number of broadcast TX packets received
+    NIC_G_NPKT_TX_DISPATCH_BYPASS    = 48,  // number of bypassed TX->RX packets
+    NIC_G_NPKT_TX_DISPATCH_TRANSMIT  = 49,  // number of transmit TX packets
+
+    NIC_CHANNEL_SPAN                 = 0x2000,
+};
+
+/////////////////////////////////////////////////////////////////////
+// A container descriptor has the following form: 
+// LOW WORD : Container LSB base address     
+// HIGH WORD: Container status (leftmost bit), '1' means full 
+//            Base address MSB extension, if needed (right aligned)
+//////////////////////////////////////////////////////////////////////
+enum SoclibMultiNicChannelRegisters 
+{
+    NIC_RX_DESC_LO_0          = 0,   // RX_0 descriptor low word         (Read/Write)
+    NIC_RX_DESC_HI_0          = 1,   // RX_0 descriptor high word        (Read/Write)
+    NIC_RX_DESC_LO_1          = 2,   // RX_1 descriptor low word         (Read/Write)
+    NIC_RX_DESC_HI_1          = 3,   // RX_1 descriptor high word        (Read/Write) 
+    NIC_TX_DESC_LO_0          = 4,   // TX_0 descriptor low word         (Read/Write)
+    NIC_TX_DESC_HI_0          = 5,   // TX_0 descriptor high word        (Read/Write) 
+    NIC_TX_DESC_LO_1          = 6,   // TX_1 descriptor low word         (Read/Write)
+    NIC_TX_DESC_HI_1          = 7,   // TX_1 descriptor high word        (Read/Write) 
+    NIC_MAC_4                 = 8,   // channel mac address 32 LSB bits  (Read Only)
+    NIC_MAC_2                 = 9,   // channel mac address 16 LSB bits  (Read Only)
+    NIC_RX_RUN                = 10,  // RX packets can be received       (write_only)
+    NIC_TX_RUN                = 11,  // TX packets can be transmitted    (write_only)
+};
 
 ///////////////////////////////////////////////////////////////////////////////////
@@ -23,4 +86,12 @@
 extern unsigned int _nic_cma_stop();
 
+extern void _nic_rx_isr( unsigned int irq_type,
+                         unsigned int irq_id,
+                         unsigned int channel );
+
+extern void _nic_tx_isr( unsigned int irq_type,
+                         unsigned int irq_id,
+                         unsigned int channel );
+
 ///////////////////////////////////////////////////////////////////////////////////
 
Index: /soft/giet_vm/giet_drivers/sdc_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/sdc_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/sdc_driver.c	(revision 295)
@@ -5,5 +5,7 @@
 // Copyright (c) UPMC-LIP6
 ///////////////////////////////////////////////////////////////////////////////////
+
 #include <sdc_driver.h>
+#include <tty_driver.h>
 #include <utils.h>
 
@@ -179,6 +181,5 @@
 	if ( sdcard_rsp != 0x01 )
 	{
-
-		_puts("card CMD0 failed ");
+		_printf("[SDC ERROR] card CMD0 failed\n");
 		return sdcard_rsp;
 	}
@@ -196,5 +197,5 @@
 	if (!SDCARD_CHECK_R1_VALID(sdcard_rsp))
     {
-		_puts("card CMD8 failed ");
+		_printf("[SDC ERROR] card CMD8 failed\n");
 		return sdcard_rsp;
 	}
@@ -206,11 +207,11 @@
 		ersp = (ersp << 8) | _sdc_receive_char();
 		ersp = (ersp << 8) | _sdc_receive_char();
-		if ((ersp & 0xffff) != 0x0101) {
+		if ((ersp & 0xffff) != 0x0101) 
+        {
 			// voltage mismatch
-			_puts("card CMD8 mismatch: ");
-			_putx(ersp);
+			_printf("[SDC ERROR] card CMD8 mismatch : ersp = %x\n");
 			return sdcard_rsp;
 		}
-		_puts("v2 or later ");
+		_printf("[SDC WARNING] v2 or later ");
 		sdcard.sdhc = 1;
 	}
@@ -218,5 +219,5 @@
     {
 		// other error
-		_puts("card CMD8 error ");
+		_printf("[SDC ERROR] card CMD8 error\n");
 		return sdcard_rsp;
 	}
@@ -249,5 +250,5 @@
 	if (sdcard_rsp)
     {
-		_puts("SD ACMD41 failed ");
+		_printf("[SDC ERROR] ACMD41 failed\n");
 		return sdcard_rsp;
 	}
@@ -263,5 +264,5 @@
 		if (sdcard_rsp)
         {
-			_puts("SD CMD58 failed ");
+			_printf("[SDC ERROR] CMD58 failed\n");
 			return sdcard_rsp;
 		}
@@ -272,6 +273,7 @@
 		if (ersp & 0x40000000)
         {
-			_puts("SDHC ");
-		} else
+			_printf(" SDHC ");
+		} 
+        else
         {
 			sdcard.sdhc = 0;
@@ -279,5 +281,5 @@
 		_sdc_disable();
 	}
-	_puts("card detected ");
+	_printf("card detected\n");
 	return 0;
 }
@@ -334,5 +336,5 @@
 // Returns 0 if success, other value if failure
 ///////////////////////////////////////////////////////////////////////////////
-unsigned int _sdc_init( unsigned int channel )
+unsigned int _sdc_init()
 {
     spi = (struct spi_dev*) &seg_ioc_base;
@@ -355,14 +357,14 @@
     while(1)
     {
-        _puts("Trying to initialize SD card... ");
-
-        sdcard_rsp = _sdc_open( channel );
+        _printf("[SDC WARNING] Trying to initialize SD card...\n");
+
+        sdcard_rsp = _sdc_open( 0 );  // only channel 0
         if (sdcard_rsp == 0)
         {
-            _puts("OK\n");
+            _printf("OK\n");
             break;
         }
 
-        _puts("KO\n");
+        _printf("KO\n");
 
         for (i = 0; i < 1000; i++);
@@ -370,8 +372,6 @@
         if (++iter >= SDCARD_RESET_ITER_MAX)
         {
-            _puts("\nERROR: During SD card reset to IDLE state\n"
-                 "/ card response = ");
-            _putx(sdcard_rsp);
-            _puts("\n");
+            _printf("\n[SDC ERROR] During SD card reset to IDLE state "
+                    "/ card response = %x\n", sdcard_rsp );
             _exit();
         }
@@ -382,5 +382,5 @@
     if (sdcard_rsp)
     {
-        _puts("ERROR: During SD card blocklen initialization\n");
+        _printf("[SDC ERROR] During SD card blocklen initialization\n");
         _exit();
     }
@@ -396,5 +396,5 @@
     );
 
-    _puts("Finish block device initialization\n\r");
+    _printf("[SDC WARNING] Finish SD card initialization\n\r");
 
     return 0;
@@ -478,5 +478,4 @@
 
 ///////////////////////////////////////////////////////////////////////////////
-//     _sdc_get_status()
 // Transfer data from memory buffer to SD card device. 
 // - channel: channel index
@@ -484,14 +483,13 @@
 // Returns 0 if success, > 0 if error.
 ///////////////////////////////////////////////////////////////////////////////
-unsigned int _sdc_get_status( unsigned int channel ,
-                              unsigned int* status )
-{
-    *status = BLOCK_DEVICE_IDLE;
-
-    return 0;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//     _sdc_get_block_size()
+unsigned int _sdc_get_status()
+{
+    _printf("[SDC ERROR] function _sdc_get_status() should not be called\n");
+    _exit();
+
+    return 0;  // to avoid a warning
+}
+
+///////////////////////////////////////////////////////////////////////////////
 // Returns the block size in bytes of the SD card
 ///////////////////////////////////////////////////////////////////////////////
Index: /soft/giet_vm/giet_drivers/sdc_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/sdc_driver.h	(revision 294)
+++ /soft/giet_vm/giet_drivers/sdc_driver.h	(revision 295)
@@ -36,6 +36,5 @@
 };
 
-unsigned int _sdc_init( unsigned int channel );
-
+unsigned int _sdc_init();
 
 unsigned int _sdc_read( unsigned int mode,
@@ -50,8 +49,7 @@
                          unsigned int count);
 
+unsigned int _sdc_get_status();
+
 unsigned int _sdc_get_block_size();
-
-unsigned int _sdc_get_status( unsigned int channel ,
-                              unsigned int* status );
 
 
Index: /soft/giet_vm/giet_drivers/tim_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/tim_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/tim_driver.c	(revision 295)
@@ -18,8 +18,5 @@
 // The global index is cluster_xy * (NB_PROCS_MAX + NB_TIM_CHANNELS) + local_id
 //
-// The NB_PROCS_MAX and NB_TIM_CHANNELS values must be defined in the
-// hard_config.h file.
-//
-// The register offsets must be defined in the hwr_mapping.h file.
+// The NB_PROCS_MAX and NB_TIM_CHANNELS values must be defined in hard_config.h file.
 /////////////////////////////////////////////////////////////////////////////////////
 // The virtual base address of the segment associated to a channel is:
@@ -33,4 +30,6 @@
 #include <giet_config.h>
 #include <tim_driver.h>
+#include <xcu_driver.h>
+#include <tty_driver.h>
 #include <utils.h>
 
@@ -68,26 +67,28 @@
 
 #if (NB_TIM_CHANNELS > 0)
-in_unckdata volatile unsigned char _user_timer_event[X_SIZE*Y_SIZE*NB_TIM_CHANNELS] 
-                            = { [0 ... ((X_SIZE*Y_SIZE*NB_TIM_CHANNELS) - 1)] = 0 };
+in_unckdata volatile unsigned char _user_timer_event[(1<<X_WIDTH)*(1<<Y_WIDTH)*NB_TIM_CHANNELS] 
+                        = { [0 ... (((1<<X_WIDTH)*(1<<Y_WIDTH)*NB_TIM_CHANNELS) - 1)] = 0 };
 #endif
 
 ////////////////////////////////////////////////////////////////////////////////////
-//     _timer_start()
 // This function activates a timer in the vci_timer component
 // by writing in the proper register the period value.
 // It can be used by both the kernel to initialise a "system" timer,
 // or by a task (through a system call) to configure an "user" timer.
-// Returns 0 if success, > 0 if error.
-//////////////////////////////////////////////////////////////////////////////
-unsigned int _timer_start( unsigned int cluster_xy, 
-                           unsigned int local_id, 
-                           unsigned int period) 
-{
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)                  return 1; 
-    if (y >= Y_SIZE)                  return 1; 
-    if (local_id >= NB_TIM_CHANNELS)  return 1;
+///////////////////////////////////////////////////////////////////////////////////
+void _timer_start( unsigned int cluster_xy, 
+                   unsigned int local_id, 
+                   unsigned int period) 
+{
+#if NB_TIM_CHANNELS
+
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if ( (x >= X_SIZE) || (y >= Y_SIZE) || (local_id >= NB_TIM_CHANNELS) )
+    {
+        _printf("[GIET ERROR] in _timer_start()\n");
+        _exit();
+    }
 
     unsigned int* timer_address = (unsigned int *) ((unsigned int)&seg_tim_base + 
@@ -96,22 +97,29 @@
     timer_address[local_id * TIMER_SPAN + TIMER_PERIOD] = period;
     timer_address[local_id * TIMER_SPAN + TIMER_MODE] = 0x3;
-    return 0;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//     _timer_stop()
+
+#else
+    _printf("[GIET ERROR] _timer_start() should not be called when NB_TIM_CHANNELS is 0\n");
+    _exit();
+#endif
+}
+
+//////////////////////////////////////////////////////////////////////////////
 // This function desactivates a timer in the vci_timer component
 // by writing in the proper register.
 // Returns 0 if success, > 0 if error.
 //////////////////////////////////////////////////////////////////////////////
-unsigned int _timer_stop( unsigned int cluster_xy, 
-                          unsigned int local_id) 
-{
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)                  return 1; 
-    if (y >= Y_SIZE)                  return 1; 
-    if (local_id >= NB_TIM_CHANNELS)  return 1;
+void _timer_stop( unsigned int cluster_xy, 
+                  unsigned int local_id) 
+{
+#if NB_TIM_CHANNELS
+
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if ( (x >= X_SIZE) || (y >= Y_SIZE) || (local_id >= NB_TIM_CHANNELS) )
+    {
+        _printf("[GIET ERROR] in _timer_stop()\n");
+        _exit();
+    }
 
     unsigned int* timer_address = (unsigned int *) ((unsigned int)&seg_tim_base + 
@@ -119,9 +127,12 @@
 
     timer_address[local_id * TIMER_SPAN + TIMER_MODE] = 0;
-    return 0;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//     _timer_reset_irq()
+
+#else
+    _printf("[GIET ERROR] _timer_stop() should not be called when NB_TIM_CHANNELS is 0\n");
+    _exit();
+#endif
+}
+
+//////////////////////////////////////////////////////////////////////////////
 // This function acknowlegge a timer interrupt in the vci_timer  
 // component by writing in the proper register.
@@ -130,13 +141,17 @@
 // Returns 0 if success, > 0 if error.
 //////////////////////////////////////////////////////////////////////////////
-unsigned int _timer_reset_irq( unsigned int cluster_xy, 
-                               unsigned int local_id ) 
-{
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)                  return 1; 
-    if (y >= Y_SIZE)                  return 1; 
-    if (local_id >= NB_TIM_CHANNELS)  return 1;
+void _timer_reset_irq( unsigned int cluster_xy, 
+                       unsigned int local_id ) 
+{
+#if NB_TIM_CHANNELS
+
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if ( (x >= X_SIZE) || (y >= Y_SIZE) || (local_id >= NB_TIM_CHANNELS) )
+    {
+        _printf("[GIET ERROR] in _timer_reset_irq()\n");
+        _exit();
+    }
 
     unsigned int * timer_address = (unsigned int *) ((unsigned int)&seg_tim_base + 
@@ -144,9 +159,12 @@
 
     timer_address[local_id * TIMER_SPAN + TIMER_RESETIRQ] = 0;
-    return 0;
+
+#else
+    _printf("[GIET ERROR] _timer_reset_irq() should not be called when NB_TIM_CHANNELS is 0\n");
+    _exit();
+#endif
 }
 
 /////////////////////////////////////////////////////////////////////////////
-//     _timer_reset_cpt()
 // This function resets the timer counter. To do so, we re-write the period
 // in the proper register, what causes the count to restart.
@@ -156,13 +174,17 @@
 // This function is called during a context switch (user or preemptive)
 //////////////////////////////////////////////////////////////////////i//////
-unsigned int _timer_reset_cpt( unsigned int cluster_xy, 
-                               unsigned int local_id) 
-{
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)                  return 1; 
-    if (y >= Y_SIZE)                  return 1; 
-    if (local_id >= NB_TIM_CHANNELS)  return 1;
+void _timer_reset_cpt( unsigned int cluster_xy, 
+                       unsigned int local_id) 
+{
+#if NB_TIM_CHANNELS
+
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if ( (x >= X_SIZE) || (y >= Y_SIZE) || (local_id >= NB_TIM_CHANNELS) )
+    {
+        _printf("[GIET ERROR in _timer_reset_cpt()\n");
+        _exit();
+    }
 
     // We suppose that the TIMER_MODE register value is 0x3
@@ -172,6 +194,46 @@
     unsigned int period = timer_address[local_id * TIMER_SPAN + TIMER_PERIOD];
     timer_address[local_id * TIMER_SPAN + TIMER_PERIOD] = period;
-    return 0;
-}
+
+#else
+    _printf("[GIET ERROR] _timer_reset_cpt should not be called when NB_TIM_CHANNELS is 0\n");
+    _exit();
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// This ISR handles the IRQs generated by the "user" timers that are
+// replicated in all clusters.
+// The IRQs generated by the "system" timers should be handled by _isr_switch().
+// It can be a HWI or a PTI.
+// The channel argument is the user timer local index.
+//     timer_global_id = cluster_id*(NB_TIM_CHANNELS) + channel
+// The ISR acknowledges the IRQ and registers the event in the proper entry
+// of the _user_timer_event[] array, and a log message is displayed on TTY0.
+///////////////////////////////////////////////////////////////////////////////////
+void _timer_isr( unsigned int irq_type,   // HWI / PTI
+                 unsigned int irq_id,     // index returned by XCU
+                 unsigned int channel )   // user timer index
+{
+#if NB_TIM_CHANNELS
+
+    unsigned int cluster_xy = _get_procid() / NB_PROCS_MAX;
+
+    // acknowledge IRQ depending on type 
+    if   ( irq_type == IRQ_TYPE_HWI )  _timer_reset_irq( cluster_xy, channel );
+    else                               _xcu_timer_reset_irq( cluster_xy, irq_id );
+
+    // register the event
+    _user_timer_event[cluster_xy * NB_TIM_CHANNELS + channel] = 1;
+
+    // display a message on TTY 0 
+    _printf("\n[GIET WARNING] User Timer IRQ at cycle %d / cluster = %x / channel = %d\n",
+            _get_proctime(), cluster_xy, channel );
+
+#else
+    _printf("[GIET ERROR] _timer_isr() should not be called when NB_TIM_CHANNELS == 0\n");
+    _exit();
+#endif
+}
+
 
 
Index: /soft/giet_vm/giet_drivers/tim_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/tim_driver.h	(revision 294)
+++ /soft/giet_vm/giet_drivers/tim_driver.h	(revision 295)
@@ -6,6 +6,6 @@
 ///////////////////////////////////////////////////////////////////////////////////
 
-#ifndef _GIET_TIM_DRIVERS_H_
-#define _GIET_TIM_DRIVERS_H_
+#ifndef _GIET_TIM_DRIVER_H_
+#define _GIET_TIM_DRIVER_H_
 
 ///////////////////////////////////////////////////////////////////////////////////
@@ -27,18 +27,20 @@
 ///////////////////////////////////////////////////////////////////////////////////
 
-extern volatile unsigned char _timer_event[];
+extern void _timer_start( unsigned int cluster_xy, 
+                          unsigned int local_id, 
+                          unsigned int period );
 
-extern unsigned int _timer_start( unsigned int cluster_xy, 
-                                  unsigned int local_id, 
-                                  unsigned int period );
+extern void _timer_stop( unsigned int cluster_xy,
+                         unsigned int local_id );
 
-extern unsigned int _timer_stop( unsigned int cluster_xy,
-                                 unsigned int local_id );
+extern void _timer_reset_irq( unsigned int cluster_xy, 
+                              unsigned int local_id );
 
-extern unsigned int _timer_reset_irq( unsigned int cluster_xy, 
-                                      unsigned int local_id );
+extern void _timer_reset_cpt( unsigned int cluster_xy, 
+                              unsigned int local_id);
 
-extern unsigned int _timer_reset_cpt( unsigned int cluster_xy, 
-                                      unsigned int local_id);
+extern void _timer_isr( unsigned int irq_type,
+                        unsigned int irq_id,
+                        unsigned int channel );
 
 ///////////////////////////////////////////////////////////////////////////////////
Index: /soft/giet_vm/giet_drivers/tty_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/tty_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/tty_driver.c	(revision 295)
@@ -8,10 +8,6 @@
 // This driver supports the SocLib vci_multi_tty component.
 //
-// It can exist only one multi_tty controler in the architecture.
-//
 // The total number of TTY terminals must be defined by the configuration 
 // parameter NB_TTY_CHANNELS in the hard_config.h file.
-//
-// The register offsets must be defined in the hwr_mapping.h file.
 //
 // The "system" terminal is TTY[0].
@@ -19,14 +15,17 @@
 // as defined in the mapping_info data structure. The corresponding tty_id must 
 // be stored in the context of the task by the boot code.
-///////////////////////////////////////////////////////////////////////////////////
-// The virtual base address of the segment associated to a channel is: 
 //
-//                  seg_tty_base  + TTY_SPAN * channel_id
-//
-// The seg_tty_base virtual base addresses must be defined in giet_vsegs.ld file.
+// The seg_tty_base must be defined in giet_vsegs.ld file.
+///////////////////////////////////////////////////////////////////////////////////
+// Implementation note:
+// 
+// All physical accesses to device registers are done by the two
+// _tty_get_register(), _tty_set_register() low-level functions,
+// that are handling virtual / physical addressing.
 ///////////////////////////////////////////////////////////////////////////////////
 
 #include <giet_config.h>
 #include <tty_driver.h>
+#include <xcu_driver.h>
 #include <ctx_handler.h>
 #include <utils.h>
@@ -42,15 +41,40 @@
 #define in_unckdata __attribute__((section (".unckdata")))
 
-/////////////////   TTY global variables
-in_unckdata volatile unsigned char _tty_get_buf[NB_TTY_CHANNELS];
-in_unckdata volatile unsigned char _tty_get_full[NB_TTY_CHANNELS] 
+//////////////////////////////////////////////////////////////////////////////
+//   TTY global variables
+//////////////////////////////////////////////////////////////////////////////
+
+in_unckdata volatile unsigned int _tty_rx_buf[NB_TTY_CHANNELS];
+in_unckdata volatile unsigned int _tty_rx_full[NB_TTY_CHANNELS] 
                                      = { [0 ... NB_TTY_CHANNELS - 1] = 0 };
+
+//////////////////////////////////////////////////////////////////////////////
+// This low level function returns the value of register (channel / index)
+//////////////////////////////////////////////////////////////////////////////
+unsigned int _tty_get_register( unsigned int channel,
+                                unsigned int index )
+{
+    unsigned int* vaddr = (unsigned int*)&seg_tty_base + channel*TTY_SPAN + index;
+    return _io_extended_read( vaddr );
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// This low level function set a new value in register (channel / index)  
+//////////////////////////////////////////////////////////////////////////////
+void _tty_set_register( unsigned int channel,
+                        unsigned int index,
+                        unsigned int value )
+{
+    unsigned int* vaddr = (unsigned int*)&seg_tty_base + channel*TTY_SPAN + index;
+    _io_extended_write( vaddr, value );
+}
 
 /////////////////////////////////////////////////////////////////////////////////
 // This non-blocking function writes a character string from a fixed-length 
-// buffer to the TTY_WRITE register of a TTY terminal identified by the
-// channel argument. If the channel argument is 0xFFFFFFFF, the channel 
-// index is obtained from the current taxk context. 
-// It doesn't use any interrupt.
+// buffer to a TTY terminal identified by the channel argument. 
+// This function is intended to be used to handle a system call, and should
+// not be used by the kernel for log messages on TTY 0.
+// protecting exclusive access to the selected terminal.
+// If channel argument is 0xFFFFFFFF, the TTY index is found in the task context. 
 // This is a non blocking call: it tests the TTY_STATUS register, and stops
 // the transfer as soon as the TTY_STATUS[WRITE] bit is set. 
@@ -62,17 +86,9 @@
                          unsigned int channel)   // channel index 
 {
-    unsigned int nwritten;
-    unsigned int tty_id;
-    unsigned int* tty_address = (unsigned int *) &seg_tty_base;
-
-    // compute tty channel
-    if( channel == 0xFFFFFFFF )
-    {
-        tty_id = _get_context_slot(CTX_TTY_ID);
-    }
-    else
-    {
-        tty_id = (unsigned int)channel;
-    }
+    unsigned int  nwritten;
+
+    // compute and check tty channel
+    if( channel == 0xFFFFFFFF )  channel = _get_context_slot(CTX_TTY_ID);
+    if( channel >= NB_TTY_CHANNELS ) return -1;
 
     // write string to TTY channel
@@ -80,7 +96,10 @@
     {
         // check tty's status 
-        if ((tty_address[tty_id * TTY_SPAN + TTY_STATUS] & 0x2) == 0x2) break;
-        _tty_write_data( tty_id, buffer[nwritten] );
-    }
+        if ( _tty_get_register( channel, TTY_STATUS ) & 0x2 )  break;
+
+        // write one byte
+        _tty_set_register( channel, TTY_WRITE, (unsigned int)buffer[nwritten] );
+    }
+    
     return nwritten;
 }
@@ -92,7 +111,7 @@
 // It uses the TTY_GET_IRQ[tty_id] interrupt and the buffer must have been
 // filled by the TTY_ISR.
-// It test the _tty_get_full[tty_id] register, read the _tty_get_buf[tty_id] 
+// It test the _tty_rx_full[tty_id] variable, read the _tty_rx_buf[tty_id] 
 // buffer, writes this character to the target buffer, and resets the
-// _tty_get_full[tty_id] register.
+// _tty_rx_full[tty_id] register.
 // The length argument is not used.
 //////////////////////////////////////////////////////////////////////////////
@@ -103,19 +122,10 @@
                         unsigned int channel)   // channel index
 {
-    
-    unsigned int tty_id;
-
-    // compute tty channel
-    if( channel == 0xFFFFFFFF )
-    {
-        tty_id = _get_context_slot(CTX_TTY_ID);
-    }
-    else
-    {
-        tty_id = (unsigned int)channel;
-    }
+    // compute and check tty channel
+    if( channel == 0xFFFFFFFF )  channel = _get_context_slot(CTX_TTY_ID);
+    if( channel >= NB_TTY_CHANNELS ) return -1;
 
     // read one character from TTY channel
-    if (_tty_get_full[tty_id] == 0) 
+    if (_tty_rx_full[channel] == 0) 
     {
         return 0;
@@ -123,98 +133,99 @@
     else 
     {
-        *buffer = _tty_get_buf[tty_id];
-        _tty_get_full[tty_id] = 0;
+        *buffer = _tty_rx_buf[channel];
+        _tty_rx_full[channel] = 0;
         return 1;
     }
 }
-//////////////////////////////////////////////////////////////////////////////
-
-//////////////////////////////////////////////////////////////////////////////
-// This function try to take the hardwired lock protecting exclusive access 
-// to TTY terminal identified by the channel argument.
+
+//////////////////////////////////////////////////////////////////////////////
+// This function try to take the hardwired lock protecting 
+// exclusive access to TTY terminal identified by the "channel" argument.
+// It enters a critical section before taking the lock, and save the SR value
+// at address defined by the "save_sr_ptr" argument.
 // It returns only when the lock has been successfully taken.
 //////////////////////////////////////////////////////////////////////////////
-void _tty_get_lock( unsigned int channel )
-{
-    unsigned int* tty_address = (unsigned int *) &seg_tty_base;
-
-    if( channel >= NB_TTY_CHANNELS )
-    {
-        _puts("[GIET ERROR] in _tty_get_lock() : illegal TTY index\n");
-        _exit();        
-    }
-
-    while ( tty_address[channel * TTY_SPAN + TTY_CONFIG] );
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// This function releases the hardwired lock protecting exclusive access 
-// to TTY terminal identified by the channel argument.
-//////////////////////////////////////////////////////////////////////////////
-void _tty_release_lock( unsigned int channel )
-{
-    unsigned int* tty_address = (unsigned int *) &seg_tty_base;
-
-    if( channel >= NB_TTY_CHANNELS )
-    {
-        _puts("[GIET ERROR] in _tty_release_lock() : illegal TTY index\n");
-        _exit();        
-    }
-
-    tty_address[channel * TTY_SPAN + TTY_CONFIG] = 0;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// This function returns the content of the TTY_READ register in the 
-// TTY terminal identified by the channel argument.
-//////////////////////////////////////////////////////////////////////////////
-unsigned int _tty_read_data( unsigned int channel )
-{
-    unsigned int* tty_address = (unsigned int *) &seg_tty_base;
-
-    if( channel >= NB_TTY_CHANNELS )
-    {
-        _puts("[GIET ERROR] in _tty_read_data() : illegal TTY index\n");
-        _exit();        
-    }
-
-    return tty_address[channel * TTY_SPAN + TTY_READ];
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// This function returns the content of the TTY_STATUS register in the 
-// TTY terminal identified by the channel argument.
-//////////////////////////////////////////////////////////////////////////////
-unsigned int _tty_get_status( unsigned int channel )
-{
-    unsigned int* tty_address = (unsigned int *) &seg_tty_base;
-
-    if( channel >= NB_TTY_CHANNELS )
-    {
-        _puts("[GIET ERROR] in _tty_get_status() : illegal TTY index\n");
-        _exit();        
-    }
-
-    return tty_address[channel * TTY_SPAN + TTY_STATUS];
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// This function writes one character in the TTY_WRITE register in the 
-// TTY terminal identified by the channel argument.
-//////////////////////////////////////////////////////////////////////////////
-void _tty_write_data( unsigned int channel,
-                      char         byte )
-{
-    unsigned int* tty_address = (unsigned int *) &seg_tty_base;
-
-    if( channel >= NB_TTY_CHANNELS )
-    {
-        _puts("[GIET ERROR] in _tty_write_data() : illegal TTY index\n");
-        _exit();        
-    }
-
-    tty_address[channel * TTY_SPAN + TTY_WRITE] = (unsigned int) byte;
-}
-
+void _tty_get_lock( unsigned int   channel,
+                    unsigned int * save_sr_ptr )
+{
+    if( channel >= NB_TTY_CHANNELS ) _exit();
+    _it_disable( save_sr_ptr );
+    while ( _tty_get_register( channel, TTY_CONFIG ) ); // busy waiting
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// This function releases the hardwired lock protecting 
+// exclusive access to TTY terminal identified by the channel argument.
+// It exit the critical section after lock release, and restore SR value
+// from address defined by the "save_sr_ptr" argument.
+//////////////////////////////////////////////////////////////////////////////
+void _tty_release_lock( unsigned int   channel,
+                        unsigned int * save_sr_ptr )
+{
+    if( channel >= NB_TTY_CHANNELS ) _exit();
+
+    _tty_set_register( channel, TTY_CONFIG, 0 );
+    _it_restore( save_sr_ptr );
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// This ISR handles the IRQ signaling that the RX buffer is full.
+// IT can be an HWI or an SWI.
+// There is one single multi_tty component controling all channels.
+// There is one communication buffer _tty_rx_buf[i] and one synchronisation
+// variable _tty_rx_full[i] per channel.
+// A character is lost if the buffer is full when the ISR is executed.
+///////////////////////////////////////////////////////////////////////////////////
+void _tty_rx_isr( unsigned int irq_type,   // HWI / WTI
+                  unsigned int irq_id,     // index returned by XCU
+                  unsigned int channel )   // TTY channel
+{
+    unsigned int cluster_xy = _get_procid() / NB_PROCS_MAX;
+
+    if ( irq_type == IRQ_TYPE_WTI )   // reset SWI in XCU if required
+    {
+        unsigned int value;
+        _xcu_get_wti_value( cluster_xy, irq_id, &value );
+    }
+      
+    // get character and reset TTY IRQ
+    _tty_rx_buf[channel] = _tty_get_register( channel, TTY_READ ); 
+
+#if GIET_DEBUG_IRQS  // we don't take the TTY lock to avoid deadlock
+unsigned int x              = cluster_xy >> Y_WIDTH;
+unsigned int y              = cluster_xy & ((1<<Y_WIDTH)-1);
+unsigned int lpid           = _get_procid() % NB_PROCS_MAX;
+_puts("\n[IRQS DEBUG] Processor[");
+_putd(x );
+_puts(",");
+_putd(y );
+_puts(",");
+_putd(lpid );
+_puts("] enters _tty_rx_isr() at cycle ");
+_putd(_get_proctime() );
+_puts("\n  read byte = ");
+_putx(_tty_rx_buf[channel] );
+_puts("\n");
+#endif
+
+    // signals character available 
+    _tty_rx_full[channel] = 1;
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// This ISR handles the IRQ signaling that the TX buffer is empty.
+// IT can be an HWI or an SWI.
+// There is one single multi_tty component controling all channels.
+// There is one communication buffer _tty_rx_buf[i] and one synchronisation
+// variable _tty_rx_full[i] per channel.
+// A character is lost if the buffer is full when the ISR is executed.
+///////////////////////////////////////////////////////////////////////////////////
+void _tty_tx_isr( unsigned int irq_type,   // HWI / WTI
+                  unsigned int irq_id,     // index returned by XCU
+                  unsigned int channel )   // TTY channel
+{
+    _puts("\n[GIET ERROR] the _tty_tx_isr() is not implemented\n");
+    _exit();
+}
 
 // Local Variables:
Index: /soft/giet_vm/giet_drivers/tty_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/tty_driver.h	(revision 294)
+++ /soft/giet_vm/giet_drivers/tty_driver.h	(revision 295)
@@ -24,5 +24,5 @@
 
 ///////////////////////////////////////////////////////////////////////////////////
-// TTY access functions and variables
+// TTY variables
 ///////////////////////////////////////////////////////////////////////////////////
 
@@ -31,28 +31,40 @@
 extern volatile unsigned char _tty_get_full[];
 
-/////// rather high level access functions ///////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////
+// TTY access functions
+//////////////////////////////////////////////////////////////////////////////////
 
 extern unsigned int _tty_write( const char*  buffer,
-                                unsigned int length,     // number of characters 
-                                unsigned int channel );  // channel index
+                                unsigned int length,     
+                                unsigned int channel );  
 
 extern unsigned int _tty_read(  char*        buffer,
-                                unsigned int length,     // unused
-                                unsigned int channel );  // channel index
+                                unsigned int length,  
+                                unsigned int channel ); 
 
-/////// very low level access functions //////////////////////////////////////////
+extern void _tty_get_lock( unsigned int  channel, 
+                           unsigned int* save_sr_ptr );
 
-extern void _tty_write_data( unsigned int channel, char byte );
+extern void _tty_release_lock( unsigned int  channel,
+                               unsigned int* save_sr_ptr );
 
-extern unsigned int _tty_read_data( unsigned int channel );
+extern void _tty_rx_isr( unsigned int irq_type,
+                         unsigned int irq_id,
+                         unsigned int channel );
 
-extern unsigned int _tty_get_status( unsigned int channel );
-
-extern void _tty_get_lock( unsigned int channel );
-
-extern void _tty_release_lock( unsigned int channel );
+extern void _tty_tx_isr( unsigned int irq_type,
+                         unsigned int irq_id,
+                         unsigned int channel );
 
 ///////////////////////////////////////////////////////////////////////////////////
+// low-level access functions
+///////////////////////////////////////////////////////////////////////////////////
 
+extern unsigned int _tty_get_register( unsigned int channel,
+                                       unsigned int index );
+
+extern void _tty_set_register( unsigned int channel,
+                               unsigned int index,
+                               unsigned int value );
 
 #endif
Index: /soft/giet_vm/giet_drivers/xcu_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/xcu_driver.c	(revision 294)
+++ /soft/giet_vm/giet_drivers/xcu_driver.c	(revision 295)
@@ -5,20 +5,4 @@
 // Copyright (c) UPMC-LIP6
 ///////////////////////////////////////////////////////////////////////////////////
-// The xcu_driver.c and xcu_driver.h files are part ot the GIET-VM nano-kernel.
-// This driver supports the SoCLib vci_xicu, that is a vectorised interrupt
-// controler supporting IPI (Inter Processor Interrupts) and integrated timers.
-//
-// It can exist several interrupt controller unit in the architecture 
-// (one per cluster), and each one can contain several channels.
-// The number of XICU channels is equal to NB_PROCS_MAX, because there is 
-// one private XICU channel per processor in a cluster.
-////////////////////////////////////////////////////////////////////////////////
-// The virtual base address of the segment associated to the component is:
-//
-//      seg_xcu_base + cluster_xy * vseg_cluster_increment
-//
-// The seg_xcu_base and vseg_cluster_increment values must be defined 
-// in giet_vsegs.ld file.
-////////////////////////////////////////////////////////////////////////////////
 
 #include <giet_config.h>
@@ -52,25 +36,23 @@
 #endif
 
-////////////////////////////////////////////////////////////////////////////////
-//     _xcu_set_mask()
-// This function set the mask register for the XICU channel identified by the
-// cluster index and the processor index multiplied by the number of IRQ per
-// processor.
+
+////////////////////////////////////////////////////////////////////////////////
+// This function set the mask register for the IRQ type defined by "irq_type",
+// and for the channel identified by the "cluster_xy" and "channel" arguments.
 // All '1' bits are set / all '0' bits are not modified.
-// Returns 0 if success, > 0 if error.
-////////////////////////////////////////////////////////////////////////////////
-unsigned int _xcu_set_mask( unsigned int cluster_xy, 
-                            unsigned int irq_index,
-                            unsigned int value,
-                            unsigned int irq_type ) 
-{
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)                                     return 1; 
-    if (y >= Y_SIZE)                                     return 1; 
-    if (irq_index >= (NB_PROCS_MAX * IRQ_PER_PROCESSOR)) return 1; 
-
-#if USE_XICU
+////////////////////////////////////////////////////////////////////////////////
+void _xcu_set_mask( unsigned int cluster_xy, 
+                    unsigned int channel,  
+                    unsigned int value,
+                    unsigned int irq_type ) 
+{
+#if USE_XICU
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if (x >= X_SIZE)                                   _exit(); 
+    if (y >= Y_SIZE)                                   _exit(); 
+    if (channel >= (NB_PROCS_MAX * IRQ_PER_PROCESSOR)) _exit(); 
+
     volatile unsigned int* xcu_address =
         (unsigned int *) ((unsigned int)&seg_xcu_base + 
@@ -79,83 +61,94 @@
     unsigned int func;
     if      (irq_type == IRQ_TYPE_PTI) func = XICU_MSK_PTI_ENABLE;
-    else if (irq_type == IRQ_TYPE_SWI) func = XICU_MSK_WTI_ENABLE;
-    else                               func = XICU_MSK_HWI_ENABLE;
-    xcu_address[XICU_REG(func,irq_index)] = value;
-    return 0;
-#else
-    _tty_get_lock( 0 );
-    _puts("[GIET ERROR] _xcu_set_mask should not be used if USE_XICU is not set\n");
-    _tty_release_lock( 0 );
-    return 1;
-#endif
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//     _xcu_get_index()
-// This function returns the index of the highest priority (smaller index) 
-// - active HWI (Hardware Interrupt), or
-// - active PTI (Timer Interrupt), or
-// - active SWI (Software Interrupt).
-// The ICU channel is identified by the cluster index and the processor index
-// multiplied by the number of IRQ per processor.
-// Returns 0 if success, > 0 if error.
-////////////////////////////////////////////////////////////////////////////////
-unsigned int _xcu_get_index( unsigned int cluster_xy, 
-                             unsigned int irq_index, 
-                             unsigned int * buffer) 
-{
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)                                     return 1; 
-    if (y >= Y_SIZE)                                     return 1; 
-    if (irq_index >= (NB_PROCS_MAX * IRQ_PER_PROCESSOR)) return 1; 
-
-#if USE_XICU
-    volatile unsigned int* xcu_address =
-        (unsigned int *) ((unsigned int)&seg_xcu_base + 
-        (cluster_xy * (unsigned int)&vseg_cluster_increment));
-
-    unsigned int prio = xcu_address[XICU_REG(XICU_PRIO,irq_index)];
+    else if (irq_type == IRQ_TYPE_WTI) func = XICU_MSK_WTI_ENABLE;
+    else if (irq_type == IRQ_TYPE_HWI) func = XICU_MSK_HWI_ENABLE;
+    else
+    { 
+        _printf("[GIET ERROR] _xcu_set_mask() receives illegal IRQ type\n");
+        _exit();
+    }
+
+    xcu_address[XICU_REG(func,channel)] = value;
+
+#else
+    _printf("[GIET ERROR] _xcu_set_mask() should not be used if USE_XICU not set\n");
+    _exit();
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// This function returns the index and the type of the highest priority 
+// - active PTI (Timer Interrupt), then
+// - active HWI (Hardware Interrupt), then
+// - active WTI (Software Interrupt)
+// As the hardware can define more than one IRQ per processor, but the GIET
+// use only one, channel = lpid * IRQ_PER_PROCESSOR.
+////////////////////////////////////////////////////////////////////////////////
+void _xcu_get_index( unsigned int cluster_xy, 
+                     unsigned int channel,   
+                     unsigned int * index, 
+                     unsigned int * irq_type )
+{
+#if USE_XICU
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if (x >= X_SIZE)                                   _exit(); 
+    if (y >= Y_SIZE)                                   _exit(); 
+    if (channel >= (NB_PROCS_MAX * IRQ_PER_PROCESSOR)) _exit(); 
+
+    volatile unsigned int* xcu_address =
+        (unsigned int *) ((unsigned int)&seg_xcu_base + 
+        (cluster_xy * (unsigned int)&vseg_cluster_increment));
+
+    unsigned int prio = xcu_address[XICU_REG(XICU_PRIO,channel)];
     unsigned int pti_ok = (prio & 0x00000001);
     unsigned int hwi_ok = (prio & 0x00000002);
-    unsigned int swi_ok = (prio & 0x00000004);
+    unsigned int wti_ok = (prio & 0x00000004);
     unsigned int pti_id = (prio & 0x00001F00) >> 8;
     unsigned int hwi_id = (prio & 0x001F0000) >> 16;
-    unsigned int swi_id = (prio & 0x1F000000) >> 24;
-    if      (pti_ok)  *buffer = pti_id;
-    else if (hwi_ok)  *buffer = hwi_id;
-    else if (swi_ok)  *buffer = swi_id; 
-    else              *buffer = 32; 
-    return 0;
-#else
-    _tty_get_lock( 0 );
-    _puts("[GIET ERROR] _xcu_get_index should not be used if USE_XICU is not set\n");
-    _tty_release_lock( 0 );
-    return 1;
-#endif
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//     _xcu_send_ipi()
-// This function can be used only in an architecture using  XICU components.
-// It writes the "wdata" value in the mailbox defined by the cluster index
-// and the processor index.
-// Giet-VM supports at most NB_PROCS_MAX mailboxes:
-// (0 <= wti_index <= NB_PROCS_MAX-1)
-// Returns 0 if success, > 0 if error.
-////////////////////////////////////////////////////////////////////////////////
-unsigned int _xcu_send_ipi( unsigned int cluster_xy,
-                            unsigned int wti_index,
-                            unsigned int wdata )
+    unsigned int wti_id = (prio & 0x1F000000) >> 24;
+    if      (pti_ok)
+    {
+        *index    = pti_id;
+        *irq_type = IRQ_TYPE_PTI;
+    }
+    else if (hwi_ok)
+    {
+        *index    = hwi_id;
+        *irq_type = IRQ_TYPE_HWI;
+    }
+    else if (wti_ok) 
+    {
+        *index    = wti_id;
+        *irq_type = IRQ_TYPE_WTI;
+    }
+    else 
+    {
+        *index = 32;
+    }
+ 
+#else
+    _printf("[GIET ERROR] _xcu_get_index should not be used if USE_XICU is not set\n");
+    _exit();
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// This function writes the "wdata" value in the mailbox defined 
+// by the "cluster_xy" and "wti_index" arguments.
+////////////////////////////////////////////////////////////////////////////////
+void _xcu_send_wti( unsigned int cluster_xy,
+                    unsigned int wti_index,
+                    unsigned int wdata )
 { 
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)               return 1; 
-    if (y >= Y_SIZE)               return 1; 
-    if (wti_index >= NB_PROCS_MAX) return 1; 
-
-#if USE_XICU
+#if USE_XICU
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if (x >= X_SIZE)               _exit(); 
+    if (y >= Y_SIZE)               _exit(); 
+    if (wti_index >= 32)           _exit(); 
+
     volatile unsigned int* xcu_address =
         (unsigned int *) ((unsigned int)&seg_xcu_base + 
@@ -163,30 +156,78 @@
 
     xcu_address[XICU_REG(XICU_WTI_REG,wti_index)] = wdata;
-    return 0; 
-#else
-    _tty_get_lock( 0 );
-    _puts("[GIET ERROR] _xcu_send_ipi should not be used if USE_XICU is not set\n");
-    _tty_release_lock( 0 );
-    return 1;
+
+#else
+    _printf("[GIET ERROR] _xcu_send_ipi should not be used if USE_XICU is not set\n");
+    _exit();
 #endif
 } 
 
 ////////////////////////////////////////////////////////////////////////////////
-//    _xcu_timer_start()
+// This function returns the value contained in a WTI mailbox defined by
+// the cluster_xy and "wti_index" arguments. This value is written in
+// the "value" argument, and the corresponding WTI is acknowledged.
+// returns 0 if success, > 0 if error.
+////////////////////////////////////////////////////////////////////////////////
+void _xcu_get_wti_value( unsigned int   cluster_xy,
+                         unsigned int   wti_index,
+                         unsigned int * value )
+{
+#if USE_XICU
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if (x >= X_SIZE)               _exit(); 
+    if (y >= Y_SIZE)               _exit(); 
+    if (wti_index >= 32)           _exit(); 
+ 
+    volatile unsigned int* xcu_address =
+        (unsigned int *) ((unsigned int)&seg_xcu_base + 
+        (cluster_xy * (unsigned int)&vseg_cluster_increment));
+
+    *value = xcu_address[XICU_REG(XICU_WTI_REG, wti_index)]; 
+
+#else
+    _printf("[GIET ERROR] in _xcu_get_wti_value() USE_XICU is not set\n");
+    _exit();
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// This function returns the address of a WTI mailbox defined by
+// the "wti_index" argument, in the unsigned int "address" argument.
+// It is used by the GIET to configurate the IOPIC component.
+// There is no access to a specific XCU component in a specific cluster.
+// returns 0 if success, > 0 if error.
+////////////////////////////////////////////////////////////////////////////////
+void _xcu_get_wti_address( unsigned int   wti_index,
+                           unsigned int * address )
+{
+#if USE_XICU
+    if (wti_index >= 32)           _exit(); 
+ 
+    unsigned int xcu_address = (unsigned int)&seg_xcu_base;
+    *address = xcu_address + (XICU_REG(XICU_WTI_REG, wti_index)<<2); 
+
+#else
+    _printf("[GIET ERROR] in _xcu_get_wti_address() USE_XICU is not set\n");
+    _exit();
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
 // This function activates a timer contained in XICU by writing in the
 // proper register the period value.
-// Returns 0 if success, > 0 if error.
-////////////////////////////////////////////////////////////////////////////////
-unsigned int _xcu_timer_start( unsigned int cluster_xy,
-                               unsigned int pti_index,
-                               unsigned int period )
-{
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)             return 1; 
-    if (y >= Y_SIZE)             return 1; 
-
-#if USE_XICU
+////////////////////////////////////////////////////////////////////////////////
+void _xcu_timer_start( unsigned int cluster_xy,
+                       unsigned int pti_index,
+                       unsigned int period )
+{
+#if USE_XICU
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if (x >= X_SIZE)             _exit(); 
+    if (y >= Y_SIZE)             _exit(); 
+
     volatile unsigned int* xcu_address =
         (unsigned int *) ((unsigned int)&seg_xcu_base + 
@@ -194,29 +235,25 @@
 
     xcu_address[XICU_REG(XICU_PTI_PER, pti_index)] = period;
-    return 0;
-#else
-    _tty_get_lock( 0 );
-    _puts("[GIET ERROR] _xcu_timer_start should not be used if USE_XICU is not set\n");
-    _tty_release_lock( 0 );
-    return 1;
-#endif
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//     _xcu_timer_stop()
+
+#else
+    _printf("[GIET ERROR] in _xcu_timer_start() USE_XICU is not set\n");
+    _exit();
+#endif
+}
+
+//////////////////////////////////////////////////////////////////////////////
 // This function desactivates a timer in XICU component
 // by writing in the proper register.
-// Returns 0 if success, > 0 if error.
-//////////////////////////////////////////////////////////////////////////////
-unsigned int _xcu_timer_stop( unsigned int cluster_xy, 
-                              unsigned int pti_index) 
-{
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)             return 1; 
-    if (y >= Y_SIZE)             return 1; 
-
-#if USE_XICU
+//////////////////////////////////////////////////////////////////////////////
+void _xcu_timer_stop( unsigned int cluster_xy, 
+                      unsigned int pti_index) 
+{
+#if USE_XICU
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if (x >= X_SIZE)             _exit(); 
+    if (y >= Y_SIZE)             _exit(); 
+
     volatile unsigned int * xcu_address =
         (unsigned int *) ((unsigned int)&seg_xcu_base + 
@@ -224,31 +261,27 @@
 
     xcu_address[XICU_REG(XICU_PTI_PER, pti_index)] = 0;
-    return 0;
-#else
-    _tty_get_lock( 0 );
-    _puts("[GIET ERROR] _xcu_timer_stop should not be used if USE_XICU is not set\n");
-    _tty_release_lock( 0 );
-    return 1;
-#endif
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//     _xcu_timer_reset_irq()
+
+#else
+    _printf("[GIET ERROR] in _xcu_timer_stop() USE_XICU is not set\n");
+    _exit();
+#endif
+}
+
+//////////////////////////////////////////////////////////////////////////////
 // This function acknowlegge a timer interrupt in XICU 
 // component by reading in the proper register.
 // It can be used by both the isr_switch() for a "system" timer, 
 // or by the _isr_timer() for an "user" timer.
-// Returns 0 if success, > 0 if error.
-//////////////////////////////////////////////////////////////////////////////
-unsigned int _xcu_timer_reset_irq( unsigned int cluster_xy, 
-                                   unsigned int pti_index ) 
-{
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)             return 1; 
-    if (y >= Y_SIZE)             return 1; 
-
-#if USE_XICU
+//////////////////////////////////////////////////////////////////////////////
+void _xcu_timer_reset_irq( unsigned int cluster_xy, 
+                           unsigned int pti_index ) 
+{
+#if USE_XICU
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if (x >= X_SIZE)             _exit(); 
+    if (y >= Y_SIZE)             _exit(); 
+
     volatile unsigned int * xcu_address =
         (unsigned int *) ((unsigned int)&seg_xcu_base +
@@ -256,32 +289,29 @@
 
     xcu_address[XICU_REG(XICU_PTI_ACK, pti_index)];
-    return 0;
-#else
-    _tty_get_lock( 0 );
-    _puts("[GIET ERROR] _xcu_timer_reset_irq should not be used if USE_XICU is not set\n");
-    _tty_release_lock( 0 );
-    return 1;
-#endif
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//     _xcu_timer_reset_cpt()
+
+#else
+    _printf("[GIET ERROR] in _xcu_timer_reset_irq() USE_XICU is not set\n");
+    _exit();
+#endif
+}
+
+//////////////////////////////////////////////////////////////////////////////
 // This function resets a timer counter. To do so, we re-write the period
 // in the proper register, what causes the count to restart.
 // The period value is read from the same (TIMER_PERIOD) register,
 // this is why in appearance we do nothing useful (read a value
-// from a register and write this value in the same register)
+// from a register and write this value in the same register).
 // This function is called during a context switch (user or preemptive)
 /////////////////////////////////////////////////////////////////////////////
-unsigned int _xcu_timer_reset_cpt( unsigned int cluster_xy, 
-                                   unsigned int pti_index ) 
-{
-    // parameters checking 
-    unsigned int x = cluster_xy >> Y_WIDTH;
-    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
-    if (x >= X_SIZE)             return 1; 
-    if (y >= Y_SIZE)             return 1; 
-
-#if USE_XICU
+void _xcu_timer_reset_cpt( unsigned int cluster_xy, 
+                           unsigned int pti_index ) 
+{
+#if USE_XICU
+    // parameters checking 
+    unsigned int x = cluster_xy >> Y_WIDTH;
+    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+    if (x >= X_SIZE)             _exit(); 
+    if (y >= Y_SIZE)             _exit(); 
+
     volatile unsigned int * xcu_address =
         (unsigned int *) ((unsigned int) &seg_xcu_base + 
@@ -294,10 +324,8 @@
     xcu_address[XICU_REG(XICU_PTI_PER, pti_index)] = 0;
     xcu_address[XICU_REG(XICU_PTI_PER, pti_index)] = period;
-    return 0;
-#else
-    _tty_get_lock( 0 );
-    _puts("[GIET ERROR] _xcu_timer_reset_irq should not be used if USE_XICU is not set\n");
-    _tty_release_lock( 0 );
-    return 1;
+
+#else
+    _printf("[GIET ERROR] in _xcu_timer_reset_cpt() USE_XICU is not set\n");
+    _exit();
 #endif
 }
Index: /soft/giet_vm/giet_drivers/xcu_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/xcu_driver.h	(revision 294)
+++ /soft/giet_vm/giet_drivers/xcu_driver.h	(revision 295)
@@ -5,4 +5,20 @@
 // Copyright (c) UPMC-LIP6
 ///////////////////////////////////////////////////////////////////////////////////
+// The xcu_driver.c and xcu_driver.h files are part ot the GIET-VM nano-kernel.
+// This driver supports the SoCLib vci_xicu, that is a vectorised interrupt
+// controler supporting IPI (Inter Processor Interrupts) and integrated timers.
+//
+// It can exist several interrupt controller unit in the architecture 
+// (one per cluster), and each one can contain several channels.
+// The number of XICU channels is equal to NB_PROCS_MAX, because there is 
+// one private XICU channel per processor in a cluster.
+////////////////////////////////////////////////////////////////////////////////
+// The virtual base address of the segment associated to the component is:
+//
+//      seg_xcu_base + cluster_xy * vseg_cluster_increment
+//
+// The seg_xcu_base and vseg_cluster_increment values must be defined 
+// in giet_vsegs.ld file.
+////////////////////////////////////////////////////////////////////////////////
 
 #ifndef _GIET_XCU_DRIVER_H_
@@ -44,29 +60,37 @@
 ///////////////////////////////////////////////////////////////////////////////////
 
-extern unsigned int _xcu_get_index( unsigned int cluster_xy, 
-                                    unsigned int irq_index, 
-                                    unsigned int * buffer );
+extern void _xcu_set_mask( unsigned int cluster_xy,
+                           unsigned int channel,  
+                           unsigned int mask, 
+                           unsigned int irq_type );
 
-extern unsigned int _xcu_set_mask( unsigned int cluster_xy,
-                                   unsigned int irq_index,
-                                   unsigned int mask, 
-                                   unsigned int is_timer );
+extern void _xcu_get_index( unsigned int   cluster_xy, 
+                            unsigned int   channel,   
+                            unsigned int * index,
+                            unsigned int * irq_type );
 
-extern unsigned int _xcu_send_ipi( unsigned int cluster_xy,
-                                   unsigned int wti_index,
-                                   unsigned int wdata );
+extern void _xcu_send_wti( unsigned int cluster_xy,
+                           unsigned int wti_index,
+                           unsigned int wdata );
 
-extern unsigned int _xcu_timer_start( unsigned int cluster_xy, 
-                                      unsigned int pti_index,
-                                      unsigned int period ); 
+extern void _xcu_get_wti_value( unsigned int   cluster_xy,
+                                unsigned int   wti_index,
+                                unsigned int * value );
 
-extern unsigned int _xcu_timer_stop( unsigned int cluster_xy, 
-                                     unsigned int pti_index ); 
+extern void _xcu_get_wti_address( unsigned int   wti_index,
+                                  unsigned int * address );
 
-extern unsigned int _xcu_timer_reset_irq( unsigned int cluster_xy, 
-                                          unsigned int pti_index );
+extern void _xcu_timer_start( unsigned int cluster_xy, 
+                              unsigned int pti_index,
+                              unsigned int period ); 
 
-extern unsigned int _xcu_timer_reset_cpt( unsigned int cluster_xy, 
-                                          unsigned int pti_index ); 
+extern void _xcu_timer_stop( unsigned int cluster_xy, 
+                             unsigned int pti_index ); 
+
+extern void _xcu_timer_reset_irq( unsigned int cluster_xy, 
+                                  unsigned int pti_index );
+
+extern void _xcu_timer_reset_cpt( unsigned int cluster_xy, 
+                                  unsigned int pti_index ); 
 
 ///////////////////////////////////////////////////////////////////////////////////
Index: /soft/giet_vm/giet_fat32/fat32.c
===================================================================
--- /soft/giet_vm/giet_fat32/fat32.c	(revision 294)
+++ /soft/giet_vm/giet_fat32/fat32.c	(revision 295)
@@ -17,6 +17,6 @@
 // 2. This FAT32 library uses a FAT cache whose storage capacity is one
 //    sector (512 bytes, or 128 cluster indexes in FAT)
-// 3. This FAT32 library can be used in three modes: BOOT/KERNEL/USER
-//    defining three different behaviours for the IOC driver.
+// 3. This FAT32 library can be used in four modes: BOOT_PA/BOOT_VA/KERNEL/USER
+//    defining different behaviours for the IOC driver.
 //////////////////////////////////////////////////////////////////////////////////
 
@@ -46,14 +46,11 @@
     temp[8] = 0;
 
-    _tty_get_lock( 0 );
-    _puts("\n*********************** fat_cache_lba = ");
-    _putx( fat.cache_lba );
-    _puts(" **************************\n");
+    _printf("\n*********************** fat_cache_lba = %x *****************************\n",
+            fat.cache_lba );
 
     for ( line=0 ; line<16 ; line++ )
     {
         // display address 
-        _putx( (fat.cache_lba<<9) + (line<<5) );
-        _puts(" : ");
+        _printf( "%x : ", (fat.cache_lba<<9) + (line<<5) );
 
         // display data hexa
@@ -65,6 +62,5 @@
                                  (fat.fat_cache[byte+2]<< 8) |
                                  (fat.fat_cache[byte+3]);
-            _putx( hexa );
-            _puts(" | ");
+            _printf("%x | ", hexa );
 
             // prepare display ascii
@@ -76,9 +72,8 @@
         
         // display data ascii 
-        _puts( (char*)temp );
-        _puts("\n");
-    }
-    _puts("***************************************************************************\n");
-    _tty_release_lock( 0 );
+        _printf( (char*)temp );
+        _printf("\n");
+    }
+    _printf("**************************************************************************\n");
 } // end display_fat_cache()  
 #endif
@@ -202,14 +197,12 @@
         
         // access fat
-        if( _ioc_read( mode,              // mode for IOC driver
+        if( _ioc_read( 0,                 // channel
+                       mode,              // mode for IOC driver
                        lba,               // sector index 
                        fat.fat_cache,     // fat cache
                        1 ) )              // one sector
         {
-            _tty_get_lock( 0 );
-            _puts("[FAT_ERROR] in get_next cluster_id() cannot read block ");
-            _putd( lba );
-            _puts("\n");
-            _tty_release_lock( 0 );
+            _printf("[FAT_ERROR] in get_next cluster_id() "
+                    "cannot read block %x\n", lba );
             return 1;
         }
@@ -271,8 +264,5 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] filename ");
-_puts( string );
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] filename %s", string );
 #endif
 
@@ -282,9 +272,5 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts(" converted to 8.3 SFN format : ");
-_puts( sfn_string );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf(" converted to 8.3 SFN format : %s\n", sfn_string );
 #endif
 
@@ -298,9 +284,5 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts(" converted to 8.3 SFN format : ");
-_puts( string );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf(" converted to 8.3 SFN format : %s\n", sfn_string );
 #endif
 
@@ -358,9 +340,5 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts(" converted to 8.3 SFN format : ");
-_puts( sfn_string );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf(" converted to 8.3 SFN format : %s\n", sfn_string );
 #endif
 
@@ -524,14 +502,11 @@
     is_sfn = is_short( file_name, sfn );
 
-    if ( _ioc_read( IOC_KERNEL_MODE, // mode for IOC driver
+    if ( _ioc_read( 0,               // channel
+                    IOC_KERNEL_MODE, // mode for IOC driver
                     lba,             // sector index 
                     fat.fat_cache,   // buffer address
                     1 ) )            // one sector
     {
-        _tty_get_lock( 0 );
-        _puts("[FAT ERROR] in update_entry() cannot read sector ");
-        _putd( lba );
-        _puts("\n");
-        _tty_release_lock( 0 );
+        _printf("[FAT ERROR] in update_entry() cannot read sector %x\n", lba );
         return 1;
     }
@@ -562,8 +537,5 @@
             else if (ord == NO_MORE_ENTRY )            // end of directory : return
             {
-                _tty_get_lock( 0 );
-                _puts("[FAT ERROR] in update_entry() end of directory reaches ");
-                _puts("\n");
-                _tty_release_lock( 0 );
+                _printf("[FAT ERROR] in update_entry() : reaches end of directory\n");
                 return 1;
             }
@@ -591,8 +563,5 @@
             else if (ord == NO_MORE_ENTRY )			   // end of directory : return
             {
-                _tty_get_lock( 0 );
-                _puts("[FAT ERROR] in update_entry() end of directory reaches ");
-                _puts("\n");
-                _tty_release_lock( 0 );
+                _printf("[FAT ERROR] in update_entry() reaches end of directory\n");
                 return 1;
             }
@@ -643,12 +612,13 @@
     }
 
-    return _ioc_write( IOC_KERNEL_MODE,
-                       lba,  
-                       fat.fat_cache,
-                       1     );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// This function update FS_INFO, for new last cluster allocated and number of free
-// cluster. 
+    return _ioc_write( 0,                // channel
+                       IOC_KERNEL_MODE,  // mode
+                       lba,              // sector index
+                       fat.fat_cache,    // source buffer
+                       1 );              // one sector
+}
+//////////////////////////////////////////////////////////////////////////////////
+// This function update FS_INFO:
+// last cluster allocated and number of free cluster. 
 // Return 0 in case of success, > 0 if failure.
 //////////////////////////////////////////////////////////////////////////////////
@@ -658,7 +628,5 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Enter in update_fs_info()\n");
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] Enter update_fs_info()\n");
 #endif
 
@@ -670,14 +638,11 @@
     else                                   // miss cache
     {
-        if ( _ioc_read( IOC_KERNEL_MODE,   // mode for IOC driver
+        if ( _ioc_read( 0,                 // channel
+                        IOC_KERNEL_MODE,   // mode for IOC driver
                         lba,               // sector index 
-                        fat.fat_cache,     // fat cache
+                        fat.fat_cache,     // source buffer
                         1 ) )              // one sector
         {
-            _tty_get_lock( 0 );
-            _puts("[FAT_ERROR] in update_fat() cannot read block ");
-            _putd( lba );
-            _puts("\n");
-            _tty_release_lock( 0 );
+            _printf("[FAT_ERROR] in update_fat() cannot read block %x\n", lba );
             return 1;
         }
@@ -686,8 +651,9 @@
         write_entry( FS_FREE_CLUSTER_HINT, fat.fat_cache, fat.last_cluster_allocated );
     }
-    return _ioc_write( IOC_KERNEL_MODE,       
-                       lba,           
-                       fat.fat_cache,           
-                       1 ); 
+    return _ioc_write( 0,                // channel
+                       IOC_KERNEL_MODE,  // mode    
+                       lba,              // sector index
+                       fat.fat_cache,    // source buffer
+                       1 );              // one sector
 }
 
@@ -703,13 +669,6 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Enter in update_fat() :\n");
-_puts("    - Cluster to update = ");
-_putd( cluster );
-_puts("\n");
-_puts("    - Value to write = ");
-_putd( value );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] Enter update_fat() : cluster = %x / value = %x\n",
+        cluster, value );
 #endif
 
@@ -720,14 +679,11 @@
     else                                   // miss cache
     {
-        if ( _ioc_read( IOC_KERNEL_MODE,   // mode for IOC driver
+        if ( _ioc_read( 0,                 // channel
+                        IOC_KERNEL_MODE,   // mode for IOC driver
                         lba,               // sector index 
-                        fat.fat_cache,     // fat cache
+                        fat.fat_cache,     // source buffer
                         1 ) )              // one sector
         {
-            _tty_get_lock( 0 );
-            _puts("[FAT_ERROR] in update_fat() cannot read block ");
-            _putd( lba );
-            _puts("\n");
-            _tty_release_lock( 0 );
+            _printf("[FAT_ERROR] in update_fat() cannot read block %x\n");
             return 1;
         }
@@ -735,8 +691,9 @@
         write_entry( ((cluster % 128) << 2), 4, fat.fat_cache, value );
     }
-    return _ioc_write( IOC_KERNEL_MODE,       
-                       lba,           
-                       fat.fat_cache,           
-                       1 ); 
+    return _ioc_write( 0,                // channel
+                       IOC_KERNEL_MODE,  // mode      
+                       lba,              // sector indexs
+                       fat.fat_cache,    // source buffer 
+                       1 );              // one sector
 }
 
@@ -759,7 +716,5 @@
     if ( get_next_cluster_id( IOC_KERNEL_MODE, free_cluster ) != FREE_CLUSTER)
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_allocate() : first free_cluster isnt free\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_allocate() : first free_cluster not free\n");
         return -1;
     }
@@ -767,19 +722,10 @@
     if ( count > fat.number_free_cluster )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_allocate() : Not enough free cluster(s) for this allocation\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_allocate() : Not enough free cluster(s)\n");
         return -1;
     }
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Enter in _fat_allocate() :\n");
-_puts("    - Need to allocate ");
-_putd( count );
-_puts(" cluster(s) for file ");
-_putd( fd_id );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] Enter in _fat_allocate() for file %d\n", fd_id );
 #endif
 
@@ -795,15 +741,6 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Cluster to update is : ");
-_putd( last_cluster_file );
-_puts("\n");
-_puts("[FAT DEBUG] Free cluster is : ");
-_putd( free_cluster );
-_puts("\n");
-_puts("[FAT DEBUG] Number of cluster need to be allocated : ");
-_putd( cluster_to_allocate );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] cluster to update = %x / free cluster = %x / clusters required = %d\n",
+        last_cluster_file, free_cluster, cluster_to_allocate );
 #endif
 
@@ -812,9 +749,5 @@
         if ( update_fat( last_cluster_file, free_cluster ) )
         {
-            _tty_get_lock( 0 );
-            _puts("\n[FAT ERROR] in _fat_allocate() : update fat for file ");
-            _putd( fd_id );
-            _puts(" failed\n");
-            _tty_release_lock( 0 );
+            _printf("\n[FAT ERROR] in _fat_allocate() : update fat failed\n");
             return -1;
         }
@@ -831,9 +764,5 @@
             if ( update_fat( last_cluster_file, END_OF_CHAIN_CLUSTER ) )
             {
-                _tty_get_lock( 0 );
-                _puts("\n[FAT ERROR] in _fat_allocate() : update fat for file ");
-                _putd( fd_id );
-                _puts(" failed\n");
-                _tty_release_lock( 0 );
+                _printf("\n[FAT ERROR] in _fat_allocate() : update fat failed\n");
                 return -1;
             }
@@ -845,7 +774,5 @@
         if ( get_next_cluster_id( IOC_KERNEL_MODE, free_cluster ) != FREE_CLUSTER)
         {
-            _tty_get_lock( 0 );
-            _puts("\n[FAT ERROR] in _fat_allocate() : free_cluster isnt free\n");
-            _tty_release_lock( 0 );
+            _printf("\n[FAT ERROR] in _fat_allocate() : free_cluster not free\n");
             return -1;
         }
@@ -859,9 +786,5 @@
     if ( update_fs_info() )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_allocate() : update fs_info for file ");
-        _putd( fd_id );
-        _puts(" failed\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_allocate() : update fs_info failed\n");
         return -1;
     }
@@ -895,9 +818,5 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] enter _scan_directory() searching dir/file : ");
-_puts( file_name );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] enter _scan_directory() searching dir/file %s", filename );
 #endif
 
@@ -920,14 +839,11 @@
     // load first cluster sector from DATA region into FAT cache
     // other sectors will be loaded inside loop as required
-    if( _ioc_read( mode,            // mode for IOC driver
+    if( _ioc_read( 0,               // channel
+                   mode,            // mode for IOC driver
                    lba,             // sector index 
                    fat.fat_cache,   // buffer address
                    1 ) )            // one sector
     {
-        _tty_get_lock( 0 );
-        _puts("[FAT ERROR] in scan directory() cannot read sector ");
-        _putd( lba );
-        _puts("\n");
-        _tty_release_lock( 0 );
+        _printf("[FAT ERROR] in scan directory() cannot read sector %x\n", lba );
         return -1;
     }
@@ -935,7 +851,7 @@
     fat.cache_lba = lba;
 
-    #if GIET_DEBUG_FAT
-    display_fat_cache();
-    #endif
+#if GIET_DEBUG_FAT
+display_fat_cache();
+#endif
 
     // in this loop we scan all names in directory identified by cluster: 
@@ -961,14 +877,11 @@
                 block_id = fat.sectors_per_cluster;
             }
-            if( _ioc_read( mode,            // mode for IOC driver
+            if( _ioc_read( 0,               // channel
+                           mode,            // mode for IOC driver
                            lba,             // sector index 
                            fat.fat_cache,   // buffer address
                            1 ) )            // one sector
             {
-                _tty_get_lock( 0 );
-                _puts("[FAT ERROR] in scan directory() cannot read sector ");
-                _putd( lba );
-                _puts("\n");
-                _tty_release_lock( 0 );
+                _printf("[FAT ERROR] in scan directory() cannot read sector %x\n", lba );
                 return -1;
             }
@@ -1072,9 +985,4 @@
             *lba_dir_entry = lba;
 
-#if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] FILE FOUND\n");
-_tty_release_lock( 0 );
-#endif
             return read_cluster( dir_entry );
         }
@@ -1094,7 +1002,5 @@
                        unsigned int    dir_cluster )
 {
-    _tty_get_lock( 0 );
-    _puts("\n[FAT ERROR] _fat_create() not implemented\n");
-    _tty_release_lock( 0 );
+    _printf("\n[FAT ERROR] _fat_create() not implemented\n");
     return 0;
 }  //end _fat_create()
@@ -1115,37 +1021,39 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Enter _fat_init() / fat_cache_base = ");
-_putx( (unsigned int)fat.fat_cache );
-_puts("\n");
-_tty_release_lock( 0 );
+unsigned int procid  = _get_procid();
+unsigned int cid     = procid / NB_PROCS_MAX;
+unsigned int lpid    = procid % NB_PROCS_MAX;
+unsigned int x       = cid >> Y_WIDTH;
+unsigned int y       = cid & ((1<<Y_WIDTH) - 1);
+
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] enters _fat_init()\n",
+        x, y, lpid );
 #endif
 
     // load Master Boot Record (sector 0) into fat cache
-    if ( _ioc_read( mode,             // mode for IOC driver
+    if ( _ioc_read( 0,                // channel
+                    mode,             // mode for IOC driver
                     0,                // sector index 
                     fat.fat_cache,    // buffer address
                     1 ) )             // one sector
     { 
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_init() cannot load Boot Sector\n"); 
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_init() cannot load Boot Sector\n"); 
         return -1;
     }
     fat.cache_lba = 0;
     
+#if GIET_DEBUG_FAT
+display_fat_cache();
+#endif
+
     // checking Boot sector integrity
     if( MBR_SIGNATURE_VALUE != read_entry( MBR_SIGNATURE_POSITION, fat.fat_cache, 1))
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] Boot sector not recognized or corrupt \n"); 
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] Boot sector not recognized or corrupt \n"); 
         return -1;  
     }
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Boot Sector Loaded\n");
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] Boot Sector Loaded\n");
 #endif
 
@@ -1155,14 +1063,11 @@
 
     // load Partition Boot Record (first partition sector) into fat cache
-    if ( _ioc_read( mode,                // mode for IOC driver
+    if ( _ioc_read( 0,                   // channel
+                    mode,                // mode for IOC driver
                     fat.partition_lba,   // sector index
                     fat.fat_cache,       // buffer address
                     1 ) )                // one sector
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_init() cannot load block ");
-        _putd( fat.partition_lba );
-        _puts("\n"); 
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_init() cannot load block %x\n", fat.partition_lba );
         return -1;
     }
@@ -1170,7 +1075,5 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Partition First Sector Loaded\n");
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] Partition First Sector Loaded\n");
 #endif
 
@@ -1179,36 +1082,25 @@
     if( read_entry( BPB_BYTSPERSEC, fat.fat_cache, 1 ) != 512 )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] The sector size must be 512 bytes\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] The sector size must be 512 bytes\n");
         return -1;  
     }
     if( read_entry( BPB_RSVDSECCNT, fat.fat_cache, 1 ) != 32 ) 
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] The RSVD region in FAT32 must be 32 sectors\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] The RSVD region in FAT32 must be 32 sectors\n");
         return -1;  
     }
     if( read_entry( BPB_NUMFATS, fat.fat_cache, 1 ) != 1 )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] The number of FAT copies in FAT region must be 1\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] The number of FAT copies in FAT region must be 1\n");
         return -1;  
     }
     if( (read_entry( BPB_FAT32_FATSZ32, fat.fat_cache, 1 ) & 0xF) != 0 )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] The FAT region in FAT32 must be multiple of 32 sectors\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] The FAT region in FAT32 must be multiple of 32 sectors\n");
         return -1;  
     }
-
     if( read_entry( BPB_FAT32_ROOTCLUS, fat.fat_cache, 1 ) != 2 )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] The first cluster index must be 2\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] The first cluster index must be 2\n");
         return -1;  
     }
@@ -1227,20 +1119,15 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] FS_INFO Sector = ");
-_putd(fat.fs_info_lba);
-_puts("\n");
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] FS_INFO Sector = %x\n", fat.fs_info_lba );
 #endif
 
     // load FS_INFO into fat cache
-    if ( _ioc_read( mode,               // mode for IOC driver
+    if ( _ioc_read( 0,                  // channel
+                    mode,               // mode for IOC driver
                     fat.fs_info_lba,    // sector index 
                     fat.fat_cache,      // buffer address
                     1 ) )               // one sector
     { 
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_init() cannot load FS_INFO Sector\n"); 
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_init() cannot load FS_INFO Sector\n"); 
         return -1;
     }
@@ -1251,20 +1138,7 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Number of Free Clusters = ");
-_putd(fat.number_free_cluster);
-_puts("\n");
-_puts("\n[FAT DEBUG] Last known cluster allocated = ");
-_putd(fat.last_cluster_allocated);
-_puts("\n");
-_puts("\n[FAT DEBUG] FS_INFO Sector Loaded\n");
-_tty_release_lock( 0 );
-#endif
-
-
-#if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Exit _fat_init()\n");
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] exit _fat_init() / "
+        "free clusters = %x / last allocated cluster = %x\n",
+        fat.number_free_cluster, fat.last_cluster_allocated );
 #endif
 
@@ -1275,13 +1149,13 @@
 void _fat_print()
 {
-    _puts("\n################################ FAT32 ###############################");  
-    _puts("\nFAT initialised                "); _putx( fat.initialised );
-    _puts("\nSector Size  (bytes)           "); _putx( fat.sector_size );
-    _puts("\nSectors per cluster            "); _putx( fat.sectors_per_cluster );
-    _puts("\nPartition size (sectors)       "); _putx( fat.partition_sectors );
-    _puts("\nPartition first lba            "); _putx( fat.partition_lba ); 
-    _puts("\nData region first lba          "); _putx( fat.data_lba );
-    _puts("\nNumber of sectors for one FAT  "); _putx( fat.fat_sectors );
-    _puts("\n######################################################################\n");
+    _printf("\n########################## FAT32 ###########################");  
+    _printf("\nFAT initialised                %d", fat.initialised );
+    _printf("\nSector Size  (bytes)           %x", fat.sector_size );
+    _printf("\nSectors per cluster            %x", fat.sectors_per_cluster );
+    _printf("\nPartition size (sectors)       %x", fat.partition_sectors );
+    _printf("\nPartition first lba            %x", fat.partition_lba ); 
+    _printf("\nData region first lba          %x", fat.data_lba );
+    _printf("\nNumber of sectors for one FAT  %x", fat.fat_sectors );
+    _printf("\n############################################################\n");
 }
 
@@ -1294,4 +1168,5 @@
 // a new file is created and introduced in the directory.
 // Finally, it sets a new open file in the file descriptors array.
+// The same file can be open several times by differents taks.
 ///////////////////////////////////////////////////////////////////////////////
 // Returns file descriptor index if success, returns -1 if error.
@@ -1311,28 +1186,48 @@
     
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] enter _fat_open() for file ");
-_puts( pathname );
-_puts("\n");
-_tty_release_lock( 0 );
-#endif
-
-    // check FAT initialised
+unsigned int procid  = _get_procid();
+unsigned int cid     = procid / NB_PROCS_MAX;
+unsigned int lpid    = procid % NB_PROCS_MAX;
+unsigned int x       = cid >> Y_WIDTH;
+unsigned int y       = cid & ((1<<Y_WIDTH) - 1);
+
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] enters _fat_open() for file %s\n",
+        x, y, lpid, pathname );
+#endif
+
+    // checking arguments
+    if ( creat )
+    {
+        _printf("[FAT ERROR] in _fat_open() : create not supported yet\n");
+        return -1;
+    }
+
+    // takes the FAT lock for exclusive access
+    _get_lock( &fat.lock );
+
+#if GIET_DEBUG_FAT
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] takes the FAT lock\n",
+        x, y, lpid );
+#endif
+
+    // FAT initialisation if required
     if( fat.initialised != FAT_INITIALISED )
     {
         if ( _fat_init( mode ) )
         {
-            _puts("[FAT ERROR] Cannot initialize FAT descriptor from Boot Sector\n");
-            _exit();
-        }
-
-#if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] FAT initialisation completed at cycle ");
-_putd(_get_proctime());
-_puts("\n");
+            _printf("[FAT ERROR] in _fat_open() : Cannot initialize FAT descriptor\n");
+
+            // release FAT lock
+            _release_lock( &fat.lock );
+
+            return -1;
+        }
+
+#if GIET_DEBUG_FAT
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] initialises FAT descriptor\n",
+        x, y, lpid );
 _fat_print();
-_tty_release_lock( 0 );
-#endif
+#endif
+
     }
  
@@ -1350,9 +1245,6 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] _fat_open : search dir/file : ");
-_puts( name );
-_puts("\n");
-_tty_release_lock( 0 );
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] search dir/file : %s\n",
+        x, y, lpid, name );
 #endif
 
@@ -1373,22 +1265,12 @@
         else if ( cluster == END_OF_CHAIN_CLUSTER )
         {
-            _tty_get_lock( 0 );
-            _puts("\n[FAT ERROR] in _fat_open() for file ");
-            _puts( pathname );
-            _puts(" : cannot found name ");
-            _puts( name );
-            _puts("\n");
-            _tty_release_lock( 0 );
+            _printf("\n[FAT ERROR] in _fat_open() cannot found %s\n", name );
+
+            // release FAT lock
+            _release_lock( &fat.lock );
+
             return -1;
         }
     }
-
-#if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] File ");
-_puts( pathname );
-_puts(" found\n");
-_tty_release_lock( 0 );
-#endif
 
     // check the next value for cluster index found
@@ -1414,12 +1296,10 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] file  ");
-_puts( pathname );
-_puts(" open with fd_id = ");
-_putd( fd_id );
-_puts("\n");
-_tty_release_lock( 0 );
-#endif
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] open file %s with fd = %d\n",
+        x, y, lpid, pathname, fd_id );
+#endif
+
+            // release FAT lock
+            _release_lock( &fat.lock );
 
             return fd_id;
@@ -1427,9 +1307,10 @@
         else
         {
-            _tty_get_lock( 0 );
-            _puts("\n[FAT ERROR] in _fat_open() for file ");
-            _puts( pathname );
-            _puts(" : file descriptor array full\n ");
-            _tty_release_lock( 0 );
+            _printf("\n[FAT ERROR] in _fat_open() for file %s : fd array full\n",
+                    pathname );
+
+            // release FAT lock
+            _release_lock( &fat.lock );
+
             return -1;
         }
@@ -1437,9 +1318,10 @@
     else
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_open() for file ");
-        _puts( pathname );
-        _puts(" : file found, but bad cluster\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_open() for file %s : bad cluster\n",
+                pathname );
+
+        // release FAT lock
+        _release_lock( &fat.lock );
+
         return -1;
     }
@@ -1461,14 +1343,15 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Enter _fat_read() for file ");
-_puts( fat.fd[fd_id].name );
-_puts("\n - buffer base     = ");
-_putx( (unsigned int)buffer );
-_puts("\n - skipped sectors = ");
-_putd( offset );
-_puts("\n - read sectors    = "); 
-_putd( count );
-_tty_release_lock( 0 );
+unsigned int procid  = _get_procid();
+unsigned int cid     = procid / NB_PROCS_MAX;
+unsigned int lpid    = procid % NB_PROCS_MAX;
+unsigned int x       = cid >> Y_WIDTH;
+unsigned int y       = cid & ((1<<Y_WIDTH) - 1);
+
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] enters _fat_read() for file %s\n",
+        " - buffer vbase    = %x\n"
+        " - skipped sectors = %x\n"
+        " - read sectors    = %x\n", 
+        x, y, lpid, fat.fd[fd_id].name, (unsigned int)buffer, offset, count );
 #endif
 
@@ -1490,32 +1373,20 @@
     if ( fd_id >= GIET_OPEN_FILES_MAX )
     { 
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_read() : illegal file descriptor index\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_read() : illegal file descriptor index\n");
         return -1;
     }
     if ( fat.fd[fd_id].used != 1 )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_read() : file not open\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_read() : file not open\n");
         return -1;
     }
     if ( ((unsigned int)buffer & 0x1FF) != 0 )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_read() : memory buffer not sector aligned\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_read() : memory buffer not sector aligned\n");
         return -1;
     }
     if ( offset >= file_sectors )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] offset larger than number of sectors in file\n");
-        _puts(" - offset       = ");
-        _putd( offset );
-        _puts(" - file_sectors = ");
-        _putd( file_sectors );
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] offset larger than number of sectors\n");
         return -1;
     }
@@ -1533,11 +1404,7 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n - first cluster   = ");
-_putd( cluster );   
-_puts("\n - skiped clusters = ");
-_putd( clusters_to_skip );   
-_puts("\n");
-_tty_release_lock( 0 );
+_printf(" - first cluster   = %x\n"
+        " - skiped clusters = %x\n",
+        cluster, clusters_to_skip );   
 #endif
 
@@ -1568,25 +1435,16 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] _fat_read() IOC request : buf = ");
-_putx( (unsigned int)dst );
-_puts(" / lba = ");
-_putd( lba );
-_puts(" / sectors = "); 
-_putd( iter_sectors );
-_puts("\n");  
-_tty_release_lock( 0 );
-#endif
-
-        if( _ioc_read( mode,              // mode for IOC driver
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] makes an IOC read :"
+        " buf = %x / lba = %x / sectors = %d\n",
+        x, y, lpid, (unsigned int)dst, lba, iter_sectors );
+#endif
+
+        if( _ioc_read( 0,                 // channel
+                       mode,              // mode for IOC driver
                        lba,               // first sector index 
                        dst,               // buffer address
                        iter_sectors ) )   // number of sectors
         {
-            _tty_get_lock( 0 );
-            _puts("\n[FAT ERROR] in _fat_read() cannot load block ");
-            _putd( lba );
-            _puts("\n"); 
-            _tty_release_lock( 0 );
+            _printf("\n[FAT ERROR] in _fat_read() cannot load block %x\n", lba );
             return -1;
         }
@@ -1653,18 +1511,18 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] Enter _fat_write() for file ");
-_puts( fat.fd[fd_id].name );
-_puts("\n - buffer base     = ");
-_putx( (unsigned int)buffer );
-_puts("\n - skipped sectors = ");
-_putd( offset );
-_puts("\n - write sectors    = "); 
-_putd( count );
-_puts("\n - file size (sectors)  = "); 
-_putd( file_sectors );
-_puts("\n - need allocate = "); 
- allocate ? _puts( "True" ) : _puts( "False");
-_tty_release_lock( 0 );
+unsigned int procid  = _get_procid();
+unsigned int cid     = procid / NB_PROCS_MAX;
+unsigned int lpid    = procid % NB_PROCS_MAX;
+unsigned int x       = cid >> Y_WIDTH;
+unsigned int y       = cid & ((1<<Y_WIDTH) - 1);
+
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] enters _fat_write() for file %s\n",
+        " - buffer vbase    = %x\n"
+        " - skipped sectors = %x\n"
+        " - write sectors   = %x\n" 
+        " - file sectors    = %x\n" 
+        " - need allocate   = %d\n", 
+        x, y, lpid, fat.fd[fd_id].name, (unsigned int)buffer, 
+        offset, count, file_sectors, allocate );
 #endif
 
@@ -1672,21 +1530,15 @@
     if ( fd_id >= GIET_OPEN_FILES_MAX )
     { 
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_write() : illegal file descriptor index\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_write() : illegal file descriptor index\n");
         return -1;
     }
     if ( fat.fd[fd_id].used != 1 )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_write() : file not open\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_write() : file not open\n");
         return -1;
     }
     if ( ((unsigned int)buffer & 0x1FF) != 0 )
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_write() : memory buffer not sector aligned\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_write() : memory buffer not sector aligned\n");
         return -1;
     }
@@ -1696,9 +1548,5 @@
         if ( _fat_allocate( fd_id, (required_cluster - current_cluster) ) < 0 )
         {
-            _tty_get_lock( 0 );
-            _puts("\n[FAT ERROR] in _fat_write() : fat_allocate for file ");
-            _putd( fd_id );
-            _puts(" failed\n");
-            _tty_release_lock( 0 );
+            _printf("\n[FAT ERROR] in _fat_write() : fat_allocate failed\n");
             return -1;
         }
@@ -1713,11 +1561,7 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n - first cluster   = ");
-_putd( cluster );   
-_puts("\n - skiped clusters = ");
-_putd( clusters_to_skip );   
-_puts("\n");
-_tty_release_lock( 0 );
+_printf(" - first cluster   = %x\n"
+        " - skiped clusters = %x\n",
+        cluster, clusters_to_skip );   
 #endif
 
@@ -1748,25 +1592,16 @@
 
 #if GIET_DEBUG_FAT
-_tty_get_lock( 0 );
-_puts("\n[FAT DEBUG] _fat_write() IOC request : buf = ");
-_putx( (unsigned int)src );
-_puts(" / lba = ");
-_putd( lba );
-_puts(" / sectors = "); 
-_putd( iter_sectors );
-_puts("\n");  
-_tty_release_lock( 0 );
-#endif
-
-        if( _ioc_write( mode,              // mode for IOC driver
+_printf("\n[FAT DEBUG] Processor[%d,%d,%d] makes an IOC write : "
+        "buf = %x / lba = %x / sectors = %x\n",
+        x, y, lpid, (unsigned int)src, lba, iter_sectors );
+#endif
+
+        if( _ioc_write( 0,                 // channel
+                        mode,              // mode for IOC driver
                         lba,               // first sector index 
-                        src,               // buffer address
+                        src,               // source buffer address
                         iter_sectors ) )   // number of sectors
         {
-            _tty_get_lock( 0 );
-            _puts("\n[FAT ERROR] in _fat_write() cannot write block ");
-            _putd( lba );
-            _puts("\n"); 
-            _tty_release_lock( 0 );
+            _printf("\n[FAT ERROR] in _fat_write() cannot write block %x\n", lba );
             return -1;
         }
@@ -1792,9 +1627,5 @@
     if ( update_entry(fd_id, DIR_FILE_SIZE, fat.fd[fd_id].file_size) )
     {
-            _tty_get_lock( 0 );
-            _puts("\n[FAT ERROR] in _fat_write() update entry for file ");
-            _putd( fd_id );
-            _puts(" failed\n"); 
-            _tty_release_lock( 0 );
+            _printf("\n[FAT ERROR] in _fat_write() update entry failed\n");
             return -1;
     }
@@ -1826,7 +1657,5 @@
     else
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_fstat() : illegal file descriptor index\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_fstat() : illegal file descriptor index\n");
         return -1;
     } 
@@ -1847,7 +1676,5 @@
     else
     {
-        _tty_get_lock( 0 );
-        _puts("\n[FAT ERROR] in _fat_close() : illegal file descriptor index\n");
-        _tty_release_lock( 0 );
+        _printf("\n[FAT ERROR] in _fat_close() : illegal file descriptor index\n");
         return -1;
     } 
@@ -1863,7 +1690,7 @@
                     unsigned int flags )     // unused: TODO
 {
-    return _fat_open( IOC_KERNEL_MODE,       // we KERNEL_MODE, because
+    return _fat_open( IOC_KERNEL_MODE,       // we use KERNEL_MODE, because
                       pathname,              // we need to write into FAT cache
-                      0 );       
+                      0 );                   // no creation if not found
 }
 
@@ -1909,7 +1736,5 @@
                      unsigned int whence )
 {
-    _tty_get_lock( 0 );
-    _puts("[GIET ERROR] _fat_user_lseek function not implemented\n");
-    _tty_release_lock( 0 );
+    _printf("[GIET ERROR] _fat_user_lseek() not implemented\n");
     _exit();
     return 0;
Index: /soft/giet_vm/giet_fat32/fat32.h
===================================================================
--- /soft/giet_vm/giet_fat32/fat32.h	(revision 294)
+++ /soft/giet_vm/giet_fat32/fat32.h	(revision 295)
@@ -143,5 +143,5 @@
     unsigned int    cluster_size;            // sector_size * sector_per_cluster (bytes)
     unsigned int    fat_sectors;             // number of sectors occupied by one FAT copy
-    unsigned int    partition_sectors;       // total number of sectors (RESVD + FAT + DATA)
+    unsigned int    partition_sectors;       // total number of sectors (RESVD+FAT+DATA)
     unsigned int    partition_lba;           // lba of first partiton sector 
     unsigned int    data_lba;                // lba of first data sector  
@@ -150,4 +150,5 @@
     unsigned int    number_free_cluster;     // number of free clusters
     unsigned int    fs_info_lba;             // lba of fs_info
+    unsigned int    lock;                    // lock protecting exclusive access
 } fat32_fs_t;
 /***************************************************************************************/
Index: /soft/giet_vm/giet_libs/barrier.c
===================================================================
--- /soft/giet_vm/giet_libs/barrier.c	(revision 294)
+++ /soft/giet_vm/giet_libs/barrier.c	(revision 295)
@@ -15,38 +15,20 @@
 
 ///////////////////////////////////////////////////////////////////////////////////
-//     barrier_init()
-// This function makes a cooperative initialisation of the barrier: 
-// several tasks try to initialize the barrier, but the initialisation 
-// is done by only one task, using LL/SC instructions.
+// This function initializes the barrier: this should be done by a single task.
 ///////////////////////////////////////////////////////////////////////////////////
-void barrier_init( giet_barrier_t * barrier, unsigned int value) {
-    unsigned int * pinit  = (unsigned int *) &barrier->init;
-    unsigned int * pcount = (unsigned int *) &barrier->count;
-
-    // parallel initialisation using atomic instructions LL/SC 
-    // inputs : pinit, pcount, value
-    // no output
-    asm volatile ("_barrier_init_test:                  \n"
-            "ll   $2,     0(%0)                   \n" /* read initial value */
-            "bnez $2,     _barrier_init_done      \n"
-            "move $3,     %2                      \n"
-            "sc   $3,     0(%0)                   \n" /* write initial value */
-            "beqz $3,     _barrier_init_test      \n"
-            "move $3,     %2                      \n"
-            "sw   $3,     0(%1)                   \n" /* write count */
-            "_barrier_init_done:                  \n"
-            :
-            : "r"(pinit), "r"(pcount), "r"(value)
-            : "$2", "$3");
+void barrier_init( giet_barrier_t* barrier, 
+                   unsigned int    value ) 
+{
+    barrier->init  = value;
+    barrier->count = value;
 }
 
 
 ///////////////////////////////////////////////////////////////////////////////////
-//    barrier_wait()
 // This blocking function uses LL/SC to decrement the barrier's counter.
 // Then, it uses a busy_waiting mechanism if it is not the last.
-// (because the GIET does not support dynamic task scheduling/descheduling)
 ///////////////////////////////////////////////////////////////////////////////////
-void barrier_wait(giet_barrier_t * barrier) {
+void barrier_wait( giet_barrier_t* barrier ) 
+{
     unsigned int * pcount  = (unsigned int *) &barrier->count;
     unsigned int maxcount = barrier->init;
@@ -56,5 +38,5 @@
     // - input : pointer on the barrier counter
     // - output : counter value
-    asm volatile ("_barrier_decrement:          \n"
+    asm volatile ("_barrier_decrement:    \n"
             "ll   %0, 0(%1)               \n"
             "addi $3, %0,     -1          \n"
@@ -68,5 +50,6 @@
     // waking up all other waiting tasks
 
-    if (count == 1) {
+    if (count == 1) 
+    {
         // last task
         *pcount = maxcount;
Index: /soft/giet_vm/giet_libs/barrier.h
===================================================================
--- /soft/giet_vm/giet_libs/barrier.h	(revision 294)
+++ /soft/giet_vm/giet_libs/barrier.h	(revision 295)
@@ -13,5 +13,6 @@
 ///////////////////////////////////////////////////////////////////////////////////
 
-typedef struct giet_barrier_s {
+typedef struct giet_barrier_s 
+{
     char name[32];      // barrier name
     unsigned int init;  // total number of participants
@@ -23,6 +24,8 @@
 //////////////////////////////////////////////////////////////////////////////
 
-void barrier_init(giet_barrier_t * barrier, unsigned int value);
-void barrier_wait(giet_barrier_t * barrier);
+void barrier_init( giet_barrier_t* barrier,
+                   unsigned int    value );  // number of tasks  
+
+void barrier_wait( giet_barrier_t* barrier );
 
 #endif
Index: /soft/giet_vm/giet_libs/malloc.h
===================================================================
--- /soft/giet_vm/giet_libs/malloc.h	(revision 294)
+++ /soft/giet_vm/giet_libs/malloc.h	(revision 295)
@@ -8,4 +8,5 @@
 #ifndef _MALLOC_H_
 #define _MALLOC_H_
+
 //#define DEBUG_MALLOC 1
 
Index: /soft/giet_vm/giet_libs/stdio.c
===================================================================
--- /soft/giet_vm/giet_libs/stdio.c	(revision 294)
+++ /soft/giet_vm/giet_libs/stdio.c	(revision 295)
@@ -19,99 +19,342 @@
 
 ////////////////////////////////////////////////////////////////////////////////////
-// giet_procid()
-////////////////////////////////////////////////////////////////////////////////////
-// This function returns the processor identifier.
-////////////////////////////////////////////////////////////////////////////////////
-int giet_procid() 
-{
-    return sys_call( SYSCALL_PROCID,
-                     0, 0, 0, 0 );
-}
-////////////////////////////////////////////////////////////////////////////////////
-// giet_proctime()
-////////////////////////////////////////////////////////////////////////////////////
-// This function returns the local processor time (clock cycles since boot)
-////////////////////////////////////////////////////////////////////////////////////
-int giet_proctime() 
-{
-    return sys_call( SYSCALL_PROCTIME, 
-                     0, 0, 0, 0 );
-}
-
-
-////////////////////////////////////////////////////////////////////////////////////
 /////////////////////  TTY device related system calls /////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////
 
-////////////////////////////////////////////////////////////////////////////////////
-// giet_tty_putc()
-////////////////////////////////////////////////////////////////////////////////////
-// This function displays a single ascii character on a terminal.
-// The terminal index must be defined in the task context in the boot phase.
-// It doesn't use the TTY_PUT_IRQ interrupt, and the associated kernel buffer.
-// - Returns 1 if the character has been written, 0 otherwise.
-////////////////////////////////////////////////////////////////////////////////////
-int giet_tty_putc(char byte) 
-{
-    return sys_call(SYSCALL_TTY_WRITE, 
-                    (unsigned int)(&byte),
-                    1, 
-                    0xFFFFFFFF,  
-                    0);
-}
-////////////////////////////////////////////////////////////////////////////////////
-// giet_tty_puts()
-////////////////////////////////////////////////////////////////////////////////////
-// This function displays a string on a terminal.
-// The terminal index must be defined in the task context in the boot phase.
-// The string must be terminated by a NUL character.
-// It doesn't use the TTY_PUT_IRQ interrupt, and the associated kernel buffer.
-// - Returns the number of written characters.
-////////////////////////////////////////////////////////////////////////////////////
-int giet_tty_puts(char * buf) 
-{
-    unsigned int length = 0;
-    while (buf[length] != 0) { length++; }
-    return sys_call(SYSCALL_TTY_WRITE, 
-                   (unsigned int)buf, 
-                   length, 
-                   0xFFFFFFFF, 
-                   0);
-}
-////////////////////////////////////////////////////////////////////////////////////
-// giet_tty_putw()
-////////////////////////////////////////////////////////////////////////////////////
-// This function displays the value of a 32-bit word with decimal characters.
-// The terminal index must be defined in the task context in the boot phase.
-// It doesn't use the TTY_PUT_IRQ interrupt, and the associated kernel buffer.
-// Returns the number of written characters (should be equal to ten).
-////////////////////////////////////////////////////////////////////////////////////
-int giet_tty_putw(unsigned int val) 
-{
-    char buf[10];
-    unsigned int i;
-    for (i = 0; i < 10; i++) 
-    {
-        buf[9 - i] = (val % 10) + 0x30;
-        val = val / 10;
-    }
-    return sys_call(SYSCALL_TTY_WRITE, 
-                   (unsigned int)buf,
-                   10,
-                   0xFFFFFFFF,
-                   0);
-}
-////////////////////////////////////////////////////////////////////////////////////
-// giet_tty_getc()
-////////////////////////////////////////////////////////////////////////////////////
-// This blocking function fetches a single ascii character from a terminal.
-// The terminal index must be defined in the task context in the boot phase.
-// It uses the IRQ_GET interrupt, and the associated kernel buffer.
-// - Returns 0 when completed.
-////////////////////////////////////////////////////////////////////////////////////
-int giet_tty_getc(char * byte) 
-{
-    unsigned int ret = 0;
-    while (ret == 0) 
+////////////////////////////////////////
+void giet_tty_printf( char* format, ...) 
+{
+    va_list args;
+    va_start( args, format );
+
+    int          ret;     // return value from the syscalls 
+    unsigned int channel = 0xFFFFFFFF;
+
+printf_text:
+
+    while (*format) 
+    {
+        unsigned int i;
+        for (i = 0 ; format[i] && (format[i] != '%') ; i++);
+        if (i) 
+        {
+            ret = sys_call(SYSCALL_TTY_WRITE, 
+                           (unsigned int)format,
+                           i, 
+                           channel,
+                           0);
+
+            if (ret != i) goto return_error;
+
+            format += i;
+        }
+        if (*format == '%') 
+        {
+            format++;
+            goto printf_arguments;
+        }
+    }
+
+    va_end( args );
+    return;
+
+printf_arguments:
+
+    {
+        char buf[20];
+        char * pbuf;
+        unsigned int len = 0;
+        static const char HexaTab[] = "0123456789ABCDEF";
+        unsigned int i;
+
+        switch (*format++) 
+        {
+            case ('c'):             /* char conversion */
+            {
+                int val = va_arg( args, int );
+                len = 1;
+                buf[0] = val;
+                pbuf = &buf[0];
+                break;
+            }
+            case ('d'):             /* 32 bits decimal signed integer */
+            {
+                int val = va_arg( args, int );
+                if (val < 0) 
+                {
+                    val = -val;
+                    ret = sys_call(SYSCALL_TTY_WRITE, 
+                                   (unsigned int)"-",
+                                   1,
+                                   channel,
+                                   0);
+                    if (ret != 1) goto return_error;
+                }
+                for(i = 0; i < 10; i++) 
+                {
+                    buf[9 - i] = HexaTab[val % 10];
+                    if (!(val /= 10)) break;
+                }
+                len =  i + 1;
+                pbuf = &buf[9 - i];
+                break;
+            }
+            case ('u'):             /* 32 bits decimal unsigned integer */
+            {
+                unsigned int val = va_arg( args, unsigned int );
+                for(i = 0; i < 10; i++) 
+                {
+                    buf[9 - i] = HexaTab[val % 10];
+                    if (!(val /= 10)) break;
+                }
+                len =  i + 1;
+                pbuf = &buf[9 - i];
+                break;
+            }
+            case ('x'):             /* 32 bits hexadecimal integer */
+            {
+                unsigned int val = va_arg( args, unsigned int );
+                ret = sys_call(SYSCALL_TTY_WRITE,
+                               (unsigned int)"0x",
+                               2,
+                               channel,
+                               0);
+                if (ret != 2) goto return_error;       
+                for(i = 0; i < 8; i++) 
+                {
+                    buf[7 - i] = HexaTab[val % 16];
+                    if (!(val /= 16))  break;
+                }
+                len =  i + 1;
+                pbuf = &buf[7 - i];
+                break;
+            }
+            case ('l'):            /* 64 bits hexadecimal unsigned */
+            {
+                unsigned long long val = va_arg( args, unsigned long long );
+                ret = sys_call(SYSCALL_TTY_WRITE,
+                               (unsigned int)"0x",
+                               2,
+                               channel,
+                               0);
+                if (ret != 2) goto return_error;
+                for(i = 0; i < 16; i++) 
+                {
+                    buf[15 - i] = HexaTab[val % 16];
+                    if (!(val /= 16))  break;
+                }
+                len =  i + 1;
+                pbuf = &buf[15 - i];
+                break;
+            }
+            case ('s'):             /* string */
+            {
+                char* str = va_arg( args, char* );
+                while (str[len]) 
+                {
+                    len++;
+                }
+                pbuf = str;
+                break;
+            }
+            default:
+                goto return_error;
+        }
+
+        ret = sys_call(SYSCALL_TTY_WRITE, 
+                       (unsigned int)pbuf,
+                       len,
+                       channel, 
+                       0);
+        if (ret != len)  goto return_error;
+        
+        goto printf_text;
+    }
+
+return_error:
+
+    va_end( args );
+    giet_exit("error in giet_tty_printf()");
+} // end giet_tty_printf()
+
+////////////////////////////////////////
+void giet_shr_printf( char* format, ...) 
+{
+    va_list args;
+    va_start( args, format );
+
+    int          ret;     // return value from the syscalls 
+    unsigned int channel = 0;
+    unsigned int sr_save;
+
+    sys_call( SYSCALL_TTY_GET_LOCK,
+              channel,
+              (unsigned int)&sr_save,
+              0, 0 );
+
+printf_text:
+
+    while (*format) 
+    {
+        unsigned int i;
+        for (i = 0 ; format[i] && (format[i] != '%') ; i++);
+        if (i) 
+        {
+            ret = sys_call(SYSCALL_TTY_WRITE, 
+                           (unsigned int)format,
+                           i, 
+                           channel,
+                           0);
+
+            if (ret != i) goto return_error;
+
+            format += i;
+        }
+        if (*format == '%') 
+        {
+            format++;
+            goto printf_arguments;
+        }
+    }
+
+    sys_call( SYSCALL_TTY_RELEASE_LOCK,
+              channel,
+              (unsigned int)&sr_save,
+              0, 0 );
+ 
+    va_end( args );
+    return;
+
+printf_arguments:
+
+    {
+        char buf[20];
+        char * pbuf;
+        unsigned int len = 0;
+        static const char HexaTab[] = "0123456789ABCDEF";
+        unsigned int i;
+
+        switch (*format++) 
+        {
+            case ('c'):             /* char conversion */
+            {
+                int val = va_arg( args, int );
+                len = 1;
+                buf[0] = val;
+                pbuf = &buf[0];
+                break;
+            }
+            case ('d'):             /* 32 bits decimal signed integer */
+            {
+                int val = va_arg( args, int );
+                if (val < 0) 
+                {
+                    val = -val;
+                    ret = sys_call(SYSCALL_TTY_WRITE, 
+                                   (unsigned int)"-",
+                                   1,
+                                   channel,
+                                   0);
+                    if (ret != 1) goto return_error;
+                }
+                for(i = 0; i < 10; i++) 
+                {
+                    buf[9 - i] = HexaTab[val % 10];
+                    if (!(val /= 10)) break;
+                }
+                len =  i + 1;
+                pbuf = &buf[9 - i];
+                break;
+            }
+            case ('u'):             /* 32 bits decimal unsigned integer */
+            {
+                unsigned int val = va_arg( args, unsigned int );
+                for(i = 0; i < 10; i++) 
+                {
+                    buf[9 - i] = HexaTab[val % 10];
+                    if (!(val /= 10)) break;
+                }
+                len =  i + 1;
+                pbuf = &buf[9 - i];
+                break;
+            }
+            case ('x'):             /* 32 bits hexadecimal integer */
+            {
+                unsigned int val = va_arg( args, unsigned int );
+                ret = sys_call(SYSCALL_TTY_WRITE,
+                               (unsigned int)"0x",
+                               2,
+                               channel,
+                               0);
+                if (ret != 2) goto return_error;       
+                for(i = 0; i < 8; i++) 
+                {
+                    buf[7 - i] = HexaTab[val % 16];
+                    if (!(val /= 16))  break;
+                }
+                len =  i + 1;
+                pbuf = &buf[7 - i];
+                break;
+            }
+            case ('l'):            /* 64 bits hexadecimal unsigned */
+            {
+                unsigned long long val = va_arg( args, unsigned long long );
+                ret = sys_call(SYSCALL_TTY_WRITE,
+                               (unsigned int)"0x",
+                               2,
+                               channel,
+                               0);
+                if (ret != 2) goto return_error;
+                for(i = 0; i < 16; i++) 
+                {
+                    buf[15 - i] = HexaTab[val % 16];
+                    if (!(val /= 16))  break;
+                }
+                len =  i + 1;
+                pbuf = &buf[15 - i];
+                break;
+            }
+            case ('s'):             /* string */
+            {
+                char* str = va_arg( args, char* );
+                while (str[len]) 
+                {
+                    len++;
+                }
+                pbuf = str;
+                break;
+            }
+            default:
+                goto return_error;
+        }
+
+        ret = sys_call(SYSCALL_TTY_WRITE, 
+                       (unsigned int)pbuf,
+                       len,
+                       channel, 
+                       0);
+        if (ret != len)  goto return_error;
+        
+        goto printf_text;
+    }
+
+return_error:
+
+    sys_call( SYSCALL_TTY_RELEASE_LOCK,
+              channel,
+              (unsigned int)&sr_save,
+              0, 0 );
+
+    va_end( args );
+    giet_exit("error in giet_shr_printf()");
+}  // end giet_shr_printf()
+
+
+/////////////////////////////////
+void giet_tty_getc( char * byte ) 
+{
+    int ret;
+
+    do
     {
         ret = sys_call(SYSCALL_TTY_READ, 
@@ -120,29 +363,17 @@
                       0xFFFFFFFF,          // channel index from task context
                       0);
-    }
-    return 0;
-}
-////////////////////////////////////////////////////////////////////////////////////
-// giet_tty_gets()
-////////////////////////////////////////////////////////////////////////////////////
-// This blocking function fetches a string from a terminal to a fixed length buffer.
-// The terminal index must be defined in the task context in the boot phase.
-// It uses the TTY_GET_IRQ interrupt, anf the associated kernel buffer.
-// - Returns 0 when completed.
-// - Up to (bufsize - 1) characters (including the non printable characters)
-//   will be copied into buffer, and the string is always completed by a NUL
-//   character.
-// - The <LF> character is interpreted, and the function close the string with a
-//   NUL character if <LF> is read.
-// - The <DEL> character is interpreted, and the corresponding character(s) are
-//   removed from the target buffer.
-////////////////////////////////////////////////////////////////////////////////////
-int giet_tty_gets( char*        buf, 
-                   unsigned int bufsize) 
-{
-    unsigned int ret;
+        if ( ret < 0 ) giet_exit("error in giet_tty_getc()");
+    }
+    while (ret != 1); 
+}
+
+/////////////////////////////////////
+void giet_tty_gets( char*        buf, 
+                    unsigned int bufsize ) 
+{
+    int           ret;
     unsigned char byte;
-    unsigned int index = 0;
-
+    unsigned int  index = 0;
+ 
     while (index < (bufsize - 1)) 
     {
@@ -154,4 +385,5 @@
                            0xFFFFFFFF,
                            0);
+            if ( ret < 0 ) giet_exit("error in giet_tty_gets()");
         } 
         while (ret != 1);
@@ -172,252 +404,120 @@
     }
     buf[index] = 0;
-    return 0;
-}
-////////////////////////////////////////////////////////////////////////////////////
-// giet_tty_getw()
-////////////////////////////////////////////////////////////////////////////////////
-// This blocking function fetches a string of decimal characters (most
-// significant digit first) to build a 32-bit unsigned integer.
-// The terminal index must be defined in the task context in the boot phase.
-// It uses the TTY_GET_IRQ interrupt, anf the associated kernel buffer.
-// - Returns necessarily 0 when completed.
-//
-// - The non-blocking system function _tty_read_irq is called several times,
-//   and the decimal characters are written in a 32 characters buffer until a
-//   <LF> character is read.
-// - The <DEL> character is interpreted, and previous characters can be
-//   cancelled. All others characters are ignored.
-// - When the <LF> character is received, the string is converted to an
-//   unsigned int value. If the number of decimal digit is too large for the 32
-//   bits range, the zero value is returned.
-////////////////////////////////////////////////////////////////////////////////////
-int giet_tty_getw(unsigned int * val) 
+}
+
+///////////////////////////////////////
+void giet_tty_getw( unsigned int* val ) 
 {
     unsigned char buf[32];
-    unsigned char byte;
-    unsigned int save = 0;
-    unsigned int dec = 0;
-    unsigned int done = 0;
-    unsigned int overflow = 0;
-    unsigned int max = 0;
-    unsigned int i;
-    unsigned int ret;
-
+    unsigned int  string_byte   = 0x00000000;    // string containing one single byte 
+    unsigned int  string_cancel = 0x00082008;    // string containing BS/SPACE/BS
+    unsigned int  save = 0;
+    unsigned int  dec = 0;
+    unsigned int  done = 0;
+    unsigned int  overflow = 0;
+    unsigned int  length = 0;
+    unsigned int  i;
+    unsigned int  channel = 0xFFFFFFFF;
+    int           ret;      // return value from syscalls
+ 
+    // get characters
     while (done == 0) 
     {
+        // read one character
         do 
         { 
-            ret = sys_call(SYSCALL_TTY_READ,
-                           (unsigned int)(&byte),
-                           1,
-                           0xFFFFFFFF,
-                           0); 
+            ret = sys_call( SYSCALL_TTY_READ,
+                            (unsigned int)(&string_byte),
+                            1,
+                            channel, 
+                            0); 
+            if ( ret < 0 ) giet_exit("error in giet_tty_getw()");
         } 
         while (ret != 1);
 
-        if ((byte > 0x2F) && (byte < 0x3A))  /* decimal character */
-        {
-            buf[max] = byte;
-            max++;
-            giet_tty_putc(byte);
-        }
-        else if ((byte == 0x0A))   /* LF */
+        // analyse character
+        if ((string_byte > 0x2F) && (string_byte < 0x3A))  /* decimal character */
+        {
+            buf[length] = (unsigned char)string_byte;
+            length++;
+
+            // echo
+            ret = sys_call( SYSCALL_TTY_WRITE, 
+                            (unsigned int)(&string_byte),
+                            1, 
+                            channel, 
+                            0 );
+            if ( ret < 0 ) giet_exit("error in giet_tty_gets()");
+        }
+        else if (string_byte == 0x0A)                     /* LF character */
         {
             done = 1;
         }
-        else if (byte == 0x7F)   /* DEL */
-        {
-            if (max > 0) 
-            {
-                max--;      /* cancel the character */
-                giet_tty_putc(0x08);
-                giet_tty_putc(0x20);
-                giet_tty_putc(0x08);
-            }
-        }
-        if (max == 32)  /* decimal string overflow */
-        {
-            for (i = 0; i < max; i++) 
-            {
-                /* cancel the string */
-                giet_tty_putc(0x08);
-                giet_tty_putc(0x20);
-                giet_tty_putc(0x08);
-            }
-            giet_tty_putc(0x30);
-            *val = 0;      /* return 0 value */
-            return 0;
-        }
-    }
-
-    /* string conversion */
-    for (i = 0; i < max; i++) 
-    {
-        dec = dec * 10 + (buf[i] - 0x30);
-        if (dec < save)  overflow = 1; 
-        save = dec;
-    }
-
-    /* check overflow */
-    if (overflow == 0) 
-    {
-        *val = dec; /* return decimal value */
-    }
-    else 
-    {
-        for (i = 0; i < max; i++) 
-        {
-            /* cancel the string */
-            giet_tty_putc(0x08);
-            giet_tty_putc(0x20);
-            giet_tty_putc(0x08);
-        }
-        giet_tty_putc(0x30);
-        *val = 0;         /* return 0 value */
-    }
-    return 0;
-}
-////////////////////////////////////////////////////////////////////////////////////
-// giet_tty_printf()
-////////////////////////////////////////////////////////////////////////////////////
-// This function is a simplified version of the mutek_printf() function.
-// The terminal index must be defined in the calling task context.
-// It doesn't use the IRQ_PUT interrupt, and the associated kernel buffer.
-// Only a limited number of formats are supported:
-//   - %d : signed decimal
-//   - %u : unsigned decimal
-//   - %x : hexadecimal
-//   - %c : char
-//   - %s : string
-// - Returns 0 if success, > 0 if error.
-////////////////////////////////////////////////////////////////////////////////////
-int giet_tty_printf(char * format, ...) 
-{
-    va_list ap;
-    va_start(ap, format);
-    unsigned int ret;
-
-    if (NB_TTY_CHANNELS == 1)
-    {
-        ret = sys_call(SYSCALL_TTY_LOCK, 0, 0, 0, 0); // Get TTY lock
-    }
-
-printf_text:
-
-    while (*format) 
-    {
-        unsigned int i;
-        for (i = 0 ; format[i] && (format[i] != '%') ; i++);
-        if (i) 
-        {
-            ret = sys_call(SYSCALL_TTY_WRITE, 
-                           (unsigned int)format,
-                           i, 
-                           0xFFFFFFFF,
-                           0);
-
-            if (ret != i) goto return_error;
-
-            format += i;
-        }
-        if (*format == '%') 
-        {
-            format++;
-            goto printf_arguments;
-        }
-    }
-
-    if (NB_TTY_CHANNELS == 1)
-    {
-        ret = sys_call(SYSCALL_TTY_LOCK, 1, 0, 0, 0); // Release TTY lock
-    }
-
-    va_end(ap);
-    return 0;
-
-printf_arguments:
-
-    {
-        int val = va_arg(ap, long);
-        char buf[20];
-        char * pbuf;
-        unsigned int len = 0;
-        static const char HexaTab[] = "0123456789ABCDEF";
-        unsigned int i;
-
-        switch (*format++) {
-            case ('c'):             /* char conversion */
-                len = 1;
-                buf[0] = val;
-                pbuf = buf;
-                break;
-            case ('d'):             /* decimal signed integer */
-                if (val < 0) 
-                {
-                    val = -val;
-                    ret = sys_call(SYSCALL_TTY_WRITE, 
-                                   (unsigned int)"-",
-                                   1,
-                                   0xFFFFFFFF,
-                                   0);
-                    if (ret != 1) goto return_error;
-                }
-            case ('u'):             /* decimal unsigned integer */
-                for(i = 0; i < 10; i++) 
-                {
-                    buf[9 - i] = HexaTab[val % 10];
-                    if (!(val /= 10)) break;
-                }
-                len =  i + 1;
-                pbuf = &buf[9 - i];
-                break;
-            case ('x'):             /* hexadecimal integer */
-                ret = sys_call(SYSCALL_TTY_WRITE,
-                               (unsigned int)"0x",
-                               2,
-                               0xFFFFFFFF,
-                               0);
-                if (ret != 2) goto return_error;       /* return error */
-                for(i = 0; i < 8; i++) 
-                {
-                    buf[7 - i] = HexaTab[val % 16U];
-                    if (!(val /= 16U))  break;
-                }
-                len =  i + 1;
-                pbuf = &buf[7 - i];
-                break;
-            case ('s'):             /* string */
-                {
-                    char * str = (char *) val;
-                    while (str[len]) 
-                    {
-                        len++;
-                    }
-                    pbuf = (char *) val;
-                }
-                break;
-            default:
-                goto printf_text;
-        }
-
-        ret = sys_call(SYSCALL_TTY_WRITE, 
-                       (unsigned int)pbuf,
-                       len,
-                       0xFFFFFFFF,
-                       0);
-        if (ret != len)  goto return_error;
-        
-        goto printf_text;
-    }
-
-return_error:
-    if (NB_TTY_CHANNELS == 1)
-    {
-        ret = sys_call(SYSCALL_TTY_LOCK, 1, 0, 0, 0); // Release TTY lock
-    }
-
-    return 1;
-}
-
+        else if ( (string_byte == 0x7F) ||                /* DEL character */
+                  (string_byte == 0x08) )                 /* BS  character */
+        {
+            if ( length > 0 ) 
+            {
+                length--;    // cancel the character 
+
+                ret = sys_call( SYSCALL_TTY_WRITE, 
+                                (unsigned int)(&string_cancel),
+                                3, 
+                                channel, 
+                                0 );
+                if ( ret < 0 ) giet_exit("error in giet_tty_gets()");
+            }
+        }
+
+        // test buffer overflow
+        if ( length >= 32 )  
+        {
+            overflow = 1;
+            done     = 1;
+        }
+    }  // end while characters
+
+    // string to int conversion with overflow detection 
+    if ( overflow == 0 )
+    {
+        for (i = 0; (i < length) && (overflow == 0) ; i++) 
+        {
+            dec = dec * 10 + (buf[i] - 0x30);
+            if (dec < save)  overflow = 1; 
+            save = dec;
+        }
+    } 
+
+    // final evaluation 
+    if ( overflow == 0 )
+    {
+        // return value
+        *val = dec;
+    }
+    else
+    {
+        // cancel all echo characters
+        for (i = 0; i < length ; i++) 
+        {
+            ret = sys_call( SYSCALL_TTY_WRITE, 
+                            (unsigned int)(&string_cancel),
+                            3, 
+                            channel, 
+                            0 );
+            if ( ret < 0 ) giet_exit("error in giet_tty_gets()");
+        }
+        // echo character '0'
+        string_byte = 0x30;
+        ret = sys_call( SYSCALL_TTY_WRITE, 
+                        (unsigned int)(&string_byte),
+                        1, 
+                        channel, 
+                        0 );
+        if ( ret < 0 ) giet_exit();
+
+        // return 0 value 
+        *val = 0;
+    }
+}
 
 
@@ -426,26 +526,16 @@
 //////////////////////////////////////////////////////////////////////////////////
 
-//////////////////////////////////////////////////////////////////////////////////
-// giet_timer_start()
-//////////////////////////////////////////////////////////////////////////////////
-// This function activates the private user timer allocated to the calling task
-// in the boot phase.
-// - Returns 0 if success, > 0 if error.
-//////////////////////////////////////////////////////////////////////////////////
-int giet_timer_start() 
-{
-    return sys_call( SYSCALL_TIMER_START, 
-                     0, 0, 0, 0 );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_timer_stop()
-//////////////////////////////////////////////////////////////////////////////////
-// This function activates the user timer allocated to the calling task.
-// - Returns 0 if success, > 0 if error.
-//////////////////////////////////////////////////////////////////////////////////
-int giet_timer_stop() 
-{
-    return sys_call( SYSCALL_TIMER_STOP, 
-                     0, 0, 0, 0 );
+///////////////////////
+void giet_timer_start() 
+{
+    if ( sys_call( SYSCALL_TIMER_START, 0, 0, 0, 0 ) ) 
+       giet_exit("error in giet_timer_start()");
+}
+
+//////////////////////
+void giet_timer_stop() 
+{
+    if ( sys_call( SYSCALL_TIMER_STOP, 0, 0, 0, 0 ) ) 
+        giet_exit("error in giet_timer_stop()");
 }
 
@@ -455,88 +545,53 @@
 //////////////////////////////////////////////////////////////////////////////////
 
-//////////////////////////////////////////////////////////////////////////////////
-// giet_fb_sync_write()
-//////////////////////////////////////////////////////////////////////////////////
-// This blocking function use a memory copy strategy to transfer data from a
-// user buffer to the frame buffer device in kernel space.
-//     offset : offset (in bytes) in the frame buffer
-//     buffer : base address of the memory buffer
-//     length : number of bytes to be transfered
-// - Returns 0 if success, > 0 if error (e.g. memory buffer not in user space).
-//////////////////////////////////////////////////////////////////////////////////
-int giet_fb_sync_write( unsigned int offset, 
+////////////////////////////////////////////
+void giet_fb_sync_write( unsigned int offset, 
                         void *       buffer, 
                         unsigned int length ) 
 {
-    return sys_call( SYSCALL_FB_SYNC_WRITE, 
-                     offset, 
-                     (unsigned int)buffer, 
-                     length, 
-                     0 );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_fb_sync_read()
-//////////////////////////////////////////////////////////////////////////////////
-// This blocking function use a memory copy strategy to transfer data from the
-// frame buffer device in kernel space to an user buffer.
-//     offset : offset (in bytes) in the frame buffer
-//     buffer : base address of the user buffer
-//     length : number of bytes to be transfered
-// - Returns 0 if success, > 0 if error (e.g. memory buffer not in user space).
-//////////////////////////////////////////////////////////////////////////////////
-int giet_fb_sync_read( unsigned int offset, 
-                       void *       buffer, 
-                       unsigned int length ) 
-{
-    return sys_call( SYSCALL_FB_SYNC_READ, 
-                     offset, 
-                     (unsigned int)buffer, 
-                     length, 
-                     0 );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_fb_cma_init()
-//////////////////////////////////////////////////////////////////////////////////
-// This function initializes the two chbuf SRC an DST used by the CMA controller 
-// and activates the CMA channel allocated to the calling task.
-// - buf0   : first user buffer virtual address
-// - buf0   : second user buffer virtual address
-// - length : buffer size (bytes)
-// - Returns 0 if success, > 0 if error.
-//////////////////////////////////////////////////////////////////////////////////
-int giet_fb_cma_init( void *       buf0,
-                      void *       buf1,
-                      unsigned int length )
-{
-    return sys_call( SYSCALL_FB_CMA_INIT, 
-                     (unsigned int)buf0, 
-                     (unsigned int)buf1, 
-                     length, 
-                     0 );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_fb_cma_write()
-//////////////////////////////////////////////////////////////////////////////////
-// This function set the valid status for one of the SRC user buffer.
-// and reset the valid status for the DST frame buffer.
-// - bufffer_id : 0 => buf0 valid is set / not 0  => buf1 valid is set
-// - Returns 0 if success, > 0 if error.
-//////////////////////////////////////////////////////////////////////////////////
-int giet_fb_cma_write( unsigned int buffer_id )
-{
-    return sys_call( SYSCALL_FB_CMA_WRITE, 
-                     buffer_id, 
-                     0, 0, 0 );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_fb_cma_stop()
-//////////////////////////////////////////////////////////////////////////////////
-// This function desactivates the CMA channel allocated to the calling task.
-// - Returns 0 if success, > 0 if error.
-//////////////////////////////////////////////////////////////////////////////////
-int giet_fb_cma_stop( )
-{
-    return sys_call( SYSCALL_FB_CMA_STOP, 
-                     0, 0, 0, 0 );
+    if ( sys_call( SYSCALL_FB_SYNC_WRITE, 
+                   offset, 
+                   (unsigned int)buffer, 
+                   length, 
+                   0 ) )  giet_exit("error in giet_fb_sync_write()");
+}
+
+///////////////////////////////////////////
+void giet_fb_sync_read( unsigned int offset, 
+                        void *       buffer, 
+                        unsigned int length ) 
+{
+    if ( sys_call( SYSCALL_FB_SYNC_READ, 
+                   offset, 
+                   (unsigned int)buffer, 
+                   length, 
+                   0 ) )   giet_exit("error in giet_fb_sync_read()");
+}
+
+/////////////////////////////////////////
+void giet_fb_cma_init( void *       buf0,
+                       void *       buf1,
+                       unsigned int length )
+{
+    if ( sys_call( SYSCALL_FB_CMA_INIT, 
+                   (unsigned int)buf0, 
+                   (unsigned int)buf1, 
+                   length, 
+                   0 ) )   giet_exit("error in giet_fb_cma_init()");
+}
+
+///////////////////////////////////////////////
+void giet_fb_cma_write( unsigned int buffer_id )
+{
+    if ( sys_call( SYSCALL_FB_CMA_WRITE, 
+                   buffer_id, 
+                   0, 0, 0 ) )   giet_exit("error in giet_fb_cma_write()");
+}
+
+////////////////////////
+void giet_fb_cma_stop()
+{
+    if ( sys_call( SYSCALL_FB_CMA_STOP, 
+                   0, 0, 0, 0 ) )    giet_exit("error in giet_fb_cma_stop()");
 }
 
@@ -546,151 +601,16 @@
 //////////////////////////////////////////////////////////////////////////////////
 
-//////////////////////////////////////////////////////////////////////////////////
-// giet_nic_cma_init()
-//////////////////////////////////////////////////////////////////////////////////
-// This function initializes the memory chbuf used by the CMA controller, 
-// activates the NIC channel allocated to the calling task, and the CMA channel.
-// - tx     : RX channel if 0 / TX channel if non 0
-// - buf0   : first user buffer virtual address
-// - buf1   : second user buffer virtual address
-// - length : buffer size (bytes)
-// - Returns 0 if success, > 0 if error 
-//////////////////////////////////////////////////////////////////////////////////
-int giet_nic_cma_start()
-{
-    return sys_call( SYSCALL_NIC_CMA_START,
-                     0, 0, 0, 0 );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_nic_cma_stop()
-//////////////////////////////////////////////////////////////////////////////////
-// This function desactivates the NIC channel and the two CMA channels
-// allocated to the calling task.
-// - Returns 0 if success, > 0 if error.
-//////////////////////////////////////////////////////////////////////////////////
-int giet_nic_cma_stop( )
-{
-    return sys_call( SYSCALL_NIC_CMA_STOP,
-                     0, 0, 0, 0 );
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-///////////////////// Miscellaneous system calls /////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////////////////////
-// giet_assert()
-///////////////////////////////////////////////////////////////////////////////////
-// This function uses the giet_tty_puts() and giet_exit() system calls.
-///////////////////////////////////////////////////////////////////////////////////
-void giet_assert( unsigned int condition,
-                  char*        string )
-{
-    if ( condition == 0 )
-    {
-        giet_tty_puts( string );
-        giet_exit();
-    }
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_vobj_get_vbase()
-//////////////////////////////////////////////////////////////////////////////////
-// This function writes in argument (vobj_vaddr) the virtual base address 
-// of a vobj (defined in the mapping_info data structure), identified by 
-// the two arguments (vspace_name and vobj_name).
-// The (vobj_type) argument is redundant, and used for coherence checking.
-// - Returns the address if success,  0 if error ( not defined or wrong type )
-//////////////////////////////////////////////////////////////////////////////////
-int giet_vobj_get_vbase( char*         vspace_name, 
-                         char*         vobj_name, 
-                         unsigned int  vobj_type, 
-                         unsigned int* vobj_vaddr ) 
-{
-    return sys_call( SYSCALL_VOBJ_GET_VBASE, 
-                     (unsigned int) vspace_name,
-                     (unsigned int) vobj_name,
-                     (unsigned int) vobj_type,
-                     (unsigned int) vobj_vaddr );
-}
-////////////////////////////////////////////////////////////////////////////////////
-// giet_proc_number()
-////////////////////////////////////////////////////////////////////////////////////
-// This function returns in the buffer argument the number of processors 
-// in the cluster specified by the cluster_id argument.
-// - Returns 0 if success, > 0 if error ( cluster index too large )
-////////////////////////////////////////////////////////////////////////////////////
-int giet_proc_number( unsigned int  cluster_id, 
-                      unsigned int* buffer ) 
-{
-    return sys_call(SYSCALL_PROC_NUMBER, cluster_id, (unsigned int) buffer, 0, 0);
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_exit()
-//////////////////////////////////////////////////////////////////////////////////
-// This function stops execution of the calling task with a TTY message, 
-// the user task is descheduled and becomes not runable. 
-// It does not consume processor cycles anymore.
-//////////////////////////////////////////////////////////////////////////////////
-void giet_exit() 
-{
-    sys_call( SYSCALL_EXIT,
-              0, 0, 0, 0 );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_context_switch()
-//////////////////////////////////////////////////////////////////////////////////
-// The user task calling this function is descheduled and
-// the processor is allocated to another task.
-//////////////////////////////////////////////////////////////////////////////////
-int giet_context_switch() 
-{
-    return sys_call( SYSCALL_CTX_SWITCH,
-                     0, 0, 0, 0 );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_proc_task_id()
-//////////////////////////////////////////////////////////////////////////////////
-// This functions returns the local task id.
-// If processor has n tasks the local task index is ranging from 0 to n-1
-//////////////////////////////////////////////////////////////////////////////////
-int giet_proc_task_id() 
-{
-    return sys_call( SYSCALL_LOCAL_TASK_ID, 
-                     0, 0, 0, 0 );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_heap_info()
-//////////////////////////////////////////////////////////////////////////////////
-// This function returns the base address and size of the current task's heap
-//////////////////////////////////////////////////////////////////////////////////
-int giet_heap_info( unsigned int* vaddr, 
-                             unsigned int* length ) 
-{
-    return sys_call( SYSCALL_HEAP_INFO, 
-                     (unsigned int)vaddr, 
-                     (unsigned int)length, 
-                     0, 0 );
-}
-//////////////////////////////////////////////////////////////////////////////////
-// giet_global_task_id()
-//////////////////////////////////////////////////////////////////////////////////
-// This functions returns the global task id, which is unique in all the giet.
-//////////////////////////////////////////////////////////////////////////////////
-int giet_global_task_id() 
-{
-    return sys_call( SYSCALL_GLOBAL_TASK_ID, 
-                     0, 0, 0, 0 );
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-// giet_thread_id()
-//////////////////////////////////////////////////////////////////////////////////
-// This functions returns the thread index of the current task.
-//////////////////////////////////////////////////////////////////////////////////
-int giet_thread_id() 
-{
-    return sys_call( SYSCALL_THREAD_ID, 
-                     0, 0, 0, 0 );
+/////////////////////////
+void giet_nic_cma_start()
+{
+    if ( sys_call( SYSCALL_NIC_CMA_START, 0, 0, 0, 0 ) )  
+       giet_exit("error in giet_nic_cma_start()");
+}
+
+/////////////////////////
+void giet_nic_cma_stop()
+{
+    if ( sys_call( SYSCALL_NIC_CMA_STOP, 0, 0, 0, 0 ) )  
+        giet_exit("error in giet_nic_cma_stop()");
 }
 
@@ -699,10 +619,5 @@
 ///////////////////////////////////////////////////////////////////////////////////
 
-///////////////////////////////////////////////////////////////////////////////////
-// giet_fat_open()
-///////////////////////////////////////////////////////////////////////////////////
-// Open a file identified by a pathname, and contained in the system FAT.
-// The read/write flags are not supported yet: no effect.
-///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////
 int giet_fat_open( const char*   pathname, 
                    unsigned int  flags )
@@ -713,103 +628,118 @@
                      0, 0 );
 }
+
+////////////////////////////////////
+void giet_fat_read( unsigned int fd,     
+                    void*        buffer, 
+                    unsigned int count,  
+                    unsigned int offset ) 
+{
+    if ( sys_call( SYSCALL_FAT_READ,
+                   fd, 
+                   (unsigned int)buffer,
+                   count, 
+                   offset ) != count ) giet_exit("in giet_fat_read()");
+}
+
+/////////////////////////////////////
+void giet_fat_write( unsigned int fd,
+                     void*        buffer, 
+                     unsigned int count,
+                     unsigned int offset )
+{
+    if ( sys_call( SYSCALL_FAT_WRITE, 
+                   fd, 
+                   (unsigned int)buffer,
+                   count, 
+                   offset ) != count ) giet_exit("in giet_fat_write()");
+}
+
+/* variant implementing the UNIX spec
 ///////////////////////////////////////////////////////////////////////////////////
-// giet_fat_read()
+// This system call writes to a file identified by the "fd" file descriptor.
+// - "buffer" is the source buffer virtual address (must be word aligned).
+// - "count" is a number of bytes (must be multiple of 4).
+// It uses the implicit "lseek" pointer in file descriptor.
 ///////////////////////////////////////////////////////////////////////////////////
-// Read "count" sectors from a file identified by "fd", skipping "offset"
-// sectors in file, and writing into the user "buffer". 
-// The user buffer base address shoulb be 64 bytes aligned.
-///////////////////////////////////////////////////////////////////////////////////
-// This system call specification should evolve to the UNIX specification:
-// - count must be a number of bytes, with no alignment constraint on user buffer.
-// - offset argument should be removed and replaced by an implicit "lseek" pointer
-//   stored in the file descriptor.
-// This suppose to implement a sectors cache
-///////////////////////////////////////////////////////////////////////////////////
-int giet_fat_read( unsigned int fd, 
-                   void*        buffer, 
-                   unsigned int count,
-                   unsigned int offset )
-{
-    return sys_call( SYSCALL_FAT_READ,
-                     fd, 
-                     (unsigned int)buffer,
-                     count, 
-                     offset );
-}
-///////////////////////////////////////////////////////////////////////////////////
-// giet_fat_write()
-///////////////////////////////////////////////////////////////////////////////////
-// Write "count" sectors from a file identified by "fd", skipping "offset"
-// sectors in file, and reading from the user "buffer". 
-// The user buffer base address shoulb be 64 bytes aligned.
-///////////////////////////////////////////////////////////////////////////////////
-// This system call specification should evolve to the UNIX specification:
-// - count must be a number of bytes, with no alignment constraint on buffer
-// - offset argument should be removed and replaced by an implicit "lseek" pointer
-//   stored in the file descriptor.
-// This suppose to implement a sectors cache
-///////////////////////////////////////////////////////////////////////////////////
-int giet_fat_write( unsigned int fd,
+void giet_fat_write( unsigned int fd,
                     void*        buffer, 
-                    unsigned int count,
-                    unsigned int offset )
+                    unsigned int count )  // number of bytes 
 {
     return sys_call( SYSCALL_FAT_WRITE, 
                      fd, 
                      (unsigned int)buffer,
-                     count, 
-                     offset );
-}
-///////////////////////////////////////////////////////////////////////////////////
-// giet_fat_lseek()
-///////////////////////////////////////////////////////////////////////////////////
-// Change the lseek file pointer value for a file identified by "fd".
-///////////////////////////////////////////////////////////////////////////////////
-int giet_fat_lseek( unsigned int fd, 
+                     count, 0 ); 
+}
+*/
+
+/////////////////////////////////////
+void giet_fat_lseek( unsigned int fd, 
                     unsigned int offset, 
-                    unsigned int whence)
-{
-    return sys_call( SYSCALL_FAT_LSEEK, 
-                     fd, 
-                     offset, 
-                     whence, 
-                     0 );
-}
-
-///////////////////////////////////////////////////////////////////////////////////
-// giet_fat_fstat()
-///////////////////////////////////////////////////////////////////////////////////
-// Return stats of a file identified by "fd". 
-// (Only the file_size in sectors for this moment)
-///////////////////////////////////////////////////////////////////////////////////
-int giet_fat_fstat( unsigned int fd )
-{
-    return sys_call( SYSCALL_FAT_FSTAT,
-                     fd,
-                     0, 0, 0 );
-}
-
-///////////////////////////////////////////////////////////////////////////////////
-// giet_fat_close()
-///////////////////////////////////////////////////////////////////////////////////
-// Close a file identified by "fd".
-///////////////////////////////////////////////////////////////////////////////////
-int giet_fat_close( unsigned int fd )
-{
-    return sys_call( SYSCALL_FAT_CLOSE,
-                     fd,
-                     0, 0, 0 );
-}
-
-
-///////////////////////////////////////////////////////////////////////////////////
-////////////////// Pseudo system calls (no syscall instruction) ///////////////////
-///////////////////////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////////////////////
-// giet_rand()
-// This function returns a pseudo-random value derived from the processor cycle
-// count. This value is comprised between 0 & 65535.
-///////////////////////////////////////////////////////////////////////////////////
+                    unsigned int whence )
+{
+    if ( sys_call( SYSCALL_FAT_LSEEK, 
+                   fd, 
+                   offset, 
+                   whence, 
+                   0 ) ) giet_exit("in giet_fat_lseek()");
+}
+
+//////////////////////////////////////
+void giet_fat_fstat( unsigned int fd )
+{
+    if ( sys_call( SYSCALL_FAT_FSTAT,
+                   fd,
+                   0, 0, 0 ) )  giet_exit("in giet_fat_lseek()");
+}
+
+/////////////////////////////////////
+void giet_fat_close( unsigned int fd )
+{
+    if ( sys_call( SYSCALL_FAT_CLOSE,
+                   fd,
+                   0, 0, 0 ) )  giet_exit("in giet_fat_close()");
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+///////////////////// Miscellaneous system calls /////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////
+
+/////////////////
+int giet_procid() 
+{
+    return sys_call( SYSCALL_PROCID,
+                     0, 0, 0, 0 );
+}
+
+////////////////////
+int giet_proctime() 
+{
+    return sys_call( SYSCALL_PROCTIME, 
+                     0, 0, 0, 0 );
+}
+
+///////////////////////
+int giet_proc_task_id() 
+{
+    return sys_call( SYSCALL_LOCAL_TASK_ID, 
+                     0, 0, 0, 0 );
+}
+
+/////////////////////////
+int giet_global_task_id() 
+{
+    return sys_call( SYSCALL_GLOBAL_TASK_ID, 
+                     0, 0, 0, 0 );
+}
+
+////////////////////
+int giet_thread_id() 
+{
+    return sys_call( SYSCALL_THREAD_ID, 
+                     0, 0, 0, 0 );
+}
+
+///////////////
 int giet_rand() 
 {
@@ -822,4 +752,59 @@
     }
 }
+
+//////////////////////////////
+void giet_exit( char* string ) 
+{
+    sys_call( SYSCALL_EXIT,
+              (unsigned int)string,
+              0, 0, 0 );
+}
+
+/////////////////////////////////////////
+void giet_assert( unsigned int condition,
+                  char*        string )
+{
+    if ( condition == 0 ) giet_exit( string );
+}
+
+////////////////////////////////////////////////////
+void giet_vobj_get_vbase( char*         vspace_name, 
+                          char*         vobj_name, 
+                          unsigned int* vobj_vaddr ) 
+{
+    if ( sys_call( SYSCALL_VOBJ_GET_VBASE, 
+                   (unsigned int) vspace_name,
+                   (unsigned int) vobj_name,
+                   (unsigned int) vobj_vaddr,
+                   0 ) )  giet_exit("in giet_vobj_get_vbase()");
+}
+
+///////////////////////////////////////////////
+void giet_proc_number( unsigned int  cluster_id, 
+                      unsigned int* buffer ) 
+{
+    if ( sys_call( SYSCALL_PROC_NUMBER, 
+                   cluster_id, 
+                   (unsigned int) buffer, 
+                   0, 0) )  giet_exit("in giet_proc_number()");
+}
+
+//////////////////////////
+void giet_context_switch() 
+{
+    sys_call( SYSCALL_CTX_SWITCH,
+              0, 0, 0, 0 );
+}
+
+/////////////////////////////////////////
+void giet_heap_info( unsigned int* vaddr, 
+                     unsigned int* length ) 
+{
+    if ( sys_call( SYSCALL_HEAP_INFO, 
+                   (unsigned int)vaddr, 
+                   (unsigned int)length, 
+                   0, 0 ) )  giet_exit("in giet_heap_info()");
+}
+
 
 // Local Variables:
Index: /soft/giet_vm/giet_libs/stdio.h
===================================================================
--- /soft/giet_vm/giet_libs/stdio.h	(revision 294)
+++ /soft/giet_vm/giet_libs/stdio.h	(revision 295)
@@ -18,6 +18,6 @@
 #define SYSCALL_TIMER_START       0x04
 #define SYSCALL_TIMER_STOP        0x05
-#define SYSCALL_FREE_06           0x06
-#define SYSCALL_FREE_07           0x07
+#define SYSCALL_TTY_GET_LOCK      0x06
+#define SYSCALL_TTY_RELEASE_LOCK  0x07
 #define SYSCALL_HEAP_INFO         0x08
 #define SYSCALL_LOCAL_TASK_ID     0x09
@@ -32,5 +32,5 @@
 #define SYSCALL_FB_SYNC_READ      0x11
 #define SYSCALL_THREAD_ID         0x12
-#define SYSCALL_TTY_LOCK          0x13
+#define SYSCALL_FREE_13           0x13
 #define SYSCALL_FREE_14           0x14
 #define SYSCALL_FREE_15           0x15
@@ -99,120 +99,331 @@
 
 //////////////////////////////////////////////////////////////////////////
-// MIPS32 related system calls 
-//////////////////////////////////////////////////////////////////////////
-
-extern int giet_procid();
-
-extern int giet_proctime();
-
-//////////////////////////////////////////////////////////////////////////
-// TTY device related system calls 
-//////////////////////////////////////////////////////////////////////////
-
-extern int giet_tty_putc(char byte);
-
-extern int giet_tty_puts(char* buf);
-
-extern int giet_tty_putw(unsigned int val);
-
-extern int giet_tty_getc_no_irq(char* byte);
-
-extern int giet_tty_getc(char* byte);
-
-extern int giet_tty_gets(char* buf, unsigned int bufsize);
-
-extern int giet_tty_getw(unsigned int* val);
-
-extern int giet_tty_printf(char* format,...);
-
-//////////////////////////////////////////////////////////////////////////
-// TIMER device related system calls 
-//////////////////////////////////////////////////////////////////////////
-
-extern int giet_timer_start();
-
-extern int giet_timer_stop();
+//////////////////////////////////////////////////////////////////////////
+//               MIPS32 related system calls 
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//             TTY device related system calls 
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+// This function is a modified version of the mutek_printf().
+// It uses a private terminal allocated to the calling task in the boot.
+// ("use_tty" argument in xml mapping), and does not take the TTY lock.
+// It calls several times the _tty_write system function.
+// Only a limited number of formats are supported:
+//   - %d : signed decimal
+//   - %u : unsigned decimal
+//   - %x : 32 bits hexadecimal
+//   - %l : 64 bits hexadecimal
+//   - %c : char
+//   - %s : string
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_tty_printf( char* format, ... );
+
+//////////////////////////////////////////////////////////////////////////
+// This function is a modified version of the mutek_printf().
+// It uses the kernel TTY0 as a shared terminal, and it takes the
+// TTY lock to get exclusive access during the format display.
+// It calls several times the _tty_write system function.
+// Only a limited number of formats are supported:
+//   - %d : signed decimal
+//   - %u : unsigned decimal
+//   - %x : 32 bits hexadecimal
+//   - %l : 64 bits hexadecimal
+//   - %c : char
+//   - %s : string
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_shr_printf( char* format, ... );
+
+//////////////////////////////////////////////////////////////////////////
+// This blocking function fetches a single character from the private
+// terminal allocated to the calling task in the boot.
+// It uses the TTY_RX_IRQ interrupt, and the associated kernel buffer.
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_tty_getc( char* byte );
+
+//////////////////////////////////////////////////////////////////////////
+// This blocking function fetches a string from the private terminal 
+// allocated to the calling task to a fixed length buffer.
+// The terminal index must be defined in the task context in the boot.
+// It uses the TTY_RX_IRQ interrupt, and the associated kernel buffer.
+// - Up to (bufsize - 1) characters (including the non printable characters)
+//   are copied into buffer, and the string is completed by a NUL character.
+// - The <LF> character is interpreted, and the function close the string
+//   with a NUL character if <LF> is read.
+// - The <DEL> character is interpreted, and the corresponding character(s) 
+//   are removed from the target buffer.
+// - It does not provide an echo.
+// In case or error returned by syscall, it makes a giet_exit().
+/////////////////////////////////////////////////////////////////////////
+extern void giet_tty_gets( char* buf, unsigned int bufsize );
+
+/////////////////////////////////////////////////////////////////////////
+// This blocking function fetches a string of decimal characters (most
+// significant digit first) to build a 32-bit unsigned integer from
+// the private TTY terminal allocated to the calling task. 
+// The terminal index must be defined in the task context in the boot.
+// It uses the TTY_RX_IRQ interrupt, and the associated kernel buffer.
+// - The non-blocking system function _tty_read is called several times,
+//   and the decimal characters are written in a 32 characters buffer 
+//   until a <LF> character is read.
+// - It ignores non-decimal characters, and displays an echo 
+//   system function) for each decimal character.
+// - The <DEL> character is interpreted, and previous characters can be cancelled. 
+// - When the <LF> character is received, the string is converted to an
+//   unsigned int value. If the number of decimal digit is too large for the 32
+//   bits range, the zero value is returned.
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_tty_getw( unsigned int* val );
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//                TIMER device related system calls 
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+// This function activates the private user timer allocated 
+// to the calling task in the boot phase.
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_timer_start();
+
+//////////////////////////////////////////////////////////////////////////
+// This function stops the private user timer allocated 
+// to the calling task.
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_timer_stop();
  
 //////////////////////////////////////////////////////////////////////////
-// Frame buffer device related system calls 
-//////////////////////////////////////////////////////////////////////////
-
-extern int giet_fb_sync_read( unsigned int offset, 
-                              void*        buffer, 
+//////////////////////////////////////////////////////////////////////////
+//                Frame buffer device related system calls 
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+// This blocking function use a memory copy strategy to transfer data 
+// from the frame buffer device in kernel space to an user buffer.
+//     offset : offset (in bytes) in the frame buffer
+//     buffer : base address of the user buffer
+//     length : number of bytes to be transfered
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_fb_sync_read( unsigned int offset, 
+                               void*        buffer, 
+                               unsigned int length );
+
+//////////////////////////////////////////////////////////////////////////
+// This blocking function use a memory copy strategy to transfer data 
+// from a user buffer to the frame buffer device in kernel space.
+//     offset : offset (in bytes) in the frame buffer
+//     buffer : base address of the memory buffer
+//     length : number of bytes to be transfered
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_fb_sync_write( unsigned int offset, 
+                                void*        buffer, 
+                                unsigned int length );
+
+//////////////////////////////////////////////////////////////////////////
+// This function initializes the two chbuf SRC an DST used by the CMA 
+// controller and activates the CMA channel allocated to the calling task.
+// - buf0   : first user buffer virtual address
+// - buf1   : second user buffer virtual address
+// - length : buffer size (bytes)
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_fb_cma_init( void*        buf0, 
+                              void*        buf1,
                               unsigned int length );
 
-extern int giet_fb_sync_write(unsigned int offset, 
-                              void*        buffer, 
-                              unsigned int length);
-
-extern int giet_fb_cma_init(  void*        buf0, 
-                              void*        buf1,
-                              unsigned int length);
-
-extern int giet_fb_cma_write(unsigned int buf_id);
-
-extern int giet_fb_cma_stop();
-
-//////////////////////////////////////////////////////////////////////////
-// Network controller related system calls 
-//////////////////////////////////////////////////////////////////////////
-
-extern int giet_nic_cma_start();
-
-extern int giet_nic_cma_stop();
-
-//////////////////////////////////////////////////////////////////////////
-// FAT related system calls 
-//////////////////////////////////////////////////////////////////////////
-
+//////////////////////////////////////////////////////////////////////////
+// This function initializes the two chbuf SRC an DST used by the CMA 
+// controller and activates the CMA channel allocated to the calling task.
+// - buf0   : first user buffer virtual address
+// - buf0   : second user buffer virtual address
+// - length : buffer size (bytes)
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_fb_cma_write( unsigned int buf_id );
+
+//////////////////////////////////////////////////////////////////////////
+// This function desactivates the CMA channel allocated to the task.
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_fb_cma_stop();
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//                  NIC related system calls 
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+// This function initializes the memory chbuf used by the CMA controller, 
+// activates the NIC channel allocated to the calling task, 
+// and activates the two CMA channels.
+// - tx     : RX channel if 0 / TX channel if non 0
+// - buf0   : first user buffer virtual address
+// - buf1   : second user buffer virtual address
+// - length : buffer size (bytes)
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_nic_cma_start();
+
+//////////////////////////////////////////////////////////////////////////
+// This function desactivates the NIC channel and the two CMA channels
+// allocated to the calling task.
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_nic_cma_stop();
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//               FAT related system calls 
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+// Open a file identified by a pathname, and contained in the system FAT.
+// The read/write flags are not supported yet: no effect.
+// Return -1 in case or error.
+//////////////////////////////////////////////////////////////////////////
 extern int giet_fat_open(  const char*  pathname,
                            unsigned int flags );
 
-extern int giet_fat_read(  unsigned int fd,
-                           void*        buffer,
-                           unsigned int count,
-                           unsigned int offset );
-
-extern int giet_fat_write( unsigned int fd,
-                           void*        buffer,
-                           unsigned int count,
-                           unsigned int offset );
-
-extern int giet_fat_lseek( unsigned int fd,
-                           unsigned int offset,
-                           unsigned int whence );
-
-extern int giet_fat_fstat( unsigned int fd );
-
-extern int giet_fat_close( unsigned int fd );
-
-//////////////////////////////////////////////////////////////////////////
-// Miscelaneous system calls
-//////////////////////////////////////////////////////////////////////////
-
-extern int giet_vobj_get_vbase( char*         vspace_name, 
-                                char*         vobj_name, 
-                                unsigned int  vobj_type, 
-                                unsigned int* vobj_vaddr);
-
-extern int giet_procnumber();
-
+///////////////////////////////////////////////////////////////////////////////////
+// Read "count" sectors from a file identified by "fd", skipping "offset"
+// sectors in file, and writing into the user "buffer". 
+// The user buffer base address shoulb be 64 bytes aligned.
+// In case or error returned by syscall, it makes a giet_exit().
+///////////////////////////////////////////////////////////////////////////////////
+extern void giet_fat_read(  unsigned int fd,
+                            void*        buffer,
+                            unsigned int count,
+                            unsigned int offset );
+
+///////////////////////////////////////////////////////////////////////////////////
+// Write "count" sectors from a file identified by "fd", skipping "offset"
+// sectors in file, and reading from the user "buffer". 
+// The user buffer base address shoulb be 64 bytes aligned.
+// In case or error returned by syscall, it makes a giet_exit().
+///////////////////////////////////////////////////////////////////////////////////
+extern void giet_fat_write( unsigned int fd,
+                            void*        buffer,
+                            unsigned int count,
+                            unsigned int offset );
+
+///////////////////////////////////////////////////////////////////////////////////
+// Change the lseek file pointer value for a file identified by "fd".
+// In case or error returned by syscall, it makes a giet_exit().
+///////////////////////////////////////////////////////////////////////////////////
+extern void giet_fat_lseek( unsigned int fd,
+                            unsigned int offset,
+                            unsigned int whence );
+
+///////////////////////////////////////////////////////////////////////////////////
+// Returns general informations of a file identified by "fd". 
+// (Only the file_size in sectors for this moment)
+///////////////////////////////////////////////////////////////////////////////////
+extern void giet_fat_fstat( unsigned int fd );
+
+//////////////////////////////////////////////////////////////////////////
+// Close a file identified by "fd".
+//////////////////////////////////////////////////////////////////////////
+extern void giet_fat_close( unsigned int fd );
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//                    Miscelaneous system calls
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+// This function returns the processor identifier.
+//////////////////////////////////////////////////////////////////////////
+extern int giet_procid();
+
+//////////////////////////////////////////////////////////////////////////
+// This function returns the local processor time.
+//////////////////////////////////////////////////////////////////////////
+extern int giet_proctime();
+
+//////////////////////////////////////////////////////////////////////////
+// This functions returns the local task id.
+// If processor has n tasks the local task index is ranging from 0 to n-1
+//////////////////////////////////////////////////////////////////////////
+extern int giet_proc_task_id();
+
+//////////////////////////////////////////////////////////////////////////
+// This functions returns the global task id, (unique in the system).
+//////////////////////////////////////////////////////////////////////////
+extern int giet_global_task_id(); 
+
+//////////////////////////////////////////////////////////////////////////
+// This functions returns the thread index of the task in its vspace.
+//////////////////////////////////////////////////////////////////////////
+extern int giet_thread_id(); 
+
+//////////////////////////////////////////////////////////////////////////
+// This function returns a pseudo-random value derived from the processor 
+// cycle count. This value is comprised between 0 & 65535.
+/////////////////////////////////////////////////////////////////////////
+extern int giet_rand();
+
+//////////////////////////////////////////////////////////////////////////
+// This function stops execution of the calling task with a TTY message, 
+// the user task is descheduled and becomes not runable. 
+// It does not consume processor cycles anymore.
+//////////////////////////////////////////////////////////////////////////
 extern void giet_exit();
 
-extern int giet_context_switch();
-
-extern int giet_proc_task_id();
-
-extern int giet_heap_info( unsigned int* vaddr, 
-                           unsigned int* size );
-
-extern int giet_global_task_id();
-
-extern int giet_thread_id();
-
+//////////////////////////////////////////////////////////////////////////
+// This function uses the giet_exit() system call
+// and kill the calling task if the condition is false.
+//////////////////////////////////////////////////////////////////////////
 extern void giet_assert( unsigned int, 
                          char* string );
 
-extern int giet_rand();
+//////////////////////////////////////////////////////////////////////////
+// This function writes in argument "vobj_vaddr" the virtual base address 
+// of a vobj (defined in the mapping_info data structure), identified by 
+// the two arguments "vspace_name" and "vobj_name".
+// In case or error returned by syscall, it makes a giet_exit().
+// ( vobj not defined or wrong vspace )
+//////////////////////////////////////////////////////////////////////////
+extern void giet_vobj_get_vbase( char*         vspace_name, 
+                                 char*         vobj_name, 
+                                 unsigned int* vobj_vaddr);
+
+//////////////////////////////////////////////////////////////////////////
+// This function returns in the "buffer" argument the number of processors 
+// in the cluster specified by the "cluster_xy" argument.
+// In case or error returned by syscall, it makes a giet_exit().
+//////////////////////////////////////////////////////////////////////////
+extern void giet_procnumber( unsigned int cluster_xy,
+                             unsigned int buffer );
+
+//////////////////////////////////////////////////////////////////////////
+// The user task calling this function is descheduled and
+// the processor is allocated to another task.
+//////////////////////////////////////////////////////////////////////////
+extern void giet_context_switch();
+
+//////////////////////////////////////////////////////////////////////////
+// This function returns the base address and size of the task's heap
+//////////////////////////////////////////////////////////////////////////
+extern void giet_heap_info( unsigned int* vaddr, 
+                            unsigned int* size );
+
 
 #endif
Index: /soft/giet_vm/giet_xml/mapping_info.h
===================================================================
--- /soft/giet_vm/giet_xml/mapping_info.h	(revision 294)
+++ /soft/giet_vm/giet_xml/mapping_info.h	(revision 295)
@@ -30,5 +30,5 @@
 // - mapping_vspace_t   vspace[]  
 // - mapping_vseg_t     vseg[]     
-// - mapping_vseg_t     vobj[]    
+// - mapping_vobj_t     vobj[]    
 // - mapping_task_t     task[]  
 // - mapping_proc_t     proc[]  
@@ -61,5 +61,5 @@
 #define U_MODE_MASK  0b0001   // user access
 
-#define IN_MAPPING_SIGNATURE    0xDEADBEEF
+#define IN_MAPPING_SIGNATURE    0xDACE2014
 #define OUT_MAPPING_SIGNATURE   0xBABEF00D
 
@@ -85,5 +85,5 @@
 {
     IRQ_TYPE_HWI = 0,        // HARD in map.xml file
-    IRQ_TYPE_SWI = 1,        // SOFT in map.xml file,
+    IRQ_TYPE_WTI = 1,        // SOFT in map.xml file,
     IRQ_TYPE_PTI = 2,        // TIME in map.xml file,
 };
@@ -115,6 +115,7 @@
     PERIPH_TYPE_TTY       = 12,
     PERIPH_TYPE_XCU       = 13,
-
-    PERIPH_TYPE_MAX_VALUE = 14,
+    PERIPH_TYPE_PIC       = 14,
+
+    PERIPH_TYPE_MAX_VALUE = 15,
 };
 
@@ -145,30 +146,9 @@
     unsigned int globals;            // number of vsegs mapped in all vspaces
     unsigned int vspaces;            // number of virtual spaces
-    unsigned int increment;          // vseg cluster increment for replicated periphs
+    unsigned int x_io;               // x coordinate for cluster_io_ext
+    unsigned int y_io;               // y coordinate for cluster_io_ext
     unsigned int irq_per_proc;       // number of IRQ per processor
-
-    unsigned int cma_cluster;        // index of cluster containing CMA controler
-    unsigned int cma_cluster_bis;    // index of cluster containing second CMA controler
-
-    unsigned int fbf_cluster;        // index of cluster containing FBF controler
-    unsigned int fbf_cluster_bis;    // index of cluster containing second FBF controler
-
-    unsigned int iob_cluster;        // index of cluster containing IOB controler
-    unsigned int iob_cluster_bis;    // index of cluster containing second IOB controler
-
-    unsigned int ioc_cluster;        // index of cluster containing IOC controler
-    unsigned int ioc_cluster_bis;    // index of cluster containing second IOC controler
-
-    unsigned int nic_cluster;        // index of cluster containing NIC controler
-    unsigned int nic_cluster_bis;    // index of cluster containing second NIC controler
-
-    unsigned int rom_cluster;        // index of cluster containing ROM controler
-    unsigned int rom_cluster_bis;    // index of cluster containing second ROM controler
-
-    unsigned int sim_cluster;        // index of cluster containing SIM controler
-    unsigned int sim_cluster_bis;    // index of cluster containing second SIM controler
-
-    unsigned int tty_cluster;        // index of cluster containing TTY controler
-    unsigned int tty_cluster_bis;    // index of cluster containing second TTY controler
+    unsigned int use_ramdisk;        // does not use IOC peripheral if non zero
+    unsigned int increment;          // vbase address increment (replicated peripherals)
 
     unsigned int psegs;              // total number of physical segments (for all clusters)
@@ -286,17 +266,6 @@
 typedef struct __attribute__((packed))  mapping_proc_s 
 {
-    unsigned int    irqs;            // number of IRQs allocated to processor
-    unsigned int    irq_offset;      // index of first IRQ allocated to processor
+    unsigned int    index;           // processor local index (in cluster)
 } mapping_proc_t;
-
-
-/////////////////////////////////////////////////////
-typedef struct __attribute__((packed))  mapping_irq_s 
-{
-    unsigned int    type;            // HWI / SWI / PTI
-    unsigned int    icuid;           // IRQ Index for the ICU component
-    unsigned int    isr;             // ISR Index (defined in irq_handler.h)
-    unsigned int    channel;         // Channel Index (for multi-channels peripherals)
-} mapping_irq_t; 
 
 
@@ -323,9 +292,24 @@
 typedef struct __attribute__((packed))  mapping_periph_s 
 {
-    unsigned int    type;         
+    unsigned int    type;            // legal values defined above
     unsigned int    subtype;         // periph specialization
     unsigned int    psegid;          // pseg index in cluster
     unsigned int    channels;        // number of channels
+    unsigned int    irqs;            // number of input IRQs (for ICU, XCU or PIC)
+    unsigned int    irq_offset;      // index of first IRQ (can be HWI/PTI/WTI)
 } mapping_periph_t;
+
+
+/////////////////////////////////////////////////////
+typedef struct __attribute__((packed))  mapping_irq_s 
+{
+    unsigned int    srctype;         // source IRQ type (HWI / WTI / PTI)
+    unsigned int    srcid;           // source IRQ index (for ICU/PIC component)
+    unsigned int    isr;             // ISR type (defined in irq_handler.h)
+    unsigned int    channel;         // channel index (for multi-channels peripherals)
+    unsigned int    dstx;            // x coordinate of destination cluster
+    unsigned int    dsty;            // y coordinate of destination cluster
+    unsigned int    dstid;           // destination IRQ index (can be PROC or ICU)
+} mapping_irq_t; 
 
 
Index: /soft/giet_vm/giet_xml/xml_driver.c
===================================================================
--- /soft/giet_vm/giet_xml/xml_driver.c	(revision 294)
+++ /soft/giet_vm/giet_xml/xml_driver.c	(revision 295)
@@ -18,5 +18,7 @@
 
 //////////////////////////////////////////////////////
-void buildXml(mapping_header_t * header, FILE * fpout) {
+void buildXml(mapping_header_t * header, FILE * fpout) 
+{
+    // mnemonics defined in mapping_info.h
     const char * vobj_type[] = 
     { 
@@ -27,5 +29,5 @@
         "MWMR",       // MWMR channel
         "LOCK",       // Spin-Lock
-        "BUFFER",     // Any "no intialiasation needed" objects (stacks...)
+        "BUFFER",     // Any "no intialiasation needed" object (stacks...)
         "BARRIER",    // Barrier
         "CONST",      // Constant
@@ -34,28 +36,36 @@
     };
 
+    // mnemonics defined in mapping_info.h
     const char * pseg_type[] = 
     {
         "RAM",
-        "ROM",
+        "ROM",        // deprecated => use PERI
         "PERI",
     };
 
+    // mnemonics defined in mapping_info.h
     const char * irq_type[] =
     {
-        "HARD",
-        "SOFT",
-        "TIME",
-    };
-
+        "HWI",                      
+        "WTI",
+        "PTI",
+    };
+
+    // mnemonics defined in irq_handler.h
     const char * isr_type[] =
     {
-        "ISR_DEFAULT",
-        "ISR_SWITCH",
-        "ISR_TTY",
-        "ISR_DMA",
-        "ISR_IOC",
+        "ISR_DEFAULT", 
+        "ISR_TICK",
+        "ISR_TTY_RX",
+        "ISR_TTY_TX",
+        "ISR_BDV",
         "ISR_TIMER",
-    };
-
+        "ISR_WAKUP",
+        "ISR_NIC_RX",
+        "ISR_NIC_TX",
+        "ISR_CMA",
+    };
+
+    // mnemonics defined in mapping_info.h
     const char * periph_type[] =
     {
@@ -74,7 +84,8 @@
         "TTY",
         "XCU",
-    };
-
-    const char * periph_subtype[] =
+        "PIC",
+    };
+
+    const char * ioc_subtype[] =
     {
         "BDV",
@@ -242,7 +253,8 @@
     fprintf(fpout, "              x_width      = \"%d\"   \n" , header->x_width);
     fprintf(fpout, "              y_width      = \"%d\"   \n" , header->y_width);
-    fprintf(fpout, "              vspaces      = \"%d\"   \n" , header->vspaces);
-    fprintf(fpout, "              increment    = \"%d\"   \n" , header->vspaces);
-    fprintf(fpout, "              irq_per_proc = \"%d\" >\n\n", header->irq_per_proc);
+    fprintf(fpout, "              irq_per_proc = \"%d\"   \n" , header->irq_per_proc);
+    fprintf(fpout, "              use_ramdisk  = \"%d\"   \n" , header->use_ramdisk);
+    fprintf(fpout, "              x_io         = \"%d\"   \n" , header->x_io);
+    fprintf(fpout, "              y_io         = \"%d\" >\n\n", header->y_io);
 
     ///////////////////// clusters ///////////////////////////////////////////////
@@ -271,19 +283,8 @@
         for (proc_id = cluster[cluster_id].proc_offset;
              proc_id < cluster[cluster_id].proc_offset + cluster[cluster_id].procs;
-             proc_id++) 
-        {
-            fprintf(fpout, "            <proc index = \"%d\" >\n", proc_index);
-            for (irq_id = proc[proc_id].irq_offset; 
-                 irq_id < proc[proc_id].irq_offset + proc[proc_id].irqs;
-                 irq_id++) 
-            {
-                fprintf(fpout, "                <irq type = \"%s\" ", irq_type[irq[irq_id].type]);
-                fprintf(fpout, " icuid = \"0x%x\" ", irq[irq_id].icuid);
-                fprintf(fpout, " isr = \"%s\" ", isr_type[irq[irq_id].isr]);
-                fprintf(fpout, " channel = \"0x%x\" />\n", irq[irq_id].channel);
-            }
-            fprintf(fpout, "            </proc>\n" );
-        }
-
+             proc_id++, proc_index++) 
+        {
+            fprintf(fpout, "            <proc index = \"%d\" />\n", proc_index);
+        }
 
         ///////////////////// coprocessors ///////////////////////////////////////////
@@ -316,8 +317,21 @@
 
             if (periph[periph_id].subtype < PERIPH_SUBTYPE_MAX_VALUE) 
-                fprintf(fpout, " subtype = \"%s\" ", periph_subtype[periph[periph_id].subtype]);
+                fprintf(fpout, " subtype = \"%s\" ", ioc_subtype[periph[periph_id].subtype]);
 
             fprintf(fpout, " psegname = \"%s\" ", pseg[periph[periph_id].psegid].name);
-            fprintf(fpout, " channels = \"%d\" />\n",  periph[periph_id].channels);
+            fprintf(fpout, " channels = \"%d\" >\n",  periph[periph_id].channels);
+            for (irq_id = periph[periph_id].irq_offset; 
+                 irq_id < periph[periph_id].irq_offset + periph[periph_id].irqs;
+                 irq_id++) 
+            {
+                fprintf(fpout, "                <irq srctype = \"%s\" ", irq_type[irq[irq_id].srctype]);
+                fprintf(fpout, " srcid = \"%d\" ", irq[irq_id].srcid);
+                fprintf(fpout, " isr = \"%s\" ", isr_type[irq[irq_id].isr]);
+                fprintf(fpout, " channel = \"%d\" ", irq[irq_id].channel);
+                fprintf(fpout, " dstx = \"%d\" ", irq[irq_id].dstx);
+                fprintf(fpout, " dsty = \"%d\" ", irq[irq_id].dsty);
+                fprintf(fpout, " dstid = \"%d\" />\n", irq[irq_id].dstid);
+            }
+            fprintf(fpout, "            </periph>\n");
         }
         fprintf(fpout, "        </cluster>\n" );
Index: /soft/giet_vm/giet_xml/xml_parser.c
===================================================================
--- /soft/giet_vm/giet_xml/xml_parser.c	(revision 294)
+++ /soft/giet_vm/giet_xml/xml_parser.c	(revision 295)
@@ -104,28 +104,29 @@
 char found_mmc   = 0;
 
-
-////////////////////////////////////////////////////////////////////
-// These variables are used to generate the hard_config.h file
-////////////////////////////////////////////////////////////////////
-
-unsigned int nb_proc_max      = 0; // max number of processors per cluster
+////////////////////////////////////////////////////////////////////////
+// These variables are used to generate the hard_config.h file.
+////////////////////////////////////////////////////////////////////////
+
+unsigned int nb_procs_max     = 0; // max number of processors per cluster
 unsigned int nb_tasks_max     = 0; // max number of tasks (in all vspaces)
 
-unsigned int tim_channels     = 0; // max number of user timers (per cluster)
-unsigned int dma_channels     = 0; // max number of DMA channels (per cluster)
-
-unsigned int icu_channels     = 0; // total number of channels  in ICU/XICU
-unsigned int tty_channels     = 0; // total number of terminals in TTY 
-unsigned int hba_channels     = 0; // total number of channels  in HBA
-unsigned int nic_channels     = 0; // total number of channels  in NIC 
-unsigned int cma_channels     = 0; // total number of channels  in CMA
+unsigned int tim_channels     = 0; // number of user timers  (per cluster)
+unsigned int dma_channels     = 0; // number of DMA channels (per cluster)
+
+unsigned int tty_channels     = 0; // number of TTY channels
+unsigned int ioc_channels     = 0; // number of HBA channels
+unsigned int nic_channels     = 0; // number of NIC channels
+unsigned int cma_channels     = 0; // number of CMA channels 
+unsigned int pic_channels     = 0; // number of PIC channels
 
 unsigned int use_iob          = 0; // using IOB component
+unsigned int use_pic          = 0; // using PIC component
 unsigned int use_xcu          = 0; // using XCU (not ICU)
 
 // These variables define the IOC peripheral subtype
-unsigned int use_hba          = 0; // using HBA
-unsigned int use_bdv          = 0; // using SoCLIB block device
-unsigned int use_spi          = 0; // using SD Card-SPI
+
+unsigned int use_hba          = 0; // using SoClib AHCI controller
+unsigned int use_bdv          = 0; // using SoCLIB block device controller
+unsigned int use_spi          = 0; // using SDCard-SPI
 
 ////////////////////////////////////////////////////////////////
@@ -283,8 +284,15 @@
 
 ///////////////////////////////////////////////////////////////////////////////////
-// This function set the vbase address for all peripheral types. 
-// For replicated peripherals with the same type the virtual base address must be:
-//   vbase = seg_type_base & 0XFF000000 + 
-//          (cluster_id * vbase_cluster_increment) & 0x00FF0000
+// This function set the vbase addresses for all peripheral types, in order
+// to generate the ldscript file, that contains one single virtual address
+// for peripherals replicated in all clusters, and one virtual addresses for
+// each non replicated peripheral type.
+// 
+// It makes the following checks on the virtual addresses:
+// 
+// - For replicated peripherals the virtual base address must be:
+//   vbase = seg_type_base & 0XFF000000 + (cluster_xy * increment) & 0x00FF0000
+//
+// - For non-replicated peripherals, the cluster index must be cluster_io.
 ///////////////////////////////////////////////////////////////////////////////////
 void set_periph_vbase_array()
@@ -300,5 +308,7 @@
     unsigned int cluster_mask = 0x00FF0000;
 
-    // We are analysing all vsegs corresponding to a peripheral
+#if XML_PARSER_DEBUG
+printf("\n set peripherals vbase array\n");
+#endif
 
     // scan all vsegs
@@ -308,5 +318,9 @@
         if ( vobj[vseg[vseg_id]->vobj_offset]->type == VOBJ_TYPE_PERI )
         {
-            pseg_id    = vseg[vseg_id]->psegid; 
+            pseg_id = vseg[vseg_id]->psegid; 
+
+#if XML_PARSER_DEBUG
+printf(" - found vseg %s with psegid = %d", vseg[vseg_id]->name, pseg_id );
+#endif
 
             // scan all periphs to retrieve peripheral type (same psegid)
@@ -315,17 +329,37 @@
                 if( periph[periph_id]->psegid == pseg_id ) // matching !!!
                 {
-                    type = periph[periph_id]->type;
-                    if ( periph_vbase_array[type] == 0xFFFFFFFF )  // vbase not set
+                    cluster_id = pseg[pseg_id]->clusterid;
+                    type       = periph[periph_id]->type;
+
+#if XML_PARSER_DEBUG
+printf(" / matching periph type %d\n", type );
+#endif
+
+                    if ( (type == PERIPH_TYPE_DMA) ||
+                         (type == PERIPH_TYPE_MMC) ||
+                         (type == PERIPH_TYPE_ICU) ||
+                         (type == PERIPH_TYPE_XCU) ||
+                         (type == PERIPH_TYPE_TIM) )   // replicated peripheral
                     {
-                        periph_vbase_array[type] = vseg[vseg_id]->vbase & type_mask;    
-                    }
-                    else                                 // vbase already set
-                    {
-                        // checking mask bits 
-                        if( (vseg[vseg_id]->vbase & type_mask) != 
-                            (periph_vbase_array[type]) )
+                        cluster_xy = (cluster[cluster_id]->x << header->y_width) +
+                                      cluster[cluster_id]->y;
+
+                        if( (vseg[vseg_id]->vbase & cluster_mask) != 
+                            (header->increment * cluster_xy) )
                         {
-                            printf("[XML ERROR] All peripherals with same type ");
-                            printf(" should share the same 8 MSB bits in base address\n");
+                            printf("[XML ERROR] All replicated peripherals "
+                                   "must have cluster bits = cluster_xy * increment\n");
+                            printf("periph index = %d / periph type = %d / vbase = %x\n",
+                                    periph_id, type, vseg[vseg_id]->vbase);
+                            exit(1);
+                        }
+                        else if ( periph_vbase_array[type] == 0xFFFFFFFF ) // vbase not set
+                        {
+                            periph_vbase_array[type] = vseg[vseg_id]->vbase & type_mask;    
+                        }
+                        else if ((vseg[vseg_id]->vbase & type_mask) != (periph_vbase_array[type]))
+                        {
+                            printf("[XML ERROR] All peripherals with same type"
+                                   " should share the same 8 MSB bits in vbase address\n");
                             printf("periph index = %d / periph type = %d / vbase = %x\n",
                                     periph_id, type, vseg[vseg_id]->vbase);
@@ -333,26 +367,20 @@
                         }
                     }
-   
-                    // checking cluster bits for all replicated peripherals
-                    if ( (type == PERIPH_TYPE_DMA) ||
-                         (type == PERIPH_TYPE_MMC) ||
-                         (type == PERIPH_TYPE_ICU) ||
-                         (type == PERIPH_TYPE_XCU) ||
-                         (type == PERIPH_TYPE_TIM) ) 
+                    else                               // non replicated peripheral
                     {
-                        cluster_id = pseg[pseg_id]->clusterid;
-                        cluster_xy = (cluster[cluster_id]->x << header->y_width) +
-                                      cluster[cluster_id]->y;
-
-                        if( (vseg[vseg_id]->vbase & cluster_mask) != 
-                            (header->increment * cluster_xy) )
+                        if ( (cluster[cluster_id]->x == header->x_io) &&  
+                             (cluster[cluster_id]->y == header->y_io) )   
                         {
-                            printf("[XML ERROR] All replicated peripherals ");
-                            printf("must have cluster bits = cluster_id * increment");
-                            printf("periph index = %d / periph type = %d / vbase = %x\n",
-                                    periph_id, type, vseg[vseg_id]->vbase);
+                            periph_vbase_array[type] = vseg[vseg_id]->vbase;    
+                        }
+                        else
+                        {
+                            printf("[XML ERROR] Non replicated peripherals must be in cluster_io\n");
+                            printf(" periph index = %d / periph type = %d / vbase = %x"
+                                   " / pseg index = %d / cluster index = %d\n",
+                                    periph_id, type, vseg[vseg_id]->vbase, pseg_id, cluster_id);
                             exit(1);
                         }
-                    } 
+                    }
                 }
             }
@@ -428,4 +456,81 @@
 }
 
+///////////////////////////////////////////////////////////
+unsigned int alignTo( unsigned int value, unsigned int pow2 )
+{
+    unsigned int mask = (1 << pow2) - 1;
+    return ( (value + mask) & ~mask);
+}
+
+////////////////////
+void setVsegLength()
+{
+    // for a given vseg identified vseg_index 
+    // scan all contained vobjs to compute the vseg lenth
+
+    unsigned int vobj_id;
+    unsigned int cur_length = 0;
+
+    unsigned int first = vseg[vseg_index]->vobj_offset;
+    unsigned int last  = first + vseg[vseg_index]->vobjs;
+
+    for ( vobj_id = first ; vobj_id < last ; vobj_id++ ) 
+    {
+        if (vobj[vobj_id]->align)
+        {
+            cur_length = alignTo( cur_length, vobj[vobj_id]->align );
+        }
+        cur_length += vobj[vobj_id]->length;
+    }
+    vseg[vseg_index]->length = alignTo( cur_length, 12 );
+}
+
+///////////////////////
+void checkVsegOverlap()
+{
+    // for a given vseg identified by vseg_index, 
+    // check overlap with all vsegs in same vspace,
+    // and check overlap with all global vsegs.
+
+    unsigned int vseg_id;
+    unsigned int prev_vbase;                          // previous vseg vbase
+    unsigned int prev_length;                         // previous vseg length
+
+    unsigned int vbase  = vseg[vseg_index]->vbase;    // new vseg vbase
+    unsigned int length = vseg[vseg_index]->length;   // new vseg length
+  
+    // checking overlap with other vsegs in same vspace
+    if ( header->vspaces > 0 )
+    {
+        unsigned int first = vspace[vspace_index]->vseg_offset;   
+        unsigned int last  = vseg_index;
+    
+        for( vseg_id = first ; vseg_id < last ; vseg_id++ )
+        {
+            prev_vbase  = vseg[vseg_id]->vbase;
+            prev_length = vseg[vseg_id]->length;
+            if ( ((vbase + length) > prev_vbase) && ((prev_vbase + prev_length) > vbase) )
+            { 
+                printf("[XML ERROR] vseg %s in vspace %s overlaps other vseg %s\n",
+                vseg[vseg_index]->name, vspace[vspace_index]->name, vseg[vseg_id]->name );
+                exit(1);
+            }
+        }
+    }
+
+    // checking overlap with existing global vsegs
+    for ( vseg_id = 0 ; vseg_id < header->globals ; vseg_id++ )
+    {
+        prev_vbase  = vseg[vseg_id]->vbase;
+        prev_length = vseg[vseg_id]->length;
+        if ( ((vbase + length) > prev_vbase) && ((prev_vbase + prev_length) > vbase) )
+        { 
+            printf("[XML ERROR] vseg %s in vspace %s overlaps global vseg %s\n",
+            vseg[vseg_index]->name, vspace[vspace_index]->name, vseg[vseg_id]->name );
+            exit(1);
+        }
+    }
+}
+
 //////////////////////////////////////
 void taskNode(xmlTextReaderPtr reader) 
@@ -466,15 +571,12 @@
     }
 
-    ///////// get x coordinate 
+    ///////// get trdid attribute (optional)
     task[task_index]->trdid = getIntValue(reader, "trdid", &ok);
 #if XML_PARSER_DEBUG
-printf("      x         = %d\n", x);
+printf("      trdid     = %d\n", x);
 #endif
     if ( !ok ) 
     {
         task[task_index]->trdid = task_loc_index;
-        printf("[XML WARNING] missing trdid (thread index) attribute "
-               "for task in vspace %d. Using value %d\n"
-               , vspace_index, task_loc_index);
     }  
 
@@ -720,7 +822,8 @@
     ////////// get length attribute 
     value = getIntValue(reader, "length", &ok);
-    if (ok) {
-#if XML_PARSER_DEBUG
-printf("        length = %d\n", value);
+    if (ok) 
+    {
+#if XML_PARSER_DEBUG
+printf("        length = %x\n", value);
 #endif
         vobj[vobj_index]->length = value;
@@ -734,5 +837,6 @@
     ////////// get align attribute (optional : 0 if missing)
     value = getIntValue(reader, "align", &ok);
-    if (ok) {
+    if (ok) 
+    {
 #if XML_PARSER_DEBUG
 printf("        align = %d\n", value);
@@ -740,5 +844,6 @@
         vobj[vobj_index]->align = value;
     }  
-    else {
+    else 
+    {
         vobj[vobj_index]->align = 0;
     }
@@ -746,5 +851,6 @@
     ////////// get binpath attribute (optional : '\0' if missing)
     str = getStringValue(reader, "binpath", &ok);
-    if (ok) {
+    if (ok) 
+    {
 #if XML_PARSER_DEBUG
 printf("        binpath = %s\n", str);
@@ -958,4 +1064,6 @@
         {
             vseg[vseg_index]->vobjs = vobj_count;
+            setVsegLength();
+            checkVsegOverlap();
             vseg_index++;
             vseg_loc_index++;
@@ -984,11 +1092,4 @@
     if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
 
-    // checking source file consistency
-    if (vspace_index >= header->vspaces) {
-        printf("[XML ERROR] The vspace index is too large : %d\n", 
-                vspace_index);
-        exit(1);
-    }
-
 #if XML_PARSER_DEBUG
 printf("\n  vspace %d\n", vspace_index);
@@ -996,4 +1097,5 @@
 
     vspace[vspace_index] = (mapping_vspace_t *) malloc(sizeof(mapping_vspace_t));
+    header->vspaces      = header->vspaces + 1;
 
     ////////// get name attribute
@@ -1036,5 +1138,6 @@
 
     int status = xmlTextReaderRead(reader);
-    while (status == 1) {
+    while (status == 1) 
+    {
         const char * tag = (const char *) xmlTextReaderConstName(reader);
 
@@ -1050,5 +1153,6 @@
         else if (strcmp(tag, "#text")    == 0) { }
         else if (strcmp(tag, "#comment") == 0) { }
-        else if (strcmp(tag, "vspace")   == 0) {
+        else if (strcmp(tag, "vspace")   == 0) 
+        {
             vspace[vspace_index]->vobjs = vobj_loc_index; 
             vspace[vspace_index]->tasks = task_loc_index ;
@@ -1099,4 +1203,196 @@
 } // end vspaceNode()
 
+/////////////////////////////////////
+void irqNode(xmlTextReaderPtr reader) 
+{
+    unsigned int ok;
+    unsigned int value;
+    char * str;
+
+    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
+
+    if (irq_index >= MAX_IRQS) 
+    {
+        printf("[XML ERROR] The number of irqs is larger than %d\n", MAX_IRQS);
+    }
+
+#if XML_PARSER_DEBUG
+printf("      irq %d\n", irq_loc_index);
+#endif
+
+    irq[irq_index] = (mapping_irq_t *) malloc(sizeof(mapping_irq_t));
+
+    ///////// get srctype attribute
+    str = getStringValue(reader, "srctype", &ok);
+    if (ok) 
+    {
+#if XML_PARSER_DEBUG
+printf("        srctype = %s\n", str);
+#endif
+        if      ( strcmp(str, "HWI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_HWI;
+        else if ( strcmp(str, "WTI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_WTI;
+        else if ( strcmp(str, "PTI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_PTI;
+        else    
+        {
+            printf("[XML ERROR] illegal IRQ <srctype> for periph %d in cluster %d\n",
+                    cluster_index, periph_loc_index);
+            exit(1);
+        }
+    }
+    else 
+    {
+        printf("[XML ERROR] missing IRQ <srctype> for periph %d in cluster %d\n",
+                cluster_index, periph_loc_index);
+        exit(1);
+    }
+
+    ///////// get srcid attribute
+    value = getIntValue(reader, "srcid", &ok);
+    if (ok) 
+    {
+#if XML_PARSER_DEBUG
+printf("        srcid   = %d\n", value);
+#endif
+        irq[irq_index]->srcid = value;
+        if (value >= 32) 
+        {
+            printf("[XML ERROR] IRQ <srcid> too large for periph %d in cluster %d\n",
+                    cluster_index, periph_loc_index);
+            exit(1);
+        }
+    }
+    else 
+    {
+        printf("[XML ERROR] missing IRQ <icuid> for periph %d in cluster %d\n",
+                cluster_index, periph_loc_index);
+        exit(1);
+    }
+
+    ///////// get isr attribute
+    str = getStringValue(reader, "isr", &ok);
+    if (ok) 
+    {
+#if XML_PARSER_DEBUG
+printf("        isr     = %s\n", str);
+#endif
+        if      (strcmp(str, "ISR_TICK"   ) == 0)  irq[irq_index]->isr = ISR_TICK;
+        else if (strcmp(str, "ISR_BDV"    ) == 0)  irq[irq_index]->isr = ISR_BDV;
+        else if (strcmp(str, "ISR_CMA"    ) == 0)  irq[irq_index]->isr = ISR_CMA;
+        else if (strcmp(str, "ISR_TTY_RX" ) == 0)  irq[irq_index]->isr = ISR_TTY_RX;
+        else if (strcmp(str, "ISR_TTY_TX" ) == 0)  irq[irq_index]->isr = ISR_TTY_TX;
+        else if (strcmp(str, "ISR_TIMER"  ) == 0)  irq[irq_index]->isr = ISR_TIMER;
+        else if (strcmp(str, "ISR_WAKUP"  ) == 0)  irq[irq_index]->isr = ISR_WAKUP;
+        else if (strcmp(str, "ISR_NIC_RX" ) == 0)  irq[irq_index]->isr = ISR_NIC_RX;
+        else if (strcmp(str, "ISR_NIC_TX" ) == 0)  irq[irq_index]->isr = ISR_NIC_TX;
+        else if (strcmp(str, "ISR_DEFAULT") == 0)  irq[irq_index]->isr = ISR_DEFAULT;
+        else 
+        {
+            printf("[XML ERROR] illegal IRQ <isr> for periph %d in cluster %d\n",
+                    cluster_index, periph_loc_index);
+            exit(1);
+        }
+    }  
+    else 
+    {
+        printf("[XML ERROR] missing IRQ <isr> for periph %d in cluster %d\n",
+                cluster_index, periph_loc_index);
+        exit(1);
+    }
+
+    ///////// get channel attribute (optionnal : 0 if missing)
+    value = getIntValue(reader, "channel", &ok);
+    if (ok) 
+    {
+#if XML_PARSER_DEBUG
+printf("        channel = %d\n", value);
+#endif
+        irq[irq_index]->channel = value;
+    }
+    else 
+    {
+        irq[irq_index]->channel = 0;
+    }
+
+    ///////// get dstx attribute
+    value = getIntValue(reader, "dstx", &ok);
+    if (ok) 
+    {
+#if XML_PARSER_DEBUG
+printf("        dstx    = %d\n", value);
+#endif
+
+        if ( value < header->x_size )
+        {
+            irq[irq_index]->dstx = value;
+        }
+        else
+        {
+            printf("[XML ERROR] IRQ <dstx> too large for periph %d in cluster %d\n",
+                    cluster_index, periph_loc_index);
+            exit(1);
+        }
+    }
+    else 
+    {
+        printf("[XML ERROR] missing IRQ <dstx> for periph %d in cluster %d\n",
+                cluster_index, periph_loc_index);
+        exit(1);
+    }
+
+    ///////// get dsty attribute
+    value = getIntValue(reader, "dsty", &ok);
+    if (ok) 
+    {
+#if XML_PARSER_DEBUG
+printf("        dsty    = %d\n", value);
+#endif
+
+        if ( value < header->y_size )
+        {
+            irq[irq_index]->dsty = value;
+        }
+        else
+        {
+            printf("[XML ERROR] IRQ <dsty> too large for periph %d in cluster %d\n",
+                    cluster_index, periph_loc_index);
+            exit(1);
+        }
+    }
+    else 
+    {
+        printf("[XML ERROR] missing IRQ <dsty> for periph %d in cluster %d\n",
+                cluster_index, periph_loc_index);
+        exit(1);
+    }
+
+    ///////// get dstid attribute
+    value = getIntValue(reader, "dstid", &ok);
+    if (ok) 
+    {
+#if XML_PARSER_DEBUG
+printf("        dstid   = %d\n", value);
+#endif
+        irq[irq_index]->dstid = value;
+        if (value >= 32) 
+        {
+            printf("[XML ERROR] IRQ <dstid> too large for periph %d in cluster %d\n",
+                    cluster_index, periph_loc_index);
+            exit(1);
+        }
+    }
+    else 
+    {
+        printf("[XML ERROR] missing IRQ <dstid> for periph %d in cluster %d\n",
+                cluster_index, periph_loc_index);
+        exit(1);
+    }
+
+    irq_index++;
+    irq_loc_index++;
+
+} // end irqNode
+
+
+
 ////////////////////////////////////////
 void cpPortNode(xmlTextReaderPtr reader) 
@@ -1115,5 +1411,5 @@
 
 #if XML_PARSER_DEBUG
-    printf("\n  port %d\n", cp_port_index);
+printf("\n  port %d\n", cp_port_index);
 #endif
 
@@ -1126,5 +1422,5 @@
     {
 #if XML_PARSER_DEBUG
-        printf("      direction = %s\n", str);
+printf("      direction = %s\n", str);
 #endif
         if (strcmp(str, "TO_COPROC")   ==  0) 
@@ -1153,5 +1449,5 @@
     str = getStringValue(reader, "vspacename", &ok);
 #if XML_PARSER_DEBUG
-    printf("      vspacename = %s\n", str);
+printf("      vspacename = %s\n", str);
 #endif
     if (ok) 
@@ -1169,5 +1465,5 @@
     str = getStringValue(reader, "vobjname", &ok);
 #if XML_PARSER_DEBUG
-    printf("      vobjname = %s\n", str);
+printf("      vobjname = %s\n", str);
 #endif
     if (ok) 
@@ -1192,4 +1488,6 @@
     unsigned int ok;
 
+    irq_loc_index = 0;
+
     if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
 
@@ -1201,5 +1499,5 @@
 
 #if XML_PARSER_DEBUG
-    printf("\n  periph %d\n", periph_index);
+printf("\n    periph %d\n", periph_index);
 #endif
 
@@ -1211,5 +1509,5 @@
     {
 #if XML_PARSER_DEBUG
-        printf("      channels = %d\n", value);
+printf("      channels    = %d\n", value);
 #endif
         periph[periph_index]->channels = value;
@@ -1234,7 +1532,7 @@
     {
 #if XML_PARSER_DEBUG
-        printf("      clusterid = %d\n", cluster_index);
-        printf("      psegname  = %s\n", str);
-        printf("      psegid    = %d\n", index);
+printf("      clusterid   = %d\n", cluster_index);
+printf("      psegname    = %s\n", str);
+printf("      psegid      = %d\n", index);
 #endif
         periph[periph_index]->psegid = index;
@@ -1252,5 +1550,5 @@
     {
 #if XML_PARSER_DEBUG
-        printf("      type      = %s\n", str);
+printf("      type        = %s\n", str);
 #endif
         unsigned int error = 0;
@@ -1260,6 +1558,5 @@
 
         // The CMA, FBF, HBA, IOB, IOC, NIC, ROM, SIM, TTY, peripherals are not 
-        // replicated in all clusters but can be replicated in two clusters (fault tolerance)
-        // In case of replication, the two copies must have same number of channels.
+        // replicated in all clusters but can be instanciated twice. 
 
         ////////////////////////////
@@ -1267,19 +1564,8 @@
         {
             periph[periph_index]->type = PERIPH_TYPE_CMA;
-            if (header->cma_cluster == 0xFFFFFFFF)  
+            if ( cma_channels < periph[periph_index]->channels )
             {
-                header->cma_cluster = cluster_index;
                 cma_channels = periph[periph_index]->channels;
             }
-            else if (header->cma_cluster_bis == 0xFFFFFFFF) 
-            {
-                header->cma_cluster_bis = cluster_index;
-                assert( (cma_channels == periph[periph_index]->channels) &&
-                "[XML ERROR] unconsistent non replicated peripheral");
-            }
-            else  
-            {
-                error = 1;
-            }
         }
         /////////////////////////////////
@@ -1287,16 +1573,4 @@
         {
             periph[periph_index]->type = PERIPH_TYPE_FBF;
-            if (header->fbf_cluster == 0xFFFFFFFF)  
-            {
-                header->fbf_cluster = cluster_index; 
-            }
-            else if (header->fbf_cluster_bis == 0xFFFFFFFF) 
-            {
-                header->fbf_cluster_bis = cluster_index; 
-            }
-            else  
-            {
-                error = 1;
-            }
         }
         /////////////////////////////////
@@ -1305,69 +1579,35 @@
             periph[periph_index]->type = PERIPH_TYPE_IOB;
             use_iob = 1;
-            if (header->iob_cluster == 0xFFFFFFFF)  
-            {
-                header->iob_cluster = cluster_index; 
-            }
-            else if (header->iob_cluster_bis == 0xFFFFFFFF) 
-            {
-                header->iob_cluster_bis = cluster_index; 
-            }
-            else  
-            {
-                error = 1;
-            }
         }
         /////////////////////////////////
         else if (strcmp(str, "IOC") == 0) 
         {
-            periph[periph_index]->type = PERIPH_TYPE_IOC;
-            if (header->ioc_cluster == 0xFFFFFFFF)
-            {
-                header->ioc_cluster  = cluster_index; 
-            }
-            else if (header->ioc_cluster_bis == 0xFFFFFFFF) 
-            {
-                header->ioc_cluster_bis = cluster_index;
-            }
-            else
-            {
-                printf("[XML ERROR] At most two copies for non replicated "
-                        "peripheral\n");
-                exit(1);
-            }
-
-            str = getStringValue(reader, "subtype", &ok);
-    
+            char* subtype = getStringValue(reader, "subtype", &ok);
             if (!ok)
             {
-                printf("[XML ERROR] IOC peripheral needs a subtype parameter: "
-                       "BDV, HBA or SPI\n");
+                printf("[XML ERROR] IOC peripheral needs a subtype: BDV, HBA or SPI\n");
                 exit(1);
             } 
 
-            if (strcmp(str, "BDV") == 0)
-            { 
+            if ( strcmp(subtype, "BDV") == 0 )
+            {
+                periph[periph_index]->type    = PERIPH_TYPE_IOC;
                 periph[periph_index]->subtype = PERIPH_SUBTYPE_BDV;
-                use_bdv = 1;
+                ioc_channels = 1;
+                if ( header->use_ramdisk == 0 ) use_bdv = 1;
             }
-            else if (strcmp(str, "HBA") == 0)
+            else if ( strcmp(subtype, "HBA") == 0 )
             {
+                periph[periph_index]->type    = PERIPH_TYPE_IOC;
                 periph[periph_index]->subtype = PERIPH_SUBTYPE_HBA;
-
-                if (use_hba == 0)
-                {
-                    use_hba      = 1;
-                    hba_channels = periph[periph_index]->channels;
-                }
-                else
-                {
-                    assert( (hba_channels == periph[periph_index]->channels) &&
-                    "[XML ERROR] unconsistent non replicated peripheral");
-                }
+                ioc_channels = periph[periph_index]->channels;
+                if ( header->use_ramdisk == 0 ) use_hba = 1;
             }
-            else if (strcmp(str, "SPI") == 0)
+            else if ( strcmp(subtype, "SPI") == 0 )
             {
+                periph[periph_index]->type    = PERIPH_TYPE_IOC;
                 periph[periph_index]->subtype = PERIPH_SUBTYPE_SPI;
-                use_spi = 1;
+                ioc_channels = periph[periph_index]->channels;
+                if ( header->use_ramdisk == 0 ) use_spi = 1;
             }
             else
@@ -1381,19 +1621,8 @@
         {
             periph[periph_index]->type = PERIPH_TYPE_NIC;
-            if (header->nic_cluster == 0xFFFFFFFF)  
+            if ( nic_channels < periph[periph_index]->channels )
             {
-                header->nic_cluster = cluster_index;
                 nic_channels = periph[periph_index]->channels;
             }
-            else if (header->nic_cluster_bis == 0xFFFFFFFF) 
-            {
-                header->nic_cluster_bis = cluster_index;
-                assert( (nic_channels == periph[periph_index]->channels) &&
-                "[XML ERROR] unconsistent non replicated peripheral");
-            }
-            else  
-            {
-                error = 1;
-            }
         }
         /////////////////////////////////
@@ -1401,16 +1630,4 @@
         {
             periph[periph_index]->type = PERIPH_TYPE_ROM;
-            if (header->rom_cluster == 0xFFFFFFFF)
-            {
-                header->rom_cluster  = cluster_index; 
-            }
-            else if (header->rom_cluster_bis == 0xFFFFFFFF) 
-            {
-                header->rom_cluster_bis = cluster_index;
-            }
-            else
-            {
-                error = 1;
-            }
         } 
         /////////////////////////////////
@@ -1418,16 +1635,4 @@
         {
             periph[periph_index]->type = PERIPH_TYPE_SIM;
-            if (header->sim_cluster == 0xFFFFFFFF)
-            {
-                header->sim_cluster  = cluster_index; 
-            }
-            else if (header->sim_cluster_bis == 0xFFFFFFFF) 
-            {
-                header->sim_cluster_bis = cluster_index;
-            }
-            else
-            {
-                error = 1;
-            }
         } 
         /////////////////////////////////
@@ -1435,23 +1640,23 @@
         {
             periph[periph_index]->type = PERIPH_TYPE_TTY;
-            if (header->tty_cluster == 0xFFFFFFFF) 
+            if ( tty_channels < periph[periph_index]->channels )
             {
-                header->tty_cluster = cluster_index;
                 tty_channels = periph[periph_index]->channels;
             }
-            else if (header->tty_cluster_bis == 0xFFFFFFFF) 
+        }
+        /////////////////////////////////
+        else if (strcmp(str, "PIC") == 0) 
+        {
+            periph[periph_index]->type = PERIPH_TYPE_PIC;
+            if ( pic_channels < periph[periph_index]->channels )
             {
-                header->tty_cluster_bis = cluster_index;
-                assert( (tty_channels == periph[periph_index]->channels) &&
-                "[XML ERROR] unconsistent non replicated peripheral");
+                pic_channels = periph[periph_index]->channels;
             }
-            else  
-            {
-                error = 1;
-            }
-        }
+            use_pic = 1;
+        }
+
 
         // The DMA, ICU, MMC, TIM, XCU peripherals can be replicated in all clusters
-        // but it must exist only one component of each type per cluster
+        // but no more than one component of each type per cluster
 
         /////////////////////////////////
@@ -1471,14 +1676,13 @@
             found_icu = 1;
 
-            if (icu_channels > 0) 
+            if ( periph[periph_index]->channels < 
+                 (header->irq_per_proc * cluster[cluster_index]->procs) )
             {
-                assert( (periph[periph_index]->channels == icu_channels) &&
-                        "[XML ERROR] the number of interruptions per processor "
-                        "from the ICU (icu channels) must be the same on all "
-                        "clusters");
-            }
-            else
-            {
-                icu_channels = periph[periph_index]->channels;
+                printf("[XML ERROR] ICU channels smaller than PROCS * IRQ_PER_PROC\n");
+                printf(" - icu channels = %d\n - nprocs = %d\n - irq_per_proc = %d\n",
+                       periph[periph_index]->channels, 
+                       cluster[cluster_index]->procs, 
+                       header->irq_per_proc );
+                exit(1);
             }
         }
@@ -1498,7 +1702,5 @@
             found_timer = 1;
             if (tim_channels < periph[periph_index]->channels) 
-            {
                 tim_channels = periph[periph_index]->channels;
-            }
         }
         //////////////////////////////////
@@ -1512,41 +1714,87 @@
             use_xcu      = 1;
 
-            if (icu_channels > 0) 
+            if ( periph[periph_index]->channels < 
+                 (header->irq_per_proc * cluster[cluster_index]->procs) )
             {
-                assert( (periph[periph_index]->channels == icu_channels) &&
-                        "[XML ERROR] the number of interruptions per processor "
-                        "from the ICU (icu channels) must be the same on all "
-                        "clusters");
+                printf("[XML ERROR] XCU channels smaller than PROCS * IRQ_PER_PROC\n");
+                printf(" - xcu channels = %d\n - nprocs = %d\n - irq_per_proc = %d\n",
+                       periph[periph_index]->channels, 
+                       cluster[cluster_index]->procs, 
+                       header->irq_per_proc );
+                exit(1);
+            }
+        }
+        else 
+        {
+            printf("[XML ERROR] illegal peripheral type: %s in cluster %d\n",
+                    str, cluster_index);
+            exit(1);
+        }
+
+        if (error) 
+        {
+            printf("[XML ERROR] illegal peripheral %s in cluster %d\n",
+                    str, cluster_index);
+            exit(1);
+        }
+    }
+    else 
+    {
+        printf("[XML ERROR] illegal or missing <type> for peripheral  %d in cluster %d\n",
+                periph_loc_index, cluster_index);
+        exit(1);
+    }
+
+    ////////////// set irq_offset attribute
+    periph[periph_index]->irq_offset = irq_index;
+
+#if XML_PARSER_DEBUG
+printf("      irq_offset  = %d\n", irq_index );
+#endif
+
+    ///////////// get IRQs
+    int status = xmlTextReaderRead(reader);
+    while (status == 1) 
+    {
+        const char * tag = (const char *) xmlTextReaderConstName(reader);
+
+        if (strcmp(tag, "irq") == 0) 
+        {
+            if ( (periph[periph_index]->type != PERIPH_TYPE_ICU) &&
+                 (periph[periph_index]->type != PERIPH_TYPE_XCU) &&
+                 (periph[periph_index]->type != PERIPH_TYPE_PIC) )
+            {
+                printf("[XML ERROR] periph %d in cluster(%d,%d) "
+                       " only ICU, XCU and PIC can contain IRQs",
+                periph_loc_index, cluster[cluster_index]->x, cluster[cluster_index]->y);
+                exit(1);
             }
             else
             {
-                icu_channels = periph[periph_index]->channels;
+                  irqNode(reader);
             }
         }
+        else if (strcmp(tag, "#text")    == 0) { }
+        else if (strcmp(tag, "#comment") == 0) { }
+        else if (strcmp(tag, "periph")   == 0) 
+        {
+            periph[periph_index]->irqs = irq_loc_index;
+            cluster[cluster_index]->periphs++;
+            periph_loc_index++;
+            periph_index++;
+
+#if XML_PARSER_DEBUG
+printf("      irqs        = %d\n", irq_loc_index);
+printf("      irq_offset  = %d\n", irq_index);
+#endif
+            return;
+        }
         else 
         {
-            printf("[XML ERROR] illegal <type>: %s for peripheral %d in cluster %d\n",
-                    str, periph_loc_index, cluster_index);
+            printf("[XML ERROR] Unknown tag %s", tag);
             exit(1);
         }
-
-        if (error) 
-        {
-            printf("[XML ERROR] illegal <type>: %s for peripheral %d in cluster %d\n",
-                    str, periph_loc_index, cluster_index);
-            exit(1);
-        }
-    }
-    else 
-    {
-        printf("[XML ERROR] missing <type> for peripheral  %d in cluster %d\n",
-                periph_loc_index, cluster_index);
-        exit(1);
-    }
-
-    periph_index++;
-    periph_loc_index++;
-    cluster[cluster_index]->periphs++;
-
+        status = xmlTextReaderRead(reader);
+    }
 } // end periphNode
 
@@ -1568,5 +1816,5 @@
 
 #if XML_PARSER_DEBUG
-    printf("\n  coproc %d\n", coproc_index);
+printf("\n  coproc %d\n", coproc_index);
 #endif
 
@@ -1578,5 +1826,5 @@
     {
 #if XML_PARSER_DEBUG
-        printf("      name = %s\n", str);
+printf("      name = %s\n", str);
 #endif
         strncpy(coproc[coproc_index]->name, str, 31);
@@ -1603,10 +1851,11 @@
     {
 #if XML_PARSER_DEBUG
-        printf("      clusterid = %d\n", cluster_index);
-        printf("      psegname  = %s\n", str);
-        printf("      psegid    = %d\n", index);
+printf("      clusterid = %d\n", cluster_index);
+printf("      psegname  = %s\n", str);
+printf("      psegid    = %d\n", index);
 #endif
         coproc[coproc_index]->psegid = index;
-        assert(pseg[index]->type == PSEG_TYPE_PERI && "coproc psegname attribute must refer to a pseg of type PERI" );
+        assert(pseg[index]->type == PSEG_TYPE_PERI && 
+        "coproc psegname attribute must refer to a pseg of type PERI" );
     }
     else 
@@ -1621,5 +1870,5 @@
 
 #if XML_PARSER_DEBUG
-    printf("      port_offset = %d\n", cp_port_index);
+printf("      port_offset = %d\n", cp_port_index);
 #endif
 
@@ -1653,130 +1902,12 @@
 
 
-/////////////////////////////////////
-void irqNode(xmlTextReaderPtr reader) 
+//////////////////////////////////////
+void procNode(xmlTextReaderPtr reader) 
 {
     unsigned int ok;
     unsigned int value;
-    char * str;
 
     if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
 
-    if (irq_index >= MAX_IRQS) {
-        printf("[XML ERROR] The number of irqs is larger than %d\n", MAX_IRQS);
-    }
-
-#if XML_PARSER_DEBUG
-    printf("     irq %d\n", irq_loc_index);
-#endif
-
-    irq[irq_index] = (mapping_irq_t *) malloc(sizeof(mapping_irq_t));
-
-    ///////// get type attribute
-    str = getStringValue(reader, "type", &ok);
-    if (ok) 
-    {
-#if XML_PARSER_DEBUG
-        printf("        type    = %s\n", str);
-#endif
-        if      ( strcmp(str, "HARD") == 0 ) irq[irq_index]->type = IRQ_TYPE_HWI;
-        else if ( strcmp(str, "SOFT") == 0 ) irq[irq_index]->type = IRQ_TYPE_SWI;
-        else if ( strcmp(str, "TIME") == 0 ) irq[irq_index]->type = IRQ_TYPE_PTI;
-        else    
-        {
-            printf("[XML ERROR] illegal IRQ <type> for processor %d in cluster %d\n",
-                    cluster_index, proc_loc_index);
-            exit(1);
-        }
-    }
-    else 
-    {
-        printf("[XML ERROR] missing IRQ <type> for processor %d in cluster %d\n",
-                cluster_index, proc_loc_index);
-        exit(1);
-    }
-
-    ///////// get icuid attribute
-    value = getIntValue(reader, "icuid", &ok);
-    if (ok) 
-    {
-#if XML_PARSER_DEBUG
-        printf("        icuid   = %d\n", value);
-#endif
-        irq[irq_index]->icuid = value;
-        if (value >= 32) 
-        {
-            printf("[XML ERROR] IRQ <icuid> too large for processor %d in cluster %d\n",
-                    cluster_index, proc_loc_index);
-            exit(1);
-        }
-    }
-    else 
-    {
-        printf("[XML ERROR] missing IRQ <icuid> for processor %d in cluster %d\n",
-                cluster_index, proc_loc_index);
-        exit(1);
-    }
-
-    ///////// get isr attribute
-    str = getStringValue(reader, "isr", &ok);
-    if (ok) 
-    {
-#if XML_PARSER_DEBUG
-        printf("        isr     = %s\n", str);
-#endif
-        if      (strcmp(str, "ISR_SWITCH" ) == 0)  irq[irq_index]->isr = ISR_SWITCH;
-        else if (strcmp(str, "ISR_IOC"    ) == 0)  irq[irq_index]->isr = ISR_IOC;
-        else if (strcmp(str, "ISR_DMA"    ) == 0)  irq[irq_index]->isr = ISR_DMA;
-        else if (strcmp(str, "ISR_TTY"    ) == 0)  irq[irq_index]->isr = ISR_TTY;
-        else if (strcmp(str, "ISR_TIMER"  ) == 0)  irq[irq_index]->isr = ISR_TIMER;
-        else if (strcmp(str, "ISR_WAKUP"  ) == 0)  irq[irq_index]->isr = ISR_WAKUP;
-        else if (strcmp(str, "ISR_DEFAULT") == 0)  irq[irq_index]->isr = ISR_DEFAULT;
-        else 
-        {
-            printf("[XML ERROR] illegal IRQ <isr> for processor %d in cluster %d\n",
-                    cluster_index, proc_loc_index);
-            exit(1);
-        }
-#if XML_PARSER_DEBUG
-        printf("        isrnum  = %d\n", irq[irq_index]->isr);
-#endif
-    }  
-    else 
-    {
-        printf("[XML ERROR] missing IRQ <isr> for processor %d in cluster %d\n",
-                cluster_index, proc_loc_index);
-        exit(1);
-    }
-
-    ///////// get channel attribute (optionnal : 0 if missing)
-    value = getIntValue(reader, "channel", &ok);
-    if (ok) 
-    {
-#if XML_PARSER_DEBUG
-        printf("        channel = %d\n", value);
-#endif
-        irq[irq_index]->channel = value;
-    }
-    else 
-    {
-        irq[irq_index]->channel = 0;
-    }
-
-    irq_index++;
-    irq_loc_index++;
-
-} // end irqNode
-
-
-//////////////////////////////////////
-void procNode(xmlTextReaderPtr reader) 
-{
-    unsigned int ok;
-    unsigned int value;
-
-    irq_loc_index = 0;
-
-    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
-
     if (proc_index >= MAX_PROCS) 
     {
@@ -1786,5 +1917,5 @@
 
 #if XML_PARSER_DEBUG
-    printf("\n  proc %d\n", proc_index);
+printf("\n    proc %d\n", proc_index);
 #endif
 
@@ -1799,38 +1930,9 @@
         exit(1);
     }
-
-    ////////// set irq_offset attribute
-    proc[proc_index]->irq_offset = irq_index;
-
-#if XML_PARSER_DEBUG
-    printf("    irq_offset = %d\n", irq_index);
-#endif
-
-    int status = xmlTextReaderRead(reader);
-    while (status == 1) 
-    {
-        const char * tag = (const char *) xmlTextReaderConstName(reader);
-
-        if (strcmp(tag, "irq") == 0) 
-        {
-            irqNode(reader);
-        }
-        else if (strcmp(tag, "#text")    == 0) { }
-        else if (strcmp(tag, "#comment") == 0) { }
-        else if (strcmp(tag, "proc")     == 0) 
-        {
-            proc[proc_index]->irqs = irq_loc_index;
-            cluster[cluster_index]->procs++;
-            proc_loc_index++;
-            proc_index++;
-            return;
-        }
-        else 
-        {
-            printf("[XML ERROR] Unknown tag %s", tag);
-            exit(1);
-        }
-        status = xmlTextReaderRead(reader);
-    }
+    proc[proc_index]->index = proc_loc_index;
+
+    cluster[cluster_index]->procs++;
+    proc_loc_index++;
+    proc_index++;
 } // end procNode()
 
@@ -1852,5 +1954,5 @@
 
 #if XML_PARSER_DEBUG
-    printf("    pseg %d\n", pseg_index);
+printf("    pseg %d\n", pseg_index);
 #endif
 
@@ -1860,5 +1962,5 @@
     str = getStringValue(reader, "name", &ok);
 #if XML_PARSER_DEBUG
-    printf("      name = %s\n", str);
+printf("      name = %s\n", str);
 #endif
     if (ok) 
@@ -1876,5 +1978,5 @@
     str = getStringValue(reader, "type", &ok);
 #if XML_PARSER_DEBUG
-    printf("      type = %s\n", str);
+printf("      type = %s\n", str);
 #endif
     if      (ok && (strcmp(str, "RAM" ) == 0)) { pseg[pseg_index]->type = PSEG_TYPE_RAM; }
@@ -1891,5 +1993,5 @@
     ll_value = getPaddrValue(reader, "base", &ok);
 #if XML_PARSER_DEBUG
-    printf("      base = 0x%llx\n", ll_value);
+printf("      base = 0x%llx\n", ll_value);
 #endif
     if (ok) 
@@ -1906,5 +2008,5 @@
     ll_value = getPaddrValue(reader, "length", &ok);
 #if XML_PARSER_DEBUG
-    printf("      length = 0x%llx\n", ll_value);
+printf("      length = 0x%llx\n", ll_value);
 #endif
     if (ok) 
@@ -1956,7 +2058,5 @@
     found_mmc   = 0;
 
-    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) {
-        return;
-    }
+    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT)  return;
 
 #if XML_PARSER_DEBUG
@@ -2024,7 +2124,7 @@
         else if (strcmp(tag, "cluster")  == 0) 
         {
-
-            ///////// TIMER and ICU peripheral are mandatory //////////////
-            if (!found_timer && !found_xcu)
+            ///////// TIMER and ICU peripheral are mandatory when nprocs != 0
+            unsigned int procs = cluster[cluster_index]->procs;
+            if ( procs && !found_timer && !found_xcu)
             {
                 printf("[XML ERROR] missing timer peripheral in cluster %d\n", cluster_index);
@@ -2032,5 +2132,5 @@
             }
 
-            if (!found_icu && !found_xcu) 
+            if ( procs && !found_icu && !found_xcu) 
             {
                 printf("[XML ERROR] missing icu peripheral in cluster %d\n", cluster_index);
@@ -2038,8 +2138,5 @@
             }
 
-            if (nb_proc_max < cluster[cluster_index]->procs) 
-            {
-                nb_proc_max = cluster[cluster_index]->procs;
-            }
+            if (nb_procs_max < procs) nb_procs_max = procs;
 
 #if XML_PARSER_DEBUG
@@ -2077,5 +2174,5 @@
         else if (strcmp(tag, "clusterset") == 0) 
         {
-            // checking source file consistency
+            // checking number of clusters
             if ( cluster_index != (header->x_size * header->y_size) ) 
             {
@@ -2084,16 +2181,15 @@
             }
 
-            // At least one TTY terminal for system boot
-            if (header->tty_cluster == 0xFFFFFFFF) 
+            // checking TTY terminal for system boot
+            if ( tty_channels == 0 )
             {
-                printf("[XML ERROR] illegal or missing tty peripheral");
+                printf("[XML ERROR] missing TTY peripheral\n");
                 exit(1);
             }
 
-            // the number of ICU channels must be NB_PROCS * irq_per_proc
-            if (icu_channels != (header->irq_per_proc * proc_loc_index))
+            // checking IOC sub-types
+            if ( (use_bdv + use_hba + use_spi) > 1 )
             {
-                printf("[XML ERROR] illegal ICU number of channels. "
-                       "It must be equal to NB_PROCS * IRQ_PER_PROC\n");
+                printf("[XML ERROR] all IOC peripherals must have the same type\n");
                 exit(1);
             }
@@ -2134,5 +2230,9 @@
         const char * tag = (const char *) xmlTextReaderConstName(reader);
 
-        if      (strcmp(tag, "vseg")      == 0) { vsegNode(reader); }
+        if      (strcmp(tag, "vseg")      == 0) 
+        { 
+            vsegNode( reader ); 
+            header->globals = header->globals + 1;
+        }
         else if (strcmp(tag, "#text")     == 0) { }
         else if (strcmp(tag, "#comment")  == 0) { }
@@ -2142,5 +2242,4 @@
             printf("  end global set\n\n");
 #endif
-            header->globals = vseg_index;
             vseg_loc_index = 0;
             return;
@@ -2178,17 +2277,8 @@
         else if (strcmp(tag, "vspaceset") == 0 ) 
         {
-            // checking source file consistency
-            if (vspace_index != header->vspaces) 
-            {
-                printf("[XML ERROR] Wrong number of vspaces\n");
-                exit(1);
-            }
-            else 
-            {
-                header->vsegs = vseg_index;
-                header->vobjs = vobj_index;
-                header->tasks = task_index;
-                return;
-            }
+            header->vsegs = vseg_index;
+            header->vobjs = vobj_index;
+            header->tasks = task_index;
+            return;
         }
         else 
@@ -2282,5 +2372,35 @@
     }
 
-    //check the number of cluster
+    /////////// get x_io attribute
+    unsigned int x_io = getIntValue(reader, "x_io", &ok);
+#if XML_PARSER_DEBUG
+        printf("  x_io      = %d\n", x_io);
+#endif
+    if ( ok && (x_io < x_size) ) 
+    {
+        header->x_io = x_io;
+    }
+    else 
+    {
+        printf("[XML ERROR] illegal or missing <x_io> attribute in header\n");
+        exit(1);
+    }
+
+    /////////// get y_io attribute
+    unsigned int y_io = getIntValue(reader, "y_io", &ok);
+#if XML_PARSER_DEBUG
+        printf("  y_io      = %d\n", y_size);
+#endif
+    if ( ok &&(y_io < y_size) ) 
+    {
+        header->y_io = y_io;
+    }
+    else 
+    {
+        printf("[XML ERROR] illegal or missing <y_io> attribute in header\n");
+        exit(1);
+    }
+
+    // check the number of cluster
     if ( (x_size * y_size) >= MAX_CLUSTERS )
     {
@@ -2289,48 +2409,5 @@
     }
 
-    ///////// get vspaces attribute
-    value = getIntValue(reader, "vspaces", &ok);
-    if (ok) 
-    {
-        if (value >= MAX_VSPACES) 
-        {
-            printf("[XML ERROR] The number of vspaces is larger than %d\n", MAX_VSPACES);
-            exit(1);
-        }
-#if XML_PARSER_DEBUG
-        printf("  vspaces = %d\n", value);
-#endif
-        header->vspaces  = value;
-    }
-    else 
-    {
-        printf("[XML ERROR] illegal or missing <vspaces> attribute in mapping\n");
-        exit(1);
-    }
-
-    ///////// get increment attribute
-    value = getIntValue(reader, "increment", &ok);
-    if (ok) 
-    {
-        if ( (value != 0x10000) && (value != 0x8000) &&
-             (value != 0x4000)  && (value != 0x2000) )
-       
-        {
-            printf("[XML ERROR] The vseg increment must be one of the following: ");
-            printf(" 0x00010000 / 0x00008000 / 0x00004000 / 0x00002000");
-            exit(1);
-        }
-#if XML_PARSER_DEBUG
-        printf("  increment = %d\n", value);
-#endif
-        header->increment  = value;
-    }
-    else 
-    {
-        printf("[XML ERROR] illegal or missing <increment> attribute in mapping\n");
-        exit(1);
-    }
-
-    ///////// get increment attribute
+    ///////// get irq_per_proc attribute
     value = getIntValue(reader, "irq_per_proc", &ok);
     if (ok) 
@@ -2347,31 +2424,33 @@
     }
 
-    //////// initialise non replicated peripherals cluster index
-    header->cma_cluster     = 0xFFFFFFFF;
-    header->cma_cluster_bis = 0xFFFFFFFF;
-
-    header->fbf_cluster     = 0xFFFFFFFF;
-    header->fbf_cluster_bis = 0xFFFFFFFF;
-
-    header->iob_cluster     = 0xFFFFFFFF;
-    header->iob_cluster_bis = 0xFFFFFFFF;
-
-    header->ioc_cluster     = 0xFFFFFFFF;
-    header->ioc_cluster_bis = 0xFFFFFFFF;
-
-    header->nic_cluster     = 0xFFFFFFFF;
-    header->nic_cluster_bis = 0xFFFFFFFF;
-
-    header->rom_cluster     = 0xFFFFFFFF;
-    header->rom_cluster_bis = 0xFFFFFFFF;
-
-    header->sim_cluster     = 0xFFFFFFFF;
-    header->sim_cluster_bis = 0xFFFFFFFF;
-
-    header->tty_cluster     = 0xFFFFFFFF;
-    header->tty_cluster_bis = 0xFFFFFFFF;
-
-    ///////// set signature
+    ///////// get use_ramdisk attribute (default = 0)
+    value = getIntValue(reader, "use_ramdisk", &ok);
+    if (ok) 
+    {
+#if XML_PARSER_DEBUG
+        printf("  use_ramdisk = %d\n", value);
+#endif
+        header->use_ramdisk = value;
+    }
+    else 
+    {
+        header->use_ramdisk = 0;
+    }
+
+    ///////// set other header fields 
+    header->increment = 0x10000;
     header->signature = IN_MAPPING_SIGNATURE;
+    header->globals   = 0;
+    header->vspaces   = 0;
+    header->psegs     = 0;
+    header->vsegs     = 0;
+    header->vobjs     = 0;
+    header->tasks     = 0;
+    header->procs     = 0;
+    header->irqs      = 0;
+    header->coprocs   = 0;
+    header->cp_ports  = 0;
+    header->periphs   = 0;
+
 
     int status = xmlTextReaderRead(reader);
@@ -2380,8 +2459,5 @@
         const char * tag = (const char *) xmlTextReaderConstName(reader);
 
-        if (strcmp(tag, "clusterset") == 0) 
-        {
-            clusterSetNode(reader);
-        }
+        if      (strcmp(tag, "clusterset")   == 0) { clusterSetNode(reader); }
         else if (strcmp(tag, "globalset")    == 0) { globalSetNode(reader); }
         else if (strcmp(tag, "vspaceset")    == 0) { vspaceSetNode(reader); }
@@ -2591,8 +2667,10 @@
     def_int_write(fdout, "X_WIDTH           ", header->x_width);
     def_int_write(fdout, "Y_WIDTH           ", header->y_width);
+    def_int_write(fdout, "X_IO              ", header->x_io);
+    def_int_write(fdout, "Y_IO              ", header->y_io);
 
     file_write(fdout, "\n");
 
-    def_int_write(fdout, "NB_PROCS_MAX      ", nb_proc_max);
+    def_int_write(fdout, "NB_PROCS_MAX      ", nb_procs_max);
     def_int_write(fdout, "NB_TASKS_MAX      ", nb_tasks_max);
 
@@ -2605,5 +2683,5 @@
 
     def_int_write(fdout, "NB_TTY_CHANNELS   ", tty_channels);
-    def_int_write(fdout, "NB_HBA_CHANNELS   ", hba_channels);
+    def_int_write(fdout, "NB_IOC_CHANNELS   ", ioc_channels);
     def_int_write(fdout, "NB_NIC_CHANNELS   ", nic_channels);
     def_int_write(fdout, "NB_CMA_CHANNELS   ", cma_channels);
@@ -2613,7 +2691,12 @@
     def_int_write(fdout, "USE_XICU          ", use_xcu);
     def_int_write(fdout, "USE_IOB           ", use_iob);
-    def_int_write(fdout, "USE_HBA           ", use_hba);
-    def_int_write(fdout, "USE_BDV           ", use_bdv);
-    def_int_write(fdout, "USE_SPI           ", use_spi);
+    def_int_write(fdout, "USE_PIC           ", use_pic);
+
+    file_write(fdout, "\n");
+
+    def_int_write(fdout, "USE_IOC_RDK       ", header->use_ramdisk);
+    def_int_write(fdout, "USE_IOC_HBA       ", use_hba);
+    def_int_write(fdout, "USE_IOC_BDV       ", use_bdv);
+    def_int_write(fdout, "USE_IOC_SPI       ", use_spi);
 
     file_write(fdout, "\n");
@@ -2638,5 +2721,5 @@
 {
     int          fdout = open_file(file_path);
-    unsigned int count = 0;
+    unsigned int count;
     unsigned int vseg_id;
     unsigned int base;      // vseg base
@@ -2648,6 +2731,6 @@
     file_write(fdout, prol);
 
-    // boot and kernel segments
-    for (vseg_id = 0 ; vseg_id < header->vsegs ; vseg_id++)
+    // boot mandatory global vsegs 
+    for (vseg_id = 0 , count = 0 ; vseg_id < header->vsegs ; vseg_id++)
     {
         if ( strcmp(vseg[vseg_id]->name, "seg_boot_code") == 0 )
@@ -2691,40 +2774,9 @@
             count++;
         }
-        else if ( strcmp(vseg[vseg_id]->name, "seg_kernel_code") == 0 )
-        {
-            base = vseg[vseg_id]->vbase;
-            size = vobj[vseg[vseg_id]->vobj_offset]->length;
-            ld_write(fdout, "seg_kernel_code_base    ", base);
-            ld_write(fdout, "seg_kernel_code_size    ", size);
-            count++;
-        }
-        else if ( strcmp(vseg[vseg_id]->name, "seg_kernel_data") == 0 )
-        {
-            base = vseg[vseg_id]->vbase;
-            size = vobj[vseg[vseg_id]->vobj_offset]->length;
-            ld_write(fdout, "seg_kernel_data_base    ", base);
-            ld_write(fdout, "seg_kernel_data_size    ", size);
-            count++;
-        }
-        else if ( strcmp(vseg[vseg_id]->name, "seg_kernel_uncdata") == 0 )
-        {
-            base = vseg[vseg_id]->vbase;
-            size = vobj[vseg[vseg_id]->vobj_offset]->length;
-            ld_write(fdout, "seg_kernel_uncdata_base ", base);
-            ld_write(fdout, "seg_kernel_uncdata_size ", size);
-            count++;
-        }
-        else if ( strcmp(vseg[vseg_id]->name, "seg_kernel_init") == 0 )
-        {
-            base = vseg[vseg_id]->vbase;
-            size = vobj[vseg[vseg_id]->vobj_offset]->length;
-            ld_write(fdout, "seg_kernel_init_base    ", base);
-            ld_write(fdout, "seg_kernel_init_size    ", size);
-            count++;
-        }
-    }
-    if ( count != 9 )
+    }
+
+    if ( count != 5 )
     { 
-        printf ("[XML ERROR] Missing Boot or Kernel vseg : only %d\n", count);
+        printf ("[XML ERROR] Missing mandatory Boot global vseg : only %d\n", count);
         printf ("Mandatory segments are :\n");
         printf (" - seg_boot_code\n");
@@ -2733,10 +2785,82 @@
         printf (" - seg_boot_mapping\n");
         printf (" - seg_boot_buffer\n");
+        exit(0);
+    }
+
+    file_write(fdout, "\n");
+
+    // kernel mandatory global vsegs 
+    for (vseg_id = 0, count = 0 ; vseg_id < header->vsegs ; vseg_id++)
+    {
+        if ( strcmp(vseg[vseg_id]->name, "seg_kernel_code") == 0 )
+        {
+            base = vseg[vseg_id]->vbase;
+            size = vobj[vseg[vseg_id]->vobj_offset]->length;
+            ld_write(fdout, "seg_kernel_code_base    ", base);
+            ld_write(fdout, "seg_kernel_code_size    ", size);
+            count++;
+        }
+        else if ( strcmp(vseg[vseg_id]->name, "seg_kernel_data") == 0 )
+        {
+            base = vseg[vseg_id]->vbase;
+            size = vobj[vseg[vseg_id]->vobj_offset]->length;
+            ld_write(fdout, "seg_kernel_data_base    ", base);
+            ld_write(fdout, "seg_kernel_data_size    ", size);
+            count++;
+        }
+        else if ( strcmp(vseg[vseg_id]->name, "seg_kernel_uncdata") == 0 )
+        {
+            base = vseg[vseg_id]->vbase;
+            size = vobj[vseg[vseg_id]->vobj_offset]->length;
+            ld_write(fdout, "seg_kernel_uncdata_base ", base);
+            ld_write(fdout, "seg_kernel_uncdata_size ", size);
+            count++;
+        }
+        else if ( strcmp(vseg[vseg_id]->name, "seg_kernel_init") == 0 )
+        {
+            base = vseg[vseg_id]->vbase;
+            size = vobj[vseg[vseg_id]->vobj_offset]->length;
+            ld_write(fdout, "seg_kernel_init_base    ", base);
+            ld_write(fdout, "seg_kernel_init_size    ", size);
+            count++;
+        }
+    }
+    if ( count != 4 )
+    { 
+        printf ("[XML ERROR] Missing mandatory Kernel global vseg : only %d\n", count);
+        printf ("Mandatory segments are :\n");
         printf (" - seg_kernel_code\n");
         printf (" - seg_kernel_data\n");
         printf (" - seg_kernel_uncdata\n");
         printf (" - seg_kernel_init\n");
-    }
-
+        exit(0);
+    }
+
+    file_write(fdout, "\n");
+
+    // boot and kernel optionnal global vsegs (pseudo ROMs)
+    unsigned int seg_ram_disk_base    = 0xFFFFFFFF;
+    unsigned int seg_ram_disk_size    = 0;
+    unsigned int seg_reset_code_base  = 0xFFFFFFFF;
+    unsigned int seg_reset_code_size  = 0;
+    for (vseg_id = 0 ; vseg_id < header->vsegs ; vseg_id++)
+    {
+        if ( strcmp(vseg[vseg_id]->name, "seg_reset_code") == 0 )
+        {
+            seg_reset_code_base = vseg[vseg_id]->vbase;
+            seg_reset_code_size = vobj[vseg[vseg_id]->vobj_offset]->length;
+        }
+        if ( strcmp(vseg[vseg_id]->name, "seg_ram_disk") == 0 )
+        {
+            seg_ram_disk_base   = vseg[vseg_id]->vbase;
+            seg_ram_disk_size   = vobj[vseg[vseg_id]->vobj_offset]->length;
+        }
+    }
+
+    ld_write(fdout, "seg_reset_code_base     ", seg_reset_code_base);
+    ld_write(fdout, "seg_reset_code_size     ", seg_reset_code_size);
+    ld_write(fdout, "seg_ram_disk_base       ", seg_ram_disk_base);
+    ld_write(fdout, "seg_ram_disk_size       ", seg_ram_disk_size);
+    
     file_write(fdout, "\n");
 
@@ -2744,5 +2868,5 @@
     set_periph_vbase_array();
 
-    // non replicated peripherals
+    //  non replicated peripherals
     ld_write(fdout, "seg_cma_base            ",   periph_vbase_array[PERIPH_TYPE_CMA]);
     ld_write(fdout, "seg_fbf_base            ",   periph_vbase_array[PERIPH_TYPE_FBF]);
@@ -2753,4 +2877,5 @@
     ld_write(fdout, "seg_sim_base            ",   periph_vbase_array[PERIPH_TYPE_SIM]);
     ld_write(fdout, "seg_tty_base            ",   periph_vbase_array[PERIPH_TYPE_TTY]);
+    ld_write(fdout, "seg_pic_base            ",   periph_vbase_array[PERIPH_TYPE_PIC]);
 
     file_write(fdout, "\n");
Index: /soft/giet_vm/hello/main.c
===================================================================
--- /soft/giet_vm/hello/main.c	(revision 294)
+++ /soft/giet_vm/hello/main.c	(revision 295)
@@ -1,3 +1,4 @@
 #include "stdio.h"
+#include "hard_config.h"
 
 __attribute__((constructor)) void main()
@@ -6,10 +7,16 @@
     unsigned int	proc = giet_procid();
 
-    giet_tty_printf("Starting task HELLO on processor %d at cycle %d\n",
-                    giet_procid(), giet_proctime() );
- 
+    unsigned int    procid     = giet_procid();
+    unsigned int    cluster_xy = procid/NB_PROCS_MAX;
+    unsigned int    lpid       = procid%NB_PROCS_MAX;
+    unsigned int    x          = cluster_xy >> Y_WIDTH;
+    unsigned int    y          = cluster_xy & ((1<<Y_WIDTH)-1);
+
+    giet_tty_printf( "*** Starting task hello on processor[%d,%d,%d] at cycle %d\n\n", 
+                      x, y, lpid, giet_proctime() );
+
 	while (1)
 	{
-		giet_tty_printf(" hello from processor %d\n", proc);
+		giet_tty_printf(" hello world\n");
         giet_tty_getc((void*)&byte);
         if ( byte == 'q' ) giet_exit();
Index: /soft/giet_vm/mappings/4c_4p_sort_leti.xml
===================================================================
--- /soft/giet_vm/mappings/4c_4p_sort_leti.xml	(revision 294)
+++ /soft/giet_vm/mappings/4c_4p_sort_leti.xml	(revision 295)
@@ -1,148 +1,174 @@
 <?xml version="1.0"?>
 
-<mapping_info signature    = "0xdeadbeef" 
-              name         = "4c_4p_sort_intact" 
+<mapping_info signature    = "0xdace2014" 
+              name         = "4c_4p_sort_leti" 
               x_size       = "2" 
-              y_size       = "2" 
+              y_size       = "3" 
               x_width      = "4"
               y_width      = "4"
-              vspaces      = "1"
-			  increment    = "0x10000"
-			  irq_per_proc = "4" >
-
-*** The "increment" parameter is the virtual address cluster increment 
-*** The physical address cluster increment is 0x10000000000 / NB_CLUSTERS
-
-*** This first section describes an instance of the "tsar_generic_iob" architecture
-*** with 4 clusters, 1 processor per cluster and 40 bits physical address.
+			  irq_per_proc = "4" 
+              use_ramdisk  = "1"
+			  x_io         = "0"
+              y_io         = "0" >
+
+*** This mapping is for the "tsar_generic_leti" hardware architecture
+*** with 4 clusters containing processors and 4 processors per cluster
+*** 40 bits physical address, and 64 Mbytes per cluster.
+*** There is 4 IRQ inputs per processor
+*** It does not use the external peripherals.
+*** It uses the RAMDISK in cluster(0,0)
+*** It uses the mono-channel TTY implemented in cluster(0,0).
 
     <clusterset>
-
         <cluster x = "0" y = "0" >
-            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x0000000000" length = "0x0000800000" />
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x0000000000" length = "0x0400000000" />
             <pseg name = "PSEG_XCU"  type = "PERI" base = "0x00F0000000" length = "0x0000002000" />
             <pseg name = "PSEG_MMC"  type = "PERI" base = "0x00E0000000" length = "0x0000001000" />
-
-*** Non replicated peripherals (including the ROM containing the preloader code)
-
             <pseg name = "PSEG_IOC"  type = "PERI" base = "0x00F2000000" length = "0x0000001000" /> 
             <pseg name = "PSEG_TTY"  type = "PERI" base = "0x00F4000000" length = "0x0000001000" /> 
 
-            <proc index  = "0" >
-                <irq type = "SOFT" icuid = "0"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "4"  isr = "ISR_SWITCH" /> 
-                <irq type = "HARD" icuid = "8"  isr = "ISR_DEFAULT" /> 
-                <irq type = "HARD" icuid = "9"  isr = "ISR_IOC" /> 
-                <irq type = "HARD" icuid = "10" isr = "ISR_TTY" /> 
-            </proc> 
-            <proc index  = "1" >
-                <irq type = "SOFT" icuid = "1"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "5"  isr = "ISR_SWITCH" /> 
-            </proc> 
-            <proc index  = "2" >
-                <irq type = "SOFT" icuid = "2"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "6"  isr = "ISR_SWITCH" /> 
-            </proc> 
-            <proc index  = "3" >
-                <irq type = "SOFT" icuid = "3"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "7"  isr = "ISR_SWITCH" /> 
-            </proc> 
-
-            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" />
-            <periph type = "MMC"  psegname = "PSEG_MMC"  channels = "1"  />
-            <periph type = "IOC"  psegname = "PSEG_IOC"  channels = "1" subtype = "BDV" /> 
-            <periph type = "TTY"  psegname = "PSEG_TTY"  channels = "1"  /> 
-
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC"  >
+            </periph>
+            <periph type = "IOC"  psegname = "PSEG_IOC"  subtype = "BDV" > 
+            </periph>
+            <periph type = "TTY"  psegname = "PSEG_TTY"  channels = "1" > 
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "3" />
+                <irq srcid = "4"  srctype = "WTI"  isr = "ISR_NIC_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "5"  srctype = "WTI"  isr = "ISR_NIC_RX"  channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "6"  srctype = "WTI"  isr = "ISR_NIC_TX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "7"  srctype = "WTI"  isr = "ISR_NIC_TX"  channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "8"  srctype = "WTI"  isr = "ISR_CMA"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "9"  srctype = "WTI"  isr = "ISR_CMA"     channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "10" srctype = "WTI"  isr = "ISR_CMA"     channel = "2"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "11" srctype = "WTI"  isr = "ISR_CMA"     channel = "3"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "12" srctype = "WTI"  isr = "ISR_BDV"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "13" srctype = "WTI"  isr = "ISR_TTY_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "9"  srctype = "HWI"  isr = "ISR_BDV"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "10" srctype = "HWI"  isr = "ISR_TTY_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+            </periph>
         </cluster>
 
         <cluster x = "0" y = "1" >
-            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x0100000000" length = "0x0000800000" />
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x0100000000" length = "0x0400000000" />
             <pseg name = "PSEG_XCU"  type = "PERI" base = "0x01F0000000" length = "0x0000002000" />
             <pseg name = "PSEG_MMC"  type = "PERI" base = "0x01E0000000" length = "0x0000001000" />
 
-            <proc index  = "0" >
-                <irq type = "SOFT" icuid = "0"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "4"  isr = "ISR_SWITCH" /> 
-                <irq type = "HARD" icuid = "8"  isr = "ISR_DEFAULT" /> 
-            </proc> 
-            <proc index  = "1" >
-                <irq type = "SOFT" icuid = "1"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "5"  isr = "ISR_SWITCH" /> 
-            </proc> 
-            <proc index  = "2" >
-                <irq type = "SOFT" icuid = "2"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "6"  isr = "ISR_SWITCH" /> 
-            </proc> 
-            <proc index  = "3" >
-                <irq type = "SOFT" icuid = "3"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "7"  isr = "ISR_SWITCH" /> 
-            </proc> 
-
-            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" />
-            <periph type = "MMC"  psegname = "PSEG_MMC"  channels = "1" />
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "0"  dsty = "1"  dstid = "0" />
+            </periph>
         </cluster>
 
         <cluster x = "1" y = "0" >
-            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x1000000000" length = "0x0000800000" />
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x1000000000" length = "0x0400000000" />
             <pseg name = "PSEG_XCU"  type = "PERI" base = "0x10F0000000" length = "0x0000002000" />
             <pseg name = "PSEG_MMC"  type = "PERI" base = "0x10E0000000" length = "0x0000001000" />
 
-            <proc index  = "0" >
-                <irq type = "SOFT" icuid = "0"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "4"  isr = "ISR_SWITCH" /> 
-                <irq type = "HARD" icuid = "8"  isr = "ISR_DEFAULT" /> 
-            </proc> 
-            <proc index  = "1" >
-                <irq type = "SOFT" icuid = "1"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "5"  isr = "ISR_SWITCH" /> 
-            </proc> 
-            <proc index  = "2" >
-                <irq type = "SOFT" icuid = "2"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "6"  isr = "ISR_SWITCH" /> 
-            </proc> 
-            <proc index  = "3" >
-                <irq type = "SOFT" icuid = "3"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "7"  isr = "ISR_SWITCH" /> 
-            </proc> 
-
-            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" />
-            <periph type = "MMC"  psegname = "PSEG_MMC"  channels = "1" />
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "1"  dsty = "0"  dstid = "0" />
+            </periph>
         </cluster>
 
         <cluster x = "1" y = "1" >
-            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x1100000000" length = "0x0000800000" />
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x1100000000" length = "0x0400000000" />
             <pseg name = "PSEG_XCU"  type = "PERI" base = "0x11F0000000" length = "0x0000002000" />
             <pseg name = "PSEG_MMC"  type = "PERI" base = "0x11E0000000" length = "0x0000001000" />
 
-            <proc index  = "0" >
-                <irq type = "SOFT" icuid = "0"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "4"  isr = "ISR_SWITCH" /> 
-                <irq type = "HARD" icuid = "8"  isr = "ISR_DEFAULT" /> 
-            </proc> 
-            <proc index  = "1" >
-                <irq type = "SOFT" icuid = "1"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "5"  isr = "ISR_SWITCH" /> 
-            </proc> 
-            <proc index  = "2" >
-                <irq type = "SOFT" icuid = "2"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "6"  isr = "ISR_SWITCH" /> 
-            </proc> 
-            <proc index  = "3" >
-                <irq type = "SOFT" icuid = "3"  isr = "ISR_WAKUP" /> 
-                <irq type = "TIME" icuid = "7"  isr = "ISR_SWITCH" /> 
-            </proc> 
-
-            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" />
-            <periph type = "MMC"  psegname = "PSEG_MMC"  channels = "1" />
-        </cluster>
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "1"  dsty = "1"  dstid = "0" />
+            </periph>
+        </cluster>
+
+*** empty clusters
+
+        <cluster x = "0" y = "2" >
+        </cluster>
+        <cluster x = "1" y = "2" >
+        </cluster>
+
     </clusterset>
 
     <globalset> 
 
-*** Segments used by the boot code / A[31:28] = 0x0 / Identity mapping
-- seg_boot_mapping is loaded by the boot-loader. It contains the mapping info. The content is reused by the kernel.
-- seg_boot_code and seg_boot data are loaded by the preloader, used by the boot-loader The content is not reused by the kernel.
-- seg_boot_stack is contains the stacks used by all processors during reset and boot. The content is not reused by the Kernel.
-- seg_boot_buffer is used by the boot-loader. It can contain a complete .elf file. The content is not reused by the kernel.
+*** Global vsegs associated to peripherals  replicated in all clusters (XCU, MMC, SCHED)
+*** must respect the following policy (checked by the XML parser) :
+*** vbase[x,y] = vbase[0,0] + 64K * cluster_xy
+*** pbase[x,y] = pbase[0,0] + 4G  * cluster_xy 
+*** ( with cluster_xy = x*16 + y )
+*** the vseg type is entirely defined by the 8 virtual address MSB bits (mask_type = 0xFF000000)
+*** The cluster index must be encoded in the next 8 virtual address bits (cluster_mask = 0x00FF0000)
+
+*** 5 global vsegs used by the boot code / A[31:28] = 0x0 / Identity mapping
+*** seg_boot_mapping is loaded by the boot-loader. It contains the mapping info.  Reused by the kernel.
+*** seg_boot_code and seg_boot data are loaded by the preloader, used by the boot-loader.  Not reused by the kernel.
+*** seg_boot_stack contains the stacks used by all processors during reset and boot.  Not reused by the Kernel.
+*** seg_boot_buffer is used by the boot-loader. It contains a complete .elf file.  Not reused by the kernel.
 
         <vseg name = "seg_boot_code"      vbase = "0x00010000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
@@ -153,14 +179,14 @@
         </vseg>
         <vseg name = "seg_boot_buffer"    vbase = "0x00040000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
-            <vobj name = "boot_buffer"    type = "BUFFER" length = "0x00020000" />
-        </vseg>
-        <vseg name = "seg_boot_stack"     vbase = "0x00060000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
-            <vobj name = "boot_stack"     type = "BUFFER" length = "0x00090000" />
+            <vobj name = "boot_buffer"    type = "BUFFER" length = "0x00060000" />
+        </vseg>
+        <vseg name = "seg_boot_stack"     vbase = "0x000A0000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_stack"     type = "BUFFER" length = "0x00050000" />
         </vseg>
         <vseg name = "seg_boot_mapping"   vbase = "0x000F0000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
             <vobj name = "boot_mapping"   type = "BLOB"   length = "0x00010000" binpath	= "map.bin" />
         </vseg>
-
-*** Segments used by the kernel / A[31:28] = 0x8 
+        
+*** 4 global vsegs used by the kernel / A[31:28] = 0x8  / No identity mapping constraint
   
         <vseg name = "seg_kernel_code"    vbase = "0x80000000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" > 
@@ -177,17 +203,25 @@
         </vseg>
 
-*** Segments for non replicated peripherals / A[31:28] = 0xF / Identity mapping
-
-        <vseg name = "seg_ioc"            vbase = "0xF2000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_IOC" ident = "1" >
+*** 2 global vsegs for non replicated peripherals in cluster(0,0) / A[31:28] = 0xF / 
+
+        <vseg name = "seg_ioc"            vbase = "0xF2000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_IOC" >
             <vobj name = "ioc"            type = "PERI" length  = "0x00001000" /> 
         </vseg>
-        <vseg name = "seg_tty"            vbase = "0xF4000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_TTY" ident = "1" >
+
+        <vseg name = "seg_tty"            vbase = "0xF4000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_TTY" >
    			<vobj name = "tty"            type = "PERI" length  = "0x00001000" />
         </vseg>
-        <vseg name = "seg_preloader"      vbase = "0x00000000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+
+*** 2 global vsegs for pseudo-peripherals (PRELOADER and RAMDISK) / A[31:28] = 0x0 
+
+        <vseg name = "seg_reset_code"     vbase = "0x00000000" mode = "CX__" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
             <vobj name = "preloader"      type = "BUFFER" length  = "0x00010000" /> 
         </vseg>
 
-*** Segments for replicated ICUS / A[31:24] = 0xF0 / Increment = 0x10000 / Identity mapping in cluster 0            
+        <vseg name = "seg_ram_disk"       vbase = "0x02000000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "ramdisk"        type = "BUFFER" length  = "0x02000000" />
+        </vseg>
+
+*** 4 global vsegs for replicated ICUS / A[31:24] = 0xF0 / Increment = 0x10000 / Identity mapping in cluster (0,0)            
 
         <vseg name = "seg_icu_0"          vbase = "0xF0000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_XCU" ident = "1" > 
@@ -204,7 +238,5 @@
         </vseg>
 
-*** segments for replicated MMC / A[31:24] = 0xE0 / Increment = 0x10000 / Identity mapping in cluster 0
-*** The peripheral type must be entirely defined by the 8 virtual address MSB bits (mask_type = 0xFF000000)
-*** The cluster id must be encoded in the next 8 virtual address bits (cluster_mask = 0x00FF0000)
+*** 4 global vsegs for replicated MMC / A[31:24] = 0xE0 / Increment = 0x10000 / Identity mapping in cluster 0
 
         <vseg name = "seg_memc_0"         vbase = "0xE0000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_MMC" ident = "1" >
@@ -221,7 +253,5 @@
         </vseg>
 
-*** segments for replicated schedulers / A[31:28] = 0xC / Increment = 0x10000
-*** The type must be entirely defined by the 8 virtual address MSB bits (mask_type = 0xFF000000)
-*** The cluster id must be encoded in the next 8 virtual address bits (cluster_mask = 0x00FF0000)
+*** 4 global vsegs for replicated schedulers / A[31:28] = 0xC / Increment = 0x10000
 
         <vseg name = "seg_sched_0"        vbase = "0xC0000000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" >
@@ -237,5 +267,5 @@
             <vobj name = "sched_3"        type = "SCHED" length  = "0x00008000" />
         </vseg>
-***
+
     </globalset> 
 
@@ -249,61 +279,67 @@
 
         <vspace name = "sort" startname = "sort_data" > 
-            <vseg name = "seg_sort_code"   vbase = "0x00400000" mode = "CXWU" x = "1" y = "1" psegname = "PSEG_RAM" > 
-                <vobj name = "sort_code"   type	 = "ELF" length = "0x00010000" binpath = "build/sort/sort.elf" /> 
-            </vseg>
-            <vseg name = "seg_sort_data"   vbase = "0x00500000" mode = "C_WU" x = "1" y = "1" psegname = "PSEG_RAM" >
-                <vobj name = "sort_data"   type	 = "ELF" length = "0x00010000" binpath = "build/sort/sort.elf" />
-            </vseg>
-            <vseg name = "seg_sort_ptab"   vbase = "0x00600000" mode = "C_W_" x = "1" y = "1" psegname = "PSEG_RAM" > 
-                <vobj name = "sort_ptab"   type	 = "PTAB" length  = "0x00020000" align = "13" />
-            </vseg>
-            <vseg name = "seg_sort_stack00" vbase = "0x00800000" mode = "C_WU" x = "0" y = "0" psegname = "PSEG_RAM" >
-                <vobj name = "sort_stack0"  type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack1"  type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack2"  type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack3"  type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_heap0"   type	 = "BUFFER" length = "0x00010000" /> 
-            </vseg>
-            <vseg name = "seg_sort_stack01" vbase = "0x00A00000" mode = "C_WU" x = "0" y = "1" psegname = "PSEG_RAM" >
-                <vobj name = "sort_stack4"  type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack5"  type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack6"  type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack7"  type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_heap1"   type	 = "BUFFER" length = "0x00010000" /> 
-            </vseg>
-            <vseg name = "seg_sort_stack10" vbase = "0x00C00000" mode = "C_WU" x = "1" y = "0" psegname = "PSEG_RAM" >
-                <vobj name = "sort_stack8"  type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack9"  type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack10" type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack11" type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_heap2"   type	 = "BUFFER" length = "0x00010000" /> 
-            </vseg>
-            <vseg name = "seg_sort_stack11" vbase = "0x00E00000" mode = "C_WU" x = "1" y = "1" psegname = "PSEG_RAM" >
-                <vobj name = "sort_stack12" type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack13" type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack14" type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_stack15" type	 = "BUFFER" length = "0x00010000" /> 
-                <vobj name = "sort_heap3"   type	 = "BUFFER" length = "0x00010000" /> 
-            </vseg>
-			<vseg name = "seg_params"       vbase = "0x00F00000" mode = "C_WU" x = "0" y = "0" psegname = "PSEG_RAM" >
-				<vobj name = "nb_thread"    type     = "CONST"  length = "0x4" init = "16" />
+            <vseg name = "seg_sort_code"     vbase = "0x00400000" mode = "CXWU" x = "1" y = "1" psegname = "PSEG_RAM" > 
+                <vobj name = "sort_code"     type  = "ELF" length = "0x00010000" binpath = "build/sort/sort.elf" /> 
+            </vseg>
+            <vseg name = "seg_sort_data"     vbase = "0x00500000" mode = "C_WU" x = "1" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "sort_data"     type  = "ELF" length = "0x00010000" binpath = "build/sort/sort.elf" />
+            </vseg>
+            <vseg name = "seg_sort_ptab"     vbase = "0x00600000" mode = "C_W_" x = "1" y = "1" psegname = "PSEG_RAM" > 
+                <vobj name = "sort_ptab"     type  = "PTAB" length  = "0x00020000" align = "13" />
+            </vseg>
+            <vseg name = "seg_sort_stack_0"  vbase = "0x00200000" mode = "C_WU" x = "0" y = "0" psegname = "PSEG_RAM" >
+                <vobj name = "sort_stack_00" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_01" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_02" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_03" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_heap_0"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_sort_stack_1"  vbase = "0x00280000" mode = "C_WU" x = "0" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "sort_stack_10" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_11" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_12" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_13" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_heap_1"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_sort_stack_2"  vbase = "0x00300000" mode = "C_WU" x = "1" y = "0" psegname = "PSEG_RAM" >
+                <vobj name = "sort_stack_20" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_21" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_22" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_23" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_heap_2"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_sort_stack_3"  vbase = "0x00380000" mode = "C_WU" x = "1" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "sort_stack_30" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_31" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_32" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_33" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_heap_3"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+
+*** This vobj emulates a command line argument for the sort application
+
+			<vseg name = "seg_params"       vbase = "0x00100000" mode = "C_WU" x = "0" y = "0" psegname = "PSEG_RAM" >
+				<vobj name = "nb_thread"    type  = "CONST"  length = "0x4" init = "16" />
 			</vseg>
-            <task name = "sort_0"  x = "0" y = "0" proclocid = "0" stackname = "sort_stack0"  heapname = "sort_heap0" startid = "0" usetty = "1" />
-            <task name = "sort_1"  x = "0" y = "0" proclocid = "1" stackname = "sort_stack1"  heapname = "sort_heap0" startid = "0" usetty = "1" />
-            <task name = "sort_2"  x = "0" y = "0" proclocid = "2" stackname = "sort_stack2"  heapname = "sort_heap0" startid = "0" usetty = "1" />
-            <task name = "sort_3"  x = "0" y = "0" proclocid = "3" stackname = "sort_stack3"  heapname = "sort_heap0" startid = "0" usetty = "1" />
-            <task name = "sort_4"  x = "0" y = "1" proclocid = "0" stackname = "sort_stack4"  heapname = "sort_heap1" startid = "0" usetty = "1" />
-            <task name = "sort_5"  x = "0" y = "1" proclocid = "1" stackname = "sort_stack5"  heapname = "sort_heap1" startid = "0" usetty = "1" />
-            <task name = "sort_6"  x = "0" y = "1" proclocid = "2" stackname = "sort_stack6"  heapname = "sort_heap1" startid = "0" usetty = "1" />
-            <task name = "sort_7"  x = "0" y = "1" proclocid = "3" stackname = "sort_stack7"  heapname = "sort_heap1" startid = "0" usetty = "1" />
-            <task name = "sort_8"  x = "1" y = "0" proclocid = "0" stackname = "sort_stack8"  heapname = "sort_heap2" startid = "0" usetty = "1" />
-            <task name = "sort_9"  x = "1" y = "0" proclocid = "1" stackname = "sort_stack9"  heapname = "sort_heap2" startid = "0" usetty = "1" />
-            <task name = "sort_10" x = "1" y = "0" proclocid = "2" stackname = "sort_stack10" heapname = "sort_heap2" startid = "0" usetty = "1" />
-            <task name = "sort_11" x = "1" y = "0" proclocid = "3" stackname = "sort_stack11" heapname = "sort_heap2" startid = "0" usetty = "1" />
-            <task name = "sort_12" x = "1" y = "1" proclocid = "0" stackname = "sort_stack12" heapname = "sort_heap3" startid = "0" usetty = "1" />
-            <task name = "sort_13" x = "1" y = "1" proclocid = "1" stackname = "sort_stack13" heapname = "sort_heap3" startid = "0" usetty = "1" />
-            <task name = "sort_14" x = "1" y = "1" proclocid = "2" stackname = "sort_stack14" heapname = "sort_heap3" startid = "0" usetty = "1" />
-            <task name = "sort_15" x = "1" y = "1" proclocid = "3" stackname = "sort_stack15" heapname = "sort_heap3" startid = "0" usetty = "1" />
-
+
+            <task name = "sort_00" x = "0" y = "0" proclocid = "0" stackname = "sort_stack_00"  heapname = "sort_heap_0" startid = "0"  />
+            <task name = "sort_01" x = "0" y = "0" proclocid = "1" stackname = "sort_stack_01"  heapname = "sort_heap_0" startid = "0"  />
+            <task name = "sort_02" x = "0" y = "0" proclocid = "2" stackname = "sort_stack_02"  heapname = "sort_heap_0" startid = "0"  />
+            <task name = "sort_03" x = "0" y = "0" proclocid = "3" stackname = "sort_stack_03"  heapname = "sort_heap_0" startid = "0"  />
+
+            <task name = "sort_10" x = "0" y = "1" proclocid = "0" stackname = "sort_stack_10"  heapname = "sort_heap_1" startid = "0"  />
+            <task name = "sort_11" x = "0" y = "1" proclocid = "1" stackname = "sort_stack_11"  heapname = "sort_heap_1" startid = "0"  />
+            <task name = "sort_12" x = "0" y = "1" proclocid = "2" stackname = "sort_stack_12"  heapname = "sort_heap_1" startid = "0"  />
+            <task name = "sort_13" x = "0" y = "1" proclocid = "3" stackname = "sort_stack_13"  heapname = "sort_heap_1" startid = "0"  />
+
+            <task name = "sort_20" x = "1" y = "0" proclocid = "0" stackname = "sort_stack_20"  heapname = "sort_heap_2" startid = "0"  />
+            <task name = "sort_21" x = "1" y = "0" proclocid = "1" stackname = "sort_stack_21"  heapname = "sort_heap_2" startid = "0"  />
+            <task name = "sort_22" x = "1" y = "0" proclocid = "2" stackname = "sort_stack_22"  heapname = "sort_heap_2" startid = "0"  />
+            <task name = "sort_23" x = "1" y = "0" proclocid = "3" stackname = "sort_stack_23"  heapname = "sort_heap_2" startid = "0"  />
+
+            <task name = "sort_30" x = "1" y = "1" proclocid = "0" stackname = "sort_stack_30"  heapname = "sort_heap_3" startid = "0"  />
+            <task name = "sort_31" x = "1" y = "1" proclocid = "1" stackname = "sort_stack_31"  heapname = "sort_heap_3" startid = "0"  />
+            <task name = "sort_32" x = "1" y = "1" proclocid = "2" stackname = "sort_stack_32"  heapname = "sort_heap_3" startid = "0"  />
+            <task name = "sort_33" x = "1" y = "1" proclocid = "3" stackname = "sort_stack_33"  heapname = "sort_heap_3" startid = "0"  />
         </vspace>
     </vspaceset>
Index: /soft/giet_vm/mappings/4c_4p_sort_leti_ext.xml
===================================================================
--- /soft/giet_vm/mappings/4c_4p_sort_leti_ext.xml	(revision 295)
+++ /soft/giet_vm/mappings/4c_4p_sort_leti_ext.xml	(revision 295)
@@ -0,0 +1,397 @@
+<?xml version="1.0"?>
+
+<mapping_info signature    = "0xdace2014" 
+              name         = "4c_4p_sort_leti_ext" 
+              x_size       = "2" 
+              y_size       = "3" 
+              x_width      = "4"
+              y_width      = "4"
+			  irq_per_proc = "4" 
+              use_ramdisk  = "0"
+			  x_io         = "1"
+              y_io         = "2" >
+
+*** This mapping is for the "tsar_generic_leti" hardware architecture
+*** with 4 clusters containing processors and 4 processors per cluster
+*** 40 bits physical address, and 64 Mbytes per cluster.
+*** It uses the external peripherals, which means 2*3 clusters, because
+*** External peripherals are implemented in cluster(1,2), and the associated WTI
+*** are routed by the PIC component to the XCU in cluster (0,0).
+*** Cluster (0,0) contains two backup peripherals (TTY and Block Device),
+*** and the corresponding HWI are connected to the XICU in cluster (0,0)
+
+    <clusterset>
+
+        <cluster x = "0" y = "0" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x0000000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x00F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x00E0000000" length = "0x0000001000" />
+            <pseg name = "PSEG_IOC"  type = "PERI" base = "0x00F2000000" length = "0x0000001000" /> 
+            <pseg name = "PSEG_TTY"  type = "PERI" base = "0x00F4000000" length = "0x0000001000" /> 
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC"  >
+            </periph>
+            <periph type = "IOC"  psegname = "PSEG_IOC"  subtype = "BDV" > 
+            </periph>
+            <periph type = "TTY"  psegname = "PSEG_TTY"  channels = "1" > 
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "3" />
+                <irq srcid = "4"  srctype = "WTI"  isr = "ISR_NIC_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "5"  srctype = "WTI"  isr = "ISR_NIC_RX"  channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "6"  srctype = "WTI"  isr = "ISR_NIC_TX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "7"  srctype = "WTI"  isr = "ISR_NIC_TX"  channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "8"  srctype = "WTI"  isr = "ISR_CMA"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "9"  srctype = "WTI"  isr = "ISR_CMA"     channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "10" srctype = "WTI"  isr = "ISR_CMA"     channel = "2"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "11" srctype = "WTI"  isr = "ISR_CMA"     channel = "3"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "12" srctype = "WTI"  isr = "ISR_BDV"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "13" srctype = "WTI"  isr = "ISR_TTY_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "9"  srctype = "HWI"  isr = "ISR_BDV"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "10" srctype = "HWI"  isr = "ISR_TTY_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+            </periph>
+        </cluster>
+
+        <cluster x = "0" y = "1" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x0100000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x01F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x01E0000000" length = "0x0000001000" />
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "0"  dsty = "1"  dstid = "0" />
+            </periph>
+        </cluster>
+
+        <cluster x = "1" y = "0" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x1000000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x10F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x10E0000000" length = "0x0000001000" />
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "1"  dsty = "0"  dstid = "0" />
+            </periph>
+        </cluster>
+
+        <cluster x = "1" y = "1" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x1100000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x11F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x11E0000000" length = "0x0000001000" />
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "1"  dsty = "1"  dstid = "0" />
+            </periph>
+        </cluster>
+
+*** empty cluster
+
+        <cluster x = "0" y = "2" >
+        </cluster>
+
+*** cluster_io
+
+        <cluster x = "1" y = "2" >
+            <pseg name = "PSEG_IOC"  type = "PERI" base = "0x12F2000000" length = "0x0000001000" /> 
+            <pseg name = "PSEG_FBF"  type = "PERI" base = "0x12F3000000" length = "0x0000004000" /> 
+            <pseg name = "PSEG_TTY"  type = "PERI" base = "0x12F4000000" length = "0x0000001000" /> 
+            <pseg name = "PSEG_NIC"  type = "PERI" base = "0x12F7000000" length = "0x0000080000" />
+            <pseg name = "PSEG_CMA"  type = "PERI" base = "0x12F8000000" length = "0x0000008000" />
+            <pseg name = "PSEG_PIC"  type = "PERI" base = "0x12F9000000" length = "0x0000004000" />
+
+            <periph type = "IOC"  psegname = "PSEG_IOC"  subtype = "BDV" > 
+            </periph>
+            <periph type = "FBF"  psegname = "PSEG_FBF" >
+            </periph>
+            <periph type = "TTY"  psegname = "PSEG_TTY"  channels = "1" > 
+            </periph>
+            <periph type = "NIC"  psegname = "PSEG_NIC"  channels = "2" >
+            </periph>
+            <periph type = "CMA"  psegname = "PSEG_CMA"  channels = "4" >
+            </periph>
+            <periph type = "PIC"  psegname = "PSEG_PIC"  channels = "32" >
+                <irq srcid = "0"  srctype  = "HWI"  isr = "ISR_NIC_RX" channel = "0"  dstx = "0"  dsty = "0"  dstid = "4"  />
+                <irq srcid = "1"  srctype  = "HWI"  isr = "ISR_NIC_RX" channel = "1"  dstx = "0"  dsty = "0"  dstid = "5"  />
+
+                <irq srcid = "2"  srctype  = "HWI"  isr = "ISR_NIC_TX" channel = "0"  dstx = "0"  dsty = "0"  dstid = "6"  />
+                <irq srcid = "3"  srctype  = "HWI"  isr = "ISR_NIC_TX" channel = "1"  dstx = "0"  dsty = "0"  dstid = "7"  />
+
+                <irq srcid = "4"  srctype  = "HWI"  isr = "ISR_CMA"    channel = "0"  dstx = "0"  dsty = "0"  dstid = "8"  />
+                <irq srcid = "5"  srctype  = "HWI"  isr = "ISR_CMA"    channel = "1"  dstx = "0"  dsty = "0"  dstid = "9"  />
+                <irq srcid = "6"  srctype  = "HWI"  isr = "ISR_CMA"    channel = "2"  dstx = "0"  dsty = "0"  dstid = "10" />
+                <irq srcid = "7"  srctype  = "HWI"  isr = "ISR_CMA"    channel = "3"  dstx = "0"  dsty = "0"  dstid = "11" />
+
+                <irq srcid = "8"  srctype  = "HWI"  isr = "ISR_BDV"    channel = "0"  dstx = "0"  dsty = "0"  dstid = "12" />
+
+                <irq srcid = "16" srctype  = "HWI"  isr = "ISR_TTY_RX" channel = "0"  dstx = "0"  dsty = "0"  dstid = "13" />
+            </periph>
+        </cluster>
+
+    </clusterset>
+
+    <globalset> 
+
+*** Global vsegs associated to peripherals  replicated in all clusters (XCU, MMC, SCHED)
+*** must respect the following policy (checked by the XML parser) :
+*** For segments replicated in all clusters
+*** vbase[x,y] = vbase[0,0] + 64K * cluster_xy
+*** pbase[x,y] = pbase[0,0] + 4G  * cluster_xy 
+*** ( with cluster_xy = x*16 + y )
+*** the vseg type is entirely defined by the 8 virtual address MSB bits (mask_type = 0xFF000000)
+*** The cluster index must be encoded in the next 8 virtual address bits (cluster_mask = 0x00FF0000)
+
+*** 5 global vsegs used by the boot code / A[31:28] = 0x0 / Identity mapping
+*** seg_boot_mapping is loaded by the boot-loader. It contains the mapping info.  Reused by the kernel.
+*** seg_boot_code and seg_boot data are loaded by the preloader, used by the boot-loader.  Not reused by the kernel.
+*** seg_boot_stack contains the stacks used by all processors during reset and boot.  Not reused by the Kernel.
+*** seg_boot_buffer is used by the boot-loader. It contains a complete .elf file.  Not reused by the kernel.
+
+        <vseg name = "seg_boot_code"      vbase = "0x00010000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_code"      type = "BUFFER" length = "0x00020000" />
+        </vseg>
+        <vseg name = "seg_boot_data"      vbase = "0x00030000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_data"      type = "BUFFER" length = "0x00010000" />
+        </vseg>
+        <vseg name = "seg_boot_buffer"    vbase = "0x00040000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_buffer"    type = "BUFFER" length = "0x00060000" />
+        </vseg>
+        <vseg name = "seg_boot_stack"     vbase = "0x000A0000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_stack"     type = "BUFFER" length = "0x00050000" />
+        </vseg>
+        <vseg name = "seg_boot_mapping"   vbase = "0x000F0000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_mapping"   type = "BLOB"   length = "0x00010000" binpath	= "map.bin" />
+        </vseg>
+        
+*** 4 global vsegs used by the kernel / A[31:28] = 0x8  / No identity mapping constraint
+  
+        <vseg name = "seg_kernel_code"    vbase = "0x80000000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_code"    type = "ELF" length = "0x00020000" binpath = "build/kernel/kernel.elf" />
+        </vseg>
+        <vseg name = "seg_kernel_data"    vbase = "0x80020000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_data"    type = "ELF" length = "0x00060000" binpath = "build/kernel/kernel.elf" />
+		</vseg>
+        <vseg name = "seg_kernel_uncdata" vbase = "0x80080000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_uncdata" type = "ELF" length = "0x00040000" binpath = "build/kernel/kernel.elf" />
+        </vseg>
+        <vseg name = "seg_kernel_init"    vbase = "0x800C0000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_init"    type = "ELF" length = "0x00010000" binpath = "build/kernel/kernel.elf" />
+        </vseg>
+
+*** 6 global vsegs for non replicated peripherals in cluster(1,2) / A[31:28] = 0xF / 
+
+        <vseg name = "seg_ioc"            vbase = "0xF2000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_IOC" >
+            <vobj name = "ioc"            type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_tty"            vbase = "0xF4000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_TTY" >
+   			<vobj name = "tty"            type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_nic"            vbase = "0xF5000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_NIC" >
+            <vobj name = "nic"            type = "PERI" length  = "0x00080000" /> 
+        </vseg>
+        <vseg name = "seg_cma"            vbase = "0xF8000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_CMA" >
+            <vobj name = "cma"            type = "PERI" length  = "0x00008000" /> 
+        </vseg>
+        <vseg name = "seg_fbf"            vbase = "0xF3000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_FBF" >
+            <vobj name = "fbf"            type = "PERI" length  = "0x00004000" /> 
+        </vseg>
+        <vseg name = "seg_pic"            vbase = "0xF9000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_PIC" >
+            <vobj name = "pic"            type = "PERI" length  = "0x00004000" /> 
+        </vseg>
+
+*** 1 global vseg for pseudo-peripherals (PRELOADER) / A[31:28] = 0x0 
+
+        <vseg name = "seg_reset_code"     vbase = "0x00000000" mode = "CX__" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "preloader"      type = "BUFFER" length  = "0x00010000" /> 
+        </vseg>
+
+*** 4 global vsegs for replicated ICUS / A[31:24] = 0xF0 / Increment = 0x10000 / Identity mapping in cluster (0,0)            
+
+        <vseg name = "seg_icu_0"          vbase = "0xF0000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_XCU" ident = "1" > 
+            <vobj name = "icu_0"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_icu_1"          vbase = "0xF0010000" mode = "__W_" x = "0" y = "1" psegname = "PSEG_XCU" > 
+            <vobj name = "icu_1"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_icu_2"          vbase = "0xF0100000" mode = "__W_" x = "1" y = "0" psegname = "PSEG_XCU" > 
+            <vobj name = "icu_2"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_icu_3"          vbase = "0xF0110000" mode = "__W_" x = "1" y = "1" psegname = "PSEG_XCU" > 
+            <vobj name = "icu_3"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+
+*** 4 global vsegs for replicated MMC / A[31:24] = 0xE0 / Increment = 0x10000 / Identity mapping in cluster 0
+
+        <vseg name = "seg_memc_0"         vbase = "0xE0000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_MMC" ident = "1" >
+            <vobj name = "memc_0"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_memc_1"         vbase = "0xE0010000" mode = "__W_" x = "0" y = "1" psegname = "PSEG_MMC" >
+            <vobj name = "memc_1"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_memc_2"         vbase = "0xE0100000" mode = "__W_" x = "1" y = "0" psegname = "PSEG_MMC" >
+            <vobj name = "memc_2"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_memc_3"         vbase = "0xE0110000" mode = "__W_" x = "1" y = "1" psegname = "PSEG_MMC" >
+            <vobj name = "memc_3"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+
+*** 4 global vsegs for replicated schedulers / A[31:28] = 0xC / Increment = 0x10000
+
+        <vseg name = "seg_sched_0"        vbase = "0xC0000000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" >
+            <vobj name = "sched_0"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+        <vseg name = "seg_sched_1"        vbase = "0xC0010000" mode = "C_W_" x = "0" y = "1" psegname = "PSEG_RAM" >
+            <vobj name = "sched_1"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+        <vseg name = "seg_sched_2"        vbase = "0xC0100000" mode = "C_W_" x = "1" y = "0" psegname = "PSEG_RAM" >
+            <vobj name = "sched_2"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+        <vseg name = "seg_sched_3"        vbase = "0xC0110000" mode = "C_W_" x = "1" y = "1" psegname = "PSEG_RAM" >
+            <vobj name = "sched_3"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+
+    </globalset> 
+
+    <vspaceset>
+
+*** For each vspace, the startname field is the name of the vobj containing the start_vector (entry point array)
+*** For each task, the startid field define the task entry point as an index in the start_vector
+*** For each task, the clusterid and proclocid arguments define the task static placement
+*** For each task, the stackname field is the name of the vobj containing the task stack 
+*** For each task, the heapname field is the name of the vobj containing the task heap 
+
+        <vspace name = "sort" startname = "sort_data" > 
+            <vseg name = "seg_sort_code"     vbase = "0x00400000" mode = "CXWU" x = "1" y = "1" psegname = "PSEG_RAM" > 
+                <vobj name = "sort_code"     type  = "ELF" length = "0x00010000" binpath = "build/sort/sort.elf" /> 
+            </vseg>
+            <vseg name = "seg_sort_data"     vbase = "0x00500000" mode = "C_WU" x = "1" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "sort_data"     type  = "ELF" length = "0x00010000" binpath = "build/sort/sort.elf" />
+            </vseg>
+            <vseg name = "seg_sort_ptab"     vbase = "0x00600000" mode = "C_W_" x = "1" y = "1" psegname = "PSEG_RAM" > 
+                <vobj name = "sort_ptab"     type  = "PTAB" length  = "0x00020000" align = "13" />
+            </vseg>
+            <vseg name = "seg_sort_stack_0"  vbase = "0x00200000" mode = "C_WU" x = "0" y = "0" psegname = "PSEG_RAM" >
+                <vobj name = "sort_stack_00" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_01" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_02" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_03" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_heap_0"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_sort_stack_1"  vbase = "0x00280000" mode = "C_WU" x = "0" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "sort_stack_10" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_11" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_12" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_13" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_heap_1"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_sort_stack_2"  vbase = "0x00300000" mode = "C_WU" x = "1" y = "0" psegname = "PSEG_RAM" >
+                <vobj name = "sort_stack_20" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_21" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_22" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_23" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_heap_2"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_sort_stack_3"  vbase = "0x00380000" mode = "C_WU" x = "1" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "sort_stack_30" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_31" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_32" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_stack_33" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "sort_heap_3"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+
+*** This vobj emulates a command line argument for the sort application
+
+			<vseg name = "seg_params"       vbase = "0x00100000" mode = "C_WU" x = "0" y = "0" psegname = "PSEG_RAM" >
+				<vobj name = "nb_thread"    type  = "CONST"  length = "0x4" init = "16" />
+			</vseg>
+
+            <task name = "sort_00" x = "0" y = "0" proclocid = "0" stackname = "sort_stack_00"  heapname = "sort_heap_0" startid = "0"  />
+            <task name = "sort_01" x = "0" y = "0" proclocid = "1" stackname = "sort_stack_01"  heapname = "sort_heap_0" startid = "0"  />
+            <task name = "sort_02" x = "0" y = "0" proclocid = "2" stackname = "sort_stack_02"  heapname = "sort_heap_0" startid = "0"  />
+            <task name = "sort_03" x = "0" y = "0" proclocid = "3" stackname = "sort_stack_03"  heapname = "sort_heap_0" startid = "0"  />
+
+            <task name = "sort_10" x = "0" y = "1" proclocid = "0" stackname = "sort_stack_10"  heapname = "sort_heap_1" startid = "0"  />
+            <task name = "sort_11" x = "0" y = "1" proclocid = "1" stackname = "sort_stack_11"  heapname = "sort_heap_1" startid = "0"  />
+            <task name = "sort_12" x = "0" y = "1" proclocid = "2" stackname = "sort_stack_12"  heapname = "sort_heap_1" startid = "0"  />
+            <task name = "sort_13" x = "0" y = "1" proclocid = "3" stackname = "sort_stack_13"  heapname = "sort_heap_1" startid = "0"  />
+
+            <task name = "sort_20" x = "1" y = "0" proclocid = "0" stackname = "sort_stack_20"  heapname = "sort_heap_2" startid = "0"  />
+            <task name = "sort_21" x = "1" y = "0" proclocid = "1" stackname = "sort_stack_21"  heapname = "sort_heap_2" startid = "0"  />
+            <task name = "sort_22" x = "1" y = "0" proclocid = "2" stackname = "sort_stack_22"  heapname = "sort_heap_2" startid = "0"  />
+            <task name = "sort_23" x = "1" y = "0" proclocid = "3" stackname = "sort_stack_23"  heapname = "sort_heap_2" startid = "0"  />
+
+            <task name = "sort_30" x = "1" y = "1" proclocid = "0" stackname = "sort_stack_30"  heapname = "sort_heap_3" startid = "0"  />
+            <task name = "sort_31" x = "1" y = "1" proclocid = "1" stackname = "sort_stack_31"  heapname = "sort_heap_3" startid = "0"  />
+            <task name = "sort_32" x = "1" y = "1" proclocid = "2" stackname = "sort_stack_32"  heapname = "sort_heap_3" startid = "0"  />
+            <task name = "sort_33" x = "1" y = "1" proclocid = "3" stackname = "sort_stack_33"  heapname = "sort_heap_3" startid = "0"  />
+        </vspace>
+    </vspaceset>
+</mapping_info>   
+
+
+
+
+ 
Index: /soft/giet_vm/mappings/4c_4p_transpose_leti.xml
===================================================================
--- /soft/giet_vm/mappings/4c_4p_transpose_leti.xml	(revision 295)
+++ /soft/giet_vm/mappings/4c_4p_transpose_leti.xml	(revision 295)
@@ -0,0 +1,339 @@
+<?xml version="1.0"?>
+
+<mapping_info signature    = "0xdace2014" 
+              name         = "4c_4p_transpose_leti" 
+              x_size       = "2" 
+              y_size       = "3" 
+              x_width      = "4"
+              y_width      = "4"
+			  irq_per_proc = "4" 
+              use_ramdisk  = "1"
+			  x_io         = "0"
+              y_io         = "0" >
+
+*** This mapping is for the "tsar_generic_leti" hardware architecture
+*** with 4 clusters containing processors and 4 processors per cluster
+*** 40 bits physical address, and 64 Mbytes per cluster.
+*** There is 4 IRQ inputs per processor
+*** It does not use the external peripherals.
+*** It uses the RAMDISK in cluster(0,0)
+*** It uses the mono-channel TTY implemented in cluster(0,0).
+
+    <clusterset>
+        <cluster x = "0" y = "0" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x0000000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x00F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x00E0000000" length = "0x0000001000" />
+            <pseg name = "PSEG_IOC"  type = "PERI" base = "0x00F2000000" length = "0x0000001000" /> 
+            <pseg name = "PSEG_TTY"  type = "PERI" base = "0x00F4000000" length = "0x0000001000" /> 
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC"  >
+            </periph>
+            <periph type = "IOC"  psegname = "PSEG_IOC"  subtype = "BDV" > 
+            </periph>
+            <periph type = "TTY"  psegname = "PSEG_TTY"  channels = "1" > 
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "3" />
+                <irq srcid = "4"  srctype = "WTI"  isr = "ISR_NIC_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "5"  srctype = "WTI"  isr = "ISR_NIC_RX"  channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "6"  srctype = "WTI"  isr = "ISR_NIC_TX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "7"  srctype = "WTI"  isr = "ISR_NIC_TX"  channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "8"  srctype = "WTI"  isr = "ISR_CMA"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "9"  srctype = "WTI"  isr = "ISR_CMA"     channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "10" srctype = "WTI"  isr = "ISR_CMA"     channel = "2"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "11" srctype = "WTI"  isr = "ISR_CMA"     channel = "3"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "12" srctype = "WTI"  isr = "ISR_BDV"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "13" srctype = "WTI"  isr = "ISR_TTY_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "9"  srctype = "HWI"  isr = "ISR_BDV"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "10" srctype = "HWI"  isr = "ISR_TTY_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+            </periph>
+        </cluster>
+
+        <cluster x = "0" y = "1" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x0100000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x01F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x01E0000000" length = "0x0000001000" />
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "0"  dsty = "1"  dstid = "0" />
+            </periph>
+        </cluster>
+
+        <cluster x = "1" y = "0" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x1000000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x10F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x10E0000000" length = "0x0000001000" />
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "1"  dsty = "0"  dstid = "0" />
+            </periph>
+        </cluster>
+
+        <cluster x = "1" y = "1" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x1100000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x11F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x11E0000000" length = "0x0000001000" />
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "1"  dsty = "1"  dstid = "0" />
+            </periph>
+        </cluster>
+
+***empty clusters
+
+        <cluster x = "0" y = "2" >
+        </cluster>
+        <cluster x = "1" y = "2" >
+        </cluster>
+
+    </clusterset>
+
+    <globalset> 
+
+*** Global vsegs associated to peripherals  replicated in all clusters (XCU, MMC, SCHED)
+*** must respect the following policy (checked by the XML parser) :
+*** vbase[x,y] = vbase[0,0] + 64K * cluster_xy
+*** pbase[x,y] = pbase[0,0] + 4G  * cluster_xy 
+*** ( with cluster_xy = x*16 + y )
+*** the vseg type is entirely defined by the 8 virtual address MSB bits (mask_type = 0xFF000000)
+*** The cluster index must be encoded in the next 8 virtual address bits (cluster_mask = 0x00FF0000)
+
+*** 5 global vsegs used by the boot code / A[31:28] = 0x0 / Identity mapping
+*** seg_boot_mapping is loaded by the boot-loader. It contains the mapping info.  Reused by the kernel.
+*** seg_boot_code and seg_boot data are loaded by the preloader, used by the boot-loader.  Not reused by the kernel.
+*** seg_boot_stack contains the stacks used by all processors during reset and boot.  Not reused by the Kernel.
+*** seg_boot_buffer is used by the boot-loader. It contains a complete .elf file.  Not reused by the kernel.
+
+        <vseg name = "seg_boot_code"      vbase = "0x00010000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_code"      type = "BUFFER" length = "0x00020000" />
+        </vseg>
+        <vseg name = "seg_boot_data"      vbase = "0x00030000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_data"      type = "BUFFER" length = "0x00010000" />
+        </vseg>
+        <vseg name = "seg_boot_buffer"    vbase = "0x00040000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_buffer"    type = "BUFFER" length = "0x00060000" />
+        </vseg>
+        <vseg name = "seg_boot_stack"     vbase = "0x000A0000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_stack"     type = "BUFFER" length = "0x00050000" />
+        </vseg>
+        <vseg name = "seg_boot_mapping"   vbase = "0x000F0000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_mapping"   type = "BLOB"   length = "0x00010000" binpath	= "map.bin" />
+        </vseg>
+        
+*** 4 global vsegs used by the kernel / A[31:28] = 0x8  / No identity mapping constraint
+  
+        <vseg name = "seg_kernel_code"    vbase = "0x80000000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_code"    type = "ELF" length = "0x00020000" binpath = "build/kernel/kernel.elf" />
+        </vseg>
+        <vseg name = "seg_kernel_data"    vbase = "0x80020000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_data"    type = "ELF" length = "0x00060000" binpath = "build/kernel/kernel.elf" />
+		</vseg>
+        <vseg name = "seg_kernel_uncdata" vbase = "0x80080000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_uncdata" type = "ELF" length = "0x00040000" binpath = "build/kernel/kernel.elf" />
+        </vseg>
+        <vseg name = "seg_kernel_init"    vbase = "0x800C0000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_init"    type = "ELF" length = "0x00010000" binpath = "build/kernel/kernel.elf" />
+        </vseg>
+
+*** 2 global vsegs for non replicated peripherals in cluster(0,0) / A[31:28] = 0xF / 
+
+        <vseg name = "seg_ioc"            vbase = "0xF2000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_IOC" >
+            <vobj name = "ioc"            type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+
+        <vseg name = "seg_tty"            vbase = "0xF4000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_TTY" >
+   			<vobj name = "tty"            type = "PERI" length  = "0x00001000" />
+        </vseg>
+
+*** 2 global vsegs for pseudo-peripherals (PRELOADER and RAMDISK) / A[31:28] = 0x0 
+
+        <vseg name = "seg_reset_code"     vbase = "0x00000000" mode = "CX__" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "preloader"      type = "BUFFER" length  = "0x00010000" /> 
+        </vseg>
+
+        <vseg name = "seg_ram_disk"       vbase = "0x02000000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "ramdisk"        type = "BUFFER" length  = "0x02000000" />
+        </vseg>
+
+*** 4 global vsegs for replicated ICUS / A[31:24] = 0xF0 / Increment = 0x10000 / Identity mapping in cluster (0,0)            
+
+        <vseg name = "seg_icu_0"          vbase = "0xF0000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_XCU" ident = "1" > 
+            <vobj name = "icu_0"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_icu_1"          vbase = "0xF0010000" mode = "__W_" x = "0" y = "1" psegname = "PSEG_XCU" > 
+            <vobj name = "icu_1"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_icu_2"          vbase = "0xF0100000" mode = "__W_" x = "1" y = "0" psegname = "PSEG_XCU" > 
+            <vobj name = "icu_2"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_icu_3"          vbase = "0xF0110000" mode = "__W_" x = "1" y = "1" psegname = "PSEG_XCU" > 
+            <vobj name = "icu_3"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+
+*** 4 global vsegs for replicated MMC / A[31:24] = 0xE0 / Increment = 0x10000 / Identity mapping in cluster 0
+
+        <vseg name = "seg_memc_0"         vbase = "0xE0000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_MMC" ident = "1" >
+            <vobj name = "memc_0"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_memc_1"         vbase = "0xE0010000" mode = "__W_" x = "0" y = "1" psegname = "PSEG_MMC" >
+            <vobj name = "memc_1"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_memc_2"         vbase = "0xE0100000" mode = "__W_" x = "1" y = "0" psegname = "PSEG_MMC" >
+            <vobj name = "memc_2"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_memc_3"         vbase = "0xE0110000" mode = "__W_" x = "1" y = "1" psegname = "PSEG_MMC" >
+            <vobj name = "memc_3"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+
+*** 4 global vsegs for replicated schedulers / A[31:28] = 0xC / Increment = 0x10000
+
+        <vseg name = "seg_sched_0"        vbase = "0xC0000000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" >
+            <vobj name = "sched_0"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+        <vseg name = "seg_sched_1"        vbase = "0xC0010000" mode = "C_W_" x = "0" y = "1" psegname = "PSEG_RAM" >
+            <vobj name = "sched_1"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+        <vseg name = "seg_sched_2"        vbase = "0xC0100000" mode = "C_W_" x = "1" y = "0" psegname = "PSEG_RAM" >
+            <vobj name = "sched_2"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+        <vseg name = "seg_sched_3"        vbase = "0xC0110000" mode = "C_W_" x = "1" y = "1" psegname = "PSEG_RAM" >
+            <vobj name = "sched_3"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+
+    </globalset> 
+
+    <vspaceset>
+
+*** For each vspace, the startname field is the name of the vobj containing the start_vector (entry point array)
+*** For each task, the startid field define the task entry point as an index in the start_vector
+*** For each task, the clusterid and proclocid arguments define the task static placement
+*** For each task, the stackname field is the name of the vobj containing the task stack 
+*** For each task, the heapname field is the name of the vobj containing the task heap 
+
+        <vspace name = "transpose" startname = "trsp_data" > 
+            <vseg name = "seg_trsp_code"     vbase = "0x00400000" mode = "CXWU" x = "1" y = "1" psegname = "PSEG_RAM" > 
+                <vobj name = "trsp_code"     type  = "ELF" length = "0x00010000" binpath = "build/transpose/transpose.elf" /> 
+            </vseg>
+            <vseg name = "seg_trsp_data"     vbase = "0x00500000" mode = "C_WU" x = "1" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "trsp_data"     type  = "ELF" length = "0x00010000" binpath = "build/transpose/transpose.elf" />
+            </vseg>
+            <vseg name = "seg_trsp_ptab"     vbase = "0x00600000" mode = "C_W_" x = "1" y = "1" psegname = "PSEG_RAM" > 
+                <vobj name = "trsp_ptab"     type  = "PTAB" length  = "0x00020000" align = "13" />
+            </vseg>
+            <vseg name = "seg_trsp_stack_0"  vbase = "0x00200000" mode = "C_WU" x = "0" y = "0" psegname = "PSEG_RAM" >
+                <vobj name = "trsp_stack_00" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_01" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_02" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_03" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_heap_0"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_trsp_stack_1"  vbase = "0x00280000" mode = "C_WU" x = "0" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "trsp_stack_10" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_11" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_12" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_13" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_heap_1"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_trsp_stack_2"  vbase = "0x00300000" mode = "C_WU" x = "1" y = "0" psegname = "PSEG_RAM" >
+                <vobj name = "trsp_stack_20" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_21" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_22" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_23" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_heap_2"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_trsp_stack_3"  vbase = "0x00380000" mode = "C_WU" x = "1" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "trsp_stack_30" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_31" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_32" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_33" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_heap_3"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <task name = "trsp_00" x = "0" y = "0" proclocid = "0" stackname = "trsp_stack_00"  heapname = "trsp_heap_0" startid = "0"  />
+            <task name = "trsp_01" x = "0" y = "0" proclocid = "1" stackname = "trsp_stack_01"  heapname = "trsp_heap_0" startid = "0"  />
+            <task name = "trsp_02" x = "0" y = "0" proclocid = "2" stackname = "trsp_stack_02"  heapname = "trsp_heap_0" startid = "0"  />
+            <task name = "trsp_03" x = "0" y = "0" proclocid = "3" stackname = "trsp_stack_03"  heapname = "trsp_heap_0" startid = "0"  />
+
+            <task name = "trsp_10" x = "0" y = "1" proclocid = "0" stackname = "trsp_stack_10"  heapname = "trsp_heap_1" startid = "0"  />
+            <task name = "trsp_11" x = "0" y = "1" proclocid = "1" stackname = "trsp_stack_11"  heapname = "trsp_heap_1" startid = "0"  />
+            <task name = "trsp_12" x = "0" y = "1" proclocid = "2" stackname = "trsp_stack_12"  heapname = "trsp_heap_1" startid = "0"  />
+            <task name = "trsp_13" x = "0" y = "1" proclocid = "3" stackname = "trsp_stack_13"  heapname = "trsp_heap_1" startid = "0"  />
+
+            <task name = "trsp_20" x = "1" y = "0" proclocid = "0" stackname = "trsp_stack_20"  heapname = "trsp_heap_2" startid = "0"  />
+            <task name = "trsp_21" x = "1" y = "0" proclocid = "1" stackname = "trsp_stack_21"  heapname = "trsp_heap_2" startid = "0"  />
+            <task name = "trsp_22" x = "1" y = "0" proclocid = "2" stackname = "trsp_stack_22"  heapname = "trsp_heap_2" startid = "0"  />
+            <task name = "trsp_23" x = "1" y = "0" proclocid = "3" stackname = "trsp_stack_23"  heapname = "trsp_heap_2" startid = "0"  />
+
+            <task name = "trsp_30" x = "1" y = "1" proclocid = "0" stackname = "trsp_stack_30"  heapname = "trsp_heap_3" startid = "0"  />
+            <task name = "trsp_31" x = "1" y = "1" proclocid = "1" stackname = "trsp_stack_31"  heapname = "trsp_heap_3" startid = "0"  />
+            <task name = "trsp_32" x = "1" y = "1" proclocid = "2" stackname = "trsp_stack_32"  heapname = "trsp_heap_3" startid = "0"  />
+            <task name = "trsp_33" x = "1" y = "1" proclocid = "3" stackname = "trsp_stack_33"  heapname = "trsp_heap_3" startid = "0"  />
+        </vspace>
+    </vspaceset>
+</mapping_info>
Index: /soft/giet_vm/mappings/4c_4p_transpose_leti_ext.xml
===================================================================
--- /soft/giet_vm/mappings/4c_4p_transpose_leti_ext.xml	(revision 295)
+++ /soft/giet_vm/mappings/4c_4p_transpose_leti_ext.xml	(revision 295)
@@ -0,0 +1,385 @@
+<?xml version="1.0"?>
+
+<mapping_info signature    = "0xdace2014" 
+              name         = "4c_4p_transpose_leti_ext" 
+              x_size       = "2" 
+              y_size       = "3" 
+              x_width      = "4"
+              y_width      = "4"
+			  irq_per_proc = "4" 
+              use_ramdisk  = "0"
+			  x_io         = "1"
+              y_io         = "2" >
+
+*** This mapping is for the "tsar_generic_leti" hardware architecture
+*** with 4 clusters containing processors and 4 processors per cluster
+*** 40 bits physical address, and 64 Mbytes per cluster.
+*** It uses the external peripherals, which means 2*3 clusters, because
+*** External peripherals are implemented in cluster(1,2), and the associated WTI
+*** are routed by the PIC component to the XCU in cluster (0,0).
+*** Cluster (0,0) contains two backup peripherals (TTY and Block Device),
+*** and the corresponding HWI are connected to the XICU in cluster (0,0)
+
+    <clusterset>
+
+        <cluster x = "0" y = "0" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x0000000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x00F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x00E0000000" length = "0x0000001000" />
+            <pseg name = "PSEG_IOC"  type = "PERI" base = "0x00F2000000" length = "0x0000001000" /> 
+            <pseg name = "PSEG_TTY"  type = "PERI" base = "0x00F4000000" length = "0x0000001000" /> 
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC"  >
+            </periph>
+            <periph type = "IOC"  psegname = "PSEG_IOC"  subtype = "BDV" > 
+            </periph>
+            <periph type = "TTY"  psegname = "PSEG_TTY"  channels = "1" > 
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "0"  dstid = "3" />
+                <irq srcid = "4"  srctype = "WTI"  isr = "ISR_NIC_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "5"  srctype = "WTI"  isr = "ISR_NIC_RX"  channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "6"  srctype = "WTI"  isr = "ISR_NIC_TX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "7"  srctype = "WTI"  isr = "ISR_NIC_TX"  channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "8"  srctype = "WTI"  isr = "ISR_CMA"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "9"  srctype = "WTI"  isr = "ISR_CMA"     channel = "1"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "10" srctype = "WTI"  isr = "ISR_CMA"     channel = "2"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "11" srctype = "WTI"  isr = "ISR_CMA"     channel = "3"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "12" srctype = "WTI"  isr = "ISR_BDV"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "13" srctype = "WTI"  isr = "ISR_TTY_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "9"  srctype = "HWI"  isr = "ISR_BDV"     channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+                <irq srcid = "10" srctype = "HWI"  isr = "ISR_TTY_RX"  channel = "0"  dstx = "0"  dsty = "0"  dstid = "0" />
+            </periph>
+        </cluster>
+
+        <cluster x = "0" y = "1" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x0100000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x01F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x01E0000000" length = "0x0000001000" />
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "0"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "0"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "0"  dsty = "1"  dstid = "0" />
+            </periph>
+        </cluster>
+
+        <cluster x = "1" y = "0" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x1000000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x10F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x10E0000000" length = "0x0000001000" />
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "0"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "1"  dsty = "0"  dstid = "0" />
+            </periph>
+        </cluster>
+
+        <cluster x = "1" y = "1" >
+            <pseg name = "PSEG_RAM"  type = "RAM"  base = "0x1100000000" length = "0x0400000000" />
+            <pseg name = "PSEG_XCU"  type = "PERI" base = "0x11F0000000" length = "0x0000002000" />
+            <pseg name = "PSEG_MMC"  type = "PERI" base = "0x11E0000000" length = "0x0000001000" />
+
+            <proc index  = "0" />
+            <proc index  = "1" />
+            <proc index  = "2" />
+            <proc index  = "3" />
+
+            <periph type = "MMC"  psegname = "PSEG_MMC" >
+            </periph>
+            <periph type = "XCU"  psegname = "PSEG_XCU"  channels = "16" >
+                <irq srcid = "0"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "WTI"  isr = "ISR_WAKUP"                  dstx = "1"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "0"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "0" />
+                <irq srcid = "1"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "1" />
+                <irq srcid = "2"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "2" />
+                <irq srcid = "3"  srctype = "PTI"  isr = "ISR_TICK"                   dstx = "1"  dsty = "1"  dstid = "3" />
+
+                <irq srcid = "8"  srctype = "HWI"  isr = "ISR_DEFAULT"                dstx = "1"  dsty = "1"  dstid = "0" />
+            </periph>
+        </cluster>
+
+*** empty cluster
+
+        <cluster x = "0" y = "2" >
+        </cluster>
+
+*** cluster_io
+
+        <cluster x = "1" y = "2" >
+            <pseg name = "PSEG_IOC"  type = "PERI" base = "0x12F2000000" length = "0x0000001000" /> 
+            <pseg name = "PSEG_FBF"  type = "PERI" base = "0x12F3000000" length = "0x0000004000" /> 
+            <pseg name = "PSEG_TTY"  type = "PERI" base = "0x12F4000000" length = "0x0000001000" /> 
+            <pseg name = "PSEG_NIC"  type = "PERI" base = "0x12F7000000" length = "0x0000080000" />
+            <pseg name = "PSEG_CMA"  type = "PERI" base = "0x12F8000000" length = "0x0000008000" />
+            <pseg name = "PSEG_PIC"  type = "PERI" base = "0x12F9000000" length = "0x0000004000" />
+
+            <periph type = "IOC"  psegname = "PSEG_IOC"  subtype = "BDV" > 
+            </periph>
+            <periph type = "FBF"  psegname = "PSEG_FBF" >
+            </periph>
+            <periph type = "TTY"  psegname = "PSEG_TTY"  channels = "1" > 
+            </periph>
+            <periph type = "NIC"  psegname = "PSEG_NIC"  channels = "2" >
+            </periph>
+            <periph type = "CMA"  psegname = "PSEG_CMA"  channels = "4" >
+            </periph>
+            <periph type = "PIC"  psegname = "PSEG_PIC"  channels = "32" >
+                <irq srcid = "0"  srctype  = "HWI"  isr = "ISR_NIC_RX" channel = "0"  dstx = "0"  dsty = "0"  dstid = "4"  />
+                <irq srcid = "1"  srctype  = "HWI"  isr = "ISR_NIC_RX" channel = "1"  dstx = "0"  dsty = "0"  dstid = "5"  />
+
+                <irq srcid = "2"  srctype  = "HWI"  isr = "ISR_NIC_TX" channel = "0"  dstx = "0"  dsty = "0"  dstid = "6"  />
+                <irq srcid = "3"  srctype  = "HWI"  isr = "ISR_NIC_TX" channel = "1"  dstx = "0"  dsty = "0"  dstid = "7"  />
+
+                <irq srcid = "4"  srctype  = "HWI"  isr = "ISR_CMA"    channel = "0"  dstx = "0"  dsty = "0"  dstid = "8"  />
+                <irq srcid = "5"  srctype  = "HWI"  isr = "ISR_CMA"    channel = "1"  dstx = "0"  dsty = "0"  dstid = "9"  />
+                <irq srcid = "6"  srctype  = "HWI"  isr = "ISR_CMA"    channel = "2"  dstx = "0"  dsty = "0"  dstid = "10" />
+                <irq srcid = "7"  srctype  = "HWI"  isr = "ISR_CMA"    channel = "3"  dstx = "0"  dsty = "0"  dstid = "11" />
+
+                <irq srcid = "8"  srctype  = "HWI"  isr = "ISR_BDV"    channel = "0"  dstx = "0"  dsty = "0"  dstid = "12" />
+
+                <irq srcid = "16" srctype  = "HWI"  isr = "ISR_TTY_RX" channel = "0"  dstx = "0"  dsty = "0"  dstid = "13" />
+            </periph>
+        </cluster>
+
+    </clusterset>
+
+    <globalset> 
+
+*** Global vsegs associated to peripherals  replicated in all clusters (XCU, MMC, SCHED)
+*** must respect the following policy (checked by the XML parser) :
+*** For segments replicated in all clusters
+*** vbase[x,y] = vbase[0,0] + 64K * cluster_xy
+*** pbase[x,y] = pbase[0,0] + 4G  * cluster_xy 
+*** ( with cluster_xy = x*16 + y )
+*** the vseg type is entirely defined by the 8 virtual address MSB bits (mask_type = 0xFF000000)
+*** The cluster index must be encoded in the next 8 virtual address bits (cluster_mask = 0x00FF0000)
+
+*** 5 global vsegs used by the boot code / A[31:28] = 0x0 / Identity mapping
+*** seg_boot_mapping is loaded by the boot-loader. It contains the mapping info.  Reused by the kernel.
+*** seg_boot_code and seg_boot data are loaded by the preloader, used by the boot-loader.  Not reused by the kernel.
+*** seg_boot_stack contains the stacks used by all processors during reset and boot.  Not reused by the Kernel.
+*** seg_boot_buffer is used by the boot-loader. It contains a complete .elf file.  Not reused by the kernel.
+
+        <vseg name = "seg_boot_code"      vbase = "0x00010000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_code"      type = "BUFFER" length = "0x00020000" />
+        </vseg>
+        <vseg name = "seg_boot_data"      vbase = "0x00030000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_data"      type = "BUFFER" length = "0x00010000" />
+        </vseg>
+        <vseg name = "seg_boot_buffer"    vbase = "0x00040000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_buffer"    type = "BUFFER" length = "0x00060000" />
+        </vseg>
+        <vseg name = "seg_boot_stack"     vbase = "0x000A0000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_stack"     type = "BUFFER" length = "0x00050000" />
+        </vseg>
+        <vseg name = "seg_boot_mapping"   vbase = "0x000F0000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "boot_mapping"   type = "BLOB"   length = "0x00010000" binpath	= "map.bin" />
+        </vseg>
+        
+*** 4 global vsegs used by the kernel / A[31:28] = 0x8  / No identity mapping constraint
+  
+        <vseg name = "seg_kernel_code"    vbase = "0x80000000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_code"    type = "ELF" length = "0x00020000" binpath = "build/kernel/kernel.elf" />
+        </vseg>
+        <vseg name = "seg_kernel_data"    vbase = "0x80020000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_data"    type = "ELF" length = "0x00060000" binpath = "build/kernel/kernel.elf" />
+		</vseg>
+        <vseg name = "seg_kernel_uncdata" vbase = "0x80080000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_uncdata" type = "ELF" length = "0x00040000" binpath = "build/kernel/kernel.elf" />
+        </vseg>
+        <vseg name = "seg_kernel_init"    vbase = "0x800C0000" mode = "CXW_" x = "0" y = "0" psegname = "PSEG_RAM" > 
+            <vobj name = "kernel_init"    type = "ELF" length = "0x00010000" binpath = "build/kernel/kernel.elf" />
+        </vseg>
+
+*** 6 global vsegs for non replicated peripherals in cluster(1,2) / A[31:28] = 0xF / 
+
+        <vseg name = "seg_ioc"            vbase = "0xF2000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_IOC" >
+            <vobj name = "ioc"            type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_tty"            vbase = "0xF4000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_TTY" >
+   			<vobj name = "tty"            type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_nic"            vbase = "0xF5000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_NIC" >
+            <vobj name = "nic"            type = "PERI" length  = "0x00080000" /> 
+        </vseg>
+        <vseg name = "seg_cma"            vbase = "0xF8000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_CMA" >
+            <vobj name = "cma"            type = "PERI" length  = "0x00008000" /> 
+        </vseg>
+        <vseg name = "seg_fbf"            vbase = "0xF3000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_FBF" >
+            <vobj name = "fbf"            type = "PERI" length  = "0x00004000" /> 
+        </vseg>
+        <vseg name = "seg_pic"            vbase = "0xF9000000" mode = "__W_" x = "1" y = "2" psegname = "PSEG_PIC" >
+            <vobj name = "pic"            type = "PERI" length  = "0x00004000" /> 
+        </vseg>
+
+*** 1 global vseg for pseudo-peripherals (PRELOADER) / A[31:28] = 0x0 
+
+        <vseg name = "seg_reset_code"     vbase = "0x00000000" mode = "CX__" x = "0" y = "0" psegname = "PSEG_RAM" ident = "1" >
+            <vobj name = "preloader"      type = "BUFFER" length  = "0x00010000" /> 
+        </vseg>
+
+*** 4 global vsegs for replicated ICUS / A[31:24] = 0xF0 / Increment = 0x10000 / Identity mapping in cluster (0,0)            
+
+        <vseg name = "seg_icu_0"          vbase = "0xF0000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_XCU" ident = "1" > 
+            <vobj name = "icu_0"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_icu_1"          vbase = "0xF0010000" mode = "__W_" x = "0" y = "1" psegname = "PSEG_XCU" > 
+            <vobj name = "icu_1"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_icu_2"          vbase = "0xF0100000" mode = "__W_" x = "1" y = "0" psegname = "PSEG_XCU" > 
+            <vobj name = "icu_2"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+        <vseg name = "seg_icu_3"          vbase = "0xF0110000" mode = "__W_" x = "1" y = "1" psegname = "PSEG_XCU" > 
+            <vobj name = "icu_3"          type = "PERI" length  = "0x00001000" /> 
+        </vseg>
+
+*** 4 global vsegs for replicated MMC / A[31:24] = 0xE0 / Increment = 0x10000 / Identity mapping in cluster 0
+
+        <vseg name = "seg_memc_0"         vbase = "0xE0000000" mode = "__W_" x = "0" y = "0" psegname = "PSEG_MMC" ident = "1" >
+            <vobj name = "memc_0"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_memc_1"         vbase = "0xE0010000" mode = "__W_" x = "0" y = "1" psegname = "PSEG_MMC" >
+            <vobj name = "memc_1"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_memc_2"         vbase = "0xE0100000" mode = "__W_" x = "1" y = "0" psegname = "PSEG_MMC" >
+            <vobj name = "memc_2"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+        <vseg name = "seg_memc_3"         vbase = "0xE0110000" mode = "__W_" x = "1" y = "1" psegname = "PSEG_MMC" >
+            <vobj name = "memc_3"         type = "PERI" length  = "0x00001000" />
+        </vseg>
+
+*** 4 global vsegs for replicated schedulers / A[31:28] = 0xC / Increment = 0x10000
+
+        <vseg name = "seg_sched_0"        vbase = "0xC0000000" mode = "C_W_" x = "0" y = "0" psegname = "PSEG_RAM" >
+            <vobj name = "sched_0"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+        <vseg name = "seg_sched_1"        vbase = "0xC0010000" mode = "C_W_" x = "0" y = "1" psegname = "PSEG_RAM" >
+            <vobj name = "sched_1"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+        <vseg name = "seg_sched_2"        vbase = "0xC0100000" mode = "C_W_" x = "1" y = "0" psegname = "PSEG_RAM" >
+            <vobj name = "sched_2"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+        <vseg name = "seg_sched_3"        vbase = "0xC0110000" mode = "C_W_" x = "1" y = "1" psegname = "PSEG_RAM" >
+            <vobj name = "sched_3"        type = "SCHED" length  = "0x00008000" />
+        </vseg>
+
+    </globalset> 
+
+    <vspaceset>
+
+*** For each vspace, the startname field is the name of the vobj containing the start_vector (entry point array)
+*** For each task, the startid field define the task entry point as an index in the start_vector
+*** For each task, the clusterid and proclocid arguments define the task static placement
+*** For each task, the stackname field is the name of the vobj containing the task stack 
+*** For each task, the heapname field is the name of the vobj containing the task heap 
+
+        <vspace name = "transpose" startname = "trsp_data" > 
+            <vseg name = "seg_trsp_code"     vbase = "0x00400000" mode = "CXWU" x = "1" y = "1" psegname = "PSEG_RAM" > 
+                <vobj name = "trsp_code"     type  = "ELF" length = "0x00010000" binpath = "build/transpose/transpose.elf" /> 
+            </vseg>
+            <vseg name = "seg_trsp_data"     vbase = "0x00500000" mode = "C_WU" x = "1" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "trsp_data"     type  = "ELF" length = "0x00010000" binpath = "build/transpose/transpose.elf" />
+            </vseg>
+            <vseg name = "seg_trsp_ptab"     vbase = "0x00600000" mode = "C_W_" x = "1" y = "1" psegname = "PSEG_RAM" > 
+                <vobj name = "trsp_ptab"     type  = "PTAB" length  = "0x00020000" align = "13" />
+            </vseg>
+            <vseg name = "seg_trsp_stack_0"  vbase = "0x00200000" mode = "C_WU" x = "0" y = "0" psegname = "PSEG_RAM" >
+                <vobj name = "trsp_stack_00" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_01" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_02" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_03" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_heap_0"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_trsp_stack_1"  vbase = "0x00280000" mode = "C_WU" x = "0" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "trsp_stack_10" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_11" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_12" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_13" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_heap_1"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_trsp_stack_2"  vbase = "0x00300000" mode = "C_WU" x = "1" y = "0" psegname = "PSEG_RAM" >
+                <vobj name = "trsp_stack_20" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_21" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_22" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_23" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_heap_2"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <vseg name = "seg_trsp_stack_3"  vbase = "0x00380000" mode = "C_WU" x = "1" y = "1" psegname = "PSEG_RAM" >
+                <vobj name = "trsp_stack_30" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_31" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_32" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_stack_33" type  = "BUFFER" length = "0x00010000" /> 
+                <vobj name = "trsp_heap_3"   type  = "BUFFER" length = "0x00040000" /> 
+            </vseg>
+            <task name = "trsp_00" x = "0" y = "0" proclocid = "0" stackname = "trsp_stack_00"  heapname = "trsp_heap_0" startid = "0"  />
+            <task name = "trsp_01" x = "0" y = "0" proclocid = "1" stackname = "trsp_stack_01"  heapname = "trsp_heap_0" startid = "0"  />
+            <task name = "trsp_02" x = "0" y = "0" proclocid = "2" stackname = "trsp_stack_02"  heapname = "trsp_heap_0" startid = "0"  />
+            <task name = "trsp_03" x = "0" y = "0" proclocid = "3" stackname = "trsp_stack_03"  heapname = "trsp_heap_0" startid = "0"  />
+
+            <task name = "trsp_10" x = "0" y = "1" proclocid = "0" stackname = "trsp_stack_10"  heapname = "trsp_heap_1" startid = "0"  />
+            <task name = "trsp_11" x = "0" y = "1" proclocid = "1" stackname = "trsp_stack_11"  heapname = "trsp_heap_1" startid = "0"  />
+            <task name = "trsp_12" x = "0" y = "1" proclocid = "2" stackname = "trsp_stack_12"  heapname = "trsp_heap_1" startid = "0"  />
+            <task name = "trsp_13" x = "0" y = "1" proclocid = "3" stackname = "trsp_stack_13"  heapname = "trsp_heap_1" startid = "0"  />
+
+            <task name = "trsp_20" x = "1" y = "0" proclocid = "0" stackname = "trsp_stack_20"  heapname = "trsp_heap_2" startid = "0"  />
+            <task name = "trsp_21" x = "1" y = "0" proclocid = "1" stackname = "trsp_stack_21"  heapname = "trsp_heap_2" startid = "0"  />
+            <task name = "trsp_22" x = "1" y = "0" proclocid = "2" stackname = "trsp_stack_22"  heapname = "trsp_heap_2" startid = "0"  />
+            <task name = "trsp_23" x = "1" y = "0" proclocid = "3" stackname = "trsp_stack_23"  heapname = "trsp_heap_2" startid = "0"  />
+
+            <task name = "trsp_30" x = "1" y = "1" proclocid = "0" stackname = "trsp_stack_30"  heapname = "trsp_heap_3" startid = "0"  />
+            <task name = "trsp_31" x = "1" y = "1" proclocid = "1" stackname = "trsp_stack_31"  heapname = "trsp_heap_3" startid = "0"  />
+            <task name = "trsp_32" x = "1" y = "1" proclocid = "2" stackname = "trsp_stack_32"  heapname = "trsp_heap_3" startid = "0"  />
+            <task name = "trsp_33" x = "1" y = "1" proclocid = "3" stackname = "trsp_stack_33"  heapname = "trsp_heap_3" startid = "0"  />
+        </vspace>
+    </vspaceset>
+</mapping_info>
Index: /soft/giet_vm/pgcd/main.c
===================================================================
--- /soft/giet_vm/pgcd/main.c	(revision 294)
+++ /soft/giet_vm/pgcd/main.c	(revision 295)
@@ -1,3 +1,4 @@
 #include "stdio.h"
+#include "hard_config.h"
 
 /////////////////////////////////////////
@@ -7,6 +8,12 @@
     unsigned int opy;
 
-    giet_tty_printf("Starting task PGCD on processor %d at cycle %d\n",
-                   giet_procid(), giet_proctime());
+    unsigned int    procid     = giet_procid();
+    unsigned int    cluster_xy = procid/NB_PROCS_MAX;
+    unsigned int    lpid       = procid%NB_PROCS_MAX;
+    unsigned int    x          = cluster_xy >> Y_WIDTH;
+    unsigned int    y          = cluster_xy & ((1<<Y_WIDTH)-1);
+
+    giet_tty_printf( "*** Starting task pgcd on processor[%d,%d,%d] at cycle %d\n\n", 
+                      x, y, lpid, giet_proctime() );
 
     while (1) 
Index: /soft/giet_vm/router/main.c
===================================================================
--- /soft/giet_vm/router/main.c	(revision 294)
+++ /soft/giet_vm/router/main.c	(revision 295)
@@ -2,6 +2,7 @@
 #include "mwmr_channel.h"
 #include "mapping_info.h"
+#include "hard_config.h"
 
-#define NMAX 200
+#define NMAX 50
 
 /////////////////////////////////////////////
@@ -13,17 +14,16 @@
     mwmr_channel_t*	mwmr;
 
-    giet_tty_printf( "*** Starting task producer on processor %d", giet_procid() );
-    giet_tty_printf( " at cycle %d ***\n\n", giet_proctime() );
+    unsigned int    procid     = giet_procid();
+    unsigned int    cluster_xy = procid/NB_PROCS_MAX;
+    unsigned int    lpid       = procid%NB_PROCS_MAX;
+    unsigned int    x          = cluster_xy >> Y_WIDTH;
+    unsigned int    y          = cluster_xy & ((1<<Y_WIDTH)-1);
 
-    if( giet_vobj_get_vbase( "router" , 
-                             "mwmr_in", 
-                             VOBJ_TYPE_MWMR, 
-                             (void*)&mwmr ) )
-    {
-        giet_tty_printf( "\n[ERROR] in producer task :\n");
-        giet_tty_printf( "          undefined <mwmr_in> channel: %d\n", mwmr);
-        giet_tty_printf( "*** &mwmr_in = %x\n\n", (unsigned int)mwmr );
-        giet_exit();
-    }
+    giet_tty_printf( "*** Starting task producer on processor[%d,%d,%d] at cycle %d\n\n", 
+                      x, y, lpid, giet_proctime() );
+
+    giet_vobj_get_vbase( "router" , 
+                         "mwmr_in", 
+                         (void*)&mwmr );
 
     // main loop : display token value = source index
@@ -35,6 +35,5 @@
     }
 
-    giet_tty_printf( "\n*** Completing producer task at cycle %d ***\n", giet_proctime());
-    giet_exit();
+    giet_exit( "Producer task completed");
 
 } // end producer()
@@ -47,16 +46,16 @@
     mwmr_channel_t*	mwmr;
 
-    giet_tty_printf( "*** Starting task consumer on processor %d", giet_procid() );
-    giet_tty_printf( " at cycle %d ***\n\n", giet_proctime() );
+    unsigned int    procid     = giet_procid();
+    unsigned int    cluster_xy = procid/NB_PROCS_MAX;
+    unsigned int    lpid       = procid%NB_PROCS_MAX;
+    unsigned int    x          = cluster_xy >> Y_WIDTH;
+    unsigned int    y          = cluster_xy & ((1<<Y_WIDTH)-1);
 
-    if ( giet_vobj_get_vbase( "router" , 
-                              "mwmr_out", 
-                              VOBJ_TYPE_MWMR, 
-                              (void*)&mwmr ) )
-    {
-        giet_tty_printf( "\n[ERROR] in consumer task :\n");
-        giet_tty_printf( "          undefined <mwmr_out> channel\n");
-        giet_exit();
-    }
+    giet_tty_printf( "*** Starting task consumer on processor[%d,%d,%d] at cycle %d\n\n", 
+                      x, y, lpid, giet_proctime() );
+
+    giet_vobj_get_vbase( "router" , 
+                         "mwmr_out", 
+                         (void*)&mwmr );
 
     // main loop : display token arrival index and value
@@ -67,6 +66,5 @@
     }
 
-    giet_tty_printf( "\n*** Completing consumer task at cycle %d ***\n", giet_proctime());
-    giet_exit();
+    giet_exit( "Consumer task completed");
 
 } // end consumer()
@@ -76,33 +74,25 @@
 {
     unsigned int 	buf;
-    unsigned int 	x;
+    unsigned int 	n;
     unsigned int	tempo;
     mwmr_channel_t*	mwmr_in ;
     mwmr_channel_t* mwmr_out ;
 
-    
-    giet_tty_printf( "*** Starting task router on processor %d", giet_procid() ); 
-    giet_tty_printf( " at cycle %d ***\n\n", giet_proctime() );
+    unsigned int    procid     = giet_procid();
+    unsigned int    cluster_xy = procid/NB_PROCS_MAX;
+    unsigned int    lpid       = procid%NB_PROCS_MAX;
+    unsigned int    x          = cluster_xy >> Y_WIDTH;
+    unsigned int    y          = cluster_xy & ((1<<Y_WIDTH)-1);
 
-    if ( giet_vobj_get_vbase( "router" , 
-                              "mwmr_out", 
-                              VOBJ_TYPE_MWMR, 
-                              (void*)&mwmr_out ) )
-    {
-        giet_tty_printf( "\n[ERROR] in router task :\n");
-        giet_tty_printf( "          undefined <mwmr_in> channel\n");
-        giet_exit();
-    }
+    giet_tty_printf( "*** Starting task router on processor[%d,%d,%d] at cycle %d\n\n", 
+                      x, y, lpid, giet_proctime() );
 
-    if (  giet_vobj_get_vbase( "router" , 
-                               "mwmr_in", 
-                               VOBJ_TYPE_MWMR, 
-                               (void*)&mwmr_in ) )
-    {
-        giet_tty_printf( "\n[ERROR] in router task :\n");
-        giet_tty_printf( "          undefined <mwmr_out> channel\n");
-        giet_exit();
-    }
+    giet_vobj_get_vbase( "router" , 
+                         "mwmr_out", 
+                         (void*)&mwmr_out );
 
+    giet_vobj_get_vbase( "router" , 
+                         "mwmr_in", 
+                         (void*)&mwmr_in );
     // main loop
     while(1)
@@ -110,5 +100,5 @@
         mwmr_read( mwmr_in , &buf , 1 );
         tempo = giet_rand() >> 6;
-        for ( x = 0 ; x < tempo ; x++ ) asm volatile ("");
+        for ( n = 0 ; n < tempo ; n++ ) asm volatile ("");
         giet_tty_printf( "token value : %d / temporisation = %d\n", buf, tempo);
         mwmr_write( mwmr_out, &buf , 1 );
Index: /soft/giet_vm/sort/main.c
===================================================================
--- /soft/giet_vm/sort/main.c	(revision 294)
+++ /soft/giet_vm/sort/main.c	(revision 295)
@@ -1,14 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
-// File :
-//      
-//      main.c
-//
-// Date :
-//      
-//      November 2013
-//
-// Author :
-//
-//      Cesar Fuguet Tortolero <cesar.fuguet-tortolero@lip6.fr>
+// File   :  main.c
+// Date   :  November 2013
+// Author :  Cesar Fuguet Tortolero <cesar.fuguet-tortolero@lip6.fr>
 //
 // Description :
@@ -38,5 +30,5 @@
 #include "barrier.h"
 
-#define ARRAY_LENGTH    2048
+#define ARRAY_LENGTH    512 
 #define IPT             (ARRAY_LENGTH / *nb_thread) // ITEMS PER THREAD
 
@@ -47,17 +39,15 @@
 #define VERBOSE         1
 
-///////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
 // Define printf according to verbosity option and number of available
 // TTY
 
 #if (VERBOSE == 1)
-#   define printf(...)     giet_tty_printf(__VA_ARGS__)
-#   define puts(...)       giet_tty_puts(__VA_ARGS__)
+#   define printf(...)     giet_shr_printf(__VA_ARGS__)
 #else       // VERBOSE == 0
 #   define printf(...)
-#   define puts(...)
 #endif
 
-#define task0_printf(...) if(thread_id == 0) giet_tty_printf(__VA_ARGS__)
+#define task0_printf(...) if(thread_id == 0) giet_shr_printf(__VA_ARGS__)
 
 #define exit    giet_exit
@@ -89,4 +79,5 @@
 giet_barrier_t barrier[8];
 
+//////////////////////////////////////////
 __attribute__ ((constructor)) void sort()
 {
@@ -100,15 +91,9 @@
     unsigned int time_end;   
 
-    if( giet_vobj_get_vbase( "sort" , 
-                             "nb_thread", 
-                             VOBJ_TYPE_CONST, 
-                             (unsigned int*)&nb_thread ) )
-    {
-        printf( "\n[ERROR] in sort task :\n");
-        printf( "          undefined <nb_thread> constant: %d\n", nb_thread);
-        exit();
-    }   
+    giet_vobj_get_vbase( "sort" , 
+                         "nb_thread", 
+                         (unsigned int*)&nb_thread );
     
-    task0_printf("[Thread 0 ] Starting sort application with %d threads "
+    task0_printf("\n[ Thread 0 ] Starting sort application with %d threads "
                  "at cycle %d\n", *nb_thread, time_start);
 
@@ -141,5 +126,5 @@
     // Parallel sort of array elements
 
-    printf("[ Thread %d ] Stage 0: Processor Sorting...\n\r", thread_id);
+    printf("[ Thread %d ] Stage 0: Sorting...\n\r", thread_id);
 
     bubbleSort(array0, IPT, IPT * thread_id);
@@ -154,9 +139,9 @@
         if((thread_id % (2 << i)) != 0)
         {
-            printf("[ Thread %d ] Quits\n\r", thread_id);
-            exit();
-        }
-
-        printf("[ Thread %d ] Stage %d: Starting...\n\r", thread_id, i+1);
+            printf("[ Thread %d ] Quit\n\r", thread_id );
+            exit("Completed");
+        }
+
+        printf("[ Thread %d ] Stage %d: Sorting...\n\r", thread_id, i+1);
 
         if((i % 2) == 0)
@@ -203,4 +188,5 @@
 
         time_end = giet_proctime();
+
         printf("[ Thread 0 ] Finishing sort application at cycle %d\n"
                "[ Thread 0 ] Time elapsed = %d\n",
@@ -209,26 +195,24 @@
         if (success)
         {
-
-            printf("[ Thread 0 ] Success!!\n\r");
+            exit("!!! Success !!!");
         }
         else
         {
-            printf("[ Thread 0 ] Failure!! Incorrect element: %d\n\r", failure_index);
-
-
+            printf("[ Thread 0 ] Failure!! Incorrect element: %d\n\r", 
+                   failure_index);
             for(i=0; i<ARRAY_LENGTH; i++)
             {
                 printf("array[%d] = %d\n", i, dst_array[i]);
             }
-        }
-    }
-
-    exit();
+            exit("!!!  Failure !!!");
+        }
+    }
+    exit("Completed");
 }
 
-void bubbleSort(
-        int * array,
-        unsigned int length,
-        unsigned int init_pos)
+////////////////////////////////////
+void bubbleSort( int *        array,
+                 unsigned int length,
+                 unsigned int init_pos )
 {
     int i;
@@ -250,4 +234,5 @@
 }
 
+/////////////
 void merge(
         int * array,
Index: /soft/giet_vm/transpose/bridge256.raw
===================================================================
--- /soft/giet_vm/transpose/bridge256.raw	(revision 295)
+++ /soft/giet_vm/transpose/bridge256.raw	(revision 295)
@@ -0,0 +1,869 @@
+^`qÄtnjvdqÃæãææâÎÞáîãæºÛÇ®¬ÄÍl«Æ¹žŠ¯ÄŽÌ«ª¶¹ÅÝÀ¯³ÃŠªŠž¥¥µªÂ°¯§¶­»|}yjnWOK`uvwgn
+|©p·[ Ž»§¥³ £¯Š€¥°¢£€² {siRhws}}ºfy¬
+€¡œÁ«ª¡Š|hox mpy|unh}liOTWR`
+e`lX~vwgu
+zn{~Q{yk[}xÀl|nfpÃäåâãâ°ØåçÝÞªÒ¶²
+
+¢©²Å·xÇÅÔ±Âž£®°²Žµ§©§Ì¹âËÆÈÆŸ±­»š®œ««€§ª¢©ª|nwyiu`YUU_nnv]©~£r§[t·ÊÅÂ²º¯°£ŒÊÄ°³¹Ÿ²«kziq\_S^Musk€uVon@6JI,0FEg:erafXA
+k±«°Šu]Lp
+ngQOS?MfY[qnvbcvNILE]NQQULZnk\jZVRK[gZHer}pqsYV\inWwzŸs¿blÇåäãçæžÕãâÛÝŒÅž¯lm{hª®
+Àªµ£žŠÃ¡º¿ÁÏ©ÕœáÈÖÓÁžž¬ÉšÀ²®°±¢¶­€«es`tYKUln
+kwve}k¡² h°aa±Á¯Æ²¹€¬µºÇÄÃ«š³©}ehXXTVTUVf[[f{gO[Mq0=037
+FXg>GTru}¢²y
+eiuhd_[`}sZffbZ`6PJjhHkgaYR[g`IURVDMYobQTK8E6E`cltj`ntjf[WefX]dšzÀ·±®jeÎÞààäæÁÙßáåâÊ·Ålreck]¡®œ|ÖªÆŸ©Â£­¥rÂâÄ¿ÖŸ§­©¯ÌÆ§¯§°¹Œ­¥ÂŒ±ª ¡ ¡ivtªWOYegxqzbYx}}\šµ»Âº¶°ª©¡¬ŽwÀ»uVVSQYGYkYZPjwefrb\&GE3sSBLFd{|a~¡®zZ{geqwfULlQSu?DLz]El¢€_RVZ_]XQMXG;EOa_MSJEL@UJDGND<SQpRZanxi_]©¬¥¯«mkàäàÞÜâÊÙàÙãèÒÁÍ¥sssdkº¹¡ª³ÀÁ€žŠ€{¥¡©ØŒÊÆ¯·«²³ÌÀ³œ­{š¯§¬¬€Zy¬fWL_tjn¢ mU
+yyhxoF¥y·Å®Šžª¹±¢¡®Œµ{kjTK\a[fbXbwii^ZnaPA=B`aIRmcuzi€u«irkim[BVQtiCEPdpiLk`FPG>IJ@6>PI94Y\OGW;=L?@^KsnMZ_P]Wd|­Ž­²xhØáßß×ß¹×æäéç×ÔÑ²}}t±{ÍÛÀ¡®£®¶±l|ÛŽÔœŽÂÉŽ¡¯€²º¯±¥Š¬§ept¢hKddqkn²hfuzjfrkwr£¡§r€w­hBkocVag^bYdpwvbem][U~PL+;>lraJ{<yWKmvmX]_[[
+V@Oe?vp`CGMŠkklp_s_eTY[XT@GtNM;4S=GANGDJ`^R_{NFPRDQYhUpx§Šu¯qhŠËáæâÛÒ¯ÚèìíëÝÐŒÃ}v Ê»ÊÜá·²¯¥¬ ¡o©âÄÏº¶ÃÆÇÂš€m¶ux¡® ngyX`kyzrokYwgbin`E~Ž¬xxw§¹§[ZSdhUX`Uuleq~j]ey_hVXPT=C7FGRDMYNE31^tFXi€zqke]jŠua2ESIMxURM_hbegZ[{u|¡zVGWAMOOMIQAIHRD`YROK7CCDKKpS|{¥£Ÿœli°ÊæÝæàË·ÔéëéèàÁž££szªŒÊŒÌÚÄš­©¡­fªÜÈÉ¶¿œ²œ€±¬­»šyq¢®}
+}€¹oQzp\Oa~i]jzŠe_PiwobItš¡¡
+£¥Ž¥±¡£|xpX:Rkhd`^jVO^_eczctdGTR^[OTH>4@bŠ;uxF@2YwW_umkekI\M[FI7TJGkelWinLr]]Oop{~dS:EefXRV~nF71SDKWE\NBXJO>]Vc]q]ey£»³qboºÌàÔßä×³ÕæàÙÎÅ­q}k¡|rz}À«²µ­¡ÖØÐÈŸŽªž¶€«¹}{w»|ykJuzQaqoše`gw}~PCFtwoiMl š£¬Áµ[ww|?:eP|\XTfQUGLirmmtstLLJsIy?.K0=GmCXD-cy`tfPYtmVnxG>A>7dsNg{]XRdhf`[vrfsA=A5UILIXh[Q02>BbMST?EY|kyz]RPQp~c£±ªºXatºÔÒÔÝâå©ÌÙ·£ zixwxnsphqszÐÈ»­Ë£{º³ÎÑËÊ©š£¥°š¥~Žyw
+R~wz§©uPdKZZzx[nNLvoZ_e`i]\lqg]®®³§x]T=?OymEIJKkJKEaaszxev|_To]efi<AH>I]bIU_CHbeY²­hTTqZzdU;B<I_aJQWLRTWee[kBdfct@FG>KNIYiS7/09A<GdwnV_pbtkwS9CwWss}¯mioŠ×ÈÞÛÞå¬»µtzu}o
+wgzhR\Rppz{kãµ×Å¬y¢y œ¿ØÔ£ ©f°Šwmbj^Yqi^~¯h°pXmZORt` bqh=ibwvw¯š¢µ§Ž°¯[OM:DC`lSOG@]IJJWJelkSjhaaw¯Œr@YDUVMO>ZHW5Ay¯q¹®vARtzBpy[IFGGGGVJPwf]XKbŠMkeMBIJHZ]LadeJ4GN@KX^aj`|h\UjHbrigx 
+ujxr£ÚÆäØÛßž¡{¡­|§lgftz^ZHrÈn{Ï×¬
+}£|l
+~ºÆÌØaµ`^u
+hNW{m`x|z|©}ÐuvyrSIAZZ
+XzXBXQewpn­ÁœÄ±ªkp]aC3:7AcTB:<KPHMKBM[ke[a~¡¬¯uDgVFC[?rMb>.p¥ž¥¯mAROeMSXkRFMIK>XIJxeb`Lk}dt\nU>MRYcgUjKFAAYTPa\JNa}PRY`|hYµš²ªqwn~zgqØÇÔÞÞ×ž
+ŒÒÜÂ±±©y|q_e~°¡ š|²ÇÛ¬~iŽÀ¶á±¥€l«²°lkclNV{ |o|g­vm¶ŒvxW_VXlh
+¢hžÇxXPMdvytl¬£€Ã£ |UG17AHBECE7>?CNXXKOFhT{e¹uW]PL>.6PP:@X_Xe ³^gnQJUPTTYULaK>:OXU`bZWfsjZ{klEMQPQYoki]^S^TLLFOFpdvjb\nxrZdÙž~ygugf¹ØÝÂÖÛ°| Ô×Ñßá±¡£}xkhyŠ¢©q¶ ÎÒ~«š£»ÅÕáÐÇœ£®º®»rJHYwo~
+_ss~¢©ÅkSG]i]V{ Wn¡o§hZqrv`r\}Âgtš·zeN<D<::PRE9<LSBRZdNHTe~`h|®`iv:GR*%NPFBk`Ut[\REFHE@K^Y^eNMQlQ\e\i_XGP\x®IX^IUWGY]o[^h`RZXH:Mjjqowcl}vgf²|¡©±wi³ÙáºÊÕÐÊãäœÜä¥enu|€o`Ðw±Ë×áÞÀ«¶¿©£©RJap|sspwj
+€Ëg[WG1^naOOPrQWt{jrplqYuxpbQ\|sµ^BgW:0A1BXNFCLMGEOUQLRW_¡€ª]~YUŒz>ebVQ;GyHleEH`lM\]EIDIN\\PQ\bQfP[egQQLJMgnRNMJYXABW_ueVliV[YVSPIF;Ui^_\wsshZ¶y`¡£­r¯hXÖÝÆ£ŸÉ³»ÞåÛÎ×àv{~dejÊ§wd`in¢~sÈ­œàÕË«¹²À»°§{€¢ sxhrmyrm mcs¿kg`ZH\UFGMRLc`Y^L^bnxJ=Ud[USuLKGU§š:eVkD:613DG6GOFDDUHVNKS_muŸŒ¥¡nffcMfkC[ov]P=5Eip\hd]j\uXTca=Z^wH_UL[c_cP\UQzVnRYKFDUZngXU_RPZUII?NT[KIRv_gRvgvŠpšÂÊŽŠn~w`gÃÉÌ­»ÈÝæáÌÏÝ¡ntacÎ­yrYLWk|sw¡šÍ×ÉÆÀŽ¥·Æº ²¡ xqg~]oxphvuif_JCVR3@MS^YutUc§ºZlYi?Kt{c\_2eb§x]P>?8<7>3HCJHUEQZGU]jj¢ÏÄ«[UT~k
+UXfUZUiacPBYjeygPSWS`jU[¥bIYhc[VLaP]_Pq^AO{e`aaTXYZ^rdaZOXJ[BFOPXMEK`WWe
+]²Œ§¿©§no h]b££¥kiÁÖâÜÔÙÝ°¥_Td}|RZb|s\{u|}n¶ÔÖÓ»ÅÂ¢ÅŒš£³{pqk¢do{{lzq_XS_NUHNB;4@WnHTKSw~«ÔUKP?N`~bB?13jbZzpG743>FABEDQTDQNGQX`|¯Îœ·Ow
+¶·R_ESDA[QK`WtUqyaLIEXc`RiyFEQ`^CBXWR^Phcfos}ZgicXRLK^eiSQSGSRQR^ZT=RbgLJy¥s¥°zduYcnqujljg}ÀÖàÜÜÞÙ¢oÈ¢ yub|e}w
+z§o€ÒÒ¥§Œ Ÿ²l vu]s°h~kgrW[XKLR@VLDT6GIDBMVŠ²ÖµsAKR:S[aK:-q[LSVSI{}DA<=?B?@D=LMLWU\TZa¬¢h
+±vŠŠ·t\Q`HV\^ivRnyfTobKDVROoL^m{MDfSJ?aWXjgbpxlnVbhkxb[_RM[Zf]aIILC>@^MURAQ[qHYScPysRtrmtS`qqrrÃ®ÓÜãäàÙv·«mrd`·^Zar ¢¿¶·Œž€ÀŽ¯Ã^snxqºtbbc\f~jkZQgUF8<D;AGYŠÐÍÇ¶hDe]7.gOO5<d]F?FCTLELHOEdGAIJ[gR]@MJD<K
+IcGdQNhosI=ZXcgl>gxwk`~_VTHP_JVGHPAHBRay
+zqfwoWKarb}]Q[WPDOG\ITe`PUJEEYYHLD_yfTtao{NTgab[rrktcgTdmÀÃ³žÚ£ªÎ×åäßÜ¯©mxc°macoÆº¥¡ŒÀ¢±œª®£š¢|mrc^w©n
+erum^[Zgnskn>bdJ3B]kGËÉÉÆÂA,6;;Qm8d<ImghnZIMQUVXr_HDIBEN<9=@WMJAEJedVNXL@LVQT?TT2[mw\<X}®£eKISUbSRCJLRQI]p[YUgKVTCftTU[VQ5F\JHPQW_VNUI]GARKR[kgJmgscePYRrdk^
+cbUbnÁÝãÖÖÃÀ£ÐáèéáÙÍ©xmw€«Št[\nqž°ŠŠ¡
+Å»·¬š©Š¢¬¹ªmd]Wohxš³jZkP]QdWZN>KMRLKk]\ºÛÁ§Ò¿T)?J<Cf9_4fgZthNRmSG88M`=;>KRHEEGLSOJDYis]adfp`lp^W DOWprSAIQm®oBLG2GFSFQQU[Xa]QxeAHb]TBDH]UOGVMQ2=SVMKM_nRkVAbDWMH\c]hTQcn{ra_uV\luXonXUqÑßÛÅÅ³µ°ØæåäÙÚ±ay£{q}µoj
+tft»§£°¡ÂÆÊž«¶© Ž£ª¥¬­«¢nZWtk~d|yijjdQOCXFAEW[ZGEY^WGÁÇŒ¿ÁŒY)6BQSoYdPvcc¬lBJTQN8IHB=?CPFEFEOXQSILbkqvRc{¬Šªq©cJa;5G|cPT]Se|B7AKLSMVW_TJXLK\wqBMjKY:NLQRBSKHJJYKHFLFT\bPU?WGknP`GWS^Ii«Œ¡a|oTYxqX^YnÃÎÕÕÃ·­ŽÈÐÞààÔÒbgxpezqzfm¥·
+³w®ÓÖÀ¿¬¡Ÿ¬«µ°ª§«­^Ol^hoighZ]VgMHCC;><EMNH:AeObO§«±ÅÈ«d6.ocjaV[O}¢T=><=6CMX`PD7EYU@AFaPWIVE9SOfzvº ZdKKVcLyj\zmvD^gH?;>IYbFLD^HFIKKFVhCM]VMCQYXFY<>RK@@MESJYthfKZ]e}mnUEYWNuvx¯Ær¡kk\~kjm{jU~ÑÆÔÛÖÀ«±ŸÈÑÜåÜÐra}©¥{
+tftp®šŽyÃÜÀÊÒÌ·¶º¶¶¶š€€cpYg€pf^[a[Zc[VZXVGZBA><Fq@BUQ;g6fjŠ®³ÖÍ²kR_l`_ZhV«ba2J=KG>mzWRIYQQMOKoVNI@A8o\dfl{t}USVFDU
+Ykk}[GCQ=FARoXW[KYLIpL?>b\[PGDD4s]][U<:XHMANDo`[_cc
+_XX
+nrP]Qri{«cÅŠ{fzglaiidbWÑÃØâ×ËÁ¯Æ×ÞÙÜàÈp]
+sxx~
+xxx{²³š¡œyŸÙ×ÞÛÔ±ÅºŠ¬¯®«®©elq
+¬kyvkakilmV^\QLA8@:Kh`Ux:;bBU}«³Î»µ|agjcXcz¯]FHMfKE<NT]daFBV\L\]RZLOKjvrn~{~\iho[dBCSz?MPPH:jKpDFTnXZHSXFK_UEFb|dQK=Nc\}NEGHP<_uU9COLH^`^epRG?FjT>?Mn~¡nÖÄmjtvqo{jT_gZÉÜÚÚÖ·Ž¥ÆæèãÒÓž|}qxy
+{we~v~ªž§¢ÅßÞÖÚÓ€Œ¶Š¥¬€®ŠŠnz «tpo_hYUbcVKOH=9<;==LmrCB]MN_W¬¹Ÿ°¬mpUZX]PSJX[MN?MSSPS\C@R__UcYd]dpvf]ic¡yon]VnObpEaNaL0m`98I[_YMGbbOqCFFKHcXH=9]uWbC7EZMdSaTENRTF[FUQLT=7:S£|MJIYjnqÝÙvpxpWYjUac¯ÍØÌœÅ°ßèçêßÆ±lzdksfš®k  ÂãâÞÛ×­¶¶²¡š«ª¬lz«¥©rcfZV_VRLPNHQKHPVYQVkf?B:=Oo¹ŒÃÄ¶wxVoX^O`P_<IE73S@LDHFLZJ_{R[fabh|rth}b`Xv€ts»Ã}D1Oc]a_NR1FIh^cQLJQNTR\fS>JML]\AOSdpQFLrD<5PPhKF[\WTF?OFLNABHC|_MPI]tvÕÝ``d`Z]}|u]t[šÁÃÀŒÂÅŠæêëêåÌš§cW^q}q¢£Š žy¡ÚãáãÙÏ¡­ž®³®£Š§§Ž£¢Š°µpineKLRLS`SGDHJ[MxqzkH=A58Y·°ª»Šfhk\[\N?I<@96>'#D7GA^LZVPhY\sua|vvs\w«¬l}wŒÅÌ?DSvªf{_W/C^CpeRQI_bHSKOgVh_S]<F[ug>CU]lTKRk\^VNK^SPQCOKD<5N]kqRJEWY\xlšÉSoYl{femghaoÆË·ÕÏÖÒ§Éçêìåæ×¡vX[]_b}²š¬­{
+ÝáãáßÈ¶Ž³š¬€Š·šŽ|€_šjgxa]HROs}_AB9@QLw
+sq
+cE<4Dc°ªœÃ®}aU3TeEMINCKFE%1?CPQ^[VmyTSdW¡šw
+ª¬£c©fO}³É©j?amYeHkGuTbYXKSM\YDH^W€ {TO@ILeVLKfnIC7WDXMPLZUGKEFF72;ML]u\LRS[umykklgUmasmq{nmÇŒÓáÝÚàÈéíãæä×sz
+vsraqrfc{®ÁÆ©
+iÃâãâ×Ã¶«³¯Š€¶©«|šŽ]pz~e`tdQ\\wNJO=9;:=TYXGMfueME;GU±ÄÊÔŠ~bUQSQEK9@E.FV1,aMZwWNFSg\]«¥ªpwv¹¯Ÿ¯m±©¯ef|zÈŒš×¯;kbSMUISxMf_IA[csTBNŠœžinYODG@F]s;?O{D8JKF?Ebb]UN<4CGE@HHSCMYXVK]\^]ol²\cRdXovliÙÕÜåãÖÞÚÜçêæäÞÖŽ uk¡ttŠzÏ»¢À~ÃÚåæÙŸº°¶²ª³¥°œ¬LYmedi_hw`EB:N3=6:9L^UxdjJTU7<OyœºÐÏµœIUit\OUnZl\DF:Ljngiu^IZmzŠš¶µyqzVU¿»§«£
+aœ©Zg[zÀÌÐ¿Z`cp\k[w[kh_]^SPbz]N£¹T_B;EAM>H\OeV@MEQNGYape692HAHOO/@L@6>JPZZjZRY_ wkxcOlriÝçåäâÙÞÖÞæçÛÛÙÙz©¢x§·²wlf¢Œ±ÆÀÒÛçÓŽ¶³­¯­Œ€«µ
+ozYba\ZPXmW?<55=44E?EEbudp_M~i@BW·ŸÒÞ×ÃcaaOK_\FcT;MQ;Q
+}i`m_|¹Á\\nž®Šª¥ª¡¡rµuŠ nlZ^gogr[b­tGZawVT\`¶ÑjU{qZIu<;4GNh?Mz¡MODVhTTbOZkNK>PPX_865K==8GIHIGPV]d\[]ZSi{mgáêêááÜàÒÜäãàÙÏ×€¯Ÿª§¬ž¥y~³ÛÙ¥¢~wÈ
+ÆåàâÚ±¥·© °Â²©£d{mQLTKVPJGBFDB>4BI>165=G^OU^bFn;;C£²ÄÓ£stg\VuMFZXtn£|tq]snmuivcPLR¢¢¡²©v°md]zÈËÇqcgv|zŒrHG~IMQ\u[krzyDHX==;IYJ6j_itNN<DQgV`QL`_B>RW`N=5<7IAEKILIDNTVWihubpV^jv_^Se°âééåêãáÌÛÙÃãÚÈÈ©qk_r°Ô±¡Âž€âççâ­u§¶¡¶¬Ž€³·§|VqrJOWa_RSO@VO[EHJE3/64E[ULJRaV=O9B©µ¢hhogX`j
+guugdlTrqVkto}yzº~]Z>\gOI?©µŠ¡\uay]ož¡ÆÇÔœVAtev²BQRaVJFL\tpKfO[ZCR6:<BG[@6v\J8A;N^EIYVhY\?MSX[RA/145P=OCQLTlc[eoojVrxyttvxžÓÚáäÞÑÌÎÖÅàãÜÊÂ~¥·Škv~ww£Šæ§¥Â­ÜæäÜÄ£²~²«¬«²²ŽbtsKQclBLUEIbhVLR@>:<1;Kh[Ry¡Ž©Ž_^}m`KM`p]TW>KPN]^TQZsbNg~uxjCIW;Z\€Š¢t£W·§ÂÇÅØÒÊr?NEXVvzKWU^diWBLUi\IKGQHNM>?73_oIW··bZF71[piFBDJCKHCKCSI5154;ESRXKWOVSRliNi{~mceobwÇÈÔâáÚàßÉÊÌçæàÝÃ§¡oqÁ¥­r¡£¡ª|ÚåäÝÈ¯«ŠŽ³Š¬µ°€io
+J;nV1IHKAgHdXcRKJ88HfpJb{žœsp¬ŸÄÏÀxog~m_pdrfWIT?MIEQuiBQj_b[Yth8Kr^MOx·ššmº©z Ž¹ÆÒØÉ°P`f\S\m\VQGF\DQWHCFoWbj[I=OH4£Öº@<8aoT;:BRKIE>HTN8/45CDVIKJ]WJYYvSe]¡sb]UacØàÙØÁ¿Õ×ÖÃÎ×àØÓº£Ž¡m©swš ÏàäàÎ²¶ª€­±Žº°Áµp
+wO6J8JqbP_hb^qDG3PouYGYp]hŠ_U
+œÅ²un]}|rlP^J?ODOSVU[QpZmd_tYUaxVSKk
+ž| zqz³®»·ÊÎÉÅ¥ ±^FUdT}q]_\II\HfpP=CDFKjyveEBVE.ÁÐ¬{8AHYdlUFAUROLC@@C_9.1??IMSAMYOJYy€PUk|~OuUZguÓèÚáÙ¿ÎÆÓÉàÜ×ÓÐ§ ¡¯ªmiŠ¥¯zx}µÛäçäË¯ž­¥š°®¶¬·»€MKDA=c[Xvib8H9@nH]{rž¬²±š|ukfSs¥sOVDQDQNXrinWbjwXOc[gMORZš¯v]«²ÅŸÃÎºŽXBFLTtTG[VXQN_h]EELIN£ULnK7R^VI€:HB_]MQ^P<OJN>??AJB43EBJXM7PLKTlqxmq[uQLidmÓèåâÛÃÁÓÕ»ÔØÌÇËŽt~ŸŽx~°¶jjf¯©ª€¯ÙæèâÇ®®©³¬¬©£µŸŠqdo6qYMUcLonow>OAS nuteQ§£qpddxw¢ŠfoLRNlUZOifXWriftQnZ6MošºµºÁ[¥«£šÇÌÑÄ¿±µ±f_9EX`tUHWe]fr[^P@RGG@HFVM?F[B.z8<L[n[YYCE>@K2BBME?0@D?J[UJEIW[V=RX_npWMJQ\waØáçèçÎÑÛÄ×ááßÓ×¡v€«Ë«Ìà§mlg¢x}¯¶ÔçéâÌ©µœŒ¯§¯¿®
+
+{5}]V``\va_WSVMjxo_³ËÇau¥£wca¬Ša]GAFXSR[zx\epmTNtnrq^VYXebnœsŽŸ²ŸÂÌÓÊ¯Œ·µ_YFQRbhygOXLwWTLYXBDIQ@]OXSCHDT?7QjVj99DU]`QR=C:MfU5CZ]N=:9GVLLH=NUiO<JWhid[beaTSvåâäîêÍÔÌ³ÙäåÏÓË® ¢ÈÍÜ²ÝÎ{h|rpyš¶ž¢¯ª³ØæèãÄ¥«³Ž­€¥·€¡oXrHf[hcijjO]LHU\z[{šŽ[mnmµ¿œ¡xkn
+­¹À­¡wNEEX`j^jeh~_QI\hTijO<lr¡³€]¯œ¹¶ÊÈÌÑÀ¹Å¯^`Zqh]u]K\oRZ]VYhwRAMM]UQQMVoABUbXYQ>+4y·\fPP9AFB\;><MH>DB=DALF_obC4Bsvvv~hc_âàäìåÕÒŒ©ÑåéËÌÌs¬ÊÙã§¶u¡¢qz­»³º³ŒÕæåàÃŠ«°²°š«š£{|t]OQN^]d\LSPplcXX
+®¥n[FO[ŒŸ³¹~_Wp€¯Ê¢ÀÅ¬­©©ab^crSFQhgv_TI[?_[X<^di[{¢¥ºc¢Ÿ£ÂËÏÎÀœÂÂ£|k{[fwYkWVfhhkaYY\RZAQSNSWejbNLOSyxSL5:ÁÊ®s\R_:@EFIMP>TAFCN@HAIJUlp^UCA>Ud_g{ldeoqiÝãëéàÏÌž²ãêåßßÌ
+ ÓÛÞa\kpxuxwgy
+€ŒÁ¶œÅÛçãÞÃ®Ž¡£ ¬ª®±«tdmtcMMi¯€n]RW\glq`tbTCGuU[~«¬¥¿®dwcš²­©Ì¯¡­hr_8:]hNJDauokdG>w}º¬L\fOW­e¥±§¥Š»¯ËÉÅÂÁÆ fvJby``Qkpl_NUo\Qe_PZZ\cg{iYJ\[^dd?A8»œµhYeT5FmbJGGG[O?OSOVJC?RbR`RU>CPokna[\^gqÕäëèÝÅ§®©âëáÓÝËmÎÚÒjY[X\tyzr{y¥œÀŸÈÞæäÜÁ°²ª¬±Žz~¶µ~rj`X{|QPM\YVLSEII>SAKKF«º¿Š²de
+©§ÁÁ~yIZLV=ESIDE`UsoLWXmi{ªCV~T\ixª±·µšÇÂ¿Â·Á©O`gwVmaR\ELv\hLLclTLpWRKm[yP7b8¥µo©qIR_KYHQX[NKFPPhG=QKa]T]YWUbiY`dbfX^lž°ÆÓéÝŒ¹ÉÍËÙÚÚÆ¬¡¯€
+­µÚà¬cZY]`]n{€¢ÁÅÈâèåâÄ§ªº®£­Š²£€£Á¬xu{VTJ_MVKPGeSBF=BWIIzÃµ®€€pÀÃžoŠdNBHQI?KA:[dh_DH_{ÀrSoiqWnœŽžŽŸ¶¬­¹œÂ~®¡§cLyoIYdDSQNXNVXT[nK?TXiBgpFeŠU,GJ
+ŸžkRZPQKpa[UJ?BBJXVISLZKOPNGf^c[Rav`adhÑèÈÚêêßµÛÙÛÉâÜÉ¡¢|žËÃÝÜ
+[VU[hvjddlyvoyº·Øäååš¯Å¶Å°ÁŽm
+¯§±µx«s~£ycSHGGRZc]\CU[\`@E€v¢p²¬}ŸŸ}d²ŠR4HbZABMaQu`kiaN¡r?[t¹ÆxŽ¢¯©Ž­³Œ³Ÿ­ªº°·¥±wLOfv­¥\hIU_uYUy{ug\
+i=@VoDnNUTc7%7V¢r
+gdvzXIBTJHMFBRFKOCNRIRLMR\RRbdeox×âë¿æÞß¹ÍÍÔ×ÏŒÈ¢wËÚ»ÒÙÍsXSbibYjjlºßåàä«Šu²€¢¡ŠqTx¡vwuiUEI`ISohciQH@C>YklsW®ÀžºQ2Q]F\YnmqnfrSVfZhaZ]O¹yu«ÁŠ¬³žŒ¯«~µ¿»¡»§KPLi~}k[jSTU]||~[mPa« ue>9cHLk_F:W50*[ª¹€«¬¡|kSyiLY^Q;TGQE_LI?KEELUXOVNUS`o~wÜçàãœâÜÌÍÀÐÚÓÊ­«ÛÔÚ¡àà¹enytz
+hZO\q¥Áàæãá«
+lt}«YyŠ
+
+ª±€oye^w~Yeœ¶T`HBHPGNWLy¢³ª®º«±ºf£rpP4OWBOZg^[zwGJd^dGcfe©hkzŽ€§€Ž¯Ž­¯¢«€³
+Zk\U_UYPBa
+i¡Zb_SwNa7<GD{OaeDY031FkŠ¹Ð€ŠRUtJOUJATh_ISXZJIU7@{RNKQ_jkacqÄáêëíŽÍÉÍ×ÆŸà×Ÿ¢¡¡¬ÛÙâÄàázh{lznhXenŽµÈççæu}ss~zsbXu
+qª¥o^j}XWpU{VNYycHVu[a°ŽžŽŽ f?;_ZJE>AH[WbixqhvwS^>jor€µxnz£¶©±©€±¿­µÆŠyzoVnVma\DGcšxurVbTnigF/WGLTngK=02AM|vvt€ ¿ÁSRNvbc@XLC[eH>Q[T=@VRRm\\kkgaQ]iuâêÞëìãŒÓÿÿêâòðÐŸ¡©®
+€ÝáÛÓà×{oxffi``cZbsžµØçéå{ff^vlTn[z£fJu{p^Rf
+¬¡€sav³ÈŽ­²yp3HpM=B=F:JQj^bfz]bŠ_I[qu¬­ ¢€µœ©£« ¬¥wpVTb²~_nsQhjRRRU s}faFRC<@7DAYZ`gGJ7IUQ^m€p­Ž®s^[iiKb9CCI^`MJAPRUIFEUnf\OLRd``z|àñòìÛãáüçíòõûü÷È¬«£žßãÍ{ÝÞŒwquve[\ej¶³áÜèçijl}}|ohnfqxez{S]®Œ®µ» Æ²y«ªÄ»Ÿ©¡¡­i\NGPCB>>9<FDUKtqmKW¢mdwV@Fp^N{€ž§­¯ª­yfIO`Ib§pbeNFmPHF[[vxŠg`FB8@;@UT_fšCnQ>;GDQfUT[EBY<>AT`YSJPXPB5AFJPE`VQV__^sv§åòïìàåüÿýàÑà÷þÿñ³¯ Œàä¿rvx±ÞÝluec|vzvo¥¹ãÔäçª|Qjk§~ufYi^d}_T^Zx|©ŽŒ»·Ÿ w ²Ÿ»€y¡pNOJG;:F<S_dK>i[ZXp^[\nnfxs¯ŽŠx
+s€s[Gu^s\pSVJgdVVSTUqHKM:2@;87-?b¡SefY;@9jpTpVdbm¥QUgOyw?HN\P_bNHA622<G[mc\TWfdgt¹Øáðôðîûÿÿúöéëõÿÿº¢¬Š·§Ðáèµ|w{ËÓlltsk{«­w©Åà×åè±¥¬¬­¢ymtin}wjNfb°tIW^Vswx¢»¯µ¶»{`©Ž§ªÀ¿Œ²O¬{mCHAK<AUWP[D@p9WQPib]ghijbxvYOc[µ·ZrZmiuXZKWcIPKDHp§ªmTER3Cd`@nd>:1,
+18@kTLEAC;=k¡bqFZTjKK[cQ:Q~INRO[]vX^K216CL`€¬©«ªµž¢~x áìôöôõþüùýüþÿíæãÄ±¶ªÓàæ}mr¶Â}£~£»×Þçç±§Ž®º³apkqyMb¥yOstpy\sy©¶ž¯®Šn­œÄ­µÃ²¿
+a®ŒrWRWKNBQYMBL<;_ONMAHEUUwš
+yqsxgmSDRhu¹¶šykab_lzjOOGJobUBA@PBwXYAJ=7HI6tm:22:0PhWX[}T_74)3D¢mQUIIGDWQahW:D=;AaO?KA_VNSP96>Q[SUdXWZ]`benåéò÷õóýêèöéãíêÜØš¥¢ŽŠ¯®ÜÚâxxoÍ×¯¡ËÛÚåç·£œš±º­³cvhp_~j|Kk
+ktœª¯ŠŽ¥¥£µŒ¬ÁÂ²¯°KU­¡sZL]MCCXqP=;>NqT_><Yid_t]aNYv³±dofUcPQ]NNACYtQYDJG>p¢©kRNLB1=@FVNTB,(J3zpRWwbsf85>Nj\9C895KB=/.EIKMX76DMSFHI>A@>RUSWVUUWX[]bhšáïòõïßñöøôçîäêîñÆº¶Š§ÎÑÔÊŸwtxzË×Ü¡
+ŠÐßÞêéŸ¥ŸÎœ»lvyg~h{[eaiScld¶¯£¡¢¥¬msª«µ¹Œ­·­ÅePµ~{]LIFPWaW8D@IrBBIKMVYG^buxeelpjkePeutzSNDKB<BEB:36@&=Er~KEUOA.9QLEJI?3*X4W__j[55:Gw|KX@O_.KDA>ZpkL=:<EO]|_MV5E@L?ÄÌÌ²€¢j¥ëìïõóÐÁÿÿüìçóýÿå²°£¡¢ŽÏÑÊÏÑ|ÔÛÌ€¡ÎäÜéåž£ ÁËÈÄ`g\gZdoTwTLVmc³¥³¯¹°ª|¡±­³Ž®š
+¹i\\[HSP^XlUELQ@H@LFR^P>_RL_qzudsidxZNZ|itkj{LNR`\QD?E63FLWB>;CFUnTN>5FZF=8?V10G,CKKp ŽQ(-5OodbO.7K[?AgGT9J[iF8ACHI}h]X7LLdLÉÑÑŸ®°ºœ¡nªëëíòðÖ¢Ïþÿùùÿÿö·¬š¬€ŠÅ×ÐÛÔÉ·âã¬ šªÈâãèß¹ŸŒ¿µ¿¬¹¯xV~~KK}vZZycOIP[w¡Ž¿š€ÁžÃ¹µ«Š¡¹€¹š©«Á²¢~­œ¬
+^R[CDLZAOXOOG?I<HGFfVAOUNZ_KZuve`EW^kM`~~uaOOU\PVD]C75GGJNGPN@J]DUE<GLKD8_\779/%9KX
+®±]*1:),0BQaEMEQH<CMM@KR71OQMCTUUfyZXQ_FÉÑÏÄ²¶µµr±êéìñòÜ
+€ÇóúþñÍovŠŠÃÒÌÃÞÅ©¥{yËâÙ« Š©¥ÍÞàäÜ¿··¥Å©Ÿ·¢[mgVJZWOar«¶£¡œµ±ÉÃ­€©€¿»Åž¥ŸÁÀ¿¬ hx_VYG@C`]TDRUOEKGGPQgxXJJRQ`X~}kVlWWZpcHcnn\RRQPa><=?17AC<BD1[VUHFJ@TFHHF@86*>1<*5G8OxRC2J18?VeIUYUxSlEU_\JB:5XRJIaSdpU[YDGÉÎËÆ¬±³¹¥q§ÞìîñòßäîìäÝÏª|­ÅÑÌÎÞÎqx¢ÜÜØ€¢±¡ÄÑÛêäÛ³Ž·Ê¿»¹Œ»jh_Z~p[NVn­€°¥­µÅÀŸœÁ¢š¯Ã°°Šµ°Ã§®ÔÒÁ§¯yprb>HCPXHblaBIb]SYavfLRF=@GhnAVof[bY`j\Wx_VMIID:=A>C>8:D>7=PSVJ><TG>4BI?EBF<0(#+;:e~Y3C;B4klZKHMV|[b[W{wd27KYKMfdZ`YYZIWÄÊËÈµ²Ÿ·©wrÄéíðññèÜìéêåÕÛ×ujz¹©©ÍÛØÙßÃ°uxuœÞãË¡¯ Š£­·ÔçêåÜÃ°œÌ¿·ÊÀŸ¥·°y€sttxXKQqµ­žŠžÁ¹ŸœŒž±§ŒŸÀ£©¬ Î§­ÍºÉ··o|iSdW`XtZhKRYri»^}¢cJ;:ERt\P_ZVP_enZqw{ceNRL=DNGBAC::@8:<;+<JDkdLOEAFJB;KDPF1+5&Z:[RW0,=KWk~riCJ]lhxOe\EWH35C\R_jl[YLSTUTÁÆÈÉÆ¯ÌÊ»r±èëðòòêåëìëäÙßØy~w­¹²ŽÆÙÞÜÛÜÅªy§ Ñäç€§·ž°ŸŒßääãÝÏÃ¹¹ÂÁÆÄÀ±¥³£©¢«žrhMOn£²¬žÇŸžžÁ¿ÀŸ³œÂ¿ÈÀÀlq«¹œ°¢·°Àº²tl{~gl`]WZ_beXbvœ s^jPedOISMDKVL^ZV^gmu]YJGJ<IWACA>;@?MV<>=?PPvn]l6LNJ;7</5<0'/4I8DrqRP+7:Hgish8L\{Zl^XM^wU32@LSidbrlBINGK¿ÄÈÉÍ²ÉÌœr±àæîóôìàåêëæâßÑ­ŸÄ¹ÔÞÝÜÜÜË®µ· ¡ßåÜÌ¬­°žÁÉÑÐÔËÌ¹·¶ÉÂž»Ã±®±²·®­rywÇŠu€±ºÀµÊÅŸŸÆÄœ€§³É¬jeÀºŸ·š€]œ²­²fQ^n|_
+qaQSRxmX{­kcWYXF`^Vbmfb~wOQH_KRI?EEH@A>6MCI978DO^Zps@FHEE?.8@299%(487scjREB3TYuz||]AfZ]jnKN)3@Q3[_XRLCRJÂÄÆÈÏœ»Êµu®ßëéòôëàçíéæããÒ§ª¥€±¹ÊÙÜØàåàÐÁ±²±¯µäæà»³§­¿ÏÒÎÆËÄÀºŸËÚÈÄŸ¹®µ³Å»¯¶uÇfo³œ¿ÅÄÉœÂÀÇžµ·«º¥š©ÀÁÉŠpu¬ÀÁ`qqwi}pŠtnbqhz{olwks|rviYU]lady~}w |zz|~H7,8EPlkPVX[K75/7@A7&0B?4FDDKI&@@Uk]\rHPuic
+uXk**SFEbvQmcaV>QÁÄÅÆÌÅ®Å±u°åïíóòîØéïêëéèÕ«š¯®²œÍÐÙØÚÝØÙÕŸÁŽŸ»°¥£ÏæåÆ±ª³Æ×Ýáá×ÐÊºŒÉÈÎÆ³ŒŒµ¶ÂÀº¹©¢®ºÇ °Œ¿ÇÌÊÅààÉÅÀ¬£Œg®§žšª³®ŸÊŠ © §Ÿµ¹œ¿ÌÈÅÌÌÎÉÌÎÑØßêäåååæãåâæãÛáâãââããããåáÛÊÈ»£Šš¬O-1@=D}gYUJbeZJIYVZejTyZD7I:LT9=@A\kY\[DQbHsv}u¶
+
+25AKUgfjdEI»ÀÃÄÉÈ°œ«vºäêðóóêÝëñíïíÜÓ£«¯¶²œÍÓÖÚÙÕÖÓÙÙÙÖÑÍ¿ÆŒÂ²ßãä¹€±ÄàãçâÉÈÌÃŒÂÂÏÆŸŸŽœ¿ÆÌÇÄ¹²ÄÝÈÂÎ®¡·ÅÒÔÑÍÈÛÖÓÓÌÆËÈ·°©¯ªš±žžµ­ÁÆÎÓÚÝÝáâãçäççææêçëéïóñóõô÷ø÷öòôõóóóïðëìêêæåáÞÒÒÍÍÆÇŸœœž··Ž­¥ zrufl€ U¢¢¢ ¥£¥¥}JDIPS\gVRdw{¡¢¬ª³¯
+²®­ŽŽ³±o±OTpT¶ÀÈÇËÊŒ®ªw»áçèòóíàçëîîíÜÎ£ª±§ÁžÍËÌ×ÝÞßàßßÝÜÝÛÕÚÝßáÆãåØÊÑÎÐØÞÚÈŒŽÁÅÅÍÍºš¥¡¢¥€¶ÒâìñðïíìðíäéìèäâßÝßáÝäääääçâÛØÍÈŒŽµ·Ž»ÄœÆÄž±»ÂÃÂÃŸ»·Ÿ¿¿ÀŒŽ·¹¹Ž­¬¬ªš
+~}}ywursqonmmlkihfeeeh¡j^Ip¥ª¬­¬ªŠF
+¢¢€¥¥¥ŠšštÀÉÈ¹ªš¬¿ÃÃÎ¶Ê¹­º®µ±ªy§©¥€¡ h¡¶ŸÉÊÌÑÑš­v±ãàÙäóçÛèííäæÞÍÉ¹³ÃÊÊÉÊÖÖØßàßäâæåæéêêæîìïïííííäÈ¬ŸÄŒ¡š¿ÈÎÒÉ¹³ÂÊÑÜÚÏÊÎÕÐÏÉÀŸ¹µ®ª§€£}xuuutssqrtrrrrsx||w~~~}||zyyxuwyxwvvvuutttspppoooolnkmmqŠuhš«®­Š¥LŠŠ Š§Š¥ši°¹¿º§®­žÊÅÆ¯·»ÂŸ»ºšµ²±³²c€«±¯°±±±²žŒÈÌÓ×Ú¶w·áÍáçñèÚëçîíéëêèëÞÚßæáØÔÒÖÒÈÅÊÇÅÇÁÂÁÆÁŸ»»³«±²¥}ztwxzzwurooonnoruy}ëè°§±»³š¡
+}|{yxyxwvvutuvwvvuvww
+
+{||~~~~~|||~~|~|{{{z}}~y~~Š
+¡šª¬««©€¥VŠ¢¢©©©ª®jÄÈÂµºÄÇÅÕÒÏÊ§®x¹¹¹¥·³²³Žw}®±°±²±²³³µÁÃÉÌÔ×ÛÑyºÂÕÝèôôóôðÕŸ«¢¯ª§~}{||zyyyyxwvtwvuvwxz|óöÚ®œÅŒ­£
+¢¡¥©©¥Š§¥££Z ¥¥£Š©^ÇÃ¢ŸÆ¹ÆÕÕÉÒ×ÓgÆbºž¥¶¶ŽŽ­n²±®²±³²²ŽµŽÈÈÉÊÑÖÙÖ­|»ÙÓ×àùúù÷øìïµ©¶²Š ŒŒ¯¢
+ðøú¿ÏÐÀŽª€ÀèæéÞ¡­   ¢¢¢€£¢¢ŠŠ«®°¶·¹œÀÁ¥ ŒÒÒ¬ËÊÈÃÅg¥ÐÏÍÄœ¹ÇËÇÆÍÄÅ§]Á¢œÄÒÔÒÅ×ÆÔÌÌÄ¹º£º¶µµit¡¢¡€®š¥šÍÌÌËÒ××ÕÀÃåãéäùùø÷ñãóÞ·Å¹«§¥€  ­ôôí¶œ¥£§­²ºÁÏòøÿåçåÞÙÖÓÒÒÑÏÏËÉÇÅÂŸ»»œÁÃÄÆÇÈÆÃÃÆÇÈÈÆÆÈÇÈÜëëëðÝÝÛÙÑÎÉÇÆÇÈÇÈÅÇÎØÝÞÞÝÜÛÜßäæéêëééêèæäßàÝáçéëíïñòóòª¢¥Þõôñ·ŸÓßÛÕ`°É¿²²³¬±­£zQ]|uytoqfe[qf[Klpmu[\{efUjW|%+?pgx]eÑÓÒÓ×ÚØÕŸ ®ÄééêêääéìÞáïøÒÀ³³°«±»ÎÒÌÅÈ±¬š³ÇÕÆÌ÷÷ûÑ­©ºÛßâÁš³ÆÑÕ×ÙØ×ÕÑÍÊÄÆßßãéïñóõùÿý÷÷÷÷ø÷ø÷öóñïëèäÞÙ××ÛßâåæäâàÚÚÜÚÙ×Ö×ÕÔÕÞèççîçØÒËÄÇÅŸÀ®¥¢ ¥Š§®µ¹¿ÏËÅ­šššªš ¡¥¢
+uxrehotm£ ŠŠufVSW_WšOIJH<AL:>OcF<60-A;(5&!(2-><[K<>Lb^LJ`W[DALQ
+H_rwt}
+krYÚØÙÙÙÞÜÖÁ±ÂÍíïëßÏÜÖãßâîøçÁËŒª«º×ïëæÖÖš©¡ÈŸ³ŒÃÉäËÇøøüå¥­±ŽžäãÌb]
+Ë¬ÏÒÉÅÇÉÅÂ¶ÖÛÝäçèëöúÿþãêäãæäßÙâÓÔÐØØÄÄÌÊÊÏÍÐÍÁÉ¬ŽžžŽ«²±€®µª°ÎååãîÛŽŸš€­Š¹[OLPXbV^\µ²ŠYPQHGFD?QPMKGFC?FQQMF?@CBA£ ŠŠ\=LIRTdœN@HI;7E;*-]M>.,1="$!.1;BZF6QWHJ=@IX?=FgfvZTR8¡¥
+we{]\eMßÜÞÞßàáÚÈÊÑÞêîïÜÖÜÝãÝáêöçÂ·³¥ŠÄãïëåÙÙÑÐÛÙØÒÑÖ×ÕÓÈÏù÷üãª¢ ®Âãß­]c±ÞÞ¹œ¹®ŸÅÇÂ~©ÇÅÆÕÜõùÿùžÇÂÍÇÔÇÈÏÅÀ»äÍšžÌáÔŸ¿µÂºŒ€ÃÉÇ¬±­Š»ªÉäääî×¹Ð°§¢vxwtbZ[\ÚÔ€^UVOHOLOPVB?DAJGKFB9GGC9BA¡£§©WADNEKwåÙP<>7*5>/$+F85 
+&>&&0
+
+
+<=:'7K3EDF<8;/C?=Bb\dj?)+š§«wTegY_Táãàâäãá×ÀÊÒÛêëîèÙØáÞßàíöÞ±§¬Žª©ßïëãØÛÚÚÛÚÙÙ×ØÕÕØÚàûùúïÈÊÆÅ¹ÑãâV±áÞÉŽÁŠ¡·»Ãu}·ÂÊÐÜ÷ùÿúŒŸÀŸÔÉŽÄÇ¹ÂÂÒÅÈÉÎÛÌÆÇ»¹®»ÖÛÙ¯š¥°Ž¿¡ŸàáâïËœ« ®§nn_iXdUàæœuf_PNPKMEPHL>BHTA?H=C>7@RAªªQF:F?GhæçãÁUbM7;@;'+*A&.8
+3%)(/
+28>B>S,CG8;HN=:7LPXidH
+ '££qkcJNJççåäãçãØœ­¶ÖçëïáÇÉàáèâíøÚ¥¯©¡·åííØÍØØÕÚÛÚÖÕÙÙ×××Þùöòé×ÛÜÚÛàŒÞãÙ«ÕÞÛÆœÃŠ²²sjº²ÔÑÑöúÿÿÖ·¹ÏÇÄË¶¿°ÊµŒÉÀÐÅÈ¿Ä¿¶Ç¶ªÓØØÁ¬²À¯¡ÃÛßâï×¬Œšª© £ riaabmZaÚãÞqc[ACQFGICMEGACQP=C48C=7.7]OQJHWléçäâYSVbO6&#*HR0&E+*4#1&2
+<@JHAX8FIO;=BHHEQbrU3H)0,¬¶«wYPUKSéèéèåçÜÛÓßÔÕèêìØÎ×âçæâîùà«»Š²âîìÔÙÝÛ×ØØØÚÓ×ØØ×ÕÞ÷íßßÖÐÖÙÚÝÛ»äãÞØØÕÑÏÌ»Ãš«¯vÇÜÚÖàõ÷ýÿõ«º¹ŸÉŸµŽºÍÑŒÃž¹ÈºÆØÚÛÆœÏ©Â×ØÙÊ ­Š·¯ª®ÀÚÞáîÊž¥£ ŠÌo]SaPXe£èæéy`XTXXRDLT\PYJEVOEKJJUJQIH¡¢€©¬fKSKWXfåäâàXONP`ZD&
+%G6
+2351!4:""9@@66NFBD5<83CG]dmODCL+&+ºž¯\djSJXêéçÐ×ÛÝÐÕÃÊåáæçÛÓÚåëØâðùì»€«Ñ±°æïîÁ ¢ªÇÏØÍÒØØÖ×ÖÝïØÈÕÔÔ×ÙÚÚÞÏÃãßÜØÕÏÒÐÉ¿º­¶²¥}ÐÑÊÒÞöùÿþüŸÃÊœ¿ÁœÂÁÈÀÒœžªÀÃÉÖÊÄœ·ÆÂÈÖÚÛÌ³³Šž¶Ž¥ÔØÝãñ¿¢š©¥£±¿É}h_ZXXTX¥íôñdaTY[ZPHNXTR\gdTIWcN^S[YW¡¢£ª±^<AIGLjÐÍÕÓWLM3BRfaK<D(5>1-:@#$#2?-2<<9OA69=8Hu[PJTQNN* $¬Œº³fC\OIMGÏª±×ÉÐÃÒÞàãäèæàÙÓÕØÙâñùðãÓÔØÒÕâäãáÜŸ»¹ÒÌÑÖâéééëëæßÃàäÞÜÖÉÔÜãåÓìêìçæäâÝÐŒ¯š®ªš°ÉÓáÓÑóøÿÿøÑ×ÚÕÔÑÑÏÌÌÖÎÊ¿ŒÀÈÎÐËÍÈÊ×ÖÌÙÜÝÕ¯ŒŸ¹ªÌºÍÚßäðË€·±°¬Ä»ÃÉÌ¶Âòö÷±
+|}wwv}ws]dhkonsowt€€«°bahoi{êãÛ·PWkaZ__ZP_ZC@-5I=F@MA<:?KNKEMJaMKRZ{zXJNOYX]jN;F¶ŸŒ³vOTSYTS¿àãàçååßâàæåâßÕÏÕ×Ý×ðùõìåáÜÜÞßâããããäçëïòó÷øüûúúáÄÖëïæÛŸÆßêïðóóö÷ööõóëÛž¥£¢£§ŒÜìòÝœôõÿü÷ôîìëëëëëìëëèåßÛÖÏÉÃŸÀËÖÙßáãáãàßÜÙØÛÜÔÐÚáåòëåçäåèëééëíìêêëëìíîîïññòóéäãïñêëïíìéäÞÙÎËÑÚãëîòóñ¬¥­­ÛëìîìëçãäÚÌXÒàìæÞÂÃž®zyiw\À¥º²¯Àº²Œ±bnG ³²±®°±³··±«¶¹ž¶¶±°°~¶àáåååêêèãßåå×ÝÓÍÕÙÞàðûôíäÝÛÝÝÞáâãââäéìïóöøøûûùôÙÑâíóâÄÆßëðòóô÷÷÷ö÷øóêÚº¥€£¥Š»ÝíóÝÀòöþþöñïëíëëìëììëéåáÜÕÍÄŒ¹ÄÐÚÞäåçåãâÝÚÕÒÑÐŒÆÝãéööôõõõõöôóòðïëëêéêèçååççèëëèâÞäíèëìëêåàÙÎÄžª«¬­®³Ž§¡Š­¯Ž¿¿ÃÃÂÂÁÄ¿£\ÉÁÈ»¶¯¯°¯¶¶NSd]is}{\lm^pUVšœ©µµ²°³³¶¯®šž»Žºžµµo²ÙèåáåääãâãáæçáæãàââåãñúóæåßÜÜÝÞÞààßßãæéíñó÷÷÷øöéÎàäéïÑÅÝêòóóõ÷÷÷÷÷ø÷òëÝ¹¥¥€€§ŒÜìòÜÀïöÿþöóïìíîîîîììëèäßÙÓËÄ»ÁÎÙßãçççåããÝ×ÓÏÌËŒÊãåêøøöôööóòóóðîíìêêêêèçèëéëìëëìîìâäéçíéèâÜÖËŒ¬€€££¢¢¢¢€®°«ªŠŠŠŠ§T£¢Š §Ššªª§O£tql§·­g¥²¶·³³¶Žš Ž¹ººŸ»¹žµl¬ÓèåäçåçêêéçãæåÌÖÛæéêéëñøîâåãåãããããâããáãåäââæãâÜÙÖÑæàÔÒÊÍÐÌÌØØÌÄÇÂµÖàá·²µÅØÜÕîõÿüîíèëìíïïîíîëèäÞÙÐÇ¿ÀÌ×ÞãçëéççãßÚÓÎÊÊÌŒÀÛàäøùôôõôóóñðììëçèçèçççêêëìììíïïïíìÞàÝèäáÙÏÅµ§ŠŠŠŠ£¢¢ €«¯€ªŠ§€£¥¥PŠ£ šŠ§§¥S€©Ž¥»º»·¶±T¥­¯¥€€šº»žº»Ÿ¿¯¶Žm£·µ¶Ž¶çéìèçäèêéìçèéåèåáÚßÜÚêîôìäåâãããããââäâáãããâääãåäàÞããÌÁÑÚÓÍÉÒÜÜÏÏÐÇÄÓÍÈoYj£ÂVY¯ÂÌîôûòÃËÅ¿ŒÀ«žÅÅ¶ŸÂÂÂœÃÄºŒ¿ÈÔÔÖÚÚßáßÙÔËÉÄÈÏ»ÏæäëùùöóóóòðïîëêéççççççèëëëëíîëéëìììíëÛÑÐÚÖËŒ­šŠŠŠŠ€¢£ Šª®£ª€Š£Š¥£Š?ª¡£§A=JAD3;<1<.+/,)0GLE193*+72<543389=cd]TJBH>EDWçãÞÝàâÜßâÜÜÞàåæåæéêéåíñðéæääååãääßÝåäãäääãããåãâáââÓ¹ÔãããáØÝÝÝÏÇÔÒÓÅÃÀŸ­šÅ®^{¹ÇíôúùÉŸÂ¬Š®Š°À³²Ã¬²ŽËžµ§À·Å¬ÀÜåäÖž·¹µ²ÑëëîùØÆÉÌÀÏÈÇÈÄÇÂËÊÂ¹ÇÊÎäéêäÜÞãèêìííëëçÞÒœº»¶©©©©©šŠ€¢¡Šªª¢Š¡£ŠŠ¥¢€F©š~¢§ª©>?B:63<60,5722>8;K0):112515=1%&'#ai9+/:?6BÚ×ÌÈÒÍÍÑÚÚàçæäãàâåçéæèéíèçæææååâãßÕÙ×ââããââæççâäãàºÍçéßÞáßáÜßßÙÙÕÔÖ³­œ³«³€ÇÇ¯{{ºìôõûÙª«€žŸ³² ¯ªµ¥±¬µ£€¥ ³ÕçäàŸÄ¬ÍëìíøÄ£©¯«­µ±ÜðóÍrfmonmin`ejimZ\Pclfbcntx|€£š¢§ŠA
+Šª¡BM5,.;8789177?49;398.5:?/@''-*1
+2§lr925"=?8àãåäâÛ×ÓÖÍÇÑÖÙÜÞâãäæèçåçäëéééêééæèçããáßàâââßäåàØÞÚÊáïïßßÛÛÚÚÙÕÎÌÈËÐÏÂËÆÆÀ»ÁÉÌ¿Š¿·ªºìòöüØx¬Ÿ³°­¡ªµ»ŽŠ€¡m­ÔçäÚŠ¹ÁµËëîï÷ÉŠtto±ÐÔÆàåÂ²ÇÞñóë­yt]bNKNNPN?9:BJRMMS^hk¡€£_^_T^W_ÝáÛ¶>QJcGW[SPNYTFNHIL+)7*?.8G?228AC9155+;.20$
+*+:.+-3£z7-7.959ÖÞééëìíëìêëäßáßÝáäåçèäÝáÜëéäçæåæåååäããäááãßßßÝØÃÞÜÞéôîÕØ×ÔÑÔÐÃŒÀÀÄÀ¹Œº¹»œÁÄÌÐÎÒÓäæÕ÷ëóûúèÄËÏÚØÖÕÇÄ¿»Ž°³ŸÂÆÕÁ§Ã«±yÑåäÝ®Â«Ííîî÷É±stry¡§¯æõ÷ööôðäïííñôòòñøörRME>RMIGDDIHSVMEGX¡€¢¢fT_hVUWÙ×Ì±AVD`ggR=IG?;;<@D;'$4/"B44('8B/;:<10;/.49)%;B8IZA88;?;.ÉÙØÕÏÒÚÙÞÞÞÆâßáÑ©œÔáæÞÛØŸ»ÀŒŒÉÊÑÔÙÞààãæåäåèççåääÝ×çíôéŒ¹ÃÌÍÐÉººÄÆÉÏÐÐÏÎÎÏÓÕ×ØÛÜÕãêÔÖëóüôñóìôôóôòñãæÞÊÕÓÓÓÒ×àááâá×ÓÐÒØÜàÙ×ãØÙÓÉêïðïöÖŒš§¬¶ž²È·¿ÞîïòôöôàòðòññòôôûúŠbQVVUQCGE?EQBOdR¢¢_BZYNVhÖËÅ±AVLJrPYN=D@DDDB:-&),*%$?93,AD27:+'/33341<@18H8=(M£{=FA@=2&ªœÌÑÒÒÉÇÕ×Æ¿ÎËÉÃŒ°¯šÂÊÌÔ»³­±²¿ÇÌÔÚâäàÞáäãÚÑœÂØÛÔÀÎíïñòãããäàÛÛËÂÐŸŸÀÃÄÂÅÉÄÂÂÅÉÎÏÒáéÍÇðôûöóïîííîúüùÏÈÈÉÆÄÄÆÆÂÆÉÌÍÎŸÈÉÌÕÜàæéìïìãðððïðößÕÖÚÛàåÖìñòôõôõõööööõóñîííìöóÔÊÍÌŒª vr||v}p{`ZYKMjËÈÇ®EfpNWUJWROL@C,:2:@.,9;6360CD:9.<%$
+*%-4,9>3;98QF«¥{D/3'@9>¬¬Ž¬¡|¡²ŽÄœŸÇÎÐÔ·­ª²µ¿ÈÏÙàäâàßææÚÌ¿ÉÍÜÔ¿ÎÖíïóöòñêððîïóö÷õõòñçÝÏÂ­Š©®±Ž·ÏàêË¿áöþùôððïíòüþúÍÌËÉÈÇÀŸ¶Žµµ»¿ÃÃÁÁ¿¿ÂÀÄÄÅÊÍÑÔêïïïöÛÏÌÊÅŸÅËÓØÚáãéíîìòòòôóðòòöóôõõòïìéáÚÔÉÁ¹ÂÅÒÙÝÝãæå§¡£®€Šš¶¹ÌÕØ³\Ä¯Šy¡ jkB:7;QQE:C9A>O66,27-.,")--#!4@F:AOAU­ro:D<%$32£u{}y}k} ¡²ž»ÏÑÖ¿¶±µ¥°¶ÃÜäæäââãÛÏžÄÕÛÏ»ÊàÚïí÷÷ñòïòóóôõùùù÷öñíçÚÊ² ÉÛåÈŒæöþøòñïðóïó÷òÚÓÐÈÁ¿œÅÁÂŒÄÅÂœºžŽŠ­§§ª®Ž¶ŸÀÂçòïíôÕÌÏÒÔÙÚ×ÚÚÖÔÓÐÏÉÈÉÊËÏÓ×ÛÚÝÝÞÞÞßßÝÞÛÙÒÍÇÂÆŸÈÌÍÅÎÕÕ¥ ¢µÄ°®²°©Æâ³rÜÝÝ·ÐáßÜ ÂÏÊ¥KU««­®²µ¶¢xµµ  ?}yu{¢vxdkzqvWIUU_bB|g{wZi «¬±«ÇØ×Â¹ÅÄnCCLNU\Z_mrgu€Ôèàïñùü÷õôôòôòöûù÷÷óðêæÝÎ·€¢ €¥¬ËÙçÌÈïöýùóòòòòñåâïîéäÓÙÛÞäéññòòðîêêæãäãâÞÛ×ØÖÏÎêñíëñÕÎÏËÎÏÎÌËÉÆÃŒ·²­Š¯¶¹ÀÁÆÉÈÊÍÇËÌËÊÌÍÊÊÆÄÀµŠ¢¢£©­°³¶³vmŒÀŸÊÉÆ®žÀD­¬®­±³°€Šš¥C§§Š¥š¥§k¥mv€Š¥€¡zi]pmijx¬¢©ŠËÙÉŽÈÐÎx>:=@CEIMOPQPOPOPPV\óóùí¹¥­ŽÅÐÚíøüøõñëãÕŒ£ŠÁÚæÎÆîôþúôðïóòñíéóïíåÈßâèìñóøùú÷÷ööòáòðñððíòòî¿âíëéòæåààÛÜÝÜÞÝÞÝÝÛÛÛØÓÎÅ¿Ÿ»¿œŒÁœÃÄÅÁÁœž¬š¢¢ylmjnkis¢cfš©Šn¡¬šš>zsCwahy §¥ €vgOveb{uxq]wÃÑàÍMDGG<569:<?DHLNRQQTUUUY]÷÷ûÜq]ZWWWX[^`abdis~}¶ÖæÐÊíóýøñîñòòñññòðëäáâêîòô÷ùüúùûû÷óëôôóóïÚôöõÃàìéæï×ÌÜ×ÕÒÖÖÇÕÙÚÙÙÕÒÔÔÒÔÖÖØÙÙ×ÕÖÍÈÉÈÀ¹­¢
+{xr €hNJSKIPX\lZSroljQdy{\wt^UI~|rwht8ktltulqiibcNVTluuu{zqkqrT]]Dnobow¥z{~ÁÖãÚH8440/1589>CGJNSRRUVVWYZùúûÙeXUUUSSRSQQRRSTTTRKKIHHEM°ÅÏµÃíòýøìäÝßàæíîðîæØŒèîóõøûüþþþûúø÷÷÷÷÷÷õø÷ôöÄàìçáîÝÒÝÙ××ØÖ××××ÓÎÊÉÆÇËÊËÊÊÇÃŒž³®«ªª§§š£Š£¥€¥§ªª«© ¥~hQ}|uuMo^cT]SZ]CE][EOSLOILQJLVGO7gc_a[XVYUaVSahhngZSOLB81I?Yl\i}xwvZu
+cš|z{}ŽÙäÞF30.--.0258>EEIMOMNRRSSXnÄÍÖ¹\URQOONLLKKJJNPQQQRSUQQS[ÈâìËÈïôÿýöñìíèâ¿jTQJL|¢ŽÆáãæêñüüüþûùûüøúýø÷÷ÁáíçåïáÞÛÛÙØ×ÖÕÓÕÖÒÍÈÅ®ÃÃÅÈÇÇÇÄÀŒ·²¯­ª©§§Šš§§t££¢¢¡ ¢¥ŠŠ¡iQ
+
+}fnoP`k[iRKLhchajqphY^e`hUX3\uklicoh`H_bZa^aX_FA978:@8:BhaahoxrzztÚâÝTB@W97899:=@ABBACEEEGHKLRW[][QMKLKJIFHEFGHILNPPUSQPRRV£¶¢¶áøÿþúöõôôõë}TIGGHHKKPTZ\]\^ch€­¶²¯³µŒÆšâëéæïáâÞßÝÞÜÛÙÖÖÒÌÈÅ¿³¯·œŸÁÀŒ¹¹Ž°¬ª©©ªªŠŠªªª
+¥££¢€£¡o [€aHgnaaXPRLUKRE>9?SU\Zcyuufga\mj_1Z_Z^^ku`Jczyx}}|yzzz|
+wPoviZqooR{¥šwm
+ÜâÙŠ¢¥­F66689662326=FNT\YUROPPKFCCCA@B>A@BCEGHILPTSQQOOOPQUXªîùþÒ}}
+§µÃTFDECDEEGGJMNONQPMMOMNNNLMLNNQÛîêäîyYjz£­ŽºŸÆÄÁŒ¿¿ÀŒŸ¿Ÿ»º¹³±«Š¡¢Ššš€¥¢¡¡¢¢j¢ t_GNSg]\D\MNWT`eEOc`SSPPKRVbfuusq0j}wj[X`vz{z{xx~{~vpwvgd}^obhix~¬£~ycywoÃ¹¯«Š;9;?;77346?MPYDceb`\]\[WURRNPJEC@>?@@>=<=@@ADGIHJKKOYkzlWSSQQQMHGB@@?ABACBFDFFGHHGFFEEEDEEGIMSÞîéåírGB>>9914332027:@FCADSky¥¬®®ª©­®ªšªªª¥€   jx{f>_hbgfB\RN`O^aCNUbmwsttu{~|}~1s~tmUagYvlz~onnwzxtvpxmOxwU[PhojDw«mSµŠ¹³§¥¥l:9659756BACXjLYdba`_^_\YUWVUURPOOOPMB<>BDB???>:=;=@@DFHHEEFFEEDCBA=>=@>@@AACCDDEEBCBC@AAAEEEISâîèåîqH@==<<746766853224220.-,)'''*.30.124AOZr€£€¢¡¡¡¡¢~9;GP^kfSFMF9ADGR_MaRcMeklBQ`snswzvuoc{}zz1qbb{qWwwvqnttrtmwwmxzGxSbhCi~fuª€£xQ¥Œµ­ž¯¬°«L;984;99OLC\oPFY[\\[\ZZWUVUUUTQQQQRO@-,-,-///4AEH@<?DEDB??;::76333234469:<>?@DDBC@>@A=?>@CCEISâîèçñmGB??==95655465123578885555542//--,#&" 
+ -š§¢¢€{9?HJHMQRV_a=w^\YLaJS\sroEDkoduwyzsqr`1^UtzvQvzz|uy{z{{|{~}Oi}
+Kb~la}©£i¥µºž»œ¯¶³B><9=;>BCDMQbMMUTUUUUVUSQSRSQQSQRQRB0/11/0,16AEK;76:=AD:52.7;C?3/%&')/2334444778879:;;<>ABDGM{Š³^FB?=<<7456555531359:86545243211-.0-.'',-4©§šŠ¡¢u€£€l8=HJJKJJIJP7LT`]kTsXOss}yBLtukx}wvwwy|y_1e|lyPy~z|
+eezx}jTq~oxr¥¢ gr§©¢ŸŸž­ºž¿t@ABA??AAEHJjWPQOOMNPVRSQQQQg¯¯¯QC90)&$"(-/2BFM;1(''$$#!!"3;D>.(+'58+16'.35:8+))*-100/3458<=?AEEEBA@==<74866777533469975554532312321/,(--2©©­šŠ¡¥¡¥B15?IQMQOMEO6HKOOLCXDhkpw|?czur}yx~tiqu}o[W2p~zUw~
+
+bkiVqikH^Z{CQHwt¥®¢¢£wiv»»Å¹¯œŸŒ±L?<;7779;:=d]>954232223:?DGs÷óíÒR2)(#"" 
+
+
+%ABK;)&$'?LKHGE;9C=-'1+25
+ 
+
+-0:A:$"!%*)#!$&*6?;;8742,---,,*//13444476899866744544334220,(/.-AHR]jt}¥¢\,1;CISQTSQV9KJJMMLOCfZKMQ;`oij|vybtnY\c0vuOs|uy
+
+
+Swimr
+ZUW€~kNRt{|ªš zkŠ²·«¡v224-0-..17;QD42111.1.+,).1O¯œ³š}NC:7:?<93--;9E9NKHB84/,'!6:D>-$
+/;D>$#
+
+
+ ".023INJIJIFCB<83..++()%')((+000202765575555522.,1./.(,-,.:¡¡`,3AJKMNQNIV=PPRPOPEEG^KIL=HEZ6COTZsrVfx\C4hM\xyvs{{zvgr}i\lv
+smmR¥ZjYS|~¡£§v]`rrz}V/-.-/--/4:<7111-.291++--5;@_abb\YRC@LYYTSQOMJUjtR1(%#$
+34?=)"&**-/1366;0=D=$$8;<=<743110.FHKOHKIQJHE9A>><;;9874214/.*,*)(&))*++/0-.+).--.)&./.7€¢^ %/4>DMMHMSAOIHNMQ@>FP]OF4HBU0EBECDF@NVU_G4Q`yzoy{zwzvnpfpsM|{u}paryTjXepsfg{y
+k`evw1+,,.),0622<311-.2=8+/0-0+-G^`a]YXMMV`aa\\[[Y]WC@?<7?<<;/,9>=??>@?>=1;D=$&>AAD?=<<5422MTQTSPQPOMHCDACCCBAAAA?=<6<;:76432//$
+!
+
+!"#!  ##"$'&1¥ £o&-34:4:<<FK=QQJBBD6?AFSdG7GHS?FD@?@6E@@ACI25L_ptov{wyxwE~u}v~{©zITdciY~s
+urfo}}yf`Uh
+\)),5),/;;4011.--&%%',-,.)(6WY[\YYOO]_be`a^^]\^[XWRVTOIHHJJHGFFDCA==>??>4<A:#'¶ÃÍn>.'"
+JHRTGJJPNSJHEBEDECDBABA@A=BCABAAA@>=&
+
+
+ ¢£x22069<IJMBI>IKOKLO;BAC:[H>JHP.CBC;6CA>ABBH0$17BLYKRdpwxtxtYuutw{~isy¡k<TatuTTe;p|
+~YXsy|oeMDaf_g=$(,+50530250+(,,'(('.(.*(/O`laVWMNZ[^_\]]]\\XWVTPUSQOPPQQPPNMPOMMHFDDA@AA@<>¯æçæ³<&!!NSRTTRPOPMJLMFEDDIEDCCABCDBBACBDBAA3¡yC;699;DGNGP?GLG>=E<>BGEAT>K=P)>E87IB>@>A<H5+39@QK3=?B>KdgqmY{rwl{z
+t¢lczCsc{sn£qrilrpsWH?EGDHJ)',))(++.23/--,-,-&')%+,)&$+27:88=HT]``]]\[YXVUQNRPPNRQQQQQOQSQQRRRRUQQOMMMIËÐ¿¬l840)1;GGHJIKIHIJGGCGKLGGMCEECCDEDEDCDDBC7
+ ¢z$+6:9>;BB=IIDLORID>5==>?K?MKP1?54;B??@BA?C3720g_@B^ -;Q@AB5GRYpx
+¯sw~~Ul\~skssrz|ned^`][bgU((,,)-36100.'(+)$"&%(((('&)'(# 
+"$+07?ELQTTSOPNMLQOQPQOMORRQSRRUTSRPPQRPQWWVROLHC64@?DCDDEFC>569:=@FLOJKDFCBCDEEDEDEEA<A8,,3,
+6 €}.!-&6?=FBJMICKJG=?DDND8EFXC2=?N?@==335<8/'296,E= +4T?@B=HLKGHLNW_nrt°xdwIJpzomhqv}cbs{t~wortrq}P(2..71022'*&&#%&''(()(+&(&&$ ! 
+
+!
+
+
+
+
+$,2<>>JNcYMPPRTSRRRTUUTTQQQQRTUTUSQPNLEBOQSQSRQMKA
+"26@HR>9<BEDCBCCDDA;76+A<:H/=*(>"
+
+
+$22€¥|6
+	
+ :9BEJ?IK?FCDII<AA@/5;O?C<>:<,5;:9#(146M;626OFJ:DDBB@BDHCKJ@?£®£Lbgsrpdks[f~|yzwnt
+7-,,)+23/.5))&()&&'')&*))'&#
+!
+
+
+##'&%#%.,-4<@JOU]\[XWWTSTQQQTUTUTPQQNJHQQRQSUUTRzku{vgG6+#1BB+$*/B:"!E;1,52A"1-21+2$*-2:,€€x6
+
+
+
+0#'5)1D=KGHFA@B8HG:L>=;8<=70>=99(&'/*KPZNIA<8@GDAB>CDGLD>?<§¡uo}`^svbji}~dZgu{
+p,()/--'/.),++&'(),'')(#%"
+
+
+ 
+
+
+
+
+
+$)($%$#
+
+4 * +(@N^tPhkda\XUWUUTQRPNLNSSSQTUUSy¥µš«º¶tirK1&B=%:Q;.93>>$?1(
+!%(.1(47€€|7
+
+
+ 
+0&(
+
+
+<9*2?CE6>G8XA89=59976<:=**$)08@21)J118?KDA@BFBHD;CAB
+£
+|q|
+lww|z
+vj]iy~rflqsv}?--*01/,.)&&'$')+)& $ $)' #
+
+"
+
+"
+""# 
+ '-&$2=WZsœ»°|T`bXXRLPIJQUUSSUUe¬·³²º{~Ž¡^zV]>Q>;;.3M62C-.!.;?43$#¥£~:
+
+
+0"84&
+"77">.+0;AHG9545>B5..<8?'$*.2-4$C594>=9>4@@9HD?<DCDWh`lljryyz~©~uxdh_jmyqbbZ893582-/-)))'&+3<)7'!./0%#
+
+ #
+!
+
+"
+  
+/-%+:O{aAd§_7XT3e{lmtbl]`TK¿§ÄÆŒª£et
+fl|TKI2:,L320*)-4/#7(.
+
+Š€9
+
+
++.:1 +<$4
+*
+:")D>"AE63?86!*926H/!'5DI..J5*58=CIG;6:9046>EDxd^}z~bXshuzhdtgpŠ­\6-.412-1+)1.('(/'( #% 
+
+
+
+
+
+
+ 
+ "#
+
+!.0J?HTt³kcX_WPC0U@;XZV€~nxnZuj§§ª¯¥€Šªš§¢¯¢§KM[XROZ1;5T;;80-'&-086
+$"ŠŠbM&
+
+4-(301//J=14%./,=3.$9:
+@
+"*//>4+T.$.)(85Q4,.79?79C<A:8592254aimuqlj
+z~xo
+uJkdry§¥£¢¥­µ°°«€D.3650691-,)(%(#"" !
+
+
+
+
+
+
+
+
+
+#'
+
+ %26&1?:lµA?W]G@9AAUMn{~qIQv¥³[Š¥mv­©š
+naLWU:R;HGQ\@8?68-4>5234/17¥¥C_J
+(
+13:CCW<I:MB0+>*$5
+H
+
+
+*/,.(Q.+$&/4A7+27:B637KE569:62;@B
+~hupjmyvoj}Zdlq¡³žœšŽžŒËº·¶®265,+234))($'$"#"
+
+
+
+
+  
+
+
+
+
+
+!!!#)(/992?KB·sIwewKKTVLI\s¢_QPqª±¬¯Ÿ
+bbbv{hsolkMSiNQC7KJbM=A8?18@@--43>IŠŠ]_W.
+
+83DSEG=@8=1=;55L25G#$$
+",0,"R3+96O(3@36B45=A5642456=?=sqy
+wy|hšžŠrv_cpsWf[iodeµÆÃ¹žºÂÁŸŒŸ·Žc8:541.)$&&,.$$!
+
+
+
+
+
+
+"&$%&###
+
+
+
+
+!#"
+
+ 
+$#,/).3=1G?8w¡ŽNGnqn`VVv­peM§€¿¥Ëp[sct|pravZl`bfKM8@;;BMTTO>3<<LDEHIHL¥ŠsM?*
+
+
+
+;0GK=GA12><@;27.*6H>!)0JJD</>8*SA330&A<2&++6@5<A1-,./2.58>;qyr{§ªXhcXJ[RVX\Tas
+¬¹ÁÃœÀÀŸŒÁ¿žŽ¥N<74.+&"#$#"#!!
+#'&$""&'+(('2+ 
+
+
+42-$*
+&/'&2,1'+/).3Av~Xbw¬l6?vqf~dt§±¹ÂÐÃ¿®nw\gxlsšksjo[]THGB>JGGDLTTMFCPKF>JF¥Š~AB5
+
+
+
+=<.O12<?;6;1>G4F8B5GD7MVe`chO7:L@dR=\CEW4{M1/V4F2L0,,)01/4177owz€­­jwx~fXJ,DVvVŠ¯¶œŒÁŸÂÃÔØÀº³@;6/)"##$&''()+*(+.,*$++'&$),,(#'##
+ 
+
+
+
+04-&0&(!(+!)#/*;-ANrb
+UT|iR<JNI€wS¯Ì×ØÔÎŸ·²OF{g\umc|}tlbu~slc_^WROIFDIGWOSYVZWR¥Š:A
+
+
+
+
+
+3GB0I6-%GH48>7G.@FB@J;@4V`G@aVI;CHS5GYb_5yv|sH&iD#79/734168£ }{šŠŠyyw|s\q|fc/==NZbz«¹ÁŸÁÈÛÊÝßÈÃÂG762...-..+../-287;@0''(,*&('(()%%,&,+# 
+$
+
+#%"!)
+1/%9;/)(4Yyzp¡  O==m
+ÁÐœ¿Ìœ¹¹¬t|€ªª
+~somhXnpmf]Y^VV]cb]]gghdq¥§nU:
+5CJ:PB&0[D?<6:N>JPX{l_ufG6aVl^Q;5DM+<G6q~v|Od|^0!ghNN#-^\C+<:Yqkj¥£ŠynTmUVM:)!=_rz¯ŸÄÃÄçäÑÖØàêä~UTkB8:95-..,*,9@A>@<'%$),+((&'*())(*.($&&&+&
+ #'4- 030*#& +$)(&2.59a}°«qj®q<<Axosª²ÁÐÍËÍÍÉÏÓÒÔÖÍÈÍÌ·Àµ©wc_[cihjowpintvrrsnljnmhkhZ@
+22Q>J:PMLA+GHHN2JMrdecRCpshY8;4^5=XF2FdG<==OSeWXJ[=):5(1}dXU`UNWd`
+miVhIKZwm}¯¹ÂÄÎÙÖÚãëéëðòÊtÖ³[>99865767:56.,,&$##&,(&&$!$%%" !
+%.$ !"/;.17.3+*,4/;0&+/462,6<r¡ ^3F ,2B[eau µªut|ÉåäâØÐËÆŸ­{ssswvux{}w~rv
+~v{tqpoknnb[J&4FI9XLXFKV0Ej_G0JZ{bq_=awbZC7MDurR3_Z3!ZWT5CjZG9AD^PCHB[[LWZm
+ojafH_cup
+otU]SYJ]eDN£±¹ÂÅÏÝãèéèçèëîíÞßÛÓUKKPKHD?91,&'&!#
+  $$%&'&&%)'%# 
+
+ (
+ -/7&-93876:54?;5;83&=DhuugIF^_Teu²Œ{bbg¿¿ÆÃÂ»Œ¶¬©¡
+ynomkow
+uj}}t|zhm|qgkwyUUD6/&)<XIO^mSLWa.>YZ37QUoUkpGP^][LobMOmX|l9LVRMCA`xV<=Q",0FBUV^U631O\z_uogplvjw|mfq|uc¥¯³Ÿ¿ÈÙßèéååâßÞÝÝÜÚØÝáÅ[PJC@=85442/,-.&&'($$'($#%$#%$'%#!''+211(/.&<889;>::869?@;44:?DM}s_NUTNHFLJIAPo³p~
+¡€­ªŠ¢€š§wcU[XVe\UdcYN?6DLMTQ[TNRbbLtT2PgP4lagjckALTl^5?PeZGBrzylU=FVS5%+) *8Zb:0BW4QQshnl`mdkuykqzwu¯·ÈÆËÑÕÅÚÜÜÜÜ××ÕÖÏÓÖÓËÌÏØÝ [PKF<553/.,+!(($$%""
+""
+$# 
+%$$'(**'+,)+*,0-1,:588#.-04:<:BTKUN;<=H?KJJTZVZeinx
+ŠŽ·³©³Š
+Š|aaljgjkxt­¢lypiUVLKOAPRCJJMI]X\eQi^n\NZ4^lmO+P]C>`}U_^YaTLoGIE@Wl]U
+mc`P<5DNPA/7PqZG(j?@Hyqmnmt^nwuhgrtpqsfr{¬ËÇËÌÓÌÚÚÓÌÆÁœœÂœÂÊÈÆÈÕÝåèWI=63-*.0(%
+%%!
+!
+$
+
+#!"%#
+"
+"$&$ +$&+&(-!6+'()-09ANQHSPRPYaaXI[`abaZehikpqqmfW\aZZOW_cih|¡¢
+xtkc[``[imcu~drk[X>C;?EIXOJSSUCE\hIii\i^S<bQ`H-[B?JC@(IgnJVINM;DgK{hyyb_L-787667<,cU|XEezm2>upmqsPVbcdssdd:tXLQe €¹­­°ºœÓÓÌÆ¿»¹·±µŸ¿ŸŸÇÐÛãäàyOI;19<=//'! 
+
+!$'"
+"##+$&
+!
+&.)
+!!'+! !!'6>DJMM\]^[ffkih]VhUZ_bL3W^XLINMFDLSSKE?QVQLTMLONQU`bi
+nTQhvrngcfwdU^]dPa[RIFCGNUJR\engcPMdZFqbXQVY=J_WB7*/QKRME\cn5`N=+me[L>PmMBfREb[lSbJ2G[O7`D]zp`HMlQ_HLNP|RV^<I9TKbeS9e¡}©¶ÉËÉÆ¿ºž·µŽ¯±¯«ŽÈÓÙßåÓÍ€T:8;(#5
+*-'"**)0-)%% $("
+
+
+#1"
+$$)+,-F>D8965;C9[Uahk]2&oti[VMJ?@B?CJD8CLT^T@JLMFGGJKGPJFIGLB;FOJFYOITWpiwlVOusneZPMF86LIQVRU[mjpHZ|aK^gdMPUD?0N;-5>4O4AjG6_mlCF&d^mbUp`LH5J&ZSF<GV@(4BC=pfC>\XjJaufKhaqwM1?Z[VppšÆ£
+|¢š°ŒÊ·£Æ¿ÆÔÁÃŽ¶¬ª·ÁÇÐÔ£[Zcz=**3(2'2/0-2'"""
+!
+#
+
+  
+
+#//.05B;MFISKV\Y5?Z_SQ[TJE=<E=748767;?<86@;B<BC7>>AE>C=@HB>?@72<GKEDI5Kvz{cs|iPSMW6;8904394CZO]p]c{rEezkcT:7GB:?"863mZX&:aiFGV4XfUtBSIT6D3079PC@6@;,F64]=6JK4XoYXEXUUQW5"CbMe{~¬¶»§§xgx£­¬œÐÌÑÐÜÌ×ÊŸÅÀÉÎÌÊÇÉÊÄÂF3=964<7'*)'# ,$
+
+
+(,(3.1;?ECKIMKIOQV>LTOIHK<??@.-2)+42,9;713</>87646998=>=D@<<:=<BHA.QK@KGC@ADEMPQQOYY^L]1C;98C;7;-3!
+*>QKDMTe`TX@1
+!3IM53YKK9W(d_pS8RDU0!#+*!?<R;%LP@$3=@3:VOURaA;#OlLN8KdI7)%I4J^wmŠœºµšš¥¥šŒŒÇ¿ÇÇÆÍÕÊÕÓÌÅÆÀÉÌ·€U=4F20&')-)>=/!.%//297?DE><30441QBC52-)-.%('-%%'*%%',-.22653,.,.,(.95)8:8;?;A;C=9OO?9<A5/6B:@IA?@JP@QL;5gwW
++BFJUP"+8=1B"-9<837+Q>9IL^HNA;2C7[WhE=?*>;/C$'
+%5OZBJVK+
+5I=:95=T,
+QE{lGXRb921:itVca€¬¢¥§¡ «« ©³£«¢
+€§š®°¶ÀÌÌÐÌÍÎÎÕÓÔÔÚÉŒX8Jb_QU<15')<V5 !3/*.324=>.*'23/??.:=;"#!
+ "
+%&
+%""+(&'#&0'$.%#2*0+0/B;8479589;65H;HM@2:=:QJ/AEJB>@)59<5;r6&0
+KC>2KD3G/'<7=*2*)F/@ULJa7X3O6X\AZ6B=.2->;C30(:8<:7%;L
+	"EHCK22W^IUWK^?N_cfSO_v`Wnk¢y²œ®±»ÂÊÛèÞÊÌÕÒÖÛÜßâÜÝÂx?%Dr²·X),$$/'
+"
+
+
+.+1(--06/9)-,,9H=59(
+ !(%
+
+
+
+%$"
+ &$$ #!"&1'( %((0,7.,2921>?905,EB962/%,..2MOG66<G54p<'*.;.P7%7A??*3A70)(N40kJK):;<N`TIL/; 4DWB%>./FNC.=9:Y+#",/7PN:MCN]\^ZS}~o]`kay~x~tyny{s|vx ¹ ÊÇÇÖ×àåÍÖÐÏàåàÛÖÛçÓÃI)-V±7PW3.# %""$(,,8+*(&2/%(.?M7@0$,'#  
+"#"
+$"! !"
+
+
+
+(7##&"",)'",,6,*.61:7582B@85!+$8-.$D.+:5:?2rB.;MHJP &1:C5%#-#FO7.D,%N<Th\h\='ZI!AG?D93"4F1:-5K6+.(,8Q9&
+-a[bz_ttY^{z{{vT{Vifc
+ystl}sv®ÁÊÅÐÄ¿ÒÌÍÓÍàÙÑÖÐÐÆØÕÀ5+Gzp}|zdKB4-+/+&&'
+&(##7?@>$&"'&"
+
+!"" &!())!
+
+
+
+(#
+
+ & *$ $-'($**%/1215/A>2*
+
+38&6B8BEIS?i{uX:53?ESLRY6(&@?%3F=B27-CJH<D%#>V;<Kfg5A'T0/7
+LG9;1QF%B.+
+
+/722@GA2(%S`Yfuwzx
+hwkidudrwukywzŠÁÏÛÞÕÃÃÁÆØÕÕÉÊÀÐËœ³Ì±a2/GSKXj}tghgg]Vfz£_?;3'..7;CH8"#%""#&"!!
+
+
+
+"
+" ".2%!'$
+
+%#
+!
+"
+
+$%#
+
+
+$%$*$&&,0:50W@@RIFDB8>]OMJIIB;/KagaEBFGFPb6477?6:3(887X\363#8E;SXl\A5<WB/.>99H#
+AB85J
+B
+%EMJBA-85!@PzeisdZPYgzjoy]unkgd`ibb|xrSrly|{pw Ž·¡·ØÃÕÃÊÎÔÝÖ×ÂÉ¹¹¡¡«°vZ=56@Gdª· igoz§¯žÈÊa35<80M>-"#%#&#  !#!!$# !  %%$#!"(!&"!#%$
+#+"$"
+
+(2!
+!!)! %%#""*2)$-,59BDLKLHXPVSLA10@dA[$#1<KZRKCD65!:$7KC`/),D<::OIMW[6]<D=(>-++ERID!6 <->C\U)?3%/kGu~se^VUXgec_h}|hsqX\kV]\ZYeu}tsquhv{y
+}°žÆÓÃ¿ÅÊÊÃØÍ¹µ¬Š
+oP3..=M°ÂŒž±±£
+}~~±¹œ·²d605,#93*('%"$'&""$""
+
+!$
+",&&"
+**()&"4 
+
+
+!
+""
+
+!
+#%
+
+#!
+&5>TI87:FH4B]M]D722E:E<\e<T<D)05C,2';/&7PE7!QbQM`YJP5/B>=B@2CN?-
+
+$XKBNeL__6P`i[zp`eUROEo`\_c}o]r|
+qgukXlf\i\ot~nzs©·ÃÏÕŸ€¥³²ª³»š¢¡wZ>78?iš£š  Š£¥¬¥¬»«ªWHg7222-*.4)##"#
+ %$& $&%0')(("$!/
+#
+
+!@cvL73).ERXdfII:=D^L<@<[bg@P^[ZSL0 !,?HPD>E6<SQUBTi=a=DV.0<I<CB
+ # YG&ENcokbBA)hqoamaf[hutyvdmgdd|^ZHelgxwjcjpfhi~}¥©¯µŒž£ŽŽ®§~aF><Ig{ŠŽž­­»µŽ¥¢|Qd«Ž¹vN_jB.%$$%&,'&#*$'4&%+$$! "#&2""!
+ 
+# 
+
+
+
+
+6B\pxvmD,$%:Dw\fplIWLQFV^\mKko<H^Z]aSR$DHRQCNJGD9eSTWj$V!75
+0NPX.4$'E;'&&8Eb=MX?gdc_QAQfbL{yxwzxpr|[XjoVieeezpjidVajfjev{
+š±š¢šrqswf>38=AVn·ÍØÏÀËÃ®Œ¿¿®«¯l]cjx¢«²ºµ³·®§m`MB1.(,*',&5
+&&-(%%!$(+"
+!$9Ja{
+
+}nC*&QWTkWZpY^oNNcm_PdK__8Pa\RkIE7:^,bJSozzAFdJJgM=GFL>86J@C1G:9-
+ 8?R:gI%HJ*JE\ah`_XtUYhpyyy~rqwbllf_jxus}|ruxrrfikwxtpxjz¥¢zxx~  g<58AGS³ÄÌÎÈ¹¯¶žžz©¡ Š¥€r}hbUL12)%7)*%1"
+
+"
+;=HVKTbnznyz~vkjdKD:;Hl]JfnYQOUP]NaTcMOlG`cgsh
+XBca6G9MO]T'0QO60>5IBRDC[O[CX:F=4
+,CMOmcTmF[LJFD9%c``HINJCD[qx||}bbb[cvu
+rrfifQXhgc`_gn{{}wv\`[bpls¡€¥ ^<;89<W²··°¡²Žœœ²ª ¢£ ¥§|vv~{vvrtwfnzsr}i[R0+7,6:";]ZVKV^viLJ@Fd\\i~
+x}ustlXND:VRCQ;;SG}pUKaebdjHL\cZJWfNR3A_N^-TYV2\e:IbL7.>MGI><Zdd_H/+=?B6PNU;6!ZFWZM1]NYZgh^RMS9D_,
+1Ndvzzsacd{~tqeX]h]IXfdeic^ZbVaQe]]`ehlptt}¢¡£Š€©¥f@?BAGd¡¥­µ±±ªš°­¬¬©£~VLOKKKJaUe}vmrwnh[?$(=%*1F[jd]^pnjkVVTf{jgl}yms|ywptrwxr_^H;ktO-:>YSrTRQLJRO^GN71[iZO<Vg_iW^3TL1UBIC^`_231P>E)PbWPO;'CNOW;KHRI^Za;GlF<?3/9XCH[cB_gnb_!
+!.DXUJYq|utz~qk[PW_N_ZSL:F^jiUocUqdifjhrjgkvw|
+ £¥€¥M[X?KUVou}w ¡ §§ª¬§š¡]YKLB?5JIMNS^RW\UL0*S\jhdlgeX^hnv{e\NP_ntk^`nqd`hqhimfZgjjnmux}iRr\_UQSbex&6MD8;CHF>BTmTbJY_JjDS&[4H9<7I]DV627TGU_dYGTECD\xgS59Die_I@UeP6R<-%BEEJdIQfpefU",Dfvjw}kjVHREg]T37K]cYY\wdYXQZdpqrx~ytq
+oaNHPNIZip§ujgmnt{£~{oTHA37+00<DKXjfbbb[^mkxVddsopr~mWZ__Rec^fQMPOQUXisnrghru{d]Pvzeh_YM=.TNKQPOBON0Sx]^dAmm6:[@7<AOXCTEUYW?EaZEIB4V_bc_\\chaPxkYXOFUQ@AQ()o45eQ;_ifkZ2!!LEP{w[_rwy|}qa_T/4-PD!
+$1$+CRXSRWOJGFP`opuyryz
+rgbPSQS[ir
+u`[`cfstt}
+hJA::8/446<:GRRQKX`_mtbgv{p\kq`PRW<?IB7?Rrtorniiql~}][QHUnXS;O2UVZi=23EnJ.YyhaSeZ^L9FdSY<D<^TlSogc6ESXF3<FOdqqiq}njJsdFceE3>lpe^|1+q|`KYiwdkI2Uq>'.BAQ`TAHy|sqjP-
++&AXDSlL
+,897@EGN[YLpflv~xvvdnvwxklsfG=@KFRZdp|¬ujiluznm{}w^PYYZTUTY\[`feegd`]Yacd`_aejvnkdcOXTNJTdv
+
+u
+yUMRYga{l,YOkpsh>bEoh5USh\wxT\LAKKeSSB@RYK$DtkA=.K=EXFNNixF`ibVfWpiogbV-lh-g3*XUES68/6ZBI3,BFP1$<7>`r]F]i\["1ID7%"khW.)&%*
+,9CIT]_Znolqqq`YW[W[X[mx{mdixf_]bduš«²ž¬Šxqs qimyxtkjgdeicZZWbb^[PWkOOH=?WP<?H`Vill~ztffilt{ms}uxuXF5I\OTFb]MQ[{{v_orERg;<eZXoe>KDU2LVC^HH_V*>M>I093-G+$EH:
+$Ei?kLVvp]ieqoTtvJ:3]QI8C.?5F^R;8/%DRUABNdtpDe^ecTKhaoymDDE"(9.3*%+
+
+.KG<O[ej`hiljncVWZ`]bdksumZOWQPKEENf £¥¬°©€uuwtpfZTYck`^aadieaaZmni^TS^[V]RQTXXZxvt~uysh`d`eeifzmbvf[s9*:I@RHDbntMH^{d_\KoLYG3fs~dQPeT/7/x{jUVn_RJ\23F6	?WQKDNRs\rjn~T7XWV,\UPYFC6M=c\LVwYLsB2CkhYUIDL^@b^AGGKNf|h\I9LD79<@95:838<?NSKHO`[cZZfnqkgaZZf\QW[]b`[`XRNLOHBBM`r§«¯­«©viehmpknrywsnhdb[[a]ejhh`]Z\khm[]D;XkSOlnkbxzpnj_aUYGJh}jZV;D@,+N=JQRafRVLFaXDLa[BJRF5R\we^ifH9@LZ&Cq[;9U.
+
++E)G=%[wRjY^ªFCGUk]dSR+f;W\7Ki
+I<Z^iQm2/A#+TG
+
+3]WljWGJ\YR[XPKEGEKKJHNOPRYa]NQV\da\^_ZcP]]WHNWYTTM@ECOID?DIP`n¢©±®š¥vnnlhljddbbenlnsmdZQMY[W^`cijhgehsnvabSVV`_dILRRgv}yxs|}jiH>SbojWW@M3?FCNsfUanmbJ;3nLE@hh:0T<,#8BaS0Z^N(`lVzT@>>]|zX?/4.
+1\WL6P@WGMa^x{P=hGYjdOMBK?YkW_6.OL];#<)4XY*:ZW\hmyyk`_c^XYWRTTVRU^WQQMLJLLKIMLOPSU]Y[j_oaZQKRD?B@FEDHNKQe| £¢{umkjpjfhi_TSPW[\^[^\ZV[]`_ei\NCEUVXwvnelqqnrqp|~jcjlm~{fXZlytT:@WEE:t[}w\]W[VD.GZ1JLtA,`TF77E[p|iTL5&IaShOCJ^p]sl_H1214:;1OkP<ALLK]ZgTL^{M:M=QUml|y_bgYMg
+e>0)
+2Ml ;HPTp^hqv{vljjd``\]WXTVOLJJFCADBJWRY\YaZXY_ZXUUJJGB>5@DCHEDGDKZk|{roj_^\Zedbdmmgfjnwsllmkgfdd^WSLA::@CLJ:Y[stb\\r|yo{{opq_dt~}x}zxgYPPO2CbZNdkDAWh[VRoSV!0IE6@JLDQ6\iYXX\C*.+LO12\[
+?nyhUITNrUPS\ebRM=A@4TS(,W\iT]`MIRUQltdLNZSHQiuyy}V.., "g>-NPZOHMbnty{y~oiga^_[WUSSNLIIJFLXS^ZXNZQSRWKGRPCBCCGIJGICEGIEEKMP\iottnkjjcZXZZ[[WWV[``][ZWTZ_gkhjjggb[]Z]Y[WSYNHTRblgd]rwgS`u
+kaUYqrvqj
+{zwql2203),,/?=PT@bjQABDZ=GC8=>KF:[JB_RFM[W/"Nm6.CdF=_RAFULA[Jq-;]H2MOZa:R
+U-X@GHIM?J_eLcjVZdocZm\egiaXSSINJHEcT`ogW[aZdjhmqnmljhigh^YY[\[ZUSX]_[`wj\u`QQYVOBMDA@AEDHDFGPNSNHDFGBDFIKKSZcc`ac_WX^gicZSS^ebZWWXRT^\TPLJV\]^bjfaaeb`_LbgmcpocYsi\Ydqtn`Zbqhz~{n^SFC30 
+<.#&POR\bLK<_YV\UBCDQJ-ZR3"LF>`J-CagcTF=,:[a*3Ohc58I) HA#B:5cMWq7<-F.K]DDLIN15>d`hhcd`lu|rknka`jrvuyxjfqpnolsonnjsnp|pqwxpfqvuvtqwvrvqdTFEFEIKHACACEDBBOYQOIJLHJOPROIQUaife`XSRUVafb_a\RRVTLKGIIIIFCDJNPSNTUOWWXdijYl[s]Zgl^eTVWTap~zn\bemoj{`PPIZ=029@_[?H>2ZHJ^gpCE=C4Z:!8F@Z@2\UlU4WQ:?,Qb+9A?dRQNSLBM46YMZTSYF/=>BFWfD<P/#/&|~uwwlqrwx
+
+yw~~ztvrxy~
+zz
+zy
+yw}z{zyuplZMNHIKIPOOOMM`hc_`emkd`_[TONOUWT[gsyvm_Z_W`c_[WW\_]adh`XWZZZadb^VTRMEHPRU^mt[_p|zs_spboyuknhjiipqowvy|_`ipgZ>)*3 <7^2$.BAA\WCfYfE47RH7N5%HC8"AtiZ454ED&-LICVQM?D[O_H6;'5OZgFKQQMWbWR/99K1
+-(uxt£
+y|uw{{w|}xjcummdSOQQS^aZbiebZ_\Y]YTWWSNRPPPRXhuxupkpldYQLNNTc\SYZ\[djZTW\XWZV\a_a_YQG?>@ES[OT]RYT\lw~|psaY^nnlj{thT^\wmjY:**%2,148PP<##O8F-!!K_H4G@N>Z5WPQGiS<D>,2IJ3P&(/]CEVMOKI2K,$
+20@_&DIQVUQD65-9M3ejww¥ª«­®¯šª¢ ~px{c^decc`egfZ\YW\Y[^VOKPVYTW]ZWQTPRQPVis}ytxog[UZXUWge]`hjknqjdei^XibPIABHTXVQMUVNgHIKOYNMamvsm^QY_ahntldQAZ[hWI3TEJA%
+HRI@B
+3fY>60+:4@aPB]_=SX8Gwn_A=<BqhoYY_12.)Ah[H2R-,+GQX/:KZAI0=?;7L?/<2$,qz¢ š±¶°¯µ°š«©¡{qqtz}wvwyshflifjfigb_cd_Z[VQNGKOSX]adgnqqrh_XT]cnuvkga\ZZWNTa_YZ`d`b\`nqjdixvhdgf[XY]\Z\\^QfTWYVVVWlo~yi`]c^_efcIQ]YP><RM;B='%)86;%)96<FCKEP+6'=?>Wi`Ybw&ImHET?R>VVy~mW*/3F\Q8Y;3E*Ap<[SI<TZIALJZF\lOMP+* š¬¬µµµ·µ¯²­©
+{x{zvkjyys|}~y|wvyutwpmkqwutngeb\XRPRR`_SMJJJMW`_XRSZ`addlje\Z\[\cbf\TRSRSUZahi\Z[]gpfYYWXTTQVW^HGJMH@VJR\SLeTPWWedbRIHScYQ41N65R5.54>Oc
+KGHA
+FB9
+ -+Imhei
+N8xD,4,1<eu9YwcK89fapPAhsJ=BQ[gVEFP@Re_WDGSTOaxlDBKB¡£©š«¯°³¯°šxyzx}s{y{zs{nt||~}wpfcdls~z{pjrxso_Y`cc[[be[UPQTUTX[YUPTa]^b_Y_hl^PUYWXXci`[\[]_[Z[_]Z[RX_dYM]`fOUaP^]R`fv^lzm`X<>Y^Y_8)ED;C.93MH7#
+"'9E10(TC
+2%2,:V+Ydv\4j:'3@B^l?;<XaEAfnd^]u]V)=mcRKQXLaXmcBJD6Ab^bMGbN£©¡¡€Ššª°ž¡š¬®«§¬ty{tsnux
+wyuuxri`]W[[\[Y`ghd^a`_]]_jmi_cced\WXTUZ]^fgmtjZa_^]YZ_``\`ab\RRUMIT]^Xgg[Nch\Z`gW`STQX_ntqvq[)[ZcbD-FLPC+.#1U@%41'AI18Y9K).0SE_NCXm]\G)%*C^XB@4KY`VJXF;B2H?<8NOhZ_gTSK.!cgkS1.0H[_OKg_ ¡¡ ¢¡£¡£¡¢Š²«§
+~v ¡lo{wsswwz~z{z|z{{rmljghaa`diqlif_^[gjff_[_YSVUSTVUOLW]a]Z]TLRRRXZYNJHGGBFHHEFNOMQZ]^N\Xjbbh^mdZdfgjztW'7QdcP=MYI6-3>M1>/6&"71R97E:-BNFAH7u{LC.2CGSqb\jejT;SDAIA;+OEL@55:Uln%FWC;G5 1OPH8jt¢§£€£€§§€¡¡Ž«¬Š Š©¬¢š¢yqqtussw||zsknv{yf^cggfa]ZW^]Zbe^[YUOMR\[W^^cX]_cgpbTMOVQPRQLU[ZY[_QQRQWTRSZb`WEDNCLKTQYNWXfp}usX2"%PgL+TlWZ68IgcFG$
+45*&90=B=VC\Pe2^wP:)5[LmtpYELX]@LD]qH=S+Rf"
+Q(gsk=0EJX\Saaj\<\(UX«« € £¢šš£ ¥€§šª€²€š£|«­£¥ £€{vhbaomddjggeYVa_[V]cifgYSSUW`eag`XVUMPQY]_^]][[`a`b`bcia][[__`[[_bdY[bbbdafnha]Jb[c\WaUPZarvwzg<9,)P9?T@BB2GDK.
+9$4UH(+D=@8DK;gRfSWTmhTS(Db^PXL;N'&QUTnzoMMoihkR -piIGlCNO`\\V_bLQI.Nb·€£©§¡¢¢ ¬š¡©¥
+
+
+šš¡€§§§¡yugdhonnlqulormlljbcehnonjgUU][RNQQPPTVZ[a__ahieYSPRXPPT[^^WSNSW[XX[`]WSWVMPJLSYXFUSekYfTZ``proAA?503X7LIFJJYS93/A=J/,Y:B[P9]@FDdTDFb9rZdPSg\AZL#4D&K2GKw7$4VYU;
+$blrcb?[^kk_TUDSeKU8&BVŠ{ €š¯®Š­©¥ sfksjdlv€§š¥¡}ywto{{v{|xjdfd][_itwujcXVLORRRUXVW]YXYZ\_dgdYW[^XTZ\UVUSQJKQUXUZUOVZQOMLRTRbZLPALCMb[_abklgF=C>4;9USITP=CSY;.&:3jNOasp9Dc5LO^75aw_bTjjMJ_?LA#:P5-=\K{e9
+(dnTB4Gk]aZjO4<OdjZ[YV>QH>0Bl«u{£¥¯²¬Ž²²±²¬€£~o]a`^rnr¢£ ¡€|
+
+{tu}}j^acb`Y_nxwiYQUSUYZVZ`_[Z_c_Y]bbb_dded^W]`[XTRXY[]XRKRSVX^][YXa`_[[OOPX\OE\WHNGigUIIB,?"KFTNSKapjQ=4R$aUaZKSTW6Z10EOLVkTO`olC.AB:,MF6SLNT9>xkeDDZ]^SWk_fSZ]sO,@a`JIOU>I[R+Nk€|¥§š¡§²²¿¿Â°° ]`bjnhmdnuvŠ}v|
+|
+vuojabh^XU[_^\dcbnrxrilfhb_VTOVXYW\]ZXT^TMIRVPHQIFQeSPKLNHMGELPLPROJUe_0F$BF:L:<RRfcjtqWndgleLA.JA?X,?^<2IKfuh\5'Ud?=7%R=_WSP^djp[lneR/dmrzYiLtteLZd`>VMPdLTO$@[€€ £Š³Ÿ¿ÀÁÌÄÀ¯¢
+zgXco~y¥©y|wx{~uhgbdkomnpvpssplnkr{||uqlgbe^XV_`\ce^YR[\\RWVV]Y\X[WX[PUSV\PEO^ZKKZYVI:N=HTHGGE@Da^ZpiVM[d|NnuN]6
+
+)(^O]ACgnwp^WC3c4<I/Kuw`<QUghvg`kgmhJU%(wqeI`]Y[upV\2N@UC+30c¡£«²¬£³ §³ÂÆËÐÓÌÇÃž ¯¬¥¡ydt
+
+~}yrruhnz~|x|}|xxw{
+gada^VS_`ahkVTTZ[SOS[\gfZUYu}uhibhbEFKZKGNW>HX?G3AKUHJKi^>XRGM+4vP6HhlO.<&
+Bf|meKaYtaR77:SQGSejb*\,BC>xle=RhiJM
+aijK6a\LkaSS:;K86OJ`}šŠªµ·²³¶¢žŒÃÔÙÐËÏÉ®··±ªŠ£§š~}y|
+skm]]^o|}~£¡|pow|sqoorqqqswmdjgWV][RY`ZY[\\ZSRWXe`^btsifhhh`gomZBEUbEDZL`FG>B:DYEA?TYHEZ2/>_J(NP
+
++%W?LZeWyWN-&
+W@4BIIM#S&6`aymqY;`OrlSBfarhs_frlqN9Z]A:?CIkrz§«µ·¿µº¶ª«°¡€žŒËÓÑËÔÇº¯ÃÃžª¥«¬®š£v¡ymlYTP>O`{~xutw|}qnf~mnhehf_]ixvxiqrupdlqcfWbimooc\VU\bfXLHPUV\lsbKEMHG@SHFKPQUT@HNLPR670DZA<.FAD:#RUX\,<A>8D!PE`sgjdz[RFA(7AM#@;<FN>"gq^bT>>]\g]vZ[nsx`d[kM?hTriX`hdqf¯¶¹ž»¿µ°«ž±œËÎÐÌÔÎÄµÁÇÇÂ¶§¡«©°€¥§skZPBD?H]~|yuoorp|}mhlmfehaVZsliyvmviW]^^ffl[Xhq[/"#&(,49FB$,:::K?NNJHLXOVP€A&7-E_6+0''4~cCF
+.FLMLQ+GL_BTk,hZMTO
+IQt_R7GAR:GvW1@+QBpVOJIWv
+RWjULH6QikpihLS]IUªŽº¹žŽ¹µ®ª±°ÈÑÌÒÖÑÙØÅºÉÊÇÃ¿·žŽ­šŠ«
+¥ªqfXPGOTO]ujoiimvz}~zy|zyossvvoimnyl\^f\TPVU_feZM7-6A<$%)'7GKQU[^ZIBGBOVYDcª-$4=\4)'
+NL!1,'"-;-BW77ATcoDG<I4zqKWLCKY3_HfTbNL*p5f[iaBLeGJ_<UJ?brslU=EPZ=ž¶»žµ»·°«­­ÅÓËÊÄÄ×ÚÒ¹ÀÌÇÇÁ¿ŒÁ£©¢«š£¯Šzptja_nkZnomrxpkt{trxvpyukcqzjt|~
+
+uvvu~~x~sdlmcadhde^Z\_MEDLHBFMSLOV_`]RasRME?KRlŠ2+'E*B5#
+$6&%4=RQ4
+BV&"5IF>]mM:6GZYVyVVNQ-mo[RVJ}YHgN_KNT[X9a\IIWHcWI[[+CE;U.WOÀÀÁÄÂÂÀ±§·œÎÊÇÄÇËÕÎÂ³ÆÆÆÄÅÁ¿¹š°¯ª£¯°¡¡¢§tihtidt
+xy{}|pkogduyupocTPZzs]h{suw|sjyrjpusp~
+|
+qqhkeopuuuneTZ\_ZPUT`\^]UVVVZdxxjURWX[IX¢C'>A
+?B.
+$!"(687?VZ4BB1;?V;*LI7KIO;B.tkG_E/37Lao_g^\nE>KHR^PQUM3UW3V]l^XmhÁÃÍÖÙÑÄµ¬ÂÌËÅÆÊÆÏÑÆÁžÇÄÃÄÇËÊ»¶¶³Š¡¯»Ž¥§¥ ¥£}igurnrx
+qm]S]ptsol\RUTZb^X`okiqz~}phvyvg^LZlw|yfp~~mX]\SXa_ZUOP\W[VaqrjjcT3N\og\HGAQE/CP
+&
+
+"
+
+ #$-
+),RG$?WWS150%R"!1,B5'RtIKI>RVAitcn}e*8YYf?CUgG!6IVjPV]dJ`ÂÊÍÔÛÚÄ°žËÏÈÎÈÃËÑÈÄŸÂËÉÆÊÊÉÅŽ¯³«¡°¹¹¢¡Š€€zqy
+ykptwfOLR[dpoi[W[`a\bd`aad`is}wp}
+
+oyxgRDPup}vcarzxnlrpiovxymimlgglaYYdmwvvbBe
+diyhxM[gRVBG!:R$$
+$""&#7R6;&(@;UdaV?8Q]B2O;S]IGMF\ZYt}tygH3SabSNTaTgS9?WS<CVe80fÐÏÊÈÖÙËÅÐÎÎÑÏÇÎÐÌÈÌÀÎÐÊËÆŸ¯®š¬­¥­¶¶®¡   tt]hlhg^OFIS]cicZW\kcbd_^e_f[_hZfr|}}{qslBL^t
+jiQiVUUVa^XtfcmjnkmntuP^srsuvmme{}md`bqqpg`TR]q|diwFLSQ)-67S
+
+
+)$'!!
+)R9$A$@66=EA;/8;GiP4*D&K=7qJD%;ROMk{vZ^]@7\[H>KS2?YLU\Q@UV>BDBaÏÑÏÍÖÛÚÛáãáÛÕÕÕÓÐÎÈ¹ËËÌÊ¿¬£€¥§©Š°žž²{¡¥§xxqlxsd\`cXYWPYY\ee]X]\d`d[PRXVhqtWWp|r|u|fI^j|wkpPQV\UPPYW]Yei`msqzwoQbemwUW[_^a{lWFc}a7@IXlr[COegC1?Q8H&;@N'/6'# &)'-OB(
+B 6)5?@=9%176DvqYQ*8D.QGX0AEhXviU6>ZB"3=#6JJ;HWPbgXi?7TRÍÆÆËÕÚÛàßàãàÚÚØÓÐÉŽ±ÈÊÊÂ±ª®·ž²·¹Žx
+¡¥Š
+tlmmmeY^dVV`nqi_[bcbqofPSWYbwt^fw|sp}x^brwv
+zzdUHJRYubckuomxtw_MYibSSN?LVmfgT<keNQ=A_deH*2Vro`JHJ;0FID>?8602-
+$' !HE "2*!/2184B6
+2;&/1l=OOZ9R']
+CTV_m=^3HL"9
+0
+ESI>Jg^geV]RS\8¿ŸÅÍÓØÛáãâÞÝÛÝÝÙÝÙÁÑÛØÖÐÁ»ŸÄÁŸ¹¹·¶²uv~¡¢£€£yndjngeS[PZnrro]Vfkmytqhff]`leYnxuuujv
+sootxuvyWKK`{soxwswy
+{fIO^uTKKBGURl[dRIV7.)BdsrSRV[Wjmfe[OMI
+O>!
+!
+
++ @L&$1)!',/:6:5
+5A1/CSrN2Q/)fRS0&2nlk[H<AX*	%EB:2;I$41U^YZ_GOtlGGÆÅÈËÏÕÛÝßÞÜÞÞßßáßÞÍÜßÞÝÛ×ÖÕÒÍÈÁŸœŒº³®«¡¢¥{pxsmvttncXTUpxtgWdsgnta\ed`Z[V_dnjewjfi{m{{uxztvorq{~g\dw\Wd|q|yr{}yruHEZ^n?9FMQVKL/
+GWROFHP~\cY^]\ed^YXTNJ&5M7
+
+ 
+&R)
+"!,-$&++:??6=G,,1FSjDM+CNImj]vM8X?#KDI6B
+
+342I4F9[D;4hF_N8HÅÅÇÉÐÑÕØÙÚÞâæâáßßÖÔßÞÞÛÖÐÒÐÍËÆÆÃÁŸŒœž£Œ¿Áº°§ŠŠ¢yklrosv_VYT^xycdyucZSQU_jjcbhlpwmoc^dme
+uw}|{rrwmcimjeub^xxj|wnwtrUa\fmK5/3;"?a`p`\PK^VT\rke[b`ceZ]NGQA?:58
+'!P<
+!"-%'%.$&DK</;,$'/@ZpF'dYWa54QSVe^AF	
+,2MSRM
+',9HJ<;3.X`t7UgÁÀÃÇÉÌÒÖÚÛÞÙÞÝÞÚÛËÖÜÙÖÐÊÇÆÄÁ¿ŸŸŒ¿ÁÂÂŒ«ŽÃÄÅÂÀº²¬
+houqgysbk[n|l_mvh__\^chkcean|agzhkzz|uu|qT[nsnrninp~tt}vvutguoV4!,A
+ #(K[afdaA@,DQKjv{h]^a_UWIA>P=3"- 
+."!2C
+(8*+%+101?=
++:*$+)A@[k@}4/U55JIAP;.]`B7
+?RUBB JFHV)8D_JTZQŸœŸÁÅÊÒØÛÛÚÕÜÝßÝØÂÕÕÒÎÈÁœŸŸÂÂÄÂ¿œÀÃÁ¹€­ÅÆÈÅÄÄŒ§¡§¯®€ ¡§u|}ni}n^upwndffainnh]Vgphm¡creu}g<IC57kqtlztv|zt{r\HIKOJ=9;ZEA>DCHBC>Go_iaYcYa\\aa_WNU;
+
+0-
+!
+H
+
+
+%..*)(/683,
+->0($(<0FMv`09VB42;63@2?EEQhW;1EIQ*-5hTW=<?7GN-Ybe³³·ŸÂÃÇÌÌÎÍÆÒÓÔÑº±ÍÉÈÃÁ»º¶·ŒŒŒ»»ºÀ¿À¶§°ÅÆÇÆÅÄÇÅÅÅÂÀŸÂÄÃÀŽ¬©nnwjyttsnnncK<Vnu
+¥ g}iŠ{n?SD=Gxdel¢¢{jhcX]LJERbWWMKVA@2"GjO[hlf\h\ceiZ_SOF'
+-((H.
+.*##*/-05'*
++<6%/>K1IAaE7/P206&4@>5C9:89DS[YQ5BQI^cUF\XWHA1vjX¯®±¶ŒœŸÁÆÈÆ¿ÈÈÇÂ«¹ÁŸŒŒ²°°¶º¹Œœº»¿ŸÀÂ±ª¶ÈÈÊÊÉÃÄÆÆÇÉÈÅÂÁÄÄ¿ººŒœÃÂ» «±¢¥
+}tlfhdWDJp|¡¥¡sr|`NRFJ^zrR_x|xw£¬®xrigc\QKSTULY\[TLJkaRD%RlvqhdYYO]SbLQJ)
+
+
+
+1<A
+!%+BE
+
+,1$)#'*
+-F7)&6JCl>R69&?:E<B?<<=:>DVGTOPjD46U7 ;@Z88R®ª®°±Ž±³µ¶³¯º»Œ±©ºº¹Ž®ª¬®µ¹ÀÀÀœ¿¿¿¿Ÿª«µÄÇÃÃÄÅÄÇÆÄÆÅÃ¿ÃÄÄÂÂÂÂÁÃÆÄ²ÃÊÈÊÀ€|kji{ysgZeu«®§ |¥gOTXU_leHa}q¬µ³€umXjUANJGW]\iai^Ro`hdQrshaXRWVXK^<M>D#
+
+K? 
+D (1
+!!&'+2A"&"C*UAm!
+$Y?"*EJG368=<C<BN.(2LZHA_d[F#>O9L<H: £Šš«§¥³¶Ž®Ž³©©§©±žºº¶»Œ¹œŒŒº¹¡¬³ÂÃœŒŸÀÀÀŸÀ¿œÁÀÂ¿ŸœÁ¿œŸÀÃÅŽÉÏÏÍÈµ®¹¹µ· dQYz®»¿ž€© ª€€zQ?Mc~~
+~wdHb|tªµµ³°¢šoW]nK5E\GQX2*2Y{DNOdQ]EsO4DEAELMIQ5QA.G
+
+"=
+#:2
+
+
+
+$,
+' %1/6! $F*HDh$-I085C/&:,-.7DMQ0/0/A342JVg@[]CB\X58¥£§§©¬€«ª ©Š¢ €š²»µ³°·»»žžµŽµ¯ª­ž¹»ººººžž¹ŒºŸÁÀœŒÀÂÂŸŸÂÄÃŽÇËÊÈÆ»¬³œÀÁ¿ÀŸ»±WLg·ÂÇÊÂ°€º±©ª£ªvseIWvh^h
+ª®³³µ²¢¢_ekURLXOF@55H7,OD5;3F1BIacg]XOKOCNO7_P#@,$('1#7
+#),!$# 61 -C7/@]Q#0*S:K>8-&B.
++BGG@19?02>(7J_B"bZ3@\FAI¢¡©€ª­³Žµ³³Ž²¯±°®¯ª®¶¶·¶Ž²Ž¶žž¿Á¿ÁÂÄÃÂ¿¿¿ÀÃÄÃ±ÊËÃµ­©©¹ÀÁÀÁŸÁÁœ±zo£ÃÉÉÇÉŒ±ÅÃŽŠ««­¡lXPkt[Ui{ª­±²¯€i]OXBRPR]UZSQSK76. 0
+56GPRNUZWQIIQ;_-%0'<KAFF$
+%!
+		"')
+'#/6I9J9b<+
+3HA2'/ <,6@B:O):7,6DK4'@PY.6jH,CH2@>¥­¥¬°³±³°¯¬««©®Ž¹Ž¡±Ž³²±°Ž¶žº¹ÀÂÂÂÂÂÂÂÂÂÂÁÃÄ·©ÇÂ¯|{±¹ž¹ºŒŸÀÂÂ»®€³ÅÈÇÆÅµ¯ÆÆ³²·¶µ¯§Š¡
+d[Wt|nx\Yi}|Š¯°¬Š|\feUMJNQeqjS>UnUUL\YXRTH,JL>WUF=B==9W"!*3FEMG -
+.
+
+'*(
+,
+"3<_W7j$5C<Q*
+9(4:B>'$M+4:8A8?K4"1?A%:]H5@N@HH~š«¬­®ª«®ª­¯­«¬°®®¬¢²³²²³¶·¶¶¹ŸÁÀÂÁÀœ¿ÀŸœºœŒžª ¿ŽHOjª²Žžºœ¿ÂÀÀŒ¶žœ¿Ÿ¿œŠ®ÃÄ¯ŒÂ¿Ÿœ»¹¹® yqdl|kpv{¯®š¢q\eOd[MYcMPJViTQbmbum^T3@KLT<.7
+!"Y%25?;-KB2)	
+
+
+5'")&N,;(&-9/c'S@n;)#?8$*/9>-
+EE,%"2H/3?49?W=%/JG<7RFXP|¢š¬­²²¯®°Ž±±±ªª©©¬³°«žµµ·µµ·¹žŸ¿Ÿºº»¹¹ŒŸœ»žž±®ª§ºŠlFDNZo¯µžº¹ŒœºººœŸŸœœœº ¬ÀºšŸÁÁœžµŽŽŽ­€¡qr|nu
+~Š«©€ybK.C^g]U<%3@uq[npVmtg`[MH9PB/+;=74_;>HJ.5L<F05	
+
+&)5;?!&$>;C
+3($@"e6K>`.>
+6-0CF%
+6F&/(747<;):T.
+FJHINPEEA{¡¥©®±³²°±²Ž³µ²°²Ž²­®Žž~®·¶¶µ¶žºœÀÂÁŸººž¹·µµ·µµ±­­€¢­VG<>EIš¶ž¶µŽ²µ·º¹ŒŒŒ¿œ¶¡Ž»©¡»Œœº³±³±€ 
+
+¡¬® €¡iXS?\YtpsL8:Epoc|WrcRVDP4/(@EL?O]GC24&90)$TR*%$BS;+$"34/"F^A+
+MWQ%B/."BG&6+%8L-/!(786*/[2-F<6)
+;
+.£§š€Š 
+  ¥¬®¯µ¹ž«§©¬«¬°žŒºžŒ¹µžº»»œÁÇÇÆÇÅÂÁŒ¹¶µµºµ¶²««®dE=6:EM|Š°³µ·ž¶µ¶µ·¶¶¶··®®¹²±Ž·¶¶°©¡Š€Š§£¡©±®£s_^XVThY>
+6<7+1V^XP=Y^<Q:=QS:2+/EGXTSa`@@7
+#A4"AQ3"BRFH@83+37B
+8J:H$+\a??%:W@".%2I7,
+#-8#$%JDQF=,"0:!:§«£¢««ª§š©§©¯¶¹¹®«¬®±µ·¿¿ÂÂ³¶¹º¹ºœÀÂÃÃÀžŸ»ž·µµ²®¯®¥¥¬ªC105<C\ª¯°²²³±²³°°±³³±¯§€z§¥§­°§£{~
+š£€¯¶ž¹ª²±ª§k]iG(7(;PB>/4$$13
+$
+;&*@aM77(IKCRUc^KD:G:,SC#3U\~ryzdg86
+2:
+1&N6D3
+Uh+,'5K4
+
+&9J5
+3$38ZXBC!&=B' /¡šªšŠ·Œº³°°°°µ¿œ¹ž³¶µ·»ŸŸŸÁ«ºžººŸÁÄÂŸžŽžµ°®­«š¥§§¡§¬ªb%'2<IEw «ª«¬¬­¬¬©šª««­¬®~z¢¢¢Š¡€š¥šª«³¹¹»µ¶Ž°¬š¡mYh^I<D=G??AG:2CYE+*B!3GQ7:JSB?FMF]\CF6BPLGXKOn`Prgftzuna%",K(DL-^LOH )G^!0M5-
+$+@P<:43+1%'(37+4[D?1
+(7<%8G ªŽ­€­¹ÀžŽŽ·¹ŸÂÁœ¹·¶žŒŸŸŒ·¿©¢ŸŸŒº¿¿Œµ  ©©£ ¡€£ ­¬šh*.8hug°°«ªª«ªª€¥ŠŠŠ§š§Š¢ ¡o€ ¢«Žµ¹¶®Žž¶°®«©uidbfVJPVQ=>BG;@e]M2#,EA\NR,3H?@SXQaNFLGQA0Py]VlaTXMv#'*SW'2*<GE?./C<P$AG-,8	3$@
+"::VMX0HOHM[\T[\`TBG:>ARpVWs¢€©ª¡§¶¶ŒÀºžŸÁÂÀÂÀŸŒ»œœŸœº¶Œ µŒ»µ³¯²ºž³¯¯ª«¯°¯§zz?1O¢   w{zlu¥Š§¬¬¯Ž²¯¹º¹Ž±®©ª¢ £odaSYLDFFCG\ok`J+)-I;;3#CT`.%-?>EVShBIKGF#fvNfdLPg /+k\:#@RC$29JD`T:: 
+>
+*5E&-E*7bE  $1$FE9=a>^=[HF;<Q>C€££š¶¿ÄÅÃÂÃÃ¿ÁÁÀŸ¹º¹¹žžŽ»ºª²²žŒœºµ±®±²°¯®«©š¡|m<.Qyupzw~wxyy{v{{rxc~€ª¬®°¯¬±žŒ»µ±¬¡¡z~o_\WW<C>?DEIUZ\L?HZcPIKB;@cDADG@NTJCSGLDI8
+ADIOgrw
+TU3.
+zK+!-lU,9NLFN3'G64
+@16GD=<U^QOSWJF;9?-6'2Zb,PKG>]YB[¡Š§ª°£³ÁÅÄÃÆÆÁ¿¿¿Ÿ¿Œœº¶Ž·žž€sv®·»º»¶µžŽª©Š¢¢¡¡££€¡o`-+Zwqms{tu~t
+th©¬«§­³³¶·¹Ž³°Š£zmedb\]YU_XK>OGDJD;QV>FZQM2,[LVVM6HPVZ]L7LA!P418?IK=M`fokZ@q!1=uw
+4&)G@<8GJW>0/@L=3K1V2>2FH09D<A-3QG@\@$1VC5Q(=RJIOFZW£ª£°²¥µÂÃÃÂÃ¿ŒŒœœœÀ¿¿º··±ª¡szµµµµµ²¶²«©¥€¡o{Z1Ip~od~
+
+
+{fvgqq
+}~whh£¯·¹¹º¹·¶µ®°­£zzbbSTYYTYU^WSZRXMD?,3.NS@$>V]`\LH;05TJ<:DPK3^UG"&
+5I73:F>&O=2BVWQ0
+(QDTICF`<27@IY4=P?A<U@1cN>7<,OH\kU=SfL9JTebE\H8XP8©¥®¶º³±Àœžžž·ž¹ºœœœŸÀÀº²¡«©«¯Ž±­®««ªŠ§ £ dpc_szly
+
+}vsdyasr
+~qv~zgcto~¡€§«ª­µž¶°¬­­µ¶¶±€sj^VV[WZULU\^X\ZRUSUIUN1!EL9JBACA;C^1?MFL!*<>A%
+/F59G@,">FAC:;2%&8?M9KHcC'33?P&MD<1:R[aZD:@HCT)CFT[ZbKd`gR@X_Zg[?N«Š¶¹Ÿ·²À·Žµ¶³²µœ¿»ºŒÀÀ·±žŽ¹ž®¯¬±³²±«ª«š¢`mrv|ropm{}
+}}{{~{~x|jdt_vyo~~vlgv£¬¬ª¬¬¬ª«²®«ª§€«¯­Šz~oufZSSNSTV]`_\TVMEZNNIO2OF97EQN1EU9C,%7,882@.+(:;'(?FD!
+6N7J;8?E:=<=MJgFB:&-,U.RG:1HWB0DZf^qYAN6RodV\b_XEDKWeC?VŠ®««µ¹Ž¶­ž³¶±®­°µ¹µžž·²«±²°¹Œ·®¯«­®§¬šŠ¥¡
+|\x{~wbWVdx|~zusz}~zxwcalawu
+|qxroz|{}ŠªšŠš©§šª€§ª¬«¬¯ª¡¡l_m]XSURRSNMOPRUVNSgRSGH0BJ53TJVPY\C
+:-=24I\D6B@(!?.
+	* --O@@EMOVON<CDd;1O;#A8=QF99GOYW^snpePY*=DJG;J_`SAMY~T>J]Y ¯²°«š ®­²²³²µ¯¡¯·º®§°©«¶žŽŽ¬š©©€¡§©š¢€ xsiwc[Y^klox{{~}u}wupU[gszm`tsplnthov|qe}
+u€š£ £š­©Š®«­¬­šŠ¡tn`ZY[XSTKNNNJJIKFBO_UNLL5
+>GaSMWUR[KK0&MC@7..6@8*/>YNI7.0(3A;I31%*'+BQXX^:53BF?0:OED?P__\QX[T>DPD39IFMQSCUdwV889BUgK€¥ª¬¯¯Š¬«®­£³ºŽ¥«°§µ·ŸŒ°®­¯±©Š¥£¢š¥€£tei~rec_Veiov|~u{wxzryzwpY`hmi\aTu
+nsmpsq{iyxtqq[|¥Š£¥ š«ª¡Y]_]\UOJLPOJFBIJGZVPOXSCQF_fcA7PNGSND0<I8,3#>.8-.9\N`kbWTJ>:+043D+!13(2MJ^;I1?6,]MGR[jdI[WEnvjBAJIGSiOGTHRH]odDR;DRRvnybO
+š«­Ž±¥­ªª¢ °¬šš£®°ŽµŒ±£¯°¬ŠŠ©«¥ €Š¡gbu{zkhg`hsp{wxwwzr|ulx|wXg\coprNgryppgvjxk`u|
+y|Qj}s
+{viesu^\_qi\QOROQSID=NPhMK_XEJgWbYWM09JQUKHSH8&
+,/<'D;EHdaZPlxxob,(9C--/7J6+/K^KD64Q;OGKRVED]lmak|cW7QSOR`uG]PHBQipOSHCE;M~ya{ui€š¬²­°¥¬­¥££§€¯¬ª§ª²¬¡Š¢¡£omyvpkgmuxruxxnwrslR``x~|zYhuvmkknmoinvzsrdqSb}y~siqkml^_]geeljj`hYZWOVSPIA;35RjLM_XML]PVXL?85GQXKTXI659=GMA>PDJ9LZPSQeotru/&QuC'8EPI@PbH[WQ9%4=D=ZZvtkelmhnQ9ibmyjLI]HOM]\ZKGJRSSmxuy§°±¶§«€¡€©ª©¢¡Š©ktzujgqz{{{}qy|o{whYSfjp~|bo|wdioon_Ymkswr]bjKYuu}qj^[emoj`agiegdv|k
+w[^UTFQ[^[RKMKRqTRO`fb\T\B7867SPXT`ULOFBM?@FM0N3(0Cd[dc\\5(HUH!-*A8HVSZeYR$
+=7%B>,-D`aY=/+OTOJ
+9eJT`M@a|k\P_SWYUVwsgrv³±šš£¢££§©š¬šŠ§š`xh]qvxurorwttz|j_f[Unr~fs`fr{ycXcuolvamiHTkdhkmenhnvsfbnmlqhiiiYm{h^f\O\ba][VMIMVPHLPTOSKLNOLWRNHWNO=ORRNED18C)A
+$2*.WeacK4$@=1$7:;JbR_WR)6QSH1*.%34[NSSE757IYX^qaC_`HQawbDGWbbFXQnvlk} ª­¢­¡£¢«²«°®©±°€ {}|Z}ngu{vxysfuyvuiszT\{rxZcpubivwoasqkl^m\ghDZosxwqgspsrmednpnpn^bf]dnkc]YLYXPU`YMDNYX[SKVMOEP9JVSOOQWH?53$10A3/
+4MC
+3&.+"JVQG;$;
+55F"E>ZbP\c@.=KKP[L6.=5YFHDJ=G*P]XN?Hb\INccPDHNWFCKZp|¢ª «³»ž°¬§Š¥€¡¥rxj|
+seoqlpttqv|yoqoxtSgxug`bakkriYeuu|ddhel`C_sporkoptpomdmeflmdajk^aaW_UOQZVZ[]SRSSZV[GCBHXR_D<ERGZNTO>5.$#7@>328K$7KW<,03:P;7C=)='<BK/:T`UPd:NF2+?GSWM-/8GCBFBSO:)Pm>:=Mi[Fbb?HNTNG;WPYvtwz~§§©©šš£¢k
+plZ\^dnwxuovrmxxenm]xztd\aQd_j^XillxhpbYibBgpqtumfplhlekunorjcbe`\aaebfPN_X[dZUQPQ\XZIKCALTaKE?RQR9AHOM<49.,(?Q<C (
+<KA/69)N-402-<32'.DYMF_iE,8PSURC;A=WZJ;=VDFQP@IWj\\pXHFWOF=KMWRzn
+~
+u~rz¥¥«ªŠª§¢ ¡d{
+
+b|~k`jppqrmjksxwupjvbae_kRhwzhinno~oi[Yg_Gdpqonaktrtnghpkfeebgnlaae]^TKP_VSTTT[X]`V_RNNHJX]IJMZRG4/,6AUUF302G=9J9$&
+#(8K/:N>0OJ7K9;4"4GJ]gkKS@4""8E@GITVELu_;55BTZQ@VXZaxoaQPIRXOFFUXsx
+url€ªš©©§¢¡€j}
+
+~dy}
+
+zndvspwwpzwwnlhgubju{syb_Olong~}zm{jgf`]XMeehhdXjoomn`Uihehbhhe`TOZ]][Ycf]ZY[[[[X\Vb[VPLG\\HLWMRPHD<?CADLK?OA&(=7%+82()9`5IcJ:<=TQ@DTQZ_]o[RP-
+
+/=PIN[cKBNOHX[FK>Lj_B9AIGID?gwPn}gfn]~
+¡¥§®®«¥§«©¢l~_
+|zn]n|stml^kblojchzmc~{zjbahi[`qhsj~nib^hQTdcgkdWiqlfigckrrjY^[Z^Y[edZZchgcVg`Z]_]`ZdW\RUGUbJSTJKLKMOLP407COe^9/:3$".% '*?VVU=5VeSNIC_V@^hdtQPEJ0	> HY?AKVROH9IdIR[QC=(8VsNQvwe_dtzhl   ¥§ªª§«©Š¡t}
+
+vu]w]gtqtn]^jippsqyag
+wsxzdvl`N_gibZicb`[aNU[]aebTegddchjbi\YdjebdX`Z_X\fd\i`Z[[b`V^`eUPRPFKgOTLTFIIIIRKB6/-FrVE94.9=*";avUEZJJ9*C.Jezmn<DU;		"N]aF.DYYMJH@agNynEZ2&FLDCaCKOefcy}yujnwy§¥¥Šš¥©€£p
+{v|}\z
+znNdtrrihxsz|wwvabjnqttxZwuPMZjmqsppqnobcM\caf`SJVegj\XT_gmijgenjf`gj_]g[_e`W\XW\XX]aRQOODF`SQFRHKLJM\JEC::oh6EI4>;,---6}§lRA
+4-%7F6Od­~t|Z*
+&6,_]vfcPRY[\V@:Wqtz]LMYkSG5-]MQT{y{|}vqfn{ ¥¥¢¥Šš£ r
+ms~}
+
+X|
+svy]rzohlqq||~xvnf]RYeu}xRV\TUhgfhupppngRJGaga^_ni`^RVV\ee`dif]`behbkpm_defid`]adYL[[^SOTPBN^ORWKNROP\\KEA;iK55<TJ10-+9iv
+cL"
+HE=S<JgX|§¯ysV<AK]hZgoR^cVPID=VyuUON[t{gI:,/PSX\||}zv|{pzy`s¢€Š€¢¢£p~yk{|{
+y]wx{x\iqeixv|ywsti\Tbu}q\KV\KQbmmgplqnf^;MIXONX_bZMakigfjkimlabdh`]XX\XY]\a_WYS_a\GW^[UTPS>O`ST\TUHJQ^KEFBd|b@DPLPK7:DQx};>A,.k'ur`hsSTZcN\r\`LcWaHp^b\_JRJUfDA\zeE1('7NMYY~z||yyptrmbxy
+¢ ¡€©¢k}e|~|w^vv{uXdwr{}a^qpheqxn\YXcoYk^MMR\gagdgLaU`a\\ZWdX]ebiphdggl^bdpha][_X\^]]`]^W][WLU\YONNNCG]WNQaMCLW:HDCKqTBNZf[VQSH]s©ºnZf_KF9:9+fW^]`[rVYhpeIXdzrmN58OqbMIJ37XLR]UaP+ !8]XZUxnt}}}|qolsb_uuw£šš£uv}{w[jv~qUewluww|[TgmlvrdO[_QY]`dgahulfuZUHFT^VXdnssnmtqc`bliZ`\\eghdZWemg`kieWVUZ_U[X_]TRN:KJV[ONdU@ZZKHL]Y\k|P7GOY]ULN\tm_Vaf]dt[G@-&R¢f]d}fempgxX5Q[qVLFYDKT?PV:NWMc}F9V6;8K`V@Af`~~}|sqdfeW_pwz  €¢¥£¡y}
+z
+xm[mtzmT]k~iimt
+uR[a]lvaIH`_SQOFSnhffkqugH8/=U`VW`mtsobgoxsjntng]\_`b[_lg^[OY]RRONKMCMO\\LHAANRUMMNTVRdOY]rx~uOLMSWO:CwibIE/"-v][`Trkxr£meTA3jrCKV]\MJ>=TOWU_:V5#8^BE8RC1#1j|~ulmojfhf_U]hq
+¡  ££¢¢tp
+~zw|t\srx{t{y_Mayrp~lQhgbgZK:Y_Yc]F,Juqwjzo[K7ID1biljijihb^\``ipyvwd^dng^`]hf[]\XUY]U]OHEQN[ZRI=NRQRKJIJ[[VXyJ_w|_WUWPKLT`kx}vjs}}C-:%4|sIbcM@fki<%H;4Xf~]VNAARM?WrMGTf^?E0'IB<1#02- 2e\Rlkaigjf^bT]ikw~~e|~~u~
+m_l{xy}ztnVglr
+xl~{gGasxcZ;?SLX]]cOp|tofcPF]eTF@mgicmrxhlpeVeUT_if\cZlmjj\`[X\lkeb]Y\J:G\U\ZXBLTNKNRSOG\dXg<}~Z_]TMNJ>>B\qts}zero=$3%<u^~IQOROVR4kbe[NUI-8=<RR5DLb^?-.-'@E4>)+06>Qd`jecabjb^cW^ppt[hwyyeYqz~tv
+sWf{{{wtv
+|yyaWXsfe]Mb\Pd_TfWoog_XTYvzr;:`yhgeditphbeRbg[XW[HNP]c[^WWPP\ecb[UWXR>PUQWQNIUUQHQSUNJLLtB>oVOUXXcG@BR?=A[`ra[hr=&-!B¯TjKVVeY6[cD9637;ssTTLCH584KYG<BC\d>?31^FCO''%54;Kgnokmn___da[]hlo Xa|}za`oyu~fVkyxqnzx~{mgSX^afMZc[_rW[bQc^SbOa{xy]7Rggdgd_izsjdWZfigjZ]]TbXWdl^\\RTQSTSIKKJDYSRZNVSWXMGIKF9JRdN'>LMVM7IADLVG8WkL[q~scw3'*#Q ENMqlSKZVSPN.9LeH>FK[HKA+&IADGId}E40>n^B"
+:,%NRgi_cnphakqtdfltsy
+^\zxx|}w{kZdv
+~okV`dfcakmjfsjhXTY[XB_]Woc`YVSZ`]X^pwxuW_W{{pjurrprphZaYYVSb\f]^Xeeqo|jmaR]X[YNLDOXOXQXZJEDYRSHIk
+d@
+!4PeeMM@N@<?TCKQ]_^\g]rhgbc:725ewzlvISQa`.cRto}xe;AZ]XJEOSXF.5MKCG9YvN+7Cbb72:G=$>\^chy|qlphdaox{xppievy|
+xownXkslusrpnbQ^sqrvf{pcn~qZSmfV_RXSLDZeTpmrxhnqIvznibfqgdehpnpUMYaasrcZR[\S]e`^c[mkRXUQLIVX`SZLLDAbKNEn@$
+
+.@NNC9>QEDNUKQQQaJMS<WPbyK67,$aiT®šJPRzN[fqr{sNiQPb@YSwD?K?LWM@>Xid1D8`aSGW3*5O]\jru|wyx~zbWgnr¡ wxivjpqp[syl{yk`beZmzy
+ui[k{WhlaUWMTLDSPTmlmoon\vUiuvt`[\krudom|rmtcZkdNONPNKUQQPLKOPWU]]URWKI=;XBQVe)##&+B@LA4?MRFGP7K[esJQKShdt`?:F=:bfalLPTj`OUYdfZcW<ULKC\sls[KV<?GVHDpohDMXWA1FC.?69_qsp{tlrxwvuvoagt§£ªª_
+uegnptp]unkbnxi_kt{{w}kRtnAgkZQMRbcSYPkhwykOhUns}tY`dvr~~{z{hqwmtr\WSIEIVMIIKKNMXWKMRQUX\DAN=MQvv1(-25?9AEF;CC>RY^E`gj_zOYJk`.(8&)LMKHODDKOQOIXQOT\GAF?YAYTb~OTL97=6BHXba=hl65I;,49.;]fsllnir
+nyzw~unt
+šªwbljtwtnyezMkuqtl_grvmho~sjWVuoXHX_^OGW_hkBZpsovWrHSxhdlwyc\hkq~
+xiq[Yldf_YngXTLQVLOURMSUPLFJSTTZ[SKHGUR]<(116211;ANORO@8UQLus[GWcaZa],$0!$HNJHHIFS[VIOX7OPXFEECSPwunfRPEBE@;78]}`<UH9HO5,+'3AWhrsjfn|`z|{xhjtwep`x}yscma[lruumap
+^UOuhcQ`kVNgF:KEbnaQf{sj9Os{mkXdOklgusx
+xuwtxaV\fdV[WX^cc]YTgldf_[ebSBMPV`^RMKJHE<-76-83(+05IWUXUQKYQHUXVWhE=HOFZ6*-"%Yl``[HDJIJ;A::U@MbK`RT\nRdLSFHEJBA0;QSg2>=QWDB):09PWarsiarvzcuxs{y~qeq
+kvhgn
+||]luvzromog_pyGRMNcgeejUSqMBb~a6;AogB^emwepvOkss~bHRrpjtxus
+w{wuk^of`lrojkilszf\oqk\SFIDXROOQYGM>.992=-)(,0AOTJNQLF3&A% 93LVU^ITQ8/#)YL=D\BEJBF87HlnRmwPfNOX_P;8KBL<HHF04IE`L)=JNRGB+&;LN\dpodexxysytam|
+
+
+{cptej}}{}jQ|}|wovne]qrkdVK?RpiW\]Wp[5n{^D<JdQopd~dKv^\kqx~za?Jmmkmtr{sehpzxttez{oonpscQX]_\\W>FKUKIOYTHJD<8::6+%%+19AE>DLFI*2@:NYPfMaKK<GK/'.eGTAnMQF=OL[lnM`\WhDS\]^J5I;I>UN:=3EX]*#5UWK7ESB?MWY]ic]a`grvttnle~yvx¢£m_
+
+p~~ekv[t|vvTcxywsktz}dmumIGmfXfqic`NfN5BOotmmoqbPcyvwttzQhpegilovloww{ukovy
+urxnn]ifPKGRXPQWkJETOOWbQKJOC8::.)&(%'**9BLEGC,>=+-JWgRX>>:0Z5%BT>N77FFMRXO-zTCzDZG_VEe]<BFMREX?@XE?F?5EcRC9=I0IGOUGbd[baemsqppWmw} y{Wow
+ui{lqka|~~yxqxprgd{|{vrf{yc]kw{]eql[_^~eOjLZgwgE73V|{pxqcKk|rj_rskfckuynnuxq{{bokjup
+o{ul\`rfQa\\QYXQZXYSVQaiTBNSQ>7;1,#&'$&4=HOSMRX:HRea\<4=nL39)QH'7;FOPROORE>SBrFS\HHYHZV[]X7KD;OOLE_YS<5#(FTFTIF&F58RVSQff^gjjjkbj|p
+ji{|qim
+wwhehg~|yx}|z
+t{]oydcz{vuzwwoabpooim^gk^\jSln}Z?<avymjoo{z|e|~ekhuupuj_aglq
+zjnkrgb^rq}p^b\dc\\nk_dm[Y`Y\]NKdbVN^aMXKRJ>8>-)+&$2?RVQV`_Z\ZMQ5IRPVIS<A/-:U'5QL?JWWKV\]w{|nq|M]GU^ec<JFFCQWM>JNL<.
+A=>CYNbR`WVQXW\ifengWZYiut~ww}j~kZrwwZTyvx|pT^prhbw}~xkme^uuzofn\\_Q€|PSJUn|uy¡pwxmetxwe`ir{ufd`auyrjmskYVUg\Zqcaba`acreXZLOU]PSWe_YCQHA8;-''('HMZ_^ffRN[CIfZH``JOKYR,57I>*5=;=RNJOVaGl`EABCPVWI>K=DNVwc7?TI2).H*+P?S[EPDIJXrafkj[WYbsy{Yq~o{xvxcw
+yhZmd_k]}}hjyn`rwwub`
+srhq}lg~rlsmlVkhN]
+js\KY@NUt~f_uedlpf`kllkjjrpnmknkwut||tqhT\``d^ZLX^gbUOSRLJKO9X[WRC>SDD;2'&('.JGUUpolXL\C@nK]YKSTUlN%G9&N#'8@O]ZRORAX{yhlGM89>JYT8AE37`dE53K`B.8A*'?VKGO/MOX\QcOOXYSWdgoloqmQ_gdefjsyopunhV]ryuUuz|pzqer{~\_qnlasm\kyuwsakvNaxnHQG4]Tkmvkzma\{mlq|q
+yiZ^hhdzp}ntqpuxiulXYZNKY[SUZ]YReTRKAC]TLBJN:BB'# ((7P?_jrmdUXZFFGWg^T@FSgQ37<"-),05,/:03L/*275)
+*"
+
+$*
+
+"
+
+
+
+
+
+
+
+	ebQXY]qzy|us^fwxwzvmpnldjjh[fldbwxkUr~{u~tf|}|~rbn|m{
+}|xiX`zt{vcX[ohXc{{\jWdOLmXLUorp
+~iqyX>ysqcplhzrpebkjnlmswszjmp¢dt]YhUV`KNblYX[RNB6152</,&
+"%
+
+                                                                    snX^agpvv}y{
+ktru~gcr_x
+}{ywpd|wwpm_lgwvzqS[hbr^NR_^Lit\kqKfT[mZEI{zysocty_Hny|zca`qrs[aRKDWUKAGE1IOOON<.2'0$
+                                                                                                    ekc_`ssklwt}urm|}~
+unz]s{xeaq|qeoozrb|x}veWGHROF45-7IJ;.<6;B6*5-(0(
+3'$!
+
+
+	                                                                                                                                         
Index: /soft/giet_vm/transpose/couple_512.raw
===================================================================
--- /soft/giet_vm/transpose/couple_512.raw	(revision 295)
+++ /soft/giet_vm/transpose/couple_512.raw	(revision 295)
@@ -0,0 +1,6777 @@
+yy|zx||xuytsuxtqxv|vvutuvquttvuxyz}~~|y}~|xoohd`WS^_difkkikmomkplkmhomlolost}
+§¬¶¹»ŸÁ¿ÂÆÁº·­š¡¥§¬Ž©š§¥¡ |vqovx}utzzxvsz|~v
+kfz
+
+|piiomp~zo~
+
+
+
+
+~|z~z}~y}~|yxtttiotomigdigospoqsssttpolimllkhkllloloplllooop\M[[WFENWf^suc_lZgth`ZkplgklgkxycIVIE5BHLHNbtpokf`\^mstoohdgffgbgimppqqgmt||zz~ztllq}xyyoz}|~zz~
+zpzt~hlWVO_fcO^YRy}}omyzqpmy~|u|}yzgc`[
+|~zyzy|upqxsvspvsvxvvtsvvsttsvvxuxzzz|zx}~yxvofoi`b^\bdighlmhmkllmhlihmlhooopv~š°µœ¶œÂÁ»µ¶²­¥¥¡ ¡€š®­°©€£ €š¬­§¡
+}plssxy}uvyuoy}vxk~qmhhioym
+
+
+
+
+~~
+}}}~~|~yv|x}z~yuqkspqolfd`dmtovotpsqsmmgfdkkhlkkkfqmpokqkmotq^VZ[YDBJZh^imh_p[hykbZilkoklokvzdE?LA?BFAM_kpom__dkiqvqlc__c^d_[dkoov|xtt}
+
+
+
+yzzzxxyvupp}}vvytv}xvz
+lfQRd_\ZhWVz
+ zmso
+|
+~}yyz~}|ld`\y}~}zqtuqsosuqtsqovuuuyvz|z||~yyzupqmmmcc_b_glimgihopkhmhlgkihpollksu} €­··œŸ¹Ÿº¶Ž±š§¡š­°®®š£€§®©­¥¡ ¡§š€­©¬­š£¡umquzzz~}yxvtlp}}l|mkkkls|ti}
+
+
+
+
+
+
+|}}~}z}z}}}zxvy|vpqhqtqqlbbfdixsqospitqopihkhhilkmliklomkqomoolbM[ZZEEM[f[cpc_mYguobYpmmtompmp|_=;@A?AJJ`mtog`cchgqog^``_[bib`\hkpy}|}}~xtqx|slux}~~~||~ykkx
+uqx}yqxyo[`pg^RZVSy}
+}boty}~xx|||sihf^
+y~z|}}poptqsxxvquutvyvz}u|xuxtpmgd__bcdfhmilkkpmlilkimlkoikkplty§¬®µ¶¶µ·µµ±­¬¥šš®§££¡§š¬ª¥¡£€¥¬²Žµ²Ž±¬šš£}zx|tmotvuxzzxyz~voy|~ploikp~xm~
+
+
+
+
+
+~
+~~}}~~~xz~zxxyy|}ytphtooofhhccklqsqpqpotoifhmhghmhpgimooomlhtpom\O[Z^MIJZd``pm^k_csm_Qflomsqqoyv^@9D@AEN`iloibdfikiskZWUY\WY_fbdosy}tsuzxsqpskitvv|umlqv~~
+oq|y~yvqx}q||~|fd_SS_\LS|x}
+vkst}u~|yxzz|yhfbY}}x}||xtspouuxxyvxtvvzoqolgc`^V^^cgfgiohklmmllkmiiksmlomt|€©°­®°²²­¬ª£   £€¥ ¡£šš££  £šª°±µ··µµ­²®°­±­§§©­€  
+u}skpox|v~zvyyzvso
+
+uklkio|q|
+
+
+
+
+
+
+
+~~}|}}zvyz}z|zvzzuttlhoqqshcgfbhqqpppppmmppkdccgkhglkikplmllpommk`SZZVLFIVd^[oo`kViuobShqmoukklltb@SDMIS`qpc^^ffkidihmkc\ZZ^ikipttlpqvslklmpxtuyuxyvzyvtvxxxt}}
+z}}}
+
+xtx
+
+sx~xzypfUS\YFY||qpvp~v~zutx||vig^Y
+~~}}~}|}y}ypotsoumiiib`^[\[cdggkhihkhiggffgffhmlkom|~ ¥¥©©¬¬©ªš§ ¡¡ £¡£  ¬¬®±±²¶¶²®°±±®²²¶Ž¹²Ž±¬©­€xzxmppsyv~|y|zuylo}vkllmqxpv
+
+
+
+
+
+
+
+~}}~}~z~|yz~|uxvyyzzupmipqqoiccdcdpopopqpsopskcgckhimlmklilkplloloo^QY`[JIJQc^\pd^p`guqdJ`qooqlhmgo[@AHHM`tsm[^Ydkh`chh`WYYZ_bfcsmb_moikhhpvymuvstuvxvxtiu~vyvuvqy~|~ytvx|q||zv}oti`bpmLSx~vvsqx}
+xxuzz|xhh\\
+
+
+~~y|~|y}}tvoidc\Z[Z\^cbdfcghiikhhklhgghfhkmqqt|£ £€¥§§€   ¡ £šª¬ª±ŽŽ±°­ª­±Žµºµ¿¹»ºº·µ²®ª€¥¥¥
+|~xpqmtou}zyxztykpv||uomkgt~xo~~
+
+
+
+
+
+
+}~~}}
+}yzz}|xsxuulgmtsohdcgbfouqpmtqsoqtfghbglgkllkkggqklomqqpcUVZYMEISgbbh^\q_bpp`Lcuoskplqlq^<=JL`mlhdc^^lpidZbcUVQW`khgukh[_cihomptoohosuuyuvmkgpz|zyuuxupvqp~
+xlmu}~voquus|icdcUWx~xosvzx
+xvux}vvfg_W
+~|~}|vyy\^_Z_[_b^ggdhgfdgfhghchilklmlsxz ¥ ¡ ¡£ £¥¥š¬­°±°°°°­¬­°²Žµº¹œ¹¶¹¹Ž²Ž²­­§¥¥
+
+
+tkpsstq}xzvxtukplx|tpmmkpqkz
+
+
+
+
+
+
+
+~
+~z}|~|}~}z~}|zzvy}qpsipsspiikfcLhmppppopqpkggmhfgkikmlomipmlqmoll`VW[[OHJVgckpg\obfqo_SloppklkpmoZ7ALZlolgcffhkmf^[^VLSV`hkiomfZckhkdhgopkipvyvyvuzqlipxyuytsx|vvxokp
+z}
+~p\cuxihlpvuk_RSdyy
+tpozx|zpyyu|vlgYY
+}x|uyy||dfhbfdcffldighfhhlhllmvu|¡  ¡€€¥¬©¬®­±Ž­­®²µ·¹·¹¹ººŸ±­ŽŽ©€š£¶¬£®®ªšš¡
+~vkpsupv|xyuxysii~v}soqlosyl}
+
+
+
+z
+}~~~y}zz|~||x}zyuoipsophhhb`iktqoqoqsoqohdligmhiphmkhksippmppp^VW_[IDJQoicuo\kg\qo^Vpsqpslmlx|Y<BU`qh\d\iofcb\VYSNIWcpqpd^\^[dfdghttxvpzzyx}zz|~|ux|yz|zttxxvklpkv}|~qiqqkbp}}}}zt}|lWLUzqtiq}
+vx
+|quxx|kh[Q
+
+
+
+z|}|~}ihdcghcfhhhhdikkpt
+€¡€§¥§ª­¬±¬°±°²²Ž­­®µ¶²ŽŽ·€§±®§§Ž±®©¬®µ§²¬€£§£
+}sllossqvzvx}xmmmxx~
+slmlqs
+yi}
+
+
+
+
+
+
+
+
+~~~~~~xz|}yyyz}ztuisppoi_bbdfmpsopkoqpkhgigkhfghkimlkkhklplplpdRZZ^JEILb[d|s`p`_to^[muumomomtzW<Wdkic[\ipkogd[OUOVW^opiZY``RY\dkmssmkbkhf_fmuusxpmostvzy}y}|vxikopqps|~z|~
+ymkv|uy
+zWMMs~ol|kquzylvxz}xfhdW
+
+
+}yx}z}z|dbfgkkikouu
+¡šššªš­©ª­¥­¬®²®²°°Ž±®°ª§±²§£Žª¬²±Ž²²­§©©¥®¬²ªª¡¡ tikmtpvy|vquysflux|tlikkt
+zq
+
+
+
+
+
+
+}
+
+~|}~~~~~~~y~}|yxyvtqlstqocbf`ffkooqlqqqqqolgdikimklhkqgmlommmuqqcWV[bSHLM__\tkcp`Wytb[pspmpovuv[Mcmidb`khpqsgcSJM^cqkc[ZZ\ZUI[gpokkgd\ckddkx|xzz~~ztvuuidlt}vklhmxtsmmm|
+ypht
+~}ukziHLqypqiys
+xxsquz}zgf\[
+
+
+
+
+
+yy||zy~gopsy|
+¡¡ ª¡£ £¥¥¥šª®­¬°­±®¥€©©§ Ž°¥ªš££®±®¡®Ž°©¬š€¬µ°¬±ª¡qhosqssvzuqoxsqlp||sqmkluym}
+
+
+
+
+
+
+
+~}~}~~~~|z}|x~||~}|}zvpsopsxpfffdghssqtmtpskoohdkhlhiillkkmkkqpqkpsmfUV[[MILQc^_tobyiWmsfVfksqosmkku\\bifb^lotlok`WJLQipqi^`^WYWchhfhc_\\^fiolhovqxxuqyymmz|qgkkdmpx|z}xzzxukxysy~ytfy}pzppxv^Op}
+lq
+lqy}u}
+qquvxx}hf_V~
+
+|yy~~}}€€¥š­§§¬©ššš£¡©€¬°¬§¬ª§¥©¥§¡Žª¡­®°°­¬©šš²©§®­ª©€¡¡
+shkosmqtvqtxysptqz}|qmspis|o}
+
+
+
+
+
+
+
+
+
+|}~|~~}z|~x~}vzqtkpquvicdgghotmppuppmppkgkgfhllklmllkkktpmpmolVS[^RFNRbW_tkbpdWuxdZ`mspqpkciub`bf\WhfmlfcbSLQ\goqod\^NWbkmqb\`cgdglfigfoysuytspx|vm|xqxqfihmpmsz||}zqokhv~|zzyqgk
+
+yt}o^u|sipyz}z
+|vuxzxuid^W
+
+|~yyyv
+
+¡¡¡¡š§£€€¥©©¡€§ ¥¡¡©€££ª¬§€§¬¡§¥©¡š°§£§®®¬²®®£¥§©¥€¡š££
+mhhoqmoqoqvyyztzyu~y
+tokoisyix
+
+
+
+
+
+
+
+
+
+~}}~}z}yyyyz|ussiotvpmcfhhkovmosplumslkcggfgkgklhldgiotklmqldZbd_VFFVfZWlg_ombsofZgottmqogoud[YYYhmiimldJIRcomb^`WMOZkmi__bff`ikbicf[huuzustqyzvtiv~z|}qzzvpsh`s||z||uh__u|xq_yyto
+y[u|xll
+osuzuquvvxyidb\|
+
+
+
+
+
+
+z}zzz}|
+}
+
+
+  £¡¡£€€€€ ¥§£¥€š € ¥€ª¥¬š¥š©¬šš¡¡¡®¬ª§§­©­¶Ž²¬£¥£§ ¥¥£y
+pclmqopkhuuvuuuxxqzv
+
+
+tqpmps
+ykz
+
+
+
+
+z
+~~}|~}}~yzyz}}zqultpusmglbcgmqmpplokklodgidggkhililgciklooklkf\^`[OLOYmc[ohctm_syiUivtpmotlqtZSSWcollikcR9HhoomcYLER`otk\bh[`df^lkkg\fvxxutux|yvttgku|v~}}xpihgqzx|kbidu~ymi~
+so
+bu~xl
+f~txzq}}~
+~uvuyx|vp``Z|
+
+
+
+vxzyy~|y~ ¡¡  ¥¥¡¡€¡€€§¡  ­š££§§®š € š©š¥€©°±Ž±¶¶©§š©§€¡¡
+}~khkhokkkkspy|yxxzsuz
+
+
+toophq
+zo}
+
+
+
+
+
+
+
+
+}~}~~~~~}~}}||z~z~}xxoslsssmmdgg`kqutpqppskomhhggglkkiiigkkklmoqoqukV`b^WOQ^igcsf^qmcssgRlv}momipqm[FQfmlflkcSDRfquocYDAQiukcc_hfYU`doopomb_tz|yxz|vzvgihpyxx|yz|~zsu|smopsii_m
+mvom
+iqhix
+yp|bttxvxzv
+z}svyzxzifbUv
+
+
+~}xy~x|~}}vzz|~}~~¥€€£¥¬š¡¡šš££ ¬©¥ €£ §£š²­¥®²°®¬§šš }~}~}ofgmqpmftkoyzxx}psy
+
+sqlmit~ym}
+
+
+
+
+~~~}|z~~|~z|}zy|xspdlqpphdbdbkmsoplqoskohhdfgchioigilplikoimpsol^\`_WMIVkf_uf[ss\qtdYlutoikkqokQHZolkmlcOEWltokcRJMZfqib`bbccW`mpfosqsulxtvpssuxulsu|yxv~z}}vpgp~}~vofgky
+xoxodmzyho
+mhsgky|xt}}_tvz
+tssx}sxxxxvbc`Qy
+
+}|x}|}z~}~}~z}}~
+ ¡£
+¥£¥ ££¥©££­€§§€§¬¬¬§š¥¥£ ¡š©£°š§±¬¥ª©€§€¡xoys}}lkiiolhdtiy}z}yv|qs|
+
+~sqoomvxo|
+
+
+
+
+
+
+
+
+
+}}|~}}}~z}}~yxxuxslihposffd`ifpsluvtsomskfckicffiihhfkkhookmxqpm^[bcUJNWih^vm[qscptgUixusmltpxxJOhmqlicQLW`klkYLJ^mgfbb^\_bd`^hhpilif^_Z[_b`VSVJU[cmsvvsusz~~tmyz~}xoc^c|qzud`ktcl
+vm[btz~}qqgytypfsz
+|||vuu|zxxh^^Uz
+
+
+
+}|~}}z|yzy|}~
+ £€ ¥ ¡£ ¥¡€¡¥š¥©¥©§ªš­ªª£šŽ€©®§§©¡
+y}|ttzidkgidbfokt|v}sxztp
+}|z~
+}mkqklu
+umy
+
+
+
+
+
+
+
+}
+
+~}|~~}x}z}~}~}xyuqmchllshdb`cdplmooppilqigdfdckbiiigghhlkhuqqoopbZ[ZUJLWhl\uhWim`msf\ltpqmioluvVgikilhSHV\hfdZDA^kgb^_Y[_gfbbkki_cb_\hZO\ggib[^_fch^MRbgpsy||xhp}}}yqif`o|ypz|odm
+
+u[usOQl
+vikxsy}lcm~v|uuxx|g__\z
+~
+
+}~zzzyyu|
+
+
+
+£££¡¡§š ¥ €€ª§§§©§šš§¥±€£­ ² £§  
+
+yvuxzigifkhdfmiluysqutqsyz
+
+mmlomt|tkx
+
+
+
+
+
+
+
+
+
+}z}}~}}|y|yx|xxphigcmhc`bchkppomophmohgfdgihhimikmhgisooqqsohf\^c^RHZigYqp[lm^ioi[kpyskkppqxhhmlpk^D[ckidU@M[im[WR\^gifgsiWVb^`cd`_ff`_ihhggiklfcY[Z^bfmoyxp}~yvuobitvux|tggxg\|~ZNtps
+mv~qix|yovyv|vghcVv
+
+
+
+yz}~zy}
+
+
+z}¡€ ¥£¥€§¥§§  £€š©§¥£ª£¥š§§€§¡©Ž±©±¥­ €§¥€¡~}zyzzmklglol`mpqipqxtvu}}}moqplvso}
+
+
+
+
+
+}~~~}}y~~zxusmlkoogbgcchqppmsioomqskighlihpmkiqfkomtoqosklg_fcYZVYkkVpiYls`luhWhytpkqomxvkhlpi`A^ghgfMAV^hmYRVW`ccbfckf\b_Zc_gdghhh_`lihhplkk`_fb[[`gbdv}q~|~}
+vldlp}|xdiy^g~
+bSy~looz}x~upx|sstxx||lbc[v
+
+
+
+
+
+
+
+z~z}~
+~
+~£¥¡š§££š¥y£§š©®©š­¥šªš¥¥§¥©©€€Ž²­®®¡ €§š©§£
+|yz||qhkiipkihvxytzttpv|}lqmhmuvt
+
+
+
+
+
+~z}|}zztumsstpfbkhhiutmpmomlmmofffikkkkgmikhkloopsovuod_ih_OS_lk`ok`ktghulWm|tkppoqu|ddglgORmsk_U?L`kh^WJU\dlo_hc_Z`dbdhgflpotofflooutpplgkigfb^Z[_iuusx
+uqcZptslssitgWzut
+
+p}yq||xuz
+ssxy}}vpbfW|
+
+
+}}||}}
+
+~
+~
+
+ £    £€¡§¥ª§~€§§¡§®© ©­š£© €¡£šššª¬±š­Ž°§¬­¬§§ª§ 
+|z|z
+viiqphpmdtvz}}yzy~~
+sqltp|vo
+
+
+
+~~|yvxpvxttifklolpquususttqtflglompmlolipqspqssqupsfdkicYS\qmboxfuxlpxocqxuuqpstsqihg\QYfmoiNS[imb[ZRS[`os\Rc_\^dlmkppohuqokdcptoptvtslmvspgdfb[\gtss~
+ziWZ||pkh_ssi|
+p`x}yyo~|q|~xy~sty|~zoih^v
+
+
+~~~}|u~¡¡€¥šš©€£ £¥¥ª¬£©¥¬©©©©©­­©­°®­­£¥š­©¡²¥ª¬ª°¶²©§€¡®ª£€xlpopiphikkp|zxzztpsvtus
+
+|}zqyuxxohkikuysszvyxusqtkommgpoompsoquuupttxxtxskkpf[Z_yv^pmtuko}qgs|~xttsv|uioo`\iqso[RhupdURYddfghh[ccliokoststvqtvpipusupxtu~uogozzttpod`^_foz
+
+}tulgbt
+~zi|
+~s}tg|~st
+~v~tyvx|}~vkhZ|
+
+
+
+
+
+
+~
+~
+
+ £    £€¡§¥ª§~€§§¡§®© ©­š£© €¡£šššª¬±š­Ž°§¬­¬§§ª§ 
+|z|z
+viiqphpmdtvz}}yzy~~
+sqltp|vo
+
+
+
+~~|yvxpvxttifklolpquususttqtflglompmlolipqspqssqupsfdkicYS\qmboxfuxlpxocqxuuqpstsqihg\QYfmoiNS[imb[ZRS[`os\Rc_\^dlmkppohuqokdcptoptvtslmvspgdfb[\gtss~
+ziWZ||pkh_ssi|
+p`x}yyo~|q|~xy~sty|~zoih^v
+
+
+~~~}|
+~
+~£¥¡š§££š¥y£§š©®©š­¥šªš¥¥§¥©©€€Ž²­®®¡ €§š©§£
+|yz||qhkiipkihvxytzttpv|}lqmhmuvt
+
+
+
+
+
+~z}|}zztumsstpfbkhhiutmpmomlmmofffikkkkgmikhkloopsovuod_ih_OS_lk`ok`ktghulWm|tkppoqu|ddglgORmsk_U?L`kh^WJU\dlo_hc_Z`dbdhgflpotofflooutpplgkigfb^Z[_iuusx
+uqcZptslssitgWzut
+
+p}yq||xuz
+ssxy}}vpbfW|
+
+
+}}||}}
+
+
+z}¡€ ¥£¥€§¥§§  £€š©§¥£ª£¥š§§€§¡©Ž±©±¥­ €§¥€¡~}zyzzmklglol`mpqipqxtvu}}}moqplvso}
+
+
+
+
+
+}~~~}}y~~zxusmlkoogbgcchqppmsioomqskighlihpmkiqfkomtoqosklg_fcYZVYkkVpiYls`luhWhytpkqomxvkhlpi`A^ghgfMAV^hmYRVW`ccbfckf\b_Zc_gdghhh_`lihhplkk`_fb[[`gbdv}q~|~}
+vldlp}|xdiy^g~
+bSy~looz}x~upx|sstxx||lbc[v
+
+
+
+
+
+
+
+z~z}~|
+
+
+
+£££¡¡§š ¥ €€ª§§§©§šš§¥±€£­ ² £§  
+
+yvuxzigifkhdfmiluysqutqsyz
+
+mmlomt|tkx
+
+
+
+
+
+
+
+
+
+}z}}~}}|y|yx|xxphigcmhc`bchkppomophmohgfdgihhimikmhgisooqqsohf\^c^RHZigYqp[lm^ioi[kpyskkppqxhhmlpk^D[ckidU@M[im[WR\^gifgsiWVb^`cd`_ff`_ihhggiklfcY[Z^bfmoyxp}~yvuobitvux|tggxg\|~ZNtps
+mv~qix|yovyv|vghcVv
+
+
+
+yz}~zy}yzy|}~
+ £€ ¥ ¡£ ¥¡€¡¥š¥©¥©§ªš­ªª£šŽ€©®§§©¡
+y}|ttzidkgidbfokt|v}sxztp
+}|z~
+}mkqklu
+umy
+
+
+
+
+
+
+
+}
+
+~}|~~}x}z}~}~}xyuqmchllshdb`cdplmooppilqigdfdckbiiigghhlkhuqqoopbZ[ZUJLWhl\uhWim`msf\ltpqmioluvVgikilhSHV\hfdZDA^kgb^_Y[_gfbbkki_cb_\hZO\ggib[^_fch^MRbgpsy||xhp}}}yqif`o|ypz|odm
+
+u[usOQl
+vikxsy}lcm~v|uuxx|g__\z
+~
+
+}~zzzyyu~}~}~z}}~
+ ¡£
+¥£¥ ££¥©££­€§§€§¬¬¬§š¥¥£ ¡š©£°š§±¬¥ª©€§€¡xoys}}lkiiolhdtiy}z}yv|qs|
+
+~sqoomvxo|
+
+
+
+
+
+
+
+
+
+}}|~}}}~z}}~yxxuxslihposffd`ifpsluvtsomskfckicffiihhfkkhookmxqpm^[bcUJNWih^vm[qscptgUixusmltpxxJOhmqlicQLW`klkYLJ^mgfbb^\_bd`^hhpilif^_Z[_b`VSVJU[cmsvvsusz~~tmyz~}xoc^c|qzud`ktcl
+vm[btz~}qqgytypfsz
+|||vuu|zxxh^^Uz
+
+
+
+}|~}}z|}}vzz|~}~~¥€€£¥¬š¡¡šš££ ¬©¥ €£ §£š²­¥®²°®¬§šš }~}~}ofgmqpmftkoyzxx}psy
+
+sqlmit~ym}
+
+
+
+
+~~~}|z~~|~z|}zy|xspdlqpphdbdbkmsoplqoskohhdfgchioigilplikoimpsol^\`_WMIVkf_uf[ss\qtdYlutoikkqokQHZolkmlcOEWltokcRJMZfqib`bbccW`mpfosqsulxtvpssuxulsu|yxv~z}}vpgp~}~vofgky
+xoxodmzyho
+mhsgky|xt}}_tvz
+tssx}sxxxxvbc`Qy
+
+}|x}|}z|y~ ¡¡  ¥¥¡¡€¡€€§¡  ­š££§§®š € š©š¥€©°±Ž±¶¶©§š©§€¡¡
+}~khkhokkkkspy|yxxzsuz
+
+
+toophq
+zo}
+
+
+
+
+
+
+
+
+}~}~~~~~}~}}||z~z~}xxoslsssmmdgg`kqutpqppskomhhggglkkiiigkkklmoqoqukV`b^WOQ^igcsf^qmcssgRlv}momipqm[FQfmlflkcSDRfquocYDAQiukcc_hfYU`doopomb_tz|yxz|vzvgihpyxx|yz|~zsu|smopsii_m
+mvom
+iqhix
+yp|bttxvxzv
+z}svyzxzifbUv
+
+
+~}xy~x|~
+}
+
+
+  £¡¡£€€€€ ¥§£¥€š € ¥€ª¥¬š¥š©¬šš¡¡¡®¬ª§§­©­¶Ž²¬£¥£§ ¥¥£y
+pclmqopkhuuvuuuxxqzv
+
+
+tqpmps
+ykz
+
+
+
+
+z
+~~}|~}}~yzyz}}zqultpusmglbcgmqmpplokklodgidggkhililgciklooklkf\^`[OLOYmc[ohctm_syiUivtpmotlqtZSSWcollikcR9HhoomcYLER`otk\bh[`df^lkkg\fvxxutux|yvttgku|v~}}xpihgqzx|kbidu~ymi~
+so
+bu~xl
+f~txzq}}~
+~uvuyx|vp``Z|
+
+
+
+vxzyy~
+
+¡¡¡¡š§£€€¥©©¡€§ ¥¡¡©€££ª¬§€§¬¡§¥©¡š°§£§®®¬²®®£¥§©¥€¡š££
+mhhoqmoqoqvyyztzyu~y
+tokoisyix
+
+
+
+
+
+
+
+
+
+~}}~}z}yyyyz|ussiotvpmcfhhkovmosplumslkcggfgkgklhldgiotklmqldZbd_VFFVfZWlg_ombsofZgottmqogoud[YYYhmiimldJIRcomb^`WMOZkmi__bff`ikbicf[huuzustqyzvtiv~z|}qzzvpsh`s||z||uh__u|xq_yyto
+y[u|xll
+osuzuquvvxyidb\|
+
+
+
+
+
+
+z}zzz}|€€¥š­§§¬©ššš£¡©€¬°¬§¬ª§¥©¥§¡Žª¡­®°°­¬©šš²©§®­ª©€¡¡
+shkosmqtvqtxysptqz}|qmspis|o}
+
+
+
+
+
+
+
+
+
+|}~|~~}z|~x~}vzqtkpquvicdgghotmppuppmppkgkgfhllklmllkkktpmpmolVS[^RFNRbW_tkbpdWuxdZ`mspqpkciub`bf\WhfmlfcbSLQ\goqod\^NWbkmqb\`cgdglfigfoysuytspx|vm|xqxqfihmpmsz||}zqokhv~|zzyqgk
+
+yt}o^u|sipyz}z
+|vuxzxuid^W
+
+|~yyyvgopsy|
+¡¡ ª¡£ £¥¥¥šª®­¬°­±®¥€©©§ Ž°¥ªš££®±®¡®Ž°©¬š€¬µ°¬±ª¡qhosqssvzuqoxsqlp||sqmkluym}
+
+
+
+
+
+
+
+~}~}~~~~|z}|x~||~}|}zvpsopsxpfffdghssqtmtpskoohdkhlhiillkkmkkqpqkpsmfUV[[MILQc^_tobyiWmsfVfksqosmkku\\bifb^lotlok`WJLQipqi^`^WYWchhfhc_\\^fiolhovqxxuqyymmz|qgkkdmpx|z}xzzxukxysy~ytfy}pzppxv^Op}
+lq
+lqy}u}
+qquvxx}hf_V~
+
+|yy~~}}dbfgkkikouu
+¡šššªš­©ª­¥­¬®²®²°°Ž±®°ª§±²§£Žª¬²±Ž²²­§©©¥®¬²ªª¡¡ tikmtpvy|vquysflux|tlikkt
+zq
+
+
+
+
+
+
+}
+
+~|}~~~~~~~y~}|yxyvtqlstqocbf`ffkooqlqqqqqolgdikimklhkqgmlommmuqqcWV[bSHLM__\tkcp`Wytb[pspmpovuv[Mcmidb`khpqsgcSJM^cqkc[ZZ\ZUI[gpokkgd\ckddkx|xzz~~ztvuuidlt}vklhmxtsmmm|
+ypht
+~}ukziHLqypqiys
+xxsquz}zgf\[
+
+
+
+
+
+yy||zy~ihdcghcfhhhhdikkpt
+€¡€§¥§ª­¬±¬°±°²²Ž­­®µ¶²ŽŽ·€§±®§§Ž±®©¬®µ§²¬€£§£
+}sllossqvzvx}xmmmxx~
+slmlqs
+yi}
+
+
+
+
+
+
+
+
+~~~~~~xz|}yyyz}ztuisppoi_bbdfmpsopkoqpkhgigkhfghkimlkkhklplplpdRZZ^JEILb[d|s`p`_to^[muumomomtzW<Wdkic[\ipkogd[OUOVW^opiZY``RY\dkmssmkbkhf_fmuusxpmostvzy}y}|vxikopqps|~z|~
+ymkv|uy
+zWMMs~ol|kquzylvxz}xfhdW
+
+
+}yx}z}z|dfhbfdcffldighfhhlhllmvu|¡  ¡€€¥¬©¬®­±Ž­­®²µ·¹·¹¹ººŸ±­ŽŽ©€š£¶¬£®®ªšš¡
+~vkpsupv|xyuxysii~v}soqlosyl}
+
+
+
+z
+}~~~y}zz|~||x}zyuoipsophhhb`iktqoqoqsoqohdligmhiphmkhksippmppp^VW_[IDJQoicuo\kg\qo^Vpsqpslmlx|Y<BU`qh\d\iofcb\VYSNIWcpqpd^\^[dfdghttxvpzzyx}zz|~|ux|yz|zttxxvklpkv}|~qiqqkbp}}}}zt}|lWLUzqtiq}
+vx
+|quxx|kh[Q
+
+
+
+z|}|~}\^_Z_[_b^ggdhgfdgfhghchilklmlsxz ¥ ¡ ¡£ £¥¥š¬­°±°°°°­¬­°²Žµº¹œ¹¶¹¹Ž²Ž²­­§¥¥
+
+
+tkpsstq}xzvxtukplx|tpmmkpqkz
+
+
+
+
+
+
+
+~
+~z}|~|}~}z~}|zzvy}qpsipsspiikfcLhmppppopqpkggmhfgkikmlomipmlqmoll`VW[[OHJVgckpg\obfqo_SloppklkpmoZ7ALZlolgcffhkmf^[^VLSV`hkiomfZckhkdhgopkipvyvyvuzqlipxyuytsx|vvxokp
+z}
+~p\cuxihlpvuk_RSdyy
+tpozx|zpyyu|vlgYY
+}x|uyy||tvoidc\Z[Z\^cbdfcghiikhhklhgghfhkmqqt|£ £€¥§§€   ¡ £šª¬ª±ŽŽ±°­ª­±Žµºµ¿¹»ºº·µ²®ª€¥¥¥
+|~xpqmtou}zyxztykpv||uomkgt~xo~~
+
+
+
+
+
+
+}~~}}
+}yzz}|xsxuulgmtsohdcgbfouqpmtqsoqtfghbglgkllkkggqklomqqpcUVZYMEISgbbh^\q_bpp`Lcuoskplqlq^<=JL`mlhdc^^lpidZbcUVQW`khgukh[_cihomptoohosuuyuvmkgpz|zyuuxupvqp~
+xlmu}~voquus|icdcUWx~xosvzx
+xvux}vvfg_W
+~|~}|vyyy}ypotsoumiiib`^[\[cdggkhihkhiggffgffhmlkom|~ ¥¥©©¬¬©ªš§ ¡¡ £¡£  ¬¬®±±²¶¶²®°±±®²²¶Ž¹²Ž±¬©­€xzxmppsyv~|y|zuylo}vkllmqxpv
+
+
+
+
+
+
+
+~}}~}~z~|yz~|uxvyyzzupmipqqoiccdcdpopopqpsopskcgckhimlmklilkplloloo^QY`[JIJQc^\pd^p`guqdJ`qooqlhmgo[@AHHM`tsm[^Ydkh`chh`WYYZ_bfcsmb_moikhhpvymuvstuvxvxtiu~vyvuvqy~|~ytvx|q||zv}oti`bpmLSx~vvsqx}
+xxuzz|xhh\\
+
+
+~~y|~|y}}tspouuxxyvxtvvzoqolgc`^V^^cgfgiohklmmllkmiiksmlomt|€©°­®°²²­¬ª£   £€¥ ¡£šš££  £šª°±µ··µµ­²®°­±­§§©­€  
+u}skpox|v~zvyyzvso
+
+uklkio|q|
+
+
+
+
+
+
+
+~~}|}}zvyz}z|zvzzuttlhoqqshcgfbhqqpppppmmppkdccgkhglkikplmllpommk`SZZVLFIVd^[oo`kViuobShqmoukklltb@SDMIS`qpc^^ffkidihmkc\ZZ^ikipttlpqvslklmpxtuyuxyvzyvtvxxxt}}
+z}}}
+
+xtx
+
+sx~xzypfUS\YFY||qpvp~v~zutx||vig^Y
+~~}}~}|}poptqsxxvquutvyvz}u|xuxtpmgd__bcdfhmilkkpmlilkimlkoikkplty§¬®µ¶¶µ·µµ±­¬¥šš®§££¡§š¬ª¥¡£€¥¬²Žµ²Ž±¬šš£}zx|tmotvuxzzxyz~voy|~ploikp~xm~
+
+
+
+
+
+~
+~~}}~~~xz~zxxyy|}ytphtooofhhccklqsqpqpotoifhmhghmhpgimooomlhtpom\O[Z^MIJZd``pm^k_csm_Qflomsqqoyv^@9D@AEN`iloibdfikiskZWUY\WY_fbdosy}tsuzxsqpskitvv|umlqv~~
+oq|y~yvqx}q||~|fd_SS_\LS|x}
+vkst}u~|yxzz|yhfbY}}x}||xqtuqsosuqtsqovuuuyvz|z||~yyzupqmmmcc_b_glimgihopkhmhlgkihpollksu} €­··œŸ¹Ÿº¶Ž±š§¡š­°®®š£€§®©­¥¡ ¡§š€­©¬­š£¡umquzzz~}yxvtlp}}l|mkkkls|ti}
+
+
+
+
+
+
+|}}~}z}z}}}zxvy|vpqhqtqqlbbfdixsqospitqopihkhhilkmliklomkqomoolbM[ZZEEM[f[cpc_mYguobYpmmtompmp|_=;@A?AJJ`mtog`cchgqog^``_[bib`\hkpy}|}}~xtqx|slux}~~~||~ykkx
+uqx}yqxyo[`pg^RZVSy}
+}boty}~xx|||sihf^
+y~z|}}upqxsvspvsvxvvtsvvsttsvvxuxzzz|zx}~yxvofoi`b^\bdighlmhmkllmhlihmlhooopv~š°µœ¶œÂÁ»µ¶²­¥¥¡ ¡€š®­°©€£ €š¬­§¡
+}plssxy}uvyuoy}vxk~qmhhioym
+
+
+
+
+~~
+}}}~~|~yv|x}z~yuqkspqolfd`dmtovotpsqsmmgfdkkhlkkkfqmpokqkmotq^VZ[YDBJZh^imh_p[hykbZilkoklokvzdE?LA?BFAM_kpom__dkiqvqlc__c^d_[dkoov|xtt}
+
+
+
+yzzzxxyvupp}}vvytv}xvz
+lfQRd_\ZhWVz
+ zmso
+|
+~}yyz~}|ld`\y}~}zyy|zx||xuytsuxtqxv|vvutuvquttvuxyz}~~|y}~|xoohd`WS^_difkkikmomkplkmhomlolost}
+§¬¶¹»ŸÁ¿ÂÆÁº·­š¡¥§¬Ž©š§¥¡ |vqovx}utzzxvsz|~v
+kfz
+
+|piiomp~zo~
+
+
+
+
+~|z~z}~y}~|yxtttiotomigdigospoqsssttpolimllkhkllloloplllooop\M[[WFENWf^suc_lZgth`ZkplgklgkxycIVIE5BHLHNbtpokf`\^mstoohdgffgbgimppqqgmt||zz~ztllq}xyyoz}|~zz~
+zpzt~hlWVO_fcO^YRy}}omyzqpmy~|u|}yzgc`[
+|~zyzy|}}}y|xyxzyxxx|zvvzuvtxzxxz|zxuutytvxtvxz}~|~|z||suogkd^_[`ffihlmmmioqmomokklkmpqttz¬°¹ŸÁÆÆÄÃÂ¿·¬¥€¡£š©€£
+|u}yvxuyypvzm|}s~
+
+}mikohpvk~
+
+
+
+
+
+
+~|~|z|zzvtzz|v}zxyyxfpsoohfhggoqqtlmmmpompmigmdmlhlkkmlpopoqmkilbN^^ZJFNYlcmocUgYdhf[YoggfmqfcuzkIYZIJ8AB@HN^pqusidbbmsqsusxobcikohlloopgv~|v|vz|z}z}oiy|}}v|~
+ztxx|vlfV^k^fgYR^VQmxmkd_mpx
+putqxvx~}~vig\^
+|~~z~x
+
+}|y}}z|}|z}yz~||z~|yzzzxvxyvxy|xtuvusxvvxyxyzz|z|}}|utmhdc^_fdklhioklkluommpmpmpokkoox£®¶Ÿ¿ÂÄÃÄÁœ·²ª
+}uvvsu}||yyqcpxq
+
+okools
+tl
+
+
+
+
+~
+}z
+~z}zz|zzy~}|y}tssisopplfbhgookoqooomlmmggggkiookklhmplmsmoptm\R[[UJII[d^ksgVcRflfZZklflsohbv~gM^^OUBBDLLNM[mpqpmh_`kq|zplimmlcposut|y||~}}~~}zq~s|~vqsx}}uy
+tgd`[W_pmZ[^UN`kdf^[g`kqkttxs
+|||y~ylfb_
+|}z~}
+
+}}~|}|~}|~zx|yzzxtyyuy}vtvyxxuvuuxzzz~~}~||}zvxpkki^\^ffiikloommooppmpsommqmpuu| ®²»»œÂœœ¹·­š 
+
+
+vsxxtx||}}tq
+}khqoopvm
+
+
+
+
+
+
+~~}}}}y||y|y|tslqmsshdhigoqqqpssoltsoihmpkgoqkimkklmloolpmm\QU`VMHEUc\o~l`dQgmm_[mflktxk^vlJZ_Q_IHDIFFIMZgoomphYbiu
+|xohfikkosxsp|~zz~xzzq||vzvcmuqt~~~~v|
+ph[RZ\bWti^\d\EVd[l~ohkxtztxzx~zvz}khb\}|}~}}z}||z~yxy}|}yyxx}x~zzuuzxuuuxx|zyzz|~|zyxqupicb\_dcgkilpomspmottqlissillu|
+¡­µ±±ŽŽ¬ª€£
+
+utuxxuuy}}}zikpsgpyk~
+
+
+~
+
+
+
+~}~~}~}|}}|zyy}~tqoqsuxpddd_iopplosmppsohlhfgkklmkoqkpkpoqmpioWSV\WLBARm^qyfcbQfuq^WbQSUYbigom_S[^UgNIN7B??IQVfqtulfdclx}|
+~
+
+ug^gYhm|zqt}}}x|y}uqx|~ytqslx|
+}||ykhb\^h[\^xkVV[YIZkvvtptvzy|~}|igc[~|}iquz}~~zzx}}z|zz}||}|xuxv}zzy|vyutssquyzz|}~|~xzysukhb_\^bfhhhlqomokooopsqsotsqqqu~ €¥~}xvsuzzv|y|u~zkhmplt
+}s
+
+
+~}~~}|~}~~}z}|~vvz|}sultpstldffgppuqtsqmotpplhhkgllkhkolopomqmlpkkZV[YQEDHWhWp~g`cOozmZLNJJOQOLVYQVQ`WYkcUIELIAAMMN^pklmmghfmot
+vdhsvtxz|~}}
+~zoxz
+|uy}~
+|oipbb^WffUMoZU[ddskcif\[dqdiyzs
+||}}~}yigc\
+~}
+~}787=LY_dmuz 
+~||}~x|}|~y}|~zy|y~~zxyuvtvxyzzz}~~}~sxpfddb`cddhmqpsuqppptpsposusquvqy}~
+yvpuvvuzvv||vzlomoko
+}o
+
+
+
+
+
+
+
+|}~~}~|}~y|zyyvqtkqqtqmgfgghsopssmoppqoifihiigollhslqloomqlshUU[^UFHL[mVhukhf`upWBBDDBMRMLUVNQbV[kf^VLI@E7ILNQSbhqslkdihft}u~vt|
+
+uzu~z~xkpz~
+ohk^[igfsl[Q~vWV\q
+ok\W^_`NUZdt}m£y|~zoib`~~~|}SNEA47.,/;DFQVblovx €
+}}~~zy}~~}}~|||uxz||yytxyyxxv|~|}~||yzskfb\^bidflkkpioqqssppvspmqsqtqvx}
+ussvzuux}~zv}|||v~}moopqp}s}
+
+
+
+
+
+}|||~~}zzyy}}tqmhvtvxkdgghhpuopqttqsqpikhlmimoilmpmlpplitosp\QY^UFEL\fZmpcii^pzdL<ARFANHE?HMLO[W_s`bWW^MB=IMRQNVbqstk_ghb_mz~~}
+
+|z||}|x
+kouzsmig_UV[Zg~`Uxh\`op^Z[L[c\RY[[m|o£y~~~zlfbbz}|iifcf_^ZRNF;?722,7;FN`hmsu
+¡¥§šª§¥ ~z|~}y~y~~}~|||z|~zz~y|ztvzxx|}}z~}|xvxqif\[[`ffklppptqmptqqlsvssxttsxvxxy
+qpqstxxy~~ty}~zv|olmmlp
+zm
+
+
+
+
+
+
+
+~|}~~~~}|~}}}}~zz}|~zsqsfpssobdliikuqposqqsupshhkllmomokiolooqsooqqoVO[bVIJQ[fZhk^hl`okS@NNSL@FFOFFLIEQQcuci^bkOEFNISVSSO\fflh`diihstu~
+y
+
+
+
+v|yqmh^b^Ughh|
+`Yv|c^_xtUJYR`_\LB\mt¡p¥y
+
+~khcc
+~~~|mmkimmplhihgf`\VVQJ?<5457=ELU`iuy}¡£§¥€€¥šª®®¬£~}~~|~~~~z||}~yyxzyyuvuvu|||}~~|zyupkd_`^^\hilmtqtutvvxoqvpmooy
+ssusxtty|zx
+~mllqosxm~
+
+
+~
+
+
+}}~}}}y}z}}yqplfmstqhfdilitxtssupsqqomlhkpolpplooilmkoqolpm_QZcWFFJ\b[mm_dh^lcR=LHLQRJADRRJQVYVftkh\ks\LVQRWZSFSNSU[khihpidqlvx~}
+
+s
+z~ytolfcSZifv}x`Us~f`_voSJ`^`bQQU`dp£|x
+
+~ ~ylhdf
+fidkioksokkkkhkmikkfg``[ZWNFA<845=EMYiqx
+¡§ª¬¬ª­¬±°©¬§¥}~~|}~~}~zzx}z|~zvzzyvyv|zuyy}}~}y}z~uihcdchfmtvopmlokkqlopqptutvvx|ty
+spplimyp~
+
+
+
+
+~
+
+
+
+|}~~|y|z~~zvxuqofsppslflhglolqosvqlsooiilmiqhpupoqpopmqmotuv_Q\[SHHH\g[pt^igZqpZJ84F_qdYNOWb[_hYoqddVhucfcSUU`bYY[SJL^gflskfquvqvz~
+ux~qmmhl\^cVlzcSl}fb`ttFN^ZOUWggZ_utz|
+
+zgkdb|~}splimmlqikoomplpoqqospmsqqpogfb_WSMB?79;7DJ[`iqx š­¬°­¬¬°®ª§£¡}}~~~~}|z}~yyy|yuszvyy}z~~~}|xqkghglmiomooosouqpxvsq|ys|~poqppsym
+
+
+
+
+
+
+~|zz~|~z|z~}vptskmsqtggggfoqpsqqtoqpomhglsmokmmkmqqmtmhksoskYS[_QMJJ^f\xuZgf^psq[A@;L_hkfcsgV_gbovfdUgullk^hbbNYW`NIMMSWbsumotpsuqx~qs|
+~~y}y
+xmhggdtk_b^z¥mWf|k_byqQN`b\[`hb[dzy|v}
+zmibh|}}qpqtusuttstqkosoglkmmpkoptsxvvqvuskligg_YRIF<9032BN^cqv¡ šª¬­±®¬­°±­š€¥ ~z~}}~z~z~||z||zz|yvxuvzvz~~~
+|ihoosspoupxxqqvvsuuxvyplplooyq|
+
+
+~}z|~zz~~|}||}zyzsuqhopsqfdhgflqqtttsssopkhksqpqlikqlmsskqqotmqmUNWbOMIO^c_qm[gf^pzvdE;98B[iiiviQbl_mqg`Noqmi`YtqRIOVSZRJIMNMZfmhhsy|ymlxxvzsuzy}xms~x}ulohoc[dcSbfdVuYgob`uhQO^quQ_bQ^f~¡z}q|vqm`f
+ttmtsvussqsxvvsvpoqqqplmolhmiopotpmotxvxtsqmhi_ZSID?5743DHZ`gu|£¡©®®Ž²Ž¶±±²±¬©§€~|z~~}~|~~y||}}|}z|z|yz}ukhdlkmlpxoutspvtqvzyp
+
+tqspqo
+zp
+
+
+
+~z|~~}}}|y}}zzttqitputkdclcmvqtsplomqohlhhlkiloplookpmkssuuop[SV[VLJNZcYsq^k`bmzxbNF57=EYhfthOfs`umf^Z}skh`\vvfZ^``SZWVOHJMNRS`ht
+xut}z~shlmmhv~zxvt}~
+~siimlh`dVcb`lk_\uYd|ufbomRLS^h`UZ\ik|}
+~v|}phgk~qmmppssstvttstv|tvyqvxtutomskoomokkpouusuyvqqsttomkgfc\YONB80/7@AN^hq|
+¡©­­±ŽŽ°²²®­±®£¥¥
+|~}z}~~}~yzzxyyz}ymikmlolqmosovyttttqsvuu
+somposzp
+
+
+
+~
+
+~|z|}z~}zxptukxtpsgfidcotpotopmtxqmklghkmqqmosmpmpqmpqstoWQZbYJHJYg[op^hbbutxq\M@7H8HmgmfYgmdxo^W[|umg`bzumqmcd[`_c[SSUWYVQW\kqxosz~xkmzuqsz}|zqksqpikilkbcgdfY_oc^€¡vV_vubfxpRHdYS\YOZho|  s
+}ol`k
+qmqqpuutpussoqtxsuutusqqtutsqtvsttpqsvysopmuqtuutpumpqmsomfhb_\ZRIB?;/5BOYkqx©š­°°²°±²¬°­£€£}~}|~}~|ygkkqoompopssyxqpqptsvvuphsmms
+ys
+}~~}}~~|||~~}~}~|xltqittptgfgfcmtvqsxmopsolkhmimkpvsmssmlmlmospsoYRV[QMLQ[`Yhoclf`uzxvmhRHI;B\opfd[i`xqcQc
+zg\Wq|ppyxi^ZY\b^__\[U[YVYSQ[`dllgfkpstkotqlhkouzmf[^b_[fZgmftªm[€£xU^}`ftz_V_chgQLSbg}
+¡zs}ppglz
+
+pllmmpputuvoqttuqxtxtqvqqsqxsquutqxttsxxvsvttstvupslopqqsplooqssqpohc^[VJA=839@NR`ky|š ©©©§©¥€¥ ~umlpmpvpsxtqtutstputtut
+omulqp
+xm
+
+~~~~~}~~y||}xyuuvokssxymcdfhousppspsmpmkilplilppomoqtotopqpqqkUR[_VHLMV_`kscmfhpxvtosV4?HQMQmid``im`Sl|g\Otztuyvp`lhO[_g`hfWf\QYUdsfc[ccbidkmtx~x^^`ghYhm[iit§u[~š¡q\[
+£cf|pYfikdYMQ_g¡~
+¡§~u
+  |lqfs}}
+
+sqpmkqsppqpotsqosqpsxtuuxtvuutppssvptzzzuxz~~sv}ttqsvqqslmloootvtzuqosoooif_VY[SLE<829@NVcpu
+zolvpkqsossmqtusmsqsvuut
+soooms~p
+
+
+
+
+
+
+
+|~}~}}z}zzy}xssqksquqgdhcgmustmsquusopihifisqqsmmosmtqomqpulWV__QOJMR_[ptbk`[py~vh[H=9=OJ_hkid\kl^Ntf^S}uy~ql_ypHY`Y_mdcpidY`|®¬ ¡¡£qogdbd[mgdvª§bo­€¥c\
+igzkOhmlzoOW`_xo|­y© zlkglzommpssqmpxxspsopqotupvsstxtvvuzttvusuuvyxyyzyyx|yxstutxyvvuvtppuqmuqoqpqpqqqopqmhfld_YQRIA7=?DSYbmtxuqqqqtmqqsmplytqtvxxyytxspspmozu
+
+
+
+
+
+}~
+~}y||}|zsutmsussifikgmxtutttusqpmhmklomomqlomqpsxspqtspRU\`QMQOZf[vvglfbuxqcYRH4HEOgqmdb`cq
+o\S|~kb\y}thg}h=lpVOWYdiobcp  
+zhc[`[Ybs_pthu¥ª`k§¡§dZp\o}pMmm^lhdqVcvd
+¡z§v©}ooiqz~olpopqumoqssqsstsqttspvupqtoqxuqusttpvv}|vuvzyxzxyxsstvx|uu||xuutsxsvussppmposuoqkousokslmlid^_ROHBD?DQbkqp|
+potqkoqvsqpsoxlqqqlstxtuooomkozs
+
+
+
+~~}z|~y|~||uvvtmusllfiikkiqtsvqsqqqqpiiomlkosollmpopqsptsspVV__ULLJZh[tzdmbYcYUWVO;=;7Yv|ohffbqpVN~lbfu~xtbt}ZHsp__Ykug^Vcsot|t~t~}|~~qpmkpqvdqzfS@i~g§hq£±dc©¥ªi^x_p}lQhtgJWg|sdbug}¡x¡~opct}}
+}zzutvttqusmmuppqpqtpstpsoqlvxpstsuuiptyyvxv|z~~|y|tuuxxxutvstpqusxxztuyuuvspqpqqsoopsssqtx|xzyppsqkdJAFIBHLQMQ`mtx
+sotopplvqsttpv|tqqutpuvvy
+toopoi|p
+
+}~|}|~zz|yxustsptstqiffcgktuttqtutkqokhkoqklqtmlpoqqpouqtsoVM[^VNIJbg`yu`c_INSWNRI=A<Om~qhd`_ykVR~
+kZi|yf_cfo`c`uysHER`zppolm_hhcivsuz~fNI\d­cg}¥¡qZšª£©t^~ugs\gxmRM_piuoq€} } ~upbs
+}}}z}zvxxttutqssmvvuupsststvuvtpstyxxuqtxyvxutquvuz|xytvxtvtuvuuvvtttvttxyyxxvytvsppptuyux|zz}yi^^\`_\D@ZYZYZbcxukopoopilqomuvqtssstsmuytv
+sopmqpp|
+
+
+
+~}~|z}xsxpppppsddhfiitussqtsqmmsdolpqpmmtoppsosussouumSU_^YJFSdkbqs^_VONOIDHDDLFSo
+sdd_bkSSiWpv`f`yfZdhy}iIOUy©Ž¹»¹²²¬š¬š 
+s}
+kgVWl¬om|ª¡u_¥£§tZ|€štiuflxsWJOlxomqz£yšxoogq}
+
+}|z|||~|||zytvtxutvvvpuvutuxzsvxzyyvvxvqmuqu|uvuvvxvtvvz|}uqzzvxtttvtusuuv|xyvvxxsvxz}~yd`cdgccJF[_`\\`cxvmtqklpllpqusottqttoqsvvsyospqmp}uy
+~~|~y}z}~uqtspttxvmcggchqqpqoqvmlskgopqqomupltssssqqttutqVYcdZHNSbodtl\\FBFRD@MZVYN[
+qd_Y^i\[oZsodoSf\ghy~fDQ`¡¹®§€§°ŽŽµ²§£tsvtgl|ufUSzu|€¡ypvª§\€¥¥v_y¥šhq fq}m_NSilghkt§|xš¡£zspcu}~}~~~z~z}}~|xxyzyssu|vxxx|yx||vvtsttvuyttxvuukxttuvyzxxyz|yx||zy|x|xzvxxy|vu~~zmccccddIIb_bc__b|}iouqpmoitppoquz~ptpxpmvus}qppqqt
+xp
+
+
+
+
+
+~
+~
+~|z~~}}uvuqpvyvulbddimxxvtpqqptummklmpmqupsopoqtututstkQW`_ULMScmdk^UQELLELV^uz[Sbpik^oiQi~mY}siz_hc`p|V?Ogœ¶®¬ª© ¡¡€|ytm_^_\\`sobOms§it©­\y¡§s[v šhmhkzubQYodWp}l§
+z§£  vumiy
+¡¡¡
+
+~z}~|
+yyz~}x~|yzxyuuxtpvyz}ysqzxtvtyytuuxtvpvsuspvx}xy|yyzyzyvuqy|z~~~zkc`ffhcJB_bb_cbc|zmomlqlqmpqxsxsv}kuuxvpvtt~
+qptqpt~s
+
+~~}|~xutmptzytogfikmsxtutvstqpkhooqqmqqqutpusquusxqxtRS^[SJMWbiZbYUDJVMQ_q
+~b[g
+lgb[ufLo|k_|mgxq}g[^
+xWUbm~ytoidk[MUZ`\p|ZLbhšhv§šdu£¡§£xbxšgh£xpqcU[^SQZdlš€z€zoshy 
+
+
+¡££€€šš¥ €
+~|~
+~}yzxvyxyxusstxuyzzzzyvyyvtytuzxvvtvvstvv|zxvuxy}~~~kggfkffJL_cf^cdi|kupspimqtpstqqssostsqsqqy
+lstpmqzt
+
+
+
+
+
+~
+}~}~}xpxtmqtuplgifiltyustsqvvppgkppmlppotuqstqtqtyyxpQO\cYJOY`g^h_QM?IAF[~b\kdfcft_Qpyb`}iilu\bfl`qdkuyqllkfhikoqtpupml_`YZ_ZfzsS_i®qt
+°gl¥¥¡lx¬ho tl~q[Y_VQSW^h€ª|š¡¡€|yqdy 
+
+ ¡§š§§§ª©š©¬ª©§£€¡||}z}|}xyzx||xyvuyxvtvxvzvvxyyxtsyyt~ttysouvuyz|zi`_ckfhMJ^bbbd^f}klpuplpsvptsqtv~pxvqusxvtsmksoq|u
+
+
+
+
+
+}
+|~}suzumttuuhigdgkvytpusqsosgmkqmuppststststtxvuutoSV`fSMJYdl\ll_\RVJWVYs
+`bhcfb\y
+`Rxz[izlq_o_`z¡¡lNfmsptxqskgcf_hmkpolooi_kg_\^tvW[¡p©€yq®£of¥ ¥€}fqªmmig|q^UhVYdiVf}§šxy§¡xqf| uyz
+¡€£¡    ¡¥ª¬±­­¬®±­­¬®®®±ª€¡
+zyy~}~|yy|yvyxv}xv}zyyz}}y~vyyvoxyv|}
+|obdgmfdMI`^bicdk|~plipilqssqvoqsuxqsxsuxys¡tkppqu}o
+
+
+
+
+}z}~}vuuvovsvvmhhgfosxyoovstusllkotspspsqtxtttqtutxuqUR`fWLM[bkclocoiZW`\RR^p`Zm`\V`~`V~x[pxo~bg_h
+ gOby}ospmqdfcfggmlqobfshfibZcbt}pR€|x¡¥yf}±ªz\¡ª©~fs­sssbvmYgki`Y^Ylz|¡¬~z§€©¥}ssg£¡ 
+^^bilpqsquxy}¡£¥€€š€£¡¡ ¡£¡§šª§©¬°Ž¶¹¶µ·µ°¬ªªªš¥ ~}~zz}|yyz|~z~|}~v}zvyupsxu~z
+kddglgdOJ_cbfggh}zhlkppsooqtsssxvyquqyxuuuvosvuqzu
+
+~
+
+~
+
+z|
+}~~vqsqlvxyvocdfhpxvyttxsqtsklooottspttussvsutuxzypSM`_VUVW`f`xvd}ziUVZHVbi^Umbf[^bNqZz¡pm~o`bi€``vztmlhkgd`d^dospupklyqogg\Y`diuSv kªfp­±
+_£€ª­Vq¬stqb|u`Y``[NNWd£z
+€°zy­š|vsh ¡ 
+=FSSQWZZ_\``dloqqusvyz¡©¬§ª®­§£££€¡¥š§ª®²±°®¶·µ·Žµµ²±Žªš¡}}
+~~vvztvuxz}~
+~mcdbhdfMJb`fffggzpoliqlkmtpmqqxtxuxuzqvzv
+qtvsuuso ~s
+}|~zssqmvuuqihhdlovttysxxpsqlmhhqtuxtksupqvusvtx||pYRccZMR\igm|b|
+kOQOY^bd\sd_Y`YVqZ  £ookzz`gxMVbthgdg`^V\^[`flmdfksspmh`\W_hgYMkl®cfš­Yxªš£¡^l²£zvz
+tkmW_`^YJUcs€¬xt©©zsi¡¥    
+YSV\WY[WZ`db``c_NMLRZfhidgkty|x|
+
+¡§ª°²ŽŽ²°š¥š££€ª®­­²²ºµ·¶·µ±­®¬¬ª£~y|~tu~u|
+}~lffchkhNMcfghgih}|omoplqppqpsytxuzxuxvsvxtvqqtuut
+
+
+
+~
+zxtzspvvzvhlfhkmvtxzttxusqphloutpoupvqsvtxyxy||xoUZ`bSU[^cgmczdJDBOb\fWu}^ZW\|ZSpY£¥¡~cs_qggoAM[sutputspqllvxx|zz~xzyslkhlov
+lN[§o¬£qZy¡šbg ¬€££_gµš}v~sc}v[^chscYhiz¥štq €€}usc£¡ ¡¡ LRRVWZZ[WZ_\ZW^`VMOJ?^`ZYQV`mi_imomquvtz|£©ª¬®±Ž·°¬©©©§¥§­ªª°­®®©­©®ªšª¥¡
+y
+}
+~kifgcggOMcklkkih~zokosqphouolqtvvusyuzqtvuxmpquu~t
+
+
+
+~
+|}|xzuqutuskgffimysxvxuststkggosttxtsyuquuxq}yx||mVW`kUSVZgdvhokok[H<7?VhRyz[VWb}V^¡c\¡xftflcmšf`pixxvxzxsuvqpvz||||x~|ughmomt|ykS~šz}©¬t\x© gh€©£ £bk®ªvuzi}t\Yftt^puh€£x}¡§ª £~uvk£ ¡£¡¡ 
+
+NOJRRNSUSW\UYSU_\W\ZE\_Z`Y[^db^b^^_`\[ZZ_hmmpuuyxzxz¡¬¬©®²±­¬ª©š¡££ ¡ ¥©š£
+}hffdihkNFbkfhhfi}opqppopmstpqusu
+vsyvxssuv¡§ystsmp u
+
+
+}}~~xtxutxuyqligfhpzxvt|quuuvoslmpktvsyxtsosuvxuyxylSWd_SOORkf~Yggh^\OUHQ``SzxSLSd~R\`gxhzofdp©UY`uzvvvuzuuxot|vzxv|z~xxpkhghfhkgcZz¡k®cy€ sf§¬  ¥fi€¥~s|_~q_[dl}vkmtd|x}€€€šzyvf€€£ £WRJEQLQY[WY[WYV\Z\dU@`d_b^Y[d_`ZZ[__ZW\[Z\WWZ`_chkkomotxzzz~}€©šš©š§€¡|
+~ofdgfihRLfhghghg}~oopppqpptspsvt|xvvvvtyvz ££
+qmmmpts
+
+
+
+
+
+
+}}
+}|xuxtsttxuihkkkpxxuvvxtxqomiloqqtsqpspuvyuutxuzypRUb`SUOUghyzU^c\^[RW_mm\YxsRMRkuHk}\pxl
+s
+zigš Yvt~zsxutsvyytqsvzz~~
+}~£€šª®o[Rmb¶`m€©Z
+¥€€­kh¡£ov~_}q`^pmh~
+xg}  |©§€€¡zvxo§£€¡£¡ £££~ZWZY\SQRVSVWUUSYY[fV9[`_`^W\cbd^__`b\[Z\[YY\`b_`dbhbc^cgkikptxuxxttxvy}|z
+
+~zigkhkfiMHbigkhfh||qkmpopspqppqttyuvx|}zytv¥¡€
+|tvspp¡x
+}}}}|~|uxxmusqqkhhgipuzvsuvxttvkfismqtstosvuvvuvsxyvziRWhdVSVYlgyo^i_VSSWcvob`xpYLRmvBhy[uskhx_^©šxbv
+ztqpusspssifgouxxyyyuxmÜÛÔÔÕÃcSb f²kg©°[ €¡¬tf£§ov
+dffoyk[tt~pt¡x~¥­§~zxp©§¥€¥¡€¡~MJSR_WZ^^\[VWYY[UV`M=[^\_^[_d`ffblocb\[`d_ZRVWY[^hglkb`cg_ddc^`ghfgoihhkuvxy|~|}zx
+
+
+~mhhhfihQMdhgkfkm
+qmmsmpqlpqsqtu|ztzvz|yzxqmuqs}s
+}}|}yyyvozuvskhciipuvqttvquusihkqqtsxttssxyuxvv|yyhJScfUO[bgd}_^gbcMk~zhg~iZQYtqB}s[ £~osp^o¬€fS^svptmpqkclgbcdosssuvuyyqÞÛÙ×ÙØx^c¬t²§p`°Ÿ[šª±¡li©±u}g¥fksyYmdkxz£¡sy£²®¡}}xo§£¡¡€€£€ SUURUUWW[VbOYZ[`VW_R7Y_b_^[_bfifccfc`_b^W^YZWW[WOR__c_\`hc^^`c_dgglkgggdlgomokouuht}
+
+|pfgghhiVQkdghhkl}mkopoommpptsqsx
+|yuzvv~z}£xuutqu ~v
+
+
+
+~x}uvvuqzsuykdfimtyvuvvuvtvomloostvvuuqttxxuuutyz~iSV`^RQ_\idupLI\Vkoh¡fZS[ziBq[
+£š¡|mzf^~§S`qvmmfhkqvqlf_[huuyzxtsu|sáÛÙØÛÝÁ}b[}€z€ª~^£±¡cq¥®®Ž§tg¬µ|­vlds}xVbQRbyªs}€°­~vp§¥£€£¡¥€£§€€¡¡ ¡
+QSSYZWZU^``V^\Z^YZfW/Z^^``Y\bdhfigikhchcfbf\ZZ[\`d_fgbZ``_Z\cbgcddhgc`cbdgdkiikmqsq
+zidmhimoQMfkkmkhl}|qoppuqpumoqssz|xyyy|x~~
+vqssst¡    ~u
+
+
+
+z~~zzxspxtxplihkluxyvutvttttiktptttqsqxqvuzy|z~zxylUWb_VRY_khk^VNSMZ|hi
+h\U\|dL
+mc€¡¡olthc£Uh}vpvoqt}ztqtsz|zz}
+mu}sàÛÕÛÝÛ®p`Sv m¡Ž^v®¥ih€®¬±ªtfš²x}°}~bgoxob`b`hb­€p€®¬£ytªšª¥¥€¥¡  ¡¡¡€¡
+MOQYVQSW[\^O[_^_VRgW8[[Y`^W[``bhkllifig``mhk_^YVV`_gkc`blmh\^[dmg^ddf_bdcgff`gfdpqx
+lbdklpiZJhhkklhgzqolpssmqosxxvtxz}}yyzz~xpoqps £
+v
+
+
+
+|z|zvvssxttogfkklqtuyytusutsliskqsxytuyxtxxyvxyx||kU[cfRRV^ldoxZU`^UUo
+yfh bZ[g¡^Qgb€¥ gko x[g£zSZy}zmtqoxsutooz}~~u}vl|xáÛÔ×ØÜËb\qkµcs²­yc¥©­µ®zh§¬x~¬~_`mq^VghV_k¬p€ª§q€€§§šš¥£££¡¡¡¡¡¡ ~x[ZY\\YZ[Y^bUW[_`YRdW<^b_c\V`dfYYZ^dfgh_Ybgklgicc^[[hc`^cfgbchd_c``bd`c^\c`hkhd_biqv
+
+}ohgihkhRLbkkhlfi|xhpsokosoppvqxvx|y}~v|}€£vpvutq y
+
+~~}}z|ztt}vxtlkhkiqxvuuzyxtsqklkmpuxpv}sqtzzyxvxyzyiRZf`ZWV[kgpRM\`UR_~xhk
+gZYgRWbpš£iyxmdv yuuy|yyxvxz|y}z}qz|uÞÝØÙÛÛÐmk©y®§oz®Žc¥§©µ°©±||š~^\qkYYd`[lt°v£®­ £ }|t§­¥§€€ ¥€¥š  £€ £ |WZWRRNQOUYbY[^Zb^R^U3Y^`b^_cdgcfcff\\df_b_\\Z\\[c`cfif_fglmmsscgcc``d^`^^`dhkh_`quu
+~oghhgmkVMggcgkhmzzkpqqssmmqottuuv
+v}yy|
+}¬§©ª§ ¡¡xqpxsu€£¡ £¡£t
+
+
+
+~~~}~zzzpsyvvullkpks|vxuvyutspooospuvxu|vyxx||z}|~}kOYc`ZVZbfd o[QV\gbvkpb[Zm 
+E`~\x¥¡¡~l¡hm¡zbk~v}âÛØÜÛÜÛŸ|sf©
+©ª²ºc£®²Žªu¬²¡zy°
+`ctvdVWSNoŽu~£©£¡¡vªªª§ª¥¥€§€¥€£§¡  € £ 
+QSOSSNNQUV[W\ZZ_\YcV9_hcb[[`gc_cbkffg`\YZ\`cdfggdfbdfd`^[d`\dg`cgcW_fhggcbkhdd__stx~}iigkmkmWNdgihmmlz|mklmqoskussqtsuty~|~~z|¬¬¥¡€š£xsoptu£¡¡¡ £x
+
+
+~
+
+~yxuqyxtykiidhu|xyzz}uxyskklmtuuyyzsvxyzx~|~|yzoNVdcSYZ`mf
+mYL\d^mugp\VYl~Hgx`
+šª¡}i ¡^d zN}­ÆÑÓÆÂÆÊËÌÇÆÇÏÐËËÎŸº®~~~}¡áØØÛØÛÜÊpdšz£·±º¡h€š²¶Žg
+€±€~}šk`o}qcREVv¥v££¥  ¥¡
+v ­­š€š€¥¥¬ £¥    ¡  
+OOOQJJLLNQ^VZ\^ff^fU;^c_c[[dbfY`^^[^`if_bhmilikihggkkigdkkmfhcdbg`\`bid_`dlfib__kuv
+
+
+qfhlkklSRhmkglki}ulssppovutuqqtxxyy}x}~š  ¡uusosu£€ ¡£   ¡ x
+_p
+
+
+
+
+
+
+
+}}~xy|ppx|vukkkilqyyu}yxytsusposqtxyzuy}y}||~|x}iRZdcSOZ`mgoWRZQkohl~_S^mz@oyd£€£tv| ¡v[x €€lWz°ØàÜÕÓÕØÕÑÕÔÑÑÛÕÓÑÁÃ±~}~åÛÓÙÛÛÛ®kd~§x¶vªº©q£®®¶Ž`
+£²©|­lbplR?[~šz€ ¡€ 
+|¬¬§¥§§©§¬©¡¡ ¥€£ €€£  ¥ qhglgg\YWV`[ZYWd`_h^5[``c^\cff``ZVYVWW[\_ddg``bc`_^cghbcdlihgimkmkkikfb_`^fkgd_^oyt
+
+qfhlppmYJflphkmlzzlqpooosqtotstyz|}}|ux~~
+££¡ tsstqv¥£€£¥ £ tsUu
+
+
+
+
+
+
+~
+~~
+}y|tmz}vsmmpostzvyzvzvsysllppsusxxzux}}}x}zfS[g`VSZ`i`} z[EOOhulo~bR_tyDtug£©§pzpW©¶©lp§ØàÕÓÓÔÐÓÏÐÐÐÓÛÓÑÏÃÁ¬~|€äÝÝ×ÕÙàÓ|isš|ª€µ²vqª°¹µb}€µŽ|¬¬vfumfN^u¡ª} °¥£¡€z£¬®­ª¬©¬ª¥€š§š¡£¡£¥€€©€¡£
+dilsmqpplqvfV__f\\fW3[`^b_\fcb\gfdkdb^VYSSUZWV\\[Z\Z^c\\`bc^Y`hfdddhig`bigfdffb_mvy
+kchhmkgZOcloqoilzzltqpqotqststsyu|}}zz}vqtszy}££€€¥ ££zsuxsp¥€  €€ ¡£umIx
+|zzz~
+
+
+
+
+xyxss|xzvmlkmstxvuuxxzvxumisluvtt|zz|}~
+
+|~}kRZb`ZV^`d[v£ }UA@Zxusv¥x[Rfz£qI}lk§©£i¡}gV€±W_ÃÝÜ×ÑÐÙÕÑÏÔÎÑÓÓÓÏÏÄŸªšåàÝØ×ÛÛÜ }os®€š··yg€±·¶by§œŽ
+¬©
+xbtk^JOi ©x
+µ¬£ š
+
+}£¬¬¬š¬®§¥¬©š£§£š€¥¡¡¡£ ¥¡š
+DEILN_^cpmpd\_cgdfg[=_i`c__ffO2`lkootvpmmkhlkcbc``_Zbc_ZWSV\Y^_^ZY_cc_^^bffdgfh`oztzmckhmloZOhkqlmmk|psosmqssxutsuxu~~~~}ss
+¡¡©£€¡¡£¥vssqvv¥€š£¡  ¡£  €vfEx
+~~
+}}}~
+
+
+~vz}uqzuyxmmomov~zxvt|uuyqmivtt|yvy}y~|y~fQZidYZ\\fb š 
+sdSL[} spx¡|^Sf}£bRhl©­š
+h 
+^`°°Yoq×Ü×ÎÐÓÓ×ÏÓÔÑØ×ÕÐÔÆ¿¬
+§äÝØÜØÜÞÛvm¥v¡ª°œ\§µº¶cu€º·¥||fqloLUg¥t
+§µ¬¥€~¡¬ª­ª±š­§š¥©©­©€§§§¡£€¥££¡==482347??^c_^^ickgY;blcfhddfS,UJJOSV_chhlpttyyuuuuloomlhd^fdcfggb_b^YZ\^ccfggccpxu
+
+}oiiikok^Qlmmloml}|gosppsqqtvxtyyv}}z}|~}¡©€£€€€¥€£  xptttt§¡¥¥¡£££¡ ¡¡vhLyy
+}
+}|
+
+}yvvpxyyyoimquz|yxy}zvyzvmsovxxyzy}
+|}~hU[ddYZ[_kd~~qubSiqqct ¡uZVhcW
+dzª¬ zqux[yªŽª}_q¡ÓâÞ×ÎÕÕÔÔÐÐÔÔØ××ÑÓÃœ©~ªäÜÜ×ÛÜÝÝ°|ms¡²s¥±bšŽ·fqŸŽ~uxdqlRYVcv¥
+q
+§¶µ¥§
+§ª²°­­š¬ªª­¬®ššššš¡£§§¡€¡¥EMNNH;HFB=^`\__ghkf_8^gdfffmhZ4N<..*,8429=?ELR[_gkoosoux}xxqmppmkffc^_\[_ddkff__oxq
+
+|mhkmkskWShkkmool|~pqptppqsvvuvuy}
+~}zzš§šš©€¥€¥¥ ¥xxuxsv§£š££€¡  €£¡ €zqHzzxcglqpvu~}
+
+~~~}ytquxvxhokptu~}||tz|yuqklu|yxx~~
+x~hQ\hbWV[[khhtqvpmlddk qlx¡t`bo\^zc¬€vtxp[­¬¡gVp£×áÝØÕÑØÓØÐÑÓÕÙØÔÏÓÄ¶©ªæÞÝÝÞÝÞàÕkf
+ tµ£h
+­£_ ²»pt¶·yt|`tpiiW^k~|©¶²¡ ©š
+¥±®­°®­¬š¬¬ª¬§šš©¡§š¥šš¥
+FBLHDDIYYBY\U^gl\ii^3^fdfbbhg[4ZN9;==<84/473+/328858BBJMWZkpqsquutvvuvmptmglgfc`pzu
+}qmglmmiURfppimkm}~ppmttpuspvxuvxy}~~¡š©¬§š©£€ššš§€zuuxzu§¥€§¥£ £ £¥€¡ x  £ €£ ¡ uM}~llktvbcihfpooxv|z}
+
+
+y|ttyzzyhloovyyyxvz}uutsv|z}~iUWk^[Y[bmg_qsglhksSd phv£ vcpxSgyf
+¡šp£cm®®_\}ºàä×ÜÕÓÕÑÑÌÑÑÕÜÛÔÑÔÂœ²ªâÜÛÙÜÞÝà×}ms°²®xu®¬hy¡²·¡tp¬±v~¥|`md_uulo|vz€ŽŽ££©ª ¬µŽ²²®¬­ª©¬¬ª§©©¡¥§ª®¥§©§
+ SWSENAEb[?R`W`bickgZ0_icfgfglc;RSBEIBFD@8AAA889;=;0/4,/0+0/78;IQRWYY\bgoophigfc`q}t~mfllqpmVOfhlkqim|mpttsspuvxyzxz|}|}}¥¡ªª¥ªª§š¥š€€š€}ptuvtš¥§š£  ¡¥¡¡¥¡}£€£¥§€š€šš§§€£š§£€vL
+ ~xvpl}tcilgimfgimptuy|
+~xxupyy}vhlotvy~z|}||}yyzx~}
+xdSZk_U\dhth`gkm|sfi5k£sqxqboxOl|i£°€qššYs ¬~mpŸâäØ×ÔÑÙÕÐÏÐÓØÙÛÓÏÔ¿¹®ªåÞÝÜÝÛàáÐudk±°ºv¡¹¹tqª»·šxm°°¬¹_hok
+kutx¥·°¡¬š
+©°°®°©­±°®­ªššªš€§¬šªšš€š§_`i^cVA`^?S`Z`_icfib7_ikdcdhl\3LWUQEFHFA@EB?BIA@FF??@;?LB@<@D;<?7..25;?NQhhkkc_hs|s
+
+|lhikmllYQollmklp~|iqqssvstvvyz}z|}~}­§¬š©®©š©§šš€¥¥¥ysyusvš©¥¥©€ €¡  §€€|¡€ššªšš©¬®š©ª°šª©¬vQ©£
+ ©š¬š¥£  zxxtkmqioti_`|
+
+}spzvzzhlst|
+~}~~zy~yubV[gbZVblvbckout_'tvsyqVhu}Vpq£©šs £uY£€£mp²ÛåáØÜÛØÛÙÔÐÔÕØàÕÑÕÑŸÂ­
+®äàÝÞÞÞàä×©}md§©u¥œg¶·
+k¬º¹ªzh·µ|©œ¶£iikdzxspš°° ¬©­²²¬®­°®¬±¬©­¬­§€¬©ªª°š©š§ `ciikQ;^[<Rb_^dgdbif9dmhihfhk_<N\_^VQ\\[ZYWUVUMMLJH?BB?EFLFIIMFMHJH@<@E0Qohfgg_dtulgglosm[Jhommoooxkooqstvqvvyz~~­©u¬¬šª¥š©ª¥©¥š €ytvtuv §§š£€€  ¥€ €€~§¥§€§§ª®­°°®°®±®°­ª§}V©¥~¡šš©šª©š§¡¡¡zqlp
+}xt}x}}hkpxy
+
+~x~}|vs`R[f_Z__iggidiv~b(uyvlZl¡ xUv}x§©šz k^£``y°áäâÞØÕÜØÕÓÐ×ÕØÜØÕÔÐÁº©ŽåÞÝÜÜÝÝááÕo^|§x¹šdŽµb§°»ªg¹Ÿ¥}
+µ±¥hdzLQv
+vq¬®° ª¬ ®µ±Ž±°²Ž®±²­©ª©©ªªª©¬©¥§ª¥¥hddldR8[b<Vc_dfic[oc0cmkf``hlZ;RV^_YUY_YZ\^c`b`fccc_YQMYLJIFFBAFLHJHJL[4Ahifhb_\oo
+plmlopiVNgokpolp}|kpsqspstuxz|||v}šš€©©©ššš§©§¥©š¥€ |qvttsª¥šš§¥  š £§¥£}€€©©§¬¬¬¬±°±²±ŽŽµŽ±­}Q¬§
+}}ZALV^px}€€š©¬¬©©©¥§ ~txz|ymmu~}yvbQWkdZZfhi^Y_vd%x~u d^v}§€qUx~š©l£§Zl€šqxÎâääÙÝÙÝÛ×ÓÐÕÕ×áÛÕÓ×ÄŸ­¬âÝÜÜÝàÜáä×vip£Ž®k­²`Ž»ªxc··~¹š¥pd~`H}pyo
+ ©±Ž¥ ­­­²µŽ±±°°Ž­±²®°­¥š­©¬¬ªªª¬š  £¡|zxupY9\^?Ub\``hgZg_4bliff_kkc?Q[b_c```^b_cfd`cdcgbd^cbcfbZ^b\RRQJLJ8O^7Icihhc``px}mfkloqo[Niqkpmkkypsqoosqstyy}}zvx|©ª©­®©ª¬©©š©ª©§ššš©¥zppvut§§š£€€€£€¡¡¡¡z§šš§§¬°­±°°Ž°¶ŽŽµŽ²šzY¬£
+c8MHB~v@<<EIRblv z~pty
+
+~zx}cSci`^Z`khV^_`£€`4|zxg\u£lW£o©¥i€£\x©¡q^z¡ÐäèäàÛÏÝÝÛÕÓØÙ×ÝÜÐÏØÄÈ®ŽæÞÜÛàÛÞáâá¹sh`€~§Žyt§Ž£g~®º®}b±¹£|~®š€ubgJsds|®·¶£ °©²¶µ²Žµ²Ž±°²°±­­­°®­®¬ª§¥šš
+¡£€€¡bdkllU8[^@Yc``dfhcig0cmmklikm_AS_ZFt|~xotxutsupqsmkdklmlgdbff_b`Vd_HO`=Fblgdgf[Zvtglkoop_Ommimomq}omopqqvtvu||~y}|}}|®¬°±°¬ª¬­šš­ªšš©š€€š¡zuy}uuššª¬¥£¥£¥¥£££ |©ššš­¬®­±Ž±¶Ž¶²µ·µµªyW°¥kDRQLS=5D883<88@BFEMk  z
+
+}~|gV_g`Y^`ii\\^M^yUH}y£g`sfY t¥€
+guW£­kpmxÃääåÞÙÐÝÙØØÓØÑØÝÜÔÔ×ÇÆ°²æÜÜâÝÞàÝáÜ®vff}¡x©ºl®ªvy°¹¶f­¹®š®¡sf
+gH~vdi}y®¹µ¥€¬° Ž¶µ¶²®¶±®®°±°®­ª¬­®±­°¬¬±©€€§§š£Z[^^gZ=Y^DU``bbki`dc3cqpilhllcAS\U<[b|~~
+
+
+xysssohhodglc^_[@H\=HhlhfbdW9tª  }ohilppmZQdmlmsmhsqppmtvsssy~~|z}|}š©²¶š¬¬­š®¬šš§©§§€¥}uxyty£®©ššš©¥¥§€§€¡€}¥§©©¬°°°µ°Žµ¶¶ŽŽ¶¶µ­V­ª|mEOUR~bA2J@=9?29@=JID€¡£¡£  ~
+~~hVbhZZ^ciqi`_b`biRU¡xx€dVp©^\€q§©€yv¡gf©m~}ÇáäááÛÓàÛÙ×ÐÕÐ×ÜÝÑÓ×ÇÃ²µåÝÜÝÞÝàáâÜ£tcx¡°¹¡l²²u®·²`­Ÿ­~©¬ufbF|k[hqly±¹Ž¡±°€¶·±µŽ··¶±®­²±²­°±­±®°²­®­­§€¥§¥£Y\\`ib9[dAUhbdgdhdg`7cqsho`gi^<R`Y?NQogsotuqqt~}yz
+
+
+z}}xpl_@J^@EflmhfdU9d€ 
+~qipmoom_Qkokkoml|}pouvotvxtxz}}|z~|xª²®­­®­®®¬š¥©©šš§yutsv|š­©§§£¥¡€€£¥šz§¬©¬®®±µ¶···¹·¶¶·µ²¬~Wª©kLYUYpsN7SS=?F??D@SIM£€£©¥¥€¡¡¡¡¡ ~hV\ic\`cmvk^^_cbtSM~£ vs©^Wt©Yi€v£šl¥¥Uz©zdy ÆÑåæáàÝÕÙÛØ×ÑÙÔÓÝÙÓÑ×ÆÊŽ±åÛÝÜÞÝàââäÝ±ykv²µšsµ¹l§»µh°º¬±¥©qcgIsmqg^do ²·µ¥¬®£²µµ¹¹¹¶±°°¶®±²±±®®ª°°°°±²ª¥£§š€¥[[_bbY8\bAYc_dlhhlg_9bpolkdksc=S^Y=ONgloktyoilxuqcbfopstpvu}z~~~kDB[?AgpligfU=c¥ ogklmpp_Okqpmoqkzsmttpssuvuz|
+|}¬·º·®¬©§®©ªšª¬š€¥~vvuuxš©šª§§¥ £££££~š§šª¬¬²Žº¶¶·ºœ¹Žµµ·­}^¬¡~fO^YZu
+_;[W=?MD?EHVIJ|£¡¥¥€££¡ ¡¥€
+~cY^lb\^fs}udSS_oOO}€xvª[Vyš\pzv®ªp¥£Oš€€ivvÂÙâæäÞ×ÕÞÙØÕÑÕ××ÝÛÐ×ÕÇÂ©±èàÜÝÝÛÝáÞÜÝšybo¬®²¬²¡c€¹º`~­¹µ~±­š¡qb_DffgVdq€¶¹µ°­¡Ž»¹²·Ž¶µµµ²®Ž²±±®°°­±¬±®²®§£¥¡€š\Z\^d[2Y_FSccikfkkh\3fqpkkkkqd@N^W9MQlovqvxqkmqsocidiqtpoopoopmmktxmJF[FDguohlgVAb¥  mfmooomZHgsoomllzpmstspqtuvy}~}x}|¬»¹µ±ª®®¬¬ª§ª­š§šzsstuy¡ª­¬§¥¥š€£€£¥¡€§©¬¬­®Ž¶¶·»µ¶ºµ¶µ¶±¬}\®š~tzgScWZq}d<`hIFLBAHJWAMz€€¥š§š§£ ¡€¡ ¡
+}gV\hd_^cp¡£uYIVbfb£uy¥Y^£
+Zsxy¥¥p©£s`_p~ÂÓäääÝÕÐÝÜØÔÓ××ÔÝÛÔØÔÆ»¬
+±åÛÜÞÝÝààááÞ²i_f®©z§»x£œ­b§¶·[t€Á°|ª®€iccAod[Sbs
+§¶¹Ž±®¥­œ·¶Ž¶¶Ž¶·®µ¶²±µŽ²±°°±®®°­€£§š©š^cd`f^9\dHRfbioiiomg;ipuolfksd<WgU3JRomyq~|smllqpgkktsqqosuukposquxpMI_DLhqupkhVE`ª
+~phllook_Nhoqlmmlz~soqsututvy}z~}}}y®º·±±¬°¬­°¬ªš¬¥š§£}upvy|¡­­©§š€šš€§¡ ¥€}§¥š¬©ª±Ž¶¹»¶œ¹¹¶¶·²ª~[­£x|dNd[^x~xMlkSJLA@JYbHSz 
+£§£¡€¡€££¬§¡cVbkc\[foª¡bO\klkuyU`~¡ vUu£v} §£_z£ MVÁÐÑâæäáÙÓÝØØÓÔÛ××àÛÑÕÓ¿º¬µåÙÛÝàÛÝÜáâàœppi}¡Ž¡Ÿ¥uœŽk­²gp¥œ¬}¬­h^¡fMoimq¡¶»µ±®£Žº¹¶·µµ¶²°²±²²²Ž°®²²ŽŽŽ§©§§®ª§fbbfiY=[kIOkhkqkopil?htvloilpi<Q^[0MVmouxx~plmtqtkooussplqvuipsqsqumJO^BOottkgl_L`¥
+~uhmplmkWRcilppokv}qpsptqxtuy~~~z}z€­»»Ž©§¬¬©­ª©šª©¥© |vv|}¥¬ª¬§šª¥š§§£¥£¡ }š¬­®±Ž¶µ·»¶¶°¶º·¶·°§}_ª£zycUdi ©O~o\OSJLObdA[}¡ššš£€£€€€¥€¡~
+bVblb__dm§¡lIJ_mouu}Sb€qSz€st§¥Sª©qSdÔÌ×äææâØÐÙØØÔÓÕÔÓÝÛÑÕÑÂŸ®»èÛÙÝÙÙÝÝáàâÊ~xmŽ
+»Žuºº}¡©®fp¬Á±}©·o[}£pOvhim} º¹­ ±µšŽ¶·ºœ··¶­­°²²²±±±®°µ²µ¬ €§š¬§¬ d_cdkV<[fLWphitopmiq=guvqklmml7S`Z5MVpputuzqliqqpipltssxtyuxssttpsupJJ^DFpsvtqgV@_¥
+yikpmpo_Siospqts|}oqtsssusu|v}
+~|~~ ®»»¶±®®­­ª¬¬šš¬©©}tzx}­°®¬©­ª¥§š¥£§€ £~§¬±®¶ŽµŽµ¶ŽŽŽ¶¹¶·º²¬zcª¡yucVogQv`ZZOWVchD^|¡¥§©§¥¥ ¡£š€£©  
+cR_hb^b`l§¡z\Oblpš}z}zNh€iY
+£u€m| |bª€gmªÓÑÙååàÞ×ÓÜØÙÔÓØÑÙàØÔÓÓŸ¿°·åÝÛÜÛÝÝâààâÑkš
+±±}¶¿u¡©gp€»±|š¶t^¡hRmhvpt¬·»¶¥ °°¥ ·¿ºº·¹·®¡µŽ²²±Ž··±Ž²µª šªª§­ªggfhdY;^kFYpiiuposlpBbmxopflpkALZZ9ORttyzzqlmtvyspsxxzutuxxvxuuvztmLJc@Mp|yyop^5h§ ~sgimmimcMhpmltoqzqtppqussuxx}}||}} ­»ºµ±®­­®¬­­¬¬­­©¡|z}~£®ªª­šª§ª§€¥š£¡ zš®°±®¶°µµº··Ž¹»º¹µŽª}bª§~zu`Vpos|k_z```OYQ`dFcs¥€€€¡€€ ¥€£¥¡fUbkc^^^mz[\gblš~zxtOo§b[pš¥q  ll©©_cqÑËÙèèáâØÓÙÙÙÕÔÙÕØÞØÙØÑÂ¹­¿éÜÙÝÜÛÝÜààäÞ¥~g`¡zªœx£Ÿk ²¡lk¡ª­}¥¶\tpOuu}kq°·²£²°£ »·»·¶¹µ­»±š°µ¹µ°¶¶µ·²µ© ©®®°¬ª fdhhk[4[iEUpflxmlplpJdxsomdguo=S^Y;QZuutvtpqyx|uptxxxxuxvxuztxt||qRMhLEpvzzyvd;_¬ ~shoooomcQimikpqqz|mpsssuusv}~}|z~ °œ»¹®®²ª­°¬®®¬¬¬©¡|sy€®¬­§©§€§¥ªš¥€£©­±­­±µŽ°²·²µ·º°ŽµŽ©yc­€}vtc[plkbdkU[_S^Sfp§¥§©¡¡€§€¥¡ ¥£
+hZ\fc\^cq
+§§o`V_Um£v~xtUs¥^cx€€zs£^¬­zhixŽØÎÝèåâáÙÔÝÛÕÑÏÕÔÕÝ×ÕÕÕÆ»®ºæÜÛÛÝÞÞÝÞááåÙf~ª
+œp°€f¥»±sl©­v¥
+}[xpVpkmt¡Ž¶ª ¥Žµ€ ººŸœŸ¹°£
+ÇÕš°¶µ²Žµ¶µŽµ® ªªª®®®šc`bfk\8ZlHOlhhpoloqsDfvyqogiumEOd`8ONpsy||ussyxztvvvvuyuyt|zxtxox}uQRfMJqy~}xxb?bª¡
+qlmmkmlbOhoqmlkivqqqusstxxy~yz~²º¶·°®®®®¬±°ª®ª­ª£ytx¡¬°®©ª§©š§¥©€§¥€|ª±±°¶²µŽµŽ··¹µ¶»¹¶±¥xf°€||qf`vo£z£
+`moUh[MdWfm¡¥§§€¥£§§€¥£££¡
+
+`Ycpc\bhltdVWfBi¬z}xkWz §
+[fª¡t§¥d£¥ho±ÔÜÇØéåâåÙ×àÌÔØÓ×Ô×ÞÙÕÙÕÇÂªœæÛÜÜÞÞÝÝâÞâáµup\y²²°sµ©o©œ¶g°·©x¡ `spO¡yhkdi®š£±Ž€ €¹Ÿººœ·š
+œÁ°®²²°±¹ŽŽ¶º­£¬©®°±±€mdcgqV9[hIVkkhppmkfsDivvsqkmtoHQfZ;QQtovyx~ztquxyuuvzvtx|yuzyzvxt|y[QiULp}|zxkVm
+
+qckokmq`Ohkmmoll}lsooxttsyy}
+|z}¥¬»ÂŸŽ¬¬°®²±®¬°­ªª¡yvx~­©¬­ª©ª¬§©š¥š§¡­²²­µŽ²µµ¹Žµ¶¶·µµŽ±¬ug¬£y}shksxzz~¥mpqikMlZko§¥©¥¥£¥§£§©¥¥€
+
+
+
+fS_ld`bfmvg[bo}Jk€~v~£¡g[ §Rtx
+§°¡k£qv€\mk§ÙÜÄ×åèâà×ÕÎÑÙÙÐ×ÓÕàÜÕÕÔÊÈ®Ÿéà×××ÛÛÜÝàâàÓo^i¬£±µµ°y
+ªœºf¿Áªz©
+^p zUyzhh|€ŽŽ§ §»ŸœŸ¹²¶²ÁàÛ°¶µ¶²°²Ž¶Žš¥²­Ž°­°£cfhfp^8UcFRohfmossoyR_pvqupqvqHQg\<RLzvyyx}vutx}vxvvytxy|y~yvytqzxZMhQMsyqdlsbikolqcMdqolspo|pqvzvstxz}}z~€Žœœ»²±±°­²®°ª­¬ª©¡|zvy¡±±­ª©ªš­š¥ª€©©§€ª²²±¶±Ž¶Ž²¶µŽµ¶±·Ž²©vg­zzoop
+s¬z~vdvUm`ol€¥©§¥¥š€€£¥£§€£ 
+dUhoccdgoqkqh[[g|Qt§}u}c^£Wzx
+£­l £f¥¡z^}¬ÃºÂÆÌÄµºŸ¿ÄÌÂÃÄÄ¿ÏÓÃËÁ§€œèàÜÛÜÛÜØÜÜááÛ®lpc£š©·
+¬¶~¡¹¹dµÁ¬}¶`qvY€}~utš²­§ ¥ººŸÁœ°£ÈÓÜ§°º¶·¹Ž·»º»š¥®©±®°°£gcdiod8UiFNlhmpouqoyOcuytxqttsISg[5MQ}||vuxvvx~}ypu}x}yvzz|uvsv|zWLhZSo~|uqlqgklmmq`Nipltqpsyotovutuuu~
+~|~|€®œŸœ·Ž±®²®­¬®®±°¬€}yyy~€±°ª¬®ª¥§­ª©ªªš¡¥±µŽŽµŽ²Žµ²²Žµ²·µ¶µ²ª}f­£y}oku
+¡¬|m~^mcoh¥§­¬š§©§§£¡€§š
+¡ €
+
+
+bZ`l_^bf``[^_imcJoxu£[l
+¡£sS}p¬š}£f­€lhcx©§§§§¬¥€¡š²±­­®©­¶­©¥ ÂåÛÛØ×ÛÛÝÞàÝÞàÛ¡u`ª¡œ©x ºs¡±ºb¹Á© ·`s¬¬x\§}|o| ­¬¡y¥¶§}ªÏ·Ä€±¹¶¶¹Ž¶ºº¥§®±Ž²®°šdggfsf9YgHOkiooqmumuJcuzxyzusuJNh`9QN|yvvty}vy}zytzxy|zv~vzyy}~xYMh\^s~|zx~o 
+tkohksogIgmoqqloxuqqqxvutxz}~z~£±Ÿ¿ŸŽ¬°±²®°±°¬­­š€  zyt|£±²°­¬­ª¬©§š§®š£¥­²²±µ±Ž²²Ž¹Ž²·®Ž®²®¬|iš£u|kixg~x¬¡~ux_kkzi¡ššš€€§¥€£¥€š¡ 
+£
+
+dU_i_`bbU^`cosyZxxyYmškVzm¥€v©£u©¶ WsqzËÙÓ®ÄÜÙÝ×Æ¿ÄÇÄÇÆËÊÄÂŸÆÈ¿ÃÂ²
+ŸáÜÜÙØÜâàÜÞááâà©hz°µ²}œ©f°œ k²·ª
+Ž °dm¡§zZ€¥~xq®±¡~|£ÏÈŽ±± §¶¶º¹¶·¹·ª¬°°²±²²¥cciipk;ZhFMqoksslqkqNdxyxvqtxpESi_5SL}v|uvqyz}}x|yzuyvvvuz~}}xut}|bJh^`s
+
+~zux~o
+ ukklkopdOfpolmmp~qvqqutuuu~
+}||z~
+¥¬»»ºµ®±Ž±°°±°­®°©£€|xxxz ±±²¬ªªª°­§š¥šš€£}°Ž±Ž··±µµŽµ¶²¶¶®µŽ±¬yfš£||ms~zi€¥¬©ykpm|gª€¥€£§¥¡¡¡€¡£ fW`g[`dc[bfhlk|Rxv}Ro©cZ
+s¬p t©€R[s°àâà¿Õèååâ×ÕÙÛÕÐÔØÕØØÎÓÕÎÌÄ²ÄåÞÜÜÛÛÝàÜÝÛÝâÔtlpª¹¶ŸŽcª»£p­¶¬µªŸšfg¡°_š~
+~²­š §²­²¡œÔÕµÐ£¬ ©±µµ·¹º¹¬¬±Ž°¶²®§fddoqo?UgJOvqkptlqoqS_uytysmomMJgc8SLyy}xyxyzx}~|xty|ztuy|yxz|~zZHiVZvvut~m 
+~siilkop`Ngqmlkopytqstyvqtz~~
+|~¡®Ã¿»²±²±²Žµ°¬°°­­ ¡zsu}|€²°°°ªªš©šª§ª©ª€¥~°±Ž±Ž®®²µŽ±¹µ²²±±®Ž­xiª |pu
+}k§©®®¬¡
+ |pksh §§š§š¥š€£€¥¥§£
+ £
+bYbi`^c`_^Y`xY~xxOt§b_~|¬t££§o¬ ¡~zt~ÏâÜÝÃàæææâÛÓÜàÛ×Ó×ÓÔÝ×ÑÙÌËÈ®ÃäÛÝÝÜÛÜÝÜÝÜàâÞªpgb¥¬£º²µu®œ­uz­¹­¹­º±lm©°}^£§¥ ~|²±€ £²²±®¥œÁ¹pot®©§¬¶¶¹¶º­¬µŽ±¹µ°§ikimqi=YhAMvsoiplsopS^vtqzuppmLNhc8UE}v|z|syzvzyysux~|qpy|~tv|y}_IlWZy
+
+xz}m©š~sfflkmsfQdmopppmustsqvsxsv~€ŽÃÁœŽµ²±Ž²±±°°±®®©€ |uy~}¡®®²­¬­°ª¬¬©¬©©¡ }®²²®±±²±°Ž¶°Ž²°²Žµµªyf­zqvys
+š©­°ª§zyoti¡€§¥©€§©¥€š§€¥¡ }`UR[\bocWdgg~£
+W} vt}Ju£^g¡s~¡ª|€¥t¡©`uoÞèààÂØèéåâÛÕÝà×ÕÓ×Ó×ÞØÕ×ÌÇÄ²ÇâÛÜÜÝÝÞÝÞÞÜááÝ¶~x²²š®·©œ¶}q§·Ž±µ¹µvišµc¡šš¡kgª®©€¡ª¹°ª»ºÜÆ~y¡ÊÎ·¹·µ·£­²µ¶ŽµŽšggiipg<^kEItopgololuZ_vvttpkqlIMfdAQHzz|uoyyvzyyvssvzzppz|x}zvyy}`UmURs}xzt¬š
+uhmoikogIlmimpmmxpstvxssyy
+
+~~£±Ã¿¿·²°·°±°µ±­­±²¥¥|x|~¥¬°°®­ª®­¬ª¬š¬¥¡£~±²®°¬±®Ž­²¶±²²²µµµ²šslª|fz}¬­®±°ªz
+sug
+š©£§¥š€§£££¡££
+~}dFI^_f[Y^dq| ¥`~¡y| zR£[ip££~
+o¡§Sis¡âèÛáÆÝèååàÔÓÜÜÛÑÑÔÓÙàÙÙØÑËÂ±ÆäÛÝÜÞ×ÙÝÝÜÝàÝàÇ}
+x±®¬~±u¥œ·
+q£»·~¬Ÿ®²yk€·d£¬£¡š_g_
+ š€£š»»·Äñå©xs©§©¬¬ª¬
+©º²·»€­¬±°±¶Žšhmiiqh5ZlIMqglhqmolpW^ostssmtmIIcf9UBxz}zumzytxz|tsv|~vs}~|z}||_NoWOs
+}y|~o¬©~sfkmiom_Qimppmppx
+qpsustsstz
+
+~~}~€ °Ÿ¿Â·°°¹Ž°²±±°®®±©¡ ~y}|€¬±Ž®­²­ª¬®ªššš€€­µ­®­®µ±®°ª®­²­­°µŽ¬yl­ymv€
+­°®± ¡p~i ¡©¬§§§££§¥¡¡££  
+~dUJZ`bQNUo£€Yz¡zx pW
+££|Sum€xiš§£qul©âåÔÜÂÙäæäÞ×ÕÜÞÜÕÔÙÓÕÞÛÓÙÏÊË²ÈáÙÙÙÙÙÜÛÜÛÛÛÜÜÑ|m¬©¬¬§o·ºu¡¹œ©ºš¹g¶fš­š¥¡h^fq©œ»¶¿×²zvtx®°­®®šxŽ²º·š±ŽŽ¶Žµ±€hkooqh;[kEOukpislulmR^otopphqpJMgg7SI|z}|ztzzpv~uxt~yty|z||}|`QhWSp
+zzym°©
+sgimlhqgMfkkooomtopqpquuvz|~
+©®¿Äœ¶±µ¶Ž²ŽŽ±°±®®€u}|§±²­®°­­­¬°ª¬©¬€€ª°®­®±²µ²±°°²µ±±±Ž¶©xh©|mv©£¬±±±z£~f ¥§š¥§§€€¥¥£§€¡ fWQ\dcWZgl¡|U}¡sq©lUpJx£o®z®­u}q~ÁäåÙÝ¿×æâæáÛÜÞÜÝÕ××Ô×àÛÕÜÑÇÃ®ÆáØÛÛÛ×ÜÜÞÜÝÙÛÝÜŸz|cš¥Ž­µmŽŸs·· |©·š®
+f€µ
+l©°¥¡£xUbg š¬¡¡­ÁœµÔ±
+|°·Ž¬°®®šx²¹·µ©ª²Ž¶µ·Ž€mikltl9[kDOohogssvpqWYpqottitmLMgf?RDz|}yxxz~vvyxy~
+zyzz}x}||bLlQOs~utl­ª~
+xlhhmlmcJdomqqkkzpmupqvxtx}
+
+}|}ª®ÃÃ¹¶Ž·²®²­®°±°®Žš§|yz|§²Ž®²°­²¬®­®­¬¬£¥¬®¬°°¬­±µ²±±µŽŽ¶¶¶·ªyp¬¡vzhš€­±°®§d¥§€šš§§€¥š€£€¡¡  gZ^cd^_boc££šzS
+qp¡c[fQ€l°}¡©ª
+Uv~ÌâáÝÙ¿ØäåäàØÜÞàÝØÕØÕÛÞÙ×ÝÎÈ¿ªÊàÙÜ××Ü×ÙÙÛÙØÙÝÝ§x~i|£ Ÿš|®·}µ»¥o±Á©|€»ª®h©¶p©°¬[Zg£©µ¶± ²¿»±Ùt š©¬»Ÿ¶¡²±Ž¹µ¹Žškokkti9VhERqfmgmookoYQioksplupRMmf=UHyz~}sx}xxzxv||x~~xz~cJmUIq
+~vxq­§
+
+zgdkpmofJcloqqpmx
+sotsuvmtv}~
+
+|~ª °ÃÃ¿¹·¶¶µŽ²°Ž±°°±š£¡|y}~£±°±±°®±°°®®š¬­€¥¡¬±°­­­ª°°²¶Ž²Ž¶Ž¶µ²¬vp¡® |xu£¬¥¡v±²µ¥¥šf££¬ª¥€¡ §ª€¡§©£   gW`ifgc[kbm €¡~Y¥€ps\`dZ€xx­}y¡¬¬qOu}€ØæåÛÞœØååàÝÔÝáÝÔÓÔÜÕÙÝØØØÏÈ¿­
+Ðá×ØÞÙØ×ÙÜÙÕÙÝÙÝÔ¬sq¥¹°z¡»®Á­s²Â°¶®¹f©²v§°£¥ vZu±¶°° ¡·¿²­Õ¥qoxthp§¥
+|±ºœš±µ¶¶·¹·§llmsyl8QkANslmilpolkZVpokosopsYJpf@SHzz||zz}|x
+yv}~}y}
+z}
+
+~cLhOEu
+}|zp¬©
+xfkpompdIflkopto}ppsmqtuv|}y|~¬ °ÃÃÃ¹µµ¶¶µµ²Ž±²Ž°§¡~|}~§Ž±°­®°¬±©ª°©¬¬¥€­±®²±­°Ž²¹°Ž±¶µ¶Ž»Žšuo ²u­±­¥z€±°±š§i¡©š§€©¥š¥§£€£¥ m[gqicihgiR¡¡£zO
+¥qxUkSdk~¡€€ š§± bV|Æ×èåÞÝŸàèäâÛ×ÙáÝØ×ÓØÕÛÝÙØÙËÄÂªËàÛÕÙ×Ü×ÙØ×Ø×ÙØÙÏ ~pc©©µœÃz¬ÁŽu¬œ²
+ª±¹b Žx§¬§¬µ²kdu£  ªŽ·¬ £ŽÄ·š×z|qugqysLo§vzl¹º¥¶²ŽŽ¶·µšupmuvi7UiDQqopmoootl^QmtmqplqoUNqcASAtz||xx|zy}z|}~
+}|
+cIfREp
+
+~xzo­¬xgkkookcJhllspmovtquqqvvtt}|~|y~®¡¬ÃÆÂº¹ºµ¶µ±Ž°²±±­¬¡ ~|||}¥±±Ž°®®°°°°­©ª¬€¡}®µ­®­­Ž±°Žµµ²±µµ·º·¬|o°£s­·®§cy¥µ±²|§£¡i §©©§ª¥€§¥€š€€¡ oYdupiglpbWV€ vQ§}xvSy€ yLlc¥}£©¬§iZmÎÞééààÁÞèèäÛØÛáàÜÑ×Ø×Þá×ÕÙÏÄÁªÎâÔÕØÛÙÜÙÛÛÛÛÛ×ÜÌsph¡¬¬Á º€l ¹µyšŽ±¥ ¬²\šy®®¬®°oxtª­¥ŽŽ°©¥ µœŽ¡Ý¡lxxuul
+y}cqx¡·§µ·Ž·Ž²±ªQVQSdd5WoBMqookmhttmZZupkptispVMqb8L7<EILJV`cffppkkot|yu~}~cIhUAqux}l­©
+xhgmkmpcNdpmtkomupsuspysxvt
+}}x}
+­¡®ÃÃÇœ¶µ¶¹»²ŽŽ±Ž°®š¥€~y|z©ŽµŽ®®°±±°­²¬¬¬€¥ ©±±°°±°µ²µ°µ¶µµ¹ººº­yq€¶x£µ°Lp€±Žµ|©¡¡m£¥­ªšš¥§§©€ššš £t[gyulhosccUp¥£ uZ€}x}V€pOsl£shl¥ÛÞêéààÁáèéäÛÜÝÝÞ×Õ×ÔÔÙàÓÕ×ÎÄÄªÎáÑ××ÙÕÙ×Ø×ÙÜÜ×ÝÙœvs}®£¹¥±švµŸv¬°­±¬­Ä\¥}°µ©°kk|x}§¬®¬®ªªµº²¥ÈËpillmbf`~il€°Ž¶Žµ¶°¬OSLZfh3SfAFqqqhshuuoYZttpttoosUHviMA@?5;578729472334;ADDFIOOVW\dfitubEkVDm}xvo°š
+yikiompfD`ooqpuqxtqptpqsvtv~}­¥¬ÄÆÆº¹¶µŽ·µµµµ·²Žª££||xx§±²°Ž±²®®²ª°±®®€£ ¬Ž²®±±®µ·µµŽ··¹¶¹Ÿœ®ykšŸ€x§§ÁŽSm€®¬µi£¡¥p€£š§š©š€¥¥§¬£€š 
+ o[ftqifmucgfUx¡¥oZ
+S©£lSvp ¥
+¡¡ ii}zœâÝâæÝÞÃàèêäáÙÜÙØÕ×ÙÜÕÝÞÙØÙÎËÈ¬ÑÞÓÕ×××ØÕØÜÛÙÛ×ÙÞÐ}o¥¡¶Ž¥¬·¹p­¿Ž¹µ¥Ã§dŽª©­upx±Ž±¹°²°šœÂ­€·¡|fY£}l\cs
+£±·²±²»Žªkoihlc4Yf?DippkoivxoZZusmtuoqt\NpifpoquyuvtpsplkfZYQLNLJINMFHHHFDIZtdDgRFoyv
+p®§}uihikoliMdmpqtmpx
+vuusovzyvz
+
+~|°£­ÄÇÆ»»·¶µµ·ººµµ²±€§§}yv|~§¶±²Žµ®µ±²ª¬ª©®€€€
+°±±°²·Ž²µ¶¶µ·¶»Ÿ¹ÁÂ°zlª¿€zš©°º¶[}ª©¡²Q©§€ €m¥ ªššš§§§§©§¥¥£¡ ¡ £¡p^ivykimvqZS^\uo\y}xY­`Q|x~ €¥§f|ÄââéåÞÝÃáèèäâÛÝÙÝØÕ××ÙÛáÙØÛÏÇÁ¬ÔÞ×ÕÓ××ÔÓÙÙ×Ø×ÙÙÞÛœ_ £²¹®º»c¡Ã¹·¹»©f·š£s|uu~±œµ€·»¹ª£š±·¡zpp`\t£©¡lofuqŽµŽ¶¶¹Žªhmfhd_2VcD@gilhkksuo[YvqovsmtqZJsmglst|zyy}||}~uvuuvosmldhbotc?fZ@pzzo¬ªvigiioqiMbillklpuqsutuvvssz
+
+
+­¡°ÊÈÇŸ»º¶··¶·ŽŽ·±Ž­§£z|}z§µŽµ±°°²±±±®­¬±§ ¬µ±±Ž¶²··µ··»·œ¿ÂÆÁ°xs­Æ§x°©¶·d­¡±®cv¥­¥©€ §k ¡ššš©©¥©š¥¥©¥¡¡£vbgxyikpz}f_dk^pkSyz~s_¬[Up£¡¥¥š§}Ss|©áâáèâàÜÃàæééæÜàÜàØØØÕØÝàÙØÙÐÇÄ°ÓÜÙÔ×ÔØÓ×ÙÝÕØÕØÛÙÜ¿gxª¥Á¥¶¡
+µÁ€_€Ã·²²¶®k·€qsxv}¬¹œº¶£œ··±£€£špy~oc`hm€©opkggkhhš¶Ž²·¶®šplifc`5Sc@BifchiltmlZVthkuoltpWIvtplpopyxtqotutz}z}~zyxoouyyutxyyymD`V?ktym­š
+
+zhdkmpslEbolkommv
+tsvuyuzsxy
+
+
+~~
+±¡¥®ÇËÆŸœº··µ¹µ·ŽŽ±­©§¡~z|zª¹ŽŽ¶±±°­®¬¬­°°§¡¬±²±ŽµµŽ·¶¹·»ŸÁÇÊÐÇ®}v­Ë¥t·°··i­¡ª²~l£š€   §£p£¡š©¥š¥£¡§¥¡š§€¡ sfkqsphmv|lfhvi_d_R yv~lp¥¬Qbd€¡¬£¡gWxÇèåâåæáÜÃÞèêèâÜàÞÞÜÕØÛ×ØÝÕ××ÊÇÈ°ÓÜÐÔÓÕÔ×ÓÙÕÙØØÙØÙÕ¶zocl®¹±°°~­Ÿªi¶º|®®­­u²|sp­¶·Ÿ±€ºœº¬€£y|zkhukš€¥ihlgi €²¶º¶¶®ªyyvytpVSZABmighmooop[Oqkipllqt^Es}zy|}~~}}|zzzyyuipssttvyzucF`U=k
+yyoªš}|khklmqkJ`kkpqlovvutuusvxyv
+~}|
+²€ ¬ÈÆÇœº¹·ºº»¶¶¶¶Ž±ª¥¥|zz~š¶Ž¹²ŽŽ¬®¬®®±ª®©£¡­±Ž²µ²²µ¶º¹º»ÁÈËÎÓÌ®zsµË¥y¹Ã£»¹m­¥ ª¶f¡°§¥¡§§€u§©¬©šš€¥¥š€§¥¥  ¡ufitxohp}}i^k`^`FN€yzly  Rkfš ±£€bfsØéæàåäÛÙÇâæéæáÙâÞÛÛÔÓØØÛÞÓÓ×ÊÊÊ²ÔÜÑÓ×Ô×Õ×ÕÔ×ØÕÕ×ÛàËgdª¡Ž¶€±~šœŽoµœ€zš­­¬p©zh}yªµµºŸ°©œ¶µ¡€p¥¡
+tvk m_^\[_lxª­µ²·º·±ª
+yh?@kloiqosqq`QsmkpsmtsZEsz~~}yyk_Y=d}}tulš¥|
+xgomhmmfLbulmomot
+tqmpqtttyz~~®§ªÆÊÈÂ»ººœ··º²µµ±±­¥¡}|~§µ²µ²¶²±°±²°±®°ªš£
+®Ž¶°µ»·Ÿ»¿ºÂÃÊÊÐÐ×ÑŽ~q¶Ë§y¿Ó¥Žºk°š¡®±¬p °š¬­ª€¥t§€ª¬§§§§§§€€€¥    uigy|oll~tkVdmhQ¡zy\¡vQt l¡§§¶¥lisÄèíæáéåÝ×ÇâéêåâÛáÛÞÜÓ××ÕØÞØÕÜÎÆÄ®ØÛÔÕÕÔÑÑÓÓÕÕØÙÙÙ×ÛÛ}m š¬º¹¡œµv²¿®zªŽ¬¬x²
+vihksš··µº·®¡€Ÿ·¬hxštm vl|dRYV_Shšµµ¶¶¶±ªZ?diqomqutpbNpogtpkpqVAu£V;_tvkªš~~
+
+ygklmopfM`mkoolmxsttuvpsszyx
+
+~~~° §¬ÇÈÇœ»¹¹º¶·µ¹º¹°Ž­€€¡xz}¥·µ²¶µµ¬°®°±²­°§§€
+¬²·µœ»œ¿Ÿ¿ÄÆËÏÐÓ×ÛØ±yu¹Ì£t€Ä×¶Žœo±š¬²°¹²®°®šš©v¥ šš§§§šš¥€€§§€  ¡  xgkxvoii}
+
+~biob`|vWªmM€}u¥€°©oxsÐèèâáæàÙÔÄáèææâÙáàåÝØÕÔÕØÝÜÔÙÐÄÇ¬Óà×ÕÐÕÔÓÓÑ×ÔØØÕÛÜÙÛ¶
+lgy¬ª¿ª¬»¹
+¬Ÿ¬zš»¬±}©mokq¬Ÿœ¶»ŸŽ§§¹²ih`€k¡}`ugWstkch
+Ž··¶°®ukooptqql_Qllmzggoq_Eo~  €£ ~`d~|sx
+q¬š}ykfkmkofMflomlootssspqpsvuxz
+~|¬£€©ËÇÆ¿·¹º»»¶·ºµŽ¶¶­š¬£zxy¥»º·ŽŽŽŽ°°¶±±¬±§§£Ž··º¶»¿Á¿ÆÆËÏÑÑÛÛÝÝ±zu¶Î¥x ÁÛ°­º§t±­­°®¶²°²¬§¡§y§¥§£ª¥§­©€€§€¡  ¡ £ £¡  £tbhvzphi|y_LORZuuU£_V
+l}®š UWs­âëëæäêæÝÕÆâéæêäÙâÞáÜ××Ù×ÜÝÙ××ËÇœ±ÕÝÕ×ÕÕ×ÔØÓÓØÙÙÛØ×ÙÞÌfil®¹±¬€Ž¶®Â­}§»§¹§}is|m}°¶·µµºœµš²§yuizmhiVk®©hciWv~tz
+š° ªŽ©^_cclhllozutisomuuqsbNommsmfqu_8;?;?ADBDMQWZ\ccdiikpszvx|~z
+~ttm¬ª~}vhghklohLcqkomppuokplqmqpuyz|
+}±¥§ÈÇÆ»º¹º¹ºµ®··°·¶¬¡¥yy}¡ºº·¶²Ž¶²¶±°°©®©¥£²¹»º¿ÁÆËÊËÊÐÔ×ÙÝÝÜØ±|tºÎ z·ÐÙ€¹¥¥z§¶ª©¬Žºµ­®°±¥š§£š©šš¥§§§£ªšš§  £¡ £
+cmxvlkl
+}zi`Vbc¡ppv^€S_k ¬££}\i|£áëêåâéâÜÙÎäæéèäÜáÞåÝÔ×Ô×ÝàØÕÛÏÈÄªÔàÕ×ÔÑÓÓÔÐÑÔÔÜÛØÛÛÛÐq\`­š²Ž±°š±t§œ®· ®µqvyy¬¹Ÿœ¶µ¬­ª€²®fbcZp¶|tg°¡zml_hztqxs¡®¡ªQQVQNJLJDBDOctmottxsfSlopylitxmkkhhccbb^b`d^^ZWUVV[SOJLI@HJBBDIFLSQVW^_Y_`
+}pzzhšª
+~
+z
+|ikkllmhHcpmokoms
+tpsppppsovzx
+°£š­ÈÇÈÁ¹¹º·¹¹··¶Ž¶Ž­¥§|yz}§º·ºµ¶Ž²±²±®±­­©§ }Ž·»œ¿ÄÊÌËÎÎÓÕØÜÛÜÝÙµyy»Ç~¹ÏÌ£¿ª©¬º±­±¹±o€Ž€²±š¡š£©¬¥§§¥¥ª¥§£¥¥£ ¡ £¡€vchxyogl€z||kLgspph€€~Mf`£š lb|ÎêëêæáèàÛØÈàæéèäÛÜÜÞÜ×Õ××ÝÝÕÕØÎÈ¿®ÙÞÕÔÓÔ×ÐÓÓÏÕ××Û×ØØÝÙ­s`dy€ªº¬·±gœ²¡œ¥±œz~z°µ·»±¬¥€§š¶¬s_^mWxdz zytipphp­i¥ §®©lpolohkkfkmqismsmuqmdOoslzplquxxvxxyy|yxxz}}}~z}
+zqtuy}yohkhddilgdbZg
+|sxf­ª
+
+|~
+vigolppiQdxopkqluuqputupuquvxz
+}
+°§®ÊÊÆÂ·ºº¹ºœººµ¶µ·°ªªz}y©··µŽŽ¹Ž±±²®­°°ª§¥¶»ÂÃÄËÎÎÑÔÔ×ØÕÜÞááØ±v|»Ì¡u­Ðœ§Ÿ©¥²¶°­µ»fª­¬µ°°£€€©¬¥©š©¡£§€§€€ ¡  ££   ¥|gmz|slm
+vp`Yo¥€mqhu¡kLxy[¡€¥^[hÕèèééâêâÛÓÇàèëæáÛÛÙâÜÙ××ØÞáÙ×ÛÊÊÁ®ÛÑºÆÓÔÓÑÑÕÔÑØ×ØØÙÛÝÙÈddm£Ž ¡ºŽ§f Ä¶x¶­€œyx§²¶¹¶µ­¬¬šª· uvmi`hoyz}f}mhccvp\z§¬§¹ šºš§¡ª§¬pqtokmlqsqsvmpioloxqiJhuqtqmtxxvtpuyz~
+
+
+}}~
+~|
+yzz}~}zxyh¬®xkihppmfHcpspmoks
+totuoqqqoxtz~
+}Ž§¬ËÈÆÁ¹Ÿœ»¶º¹¶µ·Ž·Ž¬§ }x~§Ÿ·¶·¶Ž²±ŽŽ±±­ªª­§»ÁÃÈÊÏÑÑÔÕ××ÜÛÙÞÝÝÛ±xœÌzŽÎºµÃª¬±·±°¶¹s©q©Ž±®§¥£ª§§§¥£šš©§€¡£¡€¡¡   ¡¡£¡}gozzskm}¡¡|VOm£¡hthšhNxm\€š¥ š\o~ÜëëîéâëäÛ×ÌæéêæáØÛÜáÛÕÔÙÕÙáØÔØËÌ»ªÑ¹œËÕÕ×ÔÕÑÕÕÕ×ØÙÝÜÞÛ°ff¥¹¶¡»·±oµ¶|¶¬€¶q€¥²¶±·Ž²»Ÿ»©©¶©}gYYc
+|¡šmypq£}p|p¶Ãœ ¬»Ž­§¥qovqqusqpssqfskoopxsgJmuoxqmvxyyplssptxvxz|}}|y~~z}xx|}~
+
+}~}
+
+zyxylª±
+}
+zfdimlofJ^oilpolqpqqtsqpttpxv|}~®¡¥¬ÇÊÊÃœ¿ºº¶¹¶¹¹œ·¶µ­ª€
+|}}ªŸ»º·¶Ž¶Ž­²ŽŽ±­š¬§œÇÇÊÏÓÕÓØØØÙÛÝÝÝÞÜÜ±z~œÌ }¬ÎØÑËª¶Žº°²·ºsy€g­²°ªª€§¥€§©£š§€©¥¥€ ¡  ¡€£  im}yupm|¡šš§kYRt§ _~bšWS[o~¬mYqÆæîêéæâêäÛ×ËéèëéâÝÛÞàÝÙÕØØÝÝÕÓ×ÎË¿¬¡×µ€ŽÏÕÔÕÓÑÐÔÔÕÕÛÛÛÛÛÆi¥¬­Ÿ·±¹¹}®Žu­±¥¹gtš¡·Žµ­¶¹·»º§­Ž€qt
+qdVNpz}kq
+qu©¹»Ž §²ŽŽkihkikomsvvzkokqoquqf?gtkttpx|v|}zxz|xv
+yy~yzvvz}|~~xuxz~|~zz~||z|uti©¬
+
+~
+
+|lhmpsoiN[moopkpusqsqqpptpuuv}
+°€šÊÊÇÂ¹º¹œ»»»»ºœ··­š©£}š·±¹¶¹¹·¹¹µŽ·°¬©°©ÄÌÏÏÑ×ÕÙÛÛÕÜÜÝàÞÞÞÜ±yÄÈt¥ÓÝØÌ¹¹Ž¶°Ž¹°V|¡­s~®Ž®­©£§¬­©€€£š¥¡¥§¥     io|~vmqt ¥§¥`k[m£€d_¥UW¥^}£y£°Yi}Ÿ×ÞÏËÌÎÎÂ»ŸÁÕÛÞÕÐÓÓÐÛÕÑËËÌÏÜÔÐÑÁœ¹š ×¶€ÂÎÐ×ØÕÔÙÕ×ÙÛÕ×ØÝÂ}q\vµ£» ªºµœ­Žx®±€°zclu¥°µ²±¶···Ÿ»§§¬|ytofmph¡£°§¡z
+~··¹šœŽ¶²šiimlhpqpmpsukmoslmxogBhvovxqutvuvvptz~||z|y||||vzx~~|~yyzzxu|z}~
+||zpzkªª
+}vfblsptkOdsmqsoovssppqsoustxvx|±£§ªËÎÈÄœŸ¹ŸŸ»ºŽ¹·¶·±ªª§y€±ª ¬¹¹¹ŽŽŽµ°°­Ž®ÊÐÐÔÕØÕÙÛÛÛÜÝààÞáàØ²xÁËv¬ÔÞÙÓÇÃ±»¬µ»¡It¥·²¶±±©¡§§ª§šš§§§€£©¥ ¡ €£    ¡¡¡£hpy~vkou€§§YR?m ¡}c` OcN
+ª¬tSk££±Æ­¥©±§ª²µ·¿º°ŸÃ±ÄÑÇº·š¥Á¿ŸŸ¬€¥£ØŽ€²·­®ŸÐÔÔÓÔ×ÙØ××ÙÙÜÔ¬u^k­¡¹¬º°Ç
+¶Ç©s¬¬£u^|€²¹·¶Ž·œ»®®€y ª£}t €|uz}xyubcks}§²œ±ªºŽŽ²©®cgimplmssspvopkqtlvv`Houtvqpxxyytstzvtxxyuzz|~}zuyuy|z|yvyy}}}~zszk©°|~glolmlgN_qpqpqpupqtqosstvtuv||
+²¥§©ÊÈÈÁœœœ»·¹¹¹ºœ·µ±­§¡ofox
+i^p§µ¶²Ž¶²±®¶°ÈÑ×ÔÕÙØÛÜÝÙÝÛÜàáÝàÛ²z}ÁÎx±ÙÛÙÕËÆ ±œ¬°ºE®¶ µœ·Ž§©¡¥¥©ª§©ª©š¥¥§š¡ ££ ¡¡ ¡¡¡€££fpy~xpoy££lV`SzubiyOp 
+Y­§^_yÐÙÌÕÛÔÐÙÜ×Ï»ŽÑÕÑØÌÁÈÆÄÎËÆÁºŸœœ­ª©€ §£×¶®¶°¬€¬ÁÔÔØ×ÙØ×ÙÛØÝÛÔ¬|t_¥§²¶­ªÁ€|ºÃ§|Ž¹uZvy­µ¶··»·»µ­£z¡­¡u~€§š ÄxqyxtUYc}q
+€¡}x¥¶š±¶¶¶š¥£±mkoqqsooolpxpxoqusqZDlvy|sqvv}
+~~
+
+~|}tylª±|hfmimpiOdomqpohmspstuqstqtut}
+
+~}µ¥§šÈÌËÆÃÁÁŸŸŸ»ºœ»»·µª¬[\mzutvsum­·²µµ®±Ÿ²£ÌÔÕØ××ÙÙÙÙÝàÛÜàÞÝÝÛ±tÃËu±ÜÝÜÕÎÄ¥±»²°µxU°²}·ºµŽ£¬£©©©©€¥§ª©§§§¥ ¡£   €€¡£¡¡¡¡ gty|vmozšiUWLvfhuz€mL|fhš¡hp
+°àæàêèâØÛáÝÓÂÄàåáÞÛÓ×ÔÎÏÏÎÎÑ×ËÁµ¶Ž©€¥£Ù°£¡®ª®ÆÓÕÕØÕÕ×ÕÕÙÝà¶olf}¡­§¿€¥Â¬q¬Çµx®¿¡}W~Ž·±±¹µ¿·Ž®£¥¥q©€££xlkdgvo}|mtm
+~ft±¶¹µ·§Žqqqooqospstylmktpp}v_?pzy|vpuy}yzxy|z|~z|
+
+}}~
+
+~
+}}xss}l¡¬²
+}~ikipmtkObmopoqst
+uqsotmotpvsu
+
+~}±š€¥ÆËËÃŸ¿¿œŸœ»¹Ÿ»Ÿœ²¬¬*Ls|shuWRh­Ž²¹²±Ã·¥ÑÕØØÛÛØÜÛÛØÛÞÝÞÜÛáÙ²vÄÊu»ÞÞÞÕÏÇ§²··¶²ozµšg·»¶µ€¬ ¡šš§­¥ª€©§©¥¥©¡¡¡ ¡  ¡ ¡£ ££¡kp}}zpsx€§dV`Ey dlf¡`O
+\q¬©po}ØéäáêêèÞÙÜÕØÌÎàääåÞÛÛÞÜÛÕÕØÙÜÜÔÈÄ®®§¥£ØÃ €­µŸÏÔÔ××ØÙÜÕÙÜÔÈÊÂ~_o¬¶¬£šµ¹t¥¶©|£¹`¶Ž°±»·¶±¹Ž£ptxšª§ ylZ[Micq`URbqx_by~u©²ª±µš¬¡Žuttzxzxvtvzztsoush|yg9myqxxozxxtuyuxuvzz||}~~~~~
+~|
+
+
+||vug­­zlmmlmpgR_lqqpppu
+utoqqspsstux}~|Ž §©ÌÌÈÃÂÁœ¿Á»œ¿µœœº°o4@d|yfNLcxªµ¹Ž²œ» ÓÕÙÙÙÛÛÜÜÝØÝàÞÜÙÞàÜ±xÄÊyŸààÝÙÑÃš²¹ºµŽš°²­ºµ°¬¡©€šš¥¥£š§¥€£§€¡   £ £€££ ¡¥¥fuzmss£sbbY;
+¡_t`¥WVN°`^|¥ÛéåáëééáÕØÑÔÐÕåèäâÞÝàÛàÛ×Ô×ÙÜà×ÌÊ¬  §Ýº£©€§®·Ì×Ô×ÓÔØØ×ØÙÇ¥»¶v`f§§®Žš±±Áµ²£µ£`qv±±²ºŸ¹»Ÿ¹ šq š¥¥ |xv^_[Roy`im[HERhgmmiuvp~|±Ž¬¹pqpptssqttv|lpouql|xh4mutvtuzvuyx~|}}|~}
+||}zyy~l ¬±
+}fgfloslO`olpppopxtqqsxtsust|}~}®¡§ËÐËÄ¿»¿ÁŸ»»¿œœ¿·
+R47'7dvz~zb=Ufg}~u°²¹²ÁÂ¡ÓØÛÝÙÛÝÜÜÛÛÛÜÜàÜÞÝÜ²yÄËxœâÞÛ×ÎÄªµ·¶¹¶µ°®Ž±°ª­°­±­€¥¥©ª§ššš©¥§š€  ¡€¡ ¡£¡ ¥£¡£€dq}qmv€ mbfgB bt[£LcxN§¡cov©ÛííâîêéÝÙÓÊÌÑÕäåâÜÛÜáÜâÙØØ×ÜÝÝÙÊÂ§ §¡šØª¬µš±¿Ð×ÕÕÓØØÙÙÝÛ¿€~||Ž¥¶£º­ÁŽµœ©Zxvy²µ±±¶¶º»¹ §~ šusH[bh``pty}mbi
+
+®ÃÊ¡h_šœ®µvyt|yv|xvt|smpyps}u;ltuyvsy|xsssttxxvvuuvxvt|v
+
+
+~~}}~|~ztl£­°
+kgfmmmgO_mqpppqyyomstmppvt|
+~|¬ §ÏÏÌÂŸÁ¿Ÿ¿»»»œœŸ±uYA&0VV;0BZIdzmgkikoxty·¶±Ã¹£ÐÛØÜ××ÛÙÙÛÝÜÝàÞàÝàÜ±xÄÈyœÞÕÓÑÊÁšŽ¹··²­©§±¬­¡¡€£š¡§ªš§©§š¥¥š¡¡€   ¡ ¥ £¡  ¡¥¡ 
+cs|z|qpo£t^^fMQ Z\¥zHgx`ªyfxzœæëèàëéäÝØØÏÐÌÔáàÞÛÞÕÞÜâÝÜÙÜØÜÜØÏÄ±¡©ÛªÂÕÓØÕÕØ××ÝâÓ®
+}m°º§¶©§Âš²·~º€Yvspš®š¥®¶œÃŸ©€y¡€¡|}_D=JZmkq`\\gi^s£ygdu¡š€²ommspoqomkkzstxvooyzm0hpuyvt~vvuvutxux||z~}}tv
+|y}|}zy}|xxv}uxy}yzxx}~|~zvt}l ®±~
+|pilmpliM_hoqqoszupssuqqqs|z
+~~u¬££¡ÊËÌÇÁÄÁÁŸ»œœ¿Ÿœuyt`\SoxtmlcRE@8Fg~ppsy|°¹ŽÄŸ£ÓØÙÙØ×ØÜÛÞÜÜÞÝÙÝÞàÜ¶qÆËxºÔÌÇÇÂ»§­±µŽ¬ª¥ 
+©¡ªªª€¡š¥©š¥€§š    £ £€£  ¡¡£¡
+fs~zqmoysVZoR_W~hqJzWv `d¿ååáÞèäàØ×ÔÌÇÈÕâáÜØ×ØÞáâÝÜÙÑÏÑÓ×ÊÃŽ§ šÝ¹ € €Â×Õ×ÙÜØØ×ÝÕ¶pif©¬±²®± Á°}®œ}¹¡š¥d|z©ª€©®·Ä¶x
+¬¡u¡§£k_ZlLN8mu\`mb\tfdvquq~
+sfv·oklhhlilqpmvuoovpkvym.guqxvuyzut
+
+
+}}~uvxvz~zz}yxs}l£±¶
+|igkilphN\mqmopmsxtxpqpstv}
+}
+}yt¬ÈÎËÄÁÃŸ»Ÿ»Â¿Ÿ¿»Wlk}o`xs`I
+Jltshy··ÆÁÎ×ØØÙÜÜØÙÛ×ÛÛÙÞÜàÝÛ²tÊÇu·ÎÇÄÂ»µ€ª­®¶¬§ }®¡š©¬ª§š¡š§š€€€   €¡ ££ £  €§¥bm|}zump}yui^bpZbZidE
+IS`ÎææåâÞááÜÓÑÔÊÊÆ×áÜ×ÙÝÙÝÝàÜÜÙÌŸ¿ÇÊÎÁ°£¥£§Ù§©ÆÙÕØÔÙÙÜÜÛË}c^y¥£Ž®Ÿœ·}ª¿£t¶¬­Ÿd|
+z¡²²¬§µÆ»°¥¥€if|Q7QN` yQm¹htpfl|l€gs
+¶
+|}y}}|soxusuxm0ivsyut||l@y  
+}zvuxm¡š²~
+}hgkmkqlMbppoplsstqtuptvuy|
+~~}vm¬ÌÇÈÈ¿ŸÂ»œ»ŸœŸ¿¿p?V[l^ª©ª§
+|mR/?Wdi
+tvŽºËÁ ÕÙÙ××ÜÞÛÝÛÙÜÛÜÜÝÝàÝ²uÇËu¶ÆÂ¿Ã¶¶££€ª­®¥~~ª§§§­¥€š¥¥¥¥€¥£¡¡€€¡ ¡¡£€€fpz~|tutyopiqfgglu`pqVM
+S|xZtÑæåâÞÜæàÙÐÑØËÎÊ×ÞØÕÙÜÛàÞâàÝÛÈºÁÎÄÆÊ®°§§Ü©
+¥ŸÏ××Õ×ÛÜÜÞÔŸ}z
+hhk¥µ¬Ÿ£¶Ä¡¿¬y±²¶t~
+xµ¹°°²»¶š€ |hfoxE;tzugU^·
+gqhkfd ±~dx~°vsttlpui3l|xuuovxo@dWNLU\^YUYY```[b_gcffbcdfd`dcfhhgilhmpgkfhv|}}tyo€°µvkgpposmMbpmotpissqqsuutv||~
+}~ulª¡ÌÎÈÆÁÂÂŸ¿ÁÁŸ¿Âºh<E_df¶²°²©~slks¡µq²µÊÁ ÕÙØÔÙÜÛÛÞÝÜÛÝÜÜÝäàÝ¶yÄÇy¹ÆÁœ·º·§šª±¬§£z|ª š¬š¬§¥¡£¥ š¥§¡   ¥¡¡¡¡ €¡¡fp~}qlsmiccmmddklif|xL`mi€±€hb²ÛâáÞÛÞáÞÕÏÓÓÐÊÆÓÛÕÓØàÞâÞààÛÛÐ»ÌÊËœŸ¬®ª© ­Ûªoo
+¥ÆÕÙ×ÕÙÞÞÜÜ×·vucb±­²¬šœÃ¶y°¶Žb¥»¹µ°Ž¹¡®± fqlfRbbZ
+s|R^gkkihbf^l®©gbd}p§tJQSNROVVWVW`ystytosvo.hzsuvsv|vAcO.07/359494837<7<?59/373;99=<5;;<9;=;25<\p||zuu|oš©µ
+yhihmlpkO[ipqomtsvupuyxqu~z
+}vpi¬ÌËÇÆÁÃÃÃÂÄŸ¿ÁÃ»d(5Ygt­²ªšª »È¥tª¹Ê¿¡ÑØÛØ×ÞÛÙÝÙÝÞÝÜÜÞààÜ²yÃÈ
+ÃÃ¹»»µ­ ¡­°°§ztx}©š§§©§£šš£§¥¡£ª  £€  ¡ £ £
+ip|z}oolboc\W\V`kfz[vBuY}x¬¥~Zb~·áÛÛÙÜÛåÛÔÊÑÓÎÌÁÔÝÙÔØÞÜÝÙÞÙÛÝÐŸÈÐÆºœ¬­±©¡ ®Û€
+¥­ÄÔÙÛÙÛÜÛÜÛÑ°m
+f_yš®­§­ ÁÃœ~
+®Áµl|·Ÿ»²±© šª¬q`8=fhigZbNZc\cgcO^Wps go~ª}p£x<7834B@A?;<Yytuytttvq/h}tzuvxvDbWDMNOQOFMNNRZUNLQQMRNRRSZW\VZRVNRMZVE<RI[ozy}yxv~t©°¶ 
+
+olkmopmQ\mqqoqlp
+utxvvvz}~z|}yqi¬§£ËÏÇÈÄÄ¿ÂÃŸœÂŸÃ·[
+0Ig¥¥€£§£
+²¿²
+­»ÆÁÑÙÜÙÕÛØÜÝÛØÜÞÛàÞÝÞÝºuÇÈÆ¿²°­¥§¬Ž§ xtkpª€©£¥§š€š€€€š§§   ¡€¡¡£ ds|~zpodh}hMYcbklZZmLOyšqmmËâáÝÛØÞá×ÔÌÕ×ÎÏÇÐÜÕ×ÞÜÛàÜâÞÜÙÌ»ÈÓÆÇÇ¹œ®€ £°Ù~šš°ÑÙÙÛÕÙÙÜÛÏ¿ªkb[o®¥Â ­Âš}·Äy µ²š
+¡z`šÈ»Â¹¡­±£
+lOv}UdUJJO[`fglIH_Qb|~tgª}mo€SOONQUVU[YD^xsqvvspzx/l|vxxsv~yEd\NRSSMMLUUUWVZVSYWZZW[^\db_ZZ[YU^[_[OWcDOoyxzxyxu£®¹¡
+}kkhlmplS`lpsmqms
+ymxyuuz
+~}zob©ÊÎÎÊÃÂ¿ÈÃÁŸ¿ÂÂ¹Z
+
+/Yz¡£¡ ~
+§¶µ¶»ÈÇ£ÐÛÛØ×ÛÛÜÝÜÛÝÞÞÜÝÞàÝ·xÊÈyŸ±ªš£z š¥soikhv­¥¥ªª£€©§¥€£§©§¡  ££§¬ŽŸ²¥£¡ft}vpqfc`hkk}txqSbcQo_¥_y×äÞÜÜÙÜÝØÔÎÔØÔÓÈÑÛÛÛáÞÙàÝà×ÑÌÊ¿ÈÐÊÄÈºº¶©±à¥§²¡£Ž »Ñ×ÔÛÝÝàÜÝÑ·£¡u`_¬£º©²¥±²sªœvŽ±€£DYx
+Ÿ»Ÿº ·ª k¥zš¡qpOS_FH`iRSLLFL\_šomuª£QUZ[W\Q\fY=_tqtttopzy/c|vvzs||z@bvyv}yyuuvy|yx|utststuqmmvtqpuuquumckHRgFRszzz~zs€®¶€~lhkkmpoU\mupmoqqxpuvxvx}~zpfg§ÌÏÎÊÄ¿ÄÃÁÁÂ¿ÆÃÁl!?k}¡ª¹±µŸËÁ£ÓÙÙÛÛÜÛÛÝÜÛÝÝÞÝÜÞàÝ¹yËÆ
+Áª¡ tho~vhgfc`y¬€§§§¥€š¥§¥¥€¥€¡¡££­ÃÎÕÕÔÛÝÕÎºª  _s}~tpslbShYsyxttW|t€RbVpz¡sLbyÓÞÜÝÜÛÛÛÙÐËÓØÑÐÈÓÝÛÞäÝÛàÙÛÐÔÎÇ¬ÃÌœ²œ®©ªš²Ü®¥Æ¿©¶ÐÎÕÙÛÙÂÈØÙÏáØÇ²šs_cv©²±µ²­¶· i°®°|€SD|§¿Á·¥¶ª¥£bf_®­qs\JkW<R[DEIUROQsÂŸmmo£§²ªomuomo[Ic`?bymsxuqstv4cysvyvt~u@cv}uututtvvz|zzyxzzyvzzxxzzy~|~qsOWgFWuyvzzxzy§°·¥|ikgkouqSZmppmsut|vtuyuz~}~zpgc¥ÌÌËÇÄÃÁÁÁÃÄÁÂÁÂi&(=`|£¥
+ª¶Ž±º»ÇÁ ÏØÛÙÜÙÜÜÝÛÙÛÛÝÝÜààÝ»|ÇÊ
+Ÿ°~qdlpxytcZ^Z\[zš£­¥š©¥€¥§€¥€¡  €¡£¥ ¿ËËÈÐÎÓÔÕÝáéäÔ¶£~`x}slmpiZguJ|zuxy^i§HmO
+~¡`Zps±ÝÝÞáàÛÜÙÕ×ÌØØÑÓÊÓá×ÝáÛÜáØÑÇÇŸŸ»ÊÊÂŽŽª©š€®Õ€ŸÙÓºÄÙØØÛØÕ­¡Ž°šÕàÝ×Ëº¡sc[k§ªµ©· ¿¶£p¶­»¹ªbAx
+z¹¹º±¡®·²©sfu}ogts`U[\`WMS[z¥°mo­¬£qouxzudJb_@_zpvxtvov|9hyvzyss|vD\zxtyxxy|~}}~yxvxyx|~~zz}|}~
+plIRhEOqtxyzyzq§ª·¥|mhlhilmWZqspqooo|tvxv|}tqb_©¡ÊÐÎÇÄÆÆÂÃÁÂÆÆÃÁk*;@M}¡€|z~|~ŸŸÎÃ¡ÓØÙÛÝÜÙÝÜÛÜÝÜÛÝÝàáÝµzËÊx±€yk_[`gosmfWVQRQMUv§€§š€§§š¡€£€ª£§¡ ££  €€ÂÌÓÎÊÂ»œÇÎÆÏÕæâÛÐct|tpophttx\vpsqxm`b¡|F||^§ _kkÆäÝÝÜÕØÝÝÓÕÏØÛÐÐË×ÜÝÜÜÜÛÝÎÇÃÃŸ··ËÄ¹²œ²¬š§£±Ø¥ÄØ×ÂºÓ×ÛÏ­Ê¡¡ÑÝàÛÕŸªpdd œ­¹¶©Áªpº®®Áµ¶mLtt}šÁÁ°¬ºŽ¡¥ 
+}|
+
+|}mlp`Wgtogbmuª}k£§»£¡xxuzzyvcH^UB_qqtuvvmxz5kyxxqq~zI\yz`lISkDUuxvvvxy
+tª°º£|kkhimsmRZsqpkqqt
+xsvu|~}
+~qldgš¡¡ÊÏÊÊÃÃÁÁÃÃÄÁÄÃÄHYFY€i\MDBIUmxhVE;OtŸŸÏÄ£ÔÛÛÙÙÛÛÜÞàÞÜÞÝÝÞÞáà·|ËÆv­yhc_`miffZONNLMENxª¡¬ª©©§©¥§§€š§š¡£ ¡§€®œÃÌÐÌËÁ»·ÇËÂÂÊ×ÝààÑty~stsh[lukyq|syooWgV`všof}¿âÝÛØÜÔÓ××ÓÔÐØÕÎÑÇÐÜÞÞÜÙÜØÇÊÌÄÃœŸÃÆœœœ§š¥§ ²Ù±ÁÊÃ¬®Ð×ÔÔÇÊš°ÌÝàÞàÞÏ¹§vkfz¡¶µ¹¥­±œ°sµ¹§Ã¹»}Iz
+ssµ»²¡¡¡£§~
+q|cRflossmoy
+ck
+ml}¥µŽ©qvz`D\SBZqqpztuo~x;dvyuqs~zM^slAssIUkHUxx|||v}s©©º¥
+}lkmlqokY[pumsuqt
+}uuz
+~ymihf­£ ÌÏÎÊÃÆÃÃÇÁÃÁÃÁÄ€zg^|tkf_M97U|L87Q_¡¿¿ÊÂÑÕÔÙÙÙÝÛÜÛÜÝàÞÞÞÝÝÞ¹}ÏÆz°qf`_dmmkfYWSUIQUVyš§šš©§¡¥£¥§ªš¥£ £¡   ¡£¹Õ×ÔÊÄÊÊÃ¿µœÂ¶¶ºÁÁÌ×ÛËzvppkci|zuutzhz[YkM§¥\t}ÓæÜÜØ×ÙÕØÛÔÎÑÕØÌÐÄÕÜÝá×ÙÞØÄÓÊÇŸµÁÄ¿µµ²£ §¡µØ¬¬š¥ÊËÏÈ©ÃÑ±¶ÎÏ×àááÞâÔÂ©scc©°œœµ¬º·º|©©µ¬¿~Lzz}yz
+£œš
+|m
+¥ª­š¡|~moYFlp~|xoFlšphu€Žµ§€vxyfBYV8\qoq~yxu}y5huyypu}I[um4ZN~x}z|}y|ypMQhFNty}|yzxs­­»¬qhlpsqoUZpppspmtypsx||}zqifi©  ÊÐÎÆÂÆÇÃÄÄÄÃÂÃÃdq^ltMO?^__fts¥Â¿ÆÃÏÙÛØÙÛàÝÝÜÞÜÞÞÞÞÞÝÞºzÏÄ}°
+~yvh^^fgquofd_`[\Z\z§¥š¬ª¥š§š¡€¥¥£¥ €¡ ¡ ŽÁÏ×ÓÄœ»ÁÂÆÄº·Ÿ¶¹µª¶ºÄÓÙÇmplidy}xyqzddOp|[
+§€}VokÊáÝ×ÙÕ×ÑÔØÕÓÓÛØÌÑÎÔáÞÞ×ÔØØÃÐÊÈÂ·œÈÂÂº²¥ŽÙ¡²·£»ÔÕŽ¡²ºÄ€»ÜàÝÝåäâØÆ§mcc€¡ÁŽ»¥º°º|ª­±šÆLszt®£š§¬¬ª¡z
+~xu~llštOM;Umgk~œ£££youo|htvux|xsEYS9\ohpxv}y~|@d|yuzux}|IWtg2`N~y
+
+
+y~}z|}yxzqLHfAQszzz||xv®±œª~iikkmqtWVttsooquztqy~~vogff§€£ÊÑËÇÆÆÊÂÃÄÆÄÂÇÄx£~~k`|`i²ŸÂ»ÊÆ Ð×Õ×ØÜÛÜÛÛÛÜÜÞÞÜÝÞÞº}ÌÃ|®zu~VYbgoqsmh__^ZV§¥ª§š§§š¥££š€¡€¡€¡¥²Ÿ·ÂÌÐÐÓÑÎÎÌÃÃŸŽŽµ±£§°·ŸÇÓÂ~sgVQf
+x|y\kuvW~_sxšh^t~ŽÛÞÛÝÝÎÕÕÔØÕÓÓÙ×ÎÏËÕáâÜÕÏÑÕÊÌÇÇÁ¿·ÇÇ¿Ÿ»£ §¡¹Õš­¥·ÇÁ§µÕÈÕáâàáÞÇ¬vd_m£¹®­¡º©Äp¡²­£ÃVqzt
+ 
+š©š©€tv®€|}z~Ž©l^QSio¹€}x~}xftuptxvmH[R7\pmox|xx}7m}~|~y}}xFZto4\V~zx~
+~
+
+}y}~|}vuumJLgFRsyyz|vvvš®¹€~mbimqsoW_mpspmqtzqvy|~|
+
+tmggbš£ÈÑÊÌÆÆÄŸÄÄÂÄÈÄÁxu~¡€££ xhf~ ©
+}¡¿ÁÁÂË¿¡ÐØÙØÛØÛÜÙÜÜÜÜÜÜÜÜÞà»ËÄy¶ª£zOQNWcksystkbVQ|§¥š¥š¥£©£€€¥££€    £©²²±ÂÏÔÊÇÆÇÏÐÂŸ±§²¥­±œÄÈÓ²ukg\dv|}xyl[fh}L
+v¡YcÓáÛÙÝÜ×ÐÓÙÙÕØÑÕ×ÎÎÄÔààÛËÄÇËÊÔÌÆÂÁºÊÈÇÁ¶©§¿Ô€š 
+¬×ààáÞàÕÆ²R`¥¶º·š·° Ä¡h·­Ä¡Yiz­­ ux©_d}thovvxy|ÈÂ~|WW^sŽ z
+£®pvtttqpF\V5Vvkmxvx~z?cy||zu}yJUsm9[V}x}
+
+}~
+~|uxxoQIfFMsx|y||­°¹­}pgimoupR\posuqmq~qvvz~~~
+~~qkphb§§ËÎÎÎÊÆÃÄÁÃÃÃÂÃÁ~U€ šª¡}ª±º©©ÃŸÂÃÈŸÎØÕÕÙÜÛÙÛÙÛÛÙÙÛÜÜÝÙ¹|ËÄv¶©u~xYUOU_kuzyypkfUz§©§¬¥ªª€¥€¥£š©€£¡¡    £§­±¹ÁÇœ»»Ÿ°±¬±€¡©µ¹ÁÏËpp\LVm~zoq\\xuQx|yiWf
+ÈáÝÙ×ÜØÕÓ×ÞÜÕ×ÐÛÏÈÓÌÞááØ»¿ÈÃÇÏËÌÇÊ¶ÇÈÂ··¡¬€£µÑ~
+qiz¹Ê»ÑáÝáÞàÝäÞØ·xU[€§œ¹±µ·Æ¬hºŽÄ®cb ~uz­¬ ¬¥£zpuk[to
+¬²[Lf}¥¡ªºvo€ ®¹Ÿ±šlssqtshLgV7Uskktxz|zz8cyv||sy}QUts=^Q}v
+
+
+
+|}~
+zzvoOOf=Otzy~~zv©²Ÿ¬~}mhhplqqU\uspslsqzmuvvz~~}umifcš£ËÏÑËÇÄÁÇÄÆÇÆÃÃÁ¬k €¬ œ°¹Á¶¿¿ÊÃÑ×ÔÙÕ×Õ×ÙÙØÙÙ×ÕÙÙØØºyÈ¿®¡q`^\UYWYckkc`\SRO¬§©ªš€¥š¥££€¥§¥ £¡¡£¡ªªŽ¬¥©­¬š¡§©pkx¬¿ÄºÈÂtidd`o|uplxWWd_yyYpzÝàÙÙØÕ×ÓÏÑáØÔØÏØÓÈÐÏÝáÜÓœÂÈ»ËÑÊËÑÌœÌÆŸŽ¬ ¥©€¡œÐyh_||k~ÂÜÙÛ×ÔáâáâáåÆS\p µµºœÂµi·±ª»µp\§¥|mvztz©±ª ­¬š£€yftofxzszÙ `k€°œÁÂlp©¬§²¥u§uxqsquqA\Y2Qustux}y}|@hyv|~u}~zUQvs9`N
+z
+
+
+~|}}}}~~y~sRLcBMq}y~zy~vª°¿¬}mdoolqt\Yqqqquotzsszxz~
+~
+vkigb©¥¡ÇËÐÊÃÂÇÄÂÄÆÃÆÆœœ
+~š®µ®¿¿ÆÂÐØÕ××ÓÓÓÕØØØ×ÕÕØØ×Ø¹}Ê»
+
+±
+p^\g[\[VVURJH=A<By§§¬§š©š©§§§€©§¡  ¡££€¡¡ Ž¹µ­¥t@J_mu²ÊÇŸ¶zsmhizztqhco`
+Eh©|Vkz¥ÛÜ×ÓÙØÕÓÓÏØ×ÔÑÓ×ÔÇÔÑÕÞÙ×ÈÈÇ¿ÆÏÑËÓÑÄÈÁŽ¶¶ ª©§£œÐst~xÄàÊ­©ºÐÜÜáäæá§i^dª®±±ª¶q°š®±¿ºy` ªx}q­¬£€££®
+tq
+|mqhlk²uop§­­ÁÃÆÄsk§ ·tttptpmF^V4Vtqmux}||xA[x}z}ty~RNsh4`I~
+
+|}}xsyqNMdENu~zz|­ŽÁ¬
+tmmioqp[Yommqooozquyuv|~}sklkg¥ª ÈÎÎÌÆÄÃÁÄÇÄÁÃÂÃ¿±}mzvluo| ¬ªœÁÆŸÎÔÔÓÙÓÐÏÕÔÕÔ×ØÔÕÔÕÔºÂœªi\``YWUQNADFA?EAD}§§š§¥€€§¡€¥¥¥€¥     ªšxz~pqzE28Zi|ÈÌºšvtbM[x}vt}duubss=t šfulÂÞÜ×ÕÓÕ×ÕÔÐÛØØÔÑÏÑÄÑÌÛÝÙÙÑËÆÄÃÂÏÑÐÈ¹Ïºš­®¡§§ŸÐ~
+
+|
+}ÆÞÐ€µÌØÛáåæé»
+fky¡º°§§¥¥µ~o°²ª·qµœS­|uym¥¥¥°¬§°mzluy~~qloxµ»­»ÆÄœso~ ¬©ŸqsmqztiFZV7[vqmvzy|tAWy}z}qx
+|NQtl=`H
+~
+}xy}
+||vsNLdFJp~}}|u~°²Â­
+~ohloosqYZpqpqtosxtzuuv
+}}
+slhib£ª ÇÑÐÎÇÆÂÆÃÄÃÄÄÇÃÁœš}}iœ€š¬¿»ÄÂÈÓÓÐÕÐÓÏÑÑÓÑÓÑÓÕÔÓÓ·Á¹~šyibYY[Y\VMDI@BE@EJ©€ªš§§§¥©£¡ ¡š¡
+¡€££££uuxoqbku^`BQi·Ê°|slUZ
+yv|`f~W
+lW§
+Y~fÁ¹¹ÈÈŸ¿¿Â»ÄÎËÈËÄÆ¿µÈÄØÕÔÓËÈÆÈÈÈÎÓÊÐÆÏÌÄ¹²š©©©¡ ¿×zsl}zyz~ÌâÏ²š»µœÆÜÛååà©oqiš£Ç°Ž£§»dª»·mŽÂS²°¬€vptq`m£©¬©§£}pu^osvlqbipt\Ç§·Ž®¿Æœ­¥  µ²­ª¿uuppppmE_c;Vzqiuz~x@Mtyx|tyVOpo;`Fz~
+
+
+
+|}~}|zxQNdHJpzt|®®Ã­ ~phkkostZUqsmpqsq}mvyy}
+}
+
+}
+mkigf§¬¡ÇÓÎÊÈÆÃÄÆÂÁÆÂÁÃÂÂ±l¹º¶¥±Ÿ»Ã¿ÆÑÎÐÏÎÓÏÐÎÑÏÓÐÌÌÎÏÏ²}ºŽ}£~xmh\UU[fZRIFAB@JSNššššš§§§§£¡¡¡¡§
+ £¡£ zi^upb^tf^stov}uzg_l£­ ©£}td\hzzxmcz`Zf}£}b[sz§·ª ºŸŽ¶­®šµÂ¶²ºº»­ œÁÁ·œœ¹ŽÆ¿¿ÌÓÎÇÈ·ÃÊÆÁŸ¥ ©¿Õqo~olyuztozqt¥¶Æµ¡©°»µÙæèÇkZš¶·œ€²µg§»»s¬ŸOŽŽ²£go}gguu¬Ž €£l\
+xu~p|c£š»ÆÁŸ² š¿¶ºŸœŸŽ®ÂtuopssmI[Y4Rytlvx~}z=Os|~ty}YJpl4\I}
+
+
+}x|~y}vuQFdDEpzx®®Ã­oifsuoq\Voqmptqpzqtux|}
+
+}~}
+mkhd` ¬ÃÎËËÇÇÊÊÄÄÇÃÄÃÃÃŸµ®©
+
+ª£€²º»œºÂÎËÎÏÏÎÐÑÌÎÌËÎËÌÌËÏº~·¶¥~u|}qi[^^fifVRJQSVYZZš¬£ššš§££§š§£ª€¥¡£ €¥t__plbccldmfv¡©­~p`WI
+|q|^mmLxz
+£¡
+zWipÊØÐËÁÊÊÏÂÈÂ¿ÁÇÈÄÈÆÄÂÆ»¶ÁÆÇ¿šµ®š¹Ÿœ»°¥§·µ²© ¥ª£ÁÔsfvpuvmutsukx¡£¬¡¶äåèŽuZtx¥ ®Ÿ·¡¶°©`¹·~¹Lº·© §¥
+ib_o|~§®­ qf
+qot¬·¶ÂÇÄº²£¬Ÿ¶œ»¿º¶®ÃvtmvumgE`^3QummuxzsyyELv|v~y|
+`LolA[Jz
+
+~
+}|~}}||vqVJhHIpz|­²ÃŽ
+}oilmqoq^Wmmpupqt}szuxy
+
+
+mmmhd¡ªÈÐÐÌÇËÈÆÆÇÄÇÃÆÃÇŸŽ®€}
+tztcYNSqcy ¶ŸŸ»¹ŸÊËÈËÇËÎÊÇÆÈÆÈÄÈÇÈÄµ}º±ª
+|xlfbdkhb[\VQRW[[d
+š¥§§©©š¡§£¡¥§££  ¡  £€tb_~ovyq|gcu|~©¬¬¬®|vfUWyg|~lduoO
+x¥o^hy©ÜáÛÔÈÈËÐÐÝ×ÈÏÈÓÈÇÑÎÇÄÁË×ÌÌÄŽ¶®š°Ž ±Ž²ª £§£€Ÿ²£€¿Ñ|~qv|stqzvpv®¥¡®©Áœœàæéå®flk§²±§Ž¥¬¶g°²·N
+º¿µª£­tqfohys¬·²ªu~¥¬tshgl§ŽŸ²ÄÄŸ¹Ž¡©œ¹¿Âº¿µ­ÂtstttklB\\2Vsqoytvu~yFSz}u|u|`Ssk;UD~}~z|}
+
+|||yzlYHbLAs
+}ª°Ã°ohkpptv_\smsmpqs}uvysv~
+
+}~
+pokkdšÇÓÏÏÊÆÊÈËÃÈÇÊÄÄÃ¿µ­¡pq~
+vop£ºº¹µ¹ÂÆÈÄÊÈÈÇÊÇÃÆÆÇÃÄÄÈÇ¶~¶­}£vsm`WVYYQVWUWY\\gg
+¥§¥¥€€¥¥§¥€š¥§¡  £€ € ~v
+vs}®±± ¬§£
+}oZhyqYyv}b
+\g€
+bc}ÄÞÝÜÜÕÐÔÓÓ×Û×ÛÏ×Ñ×ÕÑÇÌÊ×ÜÙÔÇÃŸ·º¿¶°°ÃÄÈºŽ®µ£­¬©¿Îstpxtdu}§®§£Â¶»áéé¶mkt©­®·¬ª©·o¶©Ÿ¬S|·Ã¿¶­­€vl^ho`}¥® ŽÁ·µh`b pl ÁÃ»º·±šº»Â¿ºÂ°­Ävqptymh?b[7Qxystszu|u<Wzxtxmu~WOvo4SF}}}y|~
+|z~}||}t[F_IDs
+~|¬°Â·phkmoou_Zmqqtqut}mtyzx~~skid_©ÇÕÐÎÇÈÈÆÇÆÆÄÈÆÃÄÁŽ­}~x
+zfUNW~©Áœ¿·µ»ÃÆÆÈÆÇÄŸÁÂÃ¿ÄÁÂÄÄÇŽ
+®­¥~smbRNQLHIILMOSRZch£¥š§ §€¡£ ¡¥¥§¡
+ ¡££   q®­­š±š€¡~qUk
+xvU|xmF}£sbpkšÕàÜÜÛÛÔÐÐÔÔÕÛÛÕ×ÔÔÑÐÃÕÆÙâÙØËÁÂÆÇÄÇÂ·»¿ËÆÈÁÄ¥§§£ ŸÈm
+
+±©ŽÄèéåÂt[tq§¡­²»€µ¿y·°€ÊªZ|ºÈÁÌºŽªuY| £°º°°špu}yuxš¬§µ±¬ªŸ»·Ÿ»œ±°¿sstoxpiB_\5Ryvsvsyzzt8Y}yz}qpzZIvs<UE}
+
+z~x|
+~|~}|y~u^AZHDq}®¶Ãµ 
+qhflptu^Ylpsqttszsvtzv}
+vgidc­ÃÑÎÌÇÊÈÇÄÆÃÄÈÇÆÇÁ¶°¡}}z||p^`gq€²ŸŸºŽŽ»ÁœÁÂÆÂÃ¿ŸÆÂÁÁŸÁÃÁÂµ±²€xvxyxui\YHB=@@@@FJJFMW`¡§©©€¥£ €§€£§€£¡¡£ghgv||~®¬ €¬® pNhuU|i}}O
+¥
+^\b}·ÕáÝØÝÙÓÑÑÐÓÕØÑËÕÓÕÓÑÌØÐÛáÛØËÃËÊÆÂºÃÃµºÄÑÊÁ»¡€¥£ ÃÆvšŽ¬­¬ŽÈ¹€}||œÆÔæèêéå±qdtš¡»¶©²µqŽ¡š·¿¶bm¹ÆŽ¿°¶±vµ»š­l`^\YZ[ZZbfx
+}plgpx~phmyyokiikt
+¬±Ÿuqqpxlk9Zb=Rzxsxsux|vId||xysq~|ZJvvES@~t
+
+|z}|
+~|y~v\B\LDm®±Ã· olimktybRiputmtt|muuxu~~
+qlhddªÃÏÐÏÈÎÊÈÆÆÊÆÆÂÇÂÂ¶ŽŽuuux|²¹ªŸœœº±®»ÁºœÃÁœÁÃÁÂ¿¹ºœº¹œÂ±}¶­vusutmgWVJHAFIDEDDFHJNU~¥¥š§¥€€€€ ¥¡££š ¡  ^HEQiszso^ffgtx|||ª©§
+tUcz}y
+~\vitY~QkyÃÔàÜÜÜÜ×ÑÐÐÓÑÝáØØÑÑÕÐÊÐÌÙÜÛ×ÐÓÐÂ»¹²ÂÌÆ¹ÃÄÇÇÁš¥¥  ¡»Ïxu
+
+  ±Ÿ¥§ÌÁµ v²ÌÜèéåÕÌs£»²²®ªk±£°·¹hkŽŸÁµ­­ª­±Ž°§§YRZ[ZY^dgqx}tpv~xu§
+tf_cgq¬µœoxossfk7\b9Rtxtssuv|zHRzyyvpv~~`LzyHWHv~s|
+z}|~}~~||u`DZJFl­µÄµ mkmiout[Ulstqquozqvtsv|
+slhgd­ÆÐÐÌÊÇÈÈÊÄÈËÇÆÃÄŸ·Ð×
+qppoox
+¬ºÁœœ¶²µµ»»»ŸºŸºŸœŸŸœºººœÁÂŽ±ª£   £¡¥ £§§¡ €¥¡€¡¡¡  €¡£H=BYYkicM[R\W__oti£ª
+tYfl~xhl|gkliW`zÇÓÝÞÜÝÜÕÔÎÏÓÐÝâÕÔÌÑÕÐÈÛËÙÞÛ×ØÕÏœœŽ²ŸÆœ±ÇÇËÆµ¡¥§   ÁÊogoik~~ ©Î£Ž|vo
+©ªÄàèæâÆ¹€pol  ŽÁœª© ¥b£¬¶
+·»p`¬Â¿º·µ 
+°»ŽŽ\W[_[Y^cgo~zttu£€~stšvccbhy©ŽÁmttmphhB`d;F|zvutuvzLMxxyztv~^JztD[D}z~
+
+x|x}}
+z||u_=\OBl°®Ä¶¥phkkoso_Zqtqpoppzovxxz
+
+yqigb­ÄÑÑÎÊÇÇÈÈÄÊÆÊÆÈÄÃµÔò¬|lhifmvy}pi\gbkœº¿Ÿ»²®µ¿¿œ»Áœ·»º»»Ÿœ¹ºœºŸ²}Žª
+¶ÏÕÛÝÝáÛÔÇ¹µ¹­šªª©š¬ª€§©£ €š¥¥§¥ ¡ €§££ ¡¡
+
+yvd[hfq[ZLdsivs¥u^bgsy}c|
+kfy}U`ªœËÕÛÛØØÜØÓÑÓÕÑÝáÕÙÔÏ×ÕËÔÇÙáÙÔÔÜÎÁÎÆÁœÇÆ»ÌÃÃÌ»€£š¡¡¿Ïxfippp©€£ ±»©©··¡£­Á¿œÈ»¥qyd€­Ç¹­® ±h µ»±¶y^šÈ¿Ã¿¹®qt¶¹­¥·_[bY\_d_hp~ztxv€uq~¡qhclmušµœquopohm?[g<JzxyyxsvzUDyz|uv~_H}|JWIvvv}
+zz}}|y}y||u_B_QFs
+ª°Ãœ qlhiptqcWsssqstq
+|outpx~
+
+yoibb±ÃÐÎÌÊÊËÈÊÈÈÈÈÄÄÇÂÎöåzxog`\`fVSNEBL~±»¿¿¿Ÿº±°··¹œÁÁ¿»»œœœººŸ»»¿¿°Žª·ÏÓÛÝÞÞØÌÁŽªš©¡¥šš¡¥§£€€¥££ ££ ¡£
+}~z\l^v}~
+~
+|bWlip}}Z~xV~~
+iV_ µÄÕÞÞØØÜØÓÐÓØØÛØÙØÔÏÕÛÌÏÌÙàÛÕ××ÓÐÐÈÇÐŸœÆÇŸ¿Ä¬šš€¡£ÄËt_Sivx£°š££¿È¡¬§~~ ¡­¬¬¬¹¶lks£ÇŽ°­²v¶¹°ÃS¥ÃÆÁ»±ªmY£±²µZZ_W\bfgqq}|xtz£ªxo£yplkpvšº¿vsqotfk@_h;U
+uyxyst|yHBouvztt|~_DzuIYItyzy
+}|}|
+zzz|y`BcQ@l
+
+­®¿¹thmllqu^Vqousspq~ouxyz
+
+
+zupgc±ÄÐÔËÊËÊËÆÇÇÇÄÄÆÄ£ŽóöàuoolsdN9"<\ÃÞÂÁŸœŸ·­°µŸŸºººº»œŸ¹·»Ÿº»¹ºœŽ­ª€¬Ž²·ŸŸ¶·¬
+
+}spqstylgi£šš€š£¡£€£¡©š£ €~m~tmuhvosz~t|}oS`h`tpdl|czuU^kq¶ÊÓÛÛÕÕ×ØÓÓ×ØØÜÝØØÑÕÐÕÎÓËÙÞÝØÛÕÑÇÊÊÇÎÈË¹ÈÆÄÁ°¬ª£¡¡ÃÃYmqqu¥ §¡§§Ž¡z±ØÂ²ÇÊ®t\^º»®§€µ
+»º­°¿Q¥ÂÃ¿»ŽdU§œ¹€²µ\__b[b`hou}~quv€­|u xskogu©»Ákookobk@^k;Mtvuxtx~yJDsvz}tv~^@xvEVAu}}y|~~xvz}}}}~|c?^OAg
+
+²®ÄŸ¡thmlmtt^Uqpqsqpqotu|z~
+
+
+|}zoqgc±ÂÓÔÑËËÊÇÇÈÊÇÈÈ²xâõñéÂx|ztkZb¡êåÁ»Ÿ¿Ÿ¹°±µŸ¹¹»œ¿œŸŸ¿¿œ¹º¹º»¹±~°©}}icfbcilfhdhstut €€§£¥š£€ ¡£¡£¥  _qgy zvy}zllmspu~xs}ycYhfpyomcz€mNixz¶Ì×àÙÓÓØÛÓÕØ×ÕØá×ØÓÕÐÓËÐË×âÝ×ÕØÑÑËÎÇÌÃÃ»Ê¿»Áµ©§ €¡Ç¿bgqom°¬Ÿ­£¡·µ xvu£ŽªySY|©œ®§­µxÁ°·­ÆQ Á¿º»­}ff§»·¥²_d^`b^cclv|xsy¥š
+xt£tplpsv©¶ºqsphpfi8Zm=M}uzuyvx}}M=mpzxuv}[FzvFS?u}|y
+~~~yvu|~~||}z`?ZOEg®ªÁº¡qhmopptdVmssppqv}mstvy}
+xolid°ÄÔÎÎËÈÊÈÊÊÇÆŸ£}~vp¹ñóîêØªz~~~s`kxØûêµ»Â¿œ»­®²»ŸÂ¿œÂ¿Ÿ¿œŸœ»Ÿ¶»œœ®|Žš¡¥€€£§¥§€£€§€ €€š£¡ zŽmzzYm||u
+u~ihzyVYcuv~
+yY|oR_k²ÌÙÜÝÕÙÝ×ÕÙÙ×ØàÞÛÔÐÛÕÐÊÏÄØâÜÙØØÓÕØÊÆ¿œŸªÆËË¹·©š €€ÆÄk\fbcu} ÂŸº¥¹Ð°Ã»œšÏ§ut
+ukYs¡¥»¶µ±¬pœ¡¹§Ä¡VšŸœ»·ªs[sz¶}²^`[^[_bips
+|usvª¬vuxsoos}€·Âsuqksgg@WfAL~zyuuv|zxQ?kuttpq}}_B|yLSDv
+
+~~
+
+|qm~}xtd<^ODg
+®­Ã»¡ykmlpvp^Vqplqqouqtvuy
+
+ukigf¬ÆÐÎÏÇÌÊËÈÈÃ²y||vppvÔïííæäÊoo^UfÓõüêª ­œ¿ŸŽ±¶¿ÁŸŸŸœÂÂ¿ŸœŸŸº¹ºœœ¬z¬¬š­·ºŸÁÂÄ¿µ°š¡  £££¡ §¥§¡¥£€£€¥€¡¡  ®¬£~~vWs
+}gNVld|}_ziSc}ŽÈØÝÝÛÛáÙÑØÜÔÕáàÜÕÓÛÕËÇÑÈØÞÝÙÜÔÎÄÑÏ×ÓÓ¹±ÈÆŸÁŽ¡¥ª¬¡¡ ÈÂWV\ciszš±ŽŽ­§ÃÁš²² µÁ
+®hu©§|_bªªµ¹ šm¹©¹€Á¥Y­»»œº¥c`tz©µ¬­±
+\c`c^^gfls}€xus€zyypqopzš»Ãuuthocg?Zg=N}utxtxz}|W5pxxxuty|`BxuDQDt
+|y
+|||vq}yxy}u_F^V=g|¬®ÃŸ¡thoqops^Jmspqsosptxxy
+
+
+}ukoic±ÆÐÓÑÏËÌËËº£udyxtkmcäîíéèéÝ©mMNÕëöþá£€­ŽµŽ·ŸœÁŸ¿ÁÃÆÃŸŸÂ»ÁŸ»ºº°~°±Ž·ŸÁÂÌËÊÃº²±§¥¡¡¥€£€¡  €¡£¡§§€š€© €¡£ €   ¥¬š¬ª¬¥¥¥£t}d
+zxdJ^`p
+d}|Z^g }¶ÊÓÜÞÝÝÞ×ÔÕÕÑ×ÙÜÙÙÕÙØÏÎÏÃÕÞØÕ×ÔÓºÊÑÓÎÆÊºÇ¿ÂÁÁš šš€¡ÃœYQB[^sŸ¶ui luz€ £p|š¡
+dY®®œ¹µm©¬¹©»¡R¹¿œ±¡zVguµ±¬ŽŽy_^`c_bfkot| ~zxx¡šyx~|tqqs|¬ºÂptqhsfg<VfAMxspttpuztR5uy|vpoz}h@txIFAs|~~
+
+|
+
+~||zz~zyzzy\D_UBh
+­­Âœ¥ qfkmostcRmqpsqutotzx|
+}vqphc­ÄÔÓÐÎÎÆº£~f_uvutid[œêëêêêêâ­@[­åûøüâ§¡¡¬·ŸÁÂ¿ÁÂÃÄÆÂÁŸŸœœººº®|°Žµ¹ÁÇÃËÊÊÃœŽš££
+¥£¥€¥§¥¡ ¥š€£ ¬µ²·ª¡€¬¹°§§~|ª
+}tWJbs}WpZ_g||µÊØÝÞÜÕØÛÕÛÙÔÕÕÜÔÓÐØÙÐÈÎÈÔÜÙÛÙ×ÕÄÆÈÌÌÊÇŽÇ²Žº»š£¬¬¥Ê·U9BQRk}¶s um^vf
+}zvsVd©œº¬Žª­ Ÿ¥SºÇ·£h_y€µºœ¶°€xdfbc`blosv
+~|t|
+€­}}£zzuspy¥¹Ÿotqlqfh8SdAFztmsqyz|tW7tzxtssy}f<svNHBm~||}}
+
+
+|zz~vx}|~|yy~}tb<`U;mª°ÄŸ¡£tgippppfQlssqsos~pyxyy~
+~vmiid²ÈØÑÄ¶©¡th\\lloki^W}Ùêéííê¹V5DHä÷ûå}€ ¥¶ÂÁÃÂÄÃÁÃÄÄÄÁÁ¿¿»œ»¬y~ €©€ }z|~|~~~¥©€£¡¥£€¡¡€¥ ¡¡ š¶ºµ¥¡²Â±¥§
+
+yy}~xfDYqxvsgyZbg|µÌÕÛØØÛÕ×ÔÔÕÐÓÐÕÓÕÐÛÓÎÈÏËØàÝÜÕÕØÔÐ»ŸÈÎÃ²Æœ±Ž°€©¥£  Ç±QEIQhuy§ €­|~sYN^kyt
+m~bc€µººª­­§£²£[¿»¡xVb
+Ž»œŸ±¬ªv_b^fbfklp|~|uyš°|xtut|§Ÿœvsshqgd9Qi@Q}yssmtxyvU4ut}zsqxyb<vtQOHuz
+|}|yyy}z~y|xzv
+~|pc=`V@b¬±Ã»€sdlopsqbWopqsqtp|tsxxx}
+
+upigc°Ä¿ qdRSZiifgiYZY®åéëíÃA%/8BBñþâux¡©ŽÁÃ¿ÂÇÁÄÆÈ¿¿ÁŸ»Ÿ»Ž¡ª°±µ±°š   ££¡¡€€¡¥¡¡¥¥€£§¡£ £¥¥§¡ ª²©¥€»®§£¬|z
+
+z}uMF\suk
+fVclyµÎÔÛÝÓÕ××ÏÔÓÎÐÓÐÑØÏÙÔÏËÎÇÛÝÝÛ×ÔÛÕÑ¿ÆÆÆÄÂÎÊÄŽ® °ª€Ì²`S`zb_dbÃÎ§ lcxzziMMVtgfmy±lby¡§Ÿ¹š €¹§£­£^Â»£shq²¿ÁŸŽ¬­v^ccb_`douv
+zx|
+§­||
+}pqttz§ºÁvuqgulf9Nh=O}xmppszxxO8zzyyvqxzbDxqQRFovy
+ux}v|~|yzz}}yv~vd<^VBd
+}¬²ÆŸ¡ukkmootfUqqutqkm~|ktxzx~}tkmlµtdYSQ^bihkdYYVtÔêîÈg%.2VUÌþÓkxxuz€±¶ÁÆÇÂÄÄÃÁŸ¿»¿»º±¶ºŸÆÊËÎÑÐÂ¹®©§€¥¥š§§§£¥š€€§š£¥¥¥€¥¥§¥¥¡€§¥ ¥¡€£|ko}€¡°·±¥s
+x|z`QLmxfzU[hzxœÆÕÛÜÕÕÕÙÔØ×ÓÕÕØ×ÕÑÔÓÎÎÊÇÛÜÙÝØÓØØÔºÂÇÎÊÁÏŸº¹¹¬š¬š ¥Æ®t~g
+qÄÌbclty~}x_zksq`l uhq²Ž}bc£»¶©šÁ °¶­¶kœÄ¬~fpœÆÂÁ²¬ªtcghfcfkksu~zxx
+€®xy|vtstx€ŸŸuuqmth`5OlAIxqmouuxtpQ7vxuxxpxx`;ttOLHoy
+|tv|~~
+~vy|}~}xu}xsb<[V@d}­­¿¿~qiipmosdVoossuos}vhqt||
+|vtml£p[QNIEYhfkf^YUSQæÛWM|#YîÈgv|sptz~  ­ÆÇÃÁÃÂÁÁºœÁ¹·¹œÇÊÌÌÐÓÑÆ»²­ªª­®§¬§©§€š§§©€¡€šš€£§¥š¡ €€££¡£¡€
+ q¡
+¥²¶¶ªg|x
+z|sfSZquhmO[fyyµÈÑÙ×ÓÕÕÙÑÔ×ÑÙÜÙ××ÏÔÓÔÊÌÃÕÜØÙÕÑÙÙÙÌÎÄÊÄÂÈÁ»œ®©œ©š€È­f~~||}x¥fUiz|s|
+xvZh|€¹xk|gf¬Ž²§Á­¥ººœx¹Žqk}ºÂÂ¿Ž®§s_cbbhghisy
+|yyz
+£š}xttss|£¿œutumtqi?Jd?FtpmsotqplN0tzuytou~gAuyLQDo}~xzxx|}}|}z|y}xq~}y`9[U@d
+
+}­©ÂŸ |skhhmptbRqlsvqst~|msxz|~
+
+}|tqx~
+p[OLEED^mcg`YYYWOlÄ®N­"SªºÈ§dspxymlosv~ŽÄÄÇÄÃÁœœÁº»ŸÂÄÂËÎÔÔÔÎÊÁ·®ªª­­¬©ªª§š¡€££§¥€¥š©€¥š ¥¡¡¡¡¥¡€£ zx~q|}x š²µ²Ž_
+
+zy|yuzgQYctiYbm€|ºÇÔÓÏÏØ×ØÔÙÕ×ØÝÙØÙØÞÝÕÔÔÇÕàààÝØÞàâÜÑÐÂŸÃÄÂœœ·µº®ª£Ë©mssvgmtqfNz}gu`\cs|
+zuµ·ª²°}zW_¡±± ¥°¡ŸŸÁ
+Žxfk¿Ÿ»¿¹°ªq`ccggdimsx
+~xtz£¬~~~xqsv|šÁ¿utxispi;JcBDstlsupsvpO/pyvvsqux_?|zLEFl~}y
+v}yv~|}uy}}ztt|x`7\Z@byš¬ÃŸ£sdimppsgVippsout|ouvu||
+~|xsmgq
+
+yo\OJHH?EHONVWVUSSLO£¬€`"2Ôáâ¬Zstot}uqtpssx}xŸÇÆÃ¿¿¿»¹·¹¹¿ÆÇËËÔÕÔÏÊœ±®¬ª®±°°­§€ššš©š©£¥£€š€€¥£€¥£€ ¡€€¥¥¡¥¥bUxz©Ž·µtp
+|}zz~fYOc~~s^sy¹ËÐÇÃ¿ÐÓÈÂÈÌÏËÓÏÊÏÄÔÑÎÊÐÇÕäääàÛáåàÜÌÇ¹Á¬¿²Ÿœ°®ª®ª¡€¥Ê¬qqvtm`gqxZNl}pdhW}~ tvo®²ÁÞÏš­ÊlQš­°š°¥°¶Æ¬xx§»Ÿœ»¹±§o^fcggfgkqu}|x}£§
+x}~vsuvy£Ÿ¿}sqltoh@DdBBsvhmspps|W'msqsvlpzl=tyQFLh
+|~|uy|||}vv}|vtqv|}f8[\;^}
+v¬ªÃÁ uklomopbRmxtqpqtlsxxz~
+~||}uoimfms~ucWLHM@DAMUOMIZ[YUVLJÈÊ°H"'yÃíò·Ntupss}zvysqsltqq~§ÈÆÄÃŸœ¿œŸ·¿¿ÁÇÈÏÑÓÓÓÇÆ»°°°²°®©¬©§§§§¥¥š¡£€£ €¡€¥€¡£©¡ ¥€£ou~
+ ¥¬·®hJ~
+xzyip^Qixgpc~
+~¹ÊÊµ¶°Â¹²±œŸŸÈØÐ¶ŸŽÁÃº·ÈÆ×àÛÕÓÔÛÕ×ÐÆËÃÃ·ÌŸ¿Æ¹²¶±§£€§Ì²mvgd^[gsh[kpxmydtt|¡ÁÜéäª¿ÝÃ
+Y¥µ§¥©°©µŸ ss~¥µ¥·»ÂÁ¶°©o^cgh`flotz
+v|vx }|~xmpx|£œºzqstuqfAEfJ?oslslpsxx^!qzxx|ou|k;ty\ELi~}|tzuz|y}tz}ztvsssuc5ZZ=^|~x¥ªÁ¿tgkllptdUsvtqtuq}}luvvz|~
+|xvsxsqmhb`h[ILHDIDBDLSOJYYRUVQNLhs»Óµ@('7ÜïœHmvxspqyxvtiqqmdsÆÊÆÂÂÁÁÁ¿»ŸŸ»ÂÏÐÑÔÓÓË¿µ±¬°°±²­®¬š¥§¥¥¥§€¥§š¥£¥¡ €§£€£ £ ¡  ~z
+¥œ¶`Ayxt~hYVi`ps
+}ŽÏÈºŽµŸµº­Á¿ÁÃÏÇ·°š¶Ÿ©šÆÎÕÔÔËÐÎÙÑÔÆœÁÎÂ¹ÄÊ¿ÃËÁ¿¶µ š¥¥Ä¬buqgfVIYupyiht
+dUxxyz||| ÎÊÃ¬ÂÂµob¥±¬€¹¥²Ã¥}u
+­±µª·¹œŸ·Ž£kbghfbdhksx~xyu £uy~umvsz¡º·uqtospmEDbIBstpzusptt\iz~s|txo3qxYDIiy}|~||syxzu|y|u|zxtzpou}xc8``?\x
+vš©ÂÂvkgpstvcRouuvpzu|qvvuz
+~|~|}mchmmg`^[\OJFJDBFHHMVUQYSQUVNEJRp­ÐÈD'&%oÃíÄ=gxyplsy~~zusqqpkbq·ÊÊÃÂÂŸÁ¹·»¿ÂÇÊÌÓÐ×ÌÇÁ¶°¬®²Ž²®±®š€§¡§¥€¥§¡£¡¡§¡€ ¥¡€¡¡£ ¥££}v¡ÃÁ¡Y`svs|}d\Wouvyz²ÈÈÃÁŸŸºµŽÃÄÁÈÕœŽŽšº¹¥²ËÏØ××ÕÔÔÛØ×ÄË×ØÃ»ÇŸ¶ÁÐ¿¶·¹€¥£¥Ê­Yfbmm^NW¥¶¹|}}p~ih[qyo
+¶±š€ªª}x€©°¥Ÿ¡ªŽŸ°zq|¥ÄŸŽ©¶»µº·°§k`dhfgifomvz|zv£zyxqtx}£»ŸvqusqsmEAiLHpussuvpsx_fzuvytu~p8lx^BOgx||~|x|~zqxvyxzv|vxy|ytvopvd;\YB[x
+ ©¬Ä¿ vkdpopogRmptvptsstyxz~
+
+}}z~~fY_khi_Y[WODEJHEEHFJMVSWW^[YUDEOtuµÈU'%c¹âÈL^|vzsmq}|vssopqqcp
+©ÈÇÃÃ»ŸŸ»¶»ÁÃÈÏÑÔÑÓÎÌÁ¶®©­°¶Ž¶¬¬ª¬ª£€¥¡¥©£¡£€ ¥£££££€£ ¥±®~qt|ÈÎ\|£vztx~zsiZOgiq
+xŽÄÎÁœµŸÁœœÌÆÆÏÕº²²°º·š²ÊÓÛÑÙ×ÕÔÙÕØÈËËÓÊ·ÃœœÃÃºœ¹·  €šÈ­kq|~xtdS¡ÇÛouvm_SRfc`m|š©Ÿ`£·§¬»š¶»»yz€¿ÃÆ¹¡»œµ¶Ž®¡k`bfg`dgkssz|y}
+§§y}yxyuvy
+¥ÂºvqukvviD?`LJsxpttspqu[
+f|stzxv~m7qxYBMfyy|~~}syvsuuyvy|}vttxyysqozu`8\`8Zv}~z|~u§©ÂŸ ¡¡
+skikmutdUsvtsqss~svvxy
+|}~dZbikf\VZWWBHINEFMLRZYYU_^\UOIJRoscÄJ%!*fÁ×ÁNOxxyqpx}}zvkfkthZo|ÃÄÁŸŸ¿»»Ÿ»¿ÁÊÆÎÏÑÑÎÇÂ¶­­­®¶¹¶±®¬š©š£¥§¥€š§š £€€£¡£¡¡~pggocfp~ÄÐšgy¬vuz
+iVWVkv­Ÿœº·®¿ÆÂœÌËÂÃÐÂ»Ç»Ÿ¹§©ÄÑÌÎËËÊËÈÈÎÄÎÏ×Ê¿È»ÁÆÇ·¬Ž¹€¥ššÌ®ubkk`bVZqkºµ°opRN`xhh}|yyz}§Ã\£§²ª±»­Ž»¥xŸÁŸ¿¿ ±Žµ±±®¥lfikcgfioqvxuyy€©x|toovz¡ÂœusyovplBA^JHsspsuzzuz`huxvztt}o7pycEVhz~vzxy
+svqtuzyxuuttxxsqs}p`9bb?[q}ysxlHB©¬ÆÁ¡xiklqqqgNoupsopszqxuzy
+
+}
+
+hffod_[V[ZYH9JIMHHRZY^^WU[ZZOJNQf|HtÄR%'"WÄÃ·_<pxztqv|~zlbgscQt|ÂÂÄÂœ¿œ»¹¹¿ÄËÊÎÐÔÕÓÊŸµ°±¬°¶¹¹¶¬ª©ªš¥š€ª£¥¥£¥€§ £§¡€¡¡vm[\ZMOVZS_fkx ÁÎÕÈyyzx|~|oROfvyu¡£¥§°¡šŸ¹±Ž°®²ÇŽª²±­££§ŸÃ±±¹²±ººµÂÁÌÌÑÂ±ÂÊÃÆŸ¶°®®§ªšÈ©yzs|WOclguZcÄ­¥Ê¿SISfdzsty}©¶Î×€ifª§­®ºœ®°s}§ÂÄÇÄ·°±µ°±¬gdhgfgbimt|
+}zxz££
+zx~
+~~usp} œºst|stsgH=^OEsvoqxvvmvc_syx|xxzm8s}\AWf~}u|yuuvuxzuztpyvvupslyzqf3^_?WsxxpudH9­ªÄÂ 
+|xghmpspiRmsqqulptuxxxy~}hihgb`[SVYVL;JBLAHN_ZZV^`SROOOMOW}VfŸV#!&NÄº­f9sz}yusmzp\_p^Jp|y¬ÃÃÃœº¹¹º·¿ÁÄÄËËÓÕÐÌ¿¹±­­­¶·¶µ±­­ª§©€§££€ ¥£¡££¥£¥¥ mYNg0;BFMWbmz­µœÂvxlv|u|~~yY_d }uª±¹©®ª¡¥¥£¥š¥©±š§€§©£±Ãº¹ÂÈËÏÈË·Ž¶¹±ÁÂ°±Á¹ª®¡ª±°¡©§©Ï§fvdydWc\m~~|o·¡ÁŸÄÆ|RW\cylp€µÓÞÓÏ°
+byšš±µŽ¿·ytl§œºÁÌÁ¥Ž²±²°®d^`gfcfgmqv|xty~z
+~vsqsx
+ º¿sszuytgH<\QDvzoltsuqu_bsxs}usym8mz`;Nf~|yx~vu~ssusu|xvsqxyutotp~p`/^`;JksxltkH9£šÄÃ¡
+yfikqtpiWqutosilyqsvxy
+~ofc^^YUYYZYL4HIF@DU^ZZZ[WHOVUYSOJpSSµW%'BÃ®£o,s|zystgtxc\o`Io|}§ÃÇÂŸœº¶¶¹ŸÄÂÈÎÑÓÑËÄœ¹²ª°°¹·¶º·°¬¥ª€ššš€¥€§§¡¥¥£¡£¥€mV7Ax
+fQHI_}
+tk}~}z|ux}vsIguŸ~ s·ÂÆŽ»»°¡¬Žµœ²¶º²°©šº»®·ÄºÊÐÏÎÔÓÓÈµŽ»¹ÄÃ©¥£§®¡²®¥°¬©Ì SQ[¿zYZd|
+}€Æsœ±VYU`mmxm¬ÈÜ×Ç¡pk²¬Ž®·|qs¡º·¿ÈÃ®Ž±µŽ°®fffb^fflmtsxxv|
+£|}zptpuxÁŸxqxsxvlFB`ODvqpyysx}c`vuuypquo5m|`9Vcxzyty|xu}zsvtyu|uuttuyttsol|zpf3WY;LltvsqhB4¥¬ÆÆ  yfgikqtkVovsoqoqxqquz|}qc___\SVWVYWQ9BRF=V[_Z[[ZSB?SR[YYNQM3¥^!#;Ÿ²€u8m}}yvzkku~hZi\LoxÇÃÂ¿¿¿¹·¹ÁÂÂÇÌÐÕÓÐÈ¿·°®­¬Ž¿œº¹­¬¬ªª§š£§¥€€£ ¡€£ £¡¥  ucW5JF|YLVYUW`hcs|}xzWfxÂtÁÏÊŸÂÃ¿²·œ¿œ¶ÂËÄÂ»±ÃŸ°·Ì¿ÔÞÜØÙÙÙÙÁ¹ÂºÄÁŽ§ š°¥¡±·­§§©ÎZZIt±kqkoŸ¹š±S[gbi~z
+t
+¥»ÃÁ§uVh€¥ª¬tx»¹»ÇÂ£
+µ²Ž®°®`fgidffkisx}vs~
+}yz
+~yytvv
+ŸºxtvoqtfB=[VBttovzpvbh|xuvotzu9k}d9Sdux}mtvytumqszuzxypsqupqksoy}mf3W^4QmsxmqdB9ª©Ã¿vmllstuhRostsvsp|
+ovzzy
+
+~k`ccgcZRRWYZWQ7=RIJ[[ULZZWFA/ISRUYUJ<
+R
+4œ°m@gyzpuvxqp~uNmOLqz¿ÄÃ¿º·¹·»¿ÄÂÊÌÎÑÓÌÇŸµ­­®±¹œÁÁŸ°®©ªšª§€§€©¥¥¡£¥¡€ €z[fSAE%y~VIFFEAAHMVdl~~usc^c­
+vºÎÏÁÆÁÄÁ»ÈÁ¹µÁÓÁÆÇÃÃ·­ŸÑÌ×áâÜØÜÝÜÔÈ¶ŽœÈÁÁÄœÂ­²¹°¬€®ÐªfkLb|cfhmh®Êœ­¥£¥ÛxLmsYzzusiou ¡§œ[V§¡xfx¬Ã¿·¹œšŽ¹¹µ±¬f\h`_ghfkp}|yvv|
+}x
+uspuy Á¶uuxpotdDB\REpttu}svk
+c|yvsxy@mzc<SSvt~uyvvsxxqpsys}uyutqtqsosltvqb/ZY5LltztpfE8©ªÃÄ¡vmlmpupkUlqtqvvu}uvsz|z
+uV\fhi`ZURSU\ZYO<8LQWUNMSZ[UH?48QQUVVW@
+p?
+&
+,­ŽiFb|uuy}xkv[iDJuzÃÃÆÁ°œ·œ¹ÁÂÆÇÑÏÐÕÎÇÂŽ±¬©²¶ÁÄÃ¿¶­®ª§¥š£š¡§§£  h_gOFO&EzoZQL@8?A?997HOl}yzyvkh£yºÐÏ¿ÇÌÊÁ¿ÃÂ¿ÄÏÓÃŸÄÆÁŸ°¿ÏÈÔÝÛÜÙÙàÓÌÊŽ©·ÊœÆÄ»¿Ÿ°¶­®§§ÌVZZ``OW\[šÁº²£š­Ùqv shizdi¡¶ºÕÃRY£pvª°ÆÆº¶µ©¹Ÿ¹²®Žbddfd`ckms|~}xuy|y
+vust|Á¹pmyuloiLE[M@s~qqv|tx|i
+g}|v}ouyu?kv`8O^ost|u}qxsqttx}}vuotmupviogmyp_.\b;RovusphE.§©Ã¿££zkikoptlQosttstsxsxy}~~
+~JF_f^ZW[VQNQQYYNB.EFDSDRSVWLFD@*LVYYV[V
+Z<
+!'±ZObyuqxzzqpvm7WyÂÂÃŸœœºº»ÁÁÇÇÌÐÓÓÐÌœŽ®¬ª²·œÂÄ¿¹­š€|
+q_`gQ=Q%"`
+z\FB?@B@7.!(4V0kxyzs~tyuq€|
+tÁÌÎÄÈÆËÄÃÈÌÊÇÊÐÆËÈÁÁŸ²ŸÓÂÊÕÛØààÝÔÃ¶Ã¶¶Á»ÄÊ¿ÁÁ®Ž®°€ÊbS\[[RWR[­€y±Ýµo€§¬¿±ªslÄ± µÏ­ÂÑÄªkY~
+om~¶»Á£ÄÇÈËŽš»»ÂºŽ²_ffffg_ippt||vzv|~~zppqsŸ·xovslsiNB\REqzusszty}kc}zy~pqzu=dxf/R[sy}u||zq|uooxy|zsttttxquophoulc2Uc@OpzuxqhL5ªªÃÁ¡ xfgpkopoWluossts|txz|}v+V`UWZ_\SQJQ[YUO?*@IUOMYWUF@FEA.0WWUW[d*J@#"!
+y§LNbv~xqmv|xzt![|
+ÇÄŸŸœ¿œ»Ÿ¿ÂÊÌÐÓÓÑÑÇ¿·¬©¬²®°·µŽ­¥||
+
+
+lc_V\H7L"@fcfYJBA@;<3*?JqŸµvSqoyxthYx yÃÌÈœŸ·Ÿ¶§­±ÂŽ»Ì²ÊËŸÂœµÄ×ÐÙÜÞÞÞ×Þ×ÑÎÓÔÓÏÊÑÏÎÎÁ¬©Ž²®ª¡€Ê¡}~zuyvpovu¥
+~z¬Ãšš²ŸÁ­ÞÎz¹£»Â®­ÑqklŽŽŽ¡pÂÆÆÊŽ¥»œº¹µµccgdgdchpuyytsz
+xx|~yusyu~º¹uptmoskRAWODo|uosutx
+l`|||~qu}vAc|k2QOqs|quyvv~vsosuuxvspkuvsuqtilssc5S`<OqxyxskM7©­ÆÁ£  |ifmppulVpvxuptp}
+szx~x~qMQZbgc\RLLRNUYZL<%2V\MY[UQEFNIJ<%DQSWU`Y=7!!
+"i@F`qy|ycmy||y~u
+_uÆÄÂ¿»œ»œ·œÁÁÄÄÈËÊÆÂ¿Ž­  £­®Ž·²­§~z|~}|~}mZ_VNJJ=/.98@;;9A=EB5'+BNB} ·ÄÑÕ°gU[u~z
+yhZ~xÃÎÈ»¶¿¶±°®±¶ª¹Õ²ÇÑÂÄÃ²ÂÓÓÛÕÔÑÓÔÓØÛÔ×ÝÙÕÕÕØ×ØÔÈÆ¶²­©§¡ÎÛÕÔØÔÕØ×ÕÐÑÏÎÏÎÆÃÎÜÎºÊÌÔÎÆ²ÄÄ±£±œ·ª©µ®€£­Ç·ªÑÑzk[gx¥¬¶ªªcºËÈÄ¹¡ÁŸœºŽŽgdgfdcdlmx~~yzv}|yy~~tsstv¹·tqtssthOAZV?fxtqtulto!\zzx|uxzzHbzg2MNqqxuxxuo|tomqsyuqpmmmumsmmkitqd4R^3Wpz}u}sNSš¬ÂÁ¡xkilsuuoUhtsuppq|vvzyz}zUUdhfVSJMOQSUVUL8"7WSS[YRLMORMOL9.NRYWbkf5%%
+h}+Nct~xt[dtu|zg0muÂŸº»¹µ±®­®®­Ž¹ºŸÆÇÆÄŸŽª¡£€€£¥£¡}|~~|~|~z
+xWNYQ<.EA7
+#3395597759.0583u©¹ÁÂÐÙ¶Q(9Vz~|s_~|y|ÄÎÌ»»œÃŸŸÂÆÄ·ÆÓ®ÆÎÊÇÁ·»ÏÏÕÌÈÄÊÄÇÇÌÂÆÌÐÆÈÊÌÑÎËÂ¿¶Ž§£€¡ÎÓÎÏÔÕÔÔÛØÙØÕÛÜÞàááàâàáàâáâáååäåâæéèâÝÜÜáàÞÜÛÝæ×slZu¥¥£Žš^ºÌÇÃ¶ ¿¿¿·®¬dficdhidmsxy|u|vvy
+~~tqxyµ¹uvxqsqdOD[R?ktsqquqq~l"[xvv|szzvE_zh.QMqsyvxttkxvvohqzytqlfluptikidqsd2Ud=Lt}~}|iq€ªÆÁ£¡
+umllqpqmYlqqsqtqzsu|z}
+
+sVbg`QJNYVRSQQRYJ8'=RZUUVHRSOSQMED#HUSOYk|7!
+
+_`
+L\p|xcOfuy|~RDml||¶¶¶¶°°¶°ŽŽ°¶»º¿ŸœºŽ¬€§|~|zp_VRZL7%%<A<35@=?<73/,*"
+0u­º¿ÆÓØ§'#7B
+uo_k~¡xÃÏÏ¿ÇÃÃÆ»Ã¿ÆÃÈÌ°ÊÐÇÊ¿·»ÏÏ×ÎÊÇÊÄÈÊÓÈÎÌÈÊÏÌÈÌÎÄ¹µ¶¶ª°š©ÌÆºœŸŸÁºŸŸ¿ŸºœŸŸÁ¿ÃÁÃ¿ÃÁÁÇÆËÈÊÈÌÑÌÏÎËËÌÓÐÓÓÕÕØÜÕ}~¡¥¬¥Ž¬V¬ÏÇÆÁ ÁÇÃœ²±``cdbdbhmqx}|zuvzy|}|
+|zqpuy¹¶qzvsqpfQ;WQEfuqppvpp|q!\}vv~yzyxMUyi,UIsvtusvsl|tsppqxuqtqlpossgmkisu`4Vb3St
+}p©ÁÂ£ vkmlxspoRdpustmpxxu}v~m`dZMLNO[ZQQMQUUF7%<QQRVORVUZSURIB3'QZORf,
+!bS!Qcyx_Ocvvz~~z.Wg`z~¿¿Ÿ¶¶­¥ €€€  ©±µ°­š¡   £ £€­šŽ²°
+xvt}~zz­pbWOZVF0%'2;<0789<72,'
+Q°ÈÌ[=N^uz~z}_ot\}
+~ x ÄÎÏÆÆÄÊÈ¿ÁÂÃÂÃÎ±ÆËÈÎÃ¶ÃÐÐÕÌÌÄÇÆÆÆÌÇÏÌÄÌÆËÏÐÎÇ·¹±µ±®®®ÏÁŸŸœ»œ»œŸœ»ŸŸ¿»»Â¿ŸÄÁÁ¿¿ÁÄÆ¿ÃŸÁÃÄÇÃÃÂÇÈÆºÂÃÁÄÆÊºx¡£¬§·°Z¥ÃÃÇ»¡ŸÃ¿»Ž°`bfb`_kiksuyvu||||}~|tpxzµ±mxtuqldO8ZS<csoqtvmp~l
+\yuuxx}ytHUyi%OMuvtptppmsqqomqzsqsmimqqumosbps`,O`9Lu
+o ¬ÃÂ£ 
+|mlkoqshYkstssqvzvvxyy
+
+
+g`WNRSYZSNSNOOVM92'@RNRLRVWUWWUJFID,EZUS`o%
+
+"#_BO^uyyRN^sxz|p.cZg~~
+ª²¹ŸÂÆÄÁ»°š ¥¥°ŽµŽ±­¬¡      ª±²§©° ~y~}z~²fFLL\bUL",#
+#%/07845/2##c
+°ÐEOQVuy|\Zpocq|x ÄÑÏ¿œœÇÆ¿¿ÆÄÁÐÔ»ËËËÌÇ¶ÁÓÌÐÃÄ·ÁÂÇÂÇÈÈÎÈÃÁÏÆÌËÁŽ¶µ¶®­­±ÏÂœ¹»ÁœŸœŸœÁœ»ÁÂÃÃÄŸÁÁ»Ÿ¿ÄÄÈÃÁÂÂÇÃÂÄÂÁÈÃÂÈÄÄÃÈÊÏÈ
+£¡€¬¥·µc¥ÈÄÇ·£ÆÄŸ»±¬zbcc^dbgikox
+
+~uzxy~z~
+}uvv||¶±ovupomdO=WR?^ussvuphzq
+^tsvzxzz}MUuk0NMsyuputskuqomhptss|mdopptkmtfkpc5Sb2Ozq¡¬ÃÁ¥
+zkokpvvoSgutztsqvux|x|pb^[^__ZUJNMNSVOI4.%ISNVNWRWUVWVR@EA2(JWUYh,&
+Rp=*[btxuFUbpy~
+i<cEh~~ªš¬¬©š¥šª­°¹ÁÃÊËËÈ¿œ±¬©©¬²¶Ž°®®°š ©­ ­°­~|
+}qF4DI_UII=#//,0'&#0/.3%
+;v
+l~z©¿»?.HUHh|y~Nfvysbx
+qÃÌÓÈÁÂÇÃÃÁÊÃÁËÌ·ÈÌËÇÆ¶ÁÏÌÐ¹®®Áµ·¶Á»º¶Ÿ²¹¹œµºŽª²±­²­­Ë£§€©§®­°°²±µ¶¹¶·ºŸœ¹¹Ÿ¿¿ÃŸ¿ÁÁÄÄ¿ÂÈÇÈÇÆÎœt§¡®©£²¹iÇÈÄŽ£€Ã¿»µ±®|b`c_`fgmis|
+|vxty|y}zsossyŽ±o|oolqfL@[Q?_utspsslxp!Wy~vvvyyyHRtk+JHmpztvxsmuuomdqtmommgosqqlmpmot`4O`3Iz
+kš»Á¥xolqpsupVhsovytvx
+ttux~[^b[`_^SJNMJRRMJF*'!HJMQOVRUSVV\UEAEB(@SQVcW!
+;Z00Ubsusd^couvORY;o}¶¹¶Ž²Ž°°ŽŽºÁÆÈËÏÊÎÂ»²ª£¡€¡ €¡¬®®ª¥®»®©¹·€
+}
+}vO@RkphN@=E4'!*/(Yz_y©Ž»;DME\
+fI_gtuYvtŸÎËÃ¿ÂÇÄÃÂÌÊÇÏÎ»ÈÏÑÌÃ±ÂÑËËœÁÃÄ»¿ºÈŸÄÈÎºŸÄÇ¹œ®§­²±°±²ŽÌyy|xvuyvxux}zxyyxxyxyvxx|~zz £ p°°¥±
+ºiÃÇÇ¬¥€»¹Ž¬±Ç_gf``gcflt}yvvz
+zxy~
+uuuuz¬²kvqpmsfO=WS?_upquusmyl
+Wuvtxux~xNRsd&JImpuqytsiutpiituqopmimmmkhlqiopb4R_9Lyg®Â¿€ sikpqstmVdsqqqsuztutzz}vMY\``_YQNHNNQQOD9*&
+;MLQRORUW^VZVJEFA4+QUUYg
+
+'B#8Yftzocdblxx~2UAAu­ÁÁŸ»¶²µµ°°·»ÂÃÂÂÄÃŸº®š§ £€šš²²·Ÿ¹®¡|­Â·¬§xvy~h=BRUYS9=3.5A5/42/*"Jt
+t
+_s
+©ª©§^SRQQy\D[YiccuœÐÏÆÃ¿ÄÆÃÇÌÆÁËÈ¹ÊÈÌÇÂŽ¿ÐËÑ»œÁÇÁÊ·ÊœÃÆÌÁ¿ÐËÆÄœ®®°²°¶²ŽÌ®££¡¡€§£€ ¡ €£|
+|\²°š·~°zÂÄÁ¬¡€ºµ¬€ªÈ`bfb`bhiopxyxtyy|yzzxxvu}­²mopkflgI5QS?`umoqxxszl\xzvxovuELlf+MBmqvuztpmuotikvuqotkcmlsmdomqto\4H[3Dyl¬ÃÄ€tdimpsmlVgovttvvzvst|y~y?V\Y[WQFHLLNSUJ@;''8OOMQQQRVVUZRRFFH@+;QO[o7"%A+DYhozgdcgq||}p@O+Rz|¶Ÿºº·°­ªšššª®¹¹ÆÇËÎÐËÆ¹­¬££¡ xy¥©£°² zgolohm8'./23.%&/5,.,('b
+sc­­š±f\WQzh?W\mbd¡u¶ÈÊ¿ÃÁÌÈÄÃÐÈÇËÁ¬ÄÆÑÇ¿²ÃÎÎÏ¿ºŸÄºÃ¹Ä»ÆÇÌÆÁÄÂÄÃŸ®®²°®±¶¶Ï¬££ ¡¡€£¥¥ª¬š©©§ª¥€ª®­¬­­¬®¬©š­­ª±­°­±ª²©­²ª§^·©¹z­~¹ÇŸš€¥¹µ¹¹ÄËz`bfccdgims|
+oqt}~uuv~zvuquv~¬­lhmmiicM4VW?`zpppyyuvl%WpyuusszyLMmf,S?pqvqzsomsmshqutqoqmckotldpqkpid;O_0Hxm©ÂÃ€ulhktqsoUhqvsttttvxzzy
+
+YOINWNDBHJQRQOD<4+"ALRRQQOQZVWZYNFHBD;(LWUdM
+#*NE[mpth^^dm~
+bEB0U}}­···µ·µµ¶µŽ¹ºŸÁÁÇÄÆÁŽ¬|z
+€©­ª§š ¡¡€€¥š€tpoq}£ ©š¡cbhbLbp_\[M842+,(
+*
+#Ju
+O
+¬š­qšvZNU~kDVZg[ZzsµÆÎÂÈÇÊÇÈÆÌÇÄÇÁ­ÈÈËÎ»®ŸÐÌË²°µ·¶œ®»²ÃÈÎ¹ŸÂ»·¿º­±Ž®°µŽ¶Ïª€€¥©£ €¥ª¬­®±²¬­¬š¬©®±­°®®ª¬¡©²­ªª±­¹±®°±­®®®\¶²¥}ºÆ± £¶ÁÌÐÕÌz\fdddfbiotx|xuvzyxzx~|ztstu²Áxsopig^Q9V[D_ytqtyvtvs'Yu|vxvuytQLsc.M?kkzsyuoitqsimtsguslflpslcoomkdh=M_5Ly
+}l°ÁÁ€zhilosslSgqquouqxxtx|}yd;F[YFEJILOUUHE50*
+IORUVQRRUU^Y^ZJBA@B+?OR\d
+
+0`LZhpukbbhv~
+SE+(`~ŸÆÈÂŸœ·Ž¬©€ ¡£©²»ÁÂÂŸ¶°¬§£© £€uh\\biv}
+}§§š}g;8AINUUE7A??42*Ry
+|il
+ªª¶sxYSQyc;V\dYZ}t¶ÂÌÆËÇÊÊÆÊÌËÄÇÂ²ÊÊÊÎÁµ¿ÓÈÓº­§±µ¶µ¥ŽµÂ²ºœÄ±ª©ª¬šÐº¹Ê
+¡¡£¡£¥¥§ªš¬¬š¥©±ª®®Ž£®²µ²­²±°ŽŽ[±€°¬
+ºÃªºÌÓÑÔÊq\```b_filpvzxtz~~||v}~zyvosq|§²plpphobR0V\=_|mtuxvxxo#SzqxsvutOEtf'L5iszstspispuklqumpmkkhosm`hsimgbBLb4H|~m°ÃÁ¥~xglkqmqmVdpouvtuxuutv|zyD@SYLFEMNOSRNB940.8QVQSRUQSOQWW\WNIFF@5"EMVh"#x#RVkpqfbcbq||D8&,ix±­¥¡©±œÁÇÂº·€ ¥­°¬ÈÇÄ¿Ÿµ­§©ª¥}dUV`vzvx}z~|_^oq §©šN452+08752,#My
+}~U
+
+£­»yJgVuR?W_k`Qx¡q¶ÄÌÃÈÃÆÆÁÊËËÃÌÆ²ÂÆÆÁÃ²ÁÌÎÕ¿ª¥µ¡»ŽÁº»ŽŽº¶¶°¥£¬Ø×²±ÊxWRQYURN@B?@AHLUNRd_cghfokmppms¬¥}zc¬šššy±ÂªŸÄÈÌËÄs\```__cioqz~|xvux~y||~||vqouygkopds`N9W_9\zstpvvxxs,Uv|sxtt~xVHld/A5hltvtuofpqskkouppoolhlplgltkoof;L_4M}zk¬¿Â€~|ifiooqmYftsvuqvtyvuyx~dHW^JBJJIORUSI=82.'=OOUQRONRQUSU\VQLIBD?!5NQf?#u/UUltgcb`ls|~J,"=vz€§¬²»ÂÂÊÎÌÎÄœ­§€££€¹ÇÆÄÆÄœ»±®­°|qcZV`uzzxzfmlWf|­¬²¶d<.(330*
+Mutc
+¬» s^[c
+}FFV^hdVy~€
+s·ÈÎÆÂÆÌÁÄËÄÊÂÎÊŽÁÊÆÃ¿²œÎÎ×Ä š£²¥ÁŸÃÂÂÁ¿ÇŸ¿·x|­Ì
+|xR(
+4b``hddd`ZJ![®Ùæl~f`b_\_^^[hz©·šŸ¡x¬Á¹®¶·ºŸ·i^bcc^ccgiqy
+}||vu|}xy~v}}ztsqspz¥µcsmpkqdQ4OV=Z}utqtsx~t+Qtytvvu|zODod/F;hm~plvqlomtghmpstmpihmmk`hqgqqc4H\7Hy
+|
+m°ÂÁ¥
+}}lhiptqmYcssqqssutqxyx|UZ\NBINIHRUSQI=0(%
+FSVYUSVQROORSWVYNIIDD2"EMfY
+
+i^YZiqb`ccgx~|9&Lyz·µ±Ž­­¬¬²ŽººÁÆÆÏÓÓÎÇ¹²§  Ž·ÂÈÆÇÃÁÁŽ°±©lmz`W_\kzs_qostbx~¬­®·ª
+lU<33Qs
+~Wm}­·®
+p\R_xFEJU\_Yx}£u¶ÈÏÄÇÄÆÊœÃÃÇÃÌÇ²ÆÈÄÊÁ²ŸÐË×Èµ®µŸÃÆÇÁÆÄ¿œÃœtcm±Ñ¡.
+
+Nx,#Ôâêlplput°»£¹¬sª¿µ ©£¥šªšg\dc`bhfdmtt
+|zuqu}yux|z~|vvolqy°ºgqklfohS4RV;_xipuztx}p'Quzsvss}xV;lf3@4fpxvlypkmhudmmp|qoofgkmlcfmhsxg<HV5Q}
+xhªŸ¿¥ |lklkquoVftsttmst|qvvzz}
+UVRJHIHNHNWSO@5.,%.UVSUUURQRSY\VZZSUJ??D?
+7R__gWbmh\[bbp}x4
+"WvyŸŸŸœº¶··¹»ººœÇÈÎÐÏÊ·¬€¡¡¡±·ÃÄÃÄÄÆµ¬ib_\`W`pz|mH|yxxug|l§©šŽºš
+~
+|Hm~
+­º»}VDV}xHE@L_`Us}p¹ÈÊÈÄÂËÇ¿ÂÆÇÆÈÆ®ÃÈÆÂ»°µÏÊÙË·£ªªÄº¹Á¶¿¹œÄÃ¹€§£ª¶Ð£9%3'#%\N_ £¥£§§¬§©F"vÕòë¥­¥§£¬¬®ª§ysµ©·°¥h§¿Ž µ°±§§£dZb`_cchflpxuuvszup~~ypopst¬œpqoqhqbO/MV9Uxkmtxsvyk*Ix|sumqzyV;hf+F9kmyxmsumolxkiqpxqpqfgimk_gpiuzc@?Z4Iy|o®œÁªxmoosotqYdutvsssvx|yzy~[NLEBJMLFSZMIA,**	,RUZURVRSSNUVUY[VUNIE=B9%EYd%		JZ[qcZ`_kt~y*
+&cxy}€ÆÃÂ»¹œººµ¶·¿¿ÈÊÐÓÌË¿º¬¥¡¡€¬±·¿ÄÂÆÆ±b©z`[^\`di}zu¥€vmbtgf~|±µŽš
+~
+f,|€·œYLduHB=AWfQv} 
+u¹ÊÊÆ¿»ÃÃ¿ÁÇÁÁÊÈºÁËÂŸœ°¿ÊÌÕÎŽš®­ÁœÄÄ»¶ŸÃœºµš¡Žº²¶Ñ¡  _7W72% c € ¥d'\Îæ¿
+g} ¡£bp|²® ²­¥h£¿¶ÁÇÈÇËÄhZbfb\^gfmpz
+
+zsqsy
+|zvvx||xulpsv©œmvokdmkV2VV7Yypmqusq}q4Hy~}smp|yW8lg4B3kot|spqmlpmdlpmimmqogmim_gmhvxf9AZ2Qyzl¬¿¿š}piikptx[dtvvtvuvvxxxv}oRLFIFFFJMSULL;,&+
+JJLSORQQOUNQSY[^USOQJ@BA*0Lf<
+UU^mVU\dsx}x&8my}©ÆÂÂœ»¹µŽ·¶·¹¿ÇÊÏÐÌÈÃ¶ª £§©Žº»ÃÂÇµ}SOqqtpv}x~}€¡©§ªªoVt~y|y~©µ·²©¥|~||<Y~|}€µŸ}YRozzmLI<A_l\|¡sŽËÐÊÁÂÄÆÄÄÊÆÁÊÈ¶ÇÈÆœ¹®µÊÊÕËŽ¥Ž§Ÿ»º·¹®¹·¹®€š§¬±µ»Ê
+
+^miU<pIR\ ¡x?B®`VY ¡ ¡gVhp~zm§­µš¥c ¿ŽfzÃÊÄÊÈÁgW_f`c^cffltyxqsyxvs~u|uspmmpv|¡Ÿqupkgoi\/S[;Qxoqpquivp/ItyxqosvxV8hc8F5gp}}qqlkkmohkqilloigdilkcfhhovd9;W5Ou~xm­»Â¬
+~zkiplqqqU_pmtssuyytutyy~yRNRLHHOFJVVQJA5,,&QRNMOJUUQUVSQOZ_WZUOOB<?9
+8VL
+
+HR_gLU_htx|i
+Upx}¶ÄÃŸœ¿¹¶µ±¶·œŸÇÌÌÐÎÈÁ¶©£¡¬®ŽÁÂÆ¿ºZ=3Mf
+ou} ²®§YMzx|~} °µ©€€¬­ªzqs|
+q2u}zyz€µ¿§fH^lycFIII\mv
+qµÃÈÄ¿¿ÊÃÁÃÊÄ»ÏÆ¹ÆÆÄÁ¹°ºÎÑÕÑ¹ ¡°š·¬ÂÂÇ²·œµ€§ ²±°°°ºÊyvtszxystfVJ(3m
+=iflVV©fv^`}z
+bV^pzl­°²£ª_·±|\sÂÆÈÊÈ¿dWdf`Y_ihlpt~~xvpox|vquxvytsmllmp}€»msokilh[7S\3U|mpmsshpl'@u}yspovxY3c_4A3gpy|ttqmkmskmpqxmptkfcll_ghioub75U8Rsto­œÁªzkllkmpoVfuttxsosxxyvzy
+vSRRNQJMMRSSOMI7(/
+
+,UZSNNSNMLJMINNSWSZRRNE;85%II		QUbYJYbluu}V(^sxÃÁ¿»¹¹·µŽ¶¹ºœÁÃÎÎÌÎÊ¿²©¥¡§­ŽµºÁÁ¿µq5&btx
+
+£lVuvv|©²¬©®§€|ultv|yM[}~y|}¡¶»MFigz`^hmYJ~|
+s§®ºµª¥»ÁœÁÆ¹²Ç¿·ŸºŸ¶µ€ªÁÆÃÇŸ±œ¹º¶ÇÄÇÏËºÃÈ¹®®§ªºŽ±²¶¹ÄVs|ttlvz2%A
+Z[tsvttyxcFl;8Î€vFZqx}xus`N[v||z§­·€±_¶®o?qÁÈÊËÇ»cYbb[\bcgmpv}
+yuqpvzumqsvxyoghkkp|€»tsokcoi_4V`;Syppmqsmtl,?vzupmtsQ<f_4@0dssstpqlolpioqptoksgilom\fmgtxc=2R;Jt
+u|p©ºÂš
+zliklmmqScppqttts
+vqyxz|
+[SMOLEJQWZSJL?/%+/JZSRRJIIHMLNJNIRSSNQJH@852.IYYbNMW_szx}F8blyÂÂÂŸº»¹¶·µŽ¶ŸœÃËÐÏÐÊŸ¹© £€¥¬¬°°²¶Ž°Ox¥Ž­§ŽÄ»§lzz
+|¡£~Qdofm¥£§§
+
+vuqtmozxp=l}
+|
+²¹|JWgbu}khy|Y
+ p°·Ž©¬Áº®²Ž°º­®»±§§ ¬Á±ª·Žš§­¬ ººÂÄÄµµÂÂÁŸ¹§©µµ°µ²¶ÇZ\'&JD
+.syhIE¬ÆdVEJdxZL[txy¥§¹²`·ŽY+sÃÊÇÊÈŸ_Z\c_^`_`fpt~zuploystpsququoglkkqy·mpomgqm[2N`4Ltmlmuvkok'9p|vvpksupu}b?D0bllqmsmhmstkhslkloqkkhll\fkiss_?<Y9Io}q|m­œÁ§
+ylklllpmW`putyutuvttvu}hSUJNADINSSROE8,%2<LYSRSLLHIHJJJNNQYQQRIJE<9/!@(,N_cFS_fsy}~8Idpy
+­ÃÂ¿Á»¹º±µ·µ·¿ÁÁÇÈËËÈÆœ°ª¡©š¬ª¬ÂÄÁ·ÃÐÝŸÇÊÄÁ·pvy~~špkb\d\ob
+©}~}}yomhfkl_Hmz}zŽ²_R`k_s~~€d|qšœ··±¬·»°¶µ­±£­ÂŽš­¥ŽÁ°»Á¶­®±§¡°²®§§¶µ°®²ºÆUHJ=,*%!9 `4~OZFDf£¥¥SL`mtv¥€¹±_¹²lL[©ÌÐËÑÐ¿[YZ[[WVfcglsz}umisuysiqsquukihklitŸhtqqkqk[2W`3Iskolqskmf';s}tqqÁ±|
+Ž€M_ofmqpogmoqkhpkfmsoiihfh\clmomcE5W9Ai|
+}sxp¬ºÂ¬qmgmoiooScuqqxpqtzuuuvv
+JQRMDAHDSUURQB4/*%
+9JOUVVSNONQSWONONRSVMJIA<=<7!2*
+<SdS@Sbkqu|~z*Vdq|ÂÄÄ¿ÁÁœ¶·¶²¶ºŽººœÄÃŸÂÄÁ¹Ž¬ ¡ €ªª·¥·œÈÆ»ŸŽÁº¶ÓÃÃŸ­utvqku}tmgdkgc^qd;t~zytsttu|xlhiccYIy
+}
+zx±IW[pgs|©q}u}u­œÁœÁ¿²»±Ž··²»­¶¿Ž²ªª²Â»ÌÄµ¡€š®°§¥±š©š¹¶±¶Ž¹Æ^¥¡§h¡&
+!0<*I €^&mBhxYt¡¥©©II`ksv¬¬²²b¬­iy²ËÑÏËÐÐÁZYZ[WYV^ccou~|tokmyyvmmoqvtpiihllmz¹hoookmk[2SZ9Qvlmsoops_&7mysmp®Î¿oÆÊŽbdppsvpocgsqldqkikplhhlhhbbhmmqcA7U3=kzs|qª·Ä®
+
+ukdlklpmU^tqpqmtu
+vqxvyyk9?MILEHRZYOJMA5(,A<ARRVRVUSRSVQNLWMUMLOMH<7;82!=E_dI<Rkisuxy4Vcu~©ÄÃÂÆÁ¿œ»¹¶¶·­­¬­µ¹µ»ÄÃÊËÌÇ»¥¥š¥ € ©¥ y ÁÆÆ²bm|s[RcgUfQUxpdoQ%Lxy||
+xxzzzumsqlgqxskkhfJ^
+y
+z~¡²Scgl\o~u¥W}|q·ÆÇ¹ÃÃ¿œÂÃÇŸœ¿¹±ÂÄœŸŽ­µÄ¿ÓÎ»¬  ©­¹º¶¬ª­¬¥©¹Ž®Ž²ŸÇ_ ª§¡££®7L2(0*M€¥£€t%&V¡œdgu­®Ž¬zLLhlqu¡©±µc¥®ÊÑÓÑÐÏÑÔ»\R\WUSYZdfit|~sslimv|ppmqvstocddffiv±golokqk[,U^5Hqgoqoqqmf78pyxhk¡¹sœ¶±°ygtxsochoqiktidfiomighf[_fihp_;?L3@mzu}p¬¹ŸªzohhmlukS_usttopv
+vuvuxxU<FJIBEQRUUOAJ@2&' 9UJB9LQMNVVQRNOSUSMQIJSMND9855.A&MZQJL\kiou}
+q'E_kz~¹ÆÂÃŸÁ¹»»ºµŽ·±¶·¶²¹œÃÃÇËÎÌœŽ~}£c
+­·œoFL[gJBNZ8LObzoldR3y~yx|~}}~zxyxv}}tqkkkbhmpld^;g~z
+~~~§°xWkviSlo€J}vp»ÊÂÁÄÃ¿ÁÈÆÂ»²Â¹®ÂÃÁÃ»©ºÃ¿ÐÎÄ±§§ª¡ª±ÂÆŸœµŸœµš¹µ°Ž°¹¿d€­©©¥¬_`M!*"(
+Y§­®­¬š|=M@S®ÈoU~©±±°pIObgku£ššºiŸÄÈÊÌÎÏÐÑµQMNSOMO^Z_oox}tpkdluumiioqulmg`bchov¶illlimhb2V\9Esikqmustm;4q|ykkcpsyª yhovpokhoigipfg`dofkfbg_bfmmlg?7O3?i|z|p¬¹¿­~iglmlskV`ltsqoou
+zpvxxxOENNDHR\WWQOII9/"
+LW[MA;BHSRROWVNNMSQQMUSNOID998<A@M[SSMbkssu~
+i.JZm»œÄÇÈÇÊÊÈÆÃÇÄÂŸ¹µ®®­©©­¬§ }lhoxhzIoi.\cD49@0=F[ovtgW(&szxv|~~|~|}uzvtx|xuohlh\^folL<l}§ªZUlxhQm
+xq¡sxq€ÂËÃÂÃÁÂÁœËÆ·®Ãµ§¿¿Á¿²¥¶ËÈÔÐÄ¶®ª­©£»¿ÁÂÇÆÆ·µ·²±²»Âhšª©£¬¡Q;&
+*!c€±²­®­ŽŽm®qqht}­Ž±­`AOdmuy©šª¬c¡¡§¥®®¬®°­}tuspy|qkbu}
+}vvosy~~}|~~yvm¥·clkkhmmc0Q^9Fpimtpoqsq82qxpggp¡¶°o®¶qgqtpmigidddmbgcbihqzimtzkliohN8U;El
+}vxk¬¶¿®}hghpoplU^moqusss
+vtxuvz|[FMDEQSYWUNMEB<.'!=U[UQJMJRNJQROQQURWUNQQQQOH?8<0/HQ_UNVbksty`2N^x~€ÊÏÏÐÐÏÌÈÈÄŸ·­š§~
+uxystuz¬®±»Ÿ» S29IU/NL<2?350Jbs}||d&sxz}|z||}~}yz}|vp}}xuoplog^_fJ/q}
+|©YVlbMiuu€pz qšÁËÃÄÂÂœŸ¿Áœ·¶Ã® œÁÃº­š»ËÆÔÑÊ¹œª®§·¿ÃÁÈËÂ¿¡µŽ²²²ŸÃk€€©­¥®¡€QBL
+"EL"*ª®±ªŽ°¿áÊ€i
+IJ_YYOª°µ©WJVmpuuª¬°£`§E}§§¥§§¥¡§£€¡£¡  €¡¡£,
+t€££š¬§§š°µ²¶µ©pzfhkkgklc5R`4Ipkhuoosso=0isqkkl°°~€°[tolqqkmioflgmdkdcfd¶¿º·vthmhL?U?Dovutp©²Á­}iimklooQ`pqpspsu
+vqvuv~~[NQFOVV\WUFDINE,+!ENWVWSVZULLMLLNODLOORQUOOLFI?2*
+@`hUQZbhpty}~[7WizŸÐÏÇÃŸ¹¶­
+|yxplpx šµ±µŽµº»»œÁ·¡©tL02RDLLD**795SszzZ<x}~}}}}}~yzz~ytsv~uuuvopiibRF7u|}zª
+MVhdNZq}[}zy¡yªÃÈÃÆÂÆÃ»¿ÁÆ¿¶¿­ ¿ÃŸ»¬§»ÌÇÔÎÃ®®©€°»»ŸÁÇËÁÄ§¡···µ°ºÄl¥ª¥©€©­y8Lc+"F
+z­±²ª¬²¥¥×Êu9J?,=S`L°­°NAYmppu­°¶š`§2cš­š©šš©®®¬¬®®®±ª°±­©°¬¬­¥.o©š§¥ £ £¥€¡uloqthgiokph`5V_2Ipkiploqlp@4kxsi§£°Ðš|vc ukulqkimbdfuh_kc¡€š­œÃ¹Ÿ²obJ0Q;Dkxtvm
+©ŽÁ¬yvgfmlmkkU^mtovquxxszvsxcIQ[VYU[VNIIHI@'%	0LALROVYVSMMNLLILIJSOSNROJFJI@90<dgQUY\biilsS<Sqy€ÏÎÏ²
+
+
+}©ªµ¶µ¹±¶·º»ÂÃªµ¬¥_8[m24823..Oz}~tg}y~|}}}|zzy}|uqzzqtzvusqcSH[t}¬kVV_sdoz|~
+ptuªÄËÃÆŸÁÂ¹ŸÁÃŸ·Æ­ ºÂœ·¬š»ÏÈÓÎÄµª€ŽÆÁÂÇÂÊÇ¹ ¶¶±²²¹¿y¬­©¬€š±Q?;+&q©¬°ª¬±§}Ì0JW<HFUO®ŽŽFF^cb`^®œ¶
+¹x7'L¡§¡ ¡£££§¡ ¡£š©­§§®£*tª©©¬­ª­­©š¬±
+vlopovikmihmf_0U[5Flgoplplgs<.izxs·Ç§sgYsu ²£¡}itklmcgdtgbit­ÃÈ§±»ÆÇÄÂ b\J8S87g
+|}zyp­®Â­}hfhmpooW^qtppoutzttyqxbNRZ_ZWMMMHHIJ?'! ,QIIQSSSILJ@HFIMOLQQQQNSOIIIBD=7DZQLQOLSW\\gzI@Zy
+ÁÏÊÈ¶|vy}¡šŽœÃ¿šš°µ¶ºŸ±µ»·œÁÂš¶²š U?I+42(3%=h~}|ys~xxzzyyxxyx}~~|uqyyqu}|}xhRLiz~~£šv`~lfut}sšÄÊŸŸœ»ŸÃÆÂÃ¿¶Ì¬¥¿Áœ·©ªºÊÊÓÑÆŽ©¡µÈÄÃÄÁÊÊ»§€°¶¹²Ž»»¬²Ž±ª²·hk_*(3f4s§±±š°®®y·(/NOD=9H­°Žof
+usk£Žºœ¡S3!l­±°®¬°¬¬°¬®®ª­­¬­ªy|vDNpsgy¡ £ ~tsvusqpcikhblbV.S^;LhklskmphpA!kz}mx¥¥¬€v^UdVÃ±ª}susoqkcflf`^ÃÌÑÇºÃº®šqS`H5V83f
+yvvoªµÃ±zkgikoqlSWqopqomsxvqtvvcHROVUOJLJEIFF9"ARLNLQOLEHIHJFMMQNUOWSROJDBBFAB@8F?IMNQQRY\[tHEd­°¥~€¥¥²·¹»ÃÁœ£¥®µœº»·»ŸŸŸÁÂ¡Ž­©sJ03.F?297Qg|z}|}z}y}zz}|z}|~}tluzpmpxztcYLp|qt}§ €š£££
+yo ¿ÈÁŸº¿Á¿ÃÄ¿ŸœË®¥ÃÈÆ·®¥»ÆÄÑËÄŽ¶¶ÇÄÂÆÃËÏÇ§š¶·µ®­º»²µ¹µ®±œAoD"#RY
+®²±±®°±Eq}[\ZB;2*LŽ­®®š¬¡¶ºº~M3&p­Ž±¬®±©®Žš°°±°±°²°BJ[yq\\m[OE?J ®®°ª§yx}xzz}chhigl_W(QV5Fkhikkiklp@fvvmp»·®­xVEV
+±§ªzkkc`WNE9/('bš¶¿·Â£ªšk^fcA3I50`ysut­²¹®
+|dhhkmokR_uqsqsmqxtxqvvYELJNLHFNHHJLH3!3YUROIMOQRSSRNJONNRNQQORRNLEEALMJD2?NbZQJQW[YYbt;Olz¡¥§š€€€£¥ ¡©ª±¶¹ŸÃÃ·£­¶¹¿ÂÂÁœÁ·º¿¶£š¬©¶B5=DAEDLUY\^^Zuszzzyvz~zyvx|||xz}z}slu|sktvs\VOp
+|mq|© ¡£¥§¡¥¥ xoœÆ¿¹Á¿¿¿»ÁºÁºÈµ»ÊÇ¶±©œÈÆÕÏÈ±²¡ ±±·ŸÃÇÆÄÆÆÌº§©¿¹µ·Žœ¿©²±¬­±»BEI&"2J­¬®µ°²°q_sd?0E0Wš®­­®²§§¡¶·
+
+švW.(|Ÿ¹»··»ŽŽ¶ŽŽµ²¶µµŽµ€q<FRM;;IHE0@u­®°š®®µglllhpcU.NY4@hihkpiqkpY.hqqzy§ÄÊ~QNu}dtL+%!%%+3<;Ab·Ÿ°š€²²°_bd`I.H8*b}x~yvqqs}­²Ÿ±~~fcklosoW^qsppoqt
+}ptstu~QEHLLJIFDFDIHD.Ob^\YUOMRVSNVWQMOMNQQQRVUIIIHFQSSH,Wb_[WNMUVW^hox7Wx
+£®­°®ššš   ¡¡§©µ»ºÂÂÄœ§¡¡ š±Ž»œ»¹·¶µ²·¿œ®®š¥§UOW`c`b`[bfgY`~}zsolgyx|z~}zzzy~|x~~~tmt|xplppV[[xtopy €£¥€¥¡y}p ŸÆŸ·º»ŸŸº¿ºœœÊ±§œÄÆ·®¥œÄÌÏÌÆŸŽª¶œ¶ÆËÈÂÈÂÊË¹©œ·µµ²ºŸ©µ±°®®Ž·\IM
+.O|@°®­®¬°®cfqdA=I/bª±ª²®ªš¥¶µ
+y}Y8,ÃÆÆÁÈÆÇÂÈÈÃÃÃÄÄÄÄÄÁ¿¡@/5?<@75O¶»Ž¶¹¹¹¡¡ ¡·ŸÃhifihqdQ*H\99ffgoioisxu|vkfp©®¬ª€UHªÈ¿­xUYY^`c`_\gš¬y·œohgkokQN34cxv}zusssy§²»Ž
+zhchmmlmU\oqmqspq
+|pxtxyUIHLJHLILDFHID##SRQSMOMEMJHOQRSURVRWSSOVOHBFISOUVE'O_\_YURUW\^fkqFfz§®®ª­­§ ¡  §¬±ºÁÃÈÊËœš¡¡  šª®µœÂœµ°§€xstfiVQ_ovsummfcWWt~}xid`x€xv|}||z|z|}~x|ztox}tmlhSVg
+xu|vuu~¡¡¡ |mlvx€œÇÂ·Žœºœœ¹Ÿ·ºÐŽª¿Æœµ±§»ÈÊÑÏÇ¶Ž§¬©ºœÌÄÇŸÇÆÄÌ»¬œµµŽµÁÇ¹²®®®®²·¥y7<",x}SV\ª²²¬¬ª±²p@Bb_7
+US"­¬¬¬¬­®©¹¶~
+t|V8*ÈÇÄÃÃÈËÇÈÇÂÆÃÄÁÆÈÃÇÊÈ;LSUQFAÇÈÇÄŸÃÃ¿££€ ªÁÂ¿flfi`lhR'HY5<bciklis¡¡µzts±»µpkªºŸ±}kfd^``b^V_£ª}š®©©xx|~s8/dyz~|tout~°®œŽ
+
+vdhlilqkVWmqqttpuzuxpuv~dFHNJQONHDBDF?+	2VUQIDEFHFILHNQOOSVUUYWSMBBFFQQSRQF,EbZ`SNRUV[\fktQo®²²®ª²®®ª­ª¬¬­µ»œ¿ÃÈËÄÇ»µ°¬¡¡ € |utt¡ª£u@YgvzustmfW`~|}kfkl
+xu|xyzyz}|y|~}}~~}xls|udDHMboy~
+~}~zvy£€€¡i7I^tu£»ÈÈºµ»·œ¿¹Ç¹»Æ¶©·ÈÆ·­©¶ÂÊÓÏÄ»¹²º®²ÂÄÄÃºÈÆÈÇÃ²ª»¹²µ®ŸÌµ­­°®ª®·Žu/
+@q2\Ž¶Ž±°°²·¥dE*3
+?¬­­®±°©¡š®§±°x}U4(
+ÈÈÄÂÃÃÇÆÇÈÊÊËÇÇÈËÃËÊÌºVO\YWHuÃÇÄÂÃÃÂÁÂ©§€ªÇÁºflfkdik^,MW=8`hkylmš© €¥plq|¶©¡¡ŽgZdmiistpms¶u©¬¡¥
+
+qqgkzvtpuuy¬®œµ
+~xdcmmolo[\mstpsss|sxsxxlAMONQLEFEAHI@!9[^WSQOMMQIOQNQUQMUUSWSMJDBINRSWSSL"E__bYQUSSWWdimUx©°¹¹¶Ž¶¶º»·ŽŽ°¬±ºµ²¶·»ŸÁÂËÌÌŸ€}uuopy
+¡€¥£ª®§p\=EV_glsyytl}|tqvy}~~vy~y~}}~|}}}}~|upu|yh2<HSy~yuuxz~­ulO7Zvvh;U`vt£¹ÆÁÂº»»»»¹ÄœºÆ¬Ž·ÈÊŸ©ª·¿ÊÏÌËÃ¶­·¬¶·ŸÁ¿®¿ÄœºÆªš­¹¶º·ŽŸÆ©§š£§¥¥ª¹ |\Dk`x^®±Ž°­±±°¶µV7,
+
+
+p®·µ±®°€šš©±¥­·vy[5&ÃÇÂÃŸÁÇÊÈÆÆÇÈÈÊÌÌËÆÊÏÃhOWYZD£ÇÇÂÃÂÃÂÃ¿¥¥§¿ÂŽklc^Zb`Z/QW89dlluzxsm°­kk`yyv²°¥µ¡šzuxxz}}|£œ®
+}ÃÄ€vumuuu¬­Ã¶|dikkmloZZlpqtuttzstqsz
+s;MRLLLIIEHHJ?!A_ZWZVZVROMRUQVURQYQORMOHHJNWZUURLH,5bc[VUY[Y\[flq`~°­œÂŸ¿œ»¶»·µ²°¬¬­°°²¶µº¹µ±§
+l_Ycm§ªªš§tWEEQUWW[cgg[[\soqxz~sxvx~z|}|}~y||z}~~ouz~lF+;b
+|ssg*_\hI9O|xs?[c| 
+s§ºÄ¿Ÿ±¶¹ÁœÁÄ¹ºÇ®±¹ÎÈœª€¹ÁÈÓÎÈÂŽµ·ª··ÃÃ»­Â»¶»»­š°¹²¶¶¹œÁ©µpQD2#R`€€¬­¡š¥§©»€}`J&
++©ª­§š­©Ž¬µš®²}|§€_4'ÄÃÂÃª°Â»¹¹¹º·œÂÂÂÆÊÈÌÈxR^[^S·ËŸ·ÃÂÃŸœº©¥££ªÁ»¥AA;3/E^b3JZ55liiimgkhdqllb`u~¥®€®ºœ²¿­º¥¡±¥
+|ogbURcªÊÏ×€zuyusvtª±ÂŽucfimmolYRimsqtqs}szuusxFEIJSMLJEBAF;"HUYWVY[[VR[VQRQRSOUMUUNLRLMNSYSRRQJ00_`[\USUYWZhuzk¥¬®ÂÃÁ»º¶¶µœ··¹µ®€¡zyqi\kt~
+£š¥zZV^VYSO;3#Syutqqyt}}y|~}}~}~}z|~}}zsx|zVL.i
+zoysqO"^k~J<Oxzz8Uk|
+q£œÊ»¹­µºœ¶ºÈ¿Ÿ¿€¬œÈÇ¹ª ¡¿ÊÔÐÄŸ²°µ§µŽ»·Â²Žµ»¹Á¶±®¹·¹º¶ÃŸ~~zz
+¬c892+}|z¡€ £¡®u^O;#
+#vµ ²¬¬²yšy§²h9'ÆµÇÁ§²Ä¡¡qObW[Y®Ã»·¿ŸÃÂÁœ§££ ®Á²§*/=LRcqg4LU55hph`kchgcZqxv`x©¥±Èµ¡¹¶¹¡©·µ£š²®©±MRZ`3,09Á¿®ÊÐvtqqxsš°¿Ž
+zcfgklomYVmopmtssztxvtu}LIOQJIMIEEB?+.RVUUWU[VVUQUVOSURUROQROQRSRRUSUUOND<&\fc_YYYWV\dpy­°ŽÃÃÂÃÁÁ¹·²­§tkgo~ ®¶¬~~
+
+uvyvvtsogc^YZ`y
+xyyost}}|z|yx~
+|~z
+
+~}ssvuUDN~
+~upv~~|F+`zv|O;L~
+9Zl~s¶Æ»Ž¶ºœ¹œŸÂ»Ÿœ£ªœÊÃ¹¬¹ÊËÃ··®š€®ÇÃÃµ·°·Á¿Ž±²·¶º¹µÄ»vpkkqME*
++z~c}bZS?!Z
+£²±š¥€±|¹z°Žk5,ÄÆÆµ€±Ã¥©²­¬¬ªªª©¬©¥§€ySc\[^Â¿²Ç»ÃÄÇŸ§   £­¿°€V^`mq|ul9MS47hgibldgk\R~y
+udcv€€ºª£ªŽÂº}xz®Á·š¥§Á²|
+tUMS\\g¹Ž·ÄÌvqqluuš²Ã¶
+ydfikokp^Vpppsuss~zqtssz~
+VDHMLIF@A?@7
+
+?ZVYVVYVYZNSSVSNOQNNROQVWYYQVVWZWMRMA+[`^YYYYU[^dy}°Žœ¶Á¿·®šxpihp€±»ºÄÈº
+€sptz}z~}}y~~}}~zy|ysqfVJV}z~~vth^cy|A(cyoyS<H
+z~M[hq¹Â·¬±Ž·¹Ž¶··¹Â©ª¹ÄÃ¶­d/9|²¿ºµ¹¡ª»ËÇÊÁÃÆÈÆÂª®·¶°¶¶¶ÃÄš®Ž² ­¡~M(#
+Z_Og|y}}xxv}yU;[JD?¹š¶§¡°v¹xªŽo2,ÃÄÄ· °Ä­®°­®®®­ª­±±°±²Wc_bh£Á¿¹ÃÃÂÂÄœ¥§£ ªœ®€dglq|zob8FL47hckdifgh`ushb^^sm£¶²²®¬ËµU2+J­ºœ~°v^Vh\k·Æº­Á¹¹qsqqxpš®¿·
+¥œ®ychihllp^Omqppqptzttvxuz
+
+`DQNIJFBA<=+
+=VVUUWRVUONLMQJJMIQQNROQNQSRVUVSSRLL9%^[cWWQSYWZdu¿·œ¹|uvx|£š¬µ¹ŸÂÄ¹
+iks~~~z}|x|z}~~}~~}|mhfW_~
+|~zvqgdkxxyzJ2fguI?Isf\`kxq§ºÄ¶°­­®¬±±º±²Ÿ©¥µÃ·º±uV7s;i¹¬§µÇÇÄÁÁÄÃÈÃÇ­¬»œŽ·Ž·ÆÈ§ £¬·µ»·v%%(%=b§§©ªš§§°šf<@H(;ºª€ š²š®}µyª¹o2,ÄÂÃŽ£²ÂŽ®±±°­®­®¬­°°°ŽQ^b[p€ŸŸ»ÂÂÄÃ¿¹£¡£ ­¹ª¡glmst|y~m[U59gcibihkfi}x}v~~gc§º©£¶Ä¹zxu¹¥fOW|zgu®²kY5Zbl®­}š§¶qvq§±Ã¶¶ÎÐÔ|fgimmmmYRpsoppsu~tuuxsxoJQJLHDAB8(LZYYVUQVMBBJFD@HFFJQNOQQSOWQYSZQSIID=2Y_\[RSOY\Yfx­»œÃ¹¡£§§§€€¡£©ª¶œÂÆÄ¹ 
+
+¡ olt}yzyyyz~}~~~|}zphkhdx
+ysymif\dmuxcOo
+tzSIR|gfhckyq¡Ž¿»Ž²±Ž®·ŽŽŽ¶œ©¡¶Ç·££IW`v,O?.t©§ŸÂÄ¿¹¿¿ÃÈÇ©¬²¹®®²²¹±€
+¬ bH9;HDHN[t|~~¡|4<2(Q­®­¬©¬§ª®°€£Ž°p¬·v4*ÇÃŸ¶ ®ÂœÃÂ¿Á»ÁŸ¿··²¹··J_iVs¬œÁ¿ŸÁ¿ŸŸ¹§¡©ºš©~}p4,\^icgfdg\Ziy}xp¡®¹±¬£¥š¡€~|hku±¥§±±`klic¡§©ÃÔ®txm¥ªŸµ
+ŸÔÌÁ}cffgomo_Mipmolpo|svpvvz|FMIJI?@<;*%V[Y^ZVSNLHFLJMIRILMMMMRNRQYRSQWULD@DE3U^^SRNRQRYdqºÄ¿Á»±¬®±ª¬ª€€ ¡ ¥ªª²·ŸÁÃÃµ
+|
+€uot|||~~zz}}|
+~sg_gh}pc~|skhkd\fqmuhox~yp[gut€·œ¹±°µ·µ²Ž°·µŸ²€±¶h*<
+f2fWdkWEp¿ÆÂÄ¿¿ÃÄËÄ© ¥ÆÁªº®|qZ@@B@8ADAB=778055?HO[cbUF&
+sš©©°¬©©©Ž ®®£°
+¥qªµp2/ÃÃÁ²¡±¿œÂÃÄÆœÃ¿ÄÂÃÂÁÂÁzQit¥¿¿œÇ¿¿¿Â¹§¡€§²§¥pQ^\chldfgWOlldq}iu ¥v£§q
+€
+s€©Ÿœ|§|mkldb©µ©µŸ¶¹Ž
+©ª»±
+|}
+©±Èª}fgilkpm[Oimoohio
+zutusv~E@FHFD@82(
+	*WVRWROQLNRSSSQLQOMQOJJNFMQNNRUUQB@@MLBOc[SQNNQUZgpšœºµ­¬­¬®®­®°§€€€€¡®€µºŸÁ¿¹
+` ©¬®®ª®®°¡
+
+||lpv~y}~xy~~}xy}|}|~z~iZ[l|~zxs^s·tpu}u¡
+v`_v
+t£»œª£ª±­š¬ª­²Ÿ­©kHJx2f;zYsWI=q^[ÂÊÃ¿ºÁÄ¿»·¬
+¬ÜÄ»Ç££osxbWNJJIJ=?;9;97;5439=JS\bd¡£¡£ ¡­¡ªªª¶¡v®²q4+ÄœÃ°£¬ÂœÆÆÄÆÂÂ¿ÁÂÃÄÆÇšYt¡
+¡Ã¿¿ÁÃÂÂ¿µ£¥ ¥±€¥ubhckdidlvistcl`o°š¡Âšpmq±Ÿt
+ioqhp©¬®ª·®ÄÌ£ªšœ¶
+® ©Ž¶Ž|ddkllko`Rpmspomozottuu}
+`;DHB9?97&	3SWYQMORMMLIZNVNNSROUUNOOOLQNURNB9A@NIFD`YQQSMSUWgoxv¥ŸºŽŽ·¶¶»º¹·±¥£€£®­°·ÁÄÄºd¡€®®Ž®°°µ±®§}hh
+zi~xgiu~zy}yz}|~~}}zz}}ztdWSz
+~yuqfb
+¹£š¬®­ª€§¥dhy}s£·œ¬€€§­€€€€£­Ÿ¬¡0%_'Q9B&4/QNoOyÁÇÁ¿¶»¥xšp§®°šty}ºÑšfVVNJFFEB88,95@;55833<HEZy¡§££ª¬®­u©µy55ÂÄ¿±€±ÂºÆÃÃÆÁ»ŸÁÄÂÄÈÇVy°q¿ŸÂÂŸœÁ¿Ž £¡®²š€
+}}yhbU_f`i`dgv||fV^li`k¡v¥¬¡»¡}¶Ž££šuomkst}·¬Â°qš¿¶ÂÌ­ÁŽ­ÏÑÂªœyd`dimli_Qkoospsm~vpstsyx
+vD<HD@=82#
+@ZUVVUSMNNILNMRLJNNQSSINNLRNNRIB7BB55897YSOLONLO^fm~§¿Ÿœ¹Ÿ»œŸœ»¶°¡£ ¥¡ª¬²·ÂÆÃœ€
+_€©®²­­®°±°¬§
+cly_u
+zshkp|~}}zy~~yz}}|~}zh`\p
+
+}||qkfb ©€¡€©ª¥©©©©ª¬®©£lgy
+t¡µŽ²­¥ŽŽ±Žµ©²¿ŽŽ¥?%;c"40/38J`@mIqy­ÁÃ·qZNOH0o©|¬ »Õ¬\SMIIHLH<==579;4922+&,,+8\b
+©©¥¡­°­€u©¶y52¡ÃÃ»¬ ²Â¿ÆÃÇ¿¿¿»ÁÁÆÆÆµfVdgz·»ÂÄŸŸÁ¿²§¡§®¶š£lf^SMID<972<AUhgbh\bibg_oduqt 
+y ¡~£­©Ž
+€€xocbhp
+¬ysu­¹¬Á¹²Ä¿µ¶€¿Ä~ffickml^Ofloqsmm|xosstyy
+N=EE?;.
+,HZQZVQSSUYSUYNORRQMMMLRQSRURQUIB<?;#0D/'VFRRNNNUciqªº»ºº»Ÿœ»ºµŽ°£€¥€ª¶¹ŸÁÄ¹[§°®²²¬ª®®°®§
+
+}Ztz_tthcvz}}z|y||~~~~tpl`p
+~z~xy|phkŸŽ®©© ¬ª©§©ª§
+q}oksi £š¥§§ª¡¥°¥ª8'DW^AB+Zh~uyAf\v €¡£¬¬­±Ž¥š×Ë£}dRWJJEF9750/228<43/2#,+*+`lv£}£
+¬ £©šš¡s§»~2,¡ÂŸŸ®¡µÃŸÆÃÃ¿¿œœÄÁ¿ÂŽQRclio¶œÂŸŸŸ¿¶¡¡ ­µ§€2<D@DRQYZ\cgfggi`hbbh[ff|u°€­ÇŽŸŸ§°_`Im}o`bcf¹¶¬}lu~¡~€§»·² »¶¹œššŸ²zgfilfkk`Ihppmqpo}qqptxy
+g8AD?9.''3?LWRVUSRROQRQJMNQSUQQWLNSOSUWOID?8?HA?0%^[UYSNNY__m¬Áºœ»œŸœº¹¶Ž®£  €©µ·ŸŸÃ» 
+_š±°°°Žª­ª°®¥~~qRcz|yoicbf|tlkxy~|~|}~}|yslf`
+~~ytlidlhgµŽ²  ymh}tpl °©£¡€ £ª£¬²ª©Js
+#V[b}kg\Uz}¿ÁÂ¿»²°¬§¬€±£©ª¡š¹ËØœÊœŸœxyqsmSFDJ<53372/+/"Qh š€
+² °¥©mš»~0H¡¡©££€ºœÃÄŸÁ¿ŸÃÄŸ§~f^[igcghmt}§¿Ÿ»¿ŸŽ££© ®µš€V^`d_kmpoidffhid_hbhiZEv~\Y|u ¥xmy\€š©€° cLlfSS~|ztbOZtx
+·Ž£·¬°±¹q¡©¿»¹¡ª~k`iikko[Qmqqlpsq}opupvz~
+u;8?B;;8=A;ZZZVSRQQSWQVORSLSRNQOMRSUURLQF=<@MMUYRJ!b[WSSUQURMf}
+©»·¹¿ŸŸœ¿»º¶ª ¡¥¬¬°¹ŸÂÆœ_ °®±®­­¬®¬®­š
+vqfVcichd`[ci}||x|}~yupkg}
+~|zslcdlpZ<HRZ_lx~¡€¥£|dkF\uqtt|pu¡­¡ £€ª¥¬µ®©d=S=@/Y^iktdt© ±¹»ÏÓËËÊÆËÐÆÄ§¶­»º§¬©¿¬ÇÔÎÂŸº¶§ ¥š¥yhltdgofb`VH7'&3_h¡ © £¶±¥¬§i§¶yE}¬ÄÃÆŸÁÂÃ­d\cfgikothhss©Ü®¶ÂÁ¿® §°¶¥£lmiohk`^^_\bdmd^Z_^dq_fvvpvzf€
+kQ~}° v
+¥Ž©¡~dVy^d¥¡Á¿z3Dlol®µ
+¡~xf¡šœŽ}|££}b_kikmicHgokqomoy~oytutxU5@@?@A?5"OQ[ZUUOSQNRMSMNSVVRSSLSRONSSN@8=FQUVVRAYZZVVURUSFky§»¶·ºœº»œ¹µ°§ €­®²·ŸÃÁ·`±²¬Ž°±¬¬ª©€}slfd`__cimfgdbfk
+z~xy||}||ssllq£}~|yqk_Yk¹fz€O%&/+,.Ac|s[SNQS^pkqq|ptšŽ¥¥§€¡§­²ŽŽµ€J5mhd<MxŽ®·Ÿ¹ÄÐÊÓÓÊÈÓÏÌÑÎ²ªš¡¿Äœ·ŽÃÃœ©€§¬§¬®­£ ¡š§q\Y^dkpt}}vzsssqs°€¡­·©ª l©»
+
+ÃÄÄÄÃÂŽzYYOddfctovlmz ²°¬Ÿ¿µ¡¡  ±¶©§fhb_\^`gfigcbid\\c_tp|vyvtuyyzii¥Ž­¡d@vtmuszœ±hEv°­
+y¡yltd£©ºš­ ­zfdhlpkk[Jhommkpox|qssmxv
+
+
+
+m5??B745
+JMORSQSRUYUSNQNLRSQZRNVLUONNH?9BNRRRYU.
+UbZWSRUQS=hxª·®¶»¿¿»·±µµ§§§­­­µºœÁŽ^¶±šš£zvvtmoohglkmlfkgfdm
+ y
+||z~||}vvqms ¡~~xshdZmº±šu!"3DRimksp_NQMO`_[qqzms¡­š¥svmmmxx§µÈÃÆÈÆ»ÆÎÑÔÕËËÇª·°ÁÆ»š²­®¬ª¬ªªšª§yu€
+cd\^kqxlvuzyzš£²}¬¡Žª©š€i§»}
+¬®¬°±Áb_UVkighqu}¡§x|zºº¬€¡§±²§€Z\_^ddhlb`ff[_`Y_gbszvZJHmzxvsqg¡¡vUos^Ymikqk7opvkšŽo[­
+}¬o®
+k¡š¿¬~²­º£hhkkiiibOhopmospy~msvuux
+z?<=<990
+%MSUYNJIJNRSMMONOWQQQARONQVMJ?7BDMQQSSO%M^VWRSVUR0Yl­º­Žœ»¿œºµ¹¬¥¥§š­²²·ÁÁÄµ
+Zp
+yyzysppppopslihiclqyx|yz}}|uusqlxlmd_\y±»±šµ"%.;Zu­ÌÙ¥Wkh`MSRW^`bsxqv¥­ £€£`JURV_SI^c`YWWWYYZOQQWfmsqq|~
+ šºÁ·¶Ž²ª­©ª¥xmzmfcclqvvoy|
+y}£¶²u¬©šª±¬i£š}ugu~x£ŸUSUWkzu
+dlmgi¥»®€£ ²°¥€ ygZ^syyzlb_dc^hc_E'+Zy
+yqit}
+xMQi\IN\_uulO9h~uc^|qv
+²£~tvz¥­xtœ€¥­Ž®§~fbmklok_Ffppkkpoxsspssv}
+UABE<8+*@NUYRIUSOQJJLNJJJLF@AONOUQIF85INQ[SNWL M\ZZ[ZSOQI[y©±§¹¿œŸÁ»¹²­¥¥š®¶¶¿ÂÂÄ²bUhz
+
+}yuxtqmklmfdidb^_kxh~}~|~ztsos~bc_^vl¬»œ©º&%.8Ll°šZHBLM\[`__dyz}p~ª°€¥š¬fVYRUNHEHHI@FDHFLQSSR_^^hc\dgmikhhffc_`V_\`hmtus~ ¥lZixssfpogbkoopu~
+
+§£¥¥µÁÁqp£€šŽ££dosp~ª¥|phYUp±ÁuLLUV^`VpoygflihV[\[^¬»ª€ ¡²Ž§€²Ã±x_b~t|±©ycbc_gud_NJWblqiu|yulZ9/UNd_yvhN8@uu}q\ll^WRW¡¬°}SBox¬q£x¡©š~zgbfhlik_Lgioolllx~muptsvd99A<<20HQUYVWORNQLORQMNQJLQQVOJQNE;89ISSLRQV@
+Mf_YY[RRY^g~©±§º¹µÁ»·¹Žª§¥¬±²¶¶ŸÁÄÃ¹`V`||vxuvt`z~}~}yzup
+zssg^s~if
+§±œºœ37.9Ih¬»}\F4!
+,@MNVdsty¬Ž€€¡®šzyupuod`d`__`___YZ[VSSSVSOJJDHD@AENOVWWbdfgfkkips|m`t}zfgidc[b_^hh``kv
+¥§»µµÁË¿vo ¡šskYNNMm}|
+€pJ7EU
+ºÄIFRRVSS^^^VY`gcYU\Wc°»ª€ €µ±€£¬¡€¡£¥¡mg___``HSZsqq~VH_
+sl^WHMSvqzvh^mV^zZ^i<Yu§zRZ[mtlok¬p
+¡ 
+~fdfflllbOfloomopymsuuqy
+vBD?@;(/BOMSRQONQNQOQJONNRSWSOOQQJD85BOURVRSS3BiYVZZUYWWb}°°¥ºœœ»œœ¹°š§ ©®°µ·ŸÂÇÇ·_ft}m_
+|~}~xus|yolspdqhic|£ªºŸ¿ sp^i
+£ªxfQ5#!(,+(/9FJM\€ ­®€©®±®·²¡`\SUWNWYibWS^qd^bmgggf`^`ff`_bcbfcb_YNLN\uu|imfc`dc[gplips}z|x^HE_ xmsqsvy|cYmx~|~z95F^ÂÃFDHUWgSWVYOU^c\SSYQzœ¹®£¡±±¥©±­©£ ·§}uh^c^ISF~stsB.%3^
+
+tz`YM^[o~NROZxb0EIyºYQtzpbz pmktmy
+
+š£š
+¡yffgkihlcFgmmlkmlyoqssst@DDB<'8AQRYMNSRSNNNRQUMOOQSRNLNQI<2@JRRUVSUY 5d[ZUYVVW[b|©ª€²²¹»»»·®§¥£š­²¶º¿ÄÄÇ¶bo
+~dS
+}zzzzyxvou¡}upompv\^fc}§±ºÃŽs§ ohddVZJHD%""#
+"*?O\dox
+pbzicNtshmU_otm~©©€¡£§zx~t}opytvsillkiomptslvy}yx|um^WL=8(%!
+5b|csgWN9.lÁÔÔÂ²¥ª
+p~z£§9=If£ÁÂŽfFDVSNNW[WJLc`ZUMNOœ¹©€£ Ž±¡£h¬®£¥x¬©d`\km`U
+|cqlY4/B|sbl§qN/Q[Yv_&<DSVE/ZQ§}d_`zfd¡ox»Ëª®¶°Ÿ©®š~|dcfikmlcJfimmlokxtsvqqx}
+
+M=??='
+4DQMRSQORSONNQRULMOOROINNM94AJNWQOVVVU0_\YWYZWVVbzªª¥°°±·ººº°š§  ¥®²¶·»ÃÁÆµfu
+z}~
+
+
+zYIuz}}yxzsqoumsppoWY\cgq®¹ŸŸpt~ofc`klgf^c[fdttRSLA5'&
+
+
+%*&#3<?DUmof^Z[om[_l
+ŽÁš§~uyzykt£~igQ;8.
+!!
+
+
+38Ql}xtiA<*&
+8©¶€}Z=
+b|~uyx5?Iu­ÂÃÁ@;RRLFW[W@EW\OJLHf·Ÿ»©££¡ ²°¡§dqv¥£€­©h_^h~UZvvgME?4\ohJZDzM0=8OdZ8MBZS@MYxqœiO£slqyqu±»²®š¥·¬¬~zp~cb_dgih_Idmmqkkkxpqqqpx
+~E@@9*"AHONVVLRSNOLQSQRSORNRNOMI@4FLSSSOQUQVL
+b`YUUYWZ^c~§¬€ª­­Ž¹»»µ°š¡¡§°²²¶œÃÄ²fp
+~y}yutvuutstzz
+~~} pN<yzz|xxvqqu¡yxxmhhUR[\cfp ©°œ¿|qf`S<25?00&&%,33/;;EIR@@?DFDIJMRHERAB5%
+"!
+4;B</'
+	
+
+
+"(+<[xzS;.*4'0.%"!
+!
+	
+
+"*3i=&&@`tvmmdN9cxW
+
+
+m}|qpu
+R7@YºÁ¿Ä»g4ABB8RYS@BSWLBEMœ»»€ €±Ž ¡m£ub~xoE^[QDpqZ_`Zl|
+zkL_[_L@2=FS^ZhovMlzitz|ŸÈ°ul|y§¹|
+ªª­±²ª¡~f`iihil`HgmommmpxmppqqqO<?;.'IELORUSUORMOQURVRUUUSVQIB99FRRVUVVRVW@
+	_bYVUZYQ^dª©£©®®¬¹¿œ±²šš£§©²µºœÃ­gyyf8Hzyzvyuxssq
+~xvpi[OUW_blpv©¬·ÄbVUW4""/&+.!&
+#"!
+!!*(587B^o|mox|llvxE34AMD4/+'	
+
+*
+	
+	
+
+	
+
+
+
+
+
+
+*Zg
+
+
+<M[mup`S4.((2l§°;\}zqgmt89Hh­ÃœœÂÃ©D7AE=EIE==LO<A@|œŸœ»© ¡·®£¥clmtzovhuuziucRY\WlxWFI_^oxqom_Yb[toLu¥£¬cWh©££
+mtus ©bMf| §¡²©}fbfifhk_Iimmlllkvqspsty_@AB0/EMORQZRRSLOQFLOUUZUQWUOA<<BONQRURNRUY2
+^cYSVY[[^`}¬§€­®©­°¹¹¹¶ª¡££¬­¶¿ÁÁ€gz
+\(R|xxyysstpo zyus_WLNYkx~x
+¬¹Æ%,Vc?!%3,.(
+"
+
+"%
+
+
+%"
+!&!!'(/?D?=L\l
+§Ã€
+xhZE.!%!
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+ 
+
+	
+
+
+'#,"0s FAkpuqbQF7.*,,%,*Hœ²€ª~vvdF+Ohyº¿¿Ãœ¿»[2;=;<;J<HIL9BS¬»Á¿»© µ®¥šV\^l~pk
+z}zts mogZ[
+dLFSgm^Zy
+|q^RLz|sp^¹Ž`©®€vbO.;cmW|kbkyq £¡©¬~}zf_hfihmcHkmimhkovovvstu|
+
+oD@829EAMOUVNYUOMIMNQOSRWYSRI;<JLQMVSQOONOS.
+
+	[icWYYW[Z^ª­£©ª°¬®ºº·Žš€§­µ²»Ÿœ€iy
+ £zF"[usttvuspl
+yuugVDDMg~yzyš²Â¡&!,@%!#**2&!
+'#""("&&'**&+*%
+!("!!
+#("*'('&(/2@Wct±g?%
+
+
+
+%
+
+	
+
+
+
+
+
+	
+#(7%9t®R70(.(/02/,/.h¬ÆŽŽu~y
+ÁŸŸ¿Â¿ºl@EOJdVL`f\9RNq¶Ÿ»»·££²±£¥y~~y§mH=?hp_MLblUO}¡_Y`hbkh`¡hql[M²kcN!;f_oZ\f}kt}~}
+v |ccdghhgcNhmmimomyqslpuv
+R?98;LJSQSUOQQOOQQQRRSWSSOID8FMRNNUSURSUOH+ Rf_[WYZV[bš©§ª­°­­¶Žµ°¥  ©­°²ŸÂº¥mz
+
+¡z8Ruxvsxqoy
+yxibN@;S|
+~|uzxz£®Ÿ­0&
+
+7&'
+&"*&#""'#*&&"(++.%#'
+"*/'2*/+&&%#%
+!!!<MgÈâ±~qQ@%
+!%(9@E4'
+
+
+
+
+
+
+
+
+
+%&2O[YNY[NM=4.*,++43(2/%""!x·È¶ ª§¡¥£¹œŸ»»œÁ²^4??87/<VJ98B¹¿¹»µ µ©¡
+}v
+fxN8\pg~h^JBI`lqpvNM_WHWq_qsdJibUpQ
+#=Yop^II€²­®€xo~t£
+~~|ibgfgglcHbhkoomou}pqmvsu~
+b@=49IHSWYZVUSSRRLSMOSWNMHEFERUSUWUVZQMLO83
+Hkg^VUZZ[g £ °­®¬¬±·º²£¡¡€ª®Žœ¿¹ox
+§t,9oputom ~xtm_E8=Z~~vxx}¡°œµ="'..
+%%##
+"#"&#'''(,!'.2,(2,/*'*+.*,%'"
+&7*'7JQ[^\O7%./=FQD5'
+
+
+
+
+
+,Rc4&!'+(/*/.(('(
+,*"''#%p®Ÿ±§¬ ¡ ¬»Ÿ¿ÁÃÄ<@JB?<9<Q==yŸŸ»¿Ÿ¶¥ ¶§€NDB5,,989Fky
+xxt~c5htMSc\VANc|xyEON<QH£mtumA,Hhpsh+",Si\sx£¡€®¬}§±¶}}d`dfgfk\Hcilqkksvpttxzzt@40=HHWRVZQOSUOOSVSNOMLEEHHSURVQSWSZQRQL89
+9gfb[ZZ_`h
+£¡®±°®°±°µ­¡ £ £¬°°Ž²¥g|
+¡m+7*ospss¡ xsliSA??l|}yvxtx¬º»N%%"&3&&#*&'(
+!
+
+"""&#/+&!#(./3.3//,;20,'."%""
+
+
+(?IF8<9EE;,""!%%!"	(yfgN3,+%*"++4/+("%(%
+""!"%Fq ®»»»»ÁµZ9RMILAIUNL¿»ŸŸº¶€ ¹©€""%.;B=D79Lkqv}}[mW9\h^Vb_IEAFQ`SQMbod/5MQ~x}`M=V[\_oth4_tsVBftªª} §ºœ|~}|g^cihhi^Mflkkmmlsuuussx
+
+E2.;EJIQSWYWOOSQOQMHJHJIQRQU[QZWVSVUVWSL99
+
+dh_WW[_\i
+ ¥¥­°®­­­ªª©£ ¥¡¥£ bu
+
+
+zWd4gskx ¡ ulbM37Bs
+
+|~xqss|y¡¬º·B,.",Oyx~yyttusoilf\ZUQQE@<..*+!
+#!&(.00%+,#(
+%+0@EF=2,%!
+,
+
+%(#
+
+
+
+".58@=(*("#%,%!%.92*'(#&,/\Z+Yc!.%8o~vz¥µ  ¥±»œºÄÃ8INLSANUHf­œŸº·œº¡¡Ž®€?EHQUOJ?35H\vzM^v~g_dhd[LIB@,4YbldmoE9;@i ~`q
+
+~o`[mH_hu~xcg7V
+£~y ¥·»~z~yc_flhhl\Fcilmpqlu~suxxtsz
+
+
+h8.@EJOLRMURNSRSLOEDJLMQQQSQVZVUVSRQRON<;;
+		`i^UZWYZk ª¬­¬©¬©ª©£s~f\loy~€© pDl°°
+vf[F9/9s}ptss¬··FBE%!Y
+
+~zyspi[YOD4,(%#%'
+
+
+
+!!!,,%,29@5+&'
+%
+!(80
+DOUV\\\``YSZ8*#(,&*
+&!(*&B'!#f[v5_,!"Z£§Æ€§§©¡ }y£µ¹ºœÁ°I=JLWDNHLµœµ···¹ ¡¶©§DNR[b_[ZN4J^y_ikfuphzmZMDIOLDFpifySo\EW¡vmpqgB8Rc
+~sU^z£i¡¹»~~£zc^cdffc[Idllhhkltqpousu
+
+
+xF8LHLMWOSOUQQNEHHOQUQQSVSQRRQQUQYUQO@75@#
+
+	
+^mdYRZYYi€§ª¬š£€¡š©¡hbQ\oploqtpsoqmpmqoqvx~
+©©°ªª­£¥}bO07,?t
+
+~ytssuvšŽµIHOF%Mz}
+|
+}xoi`N7#
+
+##
+&*/(3+'8JV\
+2\
+(fV
+
+
+
+*chfifdf[^OYS.*!(%
+!Mlyt3k!'ogs;s@!O|
+ª§~ÂÁ§Ž¿Ä»¶ÂÂ©uy°º¹ºŸÁ;?EF<FD|¶Ž·¶ºµ¹Ž°¥€fhgdhcZYJ;O_ zi^gg[lyxUF4;?SSFv
+}~~`ppJH[zEQIWE?(8/izcqy~}vu² £
+c¥¶¹y¡±· ~c_ghggk_Afihkihhq|osvxss
+uMLNOZNUQVORRNRUSSSWORSVURVQQOQQQRQ428;'
+	 Jicc\[W^o
+ ¥€¡¡¥£}fiz~Vk}~zmmqu|ttuyzz~~}|}~~}zsls§ŽŽ§šš§f=
+%+2u
+
+
+}zyuptvš¶°?
+@VZ0D}~
+
+
+
+s(%5c&
+(#!35,#'.*/R_c
+;h
+2kU	'`igfigd^YRWU0"
+&+
+&.
+=0udk9xf/*iy©¥|§ÐµÃÇŸ­©»Ë¹z©Ž·»ÁŸµ[7DQ@<Yš¹±»¹¶¹»Ž£µ©€Z^^Y`b^YJ/LNqs\m|upcmby~hB@0.HMLpklY[_`S=5` }stM@%#F\R9OQQNJBY£ t£­¿µ·Ã²~d[bkgklcD`iigohhtsmsstt}~
+IIJMYSURMLSRRSYRUURSQWSNURSROQSQNN!/;;0@oh_W_[\u¡¥§¥£~qdbt~x`bmdbVVV[ypb_\YVSY^_hkqpuyqluª§¡¡² zi4!%,^
+}uqtofuªŽ°;(@OW'9x
+
+ ¡HF^²`
+"<</&,/%N¥'
+[*V¥
+	,bdfgcg`SJOQUFN%.#
+&s~utm&!7u\f0N3N0WSd©µœ·®  ªµ±
+¡°¹¶»œœDOVWVt°¹Ž¶¶¹¹¶²£¶ª£\ffl|fO0MUl~mNRlz}mu}lH??#I\dSDm\A+H`SIBOYW`iiYS=+4mvyE<&&2"0g¥ªz`f ||€ÔÃ·|
+ z
+}f`dkfhibDdlpiiklutmqtqv}~
+
+yIIMOZVRVMNRRRRWOW[WUOVQROLOQNMSQSH9885
+
+&gmg\Y\\z
+ §££kcdccstSN[[ZYSUYyzqod\ZVRJE?<48((*3Iº²p¡z©¡b^.
+,,B|
+
+||uttsy€Žª35D?&uz}~
+
+
+4d¶b(%+
+pS/3*%++N­º¬8\¥?V¹¥'
+
+	7¥
+vf`QNLN('"
+#byF!"
+Fs_i*.3kv5i
+=g~~
+šºººµœµ[ISMYµºŽº··¶ºŽ¡Ž§¥
+q[*UZOJJ?/s_kmlmFA<OJ8HO=,4(+*._I;EuVQN;@_hJDiok^bE!?'+S`v|Ž |i£šy§}
+gcu`bbhbgi_E_mlkilpsssqttz}~
+|ILQQSUVVSJMQOQORUWUOOYSOSOROVUVNUB!42?7*
+iofcb`h~ ¡¡€¡xlhcduz_Z_V\gbMUopos}gO?8+&'+&/"#=5·¡ym@`zWWA#!"%h~}
+
+~}|vus}¥µ£*8IR"/ky~~
+
+
+
+
+
+0V¡O5.3=
+
+fdL"!#J¬'^+Y°
+
+
+
+JšºŽ¶¶®¬šš zl2,''+lzs#(#Fppm,/\<?2
+Otpt}~
+š®š·»·»»»udfcp®¹®¹µ···µ¥Ž€¥|l\(NZJ/4B?q|uhct\=9V9?@/kM590&L9JEfSV4EWdSSOWQo\3+O^Nd¥¡š}h€hs
+¡zg`^iikhdA^ihoiimqxpqsps}
+zQHINQSQWRLNQSURRVUWSRVSQMOSYUUSSN0%8383/
+
+
+gsph`bo
+ €§ 
+zusgiifdgo|c^[[cmffcYR_tbE3/+.'*/*,#354A`dZ}Z€~}xhUU*
+'%`
+
+|yx|z|~
+¡€©¶š,7^oMJ^y~
+
+
+
+
+."D24'
+4MHB
+/.~"=!
+L€
+?±­®ªš£¥€¡!Zp2**q
+|~*"(Mby`%7q(+#\xt~££¡­µ¹»º»vgskx­œ²¹·¶¶¶±¥²££mfcikszk4LR;3ORQ^bhcvzs\YYVmN.0"L@NM<(00J^bybkfH?DU[`\MU;?MFB;Qg~k^hm` €hq
+š¶¶§}i^_fdkgcFfkkpkmpmtppsup|
+
+
+|JDINYUSMNOHJMSORWSQRSRVOMSYUURNU=,.3395.		Qoqid^t¡š¡ysvtofhimchhhhqt_SOV^i
+[LJV\J;99750//720<5;DBR}€l
+}~ylhYQ"
+
+&9x
+
+
+
+}|u|}x¡§©¹£,ghx~
+
+
+
+(
+
+"!'&
+
+%U#*(
+
+&35
+@	+oY
+
+
+
+
+?€¬¬±ªª¬®²°¬3YN,2,ixpt*QYx=,l§ªªt@'0##hxt ¡š¬£¥ ¡¥ª­±¶µkt¬¹®·»··²µ¥Ž£d^`m~}U\cYq\?@\fqtlQ2,LVVWJS<&BQ@OVI'2O^lMOQ`HLIUZQLVM`
+vM?Fp
+tpzv`Rvib£ ©~ytqss }g[`fkilcIchoolikpsmpstox
+
+LAHLSWSRLUHJMSRNRJQMMQSORURUVRWQ2"',,274
+
+=vtmih}
+£¥ }yxvomptosokkhkhkdfk
+tb^bc`dqkVIUmzmYH=??88<98==AIJNLZ±zx~}hf^Y?Ah~
+
+~yx|~ ¥®œ (bgx~
+
+
+,
+!
+
+@F"
+!#	
+
+
+
+	
+
+	
+9`gdmu€¶ÂÈÇ¹šR<.37q~hl~l
+
+ORqc&8¥®337+3p|
+y}ª¡  £ ¡¥b
+®¶²»º·¹Ž±§µ€g^UVq~xdb3DNOstRU[g`VusF.9@=MF^SDiE7H<77<L\ltY=EQgN[^RZ=JWRZ~~Q=39bUy`^xob^cq~hRkuxft­¶|
+zz~k^bcfigcAcklmkmkv~}|
+
+|}¥£§SJHISZ[RNOOOOOFLRLJNROUORVRUSSQ2!+*/78&
+ioqih xutvtolkssquomgkfcdksv[QQIBA=8EkzdM@D=D;=D@IBMLVOQ\
+€€ypmx|ld`Z;,kyz
+}}~yspzu¡§©ŽŸ'
+R
+
+oqy~~~~}(
+
+
+'\2*%"#	
+
+ "#
+
+
++&
+
+,Ff€£ss;,7vxqY
+!
++8F'&5¥¥^+
+!2(5ktx}pª°­±ªª£¥¥£ £šx\gt£Žª¹±··µ²§Žcd\@W[Wd`AJVNZ[OOZcZ9IJI7YmS,HFQHWpbyZ2=.UcdZNQZ`?EORbY@=fgiqFE539I?Oz~c_dMEN^bcpx¡°
+u}|
+
+~h[bdcgi`E_lmqktv|¡ €€§°¥££¡£JBJNMQROONYUMSNROSMQSROORRUSUVF'%".492
+Wsuos£ vuy|~ztsspmklstpmolku_MFHUE;;IzxdMHIDLJHHMIJJQQRO_lhzllo^m\Dd~~}z~|z~yzpusy£§§Žº'Isl^kz~|
+}2!A[*&&
+
+		"&	!7#
+("/OO/<ª²¶±§oA&;.++A§x<l?(7'Dovoy}py  ¥ €ª©¥©¥¬tldx¿¹€©§¬­²±·±§² d^b\Wpk\EYVH."@S__ZD7[`'[}u\<W7&VtoQ[V+/L@\bb_OS^A(NOEEEJf[m[?BWIOV<3Smph[VD,3QUV@_ov
+|
+~i``biipcB^omgsxu£££§¥@FMQSVOOOQNRNSIONQNSUSVNUVNOUQ
+
+!*583
+8uupz
+£¡
+|xy
+}vusu~}ysmhQF9_yZBHQLAI?SycQIILNFLNMMJDNMRNZ~qO85fB0VIJyzz}~}~}||yz}|ummq~ £š¬µœ,
+=i\QOJdzz~
+
+}&
+!"
+_?+"#+	
+!
+
+
+?,&"9U^kmhhzD+8š­®Ž·ŸºŽ®207s£iQsU%0%Iqvt€§u}pghihkpqosuz|xoo~È¿¬©¡€§­§§±£dccb\ptbQmOH&7@DOf?0YW^vhx\fp~x}L^J8OL8cpggYYdxlci`4SQQ#AE*7dYbp\Ohl_hilSA^sq77U_cxvlt€®€|
+|g\dcdihdFbihuqm£¡¡£š€  §ª ¡ZIJOSRUQNLLJOOMUROSROUNURZSVV.
+
+%75/&
+kqt
+¡€~tx
+
+}kcRI=84<O}s[BEF<8@DW
+iOIILHLEBLBAIEONR\~qZx°M&/
+OD#oz~~|z}zyyxxxvqpspu¡©š¬Ž».
+F\_d`^y~~
+
+
+
+y(
+
+
+
+
+<[
+2
+
+
+%*
+(Lbimpllhk|~y9+9€§š©ª¬µ·²­c0Dª»»»·°ªš€[+**QquvŸ¹u|svtqomhhghchzoktibkvŽÔÈªš§¬b`c[[diL4MM@4,'2?M0Rt£lhoYH0\fVQM9DI=M=MZJSdQ=Ush9Q^O9%#!&JSb[Mch^gqc~}~qhcO^fffNWkuos
+zzmV_dchi_L[gkmYl §ªšª š¬ £HLLINSORMJONQOQUSOQOSVQVUWV3
+
+#445+
+
+Iqv
+  
+vtkc[RLEB?=?=YqUNHFIIROZ iVHOIHIB@@BD?AFFLN|\4~IJVBNNs
+
+b}}|~|}}|yzxy}zzyuqqpy€§©°°Ž+"!_zy~|`v~~~
+
+v,*
+!!UL
+.##		
+
+	
+
+;hyyz}|yzB/<§šš§ªª§š¬¥@'D®¶¶¶²²²®§E+.+`v
+šŽªzxyuyuvtqtpto[^[kmumt­Ä €£d_b_\ifL;5MS<'
+*.??ds°©om?0/@O_`RFB#
+""0d\BfA%+FB=J_bJ5`,+7?B=39BDh~x}
+zghpNEOg^iumzz}y
+}hZ_ffkggH\iic\cv¥šš¥­k`MMMQUQNOMUVWUOUYRSUUVWUI;'
+	
+"470,
+b|£ytlkZ^\b^\YYRLHE@=W
+oSZ[_ZZSUb x^NNJIDAB@AA?8?FEN¡~F^qfJIF?Z/
+S}z}y|z~}zxy}xxtumolu
+šªª±±­u%%kptxz
+
+
+
+
+p,"
+	
+	/c3	+
+
+
+
+
+
+ 	
+
+5gpokmz|~A+A¡­©¬šš¬§£^.,.}²·Ž²µ²¶¥A,.o©€xuuuuuuxvtdD8AMlv`hlgpsyck~l`M|h`bc^kihc4QZ?9*
+<<i±|p^
+f0*795SZ`D3=(BY0!(=</UgfZB+Y80/OL4949Yuv}zggmhms^S^p£p|||
+
+zh[_bfgcdE[itlYo§ ¡
+~umqicYVUOMQUONMORSVORRRL=%&0
+
+
+"+042&
+	i~¡€|kQLY[Z\_bfc`bc^VLD?D\tWhcb\[\QSm}cHMIBA==7A@58?B=W`fuD`vOHd9Dhx}}xuvzy}|}x}|||zxylopv}§ª°µ¶t'+pyo}|
+
+
+o*#
+
+
+
+FN
+%		
+
+
+
+
+Ubmuy}
+F!I¬°±°®¬¥©u+S5Nšº·µ¶¶¶43B¥§£ |A#VW+(EJLvš
+
+(v§€xVYp©Ÿfbb^^dfhdZc`OQSF/d~xZVRVzoM9.<7HRkiOR=5NqxyJ04/WHYY92%/^L?J`=BNozoZ7Dohlovk~€°° ~~y
+|zgZ^`cghcFcvob~y
+ ~lqqqpmllddYVLABD@AB=<94540,#
+
+
+!+4934'
+It£¡ymidVF?I^`^Zcbbhfdb_`d__Zh~mZkigcgfZV_}`NND?B<<;;98;;;D|¡sqbi_zMQ¡o9d8_yxxuuv||zyuzzzxzyyukksx ©®¶²t,*i}qmv}}|~~
+
+
+
+k/%0(%"+,"
+*(
+
+
+
+
+  vz}¥¬£M'F °°±®¬­€?4º2·¶Ž®±®H £¡ š¬š£€€§£0#\W2^z°ÕâŽ;z|L¹¬FbÊŸf_c^`dchfhf_`ZZ[7_qiN=\@NZI8&785LJD[dE,;88J
+8&
+/7*D4%
+##=k§Ä¿­§yMcyyhvlgszuo¡°yx|ux
+xdW[`bckmsxixlq~iultoiptlqmkdbcVS;3<25<@?92
+
+
+"*/274,/?U`t€¡|uocb`cidcD9R^g[`_hgdkklvtsi`cdmYlpofib\V_~_LMDIB;?59;74;<;}zc
+z}d42ktvvxz||z}yzyxxyxzutoqoy ª²»¬yq3
+Zxxzys`yz|~
+
+k'0+7848A4!'/847(%"747.
+
+!
+
+
+
+
+ 
+/
+šzd4**dU(vºÂ¬2J­»œŸ¶±|€¥x¡¥€[+
+8lW¶Ðåå·ªfHÔëÜàáæÑŸcbb^Y^bibW?<LZf[Miy`Y?`LVU9`F522((;IO^\YWRB&+4'(HD!3c©Á¹­»Áºy€mmmqkLcmyzxy
+
+}ziWbcmzzpp
+
+olmsqotsqqhldfh_b[OE@<77<;5
+
+!
+
+0254;JYgkm}£
+¡}hfigkfggd^QFJ_b_chqxy}||}zpldck}g^sslohg^Zcy\QEBHA??=850.0<<Euf
+p(4!\qvxyxxuz|yvxxz|||xqspo §µœo_Fuqsmk\}z~~
+
+
+l%0538@B<If(5AFHH%=kkopogJ
+
+	
+		7yš¬£££¡vsi."([\"f
+@+kW\mu|šÔ||}€¥f+%3E<^¶Ä·£§ÁØâæáÑŸ§i`_^Zcft^=9@QVYWNVR^J85Sdsltp@ZVUOSMYY^cRIN3
+
+229*
+'/<+80&,?q±¬ª®Žº£¡fcyzx_?HVWutzzzy
+|k[k
+sv£šmmkpmostqpkhddd_^WOME?5/543	
+!*+8LMY\_qqx£
+¡zloikcdldf^HBVkpvy}~zz|z|}th^f~}h^oomkdfZW__NJHIE=7?;72.8502s~k~mop58Z@^vvu|xzuyyz|vxxyxyyotpv}
+¡ªµ·ziY'+%7dlimkLuz~~
+
+
+
+d";MJQWZ\`q'Ng^`M
+Qsxzzv_
+	
+
+Szz\%("`
+
+p.%Sg%8f
+||hLNZ_h~ y~|vZ\€®lYI=?HZ9204JNOWs ª²µª¡ bbcb^fidMAguf\bfSZR\cYOFSsvxWB`gbSRO\_fU/ %I[?/=/8Mc=#F©®š­°ª B_c\[mhdhfD'O|dzx}t~~
+
+yq`ss
+}~|£ª¥€§ qvosmsspospghhhb_WSJI=5;457
+,;IWUSW^|~€¡£~lolhkhihoolkt}~||y}zyqf_h}|h`qqssmfbV_~bMFLD@92;422.00*+s~mzxvvmmfOssi[duu|xyy|}x}xzzy|}xtqsttu ¥Ž­5
+!'0%%,(2298tyz
+~
+
+
+
+
+
+c&#S\\[WSZm<<^\R8
+
+[t}v}Y
+	
+	
+4s
+
+}yx?"&%dy@AzuB.Upvsospilhhmvmdimifhlf`_o š¥sxxvvh\dhou}|qtuxyz|§ddfpxkftO+NVJ;RdW\^gli^[VSUkcO[J??@OVS8
+   DtUJZN?E}\9N`dcqxzsbls2Z¡Udhhbc@*J
+€š­§z|~|~
+}hkv~`tª§¡¡š ¡¡sqsolmqpmqsiddc^[SLLA<5;937
+
+
+
+
+''3HR__^l~~ ©¥© 
+plqql}}tt||y~yuvog_d}hcouqmgi`W^~cMBD??;59@7*!
+oxuzvsoqug&gv}zz|xxvzyuzxvxxvz}z||yspmvz€¥µ%
+"#""&'"*0.,h~|
+c'~xqy|Z`|I;}oB
+"Lgszyy_
+
+
+0x||}zzz}~~f!
+%b}|W&k~ttxs}zyz|vsqos
+yuxxv|yu|£©¬¡ticf\fioyu£zthlut|}~£¥¥dVYLUbccJ4DM5/Rb[^bghfLBEAQSE4E4,*"&
+';MADH.W€fUS5S\[ZVSQ0*Z¿¥Rkkkc_AF
+€®ºš~§¬­¬®®¬ `^c~yxp[g|
+z~xz}z~tsqspqlptoohfcd`\\LMIIA9559
+
+
+"(;FNQJ\}y~££~¡yzv||xx|xzzuvtccczzhfpqmlmi\[`[JIFA=220*
+qxz||z}^Nzuxxyutsuyszxyxy|zz~z}yxtpqv}£¬Ž!"
+
+
+%&3.+c}~~
+
+
+
+
+~
+}V+š£ª¶¡kVS.s3Uptuxuv`
+	
+	
+
+@sx}y|xtuux~o?
+#BmssbH|¡£§¡   ¡~uxuxvxssz€š©¥|sk`c^_cfpldWzibou|vx~š§¥`[b^^d[hf8@S33OdZZZf`f_@2,04&
+;0'5,3=*"@0/?/8;;,*\¡q`NN?3!5F4'@
+yOkgkd_<
+E£°¹¡|~qFWg}xzzxloy}xz|i\\dgioiihlihooqoqkqllstolmgdcd^[QBF?747=7
+
+
+
+%%2ENRJL^~}}£~su ¡
+}sq}~~z~|}yyxyxsx`ci|idsupmqg^YdzQJE84*
+
+!
+*uyxv|xy~\ivuuzxvsvsssuuyzv|}~|zz|vsssqyª­Žp**/%!&(.,+*'Wz~~}
+
+
+Y&7±œ©qhO[/s3(coqmssmZ
+
+
+	
+
+!2Oc<37?OQVV[YbdY<?<A<7hmk77m|x·º¶»º¹¶­š§¥§ §š°°µ¶µ©tqpqthit¬® vkimgd^^\dpkfdWRyvY=JNRU`yf`id_`\qh<DR;;Qc^^^gfdc@&9ShiOZmiY7
+
+
+
+,##!FWWWN!0!QuQ#,4;HM/&?%,Ridgd_<F| ®»qsuzkl|lFHJL^qqztxxps |
+
+uxpokooompllifbbcZNJE=<7?dh"+8HQLIQW~ |~ £
+
+yts|z~x~v}z||xvphfiyvg`spoopg^[hxI7'!!"#"'&00/.qu}xyvxxuzvyxyvzxqsyuuvusxxx}zz|zzytsqv~€°°QDRNLDA?=A<B?'Oy~~
+~~
+
+
+
+O'+q|zq`bUolE_z0
+[kpkhikd
+	
+
+*FJ(.&&FB@=BADDEFAE9?HA=;47<N\k¡ª©·»ÆÊÓØÝÞÞåååáÕ­zmip~²º°yfc^\\b[_`^^lshkb__dgmosv\\b[[\bmgABJ98O_YZ\dbdb@Ylo_|g< ! 	=VSWWI	4&.kQBIONFLO3+7"QfffcV=I€¬¶kpsgd
+}qQAFOct~}mhk}mz
+~
+xlzykkhhkimlh_gmlqmmkmmoolgcc_\VOO@;=<Nvg
+
+
+"/2FJJEJZ}z
+£
+¡yxu~
+}~
+}|vyxzpf``zc`pmlhib[SfqQ4354=33=;<+770=43o}
+yuxzvyyttxxtuttyzutssux}~|z|zz|vsqsx©Ž­5FLIMSOYY__Z\<<v}}~}}
+
+
+
+
+O%&h|vkWdR~u^?~7Qdifkld9
+
+
+
+!\Z22'48A<DAB<EJE@?7278202.932@MUSckhquqx~~y¡±Ž¥tt¡×èóóê§smidgb\ZVQQYZRQVZ[__[dfdkqvuy~\Zd```bshD7H83L`bZ\bdc^E	E`mx`ZF7*	   
+
+
+
+*<7
+ =DJSvMONOLZbQF5#Ocdd`^7?£±·mlpkiyxsW=DFUu||kgYs}tz}mk|icb^gikqvvsxqmmkkimmplhdfd[[UVJ<45@^|g
+
+	
+
+	%*0EAEAAU~~|pu~}~yyz|}}zzzxxugf`zygdphsmgbVFNfbc_N92987423234587<;5gxyy|yxuxxvxvutpssxuuxpuuq|yy~y||zxtutx}©¶¥!Yb[WYSUQ[WVM40x
+
+}
+
+O#"gvkd_fh~xc
+!to&Fpm\Q'
+
+
+
+
+
+ _S+&',B9;@=EALQHH==45;2/459;0/,/.3*.BEB43,".5=ERNU\cflkkg\ZU_fdqm[QUWZ\^UZchilqtpqltilmmfc`[_ZSUSSVVWc`[_`xgA<N9+F\b^`c\_cF
+A_`ZEmb[L47
+      
+!  @WLL__mbV\ikqsuvf(&O\fb_`@<}£š¹igmqiyxtq`75BWpv}shOWghfkoh}uoz|v||}yyxxskoklillkmidifZZ[YNJ=BFq^	+7DAB?;O
+} 
+
+yqq|z~~z|y|uihcdt|icop`ZMB7'9ScfgWIAB@BEEFAB@99E95<i
+}|txxvqsvxtuvtpssqsvvuvu||yx|}}zyvsup¡ŽIVNMIHR^_UNJ8(pyzz~~
+~
+
+A
+%gqkQp[~xg'
+ZgS^H03&
+A'
+
+
+kW%,.il
+
+?fU',778285773903=897'2/*3looim[%V``[\YRND'!/2'
+
+&"('02824@8@DJNLQRUSUUZ[^`bgfhlikm^[bd_\_skE?H8+H^^`^Y[[dH
+9^fZYZR\c37
+   *7	 8QSUcqmzuutuy|y|yk\O^`b_\;"9}€šµ\\hokuzppi=4ASpvxto^LEUdkkq
+y}
+vzyusvu|vvogmhihimmmigbg^YSMIB?=RY
+
+		',7AEE@4A®
+~py~~}}~yzzyutshgbs~m[\M7557;7DRcifVFA=B<<4334,'+030,i~ytyuuqotsyqtttsuvxvytyuuyy~|y|z|xxquq~€±
+[ihfkcmodfZZ@#@dtz|
+
+
+
+
+
+
+z;""boZOsc|ysgS_vv[0
+!	mv
+
+
+pM++'mp
+Hzd
+	!#,Yglkkif^_YQJI=805NbdcbN5b^iqidZcL[SbWYSMH;/'%+
+
+
+#&(**,.5<<@EDE@DEI\_cbV`^llJ?F73J^``^^ZcfE
+<fc^ZYORZ0;   	Y(  "
+ 
+
+Smm^ot}zy|~~~tY``^\cIEUlªŽ¥hZdsvv
+
+pusB03FhqlfihcSUR^fsx|~
+zsqlpqxq}~tqolmkmkqmifdZY\UQMB7<LqE
+
+"!.3=ALNFN »±
+qv}~~y}}||yxsuppf\Sp~hF=HEEDF=<HV`cbR@5/*/*!%#,(',*;?Dh|vttquxyuqtsuyttuxxvuxyzz||xz~zzvvovq¬±}2ilhf`cd_`gUbB"
+*%4AYdlt~~
+
+
+
+v8"([[@cc tU8(*%
+l
+
+
+
+
+
+*lL*'7}o
+ Wi#"btxzu|}|zyyyqtfWOdmolI8__h­vfR_O`YW\\SIAB887/.,0,,**0&%&'#""&
+
+
+	
+"^Z`d[b^viD9E;0NZ`db_Y`cI
+=bb_\UMN[/2     !I gxxspuz}~|upibQQDH[d^^`N_lh¡§¹ªydbkvu
+ypoH&*9Yhi\YRZWQZfimt|z
+
+ttytkmktpi~likplkqmmlkffcdb\[VOD?Mx2			%%,02=EOMQ
+¡¿¿¶¡~qt}}}}||z}yytshZH=8m}iIFNILJMFDB`dicYA3.(0((%++.0/,.0&c|
+xxxuptsttuuvuuvttuyvy}|zyxv~yzyxyzqtuª­±k;vytlopoqomlpM*"2&!"#45OQZcsy|
+t/!'gkcyy^=*'&**(/9
+o4
+5zJ(.Fp\d
+*\yxy~~z~yto`_ZZZYY09bhmvoodVfObSV_[ULA4450(/++*'*/,**'00**2(/%%+"#"(''ZZgd\YYsiI3OD9S\dbccYcdF	<_^ZUSLJZ/.(    
+ 'u
+~~xxvphYM;//9DLZb[fc^b[fhl¡§¹ªzuocquusS%*DSMLIHUS`kglmttu
+}v~~zzpsi~gxuNhymqtllkqimkidch`_b`[Q=<Qy
+
+
+!&,8/0?HJQ­»»Á» zpq}|}|xvtgbONFEFFq}hMSOMQVVJDMbhcYO7/533+/,/,.../3,+`}zxuuuvsuxvvxsuuuuvuxttvy}zzzyzyv}}u~u­±ŽSIv}ztpfkmiktyO+!
+%
+'"/3/97=HSV^bbmshhhffc``A'%"WWVNA,!%
+#',/(
+
+@Ds@		
+=zE,,Hm	`h
+
+
+<\xz}~~z~}tqptghdMQB?clfubhm^iWc\[c_WNJFAAD;=24325&'+,/%&+#3*#"+'+@@*"&*,2`W`bZZ\piJ2U@8W^^`b`Z`hI
+;_^\YQMAU0+3     
+ 7}k^O?5.3;HO^^_cc_ZZ[^dlggk£¥¹¬xtdhu~zd4'(9DJUOO``ghk|tz|pos}~}yup|usVMhllklkilkplhhghh\[^UUD<?l~
+
+!#(0957;IQ±œº»Ÿ»°
+puz||}~xk^SMLRNOMINIo~kNSVOUVJJAFZ`b\F9774//2,002*24857d}xztvuvuvvxxxuxvvzqstvzyyzyxz|zz~zzy~t±µ¬5Dc`_UOHOVQZ_cA
+
+
+"
+!
+
+!"&'#&&(**554=9?0+/%%#','%%
+
+
+!
+"
+
+AZ!
+
+
+3uB//Skk^ 
+
+2A<I|~
+~~~|y}yqvtqmb^IDbmlzSkk`fWc[\\[UMIFBD?=@75=@;;5<?;;82.8+&(2.0US5*%,_Yd_[YZlkH2N;5\`^`___^kF
+7WYUUSOBM+3;
+  	
+
+  Hl`L;(/4<DQV^Z^Z\[[[[[Z_dlkbdhš·¬vvhgtx}J."42JVIQfbdqy}qy~mbl}|oYcu|m_VBWhooomiiposmfdd_^^Z[[SD<os
+	
+!((4.03?Q[ª··œœÄÄŸ®
+zpttypdWMNMOUSRMORRNMo|fVUOIHB?<=HS^bQM@5;35452457;A87;=f}~xzxvvutxytyzuxtsxuxuxy~z|}zy~z~zvx}ypµ»§#
+
+
+
+	
+%!(/"?;!%%%&%'&!*(',''/38B?70+.
+!
+(+92!%
+
+
+'`39'
+
+
+*&03?_@^~Q!,*2F~
+~~}yyus}|tsfcMLdlpºoociSf[[^[YRJDA?<8<959795327088;.85/*72%7(0/%2%
+
+_[dbb`^ghL2S<.Z^__dc^flI.W\VRQFDS,+?  
+
+
+803<IUVVWZZSUQU\\SW_`Zccfidbhf¡©¹®yvu`do}[+(7LONYVUOhkhflmthQf
+}bV_gdgV[dlmpfhlpolkdikbY\^Z[^J@kk
+
+
+",*+0937?Nªª®µ·¿ÁÁÂ¿²
+
+yi`dYYSRYWWY[W^W[RUQOm~dQLHFB;=49@RZYRQD94<77<<DBEDFBEISdxsvsusquqxtvyvyuuqxuxyy|zyz|yyzyzuyspqµ»"3999282.29//
+.(#".0&HL( 
+
+
+!,#,4=885**.&*%".3++!,A<	0qIJ/
+ 	I2EN	
+
+#,3		 @Y+
+!+&8q~totstqxx|x~~x|zlgS'Eikf²_lmkUc`f`UULIE=<=;=98?@=4<9@43922D9+(92#B.4/+8'
+"^[g__RS^fM=RB0R^bfb[_fgI/__SOOMMb/.B'
+
+
+
+			&FQSORWSUVSUZVWZ\_^d^c^idcuudgfš·€
+xz}cVYu~v8%AZk_hk\YW[VRYfpq_Oovliglof_V_moppomooli`fhbZ\_b\b_F[`	
+"(*,0./3BR€¥©Žº¹œ¿ÃŸ¹§~yqi[RVY^Z\^^\bY[b__WURLEi}cFEABD@?@9AFRJF@D<=;ADFB=@A@JBMILbvutxzvyyxxuquyxusstttuz}z~~~yz}xysuuu±¹!f}~~~U,,
+&30/(30/'		
+S2
+*O
+#
+
+BO/++(.
+BgiN
+
+2l=<	U;[s+
+
+
+5`=705M/
+%+[+"0bquvttpmpqvxyvvtxuoiZ*4Ub`SDdiqhUc_gbYLF@=07439?=825.;;83987/?80"4*%?3+5.;&
+*5UD@</5LfgL;M=4Q^^dbcZfgH/`dcZFAS[4"E+ 	
+	
+(BVSOUUVVR^V`\``_^^^[b^dfbdidif§µ©uxzfRQ\lszILcfWR\ih_c\J<If}xNYtzxtlulphiifhmmohkolhgdfb\[[ZZ__hspN
+'%./,/4*ARvOg¡­µŽ²µ¿¿Ä¿·~d`YSVZ[[[ZYZ_\VY[URJA??dufI?F?AD7=9?IJMJHAD957<58?FDHDBAD@b
+xuyyytutuxts}vysuvvszyz~}|||}||}|zqumx²¹~0kt|xv||vyxzvtJ.((#'+.;[khgZ,&QUR9%
+VA
+!U!ZfL%%!0!
+?VWA
+	@"
+&.
+!"0 =M	
+Ed8.0Z~M
+%23`EOWhzyyvytutsqvouqyutmp`&
+0/hpuqYE@NRUgmRA=A<984958854/00,2,/4;@/((93*_2,,72
+5E8ADJOUgmhM?L@0Qb^``[\gcJ
+3`ccQEMd[3'B0
+	
+
+
+
+
+
+=VZSUY[Z\_ZZU\W\_^\__^ihdff_mmš¹©~uv|yNODm¥¥¥V7M\\Z^_qsllcZ@BZpdDWk}uxppllpqpqkdhklikiomkd\\YYY\ZckyxL
+
+*+*+,04/2NiSHASt §¬²»ÄÆÈÆÃÂŸ§
+`S\[VZ^```\YQNIMDBEEHuREB@H=?9<AFMYWID;720?=;A=A<=87=<<^vx|xzyvzyytvvustuvxzxt|~z}}|yy|z~xptkxŽ·dHomliffooqlkll;4+.%+3,[hkdcW//^bhW.,VJ
+
+`&		
+BQA3+&.
+
+(+
+
+9'/."
+/.	
+
+
+(B/23Oh.Rh
+	
+%.3<AYiYR[^__dihqssb/2.t
+oZLLHI|^W`koqggiZYSNLLD8;7;4DD2"/@2%N,+4D2%LB7_dfh`cfhhL,IE3MfdY^W[cbI/__b`OYf^<*@2
+
+
+F\YWV^WWZWYZQYVY\W^c[\cl_igdhd¡²°uty_EDW ¥©¬­d8JE_ZRq|xsmd\@ELhsYEHglpkpmpomlohgpmlhikkkgcddb\`f``^mzN
+
+%%+++*44,SRHNURUZ^}§®®·»œÂÇÆÎÈœ¡fVVWURUNQIIHHHADBB}VIIDEAABBLLM[WQFF@98=;9=773=5=@;;_u~~xxtuuxvxvxuuzvutuzzyuzyz~vyx|~}vzlt¹µNRkfkdfdhhhgZWH&/*,9727Vliil_.,Ych_/.RD%
+ !O	
+
+ObQ44#,,E?+
+
+J%28
+*,7
+
+	+04+EV(
+
+WY
+
+BM.	
+	`ush/3(LV\fZSYUZY^vc`}
+~~zzz}~qyutspiic`UIE8=7437NhpN=c_`dkhc^b[JNF9H_cY\YSZYE
+'^d`d^[_bSOU=
+	
+
+!
+
+FWVSSVUSVVWZZ`^^_YVZYW`ggggflb š®qpu|`;9Dc
+¡¥ªªŽµšsI9WRHbptvlf_\YNNvzviW}spuzt~x}vlqgklkkfddcdddZW\_dhs~S
+	
+
+&!/(/5,/'[;<JVO[cs|¡š®²·¹»œœŸÁ¶¥sSMNMLLFDIBOFFD;zSBEFDA@HFEBN^\UMI<8<;<?BEIHMFILFB[yyzxtopytvsvxyxyuzvv||uxz|z|z~z|zqmmfs·°;S`b^bliopgO5&5*3NH24d|x|xc.+,mvtf2(!N=F
+'b
+08*0,!	
+
+
+
+
+	
+#
+!*."		
+
+"/0.(ER
+ 
+"\^(EVdd_[ZML<(BHJ<;370,hppd2/"	
+BWYVYD_~~skz
+|~~}txzyzz~~zvxksvvupmmtxpNAfiiqt~}~~tO7AYh^^Z[bWF
+&\f_c[Zc^WUY?
+	
+
+V\[YWU^Z[\[YYU[ZVY\fd_cibcl^dm·¬mpss_?7?BW š©­¬²²ŽJQJHJVZWkfqdc`FJlvL|
+y}zqoohooklfklhkfhml_bVSZhs|h
+&(,,*2/,W23IRHYfq
+
+tt¡¥¥§¬±°·µ`NIOLJLLHFHBBA\HHBA@?@?DMZZ^SOIBBA@9=EMILIOSSMFF}}xzx|zvxzu|xzxyvxtxuvyy|~|}||}zx|yoliuµ¬9,33<?=LMF?HH94(&,2OB2.`vtvsc*"#kyyh./UJ
+5
+ 9.'
+	
+
+
+
+
+
+
+
+
+
+(
+
+
+
+
+"4,0&<@
+	
+MH
+<_gmz}s^L;?St~
+}~|txoA7(IJ;.NYWYY[dx~
+
+
+ylbhx|}~}
+zzuthxtqsvxz|tB?}~
+u[JW_ZVY[[ZH!S_Y\_U_`^Y\H& 
+
+
+
+
+%U\[VW[_`\b``````SZ\ihidfgSl`\Zt| oxzz|oWd¡€¥©§Ž±µ¥WVZ__c}oxzl_U?SsvDcmhb_`RWWQObglkkiimlimdckhdb`Z\dod
+
+"
+"(0/05/W=2ALHO`ot}z~~}ts¡£¡tLLNFHELDB99A@
+_HJFDAEEILRZ[ZQUHIFFA=@DBEENDHJ?7/z~}u~xyvuttvxuuzxyuuvxzsy}zy}|yzy}}ttsm}¶0,//3/#*22?DD732.4+?55;JdcgdJ'
+clmb20
+D7
+	
+
+
+792
+
+
+
+
+
+
+
+
+  
+
+	
++0%*.=D
+!@8
+E`f\hcUD47`x~~~
+}|}xJ54|kY^\ZV[W~
+yq`_o|
+~|lpqomlotp<;bb_^VVZZL
+U\\_^V[bfhcR*
+
+
+,W^WRRV[^[^^_[ccb\`hhicYVmJvhg\fFiQ@DsUA`~|m¥©­±°Ž°¡|^bbk
+hh
+o^VHWsiBNV^Z[^^cfkokkkmgigkpohkbci`fcccbp}\
+
+
++*&(0,!^¡pFARRFERbimsxyz}zysz~dWVUNMQJLJIEJHsSIILHHNJJS^SZYVQLBD=<FFFQHFBEB;443~yvzzxuvuszx|xxyvvvtxyuz}u|zyyx|vskik~£Ž(&"*4.+&*(,05542395A7(37W\OMH,QSVI30+8	
+
+
+	
+
+ =4.		
+
+
+
+	
+ 	
+&+*."DD
+#OI
+
+UmfcMJ<4WlqlmpopotpqtN!=0oYDJRNFx
+vibp~
+z~
+~}~dotvvxyztA?zmURUV^YR[YQ
+
+Q^^^cW`cc__U&	
+
+
+
+
+
+	"'+QVW_[Z[RUVY__\bfb^^iy}cEQZ9Rs@9A
+#5
+?ktm?Dh£š­©¬°­
+bRv\qs\VLQzzypspvfhgikmhgifhlqhghiY^_bdhtz
+^
+
+
+"
+'*(/("'d _?Ofq`OLR\\gihopvy~|pdZYgq
+k_\[VUQQMSRRNMI`VJFQNQLQMY`Y[WVSQNJFJILDJME?A=HV[Vyzyuvzu|yxyxu}y||uttsvxv}xxyvv||}vsmdm}§¹/73;=<?7?9;AA<905/2?320#453&
+9B?4;D=7
+
+
+
+		294
+
+
+
+
+	
+% 
+
+
+
+("*%
+
++SM[hRNA9A`s|z~tyqmlvso}S,=3`y~}iJOUN[~
+z
+
+
+yu|~}~yy|xgvzvz|yoA=slfYF0,2AZU\[WVZSQ
+NYZ\dY[i`chZ/
+
+
+
+
+
+	
+
+	?#=[ZWRQNUWRS[Z_^ZVUW^||v`^OL'#Vd/bc=_o`iFFIŽO"%;k~§§šª­¬°¬}^xoY@A`tusu}yVRJSEM`mlmhc_bhimiilkY[[_c_kvY
+	
+
+&#"
+'/,(,l LAVpi^^_bg^ZW[bdlqvtmWNDDH_pRUVWUWUSRHLMBJF`ULSMNSQQY[^_[YYQONIEFJMHIOMSVWYYZR
+|xzyzxytyyuuxy|}xtpyzv~zyxzzyyz}zpgbo
+€¹0/8A?@<?H?@?797752.<;@;(*0("
+773.2,/"
+5"
+
+7A3
+
+
+
+,
+
+
+	
+
+
+!"(,.'AEENNSQWVUYWQFFDB^lqqusy|xusktpsqfc^ZVI5;/fzzx}yDR_Vi
+
+}yyxz~}xs~~m|xd?9mcZI;.,48HJLV\_V\^VZZSRIV^\c\Zcfkg^5
+
+
+
+;#<WYZW\ZZSUUY\WVVYY\fmt\/AYOM50D'BQWcsFYs
+S®%&
+'Vx
+€šš¬±±°Ž¡qxZE0DV_b_cvx^^bccchmkiigifihfgsmgZb\[^[is`
+
+
+",0*+*(*gEAQYSMZg~
+viY[[\dlotRJB8=Nb;OQUQRLIMNFEHDAcMMMLIIQWY[W[_ZVMVMJD?@DEOU_[VWRNUW|~xxuxytpsvxvyz|}xzsuyxzxz}zzz~vztpidlª¹z%##!&"+#
+##'0/;545OA,
+
+*4/0'538855<2
+
+	
+9;&@B5
+			
+
+
+	,%
+
+	
+
+
+
+!,,'93AQLNRZffhb_^V[YODDEF@ILNAAIHkvsmcilgN;<7i
+|v|qEQb\m
+
+tmq}
+t^@<3(2/DHUURSSSVQY^YZ^Y\VYS
+MZ\\^WW``_f[<" 
+.
+EZ[ZYNJLOOHFQQSNU_bl
+vdlk\WHbhsq`,/S9ds,S9D/b\L
+!!
+4b|~ ¡¡£§€`F28IOF@g}klkgmhkflhilfkmdhilmoZ^^ZV_lt
+_
+
+
+
+
+##%&*+/*'t<=IRJF^p}lfgoksAJ<53E[BZUSVNLNJLIFFAD[MHLMRSOQ[\bd_\YVVQMJIIILQMOOSUV`cdzxxsuuvttvuyx|zzutqvvxzxyx|zu||uuthdm¬œs?9=<87/'/*+.(&+=85+#/52
+("*%++
+*0&%%#!("*=E;
+
+,0
+//'
+
+	
+
+
+
+
+	#,#!<.9<;FJS^^YS_YZY[WULDD@;70&''!?okf`_MA08^ytuvxQRf`i
+
+}z}}|fcv
+s
+
+NDDRUUUSQNJLOUWZWYfVVY_\[URR[[U\V_cghbYB
+  
+ 
++M\UYMONWOOSSNOMLU^fv§|qlN<|umfumE 
+4W@ .u^FpU!
+
+"Bcz}y
+t\RQZOLgpkmmpqohhiihgimsmcdhmm`^b_V\dsf
+
+
+"!&'++,'(}£=<FSFNcoz~
+
+vzzpk`49*,*MZcURWVMVSMOOIJHYNIHJNMWVZbccb^`b^[WSSV\[`fd`^\^ZRVzxxsvyvpuxxyy~yyy|vsozyy||~uuvytqohcl°ºlBF@DFDB?A;5=954;D3!
+3.*"
+0(+'!"+%&%(+227<;4945HOD.*#
+*Qc_H+%&
+
+
+
+
+	
+72%
+&&223AEFFH@A=E<983,***S_d``_`I?;05Ibfkd`ISh_o|xv}}~zy}|ulgtzym@?@`WZRIHLVW^Y^ccd_QVY_ZYSUI^[V^UY`^hddL #
+
+
+#MOMROVZ^[[[SLOLU_gvkmccWzfoskJNR*cM
+\\2QR€;
+
+!
+!!8_mY_u~z|okgcfRcbmickpzudggmkghlqoilmg^ccY[W_y
+B
+""'+((%#
+¥t/7HNLYdkvux}yvlhxs\5/4=F^ukmf^YYYZYZVRMFJWQQQRLQWYZ[bfgiihlohchihdkmkql`UFI[}yzyuxssuxyy||xz||suvupuvv|yvxxyyic`k®ºsEEEIAHH=??AA=B2995
+2=F#&
+*
+79B=+
+&(*!&!.++,050;535ANF=<@A;B=98;4%"
+.Lfsm\5#
+
+	
+
+	
+#*&
+
+
+
+!!&/3+#(+9<?DHFD<<@QUV_kogdchgS5
+BIovz}uLOg_}
+~~|x
+}xks|z|oHDDH`RWU[^`_\\\VZV^_ORV\YVQO
+MZZW\VZ\```^H
+ 0MNQLNS^\\^UOLO`cb[ZqussdhhNJFIUUsgE\U.x_7
+Lhx
+,
+
+'!!!DcNO[\dmliQkmsihl`[kYMJLRqhkphdlovqtptgY`bbZUbv9
+"#!&!&&%"%/€Y!,@QMUdmituvpbZdv}zo\[\_`p|yzvuqukpodd`bkkbddcddimpy~
+
+
+uvomptpv~z~xscRLMg}svzyxutuquvxyyy|yusvtxuvxyvuzyuxohhm®·sA?ADAFFHHBAAE=;044=94BH'.598/
+
+03#
+%03*
+
+
+"%.',02,DSA<8???9A894(!B^su`M9=0
+!
+
+	
+
+
+
+2'.%#*++,%!"/9F?BEH?=/5EN\ZRRU^Z[[[V^;?JtxsvtOR^^pzz~}z|}x~}~
+|
+l`huvkJ;A9<lmilmmhhfidd[Z[cVUZ\[UZRMZYVYU__f^\YN(
+BNUSWY[ZSQIQW_ZZUY\ktu
+tmdU<(0QJH\VV8B+?;bÌ5(
+
+*"!#
+	;/38EU_l=WVdcfzf^_k~iLRpqgghiighssvvpk\d__ZYcs|%
+
+"#!%(*+'/¡='=MQNWdhkmkbQLbszxsk_UVWQY}}~
+vxtt}xqqoopsqttyzx}xztqlpuqttopook^NFIpxuvuvusqpsvtyxzy|zyqqqsxuxxuyx}yusokfk­¹oHD@ABDBDB@?DF3<83=@9BFB<7;973<"
+#
+""
+
+"'DcQ33?93.8<OgsplWB5+.75(
+
+
+
+ 
+.82!+2++%#&',*((*!+#0'&&&'7DIMQRUVYd^VQVfHLFt|zUV`cmqicimtuuy
+
+||~}y~t^~~utfihcdbYUY\`VSZH^WSZR[`bSMLO&    #I_\bimliikt||shddiÆË£voigb9
+%./,;VId@!2[yQ2%!!!"%#
+
+(HR_4`dxuSUW\\hu_O?Wgiikhdddmpuvslcccb\^dx|
+
+
+#%%(/((#
+ %
+4FIBL^igdbQFNYkusqkd^[YYbz}
+|ytvuz~|~}
+yxyvsqipvxplioph}|tvu|zvxutvyxxxzz}zvuusspuxvxxttvfhhlx­¹kH@;8<=;0;584;7=7<?DDFDDFND?A/"
+(%+
+
+"
+
+
+	A`\97Lfv~|zmW97.*0*%
+
+
+
+	 
+
+
+
+
+
+785
+*#!
+'+35;<A<<AA=A<AD?FHFIFDD?DJJVc^_YQfQEJhsvotVS^^lltstsvvsssuys||}}
+}|zyx}~|u  ¡§§š€|pplhmuvofgpocRYWYZZZWZI[Z[[N\^\QQ\Y*
+
+Z}
+~§®¡}pqU??2&(.53WiYUg_td|hFB3%%
+
+'%
+
+(FV,VR^zsdhbbho\YAH\kkllihhhopuslcf^Z\bmyz
+
+!*(*'.*,EH9@Q`[YYHDW[dsxpkfb^\_f}z|zxxtxxzttz
+~~zz}xuuvzyvsvvvuyxz}}}|zxvuptqvuxxuyztihlqy¬¶bQD??<A?9<EA?H5;37B;=AAA7?;(!+02,"%"(.+..,//*%!"#
+
+
+
+7gfShh}
+tQ72,,(+0/!
+""%'/..%/(
+#%+975/2;;9!!4HA@@B@=85@A?EHHJIHSYWYVRQLOUZZ_khlVOoq"AMhtpmoVSd_lupostxyxuvvyx|~}vupuuv¡¡£££©§so`_\flsspmdghVDY[\^\WYY
+ I^_Y`_htvquz|=	
+
+   
+x    ££€µ­y~s!&8WLUz|zzyS/?0
+
+
+"
+		=N+W?B^mISOUduWVZSYhghkmihdfmpkg^c_ZVcs}x#
+
+%*+%!.,?<29NUQFIB@U_dmspk^b`\bsy}|x~~|y|
+}~yvyyxxpxsvxuyvxuz}|uyxvstsxvuxxyzsooll°º`FHDHI<78?=ENAF</=FA=A?5.'%%%(!%45;@=A<8/(.2.23/327;74.7=8;fqH%#"%*'/*('"
+#',2.<''39840/3.09BAF??7<@DHIIDNNLIID@@9BMIQNQRQWV\SZY\_ZSQUSUSiikV[mq74W[sqpxb`ogtzsstsx|qsxtxqvx||}}~|zzyyy~¡£š§€šmh_fcdb_gihcfQDFWYW\[[YW"H_hlqxxxz¥g	  "£¥¡¡¡ ££€€£ ¡§­€zuh
+~ip[
+4
+
+#_
+^i
+sL5"
+!
+'39!,74OD5@SJD4FWh^M?IMckihhgbfkiopkg``[_q|v
+
+#(
+2vpgNB(!2EMD8;II[fgistg^bc^cp~
+~
+
+
+|||yxxvtuvxzxv|uuz|zvvqspuuxsy|vpkmioŽ·bJMMNNLABDDHD9B,5FOLDFF+
+!%+78BHDBABBH=<A527;;?IIFFEB@FJML=l|Y""
+/+30/'"%%*+(&%#
+!09;@@=DIJMFOMOHELHMLRSVURRQLLLQUMOSWVMLSZ_`^_[`^\\ZVZW[pmiSWc^MIbduuyupv}pz}xxyvtusttiuuvyy~|}~}}~v ¡lg`c_`_bcb_^\I=FNVZS^\VYMUhqy}xuy}c 
+    %¥°¡mppRlticxk7.*^ºËk}
+l@%
+
+"
+
+"!.3&(NV_JBAIE;B?;<QF<FFcllffkfikhopgbc^\bi}
+t
+
+!
+"'%"/|x|zsM8?=9%*@DScfpomc`\\^gx}}vy~
+
+ztx}|}xvsuuxy}zz}zvxyzuqqqsttxvvzulmmkm±·kMNJLNB?A?7DJB?47NRH;.'*/089IADFFDEDBB<89;=A@<;AB=AIHMROSNLAx^=;0;=;9?8287@BA7,"
+!'!4JIJQOQRY[^^dfb`b``_dgff`_\\WZWWWWc\bd`cicgi``cb`_dYZ`holgRV`ccW_`^cdgbdky|pqtuquz}zsvy}st
+
+|ic^W[b_____VVH?DJW\[cikk_lt|z~uW      VhZ`UifWIA5
+,.Bi~d;
+!
+
+".*/<JOD8JoBN@5AF=5*78AH="*'Uiphlmiglomuf_WUYRc}}(
+
+
+
+
+
+&
+7yy|}~}zlR#%9DW^ckpobZY_\myz|vyxz}
+vuvvyzuxsqsyz~z~||zzyztspotxtuvqusmupfk±¹}m`WOJOMME<<BBA49@7/8<;JA@?<AFA@EJEED@DABB<?;=9A?2;?DHEBHA@;zi8DD=9DFD?9?<EA<8EJMQNBFIILLHIOMUYZUUW\`impkph`WW`_\bfV\SYZghlqtkc_b\h^_\_fl`hlssiYcpqqm`bhod\^fkfsimflhousxsmvzz~igf^\`b^\Y^VUUNFL`bfbcfx
+|}
+yhf\^ZRHA?9=@DJUfq¡ysuqszyhWOM_dR;.;0
+#Dkvg&
+
+"
+
+%*9HOJRm@B5(('
++0(#*3*9Ymiihmggdiisf^\NML\~}2
+
+
+(("%7 }thWV[[fhliVY^_cxz}|zz~yz}}|txxxxxtpuuvuv|~~}xz}}|vtuvtttttxsmhdg²œpoqibVOYWUODLAEABIBFEADFDDI@D<FIHFDEMJJED?<8?BFDIJJSRMLLBD?~zE<=A=?;A5;;8MRbklighlmcbbc[`dchifhbcb`Z[URZZWRZZWY^Y\\^ZZ[\^Z`c\WRVYgllvzuspqtoqhVouoxyocihookllpkcohmlkfkplmmhqy~}~~z
+szllf\_[^[[[[WVRSBSlmicp}szz~|ztmhihomtvx}zvx~|fNL@4'##,&
+.Fmz
+|h4#
+%%
+
+
+"&
+3BN[[q+&&5Ymhhgtv~cbkkkiiklil[[ZWJQbzz3#
+
+%%!@§£
+gciii_\_dbm}xz}||xtu~
+~~}y~zpvyzuvtsuxxyxyxxzxyx~zuvzz~|zuuyuttgcf·Á pibULEMQSSVJFFNOVRNQMJOMJJFIIEHJFLEDADEFONNRSOVUUVRQUOLNLSMtpISYW_ZU@3?M`foiosssvqvvzzy~}}|~~v|}zuxutoillkfpgff`c__b\[\`hifhfcgbZ_hiu}zlkkRozzzvmifputymM`kid`hd`_hqux||}yyzzty
+Ztxqlmo|pfg`bY\YZZYYSONBM[_`dpkpytqsxtttqmtmqzsssuz|~vqxvuvpv~
+
+}uqY<(("3ENZ_hkokb``mvy}p`SMDN7
+
+
+#'%/0DV_
+  ¥¥©gkiihkilmmkZ\ZSII\zv%
+
+
+
+"Q š€©¬š¬š§€¥¥ªª±©š££©pgfgz}zz~xxvu|
+
+
+zuzzuxvyytvv|vtvqvtyyzzyxxztvvxzxuyzyyyzztssf[g°º ZURY_lpkYRMHIIMOOZYVMQMIDSMJLHNUMNOJEIABDOYZ\VYYYYQOVQQW`ihipmlf^UAFYguy}zv}~|
+~
+yxzv~}zvsspoolmlqqmigoxppymhoszvspmicddckkmmklRgimosxzoibhiksoiyztuuqv|vyuxuuu}€¬€¡V
+
+opkkdgb[^ZZUVWY[RLBW\ZW\hpfkuy}zzvtvtyxxtuuosxsyyvqiqpqqt~ztkoltvuqgiozh_YZN^klpz}xh^bbizoW8&2@<FN*
+%
+
+
+#.9DM_ ­€§ ¬ihihmlmosooYYSUMH_~
+m!
+"
+\©²ª¡ ¡§±·£ª­©©®¡©§ª±¶¹®¬²¹º¹¶±º»¶®z~~
+}xu|y|xx}}zsqxv~|xyt}yzyy|zzxyyvyuuvtyquvuuqkfb_f}¬ºšcdlkldcVUUQOQRQVURVWROWUJQLMLIJNLOJMUOENRSNMNVQWQVQW\fmvvpk`}oWQVVcu~
+
+
+
+
+~~zy~}~~|yyxzyspusz}xxzz|ysv}}}vsttplhHboihpmhpo|~zz}¡§š¡xU
+
+ibfb_^VSUSRVSWRIDW\^ffgfifhmmqvtsuxvxvv~yvyxyyytyvuvqqptpspqtqomihggkmxviikypqzzuvofc[ysoucJ(#"(08532%
+
+
+
+
+
+
+!*8IO_ ¡qllfiklpotqpZOLJEL`zg	
+
+#
+"cª¶µŽ¬®¶·¹Ž±±¬§š±µš®»¹¥¶Á¹··¹ÂœºÃÈÆÄÆ§
+
+~}}yyy~~~}}qigFHZ_dhosz|yyz~|yxxy||syyvvxuxvypkibdkz¬º±m\W^ZUMROUVUWVSYQY[USYZYOSQZSVOSUURVSRUOMJQSUVORSZgmkbhlhZZ^sgz~}
+
+
+
+
+
+}|~xuvuzx}}~}|z~xUu
+xyz}
+
+€¡ £€š€£ £  €¡£¥pUsu~
+f^WVWOLNMROYVRJJF\`hbd_^_fghgfgikoppsqstpqsqsttpusmsxxxypkotuyvyqkosptpsghpyomkmpib^[QO^oc`U<!#!!+!'(#
+,&#
+
+
+
+
+"
+'7BQ[¡ šskoiommhhqmiIHIBBI_v
+I		
+
+!#
+t¥°±š ±º­œ·¶·°®ªª±±²µŸªŽº±¶²­§­·¶œ»ÁÃÆÄµ~|~~y}~zxqc;&
+'Hdpsv~||~y}vxuxvyyxuxtviomfok­º²s_\_W[W\Y`[c_ZY[[[_[[`c`[`^^`bc```b_c^`_cdfioouz}x~}}z}~~}|
+
+
+
+}}|}zzzyzxx}}~z|qokpv~z||gv|sllmmqxocgmks}}£¥€©¥š­ª¬±ª£¡
+`hmmux_WROQSLILHLORNQNFW_fd_^[YVY\bcbbfg^bcggdbbhhkhkmttqzuquvutuvvtphc`_b_fd[[Z_c^is~cOEMN2%!
+
+
+*%*(%
+
+
+
+'.=M_€¡sgklklklkpk`ANMBDFgv}/			"!#(%
+š¬®­­µœ²²Ž²·š £¬±¡¬µ²µ­©œ¶¶¶¶²°²±¹¶¿·¹ŸÁ
+}}~}}}z}|zoJ<2#'Q^ktz|qqyyvyytsuqtmf`gpf§·²yZc`_cd`^^_``c__c``^\^`cbddglppuutuuz~
+
+
+
+~|zzx|ttvug\sidioqlfQNLQSN[__hpsssxvx
+~
+ubyquuxv~}
+gb[Z[QNLLINNMRMLEZ_cd_Y\^_ZW[c^[`hcc_d\OHBIMOONRWZ^kmihi`h`_diif`ZWkmf^LQVbWLOWZY\NL@974=""72(&'(B<
+
+!,9H^š©€­©€¡§olfggkofggi_EQOMDHk|v,
+
+
+
+
+(
+'±°­€­Ž·Ž§°Ž±°±­š§ª­²°Ž§®­­¹¶¶º·µ€ª§±¶·ºœ»
+
+~zYDDIJH0
+Fuysoptqpptvusssogomg§©d_cccY_c^c__bg_^bcg^gmsy}~
+
+
+~}}}
+omqlhclvuymbLF=DIJMSflhopkhimmmlotuyzz~~
+ocxtqtuxz~}
+mgh_ZSVQIIHNNNMNFNY_ZZWZZV[USUNNSYWMIIIOADHOO^db^`_i_MHONMLLIMIE?AHNNI?<BAB==59?973559;<=%
+
+%"
+2JN/#!4VA
+!
+
+
+
+*/BO\
+€š©©£š€ €©ybggiklolllZFQQMEUlyv=
+
+
+
+"?­­®¶§ª©§ª€©µ¶°¥¡Ž®¡­¬±±£¥±®¡¥§¥¡
+yuoikhulJMVYY\UE(
+s}|zz^Wchktspligb_pbb^_^`_b_fbfdkkqqx}
+
+|}}zy}z~~
+~xx}
+~uqqqicZdtukRAHFMV\\fipoquqv~}yyvosspu
+
+zh`||xzy||~hhg\ZJNMDBIFMJJFBEYVSNMMOSYZUULIRQB#
+
+0FQHHbsvqyvlJLJDFIID=??9;<A@9?DD<B94=<3875*/99<8"
+"3=NM*#
+'0ZE
+
+
+#
+!
+(4AF\xsu¡ª¬sgkimmkmoflWRURFAYi|tS	
+	
+
+
+Ošª©°Ž±¶¥¥®±µ±š¥² ££ ycU\dkopmtq|tkk
+ZU_cbb\NH,c2BH9.2S€pttsptqqv~|yzy£ 
+
+
+}}ttzyqtx}~soqvqfM\_Q@DNNZZZ^cdkqx€­±±ª¬¥£tv^kd`bbhq
+
+
+~~}}kf_dULJFF8?@LIMNNBSYVI*+49;7?A*
+	;YRQSVbclxoOLFFDHE@947447989/59500*&
+
+
+!%#".*+,7ZO%
+#<_8
+
+"
+
+'2@Sqfm £momkmllqtloULHN<AYi}qS
+	
+
+
+!q¥€® šš  ~slhc\Z`gpsuxyyzvvssuxsm~m^bicd^SI9'O©
+/Jfš²
+~
+
+£ 
+xx}}
+|xytolss}}}}||sputo`\qqsoikhhdc`fgl¥®¬±®¬ª§©§¡}s\~
+
+
+~z}|z|xxhh`\ZOJJFH?DHINOLDR\d`VI0!
+
+
+ 	 +337@ONWfdJA=B944*(!
+
+
+
+
+
+
+
+
+"%&,!/+((9SlR(#*@[3
+
+'0Ni~~mlmlkiipluo[D;A9EVgyv^
+
+
+"yš£xo`_Z[`_fipopusttyzpvvuxupqqplgi[
+
+
+ydfgb^[YFF2'9oµ FLF;"
+"ASVo
+§± 
+
+}
+
+|xyvvqtuotyyppvtuquuqpppomsgim °š©š§¥§¡}
+xIHm
+~~}|zvxvvx}p_WMMOMJHR\fbfkd;/;=
+
+  	
+(
+
+
+	
+
+
+
+'*+'4BHW^d[^Y&%*OY,
+
+
+
+/Zt
+~c }qliigfmuuqF0///;UgqpL
+
+
+
+%!fi\Z_Zdlkkmkmpoppqlqplttzvvxmmighkffb```^_[|
+~
+
+}
+~~icg`^[QLEF@SlŽ¬xx~vld\Ycm°£ ¥¥§€ £~~z}svsvtss}}yolku|yutzxvslqppmlppokq
+¡¡dNgy~}}~~yzzxysx
+~yquvp_Y`mhB.< 	   
+#
+	
+
+
+"#%
+*/.2727;?4
+!'+*3IZZUMMILYW*!29\W%
+!
+
+
+(LZuzlddmixtqomqghqsi3/*.3<RcqoM
+
+
+
+%txupqpmkilpooptqmqosssqqqklgc``\[WVWLSNRSVVz~~
+}
+llg`^ZWYSIBIf
+ª²|z}qgm
+¬ £¡  €€ £§¥¡}ztyqm_bWQ`bivtqg^OV\^SUZRURWZ`_`bhov}~xqt~~|}}€¡ ££š ¡}yyxvtxyqvvuutqg\^_hdO&%&%
+			  
+
+
+559B?B?ADIEBNFIAA?=A8	%'*8UVOB;FE=IY_.7DFbO%
+;VQQm|t| qz
+ztpqspkklq`.(248?ZgosQ
+
+
+&;sqstuttlmstppoommoooikilcfgc_VUONQMH?DFLNQ\~
+
+
+~
+|
+}}
+
+
+
+
+
+shhf`_`^\VLN^tŽ§x
+
+~yxou~ª     ¡  ¡£££  ££¡ufllh`g`[hmlcYLIJRJIIVWURNNORVNNNQRROFEmuzz~vzyz}
+ ¥¥€¡}~zliillmk|yttyyvut~}}z}^V^^[Z_3&OY[b_^ZB&
+	
+
+"8?=?B@A;?FBFAHIHMLJJN;
+"%BH??B<B8#%V_?IONdO&
+
+
+
+4ADFURgz~\shlsxp}szxyulhilhkogoc3.3<8?Q^qkQ###
+Nvutqqplmokkghfiglglfbdb`[[\YOOEHEA=@;A9BHN^
+~
+
+|oikbhhfb[NSYh©Ÿ~~|zupt}¡¡ €€¡£££€££€
+ziohkmgkihg``^Z\`b_\WVVZWUSRVY[RO[\QIMQRov||}}~~~ym|y} £   vZZYVZUVSNNQUNORVSQW[yv`USVWV#*AMLZZO<
+
+	
+FYRBJA&"%&!!42;49;733A<=AEDBAE?8?'&&&<FD839A""U`RUOHfN!
+
+
+@\`Ub~hq~x[\OB2'"0gospiilmhoY/07ADOU_lm\
+&[soopokihf`gc_b^`b_WZYUVURLQLIEA@8;43.?<47?W|
+~uyx
+
+
+volldh`ib[[W\yœ}yyvqkq€¡ ¡    
+~zzsttppqcY^d^RUR[\cW\^_ZY\\YWUVOUV[RS\\[suvxz~}}vssxoluy¡¡¡g`f_ccd`b_\^_\`c_ffNht\[<BUN,,('/4# 
+  FbZ3E9';MF4598<30.20705;?;<B;75;9%
+ 3;4A=*=Q0
+
+N_^bDHbO
+
+
+
+%8R`kxg^J?<99005<?94Dlopomklllm^7@<<<BM^miZ
+
+&!
+
+gpc^`gY[[[V\Y[Y[[QNMEOLJFDED2932,*'!&*/882;Z~~xy
+
+
+
+
+
+
+}
+upofhkkkfb_UYi±­x}}zoiq}¥ }¡     }xz
+
+xsfbghkfd_cccYW_kd``__b\[Z_[\^_b``psxzxvzxxuxhs|
+
+|vtiouz_bcc`bbf^UY^b^_c^\SAfv`V@;VR/#&'+!
+	9.0N<+;443?D??DEFDIRJOQRLINJHAAF(	930DA9
+=M4%L[_V9EbO!
+
+
+
+
+
+!2[V\^WUQF@=?=AEHpsooqsommoVF@<==BQdpl\!"
+&+
+%b\[ZWUSVRLQMRUIFNA@;989;95;74.'&"!+98<838R
+
+
+
+
+~~
+
+
+omhhgimhfdWR\Ž|z
+
+~|usiku¡ ¡££¡
+ z}|svyzyxzvyxtyqsmqhgfcdihfkh_^b`iffdqkpsuzxy|yuxuyfq|xy|
+
+~|volllu}fbdg_dd`_UVVZ[VWZOA8ZydQEV\S(/("	
+
+  
+7I2*50++/DOFJJAEBIQVH@?970#=D@@+	4.+AEE@Q?
+EQ_J2@_O%%%#
+
+
+
+
+";RYZYRSH;;;592DpugqqholkpVF@BD8=Shof_2
+
+
+%""9`LQIDMF@EA@??=75;5044+4,,2/049@ED@05<J=FEUht~
+
+
+|~x}
+
+ttohfkppik[RWq²|
+yqpffq¡§£¡£ ¥  ¡x|}xy
+zu|z|zy}}
+~odf_b`bbL53**3.7DMIYmsostuuzxqtfmvzy~}}
+
+}
+
+}xvulkd^_`bdd__\[c\`[\_SA@ZycREkmY40! 	
+ 
+ 
+;I3";3%,,2*%"&#/QOH<.,!'"?YDAF/
+5,5@LL'2J8BN^I&MfN
+
+
+
+"
+'=MONOOLA40+32(<kokkmimqqoH?BE=@9Nksic0
+!
+IUA887754//7=;;/,+29FQRWY\\^[QMD/	
+4
+~
+
+
+
+xkmmkltsmg[QRd§ |~|tqlgcm   £ ¥£~~z
+
+~~}|}z~
+}z}~}zyvt~~
+}~vlg^bbdZYZYRLFEDOv
+|yzyzu~uxkpszx|
+|}z|}~
+}}~
+gfgdd`_cc_\`hdfcg[LAYufOIbm\2,
+
+
+ 
+ 	 +M<,000,0
+
+*@54?WJE9*/2<9UY<;<5	703EMA3&2[L?N\A(J`@!"
+!
+""!
+'.9BEFJH5(#0(&#;qpmpmhiospH;?E<<FZsqk_(
+
+!%Q?002.0/2,0=JLSSVYY\[LD5"
+
+
+
+
+*BQY^`oz
+
+
+
+
+
+qglossvlcZQIVv¡|v~~zupigch¡£ ¡£ £¡¡£ £¡
+}}xs
+|}~||pty}x
+}tppuxtz||tx~~~}~}uzz~~zxl[Zbbb[_`^fbWSUQdzuppuz}|vxflpt|yyq|yu|~|~}~|~~|~hkif^bc\`b[[ficfbYHDSv`MF^_N5+
+						
+#OA#5.,/4
+!BVNDFZI=8&.0@FNO;?A2
+	2/+EE<ZfJQN
+=NZ@,N[*
+
+
+#
+#
+
+(.38DD;,#
+5txmpmkksuo;5;;AAJ^xvk["
+""%\;9FFNORWQSWNI7#
+
+%+5DAO__cd^cmkh`copst
+
+msostomg\VILk€z}~|~vsod`l £ ¡¡  ¥£¥£ ¡¡¥€
+~}
+
+zvx|v|uyxpqyyx}z}}z~x|zptuuu}z|yy~~}fb[``^d`c\_hhcc[Q^l~zyv}sqpfkptvsylzyu}u|yz|}|}z|}||~}}~|z~fikfb^_^_\\W_`^\^SF=RubUIY^Q9"
+
+ 
+
+   	
+D?44228."
+IYVOJ_F<7
+(<HEQU?=A,
+5,.D88QLBBDD,7JV;7RN%!
+
+!
+
+
+
+&%(58;70%Jspmlkhlpsl;4;=;@Oi}oh\.
+
+
+,hSJA(	
+#,7=BN[fqpqtvvuquqoomfdbdb\_ZUWkpmpstlmcYRBAZ¡}v|}|uph^^o  š§§§£  
+|~
+
+|
+}~
+
+yyikidgic`bggdb[UUM[sv}yzxslup_goqusvxbuxxvvsyyz|vz|z~}~}}|}}|}~c_bb^`cc`[OZ_Y\USSIAHoiWM^bM/		
+ 
+ 	
+2B/24293
+#M^WRO^LF3"?<DHRZ;=?.
+
+52+3;D?B?7;MHBJW<7UF
+"
+
+
+	
+#*((9,3(
+
+
+Mvsqmiimotm7<BB9IVtymlb.
+
+
+/B"&*2DQ`gltyyy~|
+~
+
+
+ttokfd``^\^[ZRLRl
+
+
+
+zkolomibZQF<O
+¡zyyzssi\\q £   š£ ¡ £
+
+z~
+}}
+~olhikfmk_[`b\Y[UQVM_pu}y}|zskg\fklmpuubpxtvutvvzzuz|x}|}zzxyxyx}ygighcfc^d`\\^[YYVRLDJli\Y^`N,
+	      
+
+	&?+0@273%&H_lii\MFAQ_VF@V\D;@.
+3/%5BBDE*
+
+AE<LS=HV2
+
+
+
+		
+%&!'''#
+	
+
+Rysololhpvg29;A8DUztlh`%
+
+
+
+
+Sbdmqv}|}
+~|}zqof_\[ZY[VVSSOSRpoolkoib[SF?Lv}~
+~}vqg`bt€¥ £¡€£¡¥¡£¡ ¡¥¥£€€ €¥
+~}}
+~
+
+
+
+
+
+z}vi`dg`dcZfU\VUSVOJJMLdvoqv|zxvkk[`ggoop}coyuzzuuuzzxxxyxxv|xvv~xyz|lhlidhdfgff\`c\b\WM?Nts_c^`I'
+
+
+  	 		
+00&2/.
+"OpubOJ;;;8=OREM_M;=49.+;ALJD5#=<MS=ES'!
+"
+!!
+
+
+
+
+#'.
+
+Nyttsumpstd4<@?3BY~pqlW
+	
+
+
+k
+
+
+
+
+~z}}vpsqhcWRRUORSRVQHEFOo
+sloosid\SB8@o~zukg[Zt¡  €¡¡  ¡£¡šš¥¡ 
+~}
+yv|uy
+
+~|}z
+
+
+~~tyugih``b[[R\VNRQUVJIHfsmtvuzspciY_`gmpo|kktsvxtyuuxtzzyzv|xyxutvsvyhklhgcggfcd^\``_^[QBEitpkZ`N'	 
+    
+
+#*/.//!DpoO=7<9?;9<3?R^bD?F7
+92'2?IIHH7!4LRAFL&
+
+
+
+
+
+
+
+&
+!%"
+ Qtvssmlopv`57@@4@V
+ztl[
+"!
+
+y
+}~z}vyuyuvvpqqlg^YLSOOFLNSOJLLNRq
+
+ypmkpld`RI5=p|}xtm`Yf 
+
+
+
+|yy
+
+
+|zy~}xpifZUZVNUitqxtuuoo`oVb`blim|ibtvtvquztpuvtusxvyusssst|€iggddbbdd`cbfg_^ZUI@Bftcc``U&	 	
+
+  
+#3;@O\WNRYholkvx
+|xtfVI<FS=@D3	
+9/,5?MD_lW82OVINF"
+"
+
+"#
+
+	
+*8B<3
+   
+Vvqossllqx^5;@=9?[~oiU
+
+!~~
+||zxxqypsqtploilid_VQJNAEEIHIIEIHHQqsmlkkg`YI<;u¡~~}upg_Vi
+~}
+}|z
+
+}tspzyuqxqull_m[cbcigovp_qsspkstuvx|quttuuvppqq±Ülklggigggbbdffb_^WFB9bxfc`b^*
+
+    	+;JYcoxxmoklux}
+~z||xfE=EE5=342DIDZYWF
+?HZQL9!!
+
+
+!
+
+"4+
+
+\xvpppmqqvQ3AB99Fg|slV
+
+
+
+
+,
+}zy|yuupsttqoookmfkdgb^^YIHIEE=AF@A??;?HOlmoillc^R?As zy}slid\l 
+
+
+
+
+~z}|
+
+
+~
+~|xqptopil_lbd`_ldlxk^sssossxytosppqsppospsz§ÓÕlfigcggdcb`ddfdc\WUB@Yuf`_dm\	  
+  Wgiqxux}
+
+
+xpE<;3/07=EM?JNR7;ESUR2!
+
+
+
+"
+!
+
+,2;=AAA<B=;<<<7btqpptpqosN0BD?7ImyvlN
+%"
+Fyvststpqsllmspiff``cbb_^YSUQIH=<8<3;@<08;?DOg¡sollhd[R=Iq 
+|}xoc_[o~y~~
+~
+
+v
+
+y~~
+
+
+}z
+
+~}vuslkkih^igdcchflyYmstmsstttqttpqostppox©ØâÏmihfddcgcbbbgf_[\^U??Qoi\^ckoW5	
+ 
+ Fhqy
+
+
+
+
+
+
+
+
+}sHI?95,2?SR?QOWF;H\SO.
+!
+
+
+
+
+!
+",4BBEND93<?F=98_quskqkkss@2EE<8RxsqlN
+!!
+Wqpmpmogihfggcb_c`[WZYUQOQNLFF7<48<54953887ADbzskmmf\NFAm¥¡z
+ul_Y\p ¡¡  ¡£¡
+}~~}v|
+
+
+~~|}
+
+
+
+
+
+|qpilfkld\pifdhiblRqmqpspuqqqptqoqqsoosšÙÜÏ¿smllffghgbdbfif`_b^FAEiiY\_cf\\N3*<IVftzzyx|
+}~|}
+
+tSF8@8.39ABBQQSD;Hkk`2
+
+
+
+	
+"
+
+!"+,29;?93,03.553\bbklifhlm8/FDB=ZqofU
+
+bg`c_bb^_^[YV[YUVURRQOJJMJEF@B99740852859899Fiqmhlf^UH@c€¡y~}vod\bv ¡ ¡  
+
+~~}z~
+
+~}x
+
+ £¡ ||¡¡ £
+txoliifkWk[``bgghNlookmlsoqmlqomoqtotÎ×ÌÇœpiooihiffbd`fkgbggZMLJgtktlostplikhfgoqqxyqxz~
+|}
+
+~ysU8<5*34!(LVUWD;EvxL
+
+
+
+	"
+
+""(../85/*(/80;2Vcbdb^`fhg25EA<=`mkhV
+"!#"
+dSZMWQYSNSIOLJIJLLEHELFFD=?@B893.0302200.,+0AoxqllhbWMAU¡šz|ylm_[cy  ¡£¡ ¡ 
+~
+~}
+
+§­¹ÃÎÐÔÑÓÛØÙ××ÐÌÃ¹¬¡¡€ vtspgkdcZl[_cdhkg IipmmmlqpmpuqkmvslqÐÜÔœ£oomllggfhdc`dhgcbg_RFMb
+xutuuxuzzv||||}}xy}~x}y}}}
+i<
+=4,39'#MSSYI2Jmb,
+
+"!
+
+
+
+&..(23.!,/7,+0Zccf``ZZ`c03AF8DbgcbO
+%
+"fIMHOMIHDID??;AFBB99D<A=3@=8;34+*(..,0.9=I`mv sqppf\JAMy¡®|~xupd[d} €¡ £¡£
+}}z}
+z||¬µÁËÌÐÎÏÐÐÐÓÕÛâéñûþþêáÙ×ËÄŽª§¥¡££€¡£|tppkhkh`^h_cffffi£?gsqpsmimksqookssmy¹ÛÛÓ¶uplhdggcggd`bdfdbb`RBJZvzy|~}}y}~}
+zx|~~y}}}
+y~~~
+|F	97,2A.!LL=^O,H`B"
+
+!
+
+',+.,+"!%.&.(/Ucbb\[Y`_\,394=Jp
+
+dZ_S##&!!5_@B=AA<;??489933+3,47244745498/;@INN\hkqvy~sstl
+¥©smopg[QEJo­si^\k¡€ ¡ £¡zyuzz}v§ÇØëàÊÆÃËÏ×àÕÈÇÊÆÈÓÞíñíéåáÛÙ×ÑÇ»®€ ¡qlpokli`Zki`hhfhl²7ioqmmgtmmqsqqmllqÑÛÓÁqqqikkfhb``b_dc__^bRJDZs|yz
+}~|
+}~|vy}~~v}
+~
+|z}}_9?&2?0!IFLhE2FQ.
+%&
+!
+
+%(&'./,&!"'#!"Vfbhf_``[V00?<?QsdUYQ!%
+%%EN998752443772/&!&.05DJV^_gltuzy~zzz~vvuobb^fuvi` }sxmkbUDBg©}mfW\o€£€£ ¡§¥€€ ¡¡££¡€€¡¥
+
+
+
+œÏÕÛÙÇÂÁÇÑÕÓ­ÂÈÄÃÂ¿ÃÃÈÈÐÔÐÓÙÙ×ÐÐËœ¥}olkopshc[kikikphl§8gppsqimpilqsmplkœÐÓÌ£ plmofiffcd_fc`bdbc_[LBNmzyx~y}~z
+~|~|}~
+z
+
+
+p(	4=(5D+!H3?A2FI
+
+
+
+
+
+
+%%%&##"
+!
+\cdb__^cdQ(/=9=Vu^_ZR
+
+!%'#ZI5,0%("%*/85BIJW^bhox|y
+yuqihkdch`cfu|}qt.g ¡¡¥¡xutldZI?Y©yok\^u¥¡¥¥£€¡¡€ ¡¡¥£¡¡£££°ÏÌÕÈŸŸÃÁÊÔàÇY·ºœÁŸÃÄËÜêÐÃÂÌÐÑÕÕÕÔÏÃ§
+}soqosoik\lhgfhkki Ifmooooqqommompio ÇÔÓÇ®£¬mlmlllffiff`^bddf`_[IEJc~
+
+
+yy~z|}~}
+
+
+
+¡£¡~=2;,4A0
+MA;A7EJ#%
+
+
+
+(&"'
+_h__\b`\cU+2=<@Zv}^^_S"!.#!!dB485;IUZ^lkt}~z
+
+zzvmopfllkmsusWh¡ ¡¡ ¡ytulgZMBNvš}}tpi[d|£§š¥¡¥£¡¡§£¡£€§šš£ª©©§š¥  §ªš©€©¬šª¬ÂÑØæÏ»±µŸÈÇÂš<Rq}š¬¹ÎÙèÃ¡·¿ÂÇÈÏÓÓÔÑÐÃ°~ 
+~ppopxplf\lbffkgkkšVmmmmoomppilmmoiœÌÕÐÂ¶Ž¶šstuqolghfkf_fbddbc_\QILZv
+}|zuy}}|
+
+
+
+£¡Y/;40B4#Q@'oN2DH'
+""	
+
+
+!
+"
+\bd`b^d\^J++9BL\zz_ZUL!"""#
+
+smoptz}}}~z}
+|z}}z|zqoplllms|oNE|¡¡ }yqi^UAIi~xq\Wf~~|¡§©šš¡¡¡¥£¡¡¡¥  ¡   ¡ £¥  ¡§¥£¥¡ §©š­²ÇÏáûÓŽ®¬·ÃÄÁ£v@!!D|
+¡œ×ä¿Q¿¿Ã¿ÃÌ×ÑÑÔÐÌÄ°
+
+zqmqqttmi_mgidikki`7`kqhlslokostvlm¥ÔÕÕÈ¹¶µ²ªusoimomdhgf[`bcf[\YYMHJ[xz|~~}|}}|
+
+
+
+
+€ q/9/0?3
+FE
+DB
+7IE#!!
+
+
+
+
+%
+#"
+
+
+\c__b\^\bQ0/@@M[up^\VU
+
+%%
+
+~}~yyyuutpxy~yz|yyyyuxzzxvsphmopoxxfM3@Z   ¡£ ¡¡€€ £y|tf[QHHb~yh^Yl¥£€§¬šªš£€€€£ª§¡€©š¬­­ªª§¡ ¡  §š ¥š§©§¡£š£²ÆË×ÝÊ®© ©ÄÈŸk2!^¬¹²©»ÄÃ­9c²ÂÃÇÐáòÝÎÏØÌÈÁ
+
+zspiiktqicihhkhikpcL`plmkmoxpmqqsmÃÛÙÑŸµ±­š¥omkmlhdi`bbc^`b\W\[ZSE@[m}yyyz|
+
+
+
+
+
+ £
+2'0,.A/
+HN'8E
+/LH%
+!
+
+"	
+
+
+
+
+^^`bd[^``O32BEN^ug[[\S#
+/~yvzxystvxvuxstvtyytvpusqolsqusumkhkfdY5(/=Rb¡£¡ ¡¥¡  €¡ ¥¥£¥~~uiZRHE[~xsgW[t€€§ ¡¡¡§€šš¥§¡ ¡¥££¡¡€§ª£¥¥¥¡¡¬§£ £££§§¬©©¬¡§¬¥£šš ££±ÊÎÑÌÃ°¡ÆÃ·_8/(/u¡®ÄÈÃ¬I"¿ÇÌËÎÑÌÂÁ¿¶¶¹§spkhioof_spplihmobH^pmoiktppsmmimÐàØÆ¶°°š£©pmiplhfcbfgc_cb[[ZZ\RJ@Ocx}||zz|~~~|~z}}
+¡U(</0=+HSBNA
+*LL"#%!"
+!!
+
+
+
+
+
+
+_d`b`bcdbN37?EN`}l`ffO!
+
+!Fz}}yxttpstsstvpmtssvuktommqkcb^ghmcphbR/3<;FLUh¡ ¡¡  €¡£ §§© £šzuh\YLJRu
+|uhV`x©¬¥€¥¡¡ ¡€ ¥§š€£ §££¡¥¥ ¥ªš  ¡€¡§ª¡§ª¬®­¥¥€¡¬Âœ¿œµ€ÄÇ¶^=0("'2=sÁÇÁ¥Y
+c»ÎÊÎÐËÄÁº¬®µ¶­ usqmhcfob[imlpklopfV*^mskqmqupmkkit²àáÕ¿°²°¬£®tolllhgghbd\\Y^^YYWQHFBMYo
+zyz|}z|}x}|}|}}
+
+
+
+x43%2@/
+ERILF
++HL'!!
+
+
+
+
+"
+
+
+
+	*\b^\_b[b^Z75FHNdgcfgR
+
+%#W|vtsqosppulompmmolqtvoqiihfc^^`_`fhkiO'ESUSWQUc£š £¡£§£¡¡¡£¡š¡¥£¡}zpi_Z^_t
+zqbUg
+€§€€¡ ¡©§­šª­šš€§­¥©€£§š€£  ¬­§ª§¥§ªš§£¥  ¡šŸÂŸº°¡²ÆÄ­R3*'"
+sÁÈÁ§R
+F°ÎÎåÞÂÂÂº®®®©¬¡¡tqllkggmg^kgmhliplfcB^sqhtpqsqqhokyÇââÌœ°®¬š€€qoklhgccb_dd^__WVWUQMEBHSk}yz}}z|y}}
+
+
+
+
+
+
+L0%(<.
+LSML5+ES4
+
+#
+
+
+",(,3747?=@B@D\^[^^\Y^`Y77FJQbdb`cV
+#!#&"cpihlkmlihkhhifffmlmosqqqfc_^cgdcc^imU5NYY\NLSYm £¡¡€¡ ¡¡¡¡š©ª£ €€§ £€§§§zzvt``hl
+xiVQh¡¡¥©ª©€¥€€€­±¬ªª£¥ ©§¡££ ¥©š©€§­®¥¡¡¥ª¥€­¬ª© ¹Â¹¹­£¿ÆÊ¬yD(
+ÄÆºš
+AZ¶ÇÐûèÂŸ·±©€ª¡ª~
+ xlkikosih`g`fikmlkfkL`lmmpppopopogÏåàÃ¶²²¬©©§tskomibcffb^[c_[ZVVULEFJY`t~}}}}
+~~|z
+h5"'A3
+@RII%+DY9
+
+
+
+*?AIURZ[VUORMAFcd_b`\[\_[<7BIUk_^ZYZ!##"
+dlghmgcbb\^c_cfililpssqotkcfchkliktm\DJZZROFDLQb ¡£ ¥€€ ¡ ¡¡§£§£¡z}}vbfz}
+ui\Qp¡§€§ ¥¡£€£€§©ªª€¥ª²Ž±ªª­®ª©¬šš€£©ª¬¡£©©¬šš¬­ª€£  £ª£€£ª§§ª€±»¹°£ÃÊÈ£k7/AUcc`dÇÃ¹š?g¹ÈÐÜËºµ­¥šš€|€¶§
+
+uuoimplkiikcghimioguNUhmqmopspiklo×íâŸ²±­¬©štpokkcdfbd\_^[[VUVSRSJJJSRb}|z~}~~}~~}z}zzx}}|~~
+zF%#94@LJQR9BUD
+boYJJIHIEDBDAL_``^^ZY_bb9?DM[s~b^Z\^
+!!&%
+&okffbdb``diimihmmikmkqpomsqkcimmst~tQ7AFB9=?<ENg¡¡¡£££§¥š§ ª¡€¡¡¥©¡
+
+qhk
+xgWSt¡ªª©°©§©©ª¬£¥€¬±°±­°š­§§©¬®­°²Ž²¥š©¬¬®¬©­±Ž°°¬©­ª°ª­¬©¥€€£š¥¡­ÈŽÄ ¡¡¥¹ÄÂº£}4~ÄÃÈÊ»Ž­¡£²Â°vt
+utumqpqmhgmmkpiiklgHFYhomposmoomll×÷àŸ¶Ž­¬©vtmlmicg`_b_Z[YVYQVUSFMMHFNl}}zzzy|ytuxosqxuxy|z}
+I%';9
+;7\fBB@4
+
+!
+
+
+\z|i`ZRNIIIEFO`[\c_YZdd[=AIHSpc^\^Z"
+"&'+2to``ffcbhmmlqokmqoohmkqkllf`^cd`WR_c;8DBJMQF;ISh¥ ¥š€¥£€¡ §¡¡§ ¥¡ §¡kmm|xbWZyª®¬š®­¬±©©ª¡©€§§¥ª®±§§¡ §ªš®²°®°¬­ªªª£€¥šª®­š¬­©ª¬ª§©€š£€€£°·ÃÊËÌÇÂ·Ž­¬©€€§»ÃÃ·z3ÈÈŸŽ°¬š£¡€®Ä·®¥
+ qovtttqolfbhgioikmc3(Skqkqpksqolim¬ÛûÞºµ°©ª£vphggkfdcdb[Z_VZVUVOFA?EBBDYsxoqtqvtomokglliomvzxA*(?5'#2BBJF;=B
+#
+
+
+2k}|mk_WSONLMS^W[\^VV^bY8?@LWvmb`bdY&?ulfhckkikpmmqtumlochkoicWVIIFOQNOdvlIJUZVUO=@JNf ¡  ¡¡¥£ ¡§§€   š€ª€¡¡¡¡ ª¡~skVSqyfbg~¡±°®ª¥šª¬§ª £©§©š¬šªª¬ª®§©€ ¥š€§š­¬²°¬­¬ªª©©©šš¬ª¥ €¡¡£¥¶ÏÜËÆÇÆÎÐÇ»¹¶µ±°®°ÆÈÇŽm5pºÄŸ¶¬~ºšª¬š¬§©Æsvvtsuqpkh`cgliklki8Uiqmqolokokkp±×î×»µ±¬©š
+omikffd_b`^[YZWUYZVHE??FHHDD\zvhgghholg`ZUS^^hi~ zE''9NH5=QZHI+@D.&"
+
+!
+
+;u~tpkh`NWRIR`Y_[WYZbcR;<9EVzcbcbbY'!!Htgikhoqmi`gdf^SSURWfoogb[OEBJUSVcsygHDO\VLED?JVs£ €¡¡€£¡£¡¡   £€£ §€££§š§£ypbIAmsgis£ª¬šª±­¬§£§ ¥¡¥¡£¥€¬±¬¬©ª®­¥§¬¬¬€¡¥€¡­¬¬®¬š§­¬©¥¥££§  ¡¡£ÁËÐÈËÌÊÌÊÏÌÌÄÇÄÂÂ¿ÃÄÌÎºoJ("z±¹¹šzqvk Žªªš£Ÿ popqxqvumk^dkdmolimBSioiqlkommmkp²ÕæÄ¡©§¬¥kgkkidgd^[^\VVUROMRJH?A@=DA;0_fUSZ[YZZLD8DRcl
+
+
+
+`'%4ELJRmkM;"AE(
+
+
+
+!
+
+
+
+7/,42=HQJJYd^ZZ`_[\_L<A<HUy
+^_Y\cV"&%"!^x\\^\[`ZS__^OHFJQQ^hipo^cUJOSYU^hsx_@=OQJB??BJVt€ ¡€€¡ ¥¡¥€¡€ €¡©¥€£¥š©§£§ £qkiUI~zmdq~¥¬°®©°©©ª¥£¡§®šª¬®©š¥€š§€§¡ ¡€¬©€¬®¬©§£¥££€š€ £€ £€€ £¶ÆÊÎÎÏÐÏÌÌÎÈÐÎÌÌÌÌËÈÊÎÊÇºiI'_€kbcitk
+} ®©š€š¡ Æšsmtpoqutmi_dgdgfgifL!Umlhlhllkilmp²ÔÜ§tx ªslffg^\[WUVVYRJOMIFBIA@AAAHA43[zcMLHD?8,
+&U_l
+}~|~~zqomd[QUVHL[kS',9EE^tvcI!
+==
+
+
+	
+
+
+'+2++
+	
+	'9S[\V^_bYYZMD;ELW~
+bd^^d[#
+#&*!
+gpS[Y[`QLSYR[OEJU_`b`figcWZSZ_^\ipqiW@FDJ;47Vfo ¡   ¡  €¥€€€€§¬¡©£€£€š§€š¬ª¬©
+studO
+smy¥ª²ª°°©§€š§¡§¥§€¡¡£©€¥ ¡£¡€ £š ¥¥££¡ š€§¥¥©¥¥¡ºÄÆÇÊÌÑÔ×ÕÑÐÏËÊÌËÊÈÈÄÈÈÊ¿»yp\A,Yuzob^__d}¡®°¬ª£º§
+vutqovvqhh^hhhdligfJ"QigkokmmkihdmªÎÏ ~¡€š­° lgd_d_Y[ZQUVVNIHMIEAB=???B?9=9E_zc&
+
+
+ Fz
+~}}}z}|z~z}~}vlkZYOQJUUUZRY^bRQSgf7&0;7IQNE/
+88
+		
+
+ 
+
+'2423(%
+I`^b``ZZ^QRNIDF^
+
+OcbddW#%%
+plQUSYNLQUOOMJNRWUV[[`cdZJDIMF39<8<,
+2No
+¡¥£€¡£§£€£€£¥§  ©€€§š©¥§¡©°€vup^d}qpxy¥°¬ššš£€ £¥¥ ¡£€£¥§£€€¡¡ ¡¥¡šš°¬®°°¬ª­§œÄÃÇÄÆÆÄÆÊÓÕ×ÔÑÔÐÏÏÑÎËÊÄÂŸ·og^RLIU_p|
+š¥šv§² tyz~¶
+
+}vhh_ckgfhfm}DSkimkiollhgim¬Ñ×¿®¥kfi_^^^SVVSVUSLNIJLEFB<EBDDB4<=?RvyI
+;p
+~~}~zz|ssmc[ONHJQ\\`[gZf^^UQSU[\MEZp932"=D@F'#;=
+
+	
+	
+
+
+
+
+
+
+	
+
+""374/'
+
+L^ZW__b\^Y[RJAH[u'UY^dO!
+"&!"|[JIMRMINNDD=<?B@278&#%	
+    
+ "0Sm
+€ ¡€¥€§¥€££€ €¬®®®ªusqbxypxyu^g¥§­š¥¡  §ª¥©šªš£ ¡§¡š¡  ££€£ €©­©¬©ª¥šš§£ §ÄÇÁÁÄÇÆŸÁÆÃÂÂÄÇÈÌÔÛàÔÆÁ»Á¹® sgflkkmq¥§šštšlbhv¶||
+
+ }yutopifoâtimpmkhkgihp£ÑÓ»®€
+mlic_\\SZWRRNIIFFEA@DIA??<=<7<?53Lp
+xB
+Yooquytifcb[MINVVWSWZcbkfd`_Y`b\YUSOQH[\UESm2((+?9D'#;<	
+
+		
+
+
+!&+3*.(
+	Zb[ZU\__[^YILADWo#9SL
+
+
+!
+#&+sA549?;4/'
+   	   
+
+
+
+"*2Icv€€¡  £¡ ©€
+€©š®§¥¬š°©§§¥op\csuvvgtSm­°°ª©¬©¬©§¥§£¥¡¥©°©š¥©ªªšš©ª©£š££ €€¡€š©ªš€šš€£ ŽÇÂÄÂÂÃÂÁÂÂÆÂŸÄÂÂÄÃÈÊÆµ§¥­¡£thkklosy€£¡ pcu£mlqzÐvyuqtsopilfciÇ·¥°zzgif_``WUYVQNNIIFE?@A==<=AA@A<899=9Jg~o5%YqiO\NQU\^`^`dcc`\bU\b\c`[_W\Y_RSVNNLED`WNSi9.0
+"=J!
+EN
+
+			
+
+
+
+
+
+
+""&+**'
+Uff_`_`YY^OJUAHih
+
+&#!2V
+   
+			
+
+
+'+<B<Q[Z\dd\csx}£¥  ¡¥¡ £¡¡€£¥€€š¡¥šš£§ªª©­¬­­°­¬šª¬umbRkqtxpmvEYsm§²°®§ª­±­©­€©£¥£€§š§£¡££¡££š¥¡£š£ ¡ µÆÄ¿ÂÂÂ¿ÂÃÂÄÁÃÃ¿ÃÁÂÁÂ»±€¡ ¡vhlpkis|  tLo
+
+
+|}}[&=
+|y|µcªysppkf_`[ZWYUSQOLLJIAALFDB@;=8<@=90548B^x~xI(Zusko^_[_^bb_h\^`Y_M[^W_[^^[WVULNFIEFLIcWY[d//4&8B
+!HE
+
+ 
+
+	"#*.,+'
+
+Zd`c^_[__d[QOIQlc
+	
+		Yq 	
+
+
+#
+,,5EJSZdfhkzzttvuyypp|¡¡   š­°¥©¥¡©§ª§ª­®®±°Ž®±Ž¬xoZL}x}zvxM?\`S±¬©š€¬°¬¥¡£ §£€€ €£¡€®š°²±±°¬­¥ ¡ ²ÆÂœÁÁŸÂ¿»œÄÆÂÂÂÄÄÄÄÃœŽ¡£¡dcdfgm¡ b~š¡
+vpk
+tkxB2uk­ 
+lkg`^__YWZQORMJBEFBDE<<B@F@FF=;<?<87=A[oqtd7[yxofWVSZYZ\_YYV_USIVYWSR_\ZWUSWOLFBEJ@ZVU\b%/=0
+7D?
+=A	
+
+
+			
+
+
+"%+4**%"
+\b[^\ddddbZUOHLlL
+
+
+®k
+
+
+
+"%%+<ERR[cdkkpxxzv~xxy}|~uztuy
+¡€€¡§£ ©¥€¥©§š§§ ¡ ¡€ª¬°°°±£ylLWs8BH9H¬°ª§©§®šª££© ¡¡€¡£ £šª¬§¡§ššª¬®€¹Ã²ÃÂÁ¿¿ÂÂÂ¿ÃÃÃŸÁÄÂÂ²£  \RSV_hmiµ§¡ 
+xmm£šqq vx9
+7v
+
+£€fHqmigc^^[ZYQORSQMMHFHEBH@EJIJDF?DA<7@?=?EVZZ;Ny|sgQJFNVS[_[YSWUSMQ^ZRY_\VOMF=DDB8?AAQ_U`f#
+,=*8_o\D<;		
+	
+
+
+
+
+
+
+
+%/5/#!
+!_fcdbcf_^_SLWQJu<'
+"z¹ M'7AHSU_ghfhkpu}
+
+~|}}zzyyx} £¡¡§§¡££€¥© ¡§¥ ¡€°°±š€¡©šš¥~x^*}J<8+3b¥©€©¡®ª®¬ª¡€ ¡£££€¥¥¬®²®¬©¥©­©¬š€€££
+ŸÁv£¿Á¿¿ÁÃ¿œœÆÆÈ¿ÃÄÁœ®Q3@OY|z?=U£¬q|tm_£©¬hym^dc`bfdg\/"ftqz|
+x[lkkfgfb`_\UVUSRQNEFIHDBBDIDEB=?EB?8A77;9@RB+7q}ygQSQOSRURZZRNVLLRUVNLWWQFJL=??AEDHIEbN`[/5?.@hmQHD9
+
+	
+
+
+
+
+	
+
+!
+'(250"
+
+B[ciffg\bgYW^YZ}
+*#
+ 	
+D¥ÇS_lksvxsuy}}|
+|~}}xux|}}xv~}z|}¡¡£ ¡¡ ¡šª§ € ££€£ € ¥€ª§¡£§š¥¥¡}k;L£u@7(/5y ¡¡¡ £ ¡©©©¬ §¬¬©°®ª§©§¥§ª©§¥š¥  š¡¡¡£¥¡š§¡~zÂÃ¿ÃÃŸÁÃÂÇÃÃÂÂÁÄÃÁ¶šv
+s;DLoE.[©¬¡yyzo £
+xky§ ¡zgx
+ihfddccgfg^0\bb^[`^\c`dio| €£smlhb`b_\[WWMRSLLHID=B?<@IFHBA?;9899985<E`R'f|yl[WRIRRNQSINQNDDINOHHURHFZEBEDJJFH<?\RcO*D`gUNQJFL=9"!#
+	
+	
+%003
+
+	%EOccf`ih\^QU`9%!%
+&	
+
+gÈœzxxux
+
+yzzuz|vvyzyvtyv|||t|  ¡€¡šš§§©š§­®°­ª¡§€¡¡¡¡ ššš­¬¥§ª§¥¥§~tY&x£¡O/'(.c¡ ¥£¡§®®©¡¡€ ¡£ ¡ £¡ § ¡€¥§§§§¥€¡££§§}y}|~©®~©ºÆÂŸÁÃÄÃÃÃÂ¿œÃÁ¿·©}u}ZObt"
+Ss|uk|t}zu|}}yzpls|s~|z}
+ytzoš¥©ª¡zs~ddbc^^ccc`fb7!\gdccc[ddb`dcptz
+ooid_^_\WUSVURJFHLFF@E=EAABNH?A?=588789?FN=
+Z||fRSOAB=ILQEMLME=HNLMNUILI[J@ABIF@=<?bVgR
+&H``RIIFH<28&
+
+&#
+"
+
+
+
+
+	
+
+
+!
+  
+
+!;E=.
+!/'&%#*%"
+
+	
+ ;¡Ç}zmtvsv}z|
+pqqpusuuvuv~
+   ¥ €š¥§¬­§£¬­¬§š©§ªªššš©§¡¬®§ €ªš£¬¬±¬­­²®¥¬š€\'EpE((/9 £®²®­°©¥€¡€  €¡¥¥¥§¬­ª­€¬ªšªªªš®§¥|yyzyzxsVWN}€±¹œ»ÂŸÂÂÂÄŸœÁÁÁ¶§|t`V_|N
+/7,@U`s€¬©¬¥¡©££¥®€¥§ubtzkl~z¡­¬¥
+Žš}vtplhfbhd=!`ccd_^_bcbdglioz}
+~|lklfdb`_ZVSVVRQNFFEEEIB@E@?MIA947;8<?<7?@?.'S}v`HLFAFDFMOEDDMIEJQNJESHEDYA@JD@7?;7<bJc@%9LSEBLB;3/@;!"
+
+	
+	
+    
+&&03
+
+
+
+!8#
+((/%
+
+
+	U¥È~xxy|yxx|~||x|z}xyzx}zxy
+£§©ª¥§§€©©©§­¬©£§¥ ¥¬€§€š§¬©£€£ª­®­°°š¥¥§¥uh4uV'&*l¡€ €£€©¬š­µ¶²²±Ž²¬§ £ £¬°­ª©ªš©¬¬©šª¬¬­°°©¬®€|vx|yH%MyšŽŸÄÁÃÆÁÂ»·¥xx}YD2QNOL[lvtsZMMYNR£ª £€ª©¶š€©§š©š­¹º¶€o­š¬§§®§}}yx||yz~
+
+u_Riqkcbdb^cd^dhgiu}~}omhcd`^_`VUVOQHJJDHABE?HMAELLF??9=@??9;@A?5+IvmWIE@HFDHONHJIJAB@BFD?LEBBM=F?D=58;4EU<bb
+.DN@ADL;9,MSB.%
+
+#
+
+
+
+
+
+
+&4?;@HJMBM,"(IV@%%%"
+
+'Ì¶yfootopv~}s|x}v|yy|¡©§šš§£¥£¡ª­ª§šªª¥©­ª­®ª°­ª§š§ €¡£¬®®Ž±­­®®š§¡£¬©ª­š`UA'Jb+7V"š©€£§ª©±¬®­­±²­­§¥£¡£¡š©§¬¬š§€šš§©¥¥¥¥§ª®­°¬š
+
+}~
+c3
+FU[B0Lk€°¶»œ¹§zt~yp[
+"F\\ROQE&
+
+	&4gš¹­°°ª€££©­¬€°®©¡°²­ ª±Ž€¬° ©©
+zxuyxvsxzyuyyy}|x}~~}xuttpoooqu|x|iidfb`[\ZYZUVSQMJMMJLIFLFHJJF??<;?<D?DEB=942FscMBA=?<BDIEDABA;A??=E;DEIEH;DDBFDBIFLI8t+
+.?ADB==5O_fcRM@.
+
+!"
+
+
+"
+!%+0<EHJJHJOMFEORNSWVWS+%F<
+/p 
+9
+
+
+
+V°×¡qlihhpmy~}||x~pt}t
+ €ª¡®°šš¥±©£ ¥¬¥¬©ª©§ €£§¬©¬§­±²¬°ª£§š©ª®¥€£€ ¡ yx}yfE5+'
+vh&.#S¡­±±²šš±±ª©­§§€¡£¡§ £ ¥¥¥©©°®­­°®°ª§®©©ª­š°°¬©£~~|~|H?IFH8&
+
+	
+2Mst`V\F"
+ 
+"
+
+,F`ŽÁ°£¶²·ª²¡¬¹¶š¡¡ š¥­­š£ª±§~~}y}yzyusqpxytz}|tsvqx|xqtxus|}~|sllifb_^[YYOOSOFLMLHH?JEABDFDB@?9<;??@@=<<827d\?3B?7A?EE?B@4;59934<BFLOLWQLI@4,'23(#Ez`"8MDJD@BHO<bzSOM@"*'%+4+58<FNQSVWVVZZ[\__b[^cf^_\WYWVYYQ#+;('¶¿c
+
+
+
+
+O°Î±x}}¡¡¡£§§§€©¥©£§¡€£ £§§€§€©¡§ª¬¬ª±®®®®Ž®§§§§€£€ª¥¡©¥€¥qWM?8<<8<8#%
+Vh0
+}§4i£šª±© £  £§£©§£§ ¬¬ª¬¬®°²¶­§ª®­­§¥š­šm¡ªdu
+~oWE/#	 3EE+		
+	&29'%%"%+;J\uš€ š±ÂÆœª±·»Ž€š§Žª€€±²©¬µ€š ¡~zxussvttvopqxxtqyutollmmmqmfhkpossuxvuqoiohcbcYYYYSQLFNJAHIBB@EDJMJ@9@94489A?7<8;5
+R@4475;;;=@@=579?HHEJFF?7%
+!
+
+!7IMdxx='DM9;.0/2BZupgdifcZVSVQORMSW^\_``\_Z^[[Zb`_[[Z```^^iktuz\
+&&"
+ÏŸz!"%"	
+
+	@}}xymlpy¥§©©ªš€€€¡¥ª§¥¥¡¡ £ £€£ª­¬©°©§©°¥š£§¬©§¡€š£€©§¬°¬±¬­§¬®¬°µ£S8*+."
+
+2~ul`"o§©€F€š £©¬ª¬²­¬­­­°¬¥ €££§¬©¬¬¬€£€©²®¬šš ty§~ ª©š­£
+q[M4,!
+!(=LVB/
+(44IZhb./*0847Hcz£§šªºÁ»²®œŸµ®¶¹Ž€¥ gJHO\ckvz~}yuuvtoqllghhihkgkhbcfdgf__ZUSskkmigcc^YWRONLJLFIEFFFLMFNSIH@<=97;A?<785=7BFEFLHOMRUNBD7,*"029FFNJSRQOV\_\`hityR*@A(&+E^qlptgttmomspl`ZRSRRNSOQRRWZWWZ^\[cfckmgmlkou|
+=/+"kÊšo"
+
++
+
+
+*&0cziupfm€ ¡  ¡£§£¡€¥¡€© £§ª£¡¡§¬©©©©¬­©¬€š©š€£€š¬šš®§¡¥¬ª¥vUFDB?;33;@JLQl}ot
+q[;LdB@H¡©¥¡¡£®²¬¬®©¬€§©­¬®®§£¡€£¥©ª®­£§££ªª¥°®§€
+xo €©¶œÈÆŸœ²£~thV=/%"&/94+(5JRYUA//<IQ_mg+#"
+
+!!#!*5<L[gtz} ©ª­
+¡°§mVQQNMOA??EDFHQYfpu
+zyvokhhllhif``cgd_\^`Ysoidkgd_b^\Z[QQQLNIMEHJJLOQQMHAAB@99<;;@9??8/33.,+!%(./?AHOYVZb_[Y\Z^ZWWY[^VVWSYYd\*%*HVlzzuippso`[posulpf`[QU``h_^bbdffmmiofgotuyssp|}||tsug''0,+/±¥d5%%!	
+
+
+3BIJYQENit`=?¡¶¡£ ¥£¡§€ªš¥šš€š£š€š®§¥ššªšššš££¥ªš¡š¬®®°°§©¡
+is|
+
+ttx_SblYOW`V8Wd¡£ª°©®±®®°°  ¥©­ª€š€€¥¬€¡£š¡£¡¡€š¡
+ s§tly€­ºÈÐÐÐÑÈ·šz_QB0EE<DE@3+5;LSSND@?JSY_S%
+"
+#"!!%"
+!"
+!#
+%#!%&&.7DEQ[N7@43EDFOVQQUSNQLMIEFFELJB??AHMRbgq|vsqlgififbcYlmoihgbc^Z[\WVVURLLINMMHJMNJOIEE@?9@A?<;85</	"9MNQR\^[`fb\[[c``^\cc[YYQW[SVRQRQOQLFDM[gEV_kq|ughupNA^puuxmmlmmmks~
+yxmmssustqmvmlg_hkooquxt|z}L
+!%(%
+
+~RWNEA<4*
+
+	 M¥zfBN€€£¥€€¥¥€©¥§ª®š§¥§ª¬©¬€§£€¡££¥¥££££€€ys~
+dMYcdfhbHD_osyz~€š¬¬¬±¬¬©¡¡€€©€£©§§¥©€š£ ¡€¡€ £
+v~¬ qkpx¥°¿Ã¿ÇÑÛØÑÃ²€p[H=F?DFHD0,/8IORQLOOVZ\YL
+""&!
+"&"!%!'!!
+"&#"
+
+#''
+
+
+#+2?ELJMLQQ\WYWOMLJEA@?JJINVbho|
+zzullomlgggb_\W[\VWQQONRMMMIILMMOOIJHJ=@B<<A<;5;0!FYkmlklklhcc_cZ^Y[Y\[WY^[UYSWSHJFMLJMNFEEIWtzpmtgcmyu_L2&^
+
+
+|yuib``c`__fixv}
+~~yvyvo7&/?B'H¥vSS8,
+ 
+&2E=;;LdfD#If
+¥£š   €£§š®£§ª©©±šš§ª°ª§§¥¡€¡£¡ €¡š­¡ §§š£€§¡¡¡¬®­šlSR`Zhgm[V=/'(Ybpx
+ ¡§§ªš€€©£š¥§€§®©©€£€š€š¡¥ ¡£ }uš€yhgptx ¬±µ¶¶ŸÎÝåéÜÆªq`NHJNJI@0,00?RMUSQRWZYWM#
+%%%!##%%%!""&"#&!"!"#""#!%"(
+
+
+
+
+	
+
+
+
+.DMOU[_YVVW^^YVOVHLNHININO[[bhs|~
+pmlkkfdb^_[YVVQUVVROSJLRQRVYYROJLBAHDAA;;40,2fupqlkhkf^b_b\_\Y^[YSR^Y[[WNQFBLHBFDEDIEDD@Qmppku~pUA."'/l
+
+|yxyzxsmkdko|~
+yvqllkkkcg[""#+
+*U`L7.*4(
+
+#'00ALRF=..^
+
+€š§©¥£§€€£§§€š¡£€¥š     ª© ¡€€©€¡ ©§££¡ ¥
+~x}tSi`db^V=,"&3[x¥€£¡¥©­¬¬®®ª§¬©©§¬ª€¡££v¥ªymmiloxv|¥¬®°°ºœÑåñòåÆ
+ulc`\ULHA284?JVSQROWVWWN
+
+"%!
+&%''/%"&*"!+"*"&&%#"!!('
+!
+
+	
+
+	
+		
+"4EMRQZYY_^ZZYYYYVONMLFI@mkpllhhcc^^\[WYZWSRUUUVRRQYWWRULIF?BA<==@AB0Ysqkghc^d_\YYYSYSUUQSQVSWOQSOLJHMNFEFEEEB;@AOogpxyxZ5+*;DOm}z}~~|||yxzxuttpqstpz~
+~yogccbYY\\_\bgglM
+%BUf\9
+RdtkQIJIJE=;22,4NZ^NDHNWS?7JYVYi£¡€šª§©§§¡}£ ª€¥£  ¡}~~usdkQ9;;3.2.08??Rg~
+€€ ¡€§ §¥¥©¬ª¬§£¡šª­§ ¡¡¡£€|
+£®¥khgmmptxy€¥¥š©²¹ÃÙêõòÓ
+uiimlligbY[^Ybggbb`d^_g`#!
+
+
+
+#*0.%+*'&%#"&""'(#
+!!!*'
+
+
+;;@?JMA5+*(!
+
+
+
+		
+
+
++.9LOS\dd`[QNAmkkllffdb[[Y[VZUYYSQSUQUSVQRWSOJEB=?@?A<@DB7ftqkgcb\[[WROLOLORNQMMLOONOMJFFEEBABBDEEAA<AIqz`M<;
+0=@JHFWtyxzvlpqqzqvopmqpvuuvqmhhhf_c_himlllkkvyxof*(9AHID+
+@~
+~vbiluyvz|}|
+~z~
+u}¡£€££}|}}xqv
+
+}vuppqs~zvz~} £¡§š§€§¥¡ ¡¬§š§§£¡§€€§š€¥€£ ²²~okkpppysz|¡¡£¥¥ª¶ÆÛíóÙ tllpkkkih_bd^hqssstxtpyi8
+
+
+
+
+!&!%%%
+&+
+*&'!!
+
+!#
+	
+
+
+
+,'05<@JJHFDE=42*#&
+
+		
+
+
+
+
+
+*"23qighhdc_^ZYROOSSWSSUUQQULMRUUUQIA?=?D=@D==D9hopph_ZY[UONQJMOUNNLLLNMMLJIIEEBBD?@;D@9@;9BLlR0L;0?FFDAF<7HQioopsptppsvqopkhigiighmlyz}yvxxuch\hcggkgO%
+
+"8x§luu}xsvsxyt~}|¡ }xsi^hu~}|€¥ªš¡~£¬­­­£¥§¡€€£€€¥¡ €£   ¡ €ª¬š¬ªª®¥¥š£¡ªšŽŽ­£  ¡¥¬ºÈâê×©}upqllqlkf^\b`loppsptmphF%
+!"%&9ABB;84+/'"!
+"
+
+
+	
+
+!&*7;=HHFJLAA9,!&%
+
+
+
+
+
+mgigdffb`^ZZWZVUOWUUVOOSSORVYULLIB@?A72A7<=3lpmsg_ZZ[UNOLMLHNJJFIIAHINIEB?@?E@?@8@?BAA89LcF?d`ONEH?=?JN[fpilpvuovtoopuustxv|}||~|xommdmglhlgbYUW@
+0QY}
+|to
+
+ ££}z~suv¡§ ¥®±¶±±¡££¡¡€ £š®¬š¥¥ª©§€£¥€ª©­Ž·ºŸºµ·²°µ®°ªš§š§¥£®€ ¡¡§©€€€°»Ð×Ê§}zxtsookhkdc_`kkmqpkuomgVNH.
+
+,(*'
+0N[bb_[[\_^cVD&
+
+		
+
+
+
+	
+
+
+
+	
+
+
+
+!%,977BEAD;;=A4'(
+
+
+
+	mpkhlggf\Z`ZUVVVOUYSWSSVVQVZYSROMDAD@9;?;820hpmldb_[WIJIJJIMSIJDF@E@@FDED?<=;??A;<@=88<@OdRRp`ND7?LJ[iststvvyxvkZdspvsqmsoomploxstpqmmoksogdd[JH=I'.c~SL~~}}}}
+}  £ š¥££¡¡
+
+} ¡§§š©­¬¥ ¡£§£€š§¡  š©­€§§¥š y~¥°Ž·¹ŸÃÌÏÕØÙØààââáäàÛ××ÓÌÂŸ»¶µ¶»·¹±±­²°ššª°ºÆÊÈ±~ustoikkfmd`cgpoqppopmdWOM<8EE?+##&?QUZ\ZZZ[[^`c^J(!
+
+	
+
+
+
+
+	
+
+
+
+
+
+
+
+		
++585A9?@@74.(
+mooliiic`\Z\ZVWUWRUUUQRWVUY`YRFJH<A===8@;=?8fomlgc_VWOLJJLIEEHH@ADBBABBIF@;4<3=<98998;9@NkbRk\FO^^cqyx}|sipqlkmhiplpoohilli`bkmolkmmuvuytdZJ740&
+
+!it@J
+sclutz|z|z}z~skmuuxsu|y~|}|uz
+~~¡£ ¡£¡ £
+
+
+š€š£€£sbcgcfoq}}­±ºÂÌÑÜåññó÷ö÷ø÷õõòññïëæÞØÙÕÆŸœ¿ÁŸ¹º·¹ÂÈÇÈ»©xqpikglmopkmooodYRVgbLZkkml_`dbgdc^ZZQ=!%
+
+
+
+
+
+
+
+
+
+
+
+	
+
+
+
+
+
+
+
+		
+
+&#
+'lklmgggd_^[_UWSVQQQSQOQVUUW\SSNEB??@==@549A7kmlgif^RQJJHDHHHJEEA=??@FAA=;@@98/5525=3<5<?JfZ?JM\f`_svymkldipqmhlkomlqkilkglcQDR^dhmqppiklqlZ[WNJ3
+
+	
+
+
+%R¡RAQptyz}||y}}utth\ZUVlplz
+~|}}~}z|
+ ¡¡¡ª¬®§¬€sOLOY[WZ`_^^`p}~z°ºÆÑØåñööúøõñîíïñèâÞÐÏÓÓàâÞÜÝÝÜàÞÙÌœ¬€£¡£}|xvvspidbzš~_tuukU5!#
+&0%
+
+	
+		
+
+	
+	
+
+
+
+
+	
+
+
+
+
+
+	
+ppkffcg__[[ZUVWQURROUUOUVY[ZYWSALBABAA=9549*dkikoibWQJMHB@IAFDI@@<@@@?@DE;A?=3404208357AJhR8LWYMI^dkpmitqikpmlfihldihdmomigd\\bcclkdfhg_^\U[Y\\I		
+
+%_+7@IEDU~z}}sxz~
+|||~}xozpu|
+yvvuuyxhfyzuz~
+
+¥£¡¡€©ª­©§ xz¡lRLS[WMVZVWZVYqhZ\`_Z`fpt~ŽÃËÏÕÕÛááâèèÛ×ÕÔÛÛÞæîîîñóö÷íáÔÇÆ¿¹·¶±ª¡©¬ymuMc
+
+f92'%#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	
+	
+
+
+
+
+
+	
+libdfdd\^\YVUVZVVQLRMOLONRUSSNFBA9=;;=;@344(_ldhhf_[RJFFABIJHDH;4?58@8@<<=<9A272078;.558E^JE@H=?Ylolifipmqtmkghghomspdpsssotlpogfkc__`\`dffdfki`7
+ 	
+!L9ASpkYSs|zou~}v
+|scdgdkilt~||uomktttqx||vxy|
+¡¡¡£ 
+€¥¥£€£¡¡£ £€€}xyylQILOQVSONRSSSVROQSNOMVUYl}€®²·Ÿœ¹»ÂÊÆÌÓÛÛÓØäíöòäàØ××ÕÕ×ØÓÇÃ¿œµ±®š§§¡¥zv  _
+©€vYYUUS?
+
+		
+
+
+
+
+
+
+
+
+	
+
+ 		
+	pkhfc``bYRSVYVSQNJFHMMONILUYVOAF?A;;99532/4([miiglgZUJHEJ?DHHE@49=?58@DA<9;;<83477438034@bQ=5?=?MbmpllklsqkkighlltxzzuvpicpqpstsmckkclpqokktutsiF
+
+ 	
+
+%<Vdy
+
+
+}||}zzvutvq^bsspsxz}xtuvsttuy|y~
+
+ ¡ €¡§©
+€  £¥  £¥E"&2739;FJMQMONMLLMOMNVNJQQRSQWikx~~£ª©¥©¶»ÆÆÃÈÆÄÌÇÎÓ×ÓÎËÈÇÄÄÄÁÁŸ¹œŽŽ®ª§ ¥¥tt©¥
+|~zg*
+
+
+
+
+
+
+	
+		
+		
+
+
+
+
+
+
+
+mhiid`cZYSU[VSWQMNNNQRUOOQUYOJH<B@D<@=9//2*!\mhhkfb`RNAF==AHD?99=9;85?<<77<;<5./50575,05?^MD@<?A@N`kmpsooluoxqlhpqsmqmihlmkmlx|xqlkstxxtspslokd_Q78"4F^m~
+z~yyuyy}|}t|xvttpkdkkiit~š¥š¡§š¡ ¥¡£¡¥€§¥£ E
+
+	
+!!+/239DIIJIIJJRNROSUSYSORRUSVZ`dklv
+€£¡£€š¬±µ­²°¶¹¶¹œ¹œ¿ºµºµ¶°§£¡ ¡£ £ E
+
+
+
+
+
+
+
+
+	
+
+	
+
+	
+
+
+	
+
+
+
+
+
+
+	
+
+	ghihidb^\[YYYSOUVQUMQRUOURWUOLNI@FDADE8?92+
+Vigihdc`[UNEA=BA?<898=5729=?<<82;97474+4707/5dL@EFMRSQSddsmgglmpqmlomloslkdvvv~~xxxsuuxxsxsttuutpqkVLJA+,0=FN`iuz
+
+}y|}|uqqxxyz|~|x|zuttokibmmg^dkov
+€££§ ¡š§  
+ ¡£¡ J
+	
+  
+	!
+'00;?AJQOSRRQQINSNZSJROOUSVksmh_dkomlx~~¡¥¬±±Ž²­ªª££¥¡€ ¡¥€€£¥£ zH+*	
+
+
+
+
+
+
+
+	
+
+		
+
+	
+
+
+ 
+	
+mkfhdfc__^\ZWUUUSQUOOUUOWUVQSHLNHJIE<DA=7/*&Okoggcb^^SNB@=@BA@;??;7488<934.209//332/03//0^OLNONB?@?L`g`_LJVdhmkpqpqzy|pxv}xtqqploqupussqxutqmqssdQIFLOMWWoxvtuxxxxqyuouxqsov|y}x~xqiilkmihfdhiiidlyz~~}§¡ ¡¡£€  £š©š€€¡¡¡L28773,%		
+	
+
+	
+
+	+'+7<D?FFMOHOSONLMWY`\WVZZSUONMMSROVfpvxu~ |uuz
+
+xSORNNJHA=8.2%
+
+
+
+
+
+
+
+	
+
+
+	
+
+
+lkgdcc_`^[[ZQSVUNRRQLHJNROLMQJIF=AB??=8?9/*
+Skhcd`^__NMFA<9=A;2750/8.;;993.22752//22.430D^FBDDFE84BQ\g[`_Y\hoosxyz~~zutomfqqpomsypoutpvvuqtvzxiUDEQS[``dkiiidhmoppspuqtyvuuqsqimcVYfmmqmqoxu}zxvpmvupz|  ¡  £¡š   §§ ¡U4B=;720#
+
+	
+
+
+ 
+   
+	
+"/842?FNRRUQOROOJJLQNIHJIIIEFJMHJS`cgmxy}|zxlb?;<=?JJLNZbisttxz|}|fLQLNMHOJQNNOOJDEA=90+*!
+	
+ 	
+
+
+
+
+
+
+
+	
+hgbc``^\RSUNJMJEFJFHFFDQONMOULJLH?9B<B980.%#Ndif`[c^\UN?989<@727,0/(295473+2/.03402837/3DZOOOOOSUhuumoqoifktz}}z}~}uskbbghquokmiliotvxvsvqsxx|v`ALUYbid`d[dffcmsmvptttqphfbimlqspyupuuztlsvpsqxvpoisv}}~x|¡ €€     £££¡ £§¡   
+E7@A==5,%%%,0324..+"	
+
+
+
+	 
+
+%2*79=@?@DIOJJONJJDLLD??A?@;???EINI;	!/44<A@ELOQSYVWZbcb`IILHIJBEAFDIMNOSJMLFIHLJDBF=79,/#
+
+
+		
+
+
+gig_`__\YQYSOOSONNMHIFMQOOORWNNJLHJAB;9777+%Fklgd\bf\UF=<7@;333833+*/798,''//2+.2772+/3.<QDBAJScdpptotzz}yzz||y}zsud^bfqstqpkqssxtupvptvuxxum^RQ`c\cbchZVZ^^giqqqolmtisuupykkhmtouvsqttyu|vxtxtsqploppsvy~
+   €š€¡ §£  ¡£€¡€¥€¡
+;8?DB@93#&*33349<A?774;72,,'&
+
+
+
+
+
+
+	
+   
+!'#/837?9D?B<=;;97E<9979;5
+
+/75<=EED@AD<D;@JIQN@EHEJHEFJADEFFFBBA@ADFEIJHIIMNIJJFE7/#
+
+		igcc[^Z[ZSSNQLLJMMROIIOOQQJSRMMFJHFBEBE?72+Noic\Y\_\SE752<<70/*0**,0532(,+/0,**,52/05,,=L9LY\lhsyv|z~
+z}zuzzvzspmkggkpsuyxstttvuuusokmopkbWS[d`^__`^db[[^dfkosxozxpoqqommouluukoopupuzvz|yzx|tzy|y}~|||¡£ £  ¡¡€ ¡¥¥?8EE@B7/
+++.4959;?;9@@A@;?<99B=85782/3(	
+ 
+			 
+
+ 
+
+
+%*"55/232,*2
+
+7?BIBIILE?@B5997<9?E@?<8@DAA;<DI?ID??A=EDDDA?AHD<=@<8*#
+!
+""
+
+fcc_VYWYURNONMHLHHNFDJOLNJLWURRMIFFAB;??97(LgfcYV^^WJ=57,<99/+'.'(,4<0/0/%0+&,.//,,0009EN^oqqto|~}~}vyxuuyy~splmssmhqqmotlqtookpsohtvqpf\`cfZ_bf_^[WVZSSMQS\^dklmkpxyvuvxzuuxvxxvyvx|yyzsuz
+
+~£ ¡£¡¡   
+¡¡E;IEIH82&!4544;7757;=DEDDBBBJJNJFFJHA@<;;787.2,,%
+
+
+
+
+	
+			
+
+
+		
+%009=7?47555427JA354/8=2543;?5;75<<99;FDEDA@=*(+'
+
+
+
+!f^bZY[YWYLLHMJHDDDLHDFNIHMLSQOLFEADH<3<<A8/&BfcZUQYUQA5707<;4.(+,*(3?72+/2**&%&*&3(/.229Hkyyzy}~xutxxqllkmshmigbclmmsxtluusosqhiffdosmtqi^ZJ@BR^^WMIDEMLFMSWWQ`dkiooppvvuxuutt|zxxz}}z|tsyyzy
+
+
+¡  £ ¡  
+£E2EMMB9.#(/./40823@@BAIIJDHNILNJLRQJJHEBAA;?94;?@<4459''!(
+
+
+
+		
+					
+
+
+
+			!'+2RJ4579;7;50259557?58403502045/.30+.%(
+"
+#&'%!dbdZWWURQMMNHFEHBIFBBIJJFILQVOMLH@D<A57=<0*#@[_ZNRRFB82,(8A98'*32+,83/(%+'.(('*+25,,3/27Bqzy|zz}ystxttxzxpd^`iqkkuvusqoppqtmpttkfih_dbYULIMS\QRNFBAEFDABNQFY_bllossqyvxtuqtyzvxx}xvus||}|yuz
+
+£ £¡§
+J9DMQD9."#(.335=9=;9798=9?<BABHJIHLIFIFD?F@@DD?=DBB=A9=9830430.,.%(
+
+
+		
+
+		
+
+			 	
+
+		
+0&+0/23323845;/+/32;//44*,3020++.*(.*//,,+'0284;5gcb[WUSSSLOFBHFIEIIBEJILMORWQNLA??9A==9<=0(&+M[WRSNA<430,790,%,*',&032+.0.0,,/+/./35(/3;Musyxvyuxxvxvsptokhf_ksipmouoosuupptspkggSFHF95<2;0;JMJD<A?FFHOSUcb``iomdlqtstlssusqstuusystuvvz|y~}x
+
+¡y
+
+ 99LNI?5/
+&*.27=5=?;4@D??=?;;7?8@@4<9AA=E@BF=;@@<<A@@A=?=<<;<?9?=77800,*%#'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#"./0/5+.728457.244*0.5+2293752*/2758=?__c^VUONRJFFEFDDFBBBAEBLMJORQLIF<?8??774530+*LSQIFE<53/(*780(,,&/./342///,+'3/+35044.<DFQssyvyzxyzxkdkompokfosmplpuqmsusvtuomgWI93.!
+'32+,5=AFHFMIISU_\[c_bfUfifkhqoiqqstxutxvsxzy}zt}~
+ ¡£ 
+==LIA@7/
+((+5<9<;?;98@=A@99;@<=@B=@8?<<<<B;<B=DHH?AA@=?=BD@<DF@HB<=8940,//*&
+203!
+
+
+
+	
+
+
+
+
+
+
+  	
+
+
+	#"%(.02+/*33322354,2/02574340b^YYRJQMNE@??DA@D8@B@=BHLFMOFJDA=875373278+,!2QUHA=48,*./<842/5/24478B@=D?FA@?@E<422289?Au~vpopumhidffdilqqspuuvvvuvtstptsppgdL/&
+!*+;IVOB@ESVVWUS\cbbc^[d_cgbbhihuxvvvuxxvxxv|~~}
+
+
+€
+xz|¥£ ¡¡
+D7FA=;04%
++(++34<B=AB=?=?I@ADE@9FA?=;=BA@F<<AFFDLEFDFFHIBBLEHEDBEEBD;97877/'*%
+.05(
+
+	
+
+
+!/094***+'!"	
+	
+
+
+		
+	
+
+	"%#"+/,0/++0**.,(\YYRQNONIAD=;=?@AFFA<?EMLHIHJF;83774/57+55//'!QOBDB@?;8@BBDD?<@=EA=EEI@ADEMOINOJBIHBDH?F=pvbWdgfgdcikppimqoqtvyyz~}xyy}xsdb\JEA=MSUWbd`giddbb[bc^WQgldfgcckgd`chquy}~~~
+  | £¡E@E??9<."#''024=8<<88A@BAADF=?EAAF@EIJLENJLMJLEEBBI?A=ABFHEFD?=<E?D9;8<3,4..&%%*43%
+	
+
+
+
+
+
+
+5FA79A?7=D4<=;2/3.&&
+
+
+
+
+
+
+
+
+
+
+		
+	
+%+%#YVUNJIIEHA9A=@;A@?D;7DDJHLIHIL=95734/,80.2,0!/DEFD=89=;AIEIEOUYSUSMQONIQNOU\RLHJHHD@DB@=<gtsmiohkdfilqtpsvtvqsvz||ysqtssiQMSNNOU`mvmmsquyvtpikhifgdfstputmikikpoq~~u~z}~~
+zu
+¡ ~89D@D;72!(0.033808=9;84;@BAEIEBBIHBIJLLLLILIIIEEEHEB;9<7;=?A?<8;@84537;42,,*(*!788!
+	
+
+
+0=AEB<59<B;9DA<;<@;=?7=95*(%!!
+
+
+
+	ZVUIIIED??998<B;;D=9==AIDEDBLHB<8/824.*(+,(**5YYRNI;EHDNSLOJU[ZVRIMNMJIOHOVVOIAA@A8;=@8;8ipooqpppqupuyuuqutsomquytytzssukYYVFMScpvypuxysz||zxtxpqvvzxvxxupmbkoddmzxy~~
+~}zutyth|yx¡£€€¥ A;B@A;99&'.2277<<BD9;==?=A?DIHDEALBFH?HEF9AHBD?<B@F9;?<;<?<847+D===;;74500*+&'034'		
+
+%*'%&#!%&&%+3=9;=748@E<5@7;=A948;?<4524332/52*+(&+*#
+
+
+
+
+
+[RSMJDB@?9887<=89@9;5A@DHDAFEAD<;9989.!&.,&NfhWM?=@SHYWSQRYQLNH=IED<BEAENJ??A<9=585<94=ivompmpuvztvyy|v|}}||xxomppd^b\WUYZ^`iomstyttytsyvst|||~yzvkmuttxyoxuos}~
+z~spookldkfxx
+
+
+~€¡¡¡ €¥ @4AA<780
+(+058;;A=AEEFDBFF@DDBFB?@D?;3?;=<==@A@=EA?<=DD<<DB@<A@D@<9<=744040,,'
+#.+(
+	
+
+#"0.,/37434<97;978=7<A?8=A;?9<88A4A50834;8?,72,2+75890(0/**'
+
+YRRLI@EAB@@=79;=A75BA=AEBBENFD@AA49<42*.0,,+RkgUD<5=F?MJBJIMDB@@?;@?@994?DD@<A=7;033433=iypoxx|zzz~|~}|~||zz}utuxqldSVWRc^_S\RU`\Ubittoilvoptvoouyvqmsoksyytvy||v|
+~~~
+
+||ltploik\_msqtq}
+uz
+
+  
+yt|~~y££££¡ =3?=<;4/
+%'/7<8@<=FHELHE?AAE@=FD@DAA;=A9@9;?99=9BA88A@<55<@8D@9===?=;34;890/0','2(
+	%&*'+2//4893=;A=?7@=;@<<=@5<7<;89@B;?<=8;9959593/43/2,.#3255(//0.+//*%!
+YRQMJAHHJA@=9=7;=;A@?@DEMOOORLB;58524./4,++'YkkQ?328A?FEB@BE@BA899<=<8<79BBA=;<4747944/;f~|y~|}}zyslqstpmkqvyxzuyyxth`YEENVbmgilhqmcbdgkskiqllmmupppqustxq~~
+}y|~}
+
+|qqlpxxt}
+|
+|
+
+
+v~y
+~
+
+££¥ ¡ €£  98@D<<33
+"(.2;99A=A@BILHFBA?DDEH@EFDFDA?H@=A;;=5=58857;;7<<?E=;=<=@;A<9;A?=.,'"
+&&,
+
+',,*(2438?5??8;E?=E@A??;??4?957573070*..34285?<9@<@;;<543478<72.8//,983.0,/WSQMDDAAB@<=97==8;==?BHDNRMLMIA734;37*.,*..&!Yf`I424<?A?DAIEB?EDED=AB@=EA9EH@59500//555/4d|xzuukuuyyqtu}ykffhpmuvomfhb[WV[^YW_ofhkmopkoloffgkiptifckkxx|z~
+}vz
+z
+
+
+
+|
+~}t
+¡¡£¡€š §§ €€¥£ ¥ |9?LBA=70!(,*379?8@@77;89DBEAILFFE@E?DLFFIA=<<7BB<?==;<@<545042/75;AB?<?@A;95**%
+,+.
+
+#0/4<858<B?ABEBB;BBDA<<@7??;9774280398787;,/050;<45;==/58/73,37/00+,'/0(2..WUSMIIBDDA?8<8;<?FJLELIJIIJLNLB;4;974,/(*,*!!V`[J57;BJFBIEIHNMOHB=5=;=;==89982023*3745049fxuvsotyvxvxuxvg^UYhtxsxyxog`ccioomhcfdillkqsuqupstvusxvtpz
+
+
+~x}
+zzy~x
+yyy|y
+x
+~z  ¡¡§¥§¥§  š€95DEA?50
+
+'+2=<DB@FDD<9<<?@=EBHHDIEDDHHFH@EBDEEHBDA=B?<@?A?=9354==84=949.0,+'"#/40
+	
+&"'/2033;5?;?EFE@A@=AA@;@<FA?=83<;2037283+'//39;324;9/4980484.0032532+,*00.VYYROJAEJA?@;==BEDID=?BDIJLMJJIB;59??3/++3'!JVUE4/@DDEFDEFFFJOJ@;74<<<9@7;?9579/43747@;?d}|ssy|yyolottutgfdht|||vpoomkggkd\bffiikllgigggqovxx}~
+
+~y
+
+
+
+
+x~|}u
+
+ ¡  ££ €€š©¥©€  5<EED=9/
+
+
++&#&,3048AD@A@=5<<AB@?HBFBAFBAABBDBEDMHDB@A@@HBBBHB@A<E9<<542.,,+*#!
+.4.#
+
+
+
+(&'*'/3,*//8@9@AD=@=9A@BA?;9==99<8747<84<985.475754/940;=848=8;92/342703*,2SYVMIFFEH@A?8?=@;;A?<=EBIFMNHFA;8;2=A8(.4,4,"JVQF89?IBAB=EJD@?D<A<975;7?=?A?@;?427/0;=95A\puplpsqosuvmmvyyxyvmosuqqpttqmlgfkmk_Zhlgficbospx~y~
+
+~
+~|z}
+
+}z}y
+
+z ¡ ¡ ¡ £ £¥¡ ¡I;;?;33+!"
+
+%+,2..354=?A==A=?;?D?@DB?B?=A=8AAB@@ADDFFE?EBIFF??88==<;/47//&%&"*0+	
+	'*/02(/043075;79<=98BDEH@?DB?7A;;48=;2320.883389288727875988A;9@957;7275449^ZYWNNHMHH@???<?;5<=9=EINNNRSLE?A??@@500320%!HRNF?EEJEE?DEFE<DB9=;A==93?87;<=??7874*538=<[ytuyusy}}yxxx~zyz}xuzysqqopqsssqummlgfoiotty
+}yv~||}
+~~}|
+
+
+
+
+~~|
+
+
+
+€ ££€¡€€¥  ££f<43743//&!,,%'#%*'"&/..0,0,0/078;7<AAHE@=@@?FD=?=@@BABFE@E?<@A?=<77;;59=03/.,00+/#*90
+
+
+%.,.//2.222705<;<=;977;8?8;A@=?AA985/9597874/2/3420/224<998;<;?;;;7BDA==724^ZZVQMOIIH<A?;7488@A;<AJRQNSNNF88;8<@72022.,!<MI?7@DNFBD9DEJD944329=;<77444@AAB437342399=[vuqtyuxqmxxutuzv|z|xzxx}zxtvqspuolsyz|
+~
+vluxv}u|~|~}~y
+
+
+
+
+
+
+
+
+
+
+}
+}}}}z
+¡ ££€££ £¡€ ¡€€¬}745225770307=?<5@??<7002.,0045(/(*.//;;55;7=?EBDJA89;;=;589<=859?4978332044//+..2'
+*,,	
+
+'"*+00,///2<4735<=8855<2475?@B=AD<D727739545+.5/,//+039857;797?<758=9<<;@28_VSSJIHDE@<58389/3=@<;DJOOQMLHD;43234*%(*,*&4F<54<DJF@98==@932+,+479;@54/5DA;8;597574795[toutuyyyxup}yz|xvxz}
+ypqvuqq|~y}~
+~}
+smqy~}|}}
+}}x~
+
+
+
+z
+z~|||x
+s
+xx££ £¡  €€ |t<;883584/.*45=A=HNFORNLJHFDA;87930/,*/./*.//*0/+8;2/083353/3/,58;8222.(303+*/'+*'(!,,.
+	
+*/'+,03+0025442578285;/2253/49=;;5448@<8@?=72.4327,3734/.2577450440=;789A??YVWRLHIDBB87588748HE==EIOOMMVNB89875?4*(.0.
+3;=;9=DH?95;777'+.%%#,(/;50(,;5032/./+/52289_vvqvxxuyz~yzpuzyxy
+
+
+|sux|}z~|~v~
+~~
+y|~zz
+
+
+|~x~zy~
+|ty}
+
+}}|qdk
+¡¥£¡¡£¡€}¡§  €i703545434053//=DHBMORMFMLMMQQRJHJI==;7002*'+%,%%('+%"'*,//%'30,,887243,///.'/&(,!"#2/,
+
+(+/%.(2/,2/24979?7477<45=9444;;;95=92/584750/002755/,558344..3300,;3478/28<VQMFH?BDA;4,/0;3/4@=/2EFQMLMNHD527<8?<2&2995!,44372.95/(+0'&#%!&'*+%2=9,'&54,,./'+,/,/.,;dv}yxutlvvqhmqouyxiuz
+
+}vv||~y}
+|~yyu}zutuxy
+
+~}}xqz~
+
+~vptuu|
+
+~xxos}}}~xvxy£¥€§¥£€€¥     £ €¡  ¡¡4!"#'''
+!&/*/54<<BORQNMFFEIHEHLJMNFMEHLHB@A<7/,+*''%!,+(*
+&,!%&*2+#"&,.*,'+#%"%!,5/	
+	
+'./*,+,,*,/93299?;==<A@A@7=<72288887/3353/+.53*+8302+.0'020/.727/554,.*.333QJLED=?IB9402.42'08@/8BHIMMJHD<957==AA+*&0+,
+".3902+38<78<8200%'%!.0253/(7?33///,,2*..,29Sipqtspplqqlvtqsx~
+~yy~
+|zv~}~xy~zz~|zsqlpmqv}y}
+
+~y~
+}z~}}
+
+~
+zzvuyyvxx|~}}~|}}}|y
+ ¡¡  €  §€££  5/+,.+#	
+
+
+'25BDFJDFBBFEHHIIEFBAFDLMIHDHEDDBA983*'%#&(&'%!
+&"
+&
+"%%'!
++2+	
+
+,,.+&#+/+*282//2349<<=;??48?87?BAD3259=907;4+0//4<3<0//+0...&+,2+(.//*+,+0(UMEJF=?=?7+23335/5@<.@@@EJLD<02/02/350/.*453,<<8;<52,&(
+  &7=;99325./+'(&!*&*+Yqoqtslkmigfgs}uvutussphdozyyvptptvt~xpqstpy
+
+|
+
+
+
+
+
+
+
+
+
+
+
+
+~}}|~xy|ut|}
+
+
+
+~
+ ¥ €¡€€¡¡£8<3.0,''
+
+
+
+		
+#/+454459;BE?AHAEHDBDDB@FIBD=?BDB??387/.!!
+
+
+!*,*
+
+	
+
+
+*&*,(.....89953,875@/7259;;?9599;8=9887050/./++/0227.25'4,++0+(**..+!&(2((+LEBB8;3989/0.07;349<<9A@@<;7*+08<<839443/(*#
+ 	   	
+ 
+
+	(544,.&
+%#
+""&8dkpmhmhhhghcpvv}
+}y~}|z|xzzvmptslstuy~~~
+
+
+
+|togfgl|tosu||}}|x~
+ 
+¡¡¡€£§¥<;83;5++
+
+#'(/*(/*&%
+
+
+
+
+*/24<D@BB@EBB@AD?;?E=<D?<;<<5552<87/',%#!!'			
+	!,/(//0.(/*..4004.7/5877599;=<4345<88799;77800++/0,*(+(,'&.(**//'+'&2(0+./+(<;957?3?<2378/9845/3,%&
+	
+
+
+
+    
+ 	   		
+	+*7*&%#
+!0;JHflkpz}
+
+
+
+}
+
+~~zu||}xxz}
+}
+
+~~
+
+~
+
+
+}
+xlgpop}|qvxxz|~ ¡£ ¡ ¡¡ €9=9;=40/%
+
+%+72224589758550.(&#
+
+
+
+'2822<==??????<?;;9;9BAA?2/3./.*((('&(.%!
+
+,,('&!'*./#024.0//42/52,,//84;4;88=552480530/00+.393/2.(0/+'/02'000/(*.*.&((%#
+
+	
+
+  
+
+ 
+
+	
+ 		
+%!%%.%
+
+	
+
+0EO`ip~
+
+
+~|
+y}z|tsxmtsx||vx~~}t|uy~
+~~}z|vz
+
+
+zzt|ugqpqudkskkgmttdoz
+ ¡€€€¡¡  £   <A@@<;50#
+
+"'+2887;B=;988=9=;;7458542*(%!#
+
+	('0/5<<8849B=EA;?=4+''*&&#%&%('(%(&'*/*'&"%!&%#+%"+.00'.(&+4+.+23589880425342//+,0/,54*<53//3540+(**&*(,/,+*&
+
+
+	
+	 
+ 	
+
+
+!!+%
+&,34<HJD;8;;03<A@B@AENFALJIS_filqu~
+
+
+zpvsy|}y|q
+}u~xpp~z~zsxt|}}|z}y|
+|zzy~sxsomssqmkodixy|uuztxz|¡£ ¡ ~€€¡£¡ £ ¡£ ¡ €¡£¡£ ¥ ?A@EA855'"&'.29488;=9?<@@A<;89988<;7;<8<9435./'*!&
+
+!#&(2353444''(((&'''!'!
+	
+
+'%..'(4054803//,/,*%%"*+"!#(!%(!(+/../,430,00.+//+(+,'**23//.3322.%2+&!' 
+
+
+
+
+   
+ 
+
+
+
+""#(!&022&4@@E<@DEJLFAELOUZVJDHFJDHIOLFLLNR`_dhfhmlkmimo}
+
+
+|}}x~ztyv}~}|utlmx}~|~}~v|~
+|xvuuvvx~}
+xv|~x|stqydipquvuv|}|z}x~
+
+  ¡¡¡
+¡ªš  £¥€€ £¡ªBA?A?<;8*!(0447;<9<;9@AA=<9A;B<B=D9?=;??<;77974972003*3'*!#%
+
+
+%"#%%&#&,*
+	
+	%&++.75/??9=;<@=D<?A8933.0(**!
+
+#
+
+
+%
+
+"
+"!%&&""%*/'+("(/*2&2'((%/./,3.,,/,
+
+
+
+
+
+!
+&,../0<HBJEDA@;FMH=EIF;4ELNONORVNLIJHIIFJ7;AEBBENJRZ^\hifmsmooklplmlmt
+zz~|zzy|z~vxtqsx~}~|y~y}}}}y~|zz~zzsimzytsdmmuuss|zyvvvxy~zvy|}
+
+¡¡£€¡¡¡£€9@A=?EB5%
+
+*49;=@DEHEAHEDD?=??=?A=;=@<=<?BB?=8=<=5495<?39;83554,0++*"
+
+
+
+		!%*+*05<;9BAE=???<B<<334/(57/,/&'*&&&"
+"
+
+!
+#&#(&+4'**(&++/*/23,'.,,*03=E435<7;23+089??AIHMOSYSNRNONYUQHDA=99AQMLMQSJRJUYQLLHMRFLUWYccfhkmhhkbhlllooihopolv
+
+}zstlVby}}~z~
+~|
+
+|z||vvv~|||zy~y~}yypovzv|
+}|usvsqu|zyu~~   ~  ¡€¡££ ?J?@DA@5'&009A=<=8AAIOLOFJA??9?9;@<87<?ABAD=;98?;99D89;8;97859775274'+,*#"
+	
+%	
+
+
+!%&08848<@?3=590//0.22/.,0,230/73330,*&"
+
+
+
+%"&"&
+#&%!%#*&#'"/#FJJQNHHJSOQMD?22*5=DDEFENMQJUVS^\_RQOBHHDADOOOLORYYY\ZYV[`chgmmggkhoomhhhggkkfhmqomihmv}
+
+}xtx|u~
+~~}|~z}x~vutx}~}y|~}~z|~}~zy|}||~
+~~}z~|zvu||~xpihqx~
+
+£ §§ ¡   8?EBJEA9+,05;847575=A?EAFIFJFHFEEF@DA@?@9AFEHB==A@<<8A8??8A@@78;7353533,&&!&"+3((
+
+
+	#"+(+(*,/'*(,5**.('04**0./5+0./73/./*(*%!!%
+""
+!!%MJILROQOOSQA=;777;HJJFEHB?<BQWZY[[VIIILJNLSOOURW`b_bikgllkklmmphkolikccg`[_fhgglommmks
+z|}viux~}~~v}}~}vqlqtuspquyuy}zpfhs|yy~zxx}
+
+~}
+}}~~||yyokvy||}zxxmkqtyv}}~
+
+
+
+|
+
+ ¡££¡¥¡¡ ¡ <?ABDAA7+
+*.5<9;E8<@549=DAE?BFLMHJEB@EFDJ?DEBHDEA=@<?=A;=IHALFDDA==75<4852.+(##73/
+
+#272/,//,.&*!
+
+	
+'%"/+/42**/,022/,4,./(2,0.'+,(*""%
+
+
+MMLHQORLOMHDA=<@=<D@HIJF?;AMSWU[_[YSSOIJ[^`\d`ZbhdhfhhhfhikikidkikhhfccYbddkihigc^cihp~usyyx}z|
+y}|~}uqqqkpphm|}~|}xx|oZs|}
+z|||z}tvxvsutpvyv~~zxttoy
+
+£€€ €š§¥ €¡ 4;?DHEA4+
+
+.%024==<D@?53?=@8;@EHNLLLFFABFBINMNJDIEEBDEBBLDEFBDI@D?HF?89/320+,&&
+%/8,	
+
+"/,0;3754<5038483/(*"
+%&+!',,.9/.4/50(*(,(((!"(*+,/*&*."*"#HIJQJVNLOMDLHDA=8<DFIDHNA;DQSQW^bdf``c\`ckfgidilmhgkmfdhfmkmiklk^\\^UV\V_d\cb`[\^bmqov
+
+|tp}~
+
+|zv}y~uz~
+z~z~y
+
+
+
+
+~
+
+
+~}~zumppqusxuuqttxuptxtmiksuz  ££¡¥£  €€7?EEFD90'%#&.889;5<?F@BEEEEB=<?@@=BJJJDHBIQHFNMMNHEHIEIEHFFA@ED@;855573222+%*%"(93+
+	
+	++//558=9;7;48955743,2.(&+***'!
+
+
+
+"%&#!'%.(+,+20/(%+4+(&//,(0++NHJHFF==?@A?HIDI@BIRA=FLNUY\\Z\cgmmkifciklomhghmmkkskikkkkifgkog`^_`YV_`chfic^ktyuuvx
+
+
+y~|xztvz
+~~z
+
+z~x|}~xv}
+~~}yxxxzyvulotxtqmsvmihtuxplmx~~ £€¡¡¡¡  ¡€¥¡€¡=AEDJI<5(#%+732889?@A?H@B?FEHABBBBD?ABAEDBEFFOQJJHILMOJHA999??D=;;827(/223'""
+%2+'	
+
+	!'/3/0+,087;757;;=<<;?5280//(*&!/,.3+*/%*&'!
+!
+
+
+
+"'(%#'&(&&",,.*&#JLH?8@<@EFHBB?JLENSSUOSSVUZ^bfhkc^^dgffilkkkbgdklffkkkhmpmogiib_fdckmld_klhilpltzzxz
+
+~
+
+|phz
+}}ts}ppmkz~
+}z
+
+y|~|~||sp|xxytsst|yutvoitqv|x~~vvv~
+~ ¡€€€¡£¡¥¥€  ¡  ¡€  5BJJEI=5*
+*(20,479B=<@BFJIHIMJE@=?B@=9?=?BA=BMIJLNIHNLE9/8?@AB@A89;479375+20&#
+'02+
+
+
+&**.2.5/3/3535;;92;;;;3732,(22.754022/,//'.&2,('(&#&!%!(!A=5<=EIEJQOLORVZ\[c`_d_b_khfcbbd^YYbcfgfdcch`fbgid`cghilkb_`cd`_dd_\bdhdchkcdkkkps|
+}x
+}liqqooiq
+
+u|lm|
+
+
+
+}}}|~z}|squyusxyyvvsvx}y}xqovxz}}~~  ¡  ¡¡€£  £¡£  ¡€4FIHFH93&
+
+(34.559;@9B<=ADHDILIIIEBAJEA?<7<BFDF@EDIJIIFIE8377=@<8773885<47.''###
+(*+
+
+
+'3+,/.2+.04;;9977<;;=93024.4035779;584/3./+,4/24(,,%*"*,!(*,((
+
+			LNNQU^^\ZZ[bc_`Zc_cdfgbddhdfd_^^hdfc^cbbkpidc`_ccghc^[\_^_^Y[c_WSVNDO\llohglmpmp~~
+}
+
+
+~zzy}
+
+||~xv~|yvxyzxmdgivpsqx|utzxyz~~|||
+
+
+
+
+
+£ €£¡§¡¡€¡ £9DIIDB;5,
+++87<<?B?;5<?E?DDDDFLNHJJDIFA<@?79;<B?@7=B=@IMB8939=D874<832232030&&"#.,(
+
+
+&352.+97/489?;@?<<9@A9?;;;;;47375478905//478<878<78,,',/.+/+.(*/,///#
+&![^b\V\Y_Z`\^bcddbcgdgh[`fhidd`c_c\_[Zbfcfiffcdghd_bhf\ciccb\W\\\_d^ckhcdkmpstlkly
+}~
+
+
+
+}~~|}~z|~xspvmkifoocitmsutyxv|
+}z||~||z|px~
+~
+
+z~
+
+
+}
+ ¡§ª©¥š€££€  ¡€ ¥7BMNOD;/&*.223;@<@?FBFIBEDEEIJBBIDBFD@<@HF=;;=9BD=DABBIJB?9;9@<8<<9@<83924.%%""/,"
+
+	&//52.05332/42<?;;8=4;;<?B@@9<77333?72354/55/52354700.,'%*./(&,.34.35/+,',++\[Z\__VYW`Wcbifc^_^`fd`_dhdgdd^`cbcf_bhikmidcicb[\cchbcb`c_`ddfcfhhlgkhgh^c^^kis
+|
+
+
+}
+
+~}|z~~ysqpmifhomqm_opshku}x}yvx}zxx|
+yv~ot
+€©€£€ ¥¥¡  ¡¡ £4HHNL@73+
+*0*0;;@ADENMFHDA?D=EFIEJEAIJD;?AFH?=@A=?=H=<=DBJHA<<758480975/45.+(%
+&.4'
+
+
+
+',,0593.23788<797347772/3?;59325277305;5382,3.4/8587/4.0235,22,2.0,20/3/,.,(YVUWSQSc^b__b__`b_\cdcccfghgc_dcffcc\bcfdg_`dd_\^_d`cdbZ\Y^ZV__`b[`kdfggi_cfiotpsu}}yy
+
+
+|
+
+|
+
+
+~z}}~}|stqqlsxxuvpovhhsmquyyvvv|ysppsv|v}
+££¡€££ ¡ ¡3@FJHA53%(.38<9<<BALFHHBBIIDINLIH<<FFDBE=FF?=I@<B<8<72=8FNHAE?;?75944(///+./'
+
+"9?#
+
+
+#3*5;5883255=4495435;2/+22522/395893735093/022/898420043,,3,/224*+,24+2022*&WYSYY^^Y_^UY[W[Z__`fd`^bdg_d_ZZb^d\^_bffdc___b___\YW\[[ZYVUYYSU\difddb`c`^Y^Zlomptxup|
+}~~~~
+u}|~yx~|vxomcd`oquvxyvsvxtz|yihilx|vxopmpfkltmpyz
+
+ ¡€€  €£¡¡€ ¥€3DJLIB<3&
+%(4;B9<<8?EEIJDAHNILMVNB@DIHEBEHFIFDDAD8@<;@8<@BD?<D@7=8592++/4+(*+*!*8;"
+
+#87,85<577;987.228234223/009422223<45.309482/077423220+*7+.++/0,(+.((+/,30(/QUSV^WRNQUW\[[WZ^ZZ\[\ZY\ccb`^cb_b_b``dgdcb__[\W[\_^`bfchkhhfhppqqppmhio`Z[bZZ`ilksy}~
+}
+
+
+~
+~z|}~
+z}zxu~voosquvvtvsmqvuttyxpqoqmppskfhmlmmly
+  ¡£¡££¥¡¡§¥ €
+¡€£ 
+ £š
+5EMMF;54*#'+.94@B?;BEBIJB@BHFHMOLLIJABHFADBDABHA@=A=5D?9<<;<@@@<99E?=3.2..&+&'!*9?'
+
+%(0039579;9,3;45.33438884<977557838770224..8,.,+3+,++,,,3/4*42*2,/3+%'.55,,5V\\^[YSRRWUYZ[Z[\`^`cYZ`bc``_cf\^`````cccf_[_ghb`_ddhlposxxz}zz|vxsgmqmpovsogbggfhoy}~~
+}~|~}z}so
+
+uyvxzvpiqoqsqqttsyxyvuyppio}~zqpficW`pix~    
+
+§¥£¡££ £€¡3ALLF=75+((&799743B?FOOFAAEFHFBILLNMLLD?@DLE8<AE<9<BA77=<88<;;<=9=;34723,((('<0#		
+	%&&43,349;=848=<;;/32758;;=594735377743700,,02.,.&'2,0+/30+.+.&/*..'+22;85/,UUY^^[[\^^ZZVSVYUYU_\[^[Ybiklsph^`^`fkppppmsttmptsyuqssusqsy||
+|qsvtqzvoyvytmtouxu}
+}
+}qq}~xyyshmfkob^lzz|||y~|tms~|}y|yvvofi_biqv~~v~~}
+|}v|
+¡€ ¡ ¥¥¡
+¥£¡¡¡š¡3@HLI@?/&
+0*'0272979977@DBFFIFDIMJD=FJMNNNI<=EB;<<=89<=;95;8444;;33;348494/+&*;9#		
+*/2/325.3997448;<9;?A97987=4<53457/29532/403/343200(.+4+0/*/.0'(,3;05845.///UUYWVV[[\_YZ_[c\^WW[[^Zil|yyxxsvsoqxx|zzxsouxuvyyvzvvy|~ztzsptvx}ppy~|xy~~x~|z
+
+
+~yusk
+~|tx~}vmoqlh^Ybozzy|vo|~|uszzuv~~u|x|uxyvuuqsqzy
+
+|~}~
+ €£  
+¡§ ¥ 4JLQHB<4'&/7555<?;49?57=7A<EA@<DE@??ADHHFNEDJE?A==@<=AA54880703037452/<2/+0(!'70
+	(,0833327A<@==;@@B=;;<788@8299440707023....0.24,53./,32/0.,04,+./7B@?843+*3/VWZVUU\VR^VUYUWZcd`iqqxtv|}||usvzxxvtuttmkpsuvux|yuy}zz~vstuoopsmvyzy
+
+}|zu|
+|~|z
+~x|}z~zyqifbcccp}~}}~}}|z~~}|z|xqsxv|zxyz
+
+¡  
+
+ £ ¡€¡
+0ELJEA77+"*32723;AB?=9=<=<=9?;?8@A?3AAD@?<@EILFJHIA<;8<54892+082/2404324/2***'/4/!
+
+&.,,(,3/353595=?@??@;;9<8=;8<<;7/00582//0+/0./24,3037594273427897<9;9;42230ZUUUW[RWYVVNRV[cqsssvyxsqvyyvxvtpvyxvvtlc_dmopt|z||zz~~
+xx
+
+
+
+|~
+x~|}|~zux
+
+
+
+}
+
+xy|vvquuxy|}~|}z~xzzv}zyux}~}yvtvz~£¥¡€¡  ¡¡£ }5@NJI?890
+,34?@;=8A;=?=AEDIB7AA@EB=<<??<A=AADE?DDDFEB@A;7;<707752200/0+(.+*"&'%57!
+
+
+
+0..+/057503438589;99?77887;899;;;<5<;9884074244245724487/2547<;3450;;58374*RUQQZZ_[_\Y[bmmpqqvstxuqlmxxyutyzuvtux|vtpv|tstzz}yy}x}|xzy
+~
+}||}|~~~~}~~~
+
+~||~~|x|z}x}z~~v~|}xz~
+
+y~¡£€¡ š¥š£  
+~3HUOI@97'
+,/0;9LLE=ABHE<A5=<<;AB;<9?BAA<A=A?A@9?@=;D?FBAB?=4547<8944;.*.+((,"
++74!
+'0/0*33/23+20=<=8;7;;?=;=;<9<59A8?99;@4;;;?74=<=80<9@;75340032323,055=;55458HUUVZSVZ_ghkppqposuqvvssouy|}|vzuvxquvxyxx}xqhqtu}~z
+}}
+~}~~z~
+
+}~z|z|~zyy|xtyy}|ux
+
+
+
+||v~xuy}~|}~~v|z}x
+|u}} €£€§¥€¥€¥©§€€ s~y4ELMFD=8*'79<<<AB@?LIDFEAA<7?=@;=9=@?<<97;<DA=EDA==A;?@AEDD=57;50748/37/,(
+!+2*&
+	&',30,+3224/44445;7@;32<5;@3//.577/;08;<3?;,35792/7/.0722272+,4444227974/57,RNVYZcokhmszvqpsvvplltyuptsyzy||zusv|xstvyvpuxxxzx}||~xz~yyz}}|xvq|x~|zzztt}xzxtttx}z
+
+}}~~
+~}
+|
+
+
+~}z|~~}|}~}stvxt~ytzz
+
+
+£  £¡€¡¡¡|0EENHD=;(%*2038ABEA=AFIHFHB=?@?@=?DD=A??<=9<?===IBEDA<9=?;<?B?E<9<484/4404*%&!%(2
+
+
+
+&*202.04257458988<;=9095;<=20.4808;70249203570.287874404.2(,;/20.*..04/3.24.Y^__fmxttssttsxuoqifhmqplkoxv|vyyusx|}xxv}zzz}z~~}z~~zu|zy}|~~~zyztxyvqqliiolmxtuuu|
+}
+~v}yytyxtvz|zvz~}
+~y¡š¡¡ ¡¡|
+v3HQVMM<;*
+
+",587<9??@A@BB@@ABADF?A;9@E@8==999=;82875@B<9==B;B@A39<EFH?=/047/+*(
+*(
+
+
+
+#2/,3085322772;49<<<;38;877497@43/0;448904379;;40402.2,4/0,+/,&+,*2&*/2*,.4(^dqvqxsqqpqpqllhklmlhlkpigmvvusuuxvtvxxz~~~~}
+vyyvsmtlldtvzyxyyvvxulkbdut~}}}x|z
+~
+
+
+
+
+
+
+z|z||}|pqupzvz
+|~¡¡€ ¥
+¡z
+
+m8FMMDEA?,
+#/055=;<?@BE@E@A<AA?ADE?@FE@=A77<9954<;?;5;<7949AFDB@@=BDDI;799?42+%#%*,	
+*./42**38457337344=7;95;B9528,34/2/20074200447950285730/047/4'/.,03&2/0(/23,kksssupqooliiioquuoootvpoptusuyuotttqxsy
+
+}~ysyux}z~~}ypqqlmsz|~}yuysbddbovpsz}}|x~
+
+||
+xsv}xspzvxz
+v}y
+vs£¡
+€¥¡¡ x7INQDDB7/#'',4574?BDFEIA=8=8=DBHBEBA@@8??9;95;<=AB<2954<=7===99=BA@@@=99=;2.%%
+%(*!
+
+
+
+
+*42805;3;<;7085547@9705344554/42(//774(30,34,223443/0/7.02.;/,/4/.24,5735583supqoosoquqppvxvz|uuplqssstutvxtqpqvvxs}~~~}~
+~x}}|~}~yxv|~
+~~}sx|vtigky}x
+
+
+
+
+
+
+
+
+
+
+tovyt|
+}zyst}}| 
+¡q3JIFD@@8*
+*+8;4754;;EFE;=@?D@DFA@FA?E?=D@;AB??9@=<555;7=888578;98;;5;@953;3/%#!'&+*/39594489=<?<B;9;@AB@==B;5485572/(0+&/*'+2.,0/+3(2370+(2,835.45494.40/52229tsqqquutsqloosqtqttostttvsxpmtvstttvz}xy~~v}
+}zxz~}|
+~~xqkmpy|xmikoszxu}
+~xx
+~|
+~}
+|}y~v~}~   ¡ ¡ 
+
+s/NONJ@A8,#08@<7;7<=@<DDEEE?FDEJDFD@<=BABEAA?==@B==78<99?E7<7=?5588895?4/+//,(%
+++&
+
+
+
+&,325*40238=D<@9===F=<AAE49<A53979//5/*,/723+*/4+0//0'*/'0//,*0,,(020/04,,03ktqhlompocdhqxxxtummyqqyzxvtovqoumuuxz~~~yy~~}z}~|z~~|ussolsmsxxzyxtxplfoxz|
+~|
+}xz
+~
+
+
+
+
+tzy}
+
+|x~}t
+¡   v0EFJDA@9(
+/2A<=AFEDE@FJEEBE?DJJIABAHBD@AIEHAA=AD79DD9<9;@<;@;;;.547405238+++(&*.'
+
+%*.52230438989<98@A<;7;9?<??<<7@<<<=99@<9=<=45;89.0/50,000,+0/.0/(345=4(0/48tsvsqqqqppvspmqxtyvssvuvopssstqtuxvysv~}zvuz~xvttvy}}}~ztiplhlkpqx}
+zxuxv~
+
+}}x
+
+z~
+
+}z~|
+
+
+¡¥ €¡ ££ os0JMEI==3(!+2;?@=BFIDMHMLDFFABH@EB??BFEABNLLB??DEA<AD;8;B@<=<7<9;5/7530,,52.+#'3/+!!+32534///985847<8;=98@37999<<<=92;99<<B;;9?H?9AA@99<34354/85./0(0.43/0/.0.3ysusmsxvstuyvsqvtyqqy|slmkqtu}vyy}}~|~z~~zuly~}yvmqz~}zzzgcqmldgtzy
+y|
+
+
+~~}}||y
+
+
+
+~
+|}~
+~
+
+  ¡
+}y} }
+o,EEFJA=7'
+.278;AH@DBMIJNJLEFHIFBFAAIEEBIHED=B?DDAA@??@B@@9<9;?E974952./0++0&#
+(+'
+
+
+
+*50,++/(//205402430535=;2<73<=?<999<;84<7<0;@8779989??887899937/3303/4/332.2uptytxuoooosutttqutqvuqpmpotvzxzxxyz}|}}u|yzz~~}||u~xuu~uotvttu~vtuz~x
+
+}}}zz
+~~
+
+
+
+}z~~|~}x~ztu}yq}
+
+££
+
+}}
+
+z|uzyq(ABEB=<=&+/3;A@;=?=AAFFFLMNNJLIMFFEFD?A?9;=AHHDEFHDFAFD?B@B=@?<;893408/0.('#*2/!
+
+&0+/2++2&.4203/8475992575;7787754;49=9995,2492572/24=47500*783,4;/0.7482523+ttvsqvpplksqoibhhmlikoqzvzxzz|xvyx|yy|zvdltuz~|zzzxy}|xx}y|ysuyz}zz
+
+
+
+}}yt|z
+
+}uz|
+}
+uqvtyztx} ~x*==D@8?4'
+"(+2<9487@A?BEAIJNLIFOJIJFEB;BB<=??AF@B@B?HIIHEDE@EEA<5743753.30++"",+*"	'0,&40702223355300/3/3355;88943744772@/2534+70057844,+223,/=09.2/408/3,30.0/ptusvvvmmstqihpopvuooqpsyyzzzytsx}sz~}y~~}|z
+|slvuqmx}xpquxssx||}
+yxzxszzy
+
+
+
+}
+
+
+~z
+z
+
+|xt|¡¡¡¡}o,<8<A<8.
+#+,.94487;=DE??;8A@DADMFLLFMFLJDHA==?@A9;4AAA@;EFBDIF<8040//(,,0'"""(.2!
+
+
+0,24350/*,03*0249878595048993970.7;7744843320./4204352222342.,8457347*+04735tspkqvqtmopslmtottqooxttz}~z|~}x~}~~~|}ty||zytssqsquyvz|}}|z|vty}
+~|v}}zz|lz~
+~
+
+yxzytx
+
+
+
+
+~h*99;?=7+
+!(,2434378@?=?D7DB@BBFEAE@MHEHNJLFBD=8<985;5<@;8<=EL@B;8584('/+*%%
+#,.0
+&2237;82302805<77;;425?4788777999;98443009977,473238?473,/,/2340425/25/(0.=8lklqssqtsttuohimlghglsxv|}
+
+~|~
+y~zpusyvtpxzzyqu~psx||xqx}~
+y
+}}||tv
+~~|
+
+ }
+l%845?=3+%*,//.50228?5384?A@???=;?@F<HELIIMNE?A@<B?A9<9;8@B?<AAA@;82(/*(#&&
+%&("
+
+
+
+
+%0424<8;=8757?775=@;99574<<255=54954?7587432405.+54447395.*05200/4/40/(,5/0/Zbiooqsqhhfgihmikgdhkmu}
+~~~}}z|}||quslhcsuvyyy
+~~|
+xy~~}zxzz}
+
+}
+|~zxlx}
+
+}y}
+
+v,0478<30
+%*%,.+0/3,25.290589;;7@@F<;7E?B<@IEJHELHFDJ?DA=@HD=54;<88<95/+&+"%#+*
+
+
+
+
+#*0'/3/05550588497;53=344884948583+0783035.5;<9588932*2/,/,30/.,.0,4,035030.cb^dZ^[SWW[[f_gkipkkmkpx|}~|~|~|z|~ytuoqukddglstuy|yy|~
+x~x
+|}}|}z
+y|~
+~zx
+
+}~
+~|~~~x~v
+
+
+v48<377/.!
+"&',(/.,/770242079273889432999=@EBEEHEJFIJJ@JAEE9@5/4/080.22/3/+%!+2/
+
+(00,'(&/.53,0.248570577445/33350(/*2.25334?2354238539,5</333/3(70003/3(0'30dgdfc^VS\b`dfkkkkh`dkllilv}yyy~~x}}vkoslsomohkfqpmpsvyyvyxv
+
+
+|}}}zszxu}}|}zy}z|v|
+
+~
+
+
+||}~|
+
+
+¡D7+*39.,***!+##!
+'&%+*.0,/+*,2223328724.8;242995;7;??=AA@AADAA??@422,5/+('+2++,!25/
+!%(0..+*002//,+0433804//407445872/3/,32.,225,454+0<302325770703257,/430,02/(.dliiggckpphgsquyuqfkqttpdcmmkiux}}}|xxxoptqhiddltvpcivloy
+}|
+}vuz|q|~z
+|y
+}sxtx
+ 
+xy~zy|uy~hg
+
+£€£9/'*#/0'+'(#24957=4/2'%&*"',/**0,.,7*/,52,4.744/42/0/29;57<<=9<=<?9784/('((#&#"""#!//*
+!((+,444554.+23/.*/../,+.*0../05,*.,..33'04/+3,,0.,033.444/43/5.0275332/0/(45fikligfpmuuttuuuuvoqpptsmppdmghdiopttvstsuuvqxz|}ysvy}zz||
+
+
+
+
+}
+
+
+|}|~ 
+zys}
+|z
+zmvhst
+¡¡ 
+
+}E0%*(,*+%(!%"#8/5=88@?9?4=50//*(##(+*,/0+.820(/,04.///42/20782205=@43552400'#!!&!
+20*
+	
+	!'*&+*0,3=9/0..+//3+2,,0+,,+,2.,7.&+..,*&.23./232,422287/(*3205805930/0099<02pomppmpsv}vtuxy}vtosslqu}|tsyxlffpxvtxsqvz}|}|}u}
+
+
+~
+
+
+
+~}
+~
+
+
+
+okttq
+
+
+~
+z~l}~}
+£ ¡¥£qR"&*%!"
+%**,/08348=AE@;D?;@=;82.,/.#"'(%#*&,,..23'03,4239.,/47042&+3/...%#&!
+05((
+
+!&,++,04.342577.283;9/5/883/2./((,'//.+&'/24++.0285/837<88424925/3035/8093720dkhpsyzzvz}zy~
+~yzzzz~zvyyvxquyppmitv||}}}ypu}
+
+
+
+z~
+~utzyxx
+
+
+
+
+|}|
+x~v||¡~ q7.&#
+
+
+
+#"&288,2/23=<9===<;=5=;=<<A752,*((*&(+%%,,.0+*''*,,/.*+.**(&+,(*#!%%37'!
+
+!+&#**,/4949785/3804545404440&+',&*/0,//3303/.,+4(0,3245857+/44+.<750.32*/,,2`cloposv|z
+}~~~~}vyy~}||~~
+
+
+
+
+~}
+
+||
+yqpy~
+
+
+|
+
+
+
+z
+
+}v
+
+
+¥¡ pQOJMBB952""_om_SAA@9874747752473/77=B@??AA833(2&/*++%!#((&(&(%%&&&'*&&&#
+"22+
+
+%!*.*.,22+42,/07=;8;040*.,,2.20254473953,0/+.5,,*+,/+.((2*0'%,*'#+..0,/.7400lptszxovzz}~~uxz}zzvz
+
+
+
+
+
+
+
+
+
+
+~
+
+}}
+~|
+}
+
+}|~|~~t}~  §  q[VY^^_[WWR=%
+
+&~}}t_[UA?A?<;373284/4888737@@<A<5;550/+(*''!&%*"
+#!%#
+
+#32%
+
+&#!&+(+/.&'420,;23;07*2/238?525433/37202**&*+!((*&'*%#*.(!""*,'&*!(+%+'.(*(,tqxtxyyxu|z~~~}|zuz~y~z|
+
+
+~}
+
+uy|v
+~z||~~|y~~y
+}zzu~~|
+v~|} iL4,/3?EIQO\S#+
+uvscYUND9@=982745.4934588<<9??@=<9<952%*+"%%(!"""(*
+
+
+*(/0+.**(',,//,,0454,,30/34..0.48=/25(20**,25.,,/2*%/%(#&%####,*#""!+'##,*#yyttuux|z~|~
+
+}z~
+
+|~|}
+
+~
+~}zz~~|x|z}|upq~y
+
+
+zM<74/+4,'*+03!.d¡£¡}~slc_YOEA?,543,25334./55;@@=9=@<?755<24779/(79.'
+
+((*+.+/2537,*',,5/(,,/+'./2.,,0+*43,/++34.(+..//.'+('+%,','*%+*'&0*!%#%+'"!('zyvsuvtt}xux~~|
+}}~|
+}~~
+
+}zp|
+}~y}}}qm
+
+zyxy|zquv||vqsx¡xstvyJIEH?@D;8875/&
+*(Z~|~
+
+xF=BB88*04@93037545<A<=8==B@039;A@DJF84#%&0;954332,4<0334*/8/+.,&(+&(*&+32,*,+30*.,,,*&**2*20/(*%2.(/++..35/,,(&'*',+(+||xuuvyx||y|||~x~|~}z~}}
+
+|~
+|vx~|~~}vy
+
+
+
+
+sy~
+}}
+zzp}~qxt~~}~yx}z ¡£ ~
+
+
+¡ 
+b@?F@DAA<79;8/%'.u`VV[[N
+7bxicYSWND=?=8737;05422..'./43+(
+%#'.004<983345434292//(/""(('"&/,''/,*/'.%2&%(,,,#/+2.3(/,02.*0+/24///3'/**(4+||}xttuy|yxz~ytxzz~}|x}~zy~|}vxxux|}~
+
+
+
+
+~
+~
+vz|~}  €¡§£
+¡x¥ L#%%.3.939+&%?}~lZ``^S4v|tibVLE75700230*,.2*/'"
++#0'+202588;847855.2(&&+'&&+2/(/%,&'"&&&('',,*'+&%,(,!"'3/,,+.090738,4040xuyzxssmqt~}z~}x}}yz~}vzzzv~~xppzy}
+~|uxtvtxxy
+
+
+
+
+
+~
+
+
+
+~zvtoz
+
+
+¡§¡£€£¡ €¡
+
+
+
+t3"
+
+#,^hY_igR8¡¡}pfc`ZJ@;9428/(/E87(%**'.&!%(*&/2522/3399;;;=859.((&%(*#%,!''(+''#%%&/(''0,&*.2,(!02/2,,.3054804/2xvzxuvyxptxy|x|
+|}y~zupvqsxxtusv}}
+zzxxyyyzzz~
+
+
+
+
+
+|}|||z
+
+¡§£€¡¥ €  ¡¡£€¡¡£££}vqoy;47042+#
+'(h€k``diW4
+ ¡¡¡¡vhgfY`SM^z~~zmc_WFB772+*"&%*/50793849=;;@?/89=888<3*++*..(%*,+5/+,++%*'&&(*,0,'*/,.*0,.9/2toszz~~~||~x||uvtuv|z~y}|}~~yuqqtuqvqzz|yt}zvv}
+
+}
+}
+
+
+z}
+
+|y}v}¡
+
+}~    š§£ £ £š€¡¥¥
+£¡£¡¡ ¡€ ££šª¥
+O;534.2*'+&.+4p¡|m^ddkQ"9
+¡
+s~ltvgf^RJHH<70.0/.347579887=;8;58;<<;99?E720..+%.**/'&+**+#.0(*''%#0.,52.3hbfsyx}y|}
+}
+|zxvyv}zu~y|zz|
+~|~~uuxsttuzvuz
+}zyus~|zz 
+¡š£¡š¡¡¥€§¡¡§¡¡€¥¡ 
+  £§€¡¡¡§¡ ¡¡£ ª¡¡€£¡€¥š¥£€£¥£€£¥£  ¡¡hBB?955;02'00E
+vcghm\"@
+u~
+
+zm
+xtof^SMME=742322505242795<3=9;875=7=;?4542/.*.+*'+0(/7*43323/248ppuyxv||zutu~
+~
+}|z}y}|~zzutyvoz~}
+
+xu|
+
+£§  ££ £©ª¡š š¥ €§ ¡¡¡§¥ £š¥€€š££¥£©§§£¡ £§®š£¡§ª€¡§šªš§ª€¡ ¥ ££ ©€¡€¡§§¥§£¡¥®¬£t@?==5<;=/!&2L¡¥ yckhlV"E€§¡£
+~
+xvl_\OJE@=38;;?884;=8@=?<<4?=;?57@883740.+*,3*,44;00+53~yv}zxtt}}
+yx}
+
+~~~
+
+
+
+~|vuv
+
+
+¡©¡  ¥§  ¡¡¥š§¬¥¥§£©š ¥£¡€¥ ¥££ §­§§š€š€¡€¥£££ §£ §£ €¬°Ž©€ §š¥€¡ ©©²š©©ªš§¥ ¡£§§£€¥ªŽš£zEHB@<BAB2
++2Q€}dkohU%H
+ £€
+
+~
+}imkig_VMND?97?8/87949;??;B<;878@47;=?9878/42254~~|}zx}
+
+
+
+|~}
+ €©©€¡  §€¡£¥¡£ ¡ª©š£¡¥¥ €£¡€€m£¡¥§£€š¥¬¥¥ª©§§¥šš©¥š¬±°§££š€©§€­š§¥§§¥©§€¬¬£€€JRHAFLNH2#59b£š¥mkmmU*M££¡
+
+}lfh^RHDA?AAJ;<8<@A=<;?9<B<=;ADFDB?A=<~~
+|}}€¡ £¡   £€¡ £¡£ ¡~|€£    ¡¥¥¡ ¡€¥£€¡¥ª­ª°©§¡ €€©¡£¡£©§¥€££©š­š¥¬¬£§®¥¥£ š­°€£€§©¡§­¶¶ª­ªª§°·µ·®¬¶Ž²°­±°š ¡¬°®¥¬­­š©©§§¥ª°š§¡§§š®š¬Ž±QMONOS[O7#5;k¥©£¡€€~vtuqV,Z¡¡£€€
+
+
+~zsphf``_S=9;?H;B?A@59BA<<DDD@D
+}~z}z
+¡  ¡££¡£¡£¥£ €£¡¡ ¡£|~ ££ ¡§§ €£€š€§ §š¡¥§¡€€­­ª­­¬¬¬¬®ª¡£°±© §©©ª®¥¬°ª©š€¬§¥®®¬±­š€§¬©€§š©©€€š ¡£€ ¥©§©¥§­°­±ª­®­Ž°Ž°ªš¬ªªªš£§²Ÿµµ¹¹¶ºŽŽŽ±¥©Ž¥€ §§²²±¬ª¬©¬­¬®¬ª¥šª¬¬°­µª¥©®¶ŽWHLUS[`W<&9Du¡  ~xqusU5` ¥£ ©ª¡€€€¥¡~
+
+
+¡~~zlBE?=?DMIHFFBDE?B@DDA
+~~¡ £€€¥©¥ª¥£ ¥£ ¥€¥š€¥¡¥€ª¥£¥§§ª¡¡£€ £¡©š£ ¥š©§¡š¡¡¡š£¡£ ¥šš­¬¡£¡¡€§ ­±©¡ §£§š£¡¥š©š¡£§š¥šš€¡€©®¬­±§§š¥¥¥© € §£ ¥€¬±©®¶·±§£§€¡£©€±Ž°µ°©§¬°­ª­±¶¶Ž®²²¬¡€­ªš¬®¥­·µ¶±¬²»œ¹º²°±Ž²¶Ž®¬°¬©§­°©®€§®ª­ŽŽ±­®¬©­­±­§§šš£¬¬°§\SONS_^Z5/HJ¡€§£¡ ¡§©€¡  §¡€osxuQ8f§§£€ §©­¥¥¥±¬ª¬§¥š©¥¥€§€ ¡ ¡££ § €~¡  ¡N@<74;JzshbMFHB@AFDL £ ¡¡ £££¥¡££  ¡§£¡¥€¡§£ ¡££¡¥©¥§šª©ª©¥§£¥§£¡¡€¥£¡¬®±±°š®©¬¥¡€š¥§¡€£¡š¥š°¬¥€§¡¥¥©£¥¥€¡ š©§€š¥¥¬¡¥©¬§¡¡§®€š­¥€¡ªŽ¬š¥¬¬£©¥§§ªª®°±±¬¬®±¬££ª®ª©š¥²²²Ž±°¬©©š£€©¥š¥°µµ¿º¹¶°®°±®·º·Ž±±±°¹¹µµ¶¹ºŽµ·°±Ž·Ÿ·œº²µ·º±§£šª©°®°·Ã¹±º²¹·¹·Ž·­±®µµ¬±°¬§¡š®Ž®£ª±·ÁÄ»ºœ»¹¹¹ŽµŽ±ºœ¹°bZZZZbfZ8,HM¶²Ž±±²®ª¡©£££©pus|V<d© §€®¶Ž­­©±§©®©®š¥§¬®°­€¡§ £§ª€€€š ¥š¡ \FA;95OgYAF?AFQl ¡¡£§ ¡¡š§§š¬€€ £¡¥€ ¥£¡¥§£¡ ¥§£š£§¥š£¡£¥¡ §¥¡§¡¡¡¡¡§  ©ªš§§¡¡    £š§§ª°°­¬©©¬ªš¥§§£¥©ªª­£­®š¬¬±¬§©©€©¡©¥€§§¥¬±§€ªš®ª§®©£®µ²­®€€§®¬¥¥®µ²©§ª€ š©°®ª­ª­­±®®ª°¶ŸÁ¿ºª©¹Žµ·µ²¥ªŽ²°²¶¶ºµºŽ°°°€¥¡ª®ª°ª€ª©š²Ž·œŽŸ¹±¶·Ž¶Ÿ¿ÆÃœ²°§¬ŽŽ±¶¹»¹¿»¹°¹Ä¿œ¿¹º¶¶ºÁº¹·±®ŽŸ¹ŸÂÆŸœ·ÁºŸœ»œ··¹ÁÁ·¶»»¹±Žœº±ª©®®ŸÁÂÈ¿ÆÁŸ¹œŽœ¿¹¹¿¹²h`b`dlh`=7MW®ª°®°°€°ªª¬Žš±®ª§£ ¡¬®§­°tuzQDt¥£¥§€© ¬­ªš°±®©¡£€¬±­µ°ª¬¥££§¡§š£¥€ €¡ ¥§€§¡©­š§¥¥^NFA<<R`RFADBIZ
+
+£©¡€  ¡€¥£€ª¬š©ª©£€€§©©š©š £§£§§§£¡§¥£¡£¥€¥€š¬©š¥š©§¬©­©©€ª­€ € ©¬ªš­¬­°²²ª¥¥©šª©¬®š­²°­­±­²ª¬ª°µ¹±®ªš ¥§šª¥¥­­ª¬š°¬²²°±±¶µ¶µ·°š§¥ €€£°®±°°µŽš¡°¶Ž¹¬¹·œ²©š®±Ž¹¶±°¶¹ÃŸ»¶»ÁÁÄ¿Ž²¹µ¹±œŸÂœœœÄÊ»ÁŸ²°º²±€ªš€¬¹²»ºŸ»¹µ±»µ¬¶··ÄÇŸ¿ÁÁÆ·¶ÁÂ¹»º¹µÁŸŸÃ»·µŸÃŸŸ·»ºŸŸœœŽ±»œÄ¿œÃÆÂÁ»ÁÁÄÁÄÁÇÇÄœÆÈÃÃ¹œÁ¿¿º²Žµ¶µÃÊÏÈÇÄ¹ŸºŸŸ»°œ»Â¿ucghfqmcA<SY° ¬§Ž°°­€¬Ž¹©®šª£¥­©§¡š­°š­®°²µŽ·¶}zy~SI©­Žµ·§ €§£¡ªµ·²°§ª®®Ž¬²°š±±š¡¡¡§©š£©®¥šª®¥§£ £©£¡£¡€ª§¡ª¬®®¥ª £oOEBHFQ¡iRJFBJRh€¡ € €©ª§š©¥§¥­ªªš­¬€¥€£š©¥£¥š€®ª®ª£¡š€ §¬¥€©¬©€§­®­­®­°°µ±®®¬§£ ¥¥¡£¥€©ŽŽº±­µº·®€®ª¬£®°±°­­¬£¡ ©¶±±°°µŽµ­¬­€¥š€¥€§£ª§§©­±Ž°Ž­­²¹µ²±€²ª©š©¥€¬Ž¶µµŸ»·±œ·¹»¹ºœ®¬µŽŽ®Žœœµµ·ŸœÁŸ±·¹ºŸÂŸÁÇÈÂŸÃÄ·»ÇÃŸÁÆÂŸŸÂ¹ÃÄ·µº°¶¿ÆÇº¹Á»¿ºœ°š®Ž²±»ŸÁŸÆÊÆŸœ·º·¹¹·ŸÁÃ»¿Ãœ¿¿ÁÁŸ»·¹¶Ÿ··µ¶ÁŸÁÁÁÃÃºŸÂÁ¿ÇÈÌÌÌÎÑÊÐÏËÊÏÏÑÌÊÆÄÌÑÊÈÏÌËÇËÇÌÁÇœ·¶¿Ÿ¿œŸxhddmtsfFDVišŽ¬°§°°²µ··Â¹¶®¬£¬š€¬­¬ ¬¥°Ž±Ž·~~ZSŽº·ŽŽ°€¡¬µ¬®š§š¥°¬ª¬­ºµ¬¬®°±·Áº©¡š©€š§ª©š©š©§¬­®§ª§¡££¥ª§ª¥£¥¥®©£¥©¥š€€ª©©šª®¥§ª©µ¬yVLEJJUvd[NLNNZu§£ ¡¥šš®°ª®­ª©¬±®®±€¡  ¡¥š©­®­ª©§¬¬±°®ª­ª©¬©ª©ª­­®­©ª±±±²°±°±²²ª©§¬°±ª­Ž®­Ž²®±µŽ¶µ»º¹²²¶µ±­š¬·º¶º¹ºµ£¬®š ¥©Ž¶µ¶±·ŽŽŽ®±±±°°šªª¬©²µ²­²Ž°·±°Ž²°Ž±µªš±±§§©­ªª¶œ°µœ¹µµ²·œÂÁŸŽºŽ­»Â¶±Ž·Ÿº¶œŸºµŽºŸÂµµŽ¹ŸÄÄ¿¿ÂÄÆÄÊÈœÂÄºº¹œºµ·»ŸÂÄÃÊÊÌÈ¿ÄÂ¿ÄÁÇ¿·¿ÂºÈÁÄÂÂ»ÄÈÃ»¹œ¿Ÿ¹ÂŸÁ¿Á¿ÃœÃ»ºœ¹ºÂÁ»»¶²ª»Ÿ¹¹ÆÆ»ÁŽŽ»ÁÂÃÇÐÐÊÌÐÔÙÐÑÎÌÑÓÔÑÌØØÐÓÕØ××ÌÎÎÊÆÈÌËÂÄÆËÃÃplos|qcFM[k¬±º»µŽ²µœº±¹¹®±©§ š§šªŽ¹±©ªŽ£§©¬­²~~
+bU®¶µµ±¶¹µ²µ°§¡¬¥±®§®µ¶¶·ºµ¬±·»µ­¬ª±µ©¡­¬°©¬°­±®­¥®¥®¬¥§©ª£©§®±¬©Ž®ª¬ª²²­©®¬µŽ¬±¬±­ª¬©°¶¬·¶¶Žœ°ZNIIES­pdWQLOU`x ¡©©£§¬¬©­°­°¬°®ª®ªš €£¡¥§§ §£¡€©€©¬¬±°±²¶¹Žµ¶Ž²¶°ªŽŽ¶Ž°°Ž®±¶¶®®µ±Ž·®§€š­±°š°°ª­±·¹œŸœ²ºœ°¶·ŽŽ¶µ±ª¶º¹²ŽŽ±¶®²µ©¬±ŽºŸŸŸ»·¹ºº·Ÿº¹µ­®©±¬©¬°±±µ±¥±¶»µ·º°··Ž²µŽ¬²·¹°²°®µ»»Žº¶¶¹¿ÄÇÇÁŸ»ŸÁÂº¹œ¹ÄÆÊœÃœ¹±ª¶»¹·²ŸºÂŸÃÁŸ·ÂÃÄÈËÇÂœº¹»¶œÁÂŸÁŸÄÌÆÂÃÃÄÁÇŸÇÈÆËÂÂÆÂ¿ÇÄÃ»ÁÆÁÁ·ºµ¹ÂÄº¶œÁ»Ä·¹»œŸœÃÃ¹®µŽ·œœ·œÆÊÄÃœÂÃÃŸÂ¿ÇÂÃÁœÆÎÐÑÑÑÊÎÆÏÐÔØÙØÓÌÔÙÛØÕÐÐÐÐÜ×ÓÕÎÎÌÁ~oosuv}hELZg©µµ·š¶§œºº²¹»º»°±°©€ª©®š®šš§€©ª¬²²­~fc²±²®¶¹²¬¥¥©©©€¶¬£°®š®¶¹œµ»»ºµ°­¬¬®®­°±±»¹Ž²²°²­µ®²°­š©£¥­µ®²±°°®®¬¬¶µ±Ž§¥®­Ž²©±Ž°¶­±¬Ž°Ž°µ±­¬VHLFDQ§ocQOLSR_ ¥ª§¥§¥¥€©ª¬°°ª¬£§€¥ £€š©š¥š®¬§¬©§ªŽµ­²²­¶ŽŽµ²®²²²®®µ¶¶¶¹¶±®Ž­±®°®®£©­®±­®µ±±µ¹¹·Žœ»ŸÃÃœ¹ºŽµ°¥£¬­ŽŽµœ¿·»·¶¹µ¹°ª°­­°¶°Áœ·¹¶µ·¶µ°±±š¬¬©¬©²¬¬¥¬¬°¶·®­±±®ª²±­¬©°°¹°±±Žµ¹µµ»ºµÂÂÇÂÇÇÁÄÁ»¹¿ÇÄÌÃ¿ºº¶±¹¬»µ¶Â¹²²¶¿»ÄÁ»»¿ÁÁÁÁÁ¹ŸŸœœŸœ¹ÁÄË»ÂÇÄÈÆÊÃ»œÁÂÁÈÃÆÏËÄœ²ºŸœÈÈ¿ÇŸŸœœ¹ºŸµœ¶»ÂºŸœºœ·»»º»»¶¶»¿Á¿ÂÊÆÈÈÆÆÆÆÄÂÄŸ¿ŸÃÃÇÌÌÑÏÆÄÏÏÏÓÐÐÔÕÙÞÔØÔÕÐÑÓÔ×ÌÈÌÏÆÊÄ|liqyvudBI[o ªœÊÄŸœÂËÆ¹·ÄÕÛÝàÛ×ÐÁ¹©¥€°®±® š­·¶±}y~ciª®®¬®¶±®æËºšš­·±°°¶­¬·±®­±§­®­¥§š§®€¥š€ §€šš¥¬©­±¬±Ž±¥¥š ©®š­ª¬¬±©­®»»²ºº²µÁº±Ž­¬®¬ššš_U@@BLt}m\SURLQb
+¡€¥£¡§€©€¥£€¡£¡£  €¬§šª§š©¬­®°°²µ²±©§¥©©¥ª­²²°­µ²¬­§¥šª¥©š­ª¬²ª²²±²¶¶¹¶Áœµ»ÂÁÃÇœ·»¹²­Ž­°°²­µ²¶µŽ±²Ž®®°­²©£§©©°­©€š¥¬Ž­­©¬ª§©¡šš€¥ª¶°Ž££¥£ª¬ª£§©£¡¬¡§š»œµ°¹Ž»ÇËËÊË¿¿ÇÄÆÃŸÃ·º®µ¹¬®®»œ¶»»¶®®¶¿œ¶»¶œœº²²®¶º¿¹¹¶·¶»Ÿ·ÂÂÂÁœ·»»Áº¹¿ÈÄÂ¿Á¿ŸÆÈÄ¿ÆÊÌÆÇÆŸººµ¬­Ž·¥¬¿Á·Ž°š¬±®Ž¹®¹¿ÈÄÊÔÓÊÂÃËÈ»Áœº¹ŸÄÆÃÆ¶Ž¿ÁÃÇÎÐÐÑÆÈÊÈÂÆËËÈÄÆ¿ÂÂËÂœÂ·º»Á¿ÈÂtbfsxsl\;NY~ÃÈÌÈÈœÂÆÄÈÇ¿±š£ ®ºµºµµ±¥®¥š¶¶
+NL£©ššª®®¶ÏÐîò§ª¬¬­šª°®€©®®¶Ž­±­€¡š¥šš©ª£€€©  ¥€¬¥©²¶²·­¡¥€£¥šª®£  ¡­Ž°­®°§§ºº°£µ©¥QLD?AFoxfZOELLLg¡€¥£¡§€©€¥£€¡£¡£  €¬§šª§š©¬­®°°²µ²±©§¥©©¥ª­²²°­µ²¬­§¥šª¥©š­ª¬²ª²²±²¶¶¹¶Áœµ»ÂÁÃÇœ·»¹²­Ž­°°²­µ²¶µŽ±²Ž®®°­²©£§©©°­©€š¥¬Ž­­©¬ª§©¡šš€¥ª¶°Ž££¥£ª¬ª£§©£¡¬¡§š»œµ°¹Ž»ÇËËÊË¿¿ÇÄÆÃŸÃ·º®µ¹¬®®»œ¶»»¶®®¶¿œ¶»¶œœº²²®¶º¿¹¹¶·¶»Ÿ·ÂÂÂÁœ·»»Áº¹¿ÈÄÂ¿Á¿ŸÆÈÄ¿ÆÊÌÆÇÆŸººµ¬­Ž·¥¬¿Á·Ž°š¬±®Ž¹®¹¿ÈÄÊÔÓÊÂÃËÈ»Áœº¹ŸÄÆÃÆ¶Ž¿ÁÃÇÎÐÐÑÆÈÊÈÂÆËËÈÄÆ¿ÂÂËÂœÂ·º»Á¿ÈÂtbfsxsl\;NY~ÃÈÌÈÈœÂÆÄÈÇ¿±š£ ®ºµºµµ±¥®¥š¶¶
+NL£©ššª®®¶ÏÐîò§ª¬¬­šª°®€©®®¶Ž­±­€¡š¥šš©ª£€€©  ¥€¬¥©²¶²·­¡¥€£¥šª®£  ¡­Ž°­®°§§ºº°£µ©¥QLD?AFoxfZOELLLg ¥ª§¥§¥¥€©ª¬°°ª¬£§€¥ £€š©š¥š®¬§¬©§ªŽµ­²²­¶ŽŽµ²®²²²®®µ¶¶¶¹¶±®Ž­±®°®®£©­®±­®µ±±µ¹¹·Žœ»ŸÃÃœ¹ºŽµ°¥£¬­ŽŽµœ¿·»·¶¹µ¹°ª°­­°¶°Áœ·¹¶µ·¶µ°±±š¬¬©¬©²¬¬¥¬¬°¶·®­±±®ª²±­¬©°°¹°±±Žµ¹µµ»ºµÂÂÇÂÇÇÁÄÁ»¹¿ÇÄÌÃ¿ºº¶±¹¬»µ¶Â¹²²¶¿»ÄÁ»»¿ÁÁÁÁÁ¹ŸŸœœŸœ¹ÁÄË»ÂÇÄÈÆÊÃ»œÁÂÁÈÃÆÏËÄœ²ºŸœÈÈ¿ÇŸŸœœ¹ºŸµœ¶»ÂºŸœºœ·»»º»»¶¶»¿Á¿ÂÊÆÈÈÆÆÆÆÄÂÄŸ¿ŸÃÃÇÌÌÑÏÆÄÏÏÏÓÐÐÔÕÙÞÔØÔÕÐÑÓÔ×ÌÈÌÏÆÊÄ|liqyvudBI[o ªœÊÄŸœÂËÆ¹·ÄÕÛÝàÛ×ÐÁ¹©¥€°®±® š­·¶±}y~ciª®®¬®¶±®æËºšš­·±°°¶­¬·±®­±§­®­¥§š§®€¥š€ §€šš¥¬©­±¬±Ž±¥¥š ©®š­ª¬¬±©­®»»²ºº²µÁº±Ž­¬®¬ššš_U@@BLt}m\SURLQb
+ ¡©©£§¬¬©­°­°¬°®ª®ªš €£¡¥§§ §£¡€©€©¬¬±°±²¶¹Žµ¶Ž²¶°ªŽŽ¶Ž°°Ž®±¶¶®®µ±Ž·®§€š­±°š°°ª­±·¹œŸœ²ºœ°¶·ŽŽ¶µ±ª¶º¹²ŽŽ±¶®²µ©¬±ŽºŸŸŸ»·¹ºº·Ÿº¹µ­®©±¬©¬°±±µ±¥±¶»µ·º°··Ž²µŽ¬²·¹°²°®µ»»Žº¶¶¹¿ÄÇÇÁŸ»ŸÁÂº¹œ¹ÄÆÊœÃœ¹±ª¶»¹·²ŸºÂŸÃÁŸ·ÂÃÄÈËÇÂœº¹»¶œÁÂŸÁŸÄÌÆÂÃÃÄÁÇŸÇÈÆËÂÂÆÂ¿ÇÄÃ»ÁÆÁÁ·ºµ¹ÂÄº¶œÁ»Ä·¹»œŸœÃÃ¹®µŽ·œœ·œÆÊÄÃœÂÃÃŸÂ¿ÇÂÃÁœÆÎÐÑÑÑÊÎÆÏÐÔØÙØÓÌÔÙÛØÕÐÐÐÐÜ×ÓÕÎÎÌÁ~oosuv}hELZg©µµ·š¶§œºº²¹»º»°±°©€ª©®š®šš§€©ª¬²²­~fc²±²®¶¹²¬¥¥©©©€¶¬£°®š®¶¹œµ»»ºµ°­¬¬®®­°±±»¹Ž²²°²­µ®²°­š©£¥­µ®²±°°®®¬¬¶µ±Ž§¥®­Ž²©±Ž°¶­±¬Ž°Ž°µ±­¬VHLFDQ§ocQOLSR_£ ¡¥šš®°ª®­ª©¬±®®±€¡  ¡¥š©­®­ª©§¬¬±°®ª­ª©¬©ª©ª­­®­©ª±±±²°±°±²²ª©§¬°±ª­Ž®­Ž²®±µŽ¶µ»º¹²²¶µ±­š¬·º¶º¹ºµ£¬®š ¥©Ž¶µ¶±·ŽŽŽ®±±±°°šªª¬©²µ²­²Ž°·±°Ž²°Ž±µªš±±§§©­ªª¶œ°µœ¹µµ²·œÂÁŸŽºŽ­»Â¶±Ž·Ÿº¶œŸºµŽºŸÂµµŽ¹ŸÄÄ¿¿ÂÄÆÄÊÈœÂÄºº¹œºµ·»ŸÂÄÃÊÊÌÈ¿ÄÂ¿ÄÁÇ¿·¿ÂºÈÁÄÂÂ»ÄÈÃ»¹œ¿Ÿ¹ÂŸÁ¿Á¿ÃœÃ»ºœ¹ºÂÁ»»¶²ª»Ÿ¹¹ÆÆ»ÁŽŽ»ÁÂÃÇÐÐÊÌÐÔÙÐÑÎÌÑÓÔÑÌØØÐÓÕØ××ÌÎÎÊÆÈÌËÂÄÆËÃÃplos|qcFM[k¬±º»µŽ²µœº±¹¹®±©§ š§šªŽ¹±©ªŽ£§©¬­²~~
+bU®¶µµ±¶¹µ²µ°§¡¬¥±®§®µ¶¶·ºµ¬±·»µ­¬ª±µ©¡­¬°©¬°­±®­¥®¥®¬¥§©ª£©§®±¬©Ž®ª¬ª²²­©®¬µŽ¬±¬±­ª¬©°¶¬·¶¶Žœ°ZNIIES­pdWQLOU`x
Index: /soft/giet_vm/transpose/main.c
===================================================================
--- /soft/giet_vm/transpose/main.c	(revision 295)
+++ /soft/giet_vm/transpose/main.c	(revision 295)
@@ -0,0 +1,417 @@
+///////////////////////////////////////////////////////////////////////////////////////////////
+// File   : main.c   (for transpose application)
+// Date   : february 2014
+// author : Alain Greiner
+//
+// This application makes a transpose for a NN*NN pixels sequence of images.
+// The image sequence is read from a file (one byte per pixel).
+// The input and output buffers containing the image are distributed in all clusters.
+//
+// - The image size NN must be a power of 2.
+// - The number of clusters containing processors (X_SIZE*Y_SIZE-1) must be a power of 2.
+// - The number of processors per cluster (NB_PROCS_MAX) must be a power of 2.
+// - The image size NN must be larger or equal to the total number of processor.
+//
+// For each image the application makes a self test (checksum for each line).
+// The actual display on the frame buffer is optional (controled by DISPLAY_OK define)
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+#include "hard_config.h"
+#include "stdio.h"
+#include "malloc.h"
+#include "barrier.h"
+
+#define NN                  128                 // image size : nlines = npixels = 128
+#define NB_IMAGES           5                   // number of images to be handled
+#define FILE_PATHNAME       "misc/images.raw"   // file pathname on disk
+
+#define VERBOSE_OK          0                   // display a detailed log on TTY  when non zero
+#define INSTRUMENTATION_OK  0                   // display statistcs on TTY when non zero
+
+///////////////////////////////////////////////////////
+// global variables stored in seg_data in cluster(0,0)
+///////////////////////////////////////////////////////
+
+// instrumentation counters 
+// for each processor (up to 4 processors)
+// in each cluster (up to 32 clusters)
+unsigned int LOAD_START[32][4];
+unsigned int LOAD_END  [32][4];
+unsigned int TRSP_START[32][4];
+unsigned int TRSP_END  [32][4];
+unsigned int DISP_START[32][4];
+unsigned int DISP_END  [32][4];
+
+// arrays of pointers on distributed buffers
+// one input buffer & one output buffer per cluster
+unsigned char*  buf_in [32];
+unsigned char*  buf_out[32];
+
+// array of heap names 
+// one heap per cluster
+char*        heap_name[32] = { "trsp_heap_0" , "trsp_heap_1" , "trsp_heap_2" , "trsp_heap_3" ,
+                               "trsp_heap_4" , "trsp_heap_5" , "trsp_heap_6" , "trsp_heap_7" ,
+                               "trsp_heap_8" , "trsp_heap_9" , "trsp_heap_10", "trsp_heap_11",
+                               "trsp_heap_12", "trsp_heap_13", "trsp_heap_14", "trsp_heap_15",
+                               "trsp_heap_16", "trsp_heap_17", "trsp_heap_18", "trsp_heap_19",
+                               "trsp_heap_20", "trsp_heap_21", "trsp_heap_22", "trsp_heap_23",
+                               "trsp_heap_24", "trsp_heap_25", "trsp_heap_26", "trsp_heap_27",
+                               "trsp_heap_28", "trsp_heap_29", "trsp_heap_30", "trsp_heap_31" };
+
+// checksum variables 
+unsigned check_line_before[NN];
+unsigned check_line_after[NN];
+
+// synchronisation barriers
+giet_barrier_t barrier_0;
+giet_barrier_t barrier_1;
+giet_barrier_t barrier_2;
+giet_barrier_t barrier_3;
+giet_barrier_t barrier_4;
+
+volatile unsigned int init_ok = 1;
+
+//////////////////////////////////////////
+__attribute__ ((constructor)) void main()
+{
+
+    int          file;                                          // file descriptor for images
+    unsigned int l;                                             // line index for loops
+    unsigned int p;                                             // pixel index for loops
+    unsigned int proc_id     = giet_procid();                   // processor id
+    unsigned int nclusters   = X_SIZE*(Y_SIZE-1);               // number of clusters with procs
+    unsigned int lpid        = proc_id % NB_PROCS_MAX;          // local processor id
+    unsigned int cluster_xy  = proc_id / NB_PROCS_MAX;          // cluster index (8 bits format)
+    unsigned int x           = cluster_xy >> Y_WIDTH;           // x coordinate
+    unsigned int y           = cluster_xy & ((1<<Y_WIDTH)-1);   // y coordinate
+    unsigned int ntasks      = nclusters * NB_PROCS_MAX;        // number of tasks
+    unsigned int npixels     = NN * NN;                         // number of pixel per image
+    unsigned int nblocks     = npixels / 512;                   // number of blocks per image
+    unsigned int image       = 0;
+ 
+    // cluster_id is a "continuous" index from (0 to nclusters-1) 
+    // for a cluster with coordinates (x,y)
+    unsigned int cluster_id  = (x * (Y_SIZE-1)) + y;               
+
+    // task_id is a "continuous" index (from 0 to ntasks-1
+    // for the the task running on processor[x,y,lpid]
+    unsigned int task_id = (cluster_id * NB_PROCS_MAX) + lpid;
+
+    giet_shr_printf("\n*** Proc [%d,%d,%d] enters main() at cycle %d ***\n", 
+                    x, y, lpid, giet_proctime() );
+
+    // processor [0,0,0] makes parameters checking and barriers initialization
+    if ( proc_id == 0 )
+    {
+        if ((NB_PROCS_MAX != 1) && (NB_PROCS_MAX != 2) && (NB_PROCS_MAX != 4))
+        { 
+            giet_exit("[TRANSPOSE ERROR] NB_PROCS_MAX must be 1, 2 or 4");
+        }
+        if ((nclusters != 1) && (nclusters != 2) && (nclusters != 4) && (nclusters != 8) &&
+            (nclusters != 16) && (nclusters != 32) )
+        {
+            giet_exit("[TRANSPOSE ERROR] number of clusters must be 2,4,8,16,32");
+        }
+        if ( ntasks > NN )
+        {
+            giet_exit("[TRANSPOSE ERROR] number of tasks larger than number of lines");
+        }
+
+        barrier_init( &barrier_0, ntasks );
+        barrier_init( &barrier_1, ntasks );
+        barrier_init( &barrier_2, ntasks );
+        barrier_init( &barrier_3, ntasks );
+        barrier_init( &barrier_4, ntasks );
+
+        giet_shr_printf("\n*** Proc [%d,%d,%d] completes barrier init at cycle %d\n",
+                        0, 0, 0, giet_proctime() );
+        init_ok = 0;
+    }
+    else   // others processors wait initialisation completion
+    {
+        while ( init_ok == 1 );
+    }
+    
+    // The buffers containing the images are distributed in clusters
+    // (one buf_in and one buf_out per cluster).
+    // Each buffer contains (NN*NN / nclusters) bytes.
+    // They are allocated in the cluster heap by processor with (lpid == 0).
+    if ( lpid == 0 )
+    {
+        unsigned int heap_base;
+        giet_vobj_get_vbase( "transpose",
+                             heap_name[cluster_id],
+                             &heap_base );
+
+        buf_in[cluster_id]  = (unsigned char*)heap_base;
+        buf_out[cluster_id] = (unsigned char*)(heap_base + NN*NN/nclusters);
+
+        giet_shr_printf("\n*** Proc [%d,%d,%d] completes buffer allocation at cycle %d\n"
+                        " - buf_in  = %x\n"
+                        " - buf_out = %x\n",
+                        x, y, 0, giet_proctime(), 
+                        (unsigned int)buf_in[cluster_id], 
+                        (unsigned int)buf_out[cluster_id] );
+
+        // open file containing images
+        file = giet_fat_open( "misc/images.raw", 0);
+
+        giet_assert( (file >= 0), 
+                     "[TRANSPOSE ERROR] cannot open file misc/images.raw");
+
+        giet_shr_printf("\n*** Proc [%d,%d,%d] completes _fat_open at cycle %d\n",
+                            x, y, 0, giet_proctime() ); 
+    }
+
+    //////////////////////////////////////////////////
+    // all tasks wait buffer allocation completion
+    //////////////////////////////////////////////////
+    barrier_wait( &barrier_0 );
+
+    // Main loop (on images)
+    while (image < NB_IMAGES)
+    {
+        // pseudo parallel load from disk to buf_in buffer : nblocks/nclusters blocks
+        // only task running on processor with (lpid == 0) does it
+
+        LOAD_START[cluster_id][lpid] = giet_proctime();
+
+        if (lpid == 0)
+        {
+            giet_shr_printf("\n*** Proc [%d,%d,%d] starts load for image %d at cycle %d\n",
+                           x, y, 0, image, giet_proctime() );
+
+            giet_fat_read( file,
+                           buf_in[cluster_id],
+                           (nblocks / nclusters),
+                           ((image*nblocks) + ((nblocks*cluster_id)/nclusters)) );
+
+            giet_shr_printf("\n*** Proc [%d,%d,0] completes load for image %d at cycle %d\n",
+                            x, y, image, giet_proctime() );
+        }
+
+        LOAD_END[cluster_id][lpid] = giet_proctime();
+
+        //////////////////////////////////////////////////
+        // all tasks wait buf_in load completion 
+        //////////////////////////////////////////////////
+        barrier_wait( &barrier_1 );
+
+        // parallel transpose from buf_in to buf_out
+        // each task makes the transposition for nlt lines (nlt = NN/ntasks)
+        // from line [task_id*nlt] to line [(task_id + 1)*nlt - 1]
+        // (p,l) are the absolute pixel coordinates in the source image
+
+        giet_shr_printf("\n*** proc [%d,%d,%d] starts transpose for image %d at cycle %d\n", 
+                        x, y, lpid, image, giet_proctime());
+
+        TRSP_START[cluster_id][lpid] = giet_proctime();
+
+        unsigned int nlt   = NN / ntasks;      // number of lines per task
+        unsigned int nlc   = NN / nclusters;   // number of lines per cluster
+
+        unsigned int src_cluster;
+        unsigned int src_index;
+        unsigned int dst_cluster;
+        unsigned int dst_index;
+
+        unsigned char byte;
+
+        unsigned int first = task_id * nlt;    // first line index for a given task
+        unsigned int last  = first + nlt;      // last line index for a given task
+
+        for ( l = first ; l < last ; l++ )
+        {
+
+#if VERBOSE_OK
+giet_shr_printf(" - Proc[%d,%d,%d] process line %d\n", x, y, lpid, l );
+#endif
+
+            check_line_before[l] = 0;
+         
+            // in each iteration we transfer one byte
+            for ( p = 0 ; p < NN ; p++ )
+            {
+                // read one byte from local buf_in
+                src_cluster = l / nlc;
+                src_index   = (l % nlc)*NN + p;
+                byte        = buf_in[src_cluster][src_index];
+
+                // compute checksum
+                check_line_before[l] = check_line_before[l] + byte;
+
+                // write one byte to remote buf_out
+                dst_cluster = p / nlc; 
+                dst_index   = (p % nlc)*NN + l;
+                buf_out[dst_cluster][dst_index] = byte;
+            }
+        }
+
+        giet_shr_printf("\n*** proc [%d,%d,%d] completes transpose for image %d at cycle %d\n", 
+                        x, y, lpid, image, giet_proctime() );
+
+        TRSP_END[cluster_id][lpid] = giet_proctime();
+
+        //////////////////////////////////////////////////
+        // all tasks wait transpose completion 
+        //////////////////////////////////////////////////
+        barrier_wait( &barrier_2 );
+
+        // optional parallel display from local buf_out to frame buffer
+        // all processors contribute to display using memcpy...
+
+        if ( ( X_IO != 0) || (Y_IO != 0) )  // external frame buffer available
+        {
+            giet_shr_printf("\n*** proc [%d,%d,%d] starts display for image %d at cycle %d\n", 
+                            x, y, lpid, image, giet_proctime() );
+
+            DISP_START[cluster_id][lpid] = giet_proctime();
+
+            unsigned int  npt   = npixels / ntasks;   // number of pixels per task
+
+            giet_fb_sync_write( npt * task_id, 
+                                &buf_out[cluster_id][lpid*npt], 
+                                npt );
+
+            giet_shr_printf("\n*** Proc [%d,%d,%d] completes display for image %d at cycle %d\n",
+                            x, y, lpid, image, giet_proctime() );
+
+            DISP_END[cluster_id][lpid] = giet_proctime();
+
+            //////////////////////////////////////////////////
+            // all tasks wait display completion 
+            //////////////////////////////////////////////////
+            barrier_wait( &barrier_3 );
+        }
+
+        // checksum done by processor (lpid == 0) in each cluster
+
+        if ( lpid == 0 )
+        {
+            giet_shr_printf("\n*** Proc [%d,%d,%d] starts checks for image %d at cycle %d\n",
+                            x, y, lpid, image, giet_proctime() );
+
+            unsigned int success = 1;
+            unsigned int start   = cluster_id * nlc;
+            unsigned int stop    = start + nlc;
+
+            for ( l = start ; l < stop ; l++ )
+            {
+                check_line_after[l] = 0;
+
+                for ( p = 0 ; p < NN ; p++ )
+                {
+                    // read one byte in remote buffer
+                    src_cluster = p / nlc;
+                    src_index   = (p % nlc)*NN + l;
+
+                    unsigned char byte = buf_out[src_cluster][src_index];
+
+                    check_line_after[l] = check_line_after[l] + byte;
+                }
+
+#if VERBOSE_OK
+giet_shr_printf(" - l = %d / before = %d / after = %d \n",
+                l, check_line_before[l], check_line_after[l] );
+#endif
+                if ( check_line_before[l] != check_line_after[l] ) success = 0;
+            }
+
+            if ( success ) 
+            {
+                giet_shr_printf("\n*** proc [%d,%d,0] : checksum OK for image %d\n",
+                                x, y, image );
+            }
+            else
+            {
+                giet_shr_printf("\n*** proc [%d,%d,0] : checksum KO for image %d\n",
+                                x, y, image );
+            }
+        }
+
+        // instrumentation done by processor [0,0,0]
+
+        if ( (proc_id == 0) && INSTRUMENTATION_OK )
+        {
+            int cc, pp;
+            unsigned int min_load_start = 0xFFFFFFFF;
+            unsigned int max_load_start = 0;
+            unsigned int min_load_ended = 0xFFFFFFFF;
+            unsigned int max_load_ended = 0;
+            unsigned int min_trsp_start = 0xFFFFFFFF;
+            unsigned int max_trsp_start = 0;
+            unsigned int min_trsp_ended = 0xFFFFFFFF;
+            unsigned int max_trsp_ended = 0;
+            unsigned int min_disp_start = 0xFFFFFFFF;
+            unsigned int max_disp_start = 0;
+            unsigned int min_disp_ended = 0xFFFFFFFF;
+            unsigned int max_disp_ended = 0;
+
+            for (cc = 0; cc < nclusters; cc++)
+            {
+                for (pp = 0; pp < NB_PROCS_MAX; pp++)
+                {
+                    if (LOAD_START[cc][pp] < min_load_start)  min_load_start = LOAD_START[cc][pp];
+                    if (LOAD_START[cc][pp] > max_load_start)  max_load_start = LOAD_START[cc][pp];
+                    if (LOAD_END[cc][pp]   < min_load_ended)  min_load_ended = LOAD_END[cc][pp]; 
+                    if (LOAD_END[cc][pp]   > max_load_ended)  max_load_ended = LOAD_END[cc][pp];
+                    if (TRSP_START[cc][pp] < min_trsp_start)  min_trsp_start = TRSP_START[cc][pp];
+                    if (TRSP_START[cc][pp] > max_trsp_start)  max_trsp_start = TRSP_START[cc][pp];
+                    if (TRSP_END[cc][pp]   < min_trsp_ended)  min_trsp_ended = TRSP_END[cc][pp];
+                    if (TRSP_END[cc][pp]   > max_trsp_ended)  max_trsp_ended = TRSP_END[cc][pp];
+                    if (DISP_START[cc][pp] < min_disp_start)  min_disp_start = DISP_START[cc][pp];
+                    if (DISP_START[cc][pp] > max_disp_start)  max_disp_start = DISP_START[cc][pp];
+                    if (DISP_END[cc][pp]   < min_disp_ended)  min_disp_ended = DISP_END[cc][pp];
+                    if (DISP_END[cc][pp]   > max_disp_ended)  max_disp_ended = DISP_END[cc][pp];
+                }
+            }
+
+            giet_shr_printf(" - LOAD_START : min = %d / max = %d / med = %d / delta = %d\n",
+                            min_load_start, max_load_start, (min_load_start+max_load_start)/2, 
+                            max_load_start-min_load_start); 
+
+            giet_shr_printf(" - LOAD_END   : min = %d / max = %d / med = %d / delta = %d\n",
+                            min_load_ended, max_load_ended, (min_load_ended+max_load_ended)/2, 
+                            max_load_ended-min_load_ended); 
+
+            giet_shr_printf(" - TRSP_START : min = %d / max = %d / med = %d / delta = %d\n",
+                            min_trsp_start, max_trsp_start, (min_trsp_start+max_trsp_start)/2, 
+                            max_trsp_start-min_trsp_start); 
+
+            giet_shr_printf(" - TRSP_END   : min = %d / max = %d / med = %d / delta = %d\n",
+                            min_trsp_ended, max_trsp_ended, (min_trsp_ended+max_trsp_ended)/2, 
+                            max_trsp_ended-min_trsp_ended); 
+
+            giet_shr_printf(" - DISP_START : min = %d / max = %d / med = %d / delta = %d\n",
+                            min_disp_start, max_disp_start, (min_disp_start+max_disp_start)/2, 
+                            max_disp_start-min_disp_start); 
+
+            giet_shr_printf(" - DISP_END   : min = %d / max = %d / med = %d / delta = %d\n",
+                            min_disp_ended, max_disp_ended, (min_disp_ended+max_disp_ended)/2, 
+                            max_disp_ended-min_disp_ended); 
+        }
+
+        image++;
+
+        //////////////////////////////////////////////////
+        // all tasks wait instrumentation completion 
+        //////////////////////////////////////////////////
+        barrier_wait( &barrier_4 );
+
+    } // end while image      
+
+    giet_exit("Completed");
+
+} // end main()
+
+// Local Variables:
+// tab-width: 3
+// c-basic-offset: 
+// c-file-offsets:((innamespace . 0)(inline-open . 0))
+// indent-tabs-mode: nil
+// End:
+
+// vim: filetype=cpp:expandtab:shiftwidth=3:tabstop=3:softtabstop=3
+
+
+
Index: /soft/giet_vm/transpose/transpose.ld
===================================================================
--- /soft/giet_vm/transpose/transpose.ld	(revision 295)
+++ /soft/giet_vm/transpose/transpose.ld	(revision 295)
@@ -0,0 +1,40 @@
+/****************************************************************************
+* Definition of the base address for all virtual segments
+*****************************************************************************/
+
+seg_code_base      = 0x00400000;
+seg_data_base      = 0x00500000;
+
+/***************************************************************************
+* Grouping sections into segments for code and data
+***************************************************************************/
+
+SECTIONS
+{
+    . = seg_code_base;
+    seg_code : 
+    {
+        *(.text)
+        *(.text.*)
+    }
+    . = seg_data_base;
+    seg_data : 
+    {
+        *(.ctors)
+        *(.rodata)
+        /* . = ALIGN(4); */
+        *(.rodata.*)
+        /* . = ALIGN(4); */
+        *(.data)
+        /* . = ALIGN(4); */
+        *(.lit8)
+        *(.lit4)
+        *(.sdata)
+        /* . = ALIGN(4); */
+        *(.bss)
+        *(COMMON)
+        *(.sbss)
+        *(.scommon)
+    }
+}
+
