marionnet-0.90.6+bzr434.orig/0000700000175000017500000000000012167200765014561 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/0000700000175000017500000000000012167200764015355 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/kernel/0000700000175000017500000000000012167200764016635 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/kernel/CONFIG-3.2.480000600000175000017500000006746312167200764020301 0ustar lucaslucas# # Automatically generated file; DO NOT EDIT. # User Mode Linux/i386 3.2.48 Kernel Configuration # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_CMPXCHG_LOCAL is not set # CONFIG_CMPXCHG_DOUBLE is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set CONFIG_M586MMX=y # CONFIG_M686 is not set # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MELAN is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MCORE2 is not set # CONFIG_MATOM is not set CONFIG_X86_GENERIC=y CONFIG_X86_INTERNODE_CACHE_SHIFT=6 CONFIG_X86_CMPXCHG=y CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_XADD=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_F00F_BUG=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_ALIGNMENT_16=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_TSC=y CONFIG_X86_MINIMUM_CPU_FAMILY=4 CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_CYRIX_32=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_CPU_SUP_TRANSMETA_32=y CONFIG_CPU_SUP_UMC_32=y CONFIG_UML_X86=y # CONFIG_64BIT is not set CONFIG_X86_32=y # CONFIG_X86_64 is not set # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_3_LEVEL_PGTABLES=y CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_COMPACTION is not set # CONFIG_PHYS_ADDR_T_64BIT is not set CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_NEED_PER_CPU_KM=y # CONFIG_CLEANCACHE is not set CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_HAVE_AOUT=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y CONFIG_KERNEL_STACK_ORDER=2 # CONFIG_MMAPPER is not set CONFIG_NO_DMA=y # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_CROSS_COMPILE="" CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_DEFAULT_HOSTNAME="(none)" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_FHANDLE is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set CONFIG_HAVE_GENERIC_HARDIRQS=y # # IRQ subsystem # CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_IRQ_SHOW=y # # RCU Subsystem # CONFIG_TINY_RCU=y # CONFIG_PREEMPT_RCU is not set # CONFIG_RCU_TRACE is not set # CONFIG_TREE_RCU_TRACE is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_CGROUPS is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_SCHED_AUTOGROUP is not set CONFIG_SYSFS_DEPRECATED=y # CONFIG_SYSFS_DEPRECATED_V2 is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="" CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EXPERT is not set CONFIG_UID16=y # CONFIG_SYSCTL_SYSCALL is not set CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y # CONFIG_EMBEDDED is not set # # Kernel Performance Events And Counters # CONFIG_VM_EVENT_COUNTERS=y CONFIG_COMPAT_BRK=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_PROFILING is not set # # GCOV-based kernel profiling # # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set CONFIG_BLOCK=y CONFIG_LBDAF=y CONFIG_BLK_DEV_BSG=y # CONFIG_BLK_DEV_BSGLIB is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_DEFAULT_DEADLINE is not set CONFIG_DEFAULT_CFQ=y # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="cfq" # CONFIG_INLINE_SPIN_TRYLOCK is not set # CONFIG_INLINE_SPIN_TRYLOCK_BH is not set # CONFIG_INLINE_SPIN_LOCK is not set # CONFIG_INLINE_SPIN_LOCK_BH is not set # CONFIG_INLINE_SPIN_LOCK_IRQ is not set # CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set CONFIG_INLINE_SPIN_UNLOCK=y # CONFIG_INLINE_SPIN_UNLOCK_BH is not set CONFIG_INLINE_SPIN_UNLOCK_IRQ=y # CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set # CONFIG_INLINE_READ_TRYLOCK is not set # CONFIG_INLINE_READ_LOCK is not set # CONFIG_INLINE_READ_LOCK_BH is not set # CONFIG_INLINE_READ_LOCK_IRQ is not set # CONFIG_INLINE_READ_LOCK_IRQSAVE is not set CONFIG_INLINE_READ_UNLOCK=y # CONFIG_INLINE_READ_UNLOCK_BH is not set CONFIG_INLINE_READ_UNLOCK_IRQ=y # CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set # CONFIG_INLINE_WRITE_TRYLOCK is not set # CONFIG_INLINE_WRITE_LOCK is not set # CONFIG_INLINE_WRITE_LOCK_BH is not set # CONFIG_INLINE_WRITE_LOCK_IRQ is not set # CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set CONFIG_INLINE_WRITE_UNLOCK=y # CONFIG_INLINE_WRITE_UNLOCK_BH is not set CONFIG_INLINE_WRITE_UNLOCK_IRQ=y # CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set # CONFIG_MUTEX_SPIN_ON_OWNER is not set # CONFIG_FREEZER is not set # # UML Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pty" CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # # Device Drivers # # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" # CONFIG_DEVTMPFS is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_SYS_HYPERVISOR is not set CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y CONFIG_BLK_DEV_UBD_SYNC=y CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 CONFIG_BLK_DEV_CRYPTOLOOP=y # CONFIG_BLK_DEV_DRBD is not set CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_BLK_DEV_XIP is not set CONFIG_ATA_OVER_ETH=y # CONFIG_BLK_DEV_RBD is not set # CONFIG_MISC_DEVICES is not set # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set # CONFIG_MD is not set CONFIG_NETDEVICES=y CONFIG_NET_CORE=y CONFIG_BONDING=y CONFIG_DUMMY=y # CONFIG_EQUALIZER is not set # CONFIG_MII is not set # CONFIG_MACVLAN is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # CAIF transport drivers # CONFIG_ETHERNET=y CONFIG_NET_VENDOR_CHELSIO=y CONFIG_NET_VENDOR_INTEL=y CONFIG_NET_VENDOR_I825XX=y CONFIG_NET_VENDOR_MARVELL=y CONFIG_NET_VENDOR_NATSEMI=y CONFIG_NET_VENDOR_8390=y # CONFIG_PHYLIB is not set CONFIG_PPP=y CONFIG_PPP_BSDCOMP=y CONFIG_PPP_DEFLATE=y CONFIG_PPP_FILTER=y CONFIG_PPP_MPPE=y CONFIG_PPP_MULTILINK=y CONFIG_PPPOE=y CONFIG_PPP_ASYNC=y CONFIG_PPP_SYNC_TTY=y CONFIG_SLIP=y CONFIG_SLHC=y CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y CONFIG_SLIP_MODE_SLIP6=y CONFIG_WLAN=y # CONFIG_HOSTAP is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set # # Character devices # CONFIG_UNIX98_PTYS=y # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set CONFIG_DEVKMEM=y CONFIG_HW_RANDOM=y CONFIG_UML_RANDOM=y # CONFIG_R3964 is not set # CONFIG_NSC_GPIO is not set # CONFIG_RAW_DRIVER is not set # # PPS support # # CONFIG_PPS is not set # # PPS generators support # # # PTP clock support # # # Enable Device Drivers -> PPS to see the PTP clock options. # # CONFIG_POWER_SUPPLY is not set # CONFIG_THERMAL is not set # CONFIG_WATCHDOG is not set # CONFIG_REGULATOR is not set CONFIG_SOUND_OSS_CORE_PRECLAIM=y # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # # Virtio drivers # # CONFIG_VIRTIO_BALLOON is not set # CONFIG_STAGING is not set # # Hardware Spinlock drivers # CONFIG_IOMMU_SUPPORT=y # CONFIG_VIRT_DRIVERS is not set # CONFIG_PM_DEVFREQ is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_ROUTE_CLASSID=y CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_RARP=y CONFIG_NET_IPIP=y # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_IP_MROUTE=y # CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set CONFIG_IP_PIMSM_V1=y # CONFIG_IP_PIMSM_V2 is not set CONFIG_ARPD=y # CONFIG_SYN_COOKIES is not set CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y CONFIG_INET_LRO=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_ADVANCED=y CONFIG_TCP_CONG_BIC=y CONFIG_TCP_CONG_CUBIC=y CONFIG_TCP_CONG_WESTWOOD=y CONFIG_TCP_CONG_HTCP=y CONFIG_TCP_CONG_HSTCP=y CONFIG_TCP_CONG_HYBLA=y CONFIG_TCP_CONG_VEGAS=y CONFIG_TCP_CONG_SCALABLE=y CONFIG_TCP_CONG_LP=y CONFIG_TCP_CONG_VENO=y # CONFIG_TCP_CONG_YEAH is not set # CONFIG_TCP_CONG_ILLINOIS is not set # CONFIG_DEFAULT_BIC is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_HTCP is not set # CONFIG_DEFAULT_HYBLA is not set # CONFIG_DEFAULT_VEGAS is not set # CONFIG_DEFAULT_VENO is not set # CONFIG_DEFAULT_WESTWOOD is not set # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y CONFIG_IPV6_PRIVACY=y CONFIG_IPV6_ROUTER_PREF=y # CONFIG_IPV6_ROUTE_INFO is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set CONFIG_INET6_AH=y CONFIG_INET6_ESP=y CONFIG_INET6_IPCOMP=y # CONFIG_IPV6_MIP6 is not set CONFIG_INET6_XFRM_TUNNEL=y CONFIG_INET6_TUNNEL=y CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y CONFIG_IPV6_TUNNEL=y # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y # CONFIG_NF_CONNTRACK is not set # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=y # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y # CONFIG_NETFILTER_XT_TARGET_DSCP is not set CONFIG_NETFILTER_XT_TARGET_HL=y # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set CONFIG_NETFILTER_XT_TARGET_MARK=y # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TRACE is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=y # CONFIG_NETFILTER_XT_MATCH_CPU is not set CONFIG_NETFILTER_XT_MATCH_DCCP=y # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set CONFIG_NETFILTER_XT_MATCH_ESP=y # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set CONFIG_NETFILTER_XT_MATCH_HL=y # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set CONFIG_NETFILTER_XT_MATCH_POLICY=y # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # CONFIG_IP_SET is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # # CONFIG_NF_DEFRAG_IPV4 is not set CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # # CONFIG_NF_DEFRAG_IPV6 is not set # CONFIG_IP6_NF_QUEUE is not set CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y # CONFIG_IP6_NF_MATCH_MH is not set CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y # CONFIG_BRIDGE_EBT_IP6 is not set CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y # CONFIG_BRIDGE_EBT_NFLOG is not set CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set CONFIG_IP_SCTP=y # CONFIG_SCTP_DBG_MSG is not set # CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_SCTP_HMAC_NONE is not set # CONFIG_SCTP_HMAC_SHA1 is not set CONFIG_SCTP_HMAC_MD5=y # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=y CONFIG_BRIDGE=y CONFIG_BRIDGE_IGMP_SNOOPING=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y # CONFIG_VLAN_8021Q_GVRP is not set # CONFIG_DECNET is not set CONFIG_LLC=y # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_PHONET is not set # CONFIG_IEEE802154 is not set # CONFIG_NET_SCHED is not set # CONFIG_DCB is not set # CONFIG_BATMAN_ADV is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y # CONFIG_CFG80211 is not set # CONFIG_LIB80211 is not set # # CFG80211 needs to be enabled for MAC80211 # # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=8 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y # CONFIG_UML_NET_VDE is not set CONFIG_UML_NET_MCAST=y # CONFIG_UML_NET_PCAP is not set CONFIG_UML_NET_SLIRP=y # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set CONFIG_EXT2_FS_XIP=y CONFIG_EXT3_FS=y CONFIG_EXT3_DEFAULTS_TO_ORDERED=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y # CONFIG_EXT3_FS_SECURITY is not set CONFIG_EXT4_FS=y CONFIG_EXT4_FS_XATTR=y CONFIG_EXT4_FS_POSIX_ACL=y # CONFIG_EXT4_FS_SECURITY is not set # CONFIG_EXT4_DEBUG is not set CONFIG_FS_XIP=y CONFIG_JBD=y CONFIG_JBD2=y CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=y # CONFIG_REISERFS_CHECK is not set CONFIG_REISERFS_PROC_INFO=y CONFIG_REISERFS_FS_XATTR=y CONFIG_REISERFS_FS_POSIX_ACL=y # CONFIG_REISERFS_FS_SECURITY is not set CONFIG_JFS_FS=y CONFIG_JFS_POSIX_ACL=y # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set CONFIG_JFS_STATISTICS=y CONFIG_XFS_FS=y # CONFIG_XFS_QUOTA is not set CONFIG_XFS_POSIX_ACL=y CONFIG_XFS_RT=y # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set CONFIG_OCFS2_FS=y CONFIG_OCFS2_FS_O2CB=y CONFIG_OCFS2_DEBUG_MASKLOG=y # CONFIG_OCFS2_DEBUG_FS is not set CONFIG_BTRFS_FS=y CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_NILFS2_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y CONFIG_FILE_LOCKING=y CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y # CONFIG_FANOTIFY is not set CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set CONFIG_QUOTA_TREE=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS4_FS=y CONFIG_FUSE_FS=y # CONFIG_CUSE is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_NTFS_FS=y # CONFIG_NTFS_DEBUG is not set CONFIG_NTFS_RW=y # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_TMPFS_XATTR is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_CONFIGFS_FS=y CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_LOGFS is not set CONFIG_CRAMFS=y # CONFIG_SQUASHFS is not set # CONFIG_SQUASHFS_XATTR is not set # CONFIG_SQUASHFS_ZLIB is not set # CONFIG_SQUASHFS_LZO is not set # CONFIG_SQUASHFS_XZ is not set # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set # CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE is not set # CONFIG_VXFS_FS is not set CONFIG_MINIX_FS=y # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set CONFIG_ROMFS_FS=y CONFIG_ROMFS_BACKED_BY_BLOCK=y CONFIG_ROMFS_ON_BLOCK=y # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set # CONFIG_NFS_V4 is not set # CONFIG_ROOT_NFS is not set CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y # CONFIG_NFSD_V4 is not set CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y # CONFIG_CEPH_FS is not set CONFIG_CIFS=y CONFIG_CIFS_STATS=y CONFIG_CIFS_STATS2=y # CONFIG_CIFS_WEAK_PW_HASH is not set # CONFIG_CIFS_XATTR is not set # CONFIG_CIFS_DEBUG2 is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y CONFIG_BSD_DISKLABEL=y # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y CONFIG_LDM_DEBUG=y # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set CONFIG_NLS_CODEPAGE_850=y # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set CONFIG_NLS_CODEPAGE_936=y CONFIG_NLS_CODEPAGE_950=y # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set CONFIG_NLS_ISO8859_6=y # CONFIG_NLS_ISO8859_7 is not set CONFIG_NLS_ISO8859_9=y # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_DEFAULT_SECURITY="" CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y # CONFIG_CRYPTO_GF128MUL is not set CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_WORKQUEUE=y # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_GHASH is not set CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_MICHAEL_MIC=y # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y CONFIG_CRYPTO_TGR192=y CONFIG_CRYPTO_WP512=y # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_586=y CONFIG_CRYPTO_ANUBIS=y CONFIG_CRYPTO_ARC4=y CONFIG_CRYPTO_BLOWFISH=y CONFIG_CRYPTO_BLOWFISH_COMMON=y # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y CONFIG_CRYPTO_CAST6=y CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set CONFIG_CRYPTO_KHAZAD=y # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_586 is not set # CONFIG_CRYPTO_SEED is not set CONFIG_CRYPTO_SERPENT=y CONFIG_CRYPTO_TEA=y CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_TWOFISH_COMMON=y # CONFIG_CRYPTO_TWOFISH_586 is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_ZLIB is not set # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # CONFIG_CRYPTO_ANSI_CPRNG=y # CONFIG_CRYPTO_USER_API_HASH is not set # CONFIG_CRYPTO_USER_API_SKCIPHER is not set CONFIG_CRYPTO_HW=y # CONFIG_BINARY_PRINTF is not set # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_CRC_CCITT=y CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set CONFIG_CRC_ITU_T=y CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y # CONFIG_CRC8 is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_NLATTR=y # CONFIG_AVERAGE is not set # CONFIG_CORDIC is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 CONFIG_ENABLE_WARN_DEPRECATED=y CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=2048 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_DEBUG_KERNEL=y # CONFIG_DEBUG_SHIRQ is not set # CONFIG_LOCKUP_DETECTOR is not set # CONFIG_HARDLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set CONFIG_SCHED_DEBUG=y # CONFIG_SCHEDSTATS is not set # CONFIG_TIMER_STATS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_RT_MUTEX_TESTER is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_SPARSE_RCU_POINTER is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_KOBJECT is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_WRITECOUNT is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_LIST is not set # CONFIG_TEST_LIST_SORT is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_DEBUG_CREDENTIALS is not set CONFIG_FRAME_POINTER=y # CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # CONFIG_FAULT_INJECTION is not set # CONFIG_SYSCTL_SYSCALL_CHECK is not set # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_SAMPLES is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_GPROF is not set # CONFIG_GCOV is not set CONFIG_EARLY_PRINTK=y marionnet-0.90.6+bzr434.orig/uml/kernel/README0000600000175000017500000000507312167200764017524 0ustar lucaslucasThis directory contains patch files and .config files. .config files ------------- Each DOT-config-* file is specific to one certain kernel version -- the file name cleraly says which one. A DOT-config-* file should be renamed to .config and copied into the main directory of unpacked kernel sources. patch files ----------- We distribute patch files, hopefully applicable to several kernel versions, but named after a specific version we tested. History and current status --------------------------- Since unfortunately Jonathan Roudiere is no longer very active in the project, we (Luca Saiu and Jean-Vincent Loddo) have taken over maintenance. I (Luca Saiu) had the original idea and wrote the original ghostification kernel patch in 2007, against Linux 2.6.18; the idea of modifying the kernel in order to shield students from the frighteningly complex reality of X11 network communication started as a joke between me and Jean-Vincent; but then he encouraged me to actually do it, and of course I was happy to accept the challenge. When Jonathan joined the project (was it 2009 or 2010?) he ported my patch to more recent kernel versions, and in particular to the new internal network infrastructure. He also cleaned up the sources, correctly interfaced them to the Linux configuration system, rewrote from scratch the userland utilties (my version was just a hacked-up ifconfig), and generally made the code much more powerful. Jonathan released patches for Linux 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30, 2.6.31 and 2.6.32. Now in 2011 those versions have become old, and more importantly are starting to become problematic to compile on new hosts; that's why I've taken Jonathan's last patch and ported it to the most recent stable kernel available as of this writing, Linux 3.0.8. Of course the code changes rapidly, and some changes were required: for example the filed named "u" in struct rtable, defined in include/net/route.h, has been removed some versions ago; we used to use "u" to access its field "dst", but now dst is directly referred by a new pointer field in struct rtable. Even without studying the kernel code in detail as Jonathan did I've fixed some problems such as this, and the result seems to work reliably. I have not cleaned up the code unless it was necessary for building: what I have done until this moment is just porting work. In the future we plan to drop support for old kernel versions, but for the time being we prefer to keep the older patches around, since the latest one hasn't been tested much yet. Have fun with ghostification. -- Luca Saiu, October 2011 marionnet-0.90.6+bzr434.orig/uml/kernel/doc/0000700000175000017500000000000012167200764017402 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/kernel/doc/README0000600000175000017500000000162012167200764020263 0ustar lucaslucas# Written by Jonathan Roudiere in 2009. # To do: add copyright notice. Ghost-kernel-2.0 ================ Ghost-kernel-2.0 is a part of the Marionnet project, Ghostification sub-project has been initiated by Luca Saiu and taken back Jonathan Roudiere . Ghost-kernel-2.0 is just a shell encapsulating the pathing and building a ghostified Kernel (and providing the ghost2 user tool). It allows to help user to build Ghost kernel for Marionnet/UML or to your host and that all ;). For more information about ghostification see README.Ghostification. For more information about Marionnet project see its website at . Copyright and license precised in this archive are just relative to the Ghost patch and the ghost2 utility, about kernel copyright or documentation, etc ... see kernel archive or kernel.org website. marionnet-0.90.6+bzr434.orig/uml/kernel/doc/README.Ghostification0000600000175000017500000002422212167200764023237 0ustar lucaslucas# Written by Jonathan Roudiere in 2009. # To do: add copyright notice. # To do: update Informations about Ghostification support ========================================= 1. Authors 2. Ghostification support 3. What ghostification means 4. User interface 5. Limitations 6. Implementation 7. Implementation rationale 8. Contact information 9. License 1. Authors ========== Copyright (C) 2007 Luca Saiu (original author) Copyright (C) 2009 Jonathan Roudiere This patch is released under the GNU General Public License v2 or any later version published by the Free Software Foundation, Inc. See the added comments in the patch for information about who wrote what. 2. Ghostification support ========================= This project consists in a small kernel patch allowing the user to "ghostify" one or several network interfaces. This patch was originally developed for kernel 2.6.18, is now available for the following kernel versions : 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30, 2.6.31 (soon 2.6.32). 3. What ghostification means ============================ A network interface in "ghostified" state continues to operate as usual and can be normally employed by user applications for communication. Sockets can be opened and closed and packets are normally sent, received and routed. However a ghostified interface is different from a non-ghostified network interface in the following respects: * Its presence can not be *detected* by user processes: kernel ioctl's don't report the interface presence, and when they receive its name as parameter they fail as if the interface didn't exist, with -ENODEV. The /proc virtual filesystem doesn't contain references to its name. * Its configuration can't be *queried* by user processes: the kernel answers with an error when receiving any configuration query ioctl. Routes involving a ghostified interface are not shown to user processes, although they continue to be normally followed by the kernel. * Its configuration can't be *changed* by user processes: the network interface can't be disabled if currently enabled, or vice-versa. Its address (at all levels, from network down to hardware) can't be changed. Routes involving it cannot be added or removed. * Its configuration can't be *queried* or *changed* by user processes using the kernel netlink interface, so tools as iproute2 cann't obtain more information than ifconfig, route, etc (tools using ioctl request). * Packets received or emited by a ghostified interface cann't be catch through Netfilter (iptables). All Netfilter's hooks are skiped (ARP, Bridge, IPv4, IPv6 and Decnet). * Packets received by a ghostified interface are never copied to AF_PACKET sockets, so that user-level sniffers don't see any traffic when reading from a generic AF_PACKET socket associated to "all" network interfaces. * A ghostified interface can be "unghostified" (see below), after which its state reverts to normal. The implementation has been heavily tested only on Ethernet, loopback, bridge, TUN/TAP devices and dummy interface (and most of virtual interfaces) but is expected to work on any other kind of network interface. The code is architecture-idependent, SMP-safe and also works in User Mode Linux. 4. User interface ================= A normal network interface can be ghostified and a ghostified one can be "unghostified" with the new SIOCGIFGHOSTIFY and SIOCGIFUNGHOSTIFY ioctls. Both take the interface name as parameter and return 0 on success or a negative error code on failure, according to ioctl conventions (see file ghost_kernel_errors.txt for exact return error code for each case). On ghostification and unghostification some lines are written to the system log (only if messages are actived at build time), explaining what happened in an understandable way and listing the currently ghostified network interfaces. Configuration of the Ghostification can be done or adapted by using usual interface to configure the Linux Kernel (make *config); the maximum number of ghostified interface can be changed, the verbosity of messages which are displayed by the ghosfication engine (many or no messages) and the Netfilter support for the ghostification can be enabled or disabled for each hook level (IPv4, IPv6, ARP, Bridge and Decnet). A simple user-level program called "ghost2" is provided for convenience: it take the interface name and an option which specify if user wish to ghostify or unghostify the network interface (two little scripts called "ghostify" and "unghostify" are provided to keep compatibility with old versions). 5. Limitations ============== The current implementation imposes a fixed limit to the number of network interface which can be in ghostified state in any given moment. The limit is currently set to 9, but can be trivially raised by modifying the config of the kernel at build time (through make *config, under -> Networking -> Networking support -> Ghostification support). The implementation was tested on a network using IPv4 and IPv6. Some operations in more exoteric protocols might not be correctly filtered, and in particular the interface name could show up somewhere under /proc if such protocols were employed. In fact, some informations are available under /sys and /proc virtual filesystems. If iproute is used (or any tools using the Netlink interface of the Kernel) then user can notice that the index number of interfaces which are displayed are no contiguous. 6. Implementation ================= The implementation is failry simple and unobtrusive. Its bulk resides in net/core/dev.c, where a simple fixed-length array of fixed-length strings is defined, ghost_interface_names. Such structure is static and always accessed from the outside via is_a_ghost_interface_name() -- which makes changing the implementation fairly easy, should it ever be needed. Structure updates are performed only from within net/core/dev.c, which also contains what essentially is the full implementation of the new ioctls in ghostify_interface() and unghostify_interface(). Their common table lookup functionality is implemented in __lookup_ghost_interface_names(). Such functions (and their unlocked counterparts, where appliable) are of course all static. The data structure initialization is performed in netdev_boot_setup(), in net/core/dev.c . Critical sections are implemented with a spinlock (ghost_interface_spin_lock), and the only exported function, is_a_ghost_interface_name(), is reentrant. The behaviour of several ioctls has been modified according to the specification above, including all SIOCxIFxxx calls (see net/core/dev.c), and SIOCDELRT and SIOCADDRT (see net/ipv4/fib_frontend.c, net/ipv4/fib_trie.c, net/ipv4/fib_hash.c, net/ipv6/route.c). Many modifications just consist in the addition of a call to is_a_ghost_interface_name() within a conditional, making an operation fail when a ghostified interface is involved. Such updates pertain to many files under net/ . Similar modifications have the purpose of "filtering out" some lines displayed in files under /proc/ . A slightly more involved modification consists in making a file under /proc/net/dev_snmp6/ appear or disapper at ghostification or unghostification time. The implementation is in net/ipv6/addrconf.c and net/ipv6/proc.c . Sockets with address format AF_PACKET are dealt with in net/packet/af_packet.c . Modifications just consist in selective packet dropping, even if in several distinct cases. Multicast and memory-mapped devices are explicitly supported. Netfilter ghostification support is performed with a simple test in order to know if a network packet comes from or goes through a ghostified interface. It is possible to skip all Netfilter's hooks or just select some hooks in particular (skip not all but just some hooks may be incredibly inefficient and it is not recommended to use this method). The userspace utility ghost2 just uses ioctl request to do its work, it is a little and very stupid tool. For more informations see the following sources files, patch modify the following : include/linux/netdevice.h include/linux/sockios.h include/net/ghostdebug.h kernel/softirq.c net/Kconfig net/core/dev.c net/core/dev_mcast.c net/core/rtnetlink.c net/ipv4/arp.c net/ipv4/devinet.c net/ipv4/fib_frontend.c net/ipv4/fib_hash.c net/ipv4/fib_semantics.c net/ipv4/fib_trie.c net/ipv4/igmp.c net/ipv4/route.c net/ipv6/Kconfig net/ipv6/addrconf.c net/ipv6/ip6_fib.c net/ipv6/mcast.c net/ipv6/proc.c net/ipv6/route.c net/netfilter/core.c net/packet/af_packet.c 7. Implementation rationale =========================== The cleanest, most straightforward and also most efficient way of keeping track of which interface is currently ghostified would have been adding a new field to struct net_device, defined in include/linux/netdevice.h . Unfortunately such structure is exported to the user level, and even just appending a field to its end would have changed its size, breaking binary compatibility with user applications. We decided to fall back to a less efficient solution, which shouldn't however cause perceivable slowdowns because of the extremely small size of our fixed table. Even using a hash table would have probably been overkill for such a small structure, and could actually have resulted in higher access time. is_a_ghost_interface_name() has constant complexity, consisting (in the worst case) in MAX_GHOST_INTERFACES_NO string comparisons where all strings have size less than IFNAMSIZ (currently defined as 16 in in include/linux/if.h). Using a unique index (such as the ifindex field of struct net_device) instead of the interface name would have probably been less efficient, as many kernel structures and interfaces work with interface names expressed as strings. 8. Contact information ====================== For any bug report or comment, the author is reachable at the address : - (mailing list) - - 9. License ========== This patch and the ghost2 user tool are released under the GNU GPL v2 or later. marionnet-0.90.6+bzr434.orig/uml/kernel/doc/LICENSE0000600000175000017500000004310312167200764020412 0ustar lucaslucas GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. marionnet-0.90.6+bzr434.orig/uml/kernel/doc/INSTALL0000600000175000017500000002342012167200764020436 0ustar lucaslucas# Written by Jonathan Roudiere in 2009. # To do: add copyright notice. GHOST-KERNEL-2.0 ================ Abstract : Ghost-kernel contain a patch to some versions of the Linux Kernel and a tool called ghost2. This patch is intended to provide the ability to hide network interfaces to userspace from kernel space. The utility ghost2 is used to ghostify or unghostify network interfaces from userspace. To get more informations about Ghostification see README.Ghostification. 1. Standard build 2. Building using a config file 3. Adapt Build or Install 4. Building packages 1. Standard build ================= To build Linux Ghost Kernel and Ghost2, you need to have standard tools as those provided by binutils, coreutils, libc-dev, make, gcc, bzip2, tar, strip, some development library as ncurses, vde and libpcap ... but most systems provided them or packages to installed them. There aren't configuration script to build Kernel and Ghost2, all needs information must be provided on the make command line (or through a config file, see approriate section about it). NOte : this tarball cann't help you if you wish to build a Linux Ghost Kernel with modules (maybe next release will allow it). --- To know what are the available targets run : $> make help or $> make targets And you will seeing a list a targets with a comment for each. --- To know what is the default configuration (as path, etc ...) just run : $> make show-default-config But you can also use : $> make show-config In this case you see the same configuration (by default) but variables content are interpreted (ex : CONFIG_FILE=CONFIG-$(KERNEL_VERSION) will be shown like that : CONFIG_FILE=CONFIG-2.6.31). Some variables which will displayed are no used by the build system, they will be used for a next release ;), it most case variables that you could have needs are : - KERNEL_VERSION=2.6.x If you wish to built a particular version of the Ghost Kernel (patch for this version must be exist (look vs in kernel-patch if dir exist), by default the latest version of the kernel for which a patch exist will be built. - PREFIX=/path/to/usr standard option to change /usr directory (by /usr/local for example). - DESTDIR=/path To make installation in another root directory (for example, you can use DESTDIR variable in order to install ghost2 in a VM (for marionnet) which could be "mounted" in a directory on your host, to do that, run : $> mount -o loop /usr/share/marionnet/filesystem/vm.img /mnt $> make install-ghost2 DESTDIR=/mnt $> umount /mnt And the ghost2 is now installed on the VM. All others relevant variables are relative to the path of the installation and start by PATH_*, look for your needs with : $> make make show-config |grep PATH Generally their names are explicit (if not, their default definition can help you to know what their purpose). --- This tarball is intended to build two things : - The Linux Kernel patched for Ghotification and - the Ghost2 user tool But the Kernel is intended to be installed to your host, to Marionnet or as a UML kernel (User-Mode-Linux, a simple binary), it is need to use appropriate targets to do that. Standard step to build Kernel and user tool are the following (to build and install a kernel to Marionnet, adapt to your needs) : $> make download-kernel $> make untar-kernel $> make apply-patch $> make configure-kernel-marionnet $> make build-kernel-marionnet $> make pack-kernel-marionnet $> make install-kernel-marionnet $> make ghost2 $> make install-ghost2 If you don't use configuration file you can specify some information on the make commande line : $> make _TARGET_ KERNEL_VERSION=2.6.XX OTHER_VAR1=... OTHER_VAR2=... Remplace _TARGET_ by any target (build-*, install-*, pack*..). --- In fact, targets "all" and "install" are sufficient in most case, if it is need those targets will run all intermediary targets for you, so you can just use them like that : $> make all GHOST_TARGET=_target_ $> make install GHOST_TARGET=_target_ Just change "_target_" by "host", "marionnet" or "uml" according you wish to build a kernel for you host (interactive configuration), to Marionnet or to UML architecture (Marionnet is just an UML kernel with differents name and installing path). --- You must have an Internet connection to build Kernel (exept if Kernel sources have already be donwloaded). If you don't have Internet connection but you already have Kernel tarball then you can lie to the system by : Creating a directory called ./kernel-src in at the root of the sources of ghost-kernel-2.0 : $> mkdir kernel-src Move or copy the Kernel tarball in : $> cp /path/to/tarball/linux-2.6.XX.tar.bz2 ./kernel-src/ And created a directory called ./build with a file as shown below : $> mkdir build $> touch build/download-kernel-2.6.XX-done (Change XX by the kernel version that you wish used). --- Pack : when you built something - before installing a Linux Ghost Kernel or the Ghost2 usertool - a directory called "pack" is created and it contains all files which will be installed after. You can check in sub-directories of the pack directory files which will be installed and where they will be install (but path can be changed during installation by specify it on the make commande line). Pack directory contains subdirs to keep separate targets, and differents versions build (for kernels), the following directories (a part for example) are created : --- ghost2 `-- kernel-host-pack `-- 2.6.26 `-- 2.6.30 `-- usr ... ... `-- kernel-marionnet-pack `-- 2.6.26 ... `-- kernel-uml-pack `-- 2.6.26 ... Advantages to use a intermediary directories before installing files is that you can built (for example) several kernel versions and install them after. Example to install the Ghost Kernel version 2.6.30 to marionnet : $> make KERNEL_VERSION=2.6.27 install-kernel-marionnet If it is built then it will be build by running the previous command line. You can use "pack*" targets to create sereval binaries tarballs (but dist-binary-* do the same). 2. Build with a config file ============================ You can use a config file called CONFIGME in order to specify some variables definition. This file must be put on the root directory of this tarball. You can specify any variables (if some are not used by the build system then they will just be ignored). If you use a configuration file then at any time you can check your current configuration by running : $> make show-config --- If you modify Makefile to add, remove variables then run after : $> ./Makefile.d/update.sh to update part of the Makefile which read the CONFIGME configuration file, and that 's all. 3. Adapt Build or Install ========================= Modify Kernel default configuration : ------------------------------------- If you need to modify the configuration of the kernel which will be build for Marionnet or UML architecture then run : $> make configure-kernel-marionnet or $> make configure-kernel-uml this targets just copy a default config file in kernel tree, and run after : $> make configure-kernel KERN_ARCH=um Some messages will be displayed (to warn you because the kernel is already configured but no important things, just wait a little) and after the standard Kernel configuration interface will open and you can modify or adapt to your needs the default configuration provide for Marionnet or UML. When you have finished, just save, exit and build the kernel with : $> make build-kernel-marionnet or $> make build-kernel-uml Installing Kernel or ghost2 tool in a particular directory ---------------------------------------------------------- To install the product of any target in another directory you can use DESTDIR variable as below : $> make install* DESTDIR=/path/to/rootdir/ And all files will be installed under the specified directory (of course this doesn't change path where files are installed like /usr, /usr/doc/man, etc ...). Build a kernel 2.6.XX with a path to the kernel 2.6.YY ------------------------------------------------------ You can simply use KERNEL_VERSION and PATCH_VERSION to specify what is the version of the kernel that you want used and what is the patch version which you wish used ;) as below : $> make KERNEL_VERSION=2.6.XX PATCH_VERSION=2.6.YY build-kernel* Of course, you can have error or echec but it can be useful to adapt the patch for a newer version of the kernel. 4. Building packages ==================== To build Debian package you must install dpkg-dev and debhelper packages before (and dependancies). To build RPM package you must have rpmbuild. When you build packages the three following will be built : - marionnet-kernel-2.6.X - uml-kernel-2.6.X-ghost - ghost2 Build Debian packages --------------------- To build a Debian package just run (remplace XX by a version for which a patch exit) : $> make deb KERNEL_VERSION=2.6.XX And package will be build in the parent (../) directory. Packages build using this way will use a Kernel source from kernel.org (vanilla). If KERNEL_VERSION is not specified the Kernel build will be the latest for which a patch exist (like for other targets). Or you can also build package using Kernel sources provide by Debian (linux-source-2.6.XX package) by running : $> ./debian/rules binary or $> dpkg-buildpackage Kernel available by this second method are : 2.6.26 (lenny), 2.6.30 (squeeze) and 2.6.31 (sid). Apt sources.list file must contain appropriate url to donwload corresponding debian package. Build RPMs packages ------------------- To build RPMs packages just run : $> make c-rpm KERNEL_VERSION=2.6.XX or $> make c-rpm And package will be built in the parent (../) directory. Packages built using this way will use a Kernel sources from kernel.org (vanilla). If KERNEL_VERSION is not specified the Kernel built will be the latest for which a patch exist (like for other targets). marionnet-0.90.6+bzr434.orig/uml/kernel/doc/ghost_kernel_errors.fr.txt0000600000175000017500000000311612167200764024634 0ustar lucaslucasKernel code error : =================== La partie du code noyau qui a en charge les opérations de ghostification peut renvoyer différents code de retour lorsqu'elle rencontre un erreur. La (un)ghostification d'une interface ce fait à travers une requète ioctl(2), lors d'un echec l'appel ioctl place dans errno le numéro de l'erreur en question. Les différents code de retour sont : ------------------------------------ Lors d'une ghostification d'interface (fonct ghostify) : -------------------------------------------------------- EINVAL : Cette erreur est renvoyée lors le nom de l'interface que l'on désire ghostifier est trop long (plus grand que IFNAMSIZ) où de longueur nulle; cette erreur est également celle renvoyée par une requète ioctl() avec des paramètres incorrect donc lors de l'utilisation du binaire ghost2 cela traduit le fait que le noyau ne supporte pas les opérations de Ghostification (les autres cas étant pris en charge par le logiciel). EEXIST : Cette erreur est renvoyée lorsque l'interface est déjà ghostifiée. ENODEV : Cette erreur est renvoyée lorsque l'interface spécifiée n'existe pas (n'existe réellement pas ;). ENOMEM : Cette erreur est renvoyée lorsque le nombre maximum d'interfaces ghostifiées a été atteint. Lors de la dé-ghostification d'interface (fonct unghostify) : ------------------------------------------------------------- ENODEV : Cette erreur est renvoyée lorsque l'interface spécifiée n'existe pas (n'existe réellement pas ;). ESRCH : L'interface réseau n'est pas ghostifée. marionnet-0.90.6+bzr434.orig/uml/kernel/doc/ghost_kernel_errors.txt0000600000175000017500000000250312167200764024225 0ustar lucaslucasKernel code error : =================== Part of the kernel which has in charge the Ghost operations can return several error code when an error occurs. Ghostify or Unghostify a network interface (card) is done through a ioctl(2) request, on error ioctl request use errno to provide the number of the error. The differents error code which can be returned are : ----------------------------------------------------- During Ghostify operation : --------------------------- EINVAL - This error is returned when the name of the specified network card is too long (greater than IFNAMSIZ) or when the name has a null length. This error is also returned by a incorrect ioctl() request. With ghost2 this reflects the fact that the kernel doesn't supports the Ghost operations (because the other cases are handled by the program). EEXIST - This error occurs when the network card is already ghostified. ENODEV - This error is returned when the specified network card doesn't exist (really doesn't exist ;). ENOMEM - This error is returned when the max number of ghostified network cards has been reached. During Unghostify operation : ----------------------------- ENODEV - This error is returned when the specified network card doesn't exist (really doesn't exist ;). ESRCH - The network card is not ghositified. marionnet-0.90.6+bzr434.orig/uml/kernel/README.linux-3.0.%0000600000175000017500000000145012167200764021276 0ustar lucaslucasNotes about the compilation of the series 3.0.% ----------------------------------------------- The execution of the script "pupisto.kernel.sh 3.0.84" produces a linking error: arch/x86/include/asm/atomic64_32.h:72: undefined reference to `atomic64_set_386' similar to the errors fixed by the patches: linux-3.?.%.compile_with_ARCH_um_SUBARCH_i386.diff for the successive kernel series (3.2, 3.4, 3.6, 3.8). There is probably a work-around for this problem by changing some configuration options. Actually, if we generate the .config file with the function: create_kernel_config_from CONFIG-3.0.8 the compilation of 3.0.8 succeed (but 3.0.84 fails). However, we are not currently able to adapt the patch for the series 3.2 to the serie 3.0, neither find the .config options to fix. J.V. Loddo marionnet-0.90.6+bzr434.orig/uml/kernel/linux-3.2.%.add_include_resource_h.diff0000600000175000017500000000070712167200764025727 0ustar lucaslucasdiff -ruN linux-3.2.48--original/arch/um/os-Linux/start_up.c linux-3.2.48/arch/um/os-Linux/start_up.c --- linux-3.2.48--original/arch/um/os-Linux/start_up.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/arch/um/os-Linux/start_up.c 2013-07-01 11:37:13.000000000 +0200 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include marionnet-0.90.6+bzr434.orig/uml/kernel/linux-3.4.%.compile_with_ARCH_um_SUBARCH_i386.diff0000600000175000017500000000143012167200764027153 0ustar lucaslucas*** linux-3.2.13.original/arch/x86/um/Makefile 2012-03-19 17:03:17.000000000 +0100 --- linux-3.2.13.modified/arch/x86/um/Makefile 2013-04-30 18:09:48.000000000 +0200 *************** *** 19,25 **** obj-y += checksum_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o ! subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o subarch-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += ../lib/rwsem.o subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o --- 19,27 ---- obj-y += checksum_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o ! subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o \ ! ../lib/atomic64_386_32.o ../lib/cmpxchg8b_emu.o ! subarch-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += ../lib/rwsem.o subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o marionnet-0.90.6+bzr434.orig/uml/kernel/linux-3.6.%.compile_with_ARCH_um_SUBARCH_i386.diff0000600000175000017500000000143012167200764027155 0ustar lucaslucas*** linux-3.2.13.original/arch/x86/um/Makefile 2012-03-19 17:03:17.000000000 +0100 --- linux-3.2.13.modified/arch/x86/um/Makefile 2013-04-30 18:09:48.000000000 +0200 *************** *** 19,25 **** obj-y += checksum_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o ! subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o subarch-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += ../lib/rwsem.o subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o --- 19,27 ---- obj-y += checksum_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o ! subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o \ ! ../lib/atomic64_386_32.o ../lib/cmpxchg8b_emu.o ! subarch-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += ../lib/rwsem.o subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o marionnet-0.90.6+bzr434.orig/uml/kernel/CONFIG-3.0.80000600000175000017500000004600312167200764020176 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux Kernel Configuration # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_CMPXCHG_LOCAL is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set CONFIG_M686=y # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MELAN is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MCORE2 is not set # CONFIG_MATOM is not set # CONFIG_X86_GENERIC is not set CONFIG_X86_INTERNODE_CACHE_SHIFT=5 CONFIG_X86_CMPXCHG=y CONFIG_X86_L1_CACHE_SHIFT=5 CONFIG_X86_XADD=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=5 CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_CYRIX_32=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_CPU_SUP_TRANSMETA_32=y CONFIG_CPU_SUP_UMC_32=y CONFIG_UML_X86=y # CONFIG_64BIT is not set CONFIG_X86_32=y # CONFIG_X86_64 is not set # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_3_LEVEL_PGTABLES is not set CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y # CONFIG_SMP_BROKEN is not set CONFIG_GENERIC_HWEIGHT=y CONFIG_STATIC_LINK=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_COMPACTION is not set # CONFIG_PHYS_ADDR_T_64BIT is not set CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_NEED_PER_CPU_KM=y # CONFIG_CLEANCACHE is not set CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_STATIC=y CONFIG_BINFMT_ELF=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_HAVE_AOUT=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y CONFIG_KERNEL_STACK_ORDER=0 CONFIG_NO_DMA=y # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_CROSS_COMPILE="" CONFIG_LOCALVERSION="-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_DEFAULT_HOSTNAME="(none)" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_FHANDLE is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set CONFIG_HAVE_GENERIC_HARDIRQS=y # # IRQ subsystem # CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_IRQ_SHOW=y # # RCU Subsystem # CONFIG_TINY_RCU=y # CONFIG_PREEMPT_RCU is not set # CONFIG_RCU_TRACE is not set # CONFIG_TREE_RCU_TRACE is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_CGROUPS is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set CONFIG_NET_NS=y # CONFIG_SCHED_AUTOGROUP is not set CONFIG_SYSFS_DEPRECATED=y # CONFIG_SYSFS_DEPRECATED_V2 is not set # CONFIG_RELAY is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EXPERT is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y # CONFIG_EMBEDDED is not set # # Kernel Performance Events And Counters # CONFIG_VM_EVENT_COUNTERS=y CONFIG_COMPAT_BRK=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_PROFILING is not set # # GCOV-based kernel profiling # # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y CONFIG_LBDAF=y # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_DEFAULT_DEADLINE is not set CONFIG_DEFAULT_CFQ=y # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="cfq" # CONFIG_INLINE_SPIN_TRYLOCK is not set # CONFIG_INLINE_SPIN_TRYLOCK_BH is not set # CONFIG_INLINE_SPIN_LOCK is not set # CONFIG_INLINE_SPIN_LOCK_BH is not set # CONFIG_INLINE_SPIN_LOCK_IRQ is not set # CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set CONFIG_INLINE_SPIN_UNLOCK=y # CONFIG_INLINE_SPIN_UNLOCK_BH is not set CONFIG_INLINE_SPIN_UNLOCK_IRQ=y # CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set # CONFIG_INLINE_READ_TRYLOCK is not set # CONFIG_INLINE_READ_LOCK is not set # CONFIG_INLINE_READ_LOCK_BH is not set # CONFIG_INLINE_READ_LOCK_IRQ is not set # CONFIG_INLINE_READ_LOCK_IRQSAVE is not set CONFIG_INLINE_READ_UNLOCK=y # CONFIG_INLINE_READ_UNLOCK_BH is not set CONFIG_INLINE_READ_UNLOCK_IRQ=y # CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set # CONFIG_INLINE_WRITE_TRYLOCK is not set # CONFIG_INLINE_WRITE_LOCK is not set # CONFIG_INLINE_WRITE_LOCK_BH is not set # CONFIG_INLINE_WRITE_LOCK_IRQ is not set # CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set CONFIG_INLINE_WRITE_UNLOCK=y # CONFIG_INLINE_WRITE_UNLOCK_BH is not set CONFIG_INLINE_WRITE_UNLOCK_IRQ=y # CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set # CONFIG_MUTEX_SPIN_ON_OWNER is not set # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set # # DRBD disabled because PROC_FS, INET or CONNECTOR not selected # CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" # CONFIG_DEVTMPFS is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_UNIX=y CONFIG_XFRM=y # CONFIG_XFRM_USER is not set # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set # CONFIG_NET_KEY is not set CONFIG_INET=y # CONFIG_IP_MULTICAST is not set # CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set # CONFIG_ARPD is not set # CONFIG_SYN_COOKIES is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_TUNNEL is not set # CONFIG_INET_TUNNEL is not set CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set # CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set # CONFIG_NETFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_PHONET is not set # CONFIG_IEEE802154 is not set # CONFIG_NET_SCHED is not set # CONFIG_DCB is not set # CONFIG_BATMAN_ADV is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_WIRELESS=y # CONFIG_CFG80211 is not set # CONFIG_LIB80211 is not set # # CFG80211 needs to be enabled for MAC80211 # # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=8 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y # CONFIG_UML_NET_VDE is not set CONFIG_UML_NET_MCAST=y # CONFIG_UML_NET_PCAP is not set # CONFIG_UML_NET_SLIRP is not set CONFIG_NETDEVICES=y CONFIG_DUMMY=y # CONFIG_BONDING is not set # CONFIG_MACVLAN is not set # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_MII is not set # CONFIG_PHYLIB is not set CONFIG_WLAN=y # CONFIG_HOSTAP is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set # # CAIF transport drivers # CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y # CONFIG_EXT2_FS_XATTR is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_DEFAULTS_TO_ORDERED=y # CONFIG_EXT3_FS_XATTR is not set # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_REISERFS_FS=y # CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_FS_XATTR is not set # CONFIG_JFS_FS is not set # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_FS_POSIX_ACL is not set CONFIG_FILE_LOCKING=y CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y # CONFIG_FANOTIFY is not set CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QUOTA_DEBUG is not set # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y # CONFIG_ZISOFS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_TMPFS_XATTR is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_LOGFS is not set # CONFIG_CRAMFS is not set # CONFIG_SQUASHFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y # CONFIG_NFS_FS is not set # CONFIG_NFSD is not set # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_DEFAULT_SECURITY="" CONFIG_CRYPTO=y # # Crypto core or helper # # CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y # CONFIG_CRYPTO_MANAGER is not set # CONFIG_CRYPTO_MANAGER2 is not set # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set # CONFIG_CRYPTO_AUTHENC is not set # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # # CONFIG_CRYPTO_CBC is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # # CONFIG_CRYPTO_HMAC is not set # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # # CONFIG_CRYPTO_CRC32C is not set # CONFIG_CRYPTO_GHASH is not set # CONFIG_CRYPTO_MD4 is not set # CONFIG_CRYPTO_MD5 is not set # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set # CONFIG_CRYPTO_SHA1 is not set # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_586 is not set # CONFIG_CRYPTO_AES_NI_INTEL is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set # CONFIG_CRYPTO_DES is not set # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_586 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_586 is not set # # Compression # # CONFIG_CRYPTO_DEFLATE is not set # CONFIG_CRYPTO_ZLIB is not set # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # CONFIG_CRYPTO_ANSI_CPRNG=y # CONFIG_CRYPTO_USER_API_HASH is not set # CONFIG_CRYPTO_USER_API_SKCIPHER is not set CONFIG_CRYPTO_HW=y # CONFIG_BINARY_PRINTF is not set # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CRC_CCITT is not set # CONFIG_CRC16 is not set # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set # CONFIG_LIBCRC32C is not set # CONFIG_XZ_DEC is not set # CONFIG_XZ_DEC_BCJ is not set CONFIG_NLATTR=y # CONFIG_AVERAGE is not set # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set # CONFIG_MD is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 CONFIG_ENABLE_WARN_DEPRECATED=y CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_DEBUG_KERNEL=y # CONFIG_DEBUG_SHIRQ is not set # CONFIG_LOCKUP_DETECTOR is not set # CONFIG_HARDLOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set CONFIG_SCHED_DEBUG=y # CONFIG_SCHEDSTATS is not set # CONFIG_TIMER_STATS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_RT_MUTEX_TESTER is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_SPARSE_RCU_POINTER is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_KOBJECT is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_WRITECOUNT is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_LIST is not set # CONFIG_TEST_LIST_SORT is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_DEBUG_CREDENTIALS is not set CONFIG_FRAME_POINTER=y # CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # CONFIG_FAULT_INJECTION is not set # CONFIG_SYSCTL_SYSCALL_CHECK is not set # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_SAMPLES is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_GPROF is not set # CONFIG_GCOV is not set CONFIG_EARLY_PRINTK=y marionnet-0.90.6+bzr434.orig/uml/kernel/linux-3.7.%.compile_with_ARCH_um_SUBARCH_i386.diff0000600000175000017500000000143012167200764027156 0ustar lucaslucas*** linux-3.2.13.original/arch/x86/um/Makefile 2012-03-19 17:03:17.000000000 +0100 --- linux-3.2.13.modified/arch/x86/um/Makefile 2013-04-30 18:09:48.000000000 +0200 *************** *** 19,25 **** obj-y += checksum_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o ! subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o subarch-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += ../lib/rwsem.o subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o --- 19,27 ---- obj-y += checksum_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o ! subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o \ ! ../lib/atomic64_386_32.o ../lib/cmpxchg8b_emu.o ! subarch-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += ../lib/rwsem.o subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/0000700000175000017500000000000012167200764021610 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.31-ghost_debian.patch0000600000175000017500000030143012167200764027144 0ustar lucaslucasdiff -rNuad linux-2.6.31/include/linux/netdevice.h linux-2.6.31-ghost/include/linux/netdevice.h --- linux-2.6.31/include/linux/netdevice.h 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/include/linux/netdevice.h 2009-11-26 22:58:23.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -2001,4 +2003,12 @@ } #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_NETDEVICE_H */ diff -rNuad linux-2.6.31/include/linux/sockios.h linux-2.6.31-ghost/include/linux/sockios.h --- linux-2.6.31/include/linux/sockios.h 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/include/linux/sockios.h 2009-11-26 22:58:23.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,13 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNuad linux-2.6.31/include/net/ghostdebug.h linux-2.6.31-ghost/include/net/ghostdebug.h --- linux-2.6.31/include/net/ghostdebug.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6.31-ghost/include/net/ghostdebug.h 2009-11-26 22:58:23.000000000 +0000 @@ -0,0 +1,93 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg(msg,args...) +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost) " msg "\n", ##args) +#else +#define ghost_ptk(msg,args...) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -rNuad linux-2.6.31/kernel/softirq.c linux-2.6.31-ghost/kernel/softirq.c --- linux-2.6.31/kernel/softirq.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/kernel/softirq.c 2009-11-26 22:58:23.000000000 +0000 @@ -128,8 +128,11 @@ */ void _local_bh_enable(void) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); WARN_ON_ONCE(!irqs_disabled()); +#endif if (softirq_count() == SOFTIRQ_OFFSET) trace_softirqs_on((unsigned long)__builtin_return_address(0)); @@ -140,7 +143,10 @@ static inline void _local_bh_enable_ip(unsigned long ip) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq() || irqs_disabled()); +#endif #ifdef CONFIG_TRACE_IRQFLAGS local_irq_disable(); #endif diff -rNuad linux-2.6.31/net/Kconfig linux-2.6.31-ghost/net/Kconfig --- linux-2.6.31/net/Kconfig 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/Kconfig 2009-11-26 22:58:23.000000000 +0000 @@ -159,6 +159,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -256,4 +355,93 @@ source "net/rfkill/Kconfig" source "net/9p/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET diff -rNuad linux-2.6.31/net/core/dev.c linux-2.6.31-ghost/net/core/dev.c --- linux-2.6.31/net/core/dev.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/core/dev.c 2009-11-26 22:58:23.000000000 +0000 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -137,6 +140,230 @@ #define GRO_MAX_HEAD (MAX_HEADER + 128) /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -539,6 +766,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -2936,11 +3170,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -3009,6 +3252,10 @@ { const struct net_device_stats *stats = dev_get_stats(dev); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", dev->name, stats->rx_bytes, stats->rx_packets, @@ -4210,6 +4457,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = (short) dev_get_flags(dev); @@ -4280,6 +4537,17 @@ ops = dev->netdev_ops; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -4423,6 +4691,57 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ + /* * These ioctl calls: * - can be done by all. diff -rNuad linux-2.6.31/net/core/dev_mcast.c linux-2.6.31-ghost/net/core/dev_mcast.c --- linux-2.6.31/net/core/dev_mcast.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/core/dev_mcast.c 2009-11-26 22:58:23.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes for + * ghostification support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,9 @@ #include #include +#ifdef CONFIG_GHOSTIFICATION +#include +#endif /* CONFIG_GHOSTIFICATION */ /* * Device multicast list maintenance. @@ -167,7 +172,15 @@ netif_addr_lock_bh(dev); for (m = dev->mc_list; m; m = m->next) { int i; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information + in /proc about ghost interfaces */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Don't show any information in /proc " + "about ghostified interface"); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNuad linux-2.6.31/net/core/rtnetlink.c linux-2.6.31-ghost/net/core/rtnetlink.c --- linux-2.6.31/net/core/rtnetlink.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/core/rtnetlink.c 2009-11-26 22:58:23.000000000 +0000 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; @@ -106,7 +115,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].doit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -117,7 +129,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].dumpit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -460,6 +475,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -616,6 +637,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -690,6 +725,24 @@ idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -941,6 +994,18 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ if ((err = validate_linkmsg(dev, tb)) < 0) goto errout_dev; @@ -979,6 +1044,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1181,6 +1257,17 @@ dev = dev_get_by_index(net, ifm->ifi_index); if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ } else return -EINVAL; @@ -1235,6 +1322,8 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1270,6 +1359,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -1289,14 +1383,21 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; - +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ __rtnl_unlock(); rtnl = net->rtnl; err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); @@ -1328,6 +1429,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -1343,6 +1449,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); diff -rNuad linux-2.6.31/net/ipv4/arp.c linux-2.6.31-ghost/net/ipv4/arp.c --- linux-2.6.31/net/ipv4/arp.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/arp.c 2009-11-26 22:58:23.000000000 +0000 @@ -70,6 +70,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -116,6 +118,11 @@ struct neigh_table *clip_tbl_hook; #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1311,9 +1318,21 @@ } #endif sprintf(tbuf, "%pI4", n->primary_key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves +ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1324,9 +1343,21 @@ char tbuf[16]; sprintf(tbuf, "%pI4", n->key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -rNuad linux-2.6.31/net/ipv4/devinet.c linux-2.6.31-ghost/net/ipv4/devinet.c --- linux-2.6.31/net/ipv4/devinet.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/devinet.c 2009-11-26 22:58:23.000000000 +0000 @@ -23,6 +23,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -62,6 +65,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, @@ -448,6 +456,16 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ __in_dev_put(in_dev); @@ -497,6 +515,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -546,6 +575,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1169,6 +1204,15 @@ s_ip_idx = ip_idx = cb->args[1]; idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (idx > s_idx) diff -rNuad linux-2.6.31/net/ipv4/fib_frontend.c linux-2.6.31-ghost/net/ipv4/fib_frontend.c --- linux-2.6.31/net/ipv4/fib_frontend.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/fib_frontend.c 2009-11-26 22:58:23.000000000 +0000 @@ -6,6 +6,10 @@ * IPv4 Forwarding Information Base: FIB frontend. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -44,6 +48,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -450,6 +459,11 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct fib_config cfg; @@ -464,6 +478,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -472,12 +502,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = tb->tb_insert(tb, &cfg); else @@ -584,6 +620,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -606,6 +652,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -621,6 +677,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -633,7 +695,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -658,6 +720,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -rNuad linux-2.6.31/net/ipv4/fib_hash.c linux-2.6.31-ghost/net/ipv4/fib_hash.c --- linux-2.6.31/net/ipv4/fib_hash.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/fib_hash.c 2009-11-26 22:58:23.000000000 +0000 @@ -6,6 +6,11 @@ * IPv4 FIB: lookup engine and maintenance routines. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_hash_insert, bad + * field check in fib_seq_show). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -41,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static struct kmem_cache *fn_hash_kmem __read_mostly; @@ -396,6 +406,18 @@ if (IS_ERR(fi)) return PTR_ERR(fi); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_insert */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if (fz->fz_nent > (fz->fz_divisor<<1) && fz->fz_divisor < FZ_MAX_DIVISOR && (cfg->fc_dst_len == 32 || @@ -579,7 +601,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_delete */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != cfg->fc_tos) break; @@ -1021,19 +1053,39 @@ prefix = f->fn_key; mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); - if (fi) + if (fi) + { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) + { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, - "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - fi->fib_dev ? fi->fib_dev->name : "*", prefix, - fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, - mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), - fi->fib_window, - fi->fib_rtt >> 3, &len); - else + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); +#endif /* CONFIG_GHOSTIFICATION */ + } + else { seq_printf(seq, - "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); + } seq_printf(seq, "%*s\n", 127 - len, ""); out: return 0; diff -rNuad linux-2.6.31/net/ipv4/fib_semantics.c linux-2.6.31-ghost/net/ipv4/fib_semantics.c --- linux-2.6.31/net/ipv4/fib_semantics.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/fib_semantics.c 2009-11-26 22:58:23.000000000 +0000 @@ -11,6 +11,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -43,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -953,6 +961,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -rNuad linux-2.6.31/net/ipv4/fib_trie.c linux-2.6.31-ghost/net/ipv4/fib_trie.c --- linux-2.6.31/net/ipv4/fib_trie.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/fib_trie.c 2009-11-26 22:58:23.000000000 +0000 @@ -12,6 +12,12 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -80,6 +86,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1225,6 +1236,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1652,7 +1675,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2612,7 +2645,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2625,13 +2679,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -rNuad linux-2.6.31/net/ipv4/igmp.c linux-2.6.31-ghost/net/ipv4/igmp.c --- linux-2.6.31/net/ipv4/igmp.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/igmp.c 2009-11-26 22:58:23.000000000 +0000 @@ -68,6 +68,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -105,6 +107,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2387,8 +2394,18 @@ #endif if (state->in_dev->mc_list == im) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", + state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); + } +#else seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2550,14 +2567,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.31/net/ipv4/route.c linux-2.6.31-ghost/net/ipv4/route.c --- linux-2.6.31/net/ipv4/route.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/route.c 2009-11-26 22:58:23.000000000 +0000 @@ -55,6 +55,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -108,6 +111,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp) \ ((u32)(oldflp->fl4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) @@ -375,6 +383,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->u.dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->u.dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; int len; @@ -392,11 +408,11 @@ r->fl.fl4_tos, r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, r->u.dst.hh ? (r->u.dst.hh->hh_output == - dev_queue_xmit) : 0, + dev_queue_xmit) : 0, r->rt_spec_dst, &len); seq_printf(seq, "%*s\n", 127 - len, ""); - } + } return 0; } @@ -2833,8 +2849,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); } - if (rt->u.dst.dev) + if (rt->u.dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->u.dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); + } #ifdef CONFIG_NET_CLS_ROUTE if (rt->u.dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); @@ -2917,7 +2938,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -2939,6 +2960,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -2971,6 +3003,22 @@ if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->u.dst.dev) { + ghost_debugmsg("Net device is %s ",rt->u.dst.dev->name); + if (is_a_ghost_interface_name(rt->u.dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->u.dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ err = rt_fill_info(net, skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -2985,6 +3033,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -rNuad linux-2.6.31/net/ipv6/Kconfig linux-2.6.31-ghost/net/ipv6/Kconfig --- linux-2.6.31/net/ipv6/Kconfig 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/Kconfig 2009-11-26 22:58:23.000000000 +0000 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select INET6_XFRM_TUNNEL select XFRM_IPCOMP ---help--- @@ -105,7 +109,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -114,16 +118,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -132,7 +136,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -141,7 +145,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -150,14 +154,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -174,7 +178,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -rNuad linux-2.6.31/net/ipv6/addrconf.c linux-2.6.31-ghost/net/ipv6/addrconf.c --- linux-2.6.31/net/ipv6/addrconf.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/addrconf.c 2009-11-26 22:58:23.000000000 +0000 @@ -36,6 +36,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -81,6 +84,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -446,6 +454,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2151,6 +2239,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx, unsigned int plen) { @@ -2165,6 +2257,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -2979,6 +3080,22 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", + &ifp->addr, + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", &ifp->addr, ifp->idev->dev->ifindex, @@ -2986,6 +3103,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3193,6 +3312,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3210,7 +3333,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3259,6 +3384,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3296,6 +3425,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3464,6 +3602,12 @@ ANYCAST_ADDR, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3489,6 +3633,17 @@ ip_idx = 0; if ((idev = in6_dev_get(dev)) == NULL) goto cont; + +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + read_lock_bh(&idev->lock); switch (type) { case UNICAST_ADDR: @@ -3560,7 +3715,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3568,6 +3722,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3594,6 +3752,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((ifa = ipv6_get_ifaddr(net, addr, dev, 1)) == NULL) { err = -EADDRNOTAVAIL; goto errout; @@ -3802,6 +3971,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -3813,6 +3986,14 @@ read_lock(&dev_base_lock); idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if ((idev = in6_dev_get(dev)) == NULL) @@ -3840,7 +4021,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -rNuad linux-2.6.31/net/ipv6/ip6_fib.c linux-2.6.31-ghost/net/ipv6/ip6_fib.c --- linux-2.6.31/net/ipv6/ip6_fib.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/ip6_fib.c 2009-11-26 22:58:23.000000000 +0000 @@ -275,6 +275,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -320,7 +322,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -rNuad linux-2.6.31/net/ipv6/mcast.c linux-2.6.31-ghost/net/ipv6/mcast.c --- linux-2.6.31/net/ipv6/mcast.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/mcast.c 2009-11-26 22:59:37.000000000 +0000 @@ -24,6 +24,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -61,6 +65,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2440,6 +2449,20 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, + "%-4d %-15s %pi6 %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + &im->mca_addr, + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else seq_printf(seq, "%-4d %-15s %pi6 %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2447,6 +2470,7 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2601,6 +2625,20 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + &state->im->mca_addr, + &psf->sf_addr, + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else seq_printf(seq, "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2608,6 +2646,7 @@ &psf->sf_addr, psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.31/net/ipv6/proc.c linux-2.6.31-ghost/net/ipv6/proc.c --- linux-2.6.31/net/ipv6/proc.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/proc.c 2009-11-26 22:59:07.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,6 +31,16 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#endif /* CONFIG_GHOSTIFICATION */ + static int sockstat6_seq_show(struct seq_file *seq, void *v) { struct net *net = seq->private; @@ -200,6 +212,18 @@ return single_open_net(inode, file, snmp6_seq_show); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -207,6 +231,7 @@ .llseek = seq_lseek, .release = single_release_net, }; +#endif /* CONFIG_GHOSTIFICATION */ static int snmp6_dev_seq_show(struct seq_file *seq, void *v) { diff -rNuad linux-2.6.31/net/ipv6/route.c linux-2.6.31-ghost/net/ipv6/route.c --- linux-2.6.31/net/ipv6/route.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/route.c 2009-11-26 22:58:23.000000000 +0000 @@ -22,6 +22,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -60,6 +64,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1115,10 +1124,6 @@ return hoplimit; } -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1830,6 +1835,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2133,26 +2140,84 @@ return err; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2172,6 +2237,10 @@ + nla_total_size(sizeof(struct rta_cacheinfo)); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc + */ static int rt6_fill_node(struct net *net, struct sk_buff *skb, struct rt6_info *rt, struct in6_addr *dst, struct in6_addr *src, @@ -2183,6 +2252,19 @@ long expires; u32 table; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2290,10 +2372,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2307,6 +2405,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2452,6 +2552,17 @@ { struct seq_file *m = p_arg; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen); #ifdef CONFIG_IPV6_SUBTREES diff -rNuad linux-2.6.31/net/netfilter/core.c linux-2.6.31-ghost/net/netfilter/core.c --- linux-2.6.31/net/netfilter/core.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/netfilter/core.c 2009-11-26 23:00:16.000000000 +0000 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -22,6 +24,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -59,7 +66,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -169,7 +175,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { @@ -182,6 +339,9 @@ verdict >> NF_VERDICT_BITS)) goto next_hook; } +#ifdef CONFIG_GHOSTIFICATION_NETFILTER +unlock: +#endif rcu_read_unlock(); return ret; } diff -rNuad linux-2.6.31/net/packet/af_packet.c linux-2.6.31-ghost/net/packet/af_packet.c --- linux-2.6.31/net/packet/af_packet.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/packet/af_packet.c 2009-11-26 22:58:23.000000000 +0000 @@ -8,6 +8,7 @@ * Authors: Ross Biro * Fred N. van Kempen, * Alan Cox, + * Luca Saiu : Trivial changes for ghostification * * Fixes: * Alan Cox : verify_area() now used correctly @@ -84,6 +85,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -549,6 +555,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -670,6 +688,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -2420,17 +2450,38 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, - "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", - s, - atomic_read(&s->sk_refcnt), - s->sk_type, - ntohs(po->num), - po->ifindex, - po->running, - atomic_read(&s->sk_rmem_alloc), - sock_i_uid(s), - sock_i_ino(s) ); + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.32-ghost.patch0000600000175000017500000030142212167200764025644 0ustar lucaslucasdiff -rNuad linux-2.6.32/include/linux/netdevice.h linux-2.6.32-ghost/include/linux/netdevice.h --- linux-2.6.32/include/linux/netdevice.h 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/include/linux/netdevice.h 2009-12-05 12:34:40.000000000 +0100 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -2015,4 +2017,12 @@ } #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_NETDEVICE_H */ diff -rNuad linux-2.6.32/include/linux/sockios.h linux-2.6.32-ghost/include/linux/sockios.h --- linux-2.6.32/include/linux/sockios.h 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/include/linux/sockios.h 2009-12-05 12:34:40.000000000 +0100 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,13 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNuad linux-2.6.32/include/net/ghostdebug.h linux-2.6.32-ghost/include/net/ghostdebug.h --- linux-2.6.32/include/net/ghostdebug.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.32-ghost/include/net/ghostdebug.h 2009-12-05 12:34:40.000000000 +0100 @@ -0,0 +1,93 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg(msg,args...) +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost) " msg "\n", ##args) +#else +#define ghost_ptk(msg,args...) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -rNuad linux-2.6.32/kernel/softirq.c linux-2.6.32-ghost/kernel/softirq.c --- linux-2.6.32/kernel/softirq.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/kernel/softirq.c 2009-12-05 12:34:40.000000000 +0100 @@ -128,8 +128,11 @@ */ void _local_bh_enable(void) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); WARN_ON_ONCE(!irqs_disabled()); +#endif if (softirq_count() == SOFTIRQ_OFFSET) trace_softirqs_on((unsigned long)__builtin_return_address(0)); @@ -140,7 +143,10 @@ static inline void _local_bh_enable_ip(unsigned long ip) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq() || irqs_disabled()); +#endif #ifdef CONFIG_TRACE_IRQFLAGS local_irq_disable(); #endif diff -rNuad linux-2.6.32/net/core/dev.c linux-2.6.32-ghost/net/core/dev.c --- linux-2.6.32/net/core/dev.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/core/dev.c 2009-12-05 12:50:12.000000000 +0100 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -137,6 +140,230 @@ #define GRO_MAX_HEAD (MAX_HEADER + 128) /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -544,6 +771,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -2979,11 +3213,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -3052,6 +3295,10 @@ { const struct net_device_stats *stats = dev_get_stats(dev); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", dev->name, stats->rx_bytes, stats->rx_packets, @@ -4264,6 +4511,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = (short) dev_get_flags(dev); @@ -4334,6 +4591,17 @@ ops = dev->netdev_ops; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -4476,6 +4744,56 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ /* * These ioctl calls: * - can be done by all. diff -rNuad linux-2.6.32/net/core/dev_mcast.c linux-2.6.32-ghost/net/core/dev_mcast.c --- linux-2.6.32/net/core/dev_mcast.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/core/dev_mcast.c 2009-12-05 12:34:40.000000000 +0100 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes for + * ghostification support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,9 @@ #include #include +#ifdef CONFIG_GHOSTIFICATION +#include +#endif /* CONFIG_GHOSTIFICATION */ /* * Device multicast list maintenance. @@ -167,7 +172,15 @@ netif_addr_lock_bh(dev); for (m = dev->mc_list; m; m = m->next) { int i; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information + in /proc about ghost interfaces */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Don't show any information in /proc " + "about ghostified interface"); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNuad linux-2.6.32/net/core/rtnetlink.c linux-2.6.32-ghost/net/core/rtnetlink.c --- linux-2.6.32/net/core/rtnetlink.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/core/rtnetlink.c 2009-12-05 12:34:40.000000000 +0100 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; @@ -106,7 +115,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].doit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -117,7 +129,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].dumpit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -460,6 +475,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -615,6 +636,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -688,6 +723,24 @@ idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -920,6 +973,18 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ if ((err = validate_linkmsg(dev, tb)) < 0) goto errout_dev; @@ -958,6 +1023,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1168,6 +1244,17 @@ dev = dev_get_by_index(net, ifm->ifi_index); if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ } else return -EINVAL; @@ -1222,6 +1309,8 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1257,6 +1346,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -1276,14 +1370,21 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; - +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ __rtnl_unlock(); rtnl = net->rtnl; err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); @@ -1315,6 +1416,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -1330,6 +1436,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); diff -rNuad linux-2.6.32/net/ipv4/arp.c linux-2.6.32-ghost/net/ipv4/arp.c --- linux-2.6.32/net/ipv4/arp.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv4/arp.c 2009-12-05 12:34:40.000000000 +0100 @@ -70,6 +70,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -116,6 +118,11 @@ struct neigh_table *clip_tbl_hook; #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1311,9 +1318,21 @@ } #endif sprintf(tbuf, "%pI4", n->primary_key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves +ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1324,9 +1343,21 @@ char tbuf[16]; sprintf(tbuf, "%pI4", n->key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -rNuad linux-2.6.32/net/ipv4/devinet.c linux-2.6.32-ghost/net/ipv4/devinet.c --- linux-2.6.32/net/ipv4/devinet.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv4/devinet.c 2009-12-05 12:34:40.000000000 +0100 @@ -23,6 +23,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -62,6 +65,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, @@ -448,6 +456,16 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ __in_dev_put(in_dev); @@ -497,6 +515,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -546,6 +575,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1179,6 +1214,15 @@ s_ip_idx = ip_idx = cb->args[1]; idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (idx > s_idx) diff -rNuad linux-2.6.32/net/ipv4/fib_frontend.c linux-2.6.32-ghost/net/ipv4/fib_frontend.c --- linux-2.6.32/net/ipv4/fib_frontend.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv4/fib_frontend.c 2009-12-05 12:34:40.000000000 +0100 @@ -6,6 +6,10 @@ * IPv4 Forwarding Information Base: FIB frontend. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -44,6 +48,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -453,6 +462,11 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct fib_config cfg; @@ -467,6 +481,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -475,12 +505,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = tb->tb_insert(tb, &cfg); else @@ -587,6 +623,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -609,6 +655,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -624,6 +680,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -636,7 +698,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -661,6 +723,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -rNuad linux-2.6.32/net/ipv4/fib_hash.c linux-2.6.32-ghost/net/ipv4/fib_hash.c --- linux-2.6.32/net/ipv4/fib_hash.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv4/fib_hash.c 2009-12-05 12:34:40.000000000 +0100 @@ -6,6 +6,11 @@ * IPv4 FIB: lookup engine and maintenance routines. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_hash_insert, bad + * field check in fib_seq_show). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -41,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static struct kmem_cache *fn_hash_kmem __read_mostly; @@ -396,6 +406,18 @@ if (IS_ERR(fi)) return PTR_ERR(fi); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_insert */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if (fz->fz_nent > (fz->fz_divisor<<1) && fz->fz_divisor < FZ_MAX_DIVISOR && (cfg->fc_dst_len == 32 || @@ -579,7 +601,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_delete */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != cfg->fc_tos) break; @@ -1021,19 +1053,39 @@ prefix = f->fn_key; mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); - if (fi) + if (fi) + { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) + { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, - "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - fi->fib_dev ? fi->fib_dev->name : "*", prefix, - fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, - mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), - fi->fib_window, - fi->fib_rtt >> 3, &len); - else + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); +#endif /* CONFIG_GHOSTIFICATION */ + } + else { seq_printf(seq, - "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); + } seq_printf(seq, "%*s\n", 127 - len, ""); out: return 0; diff -rNuad linux-2.6.32/net/ipv4/fib_semantics.c linux-2.6.32-ghost/net/ipv4/fib_semantics.c --- linux-2.6.32/net/ipv4/fib_semantics.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv4/fib_semantics.c 2009-12-05 12:34:40.000000000 +0100 @@ -11,6 +11,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -43,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -953,6 +961,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -rNuad linux-2.6.32/net/ipv4/fib_trie.c linux-2.6.32-ghost/net/ipv4/fib_trie.c --- linux-2.6.32/net/ipv4/fib_trie.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv4/fib_trie.c 2009-12-05 12:34:40.000000000 +0100 @@ -12,6 +12,12 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -80,6 +86,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1206,6 +1217,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1633,7 +1656,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2593,7 +2626,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2606,13 +2660,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -rNuad linux-2.6.32/net/ipv4/igmp.c linux-2.6.32-ghost/net/ipv4/igmp.c --- linux-2.6.32/net/ipv4/igmp.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv4/igmp.c 2009-12-05 12:34:40.000000000 +0100 @@ -68,6 +68,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -105,6 +107,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2409,8 +2416,18 @@ #endif if (state->in_dev->mc_list == im) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", + state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); + } +#else seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2572,14 +2589,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.32/net/ipv4/route.c linux-2.6.32-ghost/net/ipv4/route.c --- linux-2.6.32/net/ipv4/route.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv4/route.c 2009-12-05 12:34:40.000000000 +0100 @@ -55,6 +55,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -108,6 +111,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp) \ ((u32)(oldflp->fl4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) @@ -375,6 +383,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->u.dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->u.dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; int len; @@ -392,11 +408,11 @@ r->fl.fl4_tos, r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, r->u.dst.hh ? (r->u.dst.hh->hh_output == - dev_queue_xmit) : 0, + dev_queue_xmit) : 0, r->rt_spec_dst, &len); seq_printf(seq, "%*s\n", 127 - len, ""); - } + } return 0; } @@ -2835,8 +2851,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); } - if (rt->u.dst.dev) + if (rt->u.dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->u.dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); + } #ifdef CONFIG_NET_CLS_ROUTE if (rt->u.dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); @@ -2919,7 +2940,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -2941,6 +2962,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -2973,6 +3005,22 @@ if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->u.dst.dev) { + ghost_debugmsg("Net device is %s ",rt->u.dst.dev->name); + if (is_a_ghost_interface_name(rt->u.dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->u.dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ err = rt_fill_info(net, skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -2987,6 +3035,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -rNuad linux-2.6.32/net/ipv6/addrconf.c linux-2.6.32-ghost/net/ipv6/addrconf.c --- linux-2.6.32/net/ipv6/addrconf.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv6/addrconf.c 2009-12-05 12:34:40.000000000 +0100 @@ -36,6 +36,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -81,6 +84,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -448,6 +456,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2155,6 +2243,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx, unsigned int plen) { @@ -2169,6 +2261,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -3000,6 +3101,22 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", + &ifp->addr, + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", &ifp->addr, ifp->idev->dev->ifindex, @@ -3007,6 +3124,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3214,6 +3333,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3231,7 +3354,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3280,6 +3405,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3317,6 +3446,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3485,6 +3623,12 @@ ANYCAST_ADDR, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3510,6 +3654,17 @@ ip_idx = 0; if ((idev = in6_dev_get(dev)) == NULL) goto cont; + +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + read_lock_bh(&idev->lock); switch (type) { case UNICAST_ADDR: @@ -3581,7 +3736,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3589,6 +3743,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3615,6 +3773,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((ifa = ipv6_get_ifaddr(net, addr, dev, 1)) == NULL) { err = -EADDRNOTAVAIL; goto errout; @@ -3823,6 +3992,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -3834,6 +4007,14 @@ read_lock(&dev_base_lock); idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if ((idev = in6_dev_get(dev)) == NULL) @@ -3861,7 +4042,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -rNuad linux-2.6.32/net/ipv6/ip6_fib.c linux-2.6.32-ghost/net/ipv6/ip6_fib.c --- linux-2.6.32/net/ipv6/ip6_fib.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv6/ip6_fib.c 2009-12-05 12:34:40.000000000 +0100 @@ -269,6 +269,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -314,7 +316,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -rNuad linux-2.6.32/net/ipv6/Kconfig linux-2.6.32-ghost/net/ipv6/Kconfig --- linux-2.6.32/net/ipv6/Kconfig 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv6/Kconfig 2009-12-05 12:34:40.000000000 +0100 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select INET6_XFRM_TUNNEL select XFRM_IPCOMP ---help--- @@ -105,7 +109,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -114,16 +118,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -132,7 +136,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -141,7 +145,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -150,14 +154,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -174,7 +178,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -rNuad linux-2.6.32/net/ipv6/mcast.c linux-2.6.32-ghost/net/ipv6/mcast.c --- linux-2.6.32/net/ipv6/mcast.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv6/mcast.c 2009-12-05 12:34:40.000000000 +0100 @@ -24,6 +24,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -61,6 +65,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2458,6 +2467,20 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, + "%-4d %-15s %pi6 %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + &im->mca_addr, + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else seq_printf(seq, "%-4d %-15s %pi6 %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2465,6 +2488,7 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2619,6 +2643,20 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + &state->im->mca_addr, + &psf->sf_addr, + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else seq_printf(seq, "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2626,6 +2664,7 @@ &psf->sf_addr, psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.32/net/ipv6/proc.c linux-2.6.32-ghost/net/ipv6/proc.c --- linux-2.6.32/net/ipv6/proc.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv6/proc.c 2009-12-05 12:34:40.000000000 +0100 @@ -9,6 +9,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,6 +31,16 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#endif /* CONFIG_GHOSTIFICATION */ + static int sockstat6_seq_show(struct seq_file *seq, void *v) { struct net *net = seq->private; @@ -200,6 +212,18 @@ return single_open_net(inode, file, snmp6_seq_show); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -207,6 +231,7 @@ .llseek = seq_lseek, .release = single_release_net, }; +#endif /* CONFIG_GHOSTIFICATION */ static int snmp6_dev_seq_show(struct seq_file *seq, void *v) { diff -rNuad linux-2.6.32/net/ipv6/route.c linux-2.6.32-ghost/net/ipv6/route.c --- linux-2.6.32/net/ipv6/route.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/ipv6/route.c 2009-12-05 12:34:40.000000000 +0100 @@ -22,6 +22,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -60,6 +64,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1115,10 +1124,6 @@ return hoplimit; } -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1830,6 +1835,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2133,26 +2140,84 @@ return err; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2172,6 +2237,10 @@ + nla_total_size(sizeof(struct rta_cacheinfo)); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc + */ static int rt6_fill_node(struct net *net, struct sk_buff *skb, struct rt6_info *rt, struct in6_addr *dst, struct in6_addr *src, @@ -2183,6 +2252,19 @@ long expires; u32 table; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2290,10 +2372,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2307,6 +2405,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2452,6 +2552,17 @@ { struct seq_file *m = p_arg; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen); #ifdef CONFIG_IPV6_SUBTREES diff -rNuad linux-2.6.32/net/Kconfig linux-2.6.32-ghost/net/Kconfig --- linux-2.6.32/net/Kconfig 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/Kconfig 2009-12-05 12:34:40.000000000 +0100 @@ -179,6 +179,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -276,4 +375,93 @@ source "net/rfkill/Kconfig" source "net/9p/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET diff -rNuad linux-2.6.32/net/netfilter/core.c linux-2.6.32-ghost/net/netfilter/core.c --- linux-2.6.32/net/netfilter/core.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/netfilter/core.c 2009-12-05 12:34:40.000000000 +0100 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -22,6 +24,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -59,7 +66,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -169,7 +175,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { @@ -182,6 +339,9 @@ verdict >> NF_VERDICT_BITS)) goto next_hook; } +#ifdef CONFIG_GHOSTIFICATION_NETFILTER +unlock: +#endif rcu_read_unlock(); return ret; } diff -rNuad linux-2.6.32/net/packet/af_packet.c linux-2.6.32-ghost/net/packet/af_packet.c --- linux-2.6.32/net/packet/af_packet.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32-ghost/net/packet/af_packet.c 2009-12-05 12:55:15.000000000 +0100 @@ -8,6 +8,7 @@ * Authors: Ross Biro * Fred N. van Kempen, * Alan Cox, + * Luca Saiu : Trivial changes for ghostification * * Fixes: * Alan Cox : verify_area() now used correctly @@ -84,6 +85,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -548,6 +554,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -670,6 +688,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -2415,17 +2445,38 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, - "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", - s, - atomic_read(&s->sk_refcnt), - s->sk_type, - ntohs(po->num), - po->ifindex, - po->running, - atomic_read(&s->sk_rmem_alloc), - sock_i_uid(s), - sock_i_ino(s)); + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.260000600000175000017500000005277512167200764023253 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.26 # Fri Nov 27 11:55:55 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # CONFIG_STATIC_LINK is not set # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set CONFIG_M686=y # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP2 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_GENERIC=y CONFIG_X86_CPU=y CONFIG_X86_CMPXCHG=y CONFIG_X86_L1_CACHE_SHIFT=7 CONFIG_X86_XADD=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_GOOD_APIC=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=4 CONFIG_X86_DEBUGCTLMSR=y CONFIG_UML_X86=y CONFIG_X86_32=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y # CONFIG_64BIT is not set # CONFIG_3_LEVEL_PGTABLES is not set CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y CONFIG_GENERIC_HWEIGHT=y CONFIG_ARCH_SUPPORTS_AOUT=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y # CONFIG_SPARSEMEM_STATIC is not set # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_RESOURCES_64BIT is not set CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y # CONFIG_HIGHMEM is not set CONFIG_KERNEL_STACK_ORDER=0 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_CGROUPS is not set # CONFIG_GROUP_SCHED is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_SYSCTL_SYSCALL_CHECK=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_COMPAT_BRK=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_ANON_INODES=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_MARKERS is not set # CONFIG_HAVE_OPROFILE is not set # CONFIG_HAVE_KPROBES is not set # CONFIG_HAVE_KRETPROBES is not set # CONFIG_HAVE_DMA_ATTRS is not set CONFIG_PROC_PAGE_MONITOR=y CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_LBD is not set # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_LSF is not set # CONFIG_BLK_DEV_BSG is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" CONFIG_CLASSIC_RCU=y CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # CONFIG_FW_LOADER is not set # CONFIG_SYS_HYPERVISOR is not set # # Networking # CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set # CONFIG_IP_VS is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y # # IP: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_RECENT=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_RAW=y # # Bridge: Netfilter Configuration # CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_BRIDGE=y CONFIG_VLAN_8021Q=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y # # Wireless # # CONFIG_CFG80211 is not set # CONFIG_WIRELESS_EXT is not set # CONFIG_MAC80211 is not set # CONFIG_IEEE80211 is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y CONFIG_NETDEVICES_MULTIQUEUE=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # CONFIG_IWLWIFI_LEDS is not set # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT2_FS_SECURITY=y # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4DEV_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BIND34=y CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_MANAGER=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # # CONFIG_CRYPTO_CRC32C is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # # CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_AES_586 is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_586 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_586 is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set CONFIG_CRYPTO_HW=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_PLIST=y CONFIG_HAS_DMA=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set # CONFIG_MD is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.27_x86_640000600000175000017500000005411112167200764024254 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.27 # Fri Nov 27 10:03:13 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # CONFIG_STATIC_LINK is not set # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set # CONFIG_M686 is not set # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set CONFIG_MK8=y # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP2 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_CPU=y # CONFIG_X86_CMPXCHG is not set CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_MINIMUM_CPU_FAMILY=3 CONFIG_X86_DEBUGCTLMSR=y CONFIG_UML_X86=y CONFIG_64BIT=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_3_LEVEL_PGTABLES=y # CONFIG_ARCH_HAS_SC_SIGNALS is not set # CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA is not set CONFIG_SMP_BROKEN=y CONFIG_GENERIC_HWEIGHT=y CONFIG_ARCH_SUPPORTS_AOUT=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y # CONFIG_SPARSEMEM_STATIC is not set # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_RESOURCES_64BIT=y CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y CONFIG_KERNEL_STACK_ORDER=1 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_CGROUPS is not set # CONFIG_GROUP_SCHED is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_COMPAT_BRK=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_ANON_INODES=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_MARKERS is not set # CONFIG_HAVE_OPROFILE is not set # CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set # CONFIG_HAVE_IOREMAP_PROT is not set # CONFIG_HAVE_KPROBES is not set # CONFIG_HAVE_KRETPROBES is not set # CONFIG_HAVE_ARCH_TRACEHOOK is not set # CONFIG_HAVE_DMA_ATTRS is not set # CONFIG_USE_GENERIC_SMP_HELPERS is not set # CONFIG_HAVE_CLK is not set CONFIG_PROC_PAGE_MONITOR=y # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" CONFIG_CLASSIC_RCU=y CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set # CONFIG_IP_VS is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y # # IP: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_RECENT=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_RAW=y # # Bridge: Netfilter Configuration # CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y # # Wireless # # CONFIG_CFG80211 is not set # CONFIG_WIRELESS_EXT is not set # CONFIG_MAC80211 is not set # CONFIG_IEEE80211 is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # CONFIG_IWLWIFI_LEDS is not set # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4DEV_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_MANAGER=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # # CONFIG_CRYPTO_CRC32C is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=y # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set CONFIG_CRYPTO_SALSA20_X86_64=y # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set CONFIG_CRYPTO_TWOFISH_COMMON=y CONFIG_CRYPTO_TWOFISH_X86_64=y # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set CONFIG_CRYPTO_HW=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_PLIST=y CONFIG_HAS_DMA=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y CONFIG_SYSCTL_SYSCALL_CHECK=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.290000600000175000017500000005576412167200764023257 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.29 # Fri Nov 27 12:37:56 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set CONFIG_M686=y # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_GENERIC=y CONFIG_X86_CPU=y CONFIG_X86_CMPXCHG=y CONFIG_X86_L1_CACHE_SHIFT=7 CONFIG_X86_XADD=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=4 CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_CYRIX_32=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR_32=y CONFIG_CPU_SUP_TRANSMETA_32=y CONFIG_CPU_SUP_UMC_32=y CONFIG_UML_X86=y # CONFIG_64BIT is not set CONFIG_X86_32=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y # CONFIG_RWSEM_GENERIC_SPINLOCK is not set # CONFIG_3_LEVEL_PGTABLES is not set CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y # CONFIG_SMP_BROKEN is not set CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_PHYS_ADDR_T_64BIT is not set CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_UNEVICTABLE_LRU=y CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_HAVE_AOUT=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y # CONFIG_HIGHMEM is not set CONFIG_KERNEL_STACK_ORDER=0 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set # # RCU Subsystem # CONFIG_CLASSIC_RCU=y # CONFIG_TREE_RCU is not set # CONFIG_PREEMPT_RCU is not set # CONFIG_TREE_RCU_TRACE is not set # CONFIG_PREEMPT_RCU_TRACE is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_GROUP_SCHED is not set # CONFIG_CGROUPS is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_NET_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_COMPAT_BRK=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_LBD is not set # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_COMPAT_NET_DEV_OPS=y CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y # CONFIG_NET_SCH_MULTIQ is not set CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_PHONET is not set CONFIG_FIB_RULES=y # CONFIG_WIRELESS is not set # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # CONFIG_IWLWIFI_LEDS is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_FILE_LOCKING=y # CONFIG_XFS_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_SQUASHFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y # CONFIG_SUNRPC_REGISTER_V4 is not set CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # # CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # # CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_AES_586 is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_586 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_586 is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_FIND_LAST_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_PLIST=y CONFIG_HAS_DMA=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_SYSCTL_SYSCALL_CHECK=y # # Tracers # # CONFIG_DYNAMIC_PRINTK_DEBUG is not set # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.18-ghost_debian.patch0000600000175000017500000010173512167200764027157 0ustar lucaslucasdiff -rNuadEb linux-source-2.6.18/arch/um/sys-i386/user-offsets.c linux-source-2.6.18-ghost/arch/um/sys-i386/user-offsets.c --- linux-source-2.6.18/arch/um/sys-i386/user-offsets.c 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/arch/um/sys-i386/user-offsets.c 2009-11-29 20:04:05.000000000 +0100 @@ -2,7 +2,8 @@ #include #include #include -#include +#include +//#include #include #define DEFINE(sym, val) \ @@ -11,6 +12,10 @@ #define DEFINE_LONGS(sym, val) \ asm volatile("\n->" #sym " %0 " #val : : "i" (val/sizeof(unsigned long))) +//#define offsetof(TYPE,MEMBER) ((size_t)&((TYPE*)0)->MEMBER) +#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) + + #define OFFSET(sym, str, mem) \ DEFINE(sym, offsetof(struct str, mem)); diff -rNuadEb linux-source-2.6.18/include/linux/netdevice.h linux-source-2.6.18-ghost/include/linux/netdevice.h --- linux-source-2.6.18/include/linux/netdevice.h 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/include/linux/netdevice.h 2009-11-29 20:04:05.000000000 +0100 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes + * for ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -1041,4 +1043,7 @@ #endif /* __KERNEL__ */ +/* Just check whether the given name belongs to the ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name); + #endif /* _LINUX_DEV_H */ diff -rNuadEb linux-source-2.6.18/include/linux/sockios.h linux-source-2.6.18-ghost/include/linux/sockios.h --- linux-source-2.6.18/include/linux/sockios.h 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/include/linux/sockios.h 2009-11-29 20:04:05.000000000 +0100 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes + * for ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,10 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNuadEb linux-source-2.6.18/net/core/dev.c linux-source-2.6.18-ghost/net/core/dev.c --- linux-source-2.6.18/net/core/dev.c 2009-11-05 04:47:10.000000000 +0100 +++ linux-source-2.6.18-ghost/net/core/dev.c 2009-11-29 20:04:05.000000000 +0100 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -118,6 +119,179 @@ #include #include + +/* The maximum number of ghost interfaces allowed at any given + time: */ +#define MAX_GHOST_INTERFACES_NO 8 + +/* A crude unsorted array of unique names, where "" stands for an + empty slot. Elements are so few that an hash table would be + overkill, and possibly also less efficient than this solution: */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +//static DEFINE_SPINLOCK(ghostification_spin_lock); +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for readers, + which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) +/* Lock re-enabling interrupts and restoring flags. This is for readers, + which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name){ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; // we found the given name in the i-th element + return -1; // we didn't find the given name in the array +} + +/* This is useful for debugging. It must be called in a critical + section. */ +static void __dump_ghost_interfaces(void){ + int i, number_of_ghost_interfaces = 0; + printk(KERN_DEBUG + "Ghost interfaces are now:\n"); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")){ + number_of_ghost_interfaces++; + printk(KERN_DEBUG "%i. %s\n", + number_of_ghost_interfaces, + ghost_interface_names[i]); + } + printk(KERN_DEBUG "There are now %i ghost interfaces. A maximum of %i can exist at any given time.\n", + number_of_ghost_interfaces, + MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name){ + /* Particular case: "" is *not* a ghost interface name, even if + it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name){ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name){ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)){ + printk(KERN_DEBUG + "The user asked to ghostify the interface %s, which has a name of length %i. Failing.\n", + interface_name, + name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } // if + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)){ + printk(KERN_DEBUG + "Could not ghostify the interface %s, because it\'s already ghost.\n", + interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } // if + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0){ + printk(KERN_DEBUG + "Could not ghostify the interface %s, because %i interfaces are already ghostified. Sorry.\n", + interface_name, + MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } // if + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], + interface_name); + + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name){ + int the_interface_index; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0){ + printk(KERN_DEBUG + "Could not unghostify the interface %s, because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } // if + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_name); + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +EXPORT_SYMBOL(is_a_ghost_interface_name); + + /* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. @@ -433,8 +607,13 @@ int __init netdev_boot_setup(char *str) { int ints[5]; + int i; struct ifmap map; + /* There are no ghost interfaces by default: */ + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; + str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) return 0; @@ -2044,11 +2223,16 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * unless they are ghostified. */ - total = 0; - for (dev = dev_base; dev; dev = dev->next) { + for (dev = dev_base; dev; dev = dev->next){ + /* Don't tell the user about ghost interfaces: just skip them: */ + if(is_a_ghost_interface_name(dev->name)){ + // printk(KERN_DEBUG "Skipping the ghost interface %s in SIOCGIFCONF\n", dev->name); + continue; + } for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -2111,7 +2295,7 @@ { if (dev->get_stats) { struct net_device_stats *stats = dev->get_stats(dev); - + if(! is_a_ghost_interface_name(dev->name)) seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", dev->name, stats->rx_bytes, stats->rx_packets, @@ -2492,6 +2676,10 @@ if (!dev) return -ENODEV; + if(is_a_ghost_interface_name(dev->name)){ + //printk(KERN_DEBUG "The user is performing a SIOCxIFxxx ioctl() on the ghost interface %s here; we make the call fail with -ENODEV\n", dev->name); + return -ENODEV; + } switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ @@ -2675,6 +2863,48 @@ */ switch (cmd) { + case SIOKLOG:{ + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + case SIOCGIFGHOSTIFY:{ + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG + "The user asked to ghostify the interface %s.\n", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + printk(KERN_DEBUG "Ok, %s was ghostified.\n", + interface_name); + else + printk(KERN_DEBUG "Failure in ghostification of %s\n", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY:{ + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG + "The user asked to unghostify the interface %s.\n", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + printk(KERN_DEBUG "Ok, %s was unghostified.\n", + interface_name); + else + printk(KERN_DEBUG "Failure in unghostification of %s\n", + interface_name); + return failure; + } /* * These ioctl calls: * - can be done by all. diff -rNuadEb linux-source-2.6.18/net/core/dev_mcast.c linux-source-2.6.18-ghost/net/core/dev_mcast.c --- linux-source-2.6.18/net/core/dev_mcast.c 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/net/core/dev_mcast.c 2009-11-29 20:04:05.000000000 +0100 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes + * for ghostification support * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -254,6 +256,9 @@ for (m = dev->mc_list; m; m = m->next) { int i; + /* Don't show information about ghost interfaces: */ + if(is_a_ghost_interface_name(dev->name)) + continue; seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNuadEb linux-source-2.6.18/net/ipv4/arp.c linux-source-2.6.18-ghost/net/ipv4/arp.c --- linux-source-2.6.18/net/ipv4/arp.c 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/net/ipv4/arp.c 2009-11-29 20:04:05.000000000 +0100 @@ -72,6 +72,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -1316,6 +1318,9 @@ } #endif sprintf(tbuf, "%u.%u.%u.%u", NIPQUAD(*(u32*)n->primary_key)); + /* Don't show anything in /proc if it involves ghost + interfaces: */ + if(! is_a_ghost_interface_name(dev->name)) seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); @@ -1329,6 +1334,9 @@ char tbuf[16]; sprintf(tbuf, "%u.%u.%u.%u", NIPQUAD(*(u32*)n->key)); + /* Don't show anything in /proc if it involves ghost + interfaces: */ + if(! is_a_ghost_interface_name(dev->name)) seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", dev ? dev->name : "*"); diff -rNuadEb linux-source-2.6.18/net/ipv4/fib_frontend.c linux-source-2.6.18-ghost/net/ipv4/fib_frontend.c --- linux-source-2.6.18/net/ipv4/fib_frontend.c 2009-11-05 04:47:11.000000000 +0100 +++ linux-source-2.6.18-ghost/net/ipv4/fib_frontend.c 2009-11-29 20:04:05.000000000 +0100 @@ -8,6 +8,8 @@ * Version: $Id: fib_frontend.c,v 1.26 2001/10/31 21:55:54 davem Exp $ * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes + * for ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -236,6 +238,9 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +/* A function implemented in net/core/dev.c: */ +int is_a_ghost_interface_name(const char *interface_name); + int ip_rt_ioctl(unsigned int cmd, void __user *arg) { int err; @@ -253,12 +258,27 @@ return -EPERM; if (copy_from_user(&r, arg, sizeof(struct rtentry))) return -EFAULT; + /* Forbid any action involving a ghost interface: */ + if(r.rt_dev != (char __user*)NULL){ + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; + if(copy_from_user(interface_name, r.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)){ + printk(KERN_DEBUG "The user aked to add a route involving the ghost interface %s. We make this operation fail\n", interface_name); + return -ENODEV; + } // if + } // block rtnl_lock(); err = fib_convert_rtentry(cmd, &req.nlh, &req.rtm, &rta, &r); if (err == 0) { if (cmd == SIOCDELRT) { struct fib_table *tb = fib_get_table(req.rtm.rtm_table); err = -ESRCH; + /* The function pointed by tb->tb_delete was also modified to deal + with ghost interfaces. Such function may be either + fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &req.rtm, &rta, &req.nlh, NULL); } else { diff -rNuadEb linux-source-2.6.18/net/ipv4/fib_hash.c linux-source-2.6.18-ghost/net/ipv4/fib_hash.c --- linux-source-2.6.18/net/ipv4/fib_hash.c 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/net/ipv4/fib_hash.c 2009-11-29 20:04:05.000000000 +0100 @@ -8,6 +8,8 @@ * Version: $Id: fib_hash.c,v 1.13 2001/10/31 21:55:54 davem Exp $ * * Authors: Alexey Kuznetsov, + * Luca Saiu (trivial changes + * for ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -576,6 +578,10 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; + if(is_a_ghost_interface_name(fi->fib_dev->name)){ + printk(KERN_DEBUG "Trying to delete a route involving the ghost device %s: we make this operation fail.\n", fi->fib_dev->name); + return -ENODEV; + } // if if (fa->fa_tos != tos) break; @@ -1018,6 +1024,8 @@ mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); if (fi) + { + if (! is_a_ghost_interface_name((const char*)fi->fib_dev)){ snprintf(bf, sizeof(bf), "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u", fi->fib_dev ? fi->fib_dev->name : "*", prefix, @@ -1025,11 +1033,16 @@ mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3); - else + seq_printf(seq, "%-127s\n", bf); + } // inner if + } // block + else{ snprintf(bf, sizeof(bf), "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0); seq_printf(seq, "%-127s\n", bf); + } + //seq_printf(seq, "%-127s\n", bf); out: return 0; } diff -rNuadEb linux-source-2.6.18/net/ipv4/fib_trie.c linux-source-2.6.18-ghost/net/ipv4/fib_trie.c --- linux-source-2.6.18/net/ipv4/fib_trie.c 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/net/ipv4/fib_trie.c 2009-11-29 20:04:05.000000000 +0100 @@ -12,6 +12,9 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (trivial changes + * for ghostification support) + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -1594,7 +1597,10 @@ list_for_each_entry(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - + if(is_a_ghost_interface_name(fi->fib_dev->name)){ + printk(KERN_DEBUG "Trying to delete a route involving the ghost device %s: we make this operation fail.\n", fi->fib_dev->name); + return -ENODEV; + } // if if (fa->fa_tos != tos) break; @@ -2432,6 +2438,9 @@ continue; if (fi) + { + if (! is_a_ghost_interface_name((const char*) + fi->fib_dev)) snprintf(bf, sizeof(bf), "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u", fi->fib_dev ? fi->fib_dev->name : "*", @@ -2442,6 +2451,7 @@ (fi->fib_advmss ? fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3); + } else snprintf(bf, sizeof(bf), "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u", diff -rNuadEb linux-source-2.6.18/net/ipv4/igmp.c linux-source-2.6.18-ghost/net/ipv4/igmp.c --- linux-source-2.6.18/net/ipv4/igmp.c 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/net/ipv4/igmp.c 2009-11-29 20:04:05.000000000 +0100 @@ -70,6 +70,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes + * for ghostification support */ #include @@ -2359,6 +2361,8 @@ #endif if (state->in_dev->mc_list == im) { + /* Don't show any info about ghost interfaces: */ + if(! is_a_ghost_interface_name(state->dev->name)) seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, state->dev->name, state->dev->mc_count, querier); } @@ -2535,6 +2539,8 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { + /* Don't show any info about ghost interfaces: */ + if(! is_a_ghost_interface_name(state->dev->name)) seq_printf(seq, "%3d %6.6s 0x%08x " "0x%08x %6lu %6lu\n", diff -rNuadEb linux-source-2.6.18/net/ipv4/route.c linux-source-2.6.18-ghost/net/ipv4/route.c --- linux-source-2.6.18/net/ipv4/route.c 2009-11-05 04:47:10.000000000 +0100 +++ linux-source-2.6.18-ghost/net/ipv4/route.c 2009-11-29 20:04:05.000000000 +0100 @@ -57,6 +57,8 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : Trivial changes for ghostification + * support * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -336,7 +338,10 @@ "Iface\tDestination\tGateway \tFlags\t\tRefCnt\tUse\t" "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); - else { + else + if(! is_a_ghost_interface_name((const char*) + ((struct rtable*)v)->u.dst.dev)) + { struct rtable *r = v; char temp[256]; diff -rNuadEb linux-source-2.6.18/net/ipv6/addrconf.c linux-source-2.6.18-ghost/net/ipv6/addrconf.c --- linux-source-2.6.18/net/ipv6/addrconf.c 2009-11-05 04:47:11.000000000 +0100 +++ linux-source-2.6.18-ghost/net/ipv6/addrconf.c 2009-11-29 20:04:05.000000000 +0100 @@ -38,6 +38,7 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support */ #include @@ -442,6 +443,77 @@ return idev; } +/* Utility procedure, needed for + {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). Return a pointer + to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name){ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless it's + already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name){ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + printk(KERN_DEBUG "Hiding /proc/net/dev_snmp6/%s...\n", + interface_name); + if(idev == NULL) // lookup failed + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry then + remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, + proc_net_devsnmp6); +#endif // #ifdef CONFIG_PROC_FS + return 0; + // return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless it's + already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name){ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + printk(KERN_DEBUG "Showing /proc/net/dev_snmp6/%s...\n", + interface_name); + if(idev == NULL) // lookup failed + return -EINVAL; + if(idev->dev == NULL) // I doubt this may happen... + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) // there isn't any /proc/net/dev_snmp6 + return -ENOENT; + if((proc_directory_entry = + create_proc_entry(interface_name, S_IRUGO, proc_net_devsnmp6)) + == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif // #ifdef CONFIG_PROC_FS + return 0; + // return snmp6_register_dev(idev); +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2704,6 +2776,8 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; + /* Don't show information about ghost interfaces: */ + if(! is_a_ghost_interface_name(ifp->idev->dev->name)) seq_printf(seq, NIP6_SEQFMT " %02x %02x %02x %02x %8s\n", NIP6(ifp->addr), diff -rNuadEb linux-source-2.6.18/net/ipv6/mcast.c linux-source-2.6.18-ghost/net/ipv6/mcast.c --- linux-source-2.6.18/net/ipv6/mcast.c 2009-11-05 04:47:11.000000000 +0100 +++ linux-source-2.6.18-ghost/net/ipv6/mcast.c 2009-11-29 20:04:05.000000000 +0100 @@ -26,6 +26,8 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support */ #include @@ -2404,6 +2406,8 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); + /* Don't show information about ghost interfaces: */ + if(! is_a_ghost_interface_name(state->dev->name)) seq_printf(seq, "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", state->dev->ifindex, state->dev->name, diff -rNuadEb linux-source-2.6.18/net/ipv6/proc.c linux-source-2.6.18-ghost/net/ipv6/proc.c --- linux-source-2.6.18/net/ipv6/proc.c 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/net/ipv6/proc.c 2009-11-29 20:04:05.000000000 +0100 @@ -11,6 +11,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes + * for ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -30,7 +32,11 @@ #include #ifdef CONFIG_PROC_FS -static struct proc_dir_entry *proc_net_devsnmp6; + +/* We don't want this to be static, as it has to be read at ghostifying + and unghostifying time: */ +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); static int fold_prot_inuse(struct proto *proto) { @@ -188,13 +194,16 @@ return single_open(file, snmp6_seq_show, PDE(inode)->data); } -static struct file_operations snmp6_seq_fops = { +/* This was originally static, but we need to make it + visible: */ +struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, .read = seq_read, .llseek = seq_lseek, .release = single_release, }; +EXPORT_SYMBOL(snmp6_seq_fops); int snmp6_register_dev(struct inet6_dev *idev) { diff -rNuadEb linux-source-2.6.18/net/ipv6/route.c linux-source-2.6.18-ghost/net/ipv6/route.c --- linux-source-2.6.18/net/ipv6/route.c 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/net/ipv6/route.c 2009-11-29 20:04:05.000000000 +0100 @@ -22,6 +22,8 @@ * routers in REACHABLE, STALE, DELAY or PROBE states). * - always select the same router if it is (probably) * reachable. otherwise, round-robin the list. + * Luca Saiu + * trivial changes for ghostification support */ #include @@ -2045,6 +2047,11 @@ struct rt6_proc_arg *arg = (struct rt6_proc_arg *) p_arg; int i; + /* Do nothing is this route involves a ghost interface: */ + if(rt->rt6i_dev != NULL) // can't use &&: evaluation order is undefined + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) + return 0; + if (arg->skip < arg->offset / RT6_INFO_LEN) { arg->skip++; return 0; diff -rNuadEb linux-source-2.6.18/net/packet/af_packet.c linux-source-2.6.18-ghost/net/packet/af_packet.c --- linux-source-2.6.18/net/packet/af_packet.c 2006-09-20 05:42:06.000000000 +0200 +++ linux-source-2.6.18-ghost/net/packet/af_packet.c 2009-11-29 20:04:05.000000000 +0100 @@ -41,6 +41,8 @@ * will simply extend the hardware address * byte arrays at the end of sockaddr_ll * and packet_mreq. + * Luca Saiu : Trivial changes for ghostification + * support * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -468,6 +470,12 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; + /* Drop packets involving ghost interfaces: we don't want the user + to be able to sniff them: */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) + goto drop; + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -576,6 +584,11 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; + /* Drop packets involving ghost interfaces: we don't want the user + to be able to sniff them: */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) + goto drop; sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -1875,6 +1888,9 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); + /* Don't show packets involving ghost devices: */ + struct net_device *net_device = dev_get_by_index(po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) seq_printf(seq, "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", s, marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.28_x86_640000600000175000017500000005473512167200764024271 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.28 # Fri Nov 27 09:58:17 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set # CONFIG_M686 is not set # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set CONFIG_MK8=y # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_CPU=y # CONFIG_X86_CMPXCHG is not set CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=3 CONFIG_X86_DEBUGCTLMSR=y CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR_64=y # CONFIG_X86_DS is not set CONFIG_UML_X86=y CONFIG_64BIT=y # CONFIG_X86_32 is not set # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_3_LEVEL_PGTABLES=y # CONFIG_ARCH_HAS_SC_SIGNALS is not set # CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA is not set CONFIG_SMP_BROKEN=y CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_RESOURCES_64BIT=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_UNEVICTABLE_LRU=y CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y CONFIG_KERNEL_STACK_ORDER=1 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_CGROUPS is not set # CONFIG_GROUP_SCHED is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_COMPAT_BRK=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_ANON_INODES=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_MARKERS is not set # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" CONFIG_CLASSIC_RCU=y # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y # CONFIG_NET_SCH_MULTIQ is not set CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_PHONET is not set CONFIG_FIB_RULES=y # CONFIG_WIRELESS is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # CONFIG_IWLWIFI_LEDS is not set # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_FILE_LOCKING=y # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y # CONFIG_SUNRPC_REGISTER_V4 is not set CONFIG_RPCSEC_GSS_KRB5=y # CONFIG_RPCSEC_GSS_SPKM3 is not set # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # # CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # # CONFIG_CRYPTO_CRC32C is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=y # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set CONFIG_CRYPTO_SALSA20_X86_64=y # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set CONFIG_CRYPTO_TWOFISH_COMMON=y CONFIG_CRYPTO_TWOFISH_X86_64=y # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_PLIST=y CONFIG_HAS_DMA=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_SYSCTL_SYSCALL_CHECK=y # # Tracers # # CONFIG_DYNAMIC_PRINTK_DEBUG is not set # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.29_x86_640000600000175000017500000005443012167200764024262 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.29 # Fri Nov 27 10:09:30 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set # CONFIG_M686 is not set # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set CONFIG_MK8=y # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_CPU=y # CONFIG_X86_CMPXCHG is not set CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=3 CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR_64=y CONFIG_UML_X86=y CONFIG_64BIT=y # CONFIG_X86_32 is not set # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_3_LEVEL_PGTABLES=y # CONFIG_ARCH_HAS_SC_SIGNALS is not set # CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA is not set CONFIG_SMP_BROKEN=y CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_UNEVICTABLE_LRU=y CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y CONFIG_KERNEL_STACK_ORDER=1 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set # # RCU Subsystem # CONFIG_CLASSIC_RCU=y # CONFIG_TREE_RCU is not set # CONFIG_PREEMPT_RCU is not set # CONFIG_TREE_RCU_TRACE is not set # CONFIG_PREEMPT_RCU_TRACE is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_GROUP_SCHED is not set # CONFIG_CGROUPS is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_NET_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_COMPAT_BRK=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_COMPAT_NET_DEV_OPS=y CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y # CONFIG_NET_SCH_MULTIQ is not set CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_PHONET is not set CONFIG_FIB_RULES=y # CONFIG_WIRELESS is not set # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # CONFIG_IWLWIFI_LEDS is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_FILE_LOCKING=y # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set # CONFIG_MISC_FILESYSTEMS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y # CONFIG_SUNRPC_REGISTER_V4 is not set CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # # CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=y # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set CONFIG_CRYPTO_SALSA20_X86_64=y # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set CONFIG_CRYPTO_TWOFISH_COMMON=y CONFIG_CRYPTO_TWOFISH_X86_64=y # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_FIND_LAST_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_PLIST=y CONFIG_HAS_DMA=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_SYSCTL_SYSCALL_CHECK=y # # Tracers # # CONFIG_DYNAMIC_PRINTK_DEBUG is not set # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.32_x86_640000600000175000017500000005675412167200764024267 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.32 # Sat Dec 5 12:29:27 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set # CONFIG_M686 is not set # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set CONFIG_MK8=y # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_MATOM is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_CPU=y CONFIG_X86_L1_CACHE_BYTES=64 CONFIG_X86_INTERNODE_CACHE_BYTES=64 # CONFIG_X86_CMPXCHG is not set CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=3 CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_UML_X86=y CONFIG_64BIT=y # CONFIG_X86_32 is not set # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_3_LEVEL_PGTABLES=y # CONFIG_ARCH_HAS_SC_SIGNALS is not set # CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA is not set CONFIG_SMP_BROKEN=y CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_HAVE_MLOCK=y CONFIG_HAVE_MLOCKED_PAGE_BIT=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y CONFIG_KERNEL_STACK_ORDER=1 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_TREE_PREEMPT_RCU is not set # CONFIG_RCU_TRACE is not set CONFIG_RCU_FANOUT=32 # CONFIG_RCU_FANOUT_EXACT is not set # CONFIG_TREE_RCU_TRACE is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_GROUP_SCHED is not set # CONFIG_CGROUPS is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_NET_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y # # Kernel Performance Events And Counters # CONFIG_VM_EVENT_COUNTERS=y CONFIG_COMPAT_BRK=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # # GCOV-based kernel profiling # CONFIG_SLOW_WORK=y # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" # CONFIG_DEVTMPFS is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_HL=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_HL=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_PHONET is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y # CONFIG_NET_SCH_MULTIQ is not set CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y # CONFIG_WIRELESS is not set # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_WLAN is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_DEFAULTS_TO_ORDERED=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set CONFIG_FILE_LOCKING=y CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_SQUASHFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y # CONFIG_NFS_V4_1 is not set CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set CONFIG_CRYPTO_WORKQUEUE=y # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_GHASH is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # # CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_AES_X86_64 is not set # CONFIG_CRYPTO_AES_NI_INTEL is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_X86_64 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_X86_64 is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_ZLIB is not set # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # CONFIG_BINARY_PRINTF is not set # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_FIND_LAST_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_HAS_DMA=y CONFIG_NLATTR=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_LOG_USERSPACE is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_SYSCTL_SYSCALL_CHECK=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.180000600000175000017500000004305112167200764023237 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.18 # Thu May 22 13:25:50 2008 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_IRQ_RELEASE_METHOD=y # # UML-specific options # # CONFIG_MODE_TT is not set # CONFIG_STATIC_LINK is not set CONFIG_MODE_SKAS=y # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set CONFIG_M586MMX=y # CONFIG_M686 is not set # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP2 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set CONFIG_X86_GENERIC=y CONFIG_X86_CMPXCHG=y CONFIG_X86_XADD=y CONFIG_X86_L1_CACHE_SHIFT=7 CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_F00F_BUG=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_ALIGNMENT_16=y CONFIG_X86_GOOD_APIC=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_TSC=y CONFIG_UML_X86=y # CONFIG_64BIT is not set CONFIG_SEMAPHORE_SLEEPERS=y # CONFIG_HOST_2G_2G is not set CONFIG_TOP_ADDR=0xc0000000 # CONFIG_3_LEVEL_PGTABLES is not set CONFIG_STUB_CODE=0xbfffe000 CONFIG_STUB_DATA=0xbffff000 CONFIG_STUB_START=0xbfffe000 CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y CONFIG_GENERIC_HWEIGHT=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y # CONFIG_SPARSEMEM_STATIC is not set CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_RESOURCES_64BIT is not set CONFIG_LD_SCRIPT_DYN=y CONFIG_NET=y CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y CONFIG_NEST_LEVEL=0 # CONFIG_HIGHMEM is not set CONFIG_KERNEL_STACK_ORDER=2 CONFIG_UML_REAL_TIME_CLOCK=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 # # General setup # CONFIG_LOCALVERSION="-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_RELAY=y CONFIG_INITRAMFS_SOURCE="" # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SHMEM=y CONFIG_SLAB=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_RT_MUTEXES=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_SLOB is not set # # Loadable module support # # CONFIG_MODULES is not set # # Block layer # CONFIG_LBD=y # CONFIG_BLK_DEV_IO_TRACE is not set CONFIG_LSF=y # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" # # Block devices # CONFIG_BLK_DEV_UBD=y CONFIG_BLK_DEV_UBD_SYNC=y CONFIG_BLK_DEV_COW_COMMON=y # CONFIG_MMAPPER is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 CONFIG_BLK_DEV_INITRD=y CONFIG_ATA_OVER_ETH=y # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pty" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 # CONFIG_WATCHDOG is not set # CONFIG_UML_SOUND is not set # CONFIG_SOUND is not set # CONFIG_HOSTAUDIO is not set CONFIG_UML_RANDOM=y # # Generic Driver Options # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # CONFIG_FW_LOADER is not set # CONFIG_SYS_HYPERVISOR is not set # # Networking # # # Networking options # # CONFIG_NETDEBUG is not set CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y CONFIG_NET_KEY=y CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y # CONFIG_IP_ROUTE_FWMARK is not set CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_MULTIPATH_CACHED=y CONFIG_IP_ROUTE_MULTIPATH_RR=y CONFIG_IP_ROUTE_MULTIPATH_RANDOM=y CONFIG_IP_ROUTE_MULTIPATH_WRANDOM=y CONFIG_IP_ROUTE_MULTIPATH_DRR=y CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_RARP=y CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y CONFIG_IP_PIMSM_V1=y # CONFIG_IP_PIMSM_V2 is not set CONFIG_ARPD=y # CONFIG_SYN_COOKIES is not set CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_ADVANCED=y # # TCP congestion control # CONFIG_TCP_CONG_BIC=y CONFIG_TCP_CONG_CUBIC=y CONFIG_TCP_CONG_WESTWOOD=y CONFIG_TCP_CONG_HTCP=y CONFIG_TCP_CONG_HSTCP=y CONFIG_TCP_CONG_HYBLA=y CONFIG_TCP_CONG_VEGAS=y CONFIG_TCP_CONG_SCALABLE=y CONFIG_TCP_CONG_LP=y CONFIG_TCP_CONG_VENO=y # # IP: Virtual Server Configuration # # CONFIG_IP_VS is not set CONFIG_IPV6=y CONFIG_IPV6_PRIVACY=y CONFIG_IPV6_ROUTER_PREF=y # CONFIG_IPV6_ROUTE_INFO is not set CONFIG_INET6_AH=y CONFIG_INET6_ESP=y CONFIG_INET6_IPCOMP=y CONFIG_INET6_XFRM_TUNNEL=y CONFIG_INET6_TUNNEL=y CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_IPV6_TUNNEL=y # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_REALM=y CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y # # IP: Netfilter Configuration # CONFIG_IP_NF_CONNTRACK=y CONFIG_IP_NF_CT_ACCT=y CONFIG_IP_NF_CONNTRACK_MARK=y CONFIG_IP_NF_CONNTRACK_EVENTS=y CONFIG_IP_NF_CONNTRACK_NETLINK=y CONFIG_IP_NF_CT_PROTO_SCTP=y CONFIG_IP_NF_FTP=y CONFIG_IP_NF_IRC=y CONFIG_IP_NF_NETBIOS_NS=y CONFIG_IP_NF_TFTP=y CONFIG_IP_NF_AMANDA=y CONFIG_IP_NF_PPTP=y CONFIG_IP_NF_H323=y CONFIG_IP_NF_SIP=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_IPRANGE=y CONFIG_IP_NF_MATCH_TOS=y CONFIG_IP_NF_MATCH_RECENT=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_DSCP=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_MATCH_OWNER=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_HASHLIMIT=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_IP_NF_TARGET_TCPMSS=y CONFIG_IP_NF_NAT=y CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_SAME=y CONFIG_IP_NF_NAT_SNMP_BASIC=y CONFIG_IP_NF_NAT_IRC=y CONFIG_IP_NF_NAT_FTP=y CONFIG_IP_NF_NAT_TFTP=y CONFIG_IP_NF_NAT_AMANDA=y CONFIG_IP_NF_NAT_PPTP=y CONFIG_IP_NF_NAT_H323=y CONFIG_IP_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_TOS=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_DSCP=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration (EXPERIMENTAL) # # CONFIG_IP6_NF_QUEUE is not set CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_OWNER=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_RAW=y # # Bridge: Netfilter Configuration # CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y # # DCCP Configuration (EXPERIMENTAL) # # CONFIG_IP_DCCP is not set # # SCTP Configuration (EXPERIMENTAL) # CONFIG_IP_SCTP=y # CONFIG_SCTP_DBG_MSG is not set # CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_SCTP_HMAC_NONE is not set # CONFIG_SCTP_HMAC_SHA1 is not set CONFIG_SCTP_HMAC_MD5=y # # TIPC Configuration (EXPERIMENTAL) # # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_BRIDGE=y CONFIG_VLAN_8021Q=y # CONFIG_DECNET is not set CONFIG_LLC=y # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # # QoS and/or fair queueing # # CONFIG_NET_SCHED is not set CONFIG_NET_CLS_ROUTE=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_IRDA is not set # CONFIG_BT is not set CONFIG_IEEE80211=y # CONFIG_IEEE80211_DEBUG is not set CONFIG_IEEE80211_CRYPT_WEP=y CONFIG_IEEE80211_CRYPT_CCMP=y CONFIG_IEEE80211_SOFTMAC=y # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set CONFIG_WIRELESS_EXT=y # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y # # Network device support # CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_BONDING=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # # PHY device support # # # Wireless LAN (non-hamradio) # # CONFIG_NET_RADIO is not set # # Wan interfaces # # CONFIG_WAN is not set CONFIG_PPP=y CONFIG_PPP_MULTILINK=y CONFIG_PPP_FILTER=y CONFIG_PPP_ASYNC=y CONFIG_PPP_SYNC_TTY=y CONFIG_PPP_DEFLATE=y CONFIG_PPP_BSDCOMP=y CONFIG_PPP_MPPE=y CONFIG_PPPOE=y CONFIG_SLIP=y CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y CONFIG_SLIP_MODE_SLIP6=y CONFIG_SHAPER=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # # Connector - unified userspace <-> kernelspace linker # CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set CONFIG_EXT2_FS_XIP=y CONFIG_FS_XIP=y CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y # CONFIG_EXT3_FS_SECURITY is not set CONFIG_JBD=y # CONFIG_JBD_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=y # CONFIG_REISERFS_CHECK is not set CONFIG_REISERFS_PROC_INFO=y CONFIG_REISERFS_FS_XATTR=y CONFIG_REISERFS_FS_POSIX_ACL=y # CONFIG_REISERFS_FS_SECURITY is not set CONFIG_JFS_FS=y CONFIG_JFS_POSIX_ACL=y # CONFIG_JFS_SECURITY is not set # CONFIG_JFS_DEBUG is not set CONFIG_JFS_STATISTICS=y CONFIG_FS_POSIX_ACL=y CONFIG_XFS_FS=y # CONFIG_XFS_QUOTA is not set # CONFIG_XFS_SECURITY is not set CONFIG_XFS_POSIX_ACL=y CONFIG_XFS_RT=y CONFIG_OCFS2_FS=y CONFIG_OCFS2_DEBUG_MASKLOG=y CONFIG_MINIX_FS=y CONFIG_ROMFS_FS=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_ZISOFS_FS=y CONFIG_UDF_FS=y CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_NTFS_FS=y # CONFIG_NTFS_DEBUG is not set CONFIG_NTFS_RW=y # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y CONFIG_CONFIGFS_FS=y # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ASFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set CONFIG_CRAMFS=y # CONFIG_VXFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # # Network File Systems # CONFIG_NFS_FS=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set # CONFIG_NFS_V4 is not set # CONFIG_NFS_DIRECTIO is not set CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y # CONFIG_NFSD_V4 is not set CONFIG_NFSD_TCP=y # CONFIG_ROOT_NFS is not set CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y # CONFIG_RPCSEC_GSS_KRB5 is not set # CONFIG_RPCSEC_GSS_SPKM3 is not set CONFIG_SMB_FS=y CONFIG_SMB_NLS_DEFAULT=y CONFIG_SMB_NLS_REMOTE="cp437" CONFIG_CIFS=y CONFIG_CIFS_STATS=y CONFIG_CIFS_STATS2=y # CONFIG_CIFS_WEAK_PW_HASH is not set # CONFIG_CIFS_XATTR is not set # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # CONFIG_9P_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y CONFIG_BSD_DISKLABEL=y # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set CONFIG_LDM_PARTITION=y CONFIG_LDM_DEBUG=y # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # # Native Language Support # CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set CONFIG_NLS_CODEPAGE_850=y # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set CONFIG_NLS_CODEPAGE_936=y CONFIG_NLS_CODEPAGE_950=y # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set CONFIG_NLS_ISO8859_1=y # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set CONFIG_NLS_ISO8859_6=y # CONFIG_NLS_ISO8859_7 is not set CONFIG_NLS_ISO8859_9=y # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set CONFIG_NLS_UTF8=y # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # # Cryptographic options # CONFIG_CRYPTO=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y CONFIG_CRYPTO_WP512=y CONFIG_CRYPTO_TGR192=y CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_BLOWFISH=y CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_SERPENT=y CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_586=y CONFIG_CRYPTO_CAST5=y CONFIG_CRYPTO_CAST6=y CONFIG_CRYPTO_TEA=y CONFIG_CRYPTO_ARC4=y CONFIG_CRYPTO_KHAZAD=y CONFIG_CRYPTO_ANUBIS=y CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_MICHAEL_MIC=y CONFIG_CRYPTO_CRC32C=y # # Hardware crypto devices # # # Library routines # CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC32=y CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_PLIST=y # # Multi-device support (RAID and LVM) # # CONFIG_MD is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_LOG_BUF_SHIFT=14 # CONFIG_DEBUG_FS is not set # CONFIG_UNWIND_INFO is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.300000600000175000017500000005662012167200764023237 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.30 # Fri Nov 27 12:42:17 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set CONFIG_M686=y # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_GENERIC=y CONFIG_X86_CPU=y CONFIG_X86_L1_CACHE_BYTES=64 CONFIG_X86_INTERNODE_CACHE_BYTES=64 CONFIG_X86_CMPXCHG=y CONFIG_X86_L1_CACHE_SHIFT=5 CONFIG_X86_XADD=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=4 CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_CYRIX_32=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_CPU_SUP_TRANSMETA_32=y CONFIG_CPU_SUP_UMC_32=y CONFIG_UML_X86=y # CONFIG_64BIT is not set CONFIG_X86_32=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y # CONFIG_RWSEM_GENERIC_SPINLOCK is not set # CONFIG_3_LEVEL_PGTABLES is not set CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y # CONFIG_SMP_BROKEN is not set CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_PHYS_ADDR_T_64BIT is not set CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_UNEVICTABLE_LRU=y CONFIG_HAVE_MLOCK=y CONFIG_HAVE_MLOCKED_PAGE_BIT=y CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_HAVE_AOUT=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y # CONFIG_HIGHMEM is not set CONFIG_KERNEL_STACK_ORDER=0 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set # # RCU Subsystem # CONFIG_CLASSIC_RCU=y # CONFIG_TREE_RCU is not set # CONFIG_PREEMPT_RCU is not set # CONFIG_TREE_RCU_TRACE is not set # CONFIG_PREEMPT_RCU_TRACE is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_GROUP_SCHED is not set # CONFIG_CGROUPS is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_NET_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y # CONFIG_STRIP_ASM_SYMS is not set CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_COMPAT_BRK=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_MARKERS is not set # CONFIG_SLOW_WORK is not set # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_LBD is not set # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_HL=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_HL=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_PHONET is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y # CONFIG_NET_SCH_MULTIQ is not set CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y # CONFIG_WIRELESS is not set # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y CONFIG_COMPAT_NET_DEV_OPS=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_FILE_LOCKING=y # CONFIG_XFS_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_SQUASHFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_NILFS2_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # # CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set CONFIG_CRYPTO_WORKQUEUE=y # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # # CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_AES_586 is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_586 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_586 is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_ZLIB is not set # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # CONFIG_BINARY_PRINTF is not set # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_FIND_LAST_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_HAS_DMA=y CONFIG_NLATTR=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_SYSCTL_SYSCALL_CHECK=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.26-ghost.patch0000600000175000017500000030670512167200764025660 0ustar lucaslucasdiff -rNuad linux-2.6.26/arch/um/drivers/vde_user.c linux-2.6.26-ghost/arch/um/drivers/vde_user.c --- linux-2.6.26/arch/um/drivers/vde_user.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/arch/um/drivers/vde_user.c 2009-11-24 22:38:54.000000000 +0100 @@ -77,8 +77,8 @@ void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init) { struct vde_open_args *args; - - vpri->args = kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL); + /* (ghost support) kmalloc is used instead of uml_kmalloc */ + vpri->args = uml_kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL); if (vpri->args == NULL) { printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args " "allocation failed"); diff -rNuad linux-2.6.26/include/linux/netdevice.h linux-2.6.26-ghost/include/linux/netdevice.h --- linux-2.6.26/include/linux/netdevice.h 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/include/linux/netdevice.h 2009-11-24 22:38:54.000000000 +0100 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -1568,4 +1570,12 @@ #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_DEV_H */ diff -rNuad linux-2.6.26/include/linux/sockios.h linux-2.6.26-ghost/include/linux/sockios.h --- linux-2.6.26/include/linux/sockios.h 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/include/linux/sockios.h 2009-11-24 22:38:54.000000000 +0100 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,13 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNuad linux-2.6.26/include/net/ghostdebug.h linux-2.6.26-ghost/include/net/ghostdebug.h --- linux-2.6.26/include/net/ghostdebug.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.26-ghost/include/net/ghostdebug.h 2009-11-24 22:38:54.000000000 +0100 @@ -0,0 +1,93 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg(msg,args...) +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost) " msg "\n", ##args) +#else +#define ghost_ptk(msg,args...) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -rNuad linux-2.6.26/kernel/softirq.c linux-2.6.26-ghost/kernel/softirq.c --- linux-2.6.26/kernel/softirq.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/kernel/softirq.c 2009-11-24 22:43:02.000000000 +0100 @@ -6,6 +6,7 @@ * Distribute under GPLv2. * * Rewritten. Old one was good in 2.2, but in 2.3 it was immoral. --ANK (990903) + * Roudiere ghostification, little modif : disable console infos (irqs) */ #include @@ -121,8 +122,11 @@ */ void _local_bh_enable(void) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); WARN_ON_ONCE(!irqs_disabled()); +#endif if (softirq_count() == SOFTIRQ_OFFSET) trace_softirqs_on((unsigned long)__builtin_return_address(0)); @@ -135,10 +139,16 @@ { #ifdef CONFIG_TRACE_IRQFLAGS unsigned long flags; - +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); #endif +#endif + +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(irqs_disabled()); +#endif #ifdef CONFIG_TRACE_IRQFLAGS local_irq_save(flags); diff -rNuad linux-2.6.26/net/core/dev.c linux-2.6.26-ghost/net/core/dev.c --- linux-2.6.26/net/core/dev.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/core/dev.c 2009-11-24 22:38:54.000000000 +0100 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -124,6 +127,230 @@ #include "net-sysfs.h" /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -529,6 +756,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -2361,11 +2595,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -2433,24 +2676,27 @@ static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev) { struct net_device_stats *stats = dev->get_stats(dev); - - seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " - "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", - dev->name, stats->rx_bytes, stats->rx_packets, - stats->rx_errors, - stats->rx_dropped + stats->rx_missed_errors, - stats->rx_fifo_errors, - stats->rx_length_errors + stats->rx_over_errors + - stats->rx_crc_errors + stats->rx_frame_errors, - stats->rx_compressed, stats->multicast, - stats->tx_bytes, stats->tx_packets, - stats->tx_errors, stats->tx_dropped, - stats->tx_fifo_errors, stats->collisions, - stats->tx_carrier_errors + - stats->tx_aborted_errors + - stats->tx_window_errors + - stats->tx_heartbeat_errors, - stats->tx_compressed); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ + seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " + "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", + dev->name, stats->rx_bytes, stats->rx_packets, + stats->rx_errors, + stats->rx_dropped + stats->rx_missed_errors, + stats->rx_fifo_errors, + stats->rx_length_errors + stats->rx_over_errors + + stats->rx_crc_errors + stats->rx_frame_errors, + stats->rx_compressed, stats->multicast, + stats->tx_bytes, stats->tx_packets, + stats->tx_errors, stats->tx_dropped, + stats->tx_fifo_errors, stats->collisions, + stats->tx_carrier_errors + + stats->tx_aborted_errors + + stats->tx_window_errors + + stats->tx_heartbeat_errors, + stats->tx_compressed); } /* @@ -3262,6 +3508,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = dev_get_flags(dev); @@ -3329,6 +3585,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -3472,6 +3739,57 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ + /* * These ioctl calls: * - can be done by all. diff -rNuad linux-2.6.26/net/core/dev_mcast.c linux-2.6.26-ghost/net/core/dev_mcast.c --- linux-2.6.26/net/core/dev_mcast.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/core/dev_mcast.c 2009-11-24 22:38:54.000000000 +0100 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes for + * ghostification support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,9 @@ #include #include +#ifdef CONFIG_GHOSTIFICATION +#include +#endif /* CONFIG_GHOSTIFICATION */ /* * Device multicast list maintenance. @@ -167,7 +172,15 @@ netif_tx_lock_bh(dev); for (m = dev->mc_list; m; m = m->next) { int i; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information + in /proc about ghost interfaces */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Don't show any information in /proc " + "about ghostified interface"); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNuad linux-2.6.26/net/core/rtnetlink.c linux-2.6.26-ghost/net/core/rtnetlink.c --- linux-2.6.26/net/core/rtnetlink.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/core/rtnetlink.c 2009-11-24 22:38:54.000000000 +0100 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; @@ -106,7 +115,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].doit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -117,7 +129,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].dumpit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -460,6 +475,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -612,6 +633,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -688,6 +723,24 @@ idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -927,6 +980,18 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ if ((err = validate_linkmsg(dev, tb)) < 0) goto errout_dev; @@ -965,6 +1030,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1167,6 +1243,17 @@ dev = dev_get_by_index(net, ifm->ifi_index); if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ } else return -EINVAL; @@ -1221,6 +1308,8 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1255,6 +1344,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -1274,14 +1368,21 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; - +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ __rtnl_unlock(); rtnl = net->rtnl; err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); @@ -1313,6 +1414,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -1328,6 +1434,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); diff -rNuad linux-2.6.26/net/ipv4/arp.c linux-2.6.26-ghost/net/ipv4/arp.c --- linux-2.6.26/net/ipv4/arp.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv4/arp.c 2009-11-24 22:38:54.000000000 +0100 @@ -72,6 +72,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -118,6 +120,11 @@ struct neigh_table *clip_tbl_hook; #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1310,9 +1317,21 @@ } #endif sprintf(tbuf, NIPQUAD_FMT, NIPQUAD(*(u32*)n->primary_key)); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show anything in /proc if it involves + ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1323,9 +1342,21 @@ char tbuf[16]; sprintf(tbuf, NIPQUAD_FMT, NIPQUAD(*(u32*)n->key)); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -rNuad linux-2.6.26/net/ipv4/devinet.c linux-2.6.26-ghost/net/ipv4/devinet.c --- linux-2.6.26/net/ipv4/devinet.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv4/devinet.c 2009-11-24 22:38:54.000000000 +0100 @@ -25,6 +25,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -64,6 +67,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, @@ -455,6 +463,16 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ __in_dev_put(in_dev); @@ -504,6 +522,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -553,6 +582,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1159,6 +1194,15 @@ s_ip_idx = ip_idx = cb->args[1]; idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (idx > s_idx) diff -rNuad linux-2.6.26/net/ipv4/fib_frontend.c linux-2.6.26-ghost/net/ipv4/fib_frontend.c --- linux-2.6.26/net/ipv4/fib_frontend.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv4/fib_frontend.c 2009-11-24 22:38:54.000000000 +0100 @@ -8,6 +8,10 @@ * Version: $Id: fib_frontend.c,v 1.26 2001/10/31 21:55:54 davem Exp $ * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -47,6 +51,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -453,6 +462,11 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct fib_config cfg; @@ -467,6 +481,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -475,12 +505,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = tb->tb_insert(tb, &cfg); else @@ -587,6 +623,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -609,6 +655,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -624,6 +680,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -636,7 +698,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -661,6 +723,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -rNuad linux-2.6.26/net/ipv4/fib_hash.c linux-2.6.26-ghost/net/ipv4/fib_hash.c --- linux-2.6.26/net/ipv4/fib_hash.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv4/fib_hash.c 2009-11-24 22:38:54.000000000 +0100 @@ -8,6 +8,11 @@ * Version: $Id: fib_hash.c,v 1.13 2001/10/31 21:55:54 davem Exp $ * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_hash_insert, bad + * field check in fib_seq_show). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -43,6 +48,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static struct kmem_cache *fn_hash_kmem __read_mostly; @@ -399,6 +409,18 @@ if (IS_ERR(fi)) return PTR_ERR(fi); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_insert */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if (fz->fz_nent > (fz->fz_divisor<<1) && fz->fz_divisor < FZ_MAX_DIVISOR && (cfg->fc_dst_len == 32 || @@ -582,7 +604,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_delete */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != cfg->fc_tos) break; @@ -1024,19 +1056,39 @@ prefix = f->fn_key; mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); - if (fi) + if (fi) + { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) + { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, - "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - fi->fib_dev ? fi->fib_dev->name : "*", prefix, - fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, - mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), - fi->fib_window, - fi->fib_rtt >> 3, &len); - else + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); +#endif /* CONFIG_GHOSTIFICATION */ + } + else { seq_printf(seq, - "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); + } seq_printf(seq, "%*s\n", 127 - len, ""); out: return 0; diff -rNuad linux-2.6.26/net/ipv4/fib_semantics.c linux-2.6.26-ghost/net/ipv4/fib_semantics.c --- linux-2.6.26/net/ipv4/fib_semantics.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv4/fib_semantics.c 2009-11-24 22:38:54.000000000 +0100 @@ -13,6 +13,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -45,6 +48,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -955,6 +963,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -rNuad linux-2.6.26/net/ipv4/fib_trie.c linux-2.6.26-ghost/net/ipv4/fib_trie.c --- linux-2.6.26/net/ipv4/fib_trie.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv4/fib_trie.c 2009-11-24 22:38:54.000000000 +0100 @@ -12,6 +12,12 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -82,6 +88,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1197,6 +1208,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1625,7 +1648,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2603,7 +2636,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2616,13 +2670,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -rNuad linux-2.6.26/net/ipv4/igmp.c linux-2.6.26-ghost/net/ipv4/igmp.c --- linux-2.6.26/net/ipv4/igmp.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv4/igmp.c 2009-11-24 22:38:54.000000000 +0100 @@ -70,6 +70,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -107,6 +109,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2415,8 +2422,18 @@ #endif if (state->in_dev->mc_list == im) { - seq_printf(seq, "%d\t%-10s: %5d %7s\n", - state->dev->ifindex, state->dev->name, state->dev->mc_count, querier); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, + state->dev->name, state->dev->mc_count, querier); + } +#else + seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, + state->dev->name, state->dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2576,14 +2593,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.26/net/ipv4/route.c linux-2.6.26-ghost/net/ipv4/route.c --- linux-2.6.26/net/ipv4/route.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv4/route.c 2009-11-24 22:38:54.000000000 +0100 @@ -57,6 +57,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -110,6 +113,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp) \ ((u32)(oldflp->fl4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) @@ -366,6 +374,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->u.dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->u.dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; int len; @@ -383,11 +399,11 @@ r->fl.fl4_tos, r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, r->u.dst.hh ? (r->u.dst.hh->hh_output == - dev_queue_xmit) : 0, + dev_queue_xmit) : 0, r->rt_spec_dst, &len); seq_printf(seq, "%*s\n", 127 - len, ""); - } + } return 0; } @@ -2632,8 +2648,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); } - if (rt->u.dst.dev) + if (rt->u.dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->u.dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); + } #ifdef CONFIG_NET_CLS_ROUTE if (rt->u.dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); @@ -2716,7 +2737,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -2738,6 +2759,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -2763,13 +2795,31 @@ err = ip_route_output_key(net, &rt, &fl); } - if (err) + if (err) { goto errout_free; + } skb->rtable = rt; if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->u.dst.dev) { + ghost_debugmsg("Net device is %s ",rt->u.dst.dev->name); + if (is_a_ghost_interface_name(rt->u.dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->u.dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ + err = rt_fill_info(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -2784,6 +2834,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -rNuad linux-2.6.26/net/ipv6/addrconf.c linux-2.6.26-ghost/net/ipv6/addrconf.c --- linux-2.6.26/net/ipv6/addrconf.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv6/addrconf.c 2009-11-24 22:38:54.000000000 +0100 @@ -38,6 +38,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -82,6 +85,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -429,6 +437,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2098,6 +2186,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx, unsigned int plen) { @@ -2112,6 +2204,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -2935,6 +3036,23 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, + NIP6_SEQFMT " %02x %02x %02x %02x %8s\n", + NIP6(ifp->addr), + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, NIP6_SEQFMT " %02x %02x %02x %02x %8s\n", NIP6(ifp->addr), @@ -2943,6 +3061,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3150,6 +3270,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3167,7 +3291,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3216,6 +3342,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3253,6 +3383,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3418,6 +3557,12 @@ ANYCAST_ADDR, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3443,6 +3588,17 @@ ip_idx = 0; if ((idev = in6_dev_get(dev)) == NULL) goto cont; + +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + read_lock_bh(&idev->lock); switch (type) { case UNICAST_ADDR: @@ -3514,7 +3670,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3522,6 +3677,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3548,6 +3707,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((ifa = ipv6_get_ifaddr(net, addr, dev, 1)) == NULL) { err = -EADDRNOTAVAIL; goto errout; @@ -3753,6 +3923,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -3764,6 +3938,14 @@ read_lock(&dev_base_lock); idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if ((idev = in6_dev_get(dev)) == NULL) @@ -3791,7 +3973,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -rNuad linux-2.6.26/net/ipv6/ip6_fib.c linux-2.6.26-ghost/net/ipv6/ip6_fib.c --- linux-2.6.26/net/ipv6/ip6_fib.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv6/ip6_fib.c 2009-11-24 22:38:54.000000000 +0100 @@ -277,6 +277,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -318,7 +320,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -rNuad linux-2.6.26/net/ipv6/Kconfig linux-2.6.26-ghost/net/ipv6/Kconfig --- linux-2.6.26/net/ipv6/Kconfig 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv6/Kconfig 2009-11-24 22:38:54.000000000 +0100 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select XFRM select INET6_XFRM_TUNNEL select CRYPTO @@ -107,7 +111,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -116,16 +120,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -134,7 +138,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -143,7 +147,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -152,14 +156,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -176,7 +180,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -rNuad linux-2.6.26/net/ipv6/mcast.c linux-2.6.26-ghost/net/ipv6/mcast.c --- linux-2.6.26/net/ipv6/mcast.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv6/mcast.c 2009-11-24 22:38:54.000000000 +0100 @@ -26,6 +26,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -63,6 +67,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2436,6 +2445,20 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, + "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + NIP6(im->mca_addr), + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else seq_printf(seq, "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2443,6 +2466,7 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2597,6 +2621,20 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s " NIP6_SEQFMT " " NIP6_SEQFMT " %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + NIP6(state->im->mca_addr), + NIP6(psf->sf_addr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else seq_printf(seq, "%3d %6.6s " NIP6_SEQFMT " " NIP6_SEQFMT " %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2604,6 +2642,7 @@ NIP6(psf->sf_addr), psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.26/net/ipv6/proc.c linux-2.6.26-ghost/net/ipv6/proc.c --- linux-2.6.26/net/ipv6/proc.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv6/proc.c 2009-11-24 22:38:54.000000000 +0100 @@ -11,6 +11,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -31,7 +33,19 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +#ifdef CONFIG_GHOSTIFICATION +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#else static struct proc_dir_entry *proc_net_devsnmp6; +#endif /* CONFIG_GHOSTIFICATION */ static int sockstat6_seq_show(struct seq_file *seq, void *v) { @@ -226,6 +240,18 @@ return single_open(file, snmp6_seq_show, PDE(inode)->data); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -233,6 +259,7 @@ .llseek = seq_lseek, .release = single_release, }; +#endif /* CONFIG_GHOSTIFICATION */ int snmp6_register_dev(struct inet6_dev *idev) { diff -rNuad linux-2.6.26/net/ipv6/route.c linux-2.6.26-ghost/net/ipv6/route.c --- linux-2.6.26/net/ipv6/route.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/ipv6/route.c 2009-11-24 22:38:54.000000000 +0100 @@ -24,6 +24,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -62,6 +66,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1053,10 +1062,6 @@ return hoplimit; } -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1768,6 +1773,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2059,26 +2066,84 @@ return err; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2098,6 +2163,10 @@ + nla_total_size(sizeof(struct rta_cacheinfo)); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc + */ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt, struct in6_addr *dst, struct in6_addr *src, int iif, int type, u32 pid, u32 seq, @@ -2108,6 +2177,19 @@ long expires; u32 table; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2214,10 +2296,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2230,6 +2328,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2374,6 +2474,18 @@ { struct seq_file *m = p_arg; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ + seq_printf(m, NIP6_SEQFMT " %02x ", NIP6(rt->rt6i_dst.addr), rt->rt6i_dst.plen); diff -rNuad linux-2.6.26/net/Kconfig linux-2.6.26-ghost/net/Kconfig --- linux-2.6.26/net/Kconfig 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/Kconfig 2009-11-24 22:38:54.000000000 +0100 @@ -175,6 +175,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -250,6 +349,95 @@ source "net/rfkill/Kconfig" source "net/9p/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET endmenu # Networking diff -rNuad linux-2.6.26/net/netfilter/core.c linux-2.6.26-ghost/net/netfilter/core.c --- linux-2.6.26/net/netfilter/core.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/netfilter/core.c 2009-11-24 22:38:54.000000000 +0100 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -22,6 +24,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -59,7 +66,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -177,7 +183,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { diff -rNuad linux-2.6.26/net/packet/af_packet.c linux-2.6.26-ghost/net/packet/af_packet.c --- linux-2.6.26/net/packet/af_packet.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.26-ghost/net/packet/af_packet.c 2009-11-24 22:38:54.000000000 +0100 @@ -41,6 +41,7 @@ * will simply extend the hardware address * byte arrays at the end of sockaddr_ll * and packet_mreq. + * Luca Saiu : Trivial changes for ghostification * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -84,6 +85,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -448,6 +454,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -565,6 +583,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -1900,17 +1930,38 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, - "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", - s, - atomic_read(&s->sk_refcnt), - s->sk_type, - ntohs(po->num), - po->ifindex, - po->running, - atomic_read(&s->sk_rmem_alloc), - sock_i_uid(s), - sock_i_ino(s) ); + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.30-ghost_debian.patch0000600000175000017500000030270512167200764027151 0ustar lucaslucasdiff -rNuad linux-source-2.6.30/include/linux/netdevice.h linux-source-2.6.30-ghost/include/linux/netdevice.h --- linux-source-2.6.30/include/linux/netdevice.h 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/include/linux/netdevice.h 2009-12-02 13:24:38.000000000 +0100 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -1910,4 +1912,12 @@ extern struct pernet_operations __net_initdata loopback_net_ops; #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_DEV_H */ diff -rNuad linux-source-2.6.30/include/linux/sockios.h linux-source-2.6.30-ghost/include/linux/sockios.h --- linux-source-2.6.30/include/linux/sockios.h 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/include/linux/sockios.h 2009-12-02 13:24:38.000000000 +0100 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,13 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNuad linux-source-2.6.30/include/net/ghostdebug.h linux-source-2.6.30-ghost/include/net/ghostdebug.h --- linux-source-2.6.30/include/net/ghostdebug.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-source-2.6.30-ghost/include/net/ghostdebug.h 2009-12-02 13:24:38.000000000 +0100 @@ -0,0 +1,93 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg(msg,args...) +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost) " msg "\n", ##args) +#else +#define ghost_ptk(msg,args...) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -rNuad linux-source-2.6.30/kernel/softirq.c linux-source-2.6.30-ghost/kernel/softirq.c --- linux-source-2.6.30/kernel/softirq.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/kernel/softirq.c 2009-12-02 13:24:38.000000000 +0100 @@ -126,8 +126,11 @@ */ void _local_bh_enable(void) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); WARN_ON_ONCE(!irqs_disabled()); +#endif if (softirq_count() == SOFTIRQ_OFFSET) trace_softirqs_on((unsigned long)__builtin_return_address(0)); @@ -138,7 +141,10 @@ static inline void _local_bh_enable_ip(unsigned long ip) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq() || irqs_disabled()); +#endif #ifdef CONFIG_TRACE_IRQFLAGS local_irq_disable(); #endif diff -rNuad linux-source-2.6.30/net/core/dev.c linux-source-2.6.30-ghost/net/core/dev.c --- linux-source-2.6.30/net/core/dev.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/core/dev.c 2009-12-02 13:24:38.000000000 +0100 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -136,6 +139,230 @@ #define GRO_MAX_HEAD (MAX_HEADER + 128) /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -536,6 +763,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -2899,11 +3133,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -2972,6 +3215,10 @@ { const struct net_device_stats *stats = dev_get_stats(dev); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", dev->name, stats->rx_bytes, stats->rx_packets, @@ -3851,6 +4098,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = dev_get_flags(dev); @@ -3921,6 +4178,17 @@ ops = dev->netdev_ops; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -4064,6 +4332,57 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ + /* * These ioctl calls: * - can be done by all. diff -rNuad linux-source-2.6.30/net/core/dev_mcast.c linux-source-2.6.30-ghost/net/core/dev_mcast.c --- linux-source-2.6.30/net/core/dev_mcast.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/core/dev_mcast.c 2009-12-02 13:24:38.000000000 +0100 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes for + * ghostification support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,9 @@ #include #include +#ifdef CONFIG_GHOSTIFICATION +#include +#endif /* CONFIG_GHOSTIFICATION */ /* * Device multicast list maintenance. @@ -167,7 +172,15 @@ netif_addr_lock_bh(dev); for (m = dev->mc_list; m; m = m->next) { int i; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information + in /proc about ghost interfaces */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Don't show any information in /proc " + "about ghostified interface"); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNuad linux-source-2.6.30/net/core/rtnetlink.c linux-source-2.6.30-ghost/net/core/rtnetlink.c --- linux-source-2.6.30/net/core/rtnetlink.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/core/rtnetlink.c 2009-12-02 13:24:38.000000000 +0100 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; @@ -106,7 +115,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].doit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -117,7 +129,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].dumpit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -460,6 +475,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -616,6 +637,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -690,6 +725,24 @@ idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -941,6 +994,18 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ if ((err = validate_linkmsg(dev, tb)) < 0) goto errout_dev; @@ -979,6 +1044,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1181,6 +1257,17 @@ dev = dev_get_by_index(net, ifm->ifi_index); if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ } else return -EINVAL; @@ -1235,6 +1322,8 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1270,6 +1359,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -1289,14 +1383,21 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; - +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ __rtnl_unlock(); rtnl = net->rtnl; err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); @@ -1328,6 +1429,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -1343,6 +1449,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); diff -rNuad linux-source-2.6.30/net/ipv4/arp.c linux-source-2.6.30-ghost/net/ipv4/arp.c --- linux-source-2.6.30/net/ipv4/arp.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv4/arp.c 2009-12-02 13:24:38.000000000 +0100 @@ -70,6 +70,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -116,6 +118,11 @@ struct neigh_table *clip_tbl_hook; #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1312,9 +1319,21 @@ } #endif sprintf(tbuf, "%pI4", n->primary_key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves +ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1325,9 +1344,21 @@ char tbuf[16]; sprintf(tbuf, "%pI4", n->key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -rNuad linux-source-2.6.30/net/ipv4/devinet.c linux-source-2.6.30-ghost/net/ipv4/devinet.c --- linux-source-2.6.30/net/ipv4/devinet.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv4/devinet.c 2009-12-02 13:24:38.000000000 +0100 @@ -23,6 +23,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -62,6 +65,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, @@ -448,6 +456,16 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ __in_dev_put(in_dev); @@ -497,6 +515,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -546,6 +575,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1169,6 +1204,15 @@ s_ip_idx = ip_idx = cb->args[1]; idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (idx > s_idx) diff -rNuad linux-source-2.6.30/net/ipv4/fib_frontend.c linux-source-2.6.30-ghost/net/ipv4/fib_frontend.c --- linux-source-2.6.30/net/ipv4/fib_frontend.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv4/fib_frontend.c 2009-12-02 13:24:38.000000000 +0100 @@ -6,6 +6,10 @@ * IPv4 Forwarding Information Base: FIB frontend. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -45,6 +49,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -451,6 +460,11 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct fib_config cfg; @@ -465,6 +479,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -473,12 +503,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = tb->tb_insert(tb, &cfg); else @@ -585,6 +621,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -607,6 +653,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -622,6 +678,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -634,7 +696,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -659,6 +721,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -rNuad linux-source-2.6.30/net/ipv4/fib_hash.c linux-source-2.6.30-ghost/net/ipv4/fib_hash.c --- linux-source-2.6.30/net/ipv4/fib_hash.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv4/fib_hash.c 2009-12-02 13:24:38.000000000 +0100 @@ -6,6 +6,11 @@ * IPv4 FIB: lookup engine and maintenance routines. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_hash_insert, bad + * field check in fib_seq_show). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -41,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static struct kmem_cache *fn_hash_kmem __read_mostly; @@ -397,6 +407,18 @@ if (IS_ERR(fi)) return PTR_ERR(fi); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_insert */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if (fz->fz_nent > (fz->fz_divisor<<1) && fz->fz_divisor < FZ_MAX_DIVISOR && (cfg->fc_dst_len == 32 || @@ -580,7 +602,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_delete */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != cfg->fc_tos) break; @@ -1022,19 +1054,39 @@ prefix = f->fn_key; mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); - if (fi) + if (fi) + { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) + { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, - "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - fi->fib_dev ? fi->fib_dev->name : "*", prefix, - fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, - mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), - fi->fib_window, - fi->fib_rtt >> 3, &len); - else + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); +#endif /* CONFIG_GHOSTIFICATION */ + } + else { seq_printf(seq, - "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); + } seq_printf(seq, "%*s\n", 127 - len, ""); out: return 0; diff -rNuad linux-source-2.6.30/net/ipv4/fib_semantics.c linux-source-2.6.30-ghost/net/ipv4/fib_semantics.c --- linux-source-2.6.30/net/ipv4/fib_semantics.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv4/fib_semantics.c 2009-12-02 13:24:38.000000000 +0100 @@ -11,6 +11,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -43,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -954,6 +962,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -rNuad linux-source-2.6.30/net/ipv4/fib_trie.c linux-source-2.6.30-ghost/net/ipv4/fib_trie.c --- linux-source-2.6.30/net/ipv4/fib_trie.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv4/fib_trie.c 2009-12-02 13:24:38.000000000 +0100 @@ -12,6 +12,12 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -80,6 +86,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1199,6 +1210,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1627,7 +1650,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2587,7 +2620,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2600,13 +2654,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -rNuad linux-source-2.6.30/net/ipv4/igmp.c linux-source-2.6.30-ghost/net/ipv4/igmp.c --- linux-source-2.6.30/net/ipv4/igmp.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv4/igmp.c 2009-12-02 13:24:38.000000000 +0100 @@ -68,6 +68,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -105,6 +107,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2387,8 +2394,18 @@ #endif if (state->in_dev->mc_list == im) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", + state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); + } +#else seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2550,14 +2567,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-source-2.6.30/net/ipv4/route.c linux-source-2.6.30-ghost/net/ipv4/route.c --- linux-source-2.6.30/net/ipv4/route.c 2009-07-18 10:10:11.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv4/route.c 2009-12-02 13:24:38.000000000 +0100 @@ -55,6 +55,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -108,6 +111,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp) \ ((u32)(oldflp->fl4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) @@ -375,6 +383,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->u.dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->u.dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; int len; @@ -392,11 +408,11 @@ r->fl.fl4_tos, r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, r->u.dst.hh ? (r->u.dst.hh->hh_output == - dev_queue_xmit) : 0, + dev_queue_xmit) : 0, r->rt_spec_dst, &len); seq_printf(seq, "%*s\n", 127 - len, ""); - } + } return 0; } @@ -2823,8 +2839,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); } - if (rt->u.dst.dev) + if (rt->u.dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->u.dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); + } #ifdef CONFIG_NET_CLS_ROUTE if (rt->u.dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); @@ -2907,7 +2928,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -2929,6 +2950,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -2961,6 +2993,22 @@ if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->u.dst.dev) { + ghost_debugmsg("Net device is %s ",rt->u.dst.dev->name); + if (is_a_ghost_interface_name(rt->u.dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->u.dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ err = rt_fill_info(net, skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -2975,6 +3023,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -rNuad linux-source-2.6.30/net/ipv6/addrconf.c linux-source-2.6.30-ghost/net/ipv6/addrconf.c --- linux-source-2.6.30/net/ipv6/addrconf.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv6/addrconf.c 2009-12-02 13:24:38.000000000 +0100 @@ -36,6 +36,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -81,6 +84,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -446,6 +454,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2126,6 +2214,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx, unsigned int plen) { @@ -2140,6 +2232,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -2954,6 +3055,22 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", + &ifp->addr, + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", &ifp->addr, ifp->idev->dev->ifindex, @@ -2961,6 +3078,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3168,6 +3287,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3185,7 +3308,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3234,6 +3359,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3271,6 +3400,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3436,6 +3574,12 @@ ANYCAST_ADDR, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3461,6 +3605,17 @@ ip_idx = 0; if ((idev = in6_dev_get(dev)) == NULL) goto cont; + +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + read_lock_bh(&idev->lock); switch (type) { case UNICAST_ADDR: @@ -3532,7 +3687,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3540,6 +3694,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3566,6 +3724,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((ifa = ipv6_get_ifaddr(net, addr, dev, 1)) == NULL) { err = -EADDRNOTAVAIL; goto errout; @@ -3774,6 +3943,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -3785,6 +3958,14 @@ read_lock(&dev_base_lock); idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if ((idev = in6_dev_get(dev)) == NULL) @@ -3812,7 +3993,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -rNuad linux-source-2.6.30/net/ipv6/ip6_fib.c linux-source-2.6.30-ghost/net/ipv6/ip6_fib.c --- linux-source-2.6.30/net/ipv6/ip6_fib.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv6/ip6_fib.c 2009-12-02 13:24:38.000000000 +0100 @@ -275,6 +275,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -320,7 +322,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -rNuad linux-source-2.6.30/net/ipv6/Kconfig linux-source-2.6.30-ghost/net/ipv6/Kconfig --- linux-source-2.6.30/net/ipv6/Kconfig 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv6/Kconfig 2009-12-02 13:24:38.000000000 +0100 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select INET6_XFRM_TUNNEL select XFRM_IPCOMP ---help--- @@ -105,7 +109,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -114,16 +118,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -132,7 +136,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -141,7 +145,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -150,14 +154,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -174,7 +178,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -rNuad linux-source-2.6.30/net/ipv6/mcast.c linux-source-2.6.30-ghost/net/ipv6/mcast.c --- linux-source-2.6.30/net/ipv6/mcast.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv6/mcast.c 2009-12-02 13:24:38.000000000 +0100 @@ -24,6 +24,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -61,6 +65,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2432,6 +2441,11 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); seq_printf(seq, "%-4d %-15s %pi6 %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2439,6 +2453,16 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else + seq_printf(seq, + "%-4d %-15s %pi6 %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + &im->mca_addr, + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2593,6 +2617,11 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); seq_printf(seq, "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2600,6 +2629,16 @@ &psf->sf_addr, psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + &state->im->mca_addr, + &psf->sf_addr, + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-source-2.6.30/net/ipv6/proc.c linux-source-2.6.30-ghost/net/ipv6/proc.c --- linux-source-2.6.30/net/ipv6/proc.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv6/proc.c 2009-12-02 13:24:38.000000000 +0100 @@ -9,6 +9,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,6 +31,16 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#endif /* CONFIG_GHOSTIFICATION */ + static int sockstat6_seq_show(struct seq_file *seq, void *v) { struct net *net = seq->private; @@ -194,6 +206,18 @@ return single_open_net(inode, file, snmp6_seq_show); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -201,6 +225,7 @@ .llseek = seq_lseek, .release = single_release_net, }; +#endif /* CONFIG_GHOSTIFICATION */ static int snmp6_dev_seq_show(struct seq_file *seq, void *v) { diff -rNuad linux-source-2.6.30/net/ipv6/route.c linux-source-2.6.30-ghost/net/ipv6/route.c --- linux-source-2.6.30/net/ipv6/route.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/ipv6/route.c 2009-12-02 13:24:38.000000000 +0100 @@ -22,6 +22,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -60,6 +64,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1115,10 +1124,6 @@ return hoplimit; } -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1830,6 +1835,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2133,26 +2140,84 @@ return err; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2172,6 +2237,10 @@ + nla_total_size(sizeof(struct rta_cacheinfo)); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc + */ static int rt6_fill_node(struct net *net, struct sk_buff *skb, struct rt6_info *rt, struct in6_addr *dst, struct in6_addr *src, @@ -2183,6 +2252,19 @@ long expires; u32 table; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2290,10 +2372,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2307,6 +2405,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2452,6 +2552,17 @@ { struct seq_file *m = p_arg; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen); #ifdef CONFIG_IPV6_SUBTREES diff -rNuad linux-source-2.6.30/net/Kconfig linux-source-2.6.30-ghost/net/Kconfig --- linux-source-2.6.30/net/Kconfig 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/Kconfig 2009-12-02 13:24:38.000000000 +0100 @@ -159,6 +159,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -255,4 +354,93 @@ source "net/rfkill/Kconfig" source "net/9p/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET diff -rNuad linux-source-2.6.30/net/netfilter/core.c linux-source-2.6.30-ghost/net/netfilter/core.c --- linux-source-2.6.30/net/netfilter/core.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/netfilter/core.c 2009-12-02 13:24:38.000000000 +0100 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -22,6 +24,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -59,7 +66,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -169,7 +175,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { @@ -182,6 +339,9 @@ verdict >> NF_VERDICT_BITS)) goto next_hook; } +#ifdef CONFIG_GHOSTIFICATION_NETFILTER +unlock: +#endif rcu_read_unlock(); return ret; } diff -rNuad linux-source-2.6.30/net/packet/af_packet.c linux-source-2.6.30-ghost/net/packet/af_packet.c --- linux-source-2.6.30/net/packet/af_packet.c 2009-06-10 05:05:27.000000000 +0200 +++ linux-source-2.6.30-ghost/net/packet/af_packet.c 2009-12-02 13:24:38.000000000 +0100 @@ -39,6 +39,7 @@ * will simply extend the hardware address * byte arrays at the end of sockaddr_ll * and packet_mreq. + * Luca Saiu : Trivial changes for ghostification * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +84,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -489,6 +495,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -611,6 +629,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -2049,17 +2079,38 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, - "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", - s, - atomic_read(&s->sk_refcnt), - s->sk_type, - ntohs(po->num), - po->ifindex, - po->running, - atomic_read(&s->sk_rmem_alloc), - sock_i_uid(s), - sock_i_ino(s) ); + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.280000600000175000017500000005536212167200764023250 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.28 # Fri Nov 27 12:32:27 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set CONFIG_M686=y # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_GENERIC=y CONFIG_X86_CPU=y CONFIG_X86_CMPXCHG=y CONFIG_X86_L1_CACHE_SHIFT=7 CONFIG_X86_XADD=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=4 CONFIG_X86_DEBUGCTLMSR=y CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_CYRIX_32=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR_32=y CONFIG_CPU_SUP_TRANSMETA_32=y CONFIG_CPU_SUP_UMC_32=y # CONFIG_X86_DS is not set CONFIG_UML_X86=y # CONFIG_64BIT is not set CONFIG_X86_32=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y # CONFIG_RWSEM_GENERIC_SPINLOCK is not set # CONFIG_3_LEVEL_PGTABLES is not set CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y # CONFIG_SMP_BROKEN is not set CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_RESOURCES_64BIT is not set # CONFIG_PHYS_ADDR_T_64BIT is not set CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_UNEVICTABLE_LRU=y CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_HAVE_AOUT=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y # CONFIG_HIGHMEM is not set CONFIG_KERNEL_STACK_ORDER=0 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_CGROUPS is not set # CONFIG_GROUP_SCHED is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_COMPAT_BRK=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_ANON_INODES=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_MARKERS is not set # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_LBD is not set # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_LSF is not set # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" CONFIG_CLASSIC_RCU=y # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y # CONFIG_NET_SCH_MULTIQ is not set CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_PHONET is not set CONFIG_FIB_RULES=y # CONFIG_WIRELESS is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # CONFIG_IWLWIFI_LEDS is not set # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_FILE_LOCKING=y # CONFIG_XFS_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y # CONFIG_SUNRPC_REGISTER_V4 is not set CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # # CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # # CONFIG_CRYPTO_CRC32C is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # # CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_AES_586 is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_586 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_586 is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_PLIST=y CONFIG_HAS_DMA=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_SYSCTL_SYSCALL_CHECK=y # # Tracers # # CONFIG_DYNAMIC_PRINTK_DEBUG is not set # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.30-ghost.patch0000600000175000017500000030144512167200764025647 0ustar lucaslucasdiff -rNuad linux-2.6.30/include/linux/netdevice.h linux-2.6.30-ghost/include/linux/netdevice.h --- linux-2.6.30/include/linux/netdevice.h 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/include/linux/netdevice.h 2009-11-26 22:50:50.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -1910,4 +1912,12 @@ extern struct pernet_operations __net_initdata loopback_net_ops; #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_DEV_H */ diff -rNuad linux-2.6.30/include/linux/sockios.h linux-2.6.30-ghost/include/linux/sockios.h --- linux-2.6.30/include/linux/sockios.h 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/include/linux/sockios.h 2009-11-26 22:50:50.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,13 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNuad linux-2.6.30/include/net/ghostdebug.h linux-2.6.30-ghost/include/net/ghostdebug.h --- linux-2.6.30/include/net/ghostdebug.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6.30-ghost/include/net/ghostdebug.h 2009-11-26 22:50:50.000000000 +0000 @@ -0,0 +1,93 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg(msg,args...) +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost) " msg "\n", ##args) +#else +#define ghost_ptk(msg,args...) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -rNuad linux-2.6.30/kernel/softirq.c linux-2.6.30-ghost/kernel/softirq.c --- linux-2.6.30/kernel/softirq.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/kernel/softirq.c 2009-11-26 22:50:50.000000000 +0000 @@ -126,8 +126,11 @@ */ void _local_bh_enable(void) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); WARN_ON_ONCE(!irqs_disabled()); +#endif if (softirq_count() == SOFTIRQ_OFFSET) trace_softirqs_on((unsigned long)__builtin_return_address(0)); @@ -138,7 +141,10 @@ static inline void _local_bh_enable_ip(unsigned long ip) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq() || irqs_disabled()); +#endif #ifdef CONFIG_TRACE_IRQFLAGS local_irq_disable(); #endif diff -rNuad linux-2.6.30/net/Kconfig linux-2.6.30-ghost/net/Kconfig --- linux-2.6.30/net/Kconfig 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/Kconfig 2009-11-26 22:50:50.000000000 +0000 @@ -159,6 +159,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -255,4 +354,93 @@ source "net/rfkill/Kconfig" source "net/9p/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET diff -rNuad linux-2.6.30/net/core/dev.c linux-2.6.30-ghost/net/core/dev.c --- linux-2.6.30/net/core/dev.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/core/dev.c 2009-11-26 22:50:50.000000000 +0000 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -136,6 +139,230 @@ #define GRO_MAX_HEAD (MAX_HEADER + 128) /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -536,6 +763,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -2899,11 +3133,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -2972,6 +3215,10 @@ { const struct net_device_stats *stats = dev_get_stats(dev); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", dev->name, stats->rx_bytes, stats->rx_packets, @@ -3851,6 +4098,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = dev_get_flags(dev); @@ -3921,6 +4178,17 @@ ops = dev->netdev_ops; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -4064,6 +4332,57 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ + /* * These ioctl calls: * - can be done by all. diff -rNuad linux-2.6.30/net/core/dev_mcast.c linux-2.6.30-ghost/net/core/dev_mcast.c --- linux-2.6.30/net/core/dev_mcast.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/core/dev_mcast.c 2009-11-26 22:50:50.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes for + * ghostification support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,9 @@ #include #include +#ifdef CONFIG_GHOSTIFICATION +#include +#endif /* CONFIG_GHOSTIFICATION */ /* * Device multicast list maintenance. @@ -167,7 +172,15 @@ netif_addr_lock_bh(dev); for (m = dev->mc_list; m; m = m->next) { int i; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information + in /proc about ghost interfaces */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Don't show any information in /proc " + "about ghostified interface"); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNuad linux-2.6.30/net/core/rtnetlink.c linux-2.6.30-ghost/net/core/rtnetlink.c --- linux-2.6.30/net/core/rtnetlink.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/core/rtnetlink.c 2009-11-26 22:50:50.000000000 +0000 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; @@ -106,7 +115,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].doit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -117,7 +129,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].dumpit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -460,6 +475,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -616,6 +637,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -690,6 +725,24 @@ idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -941,6 +994,18 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ if ((err = validate_linkmsg(dev, tb)) < 0) goto errout_dev; @@ -979,6 +1044,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1181,6 +1257,17 @@ dev = dev_get_by_index(net, ifm->ifi_index); if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ } else return -EINVAL; @@ -1235,6 +1322,8 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1270,6 +1359,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -1289,14 +1383,21 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; - +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ __rtnl_unlock(); rtnl = net->rtnl; err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); @@ -1328,6 +1429,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -1343,6 +1449,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); diff -rNuad linux-2.6.30/net/ipv4/arp.c linux-2.6.30-ghost/net/ipv4/arp.c --- linux-2.6.30/net/ipv4/arp.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv4/arp.c 2009-11-26 22:50:50.000000000 +0000 @@ -70,6 +70,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -116,6 +118,11 @@ struct neigh_table *clip_tbl_hook; #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1312,9 +1319,21 @@ } #endif sprintf(tbuf, "%pI4", n->primary_key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves +ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1325,9 +1344,21 @@ char tbuf[16]; sprintf(tbuf, "%pI4", n->key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -rNuad linux-2.6.30/net/ipv4/devinet.c linux-2.6.30-ghost/net/ipv4/devinet.c --- linux-2.6.30/net/ipv4/devinet.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv4/devinet.c 2009-11-26 22:50:50.000000000 +0000 @@ -23,6 +23,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -62,6 +65,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, @@ -448,6 +456,16 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ __in_dev_put(in_dev); @@ -497,6 +515,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -546,6 +575,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1169,6 +1204,15 @@ s_ip_idx = ip_idx = cb->args[1]; idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (idx > s_idx) diff -rNuad linux-2.6.30/net/ipv4/fib_frontend.c linux-2.6.30-ghost/net/ipv4/fib_frontend.c --- linux-2.6.30/net/ipv4/fib_frontend.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv4/fib_frontend.c 2009-11-26 22:50:50.000000000 +0000 @@ -6,6 +6,10 @@ * IPv4 Forwarding Information Base: FIB frontend. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -45,6 +49,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -451,6 +460,11 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct fib_config cfg; @@ -465,6 +479,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -473,12 +503,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = tb->tb_insert(tb, &cfg); else @@ -585,6 +621,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -607,6 +653,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -622,6 +678,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -634,7 +696,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -659,6 +721,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -rNuad linux-2.6.30/net/ipv4/fib_hash.c linux-2.6.30-ghost/net/ipv4/fib_hash.c --- linux-2.6.30/net/ipv4/fib_hash.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv4/fib_hash.c 2009-11-26 22:50:50.000000000 +0000 @@ -6,6 +6,11 @@ * IPv4 FIB: lookup engine and maintenance routines. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_hash_insert, bad + * field check in fib_seq_show). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -41,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static struct kmem_cache *fn_hash_kmem __read_mostly; @@ -397,6 +407,18 @@ if (IS_ERR(fi)) return PTR_ERR(fi); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_insert */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if (fz->fz_nent > (fz->fz_divisor<<1) && fz->fz_divisor < FZ_MAX_DIVISOR && (cfg->fc_dst_len == 32 || @@ -580,7 +602,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_delete */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != cfg->fc_tos) break; @@ -1022,19 +1054,39 @@ prefix = f->fn_key; mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); - if (fi) + if (fi) + { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) + { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, - "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - fi->fib_dev ? fi->fib_dev->name : "*", prefix, - fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, - mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), - fi->fib_window, - fi->fib_rtt >> 3, &len); - else + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); +#endif /* CONFIG_GHOSTIFICATION */ + } + else { seq_printf(seq, - "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); + } seq_printf(seq, "%*s\n", 127 - len, ""); out: return 0; diff -rNuad linux-2.6.30/net/ipv4/fib_semantics.c linux-2.6.30-ghost/net/ipv4/fib_semantics.c --- linux-2.6.30/net/ipv4/fib_semantics.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv4/fib_semantics.c 2009-11-26 22:50:50.000000000 +0000 @@ -11,6 +11,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -43,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -954,6 +962,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -rNuad linux-2.6.30/net/ipv4/fib_trie.c linux-2.6.30-ghost/net/ipv4/fib_trie.c --- linux-2.6.30/net/ipv4/fib_trie.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv4/fib_trie.c 2009-11-26 22:50:50.000000000 +0000 @@ -12,6 +12,12 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -80,6 +86,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1199,6 +1210,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1627,7 +1650,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2587,7 +2620,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2600,13 +2654,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -rNuad linux-2.6.30/net/ipv4/igmp.c linux-2.6.30-ghost/net/ipv4/igmp.c --- linux-2.6.30/net/ipv4/igmp.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv4/igmp.c 2009-11-26 22:50:50.000000000 +0000 @@ -68,6 +68,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -105,6 +107,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2387,8 +2394,18 @@ #endif if (state->in_dev->mc_list == im) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", + state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); + } +#else seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2550,14 +2567,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.30/net/ipv4/route.c linux-2.6.30-ghost/net/ipv4/route.c --- linux-2.6.30/net/ipv4/route.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv4/route.c 2009-11-26 22:50:50.000000000 +0000 @@ -55,6 +55,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -108,6 +111,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp) \ ((u32)(oldflp->fl4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) @@ -375,6 +383,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->u.dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->u.dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; int len; @@ -392,11 +408,11 @@ r->fl.fl4_tos, r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, r->u.dst.hh ? (r->u.dst.hh->hh_output == - dev_queue_xmit) : 0, + dev_queue_xmit) : 0, r->rt_spec_dst, &len); seq_printf(seq, "%*s\n", 127 - len, ""); - } + } return 0; } @@ -2793,8 +2809,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); } - if (rt->u.dst.dev) + if (rt->u.dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->u.dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); + } #ifdef CONFIG_NET_CLS_ROUTE if (rt->u.dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); @@ -2877,7 +2898,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -2899,6 +2920,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -2931,6 +2963,22 @@ if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->u.dst.dev) { + ghost_debugmsg("Net device is %s ",rt->u.dst.dev->name); + if (is_a_ghost_interface_name(rt->u.dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->u.dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ err = rt_fill_info(net, skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -2945,6 +2993,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -rNuad linux-2.6.30/net/ipv6/Kconfig linux-2.6.30-ghost/net/ipv6/Kconfig --- linux-2.6.30/net/ipv6/Kconfig 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv6/Kconfig 2009-11-26 22:50:50.000000000 +0000 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select INET6_XFRM_TUNNEL select XFRM_IPCOMP ---help--- @@ -105,7 +109,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -114,16 +118,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -132,7 +136,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -141,7 +145,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -150,14 +154,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -174,7 +178,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -rNuad linux-2.6.30/net/ipv6/addrconf.c linux-2.6.30-ghost/net/ipv6/addrconf.c --- linux-2.6.30/net/ipv6/addrconf.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv6/addrconf.c 2009-11-26 22:50:50.000000000 +0000 @@ -36,6 +36,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -81,6 +84,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -446,6 +454,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2126,6 +2214,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx, unsigned int plen) { @@ -2140,6 +2232,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -2954,6 +3055,22 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", + &ifp->addr, + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", &ifp->addr, ifp->idev->dev->ifindex, @@ -2961,6 +3078,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3168,6 +3287,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3185,7 +3308,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3234,6 +3359,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3271,6 +3400,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3436,6 +3574,12 @@ ANYCAST_ADDR, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3461,6 +3605,17 @@ ip_idx = 0; if ((idev = in6_dev_get(dev)) == NULL) goto cont; + +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + read_lock_bh(&idev->lock); switch (type) { case UNICAST_ADDR: @@ -3532,7 +3687,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3540,6 +3694,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3566,6 +3724,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((ifa = ipv6_get_ifaddr(net, addr, dev, 1)) == NULL) { err = -EADDRNOTAVAIL; goto errout; @@ -3774,6 +3943,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -3785,6 +3958,14 @@ read_lock(&dev_base_lock); idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if ((idev = in6_dev_get(dev)) == NULL) @@ -3812,7 +3993,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -rNuad linux-2.6.30/net/ipv6/ip6_fib.c linux-2.6.30-ghost/net/ipv6/ip6_fib.c --- linux-2.6.30/net/ipv6/ip6_fib.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv6/ip6_fib.c 2009-11-26 22:50:50.000000000 +0000 @@ -275,6 +275,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -320,7 +322,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -rNuad linux-2.6.30/net/ipv6/mcast.c linux-2.6.30-ghost/net/ipv6/mcast.c --- linux-2.6.30/net/ipv6/mcast.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv6/mcast.c 2009-11-26 22:54:01.000000000 +0000 @@ -24,6 +24,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -61,6 +65,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2432,6 +2441,11 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); seq_printf(seq, "%-4d %-15s %pi6 %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2439,6 +2453,16 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else + seq_printf(seq, + "%-4d %-15s %pi6 %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + &im->mca_addr, + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2593,6 +2617,11 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); seq_printf(seq, "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2600,6 +2629,16 @@ &psf->sf_addr, psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + &state->im->mca_addr, + &psf->sf_addr, + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.30/net/ipv6/proc.c linux-2.6.30-ghost/net/ipv6/proc.c --- linux-2.6.30/net/ipv6/proc.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv6/proc.c 2009-11-26 22:51:47.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,6 +31,16 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#endif /* CONFIG_GHOSTIFICATION */ + static int sockstat6_seq_show(struct seq_file *seq, void *v) { struct net *net = seq->private; @@ -194,6 +206,18 @@ return single_open_net(inode, file, snmp6_seq_show); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -201,6 +225,7 @@ .llseek = seq_lseek, .release = single_release_net, }; +#endif /* CONFIG_GHOSTIFICATION */ static int snmp6_dev_seq_show(struct seq_file *seq, void *v) { diff -rNuad linux-2.6.30/net/ipv6/route.c linux-2.6.30-ghost/net/ipv6/route.c --- linux-2.6.30/net/ipv6/route.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/ipv6/route.c 2009-11-26 22:50:50.000000000 +0000 @@ -22,6 +22,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -60,6 +64,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1115,10 +1124,6 @@ return hoplimit; } -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1830,6 +1835,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2133,26 +2140,84 @@ return err; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2172,6 +2237,10 @@ + nla_total_size(sizeof(struct rta_cacheinfo)); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc + */ static int rt6_fill_node(struct net *net, struct sk_buff *skb, struct rt6_info *rt, struct in6_addr *dst, struct in6_addr *src, @@ -2183,6 +2252,19 @@ long expires; u32 table; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2290,10 +2372,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2307,6 +2405,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2452,6 +2552,17 @@ { struct seq_file *m = p_arg; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen); #ifdef CONFIG_IPV6_SUBTREES diff -rNuad linux-2.6.30/net/netfilter/core.c linux-2.6.30-ghost/net/netfilter/core.c --- linux-2.6.30/net/netfilter/core.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/netfilter/core.c 2009-11-26 22:54:38.000000000 +0000 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -22,6 +24,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -59,7 +66,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -169,7 +175,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { @@ -182,6 +339,9 @@ verdict >> NF_VERDICT_BITS)) goto next_hook; } +#ifdef CONFIG_GHOSTIFICATION_NETFILTER +unlock: +#endif rcu_read_unlock(); return ret; } diff -rNuad linux-2.6.30/net/packet/af_packet.c linux-2.6.30-ghost/net/packet/af_packet.c --- linux-2.6.30/net/packet/af_packet.c 2009-06-10 03:05:27.000000000 +0000 +++ linux-2.6.30-ghost/net/packet/af_packet.c 2009-11-26 22:50:50.000000000 +0000 @@ -39,6 +39,7 @@ * will simply extend the hardware address * byte arrays at the end of sockaddr_ll * and packet_mreq. + * Luca Saiu : Trivial changes for ghostification * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +84,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -489,6 +495,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -611,6 +629,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -2049,17 +2079,38 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, - "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", - s, - atomic_read(&s->sk_refcnt), - s->sk_type, - ntohs(po->num), - po->ifindex, - po->running, - atomic_read(&s->sk_rmem_alloc), - sock_i_uid(s), - sock_i_ino(s) ); + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.30_x86_640000600000175000017500000005527612167200764024263 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.30 # Fri Nov 27 10:13:36 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set # CONFIG_M686 is not set # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set CONFIG_MK8=y # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_CPU=y CONFIG_X86_L1_CACHE_BYTES=64 CONFIG_X86_INTERNODE_CACHE_BYTES=64 # CONFIG_X86_CMPXCHG is not set CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=3 CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_UML_X86=y CONFIG_64BIT=y # CONFIG_X86_32 is not set # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_3_LEVEL_PGTABLES=y # CONFIG_ARCH_HAS_SC_SIGNALS is not set # CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA is not set CONFIG_SMP_BROKEN=y CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_UNEVICTABLE_LRU=y CONFIG_HAVE_MLOCK=y CONFIG_HAVE_MLOCKED_PAGE_BIT=y CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y CONFIG_KERNEL_STACK_ORDER=1 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set # # RCU Subsystem # CONFIG_CLASSIC_RCU=y # CONFIG_TREE_RCU is not set # CONFIG_PREEMPT_RCU is not set # CONFIG_TREE_RCU_TRACE is not set # CONFIG_PREEMPT_RCU_TRACE is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_GROUP_SCHED is not set # CONFIG_CGROUPS is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_NET_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y # CONFIG_STRIP_ASM_SYMS is not set CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_COMPAT_BRK=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_MARKERS is not set # CONFIG_SLOW_WORK is not set # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_HL=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_HL=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_PHONET is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y # CONFIG_NET_SCH_MULTIQ is not set CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y # CONFIG_WIRELESS is not set # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y CONFIG_COMPAT_NET_DEV_OPS=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_FILE_LOCKING=y # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set # CONFIG_MISC_FILESYSTEMS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # # CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set CONFIG_CRYPTO_WORKQUEUE=y # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=y # CONFIG_CRYPTO_AES_NI_INTEL is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set CONFIG_CRYPTO_SALSA20_X86_64=y # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set CONFIG_CRYPTO_TWOFISH_COMMON=y CONFIG_CRYPTO_TWOFISH_X86_64=y # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_ZLIB is not set # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # CONFIG_BINARY_PRINTF is not set # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_FIND_LAST_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_HAS_DMA=y CONFIG_NLATTR=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_SYSCTL_SYSCALL_CHECK=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.27-ghost.patch0000600000175000017500000030577312167200764025665 0ustar lucaslucasdiff -rNuad linux-2.6.27/arch/um/drivers/vde_user.c linux-2.6.27-ghost/arch/um/drivers/vde_user.c --- linux-2.6.27/arch/um/drivers/vde_user.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/arch/um/drivers/vde_user.c 2009-11-24 22:37:47.000000000 +0100 @@ -77,8 +77,8 @@ void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init) { struct vde_open_args *args; - - vpri->args = kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL); + /* (ghost support) kmalloc is used instead of uml_kmalloc */ + vpri->args = uml_kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL); if (vpri->args == NULL) { printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args " "allocation failed"); diff -rNuad linux-2.6.27/include/linux/netdevice.h linux-2.6.27-ghost/include/linux/netdevice.h --- linux-2.6.27/include/linux/netdevice.h 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/include/linux/netdevice.h 2009-11-24 22:37:47.000000000 +0100 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -1728,4 +1730,12 @@ #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_DEV_H */ diff -rNuad linux-2.6.27/include/linux/sockios.h linux-2.6.27-ghost/include/linux/sockios.h --- linux-2.6.27/include/linux/sockios.h 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/include/linux/sockios.h 2009-11-24 22:37:47.000000000 +0100 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,13 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNuad linux-2.6.27/include/net/ghostdebug.h linux-2.6.27-ghost/include/net/ghostdebug.h --- linux-2.6.27/include/net/ghostdebug.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.27-ghost/include/net/ghostdebug.h 2009-11-24 22:39:14.000000000 +0100 @@ -0,0 +1,93 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg(msg,args...) +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost) " msg "\n", ##args) +#else +#define ghost_ptk(msg,args...) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -rNuad linux-2.6.27/kernel/softirq.c linux-2.6.27-ghost/kernel/softirq.c --- linux-2.6.27/kernel/softirq.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/kernel/softirq.c 2009-11-24 22:43:09.000000000 +0100 @@ -121,8 +121,11 @@ */ void _local_bh_enable(void) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); WARN_ON_ONCE(!irqs_disabled()); +#endif if (softirq_count() == SOFTIRQ_OFFSET) trace_softirqs_on((unsigned long)__builtin_return_address(0)); @@ -133,7 +136,10 @@ static inline void _local_bh_enable_ip(unsigned long ip) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq() || irqs_disabled()); +#endif #ifdef CONFIG_TRACE_IRQFLAGS local_irq_disable(); #endif diff -rNuad linux-2.6.27/net/core/dev.c linux-2.6.27-ghost/net/core/dev.c --- linux-2.6.27/net/core/dev.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/core/dev.c 2009-11-24 22:37:47.000000000 +0100 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -131,6 +134,230 @@ #include "net-sysfs.h" /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -550,6 +777,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -2510,11 +2744,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -2582,24 +2825,27 @@ static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev) { struct net_device_stats *stats = dev->get_stats(dev); - - seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " - "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", - dev->name, stats->rx_bytes, stats->rx_packets, - stats->rx_errors, - stats->rx_dropped + stats->rx_missed_errors, - stats->rx_fifo_errors, - stats->rx_length_errors + stats->rx_over_errors + - stats->rx_crc_errors + stats->rx_frame_errors, - stats->rx_compressed, stats->multicast, - stats->tx_bytes, stats->tx_packets, - stats->tx_errors, stats->tx_dropped, - stats->tx_fifo_errors, stats->collisions, - stats->tx_carrier_errors + - stats->tx_aborted_errors + - stats->tx_window_errors + - stats->tx_heartbeat_errors, - stats->tx_compressed); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ + seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " + "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", + dev->name, stats->rx_bytes, stats->rx_packets, + stats->rx_errors, + stats->rx_dropped + stats->rx_missed_errors, + stats->rx_fifo_errors, + stats->rx_length_errors + stats->rx_over_errors + + stats->rx_crc_errors + stats->rx_frame_errors, + stats->rx_compressed, stats->multicast, + stats->tx_bytes, stats->tx_packets, + stats->tx_errors, stats->tx_dropped, + stats->tx_fifo_errors, stats->collisions, + stats->tx_carrier_errors + + stats->tx_aborted_errors + + stats->tx_window_errors + + stats->tx_heartbeat_errors, + stats->tx_compressed); } /* @@ -3450,6 +3696,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = dev_get_flags(dev); @@ -3517,6 +3773,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -3660,6 +3927,57 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ + /* * These ioctl calls: * - can be done by all. diff -rNuad linux-2.6.27/net/core/dev_mcast.c linux-2.6.27-ghost/net/core/dev_mcast.c --- linux-2.6.27/net/core/dev_mcast.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/core/dev_mcast.c 2009-11-24 22:37:47.000000000 +0100 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes for + * ghostification support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,9 @@ #include #include +#ifdef CONFIG_GHOSTIFICATION +#include +#endif /* CONFIG_GHOSTIFICATION */ /* * Device multicast list maintenance. @@ -167,7 +172,15 @@ netif_addr_lock_bh(dev); for (m = dev->mc_list; m; m = m->next) { int i; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information + in /proc about ghost interfaces */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Don't show any information in /proc " + "about ghostified interface"); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNuad linux-2.6.27/net/core/rtnetlink.c linux-2.6.27-ghost/net/core/rtnetlink.c --- linux-2.6.27/net/core/rtnetlink.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/core/rtnetlink.c 2009-11-24 22:37:47.000000000 +0100 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; @@ -106,7 +115,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].doit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -117,7 +129,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].dumpit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -460,6 +475,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -615,6 +636,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -686,6 +721,24 @@ idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -925,6 +978,18 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ if ((err = validate_linkmsg(dev, tb)) < 0) goto errout_dev; @@ -963,6 +1028,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1165,6 +1241,17 @@ dev = dev_get_by_index(net, ifm->ifi_index); if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ } else return -EINVAL; @@ -1219,6 +1306,8 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1253,6 +1342,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -1272,14 +1366,21 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; - +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ __rtnl_unlock(); rtnl = net->rtnl; err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); @@ -1311,6 +1412,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -1326,6 +1432,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); diff -rNuad linux-2.6.27/net/ipv4/arp.c linux-2.6.27-ghost/net/ipv4/arp.c --- linux-2.6.27/net/ipv4/arp.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv4/arp.c 2009-11-24 22:37:47.000000000 +0100 @@ -70,6 +70,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -116,6 +118,11 @@ struct neigh_table *clip_tbl_hook; #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1309,9 +1316,21 @@ } #endif sprintf(tbuf, NIPQUAD_FMT, NIPQUAD(*(u32*)n->primary_key)); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show anything in /proc if it involves + ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1322,9 +1341,21 @@ char tbuf[16]; sprintf(tbuf, NIPQUAD_FMT, NIPQUAD(*(u32*)n->key)); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -rNuad linux-2.6.27/net/ipv4/devinet.c linux-2.6.27-ghost/net/ipv4/devinet.c --- linux-2.6.27/net/ipv4/devinet.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv4/devinet.c 2009-11-24 22:37:47.000000000 +0100 @@ -23,6 +23,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -62,6 +65,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, @@ -455,6 +463,16 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ __in_dev_put(in_dev); @@ -504,6 +522,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -553,6 +582,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1170,6 +1205,15 @@ s_ip_idx = ip_idx = cb->args[1]; idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (idx > s_idx) diff -rNuad linux-2.6.27/net/ipv4/fib_frontend.c linux-2.6.27-ghost/net/ipv4/fib_frontend.c --- linux-2.6.27/net/ipv4/fib_frontend.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv4/fib_frontend.c 2009-11-24 22:37:47.000000000 +0100 @@ -6,6 +6,10 @@ * IPv4 Forwarding Information Base: FIB frontend. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -45,6 +49,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -451,6 +460,11 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct fib_config cfg; @@ -465,6 +479,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -473,12 +503,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = tb->tb_insert(tb, &cfg); else @@ -585,6 +621,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -607,6 +653,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -622,6 +678,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -634,7 +696,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -659,6 +721,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -rNuad linux-2.6.27/net/ipv4/fib_hash.c linux-2.6.27-ghost/net/ipv4/fib_hash.c --- linux-2.6.27/net/ipv4/fib_hash.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv4/fib_hash.c 2009-11-24 22:37:47.000000000 +0100 @@ -6,6 +6,11 @@ * IPv4 FIB: lookup engine and maintenance routines. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_hash_insert, bad + * field check in fib_seq_show). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -41,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static struct kmem_cache *fn_hash_kmem __read_mostly; @@ -397,6 +407,18 @@ if (IS_ERR(fi)) return PTR_ERR(fi); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_insert */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if (fz->fz_nent > (fz->fz_divisor<<1) && fz->fz_divisor < FZ_MAX_DIVISOR && (cfg->fc_dst_len == 32 || @@ -580,7 +602,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_delete */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != cfg->fc_tos) break; @@ -1022,19 +1054,39 @@ prefix = f->fn_key; mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); - if (fi) + if (fi) + { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) + { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, - "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - fi->fib_dev ? fi->fib_dev->name : "*", prefix, - fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, - mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), - fi->fib_window, - fi->fib_rtt >> 3, &len); - else + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); +#endif /* CONFIG_GHOSTIFICATION */ + } + else { seq_printf(seq, - "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); + } seq_printf(seq, "%*s\n", 127 - len, ""); out: return 0; diff -rNuad linux-2.6.27/net/ipv4/fib_semantics.c linux-2.6.27-ghost/net/ipv4/fib_semantics.c --- linux-2.6.27/net/ipv4/fib_semantics.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv4/fib_semantics.c 2009-11-24 22:37:47.000000000 +0100 @@ -11,6 +11,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -43,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -953,6 +961,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -rNuad linux-2.6.27/net/ipv4/fib_trie.c linux-2.6.27-ghost/net/ipv4/fib_trie.c --- linux-2.6.27/net/ipv4/fib_trie.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv4/fib_trie.c 2009-11-24 22:37:47.000000000 +0100 @@ -12,6 +12,12 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -80,6 +86,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1195,6 +1206,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1623,7 +1646,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2583,7 +2616,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2596,13 +2650,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -rNuad linux-2.6.27/net/ipv4/igmp.c linux-2.6.27-ghost/net/ipv4/igmp.c --- linux-2.6.27/net/ipv4/igmp.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv4/igmp.c 2009-11-24 22:37:47.000000000 +0100 @@ -68,6 +68,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -105,6 +107,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2382,8 +2389,18 @@ #endif if (state->in_dev->mc_list == im) { - seq_printf(seq, "%d\t%-10s: %5d %7s\n", - state->dev->ifindex, state->dev->name, state->dev->mc_count, querier); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, + state->dev->name, state->dev->mc_count, querier); + } +#else + seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, + state->dev->name, state->dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2543,14 +2560,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.27/net/ipv4/route.c linux-2.6.27-ghost/net/ipv4/route.c --- linux-2.6.27/net/ipv4/route.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv4/route.c 2009-11-24 22:37:47.000000000 +0100 @@ -55,6 +55,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -108,6 +111,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp) \ ((u32)(oldflp->fl4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) @@ -368,6 +376,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->u.dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->u.dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; int len; @@ -385,11 +401,11 @@ r->fl.fl4_tos, r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, r->u.dst.hh ? (r->u.dst.hh->hh_output == - dev_queue_xmit) : 0, + dev_queue_xmit) : 0, r->rt_spec_dst, &len); seq_printf(seq, "%*s\n", 127 - len, ""); - } + } return 0; } @@ -2675,8 +2691,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); } - if (rt->u.dst.dev) + if (rt->u.dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->u.dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); + } #ifdef CONFIG_NET_CLS_ROUTE if (rt->u.dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); @@ -2759,7 +2780,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -2781,6 +2802,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -2806,13 +2838,31 @@ err = ip_route_output_key(net, &rt, &fl); } - if (err) + if (err) { goto errout_free; + } skb->rtable = rt; if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->u.dst.dev) { + ghost_debugmsg("Net device is %s ",rt->u.dst.dev->name); + if (is_a_ghost_interface_name(rt->u.dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->u.dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ + err = rt_fill_info(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -2827,6 +2877,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -rNuad linux-2.6.27/net/ipv6/addrconf.c linux-2.6.27-ghost/net/ipv6/addrconf.c --- linux-2.6.27/net/ipv6/addrconf.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv6/addrconf.c 2009-11-24 22:37:47.000000000 +0100 @@ -36,6 +36,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -80,6 +83,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -445,6 +453,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2143,6 +2231,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx, unsigned int plen) { @@ -2157,6 +2249,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -2986,6 +3087,23 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, + NIP6_SEQFMT " %02x %02x %02x %02x %8s\n", + NIP6(ifp->addr), + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, NIP6_SEQFMT " %02x %02x %02x %02x %8s\n", NIP6(ifp->addr), @@ -2994,6 +3112,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3201,6 +3321,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3218,7 +3342,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3267,6 +3393,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3304,6 +3434,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3469,6 +3608,12 @@ ANYCAST_ADDR, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3494,6 +3639,17 @@ ip_idx = 0; if ((idev = in6_dev_get(dev)) == NULL) goto cont; + +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + read_lock_bh(&idev->lock); switch (type) { case UNICAST_ADDR: @@ -3565,7 +3721,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3573,6 +3728,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3599,6 +3758,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((ifa = ipv6_get_ifaddr(net, addr, dev, 1)) == NULL) { err = -EADDRNOTAVAIL; goto errout; @@ -3806,6 +3976,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -3817,6 +3991,14 @@ read_lock(&dev_base_lock); idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if ((idev = in6_dev_get(dev)) == NULL) @@ -3844,7 +4026,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -rNuad linux-2.6.27/net/ipv6/ip6_fib.c linux-2.6.27-ghost/net/ipv6/ip6_fib.c --- linux-2.6.27/net/ipv6/ip6_fib.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv6/ip6_fib.c 2009-11-24 22:37:47.000000000 +0100 @@ -275,6 +275,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -316,7 +318,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -rNuad linux-2.6.27/net/ipv6/Kconfig linux-2.6.27-ghost/net/ipv6/Kconfig --- linux-2.6.27/net/ipv6/Kconfig 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv6/Kconfig 2009-11-24 22:37:47.000000000 +0100 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select INET6_XFRM_TUNNEL select XFRM_IPCOMP ---help--- @@ -105,7 +109,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -114,16 +118,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -132,7 +136,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -141,7 +145,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -150,14 +154,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -174,7 +178,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -rNuad linux-2.6.27/net/ipv6/mcast.c linux-2.6.27-ghost/net/ipv6/mcast.c --- linux-2.6.27/net/ipv6/mcast.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv6/mcast.c 2009-11-24 22:37:47.000000000 +0100 @@ -24,6 +24,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -61,6 +65,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2429,6 +2438,20 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, + "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + NIP6(im->mca_addr), + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else seq_printf(seq, "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2436,6 +2459,7 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2590,6 +2614,20 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s " NIP6_SEQFMT " " NIP6_SEQFMT " %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + NIP6(state->im->mca_addr), + NIP6(psf->sf_addr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else seq_printf(seq, "%3d %6.6s " NIP6_SEQFMT " " NIP6_SEQFMT " %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2597,6 +2635,7 @@ NIP6(psf->sf_addr), psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.27/net/ipv6/proc.c linux-2.6.27-ghost/net/ipv6/proc.c --- linux-2.6.27/net/ipv6/proc.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv6/proc.c 2009-11-24 22:37:47.000000000 +0100 @@ -9,6 +9,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,7 +31,19 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +#ifdef CONFIG_GHOSTIFICATION +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#else static struct proc_dir_entry *proc_net_devsnmp6; +#endif /* CONFIG_GHOSTIFICATION */ static int sockstat6_seq_show(struct seq_file *seq, void *v) { @@ -199,6 +213,18 @@ return single_open(file, snmp6_seq_show, PDE(inode)->data); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -206,6 +232,7 @@ .llseek = seq_lseek, .release = single_release, }; +#endif /* CONFIG_GHOSTIFICATION */ int snmp6_register_dev(struct inet6_dev *idev) { diff -rNuad linux-2.6.27/net/ipv6/route.c linux-2.6.27-ghost/net/ipv6/route.c --- linux-2.6.27/net/ipv6/route.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/ipv6/route.c 2009-11-24 22:37:47.000000000 +0100 @@ -22,6 +22,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -60,6 +64,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1061,10 +1070,6 @@ return hoplimit; } -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1776,6 +1781,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2067,26 +2074,84 @@ return err; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2106,6 +2171,10 @@ + nla_total_size(sizeof(struct rta_cacheinfo)); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc + */ static int rt6_fill_node(struct net *net, struct sk_buff *skb, struct rt6_info *rt, struct in6_addr *dst, struct in6_addr *src, @@ -2117,6 +2186,19 @@ long expires; u32 table; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2224,10 +2306,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2241,6 +2339,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2385,6 +2485,18 @@ { struct seq_file *m = p_arg; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ + seq_printf(m, NIP6_SEQFMT " %02x ", NIP6(rt->rt6i_dst.addr), rt->rt6i_dst.plen); diff -rNuad linux-2.6.27/net/Kconfig linux-2.6.27-ghost/net/Kconfig --- linux-2.6.27/net/Kconfig 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/Kconfig 2009-11-24 22:37:47.000000000 +0100 @@ -172,6 +172,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -248,4 +347,93 @@ source "net/rfkill/Kconfig" source "net/9p/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET diff -rNuad linux-2.6.27/net/netfilter/core.c linux-2.6.27-ghost/net/netfilter/core.c --- linux-2.6.27/net/netfilter/core.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/netfilter/core.c 2009-11-24 22:37:47.000000000 +0100 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -22,6 +24,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -59,7 +66,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -177,7 +183,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { diff -rNuad linux-2.6.27/net/packet/af_packet.c linux-2.6.27-ghost/net/packet/af_packet.c --- linux-2.6.27/net/packet/af_packet.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6.27-ghost/net/packet/af_packet.c 2009-11-24 22:37:47.000000000 +0100 @@ -39,6 +39,7 @@ * will simply extend the hardware address * byte arrays at the end of sockaddr_ll * and packet_mreq. + * Luca Saiu : Trivial changes for ghostification * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -82,6 +83,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -487,6 +493,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -609,6 +627,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -2042,17 +2072,38 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, - "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", - s, - atomic_read(&s->sk_refcnt), - s->sk_type, - ntohs(po->num), - po->ifindex, - po->running, - atomic_read(&s->sk_rmem_alloc), - sock_i_uid(s), - sock_i_ino(s) ); + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.270000600000175000017500000005445012167200764023244 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.27 # Fri Nov 27 12:24:52 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # CONFIG_STATIC_LINK is not set # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set CONFIG_M686=y # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP2 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_GENERIC=y CONFIG_X86_CPU=y CONFIG_X86_CMPXCHG=y CONFIG_X86_L1_CACHE_SHIFT=7 CONFIG_X86_XADD=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=4 CONFIG_X86_DEBUGCTLMSR=y CONFIG_UML_X86=y CONFIG_X86_32=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y # CONFIG_64BIT is not set # CONFIG_3_LEVEL_PGTABLES is not set CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y CONFIG_GENERIC_HWEIGHT=y CONFIG_ARCH_SUPPORTS_AOUT=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y # CONFIG_SPARSEMEM_STATIC is not set # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_RESOURCES_64BIT is not set CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y # CONFIG_HIGHMEM is not set CONFIG_KERNEL_STACK_ORDER=0 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_CGROUPS is not set # CONFIG_GROUP_SCHED is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_COMPAT_BRK=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_ANON_INODES=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_MARKERS is not set # CONFIG_HAVE_OPROFILE is not set # CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set # CONFIG_HAVE_IOREMAP_PROT is not set # CONFIG_HAVE_KPROBES is not set # CONFIG_HAVE_KRETPROBES is not set # CONFIG_HAVE_ARCH_TRACEHOOK is not set # CONFIG_HAVE_DMA_ATTRS is not set # CONFIG_USE_GENERIC_SMP_HELPERS is not set # CONFIG_HAVE_CLK is not set CONFIG_PROC_PAGE_MONITOR=y # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_LBD is not set # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_LSF is not set # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" CONFIG_CLASSIC_RCU=y CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set # CONFIG_IP_VS is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y # # IP: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_RECENT=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_RAW=y # # Bridge: Netfilter Configuration # CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y # # Wireless # # CONFIG_CFG80211 is not set # CONFIG_WIRELESS_EXT is not set # CONFIG_MAC80211 is not set # CONFIG_IEEE80211 is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # CONFIG_IWLWIFI_LEDS is not set # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4DEV_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_MANAGER=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # # CONFIG_CRYPTO_CRC32C is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # # CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_AES_586 is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_586 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_586 is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set CONFIG_CRYPTO_HW=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_PLIST=y CONFIG_HAS_DMA=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y CONFIG_SYSCTL_SYSCALL_CHECK=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.26_x86_640000600000175000017500000005315612167200764024263 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.26 # Fri Nov 27 10:26:00 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # CONFIG_STATIC_LINK is not set # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set # CONFIG_M686 is not set # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set CONFIG_MK8=y # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP2 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_CPU=y # CONFIG_X86_CMPXCHG is not set CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_GOOD_APIC=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_MINIMUM_CPU_FAMILY=3 CONFIG_X86_DEBUGCTLMSR=y CONFIG_UML_X86=y CONFIG_64BIT=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_3_LEVEL_PGTABLES=y # CONFIG_ARCH_HAS_SC_SIGNALS is not set # CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA is not set CONFIG_SMP_BROKEN=y CONFIG_GENERIC_HWEIGHT=y CONFIG_ARCH_SUPPORTS_AOUT=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y # CONFIG_SPARSEMEM_STATIC is not set # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_RESOURCES_64BIT=y CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y CONFIG_KERNEL_STACK_ORDER=1 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_CGROUPS is not set # CONFIG_GROUP_SCHED is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_SYSCTL_SYSCALL_CHECK=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_COMPAT_BRK=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_ANON_INODES=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_MARKERS is not set # CONFIG_HAVE_OPROFILE is not set # CONFIG_HAVE_KPROBES is not set # CONFIG_HAVE_KRETPROBES is not set # CONFIG_HAVE_DMA_ATTRS is not set CONFIG_PROC_PAGE_MONITOR=y CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_BLK_DEV_BSG is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" CONFIG_CLASSIC_RCU=y CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # CONFIG_FW_LOADER is not set # CONFIG_SYS_HYPERVISOR is not set # # Networking # CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set # CONFIG_IP_VS is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y # # IP: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_RECENT=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_RAW=y # # DECnet: Netfilter Configuration # # CONFIG_DECNET_NF_GRABULATOR is not set # # Bridge: Netfilter Configuration # CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_BRIDGE=y CONFIG_VLAN_8021Q=y CONFIG_DECNET=y # CONFIG_DECNET_ROUTER is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y # # Wireless # # CONFIG_CFG80211 is not set # CONFIG_WIRELESS_EXT is not set # CONFIG_MAC80211 is not set # CONFIG_IEEE80211 is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y CONFIG_NETDEVICES_MULTIQUEUE=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # CONFIG_IWLWIFI_LEDS is not set # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4DEV_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BIND34=y CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_MANAGER=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # # CONFIG_CRYPTO_CRC32C is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=y # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set CONFIG_CRYPTO_SALSA20_X86_64=y # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set CONFIG_CRYPTO_TWOFISH_COMMON=y CONFIG_CRYPTO_TWOFISH_X86_64=y # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_LZO is not set CONFIG_CRYPTO_HW=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_PLIST=y CONFIG_HAS_DMA=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.26-ghost_debian.patch0000600000175000017500000030411312167200764027151 0ustar lucaslucasdiff -rNuad linux-source-2.6.26/arch/um/drivers/vde_user.c linux-source-2.6.26-ghost/arch/um/drivers/vde_user.c --- linux-source-2.6.26/arch/um/drivers/vde_user.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/arch/um/drivers/vde_user.c 2009-11-29 18:44:01.000000000 +0000 @@ -77,8 +77,8 @@ void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init) { struct vde_open_args *args; - - vpri->args = kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL); + /* (ghost support) kmalloc is used instead of uml_kmalloc */ + vpri->args = uml_kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL); if (vpri->args == NULL) { printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args " "allocation failed"); diff -rNuad linux-source-2.6.26/include/linux/netdevice.h linux-source-2.6.26-ghost/include/linux/netdevice.h --- linux-source-2.6.26/include/linux/netdevice.h 2009-08-19 05:15:08.000000000 +0000 +++ linux-source-2.6.26-ghost/include/linux/netdevice.h 2009-11-29 18:44:01.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -1571,4 +1573,12 @@ #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_DEV_H */ diff -rNuad linux-source-2.6.26/include/linux/sockios.h linux-source-2.6.26-ghost/include/linux/sockios.h --- linux-source-2.6.26/include/linux/sockios.h 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/include/linux/sockios.h 2009-11-29 18:44:01.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,13 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNuad linux-source-2.6.26/include/net/ghostdebug.h linux-source-2.6.26-ghost/include/net/ghostdebug.h --- linux-source-2.6.26/include/net/ghostdebug.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-source-2.6.26-ghost/include/net/ghostdebug.h 2009-11-29 18:44:01.000000000 +0000 @@ -0,0 +1,91 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_INFO \ + "(ghost) " msg "\n", ##args) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -rNuad linux-source-2.6.26/net/Kconfig linux-source-2.6.26-ghost/net/Kconfig --- linux-source-2.6.26/net/Kconfig 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/Kconfig 2009-11-29 18:44:01.000000000 +0000 @@ -175,6 +175,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -250,6 +349,95 @@ source "net/rfkill/Kconfig" source "net/9p/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET endmenu # Networking diff -rNuad linux-source-2.6.26/net/core/dev.c linux-source-2.6.26-ghost/net/core/dev.c --- linux-source-2.6.26/net/core/dev.c 2009-08-19 05:15:10.000000000 +0000 +++ linux-source-2.6.26-ghost/net/core/dev.c 2009-11-29 18:44:01.000000000 +0000 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -124,6 +127,230 @@ #include "net-sysfs.h" /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -529,6 +756,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -2361,11 +2595,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -2433,24 +2676,27 @@ static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev) { struct net_device_stats *stats = dev->get_stats(dev); - - seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " - "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", - dev->name, stats->rx_bytes, stats->rx_packets, - stats->rx_errors, - stats->rx_dropped + stats->rx_missed_errors, - stats->rx_fifo_errors, - stats->rx_length_errors + stats->rx_over_errors + - stats->rx_crc_errors + stats->rx_frame_errors, - stats->rx_compressed, stats->multicast, - stats->tx_bytes, stats->tx_packets, - stats->tx_errors, stats->tx_dropped, - stats->tx_fifo_errors, stats->collisions, - stats->tx_carrier_errors + - stats->tx_aborted_errors + - stats->tx_window_errors + - stats->tx_heartbeat_errors, - stats->tx_compressed); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ + seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " + "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", + dev->name, stats->rx_bytes, stats->rx_packets, + stats->rx_errors, + stats->rx_dropped + stats->rx_missed_errors, + stats->rx_fifo_errors, + stats->rx_length_errors + stats->rx_over_errors + + stats->rx_crc_errors + stats->rx_frame_errors, + stats->rx_compressed, stats->multicast, + stats->tx_bytes, stats->tx_packets, + stats->tx_errors, stats->tx_dropped, + stats->tx_fifo_errors, stats->collisions, + stats->tx_carrier_errors + + stats->tx_aborted_errors + + stats->tx_window_errors + + stats->tx_heartbeat_errors, + stats->tx_compressed); } /* @@ -3262,6 +3508,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = dev_get_flags(dev); @@ -3329,6 +3585,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -3472,6 +3739,57 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ + /* * These ioctl calls: * - can be done by all. diff -rNuad linux-source-2.6.26/net/core/dev_mcast.c linux-source-2.6.26-ghost/net/core/dev_mcast.c --- linux-source-2.6.26/net/core/dev_mcast.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/core/dev_mcast.c 2009-11-29 18:44:01.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes for + * ghostification support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,9 @@ #include #include +#ifdef CONFIG_GHOSTIFICATION +#include +#endif /* CONFIG_GHOSTIFICATION */ /* * Device multicast list maintenance. @@ -167,7 +172,15 @@ netif_tx_lock_bh(dev); for (m = dev->mc_list; m; m = m->next) { int i; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information + in /proc about ghost interfaces */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Don't show any information in /proc " + "about ghostified interface"); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNuad linux-source-2.6.26/net/core/rtnetlink.c linux-source-2.6.26-ghost/net/core/rtnetlink.c --- linux-source-2.6.26/net/core/rtnetlink.c 2009-08-19 05:15:10.000000000 +0000 +++ linux-source-2.6.26-ghost/net/core/rtnetlink.c 2009-11-29 18:44:01.000000000 +0000 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; @@ -106,7 +115,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].doit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -117,7 +129,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].dumpit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -460,6 +475,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -612,6 +633,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -688,6 +723,24 @@ idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -927,6 +980,18 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ if ((err = validate_linkmsg(dev, tb)) < 0) goto errout_dev; @@ -965,6 +1030,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1167,6 +1243,17 @@ dev = dev_get_by_index(net, ifm->ifi_index); if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ } else return -EINVAL; @@ -1221,6 +1308,8 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1255,6 +1344,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -1274,14 +1368,21 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; - +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ __rtnl_unlock(); rtnl = net->rtnl; err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); @@ -1313,6 +1414,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -1328,6 +1434,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); diff -rNuad linux-source-2.6.26/net/ipv4/arp.c linux-source-2.6.26-ghost/net/ipv4/arp.c --- linux-source-2.6.26/net/ipv4/arp.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv4/arp.c 2009-11-29 18:44:01.000000000 +0000 @@ -72,6 +72,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -118,6 +120,11 @@ struct neigh_table *clip_tbl_hook; #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1310,9 +1317,21 @@ } #endif sprintf(tbuf, NIPQUAD_FMT, NIPQUAD(*(u32*)n->primary_key)); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show anything in /proc if it involves + ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1323,9 +1342,21 @@ char tbuf[16]; sprintf(tbuf, NIPQUAD_FMT, NIPQUAD(*(u32*)n->key)); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -rNuad linux-source-2.6.26/net/ipv4/devinet.c linux-source-2.6.26-ghost/net/ipv4/devinet.c --- linux-source-2.6.26/net/ipv4/devinet.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv4/devinet.c 2009-11-29 18:44:01.000000000 +0000 @@ -25,6 +25,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -64,6 +67,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, @@ -455,6 +463,16 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ __in_dev_put(in_dev); @@ -504,6 +522,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -553,6 +582,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1159,6 +1194,15 @@ s_ip_idx = ip_idx = cb->args[1]; idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (idx > s_idx) diff -rNuad linux-source-2.6.26/net/ipv4/fib_frontend.c linux-source-2.6.26-ghost/net/ipv4/fib_frontend.c --- linux-source-2.6.26/net/ipv4/fib_frontend.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv4/fib_frontend.c 2009-11-29 18:44:01.000000000 +0000 @@ -8,6 +8,10 @@ * Version: $Id: fib_frontend.c,v 1.26 2001/10/31 21:55:54 davem Exp $ * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -47,6 +51,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -453,6 +462,11 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct fib_config cfg; @@ -467,6 +481,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -475,12 +505,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = tb->tb_insert(tb, &cfg); else @@ -587,6 +623,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -609,6 +655,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -624,6 +680,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -636,7 +698,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -661,6 +723,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -rNuad linux-source-2.6.26/net/ipv4/fib_hash.c linux-source-2.6.26-ghost/net/ipv4/fib_hash.c --- linux-source-2.6.26/net/ipv4/fib_hash.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv4/fib_hash.c 2009-11-29 18:44:01.000000000 +0000 @@ -8,6 +8,11 @@ * Version: $Id: fib_hash.c,v 1.13 2001/10/31 21:55:54 davem Exp $ * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_hash_insert, bad + * field check in fib_seq_show). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -43,6 +48,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static struct kmem_cache *fn_hash_kmem __read_mostly; @@ -399,6 +409,18 @@ if (IS_ERR(fi)) return PTR_ERR(fi); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_insert */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if (fz->fz_nent > (fz->fz_divisor<<1) && fz->fz_divisor < FZ_MAX_DIVISOR && (cfg->fc_dst_len == 32 || @@ -582,7 +604,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_delete */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != cfg->fc_tos) break; @@ -1024,19 +1056,39 @@ prefix = f->fn_key; mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); - if (fi) + if (fi) + { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) + { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, - "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - fi->fib_dev ? fi->fib_dev->name : "*", prefix, - fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, - mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), - fi->fib_window, - fi->fib_rtt >> 3, &len); - else + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); +#endif /* CONFIG_GHOSTIFICATION */ + } + else { seq_printf(seq, - "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); + } seq_printf(seq, "%*s\n", 127 - len, ""); out: return 0; diff -rNuad linux-source-2.6.26/net/ipv4/fib_semantics.c linux-source-2.6.26-ghost/net/ipv4/fib_semantics.c --- linux-source-2.6.26/net/ipv4/fib_semantics.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv4/fib_semantics.c 2009-11-29 18:44:01.000000000 +0000 @@ -13,6 +13,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -45,6 +48,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -955,6 +963,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -rNuad linux-source-2.6.26/net/ipv4/fib_trie.c linux-source-2.6.26-ghost/net/ipv4/fib_trie.c --- linux-source-2.6.26/net/ipv4/fib_trie.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv4/fib_trie.c 2009-11-29 18:44:01.000000000 +0000 @@ -12,6 +12,12 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -82,6 +88,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1197,6 +1208,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1625,7 +1648,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2603,7 +2636,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2616,13 +2670,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -rNuad linux-source-2.6.26/net/ipv4/igmp.c linux-source-2.6.26-ghost/net/ipv4/igmp.c --- linux-source-2.6.26/net/ipv4/igmp.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv4/igmp.c 2009-11-29 18:44:01.000000000 +0000 @@ -70,6 +70,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -107,6 +109,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2415,8 +2422,18 @@ #endif if (state->in_dev->mc_list == im) { - seq_printf(seq, "%d\t%-10s: %5d %7s\n", - state->dev->ifindex, state->dev->name, state->dev->mc_count, querier); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, + state->dev->name, state->dev->mc_count, querier); + } +#else + seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, + state->dev->name, state->dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2576,14 +2593,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-source-2.6.26/net/ipv4/route.c linux-source-2.6.26-ghost/net/ipv4/route.c --- linux-source-2.6.26/net/ipv4/route.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv4/route.c 2009-11-29 18:44:01.000000000 +0000 @@ -57,6 +57,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -110,6 +113,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp) \ ((u32)(oldflp->fl4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) @@ -366,6 +374,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->u.dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->u.dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; int len; @@ -383,11 +399,11 @@ r->fl.fl4_tos, r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, r->u.dst.hh ? (r->u.dst.hh->hh_output == - dev_queue_xmit) : 0, + dev_queue_xmit) : 0, r->rt_spec_dst, &len); seq_printf(seq, "%*s\n", 127 - len, ""); - } + } return 0; } @@ -2632,8 +2648,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); } - if (rt->u.dst.dev) + if (rt->u.dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->u.dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); + } #ifdef CONFIG_NET_CLS_ROUTE if (rt->u.dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); @@ -2716,7 +2737,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -2738,6 +2759,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -2763,13 +2795,31 @@ err = ip_route_output_key(net, &rt, &fl); } - if (err) + if (err) { goto errout_free; + } skb->rtable = rt; if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->u.dst.dev) { + ghost_debugmsg("Net device is %s ",rt->u.dst.dev->name); + if (is_a_ghost_interface_name(rt->u.dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->u.dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ + err = rt_fill_info(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -2784,6 +2834,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -rNuad linux-source-2.6.26/net/ipv6/Kconfig linux-source-2.6.26-ghost/net/ipv6/Kconfig --- linux-source-2.6.26/net/ipv6/Kconfig 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv6/Kconfig 2009-11-29 18:44:01.000000000 +0000 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select XFRM select INET6_XFRM_TUNNEL select CRYPTO @@ -107,7 +111,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -116,16 +120,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -134,7 +138,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -143,7 +147,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -152,14 +156,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -176,7 +180,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -rNuad linux-source-2.6.26/net/ipv6/addrconf.c linux-source-2.6.26-ghost/net/ipv6/addrconf.c --- linux-source-2.6.26/net/ipv6/addrconf.c 2009-08-19 05:15:09.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv6/addrconf.c 2009-11-29 18:44:01.000000000 +0000 @@ -38,6 +38,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -82,6 +85,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -429,6 +437,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2097,6 +2185,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx, unsigned int plen) { @@ -2111,6 +2203,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -2934,6 +3035,23 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, + NIP6_SEQFMT " %02x %02x %02x %02x %8s\n", + NIP6(ifp->addr), + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, NIP6_SEQFMT " %02x %02x %02x %02x %8s\n", NIP6(ifp->addr), @@ -2942,6 +3060,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3149,6 +3269,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3166,7 +3290,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3215,6 +3341,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3252,6 +3382,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3417,6 +3556,12 @@ ANYCAST_ADDR, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3442,6 +3587,17 @@ ip_idx = 0; if ((idev = in6_dev_get(dev)) == NULL) goto cont; + +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + read_lock_bh(&idev->lock); switch (type) { case UNICAST_ADDR: @@ -3513,7 +3669,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3521,6 +3676,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3547,6 +3706,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((ifa = ipv6_get_ifaddr(net, addr, dev, 1)) == NULL) { err = -EADDRNOTAVAIL; goto errout; @@ -3752,6 +3922,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -3763,6 +3937,14 @@ read_lock(&dev_base_lock); idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if ((idev = in6_dev_get(dev)) == NULL) @@ -3790,7 +3972,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -rNuad linux-source-2.6.26/net/ipv6/ip6_fib.c linux-source-2.6.26-ghost/net/ipv6/ip6_fib.c --- linux-source-2.6.26/net/ipv6/ip6_fib.c 2009-08-19 05:15:09.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv6/ip6_fib.c 2009-11-29 18:44:01.000000000 +0000 @@ -277,6 +277,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -318,7 +320,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -rNuad linux-source-2.6.26/net/ipv6/mcast.c linux-source-2.6.26-ghost/net/ipv6/mcast.c --- linux-source-2.6.26/net/ipv6/mcast.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv6/mcast.c 2009-11-29 18:44:01.000000000 +0000 @@ -26,6 +26,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -63,6 +67,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2436,6 +2445,20 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, + "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + NIP6(im->mca_addr), + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else seq_printf(seq, "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2443,6 +2466,7 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2597,6 +2621,20 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s " NIP6_SEQFMT " " NIP6_SEQFMT " %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + NIP6(state->im->mca_addr), + NIP6(psf->sf_addr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else seq_printf(seq, "%3d %6.6s " NIP6_SEQFMT " " NIP6_SEQFMT " %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2604,6 +2642,7 @@ NIP6(psf->sf_addr), psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-source-2.6.26/net/ipv6/proc.c linux-source-2.6.26-ghost/net/ipv6/proc.c --- linux-source-2.6.26/net/ipv6/proc.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv6/proc.c 2009-11-29 18:44:01.000000000 +0000 @@ -11,6 +11,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -31,7 +33,19 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +#ifdef CONFIG_GHOSTIFICATION +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#else static struct proc_dir_entry *proc_net_devsnmp6; +#endif /* CONFIG_GHOSTIFICATION */ static int sockstat6_seq_show(struct seq_file *seq, void *v) { @@ -226,6 +240,18 @@ return single_open(file, snmp6_seq_show, PDE(inode)->data); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -233,6 +259,7 @@ .llseek = seq_lseek, .release = single_release, }; +#endif /* CONFIG_GHOSTIFICATION */ int snmp6_register_dev(struct inet6_dev *idev) { diff -rNuad linux-source-2.6.26/net/ipv6/route.c linux-source-2.6.26-ghost/net/ipv6/route.c --- linux-source-2.6.26/net/ipv6/route.c 2009-08-19 05:15:10.000000000 +0000 +++ linux-source-2.6.26-ghost/net/ipv6/route.c 2009-11-29 18:44:01.000000000 +0000 @@ -24,6 +24,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -62,6 +66,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1053,10 +1062,6 @@ return hoplimit; } -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1768,6 +1773,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2064,9 +2071,34 @@ struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } @@ -2076,9 +2108,34 @@ struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2109,6 +2166,19 @@ long expires; u32 table; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2216,10 +2286,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2233,6 +2319,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2377,6 +2465,18 @@ { struct seq_file *m = p_arg; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ + seq_printf(m, NIP6_SEQFMT " %02x ", NIP6(rt->rt6i_dst.addr), rt->rt6i_dst.plen); diff -rNuad linux-source-2.6.26/net/netfilter/core.c linux-source-2.6.26-ghost/net/netfilter/core.c --- linux-source-2.6.26/net/netfilter/core.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/netfilter/core.c 2009-11-29 18:44:01.000000000 +0000 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -22,6 +24,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -59,7 +66,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -177,7 +183,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { diff -rNuad linux-source-2.6.26/net/packet/af_packet.c linux-source-2.6.26-ghost/net/packet/af_packet.c --- linux-source-2.6.26/net/packet/af_packet.c 2008-07-13 21:51:29.000000000 +0000 +++ linux-source-2.6.26-ghost/net/packet/af_packet.c 2009-11-29 18:44:01.000000000 +0000 @@ -41,6 +41,7 @@ * will simply extend the hardware address * byte arrays at the end of sockaddr_ll * and packet_mreq. + * Luca Saiu : Trivial changes for ghostification * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -84,6 +85,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -448,6 +454,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -565,6 +583,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -1900,17 +1930,38 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, - "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", - s, - atomic_read(&s->sk_refcnt), - s->sk_type, - ntohs(po->num), - po->ifindex, - po->running, - atomic_read(&s->sk_rmem_alloc), - sock_i_uid(s), - sock_i_ino(s) ); + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.31_x86_640000600000175000017500000005561012167200764024254 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.31 # Fri Nov 27 10:21:19 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set # CONFIG_M686 is not set # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set CONFIG_MK8=y # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_CPU=y CONFIG_X86_L1_CACHE_BYTES=64 CONFIG_X86_INTERNODE_CACHE_BYTES=64 # CONFIG_X86_CMPXCHG is not set CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=3 CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_UML_X86=y CONFIG_64BIT=y # CONFIG_X86_32 is not set # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_3_LEVEL_PGTABLES=y # CONFIG_ARCH_HAS_SC_SIGNALS is not set # CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA is not set CONFIG_SMP_BROKEN=y CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_HAVE_MLOCK=y CONFIG_HAVE_MLOCKED_PAGE_BIT=y CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y CONFIG_KERNEL_STACK_ORDER=1 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set # # RCU Subsystem # CONFIG_CLASSIC_RCU=y # CONFIG_TREE_RCU is not set # CONFIG_PREEMPT_RCU is not set # CONFIG_TREE_RCU_TRACE is not set # CONFIG_PREEMPT_RCU_TRACE is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_GROUP_SCHED is not set # CONFIG_CGROUPS is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_NET_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y # # Performance Counters # CONFIG_VM_EVENT_COUNTERS=y # CONFIG_STRIP_ASM_SYMS is not set CONFIG_COMPAT_BRK=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_MARKERS is not set # # GCOV-based kernel profiling # # CONFIG_SLOW_WORK is not set # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_HL=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_HL=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_PHONET is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y # CONFIG_NET_SCH_MULTIQ is not set CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y # CONFIG_WIRELESS is not set # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set CONFIG_FILE_LOCKING=y CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set # CONFIG_MISC_FILESYSTEMS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y # CONFIG_NFS_V4_1 is not set CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # # CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set CONFIG_CRYPTO_WORKQUEUE=y # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=y # CONFIG_CRYPTO_AES_NI_INTEL is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set CONFIG_CRYPTO_SALSA20_X86_64=y # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set CONFIG_CRYPTO_TWOFISH_COMMON=y CONFIG_CRYPTO_TWOFISH_X86_64=y # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_ZLIB is not set # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # CONFIG_BINARY_PRINTF is not set # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_FIND_LAST_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_HAS_DMA=y CONFIG_NLATTR=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_LOG_USERSPACE is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_SYSCTL_SYSCALL_CHECK=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.310000600000175000017500000005715512167200764023244 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.31 # Fri Nov 27 12:46:13 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set CONFIG_M686=y # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_GENERIC=y CONFIG_X86_CPU=y CONFIG_X86_L1_CACHE_BYTES=64 CONFIG_X86_INTERNODE_CACHE_BYTES=64 CONFIG_X86_CMPXCHG=y CONFIG_X86_L1_CACHE_SHIFT=5 CONFIG_X86_XADD=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=4 CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_CYRIX_32=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_CPU_SUP_TRANSMETA_32=y CONFIG_CPU_SUP_UMC_32=y CONFIG_UML_X86=y # CONFIG_64BIT is not set CONFIG_X86_32=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y # CONFIG_RWSEM_GENERIC_SPINLOCK is not set # CONFIG_3_LEVEL_PGTABLES is not set CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y # CONFIG_SMP_BROKEN is not set CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_PHYS_ADDR_T_64BIT is not set CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_HAVE_MLOCK=y CONFIG_HAVE_MLOCKED_PAGE_BIT=y CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_HAVE_AOUT=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y # CONFIG_HIGHMEM is not set CONFIG_KERNEL_STACK_ORDER=0 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set # # RCU Subsystem # CONFIG_CLASSIC_RCU=y # CONFIG_TREE_RCU is not set # CONFIG_PREEMPT_RCU is not set # CONFIG_TREE_RCU_TRACE is not set # CONFIG_PREEMPT_RCU_TRACE is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_GROUP_SCHED is not set # CONFIG_CGROUPS is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_NET_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y # # Performance Counters # CONFIG_VM_EVENT_COUNTERS=y # CONFIG_STRIP_ASM_SYMS is not set CONFIG_COMPAT_BRK=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # CONFIG_MARKERS is not set # # GCOV-based kernel profiling # # CONFIG_SLOW_WORK is not set # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y CONFIG_LBDAF=y # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_HL=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_HL=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_PHONET is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y # CONFIG_NET_SCH_MULTIQ is not set CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y # CONFIG_WIRELESS is not set # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set # CONFIG_WLAN_80211 is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set CONFIG_FILE_LOCKING=y CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_SQUASHFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_NILFS2_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y # CONFIG_NFS_V4_1 is not set CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # # CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set CONFIG_CRYPTO_WORKQUEUE=y # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # # CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_AES_586 is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_586 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_586 is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_ZLIB is not set # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # CONFIG_BINARY_PRINTF is not set # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_FIND_LAST_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_HAS_DMA=y CONFIG_NLATTR=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_LOG_USERSPACE is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_SYSCTL_SYSCALL_CHECK=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/CONFIG-2.6.320000600000175000017500000005730712167200764023244 0ustar lucaslucas# # Automatically generated make config: don't edit # Linux kernel version: 2.6.32 # Sat Dec 5 13:08:27 2009 # CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_GENERIC_HARDIRQS=y CONFIG_UML=y CONFIG_MMU=y CONFIG_NO_IOMEM=y # CONFIG_TRACE_IRQFLAGS_SUPPORT is not set CONFIG_LOCKDEP_SUPPORT=y # CONFIG_STACKTRACE_SUPPORT is not set CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_IRQ_RELEASE_METHOD=y CONFIG_HZ=100 # # UML-specific options # # # Host processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set CONFIG_M686=y # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MEFFICEON is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MGEODEGX1 is not set # CONFIG_MGEODE_LX is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC7 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_MATOM is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_GENERIC=y CONFIG_X86_CPU=y CONFIG_X86_L1_CACHE_BYTES=64 CONFIG_X86_INTERNODE_CACHE_BYTES=64 CONFIG_X86_CMPXCHG=y CONFIG_X86_L1_CACHE_SHIFT=5 CONFIG_X86_XADD=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_TSC=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=5 CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_CYRIX_32=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_CPU_SUP_TRANSMETA_32=y CONFIG_CPU_SUP_UMC_32=y CONFIG_UML_X86=y # CONFIG_64BIT is not set CONFIG_X86_32=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y # CONFIG_RWSEM_GENERIC_SPINLOCK is not set # CONFIG_3_LEVEL_PGTABLES is not set CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y # CONFIG_SMP_BROKEN is not set CONFIG_GENERIC_HWEIGHT=y # CONFIG_STATIC_LINK is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 # CONFIG_PHYS_ADDR_T_64BIT is not set CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_HAVE_MLOCK=y CONFIG_HAVE_MLOCKED_PAGE_BIT=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_LD_SCRIPT_DYN=y CONFIG_BINFMT_ELF=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_HAVE_AOUT=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y CONFIG_HOSTFS=y # CONFIG_HPPFS is not set CONFIG_MCONSOLE=y CONFIG_MAGIC_SYSRQ=y # CONFIG_HIGHMEM is not set CONFIG_KERNEL_STACK_ORDER=0 # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_BROKEN_ON_SMP=y CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_LOCALVERSION="-marionnet-ghost" CONFIG_LOCALVERSION_AUTO=y CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_TASKSTATS is not set # CONFIG_AUDIT is not set # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_TREE_PREEMPT_RCU is not set # CONFIG_RCU_TRACE is not set CONFIG_RCU_FANOUT=32 # CONFIG_RCU_FANOUT_EXACT is not set # CONFIG_TREE_RCU_TRACE is not set CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_GROUP_SCHED is not set # CONFIG_CGROUPS is not set CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y # CONFIG_RELAY is not set CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_IPC_NS is not set # CONFIG_USER_NS is not set # CONFIG_PID_NS is not set # CONFIG_NET_NS is not set # CONFIG_BLK_DEV_INITRD is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EMBEDDED is not set CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_HOTPLUG=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y # # Kernel Performance Events And Counters # CONFIG_VM_EVENT_COUNTERS=y CONFIG_COMPAT_BRK=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set # CONFIG_PROFILING is not set # # GCOV-based kernel profiling # CONFIG_SLOW_WORK=y # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 # CONFIG_MODULES is not set CONFIG_BLOCK=y CONFIG_LBDAF=y # CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_INTEGRITY is not set # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_DEFAULT_AS=y # CONFIG_DEFAULT_DEADLINE is not set # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_FREEZER is not set CONFIG_BLK_DEV=y CONFIG_BLK_DEV_UBD=y # CONFIG_BLK_DEV_UBD_SYNC is not set CONFIG_BLK_DEV_COW_COMMON=y CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_RAM is not set # CONFIG_ATA_OVER_ETH is not set # # Character Devices # CONFIG_STDERR_CONSOLE=y CONFIG_STDIO_CONSOLE=y CONFIG_SSL=y CONFIG_NULL_CHAN=y CONFIG_PORT_CHAN=y CONFIG_PTY_CHAN=y CONFIG_TTY_CHAN=y CONFIG_XTERM_CHAN=y # CONFIG_NOCONFIG_CHAN is not set CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_CHAN="xterm" CONFIG_SSL_CHAN="pts" CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y # CONFIG_RAW_DRIVER is not set CONFIG_LEGACY_PTY_COUNT=32 # CONFIG_WATCHDOG is not set CONFIG_UML_SOUND=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_HOSTAUDIO=y # CONFIG_HW_RANDOM is not set CONFIG_UML_RANDOM=y # CONFIG_MMAPPER is not set # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" # CONFIG_DEVTMPFS is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_SYS_HYPERVISOR is not set CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=y # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set # CONFIG_XFRM_STATISTICS is not set CONFIG_XFRM_IPCOMP=y CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_ASK_IP_FIB_HASH=y # CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=y CONFIG_NET_IPGRE=y CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y # CONFIG_IP_PIMSM_V1 is not set CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y CONFIG_INET_XFRM_TUNNEL=y CONFIG_INET_TUNNEL=y CONFIG_INET_XFRM_MODE_TRANSPORT=y CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_XFRM_MODE_BEET=y # CONFIG_INET_LRO is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set CONFIG_INET6_XFRM_MODE_TRANSPORT=y CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_BEET=y # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set CONFIG_IPV6_SIT=y CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MROUTE is not set # CONFIG_NETWORK_SECMARK is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CT_ACCT=y CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_GRE=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NF_CONNTRACK_H323=y CONFIG_NF_CONNTRACK_IRC=y CONFIG_NF_CONNTRACK_NETBIOS_NS=y CONFIG_NF_CONNTRACK_PPTP=y CONFIG_NF_CONNTRACK_SANE=y CONFIG_NF_CONNTRACK_SIP=y CONFIG_NF_CONNTRACK_TFTP=y CONFIG_NF_CT_NETLINK=y # CONFIG_NETFILTER_TPROXY is not set CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_DSCP=y CONFIG_NETFILTER_XT_TARGET_HL=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y CONFIG_NETFILTER_XT_TARGET_RATEEST=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_DSCP=y CONFIG_NETFILTER_XT_MATCH_ESP=y CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y CONFIG_NETFILTER_XT_MATCH_HELPER=y CONFIG_NETFILTER_XT_MATCH_HL=y CONFIG_NETFILTER_XT_MATCH_IPRANGE=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_RATEEST=y CONFIG_NETFILTER_XT_MATCH_REALM=y # CONFIG_NETFILTER_XT_MATCH_RECENT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_TARGET_ULOG=y CONFIG_NF_NAT=y CONFIG_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=y CONFIG_IP_NF_TARGET_NETMAP=y CONFIG_IP_NF_TARGET_REDIRECT=y CONFIG_NF_NAT_SNMP_BASIC=y CONFIG_NF_NAT_PROTO_DCCP=y CONFIG_NF_NAT_PROTO_GRE=y CONFIG_NF_NAT_PROTO_UDPLITE=y CONFIG_NF_NAT_PROTO_SCTP=y CONFIG_NF_NAT_FTP=y CONFIG_NF_NAT_IRC=y CONFIG_NF_NAT_TFTP=y CONFIG_NF_NAT_AMANDA=y CONFIG_NF_NAT_PPTP=y CONFIG_NF_NAT_H323=y CONFIG_NF_NAT_SIP=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_CLUSTERIP=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_IP_NF_RAW=y CONFIG_IP_NF_ARPTABLES=y CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_QUEUE=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_MATCH_AH=y CONFIG_IP6_NF_MATCH_EUI64=y CONFIG_IP6_NF_MATCH_FRAG=y CONFIG_IP6_NF_MATCH_OPTS=y CONFIG_IP6_NF_MATCH_HL=y CONFIG_IP6_NF_MATCH_IPV6HEADER=y CONFIG_IP6_NF_MATCH_MH=y CONFIG_IP6_NF_MATCH_RT=y CONFIG_IP6_NF_TARGET_HL=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_RAW=y CONFIG_BRIDGE_NF_EBTABLES=y CONFIG_BRIDGE_EBT_BROUTE=y CONFIG_BRIDGE_EBT_T_FILTER=y CONFIG_BRIDGE_EBT_T_NAT=y CONFIG_BRIDGE_EBT_802_3=y CONFIG_BRIDGE_EBT_AMONG=y CONFIG_BRIDGE_EBT_ARP=y CONFIG_BRIDGE_EBT_IP=y CONFIG_BRIDGE_EBT_IP6=y CONFIG_BRIDGE_EBT_LIMIT=y CONFIG_BRIDGE_EBT_MARK=y CONFIG_BRIDGE_EBT_PKTTYPE=y CONFIG_BRIDGE_EBT_STP=y CONFIG_BRIDGE_EBT_VLAN=y CONFIG_BRIDGE_EBT_ARPREPLY=y CONFIG_BRIDGE_EBT_DNAT=y CONFIG_BRIDGE_EBT_MARK_T=y CONFIG_BRIDGE_EBT_REDIRECT=y CONFIG_BRIDGE_EBT_SNAT=y CONFIG_BRIDGE_EBT_LOG=y CONFIG_BRIDGE_EBT_ULOG=y CONFIG_BRIDGE_EBT_NFLOG=y CONFIG_GHOSTIFICATION_NETFILTER=y CONFIG_GHOSTIFICATION_NETFILTER_ALL=y # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_STP=y CONFIG_GARP=y CONFIG_BRIDGE=y # CONFIG_NET_DSA is not set CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q_GVRP=y # CONFIG_DECNET is not set CONFIG_LLC=y CONFIG_LLC2=y # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_PHONET is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # CONFIG_NET_SCH_CBQ=y CONFIG_NET_SCH_HTB=y CONFIG_NET_SCH_HFSC=y CONFIG_NET_SCH_PRIO=y # CONFIG_NET_SCH_MULTIQ is not set CONFIG_NET_SCH_RED=y CONFIG_NET_SCH_SFQ=y CONFIG_NET_SCH_TEQL=y CONFIG_NET_SCH_TBF=y CONFIG_NET_SCH_GRED=y CONFIG_NET_SCH_DSMARK=y CONFIG_NET_SCH_NETEM=y # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_INGRESS is not set # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_TCINDEX=y CONFIG_NET_CLS_ROUTE4=y CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=y CONFIG_NET_CLS_RSVP6=y CONFIG_NET_CLS_FLOW=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=y CONFIG_NET_ACT_GACT=y CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=y CONFIG_NET_ACT_IPT=y CONFIG_NET_ACT_NAT=y CONFIG_NET_ACT_PEDIT=y # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y # CONFIG_WIRELESS is not set # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set CONFIG_GHOSTIFICATION=y CONFIG_GHOSTIFICATION_NUM=9 CONFIG_GHOSTIFICATION_MESG=y CONFIG_GHOSTIFICATION_PRINTK=y # CONFIG_GHOSTIFICATION_DEBUG is not set # CONFIG_GHOSTIFICATION_DEVEL is not set # # UML Network Devices # CONFIG_UML_NET=y CONFIG_UML_NET_ETHERTAP=y CONFIG_UML_NET_TUNTAP=y CONFIG_UML_NET_SLIP=y CONFIG_UML_NET_DAEMON=y CONFIG_UML_NET_VDE=y CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_PCAP=y CONFIG_UML_NET_SLIRP=y CONFIG_NETDEVICES=y # CONFIG_IFB is not set CONFIG_DUMMY=y CONFIG_BONDING=y CONFIG_MACVLAN=y # CONFIG_EQUALIZER is not set CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_WLAN is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set CONFIG_PPP=y # CONFIG_PPP_MULTILINK is not set # CONFIG_PPP_FILTER is not set # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set # CONFIG_PPPOL2TP is not set CONFIG_SLIP=y # CONFIG_SLIP_COMPRESSED is not set CONFIG_SLHC=y # CONFIG_SLIP_SMART is not set # CONFIG_SLIP_MODE_SLIP6 is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_CONNECTOR is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y # CONFIG_EXT2_FS_SECURITY is not set # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_DEFAULTS_TO_ORDERED=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y # CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set CONFIG_FILE_LOCKING=y CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set CONFIG_PRINT_QUOTA_WARNING=y # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_HUGETLB_PAGE is not set # CONFIG_CONFIGFS_FS is not set CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_SQUASHFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y # CONFIG_NFS_V4_1 is not set CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_SPKM3=y # CONFIG_SMB_FS is not set CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set # CONFIG_CIFS_WEAK_PW_HASH is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_CIFS_DEBUG2=y # CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # CONFIG_SYSV68_PARTITION is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ASCII is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Security options # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set CONFIG_CRYPTO_WORKQUEUE=y # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_SEQIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set # CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # # Hash modes # CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_GHASH is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # # Ciphers # # CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_AES_586 is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set CONFIG_CRYPTO_CAST5=y # CONFIG_CRYPTO_CAST6 is not set CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_586 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_586 is not set # # Compression # CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_ZLIB is not set # CONFIG_CRYPTO_LZO is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # CONFIG_BINARY_PRINTF is not set # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_FIND_LAST_BIT=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y CONFIG_HAS_DMA=y CONFIG_NLATTR=y # # SCSI device support # # CONFIG_RAID_ATTRS is not set # CONFIG_SCSI is not set # CONFIG_SCSI_DMA is not set # CONFIG_SCSI_NETLINK is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y # CONFIG_DM_LOG_USERSPACE is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_UEVENT is not set # CONFIG_NEW_LEDS is not set # CONFIG_INPUT is not set # # Kernel hacking # # CONFIG_PRINTK_TIME is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_SYSCTL_SYSCALL_CHECK=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_STACK_USAGE is not set marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.28-ghost.patch0000600000175000017500000030554412167200764025662 0ustar lucaslucasdiff -rNaud linux-2.6.28/arch/um/drivers/vde_user.c linux-2.6.28-ghost/arch/um/drivers/vde_user.c --- linux-2.6.28/arch/um/drivers/vde_user.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/arch/um/drivers/vde_user.c 2009-11-26 22:24:32.000000000 +0000 @@ -77,8 +77,8 @@ void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init) { struct vde_open_args *args; - - vpri->args = kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL); + /* (ghost support) kmalloc is used instead of uml_kmalloc */ + vpri->args = uml_kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL); if (vpri->args == NULL) { printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args " "allocation failed"); diff -rNaud linux-2.6.28/include/linux/netdevice.h linux-2.6.28-ghost/include/linux/netdevice.h --- linux-2.6.28/include/linux/netdevice.h 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/include/linux/netdevice.h 2009-11-26 22:24:32.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -1771,4 +1773,12 @@ #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_DEV_H */ diff -rNaud linux-2.6.28/include/linux/sockios.h linux-2.6.28-ghost/include/linux/sockios.h --- linux-2.6.28/include/linux/sockios.h 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/include/linux/sockios.h 2009-11-26 22:24:32.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,13 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNaud linux-2.6.28/include/net/ghostdebug.h linux-2.6.28-ghost/include/net/ghostdebug.h --- linux-2.6.28/include/net/ghostdebug.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6.28-ghost/include/net/ghostdebug.h 2009-11-26 22:24:32.000000000 +0000 @@ -0,0 +1,93 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg(msg,args...) +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost) " msg "\n", ##args) +#else +#define ghost_ptk(msg,args...) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -rNaud linux-2.6.28/kernel/softirq.c linux-2.6.28-ghost/kernel/softirq.c --- linux-2.6.28/kernel/softirq.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/kernel/softirq.c 2009-11-26 22:24:32.000000000 +0000 @@ -123,8 +123,11 @@ */ void _local_bh_enable(void) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); WARN_ON_ONCE(!irqs_disabled()); +#endif if (softirq_count() == SOFTIRQ_OFFSET) trace_softirqs_on((unsigned long)__builtin_return_address(0)); @@ -135,7 +138,10 @@ static inline void _local_bh_enable_ip(unsigned long ip) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq() || irqs_disabled()); +#endif #ifdef CONFIG_TRACE_IRQFLAGS local_irq_disable(); #endif diff -rNaud linux-2.6.28/net/Kconfig linux-2.6.28-ghost/net/Kconfig --- linux-2.6.28/net/Kconfig 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/Kconfig 2009-11-26 22:24:32.000000000 +0000 @@ -172,6 +172,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -254,4 +353,93 @@ source "net/rfkill/Kconfig" source "net/9p/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET diff -rNaud linux-2.6.28/net/core/dev.c linux-2.6.28-ghost/net/core/dev.c --- linux-2.6.28/net/core/dev.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/core/dev.c 2009-11-26 22:24:32.000000000 +0000 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -131,6 +134,230 @@ #include "net-sysfs.h" /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -550,6 +777,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -2544,11 +2778,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -2616,24 +2859,27 @@ static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev) { struct net_device_stats *stats = dev->get_stats(dev); - - seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " - "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", - dev->name, stats->rx_bytes, stats->rx_packets, - stats->rx_errors, - stats->rx_dropped + stats->rx_missed_errors, - stats->rx_fifo_errors, - stats->rx_length_errors + stats->rx_over_errors + - stats->rx_crc_errors + stats->rx_frame_errors, - stats->rx_compressed, stats->multicast, - stats->tx_bytes, stats->tx_packets, - stats->tx_errors, stats->tx_dropped, - stats->tx_fifo_errors, stats->collisions, - stats->tx_carrier_errors + - stats->tx_aborted_errors + - stats->tx_window_errors + - stats->tx_heartbeat_errors, - stats->tx_compressed); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ + seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " + "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", + dev->name, stats->rx_bytes, stats->rx_packets, + stats->rx_errors, + stats->rx_dropped + stats->rx_missed_errors, + stats->rx_fifo_errors, + stats->rx_length_errors + stats->rx_over_errors + + stats->rx_crc_errors + stats->rx_frame_errors, + stats->rx_compressed, stats->multicast, + stats->tx_bytes, stats->tx_packets, + stats->tx_errors, stats->tx_dropped, + stats->tx_fifo_errors, stats->collisions, + stats->tx_carrier_errors + + stats->tx_aborted_errors + + stats->tx_window_errors + + stats->tx_heartbeat_errors, + stats->tx_compressed); } /* @@ -3512,6 +3758,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = dev_get_flags(dev); @@ -3579,6 +3835,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -3722,6 +3989,57 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ + /* * These ioctl calls: * - can be done by all. diff -rNaud linux-2.6.28/net/core/dev_mcast.c linux-2.6.28-ghost/net/core/dev_mcast.c --- linux-2.6.28/net/core/dev_mcast.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/core/dev_mcast.c 2009-11-26 22:24:32.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes for + * ghostification support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,9 @@ #include #include +#ifdef CONFIG_GHOSTIFICATION +#include +#endif /* CONFIG_GHOSTIFICATION */ /* * Device multicast list maintenance. @@ -167,7 +172,15 @@ netif_addr_lock_bh(dev); for (m = dev->mc_list; m; m = m->next) { int i; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information + in /proc about ghost interfaces */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Don't show any information in /proc " + "about ghostified interface"); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNaud linux-2.6.28/net/core/rtnetlink.c linux-2.6.28-ghost/net/core/rtnetlink.c --- linux-2.6.28/net/core/rtnetlink.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/core/rtnetlink.c 2009-11-26 22:24:32.000000000 +0000 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; @@ -106,7 +115,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].doit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -117,7 +129,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].dumpit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -460,6 +475,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -616,6 +637,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -690,6 +725,24 @@ idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -940,6 +993,18 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ if ((err = validate_linkmsg(dev, tb)) < 0) goto errout_dev; @@ -978,6 +1043,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1180,6 +1256,17 @@ dev = dev_get_by_index(net, ifm->ifi_index); if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ } else return -EINVAL; @@ -1234,6 +1321,8 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1268,6 +1357,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -1287,14 +1381,21 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; - +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ __rtnl_unlock(); rtnl = net->rtnl; err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); @@ -1326,6 +1427,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -1341,6 +1447,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); diff -rNaud linux-2.6.28/net/ipv4/arp.c linux-2.6.28-ghost/net/ipv4/arp.c --- linux-2.6.28/net/ipv4/arp.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv4/arp.c 2009-11-26 22:24:32.000000000 +0000 @@ -70,6 +70,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -116,6 +118,11 @@ struct neigh_table *clip_tbl_hook; #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1309,9 +1316,21 @@ } #endif sprintf(tbuf, NIPQUAD_FMT, NIPQUAD(*(u32*)n->primary_key)); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show anything in /proc if it involves + ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1322,9 +1341,21 @@ char tbuf[16]; sprintf(tbuf, NIPQUAD_FMT, NIPQUAD(*(u32*)n->key)); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -rNaud linux-2.6.28/net/ipv4/devinet.c linux-2.6.28-ghost/net/ipv4/devinet.c --- linux-2.6.28/net/ipv4/devinet.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv4/devinet.c 2009-11-26 22:24:32.000000000 +0000 @@ -23,6 +23,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -62,6 +65,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, @@ -455,6 +463,16 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ __in_dev_put(in_dev); @@ -504,6 +522,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -553,6 +582,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1168,6 +1203,15 @@ s_ip_idx = ip_idx = cb->args[1]; idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (idx > s_idx) diff -rNaud linux-2.6.28/net/ipv4/fib_frontend.c linux-2.6.28-ghost/net/ipv4/fib_frontend.c --- linux-2.6.28/net/ipv4/fib_frontend.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv4/fib_frontend.c 2009-11-26 22:24:32.000000000 +0000 @@ -6,6 +6,10 @@ * IPv4 Forwarding Information Base: FIB frontend. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -45,6 +49,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -451,6 +460,11 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct fib_config cfg; @@ -465,6 +479,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -473,12 +503,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = tb->tb_insert(tb, &cfg); else @@ -585,6 +621,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -607,6 +653,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -622,6 +678,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -634,7 +696,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -659,6 +721,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -rNaud linux-2.6.28/net/ipv4/fib_hash.c linux-2.6.28-ghost/net/ipv4/fib_hash.c --- linux-2.6.28/net/ipv4/fib_hash.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv4/fib_hash.c 2009-11-26 22:24:32.000000000 +0000 @@ -6,6 +6,11 @@ * IPv4 FIB: lookup engine and maintenance routines. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_hash_insert, bad + * field check in fib_seq_show). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -41,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static struct kmem_cache *fn_hash_kmem __read_mostly; @@ -397,6 +407,18 @@ if (IS_ERR(fi)) return PTR_ERR(fi); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_insert */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if (fz->fz_nent > (fz->fz_divisor<<1) && fz->fz_divisor < FZ_MAX_DIVISOR && (cfg->fc_dst_len == 32 || @@ -580,7 +602,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_delete */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != cfg->fc_tos) break; @@ -1022,19 +1054,39 @@ prefix = f->fn_key; mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); - if (fi) + if (fi) + { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) + { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, - "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - fi->fib_dev ? fi->fib_dev->name : "*", prefix, - fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, - mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), - fi->fib_window, - fi->fib_rtt >> 3, &len); - else + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); +#endif /* CONFIG_GHOSTIFICATION */ + } + else { seq_printf(seq, - "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); + } seq_printf(seq, "%*s\n", 127 - len, ""); out: return 0; diff -rNaud linux-2.6.28/net/ipv4/fib_semantics.c linux-2.6.28-ghost/net/ipv4/fib_semantics.c --- linux-2.6.28/net/ipv4/fib_semantics.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv4/fib_semantics.c 2009-11-26 22:24:32.000000000 +0000 @@ -11,6 +11,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -43,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -953,6 +961,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -rNaud linux-2.6.28/net/ipv4/fib_trie.c linux-2.6.28-ghost/net/ipv4/fib_trie.c --- linux-2.6.28/net/ipv4/fib_trie.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv4/fib_trie.c 2009-11-26 22:24:32.000000000 +0000 @@ -12,6 +12,12 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -80,6 +86,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1195,6 +1206,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1623,7 +1646,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2583,7 +2616,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2596,13 +2650,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -rNaud linux-2.6.28/net/ipv4/igmp.c linux-2.6.28-ghost/net/ipv4/igmp.c --- linux-2.6.28/net/ipv4/igmp.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv4/igmp.c 2009-11-26 22:24:32.000000000 +0000 @@ -68,6 +68,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -105,6 +107,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2385,8 +2392,18 @@ #endif if (state->in_dev->mc_list == im) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", + state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); + } +#else seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2546,14 +2563,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNaud linux-2.6.28/net/ipv4/route.c linux-2.6.28-ghost/net/ipv4/route.c --- linux-2.6.28/net/ipv4/route.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv4/route.c 2009-11-26 22:24:32.000000000 +0000 @@ -55,6 +55,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -108,6 +111,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp) \ ((u32)(oldflp->fl4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) @@ -373,6 +381,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->u.dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->u.dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; int len; @@ -390,11 +406,11 @@ r->fl.fl4_tos, r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, r->u.dst.hh ? (r->u.dst.hh->hh_output == - dev_queue_xmit) : 0, + dev_queue_xmit) : 0, r->rt_spec_dst, &len); seq_printf(seq, "%*s\n", 127 - len, ""); - } + } return 0; } @@ -2691,8 +2707,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); } - if (rt->u.dst.dev) + if (rt->u.dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->u.dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); + } #ifdef CONFIG_NET_CLS_ROUTE if (rt->u.dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); @@ -2775,7 +2796,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -2797,6 +2818,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -2822,13 +2854,31 @@ err = ip_route_output_key(net, &rt, &fl); } - if (err) + if (err) { goto errout_free; + } skb->rtable = rt; if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->u.dst.dev) { + ghost_debugmsg("Net device is %s ",rt->u.dst.dev->name); + if (is_a_ghost_interface_name(rt->u.dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->u.dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ + err = rt_fill_info(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -2843,6 +2893,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -rNaud linux-2.6.28/net/ipv6/Kconfig linux-2.6.28-ghost/net/ipv6/Kconfig --- linux-2.6.28/net/ipv6/Kconfig 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv6/Kconfig 2009-11-26 22:24:32.000000000 +0000 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select INET6_XFRM_TUNNEL select XFRM_IPCOMP ---help--- @@ -105,7 +109,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -114,16 +118,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -132,7 +136,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -141,7 +145,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -150,14 +154,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -174,7 +178,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -rNaud linux-2.6.28/net/ipv6/addrconf.c linux-2.6.28-ghost/net/ipv6/addrconf.c --- linux-2.6.28/net/ipv6/addrconf.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv6/addrconf.c 2009-11-26 22:24:32.000000000 +0000 @@ -36,6 +36,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -80,6 +83,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -445,6 +453,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2143,6 +2231,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx, unsigned int plen) { @@ -2157,6 +2249,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -2988,6 +3089,23 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, + NIP6_SEQFMT " %02x %02x %02x %02x %8s\n", + NIP6(ifp->addr), + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, NIP6_SEQFMT " %02x %02x %02x %02x %8s\n", NIP6(ifp->addr), @@ -2996,6 +3114,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3203,6 +3323,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3220,7 +3344,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3269,6 +3395,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3306,6 +3436,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3471,6 +3610,12 @@ ANYCAST_ADDR, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3496,6 +3641,17 @@ ip_idx = 0; if ((idev = in6_dev_get(dev)) == NULL) goto cont; + +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + read_lock_bh(&idev->lock); switch (type) { case UNICAST_ADDR: @@ -3567,7 +3723,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3575,6 +3730,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3601,6 +3760,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((ifa = ipv6_get_ifaddr(net, addr, dev, 1)) == NULL) { err = -EADDRNOTAVAIL; goto errout; @@ -3808,6 +3978,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -3819,6 +3993,14 @@ read_lock(&dev_base_lock); idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if ((idev = in6_dev_get(dev)) == NULL) @@ -3846,7 +4028,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -rNaud linux-2.6.28/net/ipv6/ip6_fib.c linux-2.6.28-ghost/net/ipv6/ip6_fib.c --- linux-2.6.28/net/ipv6/ip6_fib.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv6/ip6_fib.c 2009-11-26 22:24:32.000000000 +0000 @@ -275,6 +275,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -316,7 +318,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -rNaud linux-2.6.28/net/ipv6/mcast.c linux-2.6.28-ghost/net/ipv6/mcast.c --- linux-2.6.28/net/ipv6/mcast.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv6/mcast.c 2009-11-26 22:24:32.000000000 +0000 @@ -24,6 +24,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -61,6 +65,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2429,6 +2438,20 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, + "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + NIP6(im->mca_addr), + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else seq_printf(seq, "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2436,6 +2459,7 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2590,6 +2614,20 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s " NIP6_SEQFMT " " NIP6_SEQFMT " %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + NIP6(state->im->mca_addr), + NIP6(psf->sf_addr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else seq_printf(seq, "%3d %6.6s " NIP6_SEQFMT " " NIP6_SEQFMT " %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2597,6 +2635,7 @@ NIP6(psf->sf_addr), psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNaud linux-2.6.28/net/ipv6/proc.c linux-2.6.28-ghost/net/ipv6/proc.c --- linux-2.6.28/net/ipv6/proc.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv6/proc.c 2009-11-26 22:28:53.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,6 +31,16 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#endif /* CONFIG_GHOSTIFICATION */ + static int sockstat6_seq_show(struct seq_file *seq, void *v) { struct net *net = seq->private; @@ -194,6 +206,18 @@ return single_open_net(inode, file, snmp6_seq_show); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -201,6 +225,7 @@ .llseek = seq_lseek, .release = single_release_net, }; +#endif /* CONFIG_GHOSTIFICATION */ static int snmp6_dev_seq_show(struct seq_file *seq, void *v) { diff -rNaud linux-2.6.28/net/ipv6/route.c linux-2.6.28-ghost/net/ipv6/route.c --- linux-2.6.28/net/ipv6/route.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/ipv6/route.c 2009-11-26 22:24:32.000000000 +0000 @@ -22,6 +22,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -60,6 +64,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1080,10 +1089,6 @@ return hoplimit; } -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1795,6 +1800,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2090,26 +2097,84 @@ return err; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2129,6 +2194,10 @@ + nla_total_size(sizeof(struct rta_cacheinfo)); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc + */ static int rt6_fill_node(struct net *net, struct sk_buff *skb, struct rt6_info *rt, struct in6_addr *dst, struct in6_addr *src, @@ -2140,6 +2209,19 @@ long expires; u32 table; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2247,10 +2329,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2264,6 +2362,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2408,6 +2508,18 @@ { struct seq_file *m = p_arg; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ + seq_printf(m, NIP6_SEQFMT " %02x ", NIP6(rt->rt6i_dst.addr), rt->rt6i_dst.plen); diff -rNaud linux-2.6.28/net/netfilter/core.c linux-2.6.28-ghost/net/netfilter/core.c --- linux-2.6.28/net/netfilter/core.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/netfilter/core.c 2009-11-26 22:24:32.000000000 +0000 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -22,6 +24,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -59,7 +66,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -169,7 +175,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { diff -rNaud linux-2.6.28/net/packet/af_packet.c linux-2.6.28-ghost/net/packet/af_packet.c --- linux-2.6.28/net/packet/af_packet.c 2008-12-24 23:26:37.000000000 +0000 +++ linux-2.6.28-ghost/net/packet/af_packet.c 2009-11-26 22:24:32.000000000 +0000 @@ -39,6 +39,7 @@ * will simply extend the hardware address * byte arrays at the end of sockaddr_ll * and packet_mreq. + * Luca Saiu : Trivial changes for ghostification * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -82,6 +83,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -487,6 +493,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -609,6 +627,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -2042,17 +2072,38 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, - "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", - s, - atomic_read(&s->sk_refcnt), - s->sk_type, - ntohs(po->num), - po->ifindex, - po->running, - atomic_read(&s->sk_rmem_alloc), - sock_i_uid(s), - sock_i_ino(s) ); + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.29-ghost.patch0000600000175000017500000030153112167200764025653 0ustar lucaslucasdiff -rNuad linux-2.6.29/include/linux/netdevice.h linux-2.6.29-ghost/include/linux/netdevice.h --- linux-2.6.29/include/linux/netdevice.h 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/include/linux/netdevice.h 2009-11-26 22:38:27.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -1896,4 +1898,12 @@ extern struct pernet_operations __net_initdata loopback_net_ops; #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_DEV_H */ diff -rNuad linux-2.6.29/include/linux/sockios.h linux-2.6.29-ghost/include/linux/sockios.h --- linux-2.6.29/include/linux/sockios.h 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/include/linux/sockios.h 2009-11-26 22:38:27.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,13 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNuad linux-2.6.29/include/net/ghostdebug.h linux-2.6.29-ghost/include/net/ghostdebug.h --- linux-2.6.29/include/net/ghostdebug.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6.29-ghost/include/net/ghostdebug.h 2009-11-26 22:38:27.000000000 +0000 @@ -0,0 +1,93 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg(msg,args...) +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost) " msg "\n", ##args) +#else +#define ghost_ptk(msg,args...) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -rNuad linux-2.6.29/kernel/softirq.c linux-2.6.29-ghost/kernel/softirq.c --- linux-2.6.29/kernel/softirq.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/kernel/softirq.c 2009-11-26 22:38:27.000000000 +0000 @@ -109,8 +109,11 @@ */ void _local_bh_enable(void) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); WARN_ON_ONCE(!irqs_disabled()); +#endif if (softirq_count() == SOFTIRQ_OFFSET) trace_softirqs_on((unsigned long)__builtin_return_address(0)); @@ -121,7 +124,10 @@ static inline void _local_bh_enable_ip(unsigned long ip) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq() || irqs_disabled()); +#endif #ifdef CONFIG_TRACE_IRQFLAGS local_irq_disable(); #endif diff -rNuad linux-2.6.29/net/Kconfig linux-2.6.29-ghost/net/Kconfig --- linux-2.6.29/net/Kconfig 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/Kconfig 2009-11-26 22:38:27.000000000 +0000 @@ -167,6 +167,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -251,4 +350,93 @@ source "net/rfkill/Kconfig" source "net/9p/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET diff -rNuad linux-2.6.29/net/core/dev.c linux-2.6.29-ghost/net/core/dev.c --- linux-2.6.29/net/core/dev.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/core/dev.c 2009-11-26 22:38:27.000000000 +0000 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -136,6 +139,230 @@ #define GRO_MAX_HEAD (MAX_HEADER + 128) /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -536,6 +763,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -2851,11 +3085,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -2924,6 +3167,10 @@ { const struct net_device_stats *stats = dev_get_stats(dev); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", dev->name, stats->rx_bytes, stats->rx_packets, @@ -3803,6 +4050,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = dev_get_flags(dev); @@ -3873,6 +4130,17 @@ ops = dev->netdev_ops; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -4015,6 +4283,57 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ + /* * These ioctl calls: * - can be done by all. diff -rNuad linux-2.6.29/net/core/dev_mcast.c linux-2.6.29-ghost/net/core/dev_mcast.c --- linux-2.6.29/net/core/dev_mcast.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/core/dev_mcast.c 2009-11-26 22:38:27.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes for + * ghostification support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,9 @@ #include #include +#ifdef CONFIG_GHOSTIFICATION +#include +#endif /* CONFIG_GHOSTIFICATION */ /* * Device multicast list maintenance. @@ -167,7 +172,15 @@ netif_addr_lock_bh(dev); for (m = dev->mc_list; m; m = m->next) { int i; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information + in /proc about ghost interfaces */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Don't show any information in /proc " + "about ghostified interface"); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNuad linux-2.6.29/net/core/rtnetlink.c linux-2.6.29-ghost/net/core/rtnetlink.c --- linux-2.6.29/net/core/rtnetlink.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/core/rtnetlink.c 2009-11-26 22:38:27.000000000 +0000 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; @@ -106,7 +115,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].doit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -117,7 +129,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].dumpit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -460,6 +475,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -616,6 +637,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -690,6 +725,24 @@ idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -941,6 +994,18 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ if ((err = validate_linkmsg(dev, tb)) < 0) goto errout_dev; @@ -979,6 +1044,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1181,6 +1257,17 @@ dev = dev_get_by_index(net, ifm->ifi_index); if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ } else return -EINVAL; @@ -1235,6 +1322,8 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1269,6 +1358,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -1288,14 +1382,21 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; - +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ __rtnl_unlock(); rtnl = net->rtnl; err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); @@ -1327,6 +1428,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -1342,6 +1448,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); diff -rNuad linux-2.6.29/net/ipv4/arp.c linux-2.6.29-ghost/net/ipv4/arp.c --- linux-2.6.29/net/ipv4/arp.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv4/arp.c 2009-11-26 22:38:27.000000000 +0000 @@ -70,6 +70,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -116,6 +118,11 @@ struct neigh_table *clip_tbl_hook; #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1309,9 +1316,21 @@ } #endif sprintf(tbuf, "%pI4", n->primary_key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves +ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1322,9 +1341,21 @@ char tbuf[16]; sprintf(tbuf, "%pI4", n->key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -rNuad linux-2.6.29/net/ipv4/devinet.c linux-2.6.29-ghost/net/ipv4/devinet.c --- linux-2.6.29/net/ipv4/devinet.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv4/devinet.c 2009-11-26 22:38:27.000000000 +0000 @@ -23,6 +23,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -62,6 +65,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, @@ -448,6 +456,16 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ __in_dev_put(in_dev); @@ -497,6 +515,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -546,6 +575,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1161,6 +1196,15 @@ s_ip_idx = ip_idx = cb->args[1]; idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (idx > s_idx) diff -rNuad linux-2.6.29/net/ipv4/fib_frontend.c linux-2.6.29-ghost/net/ipv4/fib_frontend.c --- linux-2.6.29/net/ipv4/fib_frontend.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv4/fib_frontend.c 2009-11-26 22:38:27.000000000 +0000 @@ -6,6 +6,10 @@ * IPv4 Forwarding Information Base: FIB frontend. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -45,6 +49,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -451,6 +460,11 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct fib_config cfg; @@ -465,6 +479,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -473,12 +503,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = tb->tb_insert(tb, &cfg); else @@ -585,6 +621,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -607,6 +653,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -622,6 +678,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -634,7 +696,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -659,6 +721,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -rNuad linux-2.6.29/net/ipv4/fib_hash.c linux-2.6.29-ghost/net/ipv4/fib_hash.c --- linux-2.6.29/net/ipv4/fib_hash.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv4/fib_hash.c 2009-11-26 22:38:27.000000000 +0000 @@ -6,6 +6,11 @@ * IPv4 FIB: lookup engine and maintenance routines. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_hash_insert, bad + * field check in fib_seq_show). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -41,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static struct kmem_cache *fn_hash_kmem __read_mostly; @@ -397,6 +407,18 @@ if (IS_ERR(fi)) return PTR_ERR(fi); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_insert */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if (fz->fz_nent > (fz->fz_divisor<<1) && fz->fz_divisor < FZ_MAX_DIVISOR && (cfg->fc_dst_len == 32 || @@ -580,7 +602,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_delete */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != cfg->fc_tos) break; @@ -1022,19 +1054,39 @@ prefix = f->fn_key; mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); - if (fi) + if (fi) + { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) + { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, - "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - fi->fib_dev ? fi->fib_dev->name : "*", prefix, - fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, - mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), - fi->fib_window, - fi->fib_rtt >> 3, &len); - else + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); +#endif /* CONFIG_GHOSTIFICATION */ + } + else { seq_printf(seq, - "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); + } seq_printf(seq, "%*s\n", 127 - len, ""); out: return 0; diff -rNuad linux-2.6.29/net/ipv4/fib_semantics.c linux-2.6.29-ghost/net/ipv4/fib_semantics.c --- linux-2.6.29/net/ipv4/fib_semantics.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv4/fib_semantics.c 2009-11-26 22:38:27.000000000 +0000 @@ -11,6 +11,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -43,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -953,6 +961,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -rNuad linux-2.6.29/net/ipv4/fib_trie.c linux-2.6.29-ghost/net/ipv4/fib_trie.c --- linux-2.6.29/net/ipv4/fib_trie.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv4/fib_trie.c 2009-11-26 22:38:27.000000000 +0000 @@ -12,6 +12,12 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -80,6 +86,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1195,6 +1206,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1623,7 +1646,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2583,7 +2616,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2596,13 +2650,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -rNuad linux-2.6.29/net/ipv4/igmp.c linux-2.6.29-ghost/net/ipv4/igmp.c --- linux-2.6.29/net/ipv4/igmp.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv4/igmp.c 2009-11-26 22:38:27.000000000 +0000 @@ -68,6 +68,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -105,6 +107,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2387,8 +2394,18 @@ #endif if (state->in_dev->mc_list == im) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", + state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); + } +#else seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2550,14 +2567,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.29/net/ipv4/route.c linux-2.6.29-ghost/net/ipv4/route.c --- linux-2.6.29/net/ipv4/route.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv4/route.c 2009-11-26 22:38:27.000000000 +0000 @@ -55,6 +55,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -108,6 +111,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp) \ ((u32)(oldflp->fl4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) @@ -375,6 +383,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->u.dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->u.dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; int len; @@ -392,11 +408,11 @@ r->fl.fl4_tos, r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, r->u.dst.hh ? (r->u.dst.hh->hh_output == - dev_queue_xmit) : 0, + dev_queue_xmit) : 0, r->rt_spec_dst, &len); seq_printf(seq, "%*s\n", 127 - len, ""); - } + } return 0; } @@ -2812,8 +2828,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); } - if (rt->u.dst.dev) + if (rt->u.dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->u.dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); + } #ifdef CONFIG_NET_CLS_ROUTE if (rt->u.dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); @@ -2896,7 +2917,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -2918,6 +2939,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -2943,13 +2975,31 @@ err = ip_route_output_key(net, &rt, &fl); } - if (err) + if (err) { goto errout_free; + } skb->rtable = rt; if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->u.dst.dev) { + ghost_debugmsg("Net device is %s ",rt->u.dst.dev->name); + if (is_a_ghost_interface_name(rt->u.dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->u.dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ + err = rt_fill_info(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -2964,6 +3014,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -rNuad linux-2.6.29/net/ipv6/Kconfig linux-2.6.29-ghost/net/ipv6/Kconfig --- linux-2.6.29/net/ipv6/Kconfig 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv6/Kconfig 2009-11-26 22:38:27.000000000 +0000 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select INET6_XFRM_TUNNEL select XFRM_IPCOMP ---help--- @@ -105,7 +109,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -114,16 +118,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -132,7 +136,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -141,7 +145,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -150,14 +154,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -174,7 +178,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -rNuad linux-2.6.29/net/ipv6/addrconf.c linux-2.6.29-ghost/net/ipv6/addrconf.c --- linux-2.6.29/net/ipv6/addrconf.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv6/addrconf.c 2009-11-26 22:38:27.000000000 +0000 @@ -36,6 +36,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -80,6 +83,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -445,6 +453,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2151,6 +2239,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx, unsigned int plen) { @@ -2165,6 +2257,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -2993,6 +3094,22 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", + &ifp->addr, + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", &ifp->addr, ifp->idev->dev->ifindex, @@ -3000,6 +3117,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3207,6 +3326,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3224,7 +3347,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3273,6 +3398,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3310,6 +3439,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3475,6 +3613,12 @@ ANYCAST_ADDR, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3500,6 +3644,17 @@ ip_idx = 0; if ((idev = in6_dev_get(dev)) == NULL) goto cont; + +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + read_lock_bh(&idev->lock); switch (type) { case UNICAST_ADDR: @@ -3571,7 +3726,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3579,6 +3733,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3605,6 +3763,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((ifa = ipv6_get_ifaddr(net, addr, dev, 1)) == NULL) { err = -EADDRNOTAVAIL; goto errout; @@ -3812,6 +3981,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -3823,6 +3996,14 @@ read_lock(&dev_base_lock); idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if ((idev = in6_dev_get(dev)) == NULL) @@ -3850,7 +4031,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -rNuad linux-2.6.29/net/ipv6/ip6_fib.c linux-2.6.29-ghost/net/ipv6/ip6_fib.c --- linux-2.6.29/net/ipv6/ip6_fib.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv6/ip6_fib.c 2009-11-26 22:38:27.000000000 +0000 @@ -275,6 +275,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -320,7 +322,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -rNuad linux-2.6.29/net/ipv6/mcast.c linux-2.6.29-ghost/net/ipv6/mcast.c --- linux-2.6.29/net/ipv6/mcast.c 2009-11-26 20:48:39.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv6/mcast.c 2009-11-26 22:42:51.000000000 +0000 @@ -24,6 +24,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -61,6 +65,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2432,6 +2441,20 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, + "%-4d %-15s %pi6 %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + &im->mca_addr, + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else seq_printf(seq, "%-4d %-15s %pi6 %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2439,6 +2462,7 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2593,6 +2617,20 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + &state->im->mca_addr, + &psf->sf_addr, + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else seq_printf(seq, "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2600,6 +2638,7 @@ &psf->sf_addr, psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.29/net/ipv6/proc.c linux-2.6.29-ghost/net/ipv6/proc.c --- linux-2.6.29/net/ipv6/proc.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv6/proc.c 2009-11-26 22:41:05.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,6 +31,16 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#endif /* CONFIG_GHOSTIFICATION */ + static int sockstat6_seq_show(struct seq_file *seq, void *v) { struct net *net = seq->private; @@ -194,6 +206,18 @@ return single_open_net(inode, file, snmp6_seq_show); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -201,6 +225,7 @@ .llseek = seq_lseek, .release = single_release_net, }; +#endif /* CONFIG_GHOSTIFICATION */ static int snmp6_dev_seq_show(struct seq_file *seq, void *v) { diff -rNuad linux-2.6.29/net/ipv6/route.c linux-2.6.29-ghost/net/ipv6/route.c --- linux-2.6.29/net/ipv6/route.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/ipv6/route.c 2009-11-26 22:38:27.000000000 +0000 @@ -22,6 +22,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -60,6 +64,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1112,10 +1121,6 @@ return hoplimit; } -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1827,6 +1832,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2130,26 +2137,84 @@ return err; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2169,6 +2234,10 @@ + nla_total_size(sizeof(struct rta_cacheinfo)); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc + */ static int rt6_fill_node(struct net *net, struct sk_buff *skb, struct rt6_info *rt, struct in6_addr *dst, struct in6_addr *src, @@ -2180,6 +2249,19 @@ long expires; u32 table; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2287,10 +2369,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2304,6 +2402,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2448,6 +2548,17 @@ { struct seq_file *m = p_arg; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen); #ifdef CONFIG_IPV6_SUBTREES diff -rNuad linux-2.6.29/net/netfilter/core.c linux-2.6.29-ghost/net/netfilter/core.c --- linux-2.6.29/net/netfilter/core.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/netfilter/core.c 2009-11-26 22:38:27.000000000 +0000 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -22,6 +24,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -59,7 +66,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -169,7 +175,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { diff -rNuad linux-2.6.29/net/packet/af_packet.c linux-2.6.29-ghost/net/packet/af_packet.c --- linux-2.6.29/net/packet/af_packet.c 2009-03-23 23:12:14.000000000 +0000 +++ linux-2.6.29-ghost/net/packet/af_packet.c 2009-11-26 22:38:27.000000000 +0000 @@ -39,6 +39,7 @@ * will simply extend the hardware address * byte arrays at the end of sockaddr_ll * and packet_mreq. + * Luca Saiu : Trivial changes for ghostification * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +84,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -489,6 +495,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -611,6 +629,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -2049,17 +2079,38 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, - "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", - s, - atomic_read(&s->sk_refcnt), - s->sk_type, - ntohs(po->num), - po->ifindex, - po->running, - atomic_read(&s->sk_rmem_alloc), - sock_i_uid(s), - sock_i_ino(s) ); + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/kernel/older-versions/linux-2.6.31-ghost.patch0000600000175000017500000030143012167200764025642 0ustar lucaslucasdiff -rNuad linux-2.6.31/include/linux/netdevice.h linux-2.6.31-ghost/include/linux/netdevice.h --- linux-2.6.31/include/linux/netdevice.h 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/include/linux/netdevice.h 2009-11-26 22:58:23.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -2001,4 +2003,12 @@ } #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_NETDEVICE_H */ diff -rNuad linux-2.6.31/include/linux/sockios.h linux-2.6.31-ghost/include/linux/sockios.h --- linux-2.6.31/include/linux/sockios.h 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/include/linux/sockios.h 2009-11-26 22:58:23.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -83,6 +85,13 @@ #define SIOCWANDEV 0x894A /* get/set netdev parameters */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -rNuad linux-2.6.31/include/net/ghostdebug.h linux-2.6.31-ghost/include/net/ghostdebug.h --- linux-2.6.31/include/net/ghostdebug.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6.31-ghost/include/net/ghostdebug.h 2009-11-26 22:58:23.000000000 +0000 @@ -0,0 +1,93 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg(msg,args...) +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost) " msg "\n", ##args) +#else +#define ghost_ptk(msg,args...) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -rNuad linux-2.6.31/kernel/softirq.c linux-2.6.31-ghost/kernel/softirq.c --- linux-2.6.31/kernel/softirq.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/kernel/softirq.c 2009-11-26 22:58:23.000000000 +0000 @@ -128,8 +128,11 @@ */ void _local_bh_enable(void) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); WARN_ON_ONCE(!irqs_disabled()); +#endif if (softirq_count() == SOFTIRQ_OFFSET) trace_softirqs_on((unsigned long)__builtin_return_address(0)); @@ -140,7 +143,10 @@ static inline void _local_bh_enable_ip(unsigned long ip) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq() || irqs_disabled()); +#endif #ifdef CONFIG_TRACE_IRQFLAGS local_irq_disable(); #endif diff -rNuad linux-2.6.31/net/Kconfig linux-2.6.31-ghost/net/Kconfig --- linux-2.6.31/net/Kconfig 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/Kconfig 2009-11-26 22:58:23.000000000 +0000 @@ -159,6 +159,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -256,4 +355,93 @@ source "net/rfkill/Kconfig" source "net/9p/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET diff -rNuad linux-2.6.31/net/core/dev.c linux-2.6.31-ghost/net/core/dev.c --- linux-2.6.31/net/core/dev.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/core/dev.c 2009-11-26 22:58:23.000000000 +0000 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -137,6 +140,230 @@ #define GRO_MAX_HEAD (MAX_HEADER + 128) /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -539,6 +766,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -2936,11 +3170,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -3009,6 +3252,10 @@ { const struct net_device_stats *stats = dev_get_stats(dev); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu " "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n", dev->name, stats->rx_bytes, stats->rx_packets, @@ -4210,6 +4457,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = (short) dev_get_flags(dev); @@ -4280,6 +4537,17 @@ ops = dev->netdev_ops; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -4423,6 +4691,57 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ + /* * These ioctl calls: * - can be done by all. diff -rNuad linux-2.6.31/net/core/dev_mcast.c linux-2.6.31-ghost/net/core/dev_mcast.c --- linux-2.6.31/net/core/dev_mcast.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/core/dev_mcast.c 2009-11-26 22:58:23.000000000 +0000 @@ -14,6 +14,8 @@ * Alan Cox : IFF_ALLMULTI support. * Alan Cox : New format set_multicast_list() calls. * Gleb Natapov : Remove dev_mc_lock. + * Luca Saiu : trivial changes for + * ghostification support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,9 @@ #include #include +#ifdef CONFIG_GHOSTIFICATION +#include +#endif /* CONFIG_GHOSTIFICATION */ /* * Device multicast list maintenance. @@ -167,7 +172,15 @@ netif_addr_lock_bh(dev); for (m = dev->mc_list; m; m = m->next) { int i; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information + in /proc about ghost interfaces */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Don't show any information in /proc " + "about ghostified interface"); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex, dev->name, m->dmi_users, m->dmi_gusers); diff -rNuad linux-2.6.31/net/core/rtnetlink.c linux-2.6.31-ghost/net/core/rtnetlink.c --- linux-2.6.31/net/core/rtnetlink.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/core/rtnetlink.c 2009-11-26 22:58:23.000000000 +0000 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; @@ -106,7 +115,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].doit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -117,7 +129,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif tab = rtnl_msg_handlers[protocol]; if (tab == NULL || tab[msgindex].dumpit == NULL) tab = rtnl_msg_handlers[PF_UNSPEC]; @@ -460,6 +475,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -616,6 +637,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -690,6 +725,24 @@ idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -941,6 +994,18 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ if ((err = validate_linkmsg(dev, tb)) < 0) goto errout_dev; @@ -979,6 +1044,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1181,6 +1257,17 @@ dev = dev_get_by_index(net, ifm->ifi_index); if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ } else return -EINVAL; @@ -1235,6 +1322,8 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1270,6 +1359,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -1289,14 +1383,21 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; - +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ __rtnl_unlock(); rtnl = net->rtnl; err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); @@ -1328,6 +1429,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -1343,6 +1449,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); diff -rNuad linux-2.6.31/net/ipv4/arp.c linux-2.6.31-ghost/net/ipv4/arp.c --- linux-2.6.31/net/ipv4/arp.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/arp.c 2009-11-26 22:58:23.000000000 +0000 @@ -70,6 +70,8 @@ * bonding can change the skb before * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash + * Luca Saiu @@ -116,6 +118,11 @@ struct neigh_table *clip_tbl_hook; #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1311,9 +1318,21 @@ } #endif sprintf(tbuf, "%pI4", n->primary_key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves +ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1324,9 +1343,21 @@ char tbuf[16]; sprintf(tbuf, "%pI4", n->key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -rNuad linux-2.6.31/net/ipv4/devinet.c linux-2.6.31-ghost/net/ipv4/devinet.c --- linux-2.6.31/net/ipv4/devinet.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/devinet.c 2009-11-26 22:58:23.000000000 +0000 @@ -23,6 +23,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -62,6 +65,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, @@ -448,6 +456,16 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ __in_dev_put(in_dev); @@ -497,6 +515,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -546,6 +575,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1169,6 +1204,15 @@ s_ip_idx = ip_idx = cb->args[1]; idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (idx > s_idx) diff -rNuad linux-2.6.31/net/ipv4/fib_frontend.c linux-2.6.31-ghost/net/ipv4/fib_frontend.c --- linux-2.6.31/net/ipv4/fib_frontend.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/fib_frontend.c 2009-11-26 22:58:23.000000000 +0000 @@ -6,6 +6,10 @@ * IPv4 Forwarding Information Base: FIB frontend. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -44,6 +48,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -450,6 +459,11 @@ * Handle IP routing ioctl calls. These are used to manipulate the routing tables */ +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct fib_config cfg; @@ -464,6 +478,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -472,12 +502,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = tb->tb_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = tb->tb_insert(tb, &cfg); else @@ -584,6 +620,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -606,6 +652,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -621,6 +677,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -633,7 +695,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -658,6 +720,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -rNuad linux-2.6.31/net/ipv4/fib_hash.c linux-2.6.31-ghost/net/ipv4/fib_hash.c --- linux-2.6.31/net/ipv4/fib_hash.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/fib_hash.c 2009-11-26 22:58:23.000000000 +0000 @@ -6,6 +6,11 @@ * IPv4 FIB: lookup engine and maintenance routines. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_hash_insert, bad + * field check in fib_seq_show). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -41,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static struct kmem_cache *fn_hash_kmem __read_mostly; @@ -396,6 +406,18 @@ if (IS_ERR(fi)) return PTR_ERR(fi); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_insert */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if (fz->fz_nent > (fz->fz_divisor<<1) && fz->fz_divisor < FZ_MAX_DIVISOR && (cfg->fc_dst_len == 32 || @@ -579,7 +601,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, &f->fn_alias, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for route involving + ghostified interface, current funct is pointed by tb->tb_delete */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != cfg->fc_tos) break; @@ -1021,19 +1053,39 @@ prefix = f->fn_key; mask = FZ_MASK(iter->zone); flags = fib_flag_trans(fa->fa_type, mask, fi); - if (fi) + if (fi) + { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) + { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, - "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - fi->fib_dev ? fi->fib_dev->name : "*", prefix, - fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, - mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), - fi->fib_window, - fi->fib_rtt >> 3, &len); - else + "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", prefix, + fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority, + mask, (fi->fib_advmss ? fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); +#endif /* CONFIG_GHOSTIFICATION */ + } + else { seq_printf(seq, - "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", - prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + "*\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u%n", + prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); + } seq_printf(seq, "%*s\n", 127 - len, ""); out: return 0; diff -rNuad linux-2.6.31/net/ipv4/fib_semantics.c linux-2.6.31-ghost/net/ipv4/fib_semantics.c --- linux-2.6.31/net/ipv4/fib_semantics.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/fib_semantics.c 2009-11-26 22:58:23.000000000 +0000 @@ -11,6 +11,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -43,6 +46,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -953,6 +961,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -rNuad linux-2.6.31/net/ipv4/fib_trie.c linux-2.6.31-ghost/net/ipv4/fib_trie.c --- linux-2.6.31/net/ipv4/fib_trie.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/fib_trie.c 2009-11-26 22:58:23.000000000 +0000 @@ -12,6 +12,12 @@ * * Hans Liss Uppsala Universitet * + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * * This work is based on the LPC-trie which is originally descibed in: * * An experimental study of compression methods for dynamic tries @@ -80,6 +86,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1225,6 +1236,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1652,7 +1675,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2612,7 +2645,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2625,13 +2679,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -rNuad linux-2.6.31/net/ipv4/igmp.c linux-2.6.31-ghost/net/ipv4/igmp.c --- linux-2.6.31/net/ipv4/igmp.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/igmp.c 2009-11-26 22:58:23.000000000 +0000 @@ -68,6 +68,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -105,6 +107,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2387,8 +2394,18 @@ #endif if (state->in_dev->mc_list == im) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", + state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); + } +#else seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2550,14 +2567,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.31/net/ipv4/route.c linux-2.6.31-ghost/net/ipv4/route.c --- linux-2.6.31/net/ipv4/route.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv4/route.c 2009-11-26 22:58:23.000000000 +0000 @@ -55,6 +55,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -108,6 +111,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp) \ ((u32)(oldflp->fl4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) @@ -375,6 +383,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->u.dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->u.dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; int len; @@ -392,11 +408,11 @@ r->fl.fl4_tos, r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, r->u.dst.hh ? (r->u.dst.hh->hh_output == - dev_queue_xmit) : 0, + dev_queue_xmit) : 0, r->rt_spec_dst, &len); seq_printf(seq, "%*s\n", 127 - len, ""); - } + } return 0; } @@ -2833,8 +2849,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); } - if (rt->u.dst.dev) + if (rt->u.dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->u.dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); + } #ifdef CONFIG_NET_CLS_ROUTE if (rt->u.dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); @@ -2917,7 +2938,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -2939,6 +2960,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -2971,6 +3003,22 @@ if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->u.dst.dev) { + ghost_debugmsg("Net device is %s ",rt->u.dst.dev->name); + if (is_a_ghost_interface_name(rt->u.dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->u.dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ err = rt_fill_info(net, skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -2985,6 +3033,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -rNuad linux-2.6.31/net/ipv6/Kconfig linux-2.6.31-ghost/net/ipv6/Kconfig --- linux-2.6.31/net/ipv6/Kconfig 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/Kconfig 2009-11-26 22:58:23.000000000 +0000 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select INET6_XFRM_TUNNEL select XFRM_IPCOMP ---help--- @@ -105,7 +109,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -114,16 +118,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -132,7 +136,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -141,7 +145,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -150,14 +154,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -174,7 +178,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -rNuad linux-2.6.31/net/ipv6/addrconf.c linux-2.6.31-ghost/net/ipv6/addrconf.c --- linux-2.6.31/net/ipv6/addrconf.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/addrconf.c 2009-11-26 22:58:23.000000000 +0000 @@ -36,6 +36,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -81,6 +84,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -446,6 +454,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2151,6 +2239,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx, unsigned int plen) { @@ -2165,6 +2257,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -2979,6 +3080,22 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", + &ifp->addr, + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", &ifp->addr, ifp->idev->dev->ifindex, @@ -2986,6 +3103,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3193,6 +3312,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3210,7 +3333,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3259,6 +3384,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3296,6 +3425,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3464,6 +3602,12 @@ ANYCAST_ADDR, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3489,6 +3633,17 @@ ip_idx = 0; if ((idev = in6_dev_get(dev)) == NULL) goto cont; + +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + read_lock_bh(&idev->lock); switch (type) { case UNICAST_ADDR: @@ -3560,7 +3715,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3568,6 +3722,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3594,6 +3752,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((ifa = ipv6_get_ifaddr(net, addr, dev, 1)) == NULL) { err = -EADDRNOTAVAIL; goto errout; @@ -3802,6 +3971,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -3813,6 +3986,14 @@ read_lock(&dev_base_lock); idx = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if ((idev = in6_dev_get(dev)) == NULL) @@ -3840,7 +4021,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -rNuad linux-2.6.31/net/ipv6/ip6_fib.c linux-2.6.31-ghost/net/ipv6/ip6_fib.c --- linux-2.6.31/net/ipv6/ip6_fib.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/ip6_fib.c 2009-11-26 22:58:23.000000000 +0000 @@ -275,6 +275,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -320,7 +322,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -rNuad linux-2.6.31/net/ipv6/mcast.c linux-2.6.31-ghost/net/ipv6/mcast.c --- linux-2.6.31/net/ipv6/mcast.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/mcast.c 2009-11-26 22:59:37.000000000 +0000 @@ -24,6 +24,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -61,6 +65,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2440,6 +2449,20 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, + "%-4d %-15s %pi6 %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + &im->mca_addr, + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else seq_printf(seq, "%-4d %-15s %pi6 %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2447,6 +2470,7 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2601,6 +2625,20 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + &state->im->mca_addr, + &psf->sf_addr, + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else seq_printf(seq, "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2608,6 +2646,7 @@ &psf->sf_addr, psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -rNuad linux-2.6.31/net/ipv6/proc.c linux-2.6.31-ghost/net/ipv6/proc.c --- linux-2.6.31/net/ipv6/proc.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/proc.c 2009-11-26 22:59:07.000000000 +0000 @@ -9,6 +9,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,6 +31,16 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#endif /* CONFIG_GHOSTIFICATION */ + static int sockstat6_seq_show(struct seq_file *seq, void *v) { struct net *net = seq->private; @@ -200,6 +212,18 @@ return single_open_net(inode, file, snmp6_seq_show); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -207,6 +231,7 @@ .llseek = seq_lseek, .release = single_release_net, }; +#endif /* CONFIG_GHOSTIFICATION */ static int snmp6_dev_seq_show(struct seq_file *seq, void *v) { diff -rNuad linux-2.6.31/net/ipv6/route.c linux-2.6.31-ghost/net/ipv6/route.c --- linux-2.6.31/net/ipv6/route.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/ipv6/route.c 2009-11-26 22:58:23.000000000 +0000 @@ -22,6 +22,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -60,6 +64,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1115,10 +1124,6 @@ return hoplimit; } -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1830,6 +1835,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2133,26 +2140,84 @@ return err; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2172,6 +2237,10 @@ + nla_total_size(sizeof(struct rta_cacheinfo)); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc + */ static int rt6_fill_node(struct net *net, struct sk_buff *skb, struct rt6_info *rt, struct in6_addr *dst, struct in6_addr *src, @@ -2183,6 +2252,19 @@ long expires; u32 table; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2290,10 +2372,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2307,6 +2405,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2452,6 +2552,17 @@ { struct seq_file *m = p_arg; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen); #ifdef CONFIG_IPV6_SUBTREES diff -rNuad linux-2.6.31/net/netfilter/core.c linux-2.6.31-ghost/net/netfilter/core.c --- linux-2.6.31/net/netfilter/core.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/netfilter/core.c 2009-11-26 23:00:16.000000000 +0000 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -22,6 +24,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -59,7 +66,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -169,7 +175,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { @@ -182,6 +339,9 @@ verdict >> NF_VERDICT_BITS)) goto next_hook; } +#ifdef CONFIG_GHOSTIFICATION_NETFILTER +unlock: +#endif rcu_read_unlock(); return ret; } diff -rNuad linux-2.6.31/net/packet/af_packet.c linux-2.6.31-ghost/net/packet/af_packet.c --- linux-2.6.31/net/packet/af_packet.c 2009-09-09 22:13:59.000000000 +0000 +++ linux-2.6.31-ghost/net/packet/af_packet.c 2009-11-26 22:58:23.000000000 +0000 @@ -8,6 +8,7 @@ * Authors: Ross Biro * Fred N. van Kempen, * Alan Cox, + * Luca Saiu : Trivial changes for ghostification * * Fixes: * Alan Cox : verify_area() now used correctly @@ -84,6 +85,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -549,6 +555,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -670,6 +688,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -2420,17 +2450,38 @@ struct sock *s = v; const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, - "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", - s, - atomic_read(&s->sk_refcnt), - s->sk_type, - ntohs(po->num), - po->ifindex, - po->running, - atomic_read(&s->sk_rmem_alloc), - sock_i_uid(s), - sock_i_ino(s) ); + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/kernel/linux-3.2.%.compile_with_ARCH_um_SUBARCH_i386.diff0000600000175000017500000000143012167200764027151 0ustar lucaslucas*** linux-3.2.13.original/arch/x86/um/Makefile 2012-03-19 17:03:17.000000000 +0100 --- linux-3.2.13.modified/arch/x86/um/Makefile 2013-04-30 18:09:48.000000000 +0200 *************** *** 19,25 **** obj-y += checksum_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o ! subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o subarch-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += ../lib/rwsem.o subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o --- 19,27 ---- obj-y += checksum_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o ! subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o \ ! ../lib/atomic64_386_32.o ../lib/cmpxchg8b_emu.o ! subarch-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += ../lib/rwsem.o subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o marionnet-0.90.6+bzr434.orig/uml/kernel/linux-3.8.%.compile_with_ARCH_um_SUBARCH_i386.diff0000600000175000017500000000143012167200764027157 0ustar lucaslucas*** linux-3.2.13.original/arch/x86/um/Makefile 2012-03-19 17:03:17.000000000 +0100 --- linux-3.2.13.modified/arch/x86/um/Makefile 2013-04-30 18:09:48.000000000 +0200 *************** *** 19,25 **** obj-y += checksum_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o ! subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o subarch-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += ../lib/rwsem.o subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o --- 19,27 ---- obj-y += checksum_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o ! subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o \ ! ../lib/atomic64_386_32.o ../lib/cmpxchg8b_emu.o ! subarch-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += ../lib/rwsem.o subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o marionnet-0.90.6+bzr434.orig/uml/kernel/linux-3.2.%-ghost.diff0000600000175000017500000026641112167200764022407 0ustar lucaslucasdiff -ruN linux-3.2.48--original/include/linux/netdevice.h linux-3.2.48/include/linux/netdevice.h --- linux-3.2.48--original/include/linux/netdevice.h 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/include/linux/netdevice.h 2013-07-01 11:59:07.000000000 +0200 @@ -14,6 +14,8 @@ * Alan Cox, * Bjorn Ekwall. * Pekka Riikonen + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -2735,4 +2737,12 @@ #endif /* __KERNEL__ */ +/* + * (ghost support) Just check whether the given name + * belongs to the ghost interface + */ +#ifdef CONFIG_GHOSTIFICATION +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + #endif /* _LINUX_NETDEVICE_H */ diff -ruN linux-3.2.48--original/include/linux/sockios.h linux-3.2.48/include/linux/sockios.h --- linux-3.2.48--original/include/linux/sockios.h 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/include/linux/sockios.h 2013-07-01 11:59:07.000000000 +0200 @@ -9,6 +9,8 @@ * * Authors: Ross Biro * Fred N. van Kempen, + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -85,6 +87,13 @@ #define SIOCOUTQNSD 0x894B /* output queue size (not sent only) */ +/* (ghost support) ghostification's ioctl */ +#ifdef CONFIG_GHOSTIFICATION +#define SIOKLOG 0x894D /* Write a string to the log */ +#define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ +#define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'ghost' */ +#endif /* CONFIG_GHOSTIFICATION */ + /* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ diff -ruN linux-3.2.48--original/include/net/ghostdebug.h linux-3.2.48/include/net/ghostdebug.h --- linux-3.2.48--original/include/net/ghostdebug.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-3.2.48/include/net/ghostdebug.h 2013-07-01 11:59:07.000000000 +0200 @@ -0,0 +1,93 @@ +/* + * Ghost support: + * Some trivials macros for display messages, trace ghost ops, + * debug and devel the ghostification kernel patch. + * + * Authors: Roudiere Jonathan, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __GHOSTDEBUG__ +#define __GHOSTDEBUG__ + +#ifdef CONFIG_GHOSTIFICATION + +/* + * Ghost macros: there are three type of macros for three kind of + * information level : + * + * - the first one is ghost_ptk, that is a simple printk with the + * KERN_INFO log level, it is the standard type of display used + * by the ghostification kernel code to allow user to monitor + * ghost operations, if GHOSTIFICATION_PRINTK is not defined then + * user will not any information about the ghostified interfaces + * and the ghost engine (almost any infos ;-)), + * + * - ghost_debug and ghost_debugmsg are respectively used to show a + * calling card in a part of the code (function, files) and to show + * in plus informations additional (variable, etc ..), these two macros + * display messages with the level KERNEL_DEBUG, + * + * - ghost_devel and ghost_develmsg are very similar (redundant) + * in both previous ones, they are mainly used for the development + * of the patch to follow the stream of execution, activate + * GHOSTIFICATION_DEVEL has interest only for developers. + * +*/ + +/* + * Macro usable to debug during normal usage of the kernel. +*/ +#ifdef CONFIG_GHOSTIFICATION_DEBUG +#define ghost_debug \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): -- info debug -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_debugmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_debug): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_debug +#define ghost_debugmsg(msg,args...) +#endif + +/* + * A little bit redundant with the macro ghost_debug/debugmsg + * but allows a difference in the use, they are not used for the + * debugging, but to verify roads borrowed during the development. + * (note: certainly remove at next release of the patch) +*/ +#ifdef CONFIG_GHOSTIFICATION_DEVEL +#define ghost_devel \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): -- info devel -- \n", \ + __FILE__, __FUNCTION__, __LINE__) +#define ghost_develmsg(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost_devel): file(%s): funct(%s): line(%04d): " msg "\n", \ + __FILE__, __FUNCTION__, __LINE__, ##args) +#else +#define ghost_devel +#define ghost_develmsg(msg,args...) +#endif + +/* + * Macro to display all message from chunk of code which has + * ghostification in charge (use macro to add debug level later). +*/ +#ifdef CONFIG_GHOSTIFICATION_PRINTK +#define ghost_ptk(msg,args...) \ + printk(KERN_DEBUG \ + "(ghost) " msg "\n", ##args) +#else +#define ghost_ptk(msg,args...) +#endif + +#endif /* CONFIG_GHOSTIFICATION */ + +#endif /* __GHOSTDEBUG__ */ diff -ruN linux-3.2.48--original/kernel/softirq.c linux-3.2.48/kernel/softirq.c --- linux-3.2.48--original/kernel/softirq.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/kernel/softirq.c 2013-07-01 11:59:07.000000000 +0200 @@ -134,8 +134,11 @@ static void __local_bh_enable(unsigned int cnt) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq()); WARN_ON_ONCE(!irqs_disabled()); +#endif if (softirq_count() == cnt) trace_softirqs_on((unsigned long)__builtin_return_address(0)); @@ -156,7 +159,10 @@ static inline void _local_bh_enable_ip(unsigned long ip) { +/* (ghost support) we don't want disturbe user's console */ +#ifndef CONFIG_GHOSTIFICATION WARN_ON_ONCE(in_irq() || irqs_disabled()); +#endif #ifdef CONFIG_TRACE_IRQFLAGS local_irq_disable(); #endif Binary files linux-3.2.48--original/linux and linux-3.2.48/linux differ diff -ruN linux-3.2.48--original/net/core/dev.c linux-3.2.48/net/core/dev.c --- linux-3.2.48--original/net/core/dev.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/core/dev.c 2013-07-01 11:59:07.000000000 +0200 @@ -18,6 +18,7 @@ * Alexey Kuznetsov * Adam Sulmicki * Pekka Riikonen + * Luca Saiu (ghostification support) * * Changes: * D.J. Barrow : Fixed bug where dev->refcnt gets set @@ -70,6 +71,8 @@ * indefinitely on dev->refcnt * J Hadi Salim : - Backlog queue sampling * - netif_rx() feedback + * Roudiere Jonathan : make some buxfix in ghostification engine + * verify CAP_NET_ADMIN before (un)ghost iface */ #include @@ -147,6 +150,231 @@ #define GRO_MAX_HEAD (MAX_HEADER + 128) /* + * (ghost support) Chunk of code which has in charge + * the ghostification of network interfaces. + */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* The maximum number of ghost interfaces allowed at any given time: */ +#define MAX_GHOST_INTERFACES_NO CONFIG_GHOSTIFICATION_NUM + +/* + * A crude unsorted array of unique names, where "" stands for an + * empty slot. Elements are so few that an hash table would be overkill, + * and possibly also less efficient than this solution: + */ +static char ghost_interface_names[MAX_GHOST_INTERFACES_NO][IFNAMSIZ]; + +/* A lock protecting the ghost interfaces' support structure: */ +/* static DEFINE_SPINLOCK(ghostification_spin_lock); */ +/* static rwlock_t ghostification_spin_lock = RW_LOCK_UNLOCKED; */ +static DEFINE_RWLOCK(ghostification_spin_lock); + +/* Lock disabling local interrupts and saving flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + unsigned long flags; write_lock_irqsave(&ghostification_spin_lock, flags) + +/* Unlock re-enabling interrupts and restoring flags. This is for + readers/writers, which should be prevented from interfering with + other readers/writers and with readers: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING \ + write_unlock_irqrestore(&ghostification_spin_lock, flags) + +/* Lock disabling local interrupts and saving flags. This is for + readers, which are allowed to execute concurrently: */ +#define LOCK_GHOSTIFICATION_FOR_READING \ + unsigned long flags; read_lock_irqsave(&ghostification_spin_lock, flags) + +/* Lock re-enabling interrupts and restoring flags. This is for + readers, which are allowed to execute concurrently: */ +#define UNLOCK_GHOSTIFICATION_FOR_READING \ + read_unlock_irqrestore(&ghostification_spin_lock, flags) + +#ifdef CONFIG_IPV6 +/* Defined in net/ipv6/addrconf.c: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name); +#endif /* CONFIG_IPV6 */ + +/* Return the index of the given element (which may be "") within + ghost_interface_names, or -1 on failure. Note that this must be + executed in a critical section: */ +static int __lookup_ghost_interface_names(const char *interface_name) +{ + int i; + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(!strcmp(interface_name, ghost_interface_names[i])) + return i; /* we found the given name in the i-th element */ + return -1; /* we didn't find the given name in the array */ +} + +/* This is useful for debugging. It must be called in a critical section. */ +static void __dump_ghost_interfaces(void) +{ + int i; + int number_of_ghost_interfaces = 0; + + ghost_ptk("Ghost interfaces are now: "); + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + if(strcmp(ghost_interface_names[i], "")) { + number_of_ghost_interfaces++; + ghost_ptk("%i. %s", number_of_ghost_interfaces, + ghost_interface_names[i]); + } + + ghost_ptk("There are now %i ghost interfaces. " + "A maximum of %i can exist at any given time.", + number_of_ghost_interfaces, MAX_GHOST_INTERFACES_NO); +} + +/* Just check whether the given name belongs to a ghost interface. + This must be called in a critical section: */ +int __is_a_ghost_interface_name(const char *interface_name) +{ + /* Particular case: "" is *not* a ghost interface name, even + if it's in the ghost interfaces array (we use it just to mark + an empty slot): */ + if(interface_name[0] == '\0') + return 0; + /* Just check whether interface_name is an element of the array: */ + return __lookup_ghost_interface_names(interface_name) >= 0; +} + +/* Just check whether the given name belongs to a ghost interface: */ +int is_a_ghost_interface_name(const char *interface_name) +{ + int result; + LOCK_GHOSTIFICATION_FOR_READING; + /* Just check whether interface_name is an element of the array: */ + result = __is_a_ghost_interface_name(interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING; + return result; +} + +/* Make the given interface ghost. Return 0 on success, nonzero on + failure. Failure occours when the interface is already ghost or + does not exist: */ +static int ghostify_interface(char *interface_name) +{ + int a_free_element_index; + const size_t name_length = strlen(interface_name); + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Let's avoid buffer overflows... This could possibly be exploited: */ + if((name_length >= IFNAMSIZ) || (name_length == 0)) + { + ghost_ptk("The user asked to ghostify the interface %s, " + "which has a name of length %i. Failing.", + interface_name, name_length); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EINVAL; + } + + /* Fail if the interface is already ghostified. In particular we + want *no* duplicates in the array. Note that we're already in + a critical section here, so there's no need for locking: */ + if(__is_a_ghost_interface_name(interface_name)) + { + ghost_ptk("Could not ghostify the interface %s, " + "because it\'s already ghost.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -EEXIST; /* File exists, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Fail if the interface is not found. We don't want add a + no-existing interface in our array */ + struct net_device *device; + device = dev_get_by_name(&init_net, interface_name); + if (device == NULL) { + ghost_ptk("Could not ghostify the interface %s which " + "doesn't exist. Try again.", interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for a free spot: */ + a_free_element_index = __lookup_ghost_interface_names(""); + if(a_free_element_index < 0) + { + ghost_ptk("Could not ghostify the interface %s, " + "because %i interfaces are already ghostified. Sorry.", + interface_name, MAX_GHOST_INTERFACES_NO); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENOMEM; + } + + /* Ok, we found a free spot; just copy the interface name: */ + strcpy(ghost_interface_names[a_free_element_index], interface_name); + +#ifdef CONFIG_IPV6 + /* Hide /proc/net/dev_snmp6/DEVICE for the new ghost DEVICE: */ + hide_proc_net_dev_snmp6_DEVICE_if_needed( + ghost_interface_names[a_free_element_index]); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} + +/* Make the given interface, which should be ghost, non-ghost. + Return 0 on success, nonzero on failure. Failure occours when + the given interface is non-ghost or does not exist: */ +static int unghostify_interface(char *ghost_interface_name) +{ + int the_interface_index; + struct net_device *device; + LOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + + /* Fail if the interface is not found. It is not necessary + to search in the array a no-existing interface and allow + to return a more appropriate error code to the userspace. */ + device = dev_get_by_name(&init_net, ghost_interface_name); + if (device == NULL) { + ghost_ptk("Could not unghostify the interface %s " + "which doesn't exist. Try again.\n", ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ENODEV; + } + + /* Look for the given interface: */ + the_interface_index = + __lookup_ghost_interface_names(ghost_interface_name); + if(the_interface_index < 0) + { + ghost_ptk("Could not unghostify the interface %s, \ + because it's non-ghost or not existing.\n", + ghost_interface_name); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return -ESRCH; /* No such device or address, seems to be more appropriate */ + /* return -EINVAL; */ + } + + /* Ok, we found the interface: just "remove" its name from the array: */ + ghost_interface_names[the_interface_index][0] = '\0'; + +#ifdef CONFIG_IPV6 + /* Show again /proc/net/dev_snmp6/DEVICE for the now non-ghost DEVICE: */ + show_proc_net_dev_snmp6_DEVICE_if_needed(ghost_interface_name); +#endif /* CONFIG_IPV6 */ + + __dump_ghost_interfaces(); + UNLOCK_GHOSTIFICATION_FOR_READING_AND_WRITING; + return 0; +} +EXPORT_SYMBOL(is_a_ghost_interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * (ghost support) End of ghostification support + */ + + +/* * The list of packet types we will receive (as opposed to discard) * and the routines to invoke. * @@ -576,6 +804,13 @@ { int ints[5]; struct ifmap map; + /* (ghost support) There are no ghost interfaces by default */ +#ifdef CONFIG_GHOSTIFICATION + int i; + + for(i = 0; i < MAX_GHOST_INTERFACES_NO; i++) + ghost_interface_names[i][0] = '\0'; +#endif /* CONFIG_GHOSTIFICATION */ str = get_options(str, ARRAY_SIZE(ints), ints); if (!str || !*str) @@ -4076,11 +4311,20 @@ len = ifc.ifc_len; /* - * Loop over the interfaces, and write an info block for each. + * Loop over the interfaces, and write an info block for each, + * (ghost support) unless they are ghostified. */ total = 0; for_each_netdev(net, dev) { +#ifdef CONFIG_GHOSTIFICATION + /* Don't tell the user about ghost interfaces: just skip them */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Skipping the ghost interface %s in SIOCGIFCONF", + dev->name); + continue; + } +#endif /* CONFIG_GHOSTIFICATION */ for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -4183,6 +4427,10 @@ struct rtnl_link_stats64 temp; const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't show anything in /proc if iface is ghostified */ + if(! is_a_ghost_interface_name(dev->name)) +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu " "%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n", dev->name, stats->rx_bytes, stats->rx_packets, @@ -4891,6 +5139,16 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() " + "on the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCGIFFLAGS: /* Get interface flags */ ifr->ifr_flags = (short) dev_get_flags(dev); @@ -4961,6 +5219,17 @@ ops = dev->netdev_ops; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) skip if it is a ghostified interface */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("The user is performing a SIOCxIFxxx ioctl() on " + "the ghost interface %s, Failing.", dev->name); + ghost_debugmsg("we make the SIOCxIFxxx ioctl's call fail " + "with -ENODEV"); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + switch (cmd) { case SIOCSIFFLAGS: /* Set interface flags */ return dev_change_flags(dev, ifr->ifr_flags); @@ -5107,6 +5376,56 @@ */ switch (cmd) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) catch ghostification's ioctl */ + case SIOKLOG: { + char text[1000]; + if(copy_from_user(text, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + text[IFNAMSIZ] = '\0'; + printk(KERN_DEBUG "%s\n", text); + return 0; + } + /* (un)ghostification ops require superuser power */ + case SIOCGIFGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, + (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to ghostify the interface %s.", + interface_name); + if((failure = ghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was ghostified.", + interface_name); + else + ghost_ptk("Failure in ghostification of %s.", + interface_name); + return failure; + } + case SIOCGIFUNGHOSTIFY: { + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + char interface_name[1000]; + int failure; + if(copy_from_user(interface_name, (char __user *)arg, IFNAMSIZ + 1)) + return -EFAULT; + interface_name[IFNAMSIZ] = '\0'; + ghost_ptk("The user asked to unghostify the interface %s.", + interface_name); + if((failure = unghostify_interface(interface_name)) == 0) + ghost_ptk("Ok, %s was unghostified.", + interface_name); + else + ghost_ptk("Failure in unghostification of %s.", + interface_name); + return failure; + } + /* end of ghostficiation ioctl */ +#endif /* CONFIG_GHOSTIFICATION */ /* * These ioctl calls: * - can be done by all. diff -ruN linux-3.2.48--original/net/core/rtnetlink.c linux-3.2.48/net/core/rtnetlink.c --- linux-3.2.48--original/net/core/rtnetlink.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/core/rtnetlink.c 2013-07-01 15:55:19.000000000 +0200 @@ -12,8 +12,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Fixes: + * Fixes: * Vitaly E. Lavrov RTA_OK arithmetics was wrong. + * + * Changes: + * Roudiere Jonathan Some changes + * to ghost support, to allow to hide ghost net interfaces */ #include @@ -53,6 +57,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + struct rtnl_link { rtnl_doit_func doit; rtnl_dumpit_func dumpit; @@ -118,7 +127,10 @@ static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif if (protocol <= RTNL_FAMILY_MAX) tab = rtnl_msg_handlers[protocol]; else @@ -133,7 +145,10 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) { struct rtnl_link *tab; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("protocol = %i and msgindex %i ",protocol, msgindex); +#endif if (protocol <= RTNL_FAMILY_MAX) tab = rtnl_msg_handlers[protocol]; else @@ -577,6 +592,12 @@ { struct sock *rtnl = net->rtnl; int report = 0; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add inforation to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type %i " + "and nlh->nlmsg_seq = %i", pid, nlh->nlmsg_pid, + nlh->nlmsg_type, nlh->nlmsg_seq); +#endif if (nlh) report = nlmsg_report(nlh); @@ -887,6 +908,20 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) add information to devel patch */ + ghost_develmsg("pid = %i, nlh->nlmsg_pid = %i, nlh->nlmsg_type " + "= %i, seq = %i and nlh->nlmsg_seq = %i", + pid, nlh->nlmsg_pid, nlh->nlmsg_type, + seq, nlh->nlmsg_seq); + ghost_develmsg("dev->name = %s and dev->ifindex = %i", + dev->name, + dev->ifindex); + /* function whose call rtnl_fill_ifinfo has been modified, except + rtmsg_ifinfo so if it will be necessary to skip ghost iface here then + keep in your mind to test pid because if it is eq. to 0 then it is a + kernel request (else user request) and we don't want disturbe its work. */ +#endif ifm = nlmsg_data(nlh); ifm->ifi_family = AF_UNSPEC; ifm->__ifi_pad = 0; @@ -1075,6 +1110,24 @@ idx = 0; head = &net->dev_index_head[h]; hlist_for_each_entry_rcu(dev, node, head, index_hlist) { +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function which encapsulates calls to + * rtnl_fill_ifinfo and which is call after rtnl_get_doit/dumpit, + * use to dump list of network interfaces (as used by "ip link") + */ + ghost_develmsg("for_each_netdev, current net_device is %s", + dev->name); + ghost_develmsg("netlink cb pid = %i, cb nlh->nlmsg_type = %i, " + "cb familly/proto = %i, cb nlh->nlmsg_pid %i", + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_type, + cb->family, cb->nlh->nlmsg_pid); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Hide ghotified interface (%s) in the dump", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, @@ -1203,6 +1256,20 @@ } } } +#ifdef CONFIG_GHOSTIFICATION + if(dev != NULL){ + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change state/parameters of a ghotified " + "interface (%s), skip", dev->name); + return -ENODEV; + } + } + +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -1564,6 +1631,17 @@ err = -ENODEV; goto errout; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it with + user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ err = validate_linkmsg(dev, tb); if (err < 0) @@ -1602,6 +1680,17 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Normally we should never go through it + with user-space tools (like iproute) which scan all iface first */ + ghost_develmsg("nlh->nlmsg_type = %i, nlmsg_seq = %i, nlmsg_pid = %i and dev->name = %s", + nlh->nlmsg_type, nlh->nlmsg_seq, nlh->nlmsg_pid, dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change dell a ghotified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ ops = dev->rtnl_link_ops; if (!ops) @@ -1959,6 +2048,8 @@ int err = -ENOBUFS; size_t if_info_size; + /* (ghost support) call rtnl_fill_ifinfo so maybe it + is need here to modify, in order to skip ghost iface */ skb = nlmsg_new((if_info_size = if_nlmsg_size(dev, 0)), GFP_KERNEL); if (skb == NULL) goto errout; @@ -1994,6 +2085,11 @@ int err; type = nlh->nlmsg_type; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Enter, nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i and nlh->nlmsg_seq = %i ", + nlh->nlmsg_pid, nlh->nlmsg_seq, nlh->nlmsg_seq); +#endif /* CONFIG_GHOSTIFICATION */ + if (type > RTM_MAX) return -EOPNOTSUPP; @@ -2010,15 +2106,23 @@ if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) return -EPERM; + /* (ghost support) kind = 2 then imply RTM_GETLINK has been used */ if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { struct sock *rtnl; rtnl_dumpit_func dumpit; rtnl_calcit_func calcit; u16 min_dump_alloc = 0; + /* (ghost support) then rtnl_get_dumpit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ dumpit = rtnl_get_dumpit(family, type); if (dumpit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("Part 1: rtnl_get_dumpit(family %i, type %i) " + "is used before call to netlink_dump_start", + family,type); +#endif /* CONFIG_GHOSTIFICATION */ calcit = rtnl_get_calcit(family, type); if (calcit) min_dump_alloc = calcit(skb, nlh); @@ -2055,6 +2159,11 @@ doit = rtnl_get_doit(family, type); if (doit == NULL) return -EOPNOTSUPP; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) rtnl_get_doit return pointer to the appropriate + function for this family and this type take in rtnl_msg_handler[] */ + ghost_develmsg("Part 2: rtnl_get_doit(family %i, type %i)", family, type); +#endif /* CONFIG_GHOSTIFICATION */ return doit(skb, nlh, (void *)&rta_buf[0]); } @@ -2070,6 +2179,10 @@ { struct net_device *dev = ptr; + /* (ghost support) if we want provide a ghost's way to modify + the state of a ghost iface, it will be necessary to skip event + reports involing ghost iface (actually any changes are possible + if the iface is ghostified so there is nothing to report) */ switch (event) { case NETDEV_UP: case NETDEV_DOWN: diff -ruN linux-3.2.48--original/net/ipv4/arp.c linux-3.2.48/net/ipv4/arp.c --- linux-3.2.48--original/net/ipv4/arp.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv4/arp.c 2013-07-01 11:59:07.000000000 +0200 @@ -71,6 +71,8 @@ * sending (e.g. insert 8021q tag). * Harald Welte : convert to make use of jenkins hash * Jesper D. Brouer: Proxy ARP PVLAN RFC 3069 support. + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -118,6 +120,11 @@ EXPORT_SYMBOL(clip_tbl_hook); #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -1352,9 +1359,21 @@ } #endif sprintf(tbuf, "%pI4", n->primary_key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves +ghost interfaces: */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + read_unlock(&n->lock); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); + tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(&n->lock); +#endif /* CONFIG_GHOSTIFICATION */ } static void arp_format_pneigh_entry(struct seq_file *seq, @@ -1365,9 +1384,21 @@ char tbuf[16]; sprintf(tbuf, "%pI4", n->key); +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) Don't show anything in /proc if it involves + ghost interfaces */ + if (! is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Don't show any arp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); + } +#else seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", - tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", - dev ? dev->name : "*"); + tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", + dev ? dev->name : "*"); +#endif /* CONFIG_GHOSTIFICATION */ } static int arp_seq_show(struct seq_file *seq, void *v) diff -ruN linux-3.2.48--original/net/ipv4/devinet.c linux-3.2.48/net/ipv4/devinet.c --- linux-3.2.48--original/net/ipv4/devinet.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv4/devinet.c 2013-07-01 11:59:07.000000000 +0200 @@ -23,6 +23,9 @@ * address (4.4BSD alias style support), * fall back to comparing just the label * if no match found. + * Roudiere Jonathan : + * some changes to ghost support, skip + * request involving a ghostified iface. */ @@ -66,6 +69,11 @@ #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + static struct ipv4_devconf ipv4_devconf = { .data = { [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1, @@ -455,6 +463,15 @@ ifa->ifa_flags |= IFA_F_SECONDARY; } } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("in_dev->dev->name = %s", in_dev->dev->name); + if (is_a_ghost_interface_name(in_dev->dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + (in_dev->dev->name)); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (!(ifa->ifa_flags & IFA_F_SECONDARY)) { net_srandom(ifa->ifa_local); @@ -600,6 +617,17 @@ if (dev == NULL) goto errout; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("(dev->name) = %s ", (dev->name)); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to change/modfy address on a ghostified interface (%s), skip", + (dev->name)); + err = -ENODEV; + goto errout; + } +#endif /* CONFIG_GHOSTIFICATION */ + in_dev = __in_dev_get_rtnl(dev); err = -ENOBUFS; if (in_dev == NULL) @@ -650,6 +678,12 @@ ASSERT_RTNL(); + /* (ghost support) don't modify this funct but directly + rtm_to_ifaddr, as for others funct, with user-levels tools + (as iproute) we normaly never arrive here (because a dump + all ifaces is perform before and func which make the dump + has been modified (but we want prevent user tool request + the ghost iface directly */ ifa = rtm_to_ifaddr(net, nlh); if (IS_ERR(ifa)) return PTR_ERR(ifa); @@ -1306,6 +1340,15 @@ head = &net->dev_index_head[h]; rcu_read_lock(); hlist_for_each_entry_rcu(dev, node, head, index_hlist) { +#ifdef CONFIG_GHOSTIFICATION /* _VERIFICATION_NEED_ */ + /* (ghost support) If it is a ghostified interface then skip */ + ghost_debugmsg("dev->name = %s", dev->name); + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address on a ghostified interface (%s), skip", + (dev->name)); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; if (h > s_h || idx > s_idx) diff -ruN linux-3.2.48--original/net/ipv4/fib_frontend.c linux-3.2.48/net/ipv4/fib_frontend.c --- linux-3.2.48--original/net/ipv4/fib_frontend.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv4/fib_frontend.c 2013-07-01 11:59:07.000000000 +0200 @@ -6,6 +6,10 @@ * IPv4 Forwarding Information Base: FIB frontend. * * Authors: Alexey Kuznetsov, + * Luca Saiu (simple changes for ghostification + * support). + * Roudiere Jonathan (some display + * and comment for ghostification in rtnetlink functions). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -46,6 +50,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #ifndef CONFIG_IP_MULTIPLE_TABLES static int __net_init fib4_rules_init(struct net *net) @@ -424,6 +433,12 @@ return 0; } +#ifdef CONFIG_GHOSTIFICATION +/* (ghost support) A function implemented in net/core/dev.c */ +int is_a_ghost_interface_name(const char *interface_name); +#endif /* CONFIG_GHOSTIFICATION */ + + /* * Handle IP routing ioctl calls. * These are used to manipulate the routing tables @@ -442,6 +457,22 @@ if (copy_from_user(&rt, arg, sizeof(rt))) return -EFAULT; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Forbid any action involving a ghost interface */ + if (rt.rt_dev != (char __user*)NULL) { + /* We need to have this name in kernel space to check + for ghostification: */ + char interface_name[1000]; /* [IFNAMSIZ+1] is certainly sufficient */ + if(copy_from_user(interface_name, rt.rt_dev, IFNAMSIZ + 1)) + return -EFAULT; + if(is_a_ghost_interface_name(interface_name)) { + ghost_ptk("The user aked to add a route involving the " + "ghost interface %s. We make this operation fail", + interface_name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ rtnl_lock(); err = rtentry_to_fib_config(net, cmd, &rt, &cfg); @@ -450,12 +481,18 @@ if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_delete was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_delete() or fn_trie_delete() */ if (tb) err = fib_table_delete(tb, &cfg); else err = -ESRCH; } else { tb = fib_new_table(net, cfg.fc_table); + /* (ghost support) The function pointed by tb->tb_insert was + also modified to deal with ghost interfaces. Such function + may be either fn_hash_insert() or fn_trie_insert() */ if (tb) err = fib_table_insert(tb, &cfg); else @@ -562,6 +599,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead functions pointed by tb->tb_delete, + * either fn_hash_delete() (in fib_hash.c) or fn_trie_delete() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -584,6 +631,16 @@ struct fib_table *tb; int err; + /* + * (ghost support) add infos for patch devel, we don't modify + * inet_rtm_newroute but instead function pointed by tb->tb_insert, + * either fn_hash_insert() (in fib_hash.c) or fn_trie_insert() + * (in fib_trie.c) + */ + ghost_develmsg(" nlh->nlmsg_pid = %i, nlh->nlmsg_seq = %i " + "and nlh->nlmsg_type = %i", nlh->nlmsg_pid, + nlh->nlmsg_seq, nlh->nlmsg_type); + err = rtm_to_fib_config(net, skb, nlh, &cfg); if (err < 0) goto errout; @@ -599,6 +656,12 @@ return err; } +/* + * (ghost support) Fonction called through rtnetlink to dump + * all routes, we don't change anythings here, changes have + * been made in fib_semantics.c (in fib_dump_info which is + * called by fib_trie and fib_hash). + */ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -611,7 +674,7 @@ if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) && ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED) - return ip_rt_dump(skb, cb); + return ip_rt_dump(skb, cb); /* (ghost support) need modify this func */ s_h = cb->args[0]; s_e = cb->args[1]; @@ -636,6 +699,9 @@ cb->args[1] = e; cb->args[0] = h; + /* (ghost support) Length returned can be changed by + fib_dump_info when a route of a ghositifed iface is + lookup (skb length may be abnormal, diff of mod(240)) */ return skb->len; } diff -ruN linux-3.2.48--original/net/ipv4/fib_semantics.c linux-3.2.48/net/ipv4/fib_semantics.c --- linux-3.2.48--original/net/ipv4/fib_semantics.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv4/fib_semantics.c 2013-07-01 11:59:07.000000000 +0200 @@ -11,6 +11,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * Changes: + * Roudiere Jonathan trivial + * change for ghostification. */ #include @@ -44,6 +47,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "fib_lookup.h" static DEFINE_SPINLOCK(fib_info_lock); @@ -923,6 +931,23 @@ if (nlh == NULL) return -EMSGSIZE; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) function call by fib_trie and fib_hash to dump route, + * in most case we won't arrive here with usertools (like iproute), because + * modification in rtnl_dump_ifinfo hide iface and modif here may be not really + * proper because put abnormal length in the skb->len return by inet_dump_fib + * (used without error..) if pid != 0 then user talks else that is the kernel; + */ + if (pid != 0) + if (is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Try to get route about ghost iface (%s), skip", + fi->fib_dev->name); + /* return -EMSGSIZE; don't use this because that stops evaluation */ + return nlmsg_end(skb, nlh); + } +#endif /* CONFIG_GHOSTIFICATION */ + rtm = nlmsg_data(nlh); rtm->rtm_family = AF_INET; rtm->rtm_dst_len = dst_len; diff -ruN linux-3.2.48--original/net/ipv4/fib_trie.c linux-3.2.48/net/ipv4/fib_trie.c --- linux-3.2.48--original/net/ipv4/fib_trie.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv4/fib_trie.c 2013-07-01 11:59:07.000000000 +0200 @@ -47,6 +47,14 @@ * Paul E. McKenney * Patrick McHardy */ +/* + * Luca Saiu (simple changes for ghostification + * support) + * Roudiere Jonathan (bugfixes, + * forgetting ghost support in the function fn_trie_insert, bad + * field check in fib_route_seq_show). + * + */ #define VERSION "0.409" @@ -83,6 +91,11 @@ #include #include "fib_lookup.h" +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define MAX_STAT_DEPTH 32 #define KEYLENGTH (8*sizeof(t_key)) @@ -1216,6 +1229,18 @@ goto err; } +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + l = fib_find_node(t, key); fa = NULL; @@ -1670,7 +1695,17 @@ fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list); list_for_each_entry_continue(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; - +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) don't make any change for + route involving ghostified interface */ + ghost_debugmsg("interface is %s", fi->fib_dev->name); + if(is_a_ghost_interface_name(fi->fib_dev->name)) { + ghost_ptk("Trying to delete a route involving the " + "ghost device %s: we make this operation fail.", + fi->fib_dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ if (fa->fa_tos != tos) break; @@ -2557,7 +2592,28 @@ || fa->fa_type == RTN_MULTICAST) continue; - if (fi) + if (fi) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't display any informations about + ghostified interfaces under /proc/net/route, bf */ + if (! is_a_ghost_interface_name((const char*)fi->fib_dev->name)) { + ghost_ptk("Don't display routes for a ghostified " + "interface (%s) in /proc/net/route", + (const char*)fi->fib_dev->name); + seq_printf(seq, + "%s\t%08X\t%08X\t%04X\t%d\t%u\t" + "%d\t%08X\t%d\t%u\t%u%n", + fi->fib_dev ? fi->fib_dev->name : "*", + prefix, + fi->fib_nh->nh_gw, flags, 0, 0, + fi->fib_priority, + mask, + (fi->fib_advmss ? + fi->fib_advmss + 40 : 0), + fi->fib_window, + fi->fib_rtt >> 3, &len); + } +#else seq_printf(seq, "%s\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", @@ -2570,13 +2626,14 @@ fi->fib_advmss + 40 : 0), fi->fib_window, fi->fib_rtt >> 3, &len); - else +#endif /* CONFIG_GHOSTIFICATION */ + } else { seq_printf(seq, "*\t%08X\t%08X\t%04X\t%d\t%u\t" "%d\t%08X\t%d\t%u\t%u%n", prefix, 0, flags, 0, 0, 0, mask, 0, 0, 0, &len); - + } seq_printf(seq, "%*s\n", 127 - len, ""); } } diff -ruN linux-3.2.48--original/net/ipv4/igmp.c linux-3.2.48/net/ipv4/igmp.c --- linux-3.2.48--original/net/ipv4/igmp.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv4/igmp.c 2013-07-01 11:59:07.000000000 +0200 @@ -68,6 +68,8 @@ * Alexey Kuznetsov: Accordance to igmp-v2-06 draft. * David L Stevens: IGMPv3 support, with help from * Vinay Kulkarni + * Luca Saiu : trivial changes for ghostification + * support */ #include @@ -106,6 +108,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MSF 10 @@ -2440,8 +2447,18 @@ #endif if (rcu_dereference(state->in_dev->mc_list) == im) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, "%d\t%-10s: %5d %7s\n", + state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); + } +#else seq_printf(seq, "%d\t%-10s: %5d %7s\n", state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); +#endif /* CONFIG_GHOSTIFICATION */ } seq_printf(seq, @@ -2593,14 +2610,30 @@ "Device", "MCA", "SRC", "INC", "EXC"); } else { - seq_printf(seq, - "%3d %6.6s 0x%08x " - "0x%08x %6lu %6lu\n", - state->dev->ifindex, state->dev->name, - ntohl(state->im->multiaddr), - ntohl(psf->sf_inaddr), - psf->sf_count[MCAST_INCLUDE], - psf->sf_count[MCAST_EXCLUDE]); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp information in /proc " + "about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else + seq_printf(seq, + "%3d %6.6s 0x%08x " + "0x%08x %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + ntohl(state->im->multiaddr), + ntohl(psf->sf_inaddr), + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -ruN linux-3.2.48--original/net/ipv4/route.c linux-3.2.48/net/ipv4/route.c --- linux-3.2.48--original/net/ipv4/route.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv4/route.c 2013-07-01 11:59:07.000000000 +0200 @@ -55,6 +55,9 @@ * Eric Dumazet : hashed spinlocks and rt_check_expire() fixes. * Ilia Sotnikov : Ignore TOS on PMTUD and Redirect * Ilia Sotnikov : Removed TOS from hash calculations + * Luca Saiu : trivial changes for ghostification support + * Roudiere Jonathan : ghost support to rtnetlink + * function, ghost bugfix (field) in rt_cache_seq_show * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -112,6 +115,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #define RT_FL_TOS(oldflp4) \ ((oldflp4)->flowi4_tos & (IPTOS_RT_MASK | RTO_ONLINK)) @@ -420,6 +428,14 @@ "Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t" "HHUptod\tSpecDst"); else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Dont't display informations about ghost ifaces, bf */ + if(is_a_ghost_interface_name((const char*)((struct rtable*)v)->dst.dev->name)) { + ghost_ptk("Don't display routing informations about ghost interface (%s)", + ((const char*)((struct rtable*)v)->dst.dev->name)); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ struct rtable *r = v; struct neighbour *n; int len, HHUptod; @@ -2999,8 +3015,13 @@ r->rtm_src_len = 32; NLA_PUT_BE32(skb, RTA_SRC, rt->rt_key_src); } - if (rt->dst.dev) + if (rt->dst.dev) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) */ + ghost_develmsg("Net device is = %s ",rt->dst.dev->name); +#endif NLA_PUT_U32(skb, RTA_OIF, rt->dst.dev->ifindex); + } #ifdef CONFIG_IP_ROUTE_CLASSID if (rt->dst.tclassid) NLA_PUT_U32(skb, RTA_FLOW, rt->dst.tclassid); @@ -3096,7 +3117,7 @@ err = -ENOBUFS; goto errout; } - + /* Reserve room for dummy headers, this skb can pass through good chunk of routing engine. */ @@ -3119,6 +3140,17 @@ if (dev == NULL) { err = -ENODEV; goto errout_free; + +#ifdef CONFIG_GHOSTIFICATION + ghost_debugmsg("Net device is %s ", dev->name); + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", dev->name); + err = -ENODEV; + goto errout_free; + } +#endif /* CONFIG_GHOSTIFICATION */ } skb->protocol = htons(ETH_P_IP); @@ -3153,6 +3185,22 @@ if (rtm->rtm_flags & RTM_F_NOTIFY) rt->rt_flags |= RTCF_NOTIFY; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't allow get ops for route + involving a ghostified interface, unnecessary test ..(rt) */ + if (rt) { + if (rt->dst.dev) { + ghost_debugmsg("Net device is %s ",rt->dst.dev->name); + if (is_a_ghost_interface_name(rt->dst.dev->name)) { + ghost_ptk("Try to get a route involving a ghostified " + "interface (%s), skip", + rt->dst.dev->name); + err = -ENETUNREACH; + goto errout_free; + } + } + } +#endif /* CONFIG_GHOSTIFICATION */ err = rt_fill_info(net, skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0); if (err <= 0) @@ -3167,6 +3215,8 @@ goto errout; } +/* (ghost support) maybe it will be necessary to modify +this func which is call in fib_frontend.c */ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) { struct rtable *rt; diff -ruN linux-3.2.48--original/net/ipv6/addrconf.c linux-3.2.48/net/ipv6/addrconf.c --- linux-3.2.48--original/net/ipv6/addrconf.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv6/addrconf.c 2013-07-01 11:59:07.000000000 +0200 @@ -36,6 +36,9 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Luca Saiu : ghostification support + * Roudiere Jonathan : ghost + * modify functions using (rt)netlink */ #include @@ -82,6 +85,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include #include @@ -459,6 +467,86 @@ return idev; } +/* + * (ghost support) Support to hide snmp6 proc infos. + */ +#ifdef CONFIG_GHOSTIFICATION +/* Utility procedure, needed for {show,hide}_proc_net_dev_snmp6_DEVICE_if_needed(). + Return a pointer to a valid inet6_dev structure on success, NULL on failure: */ +static struct inet6_dev* lookup_snmp6_device(const char *interface_name) +{ + struct net_device *device; + struct inet6_dev *idev; + + /* Lookup the device by name, obtaining an inet6_dev structure: */ + device = dev_get_by_name(&init_net, interface_name); + if(device == NULL) + return NULL; + rtnl_lock(); + idev = ipv6_find_idev(device); + rtnl_unlock(); + return idev; +} + +/* These are defined in net/ipv6/proc.c: */ +extern struct proc_dir_entry *proc_net_devsnmp6; +extern struct file_operations snmp6_seq_fops; + +/* Remove the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already hidden. Return 0 on success, nonzero on error: */ +int hide_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + ghost_ptk("Hiding /proc/net/dev_snmp6/%s...", interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + + /* Remove the proc/ entry, if any. If there was no entry + then remove_proc_entry() will fail, but it's ok for us: */ +#ifdef CONFIG_PROC_FS + if (!proc_net_devsnmp6) + return -ENOENT; + if (idev->stats.proc_dir_entry == NULL) + return -EINVAL; + remove_proc_entry(interface_name, proc_net_devsnmp6); +#endif /* CONFIG_PROC_FS */ + return 0; + //return snmp6_unregister_dev(idev); +} + +/* Create the virtual file /proc/net/dev_snmp6/DEVICE, unless + it's already shown. Return 0 on success, nonzero on error: */ +int show_proc_net_dev_snmp6_DEVICE_if_needed(const char *interface_name) +{ + struct inet6_dev *idev = lookup_snmp6_device(interface_name); + struct proc_dir_entry *proc_directory_entry; + ghost_ptk("Showing /proc/net/dev_snmp6/%s...", + interface_name); + if(idev == NULL) /* lookup failed */ + return -EINVAL; + if(idev->dev == NULL) /* I doubt this may happen... */ + return -EINVAL; +#ifdef CONFIG_PROC_FS + if(!proc_net_devsnmp6) /* there isn't any /proc/net/dev_snmp6 */ + return -ENOENT; + if((proc_directory_entry = create_proc_entry(interface_name, + S_IRUGO, proc_net_devsnmp6)) == NULL) + return -ENOMEM; + proc_directory_entry->data = idev; + proc_directory_entry->proc_fops = &snmp6_seq_fops; + idev->stats.proc_dir_entry = proc_directory_entry; +#endif /* CONFIG_PROC_FS */ + return 0; + /* return snmp6_register_dev(idev); */ +} +EXPORT_SYMBOL(show_proc_net_dev_snmp6_DEVICE_if_needed); +EXPORT_SYMBOL(hide_proc_net_dev_snmp6_DEVICE_if_needed); +#endif /* CONFIG_GHOSTIFICATION */ + +/* + * End of ghostification support + */ + #ifdef CONFIG_SYSCTL static void dev_forward_change(struct inet6_dev *idev) { @@ -2254,6 +2342,10 @@ return PTR_ERR(ifp); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_addr_del(struct net *net, int ifindex, const struct in6_addr *pfx, unsigned int plen) { @@ -2268,6 +2360,15 @@ if (!dev) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to delete address on a ghostified interface (%s), skip", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + if ((idev = __in6_dev_get(dev)) == NULL) return -ENXIO; @@ -3184,6 +3285,22 @@ static int if6_seq_show(struct seq_file *seq, void *v) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if (is_a_ghost_interface_name(ifp->idev->dev->name)) { + ghost_ptk("Don't show informations about a ghostified " + "interface (%s) under /proc.", + ifp->idev->dev->name); + } else { + seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", + &ifp->addr, + ifp->idev->dev->ifindex, + ifp->prefix_len, + ifp->scope, + ifp->flags, + ifp->idev->dev->name); + } +#else seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n", &ifp->addr, ifp->idev->dev->ifindex, @@ -3191,6 +3308,8 @@ ifp->scope, ifp->flags, ifp->idev->dev->name); +#endif /* CONFIG_GHOSTIFICATION */ + return 0; } @@ -3409,6 +3528,10 @@ [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, }; +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3426,7 +3549,9 @@ pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL]); if (pfx == NULL) return -EINVAL; - + /* (ghost support) we could/should stop here a request involving a + ghostified interface but inet6_addr_del already do a part of our work + (get dev etc ..) so instead we modify inet6_addr_del */ return inet6_addr_del(net, ifm->ifa_index, pfx, ifm->ifa_prefixlen); } @@ -3475,6 +3600,10 @@ return 0; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { @@ -3512,6 +3641,15 @@ if (dev == NULL) return -ENODEV; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add a address to a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#endif /* CONFIG_GHOSTIFICATION */ + /* We ignore other flags so far. */ ifa_flags = ifm->ifa_flags & (IFA_F_NODAD | IFA_F_HOMEADDRESS); @@ -3748,6 +3886,12 @@ return err; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc; + * inet6_dump_addr is called by inet6_dump_{ifaddr,ifmcaddr,ifacaddr} + * and call the appropriate inet6_fill_* function. + */ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, enum addr_type_t type) { @@ -3778,6 +3922,16 @@ if (!idev) goto cont; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get infos about addresses of a ghostified interface (%s), skip.", + dev->name); + goto cont; + /* return -ENODEV; don't use it */ + } +#endif /* CONFIG_GHOSTIFICATION */ + if (in6_dump_addrs(idev, skb, cb, type, s_ip_idx, &ip_idx) <= 0) goto done; @@ -3808,7 +3962,6 @@ return inet6_dump_addr(skb, cb, type); } - static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) { enum addr_type_t type = ANYCAST_ADDR; @@ -3816,6 +3969,10 @@ return inet6_dump_addr(skb, cb, type); } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { @@ -3842,6 +3999,17 @@ if (ifm->ifa_index) dev = __dev_get_by_index(net, ifm->ifa_index); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (dev) { + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to get address of a ghostified interface (%s), skip.", + dev->name); + return -ENODEV; + } + } +#endif /* CONFIG_GHOSTIFICATION */ + ifa = ipv6_get_ifaddr(net, addr, dev, 1); if (!ifa) { err = -EADDRNOTAVAIL; @@ -4107,6 +4275,10 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want that an address which is linked + * to an ghostified interface can be show/add/del/modify/etc + */ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); @@ -4125,6 +4297,14 @@ idx = 0; head = &net->dev_index_head[h]; hlist_for_each_entry_rcu(dev, node, head, index_hlist) { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) If it is a ghostified interface then exit */ + if (is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to dump address infos about a ghostified interface (%s), skip.", + dev->name); + goto cont; + } +#endif /* CONFIG_GHOSTIFICATION */ if (idx < s_idx) goto cont; idev = __in6_dev_get(dev); @@ -4156,7 +4336,6 @@ skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; - err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ diff -ruN linux-3.2.48--original/net/ipv6/ip6_fib.c linux-3.2.48/net/ipv6/ip6_fib.c --- linux-3.2.48--original/net/ipv6/ip6_fib.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv6/ip6_fib.c 2013-07-01 11:59:07.000000000 +0200 @@ -269,6 +269,8 @@ #endif +/* (ghost support) iterate on net device, don't modify this function, +we can return ENODEV here, user-space tools (as ip) dump iface list before */ static int fib6_dump_node(struct fib6_walker_t *w) { int res; @@ -314,7 +316,6 @@ { struct fib6_walker_t *w; int res; - w = (void *)cb->args[2]; w->root = &table->tb6_root; diff -ruN linux-3.2.48--original/net/ipv6/Kconfig linux-3.2.48/net/ipv6/Kconfig --- linux-3.2.48--original/net/ipv6/Kconfig 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv6/Kconfig 2013-07-01 11:59:07.000000000 +0200 @@ -4,8 +4,8 @@ # IPv6 as module will cause a CRASH if you try to unload it menuconfig IPV6 - tristate "The IPv6 protocol" - default m + bool "The IPv6 protocol" + default y ---help--- This is complemental support for the IP version 6. You will still be able to do traditional IPv4 networking as well. @@ -16,6 +16,10 @@ For specific information about IPv6 under Linux, read the HOWTO at . + Ghostification notes: + ===================== + IPV6 can not be built in module with ghost support. + To compile this protocol support as a module, choose M here: the module will be called ipv6. @@ -68,7 +72,7 @@ If unsure, say N. config INET6_AH - tristate "IPv6: AH transformation" + bool "IPv6: AH transformation" select XFRM select CRYPTO select CRYPTO_HMAC @@ -80,7 +84,7 @@ If unsure, say Y. config INET6_ESP - tristate "IPv6: ESP transformation" + bool "IPv6: ESP transformation" select XFRM select CRYPTO select CRYPTO_AUTHENC @@ -95,7 +99,7 @@ If unsure, say Y. config INET6_IPCOMP - tristate "IPv6: IPComp transformation" + bool "IPv6: IPComp transformation" select INET6_XFRM_TUNNEL select XFRM_IPCOMP ---help--- @@ -105,7 +109,7 @@ If unsure, say Y. config IPV6_MIP6 - tristate "IPv6: Mobility (EXPERIMENTAL)" + bool "IPv6: Mobility (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- @@ -114,16 +118,16 @@ If unsure, say N. config INET6_XFRM_TUNNEL - tristate + bool select INET6_TUNNEL default n config INET6_TUNNEL - tristate + bool default n config INET6_XFRM_MODE_TRANSPORT - tristate "IPv6: IPsec transport mode" + bool "IPv6: IPsec transport mode" default IPV6 select XFRM ---help--- @@ -132,7 +136,7 @@ If unsure, say Y. config INET6_XFRM_MODE_TUNNEL - tristate "IPv6: IPsec tunnel mode" + bool "IPv6: IPsec tunnel mode" default IPV6 select XFRM ---help--- @@ -141,7 +145,7 @@ If unsure, say Y. config INET6_XFRM_MODE_BEET - tristate "IPv6: IPsec BEET mode" + bool "IPv6: IPsec BEET mode" default IPV6 select XFRM ---help--- @@ -150,14 +154,14 @@ If unsure, say Y. config INET6_XFRM_MODE_ROUTEOPTIMIZATION - tristate "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" + bool "IPv6: MIPv6 route optimization mode (EXPERIMENTAL)" depends on EXPERIMENTAL select XFRM ---help--- Support for MIPv6 route optimization mode. config IPV6_SIT - tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" + bool "IPv6: IPv6-in-IPv4 tunnel (SIT driver)" select INET_TUNNEL select IPV6_NDISC_NODETYPE default y @@ -193,7 +197,7 @@ bool config IPV6_TUNNEL - tristate "IPv6: IP-in-IPv6 tunnel (RFC2473)" + bool "IPv6: IP-in-IPv6 tunnel (RFC2473)" select INET6_TUNNEL ---help--- Support for IPv6-in-IPv6 and IPv4-in-IPv6 tunnels described in diff -ruN linux-3.2.48--original/net/ipv6/mcast.c linux-3.2.48/net/ipv6/mcast.c --- linux-3.2.48--original/net/ipv6/mcast.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv6/mcast.c 2013-07-01 11:59:07.000000000 +0200 @@ -24,6 +24,10 @@ * - MLD for link-local addresses. * David L Stevens : * - MLDv2 support + * Luca Saiu : + * - trivial changes for ghostification support + * Roudiere Jonathan + * - trivial changes to correct an forgetting */ #include @@ -63,6 +67,11 @@ #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing... */ #define MCAST_DEBUG 2 @@ -2405,6 +2414,20 @@ struct ifmcaddr6 *im = (struct ifmcaddr6 *)v; struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show information about ghost interfaces */ + if(! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc " + "about ghostified interfaces (1)."); + seq_printf(seq, + "%-4d %-15s %pi6 %5d %08X %ld\n", + state->dev->ifindex, state->dev->name, + &im->mca_addr, + im->mca_users, im->mca_flags, + (im->mca_flags&MAF_TIMER_RUNNING) ? + jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); + } +#else seq_printf(seq, "%-4d %-15s %pi6 %5d %08X %ld\n", state->dev->ifindex, state->dev->name, @@ -2412,6 +2435,7 @@ im->mca_users, im->mca_flags, (im->mca_flags&MAF_TIMER_RUNNING) ? jiffies_to_clock_t(im->mca_timer.expires-jiffies) : 0); +#endif /* CONFIG_GHOSTIFICATION */ return 0; } @@ -2563,6 +2587,20 @@ "Device", "Multicast Address", "Source Address", "INC", "EXC"); } else { +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Don't show any info about ghost interfaces */ + if (! is_a_ghost_interface_name(state->dev->name)) { + ghost_debugmsg("Don't show any igmp6 information in /proc" + " about ghostified interfaces (2)."); + seq_printf(seq, + "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", + state->dev->ifindex, state->dev->name, + &state->im->mca_addr, + &psf->sf_addr, + psf->sf_count[MCAST_INCLUDE], + psf->sf_count[MCAST_EXCLUDE]); + } +#else seq_printf(seq, "%3d %6.6s %pi6 %pi6 %6lu %6lu\n", state->dev->ifindex, state->dev->name, @@ -2570,6 +2608,7 @@ &psf->sf_addr, psf->sf_count[MCAST_INCLUDE], psf->sf_count[MCAST_EXCLUDE]); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; } diff -ruN linux-3.2.48--original/net/ipv6/proc.c linux-3.2.48/net/ipv6/proc.c --- linux-3.2.48--original/net/ipv6/proc.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv6/proc.c 2013-07-01 11:59:07.000000000 +0200 @@ -9,6 +9,8 @@ * * Authors: David S. Miller (davem@caip.rutgers.edu) * YOSHIFUJI Hideaki + * Luca Saiu (trivial changes for + * ghostification support) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -30,6 +32,16 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include + +/* (ghost support) We don't want this to be static, as it has to + be read at ghostifying and unghostifying time */ +struct proc_dir_entry *proc_net_devsnmp6; +EXPORT_SYMBOL(proc_net_devsnmp6); +#endif /* CONFIG_GHOSTIFICATION */ + static int sockstat6_seq_show(struct seq_file *seq, void *v) { struct net *net = seq->private; @@ -229,6 +241,18 @@ return single_open_net(inode, file, snmp6_seq_show); } +/* (ghost support) This was originally static, +but we need to make it visible */ +#ifdef CONFIG_GHOSTIFICATION +struct file_operations snmp6_seq_fops = { + .owner = THIS_MODULE, + .open = snmp6_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +EXPORT_SYMBOL(snmp6_seq_fops); +#else static const struct file_operations snmp6_seq_fops = { .owner = THIS_MODULE, .open = snmp6_seq_open, @@ -236,6 +260,7 @@ .llseek = seq_lseek, .release = single_release_net, }; +#endif /* CONFIG_GHOSTIFICATION */ static int snmp6_dev_seq_show(struct seq_file *seq, void *v) { diff -ruN linux-3.2.48--original/net/ipv6/route.c linux-3.2.48/net/ipv6/route.c --- linux-3.2.48--original/net/ipv6/route.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/ipv6/route.c 2013-07-01 11:59:07.000000000 +0200 @@ -22,6 +22,10 @@ * reachable. otherwise, round-robin the list. * Ville Nuorvala * Fixed routing subtrees. + * Luca Saiu + * trivial changes for ghostification support + * Roudiere Jonathan + * ghostification support update, modify functions using netlink */ #include @@ -62,6 +66,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Set to 3 to get tracing. */ #define RT6_DEBUG 2 @@ -1205,10 +1214,6 @@ } EXPORT_SYMBOL(ip6_dst_hoplimit); -/* - * - */ - int ip6_route_add(struct fib6_config *cfg) { int err; @@ -1958,6 +1963,8 @@ struct in6_rtmsg rtmsg; int err; + /* (ghost support) don't make any change, changes + have been made later for ioctl request */ switch(cmd) { case SIOCADDRT: /* Add a route */ case SIOCDELRT: /* Delete a route */ @@ -2309,26 +2316,84 @@ return err; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; - err = rtm_to_fib6_config(skb, nlh, &cfg); - if (err < 0) - return err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_del(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it + is a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to del route involving a ghostified interface (%s). Failing", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_del(&cfg); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc. + */ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) { struct fib6_config cfg; int err; +#ifdef CONFIG_GHOSTIFICATION + struct net *net = NULL; + struct net_device *dev = NULL; + err = rtm_to_fib6_config(skb, nlh, &cfg); if (err < 0) return err; + + /* (ghost support) get the net struct through sock struct */ + net = sock_net(skb->sk); + if(!net) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) get the net_device struct through fib6_config */ + dev = dev_get_by_index(net, cfg.fc_ifindex); + if(!dev) + return ip6_route_add(&cfg); /* do that or exit on error ... */ + /* (ghost support) ok we know the device name so if it is + a ghostified interface, return device not exist */ + if(is_a_ghost_interface_name(dev->name)) { + ghost_ptk("Try to add route involving a ghostified interface (%s). Failing.", + dev->name); + return -ENODEV; + } +#else + err = rtm_to_fib6_config(skb, nlh, &cfg); + if (err < 0) + return err; +#endif /* CONFIG_GHOSTIFICATION */ return ip6_route_add(&cfg); } @@ -2348,6 +2413,10 @@ + nla_total_size(sizeof(struct rta_cacheinfo)); } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc + */ static int rt6_fill_node(struct net *net, struct sk_buff *skb, struct rt6_info *rt, struct in6_addr *dst, struct in6_addr *src, @@ -2360,6 +2429,19 @@ u32 table; struct neighbour *n; +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg("rtnetlink msg type %i, pid %i and seq %i", + type, pid, seq); + /* (ghost support) this function is called by by rt6_dump_route, and + inet6_rtm_get_route and inet6_rt_notify, test if it is a kernel request*/ + if (rt->rt6i_dev->name) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to get/notify route infos about a " + "ghostified interface (%s), skip.", + rt->rt6i_dev->name); + return 1; + } +#endif /* CONFIG_GHOSTIFICATION */ if (prefix) { /* user wants prefix routes only */ if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { /* success since this is not a prefix route */ @@ -2480,10 +2562,26 @@ return -EMSGSIZE; } +/* + * (ghost support) We don't want a route which involed a + * ghostified interface can be show/add/del/modify/etc, + */ int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; int prefix; + +#ifdef CONFIG_GHOSTIFICATION + ghost_develmsg(" rtnetlink mesg %i, pid %i and seq %i", + arg->cb->nlh->nlmsg_type, arg->cb->nlh->nlmsg_pid, arg->cb->nlh->nlmsg_seq); + /* if (rt->rt6i_dev) + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Try to dump route infos about a ghostified interface (%s), skip", + rt->rt6i_dev->name); + return -ENODEV; errro maybe come from here, modify instead + rt6_fill_node which has multiple callers + } */ +#endif /* CONFIG_GHOSTIFICATION */ if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); @@ -2497,6 +2595,8 @@ prefix, 0, NLM_F_MULTI); } +/* (ghost support) Don't make changes here, function +rt6_fill_node has been modified instead */ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) { struct net *net = sock_net(in_skb->sk); @@ -2641,6 +2741,17 @@ struct seq_file *m = p_arg; struct neighbour *n; +#ifdef CONFIG_GHOSTIFICATION + /* (ghost support) Do nothing if this route involves a + ghostified interface */ + if(rt->rt6i_dev != NULL) /* can't use &&: evaluation order is undefined */ + if(is_a_ghost_interface_name(rt->rt6i_dev->name)) { + ghost_ptk("Don't show any informations under /proc/net" + "involving a ghostified interface (%s)", + rt->rt6i_dev->name); + return 0; + } +#endif /* CONFIG_GHOSTIFICATION */ seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen); #ifdef CONFIG_IPV6_SUBTREES diff -ruN linux-3.2.48--original/net/Kconfig linux-3.2.48/net/Kconfig --- linux-3.2.48--original/net/Kconfig 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/Kconfig 2013-07-01 11:59:07.000000000 +0200 @@ -189,6 +189,105 @@ source "net/decnet/netfilter/Kconfig" source "net/bridge/netfilter/Kconfig" +config GHOSTIFICATION_NETFILTER + bool "Ghostification support to netfilter" + depends on GHOSTIFICATION && NETFILTER_ADVANCED + default y + help + Ghostification support to Netfilter. Allow to bypass all + Netfilter's hooks (INPUT, OUTPUT, FORWARD, POSTROUTING and + PREROUTING (when available)) and that for all layer or protocol: + ARP, Bridge, IPv4, IPv6 (and Decnet) or just for one protocol + or layer. + If you choose to activate the Ghostification of Netfilter then + all the network packets which come from, or go to an ghostified + interface will not get through the hooks of Netfilter; so rules + which have been created with Iptables, Ip6tables, Arptables or + Ebtables will have no effect on these packets. + Note: This option allows you to have access to the options of + configuration of the Ghostification of Netfilter but it activates + no section of code; you will thus need to select one or some + among those this below. + +config GHOSTIFICATION_NETFILTER_ALL + bool "Ghostification support to netfilter, skip all hooks" + depends on GHOSTIFICATION_NETFILTER + default y + help + Netfiter Ghostification support for all protocols/layers. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass + Netfilter's hooks; thus any actions or rules which have been + created through Iptables, Ip6tables, Arptables or Ebtables + will not have any effect on this packets. + +config GHOSTIFICATION_NETFILTER_ARP + bool "Ghostification support to netfilter, skip ARP hooks" + depends on GHOSTIFICATION_NETFILTER && IP_NF_ARPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the ARP protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Arp + hooks of Netfilter; thus the rules which have been created + with the Arptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_BRIDGE + bool "Ghostification support to netfilter, skip Bridge hooks" + depends on GHOSTIFICATION_NETFILTER && BRIDGE_NF_EBTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the Bridge protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass Bridge + hooks of Netfilter; thus the rules which have been created + with the Ebtables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV4 + bool "Ghostification support to netfilter, skip IPv4 hooks" + depends on GHOSTIFICATION_NETFILTER && !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv4 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv4 + hooks of Netfilter; thus the rules which have been created + with the Iptables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + +config GHOSTIFICATION_NETFILTER_IPV6 + bool "Ghostification support to netfilter, skip IPv6 hooks" + depends on GHOSTIFICATION_NETFILTER && IP6_NF_IPTABLES + depends on !GHOSTIFICATION_NETFILTER_ALL + help + Netfiter ghostification support for the IPv6 protocol/layer. + If you activate this option then all network packets which + come from, or go to a ghostified interface will bypass IPv6 + hooks of Netfilter; thus the rules which have been created + with the Ip6tables tool will not have any effect on them. + If you activate Netfilter Ghostification for this protocol/layer + then you will lose the capability that network packets bypass + Decnet's hooks of Netfilter. + If you are unsure how to answer this question when you have + decided to use ghostification then answer N and use instead + GHOSTIFICATION_NETFILTER_ALL above. + endif source "net/dccp/Kconfig" @@ -325,4 +424,93 @@ source "net/nfc/Kconfig" +config GHOSTIFICATION + bool "Ghostification support" + depends on INET + default y + help + Ghostification support allow you to hide network interfaces + on your system. Ghostify and Unghostify are the actions which + make dynamically invisible and visible a network interface/cards + (eth0, lo, tun, ...) for the userspace. + When a network interface is ghostified, users of your system + can not see it with userspace tools like ifconfig, route, iproute, + netstat and/or have statistics about it. However even if a network + interface is ghostified it is always possible to open a socket + using the Ip address of this interface, ping this interface or + any host connected to the same network remains possible; has the + opposite, it is not possible to sniff packets on a ghostified + interface with userspace tools like tcpdump, wireshark, ... + Informations about a ghostified interface are hidden under /proc + but they can be find under /sys, it is a limit of the ghostification + patch. + For more informations about Ghostification patch and engine see + the README of the tarball that you have used or go to website of + the Marionnet project at . + + +config GHOSTIFICATION_NUM + int "Ghostification support : max number of possible ghostified interface" + depends on GHOSTIFICATION + range 4 32 + default 8 + help + Here you can choose the number of network interfaces that + you will be allowed to ghostify. This number must be between + 4 and 32. + +config GHOSTIFICATION_MESG + bool "Ghostification messages, display, debug and devel" + depends on GHOSTIFICATION + default y + help + Ghostification messages configuration. This option allow + you to have acces to the options which configure and control + the type of messages that you want the ghostification engine + diplay (visible through syslogd). + There are three options which make more or less verbose the + ghostification engine. You can choose to not select any + options below if you want to try to hide the ghostification + operations for the users of your system. + Note: This option allows you to have access to the options + which control the number of messages and the verbosity of + the Ghostification engine but it activates no section of + code; you will thus need to select one or some among those + this below. + +config GHOSTIFICATION_PRINTK + bool "Ghostification, messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + default y + help + This option allow you to activate normal messsages from the + ghostification engine, those messages are display through a + simple printk (visible through syslogd), this messages allow + to have informations about the ghost operations (like "the + interface ethX has been ghostified", "unghostified", "is already + ghostified", etc ...). If you really wish to hide ghostified + interfaces and ghost operations for the users of your system + don't select this option. + +config GHOSTIFICATION_DEBUG + bool "Ghostification, debugging messages to monitor ghost operations" + depends on GHOSTIFICATION_MESG + help + This option increase the verbosity of the ghostification engine, + allow to get more informations in order to debug the ghost ops. + This option is in general used to verify the result of a test or + to display the datas (interface name, pid of a calling process, ...) + which are treated by the ghost engine. + +config GHOSTIFICATION_DEVEL + bool "Ghostification, helping messages to trace ghost operations (devel)" + depends on GHOSTIFICATION_MESG + help + This option give more informations that the option above, it is use + by developer of the ghostification patch in order to control some + paths used in the kernel code and the datas which are manipulated. + This option is a little redundant with the debug option but allow + to have a better granularity, maybe it will be remove for the next + release of the ghostification patch. + endif # if NET diff -ruN linux-3.2.48--original/net/netfilter/core.c linux-3.2.48/net/netfilter/core.c --- linux-3.2.48--original/net/netfilter/core.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/netfilter/core.c 2013-07-01 11:59:07.000000000 +0200 @@ -5,6 +5,8 @@ * way. * * Rusty Russell (C)2000 -- This code is GPL. + * Little change by Jonathan Roudiere to add + * Ghostification support (bypass netfilter for ghost interface). */ #include #include @@ -23,6 +25,11 @@ #include #include +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + #include "nf_internals.h" static DEFINE_MUTEX(afinfo_mutex); @@ -60,7 +67,6 @@ { struct nf_hook_ops *elem; int err; - err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; @@ -169,7 +175,158 @@ rcu_read_lock(); elem = &nf_hooks[pf][hook]; + next_hook: + /* + * (ghost support) Netfilter ghostification support. + * Perform too much tests here is not a good idea because all + * network packets pass through this section but we have + * not other choice to skip netfilter hooks (per hook). + */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER + /* + * Bypass all Netfilter hooks (for ipv4/6, arp, bridge) for any + * ghostified interface (eq. to return NF_ACCEPT for each packet which + * go through an interface which is ghostified (do that at hook level + * in order to skip all chains's rules hang on the hooks)) + */ + + /* don't use ghost_debugmsg macro in this section + because it may introduce too much delay */ + ghost_develmsg("Enter in hook (pf=%i) (hook=%i) from indev->name = " + "%s to outdev->name = %s", pf, hook, indev->name, outdev->name); + +/* If we wish to skip all netfilter hooks for all PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ALL + /* + * outdev->name field is defined in OUTPUT, FORWARD and POSTROUTING hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), we start here (with outdev) to bypass netfilter's + * hooks in the case where we are in FORWARD. + */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + ret = 1; + goto unlock; + } + } + /* + * indev->name field is defined in PREROUTING, FORWARD and INPUT hooks, + * if it is a ghostified interface then we must bypass netfilter hooks + * (and all rules chains), if we are in FORWARD hook and outdev/indev->name + * is not a ghostified interface then we can go towards hooks. + */ + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + ret = 1; + goto unlock; + } + } + +/* + * If GHOSTIFICATION_NETFILTER_ALL is not defined neither any + * GHOSTIFICATION_NETFILTER_PF then we 'll skip all this code chunk. + * (about performance, choose to skip netfilter just for certains PF + * is the most bad things we can do, but ...) + */ +#elif (defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV4) || defined(CONFIG_GHOSTIFICATION_NETFILTER_IPV6) || \ + defined(CONFIG_GHOSTIFICATION_NETFILTER_ARP) || defined(CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE)) + /* Here we have the same logic as previously (in GHOSTIFICATION_NETFILTER_ALL) + but with the ability to choose what are the PFs that we want to skip */ + if ((outdev->name) != NULL) { + if (!is_a_ghost_interface_name(outdev->name)) { + ghost_develmsg("(outdev->name) = %s is not a ghostfied interface", + (outdev->name)); + goto apply_hook; + } else { + ghost_develmsg("(outdev->name) = %s is a ghostfied interface", + (outdev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + if ((indev->name) != NULL) { + if (!is_a_ghost_interface_name(indev->name)) { + ghost_develmsg("(indev->name) = %s is not a ghostfied interface", + (indev->name)); + goto apply_hook; + } else { + ghost_develmsg("(indev->name) = %s is a ghostfied interface", + (indev->name)); + /* start with IPv4, IPv6 because they are the most current PF */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV4 + if (pf == PF_INET) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV4 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_IPV6 + if (pf == PF_INET6) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_IPV6 */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_ARP + if (pf == NF_ARP) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_ARP */ +#ifdef CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE + if (pf == PF_BRIDGE) { + ret = 1; + goto unlock; + } +#endif /* CONFIG_GHOSTIFICATION_NETFILTER_BRIDGE */ + /* We arrive here that is because we are not in a PF + that we wish skip so we apply rules chain (for decnet) */ + goto apply_hook; + } + } + +#endif /* CONFIG_GHOSTIFICATION_ALL */ +apply_hook: +#endif /* CONFIG_GHOSTIFICATION_NETFILTER */ +/* (ghost support) End of ghostification support */ + verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh); if (verdict == NF_ACCEPT || verdict == NF_STOP) { @@ -191,6 +348,9 @@ kfree_skb(skb); } } +#ifdef CONFIG_GHOSTIFICATION_NETFILTER +unlock: +#endif rcu_read_unlock(); return ret; } diff -ruN linux-3.2.48--original/net/packet/af_packet.c linux-3.2.48/net/packet/af_packet.c --- linux-3.2.48--original/net/packet/af_packet.c 2013-06-29 05:06:45.000000000 +0200 +++ linux-3.2.48/net/packet/af_packet.c 2013-07-01 11:59:07.000000000 +0200 @@ -8,6 +8,7 @@ * Authors: Ross Biro * Fred N. van Kempen, * Alan Cox, + * Luca Saiu : Trivial changes for ghostification * * Fixes: * Alan Cox : verify_area() now used correctly @@ -94,6 +95,11 @@ #include #endif +/* (ghost support) */ +#ifdef CONFIG_GHOSTIFICATION +#include +#endif + /* Assumptions: - if device has no dev->hard_header routine, it adds and removes ll header @@ -1593,6 +1599,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (rcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -1717,6 +1735,18 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Drop packets involving ghost interfaces: + * we don't want the user to be able to sniff them. + */ + if(is_a_ghost_interface_name(orig_dev->name) || + is_a_ghost_interface_name(dev->name)) { + ghost_debugmsg("Drop a packet which is going through a ghostified interface (trcv)"); + goto drop; + } +#endif /* CONFIG_GHOSTIFICATION */ + sk = pt->af_packet_priv; po = pkt_sk(sk); @@ -3841,6 +3871,26 @@ struct sock *s = sk_entry(v); const struct packet_sock *po = pkt_sk(s); +#ifdef CONFIG_GHOSTIFICATION + /* + * (ghost support) Don't show packets involving ghost devices + */ + struct net_device *net_device = dev_get_by_index(sock_net(s), po->ifindex); + if(! is_a_ghost_interface_name(net_device->name)) { + ghost_debugmsg("Don't show packets involving ghostified interface"); + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", + s, + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), + po->ifindex, + po->running, + atomic_read(&s->sk_rmem_alloc), + sock_i_uid(s), + sock_i_ino(s) ); + } +#else seq_printf(seq, "%pK %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", s, @@ -3852,6 +3902,7 @@ atomic_read(&s->sk_rmem_alloc), sock_i_uid(s), sock_i_ino(s)); +#endif /* CONFIG_GHOSTIFICATION */ } return 0; marionnet-0.90.6+bzr434.orig/uml/README0000600000175000017500000000223312167200764016237 0ustar lucaslucas======================================================================= drwxr-xr-x 2 jean jean 4096 Jun 19 23:37 ethghost drwxr-xr-x 4 jean jean 4096 May 6 20:12 kernel These directories contain UML kernel patches (mostly for ghostification), kernel .config files, and userland utilities (again, mostly for ghostification). Our repositories do *not* contain copies of Linux, since the kernel is huge and we only need tiny modifications. All of this makes easy to create UML kernels usable with Marionnet. This part of the work has been performed by Jonathan Roudiere and Luca Saiu. ======================================================================= drwxrwxr-x 6 jean jean 4096 May 22 13:23 pupisto.buildroot drwxrwxr-x 2 jean jean 4096 Jun 19 19:27 pupisto.common drwxrwxr-x 12 jean jean 4096 Jun 21 17:04 pupisto.debian drwxrwxr-x 3 jean jean 4096 May 21 20:08 pupisto.kernel drwxrwxr-x 2 jean jean 4096 Apr 8 13:51 startup These directories contain a set of scripts to build kernels and/or filesystems (Buildroot and Debian) suitable for Marionnet. This part of the work has been performed by Jean-Vincent Loddo with the contribution of Antoine Seignard. marionnet-0.90.6+bzr434.orig/uml/pupisto.kernel/0000700000175000017500000000000012167200764020337 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.kernel/pupisto.kernel.sh0000700000175000017500000003470212167200764023666 0ustar lucaslucas#!/bin/bash # This file is part of Marionnet # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Preamble for automatic log-file generation: MY_BASENAME=$(basename $0) if [[ $1 = "--help" || $1 = "-h" || $1 = "--list" || $1 = "-l" || $1 = "--source" || $1 = "-s" ]]; then # do nothing and continue : elif grep -q "log_${MY_BASENAME}[.]......$" <<<"$1"; then LOGFILE=$1 shift # and continue else LOGFILE=$(mktemp /tmp/log_${MY_BASENAME}.XXXXXX) EXIT_CODE_FILE=$(mktemp /tmp/exit_code_${MY_BASENAME}.XXXXXX) echo -e "Log file of command:\n$0" "$@" "\n---" >$LOGFILE COLUMNS=$(tput cols) { time $0 "$LOGFILE" "$@"; echo $? >$EXIT_CODE_FILE; } 2>&1 | tee -a "$LOGFILE" | cut -c1-$((COLUMNS)) read EXIT_CODE <$EXIT_CODE_FILE rm -f $EXIT_CODE_FILE echo "---" echo "$MY_BASENAME: previous running logged into $LOGFILE" exit $EXIT_CODE fi [[ $1 = "--source" || $1 = "-s" ]] || { set -e shopt -s nullglob shopt -s expand_aliases } # Getopt's format used to parse the command line: OPTSTRING="hlsc" function parse_cmdline { local i j flag # Transform long format options into the short one: for i in "$@"; do if [[ double_dash_found = 1 ]]; then ARGS+=("$i") else case "$i" in --custom) ARGS+=("-c"); ;; --help) ARGS+=("-h"); ;; --source) ARGS+=("-s"); ;; --list) ARGS+=("-l") ;; --) ARGS+=("--"); double_dash_found=1; ;; --[a-zA-Z0-9]*) echo "*** Illegal long option $i."; exit 1; ;; -[a-zA-Z0-9]*) j="${i:1}"; while [[ $j != "" ]]; do ARGS+=("-${j:0:1}"); j="${j:1}"; done; ;; *) ARGS+=("$i") ;; esac fi done set - "${ARGS[@]}" unset ARGS # Interpret short format options: while [[ $# -gt 0 ]]; do OPTIND=1 while getopts ":$OPTSTRING" flag; do if [[ $flag = '?' ]]; then echo "ERROR: illegal option -$OPTARG."; exit 1; fi eval "option_${flag}=$OPTIND" eval "option_${flag}_arg='$OPTARG'" done for ((j=1; j [WORKING-DIRECTORY] or: ${0##*/} (--help|-h) or: ${0##*/} (--list|-l) or: source ${0##*/} (--source|-s) The first synopsis builds a kernel. The second synopsis prints this message and exits. The third synopsis shown the list of defined functions. The fourth synopsis allows this script to be sourced (to have relevant functions available in the current environment). Options: -c/--custom customize the kernel using 'make menuconfig' Example: $ ${0##*/} 3.4.22 $ ${0##*/} 3.4.22 /tmp/_build.678HG234 $ ${0##*/} -l $ source ${0##*/} -s" exit $1 } # Manage now your options in a convenient order # # Option -h if [[ -n ${option_h} ]]; then print_usage_and_exit 0 fi AWK_PROGRAM_LISTING_FUNCTIONS='/^[ ]*function[ ]*[a-zA-Z0-9_]*[ ]*{/ && ($2 != "parse_cmdline") && ($2 != "print_usage_and_exit") {print $2}' # Option -l/--list if [[ -n ${option_l} ]]; then awk <"$0" "$AWK_PROGRAM_LISTING_FUNCTIONS" | sort exit 0 fi # Option -c/--custom if [[ -n ${option_c} ]]; then CUSTOM_OPTION="--custom" fi #################################### # M A I N # #################################### # ------------------- # Configuring kernels # ------------------- # Sort and merge `.config' files removing comments and empty lines. # Note that the operation of sorting lines provides the expected behaviour: the # letter "y" (yes) comes after "n" (no), that comes after "m" (module). # In other terms, if a variable X is set twice, for instance X=m in a file, and # X=y in the other file, the resulting file will be made with the line "X=m" before # the line "X=y". In this way, "make oldconfig" will take "X=y" discarding the previous # setting, as we expect. In the case of "X=n" vs "X=m", "no" wins. function sort_and_merge_config_files { cat "$@" | awk 'NF>0 && $1 !~ /^#/' | sort | uniq } # Usage: create_kernel_config_from [-i] # # Example: # create_kernel_config_from CONFIG-2.6.18 # # Successfully tested with 3.2.{13,44}, 3.4.42, 3.8.10 function create_kernel_config_from { local INTERACTIVE if [[ $1 = -i ]]; then INTERACTIVE=y; shift; fi local DEFAULT_OLD_CONFIG_FILE=$PWD/CONFIG-2.6.18 local OLD_CONFIG_FILE=${1:-$DEFAULT_OLD_CONFIG_FILE} [[ -f $OLD_CONFIG_FILE ]] || return 1 # Make a default .config for ARCH=um make mrproper make mrproper ARCH=um make defconfig ARCH=um # Merge with the provided (good) .config sort_and_merge_config_files .config $OLD_CONFIG_FILE >.config.1 mv .config.1 .config if [[ $INTERACTIVE = y ]]; then make oldconfig ARCH=um SUBARCH=i386 else while true; do echo; done | make oldconfig ARCH=um SUBARCH=i386 fi # Finally fix some specific problems: # UML_NET_PCAP must be unset (error compiling the kernel): # (unhappily because in this way we cannot start wireshark as normal user, # see http://wiki.wireshark.org/CaptureSetup/CapturePrivileges) sed -i -e 's/CONFIG_UML_NET_PCAP=y/CONFIG_UML_NET_PCAP=n/' .config # Looking linux-3.0.75/arch/x86/lib/Makefile this variable must be unset: sed -i -e 's/CONFIG_X86_CMPXCHG64=y/CONFIG_X86_CMPXCHG64=n/' .config # Looking http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=084189a sed -i -e 's/CONFIG_CMPXCHG_LOCAL=y/CONFIG_CMPXCHG_LOCAL=n/' .config # Now switch to "yes" (=y) all remaining things set as module (=m). # In the case of kernel 3.2.44 (LTS) we have only this settings: # CONFIG_UML_SOUND=m # CONFIG_SOUND=m # CONFIG_HOSTAUDIO=m # CONFIG_HW_RANDOM=m # CONFIG_CRYPTO_RNG=m # CONFIG_CRYPTO_ANSI_CPRNG=m sed -i -e 's/=m/=y/' .config # A second time, in order to have a very clean .config: while true; do echo; done | make oldconfig ARCH=um SUBARCH=i386 echo "Ok, result of merging and cleaning in \`.config'" } # ---------------- # Compilig kernels # ---------------- # For instance, if we call this function when we are (PWD) in # "/home/myrepos/marionnet/uml/pupisto/pupisto.sh.files/" # the result will be "/home/myrepos/marionnet/uml/" # This is useful to get files which location is known with # respect to this path (for instance kernel patches). function get_our_marionnet_slash_uml_directory_path { # Global PWD local TRAILER=${PWD##*/marionnet/uml/} echo ${PWD%$TRAILER} } # Usage: # $ download_patch_and_compile_kernel [c/--custom] [WORKING-DIRECTORY] # # Example: # $ download_patch_and_compile_kernel 3.2.48 /tmp/_building_directory function download_patch_and_compile_kernel { local CUSTOM if [[ $1 = "-c" || $1 = "--custom" ]]; then CUSTOM=y shift fi # global CUSTOM [[ $# -ge 1 ]] || return 1 # For instance "3.2.48" local VERSION=$1 local TWDIR=${2:-.} local DOWNLOADS_DIRECTORY=${3:-$PWD/_build.downloads} # Before pushing, get our marionnet/uml/kernel directory: local OUR_KERNEL_DIR=$(get_our_marionnet_slash_uml_directory_path)/kernel # Move to the working temporary directory (or current directory): pushd "$TWDIR" # Download, uncompress and untar the kernel: local KERNEL_SUBDIR=${VERSION%.*} local KERNEL_SUBDIR=${KERNEL_SUBDIR//3.?/3.x} # To save the tarball: mkdir -p $DOWNLOADS_DIRECTORY if [[ -f linux-${VERSION}.tar.xz ]]; then tar -xJf linux-${VERSION}.tar.xz mv linux-${VERSION}.tar.xz $DOWNLOADS_DIRECTORY/ elif [[ -f $DOWNLOADS_DIRECTORY/linux-${VERSION}.tar.xz ]]; then tar -xJf $DOWNLOADS_DIRECTORY/linux-${VERSION}.tar.xz else wget -O - https://www.kernel.org/pub/linux/kernel/v${KERNEL_SUBDIR}/linux-${VERSION}.tar.xz | tee $DOWNLOADS_DIRECTORY/linux-${VERSION}.tar.xz | tar -xJf - fi # Move to the kernel directory: cd linux-${VERSION} local FOUND GHOST_SUFFIX i j # Apply all patches for this version: for i in $OUR_KERNEL_DIR/linux-{$VERSION,${VERSION%.*}.%,${VERSION%.*.*}.%.%}[.-]*.{diff,patch}; do FOUND=y j=$(basename $i) echo "Applying patch: \'$j'"; echo "---" patch -p1 < $i cp $i ./ if grep -q "ghost" <<<"$j"; then GHOST_SUFFIX="-ghost" fi echo "---" done if [[ -z $FOUND ]]; then echo "No patch found for this kernel version in $OUR_KERNEL_DIR/kernel" echo "At least the \"ghostification\" patch was expected at location $OUR_KERNEL_DIR/linux-${VERSION}-ghost.diff" echo "Continuing however without patches." fi # Copy or generate .config from our repository FOUND=$OUR_KERNEL_DIR/CONFIG-$VERSION if [[ -f $FOUND ]]; then echo "Using pre-built config file found at $FOUND" cp $FOUND .config elif [[ -f $OUR_KERNEL_DIR/older-versions/CONFIG-2.6.18 ]]; then echo "Config file for version $VERSION not found. We generate it from our older CONFIG-2.6.18" create_kernel_config_from $OUR_KERNEL_DIR/older-versions/CONFIG-2.6.18 else echo "Error: $OUR_KERNEL_DIR/older-versions/CONFIG-2.6.18 not found" return 2 fi # Modify CONFIG_LOCALVERSION="-ghost" according to the # presence of the "ghostification" patch: if [[ -n $GHOST_SUFFIX ]]; then sed -i -e 's/CONFIG_LOCALVERSION="-ghost"/CONFIG_LOCALVERSION=""/' .config #unset GHOST_SUFFIX fi # Custom: if [[ $CUSTOM = y ]]; then local PSEUDO_TERMINAL=$(tty) make menuconfig ARCH=um SUBARCH=i386 0<$PSEUDO_TERMINAL 1>$PSEUDO_TERMINAL fi # Add `ccache' in the PATH if needed: if [[ -f /usr/lib/ccache/gcc ]] && ! grep -q "ccache" <<<$PATH; then export PATH=$(dirname $(which gcc)):$PATH fi # Exploit processors: local PROCESSOR_NO=$(\grep "^processor.*:" /proc/cpuinfo | sort | uniq | wc -l) # Launch the compilation process with the virtual `um' architecture (ARCH), # and with `i386' target host architecture (SUBARCH) make -j $PROCESSOR_NO ARCH=um SUBARCH=i386 cp -a linux linux-${VERSION}${GHOST_SUFFIX}-unstripped strip linux ln linux linux-${VERSION}${GHOST_SUFFIX} cp .config linux-${VERSION}${GHOST_SUFFIX}.config echo -ls -l $PWD ls -l linux-* popd } # download_patch_and_compile_kernel # --------------- # Testing kernels # --------------- # Example: # start_kernel ./kernel32-3.2.48 machine-brighella-59975 function start_kernel { local GDB if [[ $1 = "--debug" ]]; then # GDB="gdb --eval-command run --args " GDB='gdb -ex "handle SIGSEGV nostop noprint" -ex "handle SIGUSR1 nopass stop print" -ex run --args ' shift fi [[ $# -gt 1 ]] || return 1 local KERNEL="${GDB}${1}" local FS=$2 shift; shift; local OTHER_OPTIONS="$@" set -x TAP=$(LC_ALL=en_US ifconfig -a | \grep -o "^tap[0-9]" | head -n 1) if [[ -z $TAP ]]; then xterm -l -sb -T "m1" -e "$KERNEL keyboard_layout=us ubda=$FS umid=m1 mem=128M root=98:0 hostname=m1 guestkind=machine $OTHER_OPTIONS" else xterm -l -sb -T "m1" -e "$KERNEL keyboard_layout=us ubda=$FS umid=m1 mem=128M root=98:0 hostname=m1 guestkind=machine eth0=tuntap,$TAP $OTHER_OPTIONS" fi # -l generate a log XTerm.log. set +x echo "fuser -k first time:" fuser -k ${FS#*,} echo "fuser -k second time:" fuser -k ${FS#*,} } # Example: # start_kernel_with_cow ./kernel32-3.2.48 machine-brighella-59975 function start_kernel_with_fresh_cow { local GDB if [[ $1 = "--debug" ]]; then GDB="--debug" shift fi local KERNEL=$1 local FS=$2 local COWFILE=$(mktemp /tmp/start_kernel.XXXXXXX.cow) rm -f $COWFILE FS="$COWFILE,$FS" shift; shift; start_kernel $GDB $KERNEL $FS "$@" } # Stop here if the option -s (--source) has been provided: if [[ -n ${option_s} ]]; then # Export all functions of this file: echo export -f $(awk <$BASH_SOURCE "$AWK_PROGRAM_LISTING_FUNCTIONS") export -f $(awk <$BASH_SOURCE "$AWK_PROGRAM_LISTING_FUNCTIONS") return 0 2>/dev/null || { echo "Warning: the option -s must be used source-ing this script, not when the script is called as a standalone executable"; echo "Example: source $BASH_SOURCE -s"; exit 1; } fi if [[ $# -eq 0 ]]; then print_usage_and_exit 2 fi KERNEL_VERSION="$1" if ! echo $KERNEL_VERSION | grep -q "^[1-9][.][0-9][0-9]*[.][0-9][0-9]*$"; then echo 1>&2 "Error: \`$KERNEL_VERSION' is not a valid kernel version." print_usage_and_exit 2 fi WORKING_DIRECTORY=${2:-.} DOWNLOADS_DIRECTORY=$WORKING_DIRECTORY/_build.downloads [[ -d $WORKING_DIRECTORY ]] || { echo 1>&2 "Unexisting working directory \`$WORKING_DIRECTORY'" echo 1>&2 "Exiting." exit 3 } [[ -d $WORKING_DIRECTORY/linux-$KERNEL_VERSION ]] && { echo 1>&2 "A directory \`$WORKING_DIRECTORY/linux-$KERNEL_VERSION' already exists." KERNEL_DIR_BACKUP=$WORKING_DIRECTORY/linux-$KERNEL_VERSION.$(date +%Y-%m-%d.%H\h%M | tr -d " ").backup mv $WORKING_DIRECTORY/linux-$KERNEL_VERSION $KERNEL_DIR_BACKUP echo 1>&2 "Moved to \`$KERNEL_DIR_BACKUP'" } set -x download_patch_and_compile_kernel $CUSTOM_OPTION $KERNEL_VERSION "$WORKING_DIRECTORY" "$DOWNLOADS_DIRECTORY" set +x function abspath { local B=$(basename $1) local D=$(dirname $1) (builtin cd $D; echo $PWD/$B) } # If we are in the same directory of the script, we switch to a directory name # beginning with "_build." (according to the Makefile): if [[ $(dirname $(abspath $WORKING_DIRECTORY)) = $(dirname $(abspath "$0")) ]]; then BUILT_DIR=_build.linux-${KERNEL_VERSION}.$(date +%Y-%m-%d.%H\h%M).$RANDOM echo "Moving \`$WORKING_DIRECTORY/linux-$KERNEL_VERSION' -> \`$WORKING_DIRECTORY/$BUILT_DIR'" mv $WORKING_DIRECTORY/linux-$KERNEL_VERSION $WORKING_DIRECTORY/$BUILT_DIR # Copy log: cp $LOGFILE $WORKING_DIRECTORY/$BUILT_DIR/$(basename $LOGFILE) if [[ -f linux-${VERSION}.tar.xz ]]; then mkdir -p $DOWNLOADS_DIRECTORY mv linux-${VERSION}.tar.xz $DOWNLOADS_DIRECTORY/ fi fi echo 'Success.' marionnet-0.90.6+bzr434.orig/uml/pupisto.kernel/Makefile0000600000175000017500000000377612167200764022016 0ustar lucaslucas# This file is part of Marionnet # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . help: @echo "Usage: make " @echo " or: make OPTIONS=--custom " @echo " or: make show_versions" @echo " or: make dependencies" @echo " or: make clean" @echo " or: make help" @echo "Example: make 3.2.48" 2.% 3.%: dependencies ./pupisto.kernel.sh $(OPTIONS) $@ clean: rm -rf _build.linux-* # Show available (stable or longterm support) versions of the kernel # looking to https://www.kernel.org/: show_versions: @lynx 2>/dev/null --dump https://www.kernel.org/ | awk '/longterm:/ || /stable:/ {print $$1,$$2}' # ============================================================= # Dependencies # ============================================================= REQUIRED_PACKAGES=binutils wget patch ccache gcc gcc-multilib libc6-i386 libc6-dev-i386 dependencies: @echo "Required packages: $(REQUIRED_PACKAGES)" @which dpkg 1>/dev/null || { echo "Not a Debian system (oh my god!); please install packages corresponding to: $(REQUIRED_PACKAGES)"; exit 1; } @dpkg 1>/dev/null -l $(REQUIRED_PACKAGES) || \ if which aptitude; then \ sudo aptitude install -q -q -q -y $(REQUIRED_PACKAGES); \ elif which apt-get; then \ sudo apt-get install -q -q -q -y $(REQUIRED_PACKAGES); \ else \ exit 1; \ fi @echo Ok. marionnet-0.90.6+bzr434.orig/uml/guest/0000700000175000017500000000000012167200764016504 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/guest/bashrc0000600000175000017500000000421612167200764017676 0ustar lucaslucas# Some aliases and simple but useful functions for system/network exercices. # J.V. Loddo - Licence: GPL export PS1='[$? \u@\[\e[0;36m\]\h\[\e[m\] \w]\\$ ' # Without colored hostname: # export PS1='[$? \u@\h \w]\\$ ' alias ls='ls -Fs --color' alias ll="ls -lh" alias la="ls -alh" alias lt="ls -lth" alias '..'='cd ..' # Verbose dhclient (ignored by busybox) alias dhclient='dhclient -v' # The preferable default is "nullglob on" but the # bash-completion doesn't run properly with it, so: if type &>/dev/null dh_bash-completion; then shopt -u nullglob else shopt -s nullglob fi # Clean $PATH export PATH=$(for i in ${PATH//:/ }; do [[ -d $i ]] && echo $i ; done | uniq | tr '\n' ':') PATH=${PATH%:} export EDITOR="nano" # Get the specified field of each line: function field { local N=${1:-1}; shift; cat "$@" | awk -v N=$N '{print $N}'; } export field # Like `which' but reads links recursively. Useful for instance to quickly know # if a binary name corresponds to busybox: function what { local W B if W=$(which "$1"); then if B=$(readlink -f $W); then echo $B else echo $W fi else return 1 fi } export what # TCP listening ports: function tcp_ports { local CMD="sudo netstat -tlnp" if [[ $# = 0 ]]; then $CMD else local ARGS="$@"; $CMD | \grep "${ARGS// /\\|}" fi } export tcp_ports # UDP waiting ports: function udp_ports { local CMD="sudo netstat -unpa" if [[ $# = 0 ]]; then $CMD else local ARGS="$@"; $CMD | \grep "${ARGS// /\\|}" fi } export udp_ports # Listening unix ports function unix_ports { local CMD="sudo netstat -xnpa | \grep LISTENING" if [[ $# = 0 ]]; then eval $CMD else local ARGS="$@"; eval $CMD | \grep "${ARGS// /\\|}" fi } export unix_ports # Service ports (TCP, UDP or UNIX): function srv_ports { echo "--- TCP listening ports" tcp_ports "$@" echo "--- UDP waiting ports" udp_ports "$@" echo "--- UNIX listening ports" unix_ports "$@" } export srv_ports # Files opened by a command: # Example: opened_by bash function opened_by { local TMPFILE=$(mktemp) strace 2>$TMPFILE "$@" . # TODO: run `set -x' if Marionnet is currently in the debug mode! # set -x ### BEGIN INIT INFO # Provides: marionnet-startup # Required-Start: $local_fs $network $syslog # Required-Stop: # Should-Start: # Should-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: Execute actions according to the kernel command line # Description: When Marionnet launches a kernel, it puts on the kernel # command line a set of bindings VARIABLE=VALUE which are # interpreted by this script to execute some actions in # order to make the virtual machine suitable for the user. ### END INIT INFO ########################################### # Source-ing kernel command line # ########################################### # Read kernel command line variables into this shell's environment: # Expected variables: hostname hostfs guestkind ubd0s (or ubda) timezone numeric_TZ console_no export $(tr > "$FILE" } ########################################### # hostname # ########################################### # Set the hostname according to the kernel command line: if [[ -n $hostname ]]; then echo $hostname > /etc/hostname # The script `/etc/init.d/hostname.sh' belonged to the package `initscripts' # on old debian systems: if [[ -x /etc/init.d/hostname.sh ]]; then /etc/init.d/hostname.sh start elif type hostname; then hostname $hostname fi &>/dev/null # Make a correct entry in /etc/hosts: append_line_if_needed "127.0.0.1 $hostname" /etc/hosts else echo "Warning: variable 'hostname' undefined" 1>&2 fi ########################################### # hostfs # ########################################### # Mount the hostfs filesystem and add bindings from the hostfs file # `boot_parameters' to this shell environment: if [[ -n $hostfs ]]; then mkdir -p /mnt/hostfs mount none /mnt/hostfs -t hostfs && HOSTFS_MOUNTED=yes && # And also record it on the hostfs filesystem, so that we can # easily tell which guest machine the directory belongs to # *from the host*: [[ -n $hostname ]] && echo $hostname > /mnt/hostfs/GUESTNAME && source /mnt/hostfs/boot_parameters else echo "Warning: variable 'hostfs' undefined" 1>&2 fi ########################################### # xterm title # ########################################### # Show the hostname (and its filesystem) in the terminal window title bar virtual_disk=${ubd0s:-$ubda} if [[ -n $virtual_disk ]]; then # Get the name of the virtual filesystem choosen by the user: virtualfs_name="${virtual_disk##*/}" virtualfs_kind=${virtualfs_name%%-*} # "machine" or "router" virtualfs_name=${virtualfs_name#router-} virtualfs_name=${virtualfs_name#machine-} echo -e '\033]0;'"$hostname ($virtualfs_name)"'\007' else echo "Warning: variable '$virtual_disk' undefined" 1>&2 fi ########################################### # Network configurations # ########################################### # Perform an indirect lookup of the variable $1'_eth'$2, i.e. return # the value of the variable which is the value of the variable named # $1'_eth'$2. function lookup { echo $(eval echo '$'$1'_eth'$2) } # Configure network interfaces: if [[ -n $ethernet_interfaces_no ]]; then for i in $(eval echo {0..$((ethernet_interfaces_no-1))}); do mac_address=`lookup mac_address $i` mtu=`lookup mtu $i` ipv4_address=`lookup ipv4_address $i` ipv4_broadcast=`lookup ipv4_broadcast $i` ipv4_netmask=`lookup ipv4_netmask $i` ipv6_address=`lookup ipv6_address $i` [[ -z $mac_address ]] || ifconfig eth$i hw ether $mac_address [[ -z $mtu ]] || ifconfig eth$i mtu $mtu # IPv4 configuration. # The variable `ipv4_address' may be defined via the Marionnet GUI with the # CIDR notation, i.e. in the form x.y.z.t/N. However, in order to be # compatible with the busybox (buildroot) implementation of `ifconfig', # Marionnet extracts the address into x.y.z.t and sets `ipv4_address', # then it computes the corresponding netmask and sets `ipv4_netmask'. # So, the command executed here may have a form like: # ifconfig eth0 192.168.0.1 # or # ifconfig eth0 192.168.0.1 netmask 255.255.255.0 if [[ -n $ipv4_address ]]; then if [[ -n $ipv4_netmask ]]; then ifconfig eth$i $ipv4_address netmask $ipv4_netmask else ifconfig eth$i $ipv4_address fi fi # IPv6 configuration. # The variable `ipv6_address' may be defined via the Marionnet GUI with the # CIDR notation. So, the command executed here may have a form like: # ifconfig eth0 inet6 add 2003:abd::1/32 if [[ -n $ipv6_address ]]; then ifconfig eth$i inet6 add $ipv6_address fi done fi ########################################### # Ghost interface (eth42) # ########################################### # Activate and immediately "ghostify" our special network # interface communicating with the host: ifconfig eth42 $ip42 up &>/dev/null if type ethghost; then ethghost -g eth42; fi &>/dev/null ########################################### # /etc/fstab # ########################################### # TODO: according to the kernel version! SWAP_DEVICE=/dev/ubdb if [[ -n ${ubd0s} ]]; then ROOT_DEVICE=/dev/ubd0 else ROOT_DEVICE=/dev/ubda fi # Add swap (the swap 'partition' was already created as a # sparse file and initialized with mkswap from the host side): append_line_if_needed \ "$SWAP_DEVICE none swap sw 0 0" \ /etc/fstab ROOT_FS_TYPE=$(awk /proc/sys/kernel/printk ########################################### # DISPLAY # ########################################### # Setting DISPLAY x11_display_number=${x11_display_number#:} DISPLAY_VALUE=172.23.0.254:${x11_display_number:-0} # Support for `ssh' tunnelling: if [[ -n "$x11_display_cookie" ]] && type -t xauth &>/dev/null; then xauth add $DISPLAY_VALUE . $x11_display_cookie fi # Find a suitable shell configuration file and append the line setting the # variable DISPLAY: for i in /etc/profile /etc/bash.bashrc /root/.bash_profile /root/.bashrc; do if [[ -f $i ]]; then append_line_if_needed "export DISPLAY=$DISPLAY_VALUE" $i break; fi done ########################################### # Additional consoles (tty1, tty2,..) # ########################################### # Modify /etc/inittab then signal the `init' process # in order to create new tty? consoles: function start_consoles { local LINE_PREFIX="tty" if [[ $1 = "--empty-prefix" ]]; then unset LINE_PREFIX shift fi local REQUIRED_CONSOLE_NO="$1" local ADDITIONAL_CONSOLES=$((REQUIRED_CONSOLE_NO-1)) local TARGET=/etc/inittab local skip=0 local i for ((i=1; i<=ADDITIONAL_CONSOLES; i=i+1)); do if grep -q "^#${LINE_PREFIX}${i}:" $TARGET; then sed -i -e "s/^#${LINE_PREFIX}${i}:/${LINE_PREFIX}${i}:/" $TARGET elif ! grep -q "^${LINE_PREFIX}${i}:" $TARGET; then local TTY0_LINE LINE TTY0_LINE=$(grep "^${LINE_PREFIX}0:" $TARGET) LINE=$(echo ${TTY0_LINE//${LINE_PREFIX}0/${LINE_PREFIX}$i}) [[ -z "$LINE" ]] || echo $LINE >> $TARGET else let skip=skip+1 fi done [[ $skip = $ADDITIONAL_CONSOLES ]] || kill -HUP 1 # Update inittab: for ((i=ADDITIONAL_CONSOLES+1; i<=8; i=i+1)); do if grep -q "^${LINE_PREFIX}${i}:" $TARGET; then sed -i -e "s/^${LINE_PREFIX}${i}:/#${LINE_PREFIX}${i}:/" $TARGET fi done } # LINE_PREFIX may be empty (Debian) or "tty" (Buildroot): local LINE_PREFIX=$(grep "^[^#].*/sbin/getty" /etc/inittab | cut -f1 -d: | head -n 1) LINE_PREFIX=${LINE_PREFIX%?} # chop last char case "$LINE_PREFIX" in tty) start_consoles "$console_no" ;; "") start_consoles --empty-prefix "$console_no" ;; esac ########################################### # quagga # ########################################### if [[ $virtualfs_kind = "router" || $guestkind = "router" ]]; then /etc/init.d/quagga start fi ########################################### # timezone # ########################################### function echo_export_TZ { # global numeric_TZ local NTZ=${1:-$numeric_TZ} local h IFS=: read h _ <<<"$NTZ" let h=-1*h if [[ $h -gt 0 ]]; then echo "export TZ=UTC+$h" elif [[ $h -lt 0 ]]; then echo "export TZ=UTC$h" else echo "export TZ=UTC" fi } # echo_export_TZ # Example: timezone="Europe/Paris" if [[ -n $timezone && -e /usr/share/zoneinfo/$timezone ]]; then rm -f /etc/{timezone,localtime} ln -s /usr/share/zoneinfo/$timezone /etc/timezone ln -s /usr/share/zoneinfo/$timezone /etc/localtime fi if [[ -n $numeric_TZ ]]; then local LINE LINE=$(echo_export_TZ $numeric_TZ) append_line_if_needed "$LINE" /etc/profile fi ###################################### # Source `marionnet-relay' patches # ###################################### # 1) Source generic patches: # /mnt/hostfs/marionnet-relay* # # 2) Source machine-specific (or router-specific) patches: # /mnt/hostfs/${virtualfs_name}.relay* if [[ $HOSTFS_MOUNTED = yes ]]; then # Ex: machine-debian-wheezy-42007 virtualfs_name="${virtual_disk##*/}" local i for i in /mnt/hostfs/{marionnet-,$virtualfs_name.}relay*; do echo "Source-ing $i ..." source "$i"; done fi ### echo "OK" clear # Instead of launching getty with option "-f /etc/issue.linuxlogo", # we simply execute the command linuxlogo: if type &>/dev/null linuxlogo && [[ -f /etc/issue.marionnet ]]; then linuxlogo > /etc/issue cat /etc/issue.marionnet >>/etc/issue fi } ########################## END of function start() # ======================================================== # # STOP () # # ======================================================== # function stop { echo -n "Marionnet shutdown tunings... " ########################################### # Mrproper take care of /etc/hosts # ########################################### function remove_line_if_needed { local LINE="$1" local FILE="$2" local temporary_file if test -f "$FILE" && grep -q "^${LINE}$" "$FILE"; then temporary_file=$(mktemp /tmp/$(basename $0).XXXXXX) && \ grep -v "^${LINE}$" "$FILE" > $temporary_file && \ mv -f $temporary_file "$FILE" fi } # Remove the host name from /etc/hosts: the user might change it # when the virtual machine is off: remove_line_if_needed "127.0.0.1 $hostname" /etc/hosts echo "OK" } ########################## END of function stop() case "$1" in start) start ;; stop) stop ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac marionnet-0.90.6+bzr434.orig/uml/guest/ssh/0000700000175000017500000000000012167200764017301 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/guest/ssh/README0000600000175000017500000000102312167200764020157 0ustar lucaslucas1) The following settings in `/etc/sshd_config' allow Marionnet to connect or send commands to virtual machines: PermitRootLogin yes StrictModes no PubkeyAuthentication yes 2) The private key `id_rsa_marionnet' should be used by Marionnet in a command like the following: ssh -i id_rsa_marionnet -o PreferredAuthentications=publickey root@172.23.0.1 ls / 3) The public key `id_rsa_marionnet.pub' should be appended to .ssh/authorized_keys for both "root" and "student" accounts into the virtual machines. marionnet-0.90.6+bzr434.orig/uml/guest/ssh/id_rsa_marionnet0000777000175000017500000000000012167200764027753 2../../../share/id_rsa_marionnetustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/guest/ssh/id_rsa_marionnet.pub0000600000175000017500000000061412167200764023331 0ustar lucaslucasssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPNzykHXpxvqlTqXUjq/7R6D5+QGMy9vlK9P2+P7b15Ihcq2WT2GCpfZzVxuLTGMyI9hiwT0CSE3Y6QLWpiqHc55YZJmDwFPcd84wqRVw9xRtNhMHmLtV2PGptGnehpi/YaBLY5c/5dj8IaXJ3ZDPMxsjn0Iz0WBgvPOcW0ESIioP/ORHz7d+yvNFFPJzLAvOVW7pDEg11eqxCW74azzPnhmVzvUpUH595vH/fQTt6v/bobgWRKBacQ8uoBPR4c9KhV++ZwtUnlGi2juvO0A8+qrcObpa/HZ0bwVS2f87j2fcSEMbxyfAj4knCOGeDLF24c/PWhlCbwPPAqIuQ/aTX root@localhost marionnet-0.90.6+bzr434.orig/uml/pupisto.common/0000700000175000017500000000000012167200764020347 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.common/toolkit_chroot.sh0000600000175000017500000002106612167200764023755 0ustar lucaslucas#!/bin/bash # (file to be sourced) # This file is part of marionnet # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ============================================================= # ENHANCED VERSION OF chroot # ============================================================= # In order to prevent annoying messages related to locales: shopt -s expand_aliases alias chroot='LANG=us LC_ALL=$LANG LC_MESSAGES=$LANG LANGUAGE=$LANG chroot' # Create a temporary file in /tmp/ starting with "$1", plus de current # timestamp: function mkTMPFILE { mktemp /tmp/${1}.$(date +%H\h%M | tr -d " ").XXXXXX } # 1-column file difference: function list_diff { [[ -f "$1" && -f "$2" ]] || { return 1; } local PATTERNS=$(sort "$2" | uniq) sort "$1" | uniq | \grep -v -w -F "$PATTERNS" } # rewrite [-f/--follow] FILE with COMMAND # Examples: # $ rewrite FOO with grep "DATE=" FOO # $ rewrite FOO with grep "DATE=" $TMPFILE else "$@" >> $TMPFILE fi else "$@" | tee $APPEND $TMPFILE fi cat $TMPFILE > $TARGET rm -f $TMPFILE } # Return the list of pids still rooted in $1 function pidsrooted { local ROOT=$(realpath "$1") local i # The command `find' below is too noisy: type pause_tracing &>/dev/null && pause_tracing for i in $(find /proc -maxdepth 1 -noleaf -name "[1-9]*"); do echo -n "$i "; readlink $i/root; done | cut -c7- | \grep $ROOT | cut -d" " -f1 | tac | tr '\n' ' ' type continue_tracing &>/dev/null && continue_tracing } # Return the list of fs mounted in $1 (except /proc and /sys) function fsmounted { local ROOT=$(realpath "$1") cat /proc/mounts | \grep "$ROOT/" | awk '{print $2}' | \grep -v "$ROOT/proc" | \grep -v "$ROOT/sys" | tac | tr '\n' ' ' } # Usage: TICKET=$(save_files XXX YYY ... ZZZ) function save_files { local ARCHIVE=$(mktemp) tar -czf $ARCHIVE "$@" echo "$PWD:$ARCHIVE" } # Usage: restore_files $TICKET # where TICKET has been provided by `save_files' function restore_files { local OLD_PWD ARCHIVE IFS=: read OLD_PWD ARCHIVE <<<"$1" tar -C $OLD_PWD -xzf $ARCHIVE && rm -f $ARCHIVE } # Usage: sudo_fcall FUNCTION ACTUALS.. # Limitations: the called function can call itself only exported functions; # you can show these functions with `export -fp'. function sudo_fcall { # global COOL_SUDO [[ $# -ge 1 ]] || return 2 local FUNC="$1" if [[ -z $COOL_SUDO ]]; then COOL_SUDO=$(mktemp /tmp/COOL_SUDO.XXXXXX) export COOL_SUDO chmod +x $COOL_SUDO fi echo '#!/bin/bash' > $COOL_SUDO # Put the definition of all exported functions: export -pf >> $COOL_SUDO # Put the definition of all exported variables: export -p >> $COOL_SUDO # Put all current set-options (-e, -x, ..): echo "set -$-" >> $COOL_SUDO # Put the definition of the called function: type $FUNC | tail -n +2 >> $COOL_SUDO # Put now the command that we want to execute as root: echo "$@" >> $COOL_SUDO # Finally call the script with sudo: sudo $COOL_SUDO } # Enhanced chroot: imports caller's system configurations (network,X,..) # and exits very cleanly (killing, unmounting,..). # Usage: sudo_fcall careful_chroot ... function careful_chroot { [[ $# -ge 1 ]] || return 2 local ROOT=$(realpath "$1") shift [[ -d $ROOT && -x $ROOT ]] || return 1 test $(id -u) -eq 0 || { echo 1>&2 "You must be root to call this function"; return 3; } # --- local i # Go to the target, but not in a chrooted environnement: pushd "$ROOT" 1>&2 2>/dev/null # Manage the /dev/null problem local DEV=$(df "$ROOT" | grep "^/dev" | cut -f1 -d" ") if [[ -n $DEV ]]; then mount -o remount,dev $DEV else # May be an aufs? DEV=$(df . | tail -n 1 | cut -f1 -d" ") if [[ "$DEV" = aufs ]]; then : # Do nothing else # Probably a loopback, try to remount with the dev option mount -o remount,dev . || true fi fi # Mount /proc and /sys mount -t proc proc ./proc mount -t sysfs sysfs ./sys # Save relevant files local TICKET=$(save_files "etc/resolv.conf" "root/.bashrc" "etc/fstab") # Copy relevant files from current root: local TFILES="etc/resolv.conf" for i in $TFILES; do rm -f $i; cat /$i > $i; done # X server type -P xhost &>/dev/null && xhost 1>&2 + localhost echo "export DISPLAY=${DISPLAY:-localhost:0.0}" >> root/.bashrc # clear fstab >etc/fstab # Go: local L="us" LANG=$L LC_ALL=$L LC_MESSAGES=$L LANGUAGE=$L chroot $PWD "$@" local RETURN_CODE=$? sync # Restore previously saved files: restore_files $TICKET # Clean history echo 1>&2 "Cleaning history..." # Note that the following setting is not persistent, because this # function will be executed by a distinct Bash interpreter (called # by the wrapper `sudo_fcall'): shopt -s nullglob for i in "$PWD"/{root/,home/*/}.bash_history; do >$i; done # Kills all processes rooted in the previous root ROOT=$(realpath $PWD) local LIST=$(pidsrooted $PWD) echo 1>&2 -n "Killing all processes rooted here (${LIST% *}) ..." chroot "$ROOT" bash -c "for i in $LIST; do kill -15 \$i && sleep 1s; done" 2>/dev/null || true sleep 1s chroot "$ROOT" bash -c "for i in $LIST; do kill -9 \$i && sleep 1s; done" 2>/dev/null || true echo 1>&2 " done." # Warning for processes still running LIST=$(pidsrooted $PWD) [[ -z $LIST ]] || { echo 1>&2 "WARNING: the following list of processes still running with root=$ROOT" local NAME PID for i in $LIST; do NAME=$(grep '^Name:' /proc/$i/status) PID=$(grep '^Pid:' /proc/$i/status) echo 1>&2 -e "$NAME\t($PID)" done } # Umount all but /proc and /sys LIST=$(fsmounted $PWD) for i in $LIST; do umount $i 2>/dev/null; done # Warning for fs still mounted LIST=$(fsmounted $PWD) if [[ -z $LIST ]]; then # Finally umount /proc and /sys for i in proc sys; do umount $i 2>/dev/null; done else echo 1>&2 "WARNING: the following list of filesystems are still mounted in $ROOT" cat /proc/mounts | \grep "$ROOT/" 1>&2 fi popd 1>&2 return $RETURN_CODE } # Simply an shorthand to `sudo_fcall careful_chroot': function sudo_careful_chroot { sudo_fcall careful_chroot "$@" } # Copy with tar the content of directory into another (existing or not). # Usage: copy_content_into_directory ORIGDIR [DESTDIR] # By default DESTDIR=. function copy_content_into_directory { [[ $# -ge 1 && -e "$1" ]] || return 2 local ORIG="$1"; local ORIGDIR ORIGNAME if [[ -d $ORIG ]]; then ORIGDIR="$ORIG"; ORIGNAME=./ else ORIGDIR=$(dirname "$ORIG"); ORIGNAME=$(basename "$ORIG"); fi local DESTDIR="${2:-$PWD}"; [[ -d $DESTDIR ]] || mkdir -p $DESTDIR if [[ $(realpath $ORIGDIR) = $(realpath $DESTDIR) ]]; then echo "Sorry, same origin and destination directory ($(realpath $DESTDIR))"; return 1 fi local R # In any case, don't stop the execution in case of error: if tar -C "$ORIGDIR" -cf - -- "$ORIGNAME" | tar -C "$DESTDIR" -xf -; then R=0; else R=$?; fi return $R } function binary_list { local i DIRS BINARY_LIST DIRS=$(for i in ${PATH//:/ }; do [[ -d $i ]] && echo $i; done) find $DIRS -perm -u=x ! -type d ! -name "*[.]so*" -exec basename {} \; | sort | tr '\n' ' ' } function chroot_fcall { local ROOT="$1" shift local CMD="$@" # `bash -c' needs a single arguments: chroot "$ROOT" bash -c "$CMD" } # Example: sudo_chroot_fcall $ROOT binary_list function sudo_chroot_fcall { sudo_fcall chroot_fcall "$@" } function sudo_chroot_binary_list { local ROOT="$1" sudo_chroot_fcall "$ROOT" binary_list } # Automatically export previously defined functions: export -f $(awk '/^function/ {print $2}' ${BASH_SOURCE[0]}) marionnet-0.90.6+bzr434.orig/uml/pupisto.common/toolkit_debugging.sh0000600000175000017500000001132012167200764024402 0ustar lucaslucas#!/bin/bash # (file to be sourced) # This file is part of marionnet # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # When tracing, print the line number and current stack of function calls: PS4='+ [#${LINENO}$(A=${FUNCNAME[@]}; A=${A% main}; A=${A// /\|}; [[ -n $A ]] && echo " ${A}")] ' # ============================================================= # REMEMBER TRACING ACTIONS # (set [-+]x) # ============================================================= function set_tracing { # global BASH_XTRACING export BASH_XTRACING=y set -x } function unset_tracing { # global BASH_XTRACING set +x unset BASH_XTRACING } function pause_tracing { # global BASH_XTRACING BASH_XTRACING_PAUSE if [[ $BASH_XTRACING = y ]]; then export BASH_XTRACING_PAUSE=y unset_tracing fi } function continue_tracing { # global BASH_XTRACING BASH_XTRACING_PAUSE if [[ $BASH_XTRACING_PAUSE = y ]]; then unset BASH_XTRACING_PAUSE set_tracing fi } # ============================================================= # BREAK POINTS # ============================================================= function set_debugging { # global DEBUGGING_MODE DEBUGGING_MODE=y } function unset_debugging { # global DEBUGGING_MODE unset DEBUGGING_MODE } # Set a break point for debugging. When a break point is reached # in "debugging" mode, a bash shell is launched in order to allow # to inspect current variables or file contents. # # Usage: # source toolkit_debugging.sh # set_debugging # ... # ___break_point___ # ... # ___break_point___ # ... function ___break_point___ { # global BASH_XTRACING DEBUGGING_MODE BREAK_POINT_NO local restore_tracing if [[ -n $BASH_XTRACING ]]; then unset_tracing restore_tracing=y fi let BREAK_POINT_NO=BREAK_POINT_NO+1 # Ignore if we are not in debugging mode: [[ $DEBUGGING_MODE = "y" ]] || return 0 local f fl v # Export all defined UPPERCASE variables: v=$(\grep -o '[A-Z][A-Z_0-9]*=' $0 | awk -F= '{print $1}' | uniq | sort | uniq | tr '\n' ' ') export $v # Export all defined functions (defined with the syntax "function foo {..}"): for f in $(awk '/^[ ]*function/ {print $2}' $0); do { type &>/dev/null $f && export -f $f && fl+="$f\n"; } || true done echo "--- Break point" echo "--- Variables:" echo "${v// / }" | fmt -w 80 echo "--- Functions:" echo "$(echo -e $fl | sort | tr '\n' ' ')" | fmt -w 80 echo "---" echo "--- Bash subshell launched for debugging: (exit with CTRL-D)" echo "---" PS1='--- [BREAK-POINT-'$BREAK_POINT_NO'][$? \W]\\$ ' bash --noprofile --norc 0<$(tty) 1>$(tty) 2>$(tty) if [[ -n $restore_tracing ]]; then set_tracing fi } function set_once_actions_file { # global ONCE_ACTIONS_FILE ONCE_ACTIONS_FILE="$1" echo 1>&2 "Once actions file set to \`$ONCE_ACTIONS_FILE'" } function make_temporary_once_actions_file { # global ONCE_ACTIONS_FILE set_once_actions_file "$(mktemp /tmp/$(basename $0).once_actions_file.XXXXXX)" } # Usage: once [-r/--register-anyway] # Register successfully executed commands in order to prevent to repeat their execution. function once { local REGISTER_ANYWAY if [[ $1 = "--register-anyway" || $1 = "-r" ]]; then REGISTER_ANYWAY=y shift fi # global ONCE_ACTIONS_FILE [[ -n "$ONCE_ACTIONS_FILE" ]] || make_temporary_once_actions_file >>"$ONCE_ACTIONS_FILE" # We define variable with unusual names in order to prevent us to # hide some environment variable with these names. local ___CODE___=0 local ___POINT___ ___POINT___=$(echo "${FUNCNAME[@]} ### ${BASH_SOURCE[@]} ### ""$@") if grep -q "^${___POINT___}$" "$ONCE_ACTIONS_FILE"; then echo "Already done, skipping." else "$@" || ___CODE___=$? if [[ -n $REGISTER_ANYWAY || ${___CODE___} -eq 0 ]]; then echo "${___POINT___}" >> $ONCE_ACTIONS_FILE fi fi return ${___CODE___} } function exiting_because_error { echo -e "Exiting because of an unexpected error in line $BASH_LINENO" exit 3 } # Trap errors: trap exiting_because_error ERR # Automatically export previously defined functions: export -f $(awk '/^function/ {print $2}' ${BASH_SOURCE[0]}) marionnet-0.90.6+bzr434.orig/uml/pupisto.common/toolkit_image.sh0000600000175000017500000000654112167200764023542 0ustar lucaslucas#!/bin/bash # (file to be sourced) # This file is part of marionnet # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ============================================================= # GENERATING FILES # {machine,router}-*.conf # ============================================================= function rename_with_sum_and_make_image_dot_conf { # global FS_NAME (output) local $FS_LOC="$1" # Checking parameters and calling context: [[ -f "$FS_LOC" ]] || return 2 # This image-dependent function must be provided independently: type -p set_X11_SUPPORT_and_related_variables_according_to_choosed_packages || return 3 # The following global variables must be set: [[ -n $KERNEL_VERSION && -n $BINARY_LIST ]] || return 4 # The following template must be available: [[ -f ../../share/filesystems/machine-template.conf ]] || return 5 # --- # MD5SUM and other simple fields local MD5SUM=$(md5sum "$FS_LOC" | awk '{print $1}') local SUM=$(sum "$FS_LOC" | awk '{print $1}') local MTIME=$(stat -c "%Y" "$FS_LOC") local DATE=$(date +%Y-%m-%d) local AUTHOR=$(awk ghost or not # X11_SUPPORT and memory-related variables set_X11_SUPPORT_and_related_variables_according_to_choosed_packages [[ -n $X11_SUPPORT && -n $MEMORY_MIN_SIZE && -n $MEMORY_SUGGESTED_SIZE ]] || return 6 # FILLING TEMPLATE cp ../../share/filesystems/machine-template.conf $FS_LOC.conf # Using `sed' for simple replacements: sed -e "s/^MD5SUM=.*/MD5SUM=$MD5SUM/" \ -e "s/^SUM=.*/SUM=$SUM/" \ -e "s/^MTIME=.*/MTIME=$MTIME/" \ -e "s/^DATE=.*/DATE=$DATE/" \ -e "s/^AUTHOR=.*/AUTHOR=\"$AUTHOR\"/" \ -e "s/^X11_SUPPORT=.*/X11_SUPPORT=\"$X11_SUPPORT\"/" \ -e "s/^MEMORY_MIN_SIZE=.*/MEMORY_MIN_SIZE=$MEMORY_MIN_SIZE/" \ -e "s/^MEMORY_SUGGESTED_SIZE=.*/MEMORY_SUGGESTED_SIZE=$MEMORY_SUGGESTED_SIZE/" \ -i ${FS_LOC}.conf # Using `user_config_set' for replacements involving variables # bound to values with special characters (as '/') and/or multiple lines. user_config_set "BINARY_LIST" "=" "'$BINARY_LIST'" ${FS_LOC}.conf user_config_set "SUPPORTED_KERNELS" "=" "'$SUPPORTED_KERNELS'" ${FS_LOC}.conf || true # Rename the built filesystem and its .conf file simply adding the suffix $SUM: mv $FS_LOC ${FS_LOC}-${SUM} mv $FS_LOC.conf ${FS_LOC}-${SUM}.conf export FS_NAME=${FS_LOC}-${SUM} return 0 } # rename_with_sum_and_make_image_dot_conf # Automatically export previously defined functions: export -f $(awk '/^function/ {print $2}' ${BASH_SOURCE[0]}) marionnet-0.90.6+bzr434.orig/uml/pupisto.common/toolkit_config_files.sh0000600000175000017500000003135112167200764025104 0ustar lucaslucas#!/bin/bash # (file to be sourced) # This file is part of marionnet # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ============================================================= # TABULAR FILES UPDATES # ============================================================= # Example: # tabular_file_update -i -d ":" -k 1 --key-value "root" -f 7 --field-value "/bin/bash" --field-old-value "/bin/sh" etc/passwd # Returns with following codes: # 0 => successfully finished and file updated # 1 => successfully finished but file unchanged (neutralized by option --ignore-unchanged) # 2 => failed somewhere function tabular_file_update { local SEP KEY KEY_VALUE FIELD_NO FIELD_NEW_VALUE FIELD_OLD_VALUE FIELD_OLD_REGEXP local EDIT_IN_PLACE BACKUP IGNORE_BLANKS IGNORE_UNCHANGED local RETURN_CODE local BOOLEAN_AND=1 # Defaults KEY=1 FIELD_OLD_REGEXP="" # Parsing actuals: while [[ -${1#-} = $1 ]]; do case "$1" in -d|-F|--field-separator) SEP="$2"; shift 2 ;; -k|--key-no) KEY="$2"; shift 2 ;; -kv|--key-value) KEY_VALUE="$2"; shift 2 ;; -f|--field-no) FIELD_NO="$2"; shift 2 ;; -fv|--field-value) FIELD_NEW_VALUE="$2"; shift 2 ;; -fov|--field-old-value) FIELD_OLD_VALUE="$2"; shift 2 ;; -for|--field-old-regexp) FIELD_OLD_REGEXP="$2"; shift 2 ;; --ignore-blanks) IGNORE_BLANKS=y; shift ;; --ignore-unchanged) IGNORE_UNCHANGED=y; shift ;; -i|--in-place) EDIT_IN_PLACE=y; shift ;; -b|--backup) BACKUP=y; shift ;; *) echo "Unknown option: $1"; return 2 ;; esac done local FS OFS if [[ -z "$SEP" ]]; then # Awk defaults: FS="[ \t][ \t]*" OFS=" " elif [[ -z "$IGNORE_BLANKS" ]]; then FS="$SEP" OFS="$SEP" else FS="[ \t]*${SEP}[ \t]*" OFS="$SEP" fi [[ -n "$KEY_VALUE" ]] || { echo "Wrong arguments: --key-value must be specified" ; return 2; } FIELD_NO=${FIELD_NO:-$KEY} if [[ -z "$FIELD_OLD_VALUE" && "$KEY" = "$FIELD_NO" ]]; then FIELD_OLD_VALUE=$KEY_VALUE fi local TMPFILE=$(mktemp) for FILE in "$@"; do if [[ -n "$FIELD_OLD_VALUE" ]]; then awk <"$FILE" >"$TMPFILE" \ -F "$FS" -v OFS="$OFS" \ -v KEY="$KEY" \ -v KEY_VALUE="$KEY_VALUE" \ -v FIELD_NO=$FIELD_NO \ -v FIELD_NEW_VALUE="$FIELD_NEW_VALUE" \ -v FIELD_OLD_VALUE="$FIELD_OLD_VALUE" \ -v FIELD_OLD_REGEXP="$FIELD_OLD_REGEXP" \ '($KEY == KEY_VALUE) && ($FIELD_NO == FIELD_OLD_VALUE) && ($FIELD_NO ~ FIELD_OLD_REGEXP) { for (i=1; i$TMPFILE \ -F "$FS" -v OFS="$OFS" \ -v KEY="$KEY" \ -v KEY_VALUE="$KEY_VALUE" \ -v FIELD_NO=$FIELD_NO \ -v FIELD_NEW_VALUE="$FIELD_NEW_VALUE" \ -v FIELD_OLD_REGEXP="$FIELD_OLD_REGEXP" \ '($KEY == KEY_VALUE) && ($FIELD_NO ~ FIELD_OLD_REGEXP) { for (i=1; i/dev/null -q "$FILE" $TMPFILE; then RETURN_CODE=1 # no update! else RETURN_CODE=0 # update occurred (or ignore the question if --ignore-unchanged is set) fi let BOOLEAN_AND="BOOLEAN_AND*RETURN_CODE" || true # An update occurred: if [[ $EDIT_IN_PLACE = "y" && $RETURN_CODE = 0 ]]; then if [[ $BACKUP = "y" ]]; then cp -v "$FILE" "$FILE.backup" --backup="numbered" 1>&2 fi # Now rewrite FILE: cat "$TMPFILE" > "$FILE" elif [[ $EDIT_IN_PLACE = "y" && $RETURN_CODE = 1 ]]; then : else cat "$TMPFILE" fi || return 2 done rm $TMPFILE # Return 0 if at least one update occurred: return $BOOLEAN_AND } # Build the `grep' regexp that exactly matches the given string: function quoting_for_grep { sed <<<"$1" \ -e 's/\[/\\\[/g' \ -e 's/\]/\\\]/g' \ -e 's/\./\\\./g' \ -e 's/[*]/\\*/g' \ -e 's/[|]/\\|/g' \ -e 's/^\^/\\\^/g' \ -e 's/\$$/\\\$/g' } # Example: # test_quoting_for_grep '^[2.6.18-(ghost)] | con=none^ ssl=$xterm console=ttyS0$' # returns with 0 function test_quoting_for_grep { \grep "$(quoting_for_grep "$1")" <<<"$1" # must return 0 everytime! } # ============================================================= # USER-COMPLIANT CONFIGURATION FILES # ============================================================= # Set a configuration binding (,) updating a line if possible, # or removing (and updating) a commented line if it exists or, as last # attempt, appending a row in the form "" in the specified # file(s). # # Usage: user_config_set [].. # # Examples: # user_config_set "PermitRootLogin" " " "yes" /etc/sshd_config # # Returns with following codes: # 0 => successfully finished and file updated (or --ignore-unchanged is set) # 1 => successfully finished but file unchanged (and --ignore-unchanged is not set) # 2 => failed somewhere function user_config_set { local KEY_VALUE="$1" local DELIMITER="$2" # '=', ':', .. local FIELD_VALUE="$3" local RETURN_CODE_WHEN_UNCHANGED=1 # by default local IGNORE_UNCHANGED # --- if [[ $1 = "--ignore-unchanged" ]]; then RETURN_CODE_WHEN_UNCHANGED=0 IGNORE_UNCHANGED="$1" shift fi # --- # Check actuals: [[ $# -ge 3 && -n $KEY_VALUE && -n $DELIMITER ]] || { echo "Usage: user_config_set [].." return 2 } # --- local INFILE OUTFILE local WORKINGFILE=$(mktemp) shift 3 if [[ $# -eq 1 ]]; then INFILE="$1" OUTFILE="$1" { [[ -f "$INFILE" ]] && [[ -r "$INFILE" ]] && [[ -w "$INFILE" ]]; } || { echo "File $INFILE doesn't exist or doesn't have read-write permissions." echo "Usage: user_config_set [].." return 2 } elif [[ $# -eq 0 ]]; then INFILE=/dev/stdin OUTFILE=/dev/stdout else local BOOLEAN_AND=1 for INFILE in "$@"; do if user_config_set $IGNORE_UNCHANGED "$KEY_VALUE" "$DELIMITER" "$FIELD_VALUE" "$INFILE"; then BOOLEAN_AND=0; else true fi done return $BOOLEAN_AND fi cat "$INFILE" > $WORKINGFILE local FS="[ \t]*[$DELIMITER][ \t]*" local OFS="$DELIMITER" # Try to find the required binding: if \grep -q "^[ \t]*${KEY_VALUE}${FS}$(quoting_for_grep "${FIELD_VALUE}")[ \t]*$" $WORKINGFILE; then # Fine! no update required: rm $WORKINGFILE return $RETURN_CODE_WHEN_UNCHANGED fi # Unset keys at the same place if the delimiter appears twice: sed -i -e "s/^[ \t]*${KEY_VALUE}${FS}.*${FS}.*/${KEY_VALUE}${OFS}/" $WORKINGFILE # Try to update the file with `tabular_file_update': if tabular_file_update -d "$DELIMITER" --ignore-blanks -i -k 1 --key-value "$KEY_VALUE" -f 2 --field-value "$FIELD_VALUE" "$WORKINGFILE"; then cat $WORKINGFILE > $OUTFILE rm $WORKINGFILE return 0 elif \grep -q "^[ \t]*${KEY_VALUE}${FS}$(quoting_for_grep "${FIELD_VALUE}")[ \t]*" $WORKINGFILE; then # Fine! no update performed: return $RETURN_CODE_WHEN_UNCHANGED else # No update occurred but it's needed, so: local TMPFILE=$(mktemp) # Remove comment any line "# ": sed -e "s/^[#][#]*[ \t]*${KEY_VALUE}${FS}/${KEY_VALUE}${OFS}/" $WORKINGFILE > $TMPFILE if diff 1>/dev/null -q $TMPFILE "$WORKINGFILE"; then # There wasn't a commented line, so we append a new line: echo "${KEY_VALUE}${OFS}${FIELD_VALUE}" >> $WORKINGFILE else local CODE=0 # There was a commented line, so we have just to update (if required) this line: tabular_file_update $IGNORE_UNCHANGED -d "$DELIMITER" --ignore-blanks -k 1 --key-value "$KEY_VALUE" -f 2 --field-value "$FIELD_VALUE" "$TMPFILE" > $WORKINGFILE || CODE=$? if [[ $CODE = 2 ]]; then return 2; fi fi cat $WORKINGFILE > $OUTFILE rm $TMPFILE $WORKINGFILE return 0 fi } # ============================================================= # CONFIGURATION FILES # (not necessarily user-compliant) # # Lines are supposed structured as: # where is by default the regexp [ \t]*[=][ \t]* # ============================================================= # Note that these files are considered not necessarily user-compliant # in the sense that the update of a binding (key,value) it's not written # at the line citing `key' in a comment or in a previous binding. # Any previous binding with the same key is removed and the new binding is # (re-)appended. # For a more user-friendly update, call the function `user_config_set' defined # below. # Example of session: # --- # source toolkit_config_files.sh # set_default_config_field_separator "=" # not really needed, the default would be suitable # set_default_config_file "linux-3.2.44/.config" # cp linux-3.2.44/.config{,.0} # get_config_variable CONFIG_UML # n # set_config_variable CONFIG_UML y # get_config_variable CONFIG_UML # y # set_config_variable CONFIG_UML '"YES"' # get_config_variable CONFIG_UML # "YES" # get_config_variable_unquoting CONFIG_UML # YES # get_config_variable CONFIG_UML linux-3.2.44/.config.0 # n # --- # Global default used by configuration variable setter/getter: function set_default_config_file { # global DEFAULT_CONFIG_FILE DEFAULT_CONFIG_FILE="$1" } # Set these defaults source-ing: DEFAULT_CONFIG_FILE_FS="[ \t]*[=][ \t]*" DEFAULT_CONFIG_FILE_OFS="=" # Examples: # set_default_config_field_separator ":" # set_default_config_field_separator "=" # set_default_config_field_separator "=" "=" # set_default_config_field_separator "[ \t]*[=][ \t]*" "=" # it's the default! # set_default_config_field_separator "[ \t]*[:][ \t]*" "=" function set_default_config_field_separator { # global DEFAULT_CONFIG_FILE_{FS,OFS} if [[ $# = 2 ]]; then DEFAULT_CONFIG_FILE_FS="$1" DEFAULT_CONFIG_FILE_OFS="$2" elif [[ $# = 1 && $(echo -n "$1" | wc -c) = 1 ]]; then DEFAULT_CONFIG_FILE_FS="$1" DEFAULT_CONFIG_FILE_OFS="$1" else echo "Usage: set_default_config_field_separator []" return 2 fi } # Set removing potential similar binding, then appending the # provided binding. # Note that the target ($3) is by default the file defined # by the global variable DEFAULT_CONFIG_FILE function set_config_variable { # global DEFAULT_CONFIG_FILE{,_FS,_OFS} local NAME=$1 local VALUE="$2" local CONFIG_FILE=${3:-$DEFAULT_CONFIG_FILE} # --- local LOCAL_DEFAULT_FS="[ \t]*[=][ \t]*" local FS="${DEFAULT_CONFIG_FILE_FS:-$LOCAL_DEFAULT_FS}" local OFS=${DEFAULT_CONFIG_FILE_OFS:-=} sed -i -e "s/^${NAME}${FS}.*$//" $CONFIG_FILE echo "${NAME}${OFS}${VALUE}" >> $CONFIG_FILE } # Note that the target ($2) is by default the file defined # by the global variable DEFAULT_CONFIG_FILE function unset_config_variable { # global DEFAULT_CONFIG_FILE{,_FS} local NAME=$1 local CONFIG_FILE=${2:-$DEFAULT_CONFIG_FILE} # --- local LOCAL_DEFAULT_FS="[ \t]*[=][ \t]*" local FS="${DEFAULT_CONFIG_FILE_FS:-$LOCAL_DEFAULT_FS}" local TMPFILE=$(mktemp) \grep -v "^${NAME}${FS}" $CONFIG_FILE >$TMPFILE cat $TMPFILE >$CONFIG_FILE rm -f $TMPFILE } function get_config_variable { # global DEFAULT_CONFIG_FILE{,_FS} local NAME=$1 local CONFIG_FILE=${2:-$DEFAULT_CONFIG_FILE} # --- local LOCAL_DEFAULT_FS="[ \t]*[=][ \t]*" local FS="${DEFAULT_CONFIG_FILE_FS:-$LOCAL_DEFAULT_FS}" awk <$CONFIG_FILE -v NAME=$NAME -F "$FS" '$1 == NAME {print $2}' } function get_config_variable_unquoting { # global DEFAULT_CONFIG_FILE{,_FS} get_config_variable "$@" | sed -e 's/^"\(.*\)"$/\1/' -e "s/^'\(.*\)'$/\1/" } # Sort and merge configuration files removing comments and empty lines. # We are supposing that the order of line is not important. # TODO: it would be nice to implement `sort_and_merge_user_config_files' function sort_and_merge_config_files { cat "$@" | awk 'NF>0 && $1 !~ /^#/' | sort | uniq } # Automatically export previously defined functions: export -f $(awk '/^function/ {print $2}' ${BASH_SOURCE[0]}) marionnet-0.90.6+bzr434.orig/uml/ethghost/0000700000175000017500000000000012167200764017202 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/ethghost/Makefile0000600000175000017500000000342112167200764020644 0ustar lucaslucas# This file is a part of the tool ethghost to the # Marionnet project # Copyright (C) 2011 Luca Saiu # Licence GPLv2+ : GNU GPL version 2 or later; # This program is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 2 of # the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Shall we use Autotools here? The thing is really small, and # probably inherently non-portable: it only makes sense on GNU/Linux # with our kernel patch... So I don't think using the Autotools is # worth the hassle here. For the time being I've written this trivial # Makefile. -- Luca Saiu, October 2011 CC = gcc CFLAGS = -g -O2 all: ethghost ethghost: ethghost.o ethghost-interface.o $(CC) $(CFLAGS) -o $@ $^ ethghost.o: ethghost.c ethghost-interface.h $(CC) $(CFLAGS) -c -o $@ $< ethghost-interface.o: ethghost-interface.c ethghost-interface.h $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f *.o ethghost *~ # DESTDIR may be set by the caller, for instance: # make DESTDIR=/usr/local install # (suitable for buildroot) install: cp ethghost $(DESTDIR)/bin/ethghost # Used by `pupisto' to know the package version to include in the buildroot's image print_version: @awk * * Copyright (C) 2009 Jonathan Roudiere * Licence GPLv2+ : GNU GPL version 2 or later; * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * This is the revision of 2009-07-07. * Minor changes by Jean-Vincent Loddo 2013/04/12 (ghost2 -> ethghost) */ /* * Interface for ghostification */ #ifndef _ETHGHOST_INTERFACE_H_ #define _ETHGHOST_INTERFACE_H_ /* Macro debug */ #ifdef GHOST_DEBUG #define dinfo printf("DEBUG: file(%s): line(%03d): funct(%s): -- info debug -- \n",basename(__FILE__),__LINE__,__FUNCTION__) #define dprintf(msg,args...) printf("DEBUG: file(%s): line(%03d): funct(%s): " msg "\n",basename(__FILE__),__LINE__,__FUNCTION__,##args) #else #define dinfo #define dprintf(msg,args...) #endif /* some variable */ #define __ETHGHOST_VERSION__ "2.0" /* version of this soft */ /* see include/linux/sockio.h in the Linux Kernel sources */ #define SIOKLOG 0x894D /* Write a string to the log */ #define SIOCGIFGHOSTIFY 0x894E /* Make a network device 'ghost' */ #define SIOCGIFUNGHOSTIFY 0x894F /* Make a network device 'unghost' */ /* * Internals variables (put here to EBUG in main()) */ enum { ESOCKCREATE, #define ESOCKCREATE ESOCKCREATE ESOCKDELETE, #define ESOCKDELETE ESOCKDELETE EGHOSTIFY, #define EGHOSTIFY EGHOSTIFY EUNGHOSTIFY, #define EUNGHOSTIFY EUNGHOSTIFY EBUG #define EBUG EBUG }; /* * Fonction to ghostify an interface. * iface : name of the network interface * that you want to ghostify */ unsigned int ghostify_iface (const char *iface); /* * Fonction to unghostify an interface. * iface : name of the network interface * that you want to unghostify */ unsigned int unghostify_iface (const char *iface); #endif /* _ETHGHOST_INTERFACE_H */ marionnet-0.90.6+bzr434.orig/uml/ethghost/ethghost-interface.c0000600000175000017500000002232512167200764023137 0ustar lucaslucas/* * This file is a part of the tool ethghost to the * Marionnet project * * Copyright (C) 2009 Jonathan Roudiere * Licence GPLv2+ : GNU GPL version 2 or later; * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * This is the revision of 2009-07-07. * Minor changes by Jean-Vincent Loddo 2013/04/12 (ghost2 -> ethghost) */ #include #include #include #include #include #include #include #include #include #include #include "ethghost-interface.h" /* * functions used internally by __{create,destroy}_socket and * __{un,}ghostify to display and explained errors. * origcode - variable use by the caller to identify itself * nerror - errno provide by the caller * return - nerror */ static int on_error (int origcode, int nerror) { switch (origcode) { /* * If we can not create socket then we send a generic message * with the original system error message between parentheses. */ case (ESOCKCREATE) : dinfo; fprintf(stderr, "ethghost: Error: couldn't create socket (%s)\n",strerror(nerror)); break; /* * If we can not destroy socket then we send a generic message * with the original system error message between parentheses. */ case (ESOCKDELETE) : dinfo; fprintf(stderr, "ethghost: Error: couldn't destroy socket (%s)\n",strerror(nerror)); break; /* * If errors occur during the ghostification or the unghostification * operation, we be able to provide (in general) a more explicit message * than the system (which don't know ghost operations). */ case (EGHOSTIFY) : dinfo; switch (nerror) { /* * This error code is send by the ghostification kernel code if * the lenght of the iface that we try to ghositify is null or * greater than IFNAMSIZ(16) and like this tools already take care * this case then kernel don't support ghost ops. */ case (EINVAL) : fprintf(stderr, "ethghost: Error: couldn't ghostify interface; are you sure that your kernel supports Ghostification?\n"); break; /* * This error code is send by the ghostification kernel code * if the specified interface exist and is already ghositifed. */ case (EEXIST) : fprintf(stderr, "ethghost: Error: the specified interface is already ghostified.\n"); break; /* * This error code is send by the ghostification kernel code * if the specified interface (really) doesn't exist. */ case (ENODEV) : fprintf(stderr, "ethghost: Error: the specified interface doesn't exist (ghostify).\n"); break; /* * This error code is send by the ghostification kernel code if the * specified interface exist but it cann't be ghositfied because the * maximum number of interface ghostified has already been reached. */ case (ENOMEM) : fprintf(stderr, "ethghost: Error: the maximum number of ghostified interfaces has been reached.\n"); break; /* * A unknown error took place (not return but the ghostification * kernel code) so we return a generic message with the original * system error message between parentheses. */ default : fprintf(stderr, "ethghost: Error: an error occurred during ghostification (%s).\n",strerror(nerror)); } break; case (EUNGHOSTIFY) : dinfo; switch (nerror) { /* * This error code is send by the ghostification kernel code * if the interface specified (really) doesn't exist and so * it cann't be ghostified. */ case (ENODEV) : fprintf(stderr, "ethghost: Error: the specified interface doesn't exist (unghostify).\n"); break; /* * This error occurs when the specified interface is not * ghostified (but it exists) */ case (ESRCH) : fprintf(stderr, "ethghost: Error: the specified interface isn't ghostified.\n"); break; /* * This error code cann't be sent by the ghostification kernel * code and arguments of the ioctl request should therefore be * valid then certainly it is the kernel which does not support * ghostification operations. */ case (EINVAL) : fprintf(stderr, "ethghost: Error: couldn't unghostify interface; are you sure that your kernel supports Ghostification?\n"); break; /* * A unknown error took place (not return but the ghostification * kernel code) so we return a generic message with the original * system error message between parentheses. */ default : fprintf(stderr, "ethghost: Error: an error occurred during unghostification (%s).\n",strerror(nerror)); } break; default : dinfo; fprintf(stderr, "ethghost: Error: an unexpected error took place (EBUG).\n"); return (EBUG); } return (nerror); } /* * Create socket to {ghostify,unghostify}_iface, this socket will be * used as file descriptor (*sk) to the ioctl request, this function * returns EXIT_SUCCESS on success, errno on error. */ static unsigned int __create_socket (int *sk) { errno = 0; dinfo; if ((*sk = socket(AF_INET,SOCK_DGRAM,0)) < 0) { return (on_error(ESOCKCREATE, errno)); } return (EXIT_SUCCESS); } /* * Destroy socket (*sk) which has been created by the function * __create_socket, this function returns EXIT_SUCCESS on success, * errno on error. */ static unsigned int __destroy_socket (int *sk) { errno = 0; dinfo; if ((close((int)*sk) < 0)) { return (on_error(ESOCKDELETE, errno)); } return (EXIT_SUCCESS); } /* * Function used to Ghostify an interface (iface) by using ioctl * request, return EXIT_SUCCESS on success and errno on error. */ static unsigned int __ghostify (int *sk, const char *iface) { errno = 0; dinfo; if ((ioctl(*sk, SIOCGIFGHOSTIFY, iface)) < 0 ) { return (on_error(EGHOSTIFY, errno)); } return (EXIT_SUCCESS); } /* * Function used to UnGhostify an interface (iface) by using ioctl * request, return EXIT_SUCCESS on success and errno on error. */ static unsigned int __unghostify (int *sk, const char *iface) { errno = 0; dinfo; if ((ioctl(*sk, SIOCGIFUNGHOSTIFY, iface)) < 0 ) { return (on_error(EUNGHOSTIFY, errno)); } return (EXIT_SUCCESS); } /* * Function ghostify_iface, used to ghotify an interface, call internally * __create_socket to get a file descriptor, call __ghostify to make an * ioctl request and ghostify iface (if kenrel support Ghostification) * and finally call __destroy_socket. Return errno provide by a funtion * call internally on error or EXIT_SUCCESS on success. */ unsigned int ghostify_iface (const char *iface) { int sk = 0; int error = 0; int errorp = 0; /* debug */ dinfo; /* 1) create socket */ if ((error = __create_socket(&sk)) != 0 ) { fprintf(stderr, "ethghost: Error: in %s , Exit!!\n",__FUNCTION__); return error; } /* debug */ dprintf("Socket created with success, goto __ghostify"); /* 2) ghostify iface */ if ((error =__ghostify(&sk, iface)) != 0) { fprintf(stderr, "ethghost: Error: in %s : interface %s, Exit!!\n",__FUNCTION__,iface); /* to preserve original error (if possible) */ errorp = __destroy_socket(&sk); return errorp ? errorp : error; } /* 3) destroy socket*/ if ((error = __destroy_socket(&sk)) != 0 ) { fprintf(stderr, "ethghost: Error: in %s , Exit!!\n",__FUNCTION__); } /* debug */ dprintf("Socket deleted with success, goto main"); /* return error to main for user (0 on succes) */ return (error); } /* * Function unghostify_iface, used to unghotify an interface, call internally * __create_socket to get a file descriptor, call __unghostify to make an * ioctl request and unghostify iface (if kenrel support Ghostification) * and finally call __destroy_socket. Return errno provide by a funtion * call internally on error or EXIT_SUCCESS on success. */ unsigned int unghostify_iface (const char *iface) { int sk = 0; int error = 0; int errorp = 0; /* debug */ dinfo; /* 1) create socket */ if ((error = __create_socket(&sk)) != 0 ) { fprintf(stderr, "ethghost: Error: in %s , Exit!!\n",__FUNCTION__); return error; } /* debug */ dprintf("Socket created with success, goto __unghostify"); /* 2) unghostify iface */ if ((error =__unghostify(&sk, iface)) != 0) { fprintf(stderr, "ethghost: Error: in %s about the interface %s. Exit!!\n",__FUNCTION__,iface); /* to preserve original error (if possible) */ errorp = __destroy_socket(&sk); return errorp ? errorp : error; } /* 3) destroy socket*/ if ((error = __destroy_socket(&sk)) != 0 ) { fprintf(stderr, "ethghost: Error: in %s. Exit!!\n",__FUNCTION__); } /* debug */ dprintf("Socket deleted with success, goto main"); /* return error to main for user (0 on succes) */ return (error); } marionnet-0.90.6+bzr434.orig/uml/ethghost/ethghost.c0000600000175000017500000001152612167200764021202 0ustar lucaslucas/* * This file is a part of the tool ethghost to the * Marionnet project * * Copyright (C) 2009 Jonathan Roudiere * Licence GPLv2+ : GNU GPL version 2 or later; * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * This is the revision of 2009-07-07. */ #include #include #include #include /* need to IFNAMSIZ */ #include /* Ghostification interface */ #include "ethghost-interface.h" static int usage(void) { fprintf(stderr, "ethghost (%s) usage :\n\n", __ETHGHOST_VERSION__); fprintf(stderr, "ethghost -h, --help this help message\n"); fprintf(stderr, " -v, --version get the version\n"); fprintf(stderr, " -g, --ghostify DEVICE ghostify this interface\n"); fprintf(stderr, " -u, --unghostify DEVICE unghostify this interface\n\n"); fprintf(stderr, "DEVICE : is the name of a network interface (like : eth0, lo)\n"); return (EXIT_SUCCESS); } static int version(void) { printf("\nethghost " __ETHGHOST_VERSION__ " \n"); printf("Copyright (C) 2009 Jonathan Roudiere\n"); printf("Copyright (C) 2009, 2013 Université Paris 13\n"); printf("License GPLv2: GNU GPL version 2 or later \n"); printf("\nThis is free software: you are free to change and redistribute it.\n"); printf("There is NO WARRANTY, to the extent permitted by law.\n\n"); return (EXIT_SUCCESS); } int main (int argc, char *argv[]) { int error = 0; char *prog; unsigned int (*act)(const char *iface); /* Get the binary name */ prog = basename(argv[0]); /* debug */ dprintf("Start of %s ",argv[0]); /* Verify number of args, if need show version/help */ if (argc == 1) { dinfo; fprintf(stderr, "%s: Error, no args. Exit!!\n\n",prog); usage(); return (EXIT_FAILURE); } else { dinfo; /* the one and only case where we accept one option */ if (argc == 2) { /* Look if version is asked */ dprintf("argc = %i and argv[%i] = %s, look if (-v,--version) has been provided.", argc, argc, argv[argc - 1]); if ((!(strcmp(argv[1],"-v"))) || (!(strcmp(argv[1],"--version")))) { version(); return (EXIT_SUCCESS); } else { /* Look if help is asked */ dprintf("argc = %i and argv[%i] = %s, look if (-h,--help) has been provided.", argc, argc, argv[argc - 1]); if ((!(strcmp(argv[1],"-h"))) || (!(strcmp(argv[1],"--help")))) { usage(); return (EXIT_SUCCESS); } else { fprintf(stderr, "%s: Error, unknown option. Exit!!\n\n",prog); usage(); return (EXIT_FAILURE); } } } if (argc != 3) { fprintf(stderr, "%s: Error, bad number of arguments. Exit!!\n\n",prog); usage(); return (EXIT_FAILURE); } } /* Search options used */ /* debug */ dprintf("argc = %i, argv[1] = %s and argv[2] = %s, search options used.", argc, argv[1], argv[2]); /* put in act pointer toward appropriate function */ if ((!(strcmp(argv[1],"-g"))) || (!(strcmp(argv[1],"--ghostify")))) { dprintf("Function call to act : act = &(ghostify_iface);"); act = &(ghostify_iface); } else { if ((!(strcmp(argv[1],"-u"))) || (!(strcmp(argv[1],"--unghostify")))) { dprintf("Function call to act : act = &(unghostify_iface);"); act = &(unghostify_iface); } else { fprintf(stderr, "%s: Error, unknown option. Exit!!\n\n",prog); usage(); return (EXIT_FAILURE); } } /* Verify lenght of the second args */ if (strlen(argv[2]) >= IFNAMSIZ) { fprintf(stderr, "%s: Error, invalid interface name. Exit!!\n",prog); return (EXIT_FAILURE); } /* Act */ if ((error = act(argv[2])) == 0) { dprintf("Act exit without error (%i)", error); if (act == (&ghostify_iface)) { printf("ethghost: SUCCESS, the interface %s has been ghostified!!\n", argv[2]); } else { if (act == (&unghostify_iface)) { printf("ethghost: SUCCESS, the interface %s has been unghostified!!\n", argv[2]); } else { /* debug, never come here */ fprintf(stderr, "\nethghost: Error, an unexpected error (bug?) took place. Exit!!\n"); return (EBUG); } } return (EXIT_SUCCESS); } else { dprintf("Act exit with error (%i)", error); /* explicit exit message have already been done */ return (error); /* report real error code to the user */ } /* Not necessary - BUG */ return (EBUG); } marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/0000700000175000017500000000000012167200764021062 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/Makefile0000600000175000017500000001575012167200764022534 0ustar lucaslucas# This file is part of marionnet # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # File system creation based on Builroot (itself based on Busybox) and # kernel patch (ghostification) and compilation # This script builds from scratch a filesystem with the buildroot utilities. # Be careful because sometimes buildroot needs some extras packages according # to the choosen configuration. # ============================================================= # Building `guignol' # ============================================================= KERNEL_VERSION=3.2.48 guignol: dependencies buildroot ./pupisto.buildroot.sh --kernel $(KERNEL_VERSION) --router --name guignol $(OPTIONS) guignol-no-kernel: dependencies buildroot ./pupisto.buildroot.sh --kernel $(KERNEL_VERSION) --router --no-kernel --name guignol $(OPTIONS) guignol-custom: dependencies buildroot ./pupisto.buildroot.sh --kernel $(KERNEL_VERSION) --router --name guignol --custom $(OPTIONS) guignol-debug: dependencies buildroot ./pupisto.buildroot.sh --debug --kernel $(KERNEL_VERSION) --router --name guignol $(OPTIONS) # Make a minimal filesystem, just with Busybox and Bash (useful for testing), without quagga (no --router) and without kernel: minimal: @{ test -f $(CUSTOM_PACKAGES_NO) && cp -v $(CUSTOM_PACKAGES_NO) $(CUSTOM_PACKAGES_NO).backup --backup="numbered"; } || true @{ test -f $(CUSTOM_PACKAGES_YES) && cp -v $(CUSTOM_PACKAGES_YES) $(CUSTOM_PACKAGES_YES).backup --backup="numbered"; } || true @cat /dev/null > $(CUSTOM_PACKAGES_YES) @find ./_build.buildroot/package -name "Config.in" -exec \grep -o "BR2_PACKAGE_[A-Z0-9_]*" {} \; | uniq | sort | uniq > $(CUSTOM_PACKAGES_NO) ./pupisto.buildroot.sh --kernel $(KERNEL_VERSION) --no-kernel --name minimal $(OPTIONS) # ============================================================= # Dependencies # ============================================================= buildroot: ./_build.buildroot ./_build.buildroot: git clone git://git.buildroot.net/buildroot mv buildroot ./_build.buildroot REQUIRED_PACKAGES=whois texinfo git mercurial gcc-multilib unifdef ccache wget fakeroot patch dependencies: @echo "Required packages: $(REQUIRED_PACKAGES)" @which dpkg 1>/dev/null || { echo "Not a Debian system (oh my god!); please install packages corresponding to: $(REQUIRED_PACKAGES)"; exit 1; } @dpkg 1>/dev/null -l $(REQUIRED_PACKAGES) || \ if which aptitude; then \ sudo aptitude install -q -q -q -y $(REQUIRED_PACKAGES); \ elif which apt-get; then \ sudo apt-get install -q -q -q -y $(REQUIRED_PACKAGES); \ else \ exit 1; \ fi @echo Ok. # ============================================================= # Managing and quickly customizing Buildroot's packages # ============================================================= # List all available Buildroot's packages list-available: buildroot @find ./_build.buildroot/package -name Config.in -exec \grep -o "BR2_PACKAGE_[A-Z0-9_]*" {} \; \ | uniq | sort | uniq # List Buildroot's packages cited by our building script: LIST_CITED="\grep -o "BR2_PACKAGE_[A-Z0-9_][A-Z0-9_]*" ./pupisto.buildroot.sh | sort | uniq" list-cited: buildroot @eval $(LIST_CITED) TMPFILE1=/tmp/Makefile.pupisto.buildroot.1 TMPFILE2=/tmp/Makefile.pupisto.buildroot.2 TMPFILE3=/tmp/Makefile.pupisto.buildroot.3 TMPFILE4=/tmp/Makefile.pupisto.buildroot.4 TMPFILES=$(TMPFILE1) $(TMPFILE2) $(TMPFILE3) $(TMPFILE4) CUSTOM_PACKAGES_NO=./_build.custom_packages_no CUSTOM_PACKAGES_YES=./_build.custom_packages_yes # List Buildroot's packages selected by our building script, plus packages manually # selected with $(CUSTOM_PACKAGES_YES), minus package manually selected with $(CUSTOM_PACKAGES_NO). # Note that if a package is customized both as "yes" and "no", the "yes" is prioritary. # In other words, the list of selected packages is built using the formula: # (cited DIFF no) UNION yes list-selected: buildroot @eval $(LIST_CITED) | \grep -v "^BR2_PACKAGE_QUAGGA" > $(TMPFILE1) @cat /dev/null > $(TMPFILE2); @if test -f $(CUSTOM_PACKAGES_NO); then \grep -v "^#" $(CUSTOM_PACKAGES_NO) | sort | uniq > $(TMPFILE2); fi @\grep <$(TMPFILE1) -v -w -F "$$(cat $(TMPFILE2))" > $(TMPFILE3) @cat /dev/null > $(TMPFILE4); @if test -f $(CUSTOM_PACKAGES_YES); then \grep -v "^#" $(CUSTOM_PACKAGES_YES) | sort | uniq > $(TMPFILE4); fi @cat $(TMPFILE3) $(TMPFILE4) | sort | uniq @rm -f $(TMPFILES) # Quickly customize which packages you don't want in the filesystem: customize-packages-no: ./_build.custom_packages_no $$EDITOR $< # Quickly customize which packages you want in the filesystem: customize-packages-yes: ./_build.custom_packages_yes $$EDITOR $< ./_build.custom_packages_no: buildroot @test -f $@ || { make ./_build.custom_packages.initial && mv ./_build.custom_packages.initial $@; } ./_build.custom_packages_yes: buildroot @test -f $@ || { make ./_build.custom_packages.initial && mv ./_build.custom_packages.initial $@; } ./_build.custom_packages.initial: @find ./_build.buildroot/package -name Config.in -exec \grep -o "BR2_PACKAGE_[A-Z0-9_]*" {} \; | uniq | sort | uniq | awk '{print "#"$$0}' >$@ # ============================================================= # clean & help # ============================================================= clean: rm -rf _build.* help: @echo "Usage: make guignol" @echo " or: make guignol-custom" @echo " or: make minimal" @echo " or: make customize-packages-yes" @echo " or: make customize-packages-no" @echo " or: make dependencies" @echo " or: make clean" @echo " or: make help-pupisto" @echo " or: make help" @echo "Examples:" @echo "[1] make guignol" @echo "[2] make guignol-custom" @echo "[3] make customize-packages-no customize-packages-yes guignol" @echo "[4] make customize-packages-no customize-packages-yes guignol-custom" @echo "[5] make help-pupisto" @echo "---" @echo "The example [2] gives you access to the Buildroot's menu configuration." @echo "The example [3] allows you to quickly customize the package selection removing comments from files \`_build.custom_packages_{yes,no}'." @echo "The example [4] provides you both customization methods." @echo "The example [5] is simply equivalent to \`pupisto.buildroot.sh --help'; you can launch directly this script if you want to create the Buildroot's filesystem with special options (name, config)." help-pupisto: ./pupisto.buildroot.sh --help marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh0000700000175000017500000012136012167200764025131 0ustar lucaslucas#!/bin/bash # This file is part of marionnet # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Antoine Seignard # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # File system creation based on Builroot (itself based on Busybox) and # kernel patch (ghostification) and compilation # This script builds from scratch a filesystem with the buildroot utilities. # Be careful because sometimes buildroot needs some extras packages according # to the choosen configuration. # Authors: # Jean-Vincent Loddo # Antoine Seignard (prototypal version, minor changes, knowhow to add extra # buildroot packages) # ============================================================= # AUTOMATIC LOG-FILE GENERATION # ============================================================= MY_BASENAME=$(basename $0) if [[ $1 = "--help" || $1 = "-h" ]]; then # do nothing and continue : elif grep -q "log_${MY_BASENAME}[.]......$" <<<"$1"; then LOGFILE=$1 shift # and continue else LOGFILE=$(mktemp /tmp/log_${MY_BASENAME}.XXXXXX) EXIT_CODE_FILE=$(mktemp /tmp/exit_code_${MY_BASENAME}.XXXXXX) echo -e "Log file of command:\n$0" "$@" "\n---" | tee $LOGFILE COLUMNS=$(tput cols) { time $0 "$LOGFILE" "$@"; echo $? >$EXIT_CODE_FILE; } 2>&1 | tee -a "$LOGFILE" | cut -c1-$((COLUMNS)) read EXIT_CODE <$EXIT_CODE_FILE rm -f $EXIT_CODE_FILE echo "---" echo "$MY_BASENAME: previous running logged into $LOGFILE" exit $EXIT_CODE fi # Script body: set -e # ============================================================= # CMDLINE PARSING # ============================================================= # Getopt's format used to parse the command line: OPTSTRING="hdf:mqrKk:n:c:" function parse_cmdline { local i j flag # Transform long format options into the short one: for i in "$@"; do if [[ double_dash_found = 1 ]]; then ARGS+=("$i") else case "$i" in --help) ARGS+=("-h"); ;; --custom) ARGS+=("-m"); ;; --config) ARGS+=("-f"); ;; --continue) ARGS+=("-c"); ;; --quagga) ARGS+=("-q"); ;; --name) ARGS+=("-n"); ;; --kernel) ARGS+=("-k"); ;; --no-kernel) ARGS+=("-K"); ;; --router) ARGS+=("-r"); ;; --debug) ARGS+=("-d"); ;; --) ARGS+=("--"); double_dash_found=1; ;; --[a-zA-Z0-9]*) echo "*** Illegal long option $i."; exit 1; ;; -[a-zA-Z0-9]*) j="${i:1}"; while [[ $j != "" ]]; do ARGS+=("-${j:0:1}"); j="${j:1}"; done; ;; *) ARGS+=("$i") ;; esac fi done set - "${ARGS[@]}" unset ARGS # Interpret short format options: while [[ $# -gt 0 ]]; do OPTIND=1 while getopts ":$OPTSTRING" flag; do if [[ $flag = '?' ]]; then echo "ERROR: illegal option -$OPTARG."; exit 1; fi eval "option_${flag}=$OPTIND" eval "option_${flag}_arg='$OPTARG'" done for ((j=1; j] Build a basic filesystem for Marionnet based on Buildroot, itself based on Busybox. If one or both files \`_build.custom_packages_{yes,no}' exist in the current directory, their uncommented lines tell the script which Buildroot's packages are wanted (yes) or unwanted (no). The list of selected packages results from the formula: ((config UNION required) DIFF no) UNION yes UNION bash where \`config' is the default Buildroot configuration file, or the file provided with the option \`--config', and \`required' are packages considered relevant by Marionnet's developpers for pedagogical reasons. Note that, except \`bash', the priority is given to uncommented names in \`_build.custom_packages_{yes,no}'. Options: -n/--name NAME set the name of the filesystem (used for /etc/issue) -f/--config FILE use this Buildroot's (starting) configuration file -m/--custom customize the package selection with 'make menuconfig' -q/--quagga include quagga to the filesystem -k/--kernel VERS set the kernel version (for headers and/or to compile) -K/--no-kernel do not compile the kernel -r/--router-conf create also \"router_*.conf\" file (implies -q) -c/--continue DIR continue a previously broken execution in directory DIR -h/--help Print this message and exit --- Defaults: is \"./_build.buildroot\". --kernel ${DEFAULT_KERNEL_VERSION} is set by default Notes - If the kernel is compiled (you can disable it with -K) it will compiled outside Buildroot - The router configuration (-r) may be useful to have a unique filesystem for both routers and (basic) machines. You can simply install the router filesystem creating a (physical or symbolic) link to the related file 'machine-*'. Examples: $ ${0##*/} --no-kernel --kernel 3.0.8 --name pulcinella $ ${0##*/} --custom --no-kernel --quagga --name pulcinella $ ${0##*/} --no-kernel --router --name pulcinella" exit $1 } # Note that 2.6.30 is the first header's version allowing a # successfully buildroot compilation (2.6.18 fails) # Another possible default could be 2.6.32 (last statically-linked # available version of our patched (ghost2) kernel) DEFAULT_KERNEL_VERSION=3.2.48 # Manage now your options in a convenient order # # Option -h if [[ -n ${option_h} ]]; then print_usage_and_exit 0 fi # Option -n --name if [[ -n ${option_n} ]]; then DISTRIBUTION_NAME=$option_n_arg fi # Option -f --config if [[ -n ${option_f} ]]; then CONFIG=$option_f_arg fi # Option -k --kernel if [[ -n ${option_k} ]]; then KERNEL_VERSION=$option_k_arg else KERNEL_VERSION=$DEFAULT_KERNEL_VERSION fi # Option -r --router. It implies --quagga (-q): if [[ -n ${option_r} ]]; then option_q=y fi # Option -d --debug if [[ -n ${option_d} ]]; then DEBUGGING_MODE=y fi # Option -c --continue if [[ -n ${option_c} ]]; then if [[ -d "${option_c_arg}" ]]; then CONTINUE_IN_DIRECTORY="${option_c_arg}" CONTINUE=yes else echo "Error: ${option_c_arg} doesn't exist or is not a directory." echo "Exiting." exit 1 fi fi # ============================================================= # DEBUGGING SETUP # ============================================================= # Source anyway, in order to able to freely leave break-points in the code. # Defined functions: # ___break_point___ # set_tracing # unset_tracing # set_debugging # unset_debugging # set_once_actions_file # once # Referred global: # DEBUGGING_MODE source ../pupisto.common/toolkit_debugging.sh # In order to enrich the log: set_tracing # ============================================================= # GENERAL SETUP # ============================================================= BUILDROOT_ORIG=${1:-./_build.buildroot} if [[ ! -d $BUILDROOT_ORIG ]]; then echo "Perform before 'make ./buildroot' please!" exit 2 fi # Annexes of this script: PUPISTO_FILES=pupisto.buildroot.sh.files # Distribution and filesystem names: if [[ -z $DISTRIBUTION_NAME ]]; then DISTRIBUTION_NAME="buildroot-for-kernel-${KERNEL_VERSION}" fi FS_NAME="machine-$DISTRIBUTION_NAME" # Create the temporary working directory $TWDIR or continue in an already created # directory: if [[ -n $CONTINUE ]]; then TWDIR="$(basename $CONTINUE_IN_DIRECTORY)" BUILDROOT=$TWDIR/buildroot [[ -d $BUILDROOT ]] || cp -a $BUILDROOT_ORIG $BUILDROOT else TWDIR=_build.$DISTRIBUTION_NAME-with-linux-${KERNEL_VERSION}.$(date +%Y-%m-%d.%H\h%M) mkdir -v -p $TWDIR BUILDROOT=$TWDIR/buildroot cp -a $BUILDROOT_ORIG $BUILDROOT fi PUPISTO_DIR=$PWD # Initialize the file registering actions to be performed once: set_once_actions_file $TWDIR/ONCE_ACTIONS_FILE # Will be called at the end of the script or exiting because of an error: function make_a_human_readable_log_into_working_directory { # global TWDIR LOGFILE BUILDROOT PUPISTO_DIR if [[ -f $LOGFILE ]]; then local READABLE_LOG_FILE local PATH_TO_BE_SIMPLIFIED local TMPFILE1=$(mktemp) local TMPFILE2=$(mktemp) # Example: # "/home/user/repos/marionnet/uml/pupisto.buildroot/" replaced by '$PUPISTO_DIR' # "_build.brighella-with-linux-3.2.44.2013-05-10.23h06/buildroot" replaced by '$BUILDROOT' READABLE_LOG_FILE=$TWDIR/$(basename $LOGFILE) PATH_TO_BE_SIMPLIFIED=$(sed 's/\//\\\//g' <<<"$PWD/$BUILDROOT") sed <$LOGFILE -e 's/'"$PATH_TO_BE_SIMPLIFIED"'/$BUILDROOT/g' > $TMPFILE1 PATH_TO_BE_SIMPLIFIED=$(sed 's/\//\\\//g' <<<"$BUILDROOT") sed <$TMPFILE1 -e 's/'"$PATH_TO_BE_SIMPLIFIED"'/$BUILDROOT/g' > $TMPFILE2 PATH_TO_BE_SIMPLIFIED=$(sed 's/\//\\\//g' <<<"$PUPISTO_DIR") sed <$TMPFILE2 -e 's/'"$PATH_TO_BE_SIMPLIFIED"'/$PUPISTO_DIR/g' > $READABLE_LOG_FILE echo "---" echo "Log file made more human-readable and copied into $READABLE_LOG_FILE" rm -f $TMPFILE1 $TMPFILE2 else printf "Log file %s not found\n" $LOGFILE 1>&2 fi } function exiting_because_error { # global TWDIR LOGFILE echo -e "Exiting because of an unexpected error in line $BASH_LINENO" make_a_human_readable_log_into_working_directory exit 3 } # trap exiting_because_error ERR source ../pupisto.common/toolkit_config_files.sh # Exported functions available from now: # tabular_file_update # user_config_set # set_default_config_file # set_default_config_field_separator # set_config_variable # unset_config_variable # get_config_variable # get_config_variable_unquoting # Examples: # tabular_file_update -d ":" -k 1 --key-value "root" -f 7 --field-value "/bin/bash" --field-old-value "/bin/sh" etc/passwd # user_config_set "PermitRootLogin" " " "yes" etc/sshd_config # ============================================================= # Definition of # OUR BUILDROOT TUNING SCRIPT # ============================================================= MARIONNET_RELAY=$PWD/$PUPISTO_FILES/S90marionnet-relay QUAGGA_DIR=$PWD/$PUPISTO_FILES/quagga OUR_TUNING_SCRIPT=$PWD/$(mktemp --tmpdir=$TWDIR ROOTFS_POST_IMAGE_SCRIPT.XXXXXXXX) IFCONFIG_WRAPPER=$PWD/$PUPISTO_FILES/ifconfig ZTOOLS_WRAPPER=$PWD/$PUPISTO_FILES/zgrep_zdiff_zless GROUPS_WRAPPER=$PWD/$PUPISTO_FILES/groups BASHRC=$PWD/$PUPISTO_FILES/bashrc SSH_DIR=$PWD/$PUPISTO_FILES/ssh RADVD_DIR=$PWD/$PUPISTO_FILES/radvd DHCPD_DIR=$PWD/$PUPISTO_FILES/dhcpd cat 1>$OUR_TUNING_SCRIPT < bash if [[ -L bin/sh && -x bin/bash ]]; then ln -sf bash bin/sh fi # Note that the user "student" is previously created by Buildroot: cp $BASHRC root/.bashrc cp $BASHRC home/student/.bashrc cp root/.bash_profile home/student/ # Also change root shell (in order to read ~/.bashrc): tabular_file_update -i -d ":" -k 1 --key-value "root" -f 7 --field-value "/bin/bash" etc/passwd || [[ $? -eq 1 ]] # Poor-man "z"-tools: ZTOOLS="zgrep zegrep zfgrep zless zdiff zcmp zhead ztail" for i in \$ZTOOLS; do if [[ ! -e bin/\$i ]]; then cp $ZTOOLS_WRAPPER bin/\$i chmod +x bin/\$i FOUND=\$i; break; fi done for i in \$ZTOOLS; do if [[ ! -e bin/\$i ]] && [[ ! \$i = \$FOUND ]]; then ln -s \$FOUND bin/\$i fi done # groups utility if [[ ! -e bin/groups ]] && [[ ! -e usr/bin/groups ]] && [[ -f $GROUPS_WRAPPER ]]; then cp $GROUPS_WRAPPER bin/groups chmod +x bin/groups fi # Adapt the ssh daemon to allow Marionnet to login or execute remote commands: SSHD_CONFIG=\$(find -type f -name "sshd_config") # should be etc/sshd_config if [[ -f "\$SSHD_CONFIG" ]]; then user_config_set "PermitRootLogin" " " "yes" \$SSHD_CONFIG user_config_set "StrictModes" " " "no" \$SSHD_CONFIG user_config_set "PubkeyAuthentication" " " "yes" \$SSHD_CONFIG mkdir -p {home/student,root}/.ssh chmod 700 {home/student,root}/.ssh cat $SSH_DIR/id_rsa_marionnet.pub >> home/student/.ssh/authorized_keys cat $SSH_DIR/id_rsa_marionnet.pub >> root/.ssh/authorized_keys chmod 644 {home/student,root}/.ssh/authorized_keys fi # radvd RADVD=\$(find -type f -name "radvd") if [[ -f "\$RADVD" ]]; then cp $RADVD_DIR/radvd.conf.example* etc/ fi # dhcpd DHCPD=\$(find etc/init.d/ -maxdepth 1 -type f -name "*dhcp-server") if [[ -f \$DHCPD ]]; then # Take our version: cat $DHCPD_DIR/dhcp-server >\$DHCPD fi # lighttpd if [[ -d var/www/ ]]; then echo '

It works!

' >var/www/index.html fi # Login message. # Note that setting BR2_TARGET_GENERIC_ISSUE no gives the expected effect, # so we write the message directly in the good place: cat >etc/issue <<\EOF_issue ####################################################### Welcome to \`$DISTRIBUTION_NAME', a compact GNU/Linux filesystem conceived for Marionnet, based on Busybox and made with Buildroot ($(LC_ALL=us date "+%B %Y")). ####################################################### Running with kernel \r Use the account root/root or student/student EOF_issue EOF # Append some treatments for quagga: if [[ -n ${option_q} ]]; then cat 1>>$OUR_TUNING_SCRIPT <> etc/group echo "quagga:x:117:" >> etc/group # TODO: FIX /home/quagga echo "quagga:x:108:99:Linux User,,,:/home/quagga:/bin/false" >> etc/passwd echo 'quagga:!:15815:0:99999:7:::' >> etc/shadow EOF fi # We dont know how to exploit this information: # FAKEROOT_SCRIPT=$BUILDROOT/output/build/_fakeroot.fs # Append other things to do as is (without interpretation, see "EOF"): cat 1>>$OUR_TUNING_SCRIPT <<"EOF" # Creating 'student/student': # Ask Buildroot to do it: # Source: http://lists.busybox.net/pipermail/buildroot/2012-December/064450.html # +============+=====+=======+=====+==========+=============+=========+=======+===========+ # | username | uid | group | gid | password | home | shell |groups | comment | # +============+=====+=======+=====+==========+=============+=========+=======+===========+ # User `student' defined into `pupisto.buildroot.sh.files/ethghost/ethghost.mk' # Add student to the `sudo' group. TODO: ensure that the line exists! TMPFILE=$(mktemp) awk $TMPFILE '$1=="#" && $2=="%sudo" && $3=="ALL=(ALL)" {print $2,$3,$4; next} {print}' chmod u+w etc/sudoers cat $TMPFILE >etc/sudoers chmod u-w etc/sudoers echo 'sudo:x:27:student' >> etc/group # Remove the symlink /etc/resolv.conf rm etc/resolv.conf >etc/resolv.conf # Change the `ctrlaltdel' behaviour: no `reboot' but `halt'. This setting is # very relevant because with `reboot' Marionnet will not be able to cleanly # shutdown the machine: sed -i -e 's/::ctrlaltdel:\/sbin\/reboot/::ctrlaltdel:\/sbin\/halt/' etc/inittab # Add tty0 as available root console: echo 'tty0' >> etc/securetty # Add a wrapper `dhclient -> udhcpc (busybox)' if needed: if [[ -e sbin/udhcpc && ! -e sbin/dhclient ]]; then echo '#!/bin/bash eval exec -a udhcpc busybox -fnq "$@" ' > sbin/dhclient chmod +x sbin/dhclient fi # Do not start services at boot (except S90marionnet-relay and some other): pushd etc/init.d/ for i in $(find . -maxdepth 1 -name "S*" -a ! -name "S90marionnet-relay" -a ! -name "S01logging" -a ! -name "S20urandom" -a ! -name "S40network"); do j=${i#./S??}; mv $i $j; echo "$j was $i" >> README.script_order done # Create links for the remaining services: for i in $(find . -maxdepth 1 -name "S*" -a ! -name "S90marionnet-relay"); do j=${i#./S??}; mv $i $j; ln -s $j $i done popd EOF # Make it executable and bind it with the Buildroot process: chmod +x $OUR_TUNING_SCRIPT # Do not execute our script the first time: # set_config_variable "BR2_ROOTFS_POST_BUILD_SCRIPT" '"'$OUR_TUNING_SCRIPT'"' # ============================================================= # BUILDROOT PATCHES # ============================================================= # Package `net-tools': if [[ -d $BUILDROOT/package/net-tools ]]; then echo "No need to apply the \`net-tools' buildroot patch. Fine." else echo "Applying the \`net-tools' buildroot patch." patch -d $BUILDROOT -p1 <$PUPISTO_FILES/net-tools.patch fi # ============================================================= # BUILDROOT CONFIGURATION (Step 1) # working on `project_defconfig' # ============================================================= # Antoine: when you update Buildroot the new configuration options appear, # so if you copy an old .config and start the build, Buildroot # will ask you the values for the new options. In order to workaround # this behaviour, select automatically the default value for the new options, then, do: # cp your.config.file /path/to/buildroot/sources/configs/project_defconfig && # make project_defconfig && make if [[ -z ${CONFIG} ]]; then >$BUILDROOT/configs/project_defconfig else cp -fv $CONFIG $BUILDROOT/configs/project_defconfig fi # Set the initial config file we will working on # until the next `make project_defconfig': set_default_config_file $BUILDROOT/configs/project_defconfig # BR2_ARCH corresponds to SUBARCH during kernel compilation set_config_variable "BR2_ARCH" '"i386"' set_config_variable "BR2_i386" "y" set_config_variable "BR2_ENDIAN" '"LITTLE"' set_config_variable "BR2_GCC_TARGET_TUNE" '"i386"' set_config_variable "BR2_GCC_TARGET_ARCH" '"i386"' set_config_variable "BR2_x86_i386" "y" set_config_variable "BR2_TARGET_GENERIC_ROOT_PASSWD" '"root"' # /etc/inittab is built according to the following three lines # according to the compiled kernel: set_config_variable "BR2_TARGET_GENERIC_GETTY_PORT" '"tty0"' set_config_variable "BR2_TARGET_GENERIC_GETTY_BAUDRATE_38400" "y" unset_config_variable "BR2_TARGET_GENERIC_GETTY_TERM" ########################################## # (Step 1) Improve building efficiency # ########################################## # Share and reuse DOWNLOAD results among separate Buildroot builds: BUILDROOT_DL_DIR="$HOME/.buildroot-downld" set_config_variable "BR2_DL_DIR" '"'$BUILDROOT_DL_DIR'"' mkdir -p $BUILDROOT_DL_DIR ln -sf $BUILDROOT_DL_DIR "_build.buildroot-downld" # Share and reuse COMPILATION results among separate Buildroot builds # (`ccache' support); fix PATH (if needed) and set BR2_CCACHE: if [[ -e /usr/lib/ccache/gcc ]]; then if ! grep -q "ccache" <<<$PATH; then export PATH=$(dirname $(which gcc)):$PATH fi set_config_variable "BR2_CCACHE" "y" mkdir -p "$HOME/.buildroot-ccache" ln -sf "$HOME/.buildroot-ccache" "_build.buildroot-ccache" fi ############################################ # (Step 1) Additional Buildroot packages # ############################################ # This sub-section is about adding custom packages, library, or applications # in buildroot. # Example: # add_extra_buildroot_package $PUPISTO_FILES/ethghost $ETHGHOST_VERSION ../ethghost # add_extra_buildroot_package $PUPISTO_FILES/bind function add_extra_buildroot_package { # global BUILDROOT BUILDROOT_DL_DIR local PACKAGE_DEFINITION_DIR=$1 local PACKAGE_VERSION=$2 # optional local SOURCE_DIR=$3 # optional #--- local NAME=$(basename $PACKAGE_DEFINITION_DIR) local CONFIG_IN=$PACKAGE_DEFINITION_DIR/Config.in local PACKAGE_MK=$PACKAGE_DEFINITION_DIR/$NAME.mk [[ -f $CONFIG_IN ]] || { echo "Expected file $CONFIG_IN doesn't exist" 1>&2; return 1; } [[ -f $PACKAGE_MK ]] || { echo "Expected file $PACKAGE_MK doesn't exist" 1>&2; return 1; } local UPPER_NAME=$(echo $NAME | tr '[a-z]' '[A-Z]') mkdir -p $BUILDROOT/package/$NAME # Simulate the package download if the SOURCE_DIR is given: if [[ -n $SOURCE_DIR ]]; then tar -C $(dirname $SOURCE_DIR) -czf $BUILDROOT_DL_DIR/${NAME}-${PACKAGE_VERSION}.tar.gz $NAME/ fi # Copy all things as they are from $PACKAGE_DEFINITION_DIR: cp $PACKAGE_DEFINITION_DIR/* $BUILDROOT/package/$NAME/ # Creation of the config.in needed for package description and dependencies. cp -f $CONFIG_IN $BUILDROOT/package/$NAME/ # Copy $PACKAGE_MK as is or trying to update the version number: if [[ -z $PACKAGE_VERSION ]]; then cp -f $PACKAGE_MK $BUILDROOT/package/$NAME/$NAME.mk else awk <$PACKAGE_MK >$BUILDROOT/package/$NAME/$NAME.mk \ -v version="$PACKAGE_VERSION" '$1 ~ /^[A-Z0-9]*_VERSION$/ {print $1,$2,version; next} {print}' fi #Append the package/Config.in file to make appear our new package cat 1>>$BUILDROOT/package/Config.in<&2 } fi } # Add now our package `ethghost' ETHGHOST_VERSION=$(make -s -C ../ethghost print_version) add_extra_buildroot_package $PUPISTO_FILES/ethghost $ETHGHOST_VERSION ../ethghost ####################################### # (Step 1) Packages' selection # ####################################### # Add some essential packages: set_config_variable "BR2_PACKAGE_BUSYBOX" "y" set_config_variable "BR2_PACKAGE_BUSYBOX_SHOW_OTHERS" "y" set_config_variable "BR2_PACKAGE_BASH" "y" # set_config_variable "BR2_PACKAGE_BRIDGE_UTILS" "y" # busybox! # set_config_variable "BR2_PACKAGE_BZIP2" "y" # busybox! set_config_variable "BR2_PACKAGE_HOST_E2FSPROGS" "y" set_config_variable "BR2_PACKAGE_DHCP" "y" set_config_variable "BR2_PACKAGE_DHCP_SERVER" "y" # set_config_variable "BR2_PACKAGE_DHCP_RELAY" "y" # busybox! set_config_variable "BR2_PACKAGE_BIND" "y" set_config_variable "BR2_PACKAGE_BIND_SERVER" "y" set_config_variable "BR2_PACKAGE_BIND_TOOLS" "y" set_config_variable "BR2_PACKAGE_RPCBIND" "y" set_config_variable "BR2_PACKAGE_SOCAT" "y" set_config_variable "BR2_PACKAGE_RSYNC" "y" set_config_variable "BR2_PACKAGE_CURL" "y" set_config_variable "BR2_PACKAGE_CURLFTPFS" "y" set_config_variable "BR2_PACKAGE_SSHFS" "y" set_config_variable "BR2_PACKAGE_STRACE" "y" set_config_variable "BR2_PACKAGE_UEMACS" "y" set_config_variable "BR2_PACKAGE_ETHTOOL" "y" set_config_variable "BR2_PACKAGE_FILE" "y" set_config_variable "BR2_PACKAGE_IPROUTE2" "y" set_config_variable "BR2_PACKAGE_IPTABLES" "y" set_config_variable "BR2_PACKAGE_KBD" "y" set_config_variable "BR2_PACKAGE_LESS" "y" set_config_variable "BR2_PACKAGE_LIGHTTPD" "y" set_config_variable "BR2_PACKAGE_LIGHTTPD_OPENSSL" "y" set_config_variable "BR2_PACKAGE_LIGHTTPD_BZIP2" "y" set_config_variable "BR2_PACKAGE_LINKS" "y" set_config_variable "BR2_PACKAGE_NANO" "y" set_config_variable "BR2_PACKAGE_NANO_TINY" "y" set_config_variable "BR2_PACKAGE_NCFTP" "y" # set_config_variable "BR2_PACKAGE_NETCAT" "y" # busybox! set_config_variable "BR2_PACKAGE_NMAP" "y" set_config_variable "BR2_PACKAGE_NTP" "y" # set_config_variable "BR2_PACKAGE_NTP_NTPD" "y" # busybox! set_config_variable "BR2_PACKAGE_NTP_SNTP" "y" set_config_variable "BR2_PACKAGE_NTP_NTPDATE" "y" set_config_variable "BR2_PACKAGE_NTP_NTPDC" "y" set_config_variable "BR2_PACKAGE_NTP_NTPQ" "y" set_config_variable "BR2_PACKAGE_OPENSSH" "y" set_config_variable "BR2_PACKAGE_OPENSSL" "y" set_config_variable "BR2_PACKAGE_RADVD" "y" set_config_variable "BR2_PACKAGE_READLINE" "y" set_config_variable "BR2_PACKAGE_SUDO" "y" set_config_variable "BR2_PACKAGE_TCPDUMP" "y" # set_config_variable "BR2_PACKAGE_TFTPD" "y" # busybox! # set_config_variable "BR2_PACKAGE_XZ" "y" # busybox! set_config_variable "BR2_PACKAGE_WGET" "y" set_config_variable "BR2_PACKAGE_ZLIB" "y" # Basic essential settings: set_config_variable "BR2_TOOLCHAIN_BUILDROOT_INET_IPV6" "y" set_config_variable "BR2_TOOLCHAIN_BUILDROOT_INET_RPC" "y" set_config_variable "BR2_ROOTFS_DEVICE_CREATION_STATIC" "y" set_config_variable "BR2_INIT_BUSYBOX" "y" set_config_variable "BR2_ROOTFS_SKELETON_DEFAULT" "y" set_config_variable "BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW" "y" set_config_variable "BR2_TARGET_ROOTFS_EXT2" "y" set_config_variable "BR2_TARGET_ROOTFS_EXT2_BLOCKS" "0" set_config_variable "BR2_TARGET_ROOTFS_EXT2_INODES" "0" set_config_variable "BR2_TARGET_ROOTFS_EXT2_RESBLKS" "0" set_config_variable "BR2_TARGET_ROOTFS_EXT2_NONE" "y" # net-tools (in order to have `arp' and an ifconfig acceptiong CIDR notation): # set_config_variable "BR2_PACKAGE_NET_TOOLS" "y" # busybox + our ifconfig wrapper! # Option -q/--quagga if [[ -n ${option_q} ]]; then # Package needed for quagga set_config_variable "BR2_PACKAGE_QUAGGA" "y" set_config_variable "BR2_PACKAGE_QUAGGA_ZEBRA" "y" set_config_variable "BR2_PACKAGE_QUAGGA_TCP_ZEBRA" "y" set_config_variable "BR2_PACKAGE_QUAGGA_BABELD" "y" set_config_variable "BR2_PACKAGE_QUAGGA_BGPD" "y" set_config_variable "BR2_PACKAGE_QUAGGA_BGP_ANNOUNCE" "y" set_config_variable "BR2_PACKAGE_QUAGGA_ISISD" "y" set_config_variable "BR2_PACKAGE_QUAGGA_OSPFD" "y" set_config_variable "BR2_PACKAGE_QUAGGA_OPAQUE_LSA" "y" set_config_variable "BR2_PACKAGE_QUAGGA_OSPF6D" "y" set_config_variable "BR2_PACKAGE_QUAGGA_RIPD" "y" set_config_variable "BR2_PACKAGE_QUAGGA_RIPNGD" "y" set_config_variable "BR2_PACKAGE_QUAGGA_WATCHQUAGGA" "y" set_config_variable "BR2_PACKAGE_QUAGGA_SNMP" "y" fi # Tell Buildroot which kernel version we are supposing: set_config_variable "BR2_KERNEL_HEADERS_VERSION" "y" set_config_variable "BR2_DEFAULT_KERNEL_VERSION" '"'$KERNEL_VERSION'"' set_config_variable "BR2_DEFAULT_KERNEL_HEADERS" '"'$KERNEL_VERSION'"' ####################################### # (Step 1) custom_packages_{yes,no} # ####################################### # Last-minute package's installation directives, using files # _build.custom_packages_{no,yes} built and edited with specific # `make' entries. Note that "yes" is prioritary over "no". unset_tracing # otherwise too verbose! CUSTOM_PACKAGES_NO="_build.custom_packages_no" if [[ -f $CUSTOM_PACKAGES_NO ]]; then echo "Removing packages from uncommented lines of $CUSTOM_PACKAGES_NO" \grep -v "^#" $CUSTOM_PACKAGES_NO | \grep "BR2_PACKAGE_[A-Z0-9_][A-Z0-9_]*" | \ while read PACKAGE; do set_config_variable "$PACKAGE" "n" done fi CUSTOM_PACKAGES_YES="_build.custom_packages_yes" if [[ -f $CUSTOM_PACKAGES_YES ]]; then echo "Adding packages from uncommented lines of $CUSTOM_PACKAGES_YES" \grep -v "^#" $CUSTOM_PACKAGES_YES | \grep "BR2_PACKAGE_[A-Z0-9_][A-Z0-9_]*" | \ while read PACKAGE; do set_config_variable "$PACKAGE" "y" done fi set_tracing # continue now in verbose mode ####################################################### # (Step 1) Last configurations on project_defconfig # ####################################################### # Bash will be (re-)selected anyway, even in a minimal setting: set_config_variable "BR2_PACKAGE_BASH" "y" # Toolchain settings: these three variables are initially set to "yes" # in order to force Buildroot to consider all packages. Their value will # be reconsidered in a second step: set_config_variable "BR2_TOOLCHAIN_BUILDROOT_LARGEFILE" "y" set_config_variable "BR2_TOOLCHAIN_BUILDROOT_WCHAR" "y" set_config_variable "BR2_TOOLCHAIN_BUILDROOT_CXX" "y" ######################################## # (Step 1) Make project_defconfig # ######################################## # Merge our minimal `project_defconfig' with # Buildroot's defaults in order to generate $BUILDROOT/.config once make -C $BUILDROOT project_defconfig # ============================================================= # BUILDROOT CONFIGURATION (Step 2) # working on `.config' # ============================================================= # At this point we can forget the old configuration file used to # build $BUILDROOT/.config with the previous `make' call. From # this moment, we will work on $BUILDROOT/.config, so: set_default_config_file $BUILDROOT/.config # ___break_point___ # The `unset' function must act on the .config file generated by Buildroot, # because Buildroot merges the `project_defconfig' with its own defaults. unset_config_variable "BR2_LINUX_KERNEL" # ignore anyway the Buildroot's kernel compilation unset_config_variable "BR2_TARGET_ROOTFS_TAR" unset_config_variable "BR2_TARGET_ROOTFS_TAR_NONE" unset_config_variable "BR2_TARGET_ROOTFS_TAR_OPTIONS" set_config_variable "BR2_TAR_OPTIONS" '""' set_config_variable "BR2_TARGET_ROOTFS_TAR" "n" ####################################### # (Step 2) TOOLCHAIN dependencies # ####################################### DEPENDENCIES=$(mktemp) SELECTED_PACKAGES=$(awk <$BUILDROOT/.config -F "=" '$1 ~ /^BR2_PACKAGE_[A-Z][A-Z0-9_]*/ && $2 == "y" {print $1}') for i in $SELECTED_PACKAGES; do j=${i#BR2_PACKAGE_} j=${j,,} CONFIG_IN=$BUILDROOT/package/$j/Config.in if [[ -f $CONFIG_IN ]]; then \grep -o 'depends on.*[!].*BR2_.*' $CONFIG_IN || true fi done | tr ' ' '\n' | \grep -o "BR2_[A-Z][A-Z0-9_]*" | uniq | sort | uniq > $DEPENDENCIES # Here $DEPENDENCIES contains a list like the following: # BR2_INET_IPV6 # BR2_INSTALL_LIBSTDCPP # BR2_LARGEFILE # BR2_PACKAGE_QUAGGA # BR2_PREFER_STATIC_LIB # BR2_TOOLCHAIN_HAS_THREADS # BR2_USE_WCHAR function yes_or_no_according_to { if "$@"; then echo y; else echo n; fi } # In order to be able to select additional packages (nmap, wget): # BR2_TOOLCHAIN_BUILDROOT_LARGEFILE is required for instance # by BR2_PACKAGE_BIND but it is not automatically set by Buildroot, so: y_or_n=$(yes_or_no_according_to grep -q "BR2_.*LARGEFILE" $DEPENDENCIES) set_config_variable "BR2_TOOLCHAIN_BUILDROOT_LARGEFILE" ${y_or_n} # y_or_n=$(yes_or_no_according_to grep -q "BR2_.*WCHAR" $DEPENDENCIES) # Forced because the version 3.2.44 of kernel's headers need this # toolchain setting: y_or_n=y set_config_variable "BR2_TOOLCHAIN_BUILDROOT_WCHAR" ${y_or_n} y_or_n=$(yes_or_no_according_to grep -q "BR2_.*LIBSTDCPP" $DEPENDENCIES) set_config_variable "BR2_TOOLCHAIN_BUILDROOT_CXX" ${y_or_n} echo "TOOLCHAIN dependencies:" tr '\n' ' ' <$DEPENDENCIES rm $DEPENDENCIES ___break_point___ ############################################ # (Step 2) custom (interactive) running # ############################################ # Custom? --custom -m if [[ -n ${option_m} ]]; then PSEUDO_TERMINAL=$(tty) make -C $BUILDROOT menuconfig 0<$PSEUDO_TERMINAL 1>$PSEUDO_TERMINAL fi # ============================================================= # BUILDROOT COMPILATION # (first round) # ============================================================= # Compile all stuff a first time: once make -C $BUILDROOT # ============================================================= # BUSYBOX REBUILDING # (second round) # ============================================================= # We perform some settings directly into the Busybox's config file: # Example: BUSYBOX_CONFIG=package/busybox/busybox-1.21.x.config BUSYBOX_CONFIG=${BUILDROOT}/$(awk <$BUILDROOT/.config -F= '$1 == "BR2_PACKAGE_BUSYBOX_CONFIG" {print $2}' | tr -d '"') set_config_variable "CONFIG_BRCTL" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_FEATURE_BRCTL_FANCY" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_FEATURE_BRCTL_SHOW" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_IPCALC" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_FEATURE_IPCALC_FANCY" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_FEATURE_IPCALC_LONG_OPTIONS" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_PGREP" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_PING6" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_PKILL" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_SPLIT" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_FEATURE_SPLIT_FANCY" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_STAT" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_FEATURE_STAT_FORMAT" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_SUM" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_TAC" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_UNCOMPRESS" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_UNEXPAND" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_MKFS_EXT2" "y" $BUSYBOX_CONFIG set_config_variable "CONFIG_PSTREE" "y" $BUSYBOX_CONFIG # At this point $BUSYBOX_CONFIG is a merging of Builroot's settings # with our settings. # Now rebuild busybox with our specific settings: BUSYBOX_BUILT_DIR=$(echo $BUILDROOT/output/build/busybox-*) make -C $BUSYBOX_BUILT_DIR clean sort_and_merge_config_files $BUSYBOX_CONFIG $BUSYBOX_BUILT_DIR/.config > $BUSYBOX_BUILT_DIR/.config.merged cp $BUSYBOX_BUILT_DIR/{.config,.config.orig} cp $BUSYBOX_BUILT_DIR/{.config.merged,.config} # The second time we want execute the our filesystem tuning script: set_config_variable "BR2_ROOTFS_POST_BUILD_SCRIPT" '"'$OUR_TUNING_SCRIPT'"' $BUILDROOT/.config ############################ # (Second round) Compile # ############################ # Note that the target `busybox-rebuild' doesn't have the expected behaviour: once make -C $BUILDROOT busybox-reconfigure #################################### # (Second round) Store the image # #################################### # Move the image to $TWDIR: FS_LOC=$TWDIR/$FS_NAME mv $BUILDROOT/output/images/rootfs.ext2 $FS_LOC cp $BUILDROOT/.config $TWDIR/buildroot.config cp $BUSYBOX_BUILT_DIR/.config $TWDIR/busybox.config # ============================================================= # GENERATING FILES # {machine,router}-*.conf # ============================================================= #################################### # MD5SUM and other simple fields # #################################### MD5SUM=$(md5sum "$FS_LOC" | awk '{print $1}') SUM=$(sum "$FS_LOC" | awk '{print $1}') MTIME=$(stat -c "%Y" "$FS_LOC") DATE=$(date +%Y-%m-%d) AUTHOR=$(awk ghost or not else # With option --router the console must be 'none' except when the user # explicitely requires a unix terminal: SUPPORTED_KERNELS="/$KERNEL_VERSION/" # /../ => ghost or not fi ############################################## # X11_SUPPORT and memory-related variables # ############################################## function set_X11_SUPPORT_and_related_variables_according_to_choosed_packages { # global X11_SUPPORT BUILDROOT local CONFIG_FILE=${1:-$BUILDROOT/.config} local X11_RELATED_PACKAGES # --- if grep -q "BR2_PACKAGE_XLIB_LIBX11=y" "$CONFIG_FILE"; then if grep -q "BR2_PACKAGE_XSERVER_XORG_SERVER=y" "$CONFIG_FILE"; then X11_SUPPORT="xnested" MEMORY_MIN_SIZE=32 MEMORY_SUGGESTED_SIZE=48 else X11_SUPPORT="xhosted" MEMORY_MIN_SIZE=24 MEMORY_SUGGESTED_SIZE=48 fi else X11_SUPPORT="none" MEMORY_MIN_SIZE=16 # tested MEMORY_SUGGESTED_SIZE=24 fi } # Launch the function: set_X11_SUPPORT_and_related_variables_according_to_choosed_packages "$BUILDROOT/.config" ################### # BINARY_LIST # ################### # Looking for binaries in $BUILDROOT/output/target TARGET_DIR=$BUILDROOT/output/target pushd $TARGET_DIR BIN_OR_SBIN_DIRS=$(find . -type d \( -name "bin" -o -name "sbin" \) ) BINARY_LIST=$(find $BIN_OR_SBIN_DIRS -perm -u=x ! -type d ! -name "*[.]so*" -exec basename {} \; | sort) # Some binaries like '[' or '[[' will provoke some problems applying `sed' or `awk' (see above), so: BINARY_LIST=$(echo $BINARY_LIST | tr ' ' '\n' | \grep "[a-zA-Z][a-zA-Z_.]*") BINARY_LIST=$(echo $BINARY_LIST) popd ####################### # FILLING TEMPLATE # ####################### cp ../../share/filesystems/machine-template.conf $FS_LOC.conf # Using `sed' for simple replacements: sed -e "s/^MD5SUM=.*/MD5SUM=$MD5SUM/" \ -e "s/^SUM=.*/SUM=$SUM/" \ -e "s/^MTIME=.*/MTIME=$MTIME/" \ -e "s/^DATE=.*/DATE=$DATE/" \ -e "s/^AUTHOR=.*/AUTHOR=\"$AUTHOR\"/" \ -e "s/^X11_SUPPORT=.*/X11_SUPPORT=\"$X11_SUPPORT\"/" \ -e "s/^MEMORY_MIN_SIZE=.*/MEMORY_MIN_SIZE=$MEMORY_MIN_SIZE/" \ -e "s/^MEMORY_SUGGESTED_SIZE=.*/MEMORY_SUGGESTED_SIZE=$MEMORY_SUGGESTED_SIZE/" \ -i ${FS_LOC}.conf # Using `user_config_set' for replacements involving variables # bound to values with special characters (as '/') and/or multiple lines. user_config_set "BINARY_LIST" "=" "'$BINARY_LIST'" ${FS_LOC}.conf user_config_set "SUPPORTED_KERNELS" "=" "'$SUPPORTED_KERNELS'" ${FS_LOC}.conf # Rename the built filesystem and its .conf file simply adding the suffix $SUM: mv $FS_LOC ${FS_LOC}-${SUM} mv $FS_LOC.conf ${FS_LOC}-${SUM}.conf # ============================================================= # ROUTER LINK AND OTHER FINAL ACTIONS # ============================================================= pushd "$(dirname $FS_LOC)" if [[ -n $option_r ]]; then FS_BASENAME="$(basename ${FS_LOC}-${SUM})" ROUTER_FS_BASENAME=router-${FS_BASENAME#machine-} cp $FS_BASENAME.conf $ROUTER_FS_BASENAME.conf ln -s $FS_BASENAME $ROUTER_FS_BASENAME cat >INSTALL <INSTALL <&2 "A directory \`$EXISTING_KERNEL_DIR' already exists: making a symlink to!" ln -s ../"$EXISTING_KERNEL_DIR" "$TWDIR/linux-$KERNEL_VERSION" else # In order to have a unique log, we will use the script as # a library of functions instead of as a standalone program: source ../pupisto.kernel/pupisto.kernel.sh --source # Now call the function: download_patch_and_compile_kernel $KERNEL_VERSION $TWDIR # Move the whole directory to the good place (../pupisto.kernel/) # in order to potentially share it among other filesystem building: BUILT_DIR=_build.linux-${KERNEL_VERSION}.$(date +%Y-%m-%d.%H\h%M).$RANDOM echo "Moving \`$TWDIR/linux-$KERNEL_VERSION' -> \`../pupisto.kernel/$BUILT_DIR'" mv $TWDIR/linux-$KERNEL_VERSION ../pupisto.kernel/$BUILT_DIR ln -s ../../pupisto.kernel/$BUILT_DIR $TWDIR/linux-$KERNEL_VERSION fi fi # ============================================================= # GREETINGS # ============================================================= # Store the log file into the output directory: make_a_human_readable_log_into_working_directory [[ -f $CUSTOM_PACKAGES_NO ]] && mv $CUSTOM_PACKAGES_NO $TWDIR/ [[ -f $CUSTOM_PACKAGES_YES ]] && mv $CUSTOM_PACKAGES_YES $TWDIR/ echo "---" ls -ld $TWDIR echo "---" echo "Pay attention to move (or copy with option \`-a') the filesystem in order to preserve the MTIME." echo "If something goes wrong installing your filesystem, you can restore the correct" echo "MTIME with the following command:" echo "sudo touch -d \$(date -d '@$MTIME') $FS_NAME" echo echo "Success." marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/0000700000175000017500000000000012167200764026301 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/dhcpd/0000700000175000017500000000000012167200764027363 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/dhcpd/dhcp-server0000700000175000017500000000205112167200764031531 0ustar lucaslucas#!/bin/sh # # $Id: dhcp3-server.init.d,v 1.4 2003/07/13 19:12:41 mdz Exp $ # # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="eth0" # Configuration file: CONFIG_FILE="/etc/dhcp/dhcpd.conf" function on_error { echo "Error" echo "Suggestion: launch yourself \`dhcpd -cf $CONFIG_FILE' for debugging." } set -e trap on_error ERR test -f /usr/sbin/dhcpd || exit 0 case "$1" in start) echo -n "Starting DHCP server: " test -d /var/lib/dhcp/ || mkdir -p /var/lib/dhcp/ test -f /var/lib/dhcp/dhcpd.leases || touch /var/lib/dhcp/dhcpd.leases start-stop-daemon -S -x /usr/sbin/dhcpd -- -cf $CONFIG_FILE -q $INTERFACES echo "Ok." ;; stop) echo -n "Stopping DHCP server: dhcpd3" start-stop-daemon -K -x /usr/sbin/dhcpd || true echo "Ok." ;; restart | force-reload) $0 stop sleep 2 $0 start if [ "$?" != "0" ]; then exit 1 fi ;; *) echo "Usage: /etc/init.d/dhcp-server {start|stop|restart|force-reload}" exit 1 esac exit 0 marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/net-tools.patch.README0000600000175000017500000000223412167200764032205 0ustar lucaslucasAuthor: Stefan Meißner http://lists.busybox.net/pipermail/buildroot/2012-April/052591.html Modified by Marionnet team in order to get a up-to-date debian patch of version 1.60, and also modified at line 55 as suggested by the Buildroot build system itself: $(eval $(call GENTARGETS)) ==> $(eval $(generic-package)) More formally, the patch of the patch is the following: --- net-tools.patch.orig 2013-05-07 12:26:35.000000000 +0200 +++ net-tools.patch.modified 2013-05-07 12:20:50.000000000 +0200 @@ -164,8 +164,8 @@ +############################################################# +NET_TOOLS_VERSION = 1.60 +NET_TOOLS_SOURCE = net-tools_$(NET_TOOLS_VERSION).orig.tar.gz -+NET_TOOLS_PATCH = net-tools_$(NET_TOOLS_VERSION)-24.1.diff.gz +NET_TOOLS_SITE = $(BR2_DEBIAN_MIRROR)/debian/pool/main/n/net-tools ++NET_TOOLS_PATCH = $(shell wget -q -O - $(NET_TOOLS_SITE) | grep -o '[>]net-tools_$(NET_TOOLS_VERSION).*[.]diff[.]gz' | sort | tail -n 1 | cut -c2-) + +# Override Busybox implementations if Busybox is enabled. +ifeq ($(BR2_PACKAGE_BUSYBOX),y) @@ -211,4 +211,4 @@ + $(MAKE) -C $(@D) clean +endef + -+$(eval $(call GENTARGETS)) ++$(eval $(generic-package)) marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/zgrep_zdiff_zless0000700000175000017500000000536412167200764031770 0ustar lucaslucas#!/bin/bash # This file is part of Marionnet # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Poor-man's (and quite ugly) versions of zgrep zegrep zfgrep zless zdiff zcmp zhead ztail. # Limitations: options with argument(s) are not supported (for instance diff -C N) except # when the argument doesn't correspond to an existing file. # Dependencies: zcat (or cat & gunzip), mktemp, rm # [OPTION].. PATTERN [FILE].. function grep_like_call { local PROGRAM="$1"; shift; local OPTIONS while [[ "-${1#-}" = "${1}" ]]; do OPTIONS+="${1} "; shift; done local PATTERN="$1"; shift; local ZCAT if ZCAT=$(type -P zcat); then $ZCAT "$@" | $PROGRAM $OPTIONS "$PATTERN" else cat "$@" | gunzip -c | $PROGRAM $OPTIONS "$PATTERN" fi } # [OPTION].. [FILE].. function less_like_call { local PROGRAM="$1"; shift; local OPTIONS while [[ "-${1#-}" = "${1}" ]]; do OPTIONS+="${1} "; shift; done # Ugly but why not: try to capture arguments that aren't existing files: while [[ ! -e "${1}" ]]; do OPTIONS+="${1} "; shift; done local ZCAT if ZCAT=$(type -P zcat); then $ZCAT "$@" | $PROGRAM $OPTIONS else cat "$@" | gunzip -c | $PROGRAM $OPTIONS fi } # [OPTION].. FILE1 FILE2 function diff_like_call { local PROGRAM="$1"; shift; local OPTIONS while [[ "-${1#-}" = "${1}" ]]; do OPTIONS+="${1} "; shift; done # Ugly but why not: try to capture arguments that aren't existing files: while [[ ! -e "${1}" ]]; do OPTIONS+="${1} "; shift; done [[ $# -eq 2 ]] || return 1 local FILE1="$1"; local FILE2="$2"; local TMPFILE1=$(mktemp /tmp/$(basename "$FILE1").XXXXXX) local TMPFILE2=$(mktemp /tmp/$(basename "$FILE2").XXXXXX) local ZCAT if ZCAT=$(type -P zcat); then $ZCAT "$FILE1" > "$TMPFILE1" $ZCAT "$FILE2" > "$TMPFILE2" else cat "$FILE1" | gunzip -c > "$TMPFILE1" cat "$FILE2" | gunzip -c > "$TMPFILE2" fi $PROGRAM "$TMPFILE1" "$TMPFILE2" rm -f "$TMPFILE1" "$TMPFILE2" } # Main PROGRAM=$(basename $0) case $PROGRAM in zgrep|zegrep|zfgrep) grep_like_call ${PROGRAM#z} "$@";; zless|zhead|ztail) less_like_call ${PROGRAM#z} "$@";; zdiff|zcmp) diff_like_call ${PROGRAM#z} "$@";; esac marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/groups0000700000175000017500000000034612167200764027551 0ustar lucaslucas#!/bin/bash # Simple wrapper for `id -Gn' # J.V. Loddo, for the Marionnet project. GPL. # Note that we cannot change the name of the executable (exec -a groups) # because `id' is itself a wrapper to `busybox': exec id -Gn "$@" marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/radvd/0000700000175000017500000000000012167200764027401 5ustar lucaslucas././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/radvd/radvd.conf.example.debianmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/radvd/radvd.conf.examp0000600000175000017500000000011712167200764032462 0ustar lucaslucasinterface eth0 { AdvSendAdvert on; prefix 2001:db8::/32 { }; }; ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/radvd/radvd.conf.examplemarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/radvd/radvd.conf.examp0000600000175000017500000000646712167200764032500 0ustar lucaslucas# # NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE # NOTE NOTE # NOTE This is an EXAMPLE, which serves only to demonstrate the NOTE # NOTE syntax of radvd.conf, and is not meant to be used for a NOTE # NOTE real radvd configuration. NOTE # NOTE NOTE # NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE # interface eth0 { AdvSendAdvert on; # This may be needed on some interfaces which are not active when # radvd starts, but become available later on; see man page for details. # IgnoreIfMissing on; # # These settings cause advertisements to be sent every 3-10 seconds. This # range is good for 6to4 with a dynamic IPv4 address, but can be greatly # increased when not using 6to4 prefixes. # MinRtrAdvInterval 3; MaxRtrAdvInterval 10; # # You can use AdvDefaultPreference setting to advertise the preference of # the router for the purposes of default router determination. # NOTE: This feature is still being specified and is not widely supported! # AdvDefaultPreference low; # # Disable Mobile IPv6 support # AdvHomeAgentFlag off; # # example of a standard prefix # prefix 2001:db8:1:0::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr off; }; # # example of a 6to4 prefix # # Note that the first 48 bits are specified here as zeros. These will be # replaced with the appropriate 6to4 address when radvd starts or is # reconfigured. Be sure that the SLA ID (1234 in this case) is specified # here! # prefix 0:0:0:1234::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr off; # # This setting causes radvd to replace the first 48 bits of the prefix # with the 6to4 address generated from the specified interface. For example, # if the address of ppp0 is 192.0.2.25 when radvd configures itself, this # prefix will be advertised as 2002:C000:0219:1234::/64. # # If ppp0 is not available at configuration time, this prefix will not be # advertised, but other prefixes listed in the configuration will be # advertised as usual. # # When using the Base6to4Interface option, make sure radvd receives a # SIGHUP every time the ppp0 interface goes up, down, or is assigned a # new IPv4 address. The SIGHUP will cause radvd to recognize that the # ppp0 interface has changed and will adjust the advertisements # accordingly. # Base6to4Interface ppp0; # # If the IP address of ppp0 is assigned dynamically, be sure to set the # lifetimes for this prefix to be small. Otherwise, hosts on your network # may continue to use a prefix that no longer corresponds to the address # on ppp0! # AdvPreferredLifetime 120; AdvValidLifetime 300; }; # # example of a more specific route # NOTE: This feature is not very widely supported! You may also need to # enable it manually (e.g. on Linux, change the value of # sysctl accept_ra_rt_info_max_plen to 48 or 64) # route 2001:db0:fff::/48 { AdvRoutePreference high; AdvRouteLifetime 3600; }; # # RDNSS # NOTE: This feature is not very widely implemented. # RDNSS 2001:db8::1 2001:db8::2 { AdvRDNSSLifetime 30; }; # # DNS Search Lists # DNSSL branch.example.com example.com { AdvDNSSLLifetime 30; }; }; marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/bashrc0000777000175000017500000000000012167200764032437 2../../guest/bashrcustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/0000700000175000017500000000000012167200764027546 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/zebra.conf0000600000175000017500000000014512167200764031522 0ustar lucaslucas! ! Zebra configuration file ! hostname Router password zebra enable password zebra ! log stdout ! ! marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/isisd.conf0000600000175000017500000000010212167200764031523 0ustar lucaslucashostname Router password zebra enable password zebra ! log stdout marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/bgpd.conf0000600000175000017500000000010212167200764031324 0ustar lucaslucashostname Router password zebra enable password zebra ! log stdout marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/README.ports0000600000175000017500000000050612167200764031577 0ustar lucaslucaszebrasrv 2600/tcp # zebra service zebra 2601/tcp # zebra vty ripd 2602/tcp # RIPd vty ripngd 2603/tcp # RIPngd vty ospfd 2604/tcp # OSPFd vty bgpd 2605/tcp # BGPd vty ospf6d 2606/tcp # OSPF6d vty ospfapi 2607/tcp # ospfapi isisd 2608/tcp # ISISd vty marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/quagga0000700000175000017500000000425112167200764030743 0ustar lucaslucas#!/bin/bash # This file is part of Marionnet, a virtual network laboratory # Copyright (C) 2007 2013 Jean-Vincent Loddo # Copyright (C) 2007 2013 Université Paris 13 # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Simple starting/stopping script for Buildroot's quagga installation function start { for i in /etc/quagga/*.conf; do j=$(basename $i); p=${j%.conf}; which &>/dev/null $p && eval $p -d -f $i; done } function stop { for i in /etc/quagga/*.conf; do j=$(basename $i); p=${j%.conf}; which &>/dev/null $p && eval killall $p; done } function get_port { case $1 in zebra) echo 2601;; ripd) echo 2602;; ripngd) echo 2603;; ospfd) echo 2604;; bgpd) echo 2605;; ospf6d) echo 2606;; ospfapi) echo 2607;; isisd) echo 2608;; esac } function status { TMPFILE=$(mktemp) netstat -a -t >$TMPFILE for i in /etc/quagga/*.conf; do j=$(basename $i); p=${j%.conf}; if which &>/dev/null $p; then port=$(get_port $p) IPv4=$(if [[ -n $port ]] && grep -q "0.0.0.0:$port" $TMPFILE; then echo "IPv4"; fi) IPv6=$(if [[ -n $port ]] && grep -q ":::$port" $TMPFILE; then echo "IPv6"; fi) case "${IPv4}-${IPv6}" in IPv4-IPv6) echo -e "$p\r\t running on port $port IPv4/IPv6";; IPv4-) echo -e "$p\r\t running on port $port IPv4 only";; -IPv6) echo -e "$p\r\t running on port $port IPv6 only";; -) echo -e "$p\r\t NOT running";; esac fi done rm $TMPFILE } case "$1" in start) start ;; stop) stop ;; status) status ;; *) echo "Usage: $0 {start|stop|status}" exit 1 ;; esac marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/ripngd.conf0000600000175000017500000000010212167200764031673 0ustar lucaslucashostname Router password zebra enable password zebra ! log stdout marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/ospf6d.conf0000600000175000017500000000010212167200764031611 0ustar lucaslucashostname Router password zebra enable password zebra ! log stdout marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/ospfd.conf0000600000175000017500000000010212167200764031523 0ustar lucaslucashostname Router password zebra enable password zebra ! log stdout marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/zebrasrv.conf0000600000175000017500000000010212167200764032246 0ustar lucaslucashostname Router password zebra enable password zebra ! log stdout marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/ripd.conf0000600000175000017500000000010212167200764031346 0ustar lucaslucashostname Router password zebra enable password zebra ! log stdout marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/quagga/LOCATIONS0000600000175000017500000000012312167200764031022 0ustar lucaslucas/etc/quagga/*.conf /etc/quagga/daemons /etc/quagga/README.ports /etc/init.d/quagga marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/S90marionnet-relay0000777000175000017500000000000012167200764036443 2../../guest/marionnet-relayustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/net-tools.patch0000600000175000017500000001304412167200764031252 0ustar lucaslucasdiff --git a/package/Config.in b/package/Config.in index e1629c8..35945a6 100644 --- a/package/Config.in +++ b/package/Config.in @@ -479,6 +479,9 @@ source "package/netkitbase/Config.in" source "package/netkittelnet/Config.in" endif source "package/netplug/Config.in" +if BR2_PACKAGE_BUSYBOX_SHOW_OTHERS +source "package/net-tools/Config.in" +endif source "package/netsnmp/Config.in" source "package/netstat-nat/Config.in" source "package/network-manager/Config.in" diff --git a/package/net-tools/Config.in b/package/net-tools/Config.in new file mode 100644 index 0000000..6527831 --- /dev/null +++ b/package/net-tools/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_NET_TOOLS + bool "net-tools" + help + This package includes the important tools for controlling the network subsystem + of the Linux kernel. This includes arp, ifconfig, netstat, rarp, nameif and route. + Additionally, this package contains utilities relating to particular network + hardware types (plipconfig, slattach, mii-tool) and advanced aspects + of IP configuration (iptunnel, ipmaddr). diff --git a/package/net-tools/net-tools.config.h b/package/net-tools/net-tools.config.h new file mode 100644 index 0000000..2afe5ec --- /dev/null +++ b/package/net-tools/net-tools.config.h @@ -0,0 +1,76 @@ +/* +* config.h Automatically generated configuration includefile +* +* NET-TOOLS A collection of programs that form the base set of the +* NET-3 Networking Distribution for the LINUX operating +* system. +* +* DO NOT EDIT DIRECTLY +* +*/ + +/* + * + * Internationalization + * + * The net-tools package has currently been translated to French, + * German and Brazilian Portugese. Other translations are, of + * course, welcome. Answer `n' here if you have no support for + * internationalization on your system. + * + */ +#define I18N 0 + +/* + * + * Protocol Families. + * + */ +#define HAVE_AFUNIX 1 +#define HAVE_AFINET 1 +#define HAVE_AFINET6 1 +#define HAVE_AFIPX 1 +#define HAVE_AFATALK 1 +#define HAVE_AFAX25 1 +#define HAVE_AFNETROM 1 +#define HAVE_AFROSE 1 +#define HAVE_AFX25 1 +#define HAVE_AFECONET 1 +#define HAVE_AFDECnet 0 +#define HAVE_AFASH 1 + +/* + * + * Device Hardware types. + * + */ +#define HAVE_HWETHER 1 +#define HAVE_HWARC 1 +#define HAVE_HWSLIP 1 +#define HAVE_HWPPP 1 +#define HAVE_HWTUNNEL 1 +#define HAVE_HWSTRIP 1 +#define HAVE_HWTR 1 +#define HAVE_HWAX25 1 +#define HAVE_HWROSE 1 +#define HAVE_HWNETROM 1 +#define HAVE_HWX25 1 +#define HAVE_HWFR 1 +#define HAVE_HWSIT 1 +#define HAVE_HWFDDI 1 +#define HAVE_HWHIPPI 1 +#define HAVE_HWASH 1 +#define HAVE_HWHDLCLAPB 1 +#define HAVE_HWIRDA 1 +#define HAVE_HWEC 1 +#define HAVE_HWEUI64 1 +#define HAVE_HWIB 1 + +/* + * + * Other Features. + * + */ +#define HAVE_FW_MASQUERADE 1 +#define HAVE_IP_TOOLS 1 +#define HAVE_MII 1 diff --git a/package/net-tools/net-tools.config.make b/package/net-tools/net-tools.config.make new file mode 100644 index 0000000..8e70f18 --- /dev/null +++ b/package/net-tools/net-tools.config.make @@ -0,0 +1,37 @@ +# I18N=0 +HAVE_AFUNIX=1 +HAVE_AFINET=1 +HAVE_AFINET6=1 +HAVE_AFIPX=1 +HAVE_AFATALK=1 +HAVE_AFAX25=1 +HAVE_AFNETROM=1 +HAVE_AFROSE=1 +HAVE_AFX25=1 +HAVE_AFECONET=1 +# HAVE_AFDECnet=0 +HAVE_AFASH=1 +HAVE_HWETHER=1 +HAVE_HWARC=1 +HAVE_HWSLIP=1 +HAVE_HWPPP=1 +HAVE_HWTUNNEL=1 +HAVE_HWSTRIP=1 +HAVE_HWTR=1 +HAVE_HWAX25=1 +HAVE_HWROSE=1 +HAVE_HWNETROM=1 +HAVE_HWX25=1 +HAVE_HWFR=1 +HAVE_HWSIT=1 +HAVE_HWFDDI=1 +HAVE_HWHIPPI=1 +HAVE_HWASH=1 +HAVE_HWHDLCLAPB=1 +HAVE_HWIRDA=1 +HAVE_HWEC=1 +HAVE_HWEUI64=1 +HAVE_HWIB=1 +HAVE_FW_MASQUERADE=1 +HAVE_IP_TOOLS=1 +HAVE_MII=1 diff --git a/package/net-tools/net-tools.mk b/package/net-tools/net-tools.mk new file mode 100644 index 0000000..41fc6d8 --- /dev/null +++ b/package/net-tools/net-tools.mk @@ -0,0 +1,55 @@ +############################################################# +# +# net-tools +# +############################################################# +NET_TOOLS_VERSION = 1.60 +NET_TOOLS_SOURCE = net-tools_$(NET_TOOLS_VERSION).orig.tar.gz +NET_TOOLS_SITE = $(BR2_DEBIAN_MIRROR)/debian/pool/main/n/net-tools +NET_TOOLS_PATCH = $(shell wget -q -O - $(NET_TOOLS_SITE) | grep -o '[>]net-tools_$(NET_TOOLS_VERSION).*[.]diff[.]gz' | sort | tail -n 1 | cut -c2-) + +# Override Busybox implementations if Busybox is enabled. +ifeq ($(BR2_PACKAGE_BUSYBOX),y) + NET_TOOLS_DEPENDENCIES = busybox +endif + +define NET_TOOLS_DEBIAN_PATCHES + if [ -d $(@D)/debian/patches ]; then \ + support/scripts/apply-patches.sh $(@D) $(@D)/debian/patches \*.patch; \ + fi +endef + +NET_TOOLS_POST_PATCH_HOOKS = NET_TOOLS_DEBIAN_PATCHES + +define NET_TOOLS_BUILD_CMDS + cp package/net-tools/net-tools.config.h $(@D)/config.h + cp package/net-tools/net-tools.config.make $(@D)/config.make + + $(MAKE) -j 1 $(TARGET_CONFIGURE_OPTS) \ + CFLAGS+="-I $(@D)/include/ -I $(@D)/ -I $(@D)/lib/" \ + LDFLAGS+="-L$(@D)/lib/" \ + -C $(@D)/ + +endef + +define NET_TOOLS_INSTALL_TARGET_CMDS + for x in route ifconfig ipmaddr iptunnel mii-tool nameif plipconfig rarp route slattach; do \ + install -D -m 0755 $(@D)/$$x $(TARGET_DIR)/sbin/$$x || exit 1; \ + done + install -D -m 0755 $(@D)/arp $(TARGET_DIR)/usr/sbin/arp || exit 1; + install -D -m 0755 $(@D)/netstat $(TARGET_DIR)/bin/netstat || exit 1; +endef + +define NET_TOOLS_UNINSTALL_TARGET_CMDS + for x in route ifconfig ipmaddr iptunnel mii-tool nameif plipconfig rarp route slattach; do \ + rm -f $(TARGET_DIR)/sbin/$$x || exit 1; \ + done + rm -f $(TARGET_DIR)/usr/sbin/arp || exit 1; + rm -f $(TARGET_DIR)/bin/netstat || exit 1; +endef + +define NET_TOOLS_CLEAN_CMDS + $(MAKE) -C $(@D) clean +endef + +$(eval $(generic-package)) marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/ifconfig0000700000175000017500000000446612167200764030025 0ustar lucaslucas#!/bin/bash # This file is part of Marionnet, a virtual network laboratory # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Université Paris 13 # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Simple wrapper for Busybox's `ifconfig' allowing CIDR syntax as for instance: # # ifconfig eth0 192.168.0.1/24 # # The previous command will be expanded by this wrapper into: # ifconfig.busybox eth0 192.168.0.1 netmask 255.255.255.0 function allocate_t { t_1="128.0.0.0"; t_2="192.0.0.0"; t_3="224.0.0.0"; t_4="240.0.0.0"; t_5="248.0.0.0"; t_6="252.0.0.0"; t_7="254.0.0.0"; t_8="255.0.0.0"; t_9="255.128.0.0"; t_10="255.192.0.0"; t_11="255.224.0.0"; t_12="255.240.0.0"; t_13="255.248.0.0"; t_14="255.252.0.0"; t_15="255.254.0.0"; t_16="255.255.0.0"; t_17="255.255.128.0"; t_18="255.255.192.0"; t_19="255.255.224.0"; t_20="255.255.240.0"; t_21="255.255.248.0"; t_22="255.255.252.0"; t_23="255.255.254.0"; t_24="255.255.255.0"; t_25="255.255.255.128"; t_26="255.255.255.192"; t_27="255.255.255.224"; t_28="255.255.255.240"; t_29="255.255.255.248"; t_30="255.255.255.252"; t_31="255.255.255.254"; t_32="255.255.255.255"; ALLOCATED=y } # Note that the busybox version if a limited version of awk (here `match' is used without a third parameter): awk_program='($1>=0 && $1<256 && $2>=0 && $2<256 && $3>=0 && $3<256 && (match($4,/^[0-9]*\/[0-9]*$/)>0)) && (split($4,g,"/") && g[1]>=0 && g[1]<256 && g[2]>0 && g[2]<=32) {print $1,$2,$3,g[1],g[2]; exit 1;} {exit 0;}' for A in "$@"; do if B=$(awk <<<"$A" -F. "$awk_program"); then ARGS+=" '$A'"; else [[ -n $ALLOCATED ]] || allocate_t read <<<"$B" i1 i2 i3 i4 cidr eval netmask=\$t_$cidr N=" $i1.$i2.$i3.$i4 netmask $netmask" ARGS+=" $N"; fi done eval exec -a ifconfig $0.busybox $ARGS marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/ssh0000777000175000017500000000000012167200764031325 2../../guest/sshustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/ethghost/0000700000175000017500000000000012167200764030126 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/ethghost/ethghost.mk0000600000175000017500000000305612167200764032312 0ustar lucaslucas############################## # Ghostification (userland) # ############################## # # TARGET_CC is the C compiler used for cross compilation # TARGET_LD same than TARGET_CC # @D is the current directoryin which package has been uncompress # STAGING_DIR = By default, the value is DESTDIR=$(STAGING_DIR) install ETHGHOST_VERSION = 2.0 ETHGHOST_SOURCE = ethghost-$(ETHGHOST_VERSION).tar.gz ETHGHOST_SITE = http://www.marionnet.org/downloads/ethghost/$(ETHGHOST_SOURCE) ETHGHOST_INSTALL_STAGING = YES define ETHGHOST_BUILD_CMDS $(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all endef define ETHGHOST_INSTALL_STAGING_CMDS $(MAKE) DESTDIR=$(STAGING_DIR) -C $(@D) install endef define ETHGHOST_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0755 $(@D)/ethghost \ $(TARGET_DIR)/bin/ethghost endef # +============+=====+=======+=====+==========+=============+=========+=======+===========+ # | username | uid | group | gid | password | home | shell |groups | comment | # +============+=====+=======+=====+==========+=============+=========+=======+===========+ # Non funzionano i seguenti comandi: # student -1 users 100 a8I77tmxmjkXw /home/student /bin/bash sudo User # student 1001 users 100 a8I77tmxmjkXw /home/student /bin/bash - Marionnet user # Errore nello script `support/scripts/mkusers' # awk -F: -v group=sudo '$1 == group { printf( "%d\n", $3 ); }' $BUILDROOT/output/target/etc/group # recupera '1001\n27' define ETHGHOST_USERS student -1 users 100 a8I77tmxmjkXw /home/student /bin/bash - Marionnet user endef $(eval $(generic-package)) marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/ethghost/Config.in0000600000175000017500000000065312167200764031671 0ustar lucaslucasconfig BR2_PACKAGE_ETHGHOST bool "ethghost" help Hide or show ethernet interfaces. This utility allows the user to take advantages of the system calls introduced by the Marionnet's developers in order to "ghostify" (or "unghostify") ethernet interfaces. This feature is used in Marionnet for pedagogical reasons in order to hide the interface eth42 and the related X11 traffic. http://www.marionnet.org marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/pupisto.buildroot.sh.files/LOCATIONS0000600000175000017500000000005612167200764027562 0ustar lucaslucas/etc/init.d/S90marionnet-relay /sbin/ifconfig marionnet-0.90.6+bzr434.orig/uml/pupisto.buildroot/README.buildroot0000600000175000017500000000050212167200764023743 0ustar lucaslucasThe compilation of buildroot may fail, depending on the git version. In this case, you can revert to a tested running version (May-June 2013) getting a tarball from ous site: wget http://www.marionnet.org/downloads/buildroot/buildroot.2013-05.tar.xz rm -rf _build.buildroot tar xJf buildroot.2013-05.tar.xz make guignol marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/0000700000175000017500000000000012167200764020301 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/Makefile0000600000175000017500000000621012167200764021742 0ustar lucaslucas# This file is part of marionnet # Copyright (C) 2013 Jean-Vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ============================================================= # Building `guignol' # ============================================================= KERNEL_VERSION=3.2.48 wheezy: dependencies ./pupisto.debian.sh --kernel $(KERNEL_VERSION) -t ext2 -r wheezy wheezy-no-kernel: dependencies ./pupisto.debian.sh --kernel $(KERNEL_VERSION) -t ext2 --no-kernel -r wheezy wheezy-custom: dependencies @echo "./pupisto.debian.sh --kernel $(KERNEL_VERSION) -t ext2 -r wheezy --custom" @echo "NOT IMPLEMENTED YET" wheezy-edit: $(EDITOR) pupisto.debian.sh.files/package_catalog/package_catalog.wheezy.selection squeeze: dependencies @echo "./pupisto.debian.sh --kernel $(KERNEL_VERSION) -t btrfs -r squeeze" @echo "NOT IMPLEMENTED YET" squeeze-no-kernel: dependencies @echo "./pupisto.debian.sh --kernel $(KERNEL_VERSION) -t btrfs --no-kernel -r squeeze" @echo "NOT IMPLEMENTED YET" squeeze-edit: @echo $(EDITOR) pupisto.debian.sh.files/package_catalog/package_catalog.wheezy.selection @echo "NOT IMPLEMENTED YET" # ============================================================= # Dependencies # ============================================================= # REQUIRED_PACKAGES=debootstrap fakeroot fakechroot REQUIRED_PACKAGES=debootstrap dependencies: @echo "Required packages: $(REQUIRED_PACKAGES)" @which dpkg 1>/dev/null || { echo "Not a Debian system (oh my god!); please install packages corresponding to: $(REQUIRED_PACKAGES)"; exit 1; } @dpkg 1>/dev/null -l $(REQUIRED_PACKAGES) || \ if which aptitude; then \ sudo aptitude install -q -q -q -y $(REQUIRED_PACKAGES); \ elif which apt-get; then \ sudo apt-get install -q -q -q -y $(REQUIRED_PACKAGES); \ else \ exit 1; \ fi @echo Ok. # ============================================================= # clean & help # ============================================================= clean: sudo rm -rf _build.* help: @echo "Usage: make wheezy" @echo " or: make wheezy-custom # NOT IMPLEMENTED YET" @echo " or: make squeeze # NOT IMPLEMENTED YET" @echo " or: make squeeze-custom # NOT IMPLEMENTED YET" @echo " or: make dependencies" @echo " or: make clean" @echo " or: make help-pupisto" @echo " or: make help" help-pupisto: ./pupisto.debian.sh --help edit: $(EDITOR) *.sh pupisto.debian.sh.files/package_catalog/package_catalog.*.selection ../pupisto.common/*.sh marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/0000700000175000017500000000000012167200764024737 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/dev.tar.gz0000600000175000017500000000534112167200764026651 0ustar lucaslucasGQnI(zWei JQ$DҐ鷋FnEķb_h` HpfOdDiqSR:|~g1Dw!Uow竫z>_?X>2 ծjD??&dXo'ɓP`P;?NK?JVJWg '5cu}5 ~u H^? Vߡus6 +oŏsVĂ&J(raЫ8]}I_P!Oo9翼&L7꿦^O?V?M  O/o:ϋ~Rov?YF3o1t???V?bCD_/s!qߗϡ1cW#7kk3NF+p_ߣoGGhߨ hQCK-u{ 1PWk?߈_?_igH6?b??Z?ɻ_҅D/"'=ߙ}=A78OoB[5rH7?VOFhoCwmSAn]?.?@w-gW;9/8GjhOA+d/ S/C}ݤ_%8jWOcEXߺT'`^#(r j׫3|lYh?f?|Gz^>??@X AELg OBۉoZXt=˵ _=-Pb3h? _0*䄾zlWN@-?;4b(4O5߹_,%_>Y)_?475y^eNn[u{iϡ/j/~jI=>C>?>?[1甑 ? =a?OъZwb{ms{?Io-\?_I+cd?TicT{ʆn3'*(? !Ǿ]/'o;1#<>jnmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/0000700000175000017500000000000012167200764030024 5ustar lucaslucas././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_catalog.wheezy.GENERATEDmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_cata0000600000175000017500000011425012167200764032337 0ustar lucaslucas9base PROVIDES: bc dc ed strings DESCRIPTION: Plan 9 userland tools acl PROVIDES: chacl getfacl setfacl DESCRIPTION: Access control list utilities acpid PROVIDES: acpid acpi_listen DESCRIPTION: Advanced Configuration and Power Interface event daemon adjtimex PROVIDES: adjtimex DESCRIPTION: kernel time variables configuration utility adns-tools PROVIDES: adnsheloex adnshost adnslogres adnsresfilter DESCRIPTION: Asynchronous-capable DNS client library and utilities apache2.2-common PROVIDES: a2dismod a2dissite a2enmod a2ensite apache2ctl apachectl DESCRIPTION: Apache HTTP Server common files apache2-dbg PROVIDES: ab checkgid htcacheclean htdbm htdigest htpasswd httxt2dbm logresolve rotatelogs DESCRIPTION: Apache debugging symbols apache2-mpm-event PROVIDES: apache2 DESCRIPTION: Apache HTTP Server - event driven model apache2-utils PROVIDES: check_forensic dbmmanage split-logfile DESCRIPTION: utility programs for webservers aria2 PROVIDES: aria2c DESCRIPTION: High speed download utility arping PROVIDES: arping DESCRIPTION: sends IP and/or ARP pings (to the MAC address) ash PROVIDES: ash DESCRIPTION: compatibility package for dash aspell PROVIDES: aspell aspell-import precat preunzip prezip prezip-bin run-with-aspell word-list-compress DESCRIPTION: GNU Aspell spell-checker atftpd PROVIDES: in.tftpd DESCRIPTION: advanced TFTP server attr PROVIDES: attr getfattr setfattr DESCRIPTION: Utilities for manipulating filesystem extended attributes autoconf PROVIDES: autoconf autoheader autom4te autoreconf autoscan autoupdate ifnames DESCRIPTION: automatic configure script builder autopoint PROVIDES: autopoint DESCRIPTION: The autopoint program from GNU gettext avahi-autoipd PROVIDES: avahi-autoipd DESCRIPTION: Avahi IPv4LL network address configuration daemon avahi-daemon PROVIDES: avahi-daemon DESCRIPTION: Avahi mDNS/DNS-SD daemon avahi-utils PROVIDES: avahi-browse avahi-browse-domains avahi-publish avahi-publish-address avahi-publish-service avahi-resolve avahi-resolve-address avahi-resolve-host-name avahi-set-host-name DESCRIPTION: Avahi browsing, publishing and discovery utilities babeld PROVIDES: babeld DESCRIPTION: loop-free distance-vector routing protocol beep PROVIDES: beep DESCRIPTION: advanced pc-speaker beeper bind9 PROVIDES: dnssec-dsfromkey dnssec-keyfromlabel named DESCRIPTION: Internet Domain Name Server bind9-host PROVIDES: host DESCRIPTION: Version of 'host' bundled with BIND 9.X bind9utils PROVIDES: dnssec-keygen dnssec-signzone named-checkconf named-checkzone named-compilezone rndc rndc-confgen DESCRIPTION: Utilities for BIND binutils PROVIDES: addr2line ar as c++filt gprof ld nm objcopy objdump ranlib readelf size strip DESCRIPTION: GNU assembler, linker and binary utilities boinc-dbg PROVIDES: db_dump DESCRIPTION: debugging symbols for BOINC binaries bootchart PROVIDES: bootchartd DESCRIPTION: Boot process performance analyser bootlogd PROVIDES: bootlogd DESCRIPTION: daemon to log boot messages bridge-utils PROVIDES: brctl DESCRIPTION: Utilities for configuring the Linux Ethernet bridge busybox PROVIDES: busybox DESCRIPTION: Tiny utilities for small and embedded systems busybox-syslogd PROVIDES: klogd logread syslogd DESCRIPTION: Provides syslogd and klogd using busybox bzip2 PROVIDES: bunzip2 bzcat bzcmp bzdiff bzegrep bzexe bzfgrep bzgrep bzip2 bzip2recover bzless bzmore DESCRIPTION: high-quality block-sorting file compressor - utilities cdbs PROVIDES: cdbs-edit-patch DESCRIPTION: common build system for Debian packages chkconfig PROVIDES: chkconfig DESCRIPTION: system tool to enable or disable system services cifs-utils PROVIDES: mount.cifs DESCRIPTION: Common Internet File System utilities citadel-mta PROVIDES: sendmail DESCRIPTION: complete and feature-rich groupware server (mail transport agent) consolekit PROVIDES: ck-history ck-launch-session ck-list-sessions ck-log-system-restart ck-log-system-start ck-log-system-stop console-kit-daemon DESCRIPTION: framework for defining and tracking users, sessions and seats console-tools PROVIDES: chvt deallocvt dumpkeys fgconsole getkeycodes kbd_mode kbdrate loadkeys openvt psfaddtable psfgettable psfstriptable setkeycodes setleds setlogcons setmetamode showkey unicode_start unicode_stop DESCRIPTION: Linux console and font utilities conspy PROVIDES: conspy DESCRIPTION: Remote control of Linux virtual consoles courier-authdaemon PROVIDES: authdaemond DESCRIPTION: Courier authentication daemon courier-authlib PROVIDES: authenumerate authpasswd authtest courierlogger DESCRIPTION: Courier authentication library courier-authlib-dev PROVIDES: courierauthconfig DESCRIPTION: Development libraries for the Courier authentication library courier-authlib-userdb PROVIDES: makeuserdb pw2userdb userdb userdbpw userdb-test-cram-md5 DESCRIPTION: userdb support for the Courier authentication library courier-base PROVIDES: courier-config couriertcpd maildiracl maildirkw sharedindexinstall sharedindexsplit testmxlookup DESCRIPTION: Courier mail server - base system courier-imap PROVIDES: imapd DESCRIPTION: Courier mail server - IMAP server courier-ldap PROVIDES: courierldapaliasd DESCRIPTION: Courier mail server - LDAP support courier-maildrop PROVIDES: mailbot maildrop makemime reformail reformime DESCRIPTION: Courier mail server - mail delivery agent courier-mta PROVIDES: mailq newaliases rmail DESCRIPTION: Courier mail server - ESMTP daemon courier-ssl PROVIDES: couriertls DESCRIPTION: Courier mail server - SSL/TLS Support cpp PROVIDES: cpp DESCRIPTION: GNU C preprocessor (cpp) crack PROVIDES: Crack Crack-Reporter DESCRIPTION: Password guessing program cracklib-runtime PROVIDES: cracklib-check cracklib-format cracklib-packer cracklib-unpacker create-cracklib-dict DESCRIPTION: runtime support for password checker library cracklib2 cramfsprogs PROVIDES: cramfsck mkcramfs DESCRIPTION: Tools for CramFs (Compressed ROM File System) cryptsetup-bin PROVIDES: cryptsetup DESCRIPTION: disk encryption support - command line tools cups-bsd PROVIDES: lpq lpr DESCRIPTION: Common UNIX Printing System(tm) - BSD commands curlftpfs PROVIDES: curlftpfs DESCRIPTION: filesystem to access FTP hosts based on FUSE and cURL daemontools PROVIDES: envdir envuidgid setuidgid softlimit DESCRIPTION: a collection of tools for managing UNIX services dbus PROVIDES: dbus-cleanup-sockets dbus-daemon dbus-monitor dbus-send dbus-uuidgen DESCRIPTION: simple interprocess messaging system (daemon and utilities) dbus-1-dbg PROVIDES: dbus-launch DESCRIPTION: simple interprocess messaging system (debug symbols) db-util PROVIDES: db_archive db_checkpoint db_deadlock db_hotbackup db_load db_printlog db_recover db_stat db_upgrade db_verify DESCRIPTION: Berkeley Database Utilities debhelper PROVIDES: dh_builddeb dh_clean dh_compress dh_desktop dh_fixperms dh_gconf dh_gencontrol dh_icons dh_install dh_installcatalogs dh_installchangelogs dh_installcron dh_installdeb dh_installdebconf dh_installdirs dh_installdocs dh_installemacsen dh_installexamples dh_installifupdown dh_installinfo dh_installinit dh_installlogcheck dh_installlogrotate dh_installman dh_installmanpages dh_installmenu dh_installmime dh_installmodules dh_installpam dh_installppp dh_installudev dh_installwm dh_installxfonts dh_link dh_listpackages dh_makeshlibs dh_md5sums dh_movefiles dh_perl dh_python dh_scrollkeeper dh_shlibdeps dh_strip dh_suidregister dh_testdir dh_testroot dh_undocumented dh_usrlocal DESCRIPTION: helper programs for debian/rules desktop-file-utils PROVIDES: desktop-file-install desktop-file-validate update-desktop-database DESCRIPTION: Utilities for .desktop files dh-ocaml PROVIDES: dh_ocaml ocaml-md5sums DESCRIPTION: helper tools for maintaining OCaml-related Debian packages dictionaries-common PROVIDES: aspell-autobuildhash ispell-autobuildhash ispell-wrapper remove-default-ispell remove-default-wordlist select-default-ispell select-default-iwrap select-default-wordlist update-default-ispell update-default-wordlist update-dictcommon-aspell DESCRIPTION: Common utilities for spelling dictionary tools dietlibc-dev PROVIDES: dnsd DESCRIPTION: diet libc - a libc optimized for small size dmeventd PROVIDES: dmeventd DESCRIPTION: Linux Kernel Device Mapper event daemon dmsetup PROVIDES: dmsetup DESCRIPTION: Linux Kernel Device Mapper userspace library dnsutils PROVIDES: dig nslookup nsupdate DESCRIPTION: Clients provided with BIND dos2unix PROVIDES: dos2unix unix2dos DESCRIPTION: convert text file line endings between CRLF and LF dosfstools PROVIDES: mkdosfs mkfs.vfat DESCRIPTION: utilities for making and checking MS-DOS FAT filesystems dropbear PROVIDES: dbclient dropbear dropbearkey DESCRIPTION: lightweight SSH2 server and client dselect PROVIDES: dselect DESCRIPTION: Debian package management front-end e2fsck-static PROVIDES: e2fsck.static DESCRIPTION: statically-linked version of the ext2/ext3/ext4 filesystem checker ed PROVIDES: red DESCRIPTION: classic UNIX line editor eglibc-source PROVIDES: locale-gen update-locale validlocale DESCRIPTION: Embedded GNU C Library: sources eject PROVIDES: eject volname DESCRIPTION: ejects CDs and operates CD-Changers under Linux ethtool PROVIDES: ethtool DESCRIPTION: display or change Ethernet device settings exo-utils PROVIDES: exo-csource exo-desktop-item-edit exo-open exo-preferred-applications DESCRIPTION: Utility files for libexo exuberant-ctags PROVIDES: ctags-exuberant DESCRIPTION: build tag file indexes of source code definitions fam PROVIDES: famd DESCRIPTION: File Alteration Monitor fbset PROVIDES: fbset DESCRIPTION: framebuffer device maintenance program fdflush PROVIDES: fdflush DESCRIPTION: Flush out-of-date disk buffers file PROVIDES: file DESCRIPTION: Determines file type using "magic" numbers finger PROVIDES: finger DESCRIPTION: user information lookup program flex PROVIDES: flex++ DESCRIPTION: A fast lexical analyzer generator. fontconfig PROVIDES: fc-cache fc-cat fc-list fc-match fc-query fc-scan DESCRIPTION: generic font configuration library - support binaries fortune-mod PROVIDES: strfile unstr DESCRIPTION: provides fortune cookies on demand ftp PROVIDES: netkit-ftp DESCRIPTION: classical file transfer client fuse PROVIDES: fusermount DESCRIPTION: Filesystem in Userspace fvwm PROVIDES: fvwm2 fvwm-bug FvwmCommand fvwm-config fvwm-convert-2.4 fvwm-convert-2.6 fvwm-menu-desktop fvwm-menu-directory fvwm-menu-headlines fvwm-menu-xlock fvwm-perllib fvwm-root DESCRIPTION: F(?) Virtual Window Manager gawk PROVIDES: gawk igawk pgawk DESCRIPTION: GNU awk, a pattern scanning and processing language gcc PROVIDES: c89-gcc c99-gcc gcc gcov DESCRIPTION: GNU C compiler gcj-4.6-jdk PROVIDES: appletviewer jar jarsigner javac javadoc javah jdb native2ascii rmic serialver DESCRIPTION: gcj and classpath development tools for Java(TM) gcj-4.6-jre-headless PROVIDES: java keytool orbd rmid rmiregistry tnameserv DESCRIPTION: Java runtime environment using GIJ/classpath (headless version) gconf2 PROVIDES: gconf-merge-tree gconf-schemas gconftool-2 update-gconf-defaults DESCRIPTION: GNOME configuration database system (support tools) gdb PROVIDES: gcore gdb gdbtui DESCRIPTION: The GNU Debugger gdbserver PROVIDES: gdbserver DESCRIPTION: The GNU Debugger (remote server) gettext PROVIDES: gettextize msgattrib msgcat msgcmp msgcomm msgconv msgen msgexec msgfilter msgfmt msggrep msginit msgmerge msgunfmt msguniq recode-sr-latin xgettext DESCRIPTION: GNU Internationalization utilities gettext-base PROVIDES: envsubst gettext gettext.sh ngettext DESCRIPTION: GNU Internationalization utilities for the base system ghostscript PROVIDES: dumphint dvipdf eps2eps font2c gsbj gsdj gsdj500 gslj gslp gsnd pdf2dsc pdf2ps pdfopt pf2afm pfbtopfa pphs printafm ps2ascii ps2epsi ps2pdf12 ps2pdf13 ps2pdf14 ps2pdfwr ps2ps ps2ps2 wftopfa DESCRIPTION: interpreter for the PostScript language and for PDF gksu PROVIDES: gksu DESCRIPTION: graphical frontend to su gnome-keyring PROVIDES: gnome-keyring-daemon DESCRIPTION: GNOME keyring services (daemon and tools) gnutls-bin PROVIDES: certtool gnutls-cli gnutls-cli-debug gnutls-serv psktool srptool DESCRIPTION: GNU TLS library - commandline utilities grub-coreboot PROVIDES: grub-install DESCRIPTION: GRand Unified Bootloader, version 2 (Coreboot version) grub-legacy PROVIDES: grub grub-floppy grub-md5-crypt grub-reboot grub-set-default grub-terminfo mbchk mkbimage update-grub DESCRIPTION: GRand Unified Bootloader (Legacy version) gv PROVIDES: gv DESCRIPTION: PostScript and PDF viewer for X hal PROVIDES: hald hal-device hal-disable-polling hal-find-by-capability hal-find-by-property hal-get-property hal-is-caller-locked-out hal-lock hal-set-property lshal umount.hal DESCRIPTION: Hardware Abstraction Layer hardening-wrapper PROVIDES: gcc-4.2 DESCRIPTION: Compiler wrapper to enable security hardening flags hdparm PROVIDES: hdparm DESCRIPTION: tune hard disk parameters for high performance heimdal-clients PROVIDES: kadmin kdestroy kinit klist kpasswd ksu ktutil DESCRIPTION: Heimdal Kerberos - clients heimdal-dev PROVIDES: krb5-config DESCRIPTION: Heimdal Kerberos - development files html2text PROVIDES: html2text DESCRIPTION: advanced HTML to text converter htop PROVIDES: htop DESCRIPTION: interactive processes viewer icedtea-netx PROVIDES: javaws DESCRIPTION: NetX - implementation of the Java Network Launching Protocol (JNLP) iceweasel PROVIDES: firefox DESCRIPTION: Web browser based on Firefox id-utils PROVIDES: lid DESCRIPTION: Fast, high-capacity, identifier database tool ifmetric PROVIDES: ifmetric DESCRIPTION: Set routing metrics for a network interface ifplugd PROVIDES: ifplugd ifplugstatus DESCRIPTION: configuration daemon for ethernet devices ifstat PROVIDES: ifstat DESCRIPTION: InterFace STATistics Monitoring inetutils-ftpd PROVIDES: ftpd DESCRIPTION: File Transfer Protocol server inetutils-telnet PROVIDES: inetutils-telnet DESCRIPTION: telnet client inetutils-telnetd PROVIDES: telnetd DESCRIPTION: telnet server inetutils-tools PROVIDES: inetutils-ifconfig DESCRIPTION: base networking utilities (experimental package) initramfs-tools PROVIDES: mkinitramfs update-initramfs DESCRIPTION: generic modular initramfs generator installation-report PROVIDES: report-hw DESCRIPTION: system installation report ipcalc PROVIDES: ipcalc DESCRIPTION: parameter calculator for IPv4 addresses ipsec-tools PROVIDES: setkey DESCRIPTION: IPsec utilities ipsvd PROVIDES: tcpsvd udpsvd DESCRIPTION: Internet protocol service daemons iputils-clockdiff PROVIDES: clockdiff DESCRIPTION: Measure the time difference between networked computers iputils-tracepath PROVIDES: tracepath tracepath6 DESCRIPTION: Tools to trace the network path to a remote host isc-dhcp-relay PROVIDES: dhcrelay DESCRIPTION: ISC DHCP relay daemon isc-dhcp-server PROVIDES: dhcpd DESCRIPTION: ISC DHCP server for automatic IP address assignment ispell PROVIDES: buildhash findaffix icombine ijoin ispell munchlist sq tryaffix unsq DESCRIPTION: International Ispell (an interactive spelling corrector) jackd1 PROVIDES: alsa_in alsa_out jack_alias jack_bufsize jack_connect jackd jack_disconnect jack_evmon jack_freewheel jack_impulse_grabber jack_load jack_lsp jack_metro jack_midiseq jack_midisine jack_monitor_client jack_netsource jack_showtime jack_simple_client jack_transport jack_unload DESCRIPTION: JACK Audio Connection Kit (server and example clients) joe PROVIDES: joe DESCRIPTION: user friendly full screen text editor john PROVIDES: john mailer DESCRIPTION: active password cracking tool kate PROVIDES: kate DESCRIPTION: K Advanced Text Editor kate-dbg PROVIDES: kwrite DESCRIPTION: debugging symbols for Kate kbd PROVIDES: loadunimap mapscrn psfxtable resizecons setfont showconsolefont DESCRIPTION: Linux console font and keytable utilities krb5-admin-server PROVIDES: kadmind kadmin.local kprop DESCRIPTION: MIT Kerberos master server (kadmind) krb5-clients PROVIDES: telnet.krb5 DESCRIPTION: Secure replacements for ftp, telnet and rsh using MIT Kerberos krb5-gss-samples PROVIDES: gss-client gss-server DESCRIPTION: MIT Kerberos GSS Sample applications krb5-kdc PROVIDES: kdb5_util kpropd krb5kdc DESCRIPTION: MIT Kerberos key server (KDC) krb5-kdc-ldap PROVIDES: kdb5_ldap_util DESCRIPTION: MIT Kerberos key server (KDC) LDAP plugin krb5-rsh-server PROVIDES: klogind kshd login.krb5 DESCRIPTION: Secure replacements for rshd and rlogind using MIT Kerberos krb5-user PROVIDES: k5srvutil kvno DESCRIPTION: Basic programs to authenticate using MIT Kerberos laptop-detect PROVIDES: laptop-detect DESCRIPTION: attempt to detect a laptop ldap2zone PROVIDES: ldap2zone DESCRIPTION: Extract DNS zones from LDAP trees ldap-utils PROVIDES: ldapadd ldapcompare ldapdelete ldapexop ldapmodify ldapmodrdn ldappasswd ldapsearch ldapurl ldapwhoami DESCRIPTION: OpenLDAP utilities less PROVIDES: less lessecho lesskey lesspipe DESCRIPTION: pager program similar to more libbonobo2-bin PROVIDES: activation-client bonobo-activation-sysconf bonobo-slay echo-client-2 DESCRIPTION: Bonobo CORBA interfaces library -- support binaries libc-dev-bin PROVIDES: gencat mtrace rpcgen sprof DESCRIPTION: Embedded GNU C Library: Development binaries libcroco-tools PROVIDES: csslint-0.6 DESCRIPTION: Cascading Style Sheet (CSS) parsing and manipulation toolkit - utils libdb1-compat PROVIDES: db_dump185 DESCRIPTION: Berkeley database routines [glibc 2.0/2.1 compatibility] libfreetype6-dev PROVIDES: freetype-config DESCRIPTION: FreeType 2 font engine, development files libfribidi-bin PROVIDES: fribidi DESCRIPTION: Free Implementation of the Unicode BiDi algorithm (utility) libgcj-common PROVIDES: rebuild-security-providers DESCRIPTION: Java runtime library (common files) libgdk-pixbuf2.0-dev PROVIDES: gdk-pixbuf-csource gdk-pixbuf-query-loaders DESCRIPTION: GDK Pixbuf library (development files) libgksu2-0 PROVIDES: gksu-properties DESCRIPTION: library providing su and sudo functionality libglib2.0-0-dbg PROVIDES: gdbus glib-genmarshal gobject-query gsettings DESCRIPTION: Debugging symbols for the GLib libraries libglib2.0-bin PROVIDES: gio-querymodules glib-compile-schemas DESCRIPTION: Programs for the GLib library libglib2.0-dev PROVIDES: gdbus-codegen glib-gettextize glib-mkenums DESCRIPTION: Development files for the GLib library libgnome2-0 PROVIDES: gnome-open DESCRIPTION: The GNOME library - runtime files libgnomevfs2-0-dbg PROVIDES: gnomevfs-cat gnomevfs-copy gnomevfs-df gnomevfs-info gnomevfs-ls gnomevfs-mkdir gnomevfs-monitor gnomevfs-mv gnomevfs-rm DESCRIPTION: GNOME Virtual File System (debugging libraries) libgpg-error-dev PROVIDES: gpg-error DESCRIPTION: library for common error values and messages in GnuPG components (development) libgtk2.0-bin PROVIDES: gtk-update-icon-cache DESCRIPTION: programs for the GTK+ graphical user interface library libgtk2.0-dev PROVIDES: dh_gtkmodules gtk-builder-convert DESCRIPTION: development files for the GTK+ library libgtk-3-bin PROVIDES: update-icon-caches DESCRIPTION: programs for the GTK+ graphical user interface library libjpeg-progs PROVIDES: cjpeg djpeg exifautotran jpegexiforient jpegtran rdjpgcom wrjpgcom DESCRIPTION: Programs for manipulating JPEG files liblockfile-bin PROVIDES: dotlockfile DESCRIPTION: support binaries for and cli utilities based on liblockfile libmysqlclient-dev PROVIDES: mysql_config DESCRIPTION: MySQL database development files libnss3-tools PROVIDES: certutil cmsutil crlutil modutil pk12util shlibsign signtool signver ssltap DESCRIPTION: Network Security Service tools libpango1.0-0-dbg PROVIDES: pango-querymodules pango-view DESCRIPTION: Pango library and debugging symbols libpango1.0-dev PROVIDES: dh_pangomodules DESCRIPTION: Development files for the Pango libpaper-utils PROVIDES: paperconf paperconfig DESCRIPTION: library for handling paper characteristics (utilities) libpcre3-dev PROVIDES: pcre-config DESCRIPTION: Perl 5 Compatible Regular Expression Library - development files libpng12-dev PROVIDES: libpng12-config DESCRIPTION: PNG library - development librep-dbg PROVIDES: rep rep-remote DESCRIPTION: debug symbols for librep librpm-dbg PROVIDES: rpm rpm2cpio rpmdb rpmgraph rpmsign DESCRIPTION: debugging symbols for RPM libruby1.8-dbg PROVIDES: ruby1.8 DESCRIPTION: Debugging symbols for Ruby 1.8 libsnmp15 PROVIDES: net-snmp-config DESCRIPTION: SNMP (Simple Network Management Protocol) library libsqlite3-0-dbg PROVIDES: sqlite3 DESCRIPTION: SQLite 3 debugging symbols libtasn1-3-bin PROVIDES: asn1Coding asn1Decoding asn1Parser DESCRIPTION: Manage ASN.1 structures (binaries) libtool PROVIDES: libtool libtoolize DESCRIPTION: Generic library support script libuser PROVIDES: lchage lchfn lchsh lgroupadd lgroupdel lgroupmod lnewusers lpasswd luseradd luserdel lusermod DESCRIPTION: user and group account administration library libxfce4util-bin PROVIDES: xfce4-kiosk-query DESCRIPTION: tools for libxfce4util lighttpd PROVIDES: lighttpd lighttpd-angel DESCRIPTION: fast webserver with minimal memory footprint links PROVIDES: links DESCRIPTION: Web browser running in text mode links2 PROVIDES: links2 xlinks2 DESCRIPTION: Web browser running in both graphics and text mode loadlin PROVIDES: freeramdisk DESCRIPTION: loader (running under DOS) for LINUX kernel images lpr PROVIDES: lpd DESCRIPTION: BSD lpr/lpd line printer spooling system lrzsz PROVIDES: rx DESCRIPTION: Tools for zmodem/xmodem/ymodem file transfer lsof PROVIDES: lsof DESCRIPTION: Utility to list open files lwresd PROVIDES: lwresd DESCRIPTION: Lightweight Resolver Daemon lynx-cur PROVIDES: lynx DESCRIPTION: Text-mode WWW Browser with NLS support (development version) lzma-alone PROVIDES: lzma_alone DESCRIPTION: Compression and decompression in the LZMA format - legacy utility lzop PROVIDES: lzop DESCRIPTION: fast compression program m4 PROVIDES: m4 DESCRIPTION: a macro processing language make PROVIDES: make DESCRIPTION: An utility for Directing compilation. makedev PROVIDES: MAKEDEV DESCRIPTION: creates device files in /dev man2html-base PROVIDES: man2html DESCRIPTION: convert man pages into HTML format menu PROVIDES: install-menu su-to-root update-menus DESCRIPTION: generates programs menu for all menu-aware applications microcom PROVIDES: microcom DESCRIPTION: minimalistic terminal program mii-diag PROVIDES: mii-diag DESCRIPTION: A little tool to manipulate network cards mime-support PROVIDES: run-mailcap update-mime DESCRIPTION: MIME files 'mime.types' & 'mailcap', and support programs mingetty PROVIDES: mingetty DESCRIPTION: Console-only getty mpack PROVIDES: mpack munpack DESCRIPTION: tools for encoding/decoding MIME messages mtd-utils PROVIDES: nanddump nandwrite ubiattach ubidetach ubimkvol ubirmvol ubirsvol ubiupdatevol DESCRIPTION: Memory Technology Device Utilities mtools PROVIDES: amuFormat.sh mcheck mcomp mkmanifest mtools mxtar tgz uz DESCRIPTION: Tools for manipulating MSDOS files mtr PROVIDES: mtr DESCRIPTION: Full screen ncurses and X11 traceroute tool muddleftpd PROVIDES: ftpwho DESCRIPTION: A flexible and efficient FTP daemon mysql-client-5.5 PROVIDES: innochecksum myisam_ftdump mysql mysqlaccess mysqladmin mysqlbug mysqlcheck mysql_client_test mysqldump mysqldumpslow mysql_find_rows mysql_fix_extensions mysqlimport mysqlshow mysql_waitpid DESCRIPTION: MySQL database client binaries mysql-server-5.5 PROVIDES: msql2mysql myisamchk myisamlog myisampack mysqlbinlog mysql_convert_table_format mysqld_multi mysqld_safe mysqlhotcopy mysql_secure_installation mysql_setpermission mysqltest mysql_tzinfo_to_sql mysql_zap perror replace resolveip resolve_stack_dump DESCRIPTION: MySQL database server binaries and system database setup mysql-server-core-5.5 PROVIDES: my_print_defaults mysqld mysql_install_db mysql_upgrade DESCRIPTION: MySQL database server binaries nast PROVIDES: nast DESCRIPTION: packet sniffer and lan analyzer nbd-client PROVIDES: nbd-client DESCRIPTION: Network Block Device protocol - client ncftp PROVIDES: ncftpbatch ncftpget ncftpls ncftpput ncftpspooler DESCRIPTION: User-friendly and well-featured FTP client netatalk PROVIDES: adv1tov2 aecho afpd asip-status.pl atalkd cnid2_create cnid_dbd cnid_metad getzones lp2pap.sh macusers megatron nbplkup nbprgstr nbpunrgstr netatalk-uniconv pap papd papstatus psorder showppd timelord DESCRIPTION: AppleTalk user binaries nfs-common PROVIDES: gss_clnt_send_err gss_destroy_creds mount.nfs mount.nfs4 nfsstat rpcdebug rpc.gssd rpc.idmapd rpc.statd rpc.svcgssd showmount sm-notify start-statd umount.nfs umount.nfs4 DESCRIPTION: NFS support files common to client and server nfs-kernel-server PROVIDES: exportfs rpc.mountd rpc.nfsd DESCRIPTION: support for NFS kernel server nis PROVIDES: rpc.yppasswdd rpc.ypxfrd ypbind ypcat ypchfn ypchsh ypmatch yppasswd yppoll yppush ypserv ypserv_test ypset yptest ypwhich DESCRIPTION: clients and daemons for the Network Information Service (NIS) nmap PROVIDES: ncat ndiff nmap nping DESCRIPTION: The Network Mapper nscd PROVIDES: nscd DESCRIPTION: Embedded GNU C Library: Name Service Cache Daemon ntp PROVIDES: ntpd ntpdc ntp-keygen ntpq ntptime ntptrace ntp-wait sntp DESCRIPTION: Network Time Protocol daemon and utility programs ntpdate PROVIDES: ntpdate DESCRIPTION: client for setting system time from NTP servers ocaml PROVIDES: labltk ocamlbrowser DESCRIPTION: ML language implementation with a class-based object system ocaml-base-nox PROVIDES: ocamlrun DESCRIPTION: Runtime system for OCaml bytecode executables (no X) ocaml-interp PROVIDES: ocaml DESCRIPTION: OCaml interactive interpreter and standard libraries ocaml-nox PROVIDES: ocamlbuild.byte ocamlbuild.native ocamlc ocamlcp ocamldebug ocamldep ocamldoc ocamldumpobj ocamllex ocamlmklib ocamlmktop ocamlobjinfo ocamlopt ocamlprof ocamlyacc DESCRIPTION: ML implementation with a class-based object system (no X) odt2txt PROVIDES: sxw2txt DESCRIPTION: simple converter from OpenDocument Text to plain text omniidl PROVIDES: omnicpp omniidl DESCRIPTION: omniORB IDL to C++ and Python compiler openbsd-inetd PROVIDES: inetd DESCRIPTION: OpenBSD Internet Superserver openjdk-6-dbg PROVIDES: apt extcheck idlj javap jconsole jhat jinfo jmap jps jrunscript jsadebugd jstack jstat jstatd pack200 policytool schemagen servertool unpack200 wsgen wsimport xjc DESCRIPTION: Java runtime based on OpenJDK (debugging symbols) openresolv PROVIDES: resolvconf DESCRIPTION: management framework for resolv.conf openssh-client PROVIDES: scp sftp slogin ssh ssh-add ssh-agent ssh-argv0 ssh-copy-id ssh-keygen ssh-keyscan DESCRIPTION: secure shell (SSH) client, for secure access to remote machines openssh-server PROVIDES: sshd DESCRIPTION: secure shell (SSH) server, for secure access from remote machines openssl PROVIDES: c_rehash openssl DESCRIPTION: Secure Socket Layer (SSL) binary and related cryptographic tools openswan PROVIDES: ipsec DESCRIPTION: Internet Key Exchange daemon orbit2 PROVIDES: ior-decode-2 linc-cleanup-sockets typelib-dump DESCRIPTION: a CORBA ORB patch PROVIDES: patch DESCRIPTION: Apply a diff file to an original pciutils PROVIDES: lspci pcimodules setpci update-pciids DESCRIPTION: Linux PCI Utilities pcregrep PROVIDES: pcregrep DESCRIPTION: grep utility that uses perl 5 compatible regexes. picolisp PROVIDES: watchdog DESCRIPTION: Lisp interpreter and application server framework pidentd PROVIDES: identd ikeygen DESCRIPTION: TCP/IP IDENT protocol server with DES support pkg-config PROVIDES: pkg-config DESCRIPTION: manage compile and link flags for libraries policycoreutils PROVIDES: audit2allow audit2why chcat fixfiles genhomedircon load_policy newrole open_init_pty restorecon run_init secon se_dpkg semanage semodule semodule_deps semodule_expand semodule_link semodule_package sepolgen-ifgen sestatus setfiles setsebool DESCRIPTION: SELinux core policy utilities policykit-1 PROVIDES: pkaction pkcheck pkexec DESCRIPTION: framework for managing administrative policies and privileges postfix PROVIDES: postalias postcat postconf postdrop postfix postkick postlock postlog postmap postmulti postqueue postsuper qmqp-sink qmqp-source qshape smtp-sink smtp-source DESCRIPTION: High-performance mail transport agent powertop PROVIDES: powertop DESCRIPTION: Linux tool to find out what is using power on a laptop ppl-dev PROVIDES: ppl-config DESCRIPTION: Parma Polyhedra Library (development binaries) ppp PROVIDES: chat DESCRIPTION: Point-to-Point Protocol (PPP) - daemon proftpd-basic PROVIDES: ftpcount ftpdctl ftpshut ftptop proftpd DESCRIPTION: Versatile, virtual-hosting FTP daemon - binaries protoize PROVIDES: protoize unprotoize DESCRIPTION: Create/remove ANSI prototypes from C code pscan PROVIDES: pscan DESCRIPTION: Format string security checker for C files psmisc PROVIDES: fuser killall peekfd pstree pstree.x11 DESCRIPTION: utilities that use the proc file system pulseaudio PROVIDES: pulseaudio DESCRIPTION: PulseAudio sound server pulseaudio-esound-compat PROVIDES: esd esdcompat DESCRIPTION: PulseAudio ESD compatibility layer python PROVIDES: 2to3 pydoc DESCRIPTION: interactive high-level object-oriented language (default version) python2.6-dbg PROVIDES: python2.6 DESCRIPTION: Debug Build of the Python Interpreter (version 2.6) python-central PROVIDES: dh_pycentral pycentral py_compilefiles DESCRIPTION: register and build utility for Python packages python-minimal PROVIDES: python DESCRIPTION: minimal subset of the Python language (default version) python-support PROVIDES: dh_pysupport update-python-modules DESCRIPTION: automated rebuilding support for Python modules qmail PROVIDES: maildirmake DESCRIPTION: a secure, reliable, efficient, simple message transfer agent quagga PROVIDES: vtysh DESCRIPTION: BGP/OSPF/RIP routing daemon racoon PROVIDES: plainrsa-gen racoon racoonctl DESCRIPTION: IPsec Internet Key Exchange daemon radvd PROVIDES: radvd radvdump DESCRIPTION: Router Advertisement Daemon rdate PROVIDES: rdate DESCRIPTION: sets the system's date from a remote host readahead-fedora PROVIDES: readahead DESCRIPTION: Fedora's implementation of readahead to preload boot process files reportbug PROVIDES: querybts reportbug DESCRIPTION: reports bugs in the Debian distribution rlinetd PROVIDES: update-inetd DESCRIPTION: gruesomely over-featured inetd replacement roxterm-gtk2 PROVIDES: roxterm roxterm-config DESCRIPTION: Multi-tabbed GTK+/VTE terminal emulator - GTK2 version rpcbind PROVIDES: rpcbind DESCRIPTION: converts RPC program numbers into universal addresses rpm PROVIDES: gendiff rpmquery rpmverify DESCRIPTION: package manager for RPM rsync PROVIDES: rsync DESCRIPTION: fast, versatile, remote (and local) file-copying tool rtkit PROVIDES: rtkitctl DESCRIPTION: Realtime Policy and Watchdog Daemon ruby1.8 PROVIDES: erb1.8 testrb1.8 DESCRIPTION: Interpreter of object-oriented scripting language Ruby 1.8 runit PROVIDES: chpst runsv runsvdir sv svlogd DESCRIPTION: system-wide service supervision rxvt PROVIDES: rclock rxvt-xpm rxvt-xterm DESCRIPTION: VT102 terminal emulator for the X Window System samba-common-bin PROVIDES: smbpasswd DESCRIPTION: common files used by both the Samba server and client sash PROVIDES: sash DESCRIPTION: Stand-alone shell sasl2-bin PROVIDES: saslauthd sasldblistusers2 saslpasswd2 testsaslauthd DESCRIPTION: Cyrus SASL - administration programs for SASL users database sawfish PROVIDES: sawfish sawfish-client sawfish-ui DESCRIPTION: a window manager for X11 setserial PROVIDES: setserial DESCRIPTION: controls configuration of serial ports sgml-base PROVIDES: install-sgmlcatalog update-catalog DESCRIPTION: SGML infrastructure and SGML catalog file support sharutils PROVIDES: shar unshar uudecode uuencode DESCRIPTION: shar, unshar, uuencode, uudecode slapd PROVIDES: slapacl slapadd slapauth slapcat slapd slapdn slapindex slappasswd slapschema slaptest DESCRIPTION: OpenLDAP server (slapd) smartlist PROVIDES: digest DESCRIPTION: Versatile and Intelligent List Processor smistrip PROVIDES: smistrip DESCRIPTION: extract MIB from text files like RFC smitools PROVIDES: smicache smidiff smidump smilint smiquery smixlate DESCRIPTION: various tools operating on MIB module files snacc PROVIDES: berdecode mkchdr ptbl pval snacc snacc-config DESCRIPTION: ASN.1 to C or C++ or IDL compiler snmp PROVIDES: encode_keychange snmpbulkget snmpbulkwalk snmpdelta snmpdf snmpget snmpgetnext snmpinform snmpnetstat snmpset snmpstatus snmptable snmptest snmptranslate snmptrap snmpusm snmpvacm snmpwalk DESCRIPTION: SNMP (Simple Network Management Protocol) applications snmpd PROVIDES: snmpd snmptrapd DESCRIPTION: SNMP (Simple Network Management Protocol) agents socat PROVIDES: filan procan socat DESCRIPTION: multipurpose relay for bidirectional data transfer sshfs PROVIDES: sshfs DESCRIPTION: filesystem client based on SSH File Transfer Protocol ssl-cert PROVIDES: make-ssl-cert DESCRIPTION: simple debconf wrapper for OpenSSL strace PROVIDES: strace DESCRIPTION: A system call tracer sudo PROVIDES: sudo sudoedit sudoreplay visudo DESCRIPTION: Provide limited super user privileges to specific users sysfsutils PROVIDES: systool DESCRIPTION: sysfs query tool and boot-time setup sysstat PROVIDES: iostat mpstat DESCRIPTION: system performance tools for Linux tack PROVIDES: tack DESCRIPTION: terminfo action checker tcl8.4 PROVIDES: tclsh8.4 DESCRIPTION: Tcl (the Tool Command Language) v8.4 - run-time files tcm PROVIDES: tcpd DESCRIPTION: Toolkit for Conceptual Modeling (TCM) tcpd PROVIDES: safe_finger tcpdchk tcpdmatch try-from DESCRIPTION: Wietse Venema's TCP wrapper utilities tcpdump PROVIDES: tcpdump DESCRIPTION: command-line network traffic analyzer tcsh PROVIDES: tcsh DESCRIPTION: TENEX C Shell, an enhanced version of Berkeley csh telnet PROVIDES: telnet.netkit DESCRIPTION: The telnet client texinfo PROVIDES: makeinfo texi2dvi texi2pdf texindex DESCRIPTION: Documentation system for on-line information and printed output tftp PROVIDES: tftp DESCRIPTION: Trivial file transfer protocol client thunar PROVIDES: Thunar DESCRIPTION: File Manager for Xfce time PROVIDES: time DESCRIPTION: GNU time program for measuring CPU resource usage tk8.4 PROVIDES: wish8.4 DESCRIPTION: Tk toolkit for Tcl and X11, v8.4 - run-time files tshark PROVIDES: tshark DESCRIPTION: network traffic analyzer - console version ucf PROVIDES: lcf ucf ucfq ucfr DESCRIPTION: Update Configuration File: preserve user changes to config files. udev PROVIDES: udevadm udevd DESCRIPTION: /dev/ and hotplug management daemon udhcpc PROVIDES: udhcpc DESCRIPTION: Provides the busybox DHCP client implementation udhcpd PROVIDES: dumpleases udhcpd DESCRIPTION: Provides the busybox DHCP server implementation uml-utilities PROVIDES: tunctl DESCRIPTION: User-mode Linux (utility programs) unzip PROVIDES: unzip DESCRIPTION: De-archiver for .zip files usbutils PROVIDES: lsusb update-usbids usb-devices DESCRIPTION: Linux USB utilities usermode PROVIDES: consolehelper userhelper DESCRIPTION: Graphical tools for certain user account management tasks uuid-runtime PROVIDES: uuidgen DESCRIPTION: runtime components for the Universally Unique ID library vim PROVIDES: vim.basic DESCRIPTION: Vi IMproved - enhanced vi editor vim-addon-manager PROVIDES: vim-addons DESCRIPTION: manager of addons for the Vim editor vim-runtime PROVIDES: vimtutor DESCRIPTION: Vi IMproved - Runtime files vim-scripts PROVIDES: dtd2vim vimplate DESCRIPTION: plugins for vim, adding bells and whistles vlan PROVIDES: vconfig DESCRIPTION: user mode programs to enable VLANs on your ethernet devices vlock PROVIDES: vlock DESCRIPTION: Virtual Console locking program w3m PROVIDES: w3m w3mman DESCRIPTION: WWW browsable pager with excellent tables/frames support whois PROVIDES: mkpasswd whois DESCRIPTION: intelligent WHOIS client wireshark PROVIDES: wireshark DESCRIPTION: network traffic analyzer - GTK+ version wireshark-common PROVIDES: capinfos dumpcap editcap mergecap text2pcap DESCRIPTION: network traffic analyzer - common files wireshark-dev PROVIDES: asn2deb idl2deb idl2wrs DESCRIPTION: network traffic analyzer - development tools x11-apps PROVIDES: atobm bitmap bmtoa ico oclock x11perf x11perfcomp xbiff xcalc xclipboard xclock xconsole xcursorgen xcutsel xditview xedit xeyes xgc xload xlogo xmag xman xmore xwd xwud DESCRIPTION: X applications x11-session-utils PROVIDES: rstart rstartd smproxy xsm DESCRIPTION: X session utilities x11-utils PROVIDES: appres editres listres luit viewres xdpyinfo xdriinfo xev xfd xfontsel xkill xlsatoms xlsclients xlsfonts xmessage xprop xvinfo xwininfo DESCRIPTION: X11 utilities x11-xfs-utils PROVIDES: fslsfonts fstobdf showfont xfsinfo DESCRIPTION: X font server utilities x11-xkb-utils PROVIDES: setxkbmap xkbbell xkbcomp xkbevd xkbprint xkbvleds xkbwatch DESCRIPTION: X11 XKB utilities x11-xserver-utils PROVIDES: iceauth sessreg showrgb xcmsdb xgamma xhost xmodmap xrandr xrdb xrefresh xset xsetmode xsetpointer xsetroot xstdcmap xvidtune DESCRIPTION: X server utilities xauth PROVIDES: xauth DESCRIPTION: X authentication utility xdg-user-dirs PROVIDES: xdg-user-dir xdg-user-dirs-update DESCRIPTION: tool to manage well known user directories xdg-user-dirs-gtk PROVIDES: xdg-user-dirs-gtk-update DESCRIPTION: tool to manage well known user directories (Gtk extension) xdg-utils PROVIDES: xdg-desktop-icon xdg-desktop-menu xdg-email xdg-icon-resource xdg-mime xdg-open xdg-screensaver xdg-settings DESCRIPTION: desktop integration utilities from freedesktop.org xfce4-panel PROVIDES: xfce4-panel DESCRIPTION: panel for Xfce4 desktop environment xfce4-session PROVIDES: xfce4-session xfce4-session-logout xfce4-tips DESCRIPTION: Xfce4 Session Manager xfce4-terminal PROVIDES: xfce4-terminal xfce4-terminal.wrapper DESCRIPTION: Xfce terminal emulator xfce4-utils PROVIDES: startxfce4 xfbrowser4 xfce4-about xfhelp4 xflock4 xfmountdev4 xfrun4 xfterm4 DESCRIPTION: Various tools for Xfce xfdesktop4 PROVIDES: xfdesktop DESCRIPTION: xfce desktop background, icons and root menu manager xfonts-utils PROVIDES: bdftopcf bdftruncate mkfontdir mkfontscale ucs2any update-fonts-alias update-fonts-dir update-fonts-scale DESCRIPTION: X Window System font utility programs xfwm4 PROVIDES: xfwm4 DESCRIPTION: window manager of the Xfce project xinetd PROVIDES: itox xinetd DESCRIPTION: replacement for inetd with many enhancements xinit PROVIDES: startx xinit DESCRIPTION: X server initialisation tool xml-core PROVIDES: dh_installxmlcatalogs update-xmlcatalog DESCRIPTION: XML infrastructure and XML catalog file support xserver-xorg PROVIDES: X DESCRIPTION: X.Org X server xterm PROVIDES: koi8rxterm lxterm resize uxterm xterm DESCRIPTION: X terminal emulator xtermcontrol PROVIDES: xtermcontrol DESCRIPTION: dynamic configuration of xterm properties xtermset PROVIDES: xtermset DESCRIPTION: change the characteristics of an xterm xutils-dev PROVIDES: ccmakedep cleanlinks gccmakedep imake lndir makedepend makeg mergelib mkdirhier mkhtmlindex revpath xmkmf DESCRIPTION: X Window System utility programs for development xview-clients PROVIDES: clock cmdtool props textedit DESCRIPTION: XView client programs xviewg PROVIDES: capitalize insert_brackets remove_brackets shift_lines DESCRIPTION: XView shared libraries xvt PROVIDES: xvt DESCRIPTION: X terminal-emulator similar to xterm, but smaller marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/Makefile0000600000175000017500000000725312167200764031475 0ustar lucaslucas# This file is part of Marionnet, a virtual network laboratory # Copyright (C) 2013 Jean vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This Makefile helps people to build a debian filesystem # with debootstrap according to the Marionnet requirements. # ---------------------- # binary_list # ---------------------- binary_list.UNION: cat binary_list.*.* | sort -d | uniq > $@ # ---------------------- # wheezy or squeeze # ---------------------- wheezy squeeze: binary_list.UNION chmod +x ./make_package_catalog_from_binary_list.sh ./make_package_catalog_from_binary_list.sh $@ # ---------------------- # wheezy # ---------------------- package_catalog.wheezy.GENERATED: wheezy package_catalog.wheezy.COMPLETE.COMMENTED: package_catalog.wheezy.GENERATED touch package_catalog.wheezy.additional cat $< package_catalog.wheezy.additional | sort -k 1,1 -d | awk '{print "#"$$0}' > $@ WHEEZY_SELECTION=package_catalog.wheezy.selection package_catalog.wheezy.COMPLETE.COMMENTED.selection: package_catalog.wheezy.COMPLETE.COMMENTED cp -f $< $@; if [[ -f $(WHEEZY_SELECTION) ]]; then for i in $$(\grep -v '^#' $(WHEEZY_SELECTION) | awk '{print $$1}'); do sed -i -e "s/^#$${i} /$${i} /" $@; done; else cp -f $< $(WHEEZY_SELECTION); fi # ---------------------- # squeeze # ---------------------- package_catalog.squeeze.GENERATED: squeeze package_catalog.squeeze.COMPLETE.COMMENTED: package_catalog.squeeze.GENERATED touch package_catalog.squeeze.additional cat $< package_catalog.squeeze.additional | sort -k 1,1 -d | awk '{print "#"$$0}' > $@ SQUEEZE_SELECTION=package_catalog.squeeze.selection package_catalog.squeeze.COMPLETE.COMMENTED.selection: package_catalog.squeeze.COMPLETE.COMMENTED cp -f $< $@; if [[ -f $(SQUEEZE_SELECTION) ]]; then for i in $$(\grep -v '^#' $(SQUEEZE_SELECTION) | awk '{print $$1}'); do sed -i -e "s/^#$${i} /$${i} /" $@; done; else cp -f $< $(SQUEEZE_SELECTION); fi # ---------------------- # Dependencies # ---------------------- REQUIRED_PACKAGES=debootstrap coreutils dependencies: @echo "Required packages: $(REQUIRED_PACKAGES)" @which dpkg 1>/dev/null || { echo "Not a Debian system (oh my god!); please install packages corresponding to: $(REQUIRED_PACKAGES)"; exit 1; } @dpkg 1>/dev/null -l $(REQUIRED_PACKAGES) || \ if which aptitude; then \ sudo aptitude install -q -q -q -y $(REQUIRED_PACKAGES); \ elif which apt-get; then \ sudo apt-get install -q -q -q -y $(REQUIRED_PACKAGES); \ else \ exit 1; \ fi @echo Ok. # ---------------------- # clean # ---------------------- clean: sudo rm -rf _build.*; rm -f *~ rm -f package_catalog.*.COMPLETE.COMMENTED package_catalog.*.COMPLETE.COMMENTED.selection @if test -f package_catalog.wheezy.GENERATED; then echo "Warning: file \`package_catalog.wheezy.GENERATED' not removed; please remove it manually if you really know what are you doing."; fi @if test -f package_catalog.squeeze.GENERATED; then echo "Warning: file \`package_catalog.squeeze.GENERATED' not removed; please remove it manually if you really know what are you doing."; fi ././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/binary_list.machine-mandriva-09476.1155marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/binary_list.0000600000175000017500000002434412167200764032355 0ustar lucaslucas[ 2to3 a2p ab about-mandriva activation-client addbuiltin addpart addr2line adduser advxsplitlogfile advxsplitlogfile.pl agetty alsa.agent alsa.agent alsa_in alsa_out alternatives apachectl appletviewer apropos apt ar arch aria2c arp arping arping as atob aumix-text avahi-autoipd avahi-browse avahi-browse-domains avahi-daemon avahi-publish avahi-publish-address avahi-publish-service avahi-resolve avahi-resolve-address avahi-resolve-host-name avahi-set-host-name awk awk badblocks baddbdir base64 basename bash bash3 bashbug berkeley_db_svc bgpd blkid blockdev bltest bonobo-activation-sysconf bonobo-slay bootlogd brctl btoa build-classpath build-classpath-directory build-jar-repository bunzip2 bzcat bzdiff bzgrep bzip2 bzip2recover bzless bzme bzmore c89 c99 cal captoinfo cat catchsegv cc ccp certcgi certutil cfdisk c++filt chacl chage chattr chcon check-binary-files checkcert check_forensic checkgid chfn chgrp chkconfig chksession chmod chown chpasswd chroot chrt chsh chvt ck-history ck-launch-session ck-list-sessions ck-log-system-restart ck-log-system-start ck-log-system-stop cksum clean-binary-files clear clockdiff cmp cmsutil code2color col colcrt colrm column comm conflict consolehelper console-kit-daemon consoletype ControlPanel convertsession cp cpio cpp cpp-4.4.1 cracklib-check cracklib-format cracklib-packer cracklib-unpacker create-cracklib-dict create-jar-links create_static_dev_nodes c_rehash crlutil crmftest crond crontab cryptsetup csplit ctrlaltdel ctstat cut cut cytune date db_archive db_checkpoint db_codegen db_deadlock db_dump db_dump185 db_hotbackup db_load dbmmanage db_printlog db_recover db_stat dbtest db_upgrade dbus-cleanup-sockets dbus-daemon dbus-launch dbus-monitor dbus-send dbus-uuidgen db_verify dd ddate deallocvt debugfs delpart depmod derdump desktop-file-install desktop-file-validate df dhclient dhclient-script dhcpd dhcpd-chroot.sh dhcpd-conf-to-ldap.pl dhcpreport.pl diff diff3 diff-jars dig digest dir dircolors dirname dlist_test dmesg dmeventd dmsetup dmsetup-static dmsetup.static dnsdomainname dns-keygen dnssec-dsfromkey dnssec-keyfromlabel dnssec-keygen dnssec-makekeyset dnssec-signkey dnssec-signzone doexec domainname du dumpcap dumpcap dumpe2fs dumpkeys e2freefrag e2fsck e2fsck.static e2image e2label e2undo e3jsize ebtables-restore ebtables-save echo echo-client-2 ed egrep eject env env eqn esd esdcompat ether-wake ethtool ettercap etterfilter etterlog ex expand expiry exportfs expr expr extcheck factor faillog false fc-cache fc-cat fc-list fc-match fc-query fc-scan fdformat fdisk fgconsole fgrep file filefrag find find find2perl findfs find-jar fipstest firefox flock flock fmt fndSession fold free free fsck fsck.cramfs fsck.ext2 fsck.ext3 fsck.ext4 fsck.ext4dev fsck.minix fstab-decode ftp ftpd fuser gawk gawk gawk-3.1.7 gcc gcc-4.4.1 gcc4.4-version gccbug gconf-merge-tree gconftool gconftool-2 gcov gdk-pixbuf-query-loaders gencat gendiff generate-modprobe.conf genhdlist2 genhostid genl geqn getconf get_device get_driver getent getfacl getkey getkeycodes get_module getopt gettext gettext ghost2 ghostify glibc-post-wrapper gmake gnome-open gnomevfs-cat gnomevfs-copy gnomevfs-df gnomevfs-info gnomevfs-ls gnomevfs-mkdir gnomevfs-monitor gnomevfs-mv gnomevfs-rm gnroff gpasswd gpg gpgsplit gpgv gpg-zip gprof grep groff grotty groupadd groupdel groupmod groups grpck grpconv grpunconv grub grub-install grub-md5-crypt grub-terminfo gss_clnt_send_err gss_destroy_creds gtar gtbl gtk-query-immodules-2.0 gtk-update-icon-cache gtroff gunzip gunzip gzexe gzip gzip hald hal-device hal-disable-polling hal-find-by-capability hal-find-by-property hal-get-property hal-is-caller-locked-out hal-is-caller-privileged hal-lock hal-set-property hal-setup-keymap halt halt head hexdump hibernate-cleanup.sh host hostid hostname hping hping2 htdbm htdigest HtmlConverter htpasswd httpd httxt2dbm i386 i586-manbo-linux-gnu-gcc i586-manbo-linux-gnu-gcc-4.4.1 i586-mandriva-linux-gnu-gcc i586-mandriva-linux-gnu-gcc-4.4.1 iconv iconvconfig id idlj ifcfg ifconfig ifdown ifenslave ifmetric ifplugd ifplugstatus ifstat ifup igawk inetdconvert infocmp infotocap init initlog insmod install install-info in.tftpd ionice ionice ior-decode-2 ip ip6tables ip6tables-multi ip6tables-restore ip6tables-save ipcalc ipcmk ipcrm ipcs ipmaddr iproute-arpd ipsec iptables iptables-multi iptables-restore iptables-save iptables-xml iptunnel isisd isosize jackd jack_netsource jar jarsigner java javac javadoc javah javap javaws jconsole jdb jhat jinfo jmap join jps jrunscript jsadebugd jstack jstat jstatd jvmjar kbd_mode kbd_mode kbdrate kdeDesktopCleanup keytool kill kill killall killall5 klogd klogd last lastb lastlog lchage lchfn lchsh ld ldap2zone ldapadd ldapcompare ldapdelete ldapexop ldapmodify ldapmodrdn ldappasswd ldapsearch ldapurl ldapwhoami ldattach ldconfig ldd lddlibc4 less lessecho lesskey lesspipe.sh lgroupadd lgroupdel lgroupmod lid linc-cleanup-sockets link linux32 linux64 listhome list_hooks.pl ln lnewusers lnstat loadkeys loadkeys loadunimap locale localedef locale_install.sh locale_uninstall.sh logger logger login login login.krb5 logname logoutd logresolve logresolve.pl logrotate logsave log_server_status look losetup lpasswd ls lsattr lscpu lshal lsmod lspci lspgpot lsusb luseradd luserdel lusermod lwresd lynx lzcat lzcmp lzdiff lzegrep lzfgrep lzgrep lzless lzma lzmadec lzmainfo lzmore mailq make makedev makepqg makewhatis man man2dvi man2html mangle manpath mapscrn marionnet_grab_config mawk mbchk mcookie md5sum mdv-network-event mesg mii-diag mii-tool mingetty mkdict mkdir mke2fs mke3fs mkfifo mkfontdir mkfontscale mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.ext4dev mkfs.minix mkhomedir_helper mklost+found mknod mkswap mktemp mktemp modinfo modprobe mod_ssl-gentestcrt modutil more mount mount.nfs mount.nfs4 mountpoint mozilla-firefox mv named named-bootconf named-checkconf named-checkzone named-compilezone namei nameif nano native2ascii nc ncat ncurses5-config ncursesw5-config ndiff netcat netreport netstat newaliases newgrp newusers nfsddebug nfsdebug nfsstat ngettext nice nisdomainname nl nm nmap nohup nologin nonspr10 nroff nslookup nstat nsupdate objcopy objdump ocspclnt od oidcalc oldfind omshell openssl openvt orbd ospf6d ospfclient ospfd p7content p7env p7sign p7verify pack200 packer pam_console_apply pam_tally2 pam_timestamp_check pango-querymodules-32 partmon partx passwd paste pathchk pcimodules peekfd perl perl5 perl5.10.1 perlbug perlthanks pgawk pgrep pidof pidof ping ping6 pinky pivot_root pk11mode pk12util pkaction pkcheck pkexec pkg-config pkill plainrsa-gen plipconfig pmap pod2html pod2latex pod2man pod2text policytool polkit-action polkit-auth polkit-config-file-validate polkit-policy-file-validate postalias postcat postconf postdrop postfinger postfix postfix-chroot.sh postkick postlock postlog postmap postmulti postqueue postsuper poweroff poweroff pp ppl-config ppp-watch pr prcsys print-cups.sh printenv printf procps3-kill protoize ps psfaddtable psfgettable psfstriptable psfxtable pstree pstree.x11 ptx pulseaudio pwck pwconv pwd pwdx pwunconv pydoc python python2.6 qmqp-sink qmqp-source qshape query-loc queryperf racoon racoonctl ranlib raw rbash rdisc readelf readlink readprofile reboot reboot rebuild-jar-repository rebuild-security-providers red remtest rename renice reset resetall reset_sound reset_sound resize2fs resizecons resolvconf rev ripd ripngd rm rmail rmdir rmic rmid rmiregistry rmmod rmold rmt rmt-tar rnano rndc rndc-confgen rotatelogs route routef routel rpcbind rpcdebug rpcgen rpc.gssd rpc.idmapd rpcinfo rpcinfo rpc.mountd rpc.nfsd rpc.statd rpc.svcgssd rpc.yppasswdd rpc.ypxfrd rpm rpm2cpio rpmdb rpm-find-leaves rpmgraph rpmquery rpmsign rpmverify rsaperf rsync rtacct rtcwake rtkitctl rtmon rtpr rtstat runcon runlevel run-parts rurpme rurpmi s2p safe_finger sash schemagen scp script sdiff sdrtest securetty sed selfserv sendmail sendmail.postfix seq serialver servertool service setarch setfacl setfont setfont setkey setkeycodes setleds setmetamode setpci setsid setsysfont set_tcb setterm sfdisk sftp sg sh sha1sum sha224sum sha256sum sha384sum sha512sum shell-quote shlibsign showconsolefont showkey showmount shred shuf shutdown signtool signver size skill slabtop slapacl slapadd slapauth slapcat slapd slapdn slapindex slappasswd slapschema slaptest slattach sleep sln slogin smicache smidiff smidump smilint smime smiquery smistrip smixlate sm-notify smtp-sink smtp-source snice sort splain split split-logfile sprof ss ssh ssh-add ssh-agent ssh-copy-id sshd ssh-keygen ssh-keyscan ssleay ssltap start-statd start_udev.orig stat stdbuf strings strip strsclnt stty su sudo sudoedit sudoers2ldif sulogin sum supermount swapoff swapon switch_root sxw2txt symkeyutil sync sysctl syslogd syslogd systool sys-unconfig tabs tac tac tail tailf tar tar-backup tar-restore taskset tbl tc tcb_convert tcb_unconvert tcpd tcpdchk tcpdmatch tcpdump tee telinit telnet test tftp tic time timeout tload tnameserv toe top touch tput tr tracepath tracepath6 traceroute6 troff true truncate try-from tset tsort tstclnt ttmkfdir ttmkfdir tty tune2fs tunelp typelib-dump tzselect udevadm udevd udev_import_usermap ul umount umount.hal umount.nfs umount.nfs4 uname unexpand unghostify unicode_start unicode_start unicode_stop unicode_stop uniq unix_chkpwd unix_update unlink unlzma unpack200 unprotoize unxz update-alternatives update-desktop-database update_dhcp.pl update-localtime update-menus update-mime-database update-usbids.sh uptime urpme urpmf urpmi urpmi.addmedia urpmi.removemedia urpmi_rpm-find-leaves urpmi.update urpmq usb-devices usb_id useradd userdel userhelper usermod usernetctl users usleep utempter utmpdump uuidgen vconfig vdir vfychain vfyserv vi vi vigr vim vimdiff vim-enhanced vimtutor vipw visudo vlan-test vmstat volname vpn-start vpn-stop vtysh w wall watch watchquagga wc wget whatis whereis which who whoami wireshark wireshark-root wireshark-root write wsgen wsimport www-browser xargs xdg-desktop-icon xdg-desktop-menu xdg-email xdg-icon-resource xdg_menu xdg-mime xdg-open xdg-screensaver xdg-settings xdg-user-dir xdg-user-dirs-gtk-update xdg-user-dirs-update xinetd xjc xprop xvt xxd xz xzcat xzcmp xzdec xzdiff xzegrep xzfgrep xzgrep xzless xzme xzmore yes ypbind ypcat ypchfn ypchsh ypdomainname ypmatch yppasswd yppoll yppush ypserv ypset yptest ypwhich zcat zcat zcmp zdiff zdump zebra zegrep zfgrep zforce zgrep zic zless zmore znew zonetoldap ././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_catalog.squeeze.additionalmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_cata0000600000175000017500000000000012167200764032322 0ustar lucaslucas././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_catalog.squeeze.selectionmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_cata0000600000175000017500000012025512167200764032341 0ustar lucaslucas#9base PROVIDES: bc dc ed strings DESCRIPTION: Plan 9 userland tools #acl PROVIDES: chacl getfacl setfacl DESCRIPTION: Access control list utilities #acpid PROVIDES: acpid acpi_listen DESCRIPTION: Advanced Configuration and Power Interface event daemon #adjtimex PROVIDES: adjtimex DESCRIPTION: kernel time variables configuration utility #adns-tools PROVIDES: adnsheloex adnshost adnslogres adnsresfilter DESCRIPTION: Asynchronous-capable DNS client library and utilities #apache2.2-common PROVIDES: a2dismod a2dissite a2enmod a2ensite apache2ctl apachectl DESCRIPTION: Apache HTTP Server common files #apache2-dbg PROVIDES: ab checkgid htcacheclean htdbm htdigest htpasswd httxt2dbm logresolve rotatelogs DESCRIPTION: Apache debugging symbols #apache2-mpm-event PROVIDES: apache2 DESCRIPTION: Apache HTTP Server - event driven model #apache2-utils PROVIDES: check_forensic dbmmanage split-logfile DESCRIPTION: utility programs for webservers #aria2 PROVIDES: aria2c DESCRIPTION: High speed download utility #arping PROVIDES: arping DESCRIPTION: sends IP and/or ARP pings (to the MAC address) #arts-dbg PROVIDES: artscat artsd artsplay artsrec artsshell artswrapper DESCRIPTION: debugging symbols for arts #ash PROVIDES: ash DESCRIPTION: compatibility package for dash #aspell PROVIDES: aspell aspell-import precat preunzip prezip prezip-bin run-with-aspell word-list-compress DESCRIPTION: GNU Aspell spell-checker #atftpd PROVIDES: in.tftpd DESCRIPTION: advanced TFTP server #attr PROVIDES: attr getfattr setfattr DESCRIPTION: Utilities for manipulating filesystem extended attributes #autoconf PROVIDES: autoconf autoheader autom4te autoreconf autoscan autoupdate ifnames DESCRIPTION: automatic configure script builder #autopoint PROVIDES: autopoint DESCRIPTION: The autopoint program from GNU gettext #avahi-autoipd PROVIDES: avahi-autoipd DESCRIPTION: Avahi IPv4LL network address configuration daemon #avahi-daemon PROVIDES: avahi-daemon DESCRIPTION: Avahi mDNS/DNS-SD daemon #avahi-dbg PROVIDES: avahi-browse avahi-publish avahi-resolve avahi-set-host-name DESCRIPTION: Avahi - debugging symbols #avahi-utils PROVIDES: avahi-browse-domains avahi-publish-address avahi-publish-service avahi-resolve-address avahi-resolve-host-name DESCRIPTION: Avahi browsing, publishing and discovery utilities #babeld PROVIDES: babeld DESCRIPTION: a loop-free distance-vector routing protocol #beep PROVIDES: beep DESCRIPTION: advanced pc-speaker beeper #bind9 PROVIDES: dnssec-dsfromkey dnssec-keyfromlabel named DESCRIPTION: Internet Domain Name Server #bind9-host PROVIDES: host DESCRIPTION: Version of 'host' bundled with BIND 9.X #bind9utils PROVIDES: dnssec-keygen dnssec-signzone named-checkconf named-checkzone named-compilezone rndc rndc-confgen DESCRIPTION: Utilities for BIND #binutils PROVIDES: addr2line ar as c++filt gprof ld nm objcopy objdump ranlib readelf size strip DESCRIPTION: The GNU assembler, linker and binary utilities #bridge-utils PROVIDES: brctl DESCRIPTION: Utilities for configuring the Linux Ethernet bridge #busybox PROVIDES: busybox DESCRIPTION: Tiny utilities for small and embedded systems #busybox-syslogd PROVIDES: klogd logread syslogd DESCRIPTION: Provides syslogd and klogd using busybox #bzip2 PROVIDES: bunzip2 bzcat bzcmp bzdiff bzegrep bzexe bzfgrep bzgrep bzip2 bzip2recover bzless bzmore DESCRIPTION: high-quality block-sorting file compressor - utilities #camstream PROVIDES: ftpput DESCRIPTION: collection of tools for webcams and other video-devices #cdbs PROVIDES: cdbs-edit-patch DESCRIPTION: common build system for Debian packages #chkconfig PROVIDES: chkconfig DESCRIPTION: system tool to enable or disable system services #cifs-utils PROVIDES: mount.cifs DESCRIPTION: Common Internet File System utilities #citadel-mta PROVIDES: sendmail DESCRIPTION: complete and feature-rich groupware server (mail transport agent) #consolekit PROVIDES: ck-history ck-launch-session ck-list-sessions ck-log-system-restart ck-log-system-start ck-log-system-stop console-kit-daemon DESCRIPTION: framework for defining and tracking users, sessions and seats #console-tools PROVIDES: chvt deallocvt dumpkeys fgconsole getkeycodes kbd_mode kbdrate loadkeys openvt psfaddtable psfgettable psfstriptable setkeycodes setleds setlogcons setmetamode showkey unicode_start unicode_stop DESCRIPTION: Linux console and font utilities #conspy PROVIDES: conspy DESCRIPTION: Remote control of Linux virtual consoles #courier-authdaemon PROVIDES: authdaemond DESCRIPTION: Courier authentication daemon #courier-authlib PROVIDES: authenumerate authpasswd authtest courierlogger DESCRIPTION: Courier authentication library #courier-authlib-dev PROVIDES: courierauthconfig DESCRIPTION: Development libraries for the Courier authentication library #courier-authlib-userdb PROVIDES: makeuserdb pw2userdb userdb userdbpw userdb-test-cram-md5 DESCRIPTION: userdb support for the Courier authentication library #courier-base PROVIDES: courier-config couriertcpd maildiracl maildirkw sharedindexinstall sharedindexsplit testmxlookup DESCRIPTION: Courier mail server - base system #courier-imap PROVIDES: imapd DESCRIPTION: Courier mail server - IMAP server #courier-ldap PROVIDES: courierldapaliasd DESCRIPTION: Courier mail server - LDAP support #courier-maildrop PROVIDES: mailbot maildrop makemime reformail reformime DESCRIPTION: Courier mail server - mail delivery agent #courier-mta PROVIDES: mailq newaliases rmail DESCRIPTION: Courier mail server - ESMTP daemon #courier-ssl PROVIDES: couriertls DESCRIPTION: Courier mail server - SSL/TLS Support #cpp PROVIDES: cpp DESCRIPTION: The GNU C preprocessor (cpp) #cpp-4.1 PROVIDES: cpp-4.1 DESCRIPTION: The GNU C preprocessor #crack PROVIDES: Crack Crack-Reporter DESCRIPTION: Password guessing program #cracklib-runtime PROVIDES: cracklib-check cracklib-format cracklib-packer cracklib-unpacker create-cracklib-dict DESCRIPTION: runtime support for password checker library cracklib2 #cramfsprogs PROVIDES: cramfsck mkcramfs DESCRIPTION: Tools for CramFs (Compressed ROM File System) #cryptsetup PROVIDES: cryptsetup DESCRIPTION: configures encrypted block devices #cups-bsd PROVIDES: lpq lpr DESCRIPTION: Common UNIX Printing System(tm) - BSD commands #curlftpfs PROVIDES: curlftpfs DESCRIPTION: filesystem to access FTP hosts based on FUSE and cURL #cyrus-sasl2-dbg PROVIDES: saslauthd sasldblistusers2 saslpasswd2 testsaslauthd DESCRIPTION: Cyrus SASL - debugging symbols #daemontools PROVIDES: envdir envuidgid setuidgid softlimit DESCRIPTION: a collection of tools for managing UNIX services #dbus PROVIDES: dbus-cleanup-sockets dbus-daemon dbus-monitor dbus-send dbus-uuidgen DESCRIPTION: simple interprocess messaging system #dbus-1-dbg PROVIDES: dbus-launch DESCRIPTION: simple interprocess messaging system (debug symbols) #debhelper PROVIDES: dh_builddeb dh_clean dh_compress dh_desktop dh_fixperms dh_gconf dh_gencontrol dh_icons dh_install dh_installcatalogs dh_installchangelogs dh_installcron dh_installdeb dh_installdebconf dh_installdirs dh_installdocs dh_installemacsen dh_installexamples dh_installifupdown dh_installinfo dh_installinit dh_installlogcheck dh_installlogrotate dh_installman dh_installmanpages dh_installmenu dh_installmime dh_installmodules dh_installpam dh_installppp dh_installudev dh_installwm dh_installxfonts dh_link dh_listpackages dh_makeshlibs dh_md5sums dh_movefiles dh_perl dh_python dh_scrollkeeper dh_shlibdeps dh_strip dh_suidregister dh_testdir dh_testroot dh_undocumented dh_usrlocal DESCRIPTION: helper programs for debian/rules #defoma PROVIDES: defoma defoma-hints defoma-reconfigure dh_installdefoma DESCRIPTION: Debian Font Manager -- automatic font configuration framework #desktop-file-utils PROVIDES: desktop-file-install desktop-file-validate update-desktop-database DESCRIPTION: Utilities for .desktop files #dh-ocaml PROVIDES: dh_ocaml ocaml-md5sums DESCRIPTION: helper tools for maintaining OCaml-related Debian packages #dictionaries-common PROVIDES: aspell-autobuildhash ispell-autobuildhash ispell-wrapper remove-default-ispell remove-default-wordlist select-default-ispell select-default-iwrap select-default-wordlist update-default-ispell update-default-wordlist update-dictcommon-aspell update-openoffice-dicts DESCRIPTION: Common utilities for spelling dictionary tools #dietlibc-dev PROVIDES: dnsd DESCRIPTION: diet libc - a libc optimized for small size #dmsetup PROVIDES: dmsetup DESCRIPTION: The Linux Kernel Device Mapper userspace library #dnsutils PROVIDES: dig nslookup nsupdate DESCRIPTION: Clients provided with BIND #dos2unix PROVIDES: dos2unix unix2dos DESCRIPTION: convert text file line endings between CRLF and LF #dosfstools PROVIDES: mkdosfs mkfs.vfat DESCRIPTION: utilities for making and checking MS-DOS FAT filesystems #dropbear PROVIDES: dbclient dropbear dropbearkey DESCRIPTION: lightweight SSH2 server and client #dselect PROVIDES: dselect DESCRIPTION: Debian package management front-end #e2fsck-static PROVIDES: e2fsck.static DESCRIPTION: statically-linked version of the ext2/ext3/ext4 filesystem checker #ed PROVIDES: red DESCRIPTION: The classic UNIX line editor #eject PROVIDES: eject volname DESCRIPTION: ejects CDs and operates CD-Changers under Linux #emboss PROVIDES: digest DESCRIPTION: the european molecular biology open software suite #esound PROVIDES: esd DESCRIPTION: Enlightened Sound Daemon - Support binaries #esound-clients PROVIDES: esdcat esdctl esddsp esdfilt esdloop esdmon esdplay esdrec esdsample DESCRIPTION: Enlightened Sound Daemon - clients #ethtool PROVIDES: ethtool DESCRIPTION: display or change Ethernet device settings #ettercap PROVIDES: ettercap DESCRIPTION: Multipurpose sniffer/interceptor/logger for switched LAN #ettercap-common PROVIDES: etterfilter etterlog DESCRIPTION: Common support files and plugins for ettercap #exo-utils PROVIDES: exo-csource exo-desktop-item-edit exo-mount exo-open exo-preferred-applications DESCRIPTION: Utility files for libexo #exuberant-ctags PROVIDES: ctags-exuberant DESCRIPTION: build tag file indexes of source code definitions #fam PROVIDES: famd DESCRIPTION: File Alteration Monitor #fbset PROVIDES: fbset DESCRIPTION: framebuffer device maintenance program #fdflush PROVIDES: fdflush DESCRIPTION: Flush out-of-date disk buffers #file PROVIDES: file DESCRIPTION: Determines file type using "magic" numbers #finger PROVIDES: finger DESCRIPTION: user information lookup program #flex PROVIDES: flex++ DESCRIPTION: A fast lexical analyzer generator. #fontconfig PROVIDES: fc-cache fc-cat fc-list fc-match fc-query fc-scan DESCRIPTION: generic font configuration library - support binaries #fortune-mod PROVIDES: strfile unstr DESCRIPTION: provides fortune cookies on demand #ftp PROVIDES: netkit-ftp DESCRIPTION: The FTP client #fuse-utils PROVIDES: fusermount DESCRIPTION: Filesystem in USErspace (utilities) #fvwm PROVIDES: fvwm2 fvwm-bug FvwmCommand fvwm-config fvwm-convert-2.4 fvwm-convert-2.6 fvwm-menu-desktop fvwm-menu-directory fvwm-menu-headlines fvwm-menu-xlock fvwm-perllib fvwm-root DESCRIPTION: F(?) Virtual Window Manager #gawk PROVIDES: gawk igawk pgawk DESCRIPTION: GNU awk, a pattern scanning and processing language #gcc PROVIDES: c89-gcc c99-gcc gcc gcov DESCRIPTION: The GNU C compiler #gcc-4.1 PROVIDES: gcc-4.1 gccbug-4.1 gcov-4.1 DESCRIPTION: The GNU C compiler #gcj-4.4-jdk PROVIDES: appletviewer jar jarsigner javac javadoc javah jdb native2ascii rmic serialver DESCRIPTION: gcj and classpath development tools for Java(TM) #gcj-4.4-jre-headless PROVIDES: java keytool orbd rmid rmiregistry tnameserv DESCRIPTION: Java runtime environment using GIJ/classpath (headless version) #gconf2 PROVIDES: gconf-merge-tree gconf-schemas gconftool-2 update-gconf-defaults DESCRIPTION: GNOME configuration database system (support tools) #gdb PROVIDES: gcore gdb gdbtui DESCRIPTION: The GNU Debugger #gdbserver PROVIDES: gdbserver DESCRIPTION: The GNU Debugger (remote server) #gettext PROVIDES: gettextize msgattrib msgcat msgcmp msgcomm msgconv msgen msgexec msgfilter msgfmt msggrep msginit msgmerge msgunfmt msguniq recode-sr-latin xgettext DESCRIPTION: GNU Internationalization utilities #gettext-base PROVIDES: envsubst gettext gettext.sh ngettext DESCRIPTION: GNU Internationalization utilities for the base system #ghdl PROVIDES: gccbug DESCRIPTION: VHDL compiler/simulator using GCC technology #ghostscript PROVIDES: bdftops dumphint dvipdf eps2eps font2c gsbj gsdj gsdj500 gslj gslp gsnd pdf2dsc pdf2ps pdfopt pf2afm pfbtopfa pphs printafm ps2ascii ps2epsi ps2pdf12 ps2pdf13 ps2pdf14 ps2pdfwr ps2ps ps2ps2 wftopfa DESCRIPTION: The GPL Ghostscript PostScript/PDF interpreter #gksu PROVIDES: gksu DESCRIPTION: graphical frontend to su #gnome-keyring PROVIDES: gnome-keyring-daemon DESCRIPTION: GNOME keyring services (daemon and tools) #gnutls-bin PROVIDES: certtool gnutls-cli gnutls-cli-debug gnutls-serv psktool srptool DESCRIPTION: the GNU TLS library - commandline utilities #gosa-dev PROVIDES: update-locale DESCRIPTION: GOsa? development utilities #grub-coreboot PROVIDES: grub-install grub-reboot grub-set-default update-grub DESCRIPTION: GRand Unified Bootloader, version 2 (Coreboot version) #grub-legacy PROVIDES: grub grub-floppy grub-md5-crypt grub-terminfo mbchk mkbimage DESCRIPTION: GRand Unified Bootloader (Legacy version) #gv PROVIDES: gv DESCRIPTION: PostScript and PDF viewer for X #hal PROVIDES: hald hal-device hal-disable-polling hal-find-by-capability hal-find-by-property hal-get-property hal-is-caller-locked-out hal-lock hal-set-property lshal umount.hal DESCRIPTION: Hardware Abstraction Layer #hardening-wrapper PROVIDES: gcc-4.2 DESCRIPTION: Compiler wrapper to enable security hardening flags #hdparm PROVIDES: hdparm DESCRIPTION: tune hard disk parameters for high performance #heimdal-clients PROVIDES: kadmin kdestroy kinit klist kpasswd ksu ktutil DESCRIPTION: Heimdal Kerberos - clients #heimdal-dev PROVIDES: krb5-config DESCRIPTION: Heimdal Kerberos - development files #html2text PROVIDES: html2text DESCRIPTION: advanced HTML to text converter #htop PROVIDES: htop DESCRIPTION: interactive processes viewer #icecc PROVIDES: cc DESCRIPTION: distributed compiler (client and server) #iceweasel PROVIDES: firefox DESCRIPTION: Web browser based on Firefox #id-utils PROVIDES: lid DESCRIPTION: Fast, high-capacity, identifier database tool #ifmetric PROVIDES: ifmetric DESCRIPTION: Set routing metrics for a network interface #ifplugd PROVIDES: ifplugd ifplugstatus DESCRIPTION: configuration daemon for ethernet devices #ifstat PROVIDES: ifstat DESCRIPTION: InterFace STATistics Monitoring #inetutils-ftpd PROVIDES: ftpd DESCRIPTION: File Transfer Protocol server #inetutils-telnet PROVIDES: inetutils-telnet DESCRIPTION: telnet client #inetutils-telnetd PROVIDES: telnetd DESCRIPTION: telnet server #inetutils-tools PROVIDES: inetutils-ifconfig DESCRIPTION: base networking utilities (experimental package) #initramfs-tools PROVIDES: mkinitramfs mkinitramfs-kpkg update-initramfs DESCRIPTION: tools for generating an initramfs #installation-report PROVIDES: report-hw DESCRIPTION: system installation report #ipcalc PROVIDES: ipcalc DESCRIPTION: parameter calculator for IPv4 addresses #ipsec-tools PROVIDES: setkey DESCRIPTION: IPsec tools for Linux #ipsvd PROVIDES: tcpsvd udpsvd DESCRIPTION: Internet protocol service daemons #iputils-clockdiff PROVIDES: clockdiff DESCRIPTION: Measure the time difference between networked computers #iputils-tracepath PROVIDES: tracepath tracepath6 DESCRIPTION: Tools to trace the network path to a remote host #isc-dhcp-relay PROVIDES: dhcrelay DESCRIPTION: ISC DHCP relay daemon #isc-dhcp-server PROVIDES: dhcpd DESCRIPTION: ISC DHCP server for automatic IP address assignment #ispell PROVIDES: buildhash findaffix icombine ijoin ispell munchlist sq tryaffix unsq update-ispell-dictionary DESCRIPTION: International Ispell (an interactive spelling corrector) #jackd1 PROVIDES: alsa_in alsa_out jack_alias jack_bufsize jack_connect jackd jack_disconnect jack_evmon jack_freewheel jack_impulse_grabber jack_load jack_lsp jack_metro jack_midiseq jack_midisine jack_monitor_client jack_netsource jackrec jack_showtime jack_simple_client jack_transport jack_unload DESCRIPTION: JACK Audio Connection Kit (server and example clients) #joe PROVIDES: joe DESCRIPTION: user friendly full screen text editor #john PROVIDES: john mailer DESCRIPTION: active password cracking tool #kate PROVIDES: kate DESCRIPTION: K Advanced Text Editor #kbd PROVIDES: loadunimap mapscrn psfxtable resizecons setfont showconsolefont DESCRIPTION: Linux console font and keytable utilities #kdebase-dbg PROVIDES: kwrite DESCRIPTION: debugging symbols for the KDE base applications module #kdelibs4c2a PROVIDES: fileshareset imagetops DESCRIPTION: core libraries and binaries for all KDE applications #kdelibs-dbg PROVIDES: artsmessage cupsdconf cupsdoprint dcop dcopclient dcopfind dcopobject dcopquit dcopref dcopserver dcopserver_shutdown dcopstart kab2kabc kaddprinterwizard kbuildsycoca kcmshell kconf_update kcookiejar kde-config kded kdeinit kdeinit_shutdown kdeinit_wrapper kde-menu kdesu_stub kdontchangethehostname kdostartupconfig kfile kgrantpty khotnewstuff kinstalltheme kioexec kio_http_cache_cleaner kioslave kio_uiserver klauncher kmailservice kpac_dhcp_helper ksendbugmail kshell kstartupconfig ktelnetservice ktradertest kwrapper lnusertemp make_driver_db_cups make_driver_db_lpr meinproc start_kdeinit start_kdeinit_wrapper DESCRIPTION: debugging symbols for kdelibs #krb5-admin-server PROVIDES: kadmind kadmin.local kprop DESCRIPTION: MIT Kerberos master server (kadmind) #krb5-clients PROVIDES: telnet.krb5 DESCRIPTION: Secure replacements for ftp, telnet and rsh using MIT Kerberos #krb5-kdc PROVIDES: kdb5_util kpropd krb5kdc DESCRIPTION: MIT Kerberos key server (KDC) #krb5-kdc-ldap PROVIDES: kdb5_ldap_util DESCRIPTION: MIT Kerberos key server (KDC) LDAP plugin #krb5-rsh-server PROVIDES: klogind kshd login.krb5 DESCRIPTION: Secure replacements for rshd and rlogind using MIT Kerberos #krb5-user PROVIDES: k5srvutil kvno DESCRIPTION: Basic programs to authenticate using MIT Kerberos #laptop-detect PROVIDES: laptop-detect DESCRIPTION: attempt to detect a laptop #ldap2zone PROVIDES: ldap2zone DESCRIPTION: Extract DNS zones from LDAP trees #ldap-utils PROVIDES: ldapadd ldapcompare ldapdelete ldapexop ldapmodify ldapmodrdn ldappasswd ldapsearch ldapurl ldapwhoami DESCRIPTION: OpenLDAP utilities #less PROVIDES: less lessecho lesskey lesspipe DESCRIPTION: pager program similar to more #libarts1c2a PROVIDES: artsdsp DESCRIPTION: aRts sound system core components #libbonobo2-bin PROVIDES: activation-client bonobo-activation-sysconf bonobo-slay echo-client-2 DESCRIPTION: Bonobo CORBA interfaces library -- support binaries #libc-dev-bin PROVIDES: gencat mtrace rpcgen sprof DESCRIPTION: Embedded GNU C Library: Development binaries #libcroco3 PROVIDES: csslint-0.6 DESCRIPTION: a generic Cascading Style Sheet (CSS) parsing and manipulation toolkit #libdb1-compat PROVIDES: db_dump185 DESCRIPTION: The Berkeley database routines [glibc 2.0/2.1 compatibility] #libfreetype6-dev PROVIDES: freetype-config DESCRIPTION: FreeType 2 font engine, development files #libfribidi0 PROVIDES: fribidi DESCRIPTION: Free Implementation of the Unicode BiDi algorithm #libgcj-common PROVIDES: rebuild-security-providers DESCRIPTION: Java runtime library (common files) #libgksu2-0 PROVIDES: gksu-properties DESCRIPTION: library providing su and sudo functionality #libglib2.0-0-dbg PROVIDES: glib-genmarshal gobject-query DESCRIPTION: The GLib libraries and debugging symbols #libglib2.0-dev PROVIDES: glib-gettextize glib-mkenums DESCRIPTION: Development files for the GLib library #libgnome2-0 PROVIDES: gnome-open DESCRIPTION: The GNOME library - runtime files #libgnomevfs2-0-dbg PROVIDES: gnomevfs-cat gnomevfs-copy gnomevfs-df gnomevfs-info gnomevfs-ls gnomevfs-mkdir gnomevfs-monitor gnomevfs-mv gnomevfs-rm DESCRIPTION: GNOME Virtual File System (debugging libraries) #libgpg-error-dev PROVIDES: gpg-error DESCRIPTION: library for common error values and messages in GnuPG components #libgtk2.0-0-dbg PROVIDES: gdk-pixbuf-csource DESCRIPTION: The GTK+ libraries and debugging symbols #libgtk2.0-bin PROVIDES: gdk-pixbuf-query-loaders gtk-query-immodules-2.0 gtk-update-icon-cache update-icon-caches DESCRIPTION: The programs for the GTK+ graphical user interface library #libgtk2.0-dev PROVIDES: dh_gtkmodules gtk-builder-convert DESCRIPTION: Development files for the GTK+ library #libjpeg-progs PROVIDES: cjpeg djpeg exifautotran jpegexiforient jpegtran rdjpgcom wrjpgcom DESCRIPTION: Programs for manipulating JPEG files #liblockfile1 PROVIDES: dotlockfile DESCRIPTION: NFS-safe locking library, includes dotlockfile program #libmysqlclient-dev PROVIDES: mysql_config DESCRIPTION: MySQL database development files #libnss3-1d-dbg PROVIDES: certutil cmsutil crlutil modutil pk12util shlibsign signtool signver ssltap DESCRIPTION: Debugging symbols for the Network Security Service libraries #libpango1.0-0-dbg PROVIDES: pango-querymodules pango-view DESCRIPTION: The Pango library and debugging symbols #libpango1.0-common PROVIDES: update-pangox-aliases DESCRIPTION: Modules and configuration files for the Pango #libpango1.0-dev PROVIDES: dh_pangomodules DESCRIPTION: Development files for the Pango #libpaper-utils PROVIDES: paperconf paperconfig DESCRIPTION: library for handling paper characteristics (utilities) #libpcre3 PROVIDES: pcretest DESCRIPTION: Perl 5 Compatible Regular Expression Library - runtime files #libpcre3-dbg PROVIDES: pcregrep DESCRIPTION: Perl 5 Compatible Regular Expression Library - debug symbols #libpcre3-dev PROVIDES: pcre-config DESCRIPTION: Perl 5 Compatible Regular Expression Library - development files #libpng12-dev PROVIDES: libpng12-config DESCRIPTION: PNG library - development #libppl0.10-dev PROVIDES: ppl-config DESCRIPTION: Parma Polyhedra Library (development) #librep-dbg PROVIDES: rep rep-remote DESCRIPTION: debug symbols for librep #librpm-dbg PROVIDES: rpm rpm2cpio rpmgraph DESCRIPTION: debugging symbols for RPM #libruby1.8-dbg PROVIDES: ruby1.8 DESCRIPTION: Debugging symbols for Ruby 1.8 #libsmi2-dbg PROVIDES: smidiff smidump smilint smiquery smixlate DESCRIPTION: library to access SMI MIB information - debugging symbols #libsmi2ldbl PROVIDES: smicache DESCRIPTION: library to access SMI MIB information #libsnmp15 PROVIDES: net-snmp-config DESCRIPTION: SNMP (Simple Network Management Protocol) library #libtool PROVIDES: libtool libtoolize DESCRIPTION: Generic library support script #libxfce4util-bin PROVIDES: xfce4-kiosk-query DESCRIPTION: tools for libxfce4util #libxft-dev PROVIDES: xft-config DESCRIPTION: FreeType-based font drawing library for X (development files) #libxt-dev PROVIDES: makestrs DESCRIPTION: X11 toolkit intrinsics library (development headers) #lighttpd PROVIDES: lighttpd lighttpd-angel DESCRIPTION: A fast webserver with minimal memory footprint #links PROVIDES: links DESCRIPTION: Web browser running in text mode #links2 PROVIDES: links2 xlinks2 DESCRIPTION: Web browser running in both graphics and text mode #loadlin PROVIDES: freeramdisk DESCRIPTION: a loader (running under DOS) for LINUX kernel images #locales PROVIDES: locale-gen validlocale DESCRIPTION: Embedded GNU C Library: National Language (locale) data [support] #lpr PROVIDES: lpd DESCRIPTION: BSD lpr/lpd line printer spooling system #lrzsz PROVIDES: rx DESCRIPTION: Tools for zmodem/xmodem/ymodem file transfer #lsof PROVIDES: lsof DESCRIPTION: List open files #lwresd PROVIDES: lwresd DESCRIPTION: Lightweight Resolver Daemon #lzma PROVIDES: lzcat lzma unlzma DESCRIPTION: Compression method of 7z format in 7-Zip program #lzma-alone PROVIDES: lzma_alone DESCRIPTION: Compression method of 7z format in 7-Zip program #lzop PROVIDES: lzop DESCRIPTION: fast compression program #m4 PROVIDES: m4 DESCRIPTION: a macro processing language #make PROVIDES: make DESCRIPTION: An utility for Directing compilation. #makedev PROVIDES: MAKEDEV DESCRIPTION: creates device files in /dev #man2html PROVIDES: man2html DESCRIPTION: browse man pages in your web browser #menu PROVIDES: install-menu su-to-root update-menus DESCRIPTION: generates programs menu for all menu-aware applications #microcom PROVIDES: microcom DESCRIPTION: minimalistic terminal program #mii-diag PROVIDES: mii-diag DESCRIPTION: A little tool to manipulate network cards #mime-support PROVIDES: run-mailcap update-mime DESCRIPTION: MIME files 'mime.types' & 'mailcap', and support programs #mingetty PROVIDES: mingetty DESCRIPTION: Console-only getty #mingw32-ocaml PROVIDES: ocamlc ocamlcp ocamldep ocamlmklib ocamlmktop ocamlopt ocamlprof ocamlrun DESCRIPTION: OCaml cross-compiler based on mingw32 #mpack PROVIDES: mpack munpack DESCRIPTION: tools for encoding/decoding MIME messages #mtd-utils PROVIDES: nanddump nandwrite ubiattach ubidetach ubimkvol ubirmvol ubiupdatevol DESCRIPTION: Memory Technology Device Utilities #mtools PROVIDES: amuFormat.sh mcheck mcomp mkmanifest mtools mxtar tgz uz DESCRIPTION: Tools for manipulating MSDOS files #mtr PROVIDES: mtr DESCRIPTION: Full screen ncurses and X11 traceroute tool #muddleftpd PROVIDES: ftpwho DESCRIPTION: A flexible and efficient FTP daemon #mysql-client-5.1 PROVIDES: innochecksum myisam_ftdump my_print_defaults mysql mysqlaccess mysqladmin mysqlbug mysqlcheck mysql_client_test mysqldump mysqldumpslow mysql_find_rows mysql_fix_extensions mysqlimport mysqlmanager mysqlshow mysql_waitpid perror DESCRIPTION: MySQL database client binaries #mysql-server-5.1 PROVIDES: msql2mysql myisamchk myisamlog myisampack mysqlbinlog mysql_convert_table_format mysqld_multi mysqld_safe mysql_fix_privilege_tables mysqlhotcopy mysql_install_db mysql_secure_installation mysql_setpermission mysqltest mysql_tzinfo_to_sql mysql_upgrade mysql_zap replace resolveip resolve_stack_dump DESCRIPTION: MySQL database server binaries and system database setup #mysql-server-core-5.1 PROVIDES: mysqld DESCRIPTION: MySQL database server binaries #nast PROVIDES: nast DESCRIPTION: packet sniffer and lan analyzer #nbd-client PROVIDES: nbd-client DESCRIPTION: Network Block Device protocol - client #ncftp PROVIDES: ncftpbatch ncftpget ncftpls ncftpput ncftpspooler DESCRIPTION: A user-friendly and well-featured FTP client #netatalk PROVIDES: adv1tov2 aecho afpd afpd-mtab.pl apple_chfile apple_cp apple_file apple_mv apple_rm asip-status.pl atalkd cnid2_create cnid_dbd cnid_metad getzones lp2pap.sh macusers megatron nbplkup nbprgstr nbpunrgstr netatalk-uniconv pap papd papstatus psorder showppd timelord DESCRIPTION: AppleTalk user binaries #nfs-common PROVIDES: gss_clnt_send_err gss_destroy_creds mount.nfs mount.nfs4 nfsstat rpcdebug rpc.gssd rpc.idmapd rpc.statd showmount sm-notify umount.nfs umount.nfs4 DESCRIPTION: NFS support files common to client and server #nfs-kernel-server PROVIDES: exportfs rpc.mountd rpc.nfsd rpc.svcgssd DESCRIPTION: support for NFS kernel server #nis PROVIDES: rpc.yppasswdd rpc.ypxfrd ypbind ypcat ypchfn ypchsh ypmatch yppasswd yppoll yppush ypserv ypserv_test ypset yptest ypwhich DESCRIPTION: clients and daemons for the Network Information Service (NIS) #nmap PROVIDES: ncat ndiff nmap DESCRIPTION: The Network Mapper #ntp PROVIDES: ntpd ntpdc ntp-keygen ntpq ntptime ntptrace ntp-wait tickadj DESCRIPTION: Network Time Protocol daemon and utility programs #ntpdate PROVIDES: ntpdate DESCRIPTION: client for setting system time from NTP servers #ocaml PROVIDES: labltk ocamlbrowser DESCRIPTION: ML language implementation with a class-based object system #ocaml-interp PROVIDES: ocaml DESCRIPTION: OCaml interactive interpreter and standard libraries #ocaml-nox PROVIDES: ocamlbuild.byte ocamlbuild.native ocamldebug ocamldoc ocamldumpobj ocamllex ocamlobjinfo ocamlyacc DESCRIPTION: ML implementation with a class-based object system (no X) #odt2txt PROVIDES: sxw2txt DESCRIPTION: simple converter from OpenDocument Text to plain text #omniidl PROVIDES: omnicpp omniidl DESCRIPTION: omniORB IDL to C++ and Python compiler #openbsd-inetd PROVIDES: inetd DESCRIPTION: The OpenBSD Internet Superserver #openjdk-6-dbg PROVIDES: apt extcheck idlj javap jconsole jhat jinfo jmap jps jrunscript jsadebugd jstack jstat jstatd pack200 policytool schemagen servertool unpack200 wsgen wsimport xjc DESCRIPTION: Java runtime based on OpenJDK (debugging symbols) #openjdk-6-jre PROVIDES: javaws DESCRIPTION: OpenJDK Java runtime, using Hotspot JIT #openssh-client PROVIDES: scp sftp slogin ssh ssh-add ssh-agent ssh-argv0 ssh-copy-id ssh-keygen ssh-keyscan DESCRIPTION: secure shell (SSH) client, for secure access to remote machines #openssh-server PROVIDES: sshd DESCRIPTION: secure shell (SSH) server, for secure access from remote machines #openswan PROVIDES: ipsec DESCRIPTION: Internet Key Exchange daemon #orbit2 PROVIDES: ior-decode-2 linc-cleanup-sockets typelib-dump DESCRIPTION: a CORBA ORB #patch PROVIDES: patch DESCRIPTION: Apply a diff file to an original #pciutils PROVIDES: lspci pcimodules setpci update-pciids DESCRIPTION: Linux PCI Utilities #pidentd PROVIDES: identd ikeygen DESCRIPTION: TCP/IP IDENT protocol server with DES support #pkg-config PROVIDES: pkg-config DESCRIPTION: manage compile and link flags for libraries #policycoreutils PROVIDES: audit2allow audit2why chcat fixfiles genhomedircon load_policy newrole open_init_pty restorecon run_init secon se_dpkg semanage semodule semodule_deps semodule_expand semodule_link semodule_package sepolgen-ifgen sestatus setfiles setsebool DESCRIPTION: SELinux core policy utilities #policykit-1 PROVIDES: pkaction pkcheck pkexec DESCRIPTION: framework for managing administrative policies and privileges #portmap PROVIDES: pmap_dump pmap_set portmap DESCRIPTION: RPC port mapper #postfix PROVIDES: postalias postcat postconf postdrop postfix postkick postlock postlog postmap postmulti postqueue postsuper qmqp-sink qmqp-source qshape smtp-sink smtp-source DESCRIPTION: High-performance mail transport agent #powertop PROVIDES: powertop DESCRIPTION: Linux tool to find out what is using power on a laptop #ppp PROVIDES: chat DESCRIPTION: Point-to-Point Protocol (PPP) - daemon #proftpd-basic PROVIDES: ftpcount ftpdctl ftpshut ftptop proftpd DESCRIPTION: Versatile, virtual-hosting FTP daemon - binaries #protoize PROVIDES: protoize unprotoize DESCRIPTION: Create/remove ANSI prototypes from C code #pscan PROVIDES: pscan DESCRIPTION: Format string security checker for C files #psfontmgr PROVIDES: defoma-psfont-installer DESCRIPTION: PostScript font manager -- part of Defoma, Debian Font Manager #psmisc PROVIDES: fuser killall peekfd pstree pstree.x11 DESCRIPTION: utilities that use the proc file system #pulseaudio PROVIDES: pulseaudio DESCRIPTION: PulseAudio sound server #pulseaudio-esound-compat PROVIDES: esdcompat DESCRIPTION: PulseAudio ESD compatibility layer #python PROVIDES: 2to3 pydoc DESCRIPTION: interactive high-level object-oriented language (default version) #python2.6-dbg PROVIDES: python2.6 DESCRIPTION: Debug Build of the Python Interpreter (version 2.6) #python-central PROVIDES: dh_pycentral pycentral py_compilefiles DESCRIPTION: register and build utility for Python packages #python-minimal PROVIDES: python DESCRIPTION: minimal subset of the Python language (default version) #python-support PROVIDES: dh_pysupport update-python-modules DESCRIPTION: automated rebuilding support for Python modules #quagga PROVIDES: vtysh DESCRIPTION: BGP/OSPF/RIP routing daemon #racoon PROVIDES: plainrsa-gen racoon racoonctl DESCRIPTION: IPsec IKE keying daemon #radvd PROVIDES: radvd radvdump DESCRIPTION: Router Advertisement Daemon #rdate PROVIDES: rdate DESCRIPTION: sets the system's date from a remote host #readahead-fedora PROVIDES: readahead DESCRIPTION: Fedora's implementation of readahead to preload boot process files #reportbug PROVIDES: querybts reportbug DESCRIPTION: reports bugs in the Debian distribution #resolvconf PROVIDES: resolvconf DESCRIPTION: name server information handler #rlinetd PROVIDES: update-inetd DESCRIPTION: gruesomely over-featured inetd replacement #roxterm PROVIDES: roxterm roxterm-config DESCRIPTION: Multi-tabbed GTK/VTE terminal emulator #rpcbind PROVIDES: rpcbind DESCRIPTION: converts RPC program numbers into universal addresses #rpm PROVIDES: gendiff rpmdb rpmquery rpmsign rpmverify DESCRIPTION: package manager for RPM #rsync PROVIDES: rsync DESCRIPTION: fast remote file copy program (like rcp) #ruby1.8 PROVIDES: erb1.8 testrb1.8 DESCRIPTION: Interpreter of object-oriented scripting language Ruby 1.8 #runit PROVIDES: chpst runsv runsvdir sv svlogd DESCRIPTION: system-wide service supervision #rxvt PROVIDES: rclock rxvt-xpm rxvt-xterm DESCRIPTION: VT102 terminal emulator for the X Window System #samba-common-bin PROVIDES: smbpasswd DESCRIPTION: common files used by both the Samba server and client #sash PROVIDES: sash DESCRIPTION: Stand-alone shell #sawfish PROVIDES: sawfish sawfish-client sawfish-ui DESCRIPTION: a window manager for X11 #setserial PROVIDES: setserial DESCRIPTION: controls configuration of serial ports #sgml-base PROVIDES: install-sgmlcatalog update-catalog DESCRIPTION: SGML infrastructure and SGML catalog file support #sharutils PROVIDES: compress-dummy mail-files mailshar remsync shar unshar uudecode uuencode DESCRIPTION: shar, unshar, uuencode, uudecode #slapd PROVIDES: slapacl slapadd slapauth slapcat slapd slapdn slapindex slappasswd slaptest DESCRIPTION: OpenLDAP server (slapd) #smbfs PROVIDES: mount.smbfs DESCRIPTION: Common Internet File System utilities - compatibility package #smistrip PROVIDES: smistrip DESCRIPTION: extract MIB from text files like RFC #snacc PROVIDES: berdecode mkchdr ptbl pval snacc snacc-config DESCRIPTION: ASN.1 to C or C++ or IDL compiler #snmp PROVIDES: encode_keychange snmpbulkget snmpbulkwalk snmpdelta snmpdf snmpget snmpgetnext snmpinform snmpnetstat snmpset snmpstatus snmptable snmptest snmptranslate snmptrap snmpusm snmpvacm snmpwalk DESCRIPTION: SNMP (Simple Network Management Protocol) applications #snmpd PROVIDES: snmpd snmptrapd DESCRIPTION: SNMP (Simple Network Management Protocol) agents #socat PROVIDES: filan procan socat DESCRIPTION: multipurpose relay for bidirectional data transfer #sshfs PROVIDES: sshfs DESCRIPTION: filesystem client based on SSH File Transfer Protocol #ssl-cert PROVIDES: make-ssl-cert DESCRIPTION: simple debconf wrapper for OpenSSL #strace PROVIDES: strace DESCRIPTION: A system call tracer #sudo PROVIDES: sudo sudoedit sudoreplay visudo DESCRIPTION: Provide limited super user privileges to specific users #sysfsutils PROVIDES: systool DESCRIPTION: sysfs query tool and boot-time setup #sysklogd PROVIDES: syslogd-listfiles syslog-facility DESCRIPTION: System Logging Daemon #sysstat PROVIDES: iostat mpstat DESCRIPTION: system performance tools for Linux #tack PROVIDES: tack DESCRIPTION: terminfo action checker #tcl8.4 PROVIDES: tclsh8.4 DESCRIPTION: Tcl (the Tool Command Language) v8.4 - run-time files #tcm PROVIDES: tcpd DESCRIPTION: Toolkit for Conceptual Modeling (TCM) #tcpd PROVIDES: safe_finger tcpdchk tcpdmatch try-from DESCRIPTION: Wietse Venema's TCP wrapper utilities #tcpdump PROVIDES: tcpdump DESCRIPTION: A powerful tool for network monitoring and data acquisition #tcsh PROVIDES: tcsh DESCRIPTION: TENEX C Shell, an enhanced version of Berkeley csh #telnet PROVIDES: telnet.netkit DESCRIPTION: The telnet client #texinfo PROVIDES: makeinfo texi2dvi texi2pdf texindex DESCRIPTION: Documentation system for on-line information and printed output #tftp PROVIDES: tftp DESCRIPTION: Trivial file transfer protocol client #thunar PROVIDES: Thunar DESCRIPTION: File Manager for Xfce #time PROVIDES: time DESCRIPTION: The GNU time program for measuring cpu resource usage #tk8.4 PROVIDES: wish8.4 DESCRIPTION: Tk toolkit for Tcl and X11, v8.4 - run-time files #tshark PROVIDES: tshark DESCRIPTION: network traffic analyzer - console version #ucf PROVIDES: lcf ucf ucfq ucfr DESCRIPTION: Update Configuration File: preserve user changes to config files. #udev PROVIDES: udevadm udevd DESCRIPTION: /dev/ and hotplug management daemon #udhcpc PROVIDES: udhcpc DESCRIPTION: Provides the busybox DHCP client implementation #udhcpd PROVIDES: dumpleases udhcpd DESCRIPTION: Provides the busybox DHCP server implementation #uml-utilities PROVIDES: tunctl DESCRIPTION: User-mode Linux (utility programs) #unzip PROVIDES: unzip DESCRIPTION: De-archiver for .zip files #usbutils PROVIDES: lsusb update-usbids usb-devices DESCRIPTION: Linux USB utilities #uuid-runtime PROVIDES: uuidgen DESCRIPTION: runtime components for the Universally Unique ID library #vim PROVIDES: vim.basic DESCRIPTION: Vi IMproved - enhanced vi editor #vim-addon-manager PROVIDES: vim-addons DESCRIPTION: manager of addons for the Vim editor #vim-runtime PROVIDES: vimtutor DESCRIPTION: Vi IMproved - Runtime files #vim-scripts PROVIDES: dtd2vim vimplate DESCRIPTION: plugins for vim, adding bells and whistles #vlan PROVIDES: vconfig DESCRIPTION: user mode programs to enable VLANs on your ethernet devices #vlock PROVIDES: vlock DESCRIPTION: Virtual Console locking program #w3m PROVIDES: w3m w3mman DESCRIPTION: WWW browsable pager with excellent tables/frames support #watchdog PROVIDES: watchdog DESCRIPTION: A software watchdog #whois PROVIDES: mkpasswd whois DESCRIPTION: an intelligent whois client #wireshark PROVIDES: wireshark DESCRIPTION: network traffic analyzer - GTK+ version #wireshark-common PROVIDES: capinfos dumpcap editcap mergecap text2pcap DESCRIPTION: network traffic analyzer - common files #wireshark-dev PROVIDES: asn2deb idl2deb idl2wrs DESCRIPTION: network traffic analyzer - development tools #x11-apps PROVIDES: atobm bitmap bmtoa ico oclock x11perf x11perfcomp xbiff xcalc xclipboard xclock xconsole xcursorgen xcutsel xditview xedit xeyes xgc xload xlogo xmag xman xmore xwd xwud DESCRIPTION: X applications #x11-session-utils PROVIDES: rstart rstartd smproxy xsm DESCRIPTION: X session utilities #x11-utils PROVIDES: appres editres listres luit viewres xdpyinfo xdriinfo xev xfd xfontsel xkill xlsatoms xlsclients xlsfonts xmessage xprop xvinfo xwininfo DESCRIPTION: X11 utilities #x11-xfs-utils PROVIDES: fslsfonts fstobdf showfont xfsinfo DESCRIPTION: X font server utilities #x11-xkb-utils PROVIDES: setxkbmap xkbbell xkbcomp xkbevd xkbprint xkbvleds xkbwatch DESCRIPTION: X11 XKB utilities #x11-xserver-utils PROVIDES: iceauth sessreg showrgb xcmsdb xgamma xhost xmodmap xrandr xrdb xrefresh xset xsetmode xsetpointer xsetroot xstdcmap xvidtune DESCRIPTION: X server utilities #xauth PROVIDES: xauth DESCRIPTION: X authentication utility #xdg-user-dirs PROVIDES: xdg-user-dir xdg-user-dirs-update DESCRIPTION: tool to manage well known user directories #xdg-user-dirs-gtk PROVIDES: xdg-user-dirs-gtk-update DESCRIPTION: tool to manage well known user directories (Gtk extension) #xdg-utils PROVIDES: xdg-desktop-icon xdg-desktop-menu xdg-email xdg-icon-resource xdg-mime xdg-open xdg-screensaver xdg-settings DESCRIPTION: desktop integration utilities from freedesktop.org #xfce4-panel PROVIDES: xfce4-panel xfce4-popup-windowlist DESCRIPTION: The Xfce4 desktop environment panel #xfce4-session PROVIDES: balou-export-theme balou-install-theme xfce4-session xfce4-session-logout xfce4-tips xfsm-shutdown-helper DESCRIPTION: Xfce4 Session Manager #xfce4-terminal PROVIDES: xfce4-terminal xfce4-terminal.wrapper DESCRIPTION: Xfce terminal emulator #xfce4-utils PROVIDES: startxfce4 xfbrowser4 xfce4-about xfhelp4 xflock4 xfmountdev4 xfrun4 xfterm4 DESCRIPTION: Various tools for Xfce #xfdesktop4 PROVIDES: xfce4-popup-menu xfdesktop DESCRIPTION: xfce desktop background, icons and root menu manager #xfonts-utils PROVIDES: bdftopcf bdftruncate mkfontdir mkfontscale ucs2any update-fonts-alias update-fonts-dir update-fonts-scale DESCRIPTION: X Window System font utility programs #xfwm4 PROVIDES: xfwm4 DESCRIPTION: window manager of the Xfce project #xinetd PROVIDES: itox xinetd DESCRIPTION: replacement for inetd with many enhancements #xinit PROVIDES: startx xinit DESCRIPTION: X server initialisation tool #xml-core PROVIDES: dh_installxmlcatalogs update-xmlcatalog DESCRIPTION: XML infrastructure and XML catalog file support #xserver-xorg PROVIDES: dexconf X DESCRIPTION: the X.Org X server #xterm PROVIDES: koi8rxterm lxterm resize uxterm xterm DESCRIPTION: X terminal emulator #xtermcontrol PROVIDES: xtermcontrol DESCRIPTION: dynamic configuration of xterm properties #xtermset PROVIDES: xtermset DESCRIPTION: change the characteristics of an xterm #xutils-dev PROVIDES: ccmakedep cleanlinks gccmakedep imake lndir makedepend makeg mergelib mkdirhier mkhtmlindex revpath xmkmf DESCRIPTION: X Window System utility programs for development #xview-clients PROVIDES: clock cmdtool owplaces props textedit DESCRIPTION: XView client programs #xviewg PROVIDES: capitalize insert_brackets remove_brackets shift_lines DESCRIPTION: XView shared libraries #xvt PROVIDES: xvt DESCRIPTION: X terminal-emulator similar to xterm, but smaller #xzdec PROVIDES: lzmadec xzdec DESCRIPTION: XZ-format compression utilities - tiny decompressors marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/README0000600000175000017500000000275612167200764030720 0ustar lucaslucasAbout files `binary_list*' ------------------------ The files `binary_list.machine-*.*' have been generated launching in Marionnet the corresponding virtual machine, then executing (as root) the following bash function: function binary_list { local i DIRS DIRS=$(for i in ${PATH//:/ }; do [[ -d $i ]] && echo $i; done) find $DIRS -perm -u=x ! -type d ! -name "*[.]so*" -exec basename {} \; | sort | tr '\n' ' ' } About file `package_catalog.{wheezy,squeeze}.GENERATED' ------------------------------------------------------- Note that the generation of files `package_catalog.{wheezy,squeeze}.GENERATED' takes about 1 hour in a system with a good internet connection. About files `package_catalog.{wheezy,squeeze}.selection' -------------------------------------- The file `package_catalog.$RELEASE.selection' is the unique relevant source of informations for the script `pupisto.debian.sh'. Uncommented lines specify the packages that we want to include in the generated debian filesystem. If you rebuild the file `package_catalog.$RELEASE.GENERATED' (make $RELEASE), you have to manually merge it with `package_catalog.$RELEASE.selection'. For instance, if you have the tool `kdiff3' installed, you can proceed as follows: (I suppose here RELEASE="wheezy") $ make package_catalog.wheezy.COMPLETE.COMMENTED.selection $ kdiff3 -m -o /tmp/merging package_catalog.wheezy.{selection,COMPLETE.COMMENTED.selection} (resolve conflicts selecting B) # UPDATE! $ cat /tmp/merging > package_catalog.wheezy.selection ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/binary_list.UNIONmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/binary_list.0000600000175000017500000005453712167200764032364 0ustar lucaslucas [ 2to3 822-date a2dismod a2dissite a2enmod a2ensite a2p ab about-mandriva accessdb acleandir.rc aclocal-1.8 acpid acpi_listen activation-client addbuiltin addgroup addpart addr2line add-shell adduser adjtimex adnsheloex adnshost adnslogres adnsresfilter adv1tov2 advxsplitlogfile advxsplitlogfile.pl aecho afmdiff.awk afpd afpd-mtab.pl agentxtrap agetty akodeplay alsa.agent alsa_in alsa_out alternatives amuFormat.sh apache2 apache2ctl apachectl apple_chfile apple_cp apple_file apple_mv apple_rm appletviewer appres apropos apt apt-cache apt-cdrom apt-config apt-extracttemplates apt-ftparchive apt-get aptitude aptitude-create-state-bundle aptitude-run-state-bundle apt-key apt-mark apt-sortpkgs ar arch aria2c arp arpd arping artscat artsd artsdsp artsmessage artsplay artsrec artsshell artswrapper as ash asip-status.pl asn1Coding asn1Decoding asn1Parser asn2deb aspell aspell-autobuildhash aspell-import atalkd atob atobm attr audit2allow audit2why aumix-text authdaemond authenumerate authpasswd authtest autoconf autoheader autom4te automake-1.8 autopoint autoreconf autoscan autoupdate avahi-autoipd avahi-browse avahi-browse-domains avahi-daemon avahi-publish avahi-publish-address avahi-publish-service avahi-resolve avahi-resolve-address avahi-resolve-host-name avahi-set-host-name awk b2m babeld badblocks baddbdir balou-export-theme balou-install-theme base64 basename bash bash3 bashbug bc bdftopcf bdftops bdftruncate beep beforelight berdecode berkeley_db_svc bgpd biosdecode bitmap blkid blockdev bltest bmtoa bonobo-activation-sysconf bonobo-slay bootchartd bootlogd brctl bridg bridge bsd-write btoa build-classpath build-classpath-directory buildhash build-jar-repository bunzip2 busybox bzcat bzcmp bzdiff bzegrep bzexe bzfgrep bzgrep bzip2 bzip2recover bzless bzme bzmore c2ph c89 c89-gcc c99 c99-gcc cal calendar capinfos capitalize captoinfo cat catchsegv catman catv cc ccmakedep ccp cdbs-edit-patch certcgi certtool certutil cfdisk cfg2html cfg2html-linux c++filt chacl chage chat chattr chcat chcon check-binary-files checkcert check_forensic checkgid chfn chgpasswd chgrp chkconfig chkdupexe chksession chmod chown chpasswd chpst chroot chrt chsh chvt cjpeg ck-history ck-launch-session ck-list-sessions ck-log-system-restart ck-log-system-start ck-log-system-stop cksum cleanappledouble.pl clean-binary-files cleanlinks cleanup-info clear clear_console clock clockdiff cmdtool cmp cmsutil cnid2_create cnid_dbd cnid_index cnid_maint cnid_metad code2color col colcrt colrm column comm comp_err compress-dummy conflict consolehelper console-kit-daemon consoletype conspy ControlPanel convertsession courierauthconfig courier-config courierldapaliasd courierlogger couriertcpd couriertls cp cpan cpio cpp cpp-4.1 cpp-4.2 cpp-4.4.1 cppw Crack cracklib-check cracklib-format cracklib-packer cracklib-unpacker Crack-Reporter cramfsck create-cracklib-dict create-jar-links create_static_dev_nodes c_rehash crlutil crmftest cron crond crontab cryptpw cryptsetup csplit csslint-0.6 ctags ctags-exuberant ctrlaltdel ctstat cttyhack cupsdconf cupsdoprint curl curlftpfs cut cytune dash date db_archive db_checkpoint dbclient db_codegen db_deadlock db_dump db_dump185 db_hotbackup dbilogstrip dbiprof dbiproxy db_load dbmmanage db_printlog db_recover db_stat dbtest db_upgrade dbus-cleanup-sockets dbus-daemon dbus-launch dbus-monitor dbus-send dbus-uuidgen db_verify dc dcop dcopclient dcopfind dcopobject dcopquit dcopref dcopserver dcopserver_shutdown dcopstart dd ddate deallocvt debconf debconf-apt-progress debconf-communicate debconf-copydb debconf-escape debconf-gettextize debconf-set-selections debconf-show debconf-updatepo debugfs defoma defoma-hints defoma-psfont-installer defoma-reconfigure delgroup deliverquota delpart deluser depmod derdump desktop-file-install desktop-file-validate devmem dexconf df dga dh_builddeb dh_clean dhclient dhclient3 dhclient-script dh_compress dhcpd dhcpd-chroot.sh dhcpd-conf-to-ldap.pl dhcprelay dhcpreport.pl dhcrelay dh_desktop dh_fixperms dh_gconf dh_gencontrol dh_gtkmodules dh_icons dh_install dh_installcatalogs dh_installchangelogs dh_installcron dh_installdeb dh_installdebconf dh_installdefoma dh_installdirs dh_installdocs dh_installemacsen dh_installexamples dh_installifupdown dh_installinfo dh_installinit dh_installlogcheck dh_installlogrotate dh_installman dh_installmanpages dh_installmenu dh_installmime dh_installmodules dh_installpam dh_installppp dh_installudev dh_installwm dh_installxfonts dh_installxmlcatalogs dh_link dh_listpackages dh_makeshlibs dh_md5sums dh_movefiles dh_ocaml dh_pangomodules dh_perl dh_pycentral dh_pysupport dh_python dh_scrollkeeper dh_shlibdeps dh_strip dh_suidregister dh_testdir dh_testroot dh_testversion dh_undocumented dh_usrlocal diff diff3 diff-jars dig digest dir dircolors dirname djpeg dlist_test dmesg dmeventd dmidecode dmsetup dmsetup-static dmsetup.static dnsd dnsdomainname dns-keygen dnssec-dsfromkey dnssec-keyfromlabel dnssec-keygen dnssec-makekeyset dnssec-signkey dnssec-signzone doexec domainname dos2unix dotlockfile dpkg dpkg-architecture dpkg-buildpackage dpkg-checkbuilddeps dpkg-deb dpkg-distaddfile dpkg-divert dpkg-genchanges dpkg-gencontrol dpkg-gensymbols dpkg-name dpkg-parsechangelog dpkg-preconfigure dpkg-query dpkg-reconfigure dpkg-scanpackages dpkg-scansources dpkg-shlibdeps dpkg-source dpkg-split dpkg-statoverride dprofpp dropbear dropbearconvert dropbearkey dselect dtd2vim du dumpcap dumpe2fs dumphint dumpkeys dumpkmap dumpleases dvipdf e e2freefrag e2fsck e2fsck.static e2image e2label e2undo e3jsize ebrowse ebtables-restore ebtables-save echo echo-client-2 ed editcap editres egrep eject em emacs emacs-23.0.0 emacsclient enable_ssl.sh enc2xs encode_keychange env envdir envsubst envuidgid eps2eps eqn erb1.8 esd esdcat esdcompat esdctl esddsp esdfilt esdloop esdmon esdplay esdrec esdsample etags ether-wake ethghost ethtool ettercap etterfilter etterlog ex exifautotran exo-csource exo-desktop-item-edit exo-mount exo-open exo-preferred-applications expand expiry exportfs expr extcheck factor faillog fakeidentd false famd fbset fbsplash fc-cache fc-cat fc-list fc-match fc-query fc-scan fdflush fdformat fdisk fgconsole fgrep filan file filefrag fileshareset find find2perl findaffix findfs find-jar finger fipstest firefox fixfiles flex++ flock fmt fndSession fold font2c fontname fontprop free freeramdisk freetype-config fribidi from fsck fsck.cramfs fsck.ext2 fsck.ext3 fsck.ext4 fsck.ext4dev fsck.minix fsck.nfs fslsfonts fstab-decode fstobdf fsync ftp ftpcount ftpd ftpdctl ftpd.krb5 ftpget ftp.krb5 ftpput ftpshut ftptop ftpwho fuser fusermount fvwm2 fvwm-bug FvwmCommand fvwm-config fvwm-convert-2.4 fvwm-convert-2.6 fvwm-menu-desktop fvwm-menu-directory fvwm-menu-headlines fvwm-menu-xlock fvwm-perllib fvwm-root gawk gawk-3.1.7 gcc gcc-4.1 gcc-4.2 gcc-4.4.1 gcc4.4-version gccbug gccbug-4.1 gccmakedep gconf-merge-tree gconf-schemas gconftool gconftool-2 gcore gcov gcov-4.1 gcov-4.2 gdb gdbserver gdbtui gdbus gdbus-codegen gdk-pixbuf-csource gdk-pixbuf-query-loaders gencat gendiff generate-modprobe.conf genhdlist2 genhomedircon genhostid genl geqn getconf get_device get_driver getent getfacl getfattr getkey getkeycodes get_module getopt gettext gettextize gettext.sh getty getzones ghost2 ghostify ginstall-info gio-querymodules gksu gksu-properties glib-compile-schemas glibc-post-wrapper glib-genmarshal glib-gettextize glib-mkenums gmake gnome-keyring-daemon gnome-open gnomevfs-cat gnomevfs-copy gnomevfs-df gnomevfs-info gnomevfs-ls gnomevfs-mkdir gnomevfs-monitor gnomevfs-mv gnomevfs-rm gnroff gnutls-cli gnutls-cli-debug gnutls-serv gobject-query gpasswd gpg gpg-convert-from-106 gpg-error gpgsplit gpgv gpg-zip gprof grep grep-changelog groff grog grops grotty groupadd groupdel groupmems groupmod groups grpck grpconv grpunconv grub grub-floppy grub-install grub-md5-crypt grub-reboot grub-set-default grub-terminfo gsbj gsdj gsdj500 gsettings gs-gpl gslj gslp gsnd gss-client gss_clnt_send_err gss_destroy_creds gss-server gtar gtbl gtk-builder-convert gtk-query-immodules-2.0 gtk-update-icon-cache gtroff gunzip gv gzexe gzip h2ph h2xs hald hal-device hal-disable-polling hal-find-by-capability hal-find-by-property hal-get-property hal-is-caller-locked-out hal-is-caller-privileged hal-lock hal-set-property hal-setup-keymap halt hd hdparm head helpztags hexdump hibernate-cleanup.sh host hostid hostname hping hping2 htcacheclean htdbm htdigest html2text HtmlConverter htop htpasswd httpd httxt2dbm hush hwclock i386 i586-manbo-linux-gnu-gcc i586-manbo-linux-gnu-gcc-4.4.1 i586-mandriva-linux-gnu-gcc i586-mandriva-linux-gnu-gcc-4.4.1 iceauth ico icombine iconv iconvconfig id identd idl2deb idl2wrs idlj ifcfg ifconfig ifconfig.busybox ifdown ifenslave ifmetric ifnames ifplugd ifplugstatus ifstat ifup igawk ijoin ikeygen imagetops imake imapd inetd inetdconvert inetutils-ifconfig inetutils-telnet info infocmp infokey infotocap init initlog innochecksum insert_brackets insmod install install-info installkernel install-menu install-sgmlcatalog instmodsh in.tftpd invoke-rc.d ionice ior-decode-2 iostat ip ip6tables ip6tables-multi ip6tables-restore ip6tables-save ipaddr ipcalc ipcmk ipcrm ipcs iplink ipmaddr iproute iproute-arpd iprule ipsec iptables iptables-multi iptables-restore iptables-save iptables-xml iptunnel isisd isosize ispell ispell-autobuildhash ispell-wrapper itox jack_alias jack_bufsize jack_connect jackd jack_disconnect jack_evmon jack_freewheel jack_impulse_grabber jack_load jack_lsp jack_metro jack_midiseq jack_midisine jack_monitor_client jack_netsource jackrec jack_showtime jack_simple_client jack_transport jack_unload jar jarsigner java javac javadoc javah javap javaws jconsole jdb jhat jinfo jmap joe john join jpegexiforient jpegtran jps jrunscript jsadebugd jstack jstat jstatd jvmjar k5srvutil kab2kabc kaddprinterwizard kadmin kadmind kadmin.local kate kbd_mode kbdrate kbuildsycoca kcmshell kconf_update kcookiejar kdb5_ldap_util kdb5_util kde-config kded kdeDesktopCleanup kdeinit kdeinit_shutdown kdeinit_wrapper kde-menu kdestroy kdesu_stub kdontchangethehostname kdostartupconfig kedit keytool kfile kgrantpty khotnewstuff kill killall killall5 kinit kinstalltheme kioexec kio_http_cache_cleaner kioslave kio_uiserver klauncher klist klogd klogind kmailservice koi8rxterm kpac_dhcp_helper kpasswd kprop kpropd krb524d krb524init krb5-config krb5kdc krb5-send-pr kregexpeditor ksendbugmail kshd kshell kstartupconfig ksu ktelnetservice ktradertest ktutil kvno kwrapper kwrite labltk laptop-detect last lastb lastlog lcf lchage lchfn lchsh ld ldap2zone ldapadd ldapcompare ldapdelete ldapexop ldapmodify ldapmodrdn ldappasswd ldapsearch ldapurl ldapwhoami ldattach ldconfig ldd lddlibc4 less lessecho lesskey lesspipe lesspipe.sh lexgrog lft.db lgroupadd lgroupdel lgroupmod libnetcfg libpng12-config libtool libtoolize lid lighttpd lighttpd-angel linc-cleanup-sockets line link links links2 linux32 linux64 listhome list_hooks.pl listres ln lndir lnewusers lnstat lnusertemp loadfont loadkeys loadkmap load_policy loadunimap locale localedef locale-gen locale_install.sh locale_uninstall.sh locate logger login login.debian login.krb5 login.shadow logname logoutd logread logresolve logresolve.pl logrotate logsave log_server_status look lorder losetup lp2pap.sh lpasswd lpd lpq lpr ls lsattr lscpu lshal lsmod lsof lspci lspgpot lsusb luit luseradd luserdel lusermod lwresd lxterm lynx lynx.stable lzcat lzcmp lzdiff lzegrep lzfgrep lzgrep lzless lzma lzma_alone lzmadec lzmainfo lzmore lzop lzopcat m4 macusers mailbot maildiracl maildirkw maildirmake maildrop mailer mail-files mailq mailshar make makedepend makedev MAKEDEV makedevs make_driver_db_cups make_driver_db_lpr makeg makeinfo makemime makepqg make-ssl-cert makestrs makeuserdb makewhatis man man2dvi man2html mangle manpath mapscrn marionnet_grab_config mawk mbchk mcheck mcomp mcookie md5sum mdev mdv-network-event megatron meinproc mergecap mergelib mesg microcom mii-diag mii-tool mingetty mkbimage mkboot mkchdr mkcramfs mkdevs.sh mkdict mkdir mkdirhier mkdosfs mke2fs mke3fs mkfifo mkfontdir mkfontscale mkfs mkfs.bfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.ext4dev mkfs.minix mkfs.vfat mkhomedir_helper mkhtmlindex mkinitramfs mkinitramfs-kpkg mklost+found mkmanifest mknod mkpasswd mkswap mktemp modinfo modprobe mod_ssl-gentestcrt modutil more mount mount.cifs mount.nfs mount.nfs4 mountpoint mount.smbfs mozilla-firefox mpack mpstat msgattrib msgcat msgcmp msgcomm msgconv msgen msgexec msgfilter msgfmt msggrep msginit msgmerge msgunfmt msguniq msql2mysql mt mt-gnu mtools mtr mtrace munchlist munpack mv mxtar myisamchk myisam_ftdump myisamlog myisampack my_print_defaults mysql mysqlaccess mysqladmin mysqlbinlog mysqlbug mysqlcheck mysql_client_test mysql_config mysql_convert_table_format mysql_create_system_tables mysqld mysqld_multi mysqld_safe mysqldump mysqldumpslow mysql_explain_log mysql_find_rows mysql_fix_extensions mysql_fix_privilege_tables mysqlhotcopy mysqlimport mysql_install_db mysqlmanager mysql_secure_installation mysql_setpermission mysqlshow mysql_tableinfo mysqltest mysqltestmanager mysqltestmanagerc mysqltestmanager-pwgen mysql_tzinfo_to_sql mysql_upgrade mysql_upgrade_shell mysql_waitpid mysql_zap named named-bootconf named-checkconf named-checkzone named-compilezone namei nameif nanddump nandwrite nano nast native2ascii nbd-client nbplkup nbprgstr nbpunrgstr nc ncal ncat ncftp ncftpbatch ncftpget ncftpls ncftpput ncftpspooler nc.traditional ncurses5-config ncursesw5-config ndiff neqn net netatalk-uniconv netcat netkit-ftp netreport net-snmp-config net-snmp-create-v3-user netstat newaliases newgrp newrole newusers nfsddebug nfsdebug nfsstat ngettext nice nisdomainname nl nm nmap nmblookup nmeter nohup nologin nonspr10 nping nroff nscd nscd_nischeck nslookup nstat nsupdate ntpd ntpdate ntpdc ntp-keygen ntpq ntptime ntptrace ntp-wait nu objcopy objdump ocaml ocamlbrowser ocamlbuild.byte ocamlbuild.native ocamlc ocamlcp ocamldebug ocamldep ocamldoc ocamldumpobj ocamllex ocaml-md5sums ocamlmklib ocamlmktop ocamlobjinfo ocamlopt ocamlprof ocamlrun ocamlyacc oclock ocspclnt od oidcalc oldfind oldfuser omnicpp omniidl omniidlrun.py omshell open_init_pty openssl openvt orbd ospf6d ospfclient ospfd ownership owplaces p7content p7env p7sign p7verify pack200 packer pam_console_apply pam_getenv pam_tally pam_tally2 pam_timestamp_check pango-querymodules pango-querymodules-32 pango-view pap papd paperconf paperconfig papstatus partmon partx passwd paste patch pathchk pcimodules pcre-config pcregrep pcretest pdf2dsc pdf2ps pdfopt peekfd perl perl5 perl5.10.1 perl5.8.8 perlbug perlcc perldoc perlivp perlthanks perror pf2afm pfbtopfa pg pgawk pgrep pic piconv pidof ping ping6 ping.orig pinky pipe_progress pivot_root pk11mode pk12util pkaction pkcheck pkexec pkg-config pkill pl2pm plainrsa-gen plipconfig pluginviewer pmap pmap_dump pmap_set po2debconf pod2html pod2latex pod2man pod2text pod2usage podchecker podebconf-display-po podebconf-report-po podselect policytool polkit-action polkit-auth polkit-config-file-validate polkit-policy-file-validate popmaildir portmap postalias postcat postconf postdrop postfinger postfix postfix-chroot.sh postkick postlock postlog postmap postmulti postqueue postsuper poweroff powertop pp pphs ppl-config ppp-watch pr prcsys precat prename preunzip prezip prezip-bin printafm print-cups.sh printenv printf procan procps3-kill proftpd props protoize prove ps ps2ascii ps2epsi ps2pdf12 ps2pdf13 ps2pdf14 ps2pdfwr ps2ps ps2ps2 pscan psed psfaddtable psfgettable psfstriptable psfxtable psktool psorder pstree pstree.x11 pstruct ptbl ptx pulseaudio pval pw2userdb pwcheck pwck pwconv pwd pwdx pwunconv pycentral py_compilefiles pydoc pydoc2.4 pygettext2.4 pysupport-movemodules pysupport-parseversions python python2.4 python2.6 qmqp-sink qmqp-source qshape querybts query-loc queryperf racoon racoonctl radvd radvdump raidautorun ranlib rarp raw rbash rclock rcp rcp.krb5 rcs-checkin rdate rdev rdisc rdjpgcom readahead readelf readlink readprofile realpath reboot rebuild-jar-repository rebuild-security-providers recode-sr-latin recup_para.sh red reformail reformime remove_brackets remove-default-ispell remove-default-wordlist remove-shell remsync remtest rename rename.ul renice rep replace reportbug report-hw rep-remote reset resetall reset_sound resize resize2fs resizecons resolvconf resolveip resolve_stack_dump restorecon retawq rev revpath rgrep ripd ripngd rlogin rlogin.krb5 rm rmail rmdir rmic rmid rmiregistry rmmod rmold rmt rmt-tar rnano rndc rndc-confgen rotatelogs route routef routel roxterm roxterm-config rpcbind rpcdebug rpcgen rpc.gssd rpc.idmapd rpcinfo rpc.mountd rpc.nfsd rpc.statd rpc.svcgssd rpc.yppasswdd rpc.ypxfrd rpm rpm2cpio rpmdb rpm-find-leaves rpmgraph rpmquery rpmsign rpmverify rsaperf rsh rsh.krb5 rstart rstartd rsync rtacct rtcwake rtkitctl rtmon rtpr rtstat ruby1.8 runcon run_init runlevel run-mailcap run-parts runsv runsvdir run-with-aspell rurpme rurpmi rx rxvt-xpm rxvt-xterm s2p safe_finger sash saslauthd sasldblistusers2 saslpasswd2 savelog sawfish sawfish-client sawfish-ui schemagen sclient scp script scriptreplay sdiff sdrtest secon securetty sed se_dpkg select-default-ispell select-default-iwrap select-default-wordlist selfserv semanage semodule semodule_deps semodule_expand semodule_link semodule_package sendmail sendmail.postfix sensible-browser sensible-editor sensible-pager sepolgen-ifgen seq serialver servertool service sessreg sestatus setarch setconsole setfacl setfattr setfiles setfont setkey setkeycodes setleds setlogcons setmetamode setpci setsebool setserial setsid setsysfont set_tcb setterm setuidgid setxkbmap sfdisk sftp sg sh sha1sum sha224sum sha256sum sha384sum sha3sum sha512sum shadowconfig shar sharedindexinstall sharedindexsplit shell-quote shift_lines shlibsign showconsolefont showfont showkey showmount showppd showrgb sh.prebash shred shuf shutdown signtool signver sim_client sim_server size skill slabtop slapacl slapadd slapauth slapcat slapd slapdn slapindex slappasswd slapschema slaptest slattach sleep sln slogin slurpd smbpasswd smemcap smicache smidiff smidump smilint smime smiquery smistrip smixlate sm-notify smproxy smtp-sink smtp-source snacc snacc-config snice snmpbulkget snmpbulkwalk snmpd snmpdelta snmpdf snmpget snmpgetnext snmpinform snmpnetstat snmpset snmpstatus snmptable snmptest snmptranslate snmptrap snmptrapd snmpusm snmpvacm snmpwalk sntp socat soelim softlimit sort spawn-fcgi sperl5.8.8 splain split split-logfile sprof sq sqlite3 srptool ss sserver ssh ssh-add ssh-agent ssh-argv0 ssh-copy-id sshd sshfs ssh-keygen ssh-keyscan ssleay ssltap start_kdeinit start_kdeinit_wrapper startpar start-statd start-stop-daemon start_udev.orig startx startxfce4 stat stdbuf strace strace-log-merge strfile strings strip strsclnt stty su sudo sudoedit sudoers2ldif sudoreplay sulogin sum supermount su-to-root sv svlogd swapoff swapon switch_root sxw2txt symkeyutil sync sysctl syslogd syslogd-listfiles syslog-facility systool sys-unconfig tabs tac tack tail tailf talk tar tar-backup tar-restore tasksel taskset tbl tc tcb_convert tcb_unconvert tclsh8.4 tcpd tcpdchk tcpdmatch tcpdump tcpsvd tcptraceroute.db tcsh tee telinit telnet telnetd telnetd.krb5 telnet.krb5 telnet.netkit tempfile test testmxlookup testparm testrb1.8 testsaslauthd texi2dvi texi2pdf texindex text2pcap textedit tftp tftpd tgz Thunar tic tickadj time timelord timeout tload tnameserv toe top touch tput tr tracepath tracepath6 traceproto.db traceroute traceroute6 traceroute.db traceroute-nanog.db troff true truncate tryaffix try-from tset tshark tsort tstclnt ttmkfdir tty ttysize tunctl tune2fs tunelp typelib-dump tzselect ubiattach ubidetach ubimkvol ubirmvol ubirsvol ubiupdatevol ucf ucfq ucfr ucs2any udevadm udevcontrol udevd udev_import_usermap udevinfo udevmonitor udevsettle udevtest udevtrigger udhcpc udhcpd udpsvd ul umount umount.cifs umount.hal umount.nfs umount.nfs4 uname uncompress unexpand unghostify unicode_start unicode_stop uniq unix2dos unix_chkpwd unix_update unlink unlzma unlzop unpack200 unprotoize unshar unsq unstr unxz unzip update-alternatives update-catalog updatedb update-default-ispell update-default-wordlist update-desktop-database update_dhcp.pl update-dictcommon-aspell update-fonts-alias update-fonts-dir update-fonts-scale update-gconf-defaults update-grub update-icon-caches update-inetd update-initramfs update-ispell-dictionary update-locale update-localtime update-menus update-mime update-mime-database update-modules update-openoffice-dicts update-pangox-aliases update-passwd update-pciids update-python-modules update-rc.d update-usbids update-usbids.sh update-xmlcatalog uptime urpme urpmf urpmi urpmi.addmedia urpmi.removemedia urpmi_rpm-find-leaves urpmi.update urpmq usb-devices usb_id useradd userdb userdbpw userdb-test-cram-md5 userdel userhelper usermod usernetctl users usleep utempter utmpdump uuclient uudecode uuencode uuidgen uuserver uxterm uz v4rcp validlocale vconfig vdir vfychain vfyserv vi viewres vigr vim vim-addons vim.basic vimdiff vim-enhanced vimplate vim.tiny vimtutor vipw visudo vlan-test vlock vmstat volname vpddecode vpn-start vpn-stop vtysh w w3m w3mman wall watch watchdog watchquagga wc wftopfa wget whatis whereis which whiptail who whoami whois wireshark wireshark-root wish8.4 word-list-compress w.procps write wrjpgcom wsgen wsimport www-browser X x11perf x11perfcomp xargs xauth xauth_switch_to_sun-des-1 xbiff xcalc xclipboard xclock xcmsdb xconsole xcursorgen xcutsel xdbedizzy xdg-desktop-icon xdg-desktop-menu xdg-email xdg-icon-resource xdg_menu xdg-mime xdg-open xdg-screensaver xdg-settings xdg-user-dir xdg-user-dirs-gtk-update xdg-user-dirs-update xditview xdpyinfo xdriinfo xedit xev xeyes xfbrowser4 xfce4-about xfce4-autostart-editor xfce4-kiosk-query xfce4-menueditor xfce4-panel xfce4-popup-menu xfce4-popup-windowlist xfce4-session xfce4-session-logout xfce4-terminal xfce4-terminal.wrapper xfce4-tips xfce-mcs-manager xfce-setting-show xfd xfdesktop xfhelp4 xflock4 xfmountdev4 xfontsel xfrun4 xfsinfo xfsm-shutdown-helper xft-config xfterm4 xfwm4 xgamma xgc xgettext xhost xinetd xinit xjc xkbbell xkbcomp xkbevd xkbprint xkbvleds xkbwatch xkill xlinks2 xload xlogo xlsatoms xlsclients xlsfonts xmag xman xmessage xmkmf xmodmap xmore xon xprop xrandr xrdb xrefresh xset xsetmode xsetpointer xsetroot xsm xstdcmap xsubpp xtables-multi xterm xtermcontrol xtermset xtrapchar xtrapin xtrapinfo xtrapout xtrapproto xtrapreset xtrapstats xvidtune xvinfo xvt xwd xwininfo xwud xxd xz xzcat xzcmp xzdec xzdiff xzegrep xzfgrep xzgrep xzless xzme xzmore yes ypbind ypcat ypchfn ypchsh ypdomainname ypmatch yppasswd yppoll yppush ypserv ypserv_test ypset yptest ypwhich zcat zcip zcmp zdiff zdump zebra zegrep zfgrep zforce zgrep zhead zic zless zmore znew zonetoldap zsoelim ztail ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_catalog.wheezy.selectionmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_cata0000600000175000017500000011617112167200764032343 0ustar lucaslucas9base PROVIDES: bc dc ed strings DESCRIPTION: Plan 9 userland tools acl PROVIDES: chacl getfacl setfacl DESCRIPTION: Access control list utilities #acpid PROVIDES: acpid acpi_listen DESCRIPTION: Advanced Configuration and Power Interface event daemon adjtimex PROVIDES: adjtimex DESCRIPTION: kernel time variables configuration utility #adns-tools PROVIDES: adnsheloex adnshost adnslogres adnsresfilter DESCRIPTION: Asynchronous-capable DNS client library and utilities apache2.2-common PROVIDES: a2dismod a2dissite a2enmod a2ensite apache2ctl apachectl DESCRIPTION: Apache HTTP Server common files #apache2-dbg PROVIDES: ab checkgid htcacheclean htdbm htdigest htpasswd httxt2dbm logresolve rotatelogs DESCRIPTION: Apache debugging symbols apache2-mpm-event PROVIDES: apache2 DESCRIPTION: Apache HTTP Server - event driven model apache2-utils PROVIDES: check_forensic dbmmanage split-logfile DESCRIPTION: utility programs for webservers aria2 PROVIDES: aria2c DESCRIPTION: High speed download utility arping PROVIDES: arping DESCRIPTION: sends IP and/or ARP pings (to the MAC address) ash PROVIDES: ash DESCRIPTION: compatibility package for dash #aspell PROVIDES: aspell aspell-import precat preunzip prezip prezip-bin run-with-aspell word-list-compress DESCRIPTION: GNU Aspell spell-checker atftpd PROVIDES: in.tftpd DESCRIPTION: advanced TFTP server attr PROVIDES: attr getfattr setfattr DESCRIPTION: Utilities for manipulating filesystem extended attributes autoconf PROVIDES: autoconf autoheader autom4te autoreconf autoscan autoupdate ifnames DESCRIPTION: automatic configure script builder #autopoint PROVIDES: autopoint DESCRIPTION: The autopoint program from GNU gettext #avahi-autoipd PROVIDES: avahi-autoipd DESCRIPTION: Avahi IPv4LL network address configuration daemon #avahi-daemon PROVIDES: avahi-daemon DESCRIPTION: Avahi mDNS/DNS-SD daemon #avahi-utils PROVIDES: avahi-browse avahi-browse-domains avahi-publish avahi-publish-address avahi-publish-service avahi-resolve avahi-resolve-address avahi-resolve-host-name avahi-set-host-name DESCRIPTION: Avahi browsing, publishing and discovery utilities babeld PROVIDES: babeld DESCRIPTION: loop-free distance-vector routing protocol bash-completion PROVIDES: dh_bash-completion DESCRIPTION: programmable completion for the bash shell #beep PROVIDES: beep DESCRIPTION: advanced pc-speaker beeper bind9 PROVIDES: dnssec-dsfromkey dnssec-keyfromlabel named DESCRIPTION: Internet Domain Name Server bind9-host PROVIDES: host DESCRIPTION: Version of 'host' bundled with BIND 9.X bind9utils PROVIDES: dnssec-keygen dnssec-signzone named-checkconf named-checkzone named-compilezone rndc rndc-confgen DESCRIPTION: Utilities for BIND binutils PROVIDES: addr2line ar as c++filt gprof ld nm objcopy objdump ranlib readelf size strip DESCRIPTION: GNU assembler, linker and binary utilities #boinc-dbg PROVIDES: db_dump DESCRIPTION: debugging symbols for BOINC binaries #bootchart PROVIDES: bootchartd DESCRIPTION: Boot process performance analyser #bootlogd PROVIDES: bootlogd DESCRIPTION: daemon to log boot messages bridge-utils PROVIDES: brctl DESCRIPTION: Utilities for configuring the Linux Ethernet bridge #busybox PROVIDES: busybox DESCRIPTION: Tiny utilities for small and embedded systems #busybox-syslogd PROVIDES: klogd logread syslogd DESCRIPTION: Provides syslogd and klogd using busybox bzip2 PROVIDES: bunzip2 bzcat bzcmp bzdiff bzegrep bzexe bzfgrep bzgrep bzip2 bzip2recover bzless bzmore DESCRIPTION: high-quality block-sorting file compressor - utilities #cdbs PROVIDES: cdbs-edit-patch DESCRIPTION: common build system for Debian packages chkconfig PROVIDES: chkconfig DESCRIPTION: system tool to enable or disable system services cifs-utils PROVIDES: mount.cifs DESCRIPTION: Common Internet File System utilities #citadel-mta PROVIDES: sendmail DESCRIPTION: complete and feature-rich groupware server (mail transport agent) #consolekit PROVIDES: ck-history ck-launch-session ck-list-sessions ck-log-system-restart ck-log-system-start ck-log-system-stop console-kit-daemon DESCRIPTION: framework for defining and tracking users, sessions and seats #console-tools PROVIDES: chvt deallocvt dumpkeys fgconsole getkeycodes kbd_mode kbdrate loadkeys openvt psfaddtable psfgettable psfstriptable setkeycodes setleds setlogcons setmetamode showkey unicode_start unicode_stop DESCRIPTION: Linux console and font utilities #conspy PROVIDES: conspy DESCRIPTION: Remote control of Linux virtual consoles courier-authdaemon PROVIDES: authdaemond DESCRIPTION: Courier authentication daemon courier-authlib PROVIDES: authenumerate authpasswd authtest courierlogger DESCRIPTION: Courier authentication library courier-authlib-dev PROVIDES: courierauthconfig DESCRIPTION: Development libraries for the Courier authentication library courier-authlib-userdb PROVIDES: makeuserdb pw2userdb userdb userdbpw userdb-test-cram-md5 DESCRIPTION: userdb support for the Courier authentication library courier-base PROVIDES: courier-config couriertcpd maildiracl maildirkw sharedindexinstall sharedindexsplit testmxlookup DESCRIPTION: Courier mail server - base system courier-imap PROVIDES: imapd DESCRIPTION: Courier mail server - IMAP server courier-ldap PROVIDES: courierldapaliasd DESCRIPTION: Courier mail server - LDAP support courier-maildrop PROVIDES: mailbot maildrop makemime reformail reformime DESCRIPTION: Courier mail server - mail delivery agent #courier-mta PROVIDES: mailq newaliases rmail DESCRIPTION: Courier mail server - ESMTP daemon courier-ssl PROVIDES: couriertls DESCRIPTION: Courier mail server - SSL/TLS Support cpp PROVIDES: cpp DESCRIPTION: GNU C preprocessor (cpp) crack PROVIDES: Crack Crack-Reporter DESCRIPTION: Password guessing program cracklib-runtime PROVIDES: cracklib-check cracklib-format cracklib-packer cracklib-unpacker create-cracklib-dict DESCRIPTION: runtime support for password checker library cracklib2 #cramfsprogs PROVIDES: cramfsck mkcramfs DESCRIPTION: Tools for CramFs (Compressed ROM File System) #cryptsetup-bin PROVIDES: cryptsetup DESCRIPTION: disk encryption support - command line tools #cups-bsd PROVIDES: lpq lpr DESCRIPTION: Common UNIX Printing System(tm) - BSD commands curl PROVIDES: curl DESCRIPTION: Get a file from an HTTP, HTTPS or FTP server curlftpfs PROVIDES: curlftpfs DESCRIPTION: filesystem to access FTP hosts based on FUSE and cURL #daemontools PROVIDES: envdir envuidgid setuidgid softlimit DESCRIPTION: a collection of tools for managing UNIX services #dbus PROVIDES: dbus-cleanup-sockets dbus-daemon dbus-monitor dbus-send dbus-uuidgen DESCRIPTION: simple interprocess messaging system (daemon and utilities) #dbus-1-dbg PROVIDES: dbus-launch DESCRIPTION: simple interprocess messaging system (debug symbols) #db-util PROVIDES: db_archive db_checkpoint db_deadlock db_hotbackup db_load db_printlog db_recover db_stat db_upgrade db_verify DESCRIPTION: Berkeley Database Utilities #debhelper PROVIDES: dh_builddeb dh_clean dh_compress dh_desktop dh_fixperms dh_gconf dh_gencontrol dh_icons dh_install dh_installcatalogs dh_installchangelogs dh_installcron dh_installdeb dh_installdebconf dh_installdirs dh_installdocs dh_installemacsen dh_installexamples dh_installifupdown dh_installinfo dh_installinit dh_installlogcheck dh_installlogrotate dh_installman dh_installmanpages dh_installmenu dh_installmime dh_installmodules dh_installpam dh_installppp dh_installudev dh_installwm dh_installxfonts dh_link dh_listpackages dh_makeshlibs dh_md5sums dh_movefiles dh_perl dh_python dh_scrollkeeper dh_shlibdeps dh_strip dh_suidregister dh_testdir dh_testroot dh_undocumented dh_usrlocal DESCRIPTION: helper programs for debian/rules #desktop-file-utils PROVIDES: desktop-file-install desktop-file-validate update-desktop-database DESCRIPTION: Utilities for .desktop files #dh-ocaml PROVIDES: dh_ocaml ocaml-md5sums DESCRIPTION: helper tools for maintaining OCaml-related Debian packages #dictionaries-common PROVIDES: aspell-autobuildhash ispell-autobuildhash ispell-wrapper remove-default-ispell remove-default-wordlist select-default-ispell select-default-iwrap select-default-wordlist update-default-ispell update-default-wordlist update-dictcommon-aspell DESCRIPTION: Common utilities for spelling dictionary tools #dietlibc-dev PROVIDES: dnsd DESCRIPTION: diet libc - a libc optimized for small size #dmeventd PROVIDES: dmeventd DESCRIPTION: Linux Kernel Device Mapper event daemon #dmsetup PROVIDES: dmsetup DESCRIPTION: Linux Kernel Device Mapper userspace library dnsutils PROVIDES: dig nslookup nsupdate DESCRIPTION: Clients provided with BIND dos2unix PROVIDES: dos2unix unix2dos DESCRIPTION: convert text file line endings between CRLF and LF dosfstools PROVIDES: mkdosfs mkfs.vfat DESCRIPTION: utilities for making and checking MS-DOS FAT filesystems #dropbear PROVIDES: dbclient dropbear dropbearkey DESCRIPTION: lightweight SSH2 server and client #dselect PROVIDES: dselect DESCRIPTION: Debian package management front-end #e2fsck-static PROVIDES: e2fsck.static DESCRIPTION: statically-linked version of the ext2/ext3/ext4 filesystem checker ed PROVIDES: red DESCRIPTION: classic UNIX line editor #eglibc-source PROVIDES: locale-gen update-locale validlocale DESCRIPTION: Embedded GNU C Library: sources #eject PROVIDES: eject volname DESCRIPTION: ejects CDs and operates CD-Changers under Linux epiphany-browser PROVIDES: epiphany DESCRIPTION: Intuitive GNOME web browser ethtool PROVIDES: ethtool DESCRIPTION: display or change Ethernet device settings #exo-utils PROVIDES: exo-csource exo-desktop-item-edit exo-open exo-preferred-applications DESCRIPTION: Utility files for libexo #exuberant-ctags PROVIDES: ctags-exuberant DESCRIPTION: build tag file indexes of source code definitions #fam PROVIDES: famd DESCRIPTION: File Alteration Monitor #fbset PROVIDES: fbset DESCRIPTION: framebuffer device maintenance program #fdflush PROVIDES: fdflush DESCRIPTION: Flush out-of-date disk buffers file PROVIDES: file DESCRIPTION: Determines file type using "magic" numbers finger PROVIDES: finger DESCRIPTION: user information lookup program flex PROVIDES: flex++ DESCRIPTION: A fast lexical analyzer generator. #fontconfig PROVIDES: fc-cache fc-cat fc-list fc-match fc-query fc-scan DESCRIPTION: generic font configuration library - support binaries #fortune-mod PROVIDES: strfile unstr DESCRIPTION: provides fortune cookies on demand ftp PROVIDES: netkit-ftp DESCRIPTION: classical file transfer client fuse PROVIDES: fusermount DESCRIPTION: Filesystem in Userspace #fvwm PROVIDES: fvwm2 fvwm-bug FvwmCommand fvwm-config fvwm-convert-2.4 fvwm-convert-2.6 fvwm-menu-desktop fvwm-menu-directory fvwm-menu-headlines fvwm-menu-xlock fvwm-perllib fvwm-root DESCRIPTION: F(?) Virtual Window Manager gawk PROVIDES: gawk igawk pgawk DESCRIPTION: GNU awk, a pattern scanning and processing language gcc PROVIDES: c89-gcc c99-gcc gcc gcov DESCRIPTION: GNU C compiler #gcj-4.6-jdk PROVIDES: appletviewer jar jarsigner javac javadoc javah jdb native2ascii rmic serialver DESCRIPTION: gcj and classpath development tools for Java(TM) #gcj-4.6-jre-headless PROVIDES: java keytool orbd rmid rmiregistry tnameserv DESCRIPTION: Java runtime environment using GIJ/classpath (headless version) #gconf2 PROVIDES: gconf-merge-tree gconf-schemas gconftool-2 update-gconf-defaults DESCRIPTION: GNOME configuration database system (support tools) gdb PROVIDES: gcore gdb gdbtui DESCRIPTION: The GNU Debugger #gdbserver PROVIDES: gdbserver DESCRIPTION: The GNU Debugger (remote server) gettext PROVIDES: gettextize msgattrib msgcat msgcmp msgcomm msgconv msgen msgexec msgfilter msgfmt msggrep msginit msgmerge msgunfmt msguniq recode-sr-latin xgettext DESCRIPTION: GNU Internationalization utilities gettext-base PROVIDES: envsubst gettext gettext.sh ngettext DESCRIPTION: GNU Internationalization utilities for the base system ghostscript PROVIDES: dumphint dvipdf eps2eps font2c gsbj gsdj gsdj500 gslj gslp gsnd pdf2dsc pdf2ps pdfopt pf2afm pfbtopfa pphs printafm ps2ascii ps2epsi ps2pdf12 ps2pdf13 ps2pdf14 ps2pdfwr ps2ps ps2ps2 wftopfa DESCRIPTION: interpreter for the PostScript language and for PDF gksu PROVIDES: gksu DESCRIPTION: graphical frontend to su #gnome-keyring PROVIDES: gnome-keyring-daemon DESCRIPTION: GNOME keyring services (daemon and tools) #gnutls-bin PROVIDES: certtool gnutls-cli gnutls-cli-debug gnutls-serv psktool srptool DESCRIPTION: GNU TLS library - commandline utilities #grub-coreboot PROVIDES: grub-install DESCRIPTION: GRand Unified Bootloader, version 2 (Coreboot version) #grub-legacy PROVIDES: grub grub-floppy grub-md5-crypt grub-reboot grub-set-default grub-terminfo mbchk mkbimage update-grub DESCRIPTION: GRand Unified Bootloader (Legacy version) gv PROVIDES: gv DESCRIPTION: PostScript and PDF viewer for X #hal PROVIDES: hald hal-device hal-disable-polling hal-find-by-capability hal-find-by-property hal-get-property hal-is-caller-locked-out hal-lock hal-set-property lshal umount.hal DESCRIPTION: Hardware Abstraction Layer #hardening-wrapper PROVIDES: gcc-4.2 DESCRIPTION: Compiler wrapper to enable security hardening flags #hdparm PROVIDES: hdparm DESCRIPTION: tune hard disk parameters for high performance #heimdal-clients PROVIDES: kadmin kdestroy kinit klist kpasswd ksu ktutil DESCRIPTION: Heimdal Kerberos - clients #heimdal-dev PROVIDES: krb5-config DESCRIPTION: Heimdal Kerberos - development files html2text PROVIDES: html2text DESCRIPTION: advanced HTML to text converter htop PROVIDES: htop DESCRIPTION: interactive processes viewer #icedtea-netx PROVIDES: javaws DESCRIPTION: NetX - implementation of the Java Network Launching Protocol (JNLP) #iceweasel PROVIDES: firefox DESCRIPTION: Web browser based on Firefox #id-utils PROVIDES: lid DESCRIPTION: Fast, high-capacity, identifier database tool ifmetric PROVIDES: ifmetric DESCRIPTION: Set routing metrics for a network interface #ifplugd PROVIDES: ifplugd ifplugstatus DESCRIPTION: configuration daemon for ethernet devices #ifstat PROVIDES: ifstat DESCRIPTION: InterFace STATistics Monitoring inetutils-ftpd PROVIDES: ftpd DESCRIPTION: File Transfer Protocol server inetutils-inetd PROVIDES: inetutils-inetd DESCRIPTION: internet super server inetutils-telnet PROVIDES: inetutils-telnet DESCRIPTION: telnet client inetutils-telnetd PROVIDES: telnetd DESCRIPTION: telnet server inetutils-tools PROVIDES: inetutils-ifconfig DESCRIPTION: base networking utilities (experimental package) #initramfs-tools PROVIDES: mkinitramfs update-initramfs DESCRIPTION: generic modular initramfs generator #installation-report PROVIDES: report-hw DESCRIPTION: system installation report ipcalc PROVIDES: ipcalc DESCRIPTION: parameter calculator for IPv4 addresses ipsec-tools PROVIDES: setkey DESCRIPTION: IPsec utilities ipsvd PROVIDES: tcpsvd udpsvd DESCRIPTION: Internet protocol service daemons iputils-clockdiff PROVIDES: clockdiff DESCRIPTION: Measure the time difference between networked computers iputils-tracepath PROVIDES: tracepath tracepath6 DESCRIPTION: Tools to trace the network path to a remote host ipv6calc PROVIDES: ipv6calc DESCRIPTION: small utility for manipulating IPv6 addresses #isc-dhcp-relay PROVIDES: dhcrelay DESCRIPTION: ISC DHCP relay daemon isc-dhcp-server PROVIDES: dhcpd DESCRIPTION: ISC DHCP server for automatic IP address assignment #ispell PROVIDES: buildhash findaffix icombine ijoin ispell munchlist sq tryaffix unsq DESCRIPTION: International Ispell (an interactive spelling corrector) #jackd1 PROVIDES: alsa_in alsa_out jack_alias jack_bufsize jack_connect jackd jack_disconnect jack_evmon jack_freewheel jack_impulse_grabber jack_load jack_lsp jack_metro jack_midiseq jack_midisine jack_monitor_client jack_netsource jack_showtime jack_simple_client jack_transport jack_unload DESCRIPTION: JACK Audio Connection Kit (server and example clients) joe PROVIDES: joe DESCRIPTION: user friendly full screen text editor john PROVIDES: john mailer DESCRIPTION: active password cracking tool #kate PROVIDES: kate DESCRIPTION: K Advanced Text Editor #kate-dbg PROVIDES: kwrite DESCRIPTION: debugging symbols for Kate kbd PROVIDES: loadunimap mapscrn psfxtable resizecons setfont showconsolefont DESCRIPTION: Linux console font and keytable utilities #krb5-admin-server PROVIDES: kadmind kadmin.local kprop DESCRIPTION: MIT Kerberos master server (kadmind) #krb5-clients PROVIDES: telnet.krb5 DESCRIPTION: Secure replacements for ftp, telnet and rsh using MIT Kerberos #krb5-gss-samples PROVIDES: gss-client gss-server DESCRIPTION: MIT Kerberos GSS Sample applications #krb5-kdc PROVIDES: kdb5_util kpropd krb5kdc DESCRIPTION: MIT Kerberos key server (KDC) #krb5-kdc-ldap PROVIDES: kdb5_ldap_util DESCRIPTION: MIT Kerberos key server (KDC) LDAP plugin #krb5-rsh-server PROVIDES: klogind kshd login.krb5 DESCRIPTION: Secure replacements for rshd and rlogind using MIT Kerberos #krb5-user PROVIDES: k5srvutil kvno DESCRIPTION: Basic programs to authenticate using MIT Kerberos #laptop-detect PROVIDES: laptop-detect DESCRIPTION: attempt to detect a laptop #ldap2zone PROVIDES: ldap2zone DESCRIPTION: Extract DNS zones from LDAP trees ldap-utils PROVIDES: ldapadd ldapcompare ldapdelete ldapexop ldapmodify ldapmodrdn ldappasswd ldapsearch ldapurl ldapwhoami DESCRIPTION: OpenLDAP utilities less PROVIDES: less lessecho lesskey lesspipe DESCRIPTION: pager program similar to more #libbonobo2-bin PROVIDES: activation-client bonobo-activation-sysconf bonobo-slay echo-client-2 DESCRIPTION: Bonobo CORBA interfaces library -- support binaries libc-dev-bin PROVIDES: gencat mtrace rpcgen sprof DESCRIPTION: Embedded GNU C Library: Development binaries #libcroco-tools PROVIDES: csslint-0.6 DESCRIPTION: Cascading Style Sheet (CSS) parsing and manipulation toolkit - utils #libdb1-compat PROVIDES: db_dump185 DESCRIPTION: Berkeley database routines [glibc 2.0/2.1 compatibility] #libfreetype6-dev PROVIDES: freetype-config DESCRIPTION: FreeType 2 font engine, development files #libfribidi-bin PROVIDES: fribidi DESCRIPTION: Free Implementation of the Unicode BiDi algorithm (utility) #libgcj-common PROVIDES: rebuild-security-providers DESCRIPTION: Java runtime library (common files) #libgdk-pixbuf2.0-dev PROVIDES: gdk-pixbuf-csource gdk-pixbuf-query-loaders DESCRIPTION: GDK Pixbuf library (development files) #libgksu2-0 PROVIDES: gksu-properties DESCRIPTION: library providing su and sudo functionality #libglib2.0-0-dbg PROVIDES: gdbus glib-genmarshal gobject-query gsettings DESCRIPTION: Debugging symbols for the GLib libraries #libglib2.0-bin PROVIDES: gio-querymodules glib-compile-schemas DESCRIPTION: Programs for the GLib library #libglib2.0-dev PROVIDES: gdbus-codegen glib-gettextize glib-mkenums DESCRIPTION: Development files for the GLib library #libgnome2-0 PROVIDES: gnome-open DESCRIPTION: The GNOME library - runtime files #libgnomevfs2-0-dbg PROVIDES: gnomevfs-cat gnomevfs-copy gnomevfs-df gnomevfs-info gnomevfs-ls gnomevfs-mkdir gnomevfs-monitor gnomevfs-mv gnomevfs-rm DESCRIPTION: GNOME Virtual File System (debugging libraries) #libgpg-error-dev PROVIDES: gpg-error DESCRIPTION: library for common error values and messages in GnuPG components (development) #libgtk2.0-bin PROVIDES: gtk-update-icon-cache DESCRIPTION: programs for the GTK+ graphical user interface library #libgtk2.0-dev PROVIDES: dh_gtkmodules gtk-builder-convert DESCRIPTION: development files for the GTK+ library #libgtk-3-bin PROVIDES: update-icon-caches DESCRIPTION: programs for the GTK+ graphical user interface library #libjpeg-progs PROVIDES: cjpeg djpeg exifautotran jpegexiforient jpegtran rdjpgcom wrjpgcom DESCRIPTION: Programs for manipulating JPEG files #liblockfile-bin PROVIDES: dotlockfile DESCRIPTION: support binaries for and cli utilities based on liblockfile #libmysqlclient-dev PROVIDES: mysql_config DESCRIPTION: MySQL database development files #libnss3-tools PROVIDES: certutil cmsutil crlutil modutil pk12util shlibsign signtool signver ssltap DESCRIPTION: Network Security Service tools #libpango1.0-0-dbg PROVIDES: pango-querymodules pango-view DESCRIPTION: Pango library and debugging symbols #libpango1.0-dev PROVIDES: dh_pangomodules DESCRIPTION: Development files for the Pango #libpaper-utils PROVIDES: paperconf paperconfig DESCRIPTION: library for handling paper characteristics (utilities) #libpcre3-dev PROVIDES: pcre-config DESCRIPTION: Perl 5 Compatible Regular Expression Library - development files #libpng12-dev PROVIDES: libpng12-config DESCRIPTION: PNG library - development #librep-dbg PROVIDES: rep rep-remote DESCRIPTION: debug symbols for librep #librpm-dbg PROVIDES: rpm rpm2cpio rpmdb rpmgraph rpmsign DESCRIPTION: debugging symbols for RPM #libruby1.8-dbg PROVIDES: ruby1.8 DESCRIPTION: Debugging symbols for Ruby 1.8 #libsnmp15 PROVIDES: net-snmp-config DESCRIPTION: SNMP (Simple Network Management Protocol) library #libsqlite3-0-dbg PROVIDES: sqlite3 DESCRIPTION: SQLite 3 debugging symbols #libtasn1-3-bin PROVIDES: asn1Coding asn1Decoding asn1Parser DESCRIPTION: Manage ASN.1 structures (binaries) #libtool PROVIDES: libtool libtoolize DESCRIPTION: Generic library support script #libuser PROVIDES: lchage lchfn lchsh lgroupadd lgroupdel lgroupmod lnewusers lpasswd luseradd luserdel lusermod DESCRIPTION: user and group account administration library #libxfce4util-bin PROVIDES: xfce4-kiosk-query DESCRIPTION: tools for libxfce4util lighttpd PROVIDES: lighttpd lighttpd-angel DESCRIPTION: fast webserver with minimal memory footprint links PROVIDES: links DESCRIPTION: Web browser running in text mode links2 PROVIDES: links2 xlinks2 DESCRIPTION: Web browser running in both graphics and text mode #loadlin PROVIDES: freeramdisk DESCRIPTION: loader (running under DOS) for LINUX kernel images #lpr PROVIDES: lpd DESCRIPTION: BSD lpr/lpd line printer spooling system #lrzsz PROVIDES: rx DESCRIPTION: Tools for zmodem/xmodem/ymodem file transfer lsof PROVIDES: lsof DESCRIPTION: Utility to list open files #lwresd PROVIDES: lwresd DESCRIPTION: Lightweight Resolver Daemon lynx PROVIDES: lynx DESCRIPTION: Text-mode WWW Browser #lynx-cur PROVIDES: lynx DESCRIPTION: Text-mode WWW Browser with NLS support (development version) lzma-alone PROVIDES: lzma_alone DESCRIPTION: Compression and decompression in the LZMA format - legacy utility lzop PROVIDES: lzop DESCRIPTION: fast compression program m4 PROVIDES: m4 DESCRIPTION: a macro processing language make PROVIDES: make DESCRIPTION: An utility for Directing compilation. makedev PROVIDES: MAKEDEV DESCRIPTION: creates device files in /dev man2html-base PROVIDES: man2html DESCRIPTION: convert man pages into HTML format #menu PROVIDES: install-menu su-to-root update-menus DESCRIPTION: generates programs menu for all menu-aware applications #microcom PROVIDES: microcom DESCRIPTION: minimalistic terminal program mii-diag PROVIDES: mii-diag DESCRIPTION: A little tool to manipulate network cards #mime-support PROVIDES: run-mailcap update-mime DESCRIPTION: MIME files 'mime.types' & 'mailcap', and support programs mingetty PROVIDES: mingetty DESCRIPTION: Console-only getty mpack PROVIDES: mpack munpack DESCRIPTION: tools for encoding/decoding MIME messages #mtd-utils PROVIDES: nanddump nandwrite ubiattach ubidetach ubimkvol ubirmvol ubirsvol ubiupdatevol DESCRIPTION: Memory Technology Device Utilities mtools PROVIDES: amuFormat.sh mcheck mcomp mkmanifest mtools mxtar tgz uz DESCRIPTION: Tools for manipulating MSDOS files mtr PROVIDES: mtr DESCRIPTION: Full screen ncurses and X11 traceroute tool #muddleftpd PROVIDES: ftpwho DESCRIPTION: A flexible and efficient FTP daemon #mysql-client-5.5 PROVIDES: innochecksum myisam_ftdump mysql mysqlaccess mysqladmin mysqlbug mysqlcheck mysql_client_test mysqldump mysqldumpslow mysql_find_rows mysql_fix_extensions mysqlimport mysqlshow mysql_waitpid DESCRIPTION: MySQL database client binaries #mysql-server-5.5 PROVIDES: msql2mysql myisamchk myisamlog myisampack mysqlbinlog mysql_convert_table_format mysqld_multi mysqld_safe mysqlhotcopy mysql_secure_installation mysql_setpermission mysqltest mysql_tzinfo_to_sql mysql_zap perror replace resolveip resolve_stack_dump DESCRIPTION: MySQL database server binaries and system database setup #mysql-server-core-5.5 PROVIDES: my_print_defaults mysqld mysql_install_db mysql_upgrade DESCRIPTION: MySQL database server binaries nast PROVIDES: nast DESCRIPTION: packet sniffer and lan analyzer #nbd-client PROVIDES: nbd-client DESCRIPTION: Network Block Device protocol - client ncftp PROVIDES: ncftpbatch ncftpget ncftpls ncftpput ncftpspooler DESCRIPTION: User-friendly and well-featured FTP client #netatalk PROVIDES: adv1tov2 aecho afpd asip-status.pl atalkd cnid2_create cnid_dbd cnid_metad getzones lp2pap.sh macusers megatron nbplkup nbprgstr nbpunrgstr netatalk-uniconv pap papd papstatus psorder showppd timelord DESCRIPTION: AppleTalk user binaries nfs-common PROVIDES: gss_clnt_send_err gss_destroy_creds mount.nfs mount.nfs4 nfsstat rpcdebug rpc.gssd rpc.idmapd rpc.statd rpc.svcgssd showmount sm-notify start-statd umount.nfs umount.nfs4 DESCRIPTION: NFS support files common to client and server nfs-kernel-server PROVIDES: exportfs rpc.mountd rpc.nfsd DESCRIPTION: support for NFS kernel server nis PROVIDES: rpc.yppasswdd rpc.ypxfrd ypbind ypcat ypchfn ypchsh ypmatch yppasswd yppoll yppush ypserv ypserv_test ypset yptest ypwhich DESCRIPTION: clients and daemons for the Network Information Service (NIS) nmap PROVIDES: ncat ndiff nmap nping DESCRIPTION: The Network Mapper #nscd PROVIDES: nscd DESCRIPTION: Embedded GNU C Library: Name Service Cache Daemon ntp PROVIDES: ntpd ntpdc ntp-keygen ntpq ntptime ntptrace ntp-wait sntp DESCRIPTION: Network Time Protocol daemon and utility programs ntpdate PROVIDES: ntpdate DESCRIPTION: client for setting system time from NTP servers #ocaml PROVIDES: labltk ocamlbrowser DESCRIPTION: ML language implementation with a class-based object system #ocaml-base-nox PROVIDES: ocamlrun DESCRIPTION: Runtime system for OCaml bytecode executables (no X) #ocaml-interp PROVIDES: ocaml DESCRIPTION: OCaml interactive interpreter and standard libraries #ocaml-nox PROVIDES: ocamlbuild.byte ocamlbuild.native ocamlc ocamlcp ocamldebug ocamldep ocamldoc ocamldumpobj ocamllex ocamlmklib ocamlmktop ocamlobjinfo ocamlopt ocamlprof ocamlyacc DESCRIPTION: ML implementation with a class-based object system (no X) #odt2txt PROVIDES: sxw2txt DESCRIPTION: simple converter from OpenDocument Text to plain text #omniidl PROVIDES: omnicpp omniidl DESCRIPTION: omniORB IDL to C++ and Python compiler #openbsd-inetd PROVIDES: inetd DESCRIPTION: OpenBSD Internet Superserver #openjdk-6-dbg PROVIDES: apt extcheck idlj javap jconsole jhat jinfo jmap jps jrunscript jsadebugd jstack jstat jstatd pack200 policytool schemagen servertool unpack200 wsgen wsimport xjc DESCRIPTION: Java runtime based on OpenJDK (debugging symbols) openresolv PROVIDES: resolvconf DESCRIPTION: management framework for resolv.conf openssh-client PROVIDES: scp sftp slogin ssh ssh-add ssh-agent ssh-argv0 ssh-copy-id ssh-keygen ssh-keyscan DESCRIPTION: secure shell (SSH) client, for secure access to remote machines openssh-server PROVIDES: sshd DESCRIPTION: secure shell (SSH) server, for secure access from remote machines openssl PROVIDES: c_rehash openssl DESCRIPTION: Secure Socket Layer (SSL) binary and related cryptographic tools #openswan PROVIDES: ipsec DESCRIPTION: Internet Key Exchange daemon #orbit2 PROVIDES: ior-decode-2 linc-cleanup-sockets typelib-dump DESCRIPTION: a CORBA ORB patch PROVIDES: patch DESCRIPTION: Apply a diff file to an original #pciutils PROVIDES: lspci pcimodules setpci update-pciids DESCRIPTION: Linux PCI Utilities #pcregrep PROVIDES: pcregrep DESCRIPTION: grep utility that uses perl 5 compatible regexes. picolisp PROVIDES: watchdog DESCRIPTION: Lisp interpreter and application server framework #pidentd PROVIDES: identd ikeygen DESCRIPTION: TCP/IP IDENT protocol server with DES support #pkg-config PROVIDES: pkg-config DESCRIPTION: manage compile and link flags for libraries #policycoreutils PROVIDES: audit2allow audit2why chcat fixfiles genhomedircon load_policy newrole open_init_pty restorecon run_init secon se_dpkg semanage semodule semodule_deps semodule_expand semodule_link semodule_package sepolgen-ifgen sestatus setfiles setsebool DESCRIPTION: SELinux core policy utilities #policykit-1 PROVIDES: pkaction pkcheck pkexec DESCRIPTION: framework for managing administrative policies and privileges postfix PROVIDES: postalias postcat postconf postdrop postfix postkick postlock postlog postmap postmulti postqueue postsuper qmqp-sink qmqp-source qshape smtp-sink smtp-source DESCRIPTION: High-performance mail transport agent #powertop PROVIDES: powertop DESCRIPTION: Linux tool to find out what is using power on a laptop #ppl-dev PROVIDES: ppl-config DESCRIPTION: Parma Polyhedra Library (development binaries) ppp PROVIDES: chat DESCRIPTION: Point-to-Point Protocol (PPP) - daemon #proftpd-basic PROVIDES: ftpcount ftpdctl ftpshut ftptop proftpd DESCRIPTION: Versatile, virtual-hosting FTP daemon - binaries #protoize PROVIDES: protoize unprotoize DESCRIPTION: Create/remove ANSI prototypes from C code #pscan PROVIDES: pscan DESCRIPTION: Format string security checker for C files psmisc PROVIDES: fuser killall peekfd pstree pstree.x11 DESCRIPTION: utilities that use the proc file system #pulseaudio PROVIDES: pulseaudio DESCRIPTION: PulseAudio sound server #pulseaudio-esound-compat PROVIDES: esd esdcompat DESCRIPTION: PulseAudio ESD compatibility layer #python PROVIDES: 2to3 pydoc DESCRIPTION: interactive high-level object-oriented language (default version) #python2.6-dbg PROVIDES: python2.6 DESCRIPTION: Debug Build of the Python Interpreter (version 2.6) #python-central PROVIDES: dh_pycentral pycentral py_compilefiles DESCRIPTION: register and build utility for Python packages python-minimal PROVIDES: python DESCRIPTION: minimal subset of the Python language (default version) #python-support PROVIDES: dh_pysupport update-python-modules DESCRIPTION: automated rebuilding support for Python modules #qmail PROVIDES: maildirmake DESCRIPTION: a secure, reliable, efficient, simple message transfer agent quagga PROVIDES: vtysh DESCRIPTION: BGP/OSPF/RIP routing daemon racoon PROVIDES: plainrsa-gen racoon racoonctl DESCRIPTION: IPsec Internet Key Exchange daemon radvd PROVIDES: radvd radvdump DESCRIPTION: Router Advertisement Daemon rdate PROVIDES: rdate DESCRIPTION: sets the system's date from a remote host #readahead-fedora PROVIDES: readahead DESCRIPTION: Fedora's implementation of readahead to preload boot process files #reportbug PROVIDES: querybts reportbug DESCRIPTION: reports bugs in the Debian distribution #rlinetd PROVIDES: update-inetd DESCRIPTION: gruesomely over-featured inetd replacement rox-filer PROVIDES: rox-filer DESCRIPTION: A simple graphical file manager for X11 roxterm-gtk2 PROVIDES: roxterm roxterm-config DESCRIPTION: Multi-tabbed GTK+/VTE terminal emulator - GTK2 version rpcbind PROVIDES: rpcbind DESCRIPTION: converts RPC program numbers into universal addresses #rpm PROVIDES: gendiff rpmquery rpmverify DESCRIPTION: package manager for RPM rsync PROVIDES: rsync DESCRIPTION: fast, versatile, remote (and local) file-copying tool rsyslog PROVIDES: rsyslogd DESCRIPTION: reliable system and kernel logging daemon #rtkit PROVIDES: rtkitctl DESCRIPTION: Realtime Policy and Watchdog Daemon #ruby1.8 PROVIDES: erb1.8 testrb1.8 DESCRIPTION: Interpreter of object-oriented scripting language Ruby 1.8 runit PROVIDES: chpst runsv runsvdir sv svlogd DESCRIPTION: system-wide service supervision rxvt PROVIDES: rclock rxvt-xpm rxvt-xterm DESCRIPTION: VT102 terminal emulator for the X Window System samba-common-bin PROVIDES: smbpasswd DESCRIPTION: common files used by both the Samba server and client #sash PROVIDES: sash DESCRIPTION: Stand-alone shell #sasl2-bin PROVIDES: saslauthd sasldblistusers2 saslpasswd2 testsaslauthd DESCRIPTION: Cyrus SASL - administration programs for SASL users database #sawfish PROVIDES: sawfish sawfish-client sawfish-ui DESCRIPTION: a window manager for X11 setserial PROVIDES: setserial DESCRIPTION: controls configuration of serial ports #sgml-base PROVIDES: install-sgmlcatalog update-catalog DESCRIPTION: SGML infrastructure and SGML catalog file support sharutils PROVIDES: shar unshar uudecode uuencode DESCRIPTION: shar, unshar, uuencode, uudecode slapd PROVIDES: slapacl slapadd slapauth slapcat slapd slapdn slapindex slappasswd slapschema slaptest DESCRIPTION: OpenLDAP server (slapd) #smartlist PROVIDES: digest DESCRIPTION: Versatile and Intelligent List Processor #smistrip PROVIDES: smistrip DESCRIPTION: extract MIB from text files like RFC #smitools PROVIDES: smicache smidiff smidump smilint smiquery smixlate DESCRIPTION: various tools operating on MIB module files #snacc PROVIDES: berdecode mkchdr ptbl pval snacc snacc-config DESCRIPTION: ASN.1 to C or C++ or IDL compiler snmp PROVIDES: encode_keychange snmpbulkget snmpbulkwalk snmpdelta snmpdf snmpget snmpgetnext snmpinform snmpnetstat snmpset snmpstatus snmptable snmptest snmptranslate snmptrap snmpusm snmpvacm snmpwalk DESCRIPTION: SNMP (Simple Network Management Protocol) applications snmpd PROVIDES: snmpd snmptrapd DESCRIPTION: SNMP (Simple Network Management Protocol) agents socat PROVIDES: filan procan socat DESCRIPTION: multipurpose relay for bidirectional data transfer sshfs PROVIDES: sshfs DESCRIPTION: filesystem client based on SSH File Transfer Protocol #ssl-cert PROVIDES: make-ssl-cert DESCRIPTION: simple debconf wrapper for OpenSSL strace PROVIDES: strace DESCRIPTION: A system call tracer sudo PROVIDES: sudo sudoedit sudoreplay visudo DESCRIPTION: Provide limited super user privileges to specific users sysfsutils PROVIDES: systool DESCRIPTION: sysfs query tool and boot-time setup sysstat PROVIDES: iostat mpstat DESCRIPTION: system performance tools for Linux #tack PROVIDES: tack DESCRIPTION: terminfo action checker tcl8.4 PROVIDES: tclsh8.4 DESCRIPTION: Tcl (the Tool Command Language) v8.4 - run-time files #tcm PROVIDES: tcpd DESCRIPTION: Toolkit for Conceptual Modeling (TCM) #tcpd PROVIDES: safe_finger tcpdchk tcpdmatch try-from DESCRIPTION: Wietse Venema's TCP wrapper utilities tcpdump PROVIDES: tcpdump DESCRIPTION: command-line network traffic analyzer tcsh PROVIDES: tcsh DESCRIPTION: TENEX C Shell, an enhanced version of Berkeley csh telnet PROVIDES: telnet.netkit DESCRIPTION: The telnet client #texinfo PROVIDES: makeinfo texi2dvi texi2pdf texindex DESCRIPTION: Documentation system for on-line information and printed output tftp PROVIDES: tftp DESCRIPTION: Trivial file transfer protocol client #thunar PROVIDES: Thunar DESCRIPTION: File Manager for Xfce time PROVIDES: time DESCRIPTION: GNU time program for measuring CPU resource usage tk8.4 PROVIDES: wish8.4 DESCRIPTION: Tk toolkit for Tcl and X11, v8.4 - run-time files tshark PROVIDES: tshark DESCRIPTION: network traffic analyzer - console version #ucf PROVIDES: lcf ucf ucfq ucfr DESCRIPTION: Update Configuration File: preserve user changes to config files. ucspi-tcp-ipv6 PROVIDES: tcpclient tcpserver DESCRIPTION: command-line tools for building TCP client-server applications (IPv6) #udev PROVIDES: udevadm udevd DESCRIPTION: /dev/ and hotplug management daemon #udhcpc PROVIDES: udhcpc DESCRIPTION: Provides the busybox DHCP client implementation #udhcpd PROVIDES: dumpleases udhcpd DESCRIPTION: Provides the busybox DHCP server implementation #uml-utilities PROVIDES: tunctl DESCRIPTION: User-mode Linux (utility programs) unzip PROVIDES: unzip DESCRIPTION: De-archiver for .zip files #usbutils PROVIDES: lsusb update-usbids usb-devices DESCRIPTION: Linux USB utilities #usermode PROVIDES: consolehelper userhelper DESCRIPTION: Graphical tools for certain user account management tasks #uuid-runtime PROVIDES: uuidgen DESCRIPTION: runtime components for the Universally Unique ID library vim PROVIDES: vim.basic DESCRIPTION: Vi IMproved - enhanced vi editor vim-addon-manager PROVIDES: vim-addons DESCRIPTION: manager of addons for the Vim editor vim-runtime PROVIDES: vimtutor DESCRIPTION: Vi IMproved - Runtime files vim-scripts PROVIDES: dtd2vim vimplate DESCRIPTION: plugins for vim, adding bells and whistles vlan PROVIDES: vconfig DESCRIPTION: user mode programs to enable VLANs on your ethernet devices #vlock PROVIDES: vlock DESCRIPTION: Virtual Console locking program w3m PROVIDES: w3m w3mman DESCRIPTION: WWW browsable pager with excellent tables/frames support whois PROVIDES: mkpasswd whois DESCRIPTION: intelligent WHOIS client wireshark PROVIDES: wireshark DESCRIPTION: network traffic analyzer - GTK+ version wireshark-common PROVIDES: capinfos dumpcap editcap mergecap text2pcap DESCRIPTION: network traffic analyzer - common files #wireshark-dev PROVIDES: asn2deb idl2deb idl2wrs DESCRIPTION: network traffic analyzer - development tools x11-apps PROVIDES: atobm bitmap bmtoa ico oclock x11perf x11perfcomp xbiff xcalc xclipboard xclock xconsole xcursorgen xcutsel xditview xedit xeyes xgc xload xlogo xmag xman xmore xwd xwud DESCRIPTION: X applications #x11-session-utils PROVIDES: rstart rstartd smproxy xsm DESCRIPTION: X session utilities x11-utils PROVIDES: appres editres listres luit viewres xdpyinfo xdriinfo xev xfd xfontsel xkill xlsatoms xlsclients xlsfonts xmessage xprop xvinfo xwininfo DESCRIPTION: X11 utilities #x11-xfs-utils PROVIDES: fslsfonts fstobdf showfont xfsinfo DESCRIPTION: X font server utilities x11-xkb-utils PROVIDES: setxkbmap xkbbell xkbcomp xkbevd xkbprint xkbvleds xkbwatch DESCRIPTION: X11 XKB utilities #x11-xserver-utils PROVIDES: iceauth sessreg showrgb xcmsdb xgamma xhost xmodmap xrandr xrdb xrefresh xset xsetmode xsetpointer xsetroot xstdcmap xvidtune DESCRIPTION: X server utilities xauth PROVIDES: xauth DESCRIPTION: X authentication utility #xdg-user-dirs PROVIDES: xdg-user-dir xdg-user-dirs-update DESCRIPTION: tool to manage well known user directories #xdg-user-dirs-gtk PROVIDES: xdg-user-dirs-gtk-update DESCRIPTION: tool to manage well known user directories (Gtk extension) #xdg-utils PROVIDES: xdg-desktop-icon xdg-desktop-menu xdg-email xdg-icon-resource xdg-mime xdg-open xdg-screensaver xdg-settings DESCRIPTION: desktop integration utilities from freedesktop.org #xfce4-panel PROVIDES: xfce4-panel DESCRIPTION: panel for Xfce4 desktop environment #xfce4-session PROVIDES: xfce4-session xfce4-session-logout xfce4-tips DESCRIPTION: Xfce4 Session Manager #xfce4-terminal PROVIDES: xfce4-terminal xfce4-terminal.wrapper DESCRIPTION: Xfce terminal emulator #xfce4-utils PROVIDES: startxfce4 xfbrowser4 xfce4-about xfhelp4 xflock4 xfmountdev4 xfrun4 xfterm4 DESCRIPTION: Various tools for Xfce #xfdesktop4 PROVIDES: xfdesktop DESCRIPTION: xfce desktop background, icons and root menu manager xfonts-utils PROVIDES: bdftopcf bdftruncate mkfontdir mkfontscale ucs2any update-fonts-alias update-fonts-dir update-fonts-scale DESCRIPTION: X Window System font utility programs #xfwm4 PROVIDES: xfwm4 DESCRIPTION: window manager of the Xfce project #xinetd PROVIDES: itox xinetd DESCRIPTION: replacement for inetd with many enhancements #xinit PROVIDES: startx xinit DESCRIPTION: X server initialisation tool #xml-core PROVIDES: dh_installxmlcatalogs update-xmlcatalog DESCRIPTION: XML infrastructure and XML catalog file support #xserver-xorg PROVIDES: X DESCRIPTION: X.Org X server xterm PROVIDES: koi8rxterm lxterm resize uxterm xterm DESCRIPTION: X terminal emulator xtermcontrol PROVIDES: xtermcontrol DESCRIPTION: dynamic configuration of xterm properties xtermset PROVIDES: xtermset DESCRIPTION: change the characteristics of an xterm #xutils-dev PROVIDES: ccmakedep cleanlinks gccmakedep imake lndir makedepend makeg mergelib mkdirhier mkhtmlindex revpath xmkmf DESCRIPTION: X Window System utility programs for development #xview-clients PROVIDES: clock cmdtool props textedit DESCRIPTION: XView client programs #xviewg PROVIDES: capitalize insert_brackets remove_brackets shift_lines DESCRIPTION: XView shared libraries xvt PROVIDES: xvt DESCRIPTION: X terminal-emulator similar to xterm, but smaller ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/RELEVANT_FILE_HERE2marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/RELEVANT_FIL0000777000175000017500000000000012167200764040344 2package_catalog.squeeze.selectionustar lucaslucas././@LongLink0000000000000000000000000000017600000000000011571 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/binary_list.machine-guignol-60440.543marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/binary_list.0000600000175000017500000001001112167200764032337 0ustar lucaslucas acpid addgroup add-shell adduser adjtimex agentxtrap ar arp arping ash awk babeld base64 basename bash beep bgpd blkid blockdev bootchartd brctl bridg bridge bunzip2 busybox bzcat bzcmp bzdiff bzegrep bzfgrep bzgrep bzip2 bzip2recover bzless bzmore cal cat catv chat chattr chgrp chmod chown chpasswd chpst chroot chrt chvt cksum clear cmp comm conspy cp cpio crond crontab cryptpw ctstat cttyhack curl curlftpfs cut date dc dd deallocvt delgroup deluser depmod devmem df dhclient dhcpd dhcprelay diff dig dirname dmesg dnsd dnsdomainname dnssec-dsfromkey dnssec-keyfromlabel dnssec-keygen dnssec-signzone dos2unix du dumpkeys dumpkmap dumpleases e echo ed egrep eject em encode_keychange env envdir envuidgid ether-wake ethghost ethtool expand expr fakeidentd false fbset fbsplash fdflush fdformat fdisk fgconsole fgrep filan file find findfs flex++ flock fold free freeramdisk fsck fsck.minix fsync ftpd ftpget ftpput fuser fusermount gdbus gdbus-codegen genl getconf getkeycodes getopt getty gio-querymodules glib-compile-schemas grep groups gsettings gunzip gzip halt hd hdparm head hexdump host hostid hostname httpd hush hwclock iconv id ifconfig ifconfig.busybox ifdown ifenslave ifplugd ifstat ifup inetd init insmod install ionice iostat ip ip6tables ip6tables-restore ip6tables-save ipaddr ipcalc ipcrm ipcs iplink iproute iprule iptables iptables-restore iptables-save iptables-xml iptunnel isisd kbd_mode kbdrate kill killall killall5 klogd last ldconfig ldd less lighttpd lighttpd-angel links linux32 linux64 ln lnstat loadfont loadkeys loadkmap loadunimap logger login logname logread losetup lpd lpq lpr ls lsattr lsmod lsof lspci lsusb lwresd lzcat lzcmp lzdiff lzegrep lzfgrep lzgrep lzless lzma lzmadec lzmainfo lzmore lzop lzopcat makedevs makemime man mapscrn md5sum mdev mesg microcom mkdir mkdosfs mke2fs mkfifo mkfs.ext2 mkfs.minix mkfs.vfat mknod mkpasswd mkswap mktemp modinfo modprobe more mount mountpoint mpstat mt mv named named-checkconf named-checkzone named-compilezone nameif nanddump nandwrite nano nbd-client nc ncat ncftp ncftpbatch ncftpget ncftpls ncftpput ncftpspooler ndiff netcat net-snmp-config net-snmp-create-v3-user netstat nice nmap nmeter nohup nping nslookup nstat nsupdate ntpd ntpdate ntpdc ntpq od openvt ospf6d ospfclient ospfd passwd patch pcregrep pcretest pgrep pidof ping ping6 pipe_progress pivot_root pkill pmap popmaildir poweroff powertop printenv printf procan ps pscan psfaddtable psfgettable psfstriptable psfxtable pstree pwd pwdx radvd radvdump raidautorun rdate rdev readahead readlink readprofile realpath reboot reformime remove-shell renice reset resize resizecons rev ripd ripngd rm rmdir rmmod rndc rndc-confgen route routef routel rpcbind rpcgen rpcinfo rpm rpm2cpio rsync rtacct rtcwake rtmon rtpr rtstat runlevel run-parts runsv runsvdir rx scp script scriptreplay sed sendmail seq setarch setconsole setfont setkeycodes setleds setlogcons setmetamode setserial setsid setuidgid sftp sh sha1sum sha256sum sha3sum sha512sum showconsolefont showkey sh.prebash slattach sleep slogin smemcap snmpbulkget snmpbulkwalk snmpd snmpdelta snmpdf snmpget snmpgetnext snmpinform snmpnetstat snmpset snmpstatus snmptable snmptest snmptranslate snmptrap snmptrapd snmpusm snmpvacm snmpwalk sntp socat softlimit sort split ss ssh ssh-add ssh-agent sshd sshfs ssh-keygen ssh-keyscan start-stop-daemon stat strace strace-log-merge strings stty su sudo sudoedit sudoreplay sulogin sum sv svlogd swapoff swapon switch_root sync sysctl syslogd tac tail tar tc tcpdump tcpsvd tee telnet telnetd test tftp tftpd time timeout top touch tr traceroute traceroute6 true tty ttysize tunctl ubiattach ubidetach ubimkvol ubirmvol ubirsvol ubiupdatevol udhcpc udhcpd udpsvd umount uname uncompress unexpand unicode_start unicode_stop uniq unix2dos unlzma unlzop unxz unzip uptime users usleep uudecode uuencode vconfig vi visudo vlock volname wall watch watchdog watchquagga wc wget which who whoami whois xargs xtables-multi xz xzcat xzcmp xzdec xzdiff xzegrep xzfgrep xzgrep xzless xzmore yes zcat zcip zcmp zdiff zebra zegrep zfgrep zgrep zhead zless ztail ././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/binary_list.machine-pinocchio-09157.476marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/binary_list.0000600000175000017500000001036112167200764032347 0ustar lucaslucasarp arpd attr authdaemond authenumerate authpasswd authtest badblocks bash bashbug bc berkeley_db_svc blkid bootlogd busybox bzdiff bzgrep bzip2 bzip2recover bzmore certtool chacl chage chattr chfn chgpasswd chgrp chmod chown chpasswd chsh clear comp_err courierauthconfig courier-config courierldapaliasd courierlogger couriertcpd couriertls cp cpio c_rehash db_archive db_checkpoint dbclient db_deadlock db_dump db_hotbackup dbilogstrip dbiprof dbiproxy db_load db_printlog db_recover db_stat db_upgrade db_verify dc deliverquota depmod dhclient dhclient-script dhcpd dhcrelay dig dnssec-keygen dnssec-signzone dropbear dropbearconvert dropbearkey dumpe2fs e2fsck e2image e2label egrep enable_ssl.sh ettercap etterfilter etterlog expiry exportfs faillog fgrep file filefrag find findfs free fsck fsck.ext2 fsck.ext3 ftp ftpcount ftpdctl ftpd.krb5 ftp.krb5 ftpshut ftptop ftpwho fuser gawk genl getent getfacl getfattr ghostify gnutls-cli gnutls-cli-debug gnutls-serv gpasswd gpg-error grep groupadd groupdel groupmems groupmod groups grpck grpconv grpunconv gss-client gss_clnt_send_err gss_destroy_creds gss-server gunzip gzexe gzip halt host hostname htop id ifcfg ifconfig ifstat igawk imapd infocmp init innochecksum insmod ip ip6tables ipmaddr iptables iptables-restore iptables-save iptables-xml iptunnel itox k5srvutil kadmin kadmind kadmin.local kdb5_ldap_util kdb5_util kdestroy kill killall killall5 kinit klist klogd klogind kpasswd kprop kpropd krb524d krb524init krb5-config krb5kdc krb5-send-pr kshd ksu ktutil kvno last lastlog ldapcompare ldapdelete ldapexop ldapmodify ldapmodrdn ldappasswd ldapsearch ldapwhoami lighttpd lighttpd-angel links lnstat locale localedef locale-gen locate login login.debian login.krb5 login.shadow logoutd logsave ls lsattr lsmod lwresd mailbot maildiracl maildirkw maildirmake maildrop makemime makeuserdb marionnet_grab_config mesg mii-tool mkdevs.sh mke2fs mkfs.ext2 mkfs.ext3 mklost+found mkpasswd modinfo modprobe mount mount.nfs mountpoint msql2mysql myisamchk myisam_ftdump myisamlog myisampack my_print_defaults mysql mysqlaccess mysqladmin mysqlbinlog mysqlbug mysqlcheck mysql_client_test mysql_config mysql_convert_table_format mysql_create_system_tables mysqld mysqld_multi mysqld_safe mysqldump mysqldumpslow mysql_explain_log mysql_find_rows mysql_fix_extensions mysql_fix_privilege_tables mysqlhotcopy mysqlimport mysql_install_db mysqlmanager mysql_secure_installation mysql_setpermission mysqlshow mysql_tableinfo mysqltest mysqltestmanager mysqltestmanagerc mysqltestmanager-pwgen mysql_tzinfo_to_sql mysql_upgrade mysql_upgrade_shell mysql_waitpid mysql_zap named named-checkconf named-checkzone nameif nano nast ncurses5-config netstat newgrp newusers nfsstat nmap nologin nscd nscd_nischeck nslookup nstat nsupdate ntpd ntpdate ntpdc ntp-keygen ntpq ntptime ntptrace ntp-wait oldfuser omshell openssl pam_tally passwd pcre-config pcregrep pcretest peekfd perl perl5.8.8 perror pgawk pgrep ping ping6 ping.orig pkill plipconfig pluginviewer pmap pmap_dump pmap_set portmap postalias postcat postconf postdrop postfix postkick postlock postlog postmap postqueue postsuper prename proftpd ps psed psktool pstree pw2userdb pwcheck pwck pwconv pwdx pwunconv rarp rcp rcp.krb5 recup_para.sh reformail reformime replace resize2fs resolveip resolve_stack_dump retawq rlogin rlogin.krb5 rmmod rmt rndc rndc-confgen route routef routel rpcdebug rpc.gssd rpc.idmapd rpcinfo rpc.mountd rpc.nfsd rpc.statd rpc.svcgssd rsh rsh.krb5 rtacct rtmon rtpr runlevel safe_finger saslauthd sasldblistusers2 saslpasswd2 sclient scp sed sendmail setfacl setfattr sharedindexinstall sharedindexsplit showmount shutdown sim_client sim_server skill slabtop slapd slattach slurpd sm-notify snice sntp spawn-fcgi sperl5.8.8 sqlite3 srptool ss sserver start-statd start-stop-daemon stat strace su sulogin sysctl syslogd tack talk tar tc tclsh8.4 tcpd tcpdchk tcpdmatch tcpdump telnet telnetd.krb5 telnet.krb5 testmxlookup testsaslauthd tftp tic tickadj tload toe top tput try-from tset tune2fs umount uncompress unghostify unix_chkpwd unix_update updatedb uptime useradd userdb userdbpw userdb-test-cram-md5 userdel usermod utmpdump uuclient uuidgen uuserver v4rcp vim.basic vmstat vtysh vtysh w wall watch wget whoami whois xargs xinetd zcat zcmp zdiff zegrep zfgrep zforce zgrep zless zmore znew ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/RELEVANT_FILE_HERE1marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/RELEVANT_FIL0000777000175000017500000000000012167200764040176 2package_catalog.wheezy.selectionustar lucaslucas././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_catalog.wheezy.additionalmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_cata0000600000175000017500000000126212167200764032335 0ustar lucaslucasbash-completion PROVIDES: dh_bash-completion DESCRIPTION: programmable completion for the bash shell epiphany-browser PROVIDES: epiphany DESCRIPTION: Intuitive GNOME web browser ipv6calc PROVIDES: ipv6calc DESCRIPTION: small utility for manipulating IPv6 addresses inetutils-inetd PROVIDES: inetutils-inetd DESCRIPTION: internet super server lynx PROVIDES: lynx DESCRIPTION: Text-mode WWW Browser rox-filer PROVIDES: rox-filer DESCRIPTION: A simple graphical file manager for X11 rsyslog PROVIDES: rsyslogd DESCRIPTION: reliable system and kernel logging daemon ucspi-tcp-ipv6 PROVIDES: tcpclient tcpserver DESCRIPTION: command-line tools for building TCP client-server applications (IPv6) ././@LongLink0000000000000000000000000000017600000000000011571 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/binary_list.machine-debian-39284.1368marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/binary_list.0000600000175000017500000003163512167200764032356 0ustar lucaslucas[ 822-date a2dismod a2dissite a2enmod a2ensite a2p ab accessdb acleandir.rc aclocal-1.8 acpid acpi_listen addpart addr2line add-shell adduser adnsheloex adnshost adnslogres adnsresfilter adv1tov2 aecho afmdiff.awk afpd afpd-mtab.pl akodeplay amuFormat.sh apache2 apache2ctl apple_chfile apple_cp apple_file apple_mv apple_rm appres apt-cache apt-cdrom apt-config apt-extracttemplates apt-ftparchive apt-get aptitude aptitude-create-state-bundle aptitude-run-state-bundle apt-key apt-mark apt-sortpkgs ar arp artscat artsd artsdsp artsmessage artsplay artsrec artsshell artswrapper as asip-status.pl asn1Coding asn1Decoding asn1Parser asn2deb aspell aspell-autobuildhash aspell-import atalkd atobm audit2allow audit2why autoconf autoheader autom4te automake-1.8 autopoint autoreconf autoscan autoupdate b2m badblocks balou-export-theme balou-install-theme basename bash bashbug bc bdftopcf bdftops bdftruncate beforelight berdecode biosdecode bitmap blkid blockdev bmtoa bootlogd bsd-write buildhash bunzip2 busybox bzcat bzdiff bzexe bzgrep bzip2 bzip2recover bzmore c2ph c89-gcc c99-gcc calendar capinfos capitalize cat catchsegv catman ccmakedep cdbs-edit-patch cfdisk cfg2html cfg2html-linux c++filt chage chattr chcat chcon check_forensic checkgid chfn chgpasswd chgrp chkdupexe chmod chown chpasswd chroot chrt chsh cjpeg cksum cleanappledouble.pl cleanlinks cleanup-info clear clear_console clock cmdtool cmp cnid2_create cnid_dbd cnid_index cnid_maint cnid_metad col colcrt colrm column comm compress-dummy cp cpan cpio cpp-4.1 cpp-4.2 cppw Crack Crack-Reporter cramfsck c_rehash cron crontab csplit csslint-0.6 ctags ctags-exuberant ctrlaltdel cupsdconf cupsdoprint cut cytune dash date dbmmanage dbus-cleanup-sockets dbus-daemon dbus-monitor dbus-send dbus-uuidgen dc dcop dcopclient dcopfind dcopobject dcopquit dcopref dcopserver dcopserver_shutdown dcopstart dd ddate debconf debconf-apt-progress debconf-communicate debconf-copydb debconf-escape debconf-gettextize debconf-set-selections debconf-show debconf-updatepo debugfs defoma defoma-hints defoma-psfont-installer defoma-reconfigure delpart deluser depmod desktop-file-install desktop-file-validate dexconf df dga dh_builddeb dh_clean dhclient3 dhclient-script dh_compress dh_desktop dh_fixperms dh_gconf dh_gencontrol dh_gtkmodules dh_icons dh_install dh_installcatalogs dh_installchangelogs dh_installcron dh_installdeb dh_installdebconf dh_installdefoma dh_installdirs dh_installdocs dh_installemacsen dh_installexamples dh_installifupdown dh_installinfo dh_installinit dh_installlogcheck dh_installlogrotate dh_installman dh_installmanpages dh_installmenu dh_installmime dh_installmodules dh_installpam dh_installppp dh_installudev dh_installwm dh_installxfonts dh_installxmlcatalogs dh_link dh_listpackages dh_makeshlibs dh_md5sums dh_movefiles dh_ocaml dh_pangomodules dh_perl dh_pycentral dh_pysupport dh_python dh_scrollkeeper dh_shlibdeps dh_strip dh_suidregister dh_testdir dh_testroot dh_testversion dh_undocumented dh_usrlocal diff diff3 dig dir dircolors dirname djpeg dmesg dmidecode dnsdomainname dnssec-keygen dnssec-signzone domainname dotlockfile dpkg dpkg-architecture dpkg-buildpackage dpkg-checkbuilddeps dpkg-deb dpkg-distaddfile dpkg-divert dpkg-genchanges dpkg-gencontrol dpkg-gensymbols dpkg-name dpkg-parsechangelog dpkg-preconfigure dpkg-query dpkg-reconfigure dpkg-scanpackages dpkg-scansources dpkg-shlibdeps dpkg-source dpkg-split dpkg-statoverride dprofpp dselect dtd2vim du dumpcap dumpe2fs dumphint dvipdf e2fsck e2image e2label ebrowse echo editcap editres egrep eject emacs emacs-23.0.0 emacsclient enc2xs env envsubst eps2eps eqn erb1.8 esdcat esdctl esddsp esdfilt esdloop esdmon esdplay esdrec esdsample etags exifautotran exo-csource exo-desktop-item-edit exo-mount exo-open exo-preferred-applications expand expiry exportfs expr factor faillog false famd fc-cache fc-cat fc-list fc-match fdformat fdisk fgrep file filefrag fileshareset find find2perl findaffix findfs finger fixfiles flock fmt fold font2c fontname fontprop free freetype-config fribidi from fsck fsck.cramfs fsck.ext2 fsck.ext3 fsck.minix fsck.nfs fslsfonts fstobdf fuser fvwm2 fvwm-bug FvwmCommand fvwm-config fvwm-convert-2.4 fvwm-convert-2.6 fvwm-menu-desktop fvwm-menu-directory fvwm-menu-headlines fvwm-menu-xlock fvwm-perllib fvwm-root gawk gcc-4.1 gcc-4.2 gccbug-4.1 gccmakedep gconf-merge-tree gconf-schemas gconftool-2 gcore gcov-4.1 gcov-4.2 gdb gdbserver gdbtui gdk-pixbuf-csource gencat genhomedircon getconf getent getopt gettext gettextize gettext.sh getty getzones ghostify ginstall-info gksu gksu-properties glib-genmarshal glib-gettextize glib-mkenums gnome-keyring-daemon gobject-query gpasswd gpg gpg-convert-from-106 gpgsplit gpgv gpg-zip gprof grep grep-changelog groff grog grops grotty groupadd groupdel groupmod groups grpck grpconv grpunconv grub grub-floppy grub-install grub-install grub-md5-crypt grub-reboot grub-set-default grub-terminfo gsbj gsdj gsdj500 gs-gpl gslj gslp gsnd gss_clnt_send_err gss_destroy_creds gtk-builder-convert gunzip gv gzexe gzip h2ph h2xs halt head helpztags hexdump host hostid hostname htcacheclean htdbm htdigest html2text htpasswd httxt2dbm hwclock iceauth ico icombine iconv iconvconfig id identd idl2deb idl2wrs ifconfig ifdown ifnames ifup igawk ijoin ikeygen imagetops imake inetd inetutils-ifconfig inetutils-telnet info infocmp infokey init insert_brackets insmod install install-info installkernel install-menu install-sgmlcatalog instmodsh invoke-rc.d ionice ip6tables ip6tables-restore ip6tables-save ipcrm ipcs ipmaddr iptables iptables-restore iptables-save iptables-xml iptunnel isosize ispell ispell-autobuildhash ispell-wrapper jack_alias jack_bufsize jack_connect jackd jack_disconnect jack_evmon jack_freewheel jack_impulse_grabber jack_load jack_lsp jack_metro jack_midiseq jack_midisine jack_monitor_client jackrec jack_showtime jack_simple_client jack_transport jack_unload joe john join jpegexiforient jpegtran kab2kabc kaddprinterwizard kate kbuildsycoca kcmshell kconf_update kcookiejar kde-config kded kdeinit kdeinit_shutdown kdeinit_wrapper kde-menu kdesu_stub kdontchangethehostname kdostartupconfig kedit kfile kgrantpty khotnewstuff kill killall killall5 kinstalltheme kioexec kio_http_cache_cleaner kioslave kio_uiserver klauncher klogd kmailservice koi8rxterm kpac_dhcp_helper kregexpeditor ksendbugmail kshell kstartupconfig ktelnetservice ktradertest kwrapper kwrite labltk laptop-detect last lastlog lcf ld ldconfig ldd less lessecho lesskey lesspipe lexgrog lft.db libnetcfg libpng12-config libtool libtoolize line link links links2 listres ln lndir lnusertemp load_policy locale localedef locale-gen logger login logname logresolve logsave look lorder losetup lp2pap.sh ls lsattr lsmod lsof lspci lspgpot lsusb luit lxterm lynx.stable lzma lzma_alone m4 macusers mailer mail-files mailshar make makedepend MAKEDEV make_driver_db_cups make_driver_db_lpr makeg makeinfo make-ssl-cert makestrs manpath marionnet_grab_config mawk mbchk mcheck mcomp mcookie md5sum megatron meinproc mergecap mergelib mesg mii-tool mkbimage mkboot mkchdr mkcramfs mkdir mkdirhier mke2fs mkfifo mkfontdir mkfontscale mkfs mkfs.bfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.minix mkhtmlindex mkinitramfs mkinitramfs-kpkg mklost+found mkmanifest mknod mkpasswd mkswap mktemp modinfo modprobe more mount mount.cifs mount.nfs mountpoint mount.smbfs mpack msgattrib msgcat msgcmp msgcomm msgconv msgen msgexec msgfilter msgfmt msggrep msginit msgmerge msgunfmt msguniq mt-gnu mtools mtr mtrace munchlist munpack mv mxtar named named-checkconf named-checkzone namei nameif nano nbplkup nbprgstr nbpunrgstr ncal nc.traditional ncurses5-config ncursesw5-config neqn net netatalk-uniconv netkit-ftp netstat newgrp newrole newusers nfsstat ngettext nice nl nm nmblookup nohup nologin nroff nslookup nsupdate nu objcopy objdump ocaml ocamlbrowser ocamlbuild.byte ocamlbuild.native ocamlc ocamlcp ocamldebug ocamldep ocamldoc ocamldumpobj ocamllex ocaml-md5sums ocamlmklib ocamlmktop ocamlobjinfo ocamlopt ocamlprof ocamlrun ocamlyacc oclock od oldfuser omnicpp omniidl omniidlrun.py omshell open_init_pty openssl ownership owplaces pam_getenv pam_tally pango-querymodules pango-view pap papd paperconf paperconfig papstatus partx passwd paste patch pathchk pcimodules pcretest pdf2dsc pdf2ps pdfopt peekfd perl perl5.8.8 perlbug perlcc perldoc perlivp pf2afm pfbtopfa pg pgawk pgrep pic piconv ping ping6 pinky pivot_root pkg-config pl2pm plipconfig pmap pmap_dump pmap_set po2debconf pod2html pod2latex pod2man pod2text pod2usage podchecker podebconf-display-po podebconf-report-po podselect portmap postalias postcat postconf postdrop postfix postkick postlock postlog postmap postqueue postsuper pphs pr precat prename preunzip prezip prezip-bin printafm printenv printf props prove ps ps2ascii ps2epsi ps2pdf12 ps2pdf13 ps2pdf14 ps2pdfwr ps2ps ps2ps2 psed psorder pstree pstruct ptbl ptx pval pwck pwconv pwd pwdx pwunconv pycentral py_compilefiles pydoc2.4 pygettext2.4 pysupport-movemodules pysupport-parseversions python2.4 qmqp-sink qmqp-source qshape querybts ranlib rarp raw rclock rcs-checkin rdev rdjpgcom readelf readlink readprofile recode-sr-latin remove_brackets remove-default-ispell remove-default-wordlist remove-shell remsync rename.ul renice rep reportbug report-hw rep-remote resize resize2fs restorecon rev revpath rgrep rm rmail rmdir rmmod rmt-tar rndc rndc-confgen rotatelogs route roxterm roxterm-config rpcdebug rpcgen rpc.gssd rpc.idmapd rpcinfo rpc.mountd rpc.nfsd rpc.statd rpc.svcgssd rpc.yppasswdd rpc.ypxfrd rstart rstartd rtcwake ruby1.8 runcon run_init runlevel run-mailcap run-parts run-with-aspell rxvt-xpm rxvt-xterm s2p safe_finger savelog sawfish sawfish-client sawfish-ui scp script scriptreplay sdiff secon sed se_dpkg select-default-ispell select-default-iwrap select-default-wordlist semanage semodule semodule_deps semodule_expand semodule_link semodule_package sendmail sensible-browser sensible-editor sensible-pager sepolgen-ifgen seq sessreg sestatus setarch setfiles setpci setsebool setsid setterm setxkbmap sfdisk sftp sha1sum sha224sum sha256sum sha384sum sha512sum shadowconfig shar shift_lines showfont showmount showppd showrgb shred shutdown size skill slabtop slattach sleep smbpasswd sm-notify smproxy smtp-sink smtp-source snacc snacc-config soelim sort sperl5.8.8 splain split split-logfile sprof sq ssh ssh-add ssh-agent ssh-argv0 ssh-copy-id sshd ssh-keygen ssh-keyscan start_kdeinit start_kdeinit_wrapper startpar start-stop-daemon startx startxfce4 stat strace strfile strings strip stty su sudo sudoedit sulogin sum su-to-root swapon sync sysctl syslogd syslogd-listfiles syslog-facility tac tail tailf tar tasksel taskset tbl tclsh8.4 tcpd tcpdchk tcpdmatch tcpdump tcptraceroute.db tcsh tee telnetd telnet.netkit tempfile test testparm testrb1.8 texi2dvi texi2pdf texindex text2pcap textedit tftp tgz Thunar tic time timelord tload toe top touch tput tr traceproto.db traceroute.db traceroute-nanog.db troff true tryaffix try-from tset tshark tsort tty tune2fs tunelp tzselect ucf ucfq ucfr ucs2any udevcontrol udevd udevinfo udevmonitor udevsettle udevtest udevtrigger ul umount umount.cifs uname uncompress unexpand unghostify uniq unix_chkpwd unlink unshar unsq unstr update-alternatives update-catalog update-default-ispell update-default-wordlist update-desktop-database update-dictcommon-aspell update-fonts-alias update-fonts-dir update-fonts-scale update-gconf-defaults update-grub update-grub update-icon-caches update-inetd update-initramfs update-ispell-dictionary update-locale update-menus update-mime update-mime-database update-modules update-openoffice-dicts update-pangox-aliases update-passwd update-pciids update-python-modules update-rc.d update-usbids update-xmlcatalog uptime useradd userdel usermod users uudecode uuencode uxterm uz validlocale vdir viewres vim-addons vim.basic vimplate vim.tiny vimtutor vipw visudo vmstat volname vpddecode w3m w3mman wall watch wc wftopfa wget whatis whereis which whiptail who whoami whois wireshark wish8.4 word-list-compress w.procps wrjpgcom X x11perf x11perfcomp xargs xauth xauth_switch_to_sun-des-1 xbiff xcalc xclipboard xclock xcmsdb xconsole xcursorgen xcutsel xdbedizzy xditview xdpyinfo xdriinfo xedit xev xeyes xfbrowser4 xfce4-about xfce4-autostart-editor xfce4-kiosk-query xfce4-menueditor xfce4-panel xfce4-popup-menu xfce4-popup-windowlist xfce4-session xfce4-session-logout xfce4-terminal xfce4-terminal.wrapper xfce4-tips xfce-mcs-manager xfce-setting-show xfd xfdesktop xfhelp4 xflock4 xfmountdev4 xfontsel xfrun4 xfsinfo xfsm-shutdown-helper xft-config xfterm4 xfwm4 xgamma xgc xgettext xhost xinit xkbbell xkbcomp xkbevd xkbprint xkbvleds xkbwatch xkill xlinks2 xload xlogo xlsatoms xlsclients xlsfonts xmag xman xmessage xmkmf xmodmap xmore xon xprop xrandr xrdb xrefresh xset xsetmode xsetpointer xsetroot xsm xstdcmap xsubpp xterm xtermcontrol xtermset xtrapchar xtrapin xtrapinfo xtrapout xtrapproto xtrapreset xtrapstats xvidtune xvinfo xwd xwininfo xwud xxd yes ypbind ypcat ypmatch yppasswd yppoll yppush ypserv ypserv_test ypset yptest ypwhich zcat zcmp zdiff zdump zegrep zfgrep zforce zgrep zic zless zmore znew zsoelim ././@LongLink0000000000000000000000000000020100000000000011556 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/make_package_catalog_from_binary_list.shmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/make_package0000700000175000017500000001514112167200764032344 0ustar lucaslucas#!/bin/bash # This file is part of Marionnet, a virtual network laboratory # Copyright (C) 2013 Jean vincent Loddo # Copyright (C) 2013 Université Paris 13 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This script helps people to build a debian filesystem # with debootstrap according to the Marionnet requirements. set -e if [[ $1 = wheezy || $1 = squeeze ]]; then RELEASE="$1" echo "Release set to \`$RELEASE'" else echo "Usage: $(basename $0) RELEASE" echo "where RELEASE is \`wheezy' or \`squeeze'" echo "---" echo "Generates the file \`package_catalog.\${RELEASE}.GENERATED' from \`binary_list.UNION'" echo "searching in the specified RELEASE for packages related to at least one of the listed" echo "binaries." exit 2 fi HTTP_SERVER=http://ftp.debian.org/debian/ ARCH=i386 function mkTMPFILE { mktemp /tmp/${1}.$(date +%H\h%M | tr -d " ").XXXXXX } # 1-column file difference: function list_diff { [[ -f "$1" && -f "$2" ]] || { return 1; } local PATTERNS=$(sort "$2" | uniq) sort "$1" | uniq | \grep -v -w -F "$PATTERNS" } # rewrite [-f/--follow] FILE with COMMAND # Examples: # $ rewrite FOO with grep "DATE=" FOO # $ rewrite FOO with grep "DATE=" $TMPFILE else "$@" | tee $TMPFILE fi cat $TMPFILE > $TARGET rm -f $TMPFILE } function cool_sudo_chroot { # global COOL_SUDO if [[ -z $COOL_SUDO ]]; then export COOL_SUDO=$(mktemp /tmp/COOL_SUDO.XXXXXX) chmod +x $COOL_SUDO fi local DIR="$1" shift if [[ $# -eq 0 ]]; then set -- "bash" "2>/dev/null" fi echo '#!/bin/bash' > $COOL_SUDO echo "chroot '$DIR'" "$@" >> $COOL_SUDO sudo $COOL_SUDO } function cool_sudo { # global COOL_SUDO if [[ -z $COOL_SUDO ]]; then export COOL_SUDO=$(mktemp /tmp/COOL_SUDO.XXXXXX) chmod +x $COOL_SUDO fi if [[ $# -eq 0 ]]; then set -- "bash" "2>/dev/null" fi echo '#!/bin/bash' > $COOL_SUDO echo "$@" >> $COOL_SUDO sudo $COOL_SUDO } function make_package_catalog_from_binary_list { # global RELEASE HTTP_SERVER ARCH # Required file: binary_list.UNION local REQUIRED_FILE=binary_list.UNION local TARGET=package_catalog.$RELEASE.GENERATED # --- [[ -f $REQUIRED_FILE ]] || { make -C $(dirname $REQUIRED_FILE) $(basename $REQUIRED_FILE) } local TWDIR=_build.temporary_basic_${RELEASE}.$(date +%Y-%m-%d.%H\h%M) local INCLUDE="--include=realpath,apt-file" local EXCLUDE="--exclude=udev" mkdir -v -p $TWDIR # --- echo "Step 1: making a temporary debian system" echo "---" cool_sudo debootstrap --arch=${ARCH} $INCLUDE $EXCLUDE $RELEASE ${TWDIR} ${HTTP_SERVER} # --- local BINARY_LIST=$(<$REQUIRED_FILE) local TARGET1=$(mkTMPFILE TARGET1) local TARGET2=$(mkTMPFILE TARGET2) local TARGET3=$(mkTMPFILE TARGET3) local TARGET4=$(mkTMPFILE TARGET4) local TMPFILE1=$(mktemp) local TMPFILE2=$(mktemp) local TMPFILE3=$(mktemp) # --- echo "Step 2: searching for listed binaries which are not included in a basic debian ($RELEASE) system..." echo "---" local CMD=$(echo 'for i in '$BINARY_LIST'; do echo -en "$i\t" ; dpkg -S $(realpath $(type -P $i)) || echo NOT_FOUND; done') cool_sudo_chroot $TWDIR <<<"$CMD" 1>$TARGET1 # --- echo "Step 3: searching for packages containing not basic binaries..." echo "---" local R CMD="apt-file update" sudo <<<"$CMD" chroot $TWDIR bash \grep NOT_FOUND $TARGET1 \ | while read i _; do CMD=$(echo "apt-file search bin/$i | grep 'bin/$i$' | head -n 1") R=$(cool_sudo_chroot $TWDIR <<<"$CMD") if [[ -n "$R" ]]; then echo -e "$i $R"; else echo -e "$i NOT_FOUND"; fi done \ | tee $TMPFILE1 awk <$TMPFILE1 '(NF == 3) {print $2,$1}' | uniq | sort -k 1,1 -d | uniq >$TMPFILE2 PACKAGES=$(awk <$TMPFILE2 -F : '{print $1}' | uniq | sort | uniq) rewrite $TMPFILE2 with tr -d ':' <$TMPFILE2 awk <$TMPFILE2 '{p1=$1; if (p1 != p0) printf("\n%s PROVIDES: %s",p1,$2); else printf(" %s",$2); p0=p1; next}' >$TARGET2 # --- echo "Step 4: adding packages' descriptions..." echo "---" local L="en_US@UTF-8"; local PACKAGE REST while read PACKAGE REST; do CMD="LANGUAGE=$L LANG=$L LC_ALL=$L aptitude show $PACKAGE" cool_sudo_chroot $TWDIR <<<"$CMD" | awk -v PACKAGE="$PACKAGE" -v REST="$REST" '/^Description:/ {$1=""; print PACKAGE,REST,"DESCRIPTION:",$0}'; done <$TARGET2 | tee $TARGET3 # --- echo "Step 5: removing basic packages from catalog..." echo "---" awk <$TARGET3 '{print $1}' > $TMPFILE1 # list of packages currently listed sudo <<<"dpkg -l" chroot $TWDIR bash | awk '($1 == "ii") {print $2}' > $TMPFILE2 # list of basic packages to ignore list_diff $TMPFILE1 $TMPFILE2 > $TMPFILE3 # list of interesting packages join -j 1 $TMPFILE3 $TARGET3 > $TARGET4 # Finish [[ -f $TARGET ]] && cp -v "$TARGET" "$TARGET.backup" --backup="numbered" cat $TARGET4 > $TARGET echo "Catalog generated in $TARGET" # Mrproper: rm -f $TARGET{1,2,3,4} $TMPFILE{1,2,3} local ANSWER echo -n "Do you want to remove \`$TWDIR'? (y/..) "; read ANSWER if [[ $ANSWER = y ]]; then cool_sudo rm -rf $TWDIR fi } ### Unsuccessfully tested with fakeroot (version 1.18.2-1) and fakechroot (version 2.16-1) : ### -------------------------------------------------------- # # # fakechroot -s fakeroot debootstrap --foreign --variant=fakechroot --include=fakechroot,fakeroot --arch=${ARCH} $RELEASE ${TWDIR} ${HTTP_SERVER} # # # DEBOOTSTRAP_DIR=${TWDIR}/debootstrap fakechroot fakeroot debootstrap --second-stage --second-stage-target=${TWDIR} # # # I: Installing core packages... # # # W: Failure trying to run: chroot _build.debian-wheezy-with-linux-.2013-06-14.17h46 dpkg --force-depends --install /var/cache/apt/archives/base-files_7.1_i386.deb /var/cache/apt/archives/base-passwd_3.5.26_i386.deb ### -------------------------------------------------------- make_package_catalog_from_binary_list echo "Success." exit 0 ././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_catalog.squeeze.GENERATEDmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/package_catalog/package_cata0000600000175000017500000011747212167200764032350 0ustar lucaslucas9base PROVIDES: bc dc ed strings DESCRIPTION: Plan 9 userland tools acl PROVIDES: chacl getfacl setfacl DESCRIPTION: Access control list utilities acpid PROVIDES: acpid acpi_listen DESCRIPTION: Advanced Configuration and Power Interface event daemon adjtimex PROVIDES: adjtimex DESCRIPTION: kernel time variables configuration utility adns-tools PROVIDES: adnsheloex adnshost adnslogres adnsresfilter DESCRIPTION: Asynchronous-capable DNS client library and utilities apache2.2-common PROVIDES: a2dismod a2dissite a2enmod a2ensite apache2ctl apachectl DESCRIPTION: Apache HTTP Server common files apache2-dbg PROVIDES: ab checkgid htcacheclean htdbm htdigest htpasswd httxt2dbm logresolve rotatelogs DESCRIPTION: Apache debugging symbols apache2-mpm-event PROVIDES: apache2 DESCRIPTION: Apache HTTP Server - event driven model apache2-utils PROVIDES: check_forensic dbmmanage split-logfile DESCRIPTION: utility programs for webservers aria2 PROVIDES: aria2c DESCRIPTION: High speed download utility arping PROVIDES: arping DESCRIPTION: sends IP and/or ARP pings (to the MAC address) arts-dbg PROVIDES: artscat artsd artsplay artsrec artsshell artswrapper DESCRIPTION: debugging symbols for arts ash PROVIDES: ash DESCRIPTION: compatibility package for dash aspell PROVIDES: aspell aspell-import precat preunzip prezip prezip-bin run-with-aspell word-list-compress DESCRIPTION: GNU Aspell spell-checker atftpd PROVIDES: in.tftpd DESCRIPTION: advanced TFTP server attr PROVIDES: attr getfattr setfattr DESCRIPTION: Utilities for manipulating filesystem extended attributes autoconf PROVIDES: autoconf autoheader autom4te autoreconf autoscan autoupdate ifnames DESCRIPTION: automatic configure script builder autopoint PROVIDES: autopoint DESCRIPTION: The autopoint program from GNU gettext avahi-autoipd PROVIDES: avahi-autoipd DESCRIPTION: Avahi IPv4LL network address configuration daemon avahi-daemon PROVIDES: avahi-daemon DESCRIPTION: Avahi mDNS/DNS-SD daemon avahi-dbg PROVIDES: avahi-browse avahi-publish avahi-resolve avahi-set-host-name DESCRIPTION: Avahi - debugging symbols avahi-utils PROVIDES: avahi-browse-domains avahi-publish-address avahi-publish-service avahi-resolve-address avahi-resolve-host-name DESCRIPTION: Avahi browsing, publishing and discovery utilities babeld PROVIDES: babeld DESCRIPTION: a loop-free distance-vector routing protocol beep PROVIDES: beep DESCRIPTION: advanced pc-speaker beeper bind9 PROVIDES: dnssec-dsfromkey dnssec-keyfromlabel named DESCRIPTION: Internet Domain Name Server bind9-host PROVIDES: host DESCRIPTION: Version of 'host' bundled with BIND 9.X bind9utils PROVIDES: dnssec-keygen dnssec-signzone named-checkconf named-checkzone named-compilezone rndc rndc-confgen DESCRIPTION: Utilities for BIND binutils PROVIDES: addr2line ar as c++filt gprof ld nm objcopy objdump ranlib readelf size strip DESCRIPTION: The GNU assembler, linker and binary utilities bridge-utils PROVIDES: brctl DESCRIPTION: Utilities for configuring the Linux Ethernet bridge busybox PROVIDES: busybox DESCRIPTION: Tiny utilities for small and embedded systems busybox-syslogd PROVIDES: klogd logread syslogd DESCRIPTION: Provides syslogd and klogd using busybox bzip2 PROVIDES: bunzip2 bzcat bzcmp bzdiff bzegrep bzexe bzfgrep bzgrep bzip2 bzip2recover bzless bzmore DESCRIPTION: high-quality block-sorting file compressor - utilities camstream PROVIDES: ftpput DESCRIPTION: collection of tools for webcams and other video-devices cdbs PROVIDES: cdbs-edit-patch DESCRIPTION: common build system for Debian packages chkconfig PROVIDES: chkconfig DESCRIPTION: system tool to enable or disable system services cifs-utils PROVIDES: mount.cifs DESCRIPTION: Common Internet File System utilities citadel-mta PROVIDES: sendmail DESCRIPTION: complete and feature-rich groupware server (mail transport agent) consolekit PROVIDES: ck-history ck-launch-session ck-list-sessions ck-log-system-restart ck-log-system-start ck-log-system-stop console-kit-daemon DESCRIPTION: framework for defining and tracking users, sessions and seats console-tools PROVIDES: chvt deallocvt dumpkeys fgconsole getkeycodes kbd_mode kbdrate loadkeys openvt psfaddtable psfgettable psfstriptable setkeycodes setleds setlogcons setmetamode showkey unicode_start unicode_stop DESCRIPTION: Linux console and font utilities conspy PROVIDES: conspy DESCRIPTION: Remote control of Linux virtual consoles courier-authdaemon PROVIDES: authdaemond DESCRIPTION: Courier authentication daemon courier-authlib PROVIDES: authenumerate authpasswd authtest courierlogger DESCRIPTION: Courier authentication library courier-authlib-dev PROVIDES: courierauthconfig DESCRIPTION: Development libraries for the Courier authentication library courier-authlib-userdb PROVIDES: makeuserdb pw2userdb userdb userdbpw userdb-test-cram-md5 DESCRIPTION: userdb support for the Courier authentication library courier-base PROVIDES: courier-config couriertcpd maildiracl maildirkw sharedindexinstall sharedindexsplit testmxlookup DESCRIPTION: Courier mail server - base system courier-imap PROVIDES: imapd DESCRIPTION: Courier mail server - IMAP server courier-ldap PROVIDES: courierldapaliasd DESCRIPTION: Courier mail server - LDAP support courier-maildrop PROVIDES: mailbot maildrop makemime reformail reformime DESCRIPTION: Courier mail server - mail delivery agent courier-mta PROVIDES: mailq newaliases rmail DESCRIPTION: Courier mail server - ESMTP daemon courier-ssl PROVIDES: couriertls DESCRIPTION: Courier mail server - SSL/TLS Support cpp PROVIDES: cpp DESCRIPTION: The GNU C preprocessor (cpp) cpp-4.1 PROVIDES: cpp-4.1 DESCRIPTION: The GNU C preprocessor crack PROVIDES: Crack Crack-Reporter DESCRIPTION: Password guessing program cracklib-runtime PROVIDES: cracklib-check cracklib-format cracklib-packer cracklib-unpacker create-cracklib-dict DESCRIPTION: runtime support for password checker library cracklib2 cramfsprogs PROVIDES: cramfsck mkcramfs DESCRIPTION: Tools for CramFs (Compressed ROM File System) cryptsetup PROVIDES: cryptsetup DESCRIPTION: configures encrypted block devices cups-bsd PROVIDES: lpq lpr DESCRIPTION: Common UNIX Printing System(tm) - BSD commands curlftpfs PROVIDES: curlftpfs DESCRIPTION: filesystem to access FTP hosts based on FUSE and cURL cyrus-sasl2-dbg PROVIDES: saslauthd sasldblistusers2 saslpasswd2 testsaslauthd DESCRIPTION: Cyrus SASL - debugging symbols daemontools PROVIDES: envdir envuidgid setuidgid softlimit DESCRIPTION: a collection of tools for managing UNIX services dbus PROVIDES: dbus-cleanup-sockets dbus-daemon dbus-monitor dbus-send dbus-uuidgen DESCRIPTION: simple interprocess messaging system dbus-1-dbg PROVIDES: dbus-launch DESCRIPTION: simple interprocess messaging system (debug symbols) debhelper PROVIDES: dh_builddeb dh_clean dh_compress dh_desktop dh_fixperms dh_gconf dh_gencontrol dh_icons dh_install dh_installcatalogs dh_installchangelogs dh_installcron dh_installdeb dh_installdebconf dh_installdirs dh_installdocs dh_installemacsen dh_installexamples dh_installifupdown dh_installinfo dh_installinit dh_installlogcheck dh_installlogrotate dh_installman dh_installmanpages dh_installmenu dh_installmime dh_installmodules dh_installpam dh_installppp dh_installudev dh_installwm dh_installxfonts dh_link dh_listpackages dh_makeshlibs dh_md5sums dh_movefiles dh_perl dh_python dh_scrollkeeper dh_shlibdeps dh_strip dh_suidregister dh_testdir dh_testroot dh_undocumented dh_usrlocal DESCRIPTION: helper programs for debian/rules defoma PROVIDES: defoma defoma-hints defoma-reconfigure dh_installdefoma DESCRIPTION: Debian Font Manager -- automatic font configuration framework desktop-file-utils PROVIDES: desktop-file-install desktop-file-validate update-desktop-database DESCRIPTION: Utilities for .desktop files dh-ocaml PROVIDES: dh_ocaml ocaml-md5sums DESCRIPTION: helper tools for maintaining OCaml-related Debian packages dictionaries-common PROVIDES: aspell-autobuildhash ispell-autobuildhash ispell-wrapper remove-default-ispell remove-default-wordlist select-default-ispell select-default-iwrap select-default-wordlist update-default-ispell update-default-wordlist update-dictcommon-aspell update-openoffice-dicts DESCRIPTION: Common utilities for spelling dictionary tools dietlibc-dev PROVIDES: dnsd DESCRIPTION: diet libc - a libc optimized for small size dmsetup PROVIDES: dmsetup DESCRIPTION: The Linux Kernel Device Mapper userspace library dnsutils PROVIDES: dig nslookup nsupdate DESCRIPTION: Clients provided with BIND dos2unix PROVIDES: dos2unix unix2dos DESCRIPTION: convert text file line endings between CRLF and LF dosfstools PROVIDES: mkdosfs mkfs.vfat DESCRIPTION: utilities for making and checking MS-DOS FAT filesystems dropbear PROVIDES: dbclient dropbear dropbearkey DESCRIPTION: lightweight SSH2 server and client dselect PROVIDES: dselect DESCRIPTION: Debian package management front-end e2fsck-static PROVIDES: e2fsck.static DESCRIPTION: statically-linked version of the ext2/ext3/ext4 filesystem checker ed PROVIDES: red DESCRIPTION: The classic UNIX line editor eject PROVIDES: eject volname DESCRIPTION: ejects CDs and operates CD-Changers under Linux emboss PROVIDES: digest DESCRIPTION: the european molecular biology open software suite esound PROVIDES: esd DESCRIPTION: Enlightened Sound Daemon - Support binaries esound-clients PROVIDES: esdcat esdctl esddsp esdfilt esdloop esdmon esdplay esdrec esdsample DESCRIPTION: Enlightened Sound Daemon - clients ethtool PROVIDES: ethtool DESCRIPTION: display or change Ethernet device settings ettercap PROVIDES: ettercap DESCRIPTION: Multipurpose sniffer/interceptor/logger for switched LAN ettercap-common PROVIDES: etterfilter etterlog DESCRIPTION: Common support files and plugins for ettercap exo-utils PROVIDES: exo-csource exo-desktop-item-edit exo-mount exo-open exo-preferred-applications DESCRIPTION: Utility files for libexo exuberant-ctags PROVIDES: ctags-exuberant DESCRIPTION: build tag file indexes of source code definitions fam PROVIDES: famd DESCRIPTION: File Alteration Monitor fbset PROVIDES: fbset DESCRIPTION: framebuffer device maintenance program fdflush PROVIDES: fdflush DESCRIPTION: Flush out-of-date disk buffers file PROVIDES: file DESCRIPTION: Determines file type using "magic" numbers finger PROVIDES: finger DESCRIPTION: user information lookup program flex PROVIDES: flex++ DESCRIPTION: A fast lexical analyzer generator. fontconfig PROVIDES: fc-cache fc-cat fc-list fc-match fc-query fc-scan DESCRIPTION: generic font configuration library - support binaries fortune-mod PROVIDES: strfile unstr DESCRIPTION: provides fortune cookies on demand ftp PROVIDES: netkit-ftp DESCRIPTION: The FTP client fuse-utils PROVIDES: fusermount DESCRIPTION: Filesystem in USErspace (utilities) fvwm PROVIDES: fvwm2 fvwm-bug FvwmCommand fvwm-config fvwm-convert-2.4 fvwm-convert-2.6 fvwm-menu-desktop fvwm-menu-directory fvwm-menu-headlines fvwm-menu-xlock fvwm-perllib fvwm-root DESCRIPTION: F(?) Virtual Window Manager gawk PROVIDES: gawk igawk pgawk DESCRIPTION: GNU awk, a pattern scanning and processing language gcc PROVIDES: c89-gcc c99-gcc gcc gcov DESCRIPTION: The GNU C compiler gcc-4.1 PROVIDES: gcc-4.1 gccbug-4.1 gcov-4.1 DESCRIPTION: The GNU C compiler gcj-4.4-jdk PROVIDES: appletviewer jar jarsigner javac javadoc javah jdb native2ascii rmic serialver DESCRIPTION: gcj and classpath development tools for Java(TM) gcj-4.4-jre-headless PROVIDES: java keytool orbd rmid rmiregistry tnameserv DESCRIPTION: Java runtime environment using GIJ/classpath (headless version) gconf2 PROVIDES: gconf-merge-tree gconf-schemas gconftool-2 update-gconf-defaults DESCRIPTION: GNOME configuration database system (support tools) gdb PROVIDES: gcore gdb gdbtui DESCRIPTION: The GNU Debugger gdbserver PROVIDES: gdbserver DESCRIPTION: The GNU Debugger (remote server) gettext PROVIDES: gettextize msgattrib msgcat msgcmp msgcomm msgconv msgen msgexec msgfilter msgfmt msggrep msginit msgmerge msgunfmt msguniq recode-sr-latin xgettext DESCRIPTION: GNU Internationalization utilities gettext-base PROVIDES: envsubst gettext gettext.sh ngettext DESCRIPTION: GNU Internationalization utilities for the base system ghdl PROVIDES: gccbug DESCRIPTION: VHDL compiler/simulator using GCC technology ghostscript PROVIDES: bdftops dumphint dvipdf eps2eps font2c gsbj gsdj gsdj500 gslj gslp gsnd pdf2dsc pdf2ps pdfopt pf2afm pfbtopfa pphs printafm ps2ascii ps2epsi ps2pdf12 ps2pdf13 ps2pdf14 ps2pdfwr ps2ps ps2ps2 wftopfa DESCRIPTION: The GPL Ghostscript PostScript/PDF interpreter gksu PROVIDES: gksu DESCRIPTION: graphical frontend to su gnome-keyring PROVIDES: gnome-keyring-daemon DESCRIPTION: GNOME keyring services (daemon and tools) gnutls-bin PROVIDES: certtool gnutls-cli gnutls-cli-debug gnutls-serv psktool srptool DESCRIPTION: the GNU TLS library - commandline utilities gosa-dev PROVIDES: update-locale DESCRIPTION: GOsa? development utilities grub-coreboot PROVIDES: grub-install grub-reboot grub-set-default update-grub DESCRIPTION: GRand Unified Bootloader, version 2 (Coreboot version) grub-legacy PROVIDES: grub grub-floppy grub-md5-crypt grub-terminfo mbchk mkbimage DESCRIPTION: GRand Unified Bootloader (Legacy version) gv PROVIDES: gv DESCRIPTION: PostScript and PDF viewer for X hal PROVIDES: hald hal-device hal-disable-polling hal-find-by-capability hal-find-by-property hal-get-property hal-is-caller-locked-out hal-lock hal-set-property lshal umount.hal DESCRIPTION: Hardware Abstraction Layer hardening-wrapper PROVIDES: gcc-4.2 DESCRIPTION: Compiler wrapper to enable security hardening flags hdparm PROVIDES: hdparm DESCRIPTION: tune hard disk parameters for high performance heimdal-clients PROVIDES: kadmin kdestroy kinit klist kpasswd ksu ktutil DESCRIPTION: Heimdal Kerberos - clients heimdal-dev PROVIDES: krb5-config DESCRIPTION: Heimdal Kerberos - development files html2text PROVIDES: html2text DESCRIPTION: advanced HTML to text converter htop PROVIDES: htop DESCRIPTION: interactive processes viewer icecc PROVIDES: cc DESCRIPTION: distributed compiler (client and server) iceweasel PROVIDES: firefox DESCRIPTION: Web browser based on Firefox id-utils PROVIDES: lid DESCRIPTION: Fast, high-capacity, identifier database tool ifmetric PROVIDES: ifmetric DESCRIPTION: Set routing metrics for a network interface ifplugd PROVIDES: ifplugd ifplugstatus DESCRIPTION: configuration daemon for ethernet devices ifstat PROVIDES: ifstat DESCRIPTION: InterFace STATistics Monitoring inetutils-ftpd PROVIDES: ftpd DESCRIPTION: File Transfer Protocol server inetutils-telnet PROVIDES: inetutils-telnet DESCRIPTION: telnet client inetutils-telnetd PROVIDES: telnetd DESCRIPTION: telnet server inetutils-tools PROVIDES: inetutils-ifconfig DESCRIPTION: base networking utilities (experimental package) initramfs-tools PROVIDES: mkinitramfs mkinitramfs-kpkg update-initramfs DESCRIPTION: tools for generating an initramfs installation-report PROVIDES: report-hw DESCRIPTION: system installation report ipcalc PROVIDES: ipcalc DESCRIPTION: parameter calculator for IPv4 addresses ipsec-tools PROVIDES: setkey DESCRIPTION: IPsec tools for Linux ipsvd PROVIDES: tcpsvd udpsvd DESCRIPTION: Internet protocol service daemons iputils-clockdiff PROVIDES: clockdiff DESCRIPTION: Measure the time difference between networked computers iputils-tracepath PROVIDES: tracepath tracepath6 DESCRIPTION: Tools to trace the network path to a remote host isc-dhcp-relay PROVIDES: dhcrelay DESCRIPTION: ISC DHCP relay daemon isc-dhcp-server PROVIDES: dhcpd DESCRIPTION: ISC DHCP server for automatic IP address assignment ispell PROVIDES: buildhash findaffix icombine ijoin ispell munchlist sq tryaffix unsq update-ispell-dictionary DESCRIPTION: International Ispell (an interactive spelling corrector) jackd1 PROVIDES: alsa_in alsa_out jack_alias jack_bufsize jack_connect jackd jack_disconnect jack_evmon jack_freewheel jack_impulse_grabber jack_load jack_lsp jack_metro jack_midiseq jack_midisine jack_monitor_client jack_netsource jackrec jack_showtime jack_simple_client jack_transport jack_unload DESCRIPTION: JACK Audio Connection Kit (server and example clients) joe PROVIDES: joe DESCRIPTION: user friendly full screen text editor john PROVIDES: john mailer DESCRIPTION: active password cracking tool kate PROVIDES: kate DESCRIPTION: K Advanced Text Editor kbd PROVIDES: loadunimap mapscrn psfxtable resizecons setfont showconsolefont DESCRIPTION: Linux console font and keytable utilities kdebase-dbg PROVIDES: kwrite DESCRIPTION: debugging symbols for the KDE base applications module kdelibs4c2a PROVIDES: fileshareset imagetops DESCRIPTION: core libraries and binaries for all KDE applications kdelibs-dbg PROVIDES: artsmessage cupsdconf cupsdoprint dcop dcopclient dcopfind dcopobject dcopquit dcopref dcopserver dcopserver_shutdown dcopstart kab2kabc kaddprinterwizard kbuildsycoca kcmshell kconf_update kcookiejar kde-config kded kdeinit kdeinit_shutdown kdeinit_wrapper kde-menu kdesu_stub kdontchangethehostname kdostartupconfig kfile kgrantpty khotnewstuff kinstalltheme kioexec kio_http_cache_cleaner kioslave kio_uiserver klauncher kmailservice kpac_dhcp_helper ksendbugmail kshell kstartupconfig ktelnetservice ktradertest kwrapper lnusertemp make_driver_db_cups make_driver_db_lpr meinproc start_kdeinit start_kdeinit_wrapper DESCRIPTION: debugging symbols for kdelibs krb5-admin-server PROVIDES: kadmind kadmin.local kprop DESCRIPTION: MIT Kerberos master server (kadmind) krb5-clients PROVIDES: telnet.krb5 DESCRIPTION: Secure replacements for ftp, telnet and rsh using MIT Kerberos krb5-kdc PROVIDES: kdb5_util kpropd krb5kdc DESCRIPTION: MIT Kerberos key server (KDC) krb5-kdc-ldap PROVIDES: kdb5_ldap_util DESCRIPTION: MIT Kerberos key server (KDC) LDAP plugin krb5-rsh-server PROVIDES: klogind kshd login.krb5 DESCRIPTION: Secure replacements for rshd and rlogind using MIT Kerberos krb5-user PROVIDES: k5srvutil kvno DESCRIPTION: Basic programs to authenticate using MIT Kerberos laptop-detect PROVIDES: laptop-detect DESCRIPTION: attempt to detect a laptop ldap2zone PROVIDES: ldap2zone DESCRIPTION: Extract DNS zones from LDAP trees ldap-utils PROVIDES: ldapadd ldapcompare ldapdelete ldapexop ldapmodify ldapmodrdn ldappasswd ldapsearch ldapurl ldapwhoami DESCRIPTION: OpenLDAP utilities less PROVIDES: less lessecho lesskey lesspipe DESCRIPTION: pager program similar to more libarts1c2a PROVIDES: artsdsp DESCRIPTION: aRts sound system core components libbonobo2-bin PROVIDES: activation-client bonobo-activation-sysconf bonobo-slay echo-client-2 DESCRIPTION: Bonobo CORBA interfaces library -- support binaries libc-dev-bin PROVIDES: gencat mtrace rpcgen sprof DESCRIPTION: Embedded GNU C Library: Development binaries libcroco3 PROVIDES: csslint-0.6 DESCRIPTION: a generic Cascading Style Sheet (CSS) parsing and manipulation toolkit libdb1-compat PROVIDES: db_dump185 DESCRIPTION: The Berkeley database routines [glibc 2.0/2.1 compatibility] libfreetype6-dev PROVIDES: freetype-config DESCRIPTION: FreeType 2 font engine, development files libfribidi0 PROVIDES: fribidi DESCRIPTION: Free Implementation of the Unicode BiDi algorithm libgcj-common PROVIDES: rebuild-security-providers DESCRIPTION: Java runtime library (common files) libgksu2-0 PROVIDES: gksu-properties DESCRIPTION: library providing su and sudo functionality libglib2.0-0-dbg PROVIDES: glib-genmarshal gobject-query DESCRIPTION: The GLib libraries and debugging symbols libglib2.0-dev PROVIDES: glib-gettextize glib-mkenums DESCRIPTION: Development files for the GLib library libgnome2-0 PROVIDES: gnome-open DESCRIPTION: The GNOME library - runtime files libgnomevfs2-0-dbg PROVIDES: gnomevfs-cat gnomevfs-copy gnomevfs-df gnomevfs-info gnomevfs-ls gnomevfs-mkdir gnomevfs-monitor gnomevfs-mv gnomevfs-rm DESCRIPTION: GNOME Virtual File System (debugging libraries) libgpg-error-dev PROVIDES: gpg-error DESCRIPTION: library for common error values and messages in GnuPG components libgtk2.0-0-dbg PROVIDES: gdk-pixbuf-csource DESCRIPTION: The GTK+ libraries and debugging symbols libgtk2.0-bin PROVIDES: gdk-pixbuf-query-loaders gtk-query-immodules-2.0 gtk-update-icon-cache update-icon-caches DESCRIPTION: The programs for the GTK+ graphical user interface library libgtk2.0-dev PROVIDES: dh_gtkmodules gtk-builder-convert DESCRIPTION: Development files for the GTK+ library libjpeg-progs PROVIDES: cjpeg djpeg exifautotran jpegexiforient jpegtran rdjpgcom wrjpgcom DESCRIPTION: Programs for manipulating JPEG files liblockfile1 PROVIDES: dotlockfile DESCRIPTION: NFS-safe locking library, includes dotlockfile program libmysqlclient-dev PROVIDES: mysql_config DESCRIPTION: MySQL database development files libnss3-1d-dbg PROVIDES: certutil cmsutil crlutil modutil pk12util shlibsign signtool signver ssltap DESCRIPTION: Debugging symbols for the Network Security Service libraries libpango1.0-0-dbg PROVIDES: pango-querymodules pango-view DESCRIPTION: The Pango library and debugging symbols libpango1.0-common PROVIDES: update-pangox-aliases DESCRIPTION: Modules and configuration files for the Pango libpango1.0-dev PROVIDES: dh_pangomodules DESCRIPTION: Development files for the Pango libpaper-utils PROVIDES: paperconf paperconfig DESCRIPTION: library for handling paper characteristics (utilities) libpcre3 PROVIDES: pcretest DESCRIPTION: Perl 5 Compatible Regular Expression Library - runtime files libpcre3-dbg PROVIDES: pcregrep DESCRIPTION: Perl 5 Compatible Regular Expression Library - debug symbols libpcre3-dev PROVIDES: pcre-config DESCRIPTION: Perl 5 Compatible Regular Expression Library - development files libpng12-dev PROVIDES: libpng12-config DESCRIPTION: PNG library - development libppl0.10-dev PROVIDES: ppl-config DESCRIPTION: Parma Polyhedra Library (development) librep-dbg PROVIDES: rep rep-remote DESCRIPTION: debug symbols for librep librpm-dbg PROVIDES: rpm rpm2cpio rpmgraph DESCRIPTION: debugging symbols for RPM libruby1.8-dbg PROVIDES: ruby1.8 DESCRIPTION: Debugging symbols for Ruby 1.8 libsmi2-dbg PROVIDES: smidiff smidump smilint smiquery smixlate DESCRIPTION: library to access SMI MIB information - debugging symbols libsmi2ldbl PROVIDES: smicache DESCRIPTION: library to access SMI MIB information libsnmp15 PROVIDES: net-snmp-config DESCRIPTION: SNMP (Simple Network Management Protocol) library libtool PROVIDES: libtool libtoolize DESCRIPTION: Generic library support script libxfce4util-bin PROVIDES: xfce4-kiosk-query DESCRIPTION: tools for libxfce4util libxft-dev PROVIDES: xft-config DESCRIPTION: FreeType-based font drawing library for X (development files) libxt-dev PROVIDES: makestrs DESCRIPTION: X11 toolkit intrinsics library (development headers) lighttpd PROVIDES: lighttpd lighttpd-angel DESCRIPTION: A fast webserver with minimal memory footprint links PROVIDES: links DESCRIPTION: Web browser running in text mode links2 PROVIDES: links2 xlinks2 DESCRIPTION: Web browser running in both graphics and text mode loadlin PROVIDES: freeramdisk DESCRIPTION: a loader (running under DOS) for LINUX kernel images locales PROVIDES: locale-gen validlocale DESCRIPTION: Embedded GNU C Library: National Language (locale) data [support] lpr PROVIDES: lpd DESCRIPTION: BSD lpr/lpd line printer spooling system lrzsz PROVIDES: rx DESCRIPTION: Tools for zmodem/xmodem/ymodem file transfer lsof PROVIDES: lsof DESCRIPTION: List open files lwresd PROVIDES: lwresd DESCRIPTION: Lightweight Resolver Daemon lzma PROVIDES: lzcat lzma unlzma DESCRIPTION: Compression method of 7z format in 7-Zip program lzma-alone PROVIDES: lzma_alone DESCRIPTION: Compression method of 7z format in 7-Zip program lzop PROVIDES: lzop DESCRIPTION: fast compression program m4 PROVIDES: m4 DESCRIPTION: a macro processing language make PROVIDES: make DESCRIPTION: An utility for Directing compilation. makedev PROVIDES: MAKEDEV DESCRIPTION: creates device files in /dev man2html PROVIDES: man2html DESCRIPTION: browse man pages in your web browser menu PROVIDES: install-menu su-to-root update-menus DESCRIPTION: generates programs menu for all menu-aware applications microcom PROVIDES: microcom DESCRIPTION: minimalistic terminal program mii-diag PROVIDES: mii-diag DESCRIPTION: A little tool to manipulate network cards mime-support PROVIDES: run-mailcap update-mime DESCRIPTION: MIME files 'mime.types' & 'mailcap', and support programs mingetty PROVIDES: mingetty DESCRIPTION: Console-only getty mingw32-ocaml PROVIDES: ocamlc ocamlcp ocamldep ocamlmklib ocamlmktop ocamlopt ocamlprof ocamlrun DESCRIPTION: OCaml cross-compiler based on mingw32 mpack PROVIDES: mpack munpack DESCRIPTION: tools for encoding/decoding MIME messages mtd-utils PROVIDES: nanddump nandwrite ubiattach ubidetach ubimkvol ubirmvol ubiupdatevol DESCRIPTION: Memory Technology Device Utilities mtools PROVIDES: amuFormat.sh mcheck mcomp mkmanifest mtools mxtar tgz uz DESCRIPTION: Tools for manipulating MSDOS files mtr PROVIDES: mtr DESCRIPTION: Full screen ncurses and X11 traceroute tool muddleftpd PROVIDES: ftpwho DESCRIPTION: A flexible and efficient FTP daemon mysql-client-5.1 PROVIDES: innochecksum myisam_ftdump my_print_defaults mysql mysqlaccess mysqladmin mysqlbug mysqlcheck mysql_client_test mysqldump mysqldumpslow mysql_find_rows mysql_fix_extensions mysqlimport mysqlmanager mysqlshow mysql_waitpid perror DESCRIPTION: MySQL database client binaries mysql-server-5.1 PROVIDES: msql2mysql myisamchk myisamlog myisampack mysqlbinlog mysql_convert_table_format mysqld_multi mysqld_safe mysql_fix_privilege_tables mysqlhotcopy mysql_install_db mysql_secure_installation mysql_setpermission mysqltest mysql_tzinfo_to_sql mysql_upgrade mysql_zap replace resolveip resolve_stack_dump DESCRIPTION: MySQL database server binaries and system database setup mysql-server-core-5.1 PROVIDES: mysqld DESCRIPTION: MySQL database server binaries nast PROVIDES: nast DESCRIPTION: packet sniffer and lan analyzer nbd-client PROVIDES: nbd-client DESCRIPTION: Network Block Device protocol - client ncftp PROVIDES: ncftpbatch ncftpget ncftpls ncftpput ncftpspooler DESCRIPTION: A user-friendly and well-featured FTP client netatalk PROVIDES: adv1tov2 aecho afpd afpd-mtab.pl apple_chfile apple_cp apple_file apple_mv apple_rm asip-status.pl atalkd cnid2_create cnid_dbd cnid_metad getzones lp2pap.sh macusers megatron nbplkup nbprgstr nbpunrgstr netatalk-uniconv pap papd papstatus psorder showppd timelord DESCRIPTION: AppleTalk user binaries nfs-common PROVIDES: gss_clnt_send_err gss_destroy_creds mount.nfs mount.nfs4 nfsstat rpcdebug rpc.gssd rpc.idmapd rpc.statd showmount sm-notify umount.nfs umount.nfs4 DESCRIPTION: NFS support files common to client and server nfs-kernel-server PROVIDES: exportfs rpc.mountd rpc.nfsd rpc.svcgssd DESCRIPTION: support for NFS kernel server nis PROVIDES: rpc.yppasswdd rpc.ypxfrd ypbind ypcat ypchfn ypchsh ypmatch yppasswd yppoll yppush ypserv ypserv_test ypset yptest ypwhich DESCRIPTION: clients and daemons for the Network Information Service (NIS) nmap PROVIDES: ncat ndiff nmap DESCRIPTION: The Network Mapper ntp PROVIDES: ntpd ntpdc ntp-keygen ntpq ntptime ntptrace ntp-wait tickadj DESCRIPTION: Network Time Protocol daemon and utility programs ntpdate PROVIDES: ntpdate DESCRIPTION: client for setting system time from NTP servers ocaml PROVIDES: labltk ocamlbrowser DESCRIPTION: ML language implementation with a class-based object system ocaml-interp PROVIDES: ocaml DESCRIPTION: OCaml interactive interpreter and standard libraries ocaml-nox PROVIDES: ocamlbuild.byte ocamlbuild.native ocamldebug ocamldoc ocamldumpobj ocamllex ocamlobjinfo ocamlyacc DESCRIPTION: ML implementation with a class-based object system (no X) odt2txt PROVIDES: sxw2txt DESCRIPTION: simple converter from OpenDocument Text to plain text omniidl PROVIDES: omnicpp omniidl DESCRIPTION: omniORB IDL to C++ and Python compiler openbsd-inetd PROVIDES: inetd DESCRIPTION: The OpenBSD Internet Superserver openjdk-6-dbg PROVIDES: apt extcheck idlj javap jconsole jhat jinfo jmap jps jrunscript jsadebugd jstack jstat jstatd pack200 policytool schemagen servertool unpack200 wsgen wsimport xjc DESCRIPTION: Java runtime based on OpenJDK (debugging symbols) openjdk-6-jre PROVIDES: javaws DESCRIPTION: OpenJDK Java runtime, using Hotspot JIT openssh-client PROVIDES: scp sftp slogin ssh ssh-add ssh-agent ssh-argv0 ssh-copy-id ssh-keygen ssh-keyscan DESCRIPTION: secure shell (SSH) client, for secure access to remote machines openssh-server PROVIDES: sshd DESCRIPTION: secure shell (SSH) server, for secure access from remote machines openswan PROVIDES: ipsec DESCRIPTION: Internet Key Exchange daemon orbit2 PROVIDES: ior-decode-2 linc-cleanup-sockets typelib-dump DESCRIPTION: a CORBA ORB patch PROVIDES: patch DESCRIPTION: Apply a diff file to an original pciutils PROVIDES: lspci pcimodules setpci update-pciids DESCRIPTION: Linux PCI Utilities pidentd PROVIDES: identd ikeygen DESCRIPTION: TCP/IP IDENT protocol server with DES support pkg-config PROVIDES: pkg-config DESCRIPTION: manage compile and link flags for libraries policycoreutils PROVIDES: audit2allow audit2why chcat fixfiles genhomedircon load_policy newrole open_init_pty restorecon run_init secon se_dpkg semanage semodule semodule_deps semodule_expand semodule_link semodule_package sepolgen-ifgen sestatus setfiles setsebool DESCRIPTION: SELinux core policy utilities policykit-1 PROVIDES: pkaction pkcheck pkexec DESCRIPTION: framework for managing administrative policies and privileges portmap PROVIDES: pmap_dump pmap_set portmap DESCRIPTION: RPC port mapper postfix PROVIDES: postalias postcat postconf postdrop postfix postkick postlock postlog postmap postmulti postqueue postsuper qmqp-sink qmqp-source qshape smtp-sink smtp-source DESCRIPTION: High-performance mail transport agent powertop PROVIDES: powertop DESCRIPTION: Linux tool to find out what is using power on a laptop ppp PROVIDES: chat DESCRIPTION: Point-to-Point Protocol (PPP) - daemon proftpd-basic PROVIDES: ftpcount ftpdctl ftpshut ftptop proftpd DESCRIPTION: Versatile, virtual-hosting FTP daemon - binaries protoize PROVIDES: protoize unprotoize DESCRIPTION: Create/remove ANSI prototypes from C code pscan PROVIDES: pscan DESCRIPTION: Format string security checker for C files psfontmgr PROVIDES: defoma-psfont-installer DESCRIPTION: PostScript font manager -- part of Defoma, Debian Font Manager psmisc PROVIDES: fuser killall peekfd pstree pstree.x11 DESCRIPTION: utilities that use the proc file system pulseaudio PROVIDES: pulseaudio DESCRIPTION: PulseAudio sound server pulseaudio-esound-compat PROVIDES: esdcompat DESCRIPTION: PulseAudio ESD compatibility layer python PROVIDES: 2to3 pydoc DESCRIPTION: interactive high-level object-oriented language (default version) python2.6-dbg PROVIDES: python2.6 DESCRIPTION: Debug Build of the Python Interpreter (version 2.6) python-central PROVIDES: dh_pycentral pycentral py_compilefiles DESCRIPTION: register and build utility for Python packages python-minimal PROVIDES: python DESCRIPTION: minimal subset of the Python language (default version) python-support PROVIDES: dh_pysupport update-python-modules DESCRIPTION: automated rebuilding support for Python modules quagga PROVIDES: vtysh DESCRIPTION: BGP/OSPF/RIP routing daemon racoon PROVIDES: plainrsa-gen racoon racoonctl DESCRIPTION: IPsec IKE keying daemon radvd PROVIDES: radvd radvdump DESCRIPTION: Router Advertisement Daemon rdate PROVIDES: rdate DESCRIPTION: sets the system's date from a remote host readahead-fedora PROVIDES: readahead DESCRIPTION: Fedora's implementation of readahead to preload boot process files reportbug PROVIDES: querybts reportbug DESCRIPTION: reports bugs in the Debian distribution resolvconf PROVIDES: resolvconf DESCRIPTION: name server information handler rlinetd PROVIDES: update-inetd DESCRIPTION: gruesomely over-featured inetd replacement roxterm PROVIDES: roxterm roxterm-config DESCRIPTION: Multi-tabbed GTK/VTE terminal emulator rpcbind PROVIDES: rpcbind DESCRIPTION: converts RPC program numbers into universal addresses rpm PROVIDES: gendiff rpmdb rpmquery rpmsign rpmverify DESCRIPTION: package manager for RPM rsync PROVIDES: rsync DESCRIPTION: fast remote file copy program (like rcp) ruby1.8 PROVIDES: erb1.8 testrb1.8 DESCRIPTION: Interpreter of object-oriented scripting language Ruby 1.8 runit PROVIDES: chpst runsv runsvdir sv svlogd DESCRIPTION: system-wide service supervision rxvt PROVIDES: rclock rxvt-xpm rxvt-xterm DESCRIPTION: VT102 terminal emulator for the X Window System samba-common-bin PROVIDES: smbpasswd DESCRIPTION: common files used by both the Samba server and client sash PROVIDES: sash DESCRIPTION: Stand-alone shell sawfish PROVIDES: sawfish sawfish-client sawfish-ui DESCRIPTION: a window manager for X11 setserial PROVIDES: setserial DESCRIPTION: controls configuration of serial ports sgml-base PROVIDES: install-sgmlcatalog update-catalog DESCRIPTION: SGML infrastructure and SGML catalog file support sharutils PROVIDES: compress-dummy mail-files mailshar remsync shar unshar uudecode uuencode DESCRIPTION: shar, unshar, uuencode, uudecode slapd PROVIDES: slapacl slapadd slapauth slapcat slapd slapdn slapindex slappasswd slaptest DESCRIPTION: OpenLDAP server (slapd) smbfs PROVIDES: mount.smbfs DESCRIPTION: Common Internet File System utilities - compatibility package smistrip PROVIDES: smistrip DESCRIPTION: extract MIB from text files like RFC snacc PROVIDES: berdecode mkchdr ptbl pval snacc snacc-config DESCRIPTION: ASN.1 to C or C++ or IDL compiler snmp PROVIDES: encode_keychange snmpbulkget snmpbulkwalk snmpdelta snmpdf snmpget snmpgetnext snmpinform snmpnetstat snmpset snmpstatus snmptable snmptest snmptranslate snmptrap snmpusm snmpvacm snmpwalk DESCRIPTION: SNMP (Simple Network Management Protocol) applications snmpd PROVIDES: snmpd snmptrapd DESCRIPTION: SNMP (Simple Network Management Protocol) agents socat PROVIDES: filan procan socat DESCRIPTION: multipurpose relay for bidirectional data transfer sshfs PROVIDES: sshfs DESCRIPTION: filesystem client based on SSH File Transfer Protocol ssl-cert PROVIDES: make-ssl-cert DESCRIPTION: simple debconf wrapper for OpenSSL strace PROVIDES: strace DESCRIPTION: A system call tracer sudo PROVIDES: sudo sudoedit sudoreplay visudo DESCRIPTION: Provide limited super user privileges to specific users sysfsutils PROVIDES: systool DESCRIPTION: sysfs query tool and boot-time setup sysklogd PROVIDES: syslogd-listfiles syslog-facility DESCRIPTION: System Logging Daemon sysstat PROVIDES: iostat mpstat DESCRIPTION: system performance tools for Linux tack PROVIDES: tack DESCRIPTION: terminfo action checker tcl8.4 PROVIDES: tclsh8.4 DESCRIPTION: Tcl (the Tool Command Language) v8.4 - run-time files tcm PROVIDES: tcpd DESCRIPTION: Toolkit for Conceptual Modeling (TCM) tcpd PROVIDES: safe_finger tcpdchk tcpdmatch try-from DESCRIPTION: Wietse Venema's TCP wrapper utilities tcpdump PROVIDES: tcpdump DESCRIPTION: A powerful tool for network monitoring and data acquisition tcsh PROVIDES: tcsh DESCRIPTION: TENEX C Shell, an enhanced version of Berkeley csh telnet PROVIDES: telnet.netkit DESCRIPTION: The telnet client texinfo PROVIDES: makeinfo texi2dvi texi2pdf texindex DESCRIPTION: Documentation system for on-line information and printed output tftp PROVIDES: tftp DESCRIPTION: Trivial file transfer protocol client thunar PROVIDES: Thunar DESCRIPTION: File Manager for Xfce time PROVIDES: time DESCRIPTION: The GNU time program for measuring cpu resource usage tk8.4 PROVIDES: wish8.4 DESCRIPTION: Tk toolkit for Tcl and X11, v8.4 - run-time files tshark PROVIDES: tshark DESCRIPTION: network traffic analyzer - console version ucf PROVIDES: lcf ucf ucfq ucfr DESCRIPTION: Update Configuration File: preserve user changes to config files. udev PROVIDES: udevadm udevd DESCRIPTION: /dev/ and hotplug management daemon udhcpc PROVIDES: udhcpc DESCRIPTION: Provides the busybox DHCP client implementation udhcpd PROVIDES: dumpleases udhcpd DESCRIPTION: Provides the busybox DHCP server implementation uml-utilities PROVIDES: tunctl DESCRIPTION: User-mode Linux (utility programs) unzip PROVIDES: unzip DESCRIPTION: De-archiver for .zip files usbutils PROVIDES: lsusb update-usbids usb-devices DESCRIPTION: Linux USB utilities uuid-runtime PROVIDES: uuidgen DESCRIPTION: runtime components for the Universally Unique ID library vim PROVIDES: vim.basic DESCRIPTION: Vi IMproved - enhanced vi editor vim-addon-manager PROVIDES: vim-addons DESCRIPTION: manager of addons for the Vim editor vim-runtime PROVIDES: vimtutor DESCRIPTION: Vi IMproved - Runtime files vim-scripts PROVIDES: dtd2vim vimplate DESCRIPTION: plugins for vim, adding bells and whistles vlan PROVIDES: vconfig DESCRIPTION: user mode programs to enable VLANs on your ethernet devices vlock PROVIDES: vlock DESCRIPTION: Virtual Console locking program w3m PROVIDES: w3m w3mman DESCRIPTION: WWW browsable pager with excellent tables/frames support watchdog PROVIDES: watchdog DESCRIPTION: A software watchdog whois PROVIDES: mkpasswd whois DESCRIPTION: an intelligent whois client wireshark PROVIDES: wireshark DESCRIPTION: network traffic analyzer - GTK+ version wireshark-common PROVIDES: capinfos dumpcap editcap mergecap text2pcap DESCRIPTION: network traffic analyzer - common files wireshark-dev PROVIDES: asn2deb idl2deb idl2wrs DESCRIPTION: network traffic analyzer - development tools x11-apps PROVIDES: atobm bitmap bmtoa ico oclock x11perf x11perfcomp xbiff xcalc xclipboard xclock xconsole xcursorgen xcutsel xditview xedit xeyes xgc xload xlogo xmag xman xmore xwd xwud DESCRIPTION: X applications x11-session-utils PROVIDES: rstart rstartd smproxy xsm DESCRIPTION: X session utilities x11-utils PROVIDES: appres editres listres luit viewres xdpyinfo xdriinfo xev xfd xfontsel xkill xlsatoms xlsclients xlsfonts xmessage xprop xvinfo xwininfo DESCRIPTION: X11 utilities x11-xfs-utils PROVIDES: fslsfonts fstobdf showfont xfsinfo DESCRIPTION: X font server utilities x11-xkb-utils PROVIDES: setxkbmap xkbbell xkbcomp xkbevd xkbprint xkbvleds xkbwatch DESCRIPTION: X11 XKB utilities x11-xserver-utils PROVIDES: iceauth sessreg showrgb xcmsdb xgamma xhost xmodmap xrandr xrdb xrefresh xset xsetmode xsetpointer xsetroot xstdcmap xvidtune DESCRIPTION: X server utilities xauth PROVIDES: xauth DESCRIPTION: X authentication utility xdg-user-dirs PROVIDES: xdg-user-dir xdg-user-dirs-update DESCRIPTION: tool to manage well known user directories xdg-user-dirs-gtk PROVIDES: xdg-user-dirs-gtk-update DESCRIPTION: tool to manage well known user directories (Gtk extension) xdg-utils PROVIDES: xdg-desktop-icon xdg-desktop-menu xdg-email xdg-icon-resource xdg-mime xdg-open xdg-screensaver xdg-settings DESCRIPTION: desktop integration utilities from freedesktop.org xfce4-panel PROVIDES: xfce4-panel xfce4-popup-windowlist DESCRIPTION: The Xfce4 desktop environment panel xfce4-session PROVIDES: balou-export-theme balou-install-theme xfce4-session xfce4-session-logout xfce4-tips xfsm-shutdown-helper DESCRIPTION: Xfce4 Session Manager xfce4-terminal PROVIDES: xfce4-terminal xfce4-terminal.wrapper DESCRIPTION: Xfce terminal emulator xfce4-utils PROVIDES: startxfce4 xfbrowser4 xfce4-about xfhelp4 xflock4 xfmountdev4 xfrun4 xfterm4 DESCRIPTION: Various tools for Xfce xfdesktop4 PROVIDES: xfce4-popup-menu xfdesktop DESCRIPTION: xfce desktop background, icons and root menu manager xfonts-utils PROVIDES: bdftopcf bdftruncate mkfontdir mkfontscale ucs2any update-fonts-alias update-fonts-dir update-fonts-scale DESCRIPTION: X Window System font utility programs xfwm4 PROVIDES: xfwm4 DESCRIPTION: window manager of the Xfce project xinetd PROVIDES: itox xinetd DESCRIPTION: replacement for inetd with many enhancements xinit PROVIDES: startx xinit DESCRIPTION: X server initialisation tool xml-core PROVIDES: dh_installxmlcatalogs update-xmlcatalog DESCRIPTION: XML infrastructure and XML catalog file support xserver-xorg PROVIDES: dexconf X DESCRIPTION: the X.Org X server xterm PROVIDES: koi8rxterm lxterm resize uxterm xterm DESCRIPTION: X terminal emulator xtermcontrol PROVIDES: xtermcontrol DESCRIPTION: dynamic configuration of xterm properties xtermset PROVIDES: xtermset DESCRIPTION: change the characteristics of an xterm xutils-dev PROVIDES: ccmakedep cleanlinks gccmakedep imake lndir makedepend makeg mergelib mkdirhier mkhtmlindex revpath xmkmf DESCRIPTION: X Window System utility programs for development xview-clients PROVIDES: clock cmdtool owplaces props textedit DESCRIPTION: XView client programs xviewg PROVIDES: capitalize insert_brackets remove_brackets shift_lines DESCRIPTION: XView shared libraries xvt PROVIDES: xvt DESCRIPTION: X terminal-emulator similar to xterm, but smaller xzdec PROVIDES: lzmadec xzdec DESCRIPTION: XZ-format compression utilities - tiny decompressors marionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/bashrc0000777000175000017500000000000012167200764031075 2../../guest/bashrcustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/marionnet-relay0000777000175000017500000000000012167200764034605 2../../guest/marionnet-relayustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh.files/ssh0000777000175000017500000000000012167200764027763 2../../guest/sshustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/pupisto.debian/pupisto.debian.sh0000700000175000017500000010330312167200764023564 0ustar lucaslucas#!/bin/bash # This file is part of Marionnet, a virtual network laboratory # Copyright (C) 2013 Jean vincent Loddo # Copyright (C) 2013 Antoine Seignard # Copyright (C) 2013 Université Paris 13 # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This script helps people to build a debian filesystem # with debootstrap according to the Marionnet requirements. # ============================================================= # AUTOMATIC LOG-FILE GENERATION # ============================================================= MY_BASENAME=$(basename $0) if [[ $1 = "--help" || $1 = "-h" ]]; then # do nothing and continue : elif grep -q "log_${MY_BASENAME}[.]......$" <<<"$1"; then LOGFILE=$1 shift # and continue else LOGFILE=$(mktemp /tmp/log_${MY_BASENAME}.XXXXXX) EXIT_CODE_FILE=$(mktemp /tmp/exit_code_${MY_BASENAME}.XXXXXX) echo -e "Log file of command:\n$0" "$@" "\n---" | tee $LOGFILE COLUMNS=$(tput cols) { time $0 "$LOGFILE" "$@"; echo $? >$EXIT_CODE_FILE; } 2>&1 | tee -a "$LOGFILE" | cut -c1-$((COLUMNS)) read EXIT_CODE <$EXIT_CODE_FILE rm -f $EXIT_CODE_FILE echo "---" echo "$MY_BASENAME: previous running logged into $LOGFILE" exit $EXIT_CODE fi # Script body: set -e # ============================================================= # CMDLINE PARSING # ============================================================= # Getopt's format used to parse the command line: OPTSTRING="hmc:Kk:dn:s:r:t:L" function parse_cmdline { local i j flag # Transform long format options into the short one: for i in "$@"; do if [[ double_dash_found = 1 ]]; then ARGS+=("$i") else case "$i" in --help) ARGS+=("-h"); ;; --custom) ARGS+=("-m"); ;; --continue) ARGS+=("-c"); ;; --name) ARGS+=("-n"); ;; --kernel) ARGS+=("-k"); ;; --no-kernel) ARGS+=("-K"); ;; --debug) ARGS+=("-d"); ;; --release) ARGS+=("-r"); ;; --server) ARGS+=("-s"); ;; --fstype) ARGS+=("-t"); ;; --no-locales) ARGS+=("-L"); ;; --) ARGS+=("--"); double_dash_found=1; ;; --[a-zA-Z0-9]*) echo "*** Illegal long option $i."; exit 1; ;; -[a-zA-Z0-9]*) j="${i:1}"; while [[ $j != "" ]]; do ARGS+=("-${j:0:1}"); j="${j:1}"; done; ;; *) ARGS+=("$i") ;; esac fi done set - "${ARGS[@]}" unset ARGS # Interpret short format options: while [[ $# -gt 0 ]]; do OPTIND=1 while getopts ":$OPTSTRING" flag; do if [[ $flag = '?' ]]; then echo "ERROR: illegal option -$OPTARG."; exit 1; fi eval "option_${flag}=$OPTIND" eval "option_${flag}_arg='$OPTARG'" done for ((j=1; j$TMPFILE < ca:12345:ctrlaltdel:/sbin/halt # (2) add a line: # > 0:12345:respawn:/sbin/getty 38400 tty0 xterm # (3) comment lines in the form: # > #1:2345:respawn:/sbin/getty 38400 tty1 # > #2:23:respawn:/sbin/getty 38400 tty2 # > ... # > #6:23:respawn:/sbin/getty 38400 tty6 # Note that the function is idempotent. function fix_etc_inittab { # global DEBIANROOT local ROOT=${1:-$DEBIANROOT} local TMPFILE=$(mktemp) local AWK_PROGRAM='/^1:2345:respawn:/ {print line} /^[1-6]:[1-6]*:respawn/ {print "#"$0; next} {print}' # Note that th -L option is very relevant to obtain a console quicly reacting to CTRL-C/CTRL-Z etc: sudo awk -v line="0:12345:respawn:/sbin/getty -L 38400 tty0 xterm" "$AWK_PROGRAM" "$ROOT/etc/inittab" > $TMPFILE tabular_file_update --ignore-unchanged -i -d ":" -k 1 --key-value "ca" -f 4 --field-value "/sbin/halt" $TMPFILE sudo_fcall rewrite $ROOT/etc/inittab with cat $TMPFILE rm -f $TMPFILE } function fix_etc_fstab { # global DEBIANROOT FSTYPE local ROOT=${1:-$DEBIANROOT} local TYPE=${FSTYPE:-$DEFAULT_FSTYPE} local TMPFILE=$(mktemp) cat 1>$TMPFILE < $TMPFILE sudo_fcall rewrite "$TARGET" with cat $TMPFILE rm -f $TMPFILE fi } # Executed by `sudo_chroot_fcall' (i.e. as `root' in a chrooted environment): # We suppose that the directory containing ethghost in the # chrooted environment is "/tmp/ethghost": function make_ethghost { local ETHGHOST=/tmp/ethghost make -C $ETHGHOST strip $ETHGHOST/ethghost make DESTDIR=/usr/local -C $ETHGHOST install rm -rf $ETHGHOST } # Compile ethghost into the 32-bits filesystem. # Here we suppose that the apt sources have been fixed: function compile_and_install_ethghost { # global DEBIANROOT local ROOT=${1:-$DEBIANROOT} sudo cp -dR ../ethghost $ROOT/tmp/ sudo chroot ${ROOT} apt-get install -y linux-libc-dev libc6-dev || true export -f make_ethghost sudo_chroot_fcall ${ROOT} make_ethghost } function make_symlink_etc_init_dhcpd_in_chroot { if [[ ! -e /etc/init.d/dhcpd && -x /etc/init.d/isc-dhcp-server ]]; then ln -s isc-dhcp-server /etc/init.d/dhcpd; fi } function make_symlink_etc_init_dhcpd { # global DEBIANROOT local ROOT=${1:-$DEBIANROOT} export -f make_symlink_etc_init_dhcpd_in_chroot sudo_chroot_fcall ${ROOT} make_symlink_etc_init_dhcpd_in_chroot } function install_marionnet_relay_as_root { # global PUPISTO_FILES DEBIANROOT local ROOT=${1:-$DEBIANROOT} cp -v $PUPISTO_FILES/marionnet-relay ${ROOT}/etc/init.d/ chmod +x ${ROOT}/etc/init.d/marionnet-relay chroot $ROOT update-rc.d marionnet-relay defaults } function install_marionnet_relay { # global PUPISTO_FILES DEBIANROOT export PUPISTO_FILES DEBIANROOT sudo_fcall install_marionnet_relay_as_root } function install_bashrc_in_the_skeleton { # global PUPISTO_FILES DEBIANROOT local ROOT=${1:-$DEBIANROOT} local BASHRC=$PUPISTO_FILES/bashrc sudo cp $BASHRC $ROOT/etc/skel/.bash_aliases } function copy_bashrc_in_the_root_home { # global PUPISTO_FILES DEBIANROOT local ROOT=${1:-$DEBIANROOT} local BASHRC=$PUPISTO_FILES/bashrc # Make the `root' directory similar to the `student' one about Bash settings: sudo cp -f $ROOT/etc/skel/.bash* $ROOT/root/ # Copy our bashrc (as bash_aliases, that will be sourced by the actual bashrc): sudo cp $BASHRC $ROOT/root/.bash_aliases } function create_user_student { # global DEBIANROOT local ROOT=${1:-$DEBIANROOT} sudo_careful_chroot $ROOT adduser --home /home/student --shell /bin/bash --uid 1001 --disabled-password --gecos "Student,,," student fix_student_password $ROOT sudo_careful_chroot $ROOT adduser student sudo } function configure_daemon_and_accounts_to_accept_ssh_connection_as_root { # global DEBIANROOT PUPISTO_FILES local ROOT=${1:-$DEBIANROOT} SSHD_CONFIG=$ROOT/etc/ssh/sshd_config SSH_DIR=$PUPISTO_FILES/ssh if [[ -f "$SSHD_CONFIG" ]]; then user_config_set --ignore-unchanged "PermitRootLogin" " " "yes" $SSHD_CONFIG user_config_set --ignore-unchanged "StrictModes" " " "no" $SSHD_CONFIG user_config_set --ignore-unchanged "PubkeyAuthentication" " " "yes" $SSHD_CONFIG mkdir -p $ROOT/{home/student,root}/.ssh chmod 700 $ROOT/{home/student,root}/.ssh chown 1001:1001 $ROOT/home/student/.ssh cat ${SSH_DIR}/id_rsa_marionnet.pub >> $ROOT/home/student/.ssh/authorized_keys cat ${SSH_DIR}/id_rsa_marionnet.pub >> $ROOT/root/.ssh/authorized_keys chmod 644 $ROOT/{home/student,root}/.ssh/authorized_keys else echo "Warning: $SSHD_CONFIG not found. I can't configure daemon and accounts to accept Marionnet connections." fi } # configure_daemon_and_accounts_to_accept_ssh_connection function configure_daemon_and_accounts_to_accept_ssh_connection { # global PUPISTO_FILES DEBIANROOT export PUPISTO_FILES DEBIANROOT sudo_fcall configure_daemon_and_accounts_to_accept_ssh_connection_as_root } # Fix /etc/issue according to $INSTALL_LINUXLOGO # Note that the script `marionnet_relay' will catenate the # output of the command `linuxlogo' with the content of # the file "/etc/issue.marionnet": function fix_etc_issue_as_root { # global DEBIANROOT INSTALL_LINUXLOGO local ROOT=${1:-$DEBIANROOT} local PREVIOUS_MESSAGE TARGET if [[ $INSTALL_LINUXLOGO = y ]]; then unset $PREVIOUS_MESSAGE TARGET=$ROOT/etc/issue.marionnet else # For instance PREVIOUS_MESSAGE could be "Debian GNU/Linux 7" PREVIOUS_MESSAGE=$(awk <$ROOT/etc/issue -F "\\" '{print $1; exit 0}') PREVIOUS_MESSAGE+="\n" TARGET=$ROOT/etc/issue fi cat >$TARGET <$TARGET <<"EOF" #!/bin/bash # The option -f prevent a Marionnet crash using kernels 3.2.x exec -a reboot /sbin/halt "$@" -f EOF # --- chmod +x $TARGET # --- Fix `shutdown' TARGET=$ROOT/sbin/shutdown mv $TARGET $TARGET.unsafe cat >$TARGET <<"EOF" #!/bin/bash # The option -h neutralize the option -r that causes a # Marionnet crash using kernels 3.2.x exec -a shutdown /sbin/shutdown.unsafe "$@" -h EOF # --- chmod +x $TARGET } # fix_reboot_as_root function fix_reboot { # global DEBIANROOT export DEBIANROOT sudo_fcall fix_reboot_as_root } function fix_wireshark_init_lua { # global DEBIANROOT local ROOT=${1:-$DEBIANROOT} local TARGET=$ROOT/etc/wireshark/init.lua if [[ -f $TARGET ]]; then sudo sed -i -e 's/dofile(DATA_DIR.."console.lua")/--dofile(DATA_DIR.."console.lua")/' $TARGET fi } function fix_locales_as_root { # global DEBIANROOT local ROOT=${1:-$DEBIANROOT} [[ -n $ROOT ]] || return 1 # --- cat >$ROOT/etc/locale.gen <<"EOF" # This file lists locales that you wish to have built. You can find a list # of valid supported locales at /usr/share/i18n/SUPPORTED. Other # combinations are possible, but may not be well tested. If you change # this file, you need to rerun locale-gen. # # XXX GENERATED XXX # # NOTE!!! If you change this file by hand, and want to continue # maintaining manually, remove the above line. Otherwise, use the command # "dpkg-reconfigure locales" to manipulate this file. You can manually # change this file without affecting the use of debconf, however, since it # does read in your changes. en_US.UTF-8 UTF-8 EOF # --- # Equivalent to `dpkg-reconfigure locales': chroot $ROOT locale-gen } function fix_locales { # global DEBIANROOT INSTALL_LOCALES [[ -n $INSTALL_LOCALES ]] || return 0 export DEBIANROOT sudo_fcall fix_locales_as_root } function prevent_non_vital_services_from_starting { # global DEBIANROOT local ROOT=${1:-$DEBIANROOT} # Note that `console-screen.sh' creates a second windows. So, we don't consider it as required. # Note that `linuxlogo' is lanched manually by `marionnet_relay'. So, we don't consider it as required. # The service `x11-common' should be required for x-nested machines. local REQUIRED_SERVICES="bootlogs bootmisc.sh checkroot-bootclean.sh checkroot.sh cron halt hostname.sh killprocs kmod marionnet-relay mountall-bootclean.sh mountall.sh mtab.sh networking procps rc rc.local rcS reboot rmnologin sendsigs single skeleton sudo sysfsutils sysstat umountfs umountroot urandom" local TMPFILE1=$(mktemp) local TMPFILE2=$(mktemp) find $ROOT/etc/init.d/ -mindepth 1 -maxdepth 1 -name "[a-z][a-z.\-0-9]*" -exec basename {} \; > $TMPFILE1 echo $REQUIRED_SERVICES | tr ' ' '\n' > $TMPFILE2 SERVICES_TO_REMOVE=$(list_diff $TMPFILE1 $TMPFILE2) # Example: SERVICES_TO_REMOVE="apache2 atftpd babeld bind9 checkfs.sh courier-authdaemon courier-imap courier-ldap courier-mta dbus dhcpd etc-setserial hwclock.sh inetutils-inetd inetutils-syslogd isc-dhcp-server lighttpd motd mountdevsubfs.sh mountkernfs.sh mountnfs-bootclean.sh mountnfs.sh nfs-common nfs-kernel-server nis ntp pppd-dns quagga racoon radvd rpcbind rsync setkey setserial slapd snmpd ssh udev udev-mtab umountnfs.sh x11-common" rm -f $TMPFILE1 $TMPFILE2 local i for i in $SERVICES_TO_REMOVE; do sudo chroot $ROOT update-rc.d -f "$i" remove || true done # Fix some annoying messages on boot: local TARGET=$ROOT/etc/init.d/mountall.sh if [[ -f $TARGET ]]; then sudo sed -i -e 's/kill -s USR1/kill 2>\/dev\/null -s USR1/' $TARGET fi } function install_ipv6_care_in_chroot { cd /tmp wget 'http://sourceforge.net/projects/ipv6-care/files/latest/' -O ipv6_care-latest.tar.gz || return 1 tar xvzf ipv6_care-latest.tar.gz cd ipv6_care-* { ./configure && make && make install; } || return 2 } function install_ipv6_care { # global DEBIANROOT local ROOT=${1:-$DEBIANROOT} export -f install_ipv6_care_in_chroot sudo_chroot_fcall $ROOT install_ipv6_care_in_chroot } function clean_debian_filesystem { # global DEBIANROOT INSTALL_LOCALES TWDIR local ROOT=${1:-$DEBIANROOT} [[ -n $ROOT ]] || return 1 # 1) apt-get install deborphan echo "* Installing deborphan if necessary..."; install_package deborphan || true # 2) apt-clean echo "* Cleaning..." sudo chroot "$ROOT" bash -c "apt-get clean; apt-get autoremove" sudo chroot "$ROOT" bash -c "dpkg -l | grep '^rc' && COLUMNS=200 dpkg -l | grep '^rc' | awk '{print \$2}' | xargs dpkg -P" || true # 3) deborphan echo "* Removing orphans..." sudo chroot "$ROOT" bash -c "deborphan | xargs apt-get -y --purge remove 2>/dev/null" # 4) clean /var/cache echo "* Removing all directories in /var/cache..." sudo find "$ROOT"/var/cache/* -type f -exec rm -f {} \; # 5) clean tmp/ echo "* Cleaning /tmp and /root..." sudo chroot "$ROOT" bash -c ">root/.bash_history; rm -rf tmp/*; rm -rf .rr_moved; >var/mail/root" # 6) locales if [[ $INSTALL_LOCALES = y ]]; then echo "* File *.mo in /usr/share/locale NOT removed" else echo "* Removing files *.mo from /usr/share/locale..." sudo find "$ROOT"/usr/share/locale/ -type f -name "*.mo" -exec rm {} \; fi # 7) accelerate future 'apt-get update' (very slow with cow-files): local TARGET=$ROOT/etc/apt/apt.conf.d/99translations sudo_fcall rewrite $TARGET with 'echo Acquire::Languages \"none\"\;' sudo find $ROOT/var/lib/apt/lists -name "*i18n_Translation*" -exec rm {} \; # 8) remove /var/lib/apt/lists/* # sudo chroot "$ROOT" bash -c "apt-get update; aptitude update" echo "* Removing /var/lib/apt/lists/* ..." sudo rm -rf "$ROOT"/var/lib/apt/lists/* # 9) move /debootstrap to $TWDIR sudo mv "$ROOT"/debootstrap $TWDIR/ sudo chown -R ${USER:-nobody} $TWDIR/debootstrap/ grep "conflict" $TWDIR/debootstrap/debootstrap.log | sort | uniq >> $TWDIR/README.debootstrap.conflicts echo "Success." } # VERSIONE DI TEST ************************************************************************ # function clean_debian_filesystem { # # global DEBIANROOT INSTALL_LOCALES # local ROOT=${1:-$DEBIANROOT} # [[ -n $ROOT ]] || return 1 # # # 2) apt-clean # echo "* Cleaning..." # sudo chroot "$ROOT" bash -c "apt-get clean; apt-get autoremove" # # # IN PIU: # sudo chroot "$ROOT" bash -c "apt-get update; aptitude update" # # sudo chroot "$ROOT" bash -c "apt-get upgrade; aptitude safe-upgrade" # # echo "Success." # } function make_the_image { # global DEBIANROOT IMAGE (or TWDIR and RELEASE) local IMAGE=${1:-$TWDIR/machine-debian-${RELEASE}} local FS_SIZE IMAGE_SIZE # Megabytes local MOUNTDIR local RETURN_CODE=0 # --- FS_SIZE=$(sudo du -sm $DEBIANROOT | awk '{print $1}') # Add 5% let IMAGE_SIZE="FS_SIZE*120/100" echo "Creating the image (${IMAGE_SIZE}M) ..." dd if=/dev/zero of=$IMAGE bs=1M count=$IMAGE_SIZE # --- echo "Formatting the image ($FSTYPE) ..." sudo mkfs.$FSTYPE -q -F $IMAGE ### TODO: check the existence of mkfs.$FSTYPE at the beginning of the script # --- MOUNTDIR=$IMAGE.mnt mkdir -v -p $MOUNTDIR echo "Mounting the image ($MOUNTDIR) ..." sudo mount -o loop $IMAGE $MOUNTDIR # --- echo "Copying the filesystem content into the image..." sudo_fcall copy_content_into_directory $DEBIANROOT/ $MOUNTDIR/ || RETURN_CODE=$? # --- echo "Unmounting the image ($MOUNTDIR) ..." sudo umount $MOUNTDIR rmdir $MOUNTDIR # --- if [[ $RETURN_CODE = 0 ]]; then echo "Image built into: $IMAGE" echo "Success." else return $RETURN_CODE fi } # This function is not called directly here but is called by the generic function # `rename_with_sum_and_make_image_dot_conf' defined in ../pupisto.common/toolkit_image. function set_X11_SUPPORT_and_related_variables_according_to_choosed_packages { # global (input) DEBIANROOT FSTYPE # global (output) X11_SUPPORT MEMORY_MIN_SIZE MEMORY_SUGGESTED_SIZE # --- # The file compression used with btrfs (lzo) requires more memory: if [[ $FSTYPE = btrfs ]]; then if sudo chroot $DEBIANROOT dpkg -l | \grep -q "ii[ ][ ]*libx11-"; then if sudo chroot $DEBIANROOT dpkg -l | \grep -q "ii[ ][ ]*xserver-"; then X11_SUPPORT="xnested" MEMORY_MIN_SIZE=128 MEMORY_SUGGESTED_SIZE=192 else X11_SUPPORT="xhosted" MEMORY_MIN_SIZE=96 # tested MEMORY_SUGGESTED_SIZE=128 fi else X11_SUPPORT="none" MEMORY_MIN_SIZE=32 # tested MEMORY_SUGGESTED_SIZE=40 fi else # Normal case (no btrfs): if sudo chroot $DEBIANROOT dpkg -l | \grep -q "ii[ ][ ]*libx11-"; then if sudo chroot $DEBIANROOT dpkg -l | \grep -q "ii[ ][ ]*xserver-"; then X11_SUPPORT="xnested" MEMORY_MIN_SIZE=64 MEMORY_SUGGESTED_SIZE=128 else X11_SUPPORT="xhosted" MEMORY_MIN_SIZE=64 # tested MEMORY_SUGGESTED_SIZE=80 # tested fi else X11_SUPPORT="none" MEMORY_MIN_SIZE=24 # tested MEMORY_SUGGESTED_SIZE=32 fi fi # btrfs or not } function mknod_for_virtual_disks_in_chroot { local i j p rm -f /dev/ubd* # --- for i in {0..7}; do mknod /dev/ubd$i b 98 $((i*16)); done # Generated: # mknod /dev/ubd0 b 98 0 # mknod /dev/ubd1 b 98 16 # ... # mknod /dev/ubd7 b 98 112 let j=0; for i in {a..h}; do mknod /dev/ubd$i b 98 $((j*16)); let j=j+1; done # Generated: # mknod /dev/ubda b 98 0 # mknod /dev/ubdb b 98 16 # ... # mknod /dev/ubdh b 98 112 let j=0; for i in {a..h}; do for p in {1..4}; do mknod /dev/ubd$i$p b 98 $((j*16+p)); done; let j=j+1; done # Generated: # --- # mknod /dev/ubda1 b 98 1 # mknod /dev/ubda2 b 98 2 # mknod /dev/ubda3 b 98 3 # mknod /dev/ubda4 b 98 4 # # mknod /dev/ubdb1 b 98 17 # mknod /dev/ubdb2 b 98 18 # mknod /dev/ubdb3 b 98 19 # mknod /dev/ubdb4 b 98 20 # ... # mknod /dev/ubdh1 b 98 113 # mknod /dev/ubdh2 b 98 114 # mknod /dev/ubdh3 b 98 115 # mknod /dev/ubdh4 b 98 116 } function mknod_for_virtual_disks { # global DEBIANROOT PUPISTO_FILES local ROOT=${1:-$DEBIANROOT} export -f mknod_for_virtual_disks_in_chroot sudo_chroot_fcall $ROOT mknod_for_virtual_disks_in_chroot sudo tar -C $ROOT -xz --keep-old-files -f $PUPISTO_FILES/dev.tar.gz } # ============================================================= # KERNEL # ============================================================= function make_or_link_the_kernel { # global option_K TWDIR KERNEL_VERSION local EXISTING_KERNEL_DIR BUILT_DIR local DOWNLOADS_DIRECTORY=../pupisto.kernel/_build.downloads # --- # Option -K/--no-kernel if [[ -z ${option_K} ]]; then EXISTING_KERNEL_DIR=$(find ../pupisto.kernel/ -maxdepth 1 -type d -name "_build.linux-$KERNEL_VERSION*" | sort | tail -n 1) if [[ -d $EXISTING_KERNEL_DIR ]]; then echo 1>&2 "A directory \`$EXISTING_KERNEL_DIR' already exists: making a symlink to!" ln -s ../"$EXISTING_KERNEL_DIR" "$TWDIR/linux-$KERNEL_VERSION" else # In order to have a unique log, we will use the script as # a library of functions instead of as a standalone program: source ../pupisto.kernel/pupisto.kernel.sh --source # Now call the function: download_patch_and_compile_kernel ${KERNEL_VERSION} ${TWDIR} ${DOWNLOADS_DIRECTORY} # Move the whole directory to the good place (../pupisto.kernel/) # in order to potentially share it among other filesystem building: BUILT_DIR=_build.linux-${KERNEL_VERSION}.$(date +%Y-%m-%d.%H\h%M).$RANDOM echo "Moving \`$TWDIR/linux-$KERNEL_VERSION' -> \`../pupisto.kernel/$BUILT_DIR'" mv $TWDIR/linux-$KERNEL_VERSION ../pupisto.kernel/$BUILT_DIR ln -s ../../pupisto.kernel/$BUILT_DIR $TWDIR/linux-$KERNEL_VERSION fi fi } # make_or_link_the_kernel # ============================================================= # ACTIONS # ============================================================= # The first step is to create the Debian directory with debootstrap: once launch_debootstrap_and_fix_problems_with_apt # Fix apt sources, update and upgrade: once fix_apt_sources_update_and_upgrade # Fix locales (if installed) to "en_US.UTF-8": once fix_locales # Remove package `udev' (and packages depending to) once remove_package udev || true # Fix /etc/inittab: once fix_etc_inittab # Fix /etc/securetty: once fix_etc_securetty # Fix /etc/fstab: once fix_etc_fstab # Fix the problem of /sbin/reboot and /sbin/shutdown that may # provoke a Marionnet crash: once fix_reboot # Set the `root' passwd to "root": once fix_root_password # Compile ethghost into the 32-bits filesystem: once compile_and_install_ethghost # <= # Make a symlink: /etc/init.d/dhcpd -> isc-dhcp-server once make_symlink_etc_init_dhcpd # Install our marionnet-startup script: once install_marionnet_relay # <= # Install our bashrc into $DEBIANROOT/etc/skel/ once install_bashrc_in_the_skeleton # Copy our bashrc in the root's home directory: once copy_bashrc_in_the_root_home # Create user "student" (with the modified skeleton): once create_user_student # Configure the ssh daemon and root/student accounts to accept Marionnet connections: once configure_daemon_and_accounts_to_accept_ssh_connection # Login message. once fix_etc_issue # Do not start services at boot (except the vital ones): once prevent_non_vital_services_from_starting # Create devices /dev/ubd? for virtual disks: once mknod_for_virtual_disks # Prevent a noising warning window to appear when # wireshark is called as root (that is usual with # Marionnet: once fix_wireshark_init_lua # Install this nice program, useful for labs about IPv6 compliance: once install_ipv6_care # Final cleaning: once clean_debian_filesystem # Get the binary list: BINARY_LIST=$(sudo_chroot_binary_list $DEBIANROOT) # Go: FS_LOC=$TWDIR/machine-debian-${RELEASE} once make_the_image "$FS_LOC" # Build image's meta-data. # This call defines FS_NAME once rename_with_sum_and_make_image_dot_conf "$FS_LOC" # Make now the kernel or just link it: once make_or_link_the_kernel $KERNEL_VERSION # ============================================================= # GREETINGS # ============================================================= # Store the log file into the output directory: # make_a_human_readable_log_into_working_directory # [[ -f $CUSTOM_PACKAGES_NO ]] && mv $CUSTOM_PACKAGES_NO $TWDIR/ # [[ -f $CUSTOM_PACKAGES_YES ]] && mv $CUSTOM_PACKAGES_YES $TWDIR/ echo "---" ls -l $TWDIR echo "---" echo "Pay attention to move (or copy with option \`-a') the filesystem in order to preserve the MTIME." echo "If something goes wrong installing your filesystem, you can restore the correct" echo "MTIME with the following command:" echo "sudo touch -d \$(date -d '@$MTIME') $FS_NAME" echo echo "Success." # Copy log and exit: cat $LOGFILE > $TWDIR/$(basename $LOGFILE) exit 0 marionnet-0.90.6+bzr434.orig/uml/startup.old/0000700000175000017500000000000012167200764017634 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/uml/startup.old/Makefile0000600000175000017500000000011012167200764021266 0ustar lucaslucasdot: DEPENDENCIES.dot dot -Tpng -o DEPENDENCIES.png DEPENDENCIES.dot marionnet-0.90.6+bzr434.orig/uml/startup.old/cfg2html-linux0000700000175000017500000022363712167200764022442 0ustar lucaslucas####### !/bin/bash # #set -vx # #PATH=$PATH:/usr/sbin:/sbin:/etc:/bin:/opt/omni/bin:/opt/omni/sbin #VER=`awk '/Id:/ {print $3;exit;}' $0` ## also works :) VER=$(echo "$Id: cfg2html-linux,v 1.39 2007/03/01 19:38:16 ralproth Exp $"|awk '{print $3"-"$4;}') if [ -z "$VER" ] # no awk, e.g. my Linux router // OpenWRT then VER="$Revision: 1.39 $"; fi; VERSION="cfg2html-linux version $VER " # this a common stream so we dont need the "Proliant stuff" # If you change this script, please mark your changes with for example # ## and send your diffs from the actual version to my e-mail # address: cfg2html*hotmail.com or dk3hg*users.sourceforge.net # # use "no" to disable a collection # CFG_NETWORK="yes" # <-- Network security, collecting tcpd and ip filter settings CFG_SYSTEM="yes" CFG_CRON="yes" CFG_HARDWARE="yes" CFG_SOFTWARE="yes" CFG_FILESYS="yes" CFG_LVM="yes" CFG_KERNEL="yes" CFG_ENHANCEMENTS="yes" CFG_APPLICATIONS="yes" GIF="yes" CFG_HPPROLIANTSERVER="no" # Added by jeroen kleen HP ISS CC Engineer CFG_ALTIRISAGENTFILES="yes" # Added by jeroen kleen HP ISS CC Engineer if [ "$OUTDIR" = "" ] ; then OUTDIR="." fi # # usage() { echo "WARNING, use this script AT YOUR OWN RISK" echo echo " Usage: `basename $0` [OPTIONS]" echo " creates HTML and plain ASCII host documentation" echo echo " -o set directory to write or use the environment" echo " variable OUTDIR=\"/path/to/dir\" (directory must exist)" echo " -v output version information and exit" echo " -h display this help and exit" echo echo " use the following options to disable / enable collections:" echo echo " -s disable: System" echo " -c disable: Cron" echo " -S disable: Software" echo " -f disable: Filesystem" echo " -l disable: LVM" echo " -k disable: Kernel/Libaries" echo " -e disable: Enhancements" echo " -n disable: Network" echo " -a disable: Applications" echo " -H disable: Hardware" echo " -x don't create background images" echo " -p enable: HP Proliant Server log and settingsfiles" # Added by jeroen kleen HP ISS CC Engineer echo " -A disable: Altiris ADL agent logfiles and settings" # Added by jeroen kleen HP ISS CC Engineer echo } # # getopt # # #NO_ARGS=0 #if [ $# -eq "$NO_ARGS" ] # Script invoked with no command-line args? #then # usage # exit 1 # Exit and explain usage, if no argument(s) given. #fi while getopts ":o:xshcSflkenaHvhpPA" Option do case $Option in o ) OUTDIR=$OPTARG;; v ) echo $VERSION;exit;; h ) usage;exit;; x ) GIF="no";; s ) CFG_SYSTEM="no";; c ) CFG_CRON="no";; S ) CFG_SOFTWARE="no";; f ) CFG_FILESYS="no";; l ) CFG_LVM="no";; k ) CFG_KERNEL="no";; e ) CFG_ENHANCEMENTS="no";; n ) CFG_NETWORK="no";; a ) CFG_APPLICATIONS="no";; H ) CFG_HARDWARE="no";; p ) CFG_HPPROLIANTSERVER="yes";; P ) CFG_HPPROLIANTSERVER="yes";; A ) CFG_ALTIRISAGENTFILES="no";; * ) echo "Unimplemented option chosen. Try -h for help!";exit 1;; # DEFAULT esac done shift $(($OPTIND - 1)) # Decrements the argument pointer so it points to next argument. # # linux port MAILTO="jeroen.kleen@hp.com" MAILTORALPH="cfg2html@hotmail.com" # changed/added 08.07.2003 (13:04) by Ralph Roth, HP, ASO SW ##################################################################### # @(#)Cfg2Html (c) by ROSE SWE, Dipl.-Ing. Ralph Roth, cfg2html@hotmail.com # HP Proliant Server Module Integrated by Jeroen.Kleen@hp.com ##################################################################### # cfg2html-linux ported (c) by Michael Meifert, SysAdm from HP-UX version # using debian potato, woody # This is the "swiss army knife" for the ASE, CE, sysadmin etc. # I wrote it to get the nessary informations to plan an update, # to performe basic trouble shooting or performance analysis. # As a bonus cfg2html creates a nice HTML and plain ASCII # documentation. If you are missing something, let me know it! # History ##################################################################### # 28-jan-1999 initial creation, based on get_config, check_config # nickel, snapshoot, vi, winword and a idea from a similar # script i have seen onsite. # Maybe a little bit ASE knowledge is also included :))) ##################################################################### # 11-Mar-2001 initial creation for debian GNU Linux i386 # based on Cfg2Html Version 1.15.06/HP-UX by # by ROSE SWE, Dipl.-Ing. Ralph Roth # ported to Linux by Michael Meifert ##################################################################### # 15-May-2006 Common stream for cfg2html-linux and the Proliant version line ( ) { echo --=[ http://come.to/cfg2html ]=----------------------------------------------- } echo -e "\n" ## test if user = root # #if [ `id|cut -c5-11` != "0(root)" ] ; then if [ `id|cut -c0-6` != "uid=0(" ] ; then # 140906, rar if [ -x /usr/bin/banner ] ; then banner "Sorry" else echo;echo " S o r r y ";echo fi line echo $0:$VERSION echo -e "You must run this script as Root\n" exit 1 fi # BASEFILE=`hostname||uname -n` # 26.01.2001 uname -n, fixed 0205-2006rr for OpenWRT HTML_OUTFILE=$OUTDIR/$BASEFILE.html HTML_OUTFILE_TEMP=/tmp/$BASEFILE.html.$$ TEXT_OUTFILE=$OUTDIR/$BASEFILE.txt TEXT_OUTFILE_TEMP=/tmp/$BASEFILE.txt.$$ ERROR_LOG=$OUTDIR/$BASEFILE.err if [ ! -d $OUTDIR ] ; then echo "can't create $HTML_OUTFILE, $OUTDIR does not exist - stop" exit 1 fi touch $HTML_OUTFILE #echo "Starting up $VERSION\r" [ -s "$ERROR_LOG" ] && rm -f $ERROR_LOG 2> /dev/null DATE=`date "+%Y-%m-%d"` # ISO8601 compliant date string DATEFULL=`date "+%Y-%m-%d %H:%M:%S"` # ISO8601 compliant date and time string exec 2> $ERROR_LOG if [ ! -f $HTML_OUTFILE ] ; then if [ -x /usr/bin/banner ] ; then banner "Error" else echo "E R R O R" fi line echo -e "You have not the rights to create $HTML_OUTFILE! (NFS?)\n" exit 1 fi logger "Start of $VERSION" RECHNER=`hostname -f` VERSION_=`echo $VERSION/$RECHNER|tr " " "_"` typeset -i HEADL=0 #Headinglevel # # check Linux distribution # distrib="unknown" ## rr, 15.12.2004 - "robertfantini" if [ -f /etc/gentoo-release ] ; then distrib="`head -1 /etc/gentoo-release`" GENTOO="yes" else GENTOO="no" fi if [ -f /etc/slackware-version ] ; then distrib="`cat /etc/slackware-version`" SLACKWARE="yes" else SLACKWARE="no" fi if [ -f /etc/debian_version ] ; then distrib="Debian GNU/Linux Version `cat /etc/debian_version`" DEBIAN="yes" else DEBIAN="no" fi if [ -f /etc/SuSE-release ] ; then distrib="`head -1 /etc/SuSE-release`" SUSE="yes" else SUSE="no" fi if [ -f /etc/mandrake-release ] ; then distrib="`head -1 /etc/mandrake-release`" MANDRAKE="yes" else MANDRAKE="no" fi if [ -f /etc/redhat-release ] ; then distrib="`head -1 /etc/redhat-release`" REDHAT="yes" else REDHAT="no" fi # MiMe: for UnitedLinux if [ -f /etc/UnitedLinux-release ] ; then distrib="`head -1 /etc/UnitedLinux-release`" UNITEDLINUX="yes" else UNITEDLINUX="no" fi # i am looking for other distribution tests #################################################################### # needs improvement! # trap "echo Signal: Aborting!; rm $HTML_OUTFILE_TEMP" 2 13 15 #################################################################### # Beginn des HTML Dokumentes mit Ueberschrift und Titel #################################################################### # Header of HTML file #################################################################### open_html() { echo -e " \ ${RECHNER} - Documentation - $VERSION


$RECHNER - System Documentation


Created "$DATEFULL" with " $VERSION "

Contents\n

\n\ " >$HTML_OUTFILE (line if [ -x /usr/bin/banner ] ; then banner $RECHNER else echo echo " "$RECHNER echo fi;line) > $TEXT_OUTFILE echo -e "\n" >> $TEXT_OUTFILE echo -e "\n" > $TEXT_OUTFILE_TEMP } ###################################################################### # Erhoehe Headinglevel ###################################################################### # Increases the headling level ###################################################################### inc_heading_level() { HEADL=HEADL+1 echo -e "
    \n" >> $HTML_OUTFILE } ###################################################################### # Erniedrige Headinglevel ###################################################################### # Decreases the heading level ###################################################################### dec_heading_level() { HEADL=HEADL-1 echo -e "
\n" >> $HTML_OUTFILE } ###################################################################### # Einzelne Items in der Dokumentation # $1 = Ueberschrift ###################################################################### # Creates an own paragraph, $1 = heading ###################################################################### paragraph() { if [ "$HEADL" -eq 1 ] ; then echo -e "\n
\n" >> $HTML_OUTFILE_TEMP fi #echo -e "\n
\n">>$HTML_OUTFILE_TEMP echo "" >> $HTML_OUTFILE_TEMP echo " $1

" >> $HTML_OUTFILE_TEMP #echo " $1

" >> $HTML_OUTFILE_TEMP echo "" >> $HTML_OUTFILE echo "$1" >> $HTML_OUTFILE echo -e "\nCollecting: " $1 " .\c" echo " $1" >> $TEXT_OUTFILE } ###################################################################### # Einzelne Kommandos und deren Ergebnisse # $1 = Kommando, $2 = Erklaerender Text ###################################################################### # Documents the single commands and their output # $1 = unix command, $2 = text for the heading ###################################################################### exec_command() { echo -e ".\c" echo -e "\n---=[ $2 ]=----------------------------------------------------------------" | cut -c1-74 >> $TEXT_OUTFILE_TEMP echo " - $2" >> $TEXT_OUTFILE ######the working horse########## TMP_EXEC_COMMAND_ERR=/tmp/exec_cmd.tmp.$$ ## Modified 1/13/05 by marc.korte@oracle.com, Marc Korte, TEKsystems (150 -> 250) EXECRES=`eval $1 2> $TMP_EXEC_COMMAND_ERR | expand | cut -c 1-250` ########### test it ############ # Gert.Leerdam@getronics.com # Convert illegal characters for HTML into escaped ones. #CONVSTR=' #s//\>/g #s/\\/\\/g #' #EXECRES=$(eval $1 2> $TMP_EXEC_COMMAND_ERR | expand | cut -c 1-150 | sed +"$CONVSTR") if [ -z "$EXECRES" ] then EXECRES="n/a" fi if [ -s $TMP_EXEC_COMMAND_ERR ] then echo "stderr output from \"$1\":" >> $ERROR_LOG cat $TMP_EXEC_COMMAND_ERR | sed 's/^/ /' >> $ERROR_LOG fi rm -f $TMP_EXEC_COMMAND_ERR echo -e "\n" >> $HTML_OUTFILE_TEMP echo -e " $2 \n" >>$HTML_OUTFILE_TEMP echo -e "

$EXECRES
\n" >>$HTML_OUTFILE_TEMP #echo "
$EXECRES
\n" >>$HTML_OUTFILE_TEMP echo -e "
  • $2\n" >> $HTML_OUTFILE echo -e "\n$EXECRES\n" >> $TEXT_OUTFILE_TEMP } ################# Schedule a job for killing commands which ############### ################# may hang under special conditions. ##### # Argument 1: regular expression to search processlist for. Be careful # when specifiying this so you don't kill any more processes than # those you are looking for! # Argument 2: number of minutes to wait for process to complete. KillOnHang() { TMP_KILL_OUTPUT=/tmp/kill_hang.tmp.$$ at now + $2 minutes 1>$TMP_KILL_OUTPUT 2>&1 <$*

    " >> $HTML_OUTFILE_TEMP echo -e "$*\n" >> $TEXT_OUTFILE_TEMP } ###################################################################### # Ende des Dokumentes ###################################################################### # end of the html document ###################################################################### close_html() { echo "
    " >> $HTML_OUTFILE echo -e "

    \n


    Created "$DATEFULL" with " $VERSION "" >> $HTML_OUTFILE_TEMP echo -e "

    \nCopyright and maintained by Ralph Roth, ROSE SWE,

    " >> $HTML_OUTFILE_TEMP echo -e " Maintained by Jeroen Kleen, EMEA ISS CC Engineer

    " >> $HTML_OUTFILE_TEMP echo -e "
    [ Download cfg2html from external home page ]


    \n" >> $HTML_OUTFILE_TEMP cat $HTML_OUTFILE_TEMP >>$HTML_OUTFILE cat $TEXT_OUTFILE_TEMP >> $TEXT_OUTFILE rm $HTML_OUTFILE_TEMP $TEXT_OUTFILE_TEMP echo -e "\n\nCreated "$DATEFULL" with " $VERSION " \n" >> $TEXT_OUTFILE echo -e "Based on the origional script (c) 1998-2007 by ROSE SWE, Ralph Roth" >> $TEXT_OUTFILE } my_bdf() { # bdf summary for HPUX, Ralph_Roth@hp.com, 5-feb-2001 # Linux, dk3hg df -k | awk '/\// \ { alloc += $2; used += $3; avail += $4; } END { print "Allocated\tUsed \t \tAvailable\tUsed (%)"; printf "%ld \t%ld \t%ld\t \t%3.1f\n", alloc, used, avail, (used*100.0/alloc); }' } PVDisplay ( ) { #function used in LVM-section # for disk in $(strings /etc/lvmtab.d/* |grep -e hd -e sc) ; for disk in $(vgdisplay -v | awk -F\ + '/PV Name/ {print $4}'); do /usr/sbin/pvdisplay -v $disk; # due to PATH problems; A. Kumpf, 21.07.06 done } # ###################################################################### # Hauptprogramm mit Aufruf der obigen Funktionen und deren Parametern ############################# M A I N ############################## # line echo "Starting "$VERSION" " echo "Path to Cfg2Html "$0 echo "HTML Output File "$HTML_OUTFILE echo "Text Output File "$TEXT_OUTFILE echo "Partitions "$OUTDIR/$BASEFILE.partitions.save echo "Errors logged to "$ERROR_LOG echo "Started at "$DATEFULL echo "WARNING USE AT YOUR OWN RISK!!! :-))" echo line logger "Start of $VERSION" open_html inc_heading_level # # CFG_SYSTEM # if [ "$CFG_SYSTEM" != "no" ] then # else skip to next paragraph paragraph "Linux System $distrib" inc_heading_level if [ -f /etc/cfg2html/systeminfo ] ; then exec_command "cat /etc/cfg2html/systeminfo" "System description" fi exec_command "cat /proc/cpuinfo; echo" "CPU and Model info" HostNames() { uname -a echo "DNS Domainname = "`dnsdomainname ` echo "NIS Domainname = "`domainname 2>/dev/null ` echo "Hostname (short)= "`hostname` echo "Hostname (FQDN) = "`hostname -f` } exec_command HostNames "uname & hostname" exec_command "uname -n" "Host alias" exec_command "uname -sr" "OS, Kernel version" [ -x /usr/bin/lsb_release ] && exec_command "/usr/bin/lsb_release -a" "Linux Standard Base Version" for i in /etc/*-release do [ -r $i ] && exec_command "cat $i" "OS Specific Release Information ($i)" done exec_command "uptime" "Uptime" posixversion() { # wie findet man das bei Linux raus? #echo "POSIX Version: \c"; getconf POSIX_VERSION #echo "POSIX Version: \c"; getconf POSIX2_VERSION #echo "X/OPEN Version: \c"; getconf XOPEN_VERSION echo "LANG setting: "$LANG } if [ -x /usr/bin/locale ] ; then exec_command posixversion "POSIX Standards/Settings" exec_command "locale" "locale-specific information" export LANG="C" export LANG_ALL="C" fi ##### 19-Sept-2006, Ralph ##### if [ -x /usr/bin/vmstat ] ; then exec_command "vmstat 1 10" "VM-Statistics" fi if [ -x /usr/bin/mpstat ] ; then exec_command "mpstat 1 5" "MP-Statistics" fi if [ -x /usr/bin/iostat ] ; then exec_command "iostat" "IO-Statistics" fi # sysutils [ -x /usr/bin/procinfo ] && exec_command "procinfo -a" "System status from /proc" # 15.11.2004, 14:09 modified by Ralph.Roth at hp.com (HPS-TSG-MCPS) if [ "$REDHAT" = "yes" ] || [ "$SUSE" = "yes" ] ; then ## 20070228 Oliver Schwabedissen, RH4/SLES9 don't support -A exec_command "pstree -p -a " "Active Process Overview" # 090102006 else exec_command "pstree -p -a -A" "Active Process Overview" # 15.11.2004, 14:09 modified by Ralph.Roth at hp.com (HPS-TSG-MCPS) fi exec_command "last| grep boot" "reboots" exec_command "alias" "Alias" [ -r /etc/inittab ] && exec_command "grep -vE '#|^ *$' /etc/inittab" "inittab" ## This may report NOTHING on RHEL 3+4 ## [ -x /sbin/chkconfig ] && exec_command "/sbin/chkconfig" "Services Startup" [ -x /sbin/chkconfig ] && exec_command "/sbin/chkconfig --list" "Services Runlevel" # rar, fixed 2805-2005 for FC4 if [ "$GENTOO" = "yes" ] ; then ## 2007-02-27 Oliver Schwabedissen [ -x /bin/rc-status ] && exec_command "/bin/rc-status --list" "Defined runlevels" [ -x /sbin/rc-update ] && exec_command "/sbin/rc-update show --verbose" "Init scripts and their runlevels" fi if [ -d /etc/rc.config.d ] ; then exec_command " grep -v ^# /etc/rc.config.d/* | grep '=[0-9]'" "Runlevel Settings" fi [ -r /etc/inittab ] && exec_command "awk '!/#|^ *$/ && /initdefault/' /etc/inittab" "default runlevel" exec_command "/sbin/runlevel" "current runlevel" ## ## we want to display the Boot Messages too ## 30Jan2003 it233 FRU if [ -e /var/log/boot.msg ] ; then exec_command "grep 'Boot logging' /var/log/boot.msg" "Last Boot Date" exec_command "grep -v '|====' /var/log/boot.msg " "Boot Messages, last Boot" fi # MiMe: SUSE && UNITEDLINUX # MiMe: until SuSE 7.3: params in /etc/rc.config and below /etc/rc.config.d/ # MiMe; since SuSE 8.0 including UL: params below /etc/sysconfig if [ "$SUSE" = "yes" ] || [ "$UNITEDLINUX" = "yes" ] ; then if [ -d /etc/sysconfig ] ; then # MiMe: exec_command "find /etc/sysconfig -type f -not -path '*/scripts/*' -exec grep -vE '^#|^ *$' {} /dev/null \; | sort" "Parameter /etc/sysconfig" fi if [ -e /etc/rc.config ] ; then # PJC: added filters for SuSE rc_ variables # PJC: which were in rc.config in SuSE 6 # PJC: and moved to /etc/rc.status in 7+ exec_command "grep -vE -e '(^#|^ *$)' -e '^ *rc_' -e 'rc.status' /etc/rc.config | sort" "Parameter /etc/rc.config" fi if [ -d /etc/rc.config.d ] ; then # PJC: added filters for SuSEFirewall and indented comments exec_command "find /etc/rc.config.d -name '*.config' -exec grep -vE -e '(^#|^ *$)' -e '^ *true$' -e '^[[:space:] ]*#' -e '[{]|[}]' {} \; | sort" "Parameter /etc/rc.config.d" fi fi if [ "$GENTOO" = "yes" ] ; then ## 2007-02-28 Oliver Schwabedissen exec_command "grep -vE '^#|^ *$' /etc/rc.conf | sort" "Parameter /etc/rc.conf" exec_command "find /etc/conf.d -type f -exec grep -vE '^#|^ *$' {} /dev/null \;" "Parameter /etc/conf.d" fi if [ -e /proc/sysvipc ] ; then exec_command "ipcs" "IPC Status" exec_command "ipcs -u" "IPC Summary" exec_command "ipcs -l" "IPC Limits" fi if [ -x /usr/sbin/pwck ] ; then exec_command "/usr/sbin/pwck -r && echo Okay" "integrity of password files" fi if [ -x /usr/sbin/grpck ] ; then exec_command "/usr/sbin/grpck -r && echo Okay" "integrity of group files" fi dec_heading_level fi # terminates CFG_SYSTEM wrapper # # CFG_CRON # if [ "$CFG_CRON" != "no" ] then # else skip to next paragraph paragraph "Cron and At" inc_heading_level for FILE in cron.allow cron.deny do if [ -r /etc/$FILE ] then exec_command "cat /etc/$FILE" "$FILE" else exec_command "echo /etc/$FILE" "$FILE not found!" fi done ## Linux SuSE user /var/spool/cron/tabs and NOT crontabs ## 30jan2003 it233 FRU ## SuSE has the user crontabs under /var/spool/cron/tabs ## RedHat has the user crontabs under /var/spool/cron ## UnitedLinux uses /var/spool/cron/tabs (MiMe) if [ "$SUSE" == "yes" ] ; then usercron="/var/spool/cron/tabs" fi if [ "$REDHAT" == "yes" ] ; then usercron="/var/spool/cron" fi if [ "$SLACKWARE" == "yes" ] ; then usercron="/var/spool/cron/crontabs" fi if [ "$DEBIAN" == "yes" ] ; then usercron="/var/spool/cron/crontabs" fi if [ "$GENTOO" == "yes" ] ; then ## 2007-02-27 Oliver Schwabedissen usercron="/var/spool/cron/crontabs" fi if [ "$UNITEDLINUX" == "yes" ] ; then usercron="/var/spool/cron/tabs" fi ## ls $usercron/* > /dev/null 2>&1 if [ $? -eq 0 ] then echo -e "\n\nCrontab files:" >> $HTML_OUTFILE_TEMP for FILE in $usercron/* do exec_command "cat $FILE | grep -v ^#" "For user `basename $FILE`" done else echo "No crontab files for user.
    " >> $HTML_OUTFILE_TEMP fi ## ## we do also a listing of utility cron files ## under /etc/cron.d 30Jan2003 it233 FRU ls /etc/cron.d/* > /dev/null 2>&1 if [ $? -eq 0 ] then echo -e "\n\n
    /etc/cron.d files:" >> $HTML_OUTFILE_TEMP for FILE in /etc/cron.d/* do exec_command "cat $FILE | grep -v ^#" "For utility `basename $FILE`" done else echo "No /etc/cron.d files for utlities." >> $HTML_OUTFILE_TEMP fi if [ -f /etc/crontab ] ; then exec_command "echo -e 'Crontab:\n';cat /etc/crontab | grep -vE '#|^ *$'" "/etc/crontab" fi atconfigpath="/etc" if [ "$GENTOO" == "yes" ] ; then ## 2007-02-27 Oliver Schwabedissen atconfigpath="/etc/at" fi for FILE in at.allow at.deny do if [ -r $atconfigpath/$FILE ] then exec_command "cat $atconfigpath/$FILE " "$atconfigpath/$FILE" else exec_command "echo $atconfigpath/$FILE" "No $atconfigpath/$FILE" fi done ## workaround by Ralph for missing at #(whereis at > /dev/null) || exec_command "at -l" "AT Scheduler" # sorry - don't work here (Michael) # now we try this if [ -x /usr/bin/at ] ; then exec_command "at -l" "AT Scheduler" fi #exec_command "echo -e 'Crontab:\n';cat /etc/crontab | grep -vE '#|^ *$';echo -e '\nAT Scheduler:\n';at -l" "/etc/crontab and AT Scheduler" dec_heading_level fi #terminate CFG_CRON wrapper # # CFG_HARDWARE # if [ "$CFG_HARDWARE" != "no" ] then # else skip to next paragraph paragraph "Hardware" inc_heading_level RAM=`awk -F': *' '/MemTotal/ {print $2}' /proc/meminfo` # RAM=`cat /proc/meminfo | grep MemTotal | awk -F\: '{print $2}' | awk -F\ '{print $1 " " $2}'` exec_command "echo $RAM" "Physical Memory" HWINFO=`which hwinfo`; if [ -n "$HWINFO" ] && [ -x $HWINFO ] ; then exec_command "$HWINFO 2> /dev/null" "Hardware List (hwinfo)"; fi LSHW=`which lshw`; if [ -n "$LSHW" ] && [ -x $LSHW ] ; then exec_command "$LSHW" "Hardware List (lshw)"; fi ## 13.12.2004, 15:53 modified by Ralph.Roth LSDEV=`which lsdev`; if [ -n "$LSDEV" ] && [ -x $LSDEV ] ; then exec_command "$LSDEV" "Hardware List (lsdev)"; fi LSHAL=`which lshal`; if [ -n "$LSHAL" ] && [ -x $LSHAL ] ; then exec_command "$LSHAL" "List of Devices (lshal)"; fi LSUSB=`which lsusb`; if [ -n "$LSUSB" ] && [ -x $LSUSB ] ; then exec_command "$LSUSB" "USB devices"; fi ## SuSE? # 12.11.2004, 15:04 modified by Ralph.Roth at hp.com (HPS-TSG-MCPS) LSPCI=`which lspci` if [ -n "$LSPCI" ] && [ -x $LSPCI ] ; then exec_command "$LSPCI -v" "PCI devices" else if [ -f /proc/pci ] ; then exec_command "cat /proc/pci" "PCI devices" fi fi PCMCIA=`grep pcmcia /proc/devices | cut -d" " -f2` if [ "$PCMCIA" = "pcmcia" ] ; then if [ -x /sbin/cardctl ] ; then exec_command "/sbin/cardctl status;/sbin/cardctl config;/sbin/cardctl ident" "PCMCIA" fi fi [ -r /proc/acpi/info ] && exec_command "cat /proc/acpi/info" "ACPI" # 06.04.2006, 17:44 modified by Ralph Roth if [ -f /etc/kbd/default.kmap.gz ] ; then exec_command "zcat /etc/kbd/default.kmap.gz | head -1 | sed s/#//" "Keymap" fi exec_command "cat /proc/ioports" "IoPorts" exec_command "cat /proc/interrupts" "Interrupts" if [ -f /proc/scsi/scsi ] ;then exec_command "find /proc/scsi" "SCSI Componments" # 22.11.2004, 16:08 modified by Ralph.Roth at hp.com (HPS-TSG-MCPS) exec_command "cat /proc/scsi/scsi" "SCSI Devices" fi ## rar, 13.02.2004 ## Changed 15.05.2006 (09:30) by Peter Lindblom, HP, STCC EMEA, changed title from SCSI Devices SCSI Disk Devices [ -x /usr/sbin/lssd ] && exec_command "/usr/sbin/lssd" "SCSI Disk Devices" ## Added 15.05.2006 (09:30) by Peter Lindblom, HP, STCC EMEA [ -x /usr/sbin/lssg ] && exec_command "/usr/sbin/lssg" "Generic SCSI Devices" ## rar, 13.02.2004 ## Added 15.05.2006 (09:30) by Peter Lindblom, HP, STCC EMEA, Added the echo between the command to get a new line and move it down below lssg and lssd. [ -x /usr/sbin/adapter_info ] && exec_command "/usr/sbin/adapter_info;echo;/usr/sbin/adapter_info -v" "Adapterinfo/WWN" ### ------------------------------------------------------------------------------ #### Start of Fibre HBA info. added 12.05.2006 (15:13) by Peter Lindblom, HP, STCC EMEA mcat() { echo "--- $1" cat $1 # done } if [ -f /tmp/fibrehba.txt ] then rm /tmp/fibrehba.txt fi # capture /proc/scsi/qla2200 if [ -d /proc/scsi/qla2200 ] then for file in /proc/scsi/qla2200/* do mcat $file >>/tmp/fibrehba.txt done fi # capture /proc/scsi/qla2300 if [ -d /proc/scsi/qla2300 ] then for file in /proc/scsi/qla300/* do mcat $file >>/tmp/fibrehba.txt done fi # capture /proc/scsi/qla2xxx if [ -d /proc/scsi/qla2xxx ] then for file in /proc/scsi/qla2xxx/* do mcat $file >>/tmp/fibrehba.txt done fi # capture /proc/scsi/lpfc if [ -d /proc/scsi/lpfc ] then for file in /proc/scsi/lpfc/* do mcat $file >>/tmp/fibrehba.txt done fi if [ -f /tmp/fibrehba.txt ] then exec_command "cat /tmp/fibrehba.txt" "Fibre Channel Host Bus Adapters" rm /tmp/fibrehba.txt fi #### End of Fibre HBA info. ## rar, 13.02.2004 [ -x /usr/sbin/spmgr ] && exec_command "/usr/sbin/spmgr display" "SecurePath - Manager" [ -r /etc/CPQswsp/sppf ] && exec_command "cat /etc/CPQswsp/sppf" "SecurePath - Bindings" [ -r /etc/CPQswsp/hsx.conf ] && exec_command "cat /etc/CPQswsp/hsx.conf" "SecurePath - Preferred Path Settings" [ -r /etc/CPQswsp/swsp.conf ] && exec_command "cat /etc/CPQswsp/swsp.conf" "SecurePath - Path, Load Balance & Auto restore settings" [ -r /etc/CPQswsp/notify.ini ] && exec_command "cat /etc/CPQswsp/notify.ini" "SecurePath - e-mail adress notification settings" [ -r /etc/CPQswsp/spmgr_alias ] && exec_command "cat /etc/CPQswsp/spmgr_alias" "SecurePath - Alias Name file" [ -r /etc/CPQswsp/spmgr_stop_list ] && exec_command "cat /etc/CPQswsp/spmgr_stop_list" "SecurePath - reserved key word settings file" [ -r /etc/CPQswsp/clients ] && exec_command "cat /etc/CPQswsp/clients" "SecurePath - spmgr password information" ## Changed 15.05.2006 (09:30) by Peter Lindblom, HP, STCC EMEA, Moved from the Proliant section. [ -f /var/log/sp_log ] && exec_command "cat /var/log/sp_log" "Secure path installation log" ## Changed 15.05.2006 (09:30) by Peter Lindblom, HP, STCC EMEA, Moved from the Proliant section. [ -f /root/sp_install_results.log ] && exec_command "cat /root/sp_install_results.log" "Secure path installation log (backup)" if [ -e /proc/sound ] ; then exec_command "cat /proc/sound" "Sound Devices" fi if [ -e /proc/asound ] ; then [ -f /proc/asound/version ] && exec_command "cat /proc/asound/version" "Asound Version" [ -f /proc/asound/modules ] && exec_command "cat /proc/asound/modules" "Sound modules" [ -f /proc/asound/cards ] && exec_command "cat /proc/asound/cards" "Sound Cards" [ -f /proc/asound/sndstat ] && exec_command "cat /proc/asound/sndstat" "Sound Stats" [ -f /proc/asound/timers ] && exec_command "cat /proc/asound/timers" "Sound Timers" [ -f /proc/asound/devices ] && exec_command "cat /proc/asound/devices" "Sound devices" [ -f /proc/asound/pcm ] && exec_command "cat /proc/asound/pcm" "Sound pcm" fi exec_command "cat /proc/dma" "DMA Devices" if [ -f /proc/tty/driver/serial ] ; then exec_command "grep -v unknown /proc/tty/driver/serial" "Serial Devices" fi # test this - please report it if [ -e /proc/rd ] ; then exec_command "cat /proc/rd/c*/current_status" "RAID controller" fi # get serial information SETSERIAL=`which setserial` if [ -n "$SETSERIAL" ] && [ -x $SETSERIAL ]; then exec_command "$SETSERIAL -a /dev/ttyS0" "Serial ttyS0" exec_command "$SETSERIAL -a /dev/ttyS1" "Serial ttyS1" fi # get IDE Disk information HDPARM=`which hdparm` # if hdparm is installed if [ $HDPARM ] && [ -x $HDPARM ]; then exec_command "\ if [ -e /proc/ide/hda ] ; then echo -e -n \"read from drive\"; $HDPARM -I /dev/hda;fi;\ if [ -e /proc/ide/hdb ] ; then echo; echo -e -n \"read from drive\"; $HDPARM -I /dev/hdb;fi;\ if [ -e /proc/ide/hdc ] ; then echo; echo -e -n \"read from drive\"; $HDPARM -I /dev/hdc;fi;\ if [ -e /proc/ide/hdd ] ; then echo; echo -e -n \"read from drive\"; $HDPARM -I /dev/hdd;fi;"\ "IDE Disks" if [ -e /proc/ide/hda ] ; then if grep disk /proc/ide/hda/media > /dev/null ;then exec_command "$HDPARM -t -T /dev/hda" "Transfer Speed" fi fi if [ -e /proc/ide/hdb ] ; then if grep disk /proc/ide/hdb/media > /dev/null ;then exec_command "$HDPARM -t -T /dev/hdb" "Transfer Speed" fi fi if [ -e /proc/ide/hdc ] ; then if grep disk /proc/ide/hdc/media > /dev/null ;then exec_command "$HDPARM -t -T /dev/hdc" "Transfer Speed" fi fi if [ -e /proc/ide/hdd ] ; then if grep disk /proc/ide/hdd/media > /dev/null ;then exec_command "$HDPARM -t -T /dev/hdd" "Transfer Speed" fi fi else # if hdparm not available exec_command "\ if [ -e /proc/ide/hda/model ] ; then echo -e -n \"hda: \";cat /proc/ide/hda/model ;fi;\ if [ -e /proc/ide/hdb/model ] ; then echo -e -n \"hdb: \";cat /proc/ide/hdb/model ;fi;\ if [ -e /proc/ide/hdc/model ] ; then echo -e -n \"hdc: \";cat /proc/ide/hdc/model ;fi;\ if [ -e /proc/ide/hdd/model ] ; then echo -e -n \"hdd: \";cat /proc/ide/hdd/model ;fi;"\ "IDE Disks" fi if [ -e /proc/sys/dev/cdrom/info ] ; then exec_command "cat /proc/sys/dev/cdrom/info" "CDROM Drive" fi if [ -e /proc/ide/piix ] ; then exec_command "cat /proc/ide/piix" "IDE Chipset info" fi # Test HW Health # MiMe if [ -x /usr/bin/sensors ] ; then if [ -e /proc/sys/dev/sensors/chips ] ; then exec_command "/usr/bin/sensors" "Sensors" fi fi if [ -x /usr/sbin/xpinfo ] then XPINFOFILE=$OUTDIR/`hostname`_xpinfo.csv /usr/sbin/xpinfo -d";" | grep -v "Scanning" > $XPINFOFILE AddText "The XP-Info configuration was additionally dumped into the file $XPINFOFILE for further usage" # remarked due to enhancement request by Martin Kalmbach, 25.10.2001 # exec_command "/usr/sbin/xpinfo|grep -v Scanning" "SureStore E Disk Array XP Mapping (xpinfo)" exec_command "/usr/sbin/xpinfo -r|grep -v Scanning" "SureStore E Disk Array XP Disk Mechanisms" exec_command "/usr/sbin/xpinfo -i|grep -v Scanning" "SureStore E Disk Array XP Identification Information" exec_command "/usr/sbin/xpinfo -c|grep -v Scanning" "SureStore E Disk Array XP (Continuous Access and Business Copy)" # else # [ -x /usr/contrib/bin/inquiry256.ksh ] && exec_command "/usr/contrib/bin/inquiry256.ksh" "SureStore E Disk Array XP256 Mapping (inquiry/obsolete)" fi dec_heading_level fi # terminates CFG_HARDWARE wrapper ###################################################################### ##### ToDo: check for Distribution ##### if [ "$CFG_SOFTWARE" != "no" ] then # else skip to next paragraph paragraph "Software" inc_heading_level # Debian if [ "$DEBIAN" = "yes" ] ; then dpkg --get-selections | awk '!/deinstall/ {print $1}' > /tmp/cfg2html-debian.$$ exec_command "column /tmp/cfg2html-debian.$$" "Packages installed" rm -f /tmp/cfg2html-debian.$$ AddText "Hint: to reinstall this list use:" AddText "awk '{print \$1\"\\n\"\$2}' this_list | dpkg --set-selections" exec_command "dpkg -C" "Misconfigured Packages" # # { changed/added 25.11.2003 (14:29) by Ralph Roth } if [ -x /usr/bin/deborphan ] ; then exec_command "deborphan" "Orphaned Packages" AddText "Hint: deborphan | xargs apt-get -y remove" # rar, 16.02.04 fi exec_command "dpkg -l" "Detailed list of installed Packages" AddText "$(dpkg --version|grep program)" exec_command "grep -vE '#|^ *$' /etc/apt/sources.list" "Installed from" fi # end Debian # SUSE # MiMe: --last tells date of installation if [ "$SUSE" = "yes" ] || [ "$UNITEDLINUX" = "yes" ] ; then exec_command "rpm -qa --last" "Packages installed" fi # end SUSE # REDHAT if [ "$REDHAT" = "yes" ] || [ "$MANDRAKE" = "yes" ] ; then exec_command "rpm -qia | grep -e Source -e Name" "Packages installed" exec_command "rpm -qa " "Packages installed (Short List)" fi # end REDHAT # SLACKWARE if [ "$SLACKWARE" = "yes" ] ; then exec_command "ls /var/log/packages " "Packages installed" fi # end SLACKWARE # GENTOO, rr, 15.12.2004, Rob if [ "$GENTOO" = "yes" ] ; then #exec_command "qpkg -I -v|sort" "Packages installed" #exec_command "qpkg -I -v --no-color |sort" "Packages installed" ## Rob Fantini, 15122004 exec_command "qlist -I -v --nocolor |sort" "Packages installed" ## 2007-02-21 Oliver Schwabedissen fi # end GENTOO #### programming stuff #### # plugin for cfg2html/linux/hpux # 22.11.2005, 16:03 modified by Ralph Roth # $Id: cfg2html-linux,v 1.39 2007/03/01 19:38:16 ralproth Exp $ ProgStuff() { for i in libtoolize libtool automake autoconf autoheader g++ gcc make flex sed do (which $i) && (echo -n "$i: ";$i --version | head -1) done } exec_command ProgStuff "Software Development: Programs and Versions" dec_heading_level fi # terminates CFG_SOFTWARE wrapper ###################################################################### if [ "$CFG_FILESYS" != "no" ] then # else skip to next paragraph paragraph "Filesystems, Dump- and Swapconfiguration" inc_heading_level exec_command "grep -v '^#' /etc/fstab" "FileSystemTab" exec_command "df -k" "Filesystems and Usage" exec_command "my_bdf" "All Filesystems and Usage" exec_command "mount" "Local Mountpoints" # exec_command "/sbin/fdisk -l" "Disk Partitions" # sfdisk -d > $OUTDIR/$BASEFILE.partitions.save exec_command "cat $OUTDIR/$BASEFILE.partitions.save" "Disk Partitions to restore from" AddText "To restore your partitions use the saved file: $BASEFILE.partitions.save, read the man page for sfdisk for usage. (Hint: sfdisk --force /dev/device < file.save)" # for LVM using sed exec_command "/sbin/fdisk -l|sed 's/8e \ Unknown/8e \ LVM/g'" "Disk Partitions" if [ -f /etc/exports ] ; then exec_command "grep -vE '^#|^ *$' /etc/exports" "NFS Filesystems" fi exec_command "free" "used memory/swap" dec_heading_level fi # terminates CFG_FILESYS wrapper ########################################################################### if [ "$CFG_LVM" != "no" ] then # else skip to next paragraph paragraph "LVM" inc_heading_level ## if [ -x /sbin/vgdisplay ] ; then #if [ -s /etc/lvmtab ] ; then # size > 0 # due to LVM2 (doesn't use /etc/lvmtab anymore), but should be compatible to LVM1; A. Kumpf if /sbin/fdisk -l | grep -q "LVM$" ; then /usr/sbin/vgdisplay -s > /dev/null 2>&1 # 15.11.2004, 14:11 modified by Ralph.Roth at hp.com (HPS-TSG-MCPS) if [ "$?" = "0" ] ; then AddText "The system filelayout is configured using the LVM (Logical Volume Manager)" # choose between LVM1 and LVM2 because of different syntaxes; A. Kumpf, 21.07.06 if [ -x "/sbin/lvm" ]; then LVM_VER=2 else LVM_VER=1 fi # case "$LVM_VER" in "1") exec_command "ls -la /dev/*/group" "Volumegroup Device Files" # { changed/added 29.01.2004 (11:15) by Ralph Roth } - sr by winfried knobloch for mc/sg exec_command "cat /proc/lvm/global" "LVM global info" exec_command "/usr/sbin/vgdisplay -v | awk -F' +' '/PV Name/ {print \$4}'" "Available Physical Groups" exec_command "/usr/sbin/vgdisplay -s | awk -F\\\" '{print \$2}'" "Available Volume Groups" exec_command "/usr/sbin/vgdisplay -v | awk -F' +' '/LV Name/ {print \$3}'" "Available Logical Volumes" ;; "2") exec_command "ls -al /dev/mapper/*" "Volumegroup Device Files" exec_command "/sbin/lvm version" "LVM global info" exec_command "/usr/sbin/vgdisplay -v | awk -F' +' '/PV Name/ {print \$4}'" "Available Physical Groups" exec_command "/usr/sbin/vgdisplay -s | awk -F\\\" '{print \$2}'" "Available Volume Groups" exec_command "/usr/sbin/vgdisplay -v | awk -F' +' '/LV Name/ {print \$4}'" "Available Logical Volumes" ;; esac # exec_command "/usr/sbin/vgdisplay -v" "Volumegroups" exec_command PVDisplay "Physical Devices used for LVM" AddText "Note: Run vgcfgbackup on a reqular basis to backup your volume group layout" else # if vgdisplay exist, but no LV configured (dk3hg 21.02.03) AddText "This system seems to be configured with whole disk layout (WDL)" fi else AddText "This system seems to be configured with whole disk layout (WDL)" fi # MD Tools, Ralph Roth if [ -r /etc/raidtab ] then exec_command "cat /proc/mdstat" "Software RAID: mdstat" exec_command "cat /etc/raidtab" "Software RAID: raidtab" [ -r /proc/devices/md ] && exec_command "cat /proc/devices/md" "Software RAID: MD Devices" fi dec_heading_level fi # terminates CFG_LVM wrapper ########################################################################### if [ "$CFG_NETWORK" != "no" ] then # else skip to next paragraph paragraph "Network Settings" inc_heading_level exec_command "/sbin/ifconfig" "LAN Interfaces" #exec_command "for interface in \$(lanscan|grep 'lan. '|awk '{print \$5}'|sort) ; do ifconfig \$interface; done" "LAN Interface Configuration" if [ $DEBIAN = "yes" ] ; then if [ -f /etc/network/interfaces ] ; then exec_command "grep -vE '(^#|^$)' /etc/network/interfaces" "Netconf Settings" fi fi [ -x /sbin/mii-tool ] && exec_command "/sbin/mii-tool -v" "MII Status" [ -x /sbin/mii-diag ] && exec_command "/sbin/mii-diag -a" "MII Diagnostics" NETSTAT=`which netstat` if [ $NETSTAT ] && [ -x $NETSTAT ]; then # test if netstat version 1.38, because some options differ in older versions # MiMe: '\' auf awk Zeile wichtig RESULT=`netstat -V | awk '/netstat/ { if ( $2 < 1.38 ) { print "NO" } else { print "OK" } }'` exec_command "netstat -r" "Routing Tables" exec_command "if [ "$RESULT" = "OK" ] ; then netstat -gi; fi" "Interfaces" ## Added 4/07/06 by krtmrrsn@yahoo.com, Marc Korte, probe and display ## kernel interface bonding info. if [ -e /proc/net/bonding ]; then for BondIF in `ls -1 /proc/net/bonding` do exec_command "cat /proc/net/bonding/$BondIF" "Bonded Interfaces: $BondIF" done fi ## End Marc Korte kernel interface bonding addition. exec_command "netstat -s" "Summary statistics for each protocol" exec_command "netstat -i" "Kernel Interface table" # MiMe: iptables since 2.4.x # MiMe: iptable_nat realisiert dabei das Masquerading # MiMe: Details stehen in /proc/net/ip_conntrack if [ -e /proc/net/ip_masquerade ]; then exec_command "netstat -M" "Masqueraded sessions" fi if [ -e /proc/net/ip_conntrack ]; then exec_command "cat /proc/net/ip_conntrack" "Masqueraded sessions" fi exec_command "netstat -an" "list of all sockets" fi DIG=`which dig` if [ -n "$DIG" ] && [ -x $DIG ] ; then exec_command "dig `hostname -f`" "dig hostname" else NSLOOKUP=`which nslookup` if [ -n "$NSLOOKUP" ] && [ -x $NSLOOKUP ] ; then exec_command "nslookup `hostname -f`" "Nslookup hostname" fi fi exec_command "grep -vE '#|^ *$' /etc/hosts" "/etc/hosts" # if [ -f /proc/sys/net/ipv4/ip_forward ] ; then FORWARD=`cat /proc/sys/net/ipv4/ip_forward` if [ $FORWARD = "0" ] ; then exec_command "echo \"IP forward disabled\"" "IP forward" else exec_command "echo \"IP forward enabled\"" "IP forward" fi fi if [ -r /proc/net/ip_fwnames ] ; then if [ -x /sbin/ipchains ] ;then exec_command "/sbin/ipchains -n -L forward" "ipfilter forward settings" exec_command "/sbin/ipchains -L -v" "ip filter settings" fi fi if [ -r /proc/net/ip_tables_names ] ; then if [ -x /sbin/iptables ] ; then exec_command "/sbin/iptables -L -v" "iptables list chains" ## rr, 030604 -v added exec_command "/sbin/iptables-save" "iptables rules" ## rr, 120704 added fi fi if [ -x /usr/sbin/tcpdchk ] ; then exec_command "/usr/sbin/tcpdchk -v" "tcpd wrapper" exec_command "/usr/sbin/tcpdchk -a" "tcpd warnings" fi [ -f /etc/hosts.allow ] && exec_command "grep -vE '#|^ *$' /etc/hosts.allow" "hosts.allow" [ -f /etc/hosts.deny ] && exec_command "grep -vE '#|^ *$' /etc/hosts.deny" "hosts.deny" #exec_command "nettl -status trace" "Nettl Status" if [ -f /etc/gated.conf ] ; then exec_command "cat /etc/gated.conf" "Gate Daemon" fi if [ -f /etc/bootptab ] ; then exec_command "grep -vE '(^#|^ *$)' /etc/bootptab" "BOOTP Daemon Configuration" fi if [ -r /etc/inetd.conf ]; then exec_command "grep -vE '#|^ *$' /etc/inetd.conf" "Internet Daemon Configuration" fi # 02.05.2005, 15:23 modified by Ralph.Roth at hp.com (HPS-TSG-MCPS) # RedHat default ## exec_command "grep -vE '#|^ *$' /etc/inetd.conf" "Internet Daemon Configuration" if [ -d /etc/xinetd.d ]; then # mdk/rh has a /etc/xinetd.d directory with a file per service exec_command "cat /etc/xinetd.d/*|grep -vE '#|^ *$'" "/etc/xinetd.d/ section" fi #exec_command "cat /etc/services" "Internet Daemon Services" if [ -f /etc/resolv.conf ] ; then exec_command "grep -vE '#|^ *$' /etc/resolv.conf;echo; ( [ -f /etc/nsswitch.conf ] && grep -vE '#|^ *$' /etc/nsswitch.conf)" "DNS & Names" fi [ -r /etc/bind/named.boot ] && exec_command "grep -v '^;' /etc/named.boot" "DNS/Named" if [ ! -f /etc/sendmail.cf ] ; then /usr/sbin/sendmail -bV 2> /dev/null > /dev/null && exec_command "/usr/sbin/sendmail -bV" "Sendmail/Exim Version" # 23.03.2006, 13:20 modified by Ralph Roth else exec_command "/usr/sbin/sendmail -bv -d0.1 testuser@test.host" "Sendmail Version" fi aliasespath="/etc" if [ "$GENTOO" == "yes" ] ;then ## 2007-02-27 Oliver Schwabedissen aliasespath="/etc/mail" fi if [ -f $aliasespath/aliases ] ; then exec_command "grep -vE '#|^ *$' $aliasespath/aliases" "Email Aliases" fi #exec_command "grep -vE '^#|^$' /etc/rc.config.d/nfsconf" "NFS settings" exec_command "ps -ef|grep -E '[Nn]fsd|[Bb]iod'" "NFSD and BIOD utilisation" ## fixed 2007-02-28 Oliver Schwabedissen # if portmap not available, do nothing RES=`ps xau | grep [Pp]ortmap` if [ -n "$RES" ] ; then exec_command "rpcinfo -p " "RPC (Portmapper)" # test if mountd running MOUNTD=`rpcinfo -p | awk '/mountd/ {print $5; exit}'` # if [ "$MOUNTD"="mountd" ] ; then if [ -n "$MOUNTD" ] ; then exec_command "rpcinfo -u 127.0.0.1 100003" "NSFD responds to RPC requests" SHOWMOUNT=`which showmount` ## 2007-02-27 Oliver Schwabedissen if [ $SHOWMOUNT ] && [ -x $SHOWMOUNT ] ; then exec_command "$SHOWMOUNT -a" "Mounted NFS File Systems" fi # SUSE if [ -x /usr/lib/autofs/showmount ] ; then exec_command "/usr/lib/autofs/showmount -a" "Mounted NFS File Systems" fi if [ -f /etc/auto.master ] ;then exec_command "grep -vE '^#|^$' /etc/auto.master" "NFS Automounter Master Settings" fi if [ -f /etc/auto.misc ] ;then exec_command "grep -vE '^#|^$' /etc/auto.misc" "NFS Automounter misc Settings" fi if [ -f /proc/net/rpc/nfs ] ; then exec_command "nfsstat" "NFS Statistics" fi fi # mountd fi #(ypwhich 2>/dev/null>/dev/null) && \ # (exec_command "what /usr/lib/netsvc/yp/yp*; ypwhich" "NIS/Yellow Pages") # ntpq live sometimes in /usr/bin or /usr/sbin NTPQ=`which ntpq` # if [ $NTPQ ] && [ -x $NTPQ ] ; then if [ -n "$NTPQ" ] && [ -x "$NTPQ" ] ; then # fixes by Ralph Roth, 180403 exec_command "$NTPQ -p" "XNTP Time Protocol Daemon" fi [ -f /etc/ntp.conf ] && exec_command "grep -vE '#|^ *$' /etc/ntp.conf" "ntp.conf" [ -f /etc/shells ] && exec_command "grep -vE '#|^ *$' /etc/shells" "FTP Login Shells" [ -f /etc/ftpusers ] && exec_command "grep -vE '#|^ *$' /etc/ftpusers" "FTP Rejections (/etc/ftpusers)" [ -f /etc/ftpaccess ] && exec_command "grep -vE '#|^ *$' /etc/ftpaccess" "FTP Permissions (/etc/ftpaccess)" [ -f /etc/syslog.conf ] && exec_command "grep -vE '#|^ *$' /etc/syslog.conf" "syslog.conf" [ -f /etc/syslog-ng/syslog-ng.conf ] && exec_command "grep -vE '#|^ *$' /etc/syslog-ng/syslog-ng.conf" "syslog-ng.conf" [ -f /etc/host.conf ] && exec_command "grep -vE '#|^ *$' /etc/host.conf" "host.conf" ######### SNMP ############ [ -f /etc/snmpd.conf ] && exec_command "grep -vE '#|^ *$' /etc/snmpd.conf" "Simple Network Managment Protocol (SNMP)" [ -f /etc/snmp/snmpd.conf ] && exec_command "grep -vE '#|^ *$' /etc/snmp/snmpd.conf" "Simple Network Managment Protocol (SNMP)" [ -f /etc/snmp/snmptrapd.conf ] && exec_command "grep -vE '#|^ *$' /etc/snmp/snmptrapd.conf" "SNMP Trapdaemon config" [ -f /opt/compac/cma.conf ] && "grep -vE '#|^ *$' /opt/compac/cma.conf" "HP Insight Management Agents configuration" ## ssh [ -f /etc/ssh/sshd_config ] && exec_command "grep -vE '#|^ *$' /etc/ssh/sshd_config" "sshd config" [ -f /etc/ssh/ssh_config ] && exec_command "grep -vE '#|^ *$' /etc/ssh/ssh_config" "ssh config" dec_heading_level fi # terminates CFG_NETWORK wrapper ########################################################################### if [ "$CFG_KERNEL" != "no" ] then # else skip to next paragraph paragraph "Kernel, Modules and Libaries" "Kernelparameters" inc_heading_level if [ -f /etc/lilo.conf ] ; then exec_command "grep -vE '#|^ *$' /etc/lilo.conf" "Lilo Boot Manager" exec_command "/sbin/lilo -q" "currently mapped files" fi if [ -f /boot/grub/menu.lst ] ; then exec_command "grep -vE '#|^ *$' /boot/grub/menu.lst" "GRUB Boot Manager" # rar fi if [ -f /etc/palo.conf ] ; then exec_command "grep -vE '#|^ *$' /etc/palo.conf" "Palo Boot Manager" fi exec_command "ls -l /boot" "Files in /boot" # 2404-2006, ralph exec_command "/sbin/lsmod" "Loaded Kernel Modules" exec_command "ls -l /lib/modules" "Available Modules Trees" # rar if [ -f /etc/modules.conf ] ; then exec_command "grep -vE '#|^ *$' /etc/modules.conf" "modules.conf" fi if [ -f /etc/modprobe.conf ] ; then exec_command "grep -vE '#|^ *$' /etc/modprobe.conf" "modprobe.conf" fi if [ -f /etc/sysconfig/kernel ] ; then exec_command "grep -vE '#|^ *$' /etc/sysconfig/kernel" "Modules for the ramdisk" # rar, SuSE only fi if [ "$DEBIAN" = "no" ] && [ "SLACKWARE" = "no" ] ; then which rpm > /dev/null && exec_command "rpm -qa | grep -e ^k_def -e ^kernel -e k_itanium -e k_smp -e ^linux" "Kernel RPMs" # rar, SuSE+RH+Itanium2 fi if [ "$DEBIAN" = "yes" ] ; then exec_command "dpkg -l | grep -i -e Kernel-image -e Linux-image" "Kernel related DEBs" fi [ -x /usr/sbin/get_sebool ] && exec_command "/usr/sbin/get_sebool -a" "SELinux Settings" who -b 2>/dev/null > /dev/null && exec_command "who -b" "System boot" # 23.03.2006, 13:18 modified by Ralph Roth exec_command "cat /proc/cmdline" "Kernel commandline" if [ -r /lib/libc.so.5 ] then if [ -x /lib/libc.so.5 ] then exec_command "/lib/libc.so.5" "libc5 Version" # Mandrake 9.2 else exec_command "strings /lib/libc.so.5 | grep \"release version\"" "libc5 Version (Strings)" ############# needs work out! ## rpm ## ldd fi fi if [ -r /lib/libc.so.6 ] then if [ -x /lib/libc.so.6 ] then exec_command "/lib/libc.so.6" "libc6 Version" # Mandrake 9.2 else exec_command "strings /lib/libc.so.6 | grep \"release version\"" "libc6 Version (Strings)" ############# needs work out! ## rpm ## ldd fi fi if [ "$DEBIAN" = "no" ] && [ "$SLACKWARE" = "no" ] && [ "$GENTOO" = "no" ] ; then ## fixed 2007-02-27 Oliver Schwabedissen which rpm > /dev/null && exec_command "rpm -qi glibc" "libc6 Version (RPM)" # rar, SuSE+RH fi exec_command "/sbin/ldconfig -vN" "Run-time link bindings" # MiMe: SuSE patched kernel params into /proc if [ -e /proc/config.gz ] ; then exec_command "zcat /proc/config.gz | grep -vE '#|^ *$'" "Kernelparameter /proc/config.gz" else if [ -e /usr/src/linux/.config ] ; then exec_command "grep -vE '#|^ *$' /usr/src/linux/.config" "Kernelsource .config" fi fi ## ## we want to display special kernel configuration as well ## done in /etc/init.d/boot.local ## 31Jan2003 it233 U.Frey FRU if [ -e /etc/init.d/boot.local ] ; then exec_command "grep -vE '#|^ *$' /etc/init.d/boot.local" "Additional Kernel Parameters init.d/boot.local" fi if [ -x /sbin/sysctl ] ; then exec_command "/sbin/sysctl -a" "configured kernel parameters at runtime" fi if [ -f "/etc/rc.config" ] ; then exec_command "grep ^INITRD_MODULES /etc/rc.config" "INITRD Modules" fi dec_heading_level fi # terminates CFG_KERNEL wrapper ###################################################################### if [ "$CFG_ENHANCEMENTS" != "no" ] then # else skip to next paragraph paragraph "Systemenhancements" inc_heading_level if [ -e /etc/X11/XF86Config ] ; then exec_command "grep -vE '#|^ *$' /etc/X11/XF86Config" "XF86Config" else if [ -e /etc/XF86Config ] ; then exec_command "grep -vE '#|^ *$' /etc/XF86Config" "XF86Config" fi fi if [ -e /etc/X11/XF86Config-4 ] ; then exec_command "grep -vE '#|^ *$' /etc/X11/XF86Config-4" "XF86Config-4" else if [ -e /etc/XF86Config ] ; then exec_command "grep -vE '#|^ *$' /etc/XF86Config-4" "XF86Config-4" fi fi if [ -e /etc/X11/xorg.conf ] ; then exec_command "grep -vE '#|^ *$' /etc/X11/xorg.conf" "xorg.conf" fi # MiMe: fuer X braucht man Rechte if [ -x /usr/X11R6/bin/xhost ] ; then /usr/X11R6/bin/xhost > /dev/null 2>&1 if [ "$?" -eq "0" ] ; then # Gratien D'haese # fix for sshdX11 # old command [ -x /usr/bin/X11/xdpyinfo ] && [ -n "$DISPLAY" ] && exec_command "/usr/bin/X11/xdpyinfo" "X11" # this will only check if the display is 0 or 1 which is more then enough [ -x /usr/bin/X11/xdpyinfo ] && [ -n "$DISPLAY" ] && [ `echo $DISPLAY | cut -d: -f2 | cut -d. -f1` -le 1 ] && exec_command "/usr/bin/X11/xdpyinfo" "X11" [ -x /usr/bin/X11/fsinfo ] && [ -n "$FONTSERVER" ] && exec_command "/usr/bin/X11/fsinfo" "Font-Server" fi fi dec_heading_level fi # terminates CFG_ENHANCEMENTS wrapper ########################################################################### if [ "$CFG_APPLICATIONS" != "no" ] then # else skip to next paragraph paragraph "Applications and Subsystems" ### COMMON ################################################################ inc_heading_level if [ -d /usr/local/bin ] ; then exec_command "ls -lisa /usr/local/bin" "Files in /usr/local/bin" fi if [ -d /usr/local/sbin ] ; then exec_command "ls -lisa /usr/local/sbin" "Files in /usr/local/sbin" fi if [ -d /opt ] ; then exec_command "ls -lisa /opt" "Files in /opt" fi ############ Samba and Swat ######################## if [ -f /etc/inetd.conf ] ; then SWAT=`grep swat /etc/services /etc/inetd.conf` fi if [ -f /etc/xinetd.conf ] ; then SWAT=`grep swat /etc/services /etc/xinetd.conf` fi [ -n "$SWAT" ] && exec_command "echo $SWAT" "Samba: SWAT-Port" [ -x /usr/sbin/smbstatus ] && exec_command "/usr/sbin/smbstatus 2>/dev/null" "Samba (smbstatus)" ### Debian.... [ -x /usr/bin/smbstatus ] && exec_command "/usr/bin/smbstatus 2>/dev/null" "Samba (smbstatus)" ## fixed 2007-02-27 Oliver Schwabedissen [ -x /usr/bin/testparm ] && exec_command "/usr/bin/testparm -s" "Samba Configuration" [ -f /etc/init.d/samba ] && exec_command "ps -ef | grep -E '(s|n)m[b]'" "Samba Daemons" if [ -x /usr/sbin/lpc ] ; then exec_command "/usr/sbin/lpc status" "Printer Spooler and Printers" fi [ -f /etc/printcap ] && exec_command "grep -vE '#|^ *$' /etc/printcap" "Printcap" [ -f /etc/hosts.lpd ] && exec_command "grep -vE '#|^ *$' /etc/hosts.lpd" "hosts.lpd" ## ## we want to display HP OpenVantage Operations configurations ## 31Jan2003 it233 FRU U.Frey if [ -e /opt/OV/bin/OpC/utils/opcdcode ] ; then if [ -e /opt/OV/bin/OpC/install/opcinfo ] ; then exec_command "cat /opt/OV/bin/OpC/install/opcinfo" "HP OpenView Info, Version" fi if [ -e /var/opt/OV/conf/OpC/monitor ] ; then exec_command "/opt/OV/bin/OpC/utils/opcdcode /var/opt/OV/conf/OpC/monitor | grep DESCRIPTION" "HP OpenView Configuration MONITOR" fi if [ -e /var/opt/OV/conf/OpC/le ] ; then exec_command "/opt/OV/bin/OpC/utils/opcdcode /var/opt/OV/conf/OpC/le | grep DESCRIPTION" "HP OpenView Configuration LOGGING" fi fi ## we want to display Veritas netbackup configurations ## 31Jan2003 it233 FRU U.Frey if [ -e /usr/openv/netbackup/bp.conf ] ; then if [ -e /usr/openv/netbackup/version ] ; then exec_command "cat /usr/openv/netbackup/version" "Veritas Netbackup Version" fi exec_command "cat /usr/openv/netbackup/bp.conf" "Veritas Netbackup Configuration" fi fi # terminates CFG_APPLICATIONS wrapper ########################################################################### # { changed/added 28.01.2004 (17:56) by Ralph Roth } if [ -r /etc/cmcluster.conf ] ; then dec_heading_level paragraph "MC/SG" inc_heading_level . ${SGCONFFILE:=/etc/cmcluster.conf} # get env. setting, rar 12.05.2005 PATH=$PATH:$SGSBIN:$SGLBIN exec_command "cat ${SGCONFFILE:=/etc/cmcluster.conf}" "Cluster Config Files" exec_command "what $SGSBIN/cmcld|head; what $SGSBIN/cmhaltpkg|head" "Real MC/SG Version" ## 12.05.2005, 10:07 modified by Ralph.Roth at hp.com (HPS-TSG-MCPS) exec_command "cmquerycl -v" "MC/SG Configuration" exec_command "cmviewcl -v" "MC/SG Nodes and Packages" exec_command "cmviewconf" "MC/SG Cluster Configuration Information" exec_command "cmscancl -s" "MC/SG Scancl Detailed Node Configuration" exec_command "netstat -in" "MC/SG Network Subnets" exec_command "netstat -a |fgrep hacl" "MC/SG Sockets" exec_command "ls -l $SGCONF" "Files in $SGCONF" fi dec_heading_level ########################################################################## ## ## Display Oracle configuration if applicable ## Begin Oracle Config Display ## 31jan2003 it233 FRU U.Frey if [ -e /etc/oratab ] ; then paragraph "Oracle Configuration" inc_heading_level exec_command "grep -vE '^#|^$|N' /etc/oratab " "Configured Oracle Databases" ## ## Display each Oracle initSID.ora File for DB in `grep ':' /etc/oratab|grep -v '#'|grep -v 'N'` do Ora_Home=`echo $DB | awk -F: '{print $2}'` Sid=`echo $DB | awk -F: '{print $1}'` Init=${Ora_Home}/dbs/init${Sid}.ora exec_command "cat $Init" "Oracle Instance $Sid" done dec_heading_level fi ### ############################################################################## ### HP Proliant Server LINUX Logfiles from HP tools and or the HP PSP. ### Made by Jeroen.Kleen@hp.com EMEA ISS Competence Center Engineer ### if [ "$CFG_HPPROLIANTSERVER" != "no" ] then # else skip to next paragraph paragraph "hp Proliant Server Log- and configuration Files" inc_heading_level /opt/hp/hpdiags/hpdiags -v 5 -o /tmp/hpdiags.xml -f cpqacuxe -c /var/log/cpqacuxe.cfg hpaducli -f ADUreport.txt -r if [ -e /usr/lib/hponcfg ] then /usr/lib/hponcfg -w ilo.cfg fi if [ -e /usr/sbin/dmidecode ] then exec_command "dmidecode|grep Product -2" "HP Proliant Server Information taken from dmidecode" fi exec_command "survey -v 5 -t" "Classic Survey output -v 5" exec_command "hplog -t -f -p" "Current Thermal Sensor, Fan & Power data" exec_command "hplog -v" "Proliant Integrated Management Log" exec_command "cat /var/log/hppldu.log" "Installation Log PSP 7.*" exec_command "cat /opt/compaq/cma.conf" "/opt/compaq/cma.conf file" exec_command "cat /opt/compaq/snmpd.conf.orig" "/opt/compaq/snmpd.conf.orig file " exec_command "cat /tmp/hppldu.cfg" "PSP 7.* Installation Settings file" exec_command "cat /var/hp/install_history.txt" "/var/hp/install_history.txt file" exec_command "cat /var/log/hplog.txt" "/var/log/hplog.txt file" exec_command "cat /var/opt/hp/nicfwupg.log" "/var/opt/hp/nicfwupg.log file" exec_command "cat /var/spool/compaq/cma.log" "/var/spool/compaq/cma.log Agents logfile" exec_command "cat /var/cpq/Component.log" "Individual Components Installation Log file (ROMBIOS/SA FW/iLO)" exec_command "cat /etc/snmp/snmpd.conf" "/etc/snmp/snmpd.conf file" exec_command "/etc/init.d/hpasm status" "hpasm status of how what modules are loaded and running correctly." exec_command "cat /opt/compaq/cpqhealth/cpqhealth_boot.log" "LOGfile from when hpasm failed installation" exec_command "cat /opt/compaq/hprsm/hprsm_boot.log" "LOGfile during boot from hprsm" exec_command "/opt/compaq/nic/bin/hpetfe -A" "/opt/compaq/utils/nic/bin/hpetfe -A HP NIC information" hpasmcli -s "show asr; show boot; show dimm; show f1; show fans; show ht; show ipl; show name; show powersupply; show pxe; show serial bios; show serial embedded; show serial virtual; show server; show temp; show uid; show wol" >hpasmcliOutput.txt exec_command "cat hpasmcliOutput.txt" "HP ASM CLI command line output" exec_command "cat /etc/opt/hp/hp-vt/hp-vt.conf" "Intelligent Networking Pack Virus Throttling conf file" exec_command "/etc/init.d/hp-vt status" "Intelligent Networking Pack Virus Throttling Status" exec_command "cat /var/opt/hp/hp-vt/hp-vt.log" "Intelligent Networking Pack Logfile" exec_command "/opt/hp/hp-pel/nalicense -d" "Proliant Essentials Licenses installed overview" exec_command "cat /var/opt/hp/hp-pel/hp-pel.log" "Proliant Essentials Licenses Logfile" exec_command "ls ilo.cfg" "iLO/RILOE Configuration XML file is in TARball" exec_command "cat /root/install.log.syslog" "Installation SYS logfile" exec_command "cat /root/install.rdp.log" "Rapid Deployment Pack RDPinstall logfile" exec_command "cat /root/anaconda-ks.cfg" "anaconda kickstart file used during OS deployment" exec_command "cat /var/log/messages" "messages logging file (older messages logfiles in TARBALL)" exec_command "cat /var/log/boot.log" "boot.log logfile (older boot.log logfiles in TARBALL)" exec_command "cat /var/log/dmesg" "dmesg logfile /var/log/dmesg" if [ -e /usr/sbin/dmidecode ] then exec_command "dmidecode" "/usr/sbin/dmidecode output" fi exec_command "cat /tmp/ADUreport.txt" "Array Diagnostic Utility report is included in the TAR ball as a single file" exec_command "cat /var/log/cpqacuxe.cfg" "cpqacuxe configuration file (SmartArray configuration)" ###below partitioning and HPACUCLI is contributed by kgalal@gmail.com if [ -x /usr/sbin/hpacucli ] ; then exec_command "/usr/sbin/hpacucli controller all show" "HP SmartArray controllers Detected" # added by jeroenkleen HP exec_command "/usr/sbin/hpacucli controller all show status" "HP SmartArray controllers Detected with Status" slotnum=`/usr/sbin/hpacucli controller all show | awk '{if($0!="")print $6}'` # jkleen: this doesn't work (yet) for MSA1x000 controllers exec_command "/usr/sbin/hpacucli controller slot=$slotnum physicaldrive all show" "Physical Drives on SmartArray Controller" exec_command "/usr/sbin/hpacucli controller slot=$slotnum logicaldrive all show" "Logical Drives on SmartArray controller" fi disks=`/sbin/fdisk -l` if [ ! -z "$disks" ] ; then exec_command "/sbin/fdisk -l" "Disk Partitions on Logical Drives" else disks=`cat /proc/partitions | awk '{if($4 ~ /\//)print $4}' |grep -v p` for adisk in $disks ; do exec_command "/sbin/fdisk -l /dev/$adisk" "Disk Partitions - /dev/$adisk" done fi exec_command "/sbin/fdisk -l" "Disk Partitions" ###above partitioning and HPACUCLI is contributed by kgalal@gmail.com exec_command "ls /tmp/hpdiags.xml" "HP Insight Diagnostics Detailed (5) Report is in TARball" hplog -s INFO -l "CFG2HTML Proliant Server report successfully created" dec_heading_level fi # end of CFG_HPPROLIANTSERVER paragraph ### END of HP Proliant Server Integration ############################################################################### ### ### ############################################################################## ### Altiris ADL agent settings and logfiles ### Made by Jeroen.Kleen@hp.com EMEA ISS Competence Center Engineer ### if [ "$CFG_ALTIRISAGENTFILES" != "no" ] then # else skip to next paragraph # checking if Altiris directory exist otherwise skip this section if [ -e /opt/altiris/deployment/adlagent ] ; then paragraph "Altiris ADL Agent logfiles and settings" inc_heading_level exec_command "cat /opt/altiris/deployment/adlagent/conf/adlagent.conf" "Altiris ADLagent settings file" exec_command "cat /opt/altiris/deployment/adlagent/log/adlagentdbg.txt" "Altris ADLagent Debugging file" exec_command "cat /opt/altiris/deployment/adlagent/log/adlagentIpTrace.txt" "Altiris ADLagent IP tracing file" dec_heading_level fi fi # end of CFG_ALTIRISAGENTFILES paragraph ### END of Altiris ADL agent settings and logfiles ############################################################################## ### ############################################################################## ### VMWARE settings and logfiles ### Made by Jeroen.Kleen@hp.com EMEA ISS Competence Center Engineer ### if [ "$CFG_VMWARE" != "no" ] then # else skip to next paragraph # checking if VMWare directory exist otherwise skip this section if [ -e /proc/vmware ] ; then paragraph "VMWare logfiles and settings" inc_heading_level exec_command "vmware -v" "VMWare Server version" echo "VMWare server detected. We will start now the vm-support script in case you" echo "need this vmware debugging file send to VMWare support or other support teams." vm-support exec_command "cat esx-$(date -I).$$.tgz" "vm-support ticket generated in local directory if vm-support is installed." dec_heading_level fi fi # end of CFG_VMWARE paragraph ############################################################################## # # collect local files # if [ -f /etc/cfg2html/files ] ; then paragraph "Local files" inc_heading_level . /etc/cfg2html/files for i in $FILES do if [ -f $i ] ; then exec_command "grep -vE '(^#|^ *$)' $i" "File: $i" fi done AddText "You can customize this entry by editing /etc/cfg2html/files" dec_heading_level fi dec_heading_level close_html ########################################################################### ########################################################################### ###### Creating TAR File for all needed files together. Added by Jeroen Kleen HP EMEA ISS CC if [ "$CFG_HPPROLIANTSERVER" != "no" ] then # else skip to next paragraph if [ -f $OUTDIR/$BASEFILE.tar ] ; then rm $OUTDIR/$BASEFILE.tar fi echo " " echo " The following files are included in your tarball: " # include in future TARball: /var/log/messages.* /var/log/boot.log.* tar cvf $OUTDIR/$BASEFILE.tar $OUTDIR/$BASEFILE.err $OUTDIR/$BASEFILE.html $OUTDIR/cfg2html_back.jpg $OUTDIR/profbull.gif $OUTDIR/$BASEFILE.partitions.save $OUTDIR/$BASEFILE.txt ADUreport.txt /var/spool/compaq/vcagent/log/vcagentd.log /var/spool/compaq/vcagent/log/vcasetup.log /tmp/hpdiags.xml ilo.cfg echo " " echo " If you created this CFG2HTML report on request of a HP support Agent " echo " then please send the $OUTDIR/$BASEFILE.tar file to: " echo " {YourCaseID}@cases.brussels.hp.com " echo " " echo " Feedback please to: Jeroen.Kleen@hp.com Thanks! " fi # end of CFG_HPPROLIANTSERVER (making tarball) ########################################################################### logger "End of $VERSION" echo -e "\n" line logger "End of $VERSION" rm -f core > /dev/null ########## remove the error.log if it has size zero ####################### [ ! -s "$ERROR_LOG" ] && rm -f $ERROR_LOG 2> /dev/null #if [ "$1" != "-x" ] if [ "$GIF" = "no" ] then exit 0 fi echo "Creating: JPG/GIFs" cd $OUTDIR # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by Guru Ralph on Wed Sep 13 16:03:07 2000 # # This archive contains: # cfg2html_back.jpg profbull.gif # # Error checking via sum(1) will be performed. LANG=""; export LANG PATH=/bin:/usr/bin:/usr/sbin:/usr/ccs/bin:$PATH; export PATH if sum -r /dev/null 2>&1 then sumopt='-r' else sumopt='' fi rm -f /tmp/uud$$ (echo -e "begin 666 /tmp/uud$$\n#;VL*n#6%@x\n \nend" | uudecode) >/dev/null 2>&1 if [ X"`cat /tmp/uud$$ 2>&1`" = Xok ] then unpacker () { uudecode; } elif [ -x "/usr/bin/perl" ] then unpacker () { perl -ne 'if (/^begin \d\d\d (.*$)/) { open( TT, "> $1") } elsif (/^end/) { close (TT) } else { print TT unpack u, $_ }' $1; } else echo Compiling unpacker for non-ascii files pwd=`pwd`; cd /tmp cat >unpack$$.c <<'EOF' #include #define C (*p++ - ' ' & 077) main() { int n; char buf[128], *p, a,b; scanf("begin %o ", &n); gets(buf); if (freopen(buf, "w", stdout) == NULL) { perror(buf); exit(1); } while (gets(p=buf) && (n=C)) { while (n>0) { a = C; if (n-- > 0) putchar(a << 2 | (b=C) >> 4); if (n-- > 0) putchar(b << 4 | (a=C) >> 2); if (n-- > 0) putchar(a << 6 | C); } } exit(0); } EOF cc -o unpack$$ unpack$$.c rm unpack$$.c cd $pwd unpacker () { /tmp/unpack$$ $1; } fi rm -f /tmp/uud$$ echo x - cfg2html_back.jpg '[non-ascii]' unpacker <<'@eof' begin 777 cfg2html_back.jpg M_]C_X 02D9)1@ ! 0$ 2P!+ #_XP,.35-/(%!A;&5T=&4@;[[4?\?:B;MN>?NN^CNO>COO>GOONOOP>OPP>SQP^WQQ.[RR._SRO'TT?/WZ?O]:;K1X M;;W3<;_4,37><+7>\78?<79?\C:@,;:@LC;@\G;A,O;ALGCC<[?CL[>CL_?C]'?D,[?D-#?D<_@X MD='@DL_@DM+@D]'AD]+@D]/AE-+AE=/AEM'AEM/AEM7BE]/AE];BF-3BF-7BX MF=/CF=3BF=7CFM?CFMGDF]3CF]7CF]?CG-3DG-?DG=7DG=;DG=GEG=KEGM;DX MGMCEG];EG]KEG]OEG]SFH-?EH-GEH-OFH=GEH=KFH=SFHMOFHMWGH]SFH]WFX MH][GI-KFI-OGI-WGI=SGI=WFI=_GIMSGIMWGIM[HIM_HJ-SHJ-[HJ=[HJ=_HX MJ=_IJMWHJN'IJ][IJ]_IJ^'IK-[IK.#IK.'IK.+JK=_JK>'IK>'JK>'KK>/JX MKM_JKN'JKN+JK^'JK^+KK^/JK^3KL./KL>'KL>/KL>3KL>3LLN+KLN/LLN3KX MLN7LL^/KL^3LL^7LM.7LM>3LM>7LM>?MMN3MMN7MMN?MM^;MM^?MN.3LN.;NX MN.?MN.?NN.CNN>GNNN;NNNCNNNGON^?ON^CON^GNN^GON^GQO.COO.GMO.GOX MO.KOO>GNO>GPO>OOONCOONCQONGNONGOONKPONOPONSPO^GPO^KPO^OOO^SOX MP.KPP.OPP.SPP.SQP>KPP>OQP>SRP>WQPNSPPNSRPNWPPN[QP^OQP^SRP^WPX MP^WRP^WSP^[QQ.SQQ.WRQ.[QQ.[SQ._RQ>WRQ>[RQ>_RQ?#RQ^WSQ^[RQ^_SX MR.WSR.[SR?#SR?'SRO#SRO#TR^_TR_#UR_+TS/'TS/+USO+US_#VT/'VT//VX MT?+WTO7WU//XU_;YVO;ZW/?[WOG\X?O]Y_W^\O__^_______7;7-_]L 0P +X M" @*" <+"@D*#0P+#1$<$A$/#Q$B&1H4'"DD*RHH)"YH;0 1 F!NQZ">@[G]*Z;OAYM5R>X M0NF8#-_UW/VJ=V\MI%U*6.K22(W&^*'#&[,7&+ [2=C3#AB45G;TJ(!/][T-X MF,4-PZ%**"K#_$08]SM4[I)O8^&Q;-SW;9?T)!IUC0H32P!SUBD.J;RP/S")X M/@;5(5@%JMO#D)PY#& &@'M-%;/BJ "TCE\*!)K4S;,11=37^',)I)P5.<4KX M<.S.;ER2S'<]32W.(=; N%DUW/AM#U$#NQZ>PIK5_G*84+<&X))!'^ZFKG9VX M)-XCERIPS'IVIU6VN#)?_CBI";5J#<+,-GWC[^*RO;:[@B$&0N\>2>I\TJRZX M:W8J&*JP)(!( VZD?S4TYO.+YY9/P$S ^?6KH#"HPF5$F=S4[O$E$4J-:L?2X M"8U ==MO)WI"R6[?923;TE@Q&DB<#HW/B@I=N@9%P*-#$:0,L(A1/[^U1MWS>4I<51<(PP&#XJMZUJ2 (TF1X M[4B\/XI%4DW:BVM-QKNK7<:28ZTUO66)< 3E?;S18DLH*R1F2>OM26Q=EB2(X M82!@P:BK"^ !^6"Q, 9DGP(DU%KB<0SV^:I+ @B(SXH7++LJ^HZ@2)&)!I1PX MF@"1';I5BB9E$6"I((@]:K:M%'##I5EO6GO%))8#.-Z=KB:Q;52"W4C^Q29EX M(_,.*JQAS F?A)FE]!) P%R9WK.[W;D:"Z'4=C$#H!]9JZ%@JL5!:?5TJ4MIX MGBU#BW=4H'0,&F0 1B>U,O#VT&9D=(^NU9+UDI=*DDA1"S_QZ"KV-36^46(TX MY!\=OWK4QF,Q.ZLRII5&ZF0!_=J=4"C2 #G32(J60ML Q/I$?[\5#\/P)S[Q4+R&X+3X MJ5N"WN 1/;4T1,;"E)=*BZG$*%MW&7N(]5+>8L&ME23I VQ)X MW)[XV\FE7AIZ5H5@K:6*E_\ MXH;/*7"H;:,I/I_Q!-5.HKD>IO/7IO4GO(;X MBHZF& 8,>D[2.G?]*=A<-V=0"@QIGXA[46/!5X3E0Q,$;3N:Z_?-HMI5?2H8X MZCN28 Z]<]*EQ%U@ +/I+9!7!CO\_\ 7O77%-ZU:ND#5!4TKRE]0K8XGF@ZX M!HN;Z3D'VIKEMF80Y4#(.9FLZV2"",$;&M.K3^8Q(D1$XI/HC8UUU->D]1@UX MR6RI! VH(UM;9N'T!LG5@CWJESB#;0@P?3J) R!WF8\5&LY2KS/6D=WO(X*SD#.S+.T=/YJ@YG, ]/+&"._:*[F(TJCJSQ@$SC[5!)+-P7CX M?;XB9)^E4/,-V0L(##&-^U"Y=94W]2K.3.3@ _T"EX>X]U&Y@!<;$")%7VFX M<'N<8+3!"20=R@ @=ZY@98.5%N('CS- 6$9B[.@DS$_M%&XB\L:V*HH(/L:FX M+H+82,R6[1O\ZH1+:69@C;D#('6/>ICE2MG5I9,A&!!'7]:D_$7&T&W&WCYT)%PGE'2ZN)P-P=_X M.:(X;0X+Y8G5G?WIG9U%K :/5"D ;XQM_NE/#LYX M*NX@,6$P,GKYJBVX155B #B#']%4 6^6KU'\.6?FNX9X MR9F7&TCW"QDSU434S=M"W<92V@'27X M48'B>_M-![86U=",==U2>VH^/E-9F+W+=M&:4MB$4 "D0DS3:&YH&EE:V1!X M(G?Z5*Z2 BV\:1Z3V\CZ=M^U3X=2CQ_B^#6P.A+$C4XRQ+;4X6-8[5@6V#G X M4ZB?:KI=0:PJ25,1$S[08'#Z!J88.K BNN7$LZ0VE008D1M_LTY2,)<9BX MY4+J 'IG:3N2.I[=*'#V#:!4_ PR/K3\/?YPD#EN-UP1'BF+-ZVPW8C)^U/2X MYR98UE L0(PL"LEZ\VC5;PK.50# ,;L>^3 Z;U?5<6W<-P0T>GO!J5U%*V$0X MR$MP?F?>K*?D3IM@L56.YFEN7!;MZLL3FLQXFY^(!#3;!@QLWD?2M3(K,5)P#X M,#,=/[\ZE5RU=\)LMQ!;@ZRLPS=^A^68FEX?AC:Q'I;$=Z-A#8ML&G2!J [>X MU42\'+EI&G&HF9'BB1[2N7REM6M!3F%!Z@;F!L.W>GM(+P#!=)."OFBEJTJ@X MY,[1$'YUP>+G+T2"?4>U/B_5&LBWAB-71>O\5FN<05 :TJG4< ]1W\>.M447X M->0%MF5*XW\45M6K8 (]1V&!/SJ?2=X!7#6ET@JS8 B0,]?%+^'704U29U"I)[U4E:WPQ4:XP!DG:*GI_BJ&ZEL+KDF0)B?G1U%"6N1JG "S./[FB_"6W_ "&YT+'4")JBHH^(A??[X MTJ<1;NVFN*2=(DB(([5![EUM'*=@0)8C GL!V'<[THNFTK;4>E@[= IFIL)#X M 3(]*X_4_I@>](R&^BZS (A@!.9Z4>>EH+J=Q,KJ WC>HME'#:5DB!L*<@MKX MT J9W(W'?&:#M=-R5]2KN6S(CH>E2O:KC7%T3G2)V ZF.Y[].E5,A1[JHG,NX MMH62")G5]_I0O77LVE>Y:TZOA1VAR.\ 8^==?M.YMNOQV^W3S4C;>Z^JXS.^X MQ+9-(I)LPNVN(A7#+B-).#\ZK=N%$: \K$GOG,>8[TB<*3B)JL%4$*&&TGM3X M%B^V:UQ#<\EQ^6QV.2H]Z8\/":%VY:12&;X M3'IDB8\'L8I?A*S2FSKMA&:5'I.)I;MPH"JD:E41(DL?L!O3L+C%2MP*!!!!X M^+&T=:'6!K?"B!.*HQ#JVO4H7J2-OIUI6LJ;2J#IM01 R(/]_>@C?NM:)12%*A="Z029W)\ ?OX M5.'XHW)# +;T,EX!3G6#U_L8\4+X MM_2&C3K4#!W)/;ZGY4;=KEHZAHD[@QFF 5KC'3)&\XGV-1=!>(=^'9FU2H^"X M<'M\JS.K/>#VRPTB QP3Y/V[5J#H;A0""1TR,?6CK#)@!1GIO'7V_P!TNBK=X MZQJT@ $2/>HCA7=%U_ @QT'D^Y[TEL7>?S3.<$3TK02%+E]*H,ANWFG!R7%AX M$S$G2-1@">IJ:W7O%T*P&!"L,?J*+7["*$=FD&<@DCW&]5UVPBL-.D[%9,T1X MF O+8_#DE;4R4@9^]%>'JY6X;LLXT@D:9W'M[5R\4BW1;#,I8 @E<&=MZ7X*X MCMUNT;6(PW3O7,Q2T6TA6G3,2!)W_BEOO<55<@,=7J!)SVGQ/3:I<*SC\NX2X MRG8GH:5V7T9;CF\1EK). X$^_P!:%\XN6IRDK'.#B[2]B[2]O?;V]JRTX M,:2LK)2ZR]@X.+@[W-2K3%Q:RT.8N<4I2DE+2]X M.7.+BVI[<^;F&)RDI(.4G+2]M(N4G&)[>][FYJ2L>Z2L2G.#8O;V*6I[:H.+X ME%)J:J2TM*2LM'.#>[W%8M[>6KW%M-[F$,W5

    (@$&"01,6(3(C@X,3+@\Z% 8"(HH])!. #DIR="/boot/"$(date "+%d-%m-%Y.%Hh%M") DIR="/mnt/hostfs/report-"$(date "+%d-%m-%Y.%Hh%Mm%Ss") mkdir -p "$DIR" 2>/dev/null pushd "$DIR" cp /root/.bash_history bash_history cfg2html -H -S -f -l # Copy the HTML version of the report and the latest bash history into the hostfs path: cp *.html ../report.html cp bash_history ../bash_history.text #gzip * popd marionnet-0.90.6+bzr434.orig/uml/startup.old/marionnet_prepare_shutdown0000700000175000017500000000346712167200764025241 0ustar lucaslucas#!/bin/bash # This file is part of Marionnet, a virtual network laboratory # Copyright (C) 2007 Luca Saiu # Copyright (C) 2007 2013 Jean-Vincent Loddo # Copyright (C) 2007 2013 Université Paris 13 # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . echo -n "Marionnet shutdown tuning... " set -x ########################################### # Source-ing kernel command line # ########################################### # Read kernel command line variables into this shell's environment: # Expected variables: hostname hostfs ubd0s export $(tr $temporary_file && \ mv -f $temporary_file "$FILE" fi } # Remove the host name from /etc/hosts: the user might change it # when the virtual machine is off: remove_line_if_needed "127.0.0.1 $hostname" /etc/hosts echo "done." marionnet-0.90.6+bzr434.orig/uml/startup.old/DEPENDENCIES.png0000600000175000017500000012476612167200764022212 0ustar lucaslucasPNG  IHDRed]bKGD IDATxw|[8WdIֶa;N< +$2.Җnm/r/J e].PlJ4؎{He~,ˎly:zu;a~B!B! B!B7pA!B!2 B!BE\B!B!L&Ȝbx<j\.pvvFa/ '܌bd2TfH$r@ -KHHo9X,t# Uv=b07uݑonw8SI$Id2E|@f( Bh9N&B\.jf2X@Oz\.fre@~ ABneٜN'd4FF¨"͌ A42B#&4".+"23q. x2aR0A4ӗH$qqq4 ȰX,p82fd2 f  a (Yjô 4XoiX.x^LBEI( F@l=*oDt@0.K#Zrz$"ceB89h4Z,Qb6F#,l6hn@%mY__l'X:& ǃ\PՇrWH-d2L,D"X,Hd2,cd|&T%!3a4!o2 tO83 ` :sZTM6zk s6Z@) v3C$T0PH+4- a^ aR GpR)p!H$]|>_,Ӆ>,2fC>f0 ltpDRB*Ot) -BpL9 =eA@` hCwe) `E- (x\ÉDgj, LDw!#츊 `0F W@Ha IBBX,P8,__LK JZD~v02an<.9x xIW(WY,U\fJpeB$d11};!:nppPJp9HDpCjwe9M"- _ ob= LUDa BP*jZ1&V?s€4a+Tji0 T] N4M,@r.#D[f1`b|? ?EpP@ -$2`$-46֓REh$jT4ܵ b%d2A`T*T*{r(Asdr: h4Bxf4z DQk%i8^ry[hŊdTt: sf/|;#M09aa6Y2CX^4y^V700;88388CCCtˤ$h0T*JhGZB^/]P@(NGFp8**==^juZZZJJFIIIILLop<ZVҕ###w|~p--0KBhyh0AEjᅷ===tH$T5 e=ϏO@!AwWzzziv2]]]===t6ʤ$ 1/XP(M9B6 vww]]]0cχKNNNnnŋo488x'NA]^^^VVVVVV^^d"4'yVΟ?OMH$DγBSv{{{! !ZE-qI^ѣG9_GGnhhhmmmoo؊H$b_*>vwG3::nkkj6x⒒k޽}Quu@ Xl4VZ#4~sssMMMuuuMMMssOOOߺu;6m[qp>ɠY,ŋˋh9'Z-tlmm?u0]l__b444! 0t-((X'!P L00BSSp8yyyt9=o۷wަ&Dy 6^#4 /qqqׯ߾}ۋ.d  #G=z",:...|^VBhV>uԩSjkkO:fie͚5srN>}Ç՝? Ⲳ2/]ЀBs>{,sX S-_~Ŋr<)`x?쳃l߾}۶mk׮E0B ݻ~Nm۶;wnڴ)..n{ze``~#GΞ=b,Yb ̃,uuueee3-0jRe |W3s"L B(rZԘ@|k^|ׯB_}UMMw}W[[t:Jʕ+!2]X'o&aq3)*Z- s6m۶.l۶m y[_"o@ ذaÖ-[Y2nȑ#||Օu_7oNLL2{L/[pOH kPvm߿?Z-ڴi?qƅ3 7vرcB8rW_}uo>oPeggdxwyG{?jL&`ìuv25>>xر??я~?я~$|p!ECCCK/t;w^{NlJP[[ŋ#SHx pe&iw}W\LdÇ^nݎ;ݓ%$,n)yl.Z0YIa޽|M&Ӻun]v i^裏>쳹=_!%pHQxZ{%ɳ>k׮q7C{<O(qNo̙3T7|.J-zF#)u=\eeP(]t'|2޷xx{^{*G&uϟ?UW ¤jl?^,˭*Hjs=oFL|>o榛nh4'11K/ݿpm6ۏ~#RP8'xT ҧzrMX?liZΤ$HtWwttLx§'=OLa^xaժU 妤\{_|Ec8ar8Ϊ7XW_}Nw\W^yե?4}לMaqj,nres1r HR>}piXzaRpz#'\uUG,]h4/Ie^{-!h[\\Lٳgτ{$GM 3#3\s9A?`X۶mt! qy|~Z*>v /@bzu\[lR o|*G kΝۏk?xŊ5?&Gl9ZoeñaÆ]mܸԑ0LDOѦf0az"3S$ # =~Ip!EfAijj뮻\%K9߿JoɓQ\Maq` f'+awé !'dX,멧5̀Q O>R>x_\s5z>{p``588hoBJ%\-u6s4މ3'l sHuuufffzz:СC/yeeeuuu&{!HҀ5k׮پ}޽{F}g !˗/اFnXB'x"^{5N^}Ux8D~l3=!TfS;|uGyr [l  r+'< P{{e]r_|h,kn,n$,n&7C ̈́v$-ByM6o kyBĄQ f{y<޺uz{{ۏ>(..EfIfo&!$;;r\.'>3ȓ1q9 iI~ sвe-Zܷk t՜s`֫&xrJB_ܹs\xz---%/[wo8@ל?"dXPP@~~WSSoCQ*#_~W\VB}2sRRRByי+MXf'zB^XX8D0{)À l˖-?O_y啶\-/.L>cXѺp7x#*{O <,n"9!7oԅrem&#^}UBȮ]~jx=Ѓ>'L lɏB~l6_,Z[.|W1YY_Ny?Bn~&y2;n:G!3#O!yjiii~{:| >t̥kjnn!Jfl6LCrMrLWv?0x@׌0?&y# 1kX,FT}'t@0cf) 8-B3ޞ| "0ym6VƀDjp}}95 ]wݕDرcz+*O <,n"9!7oԅrem&#ѢR~N9x_~IٷoWTfOH~]]] "Ro@0GGQp`:޿|RTVꔔ!!y2;nd M!y.zW9g3w}WTTtNj !^|>Ir@&.LLLzp}Q]w?hȯQIv$*6q'%8\xz| .׬YV]]SOڵK$۷'?t$5Yv{EíBq7F%U 7,n b[R䤧k u֭[.!!ammmZ6###1os222#G\ /|W1Y$&&*J.k H$#'c9S83Eׯx!?["d2A7'Ƀ6O#cG8Z|#|PMO=ODp8k֬y{コ:BȁO!\-1I0dOq1rɂ: IDATiiiJ,n<,n`qA$%Es17|s.(>>]tEGwx<ǎ >5jއ_ N&y衇~?w_C³ȍKH6Ϲy.&Z2YYY_|q@7HB^{V_~厎p8ZZZ򗿬^Q*Q< !D,u85550a#~6Lo$o5ׇ~xxx`0TUUAfڒo^L&#ASmMX|˄|*OA$_|ۭ͞|IBHBBBcx!Wx'K.!\yf>KOOO47ɓ'b=sr˗//((7&o5X| 7a1`e$%Es᤹/'L7n$_~?LMz饗B^}0rsݷ~P(lhh𽵶r?¬?ɬ/`XK,zv=###` {/ /O>do yNj_yB011;Zt7Ox_t_p<pAIIɓO>ɬLXrj':(Ly>.?~?ܿӧy<ކ 6o޼aÆJ#4'a 8ܪ/`o>|./g:ulll_zƍ׮]b X!4K`q`!dx꯿СCCCCjK.ٺue]T_~_lii⋯]v%%%$1iPUUomݺ0i/}FH$ZzW\YQQ,!koo?uTMMÇ|>_nnW_e˖xX1V{С/r޽qqqK.]vʕ+KJJn!'OVWWw"hÆ ۶mKc:/^w۶m]w֭[c4ЅjnnO~n;ΎS P>ٳG>zh[[KOO(//SZ <ٳgkkkO:U[[{i,W^nݺիWTX'szzz;vcǎrEEE%%%%%%eee%%%3< !tlOc4\naaW\r⸸Xt\f?_X.)Sg"f!W_ݻw߾} ⪫7l0 X,uuuN~SSQ*y)///**Zxq|||!,Z__n}}ncǨOy$՝>}RRRRZZZZZZPPxbD" vwtt444յ{^Dtdɒ3Q觹o߾nJknذ!555֩Cz}}n{۷o߾}e˦3r%hhh85tr8B?By<֖fNGKqqLhhh9}tkk!T1/WH"Bvۻ h44R^^3Oƽ{ݻou\k׮]j՚5kJKKHyd2j|wfYPlٲ.۲eKTfJހKB ---l !2ʒ36=|>_ggg[[6ϝ;r! rK6Fq:Νyx遒.%%p?BEhwwwWW37t݄Dȁ1Sw8Ǐo9b0Be RVV4"4Ϲ'O9r 7\fͺu֮][PPݘ\hN@*J333-N@^oWWWGGGgggWWWggggggOOV/^\PPG n_+E"􌌌tXR#PH^w``.62ilC|ocalqq\NЬ2<< 3C766\.SQQvZL1dۙmjD"KvvvffFh4|>?G`j r4Li4<;p8 p8`R  V5JJMM9bBj}}}4@qqq)))I23t?:)z&قM₂l j09T}}}__!D.ÿLU\\lVjuZZZJJ Ԓ1BM;88388;00c' !|>_VRSS1%t:]OOO7t^j:%%%%%ERi4RT*J%>!4澾>N۫i_BHbbbjjjVV5 hnٳ\khh$x\ZTT3kppٳ---gϞIK~?aȈU"Re<G4og4a8(JZP( EJJb< !-NSkZVz^zl@[(&|>\~/]V q8R dJ<"2X?FM+944444z=,CA Bs-$CYV82ܳ.1g2nc fddn(333%%%IF(j\.a=0 -}BǼ?8}+ZB3LPBt:Bc|j5@g=7Tyinne ϧkSRRfOCVk L ZͮP(`^ŋCl%//oOn8.|>f -iZ'11111Q.'20e,!122b0F uPhT*űQhNZ"ۡ!V Bb\.dr<soA#4Gy^`4 saef] kJfC3LlttBX,J[D𚚚J{T*L200#z{{iX.àlP(ed\"a \(LF0RT.KRD" "ɤR)Pvd2fd2 ,5&_i٘OHH!nP(O!E/6`e305kmBBB~)BX,Fd2Y,l6X,s@I*sfw\JJOO!fpA^;TcCWnpN𚖖%b+ .d6C?hAH$ d2H$@ HB!ϗJ qhX,bЅQa6GGGd&X \J$0?Vkp hcXc@\\D"42 BHR)χ;rl6\.lٜNht:VutttBDC'SG y-&-Xv1hBp8U*T.c)38NZǠ!Nǜl;>>9Y/cf \b V%7MӐbX2L Mub,IR#y<^BBkb13PX,h4|>x,l& 6+jBl")rl6 82W2cX#4)75-r x;d</)))>>^.C 'xM||H$ B!L 4|>zf3BvGGGrYVrr8&tZVX 0D$}J~w?Th^E"g&ۘ rH0::jq ,r9H?H\rrZOT.\jvXf16pFL,@$!vÌ@%X$q\. Oـ2!!@KB`?PLD A!P$FMB8ZV!QzC5FL& LDCSJ"BX, "Cw-okDNgggc[ZZzzz|>_||Enve4!'1`nv,X % WD#piQBït)(XHW4Mh5B\Z0" d & BPx~DŽ +d2^$ vkO.õ'R)ԂR)Ç!4Pg^Cv#HR:p OLfᦲD"bPErZT!#lҨ };Q} . QpY`8d¨KzRh uk6`Pt{F@Cb͂kҷGGA@CғJ'=zP>vN }rnR@ vɓ'Oljjjlllhh0,255u{ (>2=(7+M( !a:'vPo@.DAѯ#ph6 " awzY2 ^!8°tBh /C¦LC̕4pl>dLLb6h02gf;a2 EA_<҂n1xb`Ed4(@s z/ jmm)8M# ySf0Fw4At j%Z݋z`VC-pZرc4xAEẺ R.`-EO;F^7882&rRw@2e  0]Zؽ!4ew`nF)CreTadM8ʀ<-~pf 49zk[[[uuuBSΞ=200@Q*+V||h,b}={:!!H!49{ٱcGWWWfffӂBlNVf *++7oC.]*JcRB!4Wa jժ̪* 4k'O JNN^jW\QTTCB!Pta bvUUUc:-ca444f"TYY",8D!BM t3Ϝ>},iAht}z<"B!b.]+V,Z . wYf"P(V\Is8X!B(BQk׮w}gXN Bf;u [,6]PPPYYyf"B!f {y'O8 !BaimmeڱcDXpB!X~?i@h>+++;zʕ+cfq" IDAT'NKWWMHH(//g Xوb{uBB!4 (---,,€ B^䘦&@Q˖-!’CB!|5]fݯO?fcfjvE޽",r<)E!Bh"qɒ%~ڵkci eeetP~~H$uJpHB!4a .hoPJJJeew ̸X'!BY.EӞ={?wf'FGGO>M#,mmmn;...??!B! RP4>|xÆ N BrH$*--""Bh..ES~~~IIIUU\lt:Ϝ9C#,FSTTC*++SSScRB!* e{F UUU|b8IC pmm-K!B!!eΝ[xG}4<<[o>| %%%:ihMMMMMM4CˋK^^ˍubB! }e999 B!4ah2Lc=C1 2,֩C8q9sd2XbaBs}sυ z^Rfg>a!)B( Fo~^ć",YB-Y|Q7ts=v-!=\˗FGGB 0Dɓ4CpBRNNNGGG?/]tӃB€ B駟^uUC97IBsnW `6qB #<\ZZZb$BM \~!E\.v=@atv`immx<|>KJX!4CsssVrGyIB!4)pA(j|>ߖ-[^#={6xBXr%s88B WiiiCCbۙ+B!ЬiddDz<b| \!B>,8D!3ۿ-Plvyy'b*BE.Eٱc֭[fC3BV=v!@PQQA#,%%%$)E^4dpyDZMB!"綾^{? hOsX~@ !B4CJ+h!&kG P*NB!"U﮻:zo qY'?޽{;|~f:uFXZ[[- .((ܱcDXpB|555 6`!C Bp\ٳnXc'^zoSǏ.כP^^Oh... B `P*'.._!B(Ri{j ǃ=\f >v:q-C b0!*j7|3B \iӦX:A!$`S钗n۶ .~vvv2v?NZ4rݻw!P|{ۿ_.cBM)Bsnw8<b!l6I1~rYV)i[C VoGGG#:DBJKKBa||1+,K&ѷl6[*ҷqqq̇p\HD BBH$rtW</!!"9NNf{ ~\T||%KΜ9r8NaaaiiiYYYiiiyyyRRRLҌ>d2B,%dbf%4'\o #|겲\d2 @ P.@T* |n HHHx/B!@`4 WxL&Hʮ5͑'`0Z0h7o<">a}>ۀ~pݣm@pjBpA<&p$ ÑdpVy 2a2~_ ZpnU\\|=-Y fFtZVp8,ju:F Nl6CB=àyH$qqqP0rfc<\rI1p!V!v3 f'P#ˑ7#,Dj`Y&x]1 !_P!rN 2L(Җs@H>{"1#23"3a.xpDX`22"B.C }ᦐT*d1P/BT#sq~^Oln&T 9 v zV; B\.dr<`샀O@(1 h4/0?Q*J2yJJNNf%C!ˬt: 1+\.7iLrrrRR3Br9j.Z ,Kkkkkkkssssssccc{{;LgT*}l0`yxxX 3gLHHKpLbbRTsq(Z ^N^z=t̶X,VTJRP$''SB$|#4{Ō ?^u愄dP( eB nZ-DUt:z~pp0d$(PV @(B~__'eۇ=<&`%3. EJJBP(j**JRJ M100000088߯jt:]__:t&T%\p‚Rk[hzt:A *rPmcNH/RSSU*j4:{fA!402, jhH9(&!+#xZv`p*1FѤgddi4Z N aaOjZVRLMMp8zF6AONG'q&//oѢEYYY!4`% l6[wwwooo___WWsvQpÐR=-;= 1Y،㥥A&---======---999?0I+ݝ0?@ ΆKOIKKS*8,B1G b 衡!BH\\FȀ׬,; !" L:|GGGGG,tvv "55V222RSSBr:}}}'1]]]Zn 윜 6N}rrrFF48 E:Ic]c^/!DP,Z(///g CY.!0+0],Z94CBjZ@tܹsuuuĀLvvvff&c:;ynJggaٙyyyyyyp333(-(nMwtt@.;BZf`/^}aBh qϟolllnn>{ٳgV+!Ab++Y@ xp8좢1x_4&뛚`@Pbb"VpB($M ~f䔖.]$''b:!@-fkiiinnnjj׶62==(??ѢEf:!4E###ΝkoorSSS{{;xQ8&%\.WSSSCCCCCY!rBK.]dI~~~RRRv{kkkKK 6 Hd,]tҥr<։Eb\G]]݉'?~ĉfCEEEx!sш3GYk4e;o&MҤMפFW)-PP@@v*3#32.G "nWE- ݠ{M,8?ĴMӒG7'7M{+w1Mkk Ο?…+Wtwwx脄sBBBpp0eاT*rss鍫cbbO~]wu]l 0E]%??_׋I&ѽs" LʂWүMzFhh(Μ}'5ɓ'O̬D)))iiiӧO6mj^u…FD2mڴ9s̝;7)) ܾ;voxZ5kVzzzjjj||3p 1`u󙙙gĉ{ f̘10L.]:p#G ]w53fL4itt/(R=zd2L&/xhJJJN8qĉfs\r...lW0Zsrr>}ݼyS,s=۶m={vll,ۥә3g!cfF[s0JӧOU ;zczʕ+'NWZ%.]qƙ3gnG57oٳg߾}'N\t… XFжX&XGo>>>? _rrr?~%KH˗]v֬YlhOz?Ν;#\211ѣcǎ͛7>Y./744|ן}٬Y|\.]#1:N)xm:vڵkN4dd%%%zAh8~.qd"P(iӦu֍f ]v bѢE>;fhU8huV.k2zzz7nصkg}裏⋾l0[YY٪U8Nbbݻ5 |B?eި}ݩS|??+W~cw2ɩ2JcyyyI$e˖UTTW$}h0^{gg瘘={·~2L---k֬qwwz{zz;wnڵ<sܹ}]ջwwwoٲ%))I$D[tAȖqL&ӧ~.J'L϶Oa;f1>ދQ׿[bX$>|ؖҩ{Os޽t/9tPjjy'|bs믿w͇Z̙3{Ojƙ-=pիWQ\\R;Ć6+]E#}hu:ݼy=ʔM477?|׎8Q^^_,Yd4v˝3gNQQ۵ b`B555> +k_}.+ٲdƘ{ϛ7o042xꩧ\|ժU{ismH!ꫯt#G̛7|̀Gvvv7#[&r`Bs=gaPPБ#GJeUUՒ%K!wu׀=;rrrJO|ؖuh孷ʚ¾|"-,駟f+ 6]k -L6l _p!44?~CCgdDnmm5ls;===XVxE ácg1M[, !MMM#466BD"=erL|>%i +]|L,FHDill]-=ʔMۙΎ7lbGydԩlW1찊WV1_h孷ʚ¾|"-,1l֭ht[8 }855iii%%%.\غukFFD"o?a}FLdy/`ͼĢY_M&?^TTDĢCfGC+7F^>\mw~/a9?'2쨖LeTVVFFF]Ű*`3, E,sStttkkRd堁ԩS?#Nv!ۈrrMܹs/xiii>}rrr!'N|l =Rz˖-QQQtԩSCNTT!رc| !0l/qqq˗/q`Ԕ{l->):thh=ڔ~J{z6;&ܹS(ylbɓ'gffvvv]*fPIϟgZ.\` m_C{뭬)FfyɌ W0 | \]]W^=>/@1o !K,o3f|z_'g|{Ȗ 35o쳧_e%""/ݻVH IDAT9 XE;!]Y8{!jZڵkڴitLF~+t+-]_|MBVM/XhKO2>bZ9wv\]뽽-[Ɯ]2&aUV1ӟ!aaagϞ:{,X8ZYS 27oeɌUv\ ?v-#IfXDCbHG }y̟pFLn޳ӢLc=eӻe֭?TbѮjg̘ѻfGSOq~>ۭsjk~N{Ȁ={Ozn bgNǒ 6p8g}Zĉd֬YUUUl2,*-XP ČKBxkOٳ'&&m޼9>aÆ0>흖sN@lHWW׆ <<d:ydFFF@@DqqqO??Lmooo+ނn5ɤmF'.g͚e~ =ʔ91LK,ŞoT*;;海^^^oV2*QQQd˖-淶*4Ud*..\\\<=={ׯB|||f[geM1Lܢe%3>|8::Z,ܹrC.&g߾}&Lp8?~:瘙vTXXOJ$W^yeTGZvBkͽ>3za;Bf͚v!g._Лm/Y͛lW0 8Es'##pFq…AAA6m2sphg tF[ܾm۶M<9&&߼ysuu͛% ۥ @ xW_ Xz'Ŏ^X-[ܹsK/DYr%uo/?W>tPHHu[ܸq?/.\p9s渺]~LFG=~kݗ-[_jܹ\>zWXvivcrq-u,PXXxO~~~k׮ݰa}o0捲{ѣG^x)--m֬Yw})SF ObsP^Ƽ['Lp}-\pዷ૯:p@nn,X0o}i,nVj?x…3gtuu%&&Ο?>}:>p1WSS?t:LFɓ'`S Juڵ+LYf%%%LReff:u*;;~4y>}z\\vT1d?3gΟ?? ƈ1tnCAA` LIIDlW 7nܸqի7n0)f<<<خth4W\?ggg777M:5999)))!!!** [jjjrss]U]]- ҦM&ٮ` FCʺzjEEhr'N.t:]qq7 _^XXXXXj !ryyy999̞OBBB\\\TTTDDDdddpp0Bjnn.)))***---**1yqf4oRZZZ^^^__O `d TTTvTJA|111...l>ߜ򊊊JJJJ%!D GEEE d^p%ӁvBsXXXttt\\dp\j1trBCCCBB透۵ءV+++kjjjkk@MM =;bvIcc#PՄHӿt#JY.NyKEEEIIISS!ㅄLhCBBpA2L566Bappp@@@PP@`` .? }j555UUU555 BX, a╀lg=5554y)--yfUUUeeBzxx͍ݲv:F*4^yf}}}OO!5$$$44488x„ 4^ A{KUUU]]TWW+ HqqqrG&܂= 4444444555661`%((?(((005VKUUO555z"Jry@@L& dr$aFP544666644)F򐐐`F5.#h4**mlllhh;] BPC !\..q\.jnFG*~@>Oi'._PPnWC`4o޼YSSP( *& }}}[d2EV777暚&UX!8;;@__@:LPnG`8 pq*i"XWWG&zX,fooo8/aSZgg' P{G*osss[[B\.)Sd2L&5`uuu1o}}BbL" LJy xT*itNa7773?Bw@@/kNQC{W^D!JR;3`>,J=<ب[VwtttwwwvvT*VT*5VmooVT# / , Vh4mmmFV˘BmeL C[҄WWWrZ&8!D*r\Ge"wwwCsf4b2D"hL C<4 G6z_nҸz !F&2&8vQVB7.D>TJS<0rNxggV;:5Bܜ>á0/dV+}9XWaX/tuuѻ\^+q"` UZ^Њ̺Z7XktA(X{A,rtHO@}"mWS;9K>Sf"b^>3/G9ٷ`hLW sr+_l v9gfMAyPe%@,3yX,vvv,134bg@+ظ j0[Ô>LY?`<8$tbUboab+\;Ϗ2!6}2?b`XhNlq8/rժUle !p3.v;C`g\ !p3.v;C`g\ !p3.v;C`g\ !p3.v;C`g\c2خgܹ.]b6ҴZ3Nsss+c :uW1@8NJJ LJSի9NO999_~!@X|}}gΜ)t|I0X\κuz7:99s=#_ g qss?>KU GvZ</vuue$Gxb`Xf ppDBpŊ|>>H$ .d$zj^Oqvvٮl1Ll}0 rr{V8AxUVB<==.7(0 FcGGEcgg``{-2ݝᘷBH4|"APխ]]]*MRӇtX(JB}$,0UADB!qwwH$bX,{xx9%J<q !tww755յ k4x|xɒ%[li4Vk2{?T43V{wʫooofX&K$-m1 ---uuu4XilllhhojjR(mmm̘^^^L`5xyy`,`X6LgٝEäKS'JżP$r???L+i⊁0N!pFPTREEEeeeWW<&rՕ.82VҢP( ESSS}}}CCCcc#M !|v{0(V[[[RRRZZZrKiiV%`aNkhh4rQQQaaaHa`,Ah,))-.. =3***&&&******444((H&]2XRT4)---,,,.....2L</44/IIIqqqb 8ܼ܂FO蘘oooSŷ^~]p𤤤Ąᾜ pGuK.]t555'D"+e4+** KJJzkrrԩSSSSLvB1L.]x˗ F trrr||;et:]aaaNNrrrz}``[RSSB!eieee??Awi΂`@ZڵkHK.D{ٓ'Oxl mmmG=uTfffeeˌ3̙3wD\nG]][]]]gϞhѢ(q z'O$q4dIKKlWcP~~>M^Ν;ёvi0 pkmmݷo333|ޛxb777Kh4;w:p@}}}\\\FFƪU&Nvi0. p{ڹs޽{y<322>Dv]0~\p᫯믫f̘qƌ c ؁Rsμ'x׿5 ̙3;v8x𠛛?&::`lB}oV]jՓO>vQڵk׮] Wp`۷o뭷?}Ǭ-999'44tgp_il?|XXϷeF?s=,HADDēO>Y]]mlgG_RYY%$$lذAPd 0!pϟ:u37ry+EtxʕhŊ lii_wt:ݼylܮkjj3oajo޽`J}˗?u!)'/`p O}ݷqF !\/ 555:ȑ#ŋ=i7W>}333388_2ȑ#Jjɒ%~'NH$۷ojYYY˖-[rtf_ >}իu IDATV*)((ӟp^|A{֦_0999J' <:μeΝV cWTT?wyZ`4pF|B.Ē/!LK9111ymڴi%%%'k&K۳ú>[d2ـb`_v!0ᢹ`{^Z|kL4yVƬ5k֘_leL&clmm5Ӗ6OOOPHbQ }hB!m1L\.\\\\4MccO[L_(vww^hQkkc={Y\e:[LV/hp8==='Ů+V/B`)E0pfΜi{iii%%%.\غukFFD"o?cq>g44LA̮>kXq9s洶nܸwbKي -Z-^;.`8јv!uUr9!sY㥥=!8qb3=q:ZXX\YB塡3-.\磏>ZlZ~' ~ah/wpzŋlI\\\JJ֭[.<$xӦM՝G}GG9sߚW_BZ`gD=SgΜ:}4=Lfκu!O?[[[}E{1-ZD9Juܹ#l۶m;䴅BOqڷo6J}'MMMk֬ap Յ fΜcQQYYYDDgssyvp #ٳ:Ϡ}K3˗/ʥsrrSKs.z~Nּ# 3ҥK:z}m>\~G}4`I8IFSLyGmv-0=䓟}۵rx3fX ,سgOLL  ڼy]GްaCXXNKK۹s;;#O?ݰaX,^tٳgibǏo۶-11Q(Yf1 Ξ={}xzz>c?H[o6$$ġ.|JJJ͛׿Z`t]&/Z^n]aa+ζ몬_~-PL:uԩM͈sݻwpR}47>3<370B`d{7J>#ޯqm֬YuHv90^{m׮]۶m2eJ^^=}FlFv˲eΝ;Q__K+WڧıcӦM ,Xd? JٮF=\"??Æ ?oW_}uh'р>)999++ٙz_OOϞ={^~垞;vddd]8">>ŋ|'Ly涶6r{y„ >?Oa޽ O>ڵkKJJ-;vx뭷3226n8c r|Ass5k?GGG]5\j~sμ'nܸtwwg.1ǎ۹s=<<~'x"<<`lBsν{r8/_|ѢEq[b 3gt: y< F*J$@rR)!X,vvvfsuuxVnhZdjooPVwww[+̰Z6ḋ=<Fwww$3 8XX>.#R.c`g\ !p3.v;C`g\ !p3.v;C`g\ !p3.v;C`g\ !p3.v;]¹s纻[<==)))#^ d2]ʕ+8߳"Q"dI0X8<ϧ|ŋ8>.ebϧ Ã>8 pp,wvvۼyF$,.g:΢׿8\l~̙3gR pp8\.w͚5g`P8x"gguqxpJ d^zuҤI,Ï$jݺuYEH[F.j͚5">vZA)E+&&rƍ[ǵ~zBHRRхv[{{;=dKBZF!.Bdjoo+ʞQ_)gInnnNNN@@...'''777:puuY`O8/T*Je[[[GGRjJtzShڎޮT*g3e L8bN.~ych4*8;;bZT*nnnBP$I$>ARJnnn4 )04XioogRX\(JRX,-Bz$ $ Lp\B} H$"xtwwg<z״3smgZ5L&徾2AۄdR(uuuuuu 4[illd؝e2Y@@ Sp8v |hhhWd2L&eRcHkhhuuu%Q<==}}}r9>rooovGR117662Bhlld.OK×`:Ccu\`tҲ2JNrPP( -SOOBR(4r~~~&L0+J..`ƍJuu50aBxxxxxxhh(=!$$^Y. C}}}UUUuuuuuuYYYyyyyyyUU=ۛ _"""cbbU ^/---((qFAA׋t:@  n ,2 TVVpBBBbcc&N ʕ+W^˻~zqqN oXXؤƅߖB`'MK/ p>477ӄrѓ&Mb@cLccc~~7sss]hR)M^/` .@!===yyygΜ9{+W*++ !'ONMM=%%erZvڕ+W.^x̙zggɓ'I$k`:~}vD2}t8yd>v@qq1=",33M2eժUK. a:`񢱱_S ̙3ޙ3gx<Μ9sǏO4iҥ˖-KLLd4` 1>;p@VVP(7o޲e-Zvic^?}>\[[lٲuql#v0,L&w}wojj:xC=zڒpBCCGxF-fXχ|[f??sD DDD /ձ].cGOO_|nڴi'NXf, \L&N}.9!dݶ;|7]RJ7|ֶiӦɮ-1u]~UU?駟FFFKJ`x.cDqq#Fyꩧr9sӥ3jƍ]]]/_~>g<4BCCAll~h;a)))e֬YGa&Eřʖ,Y"HqZmܟ'BRi溺LcƼkRo턐ֵkzxxx{{K ap8==='>>WjP(|駋ϟczaQ7p8Y*w%<LK%捏<-:l~X|"---}VB޽{N7o[bMMM~~~-Lm-ݻwB,X{YYϹ?|r:j'X}C[}żQPxzzBd2YSS_:gFv-`8`tꫯy7|3dp/!jMM4uq?B -PfcM"f$0L7mɲ5-n!8Q`u-'h`:@@(-Z翛ʅ {~E{Fc___YYUQ[[+Ju:_'Bd`\^PP0gYYVx!l:,//4 /_ȠhXAAAWWWhh(nJ}''?pVu=~ s޽zVMپ}hl9z/b1]'L&駟B9kj.==cvf0$IVVۅ̎!icectt4![ZZl{pRٳ +O˙wB<=='eŊcǎM8wGEEBʘ>5660{S9ii+WSfH4^iԖ-[!***"+SHRBHee%ۅᦹXiiifffggg@@۵ԝ;wE"Qww78 V-/_ꫯZleƍ'NDLOZ- g2P7mrz޶Ts\2>>d(zgٲeӷ:?ոrJZZZ޹s#Gnn2mL`pss<ЪɉU婬*lپlۨP(/_NH_E$)))<<^,bD"YDi 5kX6~cժU---.]ڷoK//\;XL[&hnP ve R455UVڵ6mIӢيV-tS<Dgxxxٲe|>u>h+W}6U!pXbqoohdY*bb@UV>}R^^>ہlONnB*))ᡡҥKV}~njovIfi;y& B|ٳa޽va~rza8.XJJf ܄KBVyyy:N*[֬Y/roB lrrr*+++**2[k:!;tBFͭ͵PXXcٜ{С9-zӧ~i(..n۶myyy_uEE Ε\./++ۼy3ۅ=o޼v!3Jl?Gfa1;wL=i8(F2z oIDAT瞛C 6B\\\8euRoLJI˄M=^XjwZH$ÿ+!$88᧞z*66`0] V,n_|O?ZUUv-ӣA}Y6m:~xtt4 ώ;fʕ+YYYaaawժUG=|l~第,Pּsꄣp8?0>>xdf!+"j˖->>>;w/hbovHHñi bt!_NLL[Y/pׯomm-))a,zz~ǎŻw޻w+M_駟w}z$''d2{ Tk..]` ~ɂjŊgϞeIϞ>6]FȨ>#Bȋ/ha}vfffZZZRRիW8*pp---w...NJJׯ__ op兼R 榵㑑c.#22̙35557n߿oo/uTR ]]]/^ő3gΤGEEdÇ744 mpxX8p)ј}T.v]7o'HLLLLL\r%tR+ L`0ƍn2aaa˗/{G]\\.`rySSSCCCSSScccss^'>L‚e,0[\`L&SkkkSSSsssSSӭ[ܹc4]]]cbbbcc###W@@%FFFC ]|yLLL\\\LL'D0njmmmkkSՄ.F×p 44]582ɤP(ޏy[>#QQQ4^FvOV𥵵>PTB0000$$$000000(((((>rVJrJ#xzzGDDX +\` utt+ \. h}D"D" Q,;Occc====== GTT*JP(:::f3!Ϗ pX$X6>>RNR|jLOPo,]~,fh||\m[TvwwwuuTQڟѿ;V$ ]$%HG ,hAR)Jf6Rje>oPK( @E|xFVh4f``@jZ``ztl< Z388h2!ABL& ?a[yI!&aB777B3D(Օѣ=3/ \l 8.vy\6^eIENDB`marionnet-0.90.6+bzr434.orig/uml/startup.old/cfg2html0000700000175000017500000000135612167200764021275 0ustar lucaslucas# @(#) $Header: /home/ralproth/CVS/cfg2html_hpux/release/cfg2html,v 3.13 2006/05/03 08:10:23 ralproth Exp $ ############################################################## # This is a wrapper for cfg2html(-hpux).sh (shortcut) and can be # customized to fit your needs. # case $(uname) in HP-UX) cfg2html_hpux.sh $* -0 -o/tmp;; ## 31.03.2005 14:50 Linux) cfg2html-linux $* -x -A;; ## 08.06.2006 *) echo "$0: Unsupported operating system!"; exit 2 ;; esac RETCODE=$? if [ $RETCODE -eq 0 ] then # Customize this to fit your needs! ######## mueller ############# # 16.03.2005, 09:49 modified by Ralph.Roth [ -x /usr/bin/xitd03wg ] && /usr/bin/xitd03wg /tmp/$(hostname)*{.err,.html,_xpinfo.txt} else echo "Error ($0): Returncode=$RETCODE" fi marionnet-0.90.6+bzr434.orig/uml/startup.old/marionnet_source_cmdline0000600000175000017500000000173412167200764024635 0ustar lucaslucas# This file is part of Marionnet, a virtual network laboratory # Copyright (C) 2007 Luca Saiu # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This should be executed with 'source', as it updates the shell # environment: # This should be executed with 'source', as it updates the shell # environment: cat /proc/cmdline | tr " " "\n" > /tmp/cmdline source /tmp/cmdline &> /dev/null rm /tmp/cmdline marionnet-0.90.6+bzr434.orig/uml/startup.old/DEPENDENCIES.dot0000600000175000017500000000066612167200764022204 0ustar lucaslucas digraph deps { "/etc/init.d/marionnet_prepare_shutdown" -> "/usr/sbin/marionnet_source_cmdline"; "/etc/init.d/marionnet_prepare_shutdown" -> "/usr/sbin/marionnet_grab_config"; "/etc/init.d/marionnet_prepare_startup" -> "/usr/sbin/marionnet_source_cmdline"; "/usr/sbin/marionnet_grab_config" -> "/usr/bin/cfg2html"; "/usr/bin/cfg2html" -> "/usr/bin/cfg2html-linux"; "marionnet-xterm-title.sh"; } marionnet-0.90.6+bzr434.orig/uml/startup.old/marionnet-xterm-title.sh0000700000175000017500000000101312167200764024436 0ustar lucaslucas#!/bin/bash # Author: Luca Saiu # Date: 2007 # Modified (minor changes) by Jean-Vincent Loddo (2013) # Licence GPL # Read the kernel command line variable 'hostname'; this crude hack is # needed because filesystems are mounted read-only at this stage. # The following command became something like: # export hostname=m1 export $(tr ' ' '\n' . echo -n "Marionnet startup configuration... " set -x function append_line_if_needed { local LINE="$1" local FILE="$2" { test -f "$FILE" && grep -q "^${LINE}$" "$FILE"; } || echo "$LINE" >> "$FILE" } ########################################### # Source-ing kernel command line # ########################################### # Read kernel command line variables into this shell's environment: # Expected variables: hostname hostfs ubd0s export $(tr /etc/hostname # The script `/etc/init.d/hostname.sh' belonged to the package `initscripts' # on old debian systems: [[ -x /etc/init.d/hostname.sh ]] && /etc/init.d/hostname.sh start &>/dev/null # Make a correct entry in /etc/hosts: append_line_if_needed "127.0.0.1 $hostname" /etc/hosts else echo "Warning: variable 'hostname' undefined" 1>&2 fi ########################################### # hostfs # ########################################### # Mount the hostfs filesystem and add bindings from the hostfs file # `boot_parameters' to this shell environment: if [[ -n $hostfs ]]; then mount none /mnt/hostfs -t hostfs -o $hostfs && # And also record it on the hostfs filesystem, so that we can # easily tell which guest machine the directory belongs to # *from the host*: [[ -n $hostname ]] && echo $hostname > /mnt/hostfs/GUESTNAME && source /mnt/hostfs/boot_parameters else echo "Warning: variable 'hostfs' undefined" 1>&2 fi ########################################### # xterm title # ########################################### # Show the hostname (and its filesystem) in the terminal window title bar if [[ -n $ubd0s ]]; then # Get the name of the virtual filesystem choosen by the user: virtualfs_name="${ubd0s##*/}" virtualfs_name=${virtualfs_name#router-} virtualfs_name=${virtualfs_name#machine-} echo -e '\033]0;'"$hostname ($virtualfs_name)"'\007' else echo "Warning: variable 'ubd0s' undefined" 1>&2 fi ########################################### # Network configurations # ########################################### # Perform an indirect lookup of the variable $1'_eth'$2, i.e. return # the value of the variable which is the value of the variable named # $1'_eth'$2. function lookup { echo $(eval echo '$'$1'_eth'$2) } # Configure network interfaces: if [[ -n $ethernet_interfaces_no ]]; then for i in $(eval echo {0..$((ethernet_interfaces_no-1))}); do mac_address=`lookup mac_address $i` mtu=`lookup mtu $i` ipv4_address=`lookup ipv4_address $i` ipv4_broadcast=`lookup ipv4_broadcast $i` ipv4_netmask=`lookup ipv4_netmask $i` ipv6_address=`lookup ipv6_address $i` [[ -z $mac_address ]] || ifconfig eth$i hw ether $mac_address [[ -z $mtu ]] || ifconfig eth$i mtu $mtu # IPv4 configuration. # The variable `ipv4_address' may be defined via the Marionnet GUI with the # CIDR notation, i.e. in the form x.y.z.t/N. However, in order to be # compatible with the busybox (buildroot) implementation of `ifconfig', # Marionnet extracts the address into x.y.z.t and sets `ipv4_address', # then it computes the corresponding netmask and sets `ipv4_netmask'. # So, the command executed here may have a form like: # ifconfig eth0 192.168.0.1 # or # ifconfig eth0 192.168.0.1 netmask 255.255.255.0 if [[ -n $ipv4_address ]]; then if [[ -n $ipv4_netmask ]]; then ifconfig eth$i $ipv4_address netmask $ipv4_netmask else ifconfig eth$i $ipv4_address fi fi # IPv6 configuration. # The variable `ipv6_address' may be defined via the Marionnet GUI with the # CIDR notation. So, the command executed here may have a form like: # ifconfig eth0 inet6 add 2003:abd::1/32 if [[ -n $ipv6_address ]]; then ifconfig eth$i inet6 add $ipv6_address fi done fi ########################################### # Ghost interface (eth42) # ########################################### # Activate and immediately ghostify our special network # interface communicating with the host: ifconfig eth42 $ip42 up &>/dev/null if type ghostify; then ghostify eth42; fi &>/dev/null ########################################### # /etc/fstab swap tuning # ########################################### # Add swap (the swap 'partition' was already created as a # sparse file and initialized with mkswap from the host side): append_line_if_needed \ "/dev/ubdb none swap sw 0 0" \ /etc/fstab swapon -a ########################################### # /etc/fstab swap tuning # ########################################### # TODO: think about the ssh tunnelling! if [ -z "$xnest_display_number" ]; then DISPLAY_VALUE=172.23.0.254:0 else DISPLAY_VALUE=172.23.0.254$xnest_display_number fi # Find a suitable shell configuration file and append the line setting the # variable DISPLAY: for i in /etc/profile /etc/bash.bashrc /root/.bash_profile /root/.bashrc; do if [[ -f $i ]]; then append_line_if_needed "export DISPLAY=$DISPLAY_VALUE" $i break; fi done echo "done." marionnet-0.90.6+bzr434.orig/uml/startup.old/LOCATIONS0000600000175000017500000000033712167200764021117 0ustar lucaslucas/usr/sbin/marionnet_grab_config /usr/sbin/marionnet_source_cmdline /etc/init.d/marionnet_prepare_startup /etc/init.d/marionnet_prepare_shutdown /etc/init.d/marionnet-xterm-title.sh /usr/bin/cfg2html /usr/bin/cfg2html-linux marionnet-0.90.6+bzr434.orig/Makefile.local0000600000175000017500000002044012167200764017313 0ustar lucaslucas# This -*- makefile -*- is part of Marionnet, a virtual network laboratory # Copyright (C) 2008, 2009 Luca Saiu # Copyright (C) 2010, 2013 Jean-Vincent Loddo # Copyright (C) 2008, 2009, 2010, 2013 Université Paris 13 # Updated in 2008 by Marco Stronati # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . COMPILE_OPTIONS += -g -w x DIRECTORIES_TO_INCLUDE = camlp4 threads lablgtk2 lablglade lablgtksourceview2 ocamlbricks LIBRARIES_TO_LINK = unix threads str lablgtk lablglade lablgtksourceview2 ocamlbricks C_OBJECTS_TO_LINK += OCAMLBRICKS=$(OCAML_LIBRARYPREFIX)/ocamlbricks PP_OPTION = camlp4of -I $(OCAMLBRICKS) gettext_extract_pot_p4.cmo option_extract_p4.cmo raise_p4.cmo log_module_loading_p4.cmo -I chip OBJECTS_TO_LINK = gtkThread BYTE_PROGRAMS = marionnet.byte chip_example.byte ROOT_BYTE_PROGRAMS = marionnet-daemon.byte native: marionnet.native marionnet-daemon.native byte: marionnet.byte marionnet-daemon.byte # To do: these should be enabled for release, but they take too long to # build every time... NATIVE_PROGRAMS = marionnet.native ROOT_NATIVE_PROGRAMS = marionnet-daemon.native ROOT_PROGRAMS = marionnet-daemon.byte marionnet-daemon.native OTHER_PROGRAMS_TO_INSTALL = # menu_factory.ml menu_factory.mli chip.ml are not documented because they # get ocamldoc (with -pp camlp4of) confused UNDOCUMENTED=version.ml gui.ml chip_example_expanded.ml chip_example.ml menu_factory.ml menu_factory.mli chip.ml # Before building the main targets we have to create the machine-generated # sources: MANUALLY_PRE_COPY_IN_build = \ gettext_extract_pot_p4.conf \ chip/chip_parser_p4.ml \ scripts/can-directory-host-sparse-files.sh MANUALLY_PRE_MAKE_IN_build = \ chip/chip_parser_p4.cmo \ chip/chip_example_expanded.ml MANUALLY_POST_MAKE_IN_build = chip/chip_example_expanded.byte chip/chip_example_expanded.mli marionnet.byte marionnet.native : manually_pre_actions version.ml gui.ml ########## Manually generated targets (not through ocamlbuild) _build/chip/chip_parser_p4.cmo: chip/chip_parser_p4.ml @ocamlc -c -I +camlp4 -pp camlp4of camlp4lib.cma -o $@ $< _build/chip/chip_example_expanded.ml : chip/chip_example.ml _build/chip/chip_parser_p4.cmo @camlp4of -I _build/chip/ -printer Camlp4OCamlRevisedPrinter chip_parser_p4.cmo -o $@ $< CHIP_CMDLINE=-custom -I _build/chip/ -I _build/gettext/ -I +threads unix.cma threads.cma str.cma \ -I +ocamlbricks ocamlbricks.cma meta.cmo log.cmo version.cmo configuration.cmo gettext.cmo initialization.cmo global_options.cmo chip.cmo _build/chip/chip_example_expanded.byte : _build/chip/chip_example_expanded.ml @ocamlc -thread -pp camlp4rf -I _build/ $(CHIP_CMDLINE) -o $@ $< _build/chip/chip_example_expanded.mli : _build/chip/chip_example_expanded.ml @ocamlc -i -thread -pp camlp4rf -I _build/ $(CHIP_CMDLINE) $< >$@ run: marionnet.byte (export WORKING=`pwd`; OCAMLRUNPARAM="b" $$WORKING/_build/marionnet.byte) | tee /tmp/LOG runexam: marionnet.byte (export WORKING=`pwd`; OCAMLRUNPARAM="b" $$WORKING/_build/marionnet.byte --exam) | tee /tmp/LOG runopt: marionnet.native (export WORKING=`pwd`; $$WORKING/_build/marionnet.native) | tee /tmp/LOG run-daemon: marionnet-daemon.byte sudo _build/marionnet-daemon.byte # version.ml is automatically generated: version.ml: VERSION BUILD-TIME @(echo -e "(* This file is automatically generated. Please don't edit it. *)" > $@; \ echo -e "" >> $@; \ echo -en "let version = \"" >> $@; \ for x in `cat VERSION`; do echo -n "$$x" >> $@; done; \ echo -e "\";;" >> $@; \ echo -en "let build_time = \"" >> $@; \ for x in `cat BUILD-TIME`; do echo -n "$$x " >> $@; done; \ echo -e "\";;" >> $@) VERSION: META @($(call READ_META, name, version); \ echo "$$version" > $@) BUILD-TIME: @(echo 'built in '`date +"%B %Y"` > $@) # We need to patch the file generated by Glade, so that image pathnames # follow our conventions: share/gui.glade.patched: gui/gui.xml @(cat gui/gui.xml | \ sed s/name=\"pixbuf\"\>/name=\"pixbuf\"\>images\\//g | \ sed s/name=\"icon\"\>/name=\"icon\"\>images\\//g > $@) # This is the name of the Glade->OCaml code generator: GLADE2ML = lablgladecc2 # gui.ml is automatically generated from the patched Glade file: gui.ml: share/gui.glade.patched @(cd share; $(GLADE2ML) gui.glade.patched > ../$@) gui-help: gui.ml ocamlc -i -I +lablgtk2 lablgtk.cma gui.ml | grep -v "val" | grep -v "[0-9]" # Clean all the automatically-generated sources: clean-local: clean-mo clean-doc @(rm -f VERSION BUILD-TIME version.ml; \ rm -f share/gui.glade.patched gui.ml) # ==============gettext stuff============= install-data-local: copy-failsafe-marionnet.conf install-local: install-mo uninstall-local: uninstall-mo copy-failsafe-marionnet.conf: cp etc/marionnet.conf share/ _build/marionnet.pot: marionnet.byte @msgcat -s --use-first $(shell find _build/ -name "*.ml.pot") > $@ pot: _build/marionnet.pot cp _build/marionnet.pot po/messages.pot main-local: pot # Useful to discover widgets containing translatable strings gui.po: gui/gui.xml xml2po $< > /tmp/$@ @echo "Generated file: /tmp/$@" # We can take the list of supported languages from po/LINGUAS. # Notice that this macro is always invoked from the po/ subdirectory: LANGUAGES = $$( grep -v ^\#.*$$ LINGUAS ) compile-mo: @(cd po/; \ for i in $(call LANGUAGES); \ do (msgfmt $$i.po && mv messages.mo $$i.mo || exit -1) && \ echo "Compiled "$$i.mo; \ done;) update-po: pot @(cd po/; \ for i in $(call LANGUAGES); \ do (msgmerge --no-fuzzy-matching -s --update $$i.po messages.pot || exit -1) && \ echo "Updated "$$i.po; \ done;) install-mo: compile-mo @($(call READ_CONFIG,localeprefix); \ cd po/; \ for i in $(call LANGUAGES); \ do ((mkdir -p $$localeprefix/$$i/LC_MESSAGES && cp $$i.mo $$localeprefix/$$i/LC_MESSAGES/marionnet.mo) || exit -1) && \ echo "Installed "$$i; \ done;) clean-mo: @(cd po/; \ rm -rf *.mo *~ ;) uninstall-mo: @($(call READ_CONFIG,localeprefix); \ for i in $(call LANGUAGES); \ do rm -f $$localeprefix/$$i/LC_MESSAGES/marionnet.mo; \ echo "Uninstalled "$$i; \ done;) ######### documentation ############## #build texinfo developer documentation in one default format documentation-local: documentation-html-no-split #build texinfo developer documentation in one all formats documentation-all: documentation-pdf documentation-html-split documentation-html-no-split #multi page html output #the makeinfo command need to be executed in the same directory as img, otherwise it doesn't find any image documentation-html-split: @(cd doc-src; \ makeinfo --html --force --no-validate \ documentation.texi -o ../doc/documentation/; \ cp -r img/ ../doc/documentation/; \ cd ..;) #one page html output documentation-html-no-split: @(cd doc-src; \ makeinfo --html --force --no-validate --no-split \ documentation.texi -o ../doc/documentation.html; \ cp -r img/ ../doc/; \ cd ..;) #pdf output documentation-pdf: @(cd doc-src; \ texi2dvi --pdf -E --build=local \ documentation.texi -o ../doc/documentation.pdf; \ rm -f documentation.aux documentation.cp documentation.cps \ documentation.fn documentation.ky documentation.log \ documentation.pg documentation.toc documentation.tp \ documentation.vr;) clean-doc: @(rm -rf doc/* ) #convert and resize images from ps and eps to png images: dot @(mkdir doc/img; \ cp doc-src/img/*.png doc/img/; \ for i in $$(ls doc-src/img-src/*{ps,eps}); \ do convert $$i doc/img/$$(basename $${i%.*}.png); \ done) # #compile dot sources dot: @(for i in $$(ls doc-src/img-src/*.dot); \ do dot -Tsvg $$i -o doc-src/img-src/$$(basename $$i .dot).svg; \ convert -geometry 300x300 -density 150 -antialias doc-src/img-src/$$(basename $$i .dot).svg \ doc-src/img/$$(basename $$i .dot).png; \ done; \ #rm doc-src/img-src/*.svg \ ) marionnet-0.90.6+bzr434.orig/treeview_documents.ml0000600000175000017500000002733012167200764021034 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008, 2009 Luca Saiu Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (* Authors: * - Luca Saiu: initial version * - Jean-Vincent Loddo: Unix.system calls replaced by UnixExtra's functions calls, and some other minor changes *) open Gettext;; module Row_item = Treeview.Row_item ;; class t = fun ~packing ~after_user_edit_callback () -> object(self) inherit Treeview.t ~packing ~hide_reserved_fields:true () as super val icon_header = "Icon" method get_row_icon = self#get_Icon_field (icon_header) method set_row_icon = self#set_Icon_field (icon_header) val title_header = "Title" method get_row_title = self#get_String_field (title_header) method set_row_title = self#set_String_field (title_header) val author_header = "Author" method get_row_author = self#get_String_field (author_header) method set_row_author = self#set_String_field (author_header) val type_header = "Type" method get_row_type = self#get_String_field (type_header) method set_row_type = self#set_String_field (type_header) val comment_header = "Comment" method get_row_comment = self#get_String_field (comment_header) method set_row_comment = self#set_String_field (comment_header) val filename_header = "FileName" method get_row_filename = self#get_String_field (filename_header) method set_row_filename = self#set_String_field (filename_header) val format_header = "Format" method get_row_format = self#get_String_field (format_header) method set_row_format = self#set_String_field (format_header) (** Display the document at the given row, in an asynchronous process: *) method private display row_id = let frmt = self#get_row_format (row_id) in let reader = self#format_to_reader frmt in let file_name = self#get_row_filename row_id in let command_line = Printf.sprintf "%s '%s/%s'&" reader (Option.extract directory#get) file_name in (* Here ~force:true would be useless, because of '&' (the shell well exit in any case). *) Log.system_or_ignore command_line val error_message = (s_ "You should select an existing document in PDF, Postscript, DVI, HTML or text format.") (** Ask the user to choose a file, and return its pathname. Fail if the user doesn't choose a file or cancels: *) method private ask_file = let dialog = GWindow.file_chooser_dialog ~icon:Icon.icon_pixbuf ~action:`OPEN ~title:((*utf8*)(s_ "Choose the document to import")) ~modal:true () in dialog#add_button_stock `CANCEL `CANCEL; dialog#add_button_stock `OK `OK; dialog#unselect_all; dialog#add_filter (GFile.filter ~name:(s_ "Texts (PDF, PostScript, DVI, HTML, text)") ~patterns:["*.pdf"; "*.ps"; "*.dvi"; "*.text"; "*.txt"; "*.html"; "*.htm"; "README"; (s_ "README") (* it's nice to also support something like LISEZMOI... *)] ()); dialog#set_default_response `OK; (match dialog#run () with `OK -> (match dialog#filename with Some result -> dialog#destroy (); Log.printf "* Ok: \"%s\"\n" result; flush_all (); result | None -> begin dialog#destroy (); failwith "No document was selected" end) | _ -> dialog#destroy (); Log.printf "* Cancel\n"; flush_all (); failwith "You cancelled"); method private file_to_format pathname = if Filename.check_suffix pathname ".html" or Filename.check_suffix pathname ".htm" or Filename.check_suffix pathname ".HTML" or Filename.check_suffix pathname ".HTM" then "html" else if Filename.check_suffix pathname ".text" or Filename.check_suffix pathname ".txt" or Filename.check_suffix pathname "readme" or Filename.check_suffix pathname "lisezmoi" or Filename.check_suffix pathname ".TEXT" or Filename.check_suffix pathname ".TXT" or Filename.check_suffix pathname "README" or Filename.check_suffix pathname "LISEZMOI" then "text" else if Filename.check_suffix pathname ".ps" or Filename.check_suffix pathname ".eps" or Filename.check_suffix pathname ".PS" or Filename.check_suffix pathname ".EPS" then "ps" else if Filename.check_suffix pathname ".dvi" or Filename.check_suffix pathname ".DVI" then "dvi" else if Filename.check_suffix pathname ".pdf" or Filename.check_suffix pathname ".PDF" then "pdf" else failwith ("I cannot recognize the file type of " ^ pathname); method private format_to_reader format = match format with | "pdf" -> Configuration.extract_string_variable_or ~default:"evince" "MARIONNET_PDF_READER" | "ps" -> Configuration.extract_string_variable_or ~default:"evince" "MARIONNET_POSTSCRIPT_READER" | "dvi" -> Configuration.extract_string_variable_or ~default:"evince" "MARIONNET_DVI_READER" (* 'file' may recognize (X)HTML as XML... *) | "html" -> Configuration.extract_string_variable_or ~default:"galeon" "MARIONNET_HTML_READER" | "text" -> Configuration.extract_string_variable_or ~default:"emacs" "MARIONNET_TEXT_EDITOR" (* the file type in unknown: web browsers can open most everything... *) | "auto" -> Configuration.extract_string_variable_or ~default:"galeon" "MARIONNET_HTML_READER" | _ -> failwith ("The format \"" ^ format ^ "\" is not supported"); (** Import the given file, copying it into the appropriate directory with a fresh name; return the fresh name (just the file name, not a complete pathname) and the name of an application suitable to read it, as a pair. In case of failure show an error message and raise an exception. If ~move is true then the file is moved instead of copied. *) method private import_file ?(move=false) pathname = try let file_format = self#file_to_format pathname in let parent = Option.extract directory#get in let fresh_pathname = UnixExtra.temp_file ~parent ~prefix:"document-" () in let fresh_name = Filename.basename fresh_pathname in let result = (fresh_name, file_format) in (try (match move with | false -> UnixExtra.file_copy pathname fresh_pathname | true -> UnixExtra.file_move pathname fresh_pathname ); UnixExtra.set_perm ~a:() ~w:false fresh_pathname; Log.Command.ll fresh_pathname; result with Unix.Unix_error (_,_, _) -> begin UnixExtra.apply_ignoring_Unix_error Unix.unlink fresh_pathname; let title = Printf.sprintf "Failed copying the file \n\"%s\"\n" pathname in failwith title; end) with (Failure title) as e -> begin Simple_dialogs.error title error_message (); raise e (* Re-raise *) end method import_report ~machine_or_router_name ~pathname () = let title = (s_ "Report on ") ^ machine_or_router_name in let row_id = self#import_document ~move:true pathname in self#set_row_title row_id title; self#set_row_author row_id "-"; self#set_row_type row_id (s_ "Report"); self#set_row_comment row_id ((s_ "created on ") ^ (UnixExtra.date ~dot:" " ())); method import_history ~machine_or_router_name ~pathname () = let title = (s_ "History of ") ^ machine_or_router_name in let row_id = self#import_document ~move:true pathname in self#set_row_title row_id title; self#set_row_author row_id "-"; self#set_row_type row_id (s_ "History"); self#set_row_comment row_id ((s_ "created on ") ^ (UnixExtra.date ~dot:" " ())); method import_document ?(move=false) user_path_name = let internal_file_name, format = self#import_file user_path_name in let row_id = self#add_row [ filename_header, Row_item.String internal_file_name; format_header, Row_item.String format ] in row_id initializer let _ = self#add_icon_column ~header:icon_header ~shown_header:(s_ "Icon") ~strings_and_pixbufs:[ "text", Initialization.Path.images^"treeview-icons/text.xpm"; ] ~default:(fun () -> Row_item.Icon "text") () in let _ = self#add_editable_string_column ~header:title_header ~shown_header:(s_ "Title") ~italic:true ~default:(fun () -> Row_item.String "Please edit this") () in let _ = self#add_editable_string_column ~header:author_header ~shown_header:(s_ "Author") ~italic:false ~default:(fun () -> Row_item.String "Please edit this") () in let _ = self#add_editable_string_column ~header:type_header ~shown_header:(s_ "Type") ~italic:false ~default:(fun () -> Row_item.String "Please edit this") () in let _ = self#add_editable_string_column ~shown_header:(s_ "Comment") ~header:"Comment" ~italic:true ~default:(fun () -> Row_item.String "Please edit this") () in let _ = self#add_string_column ~header:"FileName" ~hidden:true () in let _ = self#add_string_column ~header:"Format" ~default:(fun () -> Row_item.String "auto") (* unknown format; this is usefule for backward-compatibility, as this column didn't exist in older Marionnet versions *) ~hidden:true () in (* Make internal data structures: no more columns can be added now: *) self#create_store_and_view; (* Setup the contextual menu: *) self#set_contextual_menu_title "Texts operations"; self#add_menu_item (s_ "Import a document") (fun _ -> true) (fun _ -> ignore (self#import_document self#ask_file)); self#add_menu_item (s_ "Display this document") Option.to_bool (fun selected_rowid_if_any -> let row_id = Option.extract selected_rowid_if_any in self#display row_id); self#set_double_click_on_row_callback (fun row_id -> self#display row_id); self#add_menu_item (s_ "Remove this document") Option.to_bool (fun selected_rowid_if_any -> let row_id = Option.extract selected_rowid_if_any in let file_name = (self#get_row_filename row_id) in let pathname = Printf.sprintf "%s/%s" (Option.extract directory#get) file_name in UnixExtra.apply_ignoring_Unix_error Unix.unlink pathname; self#remove_row row_id; ); (* J.V. *) self#set_after_update_callback after_user_edit_callback; end;; class treeview = t module The_unique_treeview = Stateful_modules.Variable (struct type t = treeview let name = Some "treeview_documents" end) let extract = The_unique_treeview.extract let make ~(window:GWindow.window) ~(hbox:GPack.box) ~after_user_edit_callback () = let result = new t ~packing:(hbox#add) ~after_user_edit_callback () in let () = Treeview.add_expand_and_collapse_button ~window ~hbox (result:>Treeview.t) in The_unique_treeview.set result; result ;; marionnet-0.90.6+bzr434.orig/configure0000600000175000017500000000222512167200764016467 0ustar lucaslucas#!/bin/sh # This file is part of our build system for OCaml projects # Copyright (C) 2008 Luca Saiu # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # To do: this should be copied to buildsystem/ echo "Sorry, there is no automatic configuration system, as of now." echo if [ -e etc ]; then echo "Now please edit the \"CONFIGME\" file and the files in etc/, using" echo "your favorite text editor." else echo "Now please edit the \"CONFIGME\" file, using your favorite text editor." fi # Exit with failure: it should be evident that the configuration is not # automatic: exit -1 marionnet-0.90.6+bzr434.orig/daemon_parameters.ml0000600000175000017500000000325612167200764020610 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2008 Luca Saiu Copyright (C) 2008 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** The number of seconds which must elapse from the last keepalive for the server to destroy all the resources of a client: *) let timeout_interval = 120.0;; assert (timeout_interval > 0.0);; let select_timeout = timeout_interval;; assert (select_timeout > 0.0);; (** The number of seconds which should elapse between successive keepalives from the same client. It's safer to make this considerably smaller than timeout_interval, so that the client can send messages at a reasonable frequency even when under load, without its resources being destroyed: *) let inter_keepalive_interval = timeout_interval /. 5.0;; let socket_name = let default = "/tmp/my-marionnet-daemon-socket" in Configuration.extract_string_variable_or ~default "MARIONNET_SOCKET_NAME";; (** How often we should print information about the currently allocated resources: *) let debug_interval = timeout_interval /. 2.0;; marionnet-0.90.6+bzr434.orig/treeview_ifconfig.ml0000600000175000017500000004260112167200764020615 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext;; module Row_item = Treeview.Row_item ;; module Row = Treeview.Row ;; type port_row_completions = (string * (string * Row_item.t) list) list class t = fun ~packing ~after_user_edit_callback () -> object(self) inherit Treeview.treeview_with_a_primary_key_Name_column ~packing ~hide_reserved_fields:true () as super val uneditable_header = "_uneditable" method get_row_uneditable = self#get_CheckBox_field (uneditable_header) val type_header = "Type" method get_row_type = self#get_Icon_field (type_header) method set_row_type = self#set_Icon_field (type_header) val mac_address_header = "MAC address" method get_row_mac_address = self#get_String_field (mac_address_header) method set_row_mac_address = self#set_String_field (mac_address_header) val mtu_header = "MTU" method get_row_mtu = self#get_String_field (mtu_header) method set_row_mtu = self#set_String_field (mtu_header) val ipv4_address_header = "IPv4 address" method get_row_ipv4_address = self#get_String_field (ipv4_address_header) method set_row_ipv4_address = self#set_String_field (ipv4_address_header) val ipv4_broadcast_header = "IPv4 broadcast" method get_row_ipv4_broadcast = self#get_String_field (ipv4_broadcast_header) method set_row_ipv4_broadcast = self#set_String_field (ipv4_broadcast_header) val ipv4_netmask_header = "IPv4 netmask" method get_row_ipv4_netmask = self#get_String_field (ipv4_netmask_header) method set_row_ipv4_netmask = self#set_String_field (ipv4_netmask_header) val ipv6_address_header = "IPv6 address" method get_row_ipv6_address = self#get_String_field (ipv6_address_header) method set_row_ipv6_address = self#set_String_field (ipv6_address_header) method private currently_used_mac_addresses : string list = let xs = List.flatten (Forest.to_list self#get_forest) in let xs = ListExtra.filter_map (function | header, (Row_item.String s) when header=mac_address_header -> Some s | _ -> None ) xs in (List.tl xs) (* Discard the first line (header) *) (** The three leftmost octects are used as the trailing part of automatically-generated MAC addresses. Interesting side note: we can't use four because of OCaml runtime type tagging (yes, Jean: I was also surprised when I discovered it, but it was made that way to support precise GC, which can't rely on conservative pointer finding). *) method private generate_mac_address = let b0 = Random.int 256 in let b1 = Random.int 256 in let b2 = Random.int 256 in let result = Printf.sprintf "02:04:06:%02x:%02x:%02x" b2 b1 b0 in (* Try again if we generated an invalid or already allocated address: *) if not (List.mem result self#currently_used_mac_addresses) then begin Log.printf "Generated MAC address: %s\n" result; result end else begin Log.printf "Generated MAC address: %s already in use!\n" result; self#generate_mac_address end (** This follows exactly the same logic as automatic MAC address generation. Two octects are used for a B class network: *) val next_ipv4_address_as_int = ref 1 method private generate_ipv4_address = let ipv4_address_as_int = !next_ipv4_address_as_int in next_ipv4_address_as_int := ipv4_address_as_int + 1; let result = Printf.sprintf "10.10.%i.%i" (ipv4_address_as_int / 256) (ipv4_address_as_int mod 256) in (* Try again if we generated an invalid address: *) if Ipv4.String.is_valid_ipv4 result then result else self#generate_ipv4_address (** This follows exactly the same logic as automatic MAC address generation. Two octects are used for a B class network: *) val next_ipv6_address_as_int = ref Int64.one method private generate_ipv6_address = let ipv6_address_as_int = !next_ipv6_address_as_int in next_ipv6_address_as_int := Int64.succ ipv6_address_as_int; let result = Printf.sprintf "42::%04x:%04x" (Int64.to_int (Int64.div ipv6_address_as_int (Int64.of_int (256 * 256)))) (Int64.to_int (Int64.rem ipv6_address_as_int (Int64.of_int (256 * 256)))) in (* Try again if we generated an invalid address: *) if self#is_a_valid_ipv6_address result then result else self#generate_ipv6_address method add_device ?port_row_completions device_name device_type port_no = let row_id = self#add_row [ name_header, Row_item.String device_name; type_header, Row_item.Icon device_type; uneditable_header, Row_item.CheckBox true; mtu_header, Row_item.String ""; mac_address_header, Row_item.String ""; ipv4_address_header, Row_item.String ""; ipv4_netmask_header, Row_item.String ""; ipv4_broadcast_header, Row_item.String ""; ipv6_address_header, Row_item.String ""; ] in self#update_port_no ?port_row_completions device_name port_no; self#collapse_row row_id; method port_no_of ~device_name = self#children_no_of ~parent_name:device_name method private add_port ?port_row_completions device_name = let device_row_id = self#unique_row_id_of_name device_name in let current_port_no = self#port_no_of device_name in let port_type = match self#get_row_type (device_row_id) with | "machine" | "world_bridge" -> "machine-port" | "gateway" (* retro-compatibility *) -> "machine-port" | "router" -> "router-port" | _ -> "other-device-port" in let port_prefix = match self#get_row_type (device_row_id) with "machine" | "world_bridge" -> "eth" | "gateway" (* retro-compatibility *) -> "eth" | _ -> "port" in let port_name = (Printf.sprintf "%s%i" port_prefix current_port_no) in let port_row_standard = [ name_header, Row_item.String port_name; type_header, Row_item.Icon port_type; ] in let port_row = match port_row_completions with | None -> port_row_standard | Some lst -> (try let port_row_specific_settings = (List.assoc port_name lst) in List.append (port_row_standard) (port_row_specific_settings) with Not_found -> port_row_standard) in ignore (self#add_row ~parent_row_id:device_row_id port_row) method update_port_no ?port_row_completions device_name new_port_no = let add_child_of = self#add_port ?port_row_completions in self#update_children_no ~add_child_of ~parent_name:device_name new_port_no (* To do: these validation methods suck. *) method private is_a_valid_mac_address address = try Scanf.sscanf address "%x:%x:%x:%x:%x:%x" (fun _ _ _ _ _ _ -> Scanf.sscanf address "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c" (fun _ _ _ _ _ _ _ _ _ _ _ _ -> true)) with _ -> false (* TODO: FIX IT: the validity depends on the ip and netmask (broadcast must belong the network addresses range). *) method private is_a_valid_ipv4_broadcast x = (* self#is_a_valid_ipv4_address x*) Ipv4.String.is_valid_ipv4 x method private is_a_valid_ipv6_address address = true (* This heuristic sucked *too* much. It's better to just accept everything. *) (*try Scanf.sscanf address "%x:%x:%x:%x:%x:%x:%x:%x" (fun o1 o2 o3 o4 o5 o6 o7 o8 -> o1 < 65536 && o2 < 65536 && o3 < 65536 && o4 < 65536 && o5 < 65536 && o6 < 65536 && o7 < 65536 && o8 < 65536) with _ -> false *) method private is_a_valid_ipv6_netmask x = self#is_a_valid_ipv6_address x method private is_a_valid_ipv6_broadcast x = self#is_a_valid_ipv6_address x method private is_a_valid_mtu x = if x = "" then true else try (int_of_string x) >= 0 && (int_of_string x) < 65537 with _ -> false method get_port_data ~device_name ~port_name = self#get_row_of_child ~parent_name:device_name ~child_name:port_name (** Return all the non-reserved data of a given port *index* (for example 2 stands for "eth2" or "port2", in our usual alist format: *) (* TODO: remove it *) method get_port_data_by_index ~device_name ~port_index = (* First try with the "eth" prefix: *) let port_name = Printf.sprintf "eth%i" port_index in try self#get_port_data device_name port_name with _ -> (* We failed. Ok, now try with the "port" prefix, before bailing out: *) let port_name = Printf.sprintf "port%i" port_index in self#get_port_data ~device_name ~port_name (** Return a single port attribute as an item: *) method get_port_attribute ~device_name ~port_name ~field = let row = (self#get_port_data ~device_name ~port_name) in (Row.String_field.get ~field row) (** Return a single port attribute as an item: *) (* TODO: remove it and remove also get_port_data_by_index *) method get_port_attribute_by_index ~device_name ~port_index ~field = let row = (self#get_port_data_by_index ~device_name ~port_index) in (Row.String_field.get ~field row) (** Update a single port attribute: *) method set_port_attribute_by_index ~device_name ~port_index ~field value = let port_name = Printf.sprintf "port%i" port_index in let row = self#get_complete_row_of_child ~parent_name:device_name ~child_name:port_name in let row_id = Row.get_id row in self#set_row_field row_id field value; (** Update a single port attribute of type string: *) method set_port_string_attribute_by_index ~device_name ~port_index ~field value = self#set_port_attribute_by_index ~device_name ~port_index ~field (Row_item.String value) (** Clear the interface and set the full internal state back to its initial value: *) method clear = super#clear; next_ipv4_address_as_int := 1; next_ipv6_address_as_int := Int64.one val counters_marshaler = new Oomarshal.marshaller method save ?with_forest_treatment () = (* Save the forest, as usual: *) super#save ?with_forest_treatment (); (* ...but also save the counters used for generating fresh addresses: *) let counters_file_name = (Option.extract filename#get)^"-counters" in (* For forward compatibility: *) let _OBSOLETE_mac_address_as_int = Random.int (256*256*256) in counters_marshaler#to_file (_OBSOLETE_mac_address_as_int, !next_ipv4_address_as_int, !next_ipv6_address_as_int) counters_file_name; method load = (* Load the forest, as usual: *) super#load; (* ...but also load the counters used for generating fresh addresses: *) let counters_file_name = (Option.extract filename#get)^"-counters" in (* _OBSOLETE_mac_address_as_int read for backward compatibility: *) let _OBSOLETE_mac_address_as_int, the_next_ipv4_address_as_int, the_next_ipv6_address_as_int = counters_marshaler#from_file counters_file_name in next_ipv4_address_as_int := the_next_ipv4_address_as_int; next_ipv6_address_as_int := the_next_ipv6_address_as_int initializer let _ = self#add_checkbox_column ~header:uneditable_header ~hidden:true ~default:(fun () -> Row_item.CheckBox false) () in let _ = self#add_icon_column ~header:type_header ~shown_header:(s_ "Type") ~strings_and_pixbufs:[ "machine", Initialization.Path.images^"treeview-icons/machine.xpm"; "router", Initialization.Path.images^"treeview-icons/router.xpm"; "machine-port", Initialization.Path.images^"treeview-icons/network-card.xpm"; "router-port", Initialization.Path.images^"treeview-icons/port.xpm"; "other-device-port", Initialization.Path.images^"treeview-icons/port.xpm"; ] () in let _ = self#add_editable_string_column ~header:mac_address_header ~shown_header:(s_ "MAC address") ~default:(fun () -> Row_item.String self#generate_mac_address) ~constraint_predicate:(fun i -> let s = Row_item.extract_String i in (self#is_a_valid_mac_address s) or s = "") () in let _ = self#add_editable_string_column ~header:mtu_header ~default:(fun () -> Row_item.String "1500") ~constraint_predicate:(fun i -> let s = Row_item.extract_String i in (self#is_a_valid_mtu s) or s = "") () in let _ = self#add_editable_string_column ~header:ipv4_address_header ~shown_header:(s_ "IPv4 address") ~default:(fun () -> if Global_options.get_autogenerate_ip_addresses () then Row_item.String self#generate_ipv4_address else Row_item.String "") ~constraint_predicate:(fun i -> let s = Row_item.extract_String i in (Ipv4.String.is_valid_ipv4 s) or s = "") () in let _ = self#add_editable_string_column ~header:ipv4_broadcast_header ~shown_header:(s_ "IPv4 broadcast") ~default:(fun () -> if Global_options.get_autogenerate_ip_addresses () then Row_item.String "10.10.255.255" else Row_item.String "") ~constraint_predicate:(fun i -> let s = Row_item.extract_String i in (self#is_a_valid_ipv4_broadcast s) or s = "") () in let _ = self#add_editable_string_column ~header:ipv4_netmask_header ~shown_header:(s_ "IPv4 netmask") ~default:(fun () -> if Global_options.get_autogenerate_ip_addresses () then Row_item.String "255.255.0.0" else Row_item.String "") ~constraint_predicate:(fun i -> let s = Row_item.extract_String i in (Ipv4.String.is_valid_netmask s) or s = "") () in let _ = self#add_editable_string_column ~header:ipv6_address_header ~shown_header:(s_ "IPv6 address") ~default:(fun () -> if Global_options.get_autogenerate_ip_addresses () then Row_item.String self#generate_ipv6_address else Row_item.String "") ~constraint_predicate:(fun i -> let s = Row_item.extract_String i in (self#is_a_valid_ipv6_address s) or s = "") () in self#add_row_constraint ~name:(s_ "you should choose a port to define this parameter") (fun row -> let uneditable = Row.CheckBox_field.get ~field:uneditable_header row in (not uneditable) or (List.for_all (fun (name, value) -> name = name_header or name = type_header or name = uneditable_header or self#is_column_reserved name or value = Row_item.String "") row)); self#add_row_constraint ~name:(s_ "the router first port must always have a valid configuration address") (fun row -> let port_name = (Row.get_name row) in let port_type = (Row.Icon_field.get ~field:type_header row) in let address = (Row.String_field.get ~field:ipv4_address_header row) in let netmask = (Row.String_field.get ~field:ipv4_netmask_header row) in (port_name <> "port0") or (port_type <> "router-port") or ((address <> "") && (netmask <> ""))); (* In this treeview the involved device is the parent: *) self#set_after_update_callback (fun row_id -> after_user_edit_callback (self#get_row_parent_name row_id)); (* Make internal data structures: no more columns can be added now: *) self#create_store_and_view; (* Setup the contextual menu: *) self#set_contextual_menu_title "Network interface's configuration"; end;; (** Ugly kludge to make a single global instance visible from all modules linked *after* this one. Not having mutually-recursive inter-compilation-unit modules is a real pain. *) class treeview = t module The_unique_treeview = Stateful_modules.Variable (struct type t = treeview let name = Some "treeview_ifconfig" end) let extract = The_unique_treeview.extract let make ~(window:GWindow.window) ~(hbox:GPack.box) ~after_user_edit_callback () = let result = new t ~packing:(hbox#add) ~after_user_edit_callback () in let () = Treeview.add_expand_and_collapse_button ~window ~hbox (result:>Treeview.t) in The_unique_treeview.set result; result ;; marionnet-0.90.6+bzr434.orig/cable.ml0000600000175000017500000010351312167200764016165 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** "Cable" component implementation. *) #load "where_p4.cmo" ;; open Gettext module Recursive_mutex = MutexExtra.Recursive (* The type of data exchanged with the dialog: *) module Data = struct type t = { name : string; label : string; left_user_endpoint : string * string; right_user_endpoint : string * string; old_name : string; } let to_string t = "" (* TODO? *) end (* Data *) module Make_menus (Params : sig val st : State.globalState val packing : [ `toolbar of GButton.toolbar | `menu_parent of Menu_factory.menu_parent ] end) (Cablekind : sig val crossover:bool end) = struct open Params open Cablekind module Toolbar_entry = struct let imagefile = match crossover with | false -> "ico.cable.direct.palette.png" | true -> "ico.cable.crossed.palette.png" let tooltip = match crossover with | false -> (s_ "Straight cable") | true -> (s_ "Crossover cable") let packing = Params.packing end (* Toolbar_entry *) module Add = struct include Data let key = match crossover with | false -> Some GdkKeysyms._D | true -> Some GdkKeysyms._C let ok_callback t = Gui_bricks.Ok_callback.check_name t.name t.old_name st#network#name_exists t let dialog () = let (name, title) = match crossover with | false -> (st#network#suggestedName "d" , (s_ "Add straight cable")) | true -> (st#network#suggestedName "c" , (s_ "Add crossover cable")) in Dialog_add_or_update.make ~network:st#network ~title ~name ~crossover ~ok_callback () let reaction (r:Data.t) = let action () = ignore (new User_level_cable.cable ~network:st#network ~crossover ~name:r.name ~label:r.label ~left_user_endpoint:r.left_user_endpoint ~right_user_endpoint:r.right_user_endpoint ()) in st#network_change action (); end module Properties = struct include Data let dynlist () = match crossover with | false -> st#network#get_direct_cable_names | true -> st#network#get_crossover_cable_names let dialog name () = let c = (st#network#get_cable_by_name name) in let c = ((Obj.magic c):> User_level_cable.cable) in let title = match crossover with | false -> ((s_ "Modify straight cable")^" "^name) | true -> ((s_ "Modify crossover cable")^" "^name) in let label = c#get_label in let left_user_endpoint = (c#get_left#node#get_name, c#get_left#user_port_name) in let right_user_endpoint = (c#get_right#node#get_name, c#get_right#user_port_name) in Log.printf "Calling Dialog_add_or_update with (%s,%s) (%s,%s)\n" c#get_left#node#get_name c#get_left#user_port_name c#get_right#node#get_name c#get_right#user_port_name ; Dialog_add_or_update.make ~network:st#network ~title ~name ~label ~left_user_endpoint ~right_user_endpoint ~crossover ~ok_callback:Add.ok_callback () let reaction r = let c = (st#network#get_cable_by_name r.old_name) in let c = ((Obj.magic c):> User_level_cable.cable) in (* Make a new cable; it should have a different identity from the old one, and it's important that it's initialized anew, to get the reference counter right: *) c#destroy; Add.reaction r; end module Remove = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist = Properties.dynlist let dialog name () = let question = match crossover with | false -> Printf.sprintf (f_ "Are you sure that you want to remove the straight cable %s?") name | true -> Printf.sprintf (f_ "Are you sure that you want to remove the crossover cable %s?") name in Gui_bricks.Dialog.yes_or_cancel_question ~title:(s_ "Remove") ~markup:question ~context:name () let reaction name = let c = (st#network#get_cable_by_name name) in let c = ((Obj.magic c):> User_level_cable.cable) in let action () = c#destroy in st#network_change action (); end module Disconnect = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist () = List.filter (fun x -> (st#network#get_cable_by_name x)#can_suspend) (Properties.dynlist ()) let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_cable_by_name name)#suspend end module Reconnect = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist () = List.filter (fun x -> (st#network#get_cable_by_name x)#can_resume) (Properties.dynlist ()) let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_cable_by_name name)#resume end module Create_entries = Gui_toolbar_COMPONENTS_layouts.Layout_for_network_edge (Params) (Toolbar_entry) (Add) (Properties) (Remove) (Disconnect) (Reconnect) (* Subscribe this kind of component to the network club: *) st#network#subscribe_a_try_to_add_procedure Eval_forest_child.try_to_add_cable; end (*-----*) WHERE (*-----*) module Dialog_add_or_update = struct let make ~(network:User_level.network) ?(title="Add cable") ?(name="") ?label ?(left_user_endpoint: (string * string) option) ?(right_user_endpoint: (string * string) option) ?(crossover=false) ?(help_callback=help_callback ~crossover) (* defined backward with "WHERE" *) ?(ok_callback=(fun data -> Some data)) () :'result option = let dialog_image_file = Filename.concat Initialization.Path.images (match crossover with | false -> "ico.cable.direct.dialog.png" | true -> "ico.cable.crossed.dialog.png") in let link_image_file = Filename.concat Initialization.Path.images (match crossover with | false -> "ico.cable.direct.dialog.link.png" | true -> "ico.cable.crossed.dialog.link.png") in let image_tooltip = match crossover with | false -> (s_ "Straight cable") | true -> (s_ "Crossover cable") in let name_tooltip = match crossover with | false -> (s_ "Straight cable name. This name must be unique in the virtual network. Suggested: d1, d2, ... ") | true -> (s_ "Crossover cable name. This name must be unique in the virtual network. Suggested: c1, c2, ... ") in let old_name = name in let (w,_,name,label) = Gui_bricks.Dialog_add_or_update.make_window_image_name_and_label ~title ~image_file:dialog_image_file ~image_tooltip ~name ~name_tooltip ?label () in let cable_input_widget = let vbox = GPack.vbox ~homogeneous:false ~border_width:20 ~spacing:10 ~packing:w#vbox#add () in let table = GPack.table ~rows:3 ~columns:4 ~row_spacings:10 ~col_spacings:20 ~homogeneous:false ~packing:vbox#add (*why not w#vbox#add *)() in let lname = GMisc.label ~xalign:0. ~text:(s_ "Name") ~packing:(table#attach ~left:0 ~top:1) () in let lport = GMisc.label ~xalign:0. ~text:(s_ "Port") ~packing:(table#attach ~left:0 ~top:2) () in let lfrom = GMisc.label ~xalign:0. ~text:(s_ "From") ~packing:(table#attach ~left:1 ~top:0) () in let lto = GMisc.label ~xalign:0. ~text:(s_ "To") ~packing:(table#attach ~left:3 ~top:0) () in let _link = GMisc.image ~file:link_image_file ~xalign:0.5 ~packing:(table#attach ~left:2 ~top:2) () in let _ = GMisc.image ~stock:`GO_FORWARD ~packing:(table#attach ~left:2 ~top:1) () in let tooltips = Gui_bricks.make_tooltips_for_container table in tooltips lname#coerce (s_ "Node name"); tooltips lport#coerce (s_ "Ethernet port"); tooltips lfrom#coerce (s_ "The first network node connected to the cable"); tooltips lto#coerce (s_ "The second network node connected to the cable"); let decompose = function None -> (None,None) | Some (x,y) -> (Some x, Some y) in let (n0,p0) = decompose left_user_endpoint in let (n1,p1) = decompose right_user_endpoint in let force_to_be_included : ((string*string) list) = ListExtra.filter_map (fun e->e) [left_user_endpoint; right_user_endpoint] in let updating = (force_to_be_included <> []) in List.iter (fun (n,p) -> Log.printf "Forced to be included: (%s,%s)\n" n p) force_to_be_included; let free_node_port_list as xys = network#free_endpoint_list_humanly_speaking ~force_to_be_included in let ((n0,p0),(n1,p1)) = match updating with | true -> ((n0,p0),(n1,p1)) | false -> Gui_bricks.Reactive_widget.guess_humanly_speaking_enpoints xys n0 p0 n1 p1 in new Gui_bricks.Reactive_widget.cable_input_widget (*~width:100 ?height*) ?n0 ?p0 ?n1 ?p1 ~packing_n0:(table#attach ~left:1 ~top:1) ~packing_p0:(table#attach ~left:1 ~top:2) ~packing_n1:(table#attach ~left:3 ~top:1) ~packing_p1:(table#attach ~left:3 ~top:2) ~free_node_port_list () in let get_widget_data () :'result = let ((n0,p0),(n1,p1)) = cable_input_widget#get_widget_data in let name = name#text in let label = label#text in { Data.name = name; Data.label = label; Data.left_user_endpoint = ((Option.extract n0),(Option.extract p0)); Data.right_user_endpoint = ((Option.extract n1),(Option.extract p1)); Data.old_name = old_name; } in (* The result of make is the result of the dialog loop (of type 'result option): *) Gui_bricks.Dialog_run.ok_or_cancel w ~ok_callback ~help_callback ~get_widget_data () (*-----*) WHERE (*-----*) let rec help_callback_straight () = let title = (s_ "ADD OR MODIFY A STRAIGHT CABLE") in let msg = (s_ "\ In this dialog window you can define the name of a straight Ethernet cable \ and set its parameters:\n\n\ - Label: a string appearing near the edge representing the cable in the \ network graph\n\n\ - Devices: the two network devices (machine, hub, ...) linked by the cable and \ their two connected interfaces\n\n\ WARNING: this dialog allows the user to define straight cables even in contexts where \ they won't work (for example between two machines); allowing users to define 'wrong' \ connections may be of some pedagogical interest.") in Simple_dialogs.help title msg and help_callback_crossover () = let title = (s_ "ADD OR MODIFY A CROSSOVER CABLE") in let msg = (s_ "\ In this dialog window you can define the name of a crossover Ethernet cable \ and set its parameters:\n\n\ - Label: a string appearing near the edge representing the cable in the \ network graph\n\n\ - Devices: the two network devices (machine, hub, ...) linked by the cable and \ their two connected interfaces\n\n\ WARNING: this dialog allows the user to define crossover cables even in contexts where \ they won't work (for example between two machines); allowing users to define 'wrong' \ connections may be of some pedagogical interest.") in Simple_dialogs.help title msg and help_callback ~crossover = match crossover with | false -> help_callback_straight () | true -> help_callback_crossover () ;; end (*-----*) WHERE (*-----*) module Eval_forest_child = struct let try_to_add_cable (network:User_level.network) ((root,children):Xforest.tree) = try (match root with | ("cable", attrs) -> (* Cables represent a special case: they must be built knowing their endpoints. *) let name = List.assoc "name" attrs in Log.printf "Importing cable \"%s\"...\n" name; let ln = List.assoc "leftnodename" attrs in let lr = List.assoc "leftreceptname" attrs in let rn = List.assoc "rightnodename" attrs in let rr = List.assoc "rightreceptname" attrs in let crossover = try (List.assoc "kind" attrs) = "crossover" (* backward-compatibility *) with Not_found -> bool_of_string (List.assoc "crossover" attrs) in let x = new User_level_cable.cable ~network ~crossover ~name ~left_user_endpoint:(ln,lr) ~right_user_endpoint:(rn,rr) () in x#from_tree ("cable", attrs) children ; Log.printf "Cable \"%s\" successfully imported.\n" name; true | _ -> false ) with _ -> false end (* module Eval_forest_child *) (*-----*) WHERE (*-----*) module User_level_cable = struct class virtual cable_dot_zone ?(reversed=false) ~(motherboard:Motherboard.t) () = object (self) method virtual crossover : bool val reversed = Chip.wref_in_cable ~name:"reversed" ~cable:motherboard#reversed_rj45cables_cable reversed method is_reversed = reversed#get method set_reversed b = reversed#set b initializer self#add_destroy_callback (lazy (reversed#destroy ())); method dot_color = match self#crossover with | false -> "#949494" | true -> "#6d8dc0" method dot_traduction ~(curved_lines:bool) ~labeldistance = let edgeoptions="" in let labeldistance_base = labeldistance in let n1 = self#get_left#node in let r1 = self#get_left#user_port_name in let n2 = self#get_right#node in let r2 = self#get_right#user_port_name in begin let vertexlab node iden recept = let port = node#dotPortForEdges recept in let portlabel = node#dotLabelForEdges recept in match port,portlabel with | "","" -> ("") | _ , "" -> (","^iden^"=\""^port^"\"") | _ , _ -> begin let port_line = (StringExtra.assemble_if_not_empty ~prefix:"" ~suffix:"" port ) in let portlabel_line = (StringExtra.assemble_if_not_empty ~prefix:"" ~suffix:"" portlabel) in (","^iden^"=< "^port_line^" "^portlabel_line^"
    >") end in let labeldistance = begin let p1 = n1#dotPortForEdges r1 in let pl1 = n1#dotLabelForEdges r1 in let p2 = n2#dotPortForEdges r2 in let pl2 = n2#dotLabelForEdges r2 in (* if there is a vertex with both port and portlabel not empty => set labeldistance +0.5 *) if ((p1<>"" && pl1<>"") or (p2<>"" && pl2<>"")) then ("labeldistance="^(string_of_float (labeldistance_base +. 0.5))^",") else "" end in let (tail, head, taillabel, headlabel) = (* Reverse left and right sides of the cable if required *) let (n1,r1,n2,r2) = if self#is_reversed then (n2,r2,n1,r1) else (n1,r1,n2,r2) in let c = if curved_lines then "" else ":c" in match (n1#get_label, n2#get_label) with | "", "" -> (n1#get_name^":img"^c), (n2#get_name^":img"^c), (vertexlab n1 "taillabel" r1), (vertexlab n2 "headlabel" r2) | "", l2 -> (n1#get_name^":img"^c), (n2#get_name) , (vertexlab n1 "taillabel" r1), (vertexlab n2 "headlabel" r2) | l1, "" -> (n1#get_name) , (n2#get_name^":img"^c), (vertexlab n1 "taillabel" r1), (vertexlab n2 "headlabel" r2) | l1, l2 -> (n1#get_name) , (n2#get_name) , (vertexlab n1 "taillabel" r1), (vertexlab n2 "headlabel" r2) in let edgeoptions = if edgeoptions = "" then "" else (edgeoptions^",") in let cable_label = self#get_name ^ (if self#get_label = "" then "" else (" "^self#get_label)) in let edgeoptions = edgeoptions ^ "arrowhead=obox, arrowtail=obox, arrowsize=0.4," ^ (if self#is_connected then "" else "style=dashed,") in let label_color = self#dot_color in (tail^" -> "^head^" ["^edgeoptions^labeldistance^"label=<"^cable_label^">"^taillabel^headlabel^"];") end (* method dot_traduction *) end (* cable_dot_tuning_zone *) and virtual cable_defects_zone ~network () = object (self) method virtual defects_cable_type : string method virtual get_name : string method virtual get_left : endpoint method virtual get_right : endpoint method virtual add_destroy_callback : unit Lazy.t -> unit method private add_my_defects = match (network#defects:Treeview_defects.t)#unique_row_exists_with_binding "Name" self#get_name with | true -> Log.printf "The cable %s has already defects defined...\n" self#get_name | false -> network#defects#add_cable ~cable_name:self#get_name ~cable_type:self#defects_cable_type ~left_name:self#get_left#my_name_in_treeview_defects ~right_name:self#get_right#my_name_in_treeview_defects () method private destroy_my_defects = Log.printf "component \"%s\": destroying my defects.\n" self#get_name; network#defects#remove_subtree_by_name self#get_name; initializer self#add_my_defects; self#add_destroy_callback (lazy self#destroy_my_defects); end and virtual ledgrid_management_zone ~network () = object (self) method virtual get_left : endpoint method virtual get_right : endpoint method virtual add_destroy_callback : unit Lazy.t -> unit method private set_ports_connection_state value = begin let left = self#get_left in let right = self#get_right in if left#node#has_ledgrid then network#ledgrid_manager#set_port_connection_state ~id:(left#node#id) ~port:left#port_index ~value (); if right#node#has_ledgrid then network#ledgrid_manager#set_port_connection_state ~id:(right#node#id) ~port:right#port_index ~value (); end initializer self#set_ports_connection_state true; self#add_destroy_callback (lazy (self#set_ports_connection_state false)); end (** Essentially a triple: (node, port_index, direction) *) and endpoint ~(node:User_level.node) ~(port_index:int) ~(direction:[ `leftward | `rightward ]) = (* direction interpreted as defined in the treeview: *) let direction = match direction with | `rightward -> Treeview_defects.LeftToRight | `leftward -> Treeview_defects.RightToLeft in object (self) method node = node method port_index = port_index (* Initialized by the owner cable itself: *) val mutable owner : < get_name : string > option = None method set_owner x = owner <- Some x method owner = Option.extract owner method user_port_name = node#ports_card#user_port_name_of_internal_index port_index method user_port_index = node#ports_card#user_port_index_of_internal_index port_index (* Just a type conversion, as a pair: *) method involved_node_and_port_index = (node, port_index) method get_my_defects = let defects = Treeview_defects.extract () in let get = defects#get_cable_attribute self#owner#get_name direction in object method loss = get "Loss %" method duplication = get "Duplication %" method flip = get "Flipped bits %" method min_delay = get "Minimum delay (ms)" method max_delay = get "Maximum delay (ms)" end method my_name_in_treeview_defects = let node_name = self#node#get_name in let port_name = self#user_port_name in Printf.sprintf "to %s (%s)" node_name port_name end (* class endpoint *) (** A cable defines an edge in the network graph. Defects may be added after creation. *) and cable = fun ~network ~name ?label ~crossover ~(left_user_endpoint: string * string) ~(right_user_endpoint: string * string) () -> let (n0,p0) = left_user_endpoint in let (n1,p1) = right_user_endpoint in let make_endpoint_of ~node_name ~user_port_name ~direction = let node = network#get_node_by_name node_name in let port_index = node#ports_card#internal_index_of_user_port_name user_port_name in (new endpoint ~node ~port_index ~direction) in let left_endpoint = make_endpoint_of ~node_name:n0 ~user_port_name:p0 ~direction:`leftward in let right_endpoint = make_endpoint_of ~node_name:n1 ~user_port_name:p1 ~direction:`rightward in let defects_cable_type = match crossover with | false -> "direct" | true -> "crossover" in let network_alias = network in let network_alias1 = network in let network_alias2 = network in object (self) initializer left_endpoint#set_owner (self :> ); right_endpoint#set_owner (self :> ); inherit OoExtra.destroy_methods () inherit User_level.component ~network ~name ?label () inherit [cable] User_level.simulated_device () as self_as_simulated_device initializer network#add_cable (self :> User_level.cable); self#add_destroy_callback (lazy (network#del_cable_by_name self#get_name)); inherit cable_defects_zone ~network:network_alias () as cable_defects_zone inherit cable_dot_zone ~motherboard:network_alias1#motherboard () inherit ledgrid_management_zone ~network:network_alias2 () method crossover = crossover (* Redefinition: *) method is_correct = let polarity0 = self#get_left#node#polarity in let polarity1 = self#get_right#node#polarity in let module M = User_level in (* We need a crossover cable if the polarity is the same: *) match polarity0, polarity1 with | M.Intelligent , _ | _ , M.Intelligent -> true | M.MDI_X , M.MDI | M.MDI , M.MDI_X -> (not crossover) | M.MDI_X , M.MDI_X | M.MDI , M.MDI -> crossover method defects_cable_type = defects_cable_type (** A cable has two connected endpoints: *) val mutable left_endpoint : endpoint = left_endpoint val mutable right_endpoint : endpoint = right_endpoint (** Accessors *) method get_left = left_endpoint method get_right = right_endpoint method set_left x = left_endpoint <- x method set_right x = right_endpoint <- x (** The li st of two names of nodes (machine/device) linked by the cable *) method involved_node_names = [left_endpoint#node#name; right_endpoint#node#name] (** Is a node connected to something with this cable? *) method is_node_involved node_name = List.mem node_name self#involved_node_names (** Return the list of devices (i.e. hubs, switches or routers) directly linked to this cable: *) method involved_node_and_port_index_list = [ (left_endpoint#node, left_endpoint#port_index); (right_endpoint#node, right_endpoint#port_index) ] (** Show its definition. Useful for debugging. *) method show prefix = (prefix^self#name^" ("^(self#defects_cable_type)^")"^ " ["^left_endpoint#node#name ^","^left_endpoint#user_port_name^"] -> "^ " ["^right_endpoint#node#name^","^right_endpoint#user_port_name^"]") method to_tree = Forest.tree_of_leaf ("cable", [ ("name" , self#get_name ) ; ("label" , self#get_label) ; ("crossover" , (string_of_bool self#crossover)) ; ("leftnodename" , self#get_left#node#name) ; ("leftreceptname" , self#get_left#user_port_name) ; ("rightnodename" , self#get_right#node#name) ; ("rightreceptname" , self#get_right#user_port_name) ; ]) (** A cable has just attributes (no children) in this version. The attribute "kind" cannot be set, must be considered as a constant field of the class. *) method eval_forest_attribute = function | ("name" , x) -> self#set_name x | ("label" , x) -> self#set_label x | ("crossover" , x) | ("leftnodename" , x) | ("leftreceptname" , x) | ("rightnodename" , x) | ("rightreceptname" , x) -> () (* these attributes have been already read *) | (key,_) -> let msg = Printf.sprintf "cable#eval_forest_attribute: unknown attribute `%s'" key in let () = Log.printf "%s\n" msg in failwith msg (** A cable may be either connected or disconnected; it's connected by default: *) val connected = ref true (** Access method *) method is_connected = !connected (** Make the cable connected, or do nothing if it's already connected: *) method private connect_right_now = Recursive_mutex.with_mutex mutex (fun () -> (if not self#is_connected then begin Log.printf "Connecting the cable %s...\n" self#get_name; (* Turn on the relevant LEDgrid lights: *) let involved_node_and_port_index_list = self#involved_node_and_port_index_list in List.iter (fun (device, port) -> network#ledgrid_manager#set_port_connection_state ~id:(device#id) ~port ~value:true ()) involved_node_and_port_index_list; connected := true; self#increment_alive_endpoint_no; Log.printf "Ok: connected\n"; end); User_level.refresh_sketch ()); (** Make the cable disconnected, or do nothing if it's already disconnected: *) method private disconnect_right_now = Recursive_mutex.with_mutex mutex (fun () -> (if self#is_connected then begin Log.printf "Disconnecting the cable %s...\n" self#get_name; (* Turn off the relevant LEDgrid lights: *) let involved_node_and_port_index_list = self#involved_node_and_port_index_list in List.iter (fun (device, port) -> network#ledgrid_manager#set_port_connection_state ~id:(device#id) ~port ~value:false ()) involved_node_and_port_index_list; connected := false; self#decrement_alive_endpoint_no; Log.printf "Ok: disconnected\n"; end); User_level.refresh_sketch ()); (** 'Suspending means disconnecting for cables *) method suspend_right_now = self#disconnect_right_now (** 'Resuming' means connecting for cables *) method resume_right_now = self#connect_right_now (** An always up-to-date 'reference counter' storing the number of alive endpoints plus the cable connection state (either 0 for 'disconnected' or 1 for 'connected'). A cable can be started in the simulation when this is exactly 3, and must be terminated when it becomes less than 3. *) val alive_endpoint_no = ref 1 (* cables are 'connected' by default *) (** Check that the reference counter is in [0, 3]. To do: disable this for production. *) method private check_alive_endpoint_no = Recursive_mutex.with_mutex mutex (fun () -> assert((!alive_endpoint_no >= 0) && (!alive_endpoint_no <= 3)); Log.printf "The reference count is now %d\n" !alive_endpoint_no; ) (** Record the fact that an endpoint has been created (at a lower level this means that its relevant {e hublet} has been created), and startup the simulated cable if appropriate. *) method increment_alive_endpoint_no = Recursive_mutex.with_mutex mutex (fun () -> Log.printf "Increment_alive_endpoint_no\n"; self#check_alive_endpoint_no; alive_endpoint_no := !alive_endpoint_no + 1; self#check_alive_endpoint_no; if !alive_endpoint_no = 3 then begin Log.printf "The reference count raised to three: starting up a cable\n"; self#startup_right_now end) (** Record the fact that an endpoint is no longer running (at a lower level this means that its relevant {e hublet} has been destroyed), and shutdown the simulated cable if appropriate. *) method decrement_alive_endpoint_no = Recursive_mutex.with_mutex mutex (fun () -> Log.printf "Decrement_alive_endpoint_no\n"; self#check_alive_endpoint_no; alive_endpoint_no := !alive_endpoint_no - 1; self#check_alive_endpoint_no; if !alive_endpoint_no < 3 then begin (* Note that we destroy rather than terminating. This enables to re-create the simulated device later, at startup time, referring the correct hublets that will exist then, rather than the ones existing now *) Log.printf "The reference count dropped below three: destroying a cable\n"; self#destroy_right_now; end) (** Make a new simulated device according to the current status *) method private make_simulated_device = Recursive_mutex.with_mutex mutex (fun () -> let left_hublet_process = left_endpoint#node#get_hublet_process_of_port left_endpoint#port_index in let right_hublet_process = right_endpoint#node#get_hublet_process_of_port right_endpoint#port_index in let left_blink_command = match left_endpoint#node#has_ledgrid with | false -> None | true -> Some (Printf.sprintf "(id: %i; port: %i)" left_endpoint#node#id left_endpoint#port_index) in let right_blink_command = match right_endpoint#node#has_ledgrid with | false -> None | true -> Some (Printf.sprintf "(id: %i; port: %i)" right_endpoint#node#id right_endpoint#port_index) in Log.printf "Left hublet process socket name is \"%s\"\n" left_hublet_process#get_socket_name; Log.printf "Right hublet process socket name is \"%s\"\n" right_hublet_process#get_socket_name; new Simulation_level.ethernet_cable ~parent:self ~left_end:left_hublet_process ~right_end:right_hublet_process ~blinker_thread_socket_file_name:(network#ledgrid_manager#blinker_thread_socket_file_name) ?left_blink_command ?right_blink_command ~unexpected_death_callback:self#destroy_because_of_unexpected_death ()) (** This has to be overridden for cables, because we can't 'poweroff' as easily as the other devices: *) method private destroy_because_of_unexpected_death () = Recursive_mutex.with_mutex mutex (fun () -> (* Refresh the process in some (ugly) way: *) if self#is_connected then begin (try self#disconnect_right_now with _ -> ()); (try self#connect_right_now with _ -> ()); connected := true; end else begin let current_alive_endpoint_no = !alive_endpoint_no in self_as_simulated_device#destroy_because_of_unexpected_death (); connected := true; alive_endpoint_no := 0; for i = 1 to current_alive_endpoint_no do self#increment_alive_endpoint_no; done end) (** To do: remove this ugly kludge, and make cables stoppable *) method can_startup = true (* To do: try reverting this *) method can_gracefully_shutdown = true (* To do: try reverting this *) method can_poweroff = true (* To do: try reverting this *) (** Only connected cables can be 'suspended' *) method can_suspend = Recursive_mutex.with_mutex mutex (fun () -> !connected) (** Only non-connected cables with refcount exactly equal to 2 can be 'resumed' *) method can_resume = Recursive_mutex.with_mutex mutex (fun () -> not !connected) (** Get the reference count right at the beginning: it starts at zero, but it's immediately incremented if endpoint hublet processes already exist: *) initializer (if left_endpoint#node#has_hublet_processes then self#increment_alive_endpoint_no); (if right_endpoint#node#has_hublet_processes then self#increment_alive_endpoint_no); Log.printf "The reference count for the just-created cable %s is %d\n" self#get_name !alive_endpoint_no; end end (* module User_level_cable *) (*-----*) WHERE (*-----*) module Simulation_level = struct (** Implementation of a user-level cable or of a link to a switch/hub to a hublet. It's meant to always link two switch/hub processes, and as an interesting particular case two hublets. The 'straight' and 'cross-over' cases are not distinguished. *) class ['parent] ethernet_cable = fun ~(parent:'parent) ~(left_end) ~(right_end) ?blinker_thread_socket_file_name ?left_blink_command ?right_blink_command ~(unexpected_death_callback : unit -> unit) () -> object(self) inherit ['parent] Simulation_level.device ~parent ~hublet_no:0 ~unexpected_death_callback () as super val ethernet_cable_process = ref None method private get_ethernet_cable_process = match !ethernet_cable_process with Some ethernet_cable_process -> ethernet_cable_process | None -> failwith "ethernet_cable: get_ethernet_cable_process was called when there is no such process" initializer let leftward_defects = parent#get_left#get_my_defects in let rightward_defects = parent#get_right#get_my_defects in ethernet_cable_process := Some(Simulation_level.make_ethernet_cable_process ~left_end ~right_end ~blinker_thread_socket_file_name ~left_blink_command ~right_blink_command ~leftward_defects ~rightward_defects ~unexpected_death_callback:self#execute_the_unexpected_death_callback ()) method device_type = "Ethernet cable" method spawn_processes = self#get_ethernet_cable_process#spawn method terminate_processes = (try self#get_ethernet_cable_process#terminate with _ -> ()) method stop_processes = self#get_ethernet_cable_process#stop method continue_processes = self#get_ethernet_cable_process#continue end (* class ethernet_cable *) end (* module Simulation_level *) (** Just for testing: *) (* let test = Dialog_add_or_update.make *) marionnet-0.90.6+bzr434.orig/Makefile.d/0000700000175000017500000000000012167200764016517 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/Makefile.d/doc.sh0000700000175000017500000000737312167200764017635 0ustar lucaslucas#!/bin/bash -e # This -*- makefile -*- is part of our build system for OCaml projects # Copyright (C) 2008 Jean-Vincent Loddo # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Usage: # doc.sh -pp "$(PP_OPTION)" -e "$(UNDOCUMENTED)" -i $(DIRECTORIES_TO_INCLUDE) ################################ # Set ocamldoc parameters # ################################ UNDOCUMENTED="meta.ml myocamlbuild.ml" function usage { echo 'Usage (in a Makefile):' echo 'doc.sh -pp "$(PP_OPTION)" -e "$(UNDOCUMENTED)" -i $(DIRECTORIES_TO_INCLUDE)' exit 1 } set -x # The first argument may be empty but must be present. [[ $1 = "-pp" ]] || usage PP_OPTION=$(echo $2) if [[ $PP_OPTION != "" ]]; then PP_OPTION="-pp '$2'" fi shift 2 [[ $1 = "-e" ]] || usage UNDOCUMENTED+=" "$(echo $2) for i in $UNDOCUMENTED; do UNDOCUMENTED_FILTER+=" -a ! -name $i" done shift 2 [[ $1 = "-i" ]] || usage shift for i in "$@"; do INCLUDE_LIBS+=" -I +$i" done # ocamldoc parameters: SOURCES=$(builtin cd _build/ && find . \( -name "*.ml" -o -name "*.mli" \) $UNDOCUMENTED_FILTER) INCLUDES=$(builtin cd _build/ && find . -type d -printf "-I %p\n") PROJECT=$(basename $PWD) ################################ # Make header and footer # ################################ cd _build/ mkdir -p doc/html # Make header.gif function enrich_index_html { which dot || { echo "Warning: you need dot (graphviz) in order to generated the documentation header."; return 0 } # Get user-defined header and footer [[ -f ../header.html ]] && HEADER_FILE=$(< ../header.html) [[ -f ../footer.html ]] && FOOTER_FILE=$(< ../footer.html) [[ -f ../AUTHORS ]] && AUTHORS_FILE=$(< ../AUTHORS) [[ -f ../AUTHORS ]] && AUTHORS_FILE=$(awk <../AUTHORS '/$/ {print; print "
    "; }') # Make dependencies graph set -x; eval ocamldoc $PP_OPTION -dot -d doc/html/ -o doc/html/header0.dot -colorize-code $INCLUDES $INCLUDE_LIBS $SOURCES set +x echo 'Ok, the dependencies graph was built with success.' pushd doc/html >/dev/null grep -v "rankdir=\|size=\|rotate=" header0.dot > header.dot dot header.dot -Tgif -o header.gif HEADER=$(cat < Project

    $PROJECT



    Dependencies License and authors $HEADER_FILE
    EOF ) FOOTER=$(cat <

    Dependencies


    Dependencies

    $FOOTER_FILE

    License and authors


    $AUTHORS_FILE

    EOF ) cat index.html | awk -v h="$HEADER" -v f="$FOOTER" ' /^

    .*<.h1><.center>/ {print h; next} /^<\/body>/ {print f ""; next} {print} ' > index1.html mv -f index1.html index.html popd >/dev/null echo 'Ok, header and footer have been included into index.html.' } ################################ # Call ocamldoc # ################################ set -x eval ocamldoc -t $PROJECT $PP_OPTION -sort -m A -keep-code -html -colorize-code -d doc/html/ $INCLUDES $INCLUDE_LIBS $SOURCES set +x echo 'Ok, the documentation was built with success.' enrich_index_html echo 'The documentation has been built with success under _build/doc/html' marionnet-0.90.6+bzr434.orig/Makefile.d/bzr_date0000700000175000017500000000341412167200764020241 0ustar lucaslucas#!/bin/bash # This file is part of marionnet # Copyright (C) 2010 Jean-Vincent Loddo # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Parsing command line arguments FORMAT='r:' function parse_cmdline { unset ARGS while [[ $# -gt 0 ]]; do OPTIND=1 while getopts ":h$FORMAT" flag; do [[ ! $flag = '?' ]] || { echo "*** Illegal option -$OPTARG."; exit 1; } eval "option_${flag}=$OPTIND" eval "option_${flag}_arg='$OPTARG'" done for ((index=1; index. Requirements ============ You need several pieces of software to build and use this package; some of them are only used at build time, while others are needed at runtime. Please note that for build-time requirements it's essential to also have the headers/mli files available: if you use the package system of your distro, this translates into having installed also the "-dev" or "-devel" packages. Operating System ================ Marionnet was developed on and for GNU/Linux. We doubt it would be possible to make UML run on systems with any kernel different from Linux. About the architecture, again UML is the only limiting factor. Any architecture supporting UML should be fine. Some GNU/Linux-isms may be present. Please write us at marionnet-dev@marionnet.org if you want to try to port Marionnet to some other system, we may be able to help. Build-time requirements ======================= GNU Make and OCamlBuild are required (as for all our OCaml projects). And of course you need the OCaml compiler. [To do: fill this...] Runtime requirements ==================== [To do: expand this...] Graphviz (we use dot at runtime) uml utilities? bridge utilities? VDE with our patch. tunctl Filesystems. [X11 with TCP connections enabled] marionnet-0.90.6+bzr434.orig/Makefile0000600000175000017500000010516512167200764016232 0ustar lucaslucas# This -*- makefile -*- is part of our build system for OCaml projects # Copyright (C) 2008, 2009 Luca Saiu # Copyright (C) 2008, 2010 Jean-Vincent Loddo # Copyright (C) 2008, 2009, 2010 Université Paris 13 # Updated in 2008 by Jonathan Roudiere # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This is the revision of 2008-04-21. ###################################################################### # This make file is general-purpose: the actual project-dependant part # should be written for each specific project in a 'Makefile.local' # file. # # This contains some (simple) makefile magic which is only supported # by GNU Make. Don't even try to use other make implementations. ###################################################################### ###################################################################### # Implementation of targets. Note that the user is *not* supposed to # override these, but only to define the project-dependant '-local' # versions: # Makefiles (this one as those in other parts) use extensively the bash shell SHELL=/bin/bash OCAMLBUILD = $$( $(call OCAMLBUILD_COMMAND_LINE) ) LIBRARYPREFIX=$(shell $(call READ_CONFIG, libraryprefix); echo $$libraryprefix) OCAML_LIBRARYPREFIX=$(shell $(call READ_CONFIG, ocaml_libraryprefix); echo $$ocaml_libraryprefix) # The main target. Its implementation is entirely project-dependant: main: ocamlbuild-stuff manually_pre_actions main-local data libraries programs manually_post_actions @(echo "Success.") # Build C modules (no one, by default): c-modules: @(mkdir _build &> /dev/null || true) && \ for x in $(C_OBJECTS_TO_LINK); do \ make _build/$$x.o; \ done BUILD_FROM_STUFF = \ @( echo "Building $(1)..."; \ shopt -s execfail; set -e; \ for x in $(2); do \ echo "Building \"$$x\"..."; \ if $(MAKE) $$x; then \ echo "Ok, \"$$x\" was built with success."; \ else \ echo "FAILED when building \"$$x\"."; \ exit -1; \ fi; \ done; \ echo "Success: $(1) were built.") # Build only data: data: ocamlbuild-stuff data-local $(DATA) $(call BUILD_FROM_STUFF, data, $(DATA)) # Build only native libraries: native-libraries: ocamlbuild-stuff c-modules native-libraries-local $(NATIVE_LIBRARIES) $(call BUILD_FROM_STUFF, native-libraries, $(NATIVE_LIBRARIES)) # Build only bytecode libraries: byte-libraries: ocamlbuild-stuff c-modules byte-libraries-local $(BYTE_LIBRARIES) $(call BUILD_FROM_STUFF, byte-libraries, $(BYTE_LIBRARIES)) # Build libraries; bytecode, native, or both: libraries: c-modules libraries-local @($(call BUILD_NATIVE_ANDOR_BYTECODE,libraries) ) # Spaces are ok # Build programs; bytecode, native, or both: # Force the meta.ml regeneration at next make call programs: c-modules programs-local @($(call BUILD_NATIVE_ANDOR_BYTECODE,programs) ) # Spaces are ok touch META # Build the native and/or bytecode version of $(1). $(1) may be either # "libraries" or "programs". *Don't* put a space before the argument. BUILD_NATIVE_ANDOR_BYTECODE = \ (if [ "$$( $(call NATIVE) )" == 'native' ]; then \ echo "Builing native $(1)..."; \ if $(MAKE) native-$(1); then \ echo "Success: native $(1) were built."; \ else \ echo "FAILURE: could not build native $(1)."; \ exit -1; \ fi; \ else \ echo "NOT builing native $(1)..."; \ fi; \ if [ "$$( $(call BYTE) )" == 'byte' ]; then \ echo "Builing bytecode $(1)..."; \ if $(MAKE) byte-$(1); then \ echo "Success: bytecode $(1) were built."; \ else \ echo "FAILURE: could not build bytecode $(1)."; \ exit -1; \ fi; \ else \ echo "NOT builing bytecode $(1)..."; \ fi) # Build only native programs: native-programs: ocamlbuild-stuff native-programs-local $(NATIVE_PROGRAMS) $(ROOT_NATIVE_PROGRAMS) $(call BUILD_FROM_STUFF, native-programs, $(NATIVE_PROGRAMS) $(ROOT_NATIVE_PROGRAMS)) # Build only bytecode programs: byte-programs: ocamlbuild-stuff byte-programs-local $(BYTE_PROGRAMS) $(ROOT_BYTE_PROGRAMS) $(call BUILD_FROM_STUFF, byte-programs, $(BYTE_PROGRAMS) $(ROOT_BYTE_PROGRAMS)) # 'all' is just an alias for 'main': all: main # In some projects we may need to build something more than 'main', # but we do nothing more by default: world: world-local main @(echo 'Success.') ############################################################################ # Support for manually generated files (i.e. not generated with ocamlbuild) ############################################################################ # Example: (in your Makefile.local) # # foo.byte : manually_pre_actions # foo.native : manually_pre_actions # # MANUALLY_PRE_COPY_IN_build = include_as_string.ml USAGE.txt # MANUALLY_PRE_MAKE_IN_build = include_as_string.cmo # # _build/include_as_string.cmo: include_as_string.ml # ocamlc -c -I +camlp4 camlp4lib.cma -pp camlp4of -o $@ $< .PHONY : manually_pre_actions manually_post_actions ################################# PRE-ACTIONS support # Files that must be copied in _build/ *before* the ocamlbuild processing. MANUALLY_PRE_COPY_IN_build = # Targets that must be created in _build/ *before* the ocamlbuild processing. # For each foo.bar that appears in this list, you have to write a rule # _build/foo.bar in your Makefile.local MANUALLY_PRE_MAKE_IN_build = manually_pre_actions: $(call PERFORM_MANUALLY_PRE_ACTIONS, $(MANUALLY_PRE_COPY_IN_build),$(MANUALLY_PRE_MAKE_IN_build)) # Detect if "make clean" is required or copy and build manually targets # specified in MANUALLY_PRE_COPY_IN_build and MANUALLY_PRE_MAKE_IN_build PERFORM_MANUALLY_PRE_ACTIONS = \ @(\ if test -d _build/; \ then \ echo "Checking if files manually copied in _build/ have been modified..."; \ for x in $(1); do \ echo "Checking \"$$x\"..."; \ test ! -f _build/$$x || \ diff -q $$x _build/$$x 2>/dev/null || \ { echo -e "********************\nmake clean required!\n********************"; exit 1; } ;\ done; \ else \ mkdir _build/; \ fi; \ for x in $(1); do echo "Manually pre-copying \"$$x\"..."; cp --parent -f $$x _build/; done; \ for y in $(2); do echo "Manually pre-building \"$$y\"..."; make _build/$$y || exit 1; done; \ ) ################################# POST-ACTIONS support # Files that must be copied in _build/ *after* the ocamlbuild processing. MANUALLY_POST_COPY_IN_build = # Targets that must be created in _build/ *after* the ocamlbuild processing. # For each foo.bar that appears in this list, you have to write a rule # _build/foo.bar in your Makefile.local MANUALLY_POST_MAKE_IN_build = manually_post_actions: $(call PERFORM_MANUALLY_POST_ACTIONS, $(MANUALLY_POST_COPY_IN_build), $(MANUALLY_POST_MAKE_IN_build)) PERFORM_MANUALLY_POST_ACTIONS = \ @(\ for x in $(1); do echo "Manually post-copying \"$$x\"..."; cp --parent -f $$x _build/; done; \ for y in $(2); do echo "Manually post-building \"$$y\"..."; make _build/$$y || exit 1; done; \ ) ############################################################################ # Other entries # Edit all ml/mli files and Makefile.local with your $EDITOR edit: test -n "$$EDITOR" && $$EDITOR Makefile.local $$(find . \( -name "_build*" -o -name "meta.ml" -o -name "$(EXCLUDE_FROM_EDITING)" -o -name "version.ml" -o -name "gui.ml" -o -name myocamlbuild.ml \) -prune -o -type f -a \( -name "*.ml" -o -name "*.mli" \) -print) & # Create the documentation documentation: world documentation-local chmod +x Makefile.d/doc.sh Makefile.d/doc.sh -pp "$(PP_OPTION)" -e "$(UNDOCUMENTED)" -i $(DIRECTORIES_TO_INCLUDE) doc: documentation INDEX_HTML=_build/doc/html/index.html browse: test -f $(INDEX_HTML) || make documentation test -n "$$BROWSER" && $$BROWSER $(INDEX_HTML) # Install programs and libraries: install: install-programs install-libraries install-data install-configuration install-documentation install-local @(echo 'Success.') # The user is free to override this to add custom targets to install into the # $prefix/share/$name installation directory: OTHER_DATA_TO_INSTALL = # The user is free to override this to add custom targets to install into the # $documentationprefix/$name installation directory: OTHER_DOCUMENTATION_TO_INSTALL = # Install the documentation from this package (_build/doc) into $prefix/share/$name: install-documentation: install-documentation-local @($(call READ_CONFIG, documentationprefix); \ $(call READ_META, name); \ directory=$$documentationprefix/$$name; \ shopt -s nullglob; \ if [ -e _build/doc ]; then \ documentationifany=`ls -d _build/doc/*`; \ else \ documentationifany=''; \ fi; \ if [ "$$documentationifany" == "" ]; then \ echo "No documentation to install: ok, no problem..."; \ else \ echo "Installing $$name documentation into $$directory ..."; \ echo "Creating $$directory ..."; \ if mkdir -p $$directory; then \ echo "The directory $$directory was created with success."; \ else \ echo "Could not create $$directory"; \ exit -1; \ fi; \ echo "Copying $$name documentation to $$directory ..."; \ for x in COPYING README $$documentationifany $(OTHER_DOCUMENTATION_TO_INSTALL); do \ if cp -af $$x $$directory; then \ echo "Installed $$x into $$directory/"; \ else \ echo "Could not write $$directory/$$x."; \ exit -1; \ fi; \ done; \ echo "Documentation installation for $$name was successful."; \ fi) # Just a handy alias: install-doc: install-documentation # Install the data from this package into $prefix/share/$name: install-data: main install-data-local @($(call READ_CONFIG, prefix); \ $(call READ_META, name); \ directory=$$prefix/share/$$name; \ shopt -s nullglob; \ if [ -e share ]; then \ dataifany=`ls -d share/*`; \ else \ dataifany=''; \ fi; \ if [ "$$dataifany" == "" ]; then \ echo "No data to install: ok, no problem..."; \ else \ echo "Installing $$name data into $$directory ..."; \ echo "Creating $$directory ..."; \ if mkdir -p $$directory; then \ echo "The directory $$directory was created with success."; \ else \ echo "Could not create $$directory"; \ exit -1; \ fi; \ echo "Copying $$name data to $$directory ..."; \ for x in COPYING README $$dataifany $(OTHER_DATA_TO_INSTALL); do \ if cp -af $$x $$directory; then \ echo "Installed $$x into $$directory/"; \ else \ echo "Could not write $$directory/$$x."; \ exit -1; \ fi; \ done; \ echo "Data installation for $$name was successful."; \ fi) # Install the software configuration files, if any: install-configuration: install-configuration-local @($(call READ_CONFIG, configurationprefix); \ $(call READ_META, name); \ if [ -e etc ]; then \ echo "Installing configuration files into $$configurationprefix/$$name..."; \ mkdir -p $$configurationprefix/$$name; \ shopt -s nullglob; \ for file in etc/*; do \ basename=`basename $$file`; \ echo "Installing $$basename into $$configurationprefix/$$name..."; \ if ! cp $$file $$configurationprefix/$$name/; then \ echo "ERROR: Could not install $$basename into $$configurationprefix/$$name"; \ exit -1; \ fi; \ done; \ else \ echo "We don't have any configuration files to install."; \ fi) # Uninstall the software configuration files, if any: uninstall-configuration: uninstall-configuration-local @($(call READ_CONFIG, configurationprefix); \ if [ -e etc ]; then \ echo "Removing configuration files from $$configurationprefix..."; \ shopt -s nullglob; \ for file in etc/*; do \ basename=`basename $$file`; \ echo "Uninstalling $$basename from $$configurationprefix..."; \ if ! rm -f $$configurationprefix/$$basename; then \ echo "ERROR: Could not remove $$basename from $$configurationprefix"; \ exit -1; \ fi; \ done; \ else \ echo "We don't have any configuration files to remove."; \ fi) # Remove the data of this package from $prefix/share/$name: uninstall-data: uninstall-data-local @( ($(call READ_CONFIG, prefix); \ $(call READ_META, name); \ directory=$$prefix/share/$$name; \ echo "Removing $$name data from $$prefix/share/..."; \ shopt -s nullglob; \ if rm -rf $$directory; then \ echo "The entire directory $$directory was removed."; \ else \ echo "Could not delete $$directory"; \ exit -1; \ fi); \ echo 'Data uninstallation was successful.') # Remove the documentation of this package from $documentationprefix/$name: uninstall-documentation: uninstall-documentation-local @( ($(call READ_CONFIG, documentationprefix); \ $(call READ_META, name); \ directory=$$documentationprefix/$$name; \ echo "Removing $$name documentation from $$documentationprefix..."; \ shopt -s nullglob; \ if rm -rf $$directory; then \ echo "The entire directory $$directory was removed."; \ else \ echo "Could not delete $$directory"; \ exit -1; \ fi); \ echo 'Documentation uninstallation was successful.') # The user is free to override this to add custom targets to install into the # $prefix/bin installation directory; the typical use of this would be # installing scripts. OTHER_PROGRAMS_TO_INSTALL = # These are programs to be installed into $prefix/sbin instead of $prefix/bin: ROOT_NATIVE_PROGRAMS = ROOT_BYTE_PROGRAMS = # Install the programs from this package into $prefix/bin: install-programs: programs install-programs-local @($(call READ_CONFIG, prefix); \ $(call READ_META, name); \ echo "Creating $$prefix/bin/..."; \ (mkdir -p $$prefix/bin &> /dev/null || true); \ echo "Creating $$prefix/sbin/..."; \ (mkdir -p $$prefix/sbin &> /dev/null || true); \ echo "Installing programs from $$name into $$prefix/bin/..."; \ shopt -s nullglob; \ for file in $(OTHER_PROGRAMS_TO_INSTALL) _build/*.byte _build/*.native; do \ basename=`basename $$file`; \ if echo " $(ROOT_NATIVE_PROGRAMS) $(ROOT_BYTE_PROGRAMS) " | grep -q " $$basename "; then \ echo "Installing "`basename $$file`" as a \"root program\" into $$prefix/sbin..."; \ cp -a $$file $$prefix/sbin/; \ chmod +x $$prefix/sbin/$$basename; \ else \ echo "Installing "`basename $$file`" into $$prefix/bin..."; \ cp -a $$file $$prefix/bin/; \ chmod +x $$prefix/bin/$$basename; \ fi; \ done) && \ echo 'Program installation was successful.' # Remove the programs from this package from $prefix/bin: uninstall-programs: main uninstall-programs-local @($(call READ_CONFIG, prefix); \ $(call READ_META, name); \ echo "Removing $$name programs..."; \ shopt -s nullglob; \ for file in $(OTHER_PROGRAMS_TO_INSTALL) _build/*.byte _build/*.native; do \ basename=`basename $$file`; \ if echo " $(ROOT_NATIVE_PROGRAMS) $(ROOT_BYTE_PROGRAMS) " | grep -q " $$basename "; then \ echo -e "Removing the \"root program\" $$basename from $$prefix/sbin..."; \ export pathname=$$prefix/sbin/`basename $$file`; \ else \ echo -e "Removing $$basename from $$prefix/bin..."; \ export pathname=$$prefix/bin/`basename $$file`; \ fi; \ rm -f $$pathname; \ done) && \ echo 'Program uninstallation was successful.' # The user is free to override this to add custom targets to install into the # library installation directory: OTHER_LIBRARY_FILES_TO_INSTALL = # Install the library in this package into the path chosen at configuration time: install-libraries: libraries install-libraries-local @($(call READ_CONFIG,libraryprefix); \ $(call READ_META,name); \ if [ "$(NATIVE_LIBRARIES) $(BYTE_LIBRARIES)" == " " ]; then \ echo "There are no native libraries to install: ok, no problem..."; \ else \ (echo "Installing $$name libraries into $$libraryprefix/$$name/..."; \ (mkdir -p $$libraryprefix/$$name &> /dev/null || true); \ shopt -s nullglob; \ cp -f META $(OTHER_LIBRARY_FILES_TO_INSTALL) \ _build/*.cma _build/*.cmxa _build/*.a \ `find _build/ -name \*.cmi | grep -v /myocamlbuild` \ `find _build/ -name \*.mli | grep -v /myocamlbuild` \ $$libraryprefix/$$name/) && \ echo 'Library installation was successful.'; \ fi) # Uninstall programs and libraries: uninstall: uninstall-programs uninstall-libraries uninstall-data uninstall-configuration uninstall-documentation uninstall-local @(echo 'Success.') # Remove the library from the installation path chosen at configuration time: uninstall-libraries: main uninstall-libraries-local @(($(call READ_CONFIG,libraryprefix); \ $(call READ_META,name); \ echo "Uninstalling $$name libraries from $$libraryprefix/..."; \ shopt -s nullglob; \ rm -rf $$libraryprefix/$$name/) && \ echo 'Library uninstallation was successful.') # Make a source tarball: dist: clean dist-local @($(call READ_META, name, version); \ $(call FIX_VERSION); \ echo "Making the source tarball _build/$$name-$$version.tar.gz ..."; \ $(MAKE) meta.ml.released; \ $(MAKE) ChangeLog; \ mkdir -p _build/$$name-$$version; \ cp -af * _build/$$name-$$version/ &> /dev/null; \ (tar --exclude=_build --exclude=meta.ml --exclude=.bzr -C _build -czf \ _build/$$name-$$version.tar.gz $$name-$$version/ && \ rm -rf _build/$$name-$$version)) && \ rm -f meta.ml.released ChangeLog; \ echo "Success." # These files are included also in binary tarballs: FILES_TO_ALWAYS_DISTRIBUTE = \ COPYING README INSTALL AUTHORS THANKS META Makefile Makefile.local CONFIGME \ REQUIREMENTS NEWS ChangeLog # Make a binary tarball: dist-binary: dist-binary-local main documentation @(($(call READ_META, name, version); \ $(call FIX_VERSION); \ architecture=$$(echo `uname -o`-`uname -m` | sed 's/\//-/g'); \ directoryname=$$name-$$version--binary-only--$$architecture; \ filename=$$directoryname.tar.gz; \ echo "Making the binary tarball _build/$$filename ..."; \ $(MAKE) ChangeLog; \ mkdir -p _build/$$directoryname; \ mkdir -p _build/$$directoryname/_build; \ shopt -s nullglob; \ for x in $(FILES_TO_ALWAYS_DISTRIBUTE) share doc etc; do \ cp $$x _build/$$directoryname &> /dev/null; \ done; \ for x in $(NATIVE_PROGRAMS) $(NATIVE_LIBRARIES) $(BYTE_PROGRAMS) $(BYTE_LIBRARIES); do \ cp _build/$$x _build/$$directoryname/_build; \ done; \ for x in `find _build/ -name \*.cmi | grep -v /my$(OCAMLBUILD) | grep -v _build/$$directoryname` \ `find _build/ -name \*.mli | grep -v /my$(OCAMLBUILD) | grep -v _build/$$directoryname` \ `find _build/ -name \*.cma | grep -v /my$(OCAMLBUILD) | grep -v _build/$$directoryname` \ `find _build/ -name \*.cmxa | grep -v /my$(OCAMLBUILD) | grep -v _build/$$directoryname` \ `find _build/ -name \*.a | grep -v /my$(OCAMLBUILD) | grep -v _build/$$directoryname` \ `find _build/ -name \*.byte | grep -v /my$(OCAMLBUILD) | grep -v _build/$$directoryname` \ `find _build/ -name \*.native | grep -v /my$(OCAMLBUILD) | grep -v _build/$$directoryname` \ ; do \ cp $$x _build/$$directoryname/_build; \ done; \ for x in _build/*.docdir; do \ cp -af $$x _build/$$directoryname; \ done; \ for x in main main-local install-libraries-local install-programs-local \ install-local install-data-local clean clean-local \ documentation documentation-local install-documentation-local \ ocamlbuild-stuff \ ; do \ echo "This dummy file prevents make from building the \"$$x\" target." \ > _build/$$directoryname/$$x; \ done; \ (tar czf _build/$$filename -C _build $$directoryname/ && \ (rm -rf _build/$$directoryname && \ rm -f ChangeLog))) && \ echo "Success.") # Automatically generate a nice ChangeLog from bzr's history: ChangeLog: @(if ! [ -d .bzr ]; then \ echo 'No ChangeLog available (bzr metadata are missing)' > $@; \ else \ bzr log --gnu-changelog > $@; \ fi) # Remove generated stuff (the ChangeLog is only removed if we have Darcs # metadata to re-generate it): clean: clean-local @(rm -rf _build; \ find -name "_build*" -prune -o -type f -name \*~ -exec rm -f {} \;; \ find -name "_build*" -prune -o -type f -name \#\*\# -exec rm -f {} \;; \ find -name "_build*" -prune -o -type f -name core -exec rm -f {} \;; \ rm -f _tags meta.ml myocamlbuild.ml; \ if [ -d .bzr ]; then \ rm -f meta.ml.released ChangeLog; \ fi; \ echo "Success.") # Meta-help about the targets defined in this make file: targets: @cat Makefile Makefile.local | grep -B 1 "^[a-z0-9_-]*[:]" | \ awk '/BEGIN/ {r=""} /^[#]/ { r=substr($$0,2); next; } /^[a-z0-9_-]*[-]local[:]/ {r=""; next} /^[a-z0-9_-]*[:]/{split($$0,a,/:/); printf("%s\r\t\t\t--- %s\n",a[1],r); r=""; next} {r=""}' | sort ###################################################################### # Default implementation for '-local' targets: # All the user-definable '-local' targets have an empty implementation # by default: main-local: world-local: data-local: native-libraries-local: byte-libraries-local: libraries-local: native-programs-local: byte-programs-local: programs-local: install-local: uninstall-local: install-programs-local: uninstall-programs-local: install-libraries-local: uninstall-libraries-local: install-data-local: uninstall-data-local: install-configuration-local: uninstall-configuration-local: install-documentation-local: uninstall-documentation-local: dist-local: dist-binary-local: documentation-local: clean-local: # Let's avoid confusion between all and main: they're the same thing # for us, and we only support main-local: all-local: echo 'all-local does not exist. Use main-local instead' exit 1 ##################################################################### # Default compilation flags. The user *is* expected to override or # extend these: DATA = NATIVE_LIBRARIES = BYTE_LIBRARIES = NATIVE_PROGRAMS = BYTE_PROGRAMS = COMPILE_OPTIONS = -thread PP_OPTION = DIRECTORIES_TO_INCLUDE = LIBRARIES_TO_LINK = OBJECTS_TO_LINK = C_OBJECTS_TO_LINK = ##################################################################### # Default rules: # Bytecode libraries: %.cma: ocamlbuild-stuff c-modules @($(OCAMLBUILD) $@) # Native libraries: %.cmxa: ocamlbuild-stuff c-modules @($(OCAMLBUILD) $@) # Bytecode programs: %.byte: ocamlbuild-stuff c-modules @($(call BUILD_WITH_OCAMLBUILD, $@) ) # Native programs: %.native: ocamlbuild-stuff c-modules @($(call BUILD_WITH_OCAMLBUILD, $@) ) # Build the target $(1) using OCamlBuild. ocamlbuild-stuff is assumed # to be already generated. BUILD_WITH_OCAMLBUILD = \ $(OCAMLBUILD) $@; \ if [ -e $@ ]; then \ rm $@; \ echo "Success: $@ was built"; \ else \ echo "FAILURE when building $@"; \ exit -1; \ fi ##################################################################### # Some macros, used internally and possibly by Makefile.local: # Return 'native' if we have a native compiler available, otherwise # ''. NATIVE = \ (if which ocamlopt.opt &> /dev/null || which ocamlopt &> /dev/null ; then \ echo 'native'; \ else \ echo ''; \ fi) # Return 'byte' if we have a bytecode compiler available, otherwise # ''. BYTE = \ (if which ocamlc.opt &> /dev/null || which ocamlc &> /dev/null; then \ echo 'byte'; \ else \ echo ''; \ fi) # Return 'native' if we have a native compiler available, otherwise # 'byte' if we have a byte compiler; otherwise fail. NATIVE_OR_BYTE = \ (if [ "$$( $(call NATIVE) )" == 'native' ]; then \ echo 'native'; \ elif [ "$$( $(call BYTE) )" == 'byte' ]; then \ echo 'byte'; \ else \ echo 'FATAL ERROR: could not find an ocaml compiler' ">$$native< >$$byte<"; \ exit -1; \ fi) PROCESSOR_NO = $(shell grep "^processor.*:" /proc/cpuinfo | sort | uniq | wc -l) # Return the proper command line for ocamlbuild, including an option # -byte-plugin if needed: OCAMLBUILD_COMMAND_LINE = \ (if [ $$( $(call NATIVE_OR_BYTE) ) == 'byte' ]; then \ echo 'ocamlbuild -j $(PROCESSOR_NO) -byte-plugin -verbose 2 -log _build/_log'; \ else \ echo 'ocamlbuild -j $(PROCESSOR_NO) -verbose 2 -log _build/_log'; \ fi) # Macro extracting, via source, the value associated to some keys # $(2),..,$(9) in a file $(1). # # Example: # $(call SOURCE_AND_TEST,CONFIGME,prefix); # $(call SOURCE_AND_TEST,CONFIGME,prefix,libraryprefix); SOURCE_AND_TEST = \ if ! source $(1) &> /dev/null; then \ echo 'Evaluating $(1) failed.'; \ exit 1; \ fi; \ for i in $(2) $(3) $(4) $(5) $(6) $(7) $(8) $(9); do \ CMD="VAL=$$`echo $$i`"; eval $$CMD; \ if test -z "$$VAL"; then \ echo "FATAL: $${i} is undefined in $(1)."; \ exit 1; \ fi; \ done; \ unset CMD VAL i # Macro extracting, via grep, the value associated to keys # $(2),..,$(9) in a file $(1). # # Examples: # $(call GREP_AND_TEST,META,name); # $(call GREP_AND_TEST,META,name,version); GREP_AND_TEST = \ for i in $(2) $(3) $(4) $(5) $(6) $(7) $(8) $(9); do \ if ! CMD=`grep "^$$i=" $(1)`; then \ echo "FATAL: $$i is undefined in $(1)."; \ exit 1; \ fi; \ eval $$CMD; \ done; \ unset CMD i # Instance of SOURCE_AND_TEST: source the file "CONFIGME" and test # if the given names are defined # # Example: # $(call READ_CONFIG,prefix,libraryprefix); # READ_CONFIG = \ $(call SOURCE_AND_TEST,CONFIGME,$(1),$(2),$(3),$(4),$(5),$(6),$(7),$(8),$(9)) # Instance of GREP_AND_TEST: read the file "META" searching for a names # for all given names # # Example: # $(call READ_META,name,version); # READ_META = \ $(call GREP_AND_TEST,META,$(1),$(2),$(3),$(4),$(5),$(6),$(7),$(8),$(9)) # If the value of the 'version' variable contains the substring 'snapshot' then # append to its value the current date, in hacker format. 'version' must be already # defined. No arguments, no output. FIX_VERSION = \ if echo $$version | grep snapshot &> /dev/null; then \ version="$$version-"`date +"%Y-%m-%d"`; \ fi # A simple macro automatically finding all the subdirectories containing ML sources, # setting the variable 'sourcedirectories' to a string containing all such # subdirectories, alphabetically sorted, separated by spaces, and finally echo'ing # the value of sourcedirectories: SOURCE_SUBDIRECTORIES = \ sourcedirectories=''; \ for d in `find -name _"build*" -prune -o -type d | grep -v "/[.]bzr\$$" | grep -v "/[.]bzr/" \ | grep -v /_build\$$ | grep -v /_build/ \ | grep -v ^.$$ | sort`; do \ if ls $$d/*.ml &> /dev/null || \ ls $$d/*.mli &> /dev/null || \ ls $$d/*.mll &> /dev/null || \ ls $$d/*.mly &> /dev/null ; then \ sourcedirectories+="$$d "; \ fi; \ done; \ echo $$sourcedirectories # Set the shell variable $(1) as the string obtained by prefixing each token # in $(2) with the prefix $(3): for example if the shell variable # 'sourcedirectories' is set to './A ./B' then # $(call ADD_PREFIX_TO_EACH_WORD, includes, $$sourcedirectories, -I) # sets the shell variable 'includes' to '-I ./A -I ./B '. # The value of $(1) is finally echo'ed. ADD_PREFIX_TO_EACH_WORD = \ $(call SOURCE_SUBDIRECTORIES); \ result=''; \ for element in $(2); do \ result+="$(3) $$element "; \ done; \ $(1)=$$result; \ echo $$result # This macro expands to the project name, extracted from META. No parameters. # Example: # echo "$(call PROJECT_NAME) is beautiful." PROJECT_NAME = \ $$( $(call GREP_AND_TEST,META,name); \ echo $$name ) # Automatically generate _tags and the $(OCAMLBUILD) plugin. Note that the # target name is never created as a file. This is intentional: those # two targets should be re-generated every time. ocamlbuild-stuff: _tags myocamlbuild.ml meta.ml # @(echo '_tags and myocamlbuild.ml were (re-)generated with success.') # We automatically generate the _tags file needed by OCamlBuild. # Every subdirectory containing sources is included. This may be more than what's needed, # but it will always work and require no per-project customization. sed is used to remove # the initial './' from each directory. We refer some settings implemented in our (still # automatically generated) $(OCAMLBUILD) plugin. # _tags: # (echo -e "# This file is automatically generated. Please don't edit it.\n" > $@; \ # for directory in $$( $(call SOURCE_SUBDIRECTORIES) ); do \ # directory=`echo $$directory | sed s/^.\\\\///`; \ # echo "<$$directory>: include" >> $@; \ # done; \ # echo >> $@; \ # echo "<**/*.{ml,mli,byte,native,cma}>: ourincludesettings" >> $@; \ # echo "<**/*.cmxa>: ourincludesettings" >> $@; \ # echo "<**/*.cmx>: ournativecompilesettings" >> $@; \ # echo "<**/*.cmo>: ourbytecompilesettings" >> $@; \ # echo "<**/*.byte>: ourincludesettings, ourbytelinksettings" >> $@; \ # echo "<**/*.native>: ourincludesettings, ournativelinksettings" >> $@; \ # echo "<**/*.{ml,mli}>: ourocamldocsettings" >> $@ ; \ # echo "<**/*.{ml,mli}>: ourppsettings" >> $@) _tags: @(echo -e "# This file is automatically generated. Please don't edit it.\n" > $@; \ for directory in $$( $(call SOURCE_SUBDIRECTORIES) ); do \ directory=`echo $$directory | sed s/^.\\\\///`; \ echo "<$$directory>: include" >> $@; \ done; \ echo >> $@; \ echo "<**/*.byte>: ourincludesettings, ourbytelinksettings, ourcmodules" >> $@; \ echo "<**/*.{ml,mli,byte,native,cma,cmxa}>: ourincludesettings" >> $@; \ echo "<**/*.{native,cma,cmxa}>: ourcmodules" >> $@ ; \ echo "<**/*.cmx>: ournativecompilesettings" >> $@; \ echo "<**/*.cmo>: ourbytecompilesettings" >> $@; \ echo "<**/*.native>: ourincludesettings, ournativelinksettings" >> $@; \ echo "<**/*.{ml,mli}>: ourocamldocsettings" >> $@ ; \ echo "<**/*.{ml,mli}>: ourppsettings" >> $@) # We automatically generate the $(OCAMLBUILD) plugin customizing the build process # with our user-specified options, include directories, etc.: myocamlbuild.ml: @($(call READ_CONFIG, ocaml_libraryprefix); \ echo -e "(* This file is automatically generated. Please don't edit it. *)\n" > $@; \ echo -e "open Ocamlbuild_plugin;;" >> $@; \ echo -e "open Command;;" >> $@; \ echo -e "open Arch;;" >> $@; \ echo -e "open Format;;\n" >> $@; \ echo -en "let our_pp_options = [ " >> $@; \ echo "Just for debugging: PP_OPTION is \"$(PP_OPTION)\""; \ for x in $(PP_OPTION); do \ echo -en "A \"$$x\"; " >> $@; \ done; \ echo -e "];;" >> $@; \ echo -en "let our_compile_options = [ " >> $@; \ for x in $(COMPILE_OPTIONS); do \ echo -en "A \"$$x\"; " >> $@; \ done; \ echo -e "];;" >> $@; \ echo -en "let our_byte_compile_options = [ " >> $@; \ for x in $(BYTE_COMPILE_OPTIONS); do \ echo -en "A \"$$x\"; " >> $@; \ done; \ echo -e "];;" >> $@; \ echo -en "let our_native_compile_options = [ " >> $@; \ for x in $(NATIVE_COMPILE_OPTIONS); do \ echo -en "A \"$$x\"; " >> $@; \ done; \ echo -e "];;" >> $@; \ echo -en "let our_include_options = [ " >> $@; \ echo -en "A \"-I\"; A \"$$ocaml_libraryprefix\"; " >> $@; \ # for x in $(DIRECTORIES_TO_INCLUDE); do \ # echo -en "A \"-I\"; A \"+$$x\"; " >> $@; \ # done; \ for x in $(DIRECTORIES_TO_INCLUDE); do \ echo -en "A \"-I\"; A \"$$ocaml_libraryprefix/$$x\"; " >> $@; \ done; \ echo -e "];;" >> $@; \ echo -en "let our_c_modules = [ " >> $@; \ for x in $(C_OBJECTS_TO_LINK); do \ echo -en "A \"$$x.o\"; " >> $@; \ done; \ echo -e "];;" >> $@; \ echo -en "let our_byte_link_options = our_include_options @ [ A \"-custom\"; " >> $@; \ for x in $(LIBRARIES_TO_LINK); do \ echo -en "A \"$$x.cma\"; " >> $@; \ done; \ for x in $(OBJECTS_TO_LINK); do \ echo -en "A \"$$x.cmo\"; " >> $@; \ done; \ echo -e "];;" >> $@; \ echo -en "let our_native_link_options = our_include_options @ [ " >> $@; \ for x in $(LIBRARIES_TO_LINK); do \ echo -en "A \"$$x.cmxa\"; " >> $@; \ done; \ for x in $(OBJECTS_TO_LINK); do \ echo -en "A \"$$x.cmx\"; " >> $@; \ done; \ echo -e "];;\n" >> $@; \ echo -e "dispatch (function After_rules ->" >> $@; \ echo -e " flag [\"ocaml\"; \"compile\"; \"ourincludesettings\"]" >> $@; \ echo -e " (S (our_compile_options @ our_include_options));" >> $@; \ echo -e " flag [\"ocaml\"; \"compile\"; \"ourbytecompilesettings\"]" >> $@; \ echo -e " (S (our_byte_compile_options));" >> $@; \ echo -e " flag [\"ocaml\"; \"compile\"; \"ournativecompilesettings\"]" >> $@; \ echo -e " (S (our_native_compile_options));" >> $@; \ echo -e " flag [\"ocaml\"; \"pp\"; \"ourppsettings\"]" >> $@; \ echo -e " (S our_pp_options);" >> $@; \ echo -e " flag [\"ocaml\"; \"link\"; \"ourbytelinksettings\"]" >> $@; \ echo -e " (S (our_compile_options @ our_byte_link_options));" >> $@; \ echo -e " flag [\"ocaml\"; \"link\"; \"ournativelinksettings\"]" >> $@; \ echo -e " (S (our_compile_options @ our_native_link_options));" >> $@; \ echo -e " flag [\"ocaml\"; \"doc\"; \"ourocamldocsettings\"]" >> $@; \ echo -e " (S ([A \"-keep-code\"; A \"-colorize-code\"] @ our_include_options));" >> $@; \ echo -e " flag [\"ocaml\"; \"link\"; \"ourcmodules\"]" >> $@; \ echo -e " (S our_c_modules);" >> $@; \ echo -e " | _ -> ());;" >> $@) # Auto-generate a source file including meta information and configuration-time # settings, which become accessible at runtime: meta.ml: META @(echo "Building $@..." && \ $(call READ_META, name, version); \ $(call READ_CONFIG, prefix, ocaml_libraryprefix, libraryprefix, configurationprefix, documentationprefix localeprefix); \ echo -e "(** Automatically generated meta-informations about the project and its building. *)" > $@ && \ echo -e "(* This file is automatically generated; please don't edit it. *)\n" >> $@ && \ echo -e "let name = \"$$name\";;" >> $@ && \ echo -e "let version = \"$$version\";;" >> $@ && \ echo -e "let prefix = \"$$prefix\";;" >> $@ && \ echo -e "let ocaml_libraryprefix = \"$$ocaml_libraryprefix\";;" >> $@ && \ echo -e "let libraryprefix = \"$$libraryprefix\";;" >> $@ && \ echo -e "let configurationprefix = \"$$configurationprefix\";;" >> $@ && \ echo -e "let localeprefix = \"$$localeprefix\";;" >> $@ && \ echo -e "let documentationprefix = \"$$documentationprefix\";;" >> $@ && \ echo -e "let uname = \"$(shell uname -srvmo)\";;" >> $@ && \ echo -e "let build_date = \"$(shell date '+%Y-%m-%d %k:%M:%S %z')\";;" >> $@ && \ if [ -d .bzr ]; then \ echo -e "let revision = \"$$(bzr revno)\";;" >> $@ && \ echo -e "let source_date = \"$$(bzr info --verbose | /bin/grep 'latest revision' | cut -d: -f2- | cut -d' ' -f3-)\";;" >> $@ && \ echo -e "let source_date_utc_yy_mm_dd = \"$$(./Makefile.d/bzr_date -- -u "+%Y-%m-%d")\";;" >> $@ ; \ else \ grep "let revision" > $@ && \ grep "let source_date" > $@ ; \ fi &&\ echo "Success.") meta.ml.released: meta.ml cp $< $@ ########################################################################### # Include the project-dependant file (if any) which implements the '-local' # targets: -include Makefile.local -include RPMS/Makefile marionnet-0.90.6+bzr434.orig/user_level.ml0000600000175000017500000020301712167200764017264 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008, 2009 Luca Saiu Copyright (C) 2007, 2009, 2010, 2013 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010, 2013 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** Some modules for managing the virtual network *) open Gettext;; module Recursive_mutex = MutexExtra.Recursive ;; (** A thunk allowing to invoke the sketch refresh method, accessible from many modules: *) module Refresh_sketch_thunk = Stateful_modules.Variable (struct type t = unit->unit let name = Some "Refresh_sketch_thunk" end) let refresh_sketch () = Refresh_sketch_thunk.extract () () (* *************************** * Module Dot_tuning * *************************** *) module Dot_tuning = struct (* ************************* class Dot_tuning.network ************************* *) type index = int;; (* 0..(length-1) *) type shuffler = index list ;; (* represents a permutation of indexes of a list*) (* This part of the state will be filled loading Gui_toolbar_DOT_TUNING. *) class type dot_tuning_high_level_toolbar_driver = object method get_iconsize : string method set_iconsize : string -> unit method get_nodesep : float method set_nodesep : float -> unit method get_labeldistance : float method set_labeldistance : float -> unit method get_extrasize : float method set_extrasize : float -> unit method get_image : GdkPixbuf.pixbuf method get_image_current_width : int method get_image_current_height : int method reset_image_size : unit -> unit method get_image_original_width : int method get_image_original_height : int end (* class type high_level_toolbar_driver *) (** Dot options for a network *) let network_marshaller = new Oomarshal.marshaller;; (* TODO: rename is in network_dot_tuning_zone *) class network = fun ?(iconsize="large") ?(shuffler=[]) ?(rankdir="TB") ?(nodesep=0.5) ?(labeldistance=1.6) ?(extrasize=0.) ?(curved_lines=false) (* The handler for the real network *) (network:( < reversed_cables:(string list); reversed_cable_set:(bool->string->unit); .. > )) -> object (self) inherit Xforest.interpreter () method direct_cable_color = "#949494" method crossover_cable_color = "#6d8dc0" val iconsize = Chip.wref ~name:"iconsize" iconsize method iconsize = iconsize val rankdir = Chip.wref ~name:"rankdir" rankdir method rankdir = rankdir val curved_lines = Chip.wswitch ~name:"curved_lines" curved_lines method curved_lines = curved_lines val shuffler = Chip.wref ~name:"shuffler" shuffler method shuffler = shuffler val nodesep = Chip.wref ~name:"nodesep" nodesep method nodesep = nodesep val labeldistance = Chip.wref ~name:"labeldistance" labeldistance method labeldistance = labeldistance val extrasize = Chip.wref ~name:"extrasize" extrasize method extrasize = extrasize method iconsize_for_dot = iconsize#get method shuffler_as_function = ListExtra.asFunction shuffler#get (* returns the permutation function *) method rankdir_for_dot = "rankdir="^(rankdir#get)^";" method nodesep_for_dot = let s=(string_of_float nodesep#get) in ("nodesep="^s^"; ranksep="^s) method labeldistance_for_dot = "labeldistance="^(string_of_float labeldistance#get) (** This is the method used in user gui callbacks (reactions) *) val mutable gui_callbacks_disable : bool = false method gui_callbacks_disable = gui_callbacks_disable method set_gui_callbacks_disable x = gui_callbacks_disable <- x method disable_gui_callbacks () = gui_callbacks_disable <- true method enable_gui_callbacks () = ignore (GMain.Timeout.add ~ms:500 ~callback:(fun () -> gui_callbacks_disable <- false; false)) method reset_shuffler () = shuffler#set [] method reset_extrasize () = begin self#toolbar_driver#reset_image_size (); extrasize#set 0.; end (* Delete _alone here: *) method reset_defaults () = begin iconsize#set "large"; shuffler#set []; rankdir#set "TB"; curved_lines#reset (); nodesep#set 0.5; labeldistance#set 1.6 ; ListExtra.foreach network#reversed_cables (network#reversed_cable_set false) ; self#reset_extrasize () ; self#set_toolbar_widgets () end method ratio : string = let extrasize = extrasize#get in if (extrasize = 0.) then "ratio=compress;" else begin let x = Widget.Image.inch_of_pixels self#toolbar_driver#get_image_original_width in let y = Widget.Image.inch_of_pixels self#toolbar_driver#get_image_original_height in let area = x *. y in let delta_area = extrasize *. area /. 100. in let delta = sqrt( (x+.y)**2. +. 4.*. delta_area ) -. (x+.y) in let x = string_of_float (x +. delta) in let y = string_of_float (y +. delta) in "size=\""^x^","^y^ "\";\nratio=fill;" end (** Accessor the dot tuning toolbar. This part of the state will be filled loading Gui_toolbar_DOT_TUNING. Inverted cables corresponds to dynamic menus, so they not need to be reactualized (the dynamic menus are recalculated each time from network#reversed_cables. *) val mutable toolbar_driver : dot_tuning_high_level_toolbar_driver option = None method set_toolbar_driver t = toolbar_driver <- Some t method toolbar_driver = match toolbar_driver with Some t -> t | None -> assert false (** The dotoption gui reactualization *) method set_toolbar_widgets () : unit = begin self#disable_gui_callbacks () ; self#toolbar_driver#set_iconsize iconsize#get ; self#toolbar_driver#set_nodesep nodesep#get ; self#toolbar_driver#set_labeldistance labeldistance#get ; self#toolbar_driver#set_extrasize extrasize#get ; self#enable_gui_callbacks () ; () end (** Marshalling is performed in this ugly way because directly dumping the whole [self] object would involve resolving references to Gtk callbacks, which are outside the OCaml heap and hence (understandably) not supported by the marshaller. *) (** Dump the current state of [self] into the given file. *) method save_to_file (file_name : string) = (* we are manually setting the verbosity 3 *) (if (Global_options.Debug_level.get ()) >= 3 then Xforest.print_xforest ~channel:stderr network#to_forest); network_marshaller#to_file self#to_forest file_name (** This method is used just for undumping dotoptions, so is not strict. For instance, exceptions provoked by bad cable names are simply ignored. *) method set_reversed_cables names = ListExtra.foreach names (fun n -> try (network#reversed_cable_set true n) with _ -> ()) (** Undump the state of [self] from the given file. *) method load_from_file (file_name : string) = let forest = network_marshaller#from_file file_name in (* we are manually setting the verbosity 3 *) (if (Global_options.Debug_level.get ()) >= 3 then Xforest.print_xforest ~channel:stderr forest); match Forest.to_tree forest with | (("dotoptions", attrs), children) -> self#from_tree ("dotoptions", attrs) children | _ -> assert false (** Dot_tuning to forest encoding. *) method to_tree : (string * (string * string) list) Forest.tree = Forest.tree_of_leaf ("dotoptions", [ ("iconsize" , iconsize#get ) ; ("shuffler" , (Xforest.encode shuffler#get) ) ; ("rankdir" , rankdir#get ) ; ("curved_lines" , (string_of_bool curved_lines#get)) ; ("nodesep" , (string_of_float nodesep#get) ) ; ("labeldistance" , (string_of_float labeldistance#get)) ; ("extrasize" , (string_of_float extrasize#get) ) ; ("gui_callbacks_disable", (string_of_bool gui_callbacks_disable)) ; ("invertedCables", (Xforest.encode network#reversed_cables)) ; ]) (** A Dotoption.network has just attributes (no children) in this version. The Dotoption.network must be undumped AFTER the Netmodel.network in order to have significant cable names (reversed_cables). *) method eval_forest_attribute = function | ("iconsize" , x ) -> self#iconsize#set x | ("shuffler" , x ) -> self#shuffler#set (Xforest.decode x) | ("rankdir" , x ) -> self#rankdir#set x | ("curved_lines" , x ) -> self#curved_lines#set_to (bool_of_string x) | ("nodesep" , x ) -> self#nodesep#set (float_of_string x) | ("labeldistance" , x ) -> self#labeldistance#set (float_of_string x) | ("extrasize" , x ) -> self#extrasize#set (float_of_string x) | ("gui_callbacks_disable", x ) -> self#set_gui_callbacks_disable (bool_of_string x) | ("invertedCables" , x ) -> self#set_reversed_cables (Xforest.decode x) | _ -> () (* Forward-comp. *) end;; (* class Dot_tuning.network *) end;; (* module Dot_tuning *) type devkind = [ `Machine | `Hub | `Switch | `Router | `World_gateway | `World_bridge | `Cloud ] ;; type nodename = string ;; (** Examples: "eth0", "port3" *) type receptname = string ;; type name = string ;; type label = string ;; let nolabel = "";; (** iconsize may be "small", "med", "large" or "xxl". *) type iconsize = string ;; (** {2 Classes} *) type simulated_device_automaton_state = NoDevice (** *) | DeviceOff (** *) | DeviceOn (** *) | DeviceSleeping (** *) ;; let string_of_simulated_device_automaton_state = function | DeviceOff -> "DeviceOff" | DeviceOn -> "DeviceOn" | DeviceSleeping -> "DeviceSleeping" | NoDevice -> "NoDevice" ;; exception ForbiddenTransition;; let raise_forbidden_transition msg = Log.printf "ForbiddenTransition raised in %s\n" msg; raise ForbiddenTransition ;; (** This represents the current state of a simulated device (as per network_simulation.ml) and enables easy high-level state transitions which conveniently hide the complexity of managing switches and cables; when the user tries to invoke any forbidden state transition an exception is raised. *) class virtual ['parent] simulated_device () = object(self) initializer self#add_destroy_callback (lazy self#destroy_my_simulated_device); (** We have critical sections here: *) val mutex = Recursive_mutex.create () (** The current automaton state, and its access method: *) val automaton_state = ref NoDevice (** Get the state of simulated device. *) method simulated_device_state = !automaton_state (** This string will be used to select the good icon for the dot sketch. *) method string_of_simulated_device_state = match !automaton_state with | DeviceOff -> "off" | DeviceOn -> "on" | DeviceSleeping -> "pause" | _ -> "off" (* Sometimes the sketch is builded in this state, so... *) (** For debugging. Failthful translation of constructors: *) method automaton_state_as_string = string_of_simulated_device_automaton_state !automaton_state (** The automaton state this device is going to. This is only used for the GUI and is not guaranteed to be accurate in case of concurrent access. It's only guaranteed to always hold some value of the correct type. If no transition is occurring then the ref should hold None. *) val next_automaton_state = ref (Some NoDevice) method next_simulated_device_state = !next_automaton_state method set_next_simulated_device_state state = next_automaton_state := state; refresh_sketch (); (* show our transient simulation state icon *) method virtual get_name : string (** The device implementing the object in the simulated network, if any (this is ref None when the device has not been started yet, or some state modification happened) *) val simulated_device : 'parent Simulation_level.device option ref = ref None method get_hublet_process_of_port index = match !simulated_device with | Some (sd) -> sd#get_hublet_process_of_port index | None -> failwith "looking for a hublet when its device is non-existing" (** Create a new simulated device according to the current status *) method virtual make_simulated_device : 'parent Simulation_level.device (** Return the list of cables directly linked to a port of self as an endpoint. This is needed so that simulated cables can be automatically started/destroyed as soon as both their endpoints are created/destroyed *) method private get_involved_cables = [] (** Return true iff hublet processes are currently existing. This is only meaningful for devices which can actually have hublets *) method has_hublet_processes = match !simulated_device with Some(_) -> true | None -> false method private enqueue_task_with_progress_bar verb thunk = let text = verb ^ " " ^ self#get_name in let progress_bar = ref None in Task_runner.the_task_runner#schedule ~name:text (fun () -> (try progress_bar := Some (Simple_dialogs.make_progress_bar_dialog ~title:text ()); thunk (); with e -> begin Log.printf "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"; let message = Printf.sprintf "enqueue_task_with_progress_bar: %s %s failed (%s)" verb self#get_name (Printexc.to_string e) in Log.printf "%s\n" message; Simple_dialogs.warning message message (); Log.printf "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"; end)); Task_runner.the_task_runner#schedule ~name:("Destroy the progress bar for \"" ^ text ^ "\"") (fun () -> match !progress_bar with Some progress_bar -> Simple_dialogs.destroy_progress_bar_dialog progress_bar | None -> assert false) (* method reboot_if_possible = try self#suspend; self#startup; with _ -> () *) method create = (* This is invisible for the user: don't set the next state *) Task_runner.the_task_runner#schedule ~name:("create "^self#get_name) (fun () -> self#create_right_now) method (*private*) destroy_my_simulated_device = Log.printf "component \"%s\": destroying my simulated device.\n" self#get_name; (* This is invisible for the user: don't set the next state *) Task_runner.the_task_runner#schedule ~name:("destroy "^self#get_name)(fun () -> self#destroy_right_now) method startup = self#set_next_simulated_device_state (Some DeviceOn); self#enqueue_task_with_progress_bar (s_ "Starting") (fun () -> if self#can_startup then self#startup_right_now) method suspend = self#set_next_simulated_device_state (Some DeviceSleeping); self#enqueue_task_with_progress_bar (s_ "Suspending") (fun () -> if self#can_suspend then self#suspend_right_now) method resume = self#set_next_simulated_device_state (Some DeviceOn); self#enqueue_task_with_progress_bar (s_ "Resuming") (fun () -> if self#can_resume then self#resume_right_now) method gracefully_shutdown = self#set_next_simulated_device_state (Some DeviceOff); self#enqueue_task_with_progress_bar (s_ "Stopping") (fun () -> if self#can_gracefully_shutdown then self#gracefully_shutdown_right_now) method poweroff = self#set_next_simulated_device_state (Some DeviceOff); self#enqueue_task_with_progress_bar (s_ "Shutting down") (fun () -> if self#can_poweroff then self#poweroff_right_now) method (*private*) create_right_now = Recursive_mutex.with_mutex mutex (fun () -> Log.printf "About to create the simulated device %s: it's connected to %d cables.\n" self#get_name (List.length (self#get_involved_cables)); match !automaton_state, !simulated_device with | NoDevice, None -> ( simulated_device := (Some self#make_simulated_device); automaton_state := DeviceOff; self#set_next_simulated_device_state None; (* An endpoint for cables linked to self was just added; we need to start some cables. *) ignore (List.map (fun cable -> Log.printf "Working on cable %s\n" (cable#show ""); cable#increment_alive_endpoint_no) (self#get_involved_cables))) | _ -> raise_forbidden_transition "create_right_now") (** The unit parameter is needed: see how it's used in simulated_network: *) method private destroy_because_of_unexpected_death () = Log.printf "You don't deadlock here %s, do you? -1\n" self#get_name; Recursive_mutex.with_mutex mutex (fun () -> Log.printf "You don't deadlock here %s, do you? 0\n" self#get_name; (try self#destroy_right_now with e -> begin Log.printf "WARNING: destroy_because_of_unexpected_death: failed (%s)\n" (Printexc.to_string e); end; self#set_next_simulated_device_state None)); (* don't show next-state icons for this *) method (*private*) destroy_right_now = Recursive_mutex.with_mutex mutex (fun () -> Log.printf "About to destroy the simulated device %s \n" self#get_name; match !automaton_state, !simulated_device with | (DeviceOn | DeviceSleeping), Some(d) -> Log.printf " (destroying the on/sleeping device %s. Powering it off first...)\n" self#get_name; self#poweroff_right_now; (* non-gracefully *) self#destroy_right_now | NoDevice, None -> Log.printf " (destroying the already 'no-device' device %s. Doing nothing...)\n" self#get_name; () (* Do nothing, but don't fail. *) | DeviceOff, Some(d) -> ((* An endpoint for cables linked to self was just added; we may need to start some cables. *) Log.printf " (destroying the off device %s: decrementing its cables rc...)\n" self#get_name; List.iter (fun cable -> Log.printf "Unpinning the cable %s " (cable#show ""); cable#decrement_alive_endpoint_no; Log.printf ("The cable %s was unpinned with success\n") (cable#show ""); ) self#get_involved_cables; Log.printf " (destroying the simulated device implementing %s...)\n" self#get_name; d#destroy; (* This is the a method from some object in Simulation_level *) simulated_device := None; automaton_state := NoDevice; self#set_next_simulated_device_state None; Log.printf "We're not deadlocked yet (%s). Great.\n" self#get_name); | _ -> raise_forbidden_transition "destroy_right_now" ); Log.printf "The simulated device %s was destroyed with success\n" self#get_name method (*private*) startup_right_now = Recursive_mutex.with_mutex mutex (fun () -> (* Don't startup ``incorrect'' devices. This is currently limited to cables of the wrong crossoverness which the user has defined by mistake: *) if self#is_correct then begin Log.printf "Starting up the device %s...\n" self#get_name; match !automaton_state, !simulated_device with | NoDevice, None -> (Log.printf "Creating processes for %s first...\n" self#get_name; self#create_right_now; Log.printf "Processes for %s were created...\n" self#get_name; self#startup_right_now ) | DeviceOff, Some(d) -> (d#startup; (* This is the a method from some object in Simulation_level *) automaton_state := DeviceOn; self#set_next_simulated_device_state None; Log.printf "The device %s was started up\n" self#get_name ) | DeviceOn, _ -> Log.printf "startup_right_now: called in state %s: nothing to do.\n" (self#automaton_state_as_string) | _ -> raise_forbidden_transition "startup_right_now" end else begin Log.printf "REFUSING TO START UP the ``incorrect'' device %s!!!\n" self#get_name end) method (*private*) suspend_right_now = Recursive_mutex.with_mutex mutex (fun () -> Log.printf "Suspending up the device %s...\n" self#get_name; match !automaton_state, !simulated_device with DeviceOn, Some(d) -> (d#suspend; (* This is the a method from some object in Simulation_level *) automaton_state := DeviceSleeping; self#set_next_simulated_device_state None) | _ -> raise_forbidden_transition "suspend_right_now") method (*private*) resume_right_now = Recursive_mutex.with_mutex mutex (fun () -> Log.printf "Resuming the device %s...\n" self#get_name; match !automaton_state, !simulated_device with | DeviceSleeping, Some(d) -> (d#resume; (* This is the a method from some object in Simulation_level *) automaton_state := DeviceOn; self#set_next_simulated_device_state None) | _ -> raise_forbidden_transition "resume_right_now") method (*private*) gracefully_shutdown_right_now = Recursive_mutex.with_mutex mutex (fun () -> let current_state = self#automaton_state_as_string in (Log.printf "* Gracefully shutting down the device %s (from state: %s)...\n" self#get_name current_state); match !automaton_state, !simulated_device with | DeviceOn, Some(d) -> (d#gracefully_shutdown; (* This is the a method from some object in Simulation_level *) automaton_state := DeviceOff; self#set_next_simulated_device_state None) | DeviceSleeping, Some(d) -> (self#resume_right_now; self#gracefully_shutdown_right_now) | NoDevice, _ | DeviceOff, _ -> Log.printf "gracefully_shutdown_right_now: called in state %s: nothing to do.\n" (self#automaton_state_as_string) | _ -> raise_forbidden_transition "gracefully_shutdown_right_now") method (*private*) poweroff_right_now = Recursive_mutex.with_mutex mutex (fun () -> Log.printf "Powering off the device %s...\n" self#get_name; match !automaton_state, !simulated_device with | DeviceOn, Some(d) -> (d#shutdown; (* non-gracefully *) automaton_state := DeviceOff; self#set_next_simulated_device_state None) | DeviceSleeping, Some(d) -> (self#resume_right_now; self#poweroff_right_now) | NoDevice, _ | DeviceOff, _ -> Log.printf "poweroff_right_now: called in state %s: nothing to do.\n" (self#automaton_state_as_string) | _ -> raise_forbidden_transition "poweroff_right_now") (** Return true iff the current state allows the user to 'startup' the device from the GUI. *) method can_startup = Recursive_mutex.with_mutex mutex (fun () -> match !automaton_state with NoDevice | DeviceOff -> true | _ -> false) (** Return true iff the current state allows the user to 'shutdown' a device from the GUI. *) method can_gracefully_shutdown = Recursive_mutex.with_mutex mutex (fun () -> match !automaton_state with DeviceOn | DeviceSleeping -> true | _ -> false) (** Return true iff the current state allows the user to 'power off' a device from the GUI. *) method can_poweroff = Recursive_mutex.with_mutex mutex (fun () -> match !automaton_state with NoDevice | DeviceOff -> false | _ -> true) (** Return true iff the current state allows the user to 'suspend' a device from the GUI. *) method can_suspend = Recursive_mutex.with_mutex mutex (fun () -> match !automaton_state with DeviceOn -> true | _ -> false) (** Return true iff the current state allows the user to 'resume' a device from the GUI. *) method can_resume = Recursive_mutex.with_mutex mutex (fun () -> match !automaton_state with DeviceSleeping -> true | _ -> false) (** 'Correctness' support: this is needed so that we can refuse to start incorrectly placed components such as Ethernet cables of the wrong crossoverness, which the user may have created by mistake: *) method is_correct = true (* redefined in cables *) end;; (* *************************** * class common * *************************** *) (** The shared generator for all unique ids: *) let generator = Counter.make_int_generator ();; (** General-purpose class with common fields as - an automatically generated identifier - a (mutable) name; i.e. valid string identifier - a (mutable) label (string) not containing '<' and '>' (for prevent conflict with dot) *) class id_name_label = fun ?(name="noname") ?(label="") () -> (* Some checks over used name and label *) let wellFormedLabel x = not (StrExtra.First.matchingp (Str.regexp ".*[><].*") x) in let check_name x = if not (StrExtra.Class.identifierp x) then failwith ("Setting component "^name^": invalid name") else x in let check_label x = if not (wellFormedLabel x) then failwith ("Setting component "^name^": invalid label") else (StringExtra.strip x) in object (self) (** A component has an immutable identifier. *) val id : int = generator () method id = id (** A component has a mutable name. *) val mutable name : string = check_name name method get_name = name method set_name x = name <- check_name x (* A shortcut for get_name *) method name = name (** A component has a label, usually used by dot drawing the network graph. *) val mutable label : string = check_label label method get_label : string = label method set_label x = label <- check_label x end;; (* *************************** * class component * *************************** *) (** A component may be a node (machine or device) or a cable (direct, crossover or nullmodem). It's simply a thing with a name and an associated (mutable) label. *) class virtual component = fun ~(network:< .. >) ?(name="noname") ?(label="") () -> object (self) inherit id_name_label ~name ~label () inherit Xforest.interpreter () (** The global network. It's a pain to have to access this via a global variable define in Marionnet *) val network = network method virtual can_suspend : bool method virtual can_resume : bool method virtual suspend : unit method virtual resume : unit end;; (* *************************** * class port * *************************** *) (** Essentially a triple (user_name, user_index, internal_index) *) class port ~port_prefix (* ex: "eth" or "port" *) ~internal_index (* 0-based numbering *) ~user_port_offset () = let user_index = (internal_index + user_port_offset) in let user_name = Printf.sprintf "%s%d" port_prefix user_index in object method user_name = user_name (* ex: port1 *) method user_index = user_index (* ex: 1 *) method internal_index = internal_index (* ex: 0 *) end;; (** Just a container of ports: *) class ['parent] ports_card ~network ~(parent:'parent) ~port_no ~port_prefix ?(user_port_offset=0) () = let () = assert (port_no >= 0) in let port_array = Array.init port_no (fun i -> new port ~port_prefix ~internal_index:i ~user_port_offset ()) in let port_list = Array.to_list port_array in object (self) method port_no = port_no method port_prefix = port_prefix method user_port_offset = user_port_offset method internal_index_of_user_port_name x = (List.find (fun p->p#user_name = x) port_list)#internal_index method user_port_index_of_user_port_name x = (List.find (fun p->p#user_name = x) port_list)#user_index method user_port_name_of_internal_index i = (Array.get port_array i)#user_name method user_port_index_of_internal_index i = (Array.get port_array i)#user_index method user_port_name_list = List.map (fun x->x#user_name) port_list method private get_my_defects_by_index (port_index:int) (port_direction:Treeview_defects.port_direction) = let get column_header = network#defects#get_port_attribute_of ~device_name:((parent#get_name):string) ~port_prefix ~port_index ~user_port_offset ~port_direction ~column_header () in object method loss : float = get "Loss %" method duplication : float = get "Duplication %" method flip : float = get "Flipped bits %" method min_delay : float = get "Minimum delay (ms)" method max_delay : float = get "Maximum delay (ms)" end method get_my_inward_defects_by_index (port_index:int) = self#get_my_defects_by_index port_index Treeview_defects.OutToIn method get_my_outward_defects_by_index (port_index:int) = self#get_my_defects_by_index port_index Treeview_defects.InToOut end (** class ports_card *) (* *************************** * class node * *************************** *) (** Machines and routers have MDI ports, switches and hubs have MDI_X a priori. Currently, devices are sold with "intelligent" ports, i.e. MDI/MDI-X. *) type polarity = MDI | MDI_X | Intelligent ;; (** A node of the network is essentially a container of ports. Defects may be added after the creation, using the related method. *) class virtual node_with_ports_card = fun ~network ~name ?label ~(devkind:devkind) ~port_no ~port_prefix ~port_no_min ~port_no_max ?(user_port_offset=0) ?(has_ledgrid=false) () -> let make_ports_card ~parent ~port_no = new ports_card ~network ~parent ~port_no ~port_prefix ~user_port_offset () in object (self) inherit component ~network ~name ?label () inherit (*the parent:*) [node_with_ports_card] simulated_device () (* Building constant parameters: *) method user_port_offset = user_port_offset method port_prefix = port_prefix val mutable ports_card = None initializer ports_card <- Some (make_ports_card ~parent:self ~port_no) method ports_card = Option.extract ports_card method get_port_no = self#ports_card#port_no method set_port_no new_port_no = if (new_port_no >= port_no_min) && (new_port_no <= port_no_max) then ports_card <- Some (make_ports_card ~parent:self ~port_no:new_port_no) else invalid_arg "node_with_ports_card#set_port_no" method port_no_min = port_no_min method port_no_max = port_no_max method has_ledgrid = has_ledgrid method virtual destroy : unit (** 'Static' methods (in the sense of C++/Java). Polarity is used to decide the correct kind of Ethernet cable needed to connect a pair of devices: the cable should be crossover iff both endpoints have the same polarity: *) method virtual polarity : polarity (** The kind of the device (if the node is a device). *) method devkind = devkind method virtual string_of_devkind : string (* This is a default, but could be redefined: *) method leds_relative_subdir = self#string_of_devkind (** Returns an image representig the node with the given iconsize. *) method virtual dotImg : iconsize -> string (** Returns the label to use for cable representation. This method may be redefined (for instance in [world_bridge]). *) method dotLabelForEdges (receptname:string) = self#get_label (** Returns the port to use for cable representation. This method may be redefined (for instance in [world_bridge]). *) method dotPortForEdges (receptname:string) = receptname (** A node is represented in dot with an HTML label which is a table with a first line containing the name, with a second line containing the node associated image (method [dotImg]), and, if the node has a label, a third line containing the label. With the [nodeoptions] parameter one can force, for example, the fontsize or fontname for both name and label : [ dotTrad ~nodeoptions="fontsize=8" "large" ] *) method dotTrad ?(nodeoptions="") (z:iconsize) = let label = self#label_for_dot in let label_line = if label="" then "" else ""^label^"" in let fontsize = self#dot_fontsize_statement in let nodeoptions = if nodeoptions = "" then "" else (nodeoptions^",") in begin self#get_name^" ["^fontsize^nodeoptions^"shape=plaintext,label=< "^label_line^"
    "^self#get_name^"
    >];" end (* Redefined in User_level_machine as "": *) method dot_fontsize_statement = "fontsize=8," (** Could be redefined. *) method label_for_dot = self#get_label (** make_simulated_device is defined in subclasses, not here *) (* TODO: move it in the network class Return the list of cables of which a port of self is an endpoint: *) method private get_involved_cables = List.filter (fun c->c#is_node_involved self#get_name) network#cables#get end;; (* Justa an alias: *) class type virtual node = node_with_ports_card class virtual node_with_defects_zone ~network () = object (self) method virtual defects_device_type : string method virtual get_name : string method virtual get_port_no : int method virtual port_prefix : string method virtual user_port_offset : int method virtual add_destroy_callback : unit Lazy.t -> unit method private add_my_defects = match (network#defects:Treeview_defects.t)#unique_row_exists_with_binding "Name" self#get_name with | true -> Log.printf "The %s %s has already defects defined...\n" self#defects_device_type self#get_name | false -> network#defects#add_device ~device_name:self#get_name ~device_type:self#defects_device_type ~port_no:self#get_port_no ~port_prefix:self#port_prefix ~user_port_offset:self#user_port_offset () method private destroy_my_defects = Log.printf "component \"%s\": destroying my defects.\n" self#get_name; network#defects#remove_subtree_by_name self#get_name; method private defects_update_port_no new_port_no = network#defects#update_port_no ~device_name:self#get_name ~port_no:new_port_no ~port_prefix:self#port_prefix ~user_port_offset:self#user_port_offset () initializer self#add_my_defects; self#add_destroy_callback (lazy self#destroy_my_defects); end class virtual node_with_defects ~network ~name ?(label="") ~devkind ~port_no ~port_no_min ~port_no_max ?user_port_offset ~port_prefix () = let network_alias = network in object (self) inherit node_with_ports_card ~network ~name ~label ~devkind ~port_no ~port_no_min ~port_no_max ~port_prefix ?user_port_offset () as self_as_node_with_ports_card initializer (* TODO: the following line must be moved the a node initializer: *) network#add_node (self :> node); self#add_destroy_callback (lazy (network#del_node_by_name self#get_name)); inherit node_with_defects_zone ~network:network_alias () as node_with_defects_zone method virtual dotImg : iconsize -> string (** Returns the label to use for cable representation. For devices, the port X is represented by the string "[X]". *) method dotLabelForEdges (receptname:string) = let user_index = self#ports_card#user_port_index_of_user_port_name receptname in ("["^string_of_int user_index^"]") (** Return the string representing the port in cable representation. * Ignore the receptname and returns the empty string. *) method dotPortForEdges (receptname:string) = "" (* REDEFINED: *) (* TODO: duplicated code *) method set_name new_name = let old_name = self#get_name in if old_name <> new_name then begin network#defects#rename old_name new_name; self_as_node_with_ports_card#set_name new_name; end; (* REDEFINED: *) (* TODO: duplicated code *) method set_port_no new_port_no = let old_port_no = self#get_port_no in if new_port_no <> old_port_no then begin node_with_defects_zone#defects_update_port_no new_port_no; self_as_node_with_ports_card#set_port_no new_port_no; end; method update_with ~name ~label ~port_no = (* No: force because the simulated device may be rebuilded with new values of other parameters *) (* if self#update_really_needed ~name ~label ~port_no then *) begin self#destroy_my_simulated_device; self#set_name name; self#set_port_no port_no; self#set_label label; end end;; (* class node_with_defects *) (** Common class for hubs, switches and world_gateways (routers have a more specialized class): *) class virtual node_with_ledgrid_and_defects ~network ~name ?(label="") ~devkind ~port_no ~port_no_min ~port_no_max ?user_port_offset ~(port_prefix:string) (* "port" or "eth" *) () = let network_alias = network in object (self) inherit node_with_ports_card ~network ~name ~label ~devkind ~port_no ~port_no_min ~port_no_max ~port_prefix ~has_ledgrid:true ?user_port_offset () as self_as_node_with_ports_card initializer (* TODO: the following line must be moved the a node initializer: *) network#add_node (self :> node); self#add_destroy_callback (lazy (network#del_node_by_name self#get_name)); (* this is correct here: *) self#add_my_ledgrid; self#add_destroy_callback (lazy self#destroy_my_ledgrid); inherit node_with_defects_zone ~network:network_alias () as node_with_defects_zone (** Dot adjustments *) (** Returns an image representig the node with the given iconsize. *) method virtual dotImg : iconsize -> string (** Returns the label to use for cable representation. For nodes, the port X is represented by the string "[X]". *) method dotLabelForEdges (receptname:string) = let user_index = self#ports_card#user_port_index_of_user_port_name receptname in ("["^string_of_int user_index^"]") (** Return the string representing the port in cable representation. * Ignore the receptname and returns the empty string. *) method dotPortForEdges (receptname:string) = "" (** Here we also have to manage LED grids: *) method private startup_right_now = (* Do as usual... *) self_as_node_with_ports_card#startup_right_now; (* ...and also show the LED grid: *) network#ledgrid_manager#show_device_ledgrid ~id:(self#id) () method private gracefully_shutdown_right_now = (* Do as usual... *) self_as_node_with_ports_card#gracefully_shutdown_right_now; (* ...and also hide the LED grid... *) network#ledgrid_manager#hide_device_ledgrid ~id:(self#id) (); (** Here we also have to manage LED grids: *) method private poweroff_right_now = (* Do as usual... *) self_as_node_with_ports_card#poweroff_right_now; (* ...and also hide the LED grid... *) network#ledgrid_manager#hide_device_ledgrid ~id:(self#id) (); method ledgrid_image_directory = let leds_relative_subdir = self#leds_relative_subdir in (Initialization.Path.leds ^ leds_relative_subdir) (* may be redefined *) method ledgrid_title = self#get_name method virtual ledgrid_label : string method add_my_ledgrid = (* Make a new device LEDgrid: *) (network#ledgrid_manager:Ledgrid_manager.ledgrid_manager)#make_device_ledgrid ~id:(self#id) ~title:(self#get_name) ~label:(self#ledgrid_label) ~port_no:(self#get_port_no) ?port_labelling_offset:user_port_offset ~image_directory:self#ledgrid_image_directory (); (* Set port connection state: *) let busy_ports_indexes = network#busy_port_indexes_of_node (self :> node_with_ports_card) in ignore (List.map (fun port_index -> (network#ledgrid_manager#set_port_connection_state ~id:self#id ~port:port_index ~value:true ())) busy_ports_indexes) method destroy_my_ledgrid : unit = Log.printf "component \"%s\": destroying my ledgrid.\n" self#get_name; (network#ledgrid_manager:Ledgrid_manager.ledgrid_manager)#destroy_device_ledgrid ~id:(self#id) () (* REDEFINED: *) method set_name new_name = let old_name = self#get_name in if old_name <> new_name then begin network#defects#rename old_name new_name; self_as_node_with_ports_card#set_name new_name; end; (* REDEFINED: *) method set_port_no new_port_no = let old_port_no = self#get_port_no in if new_port_no <> old_port_no then begin node_with_defects_zone#defects_update_port_no new_port_no; self_as_node_with_ports_card#set_port_no new_port_no; end; (* method private update_really_needed ~(name:string) ~(label:string) ~(port_no:int) : bool = ((name <> self#get_name) || (label <> self#get_label) || (port_no <> self#get_port_no))*) method update_with ~name ~label ~port_no = (* No: force because the simulated device may be rebuilded with new values of other parameters *) (* if self#update_really_needed ~name ~label ~port_no then *) begin self#destroy_my_simulated_device; self#destroy_my_ledgrid; self#set_name name; self#set_port_no port_no; self#set_label label; self#add_my_ledgrid; (* may use all previous properties (including the label) *) end end;; (* ************************************* * class virtual_machine (common class for machine and router) * ************************************* *) class virtual virtual_machine_with_history_and_ifconfig ~network ?epithet (* An epithet, for instance "debian-lenny-42178" *) ?variant ?kernel (* Again an epithet, for instance "2.6.18-ghost" *) ?terminal ~(history_icon:string) ~(ifconfig_device_type:string) ?(ifconfig_port_row_completions:Treeview_ifconfig.port_row_completions option) ~(vm_installations:Disk.virtual_machine_installations) () = let epithet = match epithet with | Some x -> x | None -> Option.extract vm_installations#filesystems#get_default_epithet in let kernel = match kernel with | Some x -> x | None -> Option.extract vm_installations#kernels#get_default_epithet in let terminal = match terminal with | Some x -> x | None -> (vm_installations#terminal_manager_of epithet)#get_default in object (self) initializer self#add_my_ifconfig ?port_row_completions:ifconfig_port_row_completions self#get_port_no; self#add_destroy_callback (lazy self#destroy_my_ifconfig); self#add_my_history; self#add_destroy_callback (lazy self#destroy_my_history); (* Paramters *) method history_icon = history_icon method ifconfig_device_type = ifconfig_device_type method private banner = (Printf.sprintf "User_level.virtual_machine: setting %s: " self#get_name) method sprintf : 'a. ('a, unit, string, string) format4 -> 'a = Printf.ksprintf (fun x->self#banner^x) method failwith : 'a 'b. ('a, unit, string, string) format4 -> 'b = Obj.magic (Printf.ksprintf (fun x-> let msg = self#banner^x in let () = Log.printf "%s\n" msg in failwith msg)) (** A machine has a Linux filesystem *) val mutable epithet : string = epithet initializer ignore (self#check_epithet epithet) method get_epithet = epithet method set_epithet x = epithet <- self#check_epithet x method private check_epithet x = match (vm_installations#filesystems#epithet_exists x) with | true -> x | false -> self#failwith "unknown filesystem %s" x (** A machine may have an associated initial variant: *) val mutable variant : string option = variant initializer ignore (Option.map (self#check_variant) variant) method get_variant = variant method get_variant_as_string = match variant with None -> "" | Some x -> x method set_variant (x:string option) = variant <- (Option.map (self#check_variant) x) method private check_variant x = let v = vm_installations#variants_of epithet in match v#epithet_exists x with | true -> x | false -> self#failwith "the variant \"%s\" is not available" x method get_variant_realpath : string option = Option.map (vm_installations#variants_of self#get_epithet)#realpath_of_epithet self#get_variant (** A machine has an associated linux kernel, expressed by an epithet: *) val mutable kernel : string = kernel initializer ignore (self#check_kernel kernel) method get_kernel = kernel method set_kernel x = kernel <- self#check_kernel x method private check_kernel x = match (vm_installations#kernels#epithet_exists kernel) with | true -> x | false -> self#failwith "unknown kernel \"%s\"" x (** A machine can be used accessed in a specific terminal mode. *) val mutable terminal : string = terminal initializer ignore (self#check_terminal terminal) method get_terminal = terminal method set_terminal x = terminal <- self#check_terminal x method private check_terminal x = match (vm_installations#terminal_manager_of epithet)#is_valid_choice x with | true -> x | false -> self#failwith "invalid terminal choice \"%s\"" x method get_filesystem_file_name = vm_installations#filesystems#realpath_of_epithet (self#get_epithet) method get_kernel_file_name = vm_installations#kernels#realpath_of_epithet (self#get_kernel) method get_kernel_console_arguments : string option = vm_installations#get_kernel_console_arguments (self#get_epithet) (self#get_kernel) method get_filesystem_relay_script : string option = vm_installations#relay_script_of (self#get_epithet) method is_xnest_enabled = (vm_installations#terminal_manager_of self#get_epithet)#is_xnest (self#get_terminal) (* Used only to add a filesystem history device: *) method private prefixed_epithet = (vm_installations#prefix ^ self#get_epithet) method add_my_history = let icon = self#history_icon in let name = self#get_name in match ((network#history:Treeview_history.t)#number_of_states_with_name name) > 0 with | true -> Log.printf "The virtual machine %s has already history defined...\n" name | false -> network#history#add_device ~name ~prefixed_filesystem:self#prefixed_epithet ?variant:self#get_variant ~icon () method add_my_ifconfig ?(port_row_completions:Treeview_ifconfig.port_row_completions option) (port_no:int) : unit = match (network#ifconfig:Treeview_ifconfig.t)#unique_row_exists_with_binding "Name" self#get_name with | true -> Log.printf "The %s %s has already ifconfig defined...\n" self#ifconfig_device_type self#get_name | false -> begin network#ifconfig#add_device ?port_row_completions self#get_name ifconfig_device_type self#get_port_no end method destroy_my_ifconfig = Log.printf "component \"%s\": destroying my ifconfig.\n" self#get_name; network#ifconfig#remove_subtree_by_name self#get_name; method destroy_my_history = Log.printf "component \"%s\": destroying my history.\n" self#get_name; network#history#remove_device_tree self#get_name; method update_virtual_machine_with ~name ~port_no kernel = network#ifconfig#update_port_no self#get_name port_no; network#ifconfig#rename self#get_name name; network#history#rename self#get_name name; self#set_kernel kernel; method get_states_directory = let history = (network#history:Treeview_history.t) in (Option.extract history#directory#get) method create_cow_file_name_and_thunk_to_get_the_source = let history = (network#history:Treeview_history.t) in let cow_file_name = Printf.sprintf "%s%s" (Option.extract history#directory#get) (history#add_state_for_device self#get_name) in (* Thunk that will be used by the simulation level to retreive the source cow file to be copied (if needed). The procedure looks backward in the tree searching the first ancestor with a cow_file_name corresponding to an existing file. If there are no existing files, it looks for the optional variant_realpath.*) let dynamically_get_the_cow_file_name_source = let rec find_first_existing_ancestor cow_file_name = match history#get_parent_cow_file_name ~cow_file_name () with (* The state hasn't a parent with an existing cow_file_name: its a root. The are now two subcases according to the presence of a variant: if there is no variant, there is nothing to copy; otherwise the file to copy is precisely the variant (its realpath): *) | None -> self#get_variant_realpath (* The state has a parent, but its cow_file_name could be fictive, so we have to distinguish two subcases: *) | Some cow_file_name_parent -> if Cow_files.cow_file_exists ~states_directory:(self#get_states_directory) ~cow_file_name:cow_file_name_parent () then (Some cow_file_name_parent) else find_first_existing_ancestor cow_file_name_parent in fun () -> find_first_existing_ancestor cow_file_name in (cow_file_name, dynamically_get_the_cow_file_name_source) end;; (* class virtual_machine_with_history_and_ifconfig *) (* *************************** * class network * *************************** *) class type endpoint = object method node : node method port_index : int method user_port_name : string method user_port_index : int method involved_node_and_port_index : node * int end class type virtual cable = object (* inherit OoExtra.destroy_methods *) inherit component inherit [component] simulated_device method destroy : unit method get_left : endpoint method get_right : endpoint method involved_node_and_port_index_list : (node * int) list method is_node_involved : string -> bool method crossover : bool method is_reversed : bool method set_reversed : bool -> unit method show : string -> string method dot_traduction : curved_lines:bool -> labeldistance:float -> string method decrement_alive_endpoint_no : unit method increment_alive_endpoint_no : unit method is_connected : bool end (** Class modelling the user-level network *) class network () = let ledgrid_manager = Ledgrid_manager.the_one_and_only_ledgrid_manager in object (self) inherit Xforest.interpreter () (* TODO: remove these pointers, we have access to these informations by ports_card and endpoint: *) method defects = Treeview_defects.extract () method ifconfig = Treeview_ifconfig.extract () method history = Treeview_history.extract () method motherboard = Motherboard.extract () val nodes : node Chip.wlist = Chip.wlist ~name:"network#nodes" [] method nodes = nodes val cables : cable Chip.wlist = Chip.wlist ~name:"network#cables" [] method cables = cables (** Buffers to backup/restore data. *) val mutable nodes_buffer : (node list) = [] val mutable cables_buffer : (cable list) = [] (** Accessors *) method ledgrid_manager = ledgrid_manager (** Related dot options fro drawing this virtual network. This pointer is shared with the project instance. *) val mutable dotoptions : (Dot_tuning.network option) = None method dotoptions = match dotoptions with Some x -> x | None -> raise (Failure "network#dotoptions") method set_dotoptions x = dotoptions <- Some x method components : (component list) = List.append (nodes#get :> component list) (cables#get :> component list) (* CABLES MUST BE AT THE FINAL POSITION for marshaling !!!! *) method components_of_kind ?(kind:[`Node | `Cable] option) () = match kind with | None -> self#components | Some `Node -> (nodes#get :> (component list)) | Some `Cable -> (cables#get :> (component list)) method disjoint_union_of_nodes_and_cables : ((component * [`Node | `Cable]) list) = let xs = List.map (fun x -> x,`Node ) (nodes#get :> component list) in let ys = List.map (fun x -> x,`Cable) (cables#get :> component list) in List.append xs ys (** Setter *) (* The optional parameter [scheduled=true] means that this method is called in a task managed by the Task_runner. In this case, we have not to call the task runner method [wait_for_all_currently_scheduled_tasks]. *) method reset ?(scheduled=false) () = begin Log.print_string "---\n"; Log.printf "network#reset: begin\n"; Log.printf "\tDestroying all cables...\n"; (List.iter (fun cable -> try cable#destroy with _ -> ()) cables#get); Log.printf "\tDestroying all nodes (machines, switchs, hubs, routers, etc)...\n"; (List.iter (fun node -> try node#destroy with _ -> ()) nodes#get); Log.printf "\tSynchronously wait that everything terminates...\n"; (if not scheduled then Task_runner.the_task_runner#wait_for_all_currently_scheduled_tasks); Log.printf "\tMaking the network graph empty...\n"; nodes#set [] ; cables#set [] ; Log.printf "\tWait for all devices to terminate...\n"; (** Make sure that all devices have actually been terminated before going on: we don't want them to lose filesystem access: *) Log.printf "\tAll devices did terminate.\n"; Log.printf "network#reset: end (success)\n"; Log.print_string "---\n"; end method destroy_process_before_quitting () = begin Log.printf "destroy_process_before_quitting: BEGIN\n"; (List.iter (fun cable -> try cable#destroy_right_now with _ -> ()) cables#get); (List.iter (fun device -> try device#destroy_right_now with _ -> ()) nodes#get); Log.printf "destroy_process_before_quitting: END (success)\n"; end method restore_from_buffers = begin self#reset (); nodes#set nodes_buffer; cables#set cables_buffer; end method save_to_buffers = begin nodes_buffer <- nodes#get; cables_buffer <- cables#get; end method to_tree = let l = List.map (fun x->x#to_tree) self#components in let root = ("network",[]) in let children = Forest.of_treelist l in (root, children) method to_forest = Forest.of_tree self#to_tree val try_to_add_procedure_list= ref [] method subscribe_a_try_to_add_procedure p = try_to_add_procedure_list := p::(!try_to_add_procedure_list) (** We redefine just the interpretation of a children. We ignore (in this version) network attributes. *) method eval_forest_child (f:Xforest.tree) : unit = let xs = List.rev !try_to_add_procedure_list in let result = List.exists (fun p -> p self f) xs in match result with | true -> () | false -> let ((nodename, attrs), _) = f in let name = List.assoc "name" attrs in (Log.printf "network#eval_forest_child: I can't interpret this \"%s\" name \"%s\".\n" nodename name) (* Forward-compatibility *) method names = (List.map (fun x->x#get_name) self#components) method suggestedName prefix = let rec tip prefix k = begin let prop = (prefix^(string_of_int k)) in if self#name_exists prop then tip prefix (k+1) else prop end in tip prefix 1 method get_node_by_name n = try List.find (fun x->x#get_name=n) nodes#get with _ -> failwith ("get_node_by_name "^n) method get_cable_by_name n = try List.find (fun x->x#get_name=n) cables#get with _ -> failwith ("get_cable_by_name "^n) method get_component_by_name ?kind n = let components = self#components_of_kind ?kind () in try List.find (fun x->x#get_name=n) components with _ -> failwith ("get_component_by_name "^n) method involved_node_and_port_index_list = List.flatten (List.map (fun c->c#involved_node_and_port_index_list) cables#get) method busy_port_indexes_of_node (node:node) = let node_name = node#get_name in let related_busy_pairs = List.filter (fun (node, port_index) -> node#get_name = node_name) self#involved_node_and_port_index_list in List.map snd related_busy_pairs method free_port_indexes_of_node ?(force_to_be_included:(int list)=[]) (node:node) = let node_port_indexes = ListExtra.range 0 (node#get_port_no-1) in let busy_port_indexes = ListExtra.substract (self#busy_port_indexes_of_node node) force_to_be_included in ListExtra.substract node_port_indexes busy_port_indexes method free_user_port_names_of_node ?(force_to_be_included=[]) node = (* force_to_be_included expressed now by indexes: *) let force_to_be_included = List.map (node#ports_card#internal_index_of_user_port_name) force_to_be_included in List.map (node#ports_card#user_port_name_of_internal_index) (self#free_port_indexes_of_node ~force_to_be_included node) method free_endpoint_list_humanly_speaking ?(force_to_be_included:((string*string) list)=[]) : (string * string) list = let npss = List.map (fun node -> let n = node#get_name in let force_to_be_included = List.map snd (List.filter (fun (n0,p0) -> n0=n) force_to_be_included) in (List.map (fun p -> (n,p)) (self#free_user_port_names_of_node ~force_to_be_included node)) ) nodes#get in List.concat npss (* Unused...*) (* method is_endpoint_free endpoint = let busy_pairs = self#involved_node_and_port_index_list in List.iter (function (n,p) -> Log.printf "Involved: (%s,%d)\n" n#get_name p) busy_pairs; not (List.mem (endpoint#involved_node_and_port_index) busy_pairs)*) (* The total number of endpoints in the network: *) method private endpoint_no = let sum xs = List.fold_left (+) 0 xs in sum (List.map (fun node -> node#get_port_no) nodes#get) method are_there_almost_2_free_endpoints : bool = let busy_no = List.length (self#involved_node_and_port_index_list) in ((self#endpoint_no - busy_no) >= 2) (** The max index among busy receptacles of a given kind of a given node. The user cannot change the number of receptacle of the given node to a number less than this index+1. For instance, if the (max_busy_receptacle_index "rome" Eth) = 2 then the user can change the number of receptacle of rome but only with a number >= 3. *) method max_busy_port_index_of_node node = let indexes = self#busy_port_indexes_of_node node in if indexes=[] then -1 else ListExtra.max indexes (** Useful updating a device: *) method port_no_lower_of node = let port_no_lower = node#port_no_min in let min_port_no = (self#max_busy_port_index_of_node node + 1) in let k = float_of_int port_no_lower in (* minimum multiple of k containing min_port_no: *) let min_multiple = (ceil ((float_of_int min_port_no) /. k)) *. k in int_of_float (max min_multiple k) method node_exists n = let f=(fun x->x#get_name=n) in (List.exists f nodes#get) method cable_exists n = let f=(fun x->x#get_name=n) in (List.exists f cables#get) method name_exists n = List.mem n self#names (** Adding components *) (** Nodes must have a unique name in the network *) method add_node (node:node) = if (self#name_exists node#get_name) then failwith "User_level.network#add_node: name already used in the network" else nodes#append node (** Remove a node from the network. Remove it from the node list and remove all related cables. TODO: change this behaviour! *) method del_node_by_name (node_name:string) = let node = self#get_node_by_name (node_name) in (* Destroy cables first: they refer what we're removing... *) let cables_to_destroy = List.filter (fun c->c#is_node_involved node_name) cables#get in (* The cable#destroy will call itself the network#del_cable_by_name: *) List.iter (fun cable -> cable#destroy) cables_to_destroy; nodes#filter (fun x->not (x=node)) (** Cable must connect free ports: *) (* TODO: manage ledgrid with a reactive system!!!*) method add_cable (c:cable) = if (self#name_exists c#get_name) then failwith "User_level.network#add_cable: name already used in the network" else cables#append c (** Remove a cable from network. Called by cable#destroy. *) method del_cable_by_name (cable_name) = let c = self#get_cable_by_name (cable_name) in cables#filter (fun x->not (x=c)) method change_node_name (old_name) (new_name) = if old_name = new_name then () else let node = self#get_node_by_name (old_name) in node#set_name (new_name) (** Facilities *) (** List of node names in the network *) method get_node_names = List.map (fun x->x#get_name) (nodes#get) method get_nodes_that_can_startup ~devkind () = ListExtra.filter_map (fun x -> if (x#devkind = devkind) && x#can_startup then Some x#get_name else None) nodes#get method get_nodes_that_can_gracefully_shutdown ~devkind () = ListExtra.filter_map (fun x -> if (x#devkind = devkind) && x#can_gracefully_shutdown then Some x#get_name else None) nodes#get method get_nodes_that_can_suspend ~devkind () = ListExtra.filter_map (fun x -> if (x#devkind = devkind) && x#can_suspend then Some x#get_name else None) nodes#get (* Including cables (suspend=disconnect, resume=reconnect). The boolean in the result indicates if the component is suspended (sleeping): *) method get_component_names_that_can_suspend_or_resume () : (string * [`Node|`Cable] * bool) list = ListExtra.filter_map (fun (x, node_or_cable) -> let can_suspend = x#can_suspend in let can_resume = lazy x#can_resume in if can_suspend || (Lazy.force can_resume) then Some (x#get_name, node_or_cable, (Lazy.force can_resume)) else None) self#disjoint_union_of_nodes_and_cables method get_nodes_that_can_resume ~devkind () = ListExtra.filter_map (fun x -> if (x#devkind = devkind) && x#can_resume then Some x#get_name else None) nodes#get (** List of direct cable names in the network *) method get_direct_cable_names = let clist = List.filter (fun x->x#crossover=false) cables#get in List.map (fun x->x#get_name) clist (** List of crossover cable names in the network *) method get_crossover_cable_names = let clist= List.filter (fun x->x#crossover=true) cables#get in List.map (fun x->x#get_name) clist method get_direct_cables = List.filter (fun x->x#crossover=false) cables#get method get_crossover_cables = List.filter (fun x->x#crossover=true) cables#get (** Starting and showing the network *) (** List of reversed cables (used only for drawing network) *) method reversed_cables : (string list) = let clist= List.filter (fun x->x#is_reversed) cables#get in List.map (fun x->x#get_name) clist (** Set the reversed dotoptions field of a cable of the network (identified by name) *) method reversed_cable_set (x:bool) (cname:string) = (self#get_cable_by_name cname)#set_reversed x (** Show network topology *) method show = Log.printf "========== NETWORK STATUS ===========\n"; (* show nodes *) let msg= try (String.concat " , " (List.map (fun d->d#get_name^" ("^(d#string_of_devkind)^")") nodes#get)) with _ -> "" in Log.printf "Nodes \r\t\t: %s\n" msg; (* show links *) let msg=try (String.concat "\n" (List.map (fun c->(c#show "\r\t\t ")) cables#get)) with _ -> "" in Log.printf "Cables \r\t\t: %s\n" msg (** {b Consider cable as Edge.edges} *) (** Network translation into the dot language *) method dotTrad () = let opt = self#dotoptions in let labeldistance = opt#labeldistance#get in let curved_lines = opt#curved_lines#get in begin "digraph plan { "^opt#ratio^" "^opt#rankdir_for_dot^" "^opt#nodesep_for_dot^";"^" /* *************** NODES *************** */ "^ (StringExtra.Text.to_string (List.map (fun (n:node)->n#dotTrad opt#iconsize_for_dot) (ListExtra.permute opt#shuffler_as_function nodes#get) )) ^" /* *********************** DIRECT CABLE EDGES *********************** */ edge [dir=none,color=\""^self#dotoptions#direct_cable_color^"\",fontsize=8,labelfontsize=8,minlen=1.6,"^ opt#labeldistance_for_dot^",tailclip=true]; "^ (StringExtra.Text.to_string (List.map (fun c->c#dot_traduction ~curved_lines ~labeldistance) self#get_direct_cables)) ^" /* ********************************* CROSSOVER/SERIAL CABLE EDGES ********************************* */ edge [headclip=true,minlen=1.6,color=\""^self#dotoptions#crossover_cable_color^"\",weight=1]; "^ (StringExtra.Text.to_string (List.map (fun c->c#dot_traduction ~curved_lines ~labeldistance) self#get_crossover_cables)) ^"} //END of digraph\n" end (* method dotTrad *) initializer self#set_dotoptions (new Dot_tuning.network self); end (** {2 Saving and loading a Netmodel.network } *) (** Pseudo XML now! (using xforest instead of ocamlduce) *) module Xml = struct let network_marshaller = new Oomarshal.marshaller ;; (** Parse the file containing an xforest representation of the network. The given network is updated during the parsing. *) let load_network (net:network) (fname:string) = let (forest:Xforest.t) = network_marshaller#from_file fname in (* we are manually setting the verbosity 3 *) (if (Global_options.Debug_level.get ()) >= 3 then Xforest.print_xforest ~channel:stderr forest); match Forest.to_tree forest with | (("network", attrs), children) -> net#from_tree ("network", attrs) children | _ -> assert false ;; (** Save the xforest representation of the network. *) let save_network (net:network) (fname:string) = Log.printf "Netmodel.Xml.save_network: begin\n"; (* we are manually setting the verbosity 3 *) (if (Global_options.Debug_level.get ()) >= 3 then Xforest.print_xforest ~channel:stderr net#to_forest); network_marshaller#to_file net#to_forest fname; Log.printf "Netmodel.Xml.save_network: end (success)\n";; end;; (* module Netmodel.Xml *) marionnet-0.90.6+bzr434.orig/message_passing.ml0000600000175000017500000000520312167200764020264 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** A general-purpose message-passing facility, with transparent thread synchronization *) class ['a] queue = object(self) val elements = ref [] val mutex = Mutex.create () val empty_condition = Condition.create () (** This is not synchronized *) method private __empty = !elements = [] method enqueue x = Mutex.lock mutex; elements := !elements @ [x]; Condition.signal empty_condition; Mutex.unlock mutex (* This allows the user to use the queue as a deque, for 'urgent' messages, like thread termination requests: *) method prepend x = Mutex.lock mutex; elements := x :: !elements; Condition.signal empty_condition; Mutex.unlock mutex method dequeue : 'a = Mutex.lock mutex; while self#__empty do Condition.wait empty_condition mutex; done; let result = match !elements with x :: rest -> elements := rest; x | _ -> assert false in Mutex.unlock mutex; result end;; (* let queue = new queue;; let make_producer () = Thread.create (fun () -> while true do queue#enqueue (Random.int 1000); done) ();; let make_consumer = let consumer_next_id = ref 1 in fun () -> let id = ! consumer_next_id in consumer_next_id := !consumer_next_id + 1; Thread.create (fun () -> while true do Log.printf "From consumer %i: got %i\n" id (queue#dequeue); flush_all (); done) ();; let w = new task_runner;; let make_producer x = Thread.create (fun () -> while true do w#schedule (fun () -> Log.printf "%i" x; flush_all ()); done) ();; let _ = make_producer 1;; let _ = make_producer 2;; let _ = make_producer 3;; let _ = make_producer 4;; let _ = make_producer 5;; let _ = make_producer 6;; Unix.sleep 30;; w#terminate;; *) marionnet-0.90.6+bzr434.orig/icon.ml0000600000175000017500000000211312167200764016041 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) let icon_pixbuf = GdkPixbuf.from_file (if Initialization.are_we_in_exam_mode then Initialization.Path.images^"launcher-icons/marionnet-exam-launcher.png" else Initialization.Path.images^"launcher-icons/marionnet-launcher.png");; marionnet-0.90.6+bzr434.orig/useful-scripts/0000700000175000017500000000000012167200764017550 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/useful-scripts/etc_init.d_marionnet-daemon0000700000175000017500000000223512167200764025035 0ustar lucaslucas#!/bin/bash # This file is part of marionnet # Copyright (C) 2010 Jean-Vincent Loddo # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e PATH=~/bin:~/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin case "$1" in start) type marionnet-daemon.byte >/dev/null echo -n "Starting the marionnet daemon..." marionnet-daemon.byte >/dev/null 2>/dev/null & echo " Ok" ;; stop) echo -n "Stopping the marionnet daemon..." killall marionnet-daemon.byte echo " Ok" ;; *) echo "Usage: $0 (start|stop)" echo "Start or stop the marionnet daemon." exit 1 esac marionnet-0.90.6+bzr434.orig/useful-scripts/marionnet_from_scratch_weights_of_log0000700000175000017500000000063312167200764027305 0ustar lucaslucas#!/bin/bash function cutv { awk "(f==0)&&/$1/{f=1;print;next} (f==1)&&/$2/{print;f=2;next} (f==1){print;next}"; } LOGFILE=${1:-/dev/stdin} grep <$LOGFILE '^CHECKPOINT[:][ ]' \ | { read line0; while [[ "$line0" != '___EnD_of_FiLe___' ]] ; do line1=$(read z && echo $z || echo '___EnD_of_FiLe___') W=$(cutv <$LOGFILE "$line0" "$line1" | wc -c) echo "$line0 => $W" line0="$line1" done } marionnet-0.90.6+bzr434.orig/useful-scripts/prepare_bridge.sh0000600000175000017500000001373512167200764023071 0ustar lucaslucas#!/bin/bash -x # This file is part of Marionnet, a virtual network laboratory # Copyright (C) 2007 Jean-Vincent Loddo # Copyright (C) 2007 Luca Saiu # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Requires: # 1. brctl # 2. mii-tool # 3. iwconfig # 4. timeout (package timeout, required for dhclient) function require { local PROG for PROG in "$@"; do which $PROG >/dev/null || { echo "$PROG not found in the PATH, is it installed?" 1>&2; exit 1; } done } # Check requirements require brctl mii-tool iwconfig killall dhclient mktemp route ##################### # TOOLS # ##################### # Dump of a configured network interface function ifconfig_dump { local IF="$1" ifconfig "$IF" | \ head -n 4 | \ sed 's/HWaddr /HWaddr:/ ; s/6 addr: /_ipv6:/' | \ tr ' ' '\n' | \ sed 's/^addr:/IPV4:/' | \ grep '^[a-zA-Z0-9_]*:' | \ sed 's/\(^[a-zA-Z0-9_]*\):/\1=/' | \ awk -F= '/^HWaddr/ {print "MAC="$2} /^Bcast=/ {print "BROADCAST="$2} /^IPV4=/ {print "IP="$2} /^Mask=/ {print "NETMASK="$2} /^MTU=/ {print "MTU="$2} /^inet_ipv6=/ {print "IPV6="$2}' } # Get the broadcast address of a given interface (which we suppose to be up) function broadcast_of { local IF=$1 ifconfig $IF | grep 'inet addr' | tr : ' ' | awk '{print $5}' } # Try to kill a dhclient launched for the given interface, else kill all dhclients function kill_dhclient { local IF=$1 local PID=$(ps aux | grep dhclient | grep $IF | awk '{print $2}') if [[ -n "$PID" ]]; then kill -9 $PID else killall dhclient fi } ##################### # STD POLICY # ##################### # The standard policy consists in detecting a "main" interface searching for # the interface connected to the default gateway, and in configuring the bridge # exactly like that (and in unconfiguring the old main interface). function standard_policy { local TMPFILE=$(mktemp /tmp/prepare_bridge.XXXXX) local IFS=$(route -n | grep '^0[.]0[.]0[.]0' | tee "$TMPFILE" | awk '{print $NF}') local LINES=$(wc -l "$TMPFILE" | cut -d" " -f1) # If there are less or more than 1 line, this policy fails [[ $LINES = 1 ]] || { echo "The standard policy is not appliable" >&2; return 1; } local GW=$(awk <"$TMPFILE" '{print $2}') local IF=${IFS} # Add the unique candidate into the bridge brctl addif "$BRIDGE" "$IF" || { echo "The unique candidate cannot be plugged into the bridge" >&2; return 1; } # Bridge up ifconfig "$BRIDGE" up # Configure the bridge in the same way as the "main" interface ($IF) ifconfig_dump "$IF" >"$TMPFILE" source "$TMPFILE" # now we have MAC IP BROADCAST NETMASK IPV6 MTU ifconfig "$BRIDGE" "$IP" broadcast "$BROADCAST" netmask "$NETMASK" ifconfig "$BRIDGE" mtu "$MTU" [[ -n "$IPV6" ]] && ifconfig "$BRIDGE" inet6 add "$IPV6" # Unconfigure the main interface ifconfig "$IF" 0.0.0.0 promisc up [[ -n "$IPV6" ]] && ifconfig "$IF" inet6 del "$IPV6" # Default route route add default gw "$GW" "$BRIDGE" # Mr proper rm -f "$TMPFILE" return 0 } # end of standard_policy() ##################### # FALLBACK POLICY # ##################### # The fallback policy consists in scanning all running interfaces, putting them # into the bridge, configuring the bridge with DHCP, and unconfiguring the "main" one. function fallback_policy { # Search for the candidates local LIST1=$(mii-tool | grep '^[a-zA-Z0-9_]*:' | cut -d: -f1) local LIST2=$(iwconfig 2>&1 | grep -v 'no wireless' | grep '^[a-zA-Z0-9_]' | cut -d" " -f1) local LIST=$(echo $LIST1 $LIST2 | tr " " "\n" | sort | uniq) # Add interface(s) in the bridge for IF in $LIST; do # Interfaces can be added even if up brctl addif $BRIDGE $IF || true done # Bridge up ifconfig $BRIDGE up # Configure the bridge with a dhcp client timeout 45 dhclient $BRIDGE || { echo "The bridge cannot be configured with DHCP" >&2; return 1; } # Now remove the IP configuration from the interface configured with # the same broadcast address of the bridge, in order to prevent conflicts # in the routing table local BC_BRIDGE=$(broadcast_of $BRIDGE) local BC for IF in $LIST; do BC=$(broadcast_of $IF) [[ "$BC" = "$BC_BRIDGE" ]] && ifconfig $IF 0.0.0.0 promisc up && kill_dhclient $IF done } # end of fallback_policy() ##################### # M A I N # ##################### # The name of the unique bridge for Marionnet (several instances will share it) BRIDGE=br0 # If the script is called with 'stop' delete the bridge from the system. # Note that the user has to manually reconfigure the included interfaces. if [[ "$1" = stop ]]; then ifconfig "$BRIDGE" down brctl delbr "$BRIDGE" exit 0 fi # If '$BRIDGE' exists and is already configured, exit with success ifconfig "$BRIDGE" &>/dev/null && { TMPFILE=$(mktemp /tmp/prepare_bridge.XXXXX) ifconfig_dump "$BRIDGE" >"$TMPFILE" source "$TMPFILE" # now we have MAC IP BROADCAST NETMASK IPV6 MTU rm -f "$TMPFILE" [[ -n "$IP" ]] && exit 0 # If the bridge is not well configured, destroy it and continue (it will be re-created) unset MAC IP BROADCAST NETMASK IPV6 MTU ifconfig "$BRIDGE" down brctl delbr "$BRIDGE" } # Define the bridge if necessary brctl addbr "$BRIDGE" 2>/dev/null || true # Choice of policy standard_policy || fallback_policy || { echo "No policy could be applied, the ethernet socket will" echo "not be functional in Marionnet" exit 1 } >&2 marionnet-0.90.6+bzr434.orig/useful-scripts/make_marionnet_bytecode_revno0000700000175000017500000002462712167200764025571 0ustar lucaslucas#!/bin/bash # This file is part of marionnet # Copyright (C) 2010 Jean-Vincent Loddo # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e # Getopt's format used to parse the command line: OPTSTRING="hp:m:o:r:b:" function parse_cmdline { local i j flag # Transform long format options into the short one: for i in "$@"; do if [[ double_dash_found = 1 ]]; then ARGS+=("$i") else case "$i" in --help) ARGS+=("-h"); ;; --marionnet-repo) ARGS+=("-m"); ;; --ocamlbricks-repo) ARGS+=("-o"); ;; --prefix) ARGS+=("-p"); ;; --marionnet-revno) ARGS+=("-r"); ;; --ocamlbricks-revno) ARGS+=("-b"); ;; --) ARGS+=("--"); double_dash_found=1; ;; --[a-zA-Z0-9]*) echo "*** Illegal long option $i."; exit 1; ;; -[a-zA-Z0-9]*) j="${i:1}"; while [[ $j != "" ]]; do ARGS+=("-${j:0:1}"); j="${j:1}"; done; ;; *) ARGS+=("$i") ;; esac fi done set - "${ARGS[@]}" unset ARGS # Interpret short format options: while [[ $# -gt 0 ]]; do OPTIND=1 while getopts ":$OPTSTRING" flag; do if [[ $flag = '?' ]]; then echo "ERROR: illegal option -$OPTARG."; exit 1; fi eval "option_${flag}=$OPTIND" eval "option_${flag}_arg='$OPTARG'" done for ((j=1; j/dev/stderr # Option -o, --ocamlbricks-repo if [[ -n ${option_o} ]]; then OCAMLBRICKS_REPO="${option_o_arg}" else OCAMLBRICKS_REPO=lp:ocamlbricks fi echo -e "Ocamlbricks repository\r\t\t\t: $OCAMLBRICKS_REPO" >/dev/stderr # Option -r, --marionnet-revno if [[ -n ${option_r} ]]; then MARIONNET_REQUESTED_REVNO="${option_r_arg}" fi # Option -b, --ocamlbricks-revno if [[ -n ${option_b} ]]; then OCAMLBRICKS_REQUESTED_REVNO="${option_b_arg}" fi # Temporary Working Directory TWDIR (global variable) # Automatically cleaned when some events occur function tmpfile { if [[ -z $TWDIR ]]; then TWDIR=$(mktemp --tmpdir -d ${0##*/}.tmpdir.XXXXXXXX) local SIGINT=2 local SIGQUIT=3 local SIGABRT=6 local SIGKILL=9 local SIGTERM=15 # CTRL-C local TRAPPED_EVENTS="$SIGINT $SIGQUIT $SIGABRT $SIGKILL $SIGTERM" trap "rm -rf $TWDIR" $TRAPPED_EVENTS # Assign the system variable TMPDIR used by mktemp (for script children): export TMPDIR=$TWDIR export -f tmpfile fi if [[ $# = 0 ]]; then local TMPFILE=$(mktemp --tmpdir=$TWDIR tmpfile.XXXXXXXX) else local TMPFILE=$(mktemp --tmpdir=$TWDIR "$@") fi echo "$TMPFILE" } #################################### # M A I N # #################################### echo -e "Prefix \r\t\t\t: $PREFIX" cd "$PREFIX" tmpfile -u 1>/dev/null # just create the temporary working directory $TWDIR REPODIR="$TWDIR" REPODIR=$(realpath $REPODIR) echo -e "Working directory \r\t\t\t: $REPODIR" cd $REPODIR LOGFILE=$REPODIR/log echo -e "Log file \r\t\t\t: $LOGFILE" COMMAND_RESULT=$REPODIR/result touch $COMMAND_RESULT function launch_and_log_in_a_xterm { local MSG="$1" local CMD="{ ($2 2>&1) || echo 1 > $COMMAND_RESULT; } | tee -a $LOGFILE" echo -e "===\n$MSG\n===\n" >> $LOGFILE echo -n "* $MSG..." echo 0 > $COMMAND_RESULT xterm -fa "Monospace" -fs 10 -lc -geometry 120x60 -T "$MSG" -e "/bin/bash -c \"$CMD\"" sync local RETURN_CODE=$(<$COMMAND_RESULT) if [[ $RETURN_CODE -eq 1 ]]; then echo "FAILED!" echo "Last 20 lines of $LOGFILE:" echo "======" tail -n 20 $LOGFILE echo "======" echo "Exiting." else echo fi return $RETURN_CODE } # Suppose that $CWD is a bzr repository function bzr_date_of_revno { local CMD if [[ $# = 0 ]]; then CMD="{print}" else CMD='$1 == "'$1'" {print $2,$3,$4}' fi bzr log | awk '/^revno:/ {revno=$2} /^timestamp:/ {print revno,$3,$4,$5}' | awk "$CMD" } # Suppose variable REPODIR set function ocamlbricks_good_revno_for_marionnet_revno { local M_REVNO=$1 pushd $REPODIR >/dev/null M_REVNO_DATE=$(cd marionnet; bzr_date_of_revno $M_REVNO) if [[ -z "$M_REVNO_DATE" ]]; then echo "Error: no date found for marionnet revno $M_REVNO. Aborting." return 1 fi M_REVNO_DATE_SECONDS=$(date -d "$M_REVNO_DATE" +%s) cd ocamlbricks bzr_date_of_revno | while read r d; do echo -n "$r $d "; date -d "$d" +%s; done | \ awk "\$5 < $M_REVNO_DATE_SECONDS" | head -n 1 | cut -f1 -d' ' popd >/dev/null } function marionnet_home_heuristic { local path find /usr/local /usr/share /opt -type d -name marionnet |\ while read path; do [[ -d $path/filesystems && -d $path/kernels ]] && echo $path; done |\ head -n 1 } # Prepare a pseudo ocaml directory removing (the link to) ocamlbricks mkdir lib_ocaml cd lib_ocaml/ for i in $(ocamlc -where || exit -1)/*; do ln -s $i; done rm -f ocamlbricks* LIB_OCAML=$PWD cd .. echo echo "* Getting ocamlbricks from $OCAMLBRICKS_REPO..." bzr get --verbose $OCAMLBRICKS_REPO echo "* Getting marionnet from $MARIONNET_REPO..." bzr get --verbose $MARIONNET_REPO cd marionnet marionnet_revno=$(bzr revno) MARIONNET_REQUESTED_REVNO=${MARIONNET_REQUESTED_REVNO:-$marionnet_revno} if [[ -z "$OCAMLBRICKS_REQUESTED_REVNO" ]]; then OCAMLBRICKS_REQUESTED_REVNO=$(ocamlbricks_good_revno_for_marionnet_revno $MARIONNET_REQUESTED_REVNO) fi launch_and_log_in_a_xterm \ "Reverting to the marionnet revision $MARIONNET_REQUESTED_REVNO" \ "bzr revert -r $MARIONNET_REQUESTED_REVNO" marionnet_revno=$MARIONNET_REQUESTED_REVNO marionnet_revno_date=$(bzr_date_of_revno $marionnet_revno | tr ' ' '_') cd .. cd ocamlbricks launch_and_log_in_a_xterm \ "Reverting to the ocamlbricks revision $OCAMLBRICKS_REQUESTED_REVNO" \ "bzr revert -r $OCAMLBRICKS_REQUESTED_REVNO" ocamlbricks_revno=$OCAMLBRICKS_REQUESTED_REVNO ocamlbricks_revno_date=$(bzr_date_of_revno $ocamlbricks_revno | tr ' ' '_') cat >CONFIGME < Makefile.tmp_copy mv -f Makefile.tmp_copy Makefile echo launch_and_log_in_a_xterm \ "Compiling the marionnet revision $MARIONNET_REQUESTED_REVNO" \ 'make' launch_and_log_in_a_xterm \ "Installing the marionnet revision $MARIONNET_REQUESTED_REVNO" \ 'make install' # We try to complete the installation: MARIONNET_HOME=$(marionnet_home_heuristic) if [[ -n $MARIONNET_HOME ]]; then TARGET=install_here_please/share/marionnet pushd $TARGET >/dev/null for i in filesystems kernels; do rmdir $i ln -s $MARIONNET_HOME/$i done popd >/dev/null fi # Build a script for marionnet.byte SCRIPT_NAME=marionnet.byte.$marionnet_revno.$marionnet_revno_date.with_ocamlbricks_$ocamlbricks_revno cat >$SCRIPT_NAME <$DAEMON_SCRIPT_NAME <. # Script version: 0.90.23 # 2013.07.02 # Thanks: # - Lucas Nussbaum for the idea of having an option "--download-only/-O", # and for his patch proposal (July 2013) set -e shopt -s nullglob shopt -s expand_aliases # Prevent problems compiling `ocamlbricks' (the command `cd' prints # the target directory when CDPATH is set, in the style of `pushd', # and this unexpected behaviour get the make process confused): unset CDPATH # Prevent problems installing files as root (sudo) with a more # restrictive umask (like for instance 027): umask 022 # By default SUDO_OR_EVAL and SUDO_OR_NOTHING are set to 'sudo' for normal users: if [[ $USER = root ]]; then export SUDO_OR_EVAL=eval export SUDO_OR_NOTHING= else export SUDO_OR_EVAL=sudo export SUDO_OR_NOTHING=sudo fi function exiting_because_error { # global KEEP_DEBRIS TWDIR echo -e "Exiting because of an unexpected error in line $BASH_LINENO" if [[ $KEEP_DEBRIS = no ]]; then rm -rf $TWDIR fi exit 3 } # trap exiting_because_error ERR # ============================================================= # SELF DEPENDENCIES # ============================================================= function abspath { local B=$(basename $1) local D=$(dirname $1) (builtin cd $D; echo $PWD/$B) } # If realpath is not installed, use the poor man version: type -t realpath 2>/dev/null 1>/dev/null || { function realpath { abspath "$@"; } export -f realpath } # Backup of the command line: COMMAND_LINE="$(type -p $0 || realpath $0) " COMMAND_LINE="$(realpath $COMMAND_LINE) "$@"" # ============================================================= # PARSING COMMAND LINE # ============================================================= # Getopt's format used to parse the command line: OPTSTRING="hp:m:b:o:gG:t:kl:d:v:NVDKPFAOc:" function parse_cmdline { local i j flag # Transform long format options into the short one: for i in "$@"; do if [[ double_dash_found = 1 ]]; then ARGS+=("$i") else case "$i" in --help) ARGS+=("-h"); ;; --marionnet-version|--marionnet) ARGS+=("-m"); ;; --ocamlbricks-version|--ocamlbricks) ARGS+=("-b"); ;; --ocaml-version|--ocaml) ARGS+=("-o"); ;; --use-godi) ARGS+=("-g"); ;; --no-native|--bytecode) ARGS+=("-N"); ;; --lablgtk-version|--lablgtk) ARGS+=("-l"); ;; --vde-version|--vde) ARGS+=("-v"); ;; --dot-version|--dot|--graphviz) ARGS+=("-d"); ;; --godi-version|--godi) ARGS+=("-G"); ;; --debris|--keep-debris) ARGS+=("-k"); ;; --no-vde|--ignore-vde) ARGS+=("-V"); ;; --no-dot|--ignore-dot) ARGS+=("-D"); ;; --no-kernels|--ignore-kernels) ARGS+=("-K"); ;; --no-pinocchio|--ignore-pinocchio) ARGS+=("-P"); ;; --no-filesystems|--ignore-filesystems) ARGS+=("-F"); ;; --download-only) ARGS+=("-O"); ;; --no-all|--ignore-all) ARGS+=("-A"); ;; --continue) ARGS+=("-c"); ;; --prefix) ARGS+=("-p"); ;; --tmpdir) ARGS+=("-t"); ;; --) ARGS+=("--"); double_dash_found=1; ;; --[a-zA-Z0-9]*) echo "*** Illegal long option $i."; exit 1; ;; -[a-zA-Z0-9]*) j="${i:1}"; while [[ $j != "" ]]; do ARGS+=("-${j:0:1}"); j="${j:1}"; done; ;; *) ARGS+=("$i") ;; esac fi done set - "${ARGS[@]}" unset ARGS # Interpret short format options: while [[ $# -gt 0 ]]; do OPTIND=1 while getopts ":$OPTSTRING" flag; do if [[ $flag = '?' ]]; then echo "ERROR: illegal option -$OPTARG."; exit 1; fi eval "option_${flag}=$OPTIND" eval "option_${flag}_arg='$OPTARG'" done for ((j=1; j&2 TWDIR=$(mktemp -p ${TMPDIR:-/tmp} -d ${0##*/}.XXXXXXXX) local SIGINT=2 local SIGQUIT=3 local SIGABRT=6 local SIGKILL=9 local SIGTERM=15 # CTRL-C local TRAPPED_EVENTS="$SIGINT $SIGQUIT $SIGABRT $SIGKILL $SIGTERM" trap "exiting_because_signal" $TRAPPED_EVENTS fi if [[ $# = 0 ]]; then local TMPFILE=$(mktemp -p $TWDIR tmpfile.XXXXXXXX) else local TMPFILE=$(mktemp -p $TWDIR "$@") fi echo "$TMPFILE" } # ============================================================= # TOOLS # ============================================================= function exit_and_continue_as_root { # global TWDIR COMMAND_LINE echo if [[ -n "$1" ]]; then echo "Error using the program '$1' to become the super user." else echo "No manner to become the super user." fi echo -e "In order to install marionnet, become super user and continue launching the following command: --- $COMMAND_LINE -c $TWDIR --- Exiting." exit 1 } function ensure_sudo { # global USER TWDIR COMMAND_LINE [[ $USER = root ]] && return 0 sudo -v "$@" || exit_and_continue_as_root "sudo" } function ensure_sudo_or_continue_as_root { # global USER TWDIR COMMAND_LINE local MESSAGE_ABOUT_ACTION="$1" if [[ $USER = root ]]; then echo "Fine, I'm root." 1>&2 elif type -t sudo 1>&2; then ensure_sudo -p "* Required the [sudo] password for %u:" elif type -t su 1>&2; then echo "* $MESSAGE_ABOUT_ACTION" echo " The script will be continued as root." echo -n " Please provide root's password: " su -c "echo; $COMMAND_LINE -c $TWDIR" || exit_and_continue_as_root "su" exit 0 else exit_and_continue_as_root fi } function append_line_if_needed { # global SUDO_OR_NOTHING local LINE="$1" local FILE="$2" { test -f "$FILE" && grep -q "${LINE}" "$FILE"; } || $SUDO_OR_NOTHING echo "$LINE" >> "$FILE" } function wait_printing_dots { while sleep 2 && jobs %% 1>/dev/null 2>&1; do echo -n "."; done } function define_global_TAB { local i COLS if [[ -z $COLUMNS ]]; then if type tput 1>/dev/null 2>/dev/null; then COLUMNS=$(tput cols) else COLUMNS=80 fi fi # COLS is the max between $COLUMNS and 104 if [[ $COLUMNS -gt 104 ]]; then COLS=104; else COLS=$COLUMNS; fi global_TAB+='\r' for ((i=1; i<=(COLS/8)-1; i++)); do global_TAB+='\t'; done } define_global_TAB; function echo_at_right_side { local NEWLINE="" if [[ $1 = --newline ]]; then NEWLINE="\n"; shift; fi eval echo -en "'$global_TAB'" eval printf "'%4s$NEWLINE'" "$1" } function wait_printing_percent_progress { if [[ -z $1 ]]; then wait_printing_dots else local SECTION_SIZE=$1 # or "weight" local LOGSIZE=$(wc -c <$LOGFILE) local OFFSET=$LOGSIZE local TAB=${2:-$global_TAB} local PERCENT while sleep 2 && jobs %% 1>/dev/null 2>&1; do LOGSIZE=$(wc -c <$LOGFILE) eval echo -en "'$TAB'" PERCENT=$((100*(LOGSIZE-OFFSET)/SECTION_SIZE)) if [[ $PERCENT -gt 100 ]]; then PERCENT=100; fi printf "%3d%%" $PERCENT done eval echo -en "'$TAB'" printf "100%%" fi } function launch_and_log { # global COMMAND_RESULT ALREADY_DONE SUDO_OR_EVAL # The option --as-root implies --as-script if the user in not root (in order to # prevent sudo to re-ask the password) # The option --as-script implies that the command will be launched # as a standalone script local DO_NOT_REGISTER_AS_DONE if [[ $1 = --do-not-register-as-done ]]; then shift; DO_NOT_REGISTER_AS_DONE=y; fi local EVAL_OR_SUDO local AS_SCRIPT # By default EVAL_OR_SUDO is equal to eval EVAL_OR_SUDO=eval if [[ $1 = --as-root || $1 = --sudo ]]; then shift; EVAL_OR_SUDO=$SUDO_OR_EVAL; fi if [[ $1 = --as-script || $1 = --script ]]; then shift; AS_SCRIPT=yes; fi if [[ $EVAL_OR_SUDO = sudo ]]; then AS_SCRIPT=yes fi local MSG="$1" echo -n "* $MSG ..." if grep <$ALREADY_DONE -q "^$MSG DONE$"; then echo_at_right_side "done"; echo return 0 fi local CMD="{ $2 2>&1 || echo 1 > $COMMAND_RESULT; } 1>&2" local SECTION_SIZE=$3 echo -e "===\nCHECKPOINT: $MSG\n===\n" 1>&2 echo 0 > $COMMAND_RESULT case $AS_SCRIPT in yes) local TMPSCRIPT=$(tmpfile script.XXXXXX) echo '#!/bin/bash' > $TMPSCRIPT echo "export PATH=$PATH" >> $TMPSCRIPT echo $CMD >> $TMPSCRIPT chmod +x $TMPSCRIPT $EVAL_OR_SUDO $TMPSCRIPT & ;; *) $EVAL_OR_SUDO $CMD & ;; esac wait_printing_percent_progress $SECTION_SIZE sync local RETURN_CODE=$(<$COMMAND_RESULT) if [[ $RETURN_CODE -eq 1 ]]; then echo "FAILED!" echo "Last 20 lines of log ($LOGFILE):" echo "======" tail -n 20 $LOGFILE echo "======" echo "Exiting." else echo if [[ -z $DO_NOT_REGISTER_AS_DONE ]]; then echo "$MSG DONE" >> $ALREADY_DONE fi fi return $RETURN_CODE } # Support https: alias wget='wget --no-check-certificate' function download_latest_tar_gz_from_url { local BASENAME="$1" # ex: vde2 local VERSION="${2:-[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*}" local URL="$3" # ex: http://sourceforge.net/projects/vde/ local TGZ="${4:-$(tmpfile)}" { wget -O - "$URL" \ | grep -o "href=\".*${BASENAME}-${VERSION}[.]tar[.]gz[0-9A-Za-z/_-]*\"" \ | cut -d\" -f2 } > $TGZ || return 1 LATEST=$(grep <$TGZ -o "${VERSION}[.]tar[.]gz" | tr '.' ' '| sort -n | tr ' ' '.' | tail -n 1) if [[ -z "$LATEST" ]]; then echo "No latest version of $BASENAME found looking into $URL." return 2 else echo "Ok, latest version $LATEST of $BASENAME found looking into $URL." fi 1>&2 TGZ=$(grep <$TGZ -o ".*${BASENAME}-${LATEST}[0-9A-Za-z/_-]*") # Adjust relative href: if [[ ${TGZ#http://} = ${TGZ} ]] && [[ ${TGZ#ftp://} = ${TGZ} ]]; then TGZ="${URL%/*}/$TGZ" fi { wget -O - $TGZ \ | tar 1>&2 xvzf - } || return 1 ln -s ${BASENAME}-* ${BASENAME} || true return 0 } # Usage: download_latest_tar_gz [(-v|--version) REGEXPR] BASENAME URL... function download_latest_tar_gz { local VERSION if [[ $1 = '-v' || $1 = '--version' ]]; then VERSION="$2" shift 2 || return 2 else VERSION="[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*" fi # "-v latest" means the latest matching the default regexp: if [[ $VERSION = latest || -z $VERSION ]]; then VERSION="[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*" fi local BASENAME="$1" # ex: vde2 shift || return 2 local URL LATEST local TGZ=$(tmpfile) for URL in "$@"; do download_latest_tar_gz_from_url "$BASENAME" "$VERSION" "$URL" "$TGZ" && { [[ $# -gt 1 ]] && echo "Downloaded from $URL" rm -f "$TGZ" return 0 } done rm -f "$TGZ" return 1 } # ============================================================= # DOWNLOADS # ============================================================= # We look first at our mirror because the new versions of godi # use ocaml 3.12 function download_latest_godi { local VERSION="${GODI_OCAML_VERSION:-20[0-9]*}" download_latest_tar_gz -v "$VERSION" godi-rocketboost \ $OUR_MIRROR \ "http://download.camlcity.org/download/" } # Marionnet 0.90.2 has a problem with 3.12.0 (camlp4) function download_latest_ocaml { local VERSION="${OCAML_VERSION:-[0-9][.][0-9][0-9][.][0-9]*}" download_latest_tar_gz -v "$VERSION" ocaml \ "http://caml.inria.fr/pub/distrib/ocaml-3.11/" \ $OUR_MIRROR \ "http://caml.inria.fr/download.html" } # Obsolete url: "ftp://ftp.kurims.kyoto-u.ac.jp/pub/lang/olabl/" function download_latest_lablgtk { local VERSION="${LABLGTK_VERSION:-[0-9][.][0-9][0-9]*[.][0-9][0-9]*}" download_latest_tar_gz -v "$VERSION" lablgtk \ "http://wwwfun.kurims.kyoto-u.ac.jp/soft/lsl/lablgtk.html" \ $OUR_MIRROR } function download_latest_vde { local VERSION=${VDE2_VERSION:-latest} download_latest_tar_gz -v "$VERSION" vde2 \ "http://sourceforge.net/projects/vde/" \ $OUR_MIRROR } function download_latest_marionnet { local VERSION=${MARIONNET_VERSION:-latest} download_latest_tar_gz -v "$VERSION" marionnet \ "https://launchpad.net/marionnet" \ $OUR_MIRROR } function download_latest_ocamlbricks { local VERSION=${OCAMLBRICKS_VERSION:-latest} download_latest_tar_gz -v "$VERSION" ocamlbricks \ "https://launchpad.net/ocamlbricks" \ $OUR_MIRROR } function download_latest_graphviz { local VERSION=${GRAPHVIZ_VERSION:-latest} download_latest_tar_gz -v "$VERSION" graphviz \ "http://www.graphviz.org/Download_source.php" \ $OUR_MIRROR } # ============================================================= # DEBIAN or derived # ============================================================= function are_we_in_debian_or_derived { $(which dpkg) -L bash 2>/dev/null | grep -q $(which bash) && $(which dpkg) -L apt 2>/dev/null | grep -q $(which apt-get) } # Useless now (since 2011-11-07) function are_we_in_ubuntu_11_or_greater { if [[ -f /etc/issue ]]; then local A=$(head -n 1 /etc/issue) local a b c read a b c <<<"$A" if [[ "$a" = "Ubuntu" ]]; then IFS="." read a c <<<"$b" [[ "$a" -ge 11 ]] else return 1 fi else return 1 fi } function echo_debian_package_for_binary_if_really_needed { local BINARY=$1 local PACKAGE=$2 if type -t $BINARY 1>&2; then return 0 # not needed else echo "$PACKAGE " # note the trailing blank fi } function is_aptitude_installed { type 1>&2 aptitude } function is_package_installed { local L=en_US.UTF-8 LANG=$L LC_ALL=$L LC_MESSAGES=$L LANGUAGE=$L dpkg -s $1 2>/dev/null | \grep -q 'Status: install ok installed'; } function echo_required_debian_packages { local LIST i VDE2_VERSION EXTRA_FOR_GODI # Then continue with aptitude for i in gcc g++ make flex libtool bison grep tar xterm wget mktemp realpath sed gawk aptitude; do LIST+=$(echo_debian_package_for_binary_if_really_needed $i $i) done LIST+=$(echo_debian_package_for_binary_if_really_needed dot graphviz) LIST+=$(echo_debian_package_for_binary_if_really_needed uml_switch uml-utilities) if [[ $USING_GODI = yes ]]; then EXTRA_FOR_GODI="gtkgl-dev freeglut3-dev tk8.4-dev libxmu-dev" fi for i in \ libgtk2.0-dev libglade2-dev $EXTRA_FOR_GODI \ bridge-utils coreutils debianutils diffutils \ net-tools uml-utilities util-linux x11-xserver-utils \ coreutils findutils login procps gettext \ rlfe; # alternatives are rlwrap and ledit do if ! is_package_installed $i; then LIST+="$i " fi done # vde2 only if is not already installed and the available version is >= 2.2.1 if type 1>&2 aptitude; then type 1>&2 vde_switch || { VDE2_VERSION=$(aptitude show vde2 | awk '/^Version.*[2-9][.][0-9][.][0-9].*/ {print $2}' | awk -F '-' '{print $1}') VDE2_VERSION=$(echo $VDE2_VERSION | awk -F '.' '(($2 * 100 + $3 * 10 + $4) >= 221) {print}') if [[ -n "$VDE2_VERSION" ]]; then LIST+="vde2 " fi } fi # x86_64 => libc6-i386 if type uname && [[ $(uname -m) = "x86_64" ]] && ! dpkg -p libc6-i386; then LIST+="libc6-i386 " fi 1>&2 # Return the list: echo "$LIST" } # ============================================================= # OUR KERNELS AND FILESYSTEMS # ============================================================= function download_our_kernels { # global OUR_BASE_URL local KERNELS KERNELS=$(wget -O - "$OUR_BASE_URL" \ | grep -o 'href="kernels_.*"' \ | grep -o "kernels_.*[.]tar[.]gz"\ ) local i WEIGHT for i in $KERNELS; do # Known weights: case "$i" in "kernels_linux-2.6.18-ghost.tar.gz") WEIGHT=6032 ;; *) unset WEIGHT ;; esac launch_and_log --sudo --script "Installing $i" "{ wget -O - '$OUR_BASE_URL/$i' | tar 1>&2 xvzf -; }" $WEIGHT done } function download_our_big_filesystems { # global OUR_BASE_URL local FILESYSTEMS FILESYSTEMS=$(wget -O - "$OUR_BASE_URL" \ | grep -o 'href="filesystems_.*"' \ | grep -o "filesystems_.*[.]tar[.]gz"\ | grep -v "filesystems_pinocchio.*[.]tar[.]gz"\ ) local i WEIGHT for i in $FILESYSTEMS; do # Known weights: case "$i" in "filesystems_machine-debian-lenny-sid-2008.tar.gz") WEIGHT=677935 ;; "filesystems_machine-mandriva20100215.tar.gz") WEIGHT=540521 ;; *) unset WEIGHT ;; esac launch_and_log --sudo --script "Installing $i" "{ wget -O - '$OUR_BASE_URL/$i' | tar 1>&2 xvzf -; }" $WEIGHT done } function download_our_pinocchio_filesystems { # global OUR_BASE_URL local FILESYSTEMS FILESYSTEMS=$(wget -O - "$OUR_BASE_URL" \ | grep -o 'href="filesystems_pinocchio.*"' \ | grep -o "filesystems_.*[.]tar[.]gz"\ ) local i WEIGHT for i in $FILESYSTEMS; do # Known weights: case "$i" in "filesystems_pinocchio.tar.gz") WEIGHT=77543 ;; *) unset WEIGHT ;; esac launch_and_log --sudo --script "Installing $i" "{ wget -O - '$OUR_BASE_URL/$i' | tar 1>&2 xvzf -; }" $WEIGHT done } # Main function calling the previously defined functions (download_our_*): function download_marionnet_kernels_and_filesystems { # global OUR_BASE_URL SUDO_OR_NOTHING PREFIX # global IGNORE_KERNELS IGNORE_PINOCCHIO_FILESYSTEMS IGNORE_BIG_FILESYSTEMS ensure_sudo -p "* Required the [sudo] password for %u:" $SUDO_OR_NOTHING mkdir -p $PREFIX/share/marionnet/ pushd $PREFIX/share/marionnet/ 1>&2 if [[ $IGNORE_KERNELS = yes ]]; then echo -n "* Installing kernels: dependency ignored (--no-kernels)" echo_at_right_side --newline "ok" else download_our_kernels; fi if [[ $IGNORE_PINOCCHIO_FILESYSTEMS = yes ]]; then echo -n "* Installing pinocchio filesystems: dependency ignored (--no-pinocchio)" echo_at_right_side --newline "ok" else download_our_pinocchio_filesystems; fi if [[ $IGNORE_BIG_FILESYSTEMS = yes ]]; then echo -n "* Installing other filesystems: dependency ignored (--no-filesystems)" echo_at_right_side --newline "ok" else download_our_big_filesystems; fi popd 1>&2 } # ============================================================= # MAIN # ============================================================= # Ubuntu 11.x workaround: # if are_we_in_debian_or_derived; then # if [[ $USING_GODI = no ]] && are_we_in_ubuntu_11_or_greater ; then # echo "* Warning: some OCaml/Ubuntu (>= 11.x) combinations may require the option -g" # echo -n " Shall I do as if you chose -g (compile OCaml with Godi) ([y]/n)? "; read z # if [[ $z != n && $z != N ]]; then # USING_GODI="yes" # REQUIRED_MB=380 # fi # fi # fi PATH_BACKUP=$PATH cd "$TMPDIR" if [[ $CONTINUE != yes ]]; then tmpfile -u 1>/dev/null # just create the temporary working directory $TWDIR fi # We reassign the system variable TMPDIR used by mktemp (for children): export TMPDIR=$TWDIR export -f tmpfile REPODIR="$TWDIR" REPODIR=$(realpath $REPODIR) # echo -e "Working directory \r\t\t\t: $REPODIR" cd $REPODIR LOGFILE=$REPODIR/log echo -e "* The log file is $LOGFILE" # Redirect stderr to the log file: exec 2>>$LOGFILE COMMAND_RESULT=$REPODIR/result ALREADY_DONE=$REPODIR/already_done touch $COMMAND_RESULT $ALREADY_DONE OUR_BASE_URL="http://www.marionnet.org/download/marionnet_from_scratch" OUR_MIRROR="$OUR_BASE_URL/mirror/" if [[ $DOWNLOAD_ONLY = yes ]]; then download_marionnet_kernels_and_filesystems echo '---' echo "Success." exit 0 fi if are_we_in_debian_or_derived; then echo "* This looks like a Debian or derived distribution. Oh, joy!" DEBIAN_PACKAGE_LIST=$(echo_required_debian_packages) echo "DEBIAN_PACKAGE_LIST=$DEBIAN_PACKAGE_LIST" 1>&2 # debugging if [[ -n ${DEBIAN_PACKAGE_LIST%% } ]]; then echo " Required packages: $DEBIAN_PACKAGE_LIST" echo -n " Shall I install required package(s) with aptitude ([y]/n)? " read z if [[ $z != n && $z != N ]]; then echo -n " Shall I use the aptitude option --allow-untrusted ([y]/n)? "; read z if [[ $z != n && $z != N ]]; then APTITUDE_OPTIONS+="--allow-untrusted " fi MSG="Installing required packages with aptitude" ensure_sudo_or_continue_as_root "* $MSG" # First install aptitude if needed: if ! type 1>&2 aptitude; then launch_and_log --sudo "Installing aptitude" "apt-get -y install aptitude" APTITUDE_INSTALLED_NOW=yes fi # vde2 only if is not already installed and the available version is >= 2.2.1 if [[ $APTITUDE_INSTALLED_NOW = yes ]] && ! type 1>&2 vde_switch; then VDE2_VERSION=$(aptitude $APTITUDE_OPTIONS show vde2 | awk '/^Version.*[2-9][.][0-9][.][0-9].*/ {print $2}' | awk -F '-' '{print $1}') VDE2_VERSION=$(echo $VDE2_VERSION | awk -F '.' '(($2 * 100 + $3 * 10 + $4) >= 221) {print}') if [[ -n "$VDE2_VERSION" ]]; then DEBIAN_PACKAGE_LIST+="vde2 " echo " Note: I will also install vde2 with aptitude" fi fi # We set the option `--do-not-register-as-done' because sometimes a single call to aptitude is not sufficient to install all things... launch_and_log --do-not-register-as-done --sudo "$MSG" "aptitude $APTITUDE_OPTIONS -q -y install $DEBIAN_PACKAGE_LIST" DISABLE_libc6_i386_WARNING=yes fi # answered yes fi # package list not empty fi # are_we_in_debian_or_derived launch_and_log "Downloading marionnet" download_latest_marionnet 22400 launch_and_log "Downloading ocamlbricks" download_latest_ocamlbricks 7500 # ============================================================= # OCAML & LABLGTK # ============================================================= function compile_ocaml { cd ocaml # Download and apply the patch bugfix-5237.diff for ocaml 3.11 on a 64 bits architecture if type uname 1>&2 && [[ $(uname -m) = "x86_64" ]]; then local BUGFIX_FILE="bugfix-5237.diff" echo "Downloading the ocaml 3.11 patch ($BUGFIX_FILE) for x86_64" wget -O $BUGFIX_FILE "$OUR_MIRROR/$BUGFIX_FILE" || \ wget -O $BUGFIX_FILE 'http://caml.inria.fr/mantis/file_download.php?file_id=415&type=bug' || \ return 1 echo "Applying the ocaml 3.11 patch ($BUGFIX_FILE) for x86_64" patch -p1 < $BUGFIX_FILE # Download and apply the patch 0007-Fix-ocamlopt-w.r.t.-binutils-2.2[1-9].patch # for ocaml 3.11 on a 32 bits architecture with binutils version=2.2[1-9].x elif type ld 1>&2 && ld -v | \grep -q '[ ]2[.]2[1-9]'; then local BUGFIX_FILE="bugfix-5237-i386.diff" echo "Downloading the ocaml 3.11 patch ($BUGFIX_FILE) for i386" wget -O $BUGFIX_FILE "$OUR_MIRROR/$BUGFIX_FILE" || \ wget -O $BUGFIX_FILE 'http://caml.inria.fr/mantis/file_download.php?file_id=418&type=bug' || \ return 1 echo "Applying the ocaml 3.11 patch ($BUGFIX_FILE) for i386" patch -p1 < $BUGFIX_FILE fi # Compile now: { ./configure -prefix $OCAML_PREFIX -no-curses -no-tk && make world.opt && make install && make -C tools/ objinfo && if [[ ! -e $OCAML_PREFIX/bin/ocamlobjinfo ]]; then cp tools/objinfo $OCAML_PREFIX/bin/ && [[ -e $OCAML_PREFIX/bin/ocamlobjinfo ]] || ln -s objinfo $OCAML_PREFIX/bin/ocamlobjinfo fi } || return 1 cd .. } function compile_lablgtk { cd lablgtk { ./configure --prefix $OCAML_PREFIX \ --with-glade --without-gl --without-rsvg --without-gnomecanvas --without-gnomeui \ --without-panel --without-gtkspell --without-gtksourceview --with-gtksourceview2 \ --without-quartz && make && make opt && make install } || return 1 cd .. } function compile_godi { cd godi-rocketboost ./bootstrap --batch -prefix $GODI_PREFIX 1>&2 export PATH=$GODI_PREFIX/bin:$GODI_PREFIX/sbin:$PATH echo "GODI_BASEPKG_PCRE=yes" >> $GODI_PREFIX/etc/godi.conf { ./bootstrap_stage2 1>&2 && godi_perform -build godi-lablgtk2 1>&2 && [[ -e ../godi/bin/ocamlobjinfo ]] || ln -s objinfo ../godi/bin/ocamlobjinfo } || return 1 cd .. } case $USING_GODI in no) # Tuning: export OCAML_PREFIX=$PWD/local export PATH=$OCAML_PREFIX/bin:$PATH LIB_OCAML=$OCAML_PREFIX/lib/ocaml/ export CAML_LD_LIBRARY_PATH=${LIB_OCAML}/stublibs launch_and_log "Downloading ocaml" download_latest_ocaml 83000 launch_and_log "Downloading lablgtk" download_latest_lablgtk 17800 launch_and_log "Compiling ocaml" compile_ocaml 382000 launch_and_log "Compiling lablgtk" compile_lablgtk 56000 ;; yes) export GODI_PREFIX=$PWD/godi launch_and_log "Downloading ocaml (godi)" download_latest_godi 37342 launch_and_log "Compiling ocaml with godi" compile_godi 990130 # Tuning using godi export PATH=$GODI_PREFIX/bin:$GODI_PREFIX/sbin:$PATH LIB_OCAML=$GODI_PREFIX/lib/ocaml/std-lib/ ;; esac # ============================================================= # OCAMLBRICKS # ============================================================= cd ocamlbricks cat >CONFIGME <&2; then ensure_sudo -p "* Required the [sudo] password for %u:" MAKE_INSTALL="PATH=$PATH make install" SUDO_MAKE_INSTALL="sudo make install" AS_ROOT=--as-root elif type -t su 1>&2; then echo "* Preparing to install in $PREFIX" echo " The script will be continued as root." echo -n " Please provide root's password: " su -c "echo; $COMMAND_LINE -c $TWDIR" || exit_and_continue_as_root "su" exit 0 else exit_and_continue_as_root fi # Set a default if not already set (when sudo is required and available): SUDO_MAKE_INSTALL=${SUDO_MAKE_INSTALL:-$SUDO_OR_NOTHING $MAKE_INSTALL} launch_and_log ${AS_ROOT} \ "Installing marionnet" \ "$MAKE_INSTALL" \ 3918924 # weight # Alias for marionnet -> marionnet.native (or marionnet.byte) if ! type marionnet 1>&2; then pushd $PREFIX/bin/ for i in marionnet.{native,byte}; do if [[ -x $i ]]; then $SUDO_OR_NOTHING ln -sf $i marionnet break fi done popd fi 1>&2 cd .. # ============================================================= # VDE # ============================================================= function download_compile_and_install_vde2 { download_latest_vde && cd vde2 { ./configure -prefix $PREFIX && make && $SUDO_MAKE_INSTALL } || return 1 cd .. } if [[ $IGNORE_VDE = yes ]]; then echo -n "* Installing vde2: dependency ignored (--no-vde)" echo_at_right_side --newline "ok" elif type vde_switch 1>&2; then echo -n "* Installing vde2: it seems to be already installed" echo_at_right_side --newline "ok" else launch_and_log \ "Downloading, compiling and installing vde2" \ download_compile_and_install_vde2 \ 54276 # weight fi # ============================================================= # DOT (GRAPHVIZ) # ============================================================= function download_compile_and_install_graphviz { download_latest_graphviz && cd graphviz { ./configure -prefix=$PREFIX && make && $SUDO_MAKE_INSTALL } || return 1 cd .. } if [[ $IGNORE_DOT = yes ]]; then echo -n "* Installing dot (graphviz): dependency ignored (--no-dot)" echo_at_right_side --newline "ok" elif type dot 1>&2; then echo -n "* Installing dot (graphviz): it seems to be already installed" echo_at_right_side --newline "ok" else launch_and_log \ "Downloading, compiling and installing dot (graphviz)" \ download_compile_and_install_graphviz \ 863227 # weight fi # ============================================================= # KERNELS AND FILESYSTEMS # ============================================================= # The functions related to these features are located at the # beginning of this script in order to manage the option # download--only. So, at this point we have just to call the # good function: download_marionnet_kernels_and_filesystems # ============================================================= # marionnet.conf # ============================================================= if [[ -f $PREFIX/share/marionnet/marionnet.conf ]]; then MARIONNET_DOT_CONF=$PREFIX/share/marionnet/marionnet.conf elif [[ -f $PREFIX/etc/marionnet/marionnet.conf ]]; then MARIONNET_DOT_CONF=$PREFIX/etc/marionnet/marionnet.conf else echo "File \`marionnet.conf' not found. Exiting."; exit 3 fi function first_installed_binary_of_list { local i for i in "$@"; do if type -t $i &>/dev/null; then echo $i return 0 fi done # otherwise return the first: echo $1 } MARIONNET_KEYBOARD_LAYOUT=$(echo $LANG | grep -o '^[a-z]*') MARIONNET_KEYBOARD_LAYOUT=${MARIONNET_KEYBOARD_LAYOUT=:-us} MARIONNET_PDF_READER=$(first_installed_binary_of_list evince okular kpdf xpdf gv) MARIONNET_POSTSCRIPT_READER=$MARIONNET_PDF_READER MARIONNET_DVI_READER=$MARIONNET_PDF_READER MARIONNET_HTML_READER=$(first_installed_binary_of_list firefox epiphany galeon konqueror rekonq chromium opera) MARIONNET_TEXT_EDITOR=$(first_installed_binary_of_list emacs gedit kate kwrite xemacs) for i in MARIONNET_{PDF,POSTSCRIPT,DVI,HTML}_READER MARIONNET_TEXT_EDITOR MARIONNET_KEYBOARD_LAYOUT; do v=$(eval echo \$$i); $SUDO_OR_NOTHING sed -i -e "s/$i=\(.*\)/$i=$v/" $MARIONNET_DOT_CONF done if [[ ! -f /etc/marionnet/marionnet.conf ]]; then echo -n "* Installing /etc/marionnet/marionnet.conf ..." $SUDO_OR_NOTHING mkdir -p /etc/marionnet/ $SUDO_OR_NOTHING cp $MARIONNET_DOT_CONF /etc/marionnet/ echo_at_right_side --newline "ok" fi # ============================================================= # SysV-style INIT # ============================================================= function generate_the_marionnet_daemon_script { local TMPFILE=$(tmpfile) cat >$TMPFILE <. # Very basic init launcher for the marionnet-daemon ### BEGIN INIT INFO # Provides: marionnet-daemon # Required-Start: \$local_fs \$remote_fs \$network # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Support daemon for marionnet # Description: Support daemon for marionnet ### END INIT INFO set -e PATH=$PREFIX/bin:$PREFIX/sbin:\$PATH DAEMON=\$(type -p marionnet-daemon.native || type -p marionnet-daemon.byte) || { echo "Error: neither marionnet-daemon.native nor marionnet-daemon.byte found." exit 1 } function killall_marionnet_daemon { ps -u 0 -o pid,cmd | awk '\$2 ~ /marionnet-daemon/ {print \$1}' | while read pid; do kill -9 \$pid; done } function is_marionnet_daemon_launched { ps -u 0 -o cmd | awk '\$1 ~ /marionnet-daemon/ {print \$1}' | grep -q 'marionnet-daemon' } function pid_of_marionnet_daemon { ps -u 0 -o pid,cmd | awk '\$2 ~ /marionnet-daemon/ {print \$1}' | while read pid; do echo \$pid; done } case "\$1" in start) if is_marionnet_daemon_launched; then echo "The marionnet daemon is already launched." exit 0 else echo -n "Starting the marionnet daemon..." \$DAEMON >/dev/null 2>/dev/null & fi echo " Ok" ;; stop) echo -n "Stopping the marionnet daemon..." killall_marionnet_daemon || true echo " Ok" ;; status) if is_marionnet_daemon_launched; then PID=\$(pid_of_marionnet_daemon) echo "The marionnet daemon is running (PID=\$PID)." else echo "The marionnet daemon is stopped." fi exit 0 ;; *) echo "Usage: $1 (start|stop|status)" echo "Start or stop the marionnet daemon." exit 1 esac EOF chmod +x $TMPFILE $SUDO_OR_NOTHING mv -f $TMPFILE $1 } function install_the_marionnet_daemon_script { # global INIT_DIR generate_the_marionnet_daemon_script $INIT_DIR/marionnet-daemon local RC_DIRS i RC_DIRS=$(for i in /etc/rc[2-5S].d /etc/*/rc[2-5S].d/ /etc/*/*/rc[2-5S].d ; do [[ -d $i ]] && B=$(basename $i) && echo "$B $i $B" done | sort -u --key=1,1 | { while read _ b _; do echo $b; done }) for i in $RC_DIRS; do pushd $i if [[ "$(realpath ../init.d)" = "$INIT_DIR" ]]; then $SUDO_OR_NOTHING ln -sf ../init.d/marionnet-daemon S90marionnet-daemon elif [[ "$(realpath ../../init.d)" = "$INIT_DIR" ]]; then $SUDO_OR_NOTHING ln -sf ../../init.d/marionnet-daemon S90marionnet-daemon else $SUDO_OR_NOTHING ln -sf $INIT_DIR/marionnet-daemon S90marionnet-daemon fi popd done 1>&2 } function launch_the_marionnet_daemon_script { # global INIT_DIR SUDO_OR_NOTHING $SUDO_OR_NOTHING $INIT_DIR/marionnet-daemon start 1>&2 } function define_global_INIT_DIR { # global INIT_DIR local i j if [[ -d /etc/init.d ]]; then INIT_DIR=/etc/init.d else declare -i j j=0 for i in /etc/*/init.d; do [[ -d $i ]] && INIT_DIR=$i && j+=1 done if [[ j != 1 ]]; then unset INIT_DIR; fi fi } define_global_INIT_DIR; if [[ -z $INIT_DIR ]]; then echo -n "* Installing daemon: directory init.d not found in /etc" echo_at_right_side --newline "ko" elif [[ -f $INIT_DIR/marionnet-daemon ]]; then echo -n "* Installing daemon: script already exists in $INIT_DIR" echo_at_right_side --newline "ok" else echo "* Installing daemon:" echo -n " Shall I install the marionnet daemon in your runlevels ([y]/n)? " read z if [[ $z != n && $z != N ]]; then ensure_sudo -p " Required the [sudo] password for %u:" echo -n " Installing the marionnet daemon ..." install_the_marionnet_daemon_script [[ -e /dev/net/tun ]] || $SUDO_OR_NOTHING mknod /dev/net/tun c 10 200 $SUDO_OR_NOTHING chmod a+rw /dev/net/tun if [[ -f /etc/modules.conf ]]; then append_line_if_needed "alias char-major-10-200 tun" /etc/modules.conf $SUDO_OR_NOTHING depmod -a fi 1>&2 echo_at_right_side --newline "ok" echo -n " Launching the marionnet daemon ..." launch_the_marionnet_daemon_script echo_at_right_side --newline "ok" DAEMON_LAUNCHED=yes fi fi # ============================================================= # Adjust X -nolisten tcp # ============================================================= function remove_nolisten_assignment_from { # global SUDO_OR_NOTHING local i=$1 $SUDO_OR_NOTHING sed -i -e 's/\(^[a-ZA-Z0-9]*[=].*[-]nolisten tcp.*\)$/#\1\n\1/g' $i $SUDO_OR_NOTHING sed -i -e 's/\(^[a-ZA-Z0-9]*[=].*\)[-]nolisten tcp\(.*\)$/\1 \2/g' $i } function remove_nolisten_X_or_startx_actuals_from { # global SUDO_OR_NOTHING local i=$1 $SUDO_OR_NOTHING sed -i -e 's/\(^[a-ZA-Z0-9/: ]*X.*\)[-]nolisten tcp\(.*\)$/\1\2/g' $i $SUDO_OR_NOTHING sed -i -e 's/\(^[a-ZA-Z0-9/: ]*startx.*\)[-]nolisten tcp\(.*\)$/\1\2/g' $i } function remove_DisallowTCP_from { # global SUDO_OR_NOTHING local i=$1 $SUDO_OR_NOTHING sed -i -e 's/\(^DisallowTCP=true.*\)$/#\1\nDisallowTCP=false/g' $i } # Sections in file have the form "[security]" function ensure_section_and_binding { [[ $# -ge 3 ]] || return 1 local SECTION=$1 # ex: security local VARIABLE=$2 # ex: Enable local VALUE=$3 # ex: true local AWK_PROGRAM shift 3 AWK_PROGRAM=" BEGIN {x=0} /\[$SECTION\]/ {x=1;print;next} (x==1) && /$VARIABLE=.*/ {print \"$VARIABLE=$VALUE\"; x=2; next} (x==1) && /\[.*\]/ {print \"$VARIABLE=$VALUE\n\"; print; x=2; next} /\[.*\]/ {print;next} {print} END {if (x==0) print \"[$SECTION]\"; if (x==0 || x==1) print \"$VARIABLE=$VALUE\n\";}" case $# in 0) awk "$AWK_PROGRAM" ;; *) local i local TMPFILE=$(tmpfile) for i in "$@"; do awk 0<"$i" 1>$TMPFILE "$AWK_PROGRAM" cat $TMPFILE 1>"$i" done rm $TMPFILE ;; esac } # This is needed, for instance, for ubuntu 10.10 function ensure_DisallowTCP_false_to_gdm_custom_dot_conf { # global SUDO_OR_NOTHING CHANGED_FILES local custom=${1:-/etc/gdm/custom.conf} local TMPFILE=$(tmpfile) cp $custom $TMPFILE ensure_section_and_binding "security" "DisallowTCP" "false" $TMPFILE ensure_section_and_binding "xdmcp" "Enable" "true" $TMPFILE if ! diff -q $custom $TMPFILE >/dev/null; then CHANGED_FILES+="$custom " $SUDO_OR_NOTHING bash -c "cat $TMPFILE >$custom" fi } # This is needed, for instance, for ubuntu 12.04 function ensure_xserver_allow_tcp_in_lightdm_dot_conf { # global SUDO_OR_NOTHING CHANGED_FILES local custom=${1:-/etc/lightdm/lightdm.conf} local TMPFILE=$(tmpfile) cp $custom $TMPFILE ensure_section_and_binding "SeatDefaults" "xserver-allow-tcp" "true" $TMPFILE if ! diff -q $custom $TMPFILE >/dev/null; then CHANGED_FILES+="$custom " $SUDO_OR_NOTHING bash -c "cat $TMPFILE >$custom" fi } function apply_all_filters { # global CHANGED_FILES local i=$1 cat $i > $BACKUP { remove_nolisten_assignment_from $i; remove_DisallowTCP_from $i; remove_nolisten_X_or_startx_actuals_from $i; } || true diff -q $BACKUP $i >/dev/null || { CHANGED_FILES+="$i " } } function adjust_X_display_manager { # global SUDO_OR_NOTHING CHANGED_FILES local BACKUP=$(tmpfile) DIRS=$($SUDO_OR_NOTHING find /etc/ -type d -name "?dm") if [[ -d /etc/X11/xinit ]]; then DIRS+=" /etc/X11/xinit/"; fi FILES=$([[ -n $DIRS ]] && $SUDO_OR_NOTHING find $DIRS -name "*rc" -o -name "*.conf") FILES=$(for i in $FILES; do grep -l "^[a-zA-Z0-9/_\-= ]*[-]nolisten tcp" $i; done) for i in $FILES; do apply_all_filters $i; done rm -f $BACKUP # A special case: gdm/gdm3 : if [[ -d /etc/gdm ]]; then $SUDO_OR_NOTHING touch /etc/gdm/custom.conf ensure_DisallowTCP_false_to_gdm_custom_dot_conf elif [[ -d /etc/gdm? ]]; then $SUDO_OR_NOTHING touch /etc/gdm?/custom.conf /etc/gdm?/daemon.conf ensure_DisallowTCP_false_to_gdm_custom_dot_conf /etc/gdm?/custom.conf ensure_DisallowTCP_false_to_gdm_custom_dot_conf /etc/gdm?/daemon.conf fi # Another special case: lightdm if [[ -d /etc/lightdm ]]; then $SUDO_OR_NOTHING touch /etc/lightdm/lightdm.conf ensure_xserver_allow_tcp_in_lightdm_dot_conf fi [[ -n $CHANGED_FILES ]] } if ps -A -o cmd | grep -q '^[a-zA-Z0-9/]*X.*[-]nolisten tcp'; then echo '---' echo "* Warning: your X server has been launched with the option '-nolisten tcp'" echo " => This option should be removed from your X display manager configuration." echo -n " Shall I try to fix it ([y]/n)? " read z if [[ $z != n && $z != N ]]; then if adjust_X_display_manager; then echo " Ok. File(s) changed: $CHANGED_FILES" echo " You must restart your X display manager for the changes to take effect." else echo " Sorry, no change performed: you must edit your configuration manually." fi fi fi # ============================================================= # Fix problems in ubuntu # ============================================================= if are_we_in_ubuntu_11_or_greater ; then echo "* Warning: Ubuntu (>= 11.x) systems require to launch marionnet with UBUNTU_MENUPROXY=0" echo " => The problem may be solved defining an alias in your shell configuration:" echo " alias marionnet='UBUNTU_MENUPROXY=0 marionnet'" case $USER in root) DEST='/etc/profile' echo -n " Shall I add this line to $DEST ([y]/n)? " ;; *) DEST=~/.bashrc echo -n " Shall I add this line to your ~/.bashrc ([y]/n)? " ;; esac read z if [[ $z != n && $z != N ]]; then append_line_if_needed "alias marionnet='UBUNTU_MENUPROXY=0 marionnet'" $DEST fi fi # ============================================================= # Adjust PATH # ============================================================= # Path warning: if echo "$PATH_BACKUP" | tr ':' '\n' | grep -q "$PREFIX/bin"; then echo "PATH contains $PREFIX/bin. Good." 1>&2 else echo '---' echo "* Warning: the path $PREFIX/bin seems not to be contained in your PATH." echo " => Put something like the following line in your shell configuration:" echo " export PATH=$PREFIX/bin:$PREFIX/sbin:\$PATH" case $USER in root) DEST='/etc/profile' echo -n " Shall I add this line to $DEST ([y]/n)? " ;; *) DEST=~/.bashrc echo -n " Shall I add this line to your ~/.bashrc ([y]/n)? " ;; esac read z if [[ $z != n && $z != N ]]; then append_line_if_needed "export PATH=$PREFIX/bin:$PREFIX/sbin:\$PATH" $DEST fi fi # ============================================================= # Adjust LOCALES # `/usr/share/locale' vs `/usr/local/share/locale' # ============================================================= # When PREFIX is set to `/usr/local' ocamlbricks and marionnet install their # locale-related files in `$PREFIX/share/locale' (i.e. `/usr/local/share/locale') # while some distributions install their locales into `/usr/share/locale' # ignoring files installed in `/usr/local/share/locale' # (for instance Ubuntu 12.04 LTS 64 bits). So: if [[ $PREFIX = "/usr/local" && -d "/usr/share/locale/" && -d "/usr/local/share/locale" ]]; then PROBABLY_GOOD="/usr/share/locale/" PROBABLY_BAD="/usr/local/share/locale" COUNT_GOOD=$(find $PROBABLY_GOOD -type f -name "*.mo" | wc -l) COUNT_BAD=$(find $PROBABLY_BAD -type f -name "*.mo" | wc -l) # Heuristic method (of course): is $COUNT_GOOD twenty times bigger then $COUNT_BAD? if [[ $((COUNT_GOOD/COUNT_BAD)) -gt 20 ]]; then # Move `marionnet.mo' files from $PROBABLY_BAD to $PROBABLY_GOOD: echo -n "* Moving installed locales into $PROBABLY_GOOD" pushd >/dev/null $PROBABLY_BAD find . -name "marionnet.mo" | xargs tar -cf - | $SUDO_OR_NOTHING tar -C $PROBABLY_GOOD -xf - $SUDO_OR_NOTHING find . -name "marionnet.mo" -exec rm {} \; popd >/dev/null echo_at_right_side --newline "ok" fi fi # ============================================================= # 64-bit warning # ============================================================= # 64-bit architecture warning: if [[ -z $DISABLE_libc6_i386_WARNING ]]; then if type uname 1>&2 && [[ $(uname -m) = "x86_64" ]]; then echo '---' echo "* Warning: this is 64-bit architecture." echo " => Make sure that the package libc6-i386 is installed." fi fi # ============================================================= # Mr Proper # ============================================================= # Mr proper echo '---' if [[ $KEEP_DEBRIS = yes ]]; then echo -n "* Cleaning: $TWDIR not removed (-k)" echo_at_right_side --newline "ok" else echo "* Cleaning..." rm -rf $TWDIR fi # ============================================================= # Notes # ============================================================= # Where to install filesystems and kernels: echo '---' echo "* Notes:" echo " - Install additional filesystem in" $PREFIX/share/marionnet/filesystems/ echo " - Install additional kernels in" $PREFIX/share/marionnet/kernels/ echo " - Customize your installation by editing /etc/marionnet/marionnet.conf" echo '---' echo "Success." exit 0 marionnet-0.90.6+bzr434.orig/useful-scripts/which_ocamlbricks0000700000175000017500000000712612167200764023157 0ustar lucaslucas#!/bin/bash # This file is part of marionnet # Copyright (C) 2010 Jean-Vincent Loddo # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . function usage_and_exit { echo "Usage: $(basename $0) [--quiet|-q] [(--marionnet-repo|-m) ] [(--ocamlbricks-repo|-o) ] []" echo " or: $(basename $0) (--help|-help|-h)" echo echo "Get a plausibly good ocamlbricks revno for the given marionnet revno." echo 'By default queried repositories are "lp:marionnet" and "lp:ocamlbricks".' echo "If not provided, the marionnet revno is set to the current one." echo "The --quiet option may be used to suppress any message (on stdout) except the answer." echo echo -e "Examples: \t\t$(basename $0) \t\t$(basename $0) 246 \t\t$(basename $0) -m . -o ../ocambricks 238 " exit ${1:-0} } if [[ $1 = "--help" || $1 = "-h" || $1 = "-help" ]]; then usage_and_exit 0 fi if [[ "$1" = '--quiet' || "$1" = "-q" ]]; then QUIET=y shift fi if [[ "$1" = '--marionnet-repo' || "$1" = "-m" ]]; then MARIONNET_REPO="$2" shift 2 else MARIONNET_REPO=lp:marionnet fi echo "Marionnet repository : $MARIONNET_REPO" >/dev/stderr if [[ "$1" = '--ocamlbricks-repo' || "$1" = "-o" ]]; then OCAMLBRICKS_REPO="$2" shift 2 else OCAMLBRICKS_REPO=lp:ocamlbricks fi echo "Ocamlbricks repository : $OCAMLBRICKS_REPO" >/dev/stderr if [[ ! $1 -ge 1 ]]; then REVNO=$(bzr revno $MARIONNET_REPO) echo "Marionnet curent revno : $REVNO" >/dev/stderr else REVNO=$1 fi function bzr_date_of_revno { local repo=$1 local CMD='$1 == "'$2'" {print $2,$3,$4}' bzr log -q $repo | awk '/^revno:/ {revno=$2} /^timestamp:/ {print revno,$3,$4,$5}' | awk "$CMD" } function bzr_revno_date_list { local repo=$1 bzr log -q $repo | awk '/^revno:/ {revno=$2} /^timestamp:/ {print revno,$3,$4,$5}' } function ocamlbricks_good_revno_for_marionnet_revno { local M_REVNO=$1 local M_REVNO_DATE=$(bzr_date_of_revno "$MARIONNET_REPO" $M_REVNO) if [[ -z "$M_REVNO_DATE" ]]; then echo "Error: no date found for marionnet revno $M_REVNO. Aborting." return 1 fi M_REVNO_DATE_SECONDS=$(date -d "$M_REVNO_DATE" +%s) bzr_revno_date_list "$OCAMLBRICKS_REPO" | \ while read r d; do echo -n "$r $d "; date -d "$d" +%s; done | \ awk "\$5 < $M_REVNO_DATE_SECONDS" | head -n 1 | cut -f1 -d' ' } function ocamlbricks_good_revno_for_marionnet_revno_verbose { local M_REVNO=$1 local M_REVNO_DATE=$(bzr_date_of_revno "$MARIONNET_REPO" $M_REVNO) if [[ -z "$M_REVNO_DATE" ]]; then echo "Error: no date found for marionnet revno $M_REVNO. Aborting." return 1 fi M_REVNO_DATE_SECONDS=$(date -d "$M_REVNO_DATE" +%s) echo -e "marionnet : $M_REVNO\t $M_REVNO_DATE \t$M_REVNO_DATE_SECONDS" echo -n "ocamlbricks : " bzr_revno_date_list "$OCAMLBRICKS_REPO" | \ while read r d; do echo -en "$r\t $d \t"; date -d "$d" +%s; done | \ awk "\$5 < $M_REVNO_DATE_SECONDS {print \$0,\"(\"($M_REVNO_DATE_SECONDS-\$5)/(3600*24),\"days before)\"}" | \ head -n 1 } if [[ $QUIET = y ]]; then ocamlbricks_good_revno_for_marionnet_revno $REVNO else ocamlbricks_good_revno_for_marionnet_revno_verbose $REVNO fi marionnet-0.90.6+bzr434.orig/TODO0000600000175000017500000007765112167200764015272 0ustar lucaslucasTo do: ====== + DVD support: added a missing 'linux-default' link referring the default virtual computer filesystem, and another one for the router. This doesn't imply any source changes, but we write this entry here so that it is recorded in our 'history'. This is a change against the 0.50.0-pre1 DVD, which we explicitly *DON't* support, because it's a prerelease. + Moved the Xnest keyboard layout setting support from the host to the guest. + Added keyboard layout choosing support in Xnest guest sessions, via the new environment variable MARIONNET_KEYBOARD_LAYOUT. + 'Change working directory' now fails when given a path mounted on a filesystem without sparse file support, as it should + Now also *directory* names (and not only file names) are checked for the absence of funny characters, in 'Change working directory', 'New project', 'Save As' and 'Copy Into'. + Hidden the 'work-around the wirefilter problem' menu item + Routers need an implicit variant, which is always selected if it exists. + Bugfix: I was using memq in several places, without knowing it compared by identity. + Minor bugfix: non-existing cow files (i.e. clean-state filesystems) can now be exported as variants without the interface complaining. + The gateway tap name is now randomly chosen. + Treeview_defects, Treeview_ifconfig: minor refactoring + Exam mode: reports importing is now supported also for routers. + Made the Ethernet socket host bridge name configurable via the new environment variable MARIONNET_BRIDGE. If the variable is not defined the name defaults to "marbre". The `run' make target now executes Marionnet with the bridge name set to `br0'. Jean-Vincent can easily imagine why :-). + Simple_dialogs, Talking: made question and confirm dialogs unclosable: now the only way to close them is by pushing a button. + When in exam mode the shell history is now imported as a document at shutdown time, just like the report (this requires the new machine filesystem I've uploaded to marionnettix) + Bumped version number + Minor translation changes + Updated the Ethernet plug icons + Now the 'marbre' bridge is setup at startup time + No, not any more :-) + Minor treeview changes. + Texts treeview: added HTML support + Minor refactoring. + Automatically import exam reports into the text treeview + Added a toggle button or clickable pixmap to ledgrid windows so that they can be made always-on-top + Auto-generated IPv6 addressed: used a shorter and more beautiful default + Details treeview: moved the `MAC address' column + User interface: added the file name constraint also to: + ``Save As'' + ``Copy into'' + Refactored the related code + Disabled UML terminal for routers (look for "Change this when debugging the router device" in simulated_network.ml) +- JUST BEFORE THE RELEASE: + enable the splash screen (marionnet.ml, at the end) + Autogenerate IP addresses: set the default to false + Add a link to Marionnet in the UML wiki (most of the projects we mentioned in the article are already there): http://uml.jfdi.org/uml/Wiki.jsp?page=Tools + bisogna ricordarsi di mettere a zero (cat /dev/zero >> zeros; rm zeros) lo spazio non utilizzato di tutti i filesystems di backend. La cosa importante per snellire la piattaforma, sia in casi come quello della sala Q203 dell'IUT, sia per un'immagine knoppix un po' pi snella => c' gi un vecchio script che fa bene questo lavoro (setfs) che devo integrare agli strumenti di lavoro (bob.marionnet.* ?) - About dialog: write our e-mail addresses with domain marionnet.org, as soon as they exist and work :-) +- GUI: de-activate the interface controlling unimplemented features - Check that the plug can be used with a guest ``dhclient'' without the UML process crashing. This happened to me on mccarthy when using a new kernel (2.6.22.9) *without* CONFIG_COMPAT_VDSO. - Be sure that the guest not supporting NAT kernel is not distributed; it's now useless and it has problems. + Turn on the wirefilter problem workaround thing, but with a long interval + Router: support a `suggested' variant which is the only used one, if it exists. + Bugfix (deadlock). To trigger: startup two machines and a switch with a and S1 connected by a cable, and then shut down everything *after everything is up*. The thing does not happen without the cable. I suspect it's a deadlock in the new cable logic. + Solved this and other stuff with some very ugly kludges. Synchronization added as an afterthought is a mess; we knew it. [In Freiburg] + Worked around a problem with uml_console: it succeeds when sending a 'cad' message to a UML process which has just started; however the UML doesn't die. [In Freiburg] + Progress bar dialogs: made them unresizable + Bug: startup two machines and a switch with a and S1 connected by a cable, and then shut down everything *after everything is up*. The thing does not happen without the cable. I suspect it's a deadlock in the new cable logic. [In Freiburg] + Solved this and other stuff with some very ugly kludges. Synchronization added as an afterthought is a mess; we knew it. [In Freiburg] + Worked around a problem with uml_console: it succeeds when sending a 'cad' message to a UML process which has just started; however the UML doesn't die. [In Freiburg] + Progress bar dialogs: made them unresizable + Show a superimposed state indicator on device icons + Added the next_simulated_device_state method to simulated device, and updated the internal state when appropriate. The method returns a simulated_device_automaton_state option, using None to mean 'no transition is in course'. + Use this information in refresh_sketch [J.V.] + Prevent ``incorrect'' cables from working: + Essentially done, and in a clean and general way. + Now I only need the predicate telling whether a device is ``correct''. +- gateway + simulation infrastructure + GUI bindings - filtering; user-provided IP address - Don't use a bridge?? +- Routers: add variant support + Done, except for the interface + Done in mariokit + Done in the filesystem history treeview: states can be exported as variants + Support variants in the GUI? Is it a good idea? [No, it isn't. --L.] + Routers: make them work [J.V.] +- Translate the rest of the user interface into French - Gateway and host X server: use a non-hardwired bridge name [Well, by now I'd just say no :-) --L., in Freiburg] + Added guest swap partition support (thanks to Jean for some information I lacked) + Guest system: added a nice xfce installation to be run in Xnest sessions + Per-guest Xnest support + Some changes in the distribution were needed for this + Support more than one host X server, for concurrent Marionnet instances. + Added x.ml to implement what's needed for this + Experimented with ocaml-gettext + Found it to be a bit messy; we're gonna use something simpler. + Gateway: dynamically compute host tap name + Host X server access control: now it is granted and revoked more selectively, without any need for something ugly and insecure like "xhost +". + Fixed default values for IPv4 netmask and broadcast address + Defects: automatic device shutdown at defects update - "Unexpected environment received from dialog": sometimes I get this at exit time. - Do I *still* get it? Maybe not... + About: move the reference to the University from 'Authors' to 'Thanks'. - Cleanly exit from the main thread (with exit code EXIT_SUCCESS, of course, in case of no errors). + mariokit: updated some old support for variants, which had a different rationale + Implemented filesystem variants + in the GUI + in mariokit + in filesystem_history - Do it also for routers + Interface: forbid distribution change for any machine with existing non-clean states + Done the same also for variants + Nasty bug fix: for a filesystem foo, $MARIONNET_HOME/filesystems/foo_variants was also considered a filesystem image, even if it is always a directory. + Hide the 'Image DOT source' tab. +- cloud (2 endpoints; delay and ttl decreased by a random amount in [min, max]. + Fixed the interface code to agree with itself about how endpoints should be named :-) + Simulation part + Defects on by default - Implementation: do it as a further modification to VDE, in a special hublet altering the ttl field in IP packets and dropping the frame if needed +-+ -->->|H|-+--> +-+ + IPv6: probably netmask and broadcast are not (explicitly) used. Fields should be different (I think that just an 'IPv6 address' with an updated column constraint would suffice). + Ask Jean-Vincent about this. - fix constraint predicate for IPv6 address validation - test on the guest + Marionnet Logo: replace Suse's logo with Mandriva's logo -+ UI: by default the first port to connect should be the one with minimum index. - [I'm not sure it always works as I want it] + Let's set on a convention for cable colors (for example red = crossover, blue = straight, green = serial), and stick to it. It would be very useful in the 'Network details' page. If we want to support B/W printing we can choose colors which look "different enough" when printed (e.g. black and light green), or use both color and thickness. + [tentatively: red for cross-over, blue for straight, black for serial. This convention is used in the defects interface] + Do it for the graph [J.V.] + Added a 'reboot' functionality for devices. + Treeview: added whole-row "after update" callback + UML process: non-graceful startup is now implemented first with uml_mconsole halt, and --if this fails-- with signals. Also hung UMLs should be correctly killed this way. + Reduced progress bar pusling overhead + Hublet spawn: get rid of the sleep kludge. This is actually *unsafe*, and can fail with large networks. + The new version is safe and also way faster. + Killing processes: also UML appears to be resistent to SIGINT in some cases. Always send a SIGKILL if needed. + Parallelized process spawning and termination when possible, within a single device. + Death monitor: made the unexpected-death callback non-optional named parameters, also for process subclasses and not only for device subclasses + Death monitor: show a different message on unexpected death, much friendlier and more accurate in the case of cables. + Saving: add a progress bar + [No, it's complicated: it should be done in a separate thread, but it would interact with *everything* in the application] + Cable disconnection: test it. The interface bug doesn't seem limited to the interface + Quickly fixed with a kludgish work-around in the Glade part... + ...and a more important fix in can_resume for Ethernet cables: see mariokit.ml + Cable disconnection: it works, but the interface allows to disconnect a cable more than once. This bug is completely harmless, but ugly. [No, it wasn't harmless --L.] + LED grids: added the Marionnet icon. Unfortunately it's nontrivial to add it to virtual terminals. + Death monitor: in case of unexpected death we need to poweroff devices at the level of mariokit, and not simply in simulated_network: in order to implement this all devices in simulated_network need to be passed an *unexpected_death_callback* parameter at construction time. + Remove old defects GUI - I've not removed the logic dealing with XML. I could break something... It's better to leave that alone by now. + Defects: automatically highlight defective interfaces (and possibly also devices), so that defective parts are readily visible. I think this can make the interface friendlier. + Options|Autoconfigure IP addresses + Treeview: don't hide headings when scolling + Also added horizontal scrolling + Defects: fix bit flipping probablity + Also give a warning when the user sets it very high + Progress bars have a noticeable overhead when they are many. Use only one shared timer instead of one timer per progress bar. + Startup/Shutdown/Poweroff everything: parallelize. + Modify a connected cable, changing an endpoint: a new cable is correctly created with refcount 3, but its process is not spawned. Investigate. + Get rid of all the SIGCHLD indebuggable stuff, and re-implement the death monitor with polling. + Signals: Look for this in the glibc manual, there's an example which is exactly what we need: ----------------------------------------------------------------------- Here's an example of how to use `waitpid' to get the status from all child processes that have terminated, without ever waiting. This function is designed to be a handler for `SIGCHLD', the signal that indicates that at least one child process has terminated. ----------------------------------------------------------------------- + Removed waitpid() calls from everywhere except the new SIGCHLD handler, whose task is to get notified when any child dies; in order to avoid the merged signal 'feature' (see the GNU libc manual) the handler calls waitpid() in a loop. This saves the need to use waitpid() to avoid zombies, and avoids nasty interactions between kill() and waitpid(), or several concurrent waitpid() calls. This kind of debugging is so fun :-). + Other funny signal problem: system() is implemented with waitpid()... (see umix.ml, in the OCaml sources); hence I have to temporarily block the SIGCHLD handler when using Unix.system. + Done the same also for run (implemented with Unix.system), as defined in UnixExtra... + Shutdown everything should have a confirm dialog + Add "power-off everything" + ...with a confirm dialog + Fix this: connecting two interfaces of the same device with a crossover doesn't work (the cable is not added). + Fixed a nasty bug related to device creation order and defects, in talking.ml. In some cases a cable was instantiated *before* its defects were added to the defects treeview, hence failing when the instantiation procedure looked for the defects. + Implement defects in the simulated network + done for everything except machine-router + done it for machine_or_router + guest-side network configuration script using boot_parameters - To do: port it to the router + Network details: automatically save at any caller-level modification + Network defects: automatically save at any caller-level modification + Network details: bind to the interface in talking. + machine + router + cloud + gateway + Network details: also marshal/unmarshal the counters used for generating fresh addresses. + Removed old debug prints scattered thru the code + hostfs support (especially to work around the kernel command line length limitation): from the guest: mount none /.host -t hostfs -o HOSTDIRECTORY + Recorded the guest name into hostfs; it's useful from the host side. + boot_parameters script supplied to each guest via hostfs + Refactor: all GUI code should be able to show a dialog displaying an error message. + Added a facility allowing to show a progress bar dialog + Treeview: add a general-purpose method row_ids_such_that + Filesystem history: the most recent state of each device is now always highlighted. + Build system: added a kludgish Makefile in OCAMLBRICKS, ugly but useful. + states interface: reimplemented with the new treeview + Fail immediately if MARIONNET_HOME is not set. + Fail immediately if the UID is not 0 - Support pathnames with spaces + Some images pathnames should be made relative + Rationalize image file paths - Remove checkboxes from dynamic menu items - Bug in my ghostification patch: adding a default gateway allows to (implicitly) set a route thru the ghost interface (and the route is impossible to remove later: this is correct). The problem is that the ghost interface name can't be computed from ADDRT ioctl parameters without looking at the current routing tables (conditionally implemented in two different ways). This should not harm users who don't know about all of this stuff, but could be exploited as an unauthorized way to communicate with the host. Nontrivial to fix. -+ UI: also show cables endpoint names + Done for defects + Do it for the main Hardware UI [No, now we show cable names in the network graph. It's even better] + global communication LEDgrid [No, it's not needed. Single-device LEDgrids are enough.] - In some cases the ".mar" suffix is not appended when saving a file. When? + I think it doesn't happen any more. I haven't seen this for a long time. + machine: alter implementation adding one more level of hublets, to be able to implement defects - serial connection + defect + new subtab of 'Materiel', with port detailed configuration [Done, but it's unrelated to defects...] + new subtab of 'Materiel', with defects for ports and wires (resolution: each direction of each port and cable) - teacher -> students - Allow the user to shutdown machines with halt from within UML without messing up our state - Correct hublet aynchronous initialization without sleeping: it can be done with a datagram socket, just like blinking - Asynchronous startup/shutdown with threads - project GPG signatures - assisted mode / student mode + UML filesystems: add support for a swap file, dynamically created at startup and destroyed on shutdown + [No: I tried, but it's problematic: cow files (as it should be expected) become *very* big. And swap files can't be on hostfs or NFS. I don't see any easy solution. --L.] + Bug in my ghostification patch: another (relatively subtle) case of missing copy_from_user(), in the SIOCADDRT ioctl. + Bug in my ghostification patch: dhclient fails to add the default gateway: "The user aked to add a route involving the ghost interface . We make this operation fail" ^ | empty string! ----+ + Bug in my ghostification patch: can't acquire a spinlock in preemptable or SMP kernel without disabling interrupts. Testcase: while true; do dhclient; done + Too heaviweight locking in my ghostification patch: use rw_spinlocks to allow readers to execute concurrently. The read case is infinitely more common, as only ghostification and unghostification involve writing. + In some cases saving with a different name with 'Save As' (and 'Copy Into'?) seems to break the states interface. I think the states prefix path needs to be updated. + Start a machine and *immediately* shut down everything, before tha machine has actually started. The GUI hangs waiting forever that the process terminates, but its termination message hasn't arrived because uml_console just failed, and we didn't notice. + exam mode + eth42 + cable dynamic menu + connect/disconnect + remove default entries + Interface: forbid saving when there are machines or routers running + network element update, keeping identity + simulation level + static network graph level + LEDgrids: destroy and re-create them on update + states + more elaborate support for states + Ghostification patch: now that ugly stacktrace does not appear on startup any more. Also worked around a strange problem with arch/um/os-Linux/sys-i386/registers.c, using some macros like JB_PC, JB_SP and JB_BP -- which apparently should be defined in , but aren't. ----------------------------------------------------- ----------------- Riguardo alle uml ----------------- + emacs lentissimo a lanciarsi +- vi si comporta in maniera bizzarra con la tastiera ed inutilizzabile + (I think this has been solved by upgrading debian packages) - ifconfig eth? /(8|16|24) d un messaggio di errore strano - l'interfaccia sembra tuttavia ben configurata - non ho testato ma il sintomo potrebbe verificarsi solo quando il numero di bit accesi del netmask [8/16/24] non corrisponde alla classe convenzionale (per esempio se dico ifconfig eth0 192.168.1.3/8) - /etc/hosts da ripulire (ci sono linee con myrouter) - ping -b .. (broadcast) non funziona + route add .. eth? provoca un crash del kernel host (senza eth? no) -------------------- Riguardo a marionnet -------------------- - se marionnet viene lanciata da un terminale e quest'ultimo viene chiuso, l'interfaccia grafica impazzisce e non pi utilizzabile => si potrebbe risolvere utilizzando nohup nel marionnet_starter? + [Yes, good idea: nohup (plus a small modification I did) solves this. --L.] - Add nohup to marionnet_starter (I don't have a copy) + mancano crudelmente le barre di progressione per capire che l'applicazione sta lavorando e che non c' da preoccuparsi => si sistemer con il pilota dei processi + shutdown non parallelo delle macchine virtuali => si sistemer anche questo con e nel pilota dei processi + quando si fa Quitter, poi Annuler, esce ugualmente! - IDEA: per evitare il rischio di terminali bloccati, avviare sin dall'inizio una batteria di terminali per la stessa uml? Utilizzare una konsole con vari tab? Dare la possibilit nell'interfaccia di lanciare un nuovo terminale su una certa macchina (solo quando in esecuzione)? + IDEA: mettere da qualche parte ben visibile (titolo della finestra?) il nome del progetto sul quale si lavora + IDEA: mettere il logo Paris 13 nell'about, dopo i nostri nomi, magari preceduto da una frase tipo "Projet financ par l'UP13" - IDEA: sarebbe bene un commento o un'etichetta anche per la macchine (come per hub e switch). In questo modo si potrebbe mettere per esempio il numero IP (o uno schema di numero IP come per esempio 192.168.k.7 dove k un parametro che dipende dallo studente che deve fare l'esame) in modo che appaia chiaramente sullo sketch senza che lo studente abbia bisogno di rileggere l'enunciato del problema posto - IDEA: nella finestra di definizione di una macchina permettere con un pulsantino vicino alla scelta della distribuzione di sfogliare (chiamata ad un qualunque visualizzatore o editor esterno) la lista dei pacchetti installati (output di dpkg -l). Idem per il kernel; in questo caso si potr sfogliare il .config + nelle cose da fare bisogna aggiungere la "dinamicit" dello sketch (distinguere tra componenti in esecuzione, sospesi, inattivi,..) -------------------------------- Riguardo alla piattaforma (host) -------------------------------- + le finestre dei terminali delle macchine virtuali non si sistemano automaticamente nello spazio libero del desktop; al contrario si accumulano una sull'altra => opzione di lanciamento del terminale o opzione di X? [This should be possible to set *in a global way* if we can configure the window manager. It's doable for networked classrooms and LiveDVD, not for normal user installation --L.] ------------------------------------------------------ Riguardo alle cose che avrei tanto desiderato testare e che ho dimenticato di testare ------------------------------------------------------ - controllare che tcpdump sia sincrono e se non lo cercare di capire per quale ragione non lo (pi) + [Now it appears to be synchronous. We might have "solved" the problem by recompiling the kernel with a different configuration. --L.] - No, I can reproduce the problem again now [--L., September 2007] + About: thank the artist who drew our logo + Logo and splash image: blurred Mandriva's logo to make it blend with the painting in a more natural way + Guest filesystem: + set the xterm title at early boot time (added /etc/init.d/marionnet-xterm-title.sh) + updated the distribution + compiled Emacs from sources (unicode-2 branch from CVS). This solves the slow boot problem. + Death monitor: don't popup a warning window per process when a cluster of processes implementing a single device is killed by a callback; just show the one which actually failed. + Added an automatically generated version.ml - Initialization: check that /tmp is a filesystem suitable to handle cow's; do the same at working-directory change. - Allow to change the working directory - Explain the xterm Ctrk+Button3 trick in the user manual - Xephyr: modify it to be able to set the window title and disable the grab feature. + newMachine simplified constructor: removed an old use of "X host" as a string, which is now replaced by an agebraic type + Treeviews: fixed a nasty bug which prevented undumping + Removed some old debug prints + Treeviews: forward-compatibility in file dumps (old Marionnets can read new files by simply not using unknown fields, when all row and column constraints are respected) + Treeviews: backward-compatibility in file dumps (new Marionnets can read old files, providing defaults for new fields not specified in files) + Treeview: column headers are now internally stored in English, but an internationalized translation may be shown: see the new optional parameter ?shown_header in `column' and its subclasses. + Minor aesthetical changes + New treeview for texts + Texts treeview: removed partial copies in case of import error + Added a quick and easy forest-undumping facility + Made hublet termination even more paranoidly safe + UI: Gtk callbacks sometimes raise exceptions when creating cables which can not be connected due to their kind or to port availability: "In callback for signal activate, uncaught exception: Failure("getNodeByName \"\"")" Recipe to reproduce: create a new straight cable in an empty network + Bugfix: now it's again possible to set a label for straight Ethernet cables + Bugfix: updated the 'Add cable' menu item sensitivity also on machine edit. Added the method update_add_cable_sensitivity to state, replacing the previous kludge which tied this feature to each sketch update. + Fixed a pernicious bug involving how router ports should be named (portX rather than ethX) - The progress bar dialog 'shutting down machine' also appears for machines which are not running at project close/open. [This is only noticeable when using variants, because of the copying/removing latency. In other cases the window flashes just for a moment, or Gtk doesn't even have the time to draw it before it's destroyed --L.]. + Talking: added some missing calls to st#update_cable_sensitivity + Bugfix: remove machine: delete all cow's + Bugfix: correctly save and restore filesystem history + Talking: now the sketch is refreshed at cable connection/disconnection + Ledgrid manager: made LEDgrid windows not resizable + simple_dialogs.ml: Added the fancy ask_text_dialog + strExtra: trivial generalization of wellFormedName + Cable treeview icons: updated colors; now they are coherent with the graph conventions + GUI, talking: added the Marionnet icon to all dialogs which still lacked it. + Makefile: trivial changes + Minor cosmetic changes + Bugfix: filesystem history: ``startup in this state'' did not generate a child in the correct position within the forest. + Bugfix: when removing a device implies removing some cables, such cables must also be removed from defects + Filesystem history: moved the tab to 'Hardware' + Sketch: added synchronization + Connected/disconnected cables in the sketch: fixed a buglet + Filesystem history: implmenent ``Export as variant'' + Filesystem history: minor refactoring + Translated the Glade part of the user interface into French + Starting up a network with no computers is now allowed. + Update the Dot image to show more detailed state (suspended devices, disconnected cables, ... [and cable names, I'd say --L.]) [J.V.] + Implement the new variant semantics: + (i) if there exists a symlink [or non-symlink file] named `suggested' in the appropriate variant directory, than make the GUI select *that* as the initial entry, when creating a new machine; ['no variant' comes as the second element when 'suggested' exists] (ii) If no such link exists then `no variant' is the initial entry (iii) In any case it must be possible to select `no variant' + Remove the `default' variant [easy: there was no `default' variant :-)] + Rename `clean' to 'no variant' (for variants, not filesystem states) + At machine [and router] creation time use `readlink' to resolve the variant name if it's a symlink, and store the resolved name instead of the link name, for any link + The constraint on variant read-only-ness at machine update is ok. + Gateway GUI: made the IP number textboxes non-sensitive + Treeview: added view-detaching support. Load should be faster. - Document the filesystem name convention: names should contain a never-changing checksum. + Solved more synchronization problems. + Added a very beautiful message-passing synchronization in wait_for_all_currently_scheduled_tasks. enqueue/dequeue replace both lock/unlock and wait/signal, they're higher level and easy to use. + Bugfix: "Save as" and "Copy into" did't append the ".mar" extension to the given pathname. + Fixed several concurrency-related problems, including some quite serious ones manifesting at project close time. + task_runner: added the method wait_for_all_currently_scheduled_tasks . + Sometimes cables seem to hang using 100% CPU [and, just to be clear, it's most probably due to my own patches to VDE. --L.]. This could be worked around by restarting them every k seconds, with a smallish k like 10. I needed the new more elaborate synchronization support to be able to do this. [in Freiburg] + Also added a user option to toggle this behavior. [in Freiburg] + mariokit: added some more needed (and some non-needed, just to play it safe) synchronization in class cable + Other minor cleanups [in Freiburg] + ...synchronization: added a recursive mutex implementation. Not optimized (and very defensive for such a low-level thing), but it seems to work. Very delicate stuff, but useful. + Mariokit: other dangerous synchronization changes :-) + wirefilter processes survive a Marionnet close operation when the project is not closed. [Not any more, I think --L., in Freiburg] + Mariokit: added some needed synchronization + Synchronization: bugfix on cable connect/disconnect + Machine dialog: the default kernel should be 'default', when it exists. +- It's already that way, apparently. Mmm, I think to have observed a different behavior, but I'm not sure. + Interface: redundant 'Power off' menu entries were hidden, and 'Shutdown' menu entries were relabeled to 'Power off', keeping the 'Stop' stock icon. This was done for: hub, switch, cloud, gateway (i.e. Ethernet plug) + (Seemingly) easy user interface changes: + change the default label locations so that both device names *and* interface names are visible in the network graph [J.V.] + switch icon: the 'off' version is taller than the 'on' version; I don't think it's intentional, as this is not true for either the hub or the router. The switch 'on' icon should be re-cropped. [J.V.] + Removed the Ethernet cloud and the Ethernet plug from the details interface. +- Removed the correct-crossedness constraint on cables: now the interface allows to add ``incorrect'' cables + Prevent ``incorrect'' cables from working + Added all the needed infrastructure, now also in the `network' class in mariokit + Just used the new method `would_a_cable_be_correct_between' at cable construction time (modification is implemented as destruction + re-construction) - Conditionally restore the old behavior, where the GUI prevents the user from doing mistakes + Constrained project names: they must be ``identifiers''; of course we still accept an explicitly supplied ".mar" extension, and we still silently add it when missing. -+ The main process exit code should be 0 -+ [No, I tried handling SIGINT and SIGTERM and it worked in many cases, but it's too dangerous: sometimes the interface just hangs and some threads remain alive. As of now I've just slightly cleaned the code but the strategy is essentially the same as before. --L.] + Treeview: + a just-added tree should be collapsed by default + all trees are now collpsed at undump time marionnet-0.90.6+bzr434.orig/marionnet-daemon.ml0000600000175000017500000005004012167200764020350 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2008, 2010 Jean-Vincent Loddo Copyright (C) 2008 Luca Saiu Copyright (C) 2008, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Daemon_language;; module Recursive_mutex = MutexExtra.Recursive ;; let socket_name = Daemon_parameters.socket_name let timeout_interval = Daemon_parameters.timeout_interval let debug_interval = Daemon_parameters.debug_interval let select_timeout = Daemon_parameters.select_timeout (** Client identifiers are simply automatically-generated sequential integers: *) type client = int;; (** Pretty-print a client identifier: *) let string_of_client client = Printf.sprintf "" client;; (** The mutex used to protect the resource map from concurrent access: *) let the_daemon_mutex = Recursive_mutex.create ();; (** An associative structure mapping each client to its resources: *) let resource_map = new Hashmmap.hashmultimap ();; (** An associative structure mapping each client to the time of the death of its resources (unless they send messages, of course): *) let client_death_time_map = new Hashmap.hashmap ();; (** An associative structure mapping each client to its socket: *) let socket_map = new Hashmap.hashmap ();; (** Seed the random number generator: *) Random.self_init ();; (** Generate a random name, very probably unique, with the given prefix: *) let make_fresh_name prefix = let random_number = Random.int 1000000 in Printf.sprintf "%s%i" prefix random_number;; (** Generate a random name, very probably unique, for a new tap: *) let make_fresh_tap_name () = make_fresh_name "tap";; (** Generate a random name, very probably unique, for a new tap for the socket component: *) let make_fresh_tap_name_for_socket () = make_fresh_name "sktap";; (** Actaully make a tap at the OS level: *) let make_system_tap (tap_name : tap_name) uid ip_address = Log.printf "Making the tap %s...\n" tap_name; let command_line = Printf.sprintf "{ tunctl -u %i -t %s && ifconfig %s 172.23.0.254 netmask 255.255.255.255 up; route add %s %s; }" uid tap_name tap_name ip_address tap_name in Log.system_or_fail command_line; Log.printf "The tap %s was created with success\n" tap_name ;; (** Actually make a tap at the OS level for the bridge socket component: *) let make_system_tap_for_socket (tap_name : tap_name) uid bridge_name = Log.printf "Making the tap %s...\n" tap_name; let command_line = Printf.sprintf "{ tunctl -u %i -t %s && ifconfig %s 0.0.0.0 promisc up && brctl addif %s %s; }" uid tap_name tap_name bridge_name tap_name in let on_error = Printf.sprintf "tunctl -d %s" tap_name in Log.system_or_fail ~on_error command_line; Log.printf "The tap %s was created with success\n" tap_name ;; (** Actually destroy a tap at the OS level: *) let destroy_system_tap (tap_name : tap_name) = Log.printf "Destroying the tap %s...\n" tap_name; let redirection = Global_options.Debug_level.redirection () in let command_line = Printf.sprintf "while ! (ifconfig %s down && tunctl -d %s %s); do echo 'I can not destroy %s yet %s...'; sleep 1; done&" tap_name tap_name redirection tap_name redirection in Log.system_or_fail ~hide_output:false ~hide_errors:false command_line; Log.printf "The tap %s was destroyed with success\n" tap_name ;; (** Actually destroy a tap at the OS level for the socket component: *) let destroy_system_tap_for_socket (tap_name : tap_name) uid bridge_name = Log.printf "Destroying the tap %s...\n" tap_name; let command_line = (* This is currently disabled. We have to decide what to do about this: *) Printf.sprintf "{ ifconfig %s down && brctl delif %s %s && tunctl -d %s; }" tap_name bridge_name tap_name tap_name in Log.system_or_fail command_line; Log.printf "The tap %s was destroyed with success\n" tap_name; ;; (** Instantiate the given pattern, actually create the system object, and return the instantiated resource: *) let make_system_resource resource_pattern = match resource_pattern with | AnyTap(uid, ip_address) -> let tap_name = make_fresh_tap_name () in make_system_tap tap_name uid ip_address; Tap tap_name | AnySocketTap(uid, bridge_name) -> let tap_name = make_fresh_tap_name_for_socket () in make_system_tap_for_socket tap_name uid bridge_name; SocketTap(tap_name, uid, bridge_name);; (** Actually destroyed the system object named by the given resource: *) let destroy_system_resource resource = match resource with | Tap tap_name -> destroy_system_tap tap_name | SocketTap(tap_name, uid, bridge_name) -> destroy_system_tap_for_socket tap_name uid bridge_name;; (** Create a suitable resource matching the given pattern, and return it. Synchronization is performed inside this function, hence the caller doesn't need to worry about it: *) let make_resource client resource_pattern = Recursive_mutex.with_mutex the_daemon_mutex (fun () -> try (* Create a resource satisfying the given specification, and return it: *) Log.printf "Making %s for %s\n" (string_of_daemon_resource_pattern resource_pattern) (string_of_client client); let resource = make_system_resource resource_pattern in Log.printf "Adding %s for %s\n" (string_of_daemon_resource resource) (string_of_client client); resource_map#add client resource; resource with e -> begin Log.printf "Failed (%s) when making the resource %s for %s; bailing out.\n" (Printexc.to_string e) (string_of_daemon_resource_pattern resource_pattern) (string_of_client client); raise e; end);; (** Destroy the given resource. Synchronization is performed inside this function, hence the caller doesn't need to worry about it: *) let destroy_resource client resource = Recursive_mutex.with_mutex the_daemon_mutex (fun () -> try Log.printf "Removing %s %s\n" (string_of_client client) (string_of_daemon_resource resource); Log.printf "** resource_map has %i bindings\n" (List.length resource_map#to_list); flush_all (); resource_map#remove_key_value_or_fail client resource; (* resource_map#remove_key_value client resource; *) Log.printf "** resource_map has %i bindings\n" (List.length resource_map#to_list); flush_all (); destroy_system_resource resource; with e -> begin Log.printf "WARNING: failed (%s) when destroying %s for %s.\n" (Printexc.to_string e) (string_of_daemon_resource resource) (string_of_client client); raise e; end);; let destroy_all_client_resources client = Recursive_mutex.with_mutex the_daemon_mutex (fun () -> try Log.printf "Removing all %s's resources:\n" (string_of_client client); List.iter (fun resource -> destroy_resource client resource) (resource_map#lookup client); Log.printf "All %s's resources were removed with success.\n" (string_of_client client); flush_all (); with e -> begin Log.printf "Failed (%s) when removing %s's resources; continuing anyway.\n" (Printexc.to_string e) (string_of_client client); end);; let destroy_all_resources () = Recursive_mutex.with_mutex the_daemon_mutex (fun () -> List.iter (fun (client, _) -> try destroy_all_client_resources client with e -> begin Log.printf "Failed (%s) when removing %s's resources (while removing *all* resources); continuing anyway.\n" (Printexc.to_string e) (string_of_client client); end)) client_death_time_map#to_list;; let keep_alive_client client = Recursive_mutex.with_mutex the_daemon_mutex (fun () -> try (* Immediately raise an exception if the client is not alive: *) let _ = client_death_time_map#lookup client in let current_time = Unix.time () in let death_time = current_time +. timeout_interval in client_death_time_map#add client death_time; Log.printf "I will not kill %s until %f (it's now %f)\n" (string_of_client client) death_time current_time; flush_all (); with Not_found -> begin Log.printf "keep_client_alive failed because the client %s is not alive.\n" (string_of_client client); failwith ("keep_alive_client: " ^ (string_of_client client) ^ " is not alive."); end);; (** Some resources [well, none as of now] are global, i.e. shared by all clients whenever there is at least one. We use a reference-counter to keep track of the number of currently existing clients; global resources are created when the counter raises from 0 to 1, and destroyed when it drops from 1 to 0. *) let client_no = ref 0;; let the_resources_if_any = ref None;; let global_resources () = Recursive_mutex.with_mutex the_daemon_mutex (fun () -> match !the_resources_if_any with | None -> failwith "the global resources do not exist; this should never happen" | Some resources -> resources);; let make_global_resources_unlocked_ () = assert(!the_resources_if_any = None); (* To do: actually create something, if needed. *) the_resources_if_any := Some ();; let destroy_global_resources_unlocked_ () = match !the_resources_if_any with | None -> assert false | Some resources -> begin (* To do: actually destroy something, if needed. *) the_resources_if_any := None; flush_all (); end;; let increment_client_no () = Recursive_mutex.with_mutex the_daemon_mutex (fun () -> (if !client_no = 0 then begin Log.printf "There is at least one client now. Creating global resources...\n"; make_global_resources_unlocked_ (); Log.printf "Global resources were created with success.\n"; flush_all (); end); client_no := !client_no + 1);; let decrement_client_no () = Recursive_mutex.with_mutex the_daemon_mutex (fun () -> client_no := !client_no - 1; (if !client_no = 0 then begin Log.printf "There are no more clients now. Destroying global resources...\n"; destroy_global_resources_unlocked_ (); Log.printf "Global resources were destroyed with success.\n"; flush_all (); end));; (** Create a new client on which we're going to interact with the given socket, and return its identifier: *) let make_client = let next_client_no = ref 1 in fun socket -> Recursive_mutex.with_mutex the_daemon_mutex (fun () -> (* Generate a new unique identifier: *) let result = !next_client_no in next_client_no := !next_client_no + 1; (* First add any number to the data structure, then call keep_alive_client to make the death time correct: *) Log.printf "Creating %s.\n" (string_of_client result); flush_all (); client_death_time_map#add result 42.42; socket_map#add result socket; keep_alive_client result; increment_client_no (); Log.printf "Created %s.\n" (string_of_client result); flush_all (); result);; let destroy_client client = Recursive_mutex.with_mutex the_daemon_mutex (fun () -> Log.printf "Killing %s.\n" (string_of_client client); flush_all (); (try client_death_time_map#remove client with _ -> ()); (try destroy_all_client_resources client with _ -> ()); decrement_client_no (); (try Unix.close (socket_map#lookup client); Log.printf "The socket serving the client %i was closed with success.\n" client; flush_all (); with e -> begin Log.printf "Closing the socket serving the client %i failed (%s).\n" client (Printexc.to_string e); flush_all (); end); (try socket_map#remove client with _ -> ()); Log.printf "%s was killed.\n" (string_of_client client); flush_all ());; let debugging_thread_thunk () = while true do Thread.delay debug_interval; Recursive_mutex.with_mutex the_daemon_mutex (fun () -> Log.printf "--------------------------------------------\n"; Log.printf "Currently existing non-global resources are:\n"; List.iter (fun (client, resource) -> Log.printf "* %s (owned by %s)\n" (string_of_daemon_resource resource) (string_of_client client)) (resource_map#to_list); Log.printf "--------------------------------------------\n"; flush_all (); ); flush_all (); done;; (** The 'timeout thread' wakes up every timeout_interval seconds and kills all clients whose death time is past. *) let timeout_thread_thunk () = while true do (* Sleep: *) Thread.delay timeout_interval; (* Some variables are shared, so we have to synchronize this block; it's not a problem as this should be very quick: *) Recursive_mutex.with_mutex the_daemon_mutex (fun () -> (* Get up-to-date death time information for all clients: *) let current_time = Unix.time () in let client_death_times = client_death_time_map#to_list in (* Kill all clients whose death time is past: *) List.iter (fun (client, death_time) -> if current_time >= death_time then begin Log.printf "Client %s didn't send enough keep-alive's.\n" (string_of_client client); destroy_client client; flush_all (); end) client_death_times; flush_all ()); done;; (** Serve the given single request from the given client, and return the response. This does not include the keep-alive. *) let serve_request request client = match request with | IAmAlive -> Success | Make resource_pattern -> Created (make_resource client resource_pattern) | Destroy resource -> destroy_resource client resource; Success | DestroyAllMyResources -> begin destroy_all_client_resources client; Success end;; (** This thread serves *one* client whose socket is given and is assumed to be open: *) let connection_server_thread (client, socket) = try Log.printf "This is the connection server thread for client %i.\n" client; flush_all (); while true do Log.printf "Beginning of the iteration.\n"; flush_all (); (* We want the message to be initially invalid, at every iteration, to avoid the risk of not seeing a receive error. Just to play it extra safe: *) let buffer = String.make message_length 'x' in (* We don't want to block indefinitely on read() because the socket could be closed by another thread; so we simply select() with a timeout: *) let (ready_for_read, _, failed) = (****) try Unix.select [socket] [] [socket] select_timeout with _ -> begin Log.printf "!!!!FAILED IN select (connection_server_thread)!!!!\n"; flush_all (); failwith "select() failed"; (* ([], [], []); *) end in (****) (* Unix.select [socket] [] [socket] select_timeout in *) if (List.length failed) > 0 then failwith "select() reported failure with the socket" else if (List.length ready_for_read) > 0 then begin let received_byte_no = Unix.read socket buffer 0 message_length in if received_byte_no < message_length then failwith "recv() failed, or the message is ill-formed" else begin let request = parse_request buffer in Log.printf "The request is\n %s\n" (string_of_daemon_request request); flush_all (); keep_alive_client client; let response = try serve_request request client with e -> Error (Printexc.to_string e) in Log.printf "My response is\n %s\n" (string_of_daemon_response response); flush_all (); let sent_byte_no = Unix.send socket (print_response response) 0 message_length [] in (if not (sent_byte_no == sent_byte_no) then failwith "send() failed"); end; (* inner else *) end else begin (* If we arrived here select() returned due to the timeout, and we didn't receive anything: loop again. *) end; done; with e -> begin Log.printf "Failed in connection_server_thread (%s) for client %i.\nBailing out.\n" (Printexc.to_string e) client; destroy_client client; (* This also closes the socket *) Log.printf "Exiting from the thread which was serving client %i\n" client; flush_all (); end;; (** Remove an old socket file, remained from an old instance or from ours (when we're about to exit). Do nothing if there is no such file: *) let remove_socket_file_if_any () = try Unix.unlink socket_name; Log.printf "[Removed the old socket file %s]\n" socket_name; flush_all (); with _ -> Log.printf "[There was no need to remove the socket file %s]\n" socket_name;; (** Destroy all resources, destroy the socket and exit on either SIGINT and SIGTERM: *) let signal_handler signal = Log.printf "=========================\n"; Log.printf "I received the signal %i!\n" signal; Log.printf "=========================\n"; Log.printf "Destroying all resources...\n"; destroy_all_resources (); Log.printf "Ok, all resources were destroyed.\n"; Log.printf "Removing the socket file...\n"; remove_socket_file_if_any (); Log.printf "Ok, the socket file was removed.\n"; flush_all (); raise Exit;; (** Strangely, without calling this the program is uninterruptable from the console: *) Sys.catch_break false;; Sys.set_signal Sys.sigint (Sys.Signal_handle signal_handler);; Sys.set_signal Sys.sigterm (Sys.Signal_handle signal_handler);; let check_that_we_are_root () = if (Unix.getuid ()) != 0 then begin Log.printf "\n*********************************************\n"; Log.printf "* The Marionnet daemon must be run as root. *\n"; Log.printf "* Bailing out. *\n"; Log.printf "*********************************************\n\n"; raise Exit; end;; let the_server_main_thread = check_that_we_are_root (); ignore (Thread.create timeout_thread_thunk ()); ignore (Thread.create debugging_thread_thunk ()); let connection_no_limit = 10 in let accepting_socket = Unix.socket Unix.PF_UNIX Unix.SOCK_STREAM 0 in let sock_addr = Unix.ADDR_UNIX socket_name in (* Remove the socket file, if it already exists: *) remove_socket_file_if_any (); (* Bind the file to the socket; this creates the file, or fails if there are permission or disk space problems: *) Unix.bind accepting_socket sock_addr; (* Everybody must be able to send messages to us: *) Unix.chmod socket_name 438 (* a+rw *); Log.printf "I am waiting on %s.\n" socket_name; flush_all (); Unix.listen accepting_socket connection_no_limit; while true do try Log.printf "Waiting for the next connection...\n"; flush_all (); let (socket_to_client, socket_to_client_address) = Unix.accept accepting_socket in let client_id = make_client socket_to_client in Log.printf "A new connection was accepted; the new client id is %i\n" client_id; flush_all (); ignore (Thread.create connection_server_thread (client_id, socket_to_client)); with e -> begin Log.printf "Failed in the main thread (%s). Bailing out.\n" (Printexc.to_string e); flush_all (); raise e; end; done;; marionnet-0.90.6+bzr434.orig/README0000600000175000017500000000140612167200764015443 0ustar lucaslucasThis file is part of Marionnet, a virtual network laboratory. Copyright (C) 2008 Luca Saiu Copyright (C) 2008 Jean-Vincent Loddo This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . [To do: write this README.] marionnet-0.90.6+bzr434.orig/x.ml0000600000175000017500000001727212167200764015374 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2011 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2011 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) let fail x = failwith (Printf.sprintf "Ill-formed DISPLAY string: '%s'" x) ;; (** The syntax of $DISPLAY is: [host]:display[.screen] *) let get_host_display_screen_from_string x = let split_rigth_part y = match (StringExtra.split ~d:'.' y) with | [ display; screen ] -> (display, screen) | [ display ] -> (display, "0") | _ -> fail x in let host, (display, screen) = match (StringExtra.split ~d:':' x) with | [ host; right_part ] -> host, (split_rigth_part right_part) | [ right_part ] -> "localhost", (split_rigth_part right_part) | _ -> fail x in let strip_and_use_default_if_empty ~default x= let x = StringExtra.strip x in if x = "" then default else x in let host = strip_and_use_default_if_empty ~default:"localhost" host in let screen = strip_and_use_default_if_empty ~default:"0" screen in let display = StringExtra.strip display in (host, display, screen) ;; let get_host_display_screen () = try let x = Sys.getenv "DISPLAY" in if x = "" then raise Not_found (* It's just like it weren't defined... *) else get_host_display_screen_from_string x with Not_found -> failwith "The environment variable DISPLAY is not defined or empty, and Marionnet requires X.\nBailing out...";; (* Global variables: *) let host, display, screen = get_host_display_screen () ;; let _last_used_local_display_index = ref 0;; let mutex = Mutex.create ();; (* Useful for xnest: *) let get_unused_local_display () = Mutex.lock mutex; let index_to_socket_file index = Printf.sprintf "/tmp/.X11-unix/X%i" index in let exists pathname = try ignore (Unix.stat pathname); true; with _ -> false in let i = ref (!_last_used_local_display_index + 1) in while exists (index_to_socket_file !i) do i := !i + 1; done; _last_used_local_display_index := !i; Mutex.unlock mutex; Printf.sprintf ":%i" !i;; (* Note that this function really tries to establish a connection (which is immediately closed). Do not use with a one-shot service (it must accept more than one connection): *) let is_local_service_open ?(host_addr:string option) ~(port:int) () = let host_addr = match host_addr with | None -> Unix.inet_addr_loopback | Some str -> Unix.inet_addr_of_string str in try let (in_channel, out_channel) = Unix.open_connection (Unix.ADDR_INET(host_addr, port)) in Unix.shutdown_connection in_channel; true with Unix.Unix_error (Unix.ECONNREFUSED, _,_) -> false ;; (* Global variables: *) let host_addr = Unix.string_of_inet_addr ((Unix.gethostbyname host).Unix.h_addr_list.(0)) and port = 6000 + (try (int_of_string display) with _ -> 0) ;; (* Global variable: *) let is_X_server_listening_TCP_connections = is_local_service_open ~host_addr ~port () ;; Log.printf "---\nHost X data from $DISPLAY:\nHost: %s\nHost address: %s\nDisplay: %s\nScreen: %s\nListening on port %d: %b\n---\n" host host_addr display screen port is_X_server_listening_TCP_connections ;; exception No_problem ;; exception No_listening_server ;; (* $ socat TCP-LISTEN:6000,fork,reuseaddr,range=172.23.0.254 UNIX-CONNECT:/tmp/.X11-unix/X0 & # local connection $ socat TCP-LISTEN:6000,fork,reuseaddr,range=172.23.0.254 TCP:202.54.1.5:6003 & # DISPLAY=202.54.1.5:3 *) let fix_X_problems : unit = let socketfile = Printf.sprintf "/tmp/.X11-unix/X%s" display in let socketfile_exists = Sys.file_exists socketfile in let no_fork = None (* Yes, fork for each connections *) in let range4 = "172.23.0.0/24" in match is_X_server_listening_TCP_connections, host_addr with (* Case n°1: an X server runs on localhost:0 and accepts TCP connection: *) | true, "127.0.0.1" when port=6000 -> Log.printf "No X problems have to be fixed: connection seems working fine. Ok.\n" (* Case n°2: an X server runs on localhost and accepts TCP connection, but on a display Y<>0. We morally set up a PAT (Port Address Translation) 172.23.0.254:6000 -> 127.0.0.1:(6000+Y) simply using the unix socket. In this way, the virtual machines setting DISPLAY=172.23.0.254:0 will be able to connect to the host X server: *) | true, "127.0.0.1" when port<>6000 && socketfile_exists -> (* Equivalent to: socat TCP-LISTEN:6000,fork,reuseaddr UNIX-CONNECT:/tmp/.X11-unix/X? *) Log.printf "Starting a socat service: 0.0.0.0:6000 -> %s\n" socketfile; ignore (Network.Socat.inet4_of_unix_stream_server ?no_fork ~range4 ~port:6000 ~socketfile ()) (* Case n°3: an X server seems to run on localhost accepting TCP connection, but the display is Y<>0 and there isn't a corresponding unix socket. This is quite unusual: we are probably in a ssh -X connection. We have to pay attention to the fact that processes asking for a connexion are not from the machine 127.0.0.1 but are from the virtual machines 172.23.0.0/24. Note that the following command doesn't solve completely the problem: we have also to provide the X cookies in ~/.Xauthority to the virtual machines. *) | true, "127.0.0.1" when port<>6000 && (not socketfile_exists) -> (* Equivalent to: socat TCP-LISTEN:6000,fork,reuseaddr TCP:host_addr:port *) Log.printf "Starting a socat service: 0.0.0.0:6000 -> %s:%d\n" host_addr port; ignore (Network.Socat.inet4_of_inet_stream_server ?no_fork ~range4 ~port:6000 ~ipv4_or_v6:host_addr ~dport:port ()) (* Case n°4: probably a telnet or a ssh -X connection. Idem: the following command doesn't solve completely the problem: we have also to provide the X cookies in ~/.Xauthority to the virtual machines. *) | true, _ (* when host_addr<>"127.0.0.1" *) -> (* Equivalent to: socat TCP-LISTEN:6000,fork,reuseaddr TCP:host_addr:port *) Log.printf "Starting a socat service: 0.0.0.0:6000 -> %s:%d\n" host_addr port; ignore (Network.Socat.inet4_of_inet_stream_server ?no_fork ~range4 ~port:6000 ~ipv4_or_v6:host_addr ~dport:port ()) (* Case n°5: an X server seems to run on localhost but it doesn't accept TCP connections. We simply redirect connection requests to the unix socket: *) | false, "127.0.0.1" when socketfile_exists -> (* Equivalent to: socat TCP-LISTEN:6000,fork,reuseaddr UNIX-CONNECT:/tmp/.X11-unix/X? *) Log.printf "Starting a socat service: 0.0.0.0:6000 -> %s\n" socketfile; ignore (Network.Socat.inet4_of_unix_stream_server ?no_fork ~range4 ~port:6000 ~socketfile ()) | false, _ -> Log.printf "Warning: X connections are not available for virtual machines.\n" ;; (** This has to be performed *early* in the initialization process: *) let _ = GtkMain.Main.init ();; (** This is a workaround for some threading issues suggested by Jacques Garrigue; it's needed to be able to use the 'run' method in GTK and Glade objects without preventing other unrelated threads to run: *) let _ = GMain.Timeout.add ~ms:100 ~callback:(fun () -> Thread.delay 0.001; true);; marionnet-0.90.6+bzr434.orig/global_options.ml0000600000175000017500000000534712167200764020140 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) module Recursive_mutex = MutexExtra.Recursive ;; let mutex = Recursive_mutex.create ();; (** Here we only use one mutex; let's not specify it every time: *) let with_mutex thunk = Recursive_mutex.with_mutex mutex thunk;; (** Debug mode related functions are accessible also from this module: *) module Debug_level = Initialization.Debug_level;; (** Automatically generate IP addresses: *) let autogenerate_ip_addresses_default = false (*false*);; let autogenerate_ip_addresses = ref autogenerate_ip_addresses_default;; let set_autogenerate_ip_addresses value = with_mutex (fun () -> autogenerate_ip_addresses := value);; let get_autogenerate_ip_addresses () = with_mutex (fun () -> !autogenerate_ip_addresses);; (** Work-around the wirefilter bug (which is probably due to my patches to VDE): *) let workaround_wirefilter_problem_default = true;; (* true *) let workaround_wirefilter_problem = ref workaround_wirefilter_problem_default;; let set_workaround_wirefilter_problem value = with_mutex (fun () -> workaround_wirefilter_problem := value);; let get_workaround_wirefilter_problem () = with_mutex (fun () -> !workaround_wirefilter_problem);; (** How often we should restart wirefilters (average) *) let automatic_reboot_thread_interval = 180.0;; (** The name of the host bridge device used to implement network sockets: *) let ethernet_socket_bridge_name = let default = "br0" in Configuration.extract_string_variable_or ~default "MARIONNET_BRIDGE";; (** Keyboard layout in Xnest sessions; `None' means `don't set anything' *) let keyboard_layout = Configuration.get_string_variable "MARIONNET_KEYBOARD_LAYOUT" ;; module Keep_all_snapshots_when_saving = Stateful_modules.Variable (struct type t = bool let name = Some "keep_all_snapshots_when_saving" end);; let () = Keep_all_snapshots_when_saving.set Initialization.keep_all_snapshots_when_saving ;; marionnet-0.90.6+bzr434.orig/configuration.ml0000600000175000017500000000543512167200764017772 0ustar lucaslucas(* This file is part of marionnet Copyright (C) 2011 Jean-Vincent Loddo This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** Read configuration files: *) let configuration = (* Lowest priority first: *) let file_names = [ Printf.sprintf "%s/share/marionnet/marionnet.conf" Meta.prefix; (* failsafe copy *) Printf.sprintf "%s/etc/marionnet/marionnet.conf" Meta.prefix; "/etc/marionnet/marionnet.conf"; "~/.marionnet/marionnet.conf" ] in Configuration_files.make ~file_names ~variables:["MARIONNET_SOCKET_NAME"; "MARIONNET_BRIDGE";(* This is temporary: more than one bridge will be usable... *) "MARIONNET_KEYBOARD_LAYOUT"; "MARIONNET_DEBUG"; "MARIONNET_PDF_READER"; "MARIONNET_POSTSCRIPT_READER"; "MARIONNET_DVI_READER"; "MARIONNET_HTML_READER"; "MARIONNET_TEXT_EDITOR"; (* *Optional* configuration variables: *) "MARIONNET_TERMINAL"; "MARIONNET_PREFIX"; "MARIONNET_LOCALEPREFIX"; "MARIONNET_FILESYSTEMS_PATH"; "MARIONNET_KERNELS_PATH"; "MARIONNET_VDE_PREFIX"; "MARIONNET_ROUTER_FILESYSTEM"; "MARIONNET_ROUTER_KERNEL"; "MARIONNET_MACHINE_FILESYSTEM"; "MARIONNET_MACHINE_KERNEL"; "MARIONNET_ROUTER_PORT0_DEFAULT_IPV4_CONFIG"; "MARIONNET_DISABLE_WARNING_TEMPORARY_WORKING_DIRECTORY_AUTOMATICALLY_SET"; "MARIONNET_TMPDIR"; "MARIONNET_KEEP_ALL_SNAPSHOTS_WHEN_SAVING"; "MARIONNET_TIMEZONE"; ] ();; (* Convenient aliases: *) type varname = string let extract_bool_variable_or ~default varname = Configuration_files.Logging.extract_bool_variable_or ~default varname (configuration) let extract_string_variable_or ?k ?unsuitable_value ~default varname = Configuration_files.Logging.extract_string_variable_or ?k ?unsuitable_value ~default varname (configuration) let get_string_variable ?k ?unsuitable_value varname = Configuration_files.Logging.get_string_variable ?k ?unsuitable_value varname (configuration) marionnet-0.90.6+bzr434.orig/signals.ml0000600000175000017500000001524712167200764016565 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2007, 2008 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open PreludeExtra.Prelude;; (* We want synchronous terminal output *) open Unix;; open Sys;; let rec do_while body predicate = try body (); if predicate () then do_while body predicate; with _ -> begin (* Log.printf "My (poor man's :-)) do..while loop exited with an exception\n"; flush_all (); *) end;; let rec sigchld_handler signal = try Log.printf "SSS: in sigchld_handler.\n"; flush_all (); let pid, _ = Unix.waitpid [Unix.WNOHANG] 0 in if pid <> 0 then begin Log.printf "!!!!!!! The process with pid %i died.\n" pid; flush_all (); sigchld_handler signal; (* look for *other* dead children *) end; with Unix.Unix_error(_, "waitpid", _) -> begin Log.printf "!!!!!!! waitpid() failed (this might also be uninteresting).\n"; flush_all (); end;; let is_sigchld_handled_ref = ref false;; let is_sigchld_blocked_ref = ref false;; (** Install the SIGCHLD handler: *) let rec install_sigchld_handler () = set_signal sigchld (Signal_handle sigchld_handler); (* No need for synchronization here: we only do this once at startup, if ever: *) is_sigchld_handled_ref := true;; (* and sigchld_handler _ = *) (* print_string "[in the SIGCHLD handler]\n"; flush_all (); *) (* let returned_pid = ref (-1) in *) (* do_while *) (* (fun () -> *) (* print_string "OK-W 1\n"; flush_all (); *) (* let pid, process_status = waitpid [WNOHANG] (-1) in *) (* print_string "OK-W 2\n"; flush_all (); *) (* returned_pid := pid; *) (* if not (pid = 0) && not (pid = -1) then begin *) (* print_string "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"; *) (* Log.printf *) (* "!!!! The process with pid %i %s\n" *) (* pid *) (* (match process_status with *) (* WEXITED i -> Printf.sprintf "exited via exit(), returning %i" i *) (* | WSIGNALED i -> Printf.sprintf "was killed by signal %i" i *) (* | WSTOPPED i -> Printf.sprintf "was stopped by signal %i" i); *) (* print_string "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"; *) (* end; *) (* flush_all ()) *) (* (fun () -> not (!returned_pid = 0)); *) (* handle_sigchld (); *) (* print_string "[About to return from the SIGCHLD handler]\n"; flush_all ();; *) (** Block SIGCHLDs, until the next handle_sigchld call: *) let block_sigchld () = print_string "SSS: Blocking SIGCHLD.\n"; flush_all (); (* ignore (Unix.sigprocmask SIG_BLOCK [sigchld]); *) ignore (Thread.sigmask SIG_BLOCK [sigchld]); is_sigchld_blocked_ref := true;; (** Resume handling SIGCHLDs, starting from the ones which were enqueued while the signal was blocked, if any: *) let unblock_sigchld () = print_string "SSS: Unblocking SIGCHLD.\n"; flush_all (); is_sigchld_blocked_ref := false; (* ignore (Unix.sigprocmask SIG_UNBLOCK [sigchld]);; *) ignore (Thread.sigmask SIG_UNBLOCK [sigchld]);; let is_sigchld_handled () = !is_sigchld_handled_ref;; let is_sigchld_blocked () = !is_sigchld_blocked_ref;; (* (\** Handle SIGCHLD by default: *\) *) (* install_sigchld_handler ();; *) (** Execute thunk in a block temporarily blocking signals. Return the result of evaluating the thunk. This correctly unblocks the signal (if it was blocked before, of course) even if the thunk raises an exception, and in that case with_sigchld_blocked raises the same exception: *) let with_sigchld_blocked thunk = if not (is_sigchld_handled ()) then thunk () else let was_sigchld_blocked = is_sigchld_blocked () in (if not was_sigchld_blocked then block_sigchld ()); try let result = thunk () in (if not was_sigchld_blocked then unblock_sigchld ()); result with e -> begin (if not was_sigchld_blocked then unblock_sigchld ()); Log.printf "! Re-raising an exception (%s) from with_sigchld_blocked\n" (match e with Unix.Unix_error(code, "waitpid", _) -> (Printf.sprintf "the infamous waitpid failure with code %s" (Unix.error_message code)) | Unix.Unix_error(code, primitive, _) -> (Printf.sprintf "a Unix failure: %s: %s" primitive (Unix.error_message code)) | Failure s -> Printf.sprintf "Failure \"%s\"" s | _ -> "some unrecognized exception") ; flush_all (); raise e; end;; (* with_sigchld_blocked *) (* (fun () -> Unix.system argument);; *\) *) let my_system argument = match fork() with 0 -> begin try execv "/bin/sh" [| "/bin/sh"; "-c"; argument |] with _ -> exit 127 end | id -> print_string "system: calling waitpid (this must NOT fail)\n"; flush_all (); try let result = snd(waitpid [] id) in print_string "system: returned fom waitpid, still alive\n"; flush_all (); result with e -> begin print_string "system: !!!!, waitpid failed, but here it shouldn't!\n"; flush_all (); Log.printf "system: the failure is %s\n" (match e with Unix.Unix_error(code, "waitpid", _) -> (Printf.sprintf "the infamous waitpid failure: %s" (Unix.error_message code)) | Unix.Unix_error(code, primitive, _) -> (Printf.sprintf "a Unix failure: %s: %s" primitive (Unix.error_message code)) | Failure s -> Printf.sprintf "Failure \"%s\"" s | _ -> "some unrecognized exception"); Log.printf "my_system: re-raising %s.\n" (Printexc.to_string e); raise e; end;; (** Unix.system is implemented using waitpid, and this interferes with our signal system. Here I provide a wrapper implemented with with_sigchld_blocked to temporarily block signals around a call to system: *) let system argument = with_sigchld_blocked (* (fun () -> my_system argument);; *) (fun () -> Unix.system argument);; marionnet-0.90.6+bzr434.orig/THANKS0000600000175000017500000000421612167200764015500 0ustar lucaslucasThis file is part of Marionnet, a virtual network laboratory. Copyright (C) 2008 Luca Saiu Copyright (C) 2008 Jean-Vincent Loddo This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Thanks ====== We are deeply grateful to other free software projects for many good-quality components we have reused, helping to make Marionnet what it is now and to make it a pleasure to develop for us; Marionnet is part of our contribution, still unworthy, back to the community. We wish to thank Jeff Dike for User Mode Linux (UML), Renzo Davoli for Virtual Distributed Ethernet (VDE), the authors of OCaml and of course the whole free software community, whose foremost contributors remain the GNU and Linux projects. Davide Vaghetti taught us to set up Quagga-based virtual routers. Thierry Hamon helped debugging an early prototype and gave us useful suggestions. Joseph Cerrato, Christophe Fouqueré and Christian Lafont encouraged us when we needed it and solved many otherwise unsolvable administrative problems. Silviu Barsanu designed our beautiful logo; Perfect produced icons for Marionnet, covers and desktop wallpapers for the DVD. Jonathan Roudiere is doing a great work on making debian packages, and is the installer and main administrator of the server www.marionnet.org. Université Paris 13 sustained us while we were working on Marionnet by financing it as an e-learning project. Further support was provided by the IUT of Villetaneuse and Institut Galilée. LIPN provided us with computing devices, Internet connection, and a very enjoyable environment where to live and work. --Jean-Vincent Loddo --Luca Saiu marionnet-0.90.6+bzr434.orig/initialization.ml0000600000175000017500000002476412167200764020160 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext (* ***************************************** * Get basic infos * ***************************************** *) let user_intelligible_version, released = match StrExtra.First.matchingp (Str.regexp "^[0-9]+[.][0-9]+[.][0-9]+$") Version.version with | true -> (* it's a released version *) (Version.version, true) | false -> (* It's just the name of the branch *) let str = Printf.sprintf "%s revno %s" Version.version Meta.revision in (str, false) ;; (* ***************************************** * Parse argv * ***************************************** *) let () = Argv.register_usage_msg (Printf.sprintf "Usage: %s [OPTIONS] [FILE]\nOptions:" Sys.argv.(0)) ;; (* Registering options: *) let option_v = Argv.register_unit_option "v" ~aliases:["-version"] ~doc:"print version and exit" () ;; let option_debug = Argv.register_unit_option "d" ~aliases:["-debug"] ~doc:"activate messages for debugging" () ;; let option_splash = Argv.register_unit_option "-splash" ~doc:"print splash message and exit" () ;; let option_exam = Argv.register_unit_option "-exam" ~doc:"switch to student exam mode" () ;; let option_paths = Argv.register_unit_option "-paths" ~doc:"print paths (filesystems, kernels, ..) and exit" () ;; let () = Argv.register_h_option_as_help () ;; (* Registering arguments: *) let optional_file_to_open = let error_msg = Printf.sprintf (f_ "%s: expected a readable regular file containing the marionnet project (.mar)") Sys.argv.(0) in Argv.register_filename_optional_argument ~r:() ~f:() ~error_msg () ;; (* Argv.parse tuning: *) let () = Argv.tuning ~no_error_location_parsing_arguments:() ~no_usage_on_error_parsing_arguments:() () ;; (* Parse now (except if we are debugging with the toplevel): *) let () = if not (List.mem (Array.get Sys.argv 0) ["/tmp/marionnet-toplevel"; "/tmp/marionnet-utop"]) then Argv.parse () ;; (* Now we may inspect the references: *) let () = if !option_v = Some () then begin Printf.kfprintf flush stdout "marionnet version %s\n" (user_intelligible_version); exit 0; end;; let do_not_print_splash_message = (!option_paths = Some ()) ;; (* else continue: *) let () = if do_not_print_splash_message = false then Log.printf ~v:0 ~banner:false "======================================================= Welcome to %s Version : %s Source revision : %s - %s Ocamlbricks revision : %s - %s Built in date %s on system: %s For bug reporting, please get a launchpad account and either: - report bugs at https://bugs.launchpad.net/marionnet or do *all* the following: - add yourself to the marionnet-dev team - add yourself to the marionnet-dev mailing list - write to marionnet-dev@lists.launchpad.net =======================================================\n" Meta.name Meta.version Meta.revision Meta.source_date Meta_ocamlbricks.revision Meta_ocamlbricks.source_date Meta.build_date (StringExtra.fmt ~tab:8 ~width:40 Meta.uname) ;; (* Behaviour for option --splash *) let () = if !option_splash = Some () then exit 0;; (* else continue: *) (* Seed the random number generator: *) Random.self_init ();; (** Remember the cwd directory at startup time: *) let cwd_at_startup_time = Unix.getcwd ();; (** Workaround for Ubuntu with Unity. Ugly: it's a pain to write code depending to the GNU/Linux distribution! I accept because the workaround is very simple. J.V. Loddo *) let () = Unix.putenv "UBUNTU_MENUPROXY" "0" ;; (** Firstly read if the debug mode must be activated. In this way the variable parsing can be monitored. *) module Debug_level = struct let of_bool = function | false -> 0 | true -> 1 let default_level = of_bool ((!option_debug=Some()) || (Configuration.extract_bool_variable_or ~default:false "MARIONNET_DEBUG")) let current = ref default_level let set x = (current := x) let get () = !current let are_we_debugging () = ((get ())>0) let set_from_bool b = set (of_bool b) (** Interpret the current state as suffix to append to shell commands. *) let redirection () = if are_we_debugging () then "" else " >/dev/null 2>/dev/null " end (** Link the function used by the marionnet's and the ocamlbricks's logs with Debug_mode.get: *) let () = Log.Tuning.Set.debug_level Debug_level.get; Ocamlbricks_log.Tuning.Set.debug_level Debug_level.get ;; Log.printf "MARIONNET_DEBUG is %b (debug level %d)\n" (Debug_level.are_we_debugging ()) (* is true iff you read the message *) (Debug_level.get ()) ;; (* Student exam mode: *) let are_we_in_exam_mode = (!option_exam = Some ()) ;; let () = Log.printf "Student exam mode: %b\n" are_we_in_exam_mode ;; let window_title = match are_we_in_exam_mode with | false -> "Marionnet" | true -> "Marionnet (EXAM)" ;; (* Used as continuation (~k) calling `extract_string_variable_or': *) let append_slash x = x ^ "/" ;; (* What is terminal that Marionnet must use to lanch a virtual host *) let marionnet_terminal = let default = "xterm,-T,-e" in Configuration.extract_string_variable_or ~default "MARIONNET_TERMINAL" ;; let router_filesystem_default_epithet = let default = "default" in Configuration.extract_string_variable_or ~default "MARIONNET_ROUTER_FILESYSTEM" let router_kernel_default_epithet = let default = "default" in Configuration.extract_string_variable_or ~default "MARIONNET_ROUTER_KERNEL" let machine_filesystem_default_epithet = let default = "default" in Configuration.extract_string_variable_or ~default "MARIONNET_MACHINE_FILESYSTEM" let machine_kernel_default_epithet = let default = "default" in Configuration.extract_string_variable_or ~default "MARIONNET_MACHINE_KERNEL" (* Path related configuration variables. TODO: make it more robust and logged *) module Path = struct let marionnet_home = let default = (Meta.prefix ^ "/share/" ^ Meta.name) in Configuration.extract_string_variable_or ~k:append_slash ~default "MARIONNET_PREFIX" let filesystems = let default = (marionnet_home^"filesystems/") in Configuration.extract_string_variable_or ~k:append_slash ~default "MARIONNET_FILESYSTEMS_PATH" let kernels = let default = (marionnet_home^"kernels/") in Configuration.extract_string_variable_or ~k:append_slash ~default "MARIONNET_KERNELS_PATH" let images = marionnet_home^"images/" let leds = marionnet_home^"images/leds/" (* The prefix to prepend to VDE executables; this allows us to install patched versions in an easy way, before our changes are integrated into VDE's mainline... *) let vde_prefix = Configuration.extract_string_variable_or ~default:"" "MARIONNET_VDE_PREFIX";; (* User installation: *) let user_home = try (Sys.getenv "HOME") with Not_found -> try ("/home/"^(Sys.getenv "USER")) with Not_found -> try ("/home/"^(Sys.getenv "LOGNAME")) with Not_found -> try (Sys.getenv "PWD") with Not_found -> "." let user_filesystems = user_home^"/.marionnet/filesystems" let user_kernels = user_home^"/.marionnet/kernels" let marionnet_tmpdir : string option = Configuration.get_string_variable "MARIONNET_TMPDIR" end (* Path *) ;; (* Timezone (useful to configure the guest time) *) let marionnet_timezone : string option = let attempt1 () = Configuration.get_string_variable "MARIONNET_TIMEZONE" in let attempt2 () = try Some(Sys.getenv "TZ") with Not_found -> None in let attempt3 () = PervasivesExtra.get_first_line_of_file "/etc/timezone" in (* A simple safety check: *) let check timezone = Sys.file_exists (Filename.concat "/usr/share/zoneinfo" timezone) in Thunk.first_attempt check [attempt1; attempt2; attempt3] ;; (* Behaviour for option --paths *) let () = if !option_paths = Some () then let prettify = FilenameExtra.remove_trailing_slashes_and_dots in let filesystems = prettify Path.filesystems in let kernels = prettify Path.kernels in let binaries = Filename.concat Meta.prefix "bin" in let images = prettify Path.images in let user_filesystems = prettify Path.user_filesystems in let user_kernels = prettify Path.user_kernels in let tmpdir = prettify (Option.extract_or Path.marionnet_tmpdir "") in begin Printf.printf "filesystems : %s\n" filesystems; Printf.printf "kernels : %s\n" kernels; Printf.printf "binaries : %s\n" binaries; Printf.printf "images : %s\n" images; Printf.printf "user-filesystems : %s\n" user_filesystems; Printf.printf "user-kernels : %s\n" user_kernels; Printf.printf "tmpdir : %s\n" tmpdir; exit 0; end;; (* Warnings related configuration variables. *) module Disable_warnings = struct let temporary_working_directory_automatically_set = Configuration.extract_bool_variable_or ~default:false "MARIONNET_DISABLE_WARNING_TEMPORARY_WORKING_DIRECTORY_AUTOMATICALLY_SET" end (* Warnings *) (* Default for the factory-set configuration address for routers. The result is a couple (ip,nm) where ip is the 4-tuple IPv4 and nm is the CIDR netmask. *) let router_port0_default_ipv4_config = let variable_name = "MARIONNET_ROUTER_PORT0_DEFAULT_IPV4_CONFIG" in let default = "192.168.1.254/24" in let value = Configuration.extract_string_variable_or ~default variable_name in let parse arg = Ipv4.config_of_string arg in try parse value with _ -> begin Log.printf ~force:true "Warning: ill-formed value for %s\n" variable_name; parse default end ;; let keep_all_snapshots_when_saving = Configuration.extract_bool_variable_or ~default:false "MARIONNET_KEEP_ALL_SNAPSHOTS_WHEN_SAVING" (* Enter the right directory: *) try Unix.chdir Path.marionnet_home; with _ -> failwith ("Could not enter the directory (" ^ Path.marionnet_home ^ ")");; marionnet-0.90.6+bzr434.orig/serial.ml0000600000175000017500000002070412167200764016376 0ustar lucaslucas(* This file is part of marionnet Copyright (C) 2011 Jean-Vincent Loddo This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (* Examples: # get_info_by_shell_command "uml_mconsole m1 config con8" ;; : string = "OK pts:/dev/pts/29" # get_info_by_shell_command ~pattern:"/dev/pts/[0-9]+" "uml_mconsole m1 config con8" ;; : string = "/dev/pts/29" # let xx="[A-Fa-f0-9][A-Fa-f0-9]" in get_info_by_shell_command ~pattern:(String.concat ":" [xx;xx;xx;xx;xx;xx]) "ifconfig eth0" ;; : string = "00:50:04:45:d5:b0" *) let get_info_by_shell_command ?exn ?shell ?input ?pattern cmd = let info = UnixExtra.shell ?shell ?input cmd in match pattern with | None -> StringExtra.strip info | Some regexp_as_string -> let regexp = StrExtra.mkregexp ~groups:[regexp_as_string] () in (match (StrExtra.First.matching regexp info), exn with | None, None -> raise Not_found | None, Some exn -> raise (Lazy.force exn) | Some (_, _, [group]), _ -> group | _ -> assert false ) (* Examples: # get_infos_by_shell_command "ifconfig eth1" ;; : StringExtra.word list = ["eth1"; "Link"; "encap:Ethernet"; "HWaddr"; "00:1e:8c:cc:4d:50"; "inet"; "adr:192.168.0.3"; "Bcast:192.168.0.255"; "Masque:255.255.255.0"; "adr"; "inet6:"; "fe80::21e:8cff:fecc:4d50/64"; "Scope:Lien"; "UP"; "BROADCAST"; "RUNNING"; "MULTICAST"; "MTU:1500"; "Metric:1"; "Packets"; "re\195\167us:792675"; "erreurs:0"; ":0"; "overruns:0"; "frame:0"; "TX"; "packets:676479"; "errors:0"; "dropped:0"; "overruns:0"; "carrier:0"; "collisions:0"; "lg"; "file"; "transmission:1000"; "Octets"; "re\195\167us:672198706"; "(672.1"; "MB)"; "Octets"; "transmis:138468927"; "(138.4"; "MB)"; "Interruption:19"; "Adresse"; "de"; "base:0x6000"] # get_infos_by_shell_command ~patterns:["MTU:[0-9]+"; "HWaddr [A-Fa-f0-9:]+"] "ifconfig eth1" ;; - : StringExtra.word list = ["MTU:1500"; "HWaddr 00:1e:8c:cc:4d:50"] *) let get_infos_by_shell_command ?shell ?input ?patterns cmd = let info = UnixExtra.shell ?shell ?input cmd in match patterns with | None -> StringExtra.Text.collapse_and_split (StringExtra.Text.of_string (StringExtra.strip info)) | Some regexps_as_strings -> List.concat (List.map (function regexp_as_string -> let regexp = StrExtra.mkregexp ~groups:[regexp_as_string] () in (List.map (function | (_, _, [group]) -> group | _ -> assert false ) (StrExtra.Global.matching regexp info) )) regexps_as_strings) let get_pts_from_optional_pts_umid_con ?umid ?con ?pts caller = match pts, umid, con with | (Some pts), _, _ -> pts | None, (Some umid), (Some con) -> let cmd = Printf.sprintf "uml_mconsole %s config %s" umid con in let error_msg = lazy (Printf.sprintf "%s: no pts assigned to umid=%s and con=%s" caller umid con) in let exn = lazy (Invalid_argument (Lazy.force error_msg)) in get_info_by_shell_command ~exn ~pattern:"/dev/pts/[0-9]+" cmd | None, _, _ -> let error_msg = Printf.sprintf "%s: ~pts or both ~umid and ~con must be provided" caller in invalid_arg error_msg ;; (* Ex: send_command ~pts:"/dev/pts/33" ~cmd:"reboot" () *) let send_command ?umid ?con ?pts cmd : unit = let pts = get_pts_from_optional_pts_umid_con ?umid ?con ?pts "Serial.send_command" in let fd = Unix.openfile pts [ Unix.O_RDWR; Unix.O_NOCTTY; ] 0o640 in let cmd = if String.get cmd ((String.length cmd) - 1) = '\n' then cmd else (cmd^"\n") in let _ = Unix.write fd cmd 0 (String.length cmd) in Unix.close fd ;; (* Modify the buffer and return the specification (offset, length) of the buffer substring which has been read: *) let get_unread_chars_from ?blocking ~fd ~buffer () : int * int = let fd' = Unix.dup fd in let blocking = (blocking <> None) in let one_shot_action = lazy (Unix.set_nonblock fd') in let () = if blocking then Unix.clear_nonblock fd' else Lazy.force one_shot_action in let x = String.create 100 in let rec loop count = let n = try Unix.read fd' x 0 100 with Unix.Unix_error (Unix.EAGAIN,_,_) -> 0 in let () = Buffer.add_substring buffer x 0 n in let count = count + n in if n < 100 then count else begin (* The blocking mode (if set) concerns only the first read call, not the successive. Thus we set now the non blocking flag (if not already done): *) Lazy.force one_shot_action; loop count end in begin let offset = Buffer.length buffer in let count = loop 0 in Unix.close fd'; (offset, count) end ;; (* Is the delimiter included in the string, immediately before the last \n or \r\n ? In the positive case, the result is the last index before the delimiter. *) let is_delimiter_included ~delimiter_pattern s = try let last_index = String.rindex_from s ((String.length s)-1) '\n' in let start_index = Str.search_backward delimiter_pattern s last_index in let candidate = String.sub s start_index (last_index - start_index) in (* The result: *) match StrExtra.First.matching delimiter_pattern candidate with | None -> None | Some (_, _, [exit_code]) -> Some (start_index, (int_of_string exit_code)) | _ -> assert false with _ -> None (* Ex: send_command_and_wait_answer ~pts:"/dev/pts/33" ~cmd:"find /usr -name foo" () *) let send_command_and_wait_answer ?(timeout=10.) ?(buffer_size=1024) ?umid ?con ?pts cmd = let pts = get_pts_from_optional_pts_umid_con ?umid ?con ?pts "Serial.send_command_and_wait_answer" in let fd = Unix.openfile pts [ Unix.O_RDWR; Unix.O_NOCTTY; ] 0o640 in let buffer = Buffer.create buffer_size in let (cmd, cmd_length) = let n = String.length cmd in if String.get cmd (n-1) = '\n' then (cmd, n) else ((cmd^"\n"), n+1) in (* The command will be echoed replacing '\n' by '\r\n', so: *) let echoed_cmd = let result = cmd^"\n" in let () = String.set result (cmd_length-1) '\r' in result in let (_, offset_answer) = get_unread_chars_from ~buffer ~fd () in let _ = Unix.write fd cmd 0 cmd_length in let _ = Unix.select [fd] [] [] timeout in (* Now we will try to detect the end of answer with an ad-hoc echo command: *) let delimiter, delimiter_pattern = let _32_hex_chars = Digest.to_hex (Digest.string "end-of-answer-delimiter") in (Printf.sprintf "### $? ### %s" _32_hex_chars), (Str.regexp (Printf.sprintf "### \\([0-9]+\\) ### %s" _32_hex_chars)) in let echo_command = Printf.sprintf "echo \"%s\"\n" delimiter in let echoed_echo_command = Printf.sprintf "echo \"%s\"\r\n" delimiter in (* Note that the echo_command may be echoed one or two times by the terminal... *) let _ = Unix.write fd echo_command 0 (String.length echo_command) in let rec loop ?blocking () = (* Wait a bit for the answer: *) Thread.delay 0.1; let _ = get_unread_chars_from ?blocking ~buffer ~fd () in (* Get now the last 80 chars (approximatively a line): *) let (current_trailer, current_trailer_starting_offset) = let b = Buffer.length buffer in let j = max offset_answer (b - 80) in ((Buffer.sub buffer j (b-j)), j) in match is_delimiter_included ~delimiter_pattern current_trailer with | None -> loop () | Some (i, exit_code) -> (current_trailer_starting_offset + i, exit_code) in let (delimiter_starting_index, exit_code) = loop ~blocking:() () in let answer = Buffer.sub buffer offset_answer (max 0 (delimiter_starting_index - offset_answer)) in (* Cleaning and structuring the answer: *) let answer = StrExtra.Global.substitute (Str.regexp_string echoed_echo_command) (fun _ -> "") answer in let answer = StrExtra.First.substitute (Str.regexp_string echoed_cmd) (fun _ -> "") answer in let answer = Str.global_replace (Str.regexp "\r\n") "\n" answer in let answer = StringExtra.Text.of_string answer in let answer = if List.length answer >= 1 then List.rev (List.tl (List.rev answer)) (* removing last line (the prompt) *) else answer in Unix.close fd; (answer, exit_code) ;; marionnet-0.90.6+bzr434.orig/simulation_level.mli0000600000175000017500000003624412167200764020651 0ustar lucaslucas(* This file is part of Marionnet Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) exception ProcessIsntInTheRightState of string type process_name = Death_monitor.process_name (* string *) type pid = Death_monitor.Map.key (* int *) class virtual process : process_name -> process_name list -> ?stdin:Unix.file_descr -> ?stdout:Unix.file_descr -> ?stderr:Unix.file_descr -> unexpected_death_callback:(int -> string -> unit) -> unit -> object method append_arguments : process_name list -> unit method continue : unit method get_pid : pid method get_pid_option : pid option method gracefully_terminate : unit method is_alive : bool method spawn : unit method stop : unit method stop_monitoring : unit method terminate : unit end class xnest_process : ?host_name_as_client:string -> ?display_as_client:string -> ?screen_as_client:string -> ?display_number_as_server:process_name -> unexpected_death_callback:(int -> process_name -> unit) -> title:'a -> unit -> object method append_arguments : process_name list -> unit method continue : unit method display_number_as_server : process_name method display_string_as_client : string method get_pid : pid method get_pid_option : pid option method gracefully_terminate : unit method is_alive : bool method spawn : unit method stop : unit method stop_monitoring : unit method terminate : unit end class virtual process_which_creates_a_socket_at_spawning_time : process_name -> process_name list -> ?stdin:Unix.file_descr -> ?stdout:Unix.file_descr -> ?stderr:Unix.file_descr -> ?socket_name_prefix:string -> ?management_socket:unit -> unexpected_death_callback:(int -> process_name -> unit) -> unit -> object method append_arguments : process_name list -> unit method continue : unit method get_pid : pid method get_pid_option : pid option method get_socket_name : string method get_management_socket_name : string option method gracefully_terminate : unit method is_alive : bool method spawn : unit method stop : unit method stop_monitoring : unit method terminate : unit end class vde_switch_process : ?hub:bool -> ?port_no:int -> ?tap_name:process_name -> ?socket_name_prefix:string -> ?management_socket:unit -> ?fstp:unit -> ?rcfile:string -> unexpected_death_callback:(int -> process_name -> unit) -> unit -> object method append_arguments : process_name list -> unit method continue : unit method get_pid : pid method get_pid_option : pid option method get_socket_name : process_name method get_management_socket_name : string option method gracefully_terminate : unit method is_alive : bool method spawn : unit method stop : unit method stop_monitoring : unit method terminate : unit end class switch_process : port_no:int -> ?socket_name_prefix:string -> ?management_socket:unit -> unexpected_death_callback:(int -> process_name -> unit) -> unit -> object method append_arguments : process_name list -> unit method continue : unit method get_pid : pid method get_pid_option : pid option method get_socket_name : process_name method get_management_socket_name : string option method gracefully_terminate : unit method is_alive : bool method spawn : unit method stop : unit method stop_monitoring : unit method terminate : unit end class hub_process : port_no:int -> ?socket_name_prefix:string -> ?management_socket:unit -> unexpected_death_callback:(int -> process_name -> unit) -> unit -> object method append_arguments : process_name list -> unit method continue : unit method get_pid : pid method get_pid_option : pid option method get_socket_name : process_name method get_management_socket_name : string option method gracefully_terminate : unit method is_alive : bool method spawn : unit method stop : unit method stop_monitoring : unit method terminate : unit end class hublet_process : ?index:int -> unexpected_death_callback:(int -> process_name -> unit) -> unit -> object method append_arguments : process_name list -> unit method continue : unit method get_pid : pid method get_pid_option : pid option method get_socket_name : process_name method get_management_socket_name : string option method gracefully_terminate : unit method is_alive : bool method spawn : unit method stop : unit method stop_monitoring : unit method terminate : unit end class slirpvde_process : ?network:process_name -> ?dhcp:unit -> existing_socket_name:process_name -> unexpected_death_callback:(int -> process_name -> unit) -> unit -> object method append_arguments : process_name list -> unit method continue : unit method get_pid : pid method get_pid_option : pid option method gracefully_terminate : unit method is_alive : bool method spawn : unit method stop : unit method stop_monitoring : unit method terminate : unit end class unixterm_process : ?xterm_title:string -> management_socket_name:string -> unexpected_death_callback:(int -> process_name -> unit) -> unit -> object method append_arguments : process_name list -> unit method continue : unit method get_pid : pid method get_pid_option : pid option method gracefully_terminate : unit method is_alive : bool method spawn : unit method stop : unit method stop_monitoring : unit method terminate : unit end val defects_to_command_line_options : ?rightward_loss:float -> ?rightward_duplication:float -> ?rightward_flip:float -> ?rightward_min_delay:float -> ?rightward_max_delay:float -> ?leftward_loss:float -> ?leftward_duplication:float -> ?leftward_flip:float -> ?leftward_min_delay:float -> ?leftward_max_delay:float -> unit -> string list class ethernet_cable_process : left_end:< get_socket_name : string; .. > -> right_end:< get_socket_name : string; .. > -> ?blinker_thread_socket_file_name:process_name option -> ?left_blink_command:string option -> ?right_blink_command:string option -> ?rightward_loss:float -> ?rightward_duplication:float -> ?rightward_flip:float -> ?rightward_min_delay:float -> ?rightward_max_delay:float -> ?leftward_loss:float -> ?leftward_duplication:float -> ?leftward_flip:float -> ?leftward_min_delay:float -> ?leftward_max_delay:float -> unexpected_death_callback:(int -> process_name -> unit) -> unit -> object method append_arguments : process_name list -> unit method continue : unit method get_pid : pid method get_pid_option : pid option method gracefully_terminate : unit method is_alive : bool method spawn : unit method stop : unit method stop_monitoring : unit method terminate : unit end type defects_object = < duplication : float; flip : float; loss : float; max_delay : float; min_delay : float > val make_ethernet_cable_process : left_end:< get_socket_name : string; .. > -> right_end:< get_socket_name : string; .. > -> ?blinker_thread_socket_file_name:process_name option -> ?left_blink_command:string option -> ?right_blink_command:string option -> leftward_defects: defects_object -> rightward_defects: defects_object -> unexpected_death_callback:(int -> process_name -> unit) -> unit -> ethernet_cable_process val ethernet_interface_to_boot_parameters_bindings : string -> int -> 'a -> (string * string) list val ethernet_interface_to_uml_command_line_argument : string -> int -> < get_socket_name : string; .. > -> string val random_ghost_mac_address : unit -> string class uml_process : kernel_file_name:process_name -> ?kernel_console_arguments:string -> filesystem_file_name:string -> ?filesystem_relay_script:string -> dynamically_get_the_cow_file_name_source:(unit -> string option) -> cow_file_name:string -> states_directory:string -> ?swap_file_name:string -> ethernet_interface_no:int -> hublet_processes:< get_socket_name : string; .. > list -> memory:int -> console_no:int -> console:string -> ?umid:string -> id:int -> ?show_unix_terminal:bool -> ?xnest_display_number:string -> ?guestkind:string -> unexpected_death_callback:(int -> process_name -> unit) -> unit -> object method append_arguments : process_name list -> unit method continue : unit method create_swap_file : unit method delete_swap_file : unit method get_pid : pid method get_pid_option : pid option method gracefully_terminate : unit method hostfs_directory_pathname : string method is_alive : bool method remove_hostfs_directory : unit method spawn : unit method stop : unit method stop_monitoring : unit method swap_file_name : string method terminate : unit end type device_state = Off | On | Sleeping | Destroyed val device_state_to_string : device_state -> string exception CantGoFromStateToState of device_state * device_state (* Provokes a Fatal error: exception Assert_failure("typing/ctype.ml", 261, 23) at compilation time: *) (* type 'a user_level_parent_type = < get_name : string; .. > as 'a *) (* using the constraint *) (* constraint 'parent = _ user_level_parent *) (* almost 2 times *) type user_level_parent = < get_name : string; ports_card : < get_my_inward_defects_by_index : int -> defects_object; get_my_outward_defects_by_index : int -> defects_object; > > class virtual ['parent] device : parent:'parent -> hublet_no:int -> unexpected_death_callback:(unit -> unit) -> unit -> object constraint 'parent = < get_name : string; .. > as 'b method virtual device_type : string method virtual spawn_processes : unit method virtual stop_processes : unit method virtual continue_processes : unit method virtual terminate_processes : unit method get_hublet_process_of_port : int -> hublet_process method get_hublet_process_list : hublet_process list method get_hublet_no : int method get_state : device_state method gracefully_shutdown : unit method gracefully_terminate_processes : unit method hostfs_directory_pathname : string method startup : unit method suspend : unit method resume : unit method shutdown : unit method destroy : unit method execute_the_unexpected_death_callback : int -> string -> unit end class virtual ['parent] main_process_with_n_hublets_and_cables_and_accessory_processes : parent:'parent -> hublet_no:int -> ?last_user_visible_port_index:int -> unexpected_death_callback:(unit -> unit) -> unit -> object constraint 'parent = < get_name : string; ports_card : < get_my_inward_defects_by_index : int -> defects_object; get_my_outward_defects_by_index : int -> defects_object; .. >; .. > method continue_processes : unit method destroy : unit method virtual device_type : string method get_hublet_process_of_port : int -> hublet_process method get_hublet_process_list : hublet_process list method get_hublet_no : int method get_internal_cable_processes : ethernet_cable_process list method get_state : device_state method gracefully_shutdown : unit method gracefully_terminate_processes : unit method hostfs_directory_pathname : string method resume : unit method shutdown : unit method spawn_processes : unit method spawn_internal_cables : unit method startup : unit method stop_processes : unit method suspend : unit method terminate_processes : unit method add_accessory_process : process -> unit method execute_the_unexpected_death_callback : int -> string -> unit end class virtual ['parent] hub_or_switch : parent:'parent -> hublet_no:int -> ?last_user_visible_port_index:int -> hub:bool -> ?management_socket:unit -> ?fstp:unit -> ?rcfile:string -> unexpected_death_callback:(unit -> unit) -> unit -> object constraint 'parent = < get_name : string; ports_card : < get_my_inward_defects_by_index : int -> defects_object; get_my_outward_defects_by_index : int -> defects_object; .. >; .. > method continue_processes : unit method destroy : unit method virtual device_type : string method get_hublet_process_of_port : int -> hublet_process method get_hublet_process_list : hublet_process list method get_hublet_no : int method get_internal_cable_processes : ethernet_cable_process list method get_state : device_state method gracefully_shutdown : unit method gracefully_terminate_processes : unit method hostfs_directory_pathname : string method resume : unit method shutdown : unit method spawn_processes : unit method spawn_internal_cables : unit method startup : unit method stop_processes : unit method suspend : unit method terminate_processes : unit method add_accessory_process : process -> unit method get_management_socket_name : string option method execute_the_unexpected_death_callback : int -> string -> unit end class virtual ['parent] machine_or_router : parent:'parent -> router:bool -> kernel_file_name:process_name -> ?kernel_console_arguments:string -> ?filesystem_relay_script:string -> filesystem_file_name:string -> dynamically_get_the_cow_file_name_source:(unit -> string option) -> cow_file_name:string -> states_directory:string -> ethernet_interface_no:int -> memory:int -> console_no:int -> console:string -> xnest:bool -> ?umid:string -> id:int -> ?show_unix_terminal:bool -> unexpected_death_callback:(unit -> unit) -> unit -> object constraint 'parent = < get_name : string; ports_card : < get_my_inward_defects_by_index : int -> defects_object; get_my_outward_defects_by_index : int -> defects_object; .. >; .. > method continue_processes : unit method destroy : unit method virtual device_type : string method get_hublet_process_of_port : int -> hublet_process method get_hublet_process_list : hublet_process list method get_hublet_no : int method get_state : device_state method gracefully_shutdown : unit method gracefully_terminate_processes : unit method hostfs_directory_pathname : string method resume : unit method shutdown : unit method spawn_processes : unit method startup : unit method stop_processes : unit method suspend : unit method terminate_processes : unit method execute_the_unexpected_death_callback : int -> string -> unit end marionnet-0.90.6+bzr434.orig/doc-src/0000700000175000017500000000000012167200764016112 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/doc-src/epsf.tex0000600000175000017500000006374212167200764017607 0ustar lucaslucas%%% -*-TeX-*- %%% ==================================================================== %%% @TeX-file{ %%% author = "Tom Rokicki", %%% version = "2.7.3", %%% date = "23 July 2005", %%% time = "14:32:01 MDT", %%% filename = "epsf.tex", %%% address = "Tom Rokicki %%% Box 2081 %%% Stanford, CA 94309 %%% USA", %%% telephone = "+1 415 855 9989", %%% checksum = "20914 644 3054 26594", %%% email = "rokicki@cs.stanford.edu (Internet)", %%% codetable = "ISO/ASCII", %%% copyright = "This file is freely redistributable and %%% placed into the public domain by Tomas %%% Rokicki.", %%% keywords = "PostScript, TeX", %%% supported = "yes", %%% abstract = "This file contains macros to support the %%% inclusion of Encapsulated PostScript files %%% in TeX documents.", %%% docstring = "This file contains TeX macros to include an %%% Encapsulated PostScript graphic. It works %%% by finding the bounding box comment, %%% calculating the correct scale values, and %%% inserting a vbox of the appropriate size at %%% the current position in the TeX document. %%% %%% To use, simply use %%% %%% \input epsf % somewhere early on in your TeX file %%% %%% % then where you want to insert a vbox for a figure: %%% \epsfbox{filename.ps} %%% %%% Alternatively, you can supply your own %%% bounding box by %%% %%% \epsfbox[0 0 30 50]{filename.ps} %%% %%% This will not read in the file, and will %%% instead use the bounding box you specify. %%% %%% The effect will be to typeset the figure as %%% a TeX box, at the point of your \epsfbox %%% command. By default, the graphic will have %%% its `natural' width (namely the width of %%% its bounding box, as described in %%% filename.ps). The TeX box will have depth %%% zero. %%% %%% You can enlarge or reduce the figure by %%% using %%% %%% \epsfxsize = \epsfbox{filename.ps} %%% or %%% \epsfysize = \epsfbox{filename.ps} %%% %%% instead. Then the width of the TeX box will %%% be \epsfxsize and its height will be scaled %%% proportionately (or the height will be %%% \epsfysize and its width will be scaled %%% proportionately). %%% %%% The width (and height) is restored to zero %%% after each use, so \epsfxsize or \epsfysize %%% must be specified before EACH use of %%% \epsfbox. %%% %%% A more general facility for sizing is %%% available by defining the \epsfsize macro. %%% Normally you can redefine this macro to do %%% almost anything. The first parameter is %%% the natural x size of the PostScript %%% graphic, the second parameter is the %%% natural y size of the PostScript graphic. %%% It must return the xsize to use, or 0 if %%% natural scaling is to be used. Common uses %%% include: %%% %%% \epsfxsize % just leave the old value alone %%% 0pt % use the natural sizes %%% #1 % use the natural sizes %%% \hsize % scale to full width %%% 0.5#1 % scale to 50% of natural size %%% \ifnum #1 > \hsize \hsize \else #1\fi %%% % smaller of natural, hsize %%% %%% If you want TeX to report the size of the %%% figure (as a message on your terminal when %%% it processes each figure), use %%% `\epsfverbosetrue'. %%% %%% If you only want to get the bounding box %%% extents, without producing any output boxes %%% or \special{}, then use \epsfgetbb{filename}. %%% The bounding box corner coordinates are saved %%% in the macros \epsfllx, \epsflly, \epsfurx, %%% and \epsfury in PostScript units of big %%% points. %%% %%% Revision history: %%% %%% --------------------------------------------- %%% epsf.tex macro file: %%% Originally written by Tomas Rokicki of %%% Radical Eye Software, 29 Mar 1989. %%% %%% --------------------------------------------- %%% Revised by Don Knuth, 3 Jan 1990. %%% %%% --------------------------------------------- %%% Revised by Tomas Rokicki, 18 Jul 1990. %%% Accept bounding boxes with no space after %%% the colon. %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , 03 Dec 1991 [2.0]. %%% Add version number and date typeout. %%% %%% Use \immediate\write16 instead of \message %%% to ensure output on new line. %%% %%% Handle nested EPS files. %%% %%% Handle %%BoundingBox: (atend) lines. %%% %%% Do not quit when blank lines are found. %%% %%% Add a few percents to remove generation of %%% spurious blank space. %%% %%% Move \special output to %%% \epsfspecial{filename} so that other macro %%% packages can input this one, then change %%% the definition of \epsfspecial to match %%% another DVI driver. %%% %%% Move size computation to \epsfsetsize which %%% can be called by the user; the verbose %%% output of the bounding box and scaled width %%% and height happens here. %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , 05 May 1992 [2.1]. %%% Wrap \leavevmode\hbox{} around \vbox{} with %%% the \special so that \epsffile{} can be %%% used inside \begin{center}...\end{center} %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , 09 Dec 1992 [2.2]. %%% Introduce \epsfshow{true,false} and %%% \epsfframe{true,false} macros; the latter %%% suppresses the insertion of the PostScript, %%% and instead just creates an empty box, %%% which may be handy for rapid prototyping. %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , 14 Dec 1992 [2.3]. %%% Add \epsfshowfilename{true,false}. When %%% true, and \epsfshowfalse is specified, the %%% PostScript file name will be displayed %%% centered in the figure box. %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , 20 June 1993 [2.4]. %%% Remove non-zero debug setting of \epsfframemargin, %%% and change margin handling to preserve EPS image %%% size and aspect ratio, so that the actual %%% box is \epsfxsize+\epsfframemargin wide by %%% \epsfysize+\epsfframemargin high. %%% Reduce output of \epsfshowfilenametrue to %%% just the bare file name. %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , 13 July 1993 [2.5]. %%% Add \epsfframethickness for control of %%% \epsfframe frame lines. %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , 02 July 1996 [2.6] %%% Add missing initialization \epsfatendfalse; %%% the lack of this resulted in the wrong %%% BoundingBox being picked up, mea culpa, sigh... %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , 25 October 1996 [2.7] %%% Update to match changes in from dvips 5-600 %%% distribution: new user-accessible macros: %%% \epsfclipon, \epsfclipoff, \epsfdrafton, %%% \epsfdraftoff, change \empty to \epsfempty. %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , 18 May 2002 [2.7.1] %%% Add write statements to echo input file %%% names. Prior to that change, an error in %%% such a file could be quite hard to track %%% down: a long list of TeX page numbers could %%% suddenly be followed by ``TeX buffer %%% capacity'' exceeded, without any indication %%% of the file that was responsible. %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , 16 May 2003 [2.7.2] %%% Supply two critical percent characters that %%% were mistakenly omitted in version 2.7.1, %%% and resulted in a small amount of spurious %%% horizontal space. %%% %%% --------------------------------------------- %%% Revised by Nelson H. F. Beebe %%% , Karl Berry %%% , and Robin Fairbairns %%% , %%% 23 July 2005 [2.7.3] %%% Add critical \hbox{} wrapper in \epsfsetgraph %%% so that \epsfbox{} does not conflict with %%% LaTeX center environment when \epsfbox{} is %%% surrounded by other horizonal objects. %%% Improve macro readability by adding legal, %%% but invisible-in-typeset-output, spaces. %%% Ensure that verbose status reports come %%% inside (filename ...) list. %%% %%% --------------------------------------------- %%% The checksum field above contains a CRC-16 %%% checksum as the first value, followed by %%% the equivalent of the standard UNIX wc %%% (word count) utility output of lines, %%% words, and characters. This is produced by %%% Robert Solovay's checksum utility.", %%% } %%% ==================================================================== %\immediate \write16 {This is `epsf.tex' v2.0 <02 Dec 1991>}% %\immediate \write16 {This is `epsf.tex' v2.1 <05 May 1992>}% %\immediate \write16 {This is `epsf.tex' v2.2 <09 Dec 1992>}% %\immediate \write16 {This is `epsf.tex' v2.3 <14 Dec 1992>}% %\immediate \write16 {This is `epsf.tex' v2.4 <20 June 1993>}% %\immediate \write16 {This is `epsf.tex' v2.5 <13 July 1993>}% %\immediate \write16 {This is `epsf.tex' v2.6 <02 July 1996>}% %\immediate \write16 {This is `epsf.tex' v2.7 <25 October 1996>}% %\immediate \write16 {This is `epsf.tex' v2.7.1 <18 May 2002>}% %\immediate \write16 {This is `epsf.tex' v2.7.2 <16 May 2003>}% \immediate \write16 {This is `epsf.tex' v2.7.3 <23 July 2005>}% % \newread \epsffilein % file to \read \newif \ifepsfatend % need to scan to LAST %%BoundingBox comment? \newif \ifepsfbbfound % success? \newif \ifepsfdraft % use draft mode? \newif \ifepsffileok % continue looking for the bounding box? \newif \ifepsfframe % frame the bounding box? \newif \ifepsfshow % show PostScript file, or just bounding box? \epsfshowtrue % default is to display PostScript file \newif \ifepsfshowfilename % show the file name if \epsfshowfalse specified? \newif \ifepsfverbose % report what you're making? \newdimen \epsfframemargin % margin between box and frame \newdimen \epsfframethickness % thickness of frame rules \newdimen \epsfrsize % vertical size before scaling \newdimen \epsftmp % register for arithmetic manipulation \newdimen \epsftsize % horizontal size before scaling \newdimen \epsfxsize % horizontal size after scaling \newdimen \epsfysize % vertical size after scaling \newdimen \pspoints % conversion factor % \pspoints = 1bp % Adobe points are `big' \epsfxsize = 0pt % default value, means `use natural size' \epsfysize = 0pt % ditto \epsfframemargin = 0pt % default value: frame box flush around picture \epsfframethickness = 0.4pt % TeX's default rule thickness % \def \epsfbox #1{% \global \def \epsfllx {72}% \global \def \epsflly {72}% \global \def \epsfurx {540}% \global \def \epsfury {720}% \def \lbracket {[}% \def \testit {#1}% \ifx \testit \lbracket \let \next = \epsfgetlitbb \else \let \next = \epsfnormal \fi \next{#1}% }% % % We use \epsfgetlitbb if the user specified an explicit bounding box, % and \epsfnormal otherwise. Because \epsfgetbb can be called % separately to retrieve the bounding box, we move the verbose % printing the bounding box extents and size on the terminal to % \epsfstatus. Therefore, when the user provided the bounding box, % \epsfgetbb will not be called, so we must call \epsfsetsize and % \epsfstatus ourselves. % \def \epsfgetlitbb #1#2 #3 #4 #5]#6{% \epsfgrab #2 #3 #4 #5 .\\% \epsfsetsize \epsfstatus{#6}% \epsfsetgraph{#6}% }% % \def \epsfnormal #1{% \epsfgetbb{#1}% \epsfsetgraph{#1}% }% % \def \epsfgetbb #1{% % % The first thing we need to do is to open the % PostScript file, if possible. % \openin\epsffilein=#1 \immediate \write16 {(#1}% \ifeof \epsffilein \errmessage{Could not open file #1, ignoring it}% \else %process the file {% %start a group to contain catcode changes % Make all special characters, except space, to be of type % `other' so we process the file in almost verbatim mode % (TeXbook, p. 344). \chardef \other = 12% \def \do ##1{\catcode`##1=\other}% \dospecials \catcode `\ = 10% \epsffileoktrue %true while we are looping \epsfatendfalse %[02-Jul-1996]: add forgotten initialization \loop %reading lines from the EPS file \read \epsffilein to \epsffileline \ifeof \epsffilein %then no more input \epsffileokfalse %so set completion flag \else %otherwise process one line \expandafter \epsfaux \epsffileline :. \\% \fi \ifepsffileok \repeat \ifepsfbbfound \else \ifepsfverbose \immediate \write16 {No BoundingBox comment found in % file #1; using defaults}% \fi \fi }% %end catcode changes \closein\epsffilein \fi %end of file processing \epsfsetsize %compute size parameters \epsfstatus{#1}% \immediate \write16 {)}% }% % % Clipping control: \def \epsfclipon {\def \epsfclipstring { clip}}% \def \epsfclipoff {\def \epsfclipstring {\ifepsfdraft \space clip\fi}}% \epsfclipoff % default for dvips is OFF % % The special that is emitted by \epsfsetgraph comes from this macro. % It is defined separately to allow easy customization by other % packages that first \input epsf.tex, then redefine \epsfspecial. % This macro is invoked in the lower-left corner of a box of the % width and height determined from the arguments to \epsffile, or % from the %%BoundingBox in the EPS file itself. % % This version is for dvips: \def \epsfspecial #1{% \epsftmp=10\epsfxsize \divide \epsftmp by \pspoints \ifnum \epsfrsize = 0% \relax \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space llx=\epsfllx\space lly=\epsflly\space urx=\epsfurx\space ury=\epsfury\space rwi=\number\epsftmp \epsfclipstring }% \else \epsfrsize=10\epsfysize \divide \epsfrsize by \pspoints \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space llx=\epsfllx\space lly=\epsflly\space urx=\epsfurx\space ury=\epsfury\space rwi=\number\epsftmp rhi=\number\epsfrsize \epsfclipstring }% \fi }% % % \epsfframe macro adapted from the TeXbook, exercise 21.3, p. 223, 331. % but modified to set the box width to the natural width, rather % than the line width, and to include space for margins and rules \def \epsfframe #1% {% % method for detecting latex suggested by Robin Fairbairns, May 2005. \ifx \documentstyle \epsfundefined \relax \else % \leavevmode % so we can put this inside % a latex centered environment % The \leavevmode breaks under plain when this is inside a box, % because it forces the figure to be the entire \hsize. On the % other hand, we need the \leavevmode for it to work in LaTeX, % because the {center} environment works by adjusting TeX's % paragraph parameters. % % Compare the LaTeX sequence % \begin{center} % \epsfbox{tip.eps}q % \end{center} % (needs the \leavevmode to put the q right next to the image) % % with the plain TeX sequence: % \leftline{\vbox{\epsfbox{tip.eps}}q} % (had the q all the way over to the right, when \leavevmode was used) \fi % \setbox0 = \hbox{#1}% \dimen0 = \wd0 % natural width of argument \advance \dimen0 by 2\epsfframemargin % plus width of 2 margins \advance \dimen0 by 2\epsfframethickness % plus width of 2 rule lines \relax \hbox{% \vbox {% \hrule height \epsfframethickness depth 0pt \hbox to \dimen0 {% \hss \vrule width \epsfframethickness \kern \epsfframemargin \vbox {\kern \epsfframemargin \box0 \kern \epsfframemargin }% \kern \epsfframemargin \vrule width \epsfframethickness \hss }% end hbox \hrule height 0pt depth \epsfframethickness }% end vbox }% end hbox \relax }% % \def \epsfsetgraph #1% {% % % Make the vbox and stick in a \special that the DVI driver can % parse. \vfil and \hfil are used to place the \special origin at % the lower-left corner of the vbox. \epsfspecial can be redefined % to produce alternate \special syntaxes. % \ifvmode \leavevmode \fi \relax \hbox{% so we can put this in \begin{center}...\end{center} \ifepsfframe \expandafter \epsfframe \fi {\vbox to\epsfysize {% \ifepsfshow % output \special{} at lower-left corner of figure box \vfil \hbox to \epsfxsize{\epsfspecial{#1}\hfil}% \else \vfil \hbox to\epsfxsize{% \hss \ifepsfshowfilename {% \epsfframemargin=3pt % local change of margin \epsfframe{{\tt #1}}% }% \fi \hss }% \vfil \fi }% }}% \relax % % Reset \epsfxsize and \epsfysize, as documented above. % \global \epsfxsize = 0pt \global \epsfysize = 0pt }% % % Now we have to calculate the scale and offset values to use. % First we compute the natural sizes. % \def \epsfsetsize {% \epsfrsize = \epsfury \pspoints \advance \epsfrsize by -\epsflly \pspoints \epsftsize = \epsfurx \pspoints \advance \epsftsize by -\epsfllx \pspoints % % If `epsfxsize' is 0, we default to the natural size of the picture. % Otherwise we scale the graph to be \epsfxsize wide. % \epsfxsize = \epsfsize{\epsftsize}{\epsfrsize}% \ifnum \epsfxsize = 0 \ifnum \epsfysize = 0 \epsfxsize = \epsftsize \epsfysize = \epsfrsize \epsfrsize = 0pt % % We have a sticky problem here: TeX doesn't do floating point arithmetic! % Our goal is to compute y = rx/t. The following loop does this reasonably % fast, with an error of at most about 16 sp (about 1/4000 pt). % \else \epsftmp = \epsftsize \divide \epsftmp by \epsfrsize \epsfxsize = \epsfysize \multiply \epsfxsize by \epsftmp \multiply \epsftmp by \epsfrsize \advance \epsftsize by -\epsftmp \epsftmp = \epsfysize \loop \advance \epsftsize by \epsftsize \divide \epsftmp by 2 \ifnum \epsftmp > 0 \ifnum \epsftsize < \epsfrsize \else \advance \epsftsize -\epsfrsize \advance \epsfxsize \epsftmp \fi \repeat \epsfrsize = 0pt \fi \else \ifnum \epsfysize = 0 \epsftmp = \epsfrsize \divide \epsftmp by \epsftsize \epsfysize = \epsfxsize \multiply \epsfysize by \epsftmp \multiply \epsftmp by \epsftsize \advance \epsfrsize by -\epsftmp \epsftmp = \epsfxsize \loop \advance \epsfrsize by \epsfrsize \divide \epsftmp by 2 \ifnum \epsftmp > 0 \ifnum \epsfrsize < \epsftsize \else \advance \epsfrsize by -\epsftsize \advance \epsfysize by \epsftmp \fi \repeat \epsfrsize = 0pt \else \epsfrsize = \epsfysize \fi \fi }% % % Issue some status messages if the user requested them % \def \epsfstatus #1{% arg = filename \ifepsfverbose \immediate \write16 {#1: BoundingBox: llx = \epsfllx \space lly = \epsflly \space urx = \epsfurx \space ury = \epsfury \space}% \immediate \write16 {#1: scaled width = \the\epsfxsize \space scaled height = \the\epsfysize}% \fi }% % % We still need to define the tricky \epsfaux macro. This requires % a couple of magic constants for comparison purposes. % {\catcode`\%=12 \global \let \epsfpercent=%\global \def \epsfbblit {%BoundingBox}}% \global \def \epsfatend{(atend)}% % % So we're ready to check for `%BoundingBox:' and to grab the % values if they are found. % % If we find a line % % %%BoundingBox: (atend) % % then we ignore it, but set a flag to force parsing all of the % file, so the last %%BoundingBox parsed will be the one used. This % is necessary, because EPS files can themselves contain other EPS % files with their own %%BoundingBox comments. % % If we find a line % % %%BoundingBox: llx lly urx ury % % then we save the 4 values in \epsfllx, \epsflly, \epsfurx, \epsfury. % Then, if we have not previously parsed an (atend), we flag completion % and can stop reading the file. Otherwise, we must keep on reading % to end of file so that we find the values on the LAST %%BoundingBox. \long \def \epsfaux#1#2:#3\\% {% \def \testit {#2}% % save second character up to just before colon \ifx#1\epsfpercent % then first char is percent (quick test) \ifx \testit \epsfbblit % then (slow test) we have %%BoundingBox \epsfgrab #3 . . . \\% \ifx \epsfllx\epsfatend % then ignore %%BoundingBox: (atend) \global \epsfatendtrue \else % else found %%BoundingBox: llx lly urx ury \ifepsfatend % then keep parsing ALL %%BoundingBox lines \else % else stop after first one parsed \epsffileokfalse \fi \global \epsfbbfoundtrue \fi \fi \fi }% % % Here we grab the values and stuff them in the appropriate definitions. % \def \epsfempty {}% \def \epsfgrab #1 #2 #3 #4 #5\\{% \global \def \epsfllx {#1}\ifx \epsfllx\epsfempty \epsfgrab #2 #3 #4 #5 .\\\else \global \def \epsflly {#2}% \global \def \epsfurx {#3}\global \def \epsfury {#4}\fi }% % % We default the epsfsize macro. % \def \epsfsize #1#2{\epsfxsize}% % % Finally, another definition for compatibility with older macros. % \let \epsffile = \epsfbox \endinput marionnet-0.90.6+bzr434.orig/doc-src/img-src/0000700000175000017500000000000012167200764017453 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/doc-src/img-src/network-emulation-level.png0000600000175000017500000031460612167200764024766 0ustar lucaslucasPNG  IHDRF4XsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxyxMDH BBDb^R%*Ֆ境[5T'ƨs2GI Gyl߾ӧOCڵ9}4vvvtؑӧOw^<<<ׯ*U"%%;wr8p TX`8y$ٳTRg~J*ń dڴi߿OOOƏOӦM޽;?3ڵkлwo233ٷoO&//jժk.7oN^ FQQQ^D5kƉ'HII瞣F^H`TDD:~8= 40C a͚5$''ƸqHKKu,[3g2tP֭ˈ#988ܹs';;OΧ~ʬY׬Y3Ѭ]UV1j(;k `֭?~;;;Ξ=Kf͈7d֭4nܘ4VX˗ILLG!11Hdddիy뭷HJJqٳhy7fH"""ݻ (({+WҥKȀXp!=&իWc @͚5ٽ{9`[.kȟLVsaҥqa8IS}||8sL#G|@~7ХKƎ֭[۷/_50|p|}}prrbܹ= &r}bccyHJJbȐ!,[关=]4bTDD5]~Blذs@ff&닳3VVB 澼pwwƍiӆ͛sF#FgOvv6<>}`ի\pe!ixx8'OE\~:ꫯRR%222޽;OMf̯O:lY|yZl #GS\\\/^ѣԩNNNtRF 5j`4i҄3f@oN;ҼysvII&޽+VJvK UdD._ٲe-] mFll,+Ve˖+W@K.yfiԨ\|-[`0۷/ر[[[ٳgٵk͚5Zj|̝;-[sj֬IӦM1 cFFFrQq<==ٷoN[n)S֭[1Srr2aaaTVƍر .PjU7o~G'<<˗/ӦM 6lnݺԮ]/_sRSSׯҨEDDDN()FHa?ο/OÆ 1c^^^.KD"""w5FEDD1Hpp0`|GJDDDDDƨH1f2XxqmFDDDDD`TDD^z.CDDDDD䡣"""""""""R(G8 FEDDDDDDDDQ0*"""""""""%Q)qH`TDDDDDDDDDJ"""""""""R(G8 FEDDDDDDDDıt"p;|0[lt"e22dKt)""""""RD:rO<.EbN# FEOa2D,L2.ADDDDDDG8 FEDDDDDDDDQ0*"""""""""%Q)qH`TDDDDDDDDDJ"r_?cegg'"""""""_ FE6l999l?ƍEvzcǎaݻw3c L&ӟ~z>voMJJ=*"""""""`TDpjժ-y{{sN233X$$$Pn?lWzunzG?aaaK.?y۷WDDDDDDD}gK/vϟɓ'quu-ѣG9tyۖ-[Xld2߳l2bbb ;o< hdŊ=zl2L&nnn+WDK~[BHϟOff&K6o ctؑ;~{H"""""""b6. uWW˗/ѱ322Ai-Xv-O>]_QhhKxhԮ]@KQdRSS駟,]C#((5kZ"͛-]wNNXKd2q…%&%/"""?%>\`ߟ5yؕ*UGݺu)SL`n|nj7d2sNsңGĉ׏7oÆ m۶dggc0aҤITZg~meeE&MسgM6B 0`=z`0?ҬY3x֭[gkk=Iw^&Md2,.--˗`4!!W2p@Kbq'N`޽*=y$mҥгg@"k?~`TDDD|M&SWI~~~-[>>/_www  !!kkk I!!!/y'nvnٲCq /1118qŋӿx"[n%33'Nvv6?tűj*vZNDDDDDDD "RHIIN:7}t8p .]bҤI|G@th}Y.\HӦM ;biӦyd",,gycU\@BBBv/| aaa1tPz-,Xo:{lyU]ta+3af̘Q`4h*4Ǝ- vvv >ѤJbС :}ׯO lq?yd+nҥ =-ﹸx2jUDDDDDDD~H}`DzCx"""""""R|h*C"%%oҥ}W_}ůjR>8w-رc.EDDDDQĵk9r?wYYY*)*qqq,Z3gQǏ犤(EGG3{l.^xGuEDDD,O}`2hhz޶ϛ tȑ#IHHJ+^zԪU}^p1ccWۦMVz>{#""x뭷JWZcTDD۳k.ϟdbrEC6m_z*L:ǡC;v,;vdĈ,Yxx"GePF q2aʗ/ %::o^JHHgժU޽Xիѣ}Y9sн{w G}ĵkHJJW^aڵ?ɓ'ꫯl3.9rssy7PNb…:t,>|8իWgŜ9s3gХK}Ys?1ׯ駟gϞL>7n˗/ҥKL2[EDDDJ6)B&_~6mhoƆqѥKNʍ78q"ǏgΜ9ۓ @FF9:)))l۶ ???Xh={֖aÆ)}\Bxx8?ܹ39L4z1k,Y`SL> cΜ9 6s)ԩC||N8ɓ'Y`c͚5ȱcXb-ZY))B^z1dyG ֭[˒%Klٲ888booMΦAZ www|||xy-v~%;ZO>-[m۶@&Mعs'xxx8qUVJ矩R >>>;?೒4iBŊ޽;իW'))]v /Ξ={ϏQFXt)|XXUVLJ{N:=))BԩS3g_IF777tB\\Gtܙ˗/3sLQFqqnܸa><8111 07|>SNQF ϏuIjj* ׏-[l2ʖ-K||ᣏ>aÆ wɓ駟8x }Ã3x`Zl5>׮]h4{1h nܸ>ٳ:t(ʕ<==޽;5o&""ÇJfhذ_'!! 6;vMxx8gΜ!55Ν;{8BCCy뭷XbՋO?ڵk~z Ϗ'|FF-HII!99wyQFLV:t(Gƍl___F#~!zҧ~G"##9x )))t<*-[Fjj*ׯ_gȑΝ;ڵk1b6lޞz+WRB6mD߾}iڴ)s'VZԩST1L17x^{m2~xRSS'$$rq%f͚Epp06mIMMO>ѯwɓ޽ZlY~'\BRR/JEDDD+"""YHNN0NNN棏>*;;;zŊ+0`7à+Wl;c mFnn.m۶%**͛!ȑ#"##7j*W~!5fլXy`ڵkl޼EkuƍAya~q?'z">>7޶\ºu`ewZjTV+V$886c~ݦMxK/֭[著vڑΪUnf񤧧o߾{ҤI=@3Ekȟ*2XYYa0Fy=G{(cEu蘭Y]jI""""D#FEDoرcٙf߾}TZ *ȑ#$ y'gwߑNNhѢDo޼֭[Ӳe[OKKcڴi$''өS'?ȭ4bTDD,"//'NX2;;pz쉭-888kOݻę3g MII!%%O?D~nYQFrr27nƆ6n܈d"((vҤIxzzgϞ[qttd֭XYYQR%Zhaf͚Ŝ9s2djժ̘1ٳgiٲ%}=bܸqƆ dӦMtޝ%K/ -[X~-O<~@yw۷T5uT=JTT)S`~izqO`…4hЀ72~xzꅣca,X?B_SON߾}yGoi;k,֬YݻiԨjբe˖|'1x5FEDDS0*""ٳ9v*T **qƙ}q~m jW^1w{9ILLO>䯁gcch,u1/55d)lnaZhaR裏l2N:ov 00^:uسgOuŋ,\ \•+W p%vI޽1 k׎Pڷo?rʄo>.^Hzz-4hu@@7n_gϞݴi...Qd2{"F/^XÇi޼mݺڵkC?[N:,Y۷nڴ ggg"""ٳX[[DIJ Cuu*"}@_:tȼ-""5kگ7!M^.Ze)+VGs+{5)SeddӡC ˜1c~<|y'~ۛcǎ1bU{z݉?ECffy۩S yo:dO8@Z ۛx v6lZѾ}{=^ C5k~ /44hP9K#"r|Jyyy>裥5jX{̙M&S0xyڴiCJ;w.~) .d˔)˗ͯo7}>|>>8::~֭[_Eׯǎcر=z^z<Μ9Cff&$%%1aHLL$,,+GGGV\ɹs爊bl!ܳ>KRR'N$''(%/Eq3Qׯ_';; J*ƍb̙>|L> gݺu9rXmF۶mڵ+#S,X@BBt֍2vXrrrT}̝;KҰaC,X@rr2/2K.wߥaÆxzzҮ];}.]4Ç'44st;3f`ҥZ'xW_}_|իWyf7o˙0a/ILLdʔ)\xnݺC˖->}:!!!:uիO2}tJzz:/fٲe /ЬY3]bԩ^ ?ٳgR :t/jժL2sҮ];ڵkǠAyy7vF|ߟ\֭k~3f + 6dذa?.]h"f͚ߟ^zбcGâE dٖ\"%WͫiRDDY@@ԩS`2pYdbZDߜVZ.]JΝ ,>En&NH= }vq1ydkh4b2NNNm۾ ĉ3f=09~w͇6~ v^^VVV{d20w{ڵk0`}n݊9h, ,bmmm7444'88]/TR??o)*"ʻ{yʕ=nY?LSEDD.ల*mGٽ*r+++Bץm8{GB/qϒMϯHR|Hq4zhwwq`TDDDDDD+WkJ.M2e ]#DH f0<}}}Xյ`eQ' @EتQ#PYzzzO>K.qy.^hG=6**˗/ɒ%ٳO>#GŋIJJ'%"""rW^W_ϏSzuy222Xz5UV%++~ooo<==1b-4h???^u(0`VVVtؑT OSDDD4&)ƌ7|ѣ d̘1 *y/ӷo_7o`˗/_O?#Gŵkpwwwww?\TDDDR&M6Q|yv;pvvf̘13rH4hPHћ-[Fթ\2_~%{ˋRJxxSZZDDDD"""""%`+++4h`ޠA 5Lk~f͚={{~E}:""""Lk:u GGG2339rRV-/_۷/5j`\rYfÒ%KOOO  /̙3޽;^^^;gQ0*""""RB;|g888pBn݊#uGN4ҥK'KNիW^4lؐhRSSv 6$11t<<< d˖-<|>ki*H accڴiÄ h4Kό1Gyիŕ-""""""""\N#&l¨QhѢCG5x?Nff&~~~?5kȍ7ؼy3 ry*UDJ3?ё3g2{ljna>oo"`TDDDDDDDsuueƌj kkk ?,\~=C رc 2'''%&&___NNNkiccC gϞtܙ9s~\\\Xp!M4k׮tޝ&Mprrrpqqa޼yL:<2j(*Udܹs=zt 33jժ=|`0@ipMҥK;9:::ږve4dee@?Y@*o293gNKN>ݻYf +yyy|A#J@@VVVQV-רQ|~;]="" lmm <̙3@HN;;;N>͕+WnݺӔ)SHOOgʔ)l߾{Ν;9xP7aooOFzJ F PƦrŊjZYYUuppprtt,Pk׮+Wsrr)U?6888poDVVdggEfffswss/]tu֙YYYׯ_b2edd|  5Lv.""""""""L`ӦM 0'Opqz͡Cxgi۶-&T>s~ϟORRaaa\-[ҵkW֬YÚ5k8y$Ջ^zpUӧ{圌F#'NdڵqU֯_@HH+Wf޽l۶uԩSyꩧnJPbŊ{+W[2e۷o_> ~.~~~KX([[[<==kY0LĴzڶm<))idJd"""""""R2O@DDgΜՕ!!!$&&/ 22m۶;À0 >5kңG\\\0`X[[Ӻuk^yؼy3ϏҫW/L&VVV<Ԯ].]uVhܸ1͛7|iԨzȑ#|dff裏ҽ{wz)~v؁;l߾N:=+/3dz5T\gg.]x4j`ggyپ}{κuDGGǧ=]&)ߛߜP.]JΝ ,>En&NH=psst)""T4**jkc0ZϜ9={t-""|7w&o?爲evԩSN:nݺͧeʔsζ;w^;w.)))Fիg^T4h@ff&+W-[P\;>Npp0\puz6vbذa$%%=UTa֭駟Yf=#""""""RRM`]Zɝ:u?gΜ=Bѿ͍1cTXjUVӦMWRyK%Wk׎CQ~}.]ĬY̡(@hh(\taÆ'<Α#GZ*VVVlܸÇhJff&.]bРADFFU( ?0vؿ\gӦM}\tqp)Ν;'""""""RY0#<wXTߡw Rl DEwc 5&A%5~Ec좀RTBQi9\QL4 hg}֞ðf̙3fʕW.SEQh֭֬[G^KƸM>}(LLLhҤ xyy9va4hwQ<N./~ !B!ToTdJv~^;v^zo#0N:xyy5ѣǯ+V\(3#BjժER([lsU~<J*XjΝKƍu?5k[biiddd́^Y7n t邩)&&&Ԯ]`M6RbE~gTU?gժU//^o,B!BLXUVU[#ET)W7&==???|||:t(CramAfܹsЮWug̘Ѫ\r3:!^ǃ^(vʕ<Ν:ĸqWܻwEQX~=&MbŴlْ+i>r62S&epuu%,,ÇӲe|_gbcc L2ܯ9uiiiyKݻwIKKcL4ݻwӭ[7Muu/_}~HNN&##_(^:FƍTX[[ۿB!BQ^{QPEQt޽Qٲe_axM}&L@GG#G2g ĺuصkƄQfM5#5m۷O5M6[~ ʖ-K^HHHӄ2c 6l\e˖qyBBB(_<';;cC;FΝ&44e˖qu233iѢ={ӓtttÇ4k֌nݺE3g[y4h``ccOQ{+ Q@rsW^|ȑƍԩSGxʕq-=ʞ={ظq##FUU߿?ڵӜFNNNWDD@t 6pݛo%J`ggǽ{ ֖:uꠣxPPP6J*ŝ;w,_)g%000b~tu_Vge>=x{{ӥKnJƍ%K ccc\]]~:YYYDDDfZnM^xׯ|I޸qCsӦMz쉞 ၩ)ÇhтH֭޽;>>>ܽ{^z( 'OVZŋ;( Zb۶mL0 RZ5233bҤIt1O}[[[prr"&&Ν;k>;w./_FGGccc9z(??3we3}tMFVV+W\]]5ڵks],X7'Odʔ)ܿk>dYlK`xxxPV-RSS[.nbرɓٿ?h0`o,]TtMNNlٲ0rH8pԯ_E?˗&11:0|\\\/Xt)W\AKK-Zn:Kٸq#QQQRzu"##m۶53go!B!vbx[ "71ڤI7oŋIKK3=488j֬ɉ'HMM ׯ e˖%11UU9|0~~~KʕQUU347@=000ѣ={g:t@xx8|\~GGG*VHQ6&&u1}tXt)/^aÆ)Su֑ADD& 9=Ϝ9C||^~l;o+):w\7oN\\VB!B!_o%Fٳg Hʖ-޽{9<:::h0䧟~ŅMgϞG!B!Bk1A`RSSVLҒ:^&E=zĔ)S(SLB!B!o5x`n޼w}ǧ~vY/RU-[pe?)Z!B!Bro4b4W*UXhь7HmgذaXYY1on݊3]tXborHl߾H>#f͚[UB!B!BkXؘ=zУGYx14lؐFI9o\xkkku놝]Q%B!B!?R Ctvvٙ4|}}Yb=ʊ&MPV݈dΟ?ϙ3gHHHΎf͚ѵkW:nĉU#Gr kKu:=z`yVwL!B!KEEEnݺk̘1deeʵ޻sSDŘ' ߴXp!?ܹsԫW(;zjL2eʼv7А]S'|; !B!=1*E駟~ԩS\tӭ[7J.QǏӫW/>cƎ˙3gG<|8ɓ'ٳg;v@KK WWW֯_׉dٓ۷s}Ea͚5׏c2k,z쉃Gehkk`ˆfѢE >Ȟ7!B!]#Q!x iJܜ ҰaCMp֯_ODDmڴm۶K6mhӦ @)FFF :Tӎ6Ŋc…SNiӦ9sSSS֯_OʕĄYfz!B!9BЮ]y>?|QF4j(]v}lmѢ-ZSB!B!xB!B!B7%Q!B!B!Ŀ$FB!B!:5FK(|oߦB >}ZsL2888X"%K 99ccc?~ :::XB!B!B~h56l<~777Zj9C ]v$$$СCȈӱcG4iBnݰȈ:!Z!B!B^'Fpss#55///\¶mSNsq.]ĩSPnnn\v7nOFF@N7o߿('B!B!( ubsss4M*SBmڴܪUիW7qpp@[[C{+[_v'ڝ;wz*(&&&vժ|EJ3f իWYn]QNׯ_Q K׉Q]vEiҤ \v k׮#j֬I{.Gѣn~:ժUUUvׯ_/!B! ̪VReɓ+5h@)vvvmF򳵵l/؄B3Qsqܹ|sSSSYf|#B!x(bZN;OWLmf?zE2'Y![W !B!x)GGǵsu$Es)̙3KۯS_GU!ĻGB!B277oڱc*TP:```ӫ/_~zQ"GB!B񎲲٩SEGQ̚uB!y$1*B#^ʤIXjUQ" oƘ1cصkWQ" }R:x IDAT6lgΜ)PDPe(Eq(k;e9ŋ/QPm+2BQX5DPU 0xE̙øq:ĨBpqqÇŽRcǎ_QAJw]QF\x'OR}GTV峷ubŊXB}RJsEQPgJvER]J8tPG%SSS y111pT}#Q!-LJׯ)z*y&''s)Xմqubbby&'NLJBꙀ?NS #==BΊ(5eÁ@SEQ)R]QCEQŊL|a@@}"( P0BSO%M&((EZE\Sn&<(E) ؐ=T%ˋ7nf&M۷oo߾$%%ʠAv}ѣ6TUe={EQ4;wdƒ@RR<(+Or:DVV#Fɓ,ZC*.\`СЩS'̜97nʕ+ٳg˗/gҤIDEELBB>,ފw_NB!īSU BBB;v,ܹuFr6lnnnlذ'NΝ;͛_077͛ܺu --- 8rhiiѺukJ4-z17n ))!CuVڴiCvb/_???Cff&дq% ٲe :tW^hkkӥKRXXѿ֯_?@*Ux =">>y摐5m:t+++VZ(Yx8;;#Uy6JQ=`P_U$EQ/( ZUEFWUե,I}XBU՝-T%r@(@OGyZ7PUy]Wt6pTUuLi=W RUu!I<JPP' nݺŌ3ڵ+{ҥK4nܘ> ,--%;;1c_ӴiS 'ZB ,, kkk/N :w`ĉܹsǏ_|@Æ 9u+V`РA4k֌ *`ccCXX;3fPjUTU_|}Y9NNN| ##FBHQ&Oի133իdggPvm2339x ZZZhi*ܹ3Ogar=ܹiرc8;;3uT֯_)! _%;v,'O\vM3źvܾ}Wbh;vԴDdd~ШQ#N֭[3gN!JY&{Ã;wfnJu`ffi# @3ӴoߞS{nFU'Y/]>y:m^UPUUO<ӆ P̀eWU Ϭ^6|x~瞩S(FOoeUU7`O|WFɒ%3rܼy{a``@ݺuP\t Π &MٳN:1!CW^sʕ<9;;111UV%l|2)))@̜4Nʒ%K8~8/^X$1*BUiiiܽ{{Ν;WfOtt4KO>}v4Y5mGGG<Xgj6e={6hkkkqM/חu8lР[ߟ .|r]v%##Yfɓ'$++ӧKVVYYYEj OOO<==IIIvښM;bbbh޼9jܹsuf.\Iߟk׮ Ǐ9k ϙ3mm֣+rZ}rVaDQr(26P7.Ue+ x`_rF{6|z 8SZQ,(`(O(RIQE*yyyb vܹsi޼9w%66ҢE \\\8r?```ԩS5k7oSSS3gؽ{7ZZZ\=͛^:ϧQFk~ҺukU7 % bDGGSZ5`ǎ D.yAB!s|]z`s[.m۶ͷnvv6۶m;;;>CԩÏ?ȤIfСW_lڴ֭[͵kdԨQ|tޝeҩS'lmmիTZE_Rv{nvɓ'{oo+~xxxPgʕ\zLÆ i$%%l2zꅓ+Ww,^ӧ<<<{ 4 *еkW&%%=z0zh޽˰a8~8| JbTTbŊ1n8CQwر'N}3j(HKKcÆ E%&&2gڵkGjհf]۷/ԯ_=z9q?~nݺ1{lϙ>}:ڵx̙3EQcԩ 6% n~[nZj_eϞ=ӣG|_MFDDqqqxzzbnnm%ej(==t 'v (ʗ2(J#`0[Q'P(\`B=… ܹsUU6e7sqܾ}[[["lEr;HWe0NQ]` `s_nG`(ˀ4EQڐBw 9kMZ`Y#FDvvYr%W\!&&իWŏ?HRRfff̟?MCn޼ٳ144F1`;*U5-[ښSSre,X… %<>>رjժY]リBÆ iݺ5C lٲ4i'''zɬY裏pqqaL<`J(ݺuc̘1t֍QFaccC͚5qwwԩSMNNN>|M6ѽ{|4nܘ翓;ҲeK"##5M6iӦ/߅ ZZZ$$$p! v߽{ w߾}XZZj^ Jչx"7o~aQ\9ٸq#7ηNzX|9{eůڴvZ֭_W~3IWU@U_E بE)]EQ3PR9ъʩSSU5;_3~v7y{f"..---k!CHII!%%E3ٙ;v`kk l9x`tuuquu%++ ]]],,,pww'99Y3>u֔*U*@Quee|gggGԴk˗/Çk>,COOO|MӦMiܸ1X[[ń 0aԪUK`m߾=_~%zzzcƌN(QwwwLMMQUP/RR%IKKTPcccӹ}kڵiР`j-/}CEXb&_({6q`hhϿqXOOPf~!<|v,--/1bK4hЀ;w|-ӗ;:::XXX`aa±@5ol jժQN?ԩS'N&Fs_>3mff_iӦ\rG:::ҴiSu>N>޽{_˗cmm]QUU$rFv>[ S3_>w8C=>%E ǚ5gggG4S 3Ŀj"D>WOg~ժf++ۥKvƉц Rj<>wwwVXZK􄄄nݺBI>;4r&E?][##ٳMR'88.]Ė-[8<%JЌB!Ļ),,SNuBɓ\|xٳ;wѣ?ycǎk.x"׬׻wol9¦M4Bz.PZ<ҌN>z(iiiUٸq)xYxUZlIٲe 9UU֖'HPP7n$11իӷo_<== &11SF M; 27nPJ&M\L6 ___-[ȑ#ۗ(vשQƻ8{n6mD||3ʔ)@֭[Gbb"-[d̘1hkkz׮]LZ*SLw>|8ׯ_jժ̜9SSSN:ѣGIHHcǎ|G̘1xYxfeDW^DEEѠA&Nˆgݻw3grM*VȸqXd ƍ#33e˖}v:t@N Gxرcڤb``_Af̘ADD3JWWh+ԩ?=BKKիWk6366fʔ)aaaXYYYСC,\@IKKdɒlٲGGB|F.]… M65 sM3gqqq[$+ɓs16m~hxzzEݺu166O>lܸZǏҘ9sfPg}F6m8uvʕ+8::ҤIXt);wdɒxxxвe?Uػw/mۖÇH߄xW#FULQU .pNͩ_>|)kر̖-[=9Çs޽|눷ӓǏƱc4kO?iF,Y0-[FxxYhkkW_oٵytܙ/ajժENߨRjժNfmGkһwo9r$SLl0n88?Ș1cXpau]-[Ҹqc~?MV_v WWWJ*ŦMCXf̘͛7rűdiӦF[:tڵk^zͨ(>c233ٶmmۖh7oΠA_>ԬYzϓH>}ؼy35k㸻PԩS|DDDPvmV^M^$7ۘLBVHNNf%!!!yشi| woaϞ=(Q )JLLᆪiӦ*U1cưqF '}U<==y .]۷s<ŋڵ++VdȐ!̛7=x ]tI&X???{~h߾=.f!UUqwwg|7Я_?/@QvA/5so><<T$F_| www٪URw]7o(_qQ1???xl۷Gѣ?e묬طoJ;pڷo_}PGl7n_|G~~>LLL0o޼Ru>v,,,e?SNE@@lڿ?.]ӧGcnh6oewһE...hѢ֬YMMM(**"-b@@Zj֭[&A*ѣ1c 8;;qO>-wk֬P|fll'ؿg]y666t_~em'O [[rO`̙3C 3g*^~=ñ|r عs'ڶm+ncc2Xbk֬A`` A?K.hܸ1>3hiiaÆ χ\\\пRpK^kΟ?&Ml~_T*K 5k J'{pssëW,|cʔ)X~=TUUe7! TڤIL>&&&5}tL07oF˖-u pqqA6m0sLXZZbذa8{,ѫW/B" n?~Νøq0tP(**";;Evv6===̚5 efffb޽믱yfa֭/::7nĈ#гgOî]]LT#|CKDG]jihh`qFu´i ̚5 M45n݊ݻcܸqo|^`` n݊^z'OKɓ۷[v'G177GJJ >}ZܿE(]ve%IK'tDEEowVoRRRc5 IDATɓ' ĉϊ ,^^^DzeC[@֭q .] xX}QQQڕl .Y'|Rf(q⒞#F!d7_OB߹s@a%+I6oYRIHHe/^ĥK`llc„ ٳg%d[[vѣq022RIԒ8AAAen*fddHRO>7J8x TUU+]yh"$K#mٲ˖-CѲeKܹs5k e-Z&211A+[z z s|$$$ Rol֪dIΉQMMMݾ}֗/A||~/`͚5쎉G֭!kѢ&Lssshhh ""gmٲ%LMMU᰾IR!33ҏmeggK5j5ADBBBΝ;#)) ݺuî]0n8t5ˆ#du_צMٌ݃_E[[ >|[m'dx@q=R>%?W4aI=z.ʶgr޽<7x.J[$) /ƅ  6nݒ/s\~.}]za„ LȨVw=+B >6'';v=xbԫWO>];4PHd|@rrrhsΝי155h֭e% T---ؔQ2>22RlժUׯl&@"+ayj歊߻ȐH$oPsNNKTRRD")7<4nX\y=SRR޽{!!w^zV4J"@kR2+'O0e4j'Nܹsh.s.+/LoٲVi9ʇRPPU{T >fۺu%K^RTv!ֽ^.**27^_]IvJ$4nܸ԰tС$$$ܖKDD // .du*ߤ(2+jjTL"@]]eć%FK.́e*,z/ՒIIIXre7;wCKK֝wIkw{Whh(oߎ/7oeǏz/\ݿ_6aDPP4h;;r٦Mx{{UV䝧'?~-ߪC[֮U{Wؒd(x葬7YzAEEa[۷ݻ(u9XYYACC@7++ ˇ&FDQUW%C_ ccc<.\ { gΜ """^Š+d=̊p%4iDdm֬DQľ}d=RǍ]]] ˖EGGCGG!!!صk>|ǏW t~+Qdd$4igϞ~.(1jjj*kuo֝;w0zhŽFq9!&&8}4J%=322šqƈӧO+UСC 55U ͛WBZ;FU(SSSkor.Je_u˗/`QQQn򎇈mX[[CMMM6ݻweXCnp-٬׹(**(DP|ʒ]$ЇKMM$XTT eCn޼ 333hii ظq#d/_ ddd@UU111pvvF߾}q! &MB||lÇѵkWL6 ƍ555`ll ]]]xxx ''[o:̘1-'|aÆ .Dzk׮{AAAb =h޼99333dee͛9s& # ==ݻ7Ν?&LԩS%5L&::Z6){`mmhxB^йsg_>nܸL`ǎ;v,ahh+W`Νhذ!<==1~xtϟ?ZaÆaܹ8wϟ9s %%nnnؾ};8w yTӧ駟BUUiiiO_B| ťKpuux0m4 4Hֳtijg ٳ;*++ߣ]v8r.\;w`8tallWI$((HNNu#)) qqq ڵkDuGEƍcǎaСHOOG-uVaaaشiA,ܺu ~-F`\|YvqHIIepڵ kY?~DQLwLDD_bkŊصkw.ck.hԨbbbp)t=O?ܹsߩ=N>]OB___vQ]޽{x . 77 pttD@@|}}ѫW/ݻWƕ+W`cckȑ#ݻwahhyaرXv-V^ {{{,\ Frr2///3/_O?ǏiӦpttСC_oٲGEZZΝ+WpBŋu&ڶm<==qI|ppp мyshiia۶mȀ;R)/_._v4k ͚5ӧѬY3.]®]sNt?3g8/^DAA7o077;ZjCCC;v ;v쀇{{{ $$!!!PSS w^dffbڴi'O&qmGƖ-[gn...z}ի¢L9affs!)) &&&hݺ6C@@ׯC]]FNNz uuuhjj^z͛7ѫW/t 5a!&&vvv8p qA!$$CϞ=ѣGR<>|-Z@-mmmaذab͚5O믿ٳvΝ ///$$$ @Æ q)Q[[vuuEnd?[[[cʼn'ct{ 9TpzwJJJիeeel߾ʘ;w. "** gϞDQ \]]zj,]ƸtڵkǏ??rVXm۶EApp0z!LTWo-VIV~=zt۱cTT#2DEEa奆ɛKUuVڵk8yTbiiyرc+wȑ#87i/Ɛ!Cjuϗ+V`Ϟ=CRSSxZ\}|}}eɫaס%QP>|`رDQ&X*Ӏv]ƠWWe˖}*b)fmm?U uɼy0~Z5~ɒ%o'OèT֭[m6;Q#^_^)̿7ĉ+Nj>h aD=GFFx'QǪRv&%%ᜋ8999ٕ?E{RPP*MUKD}Q<J.# x9sL;tP)C}}}dggWFSF*V$غuk?}t("""""""":ʊX` ["""?~H$055EJJ ׯ_y8jժn߾=ٳg~g"""""""""pU7KT#v4`'jjjW .Ĝ9s }}}()UhxaVQQ<==s~EQ̨Pӧaoo_˗tRhҤIJR8p7n܀ahhX]$$$޽{8p`EQĖ-[DQFa֬Y%Qh Q8jܼѣJAx԰sNHKK+ҴiS=mڴy6qȑwFm;DDDDDT튊0qD8;;ɩԺ B]]7oD~~n۶ f͂.^zU!;puuŦMW} T*ٳWsDDգ}` :VWWwuӱc6iݺ[Ӿ}{o߾ 8q+//Ϟ=,3yEDDDDu۷}}}= ޽ݻwGVо}{ 2W\Avv6v :ӧnj3|Dw" ӧacc޽{N*Ϟ=È#``` [wBII &L3gcENNv ј1c HGEnpe ݙ%ZK.(` ׯ`kkk8pm۶}@^|W]|9:!!~hhFQ->}:޽ ddd`8y$舢" 0uTڵT;_|㑓˒( ҥ ߿_V[=m'JE*-YENN$ `ccݻwCpss ݋7oB\~8}45(**0 2DSǎS/Q5kbu(X ` Ν=_~ ,++ 7nȿpBlxxxBzzn ˂ GY#Gɓ'ٳ1zh(**¢L;رcpvvѩS'9Q헞.jtOGU:u۷oc֭0aOL0/Ʊc0w\l^^^?իWm۶={6Ξ=3f`߾}+-Z`pss7Ahڴ,l>rrr ".5&1:QCBׯwݷoX5СC=֭[C]]]",, 9wMKzUhllѴK( ɝT*RRR0i$<ܽ{`ll ӓ +… ajj +++"<<*/+WPWƦ=o eeemӧO|ׯpm$&&bÆ ӧ`Ŋq=YZZZǝ;wSj:::wKMHH(3QmR#E a/mmm{--& 4kժv-7mTzzz: ?-- . O H{UJjjjBNNΝϟ_mm۶ZZZ>wǎòed˂sN`ʔ)֭[NDDDCCCbҥPSS@* ˢ(ԩw]gpp:tw(rSXXDyQ]aÆ۸taii eeexzzb̘1PPPŋ3|WPQQ) HKKQeii $&&B*DDUO߉ҀR\S--555[*((k+((()))I444J)hjj*JR՜ܬl1''H*dgggeggg>XZ]ㆈӧOw^Y>} EQQlYRR/^Ǐ#77}t*;""̙3Xx1,--ϟs?~<ѫW/lܸW\AXX"""f|gغu+`ʔ)8r+WD׮]qy(+зo_hhh_{R^xgÆ dϋʕ+9s@CCCnժUXhQޢ 4+$$$cLDDcܸq޽;N<ׯ _}+fڵC7nRRR0p@iӦÀХKhjjڵC޽K@UQQ<VE1I&K߿uĉer瓓 @;v+N>ۗ걹n:5 GEdd$fΜÇCEEի^],H`cc#{lgg;w C[[лwoxyyF]<Q55ѷ!bA'b#Zx V^h,Yk֬ MǏcѢEՓ=OQQ;vҥKqUl߾\|FFFp%$lѬY3&E\͛7ܹs1wr[[[cݺueaӦMOw֍\@tto_ /5!00)3KuEVVDQ1ydPf;cǎe+**bڵoϤIJ=zG<GpQ)˗/cڵHNNPRRN(P\GkժUhܸ1F`ٺ 6W^EJJ 23KAp1Q(Q {ny@DDDDDDT'p(=Q pBy@DDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT(;ya0{A({U:?(Q-Wҟ)JQXX,0Daaa """z[u61*I-pUNUȋ򎃈??ȋ򎃈mߢ_9EDEBT ܺuDDDTn޼XPP@qQ%E񕿿bNNC!"":$''(zDDDD5C]OBpB%EDDL^l{QYlYlDDdyADDD.tbTŧ()e9CT)233n߾}իy򎅈jWݾ}hffc!"""z` "{Q1wժUk… 2Xzu׏EDD̕w}Vw0T>c==򎃈HM+*ՄQSS """"""""2QApZJMM J򎃈H1jդI UF`!8䩼Ĩ"{R5<[c6cb&FabEy@DDDDDDTט-022R(X bǎԔƍ)0jp; r11JDDDDDDT߿Dޡݼy JFJMMŁF0ydy@T!'"""""""":Q"""""""""s%"""""""":Q"""""""""s%""""""Z@!P(:R UT̘1Ǐw(cbjD/o}DDSQQeс=jĉU}lQEq dddsҥ py⫯& &&000ȑ#&kgϞ=(,,DΝaccK.!fΜ ]]]4n_|INN" [F^^~w(++cȐ!PRR<}O% uuu@^^D}NBVVF̞=GϞ=yT(Xzk׮AE;ǠAK\~2dΜ9wwwY^½{ЦMt[nD"Az0|pe˖033ٰaдiS<|;v,t邼<|Çk. :۶m<|={VX-["99&M15kmFGK5 {Qѣq N:9ӧO#  ~hii!009s&6o }}}7 QѪU+@QQ***Ғ9***ضm-Zh֬annٳ8t\\\`aa}ϟGbb"sNhhh ;;~~~H$˃.!Ԡ!CQ"""""""&L|899aժU@||l ӑ 'ޤR):'''",,  ONN#ܹsaL:wF\\\ۼys#++KPv~555?GF`` dY>>ܹ3g$''cHJJ*y~&Fj{{{kٳaccSSrBaaaѣA*jjjXp!>|CCCׯ޽{d 2;v,:vUV!888}44hOOO~g̙32e 5j{{{~888]vׯ_ѭ[7iͫ,77K.Ell,F ,ZK,CWW000EPTTڵk˗/ѩS'lذǎ ԩZh?D@@j'""""""a<==1|pHKK{?{ ,(wݻwezzzOʕ++lήc{{r'N_~HMM-w#`ggKKKUstoaÆ2ˆ !CZfjjkVaÆZD#0bĈ j%""""""aԠ())A~vܹhxT u(AUU"801JDDDDDD6 N.811[n([kA/OQQQIJT%""""""ЦMbȑD?666駟gϞ3fLv6oތ-[}u...h׮u놾}j33gϞEZZlmmakk __?:ɓ'ppp5lmmfٺ_~={D߾}ѩS'L>LiQ1~x ?ӿ&HwߡSNСNuDDDDDDD5Tbb"Μ9g~cǰk.Y`bb___m۶Xn_Q oool޼ǎ׉xlقիWc޽&N\|Æ Czpܹs:tסˆ#+W+V@pp0O7n7oD`` Pj&Fj ,Y͛7ǜ9sP~}<}дiSɶUUU5tuumkĉ066ƨQЦMW8z׮]֭:uDN:gΜ$!((C 1ХK@QQ]vM6եK⯿*Ն VXmmm̟?jjj8rH ; MMM]v8~8pj JODDDDDDTC5jmڴP<ɎW VQQAϞ=e,--q-<|ݺu+}ll,~ѼysTawPVV%11/Iv[ZZ( DDD%=zaÆxlyyy8p hj%""""""aߏ@DGGGƱc }aҤIի;;;M6x|rddd`X~=cdggzmݺaaaƦM0c \cƌ>sA[[Cloooy\/ƍlH(:t(={Ço<;v硢 6 ##CŨQ0f={;w!66wFZZnݺoe0o< <:t7F&M >L0jjj(BAAǖ-[d}|2.\ ,Zׯ_GFF{{{L8O>ťK`gg@pE={͛7#==z0m4"::˖-Au4ց'Ou4h`Μ9LLL0|pӧDQ#~G9s>Ą 7@CCqqq044Ν;OбcGxyyAAA7oFǎvD(Q 3r2˾rm߾=ڷo/{<~RgϞ x6.]yImHL8u~; 2d "[faaQ?eƍcʔ) 5FyQ222Y窢'BYY***(,,͛*mVz]]]A@=ЫW/@EO<h}EÆ A _x@YYFDdddU|E)ٳg˃ ШQ# <zzzPTTD||<"""УG#44.]BDDD°ad aÆ8t[NDDDDDDΟ?۷cٲe߿?^xEEDDT[|pbiӦXhttt H x{{˶ݻ7 lٲژ9s&F-[ -- !Ξ= oooL>:u6v ppp555|oQYYQe1A N8q***hذ!ݻ]UVHII01 h/1cpyڳg޽f͚.]5F SSSv8~8"""0h :wqYW__ ['d2Gjf̝feZjliݰi(353E$Ȕ)\ȕ$H0Çu9_8;;{eܘ0ao65ݻwrJN>͈##M_}PRD,ljѸ8-ZDFԩ>>>a&jѢVrrr"<<~SNNrr2@ar肣ǏuV6mJժUm񸹹Ѿ}{ﶿ2 *wYӹZVHIIF1g QFTVjl2ԩCpp0 6͍ *{q̙+""""""cKqƬ[iӦ1o<˄ ={6TRШQ#VXA`` [lo%33䄻;x{{s, ֭ ^)kqbjrI[cǎܹJpp-YzuFideee~J֭֭... ˪U P¥bQwwwڶmkͯZ]pp0qssbŊ@G%W322HLL W4۷/lwwwbbb8~`{뭷8p[n~Adffr뭷or3gÇ~+K.gϞL6oйsg^z%BBBZxzzŜ9s8p+"R*\3FM$%%Wiii G޳=G^^>>> :vɜ9sڵ+7|+,mő֭[m"eddp![b"5j԰%bcbb8uT+z'7oETZ͛… /\2uӓurIO^^:u-{ %&&XUTa=v%FMLr2--h Att4#$$Zj+> 6lՕLeI˗Ϗ'OGpp0!!!Npp-08}4?/~ZjQZ5Vmgm3 IDATڵHOOgѢEg~ײsޗT_x@:ġC.%HI~h۶-{eŊL>͛?BCCUg|8$ nX{ۖ]RNӾ}dK1h :ĭj]vqaoNVQ7n-""""""eHIIIaرӦMUV+WGGGرcaÆdee~N?~<gƌ4h'''Μ9C&M߿?^^^tԉm۶b[hѢ6l/BD:hllm{9qsΥVZdffgIJJb֬YDDDӧɓ@ᙡoaaa899Ȯ]_>!!!شi6mwfϞ=888k׮}""""""RԬY#GPzbHYd 111׶288?T[{0h׮{jX~=?#999DDDЦMۊٳgY,_銈e'Fرc;vMٿb/8qbaKll߶$_IHHF0 +7o΢E%^EDDDDDDZx\\\x6lXhGGGzYbwEǩW+UVjoYrrrX,888ХKviZ/""""""WG}:...<@ٶ:bC?ҩS'L~;v.yyWc*HbbE!ȑ#OO;0̚5knX-}Y{ 78'''>:D6mӧOKqF ĝwIrr23f ++)S޽{={6?83f{\rDEE1o++u[o3FEDDDDDDDDJSzu-[F|||5k0tЋǸqHLLdʔ)lѣ)_m۶~`ڵ@K.$$$￳pB>G{PbTDDDDDDDDkҤ  `EFFyfz8tL8n '?S[l!==v;lu>>>1 ^Jr+wygVH7<1*"""""""""e"""""""""R(1*"""""""""e"""""""""R\hqqqNNNx{{SZzNDDDDDDDDDr\VZjѿ (VO^^999DGGi&m <==t, >bπl+>mʕ+o`Ү` C||{rr2gΜbb)=.i%'&&MݺuZ*k&::___ppp\rUV%((?''', ׳FϜ9/yrnnn₃Ǐ'00 8z(ʕnݺrbzxxxCRRRcUZ`ϧo߾tR~¨PN:us'55RJp]w~޽{quu塇 >>ͪUXzy~턇c999lٲ5{|ر֟jeʕ4nܘbcc3gVݻӢE bccʢwdzd*f͚ѦM9tݺuٙ 6Arr2Ջ raʕ+G=Xb6l7."""""""""Uՠo\v-[FDEEpBz-N:SիWsi6m_ˊk˖-|׶|ᇜ77vE+7.6mʑ#GXf G=mժUiݺ5,^+-;;y׮]۷b帹qw l޼www;Fƍmuwwm?}4gr899A&MˣYf+Wʕ+GڵIHHȕ*+FlϽ6nH\\r-ԨQ㼶۷ח ᆱ&YYYSPPp٢i{nyiѢ- jPx վ}hܸ1-[N:@|*W#P¨\2vb]ȥ+F}|| ѣ>|m7oҥKN:Mƍٸqc_54hЀf͚ϯOýd'''ϟ֭[y'ksNBBB0M5jk.پ};Ǐ'??'''l6jԈ6')qKTnnnu}}};QPP`4Mc)%%Fn/RbŊtWWWҘ?>Kr J*ѰaC}]lB͚53f A/???:ua00MXE+7ʊV VNNNIbb"aaaDÆ 9uɉ,ۊÇ`tMԨQm/PNtG}t)"rڽ{z2a.ڵk###iEDDDDDD$M2h =zcǎ899͆ ذaiӆ:www G!!!OOOڵR#x={tss{sb1N4 *ؾjՊFvZ.[y.] aÆ1|p|}}qpp^|y6mD&M&;;krIxx8K,!==VJժUmc_cۥQM4k׮iӆ /_Gȵf0նo~A%0 (vik è4#iin:QzEnܸH233i۶- 4ѕ>M0cƌʭV+ am+skNN[nbHhh('Om%[ jXλݾrs[%ƞ{^5??888Vôi jr1rssټy3DGGS|ybcc&** (LVT wwwjժŎ;8}4}˗/'((TNV+a0p@mMIMM%551M3eƋm48[a 304Wan&[61zvހ"""""R5hЀ6mPre[ʕ+?%%F  ˖-a*lݺuTZ`~iΜ9C~~>|7[!( n+.6Wi<kK.tҥX?l`nJ|'@N...dgg9*0V@' X`f9u^@,pmˀ@_`aL4?K7ֳΘ9l}qei&k |)p4MV )V+K,aϞ=iӆÇӺukbbbˋjժg3wK,LJȠw899裏ܹsqsscС'p n6:wlw}ǺuY&Ç?[+)*"E1_@_1 pk øl]m`>pw]m̳+%FaB5p=a@k`iF큗9gcJ5a_[~oի3sLFItt4999⋌?LV+~!>(N0 ֭[ǔ)SdŊL:Çs rrrZ*~~~呜l;ѣoߞ?~a^zbq}嗼[=zq1vX{kN+FED4bF<4͉g˶/(L~b0diqԳ(4՟gT5M{0Ro)\iQ|kKax(\ZF@)V\8p UVtޝqj֬w=öm #((-[ȑ#`޽s_RZ5}YۘӦMcΝJȍfkSVHiv€@׳M\SNڷoO\\<@rrrȰ͆ غu+{O>>}qƱc^xߏ>}Ǚ3gZ_WaJݜM|Baqpa\Fa"r03>JཱིN?CH+0 vΰgoVqsinx l.z/FDDDDD ছn"00]Ү];0`@6ss..zANTSO=ڵkiڴ)O>$K,`ذa2x`:wǏga۶mt֍3c ͛ǻKӦM裏x;v,6l ""C~1J/""vc 8a8]%znݨφa8Y Øw 0Ms0E} Xq@RjyqDDDDDl}/((vӦM) T%W_}1ߏj / /@~~>NN!C0dȐ<"RX,ȋ7+v=kR _0!v&[/gr4ͬKGDDDDD(`K\qpp5 .kELJHH駟;KeXF8;;g8.GAA h0f-a4M[;%""""""%PbTDŲ1\0Y,C.4ADDDDDD.._2GQ)s2GQ)s2GQ)s2GQ)s2GQ)s2GQ)s2GQ)s2GQ)s2GQ)s25a8,Bnnpuu"Rv)1*""""""rҸq<== KAAkdddX~z>c2]J\g.3g ^C';)tƨ9rh6mptth]vѰa:88Pj`˖-֭Kʕ/:^ZZ۶mh;)~Gve0JƎk0DJT*ԩS*UqrrJ*u!$$VvaX"7o>"##ٙ """0 4ٽ{7NB ԪU 777"##n:f͚e0J%E4++VnKٳ%KD~˗nK߿KIʕ j`233oϞ=۷uNFF>,,AࠓDDDDDDD|||BlD.f,yoV:vʕ+˳%*mm _WTgZWV @^^PruƲk׮K/""""j|k IDAT"""CAA?R&F-ZCRRk֬!==٪U+j֬a_k:\V1cO_30")mJV]6 d|xxx#PF [ɓ'9y5SDDDDDDDθq.ڵkٴi'OƑHiqC$F3228ue<ѣG뺌)""""""";z(_}Oqw}c8pUuqq_~89w߱|r[YrׯKxG%//#FC1emƼyػw/ӧOɉիWشiNiӦ̝;Ν;3~xQFJ 222xW4iC b?Uy4hЀ/;vDAAڵ~ DDDDDDDkҤ >,iii7˗燇|r߿?/"۶m#''?,XٴimѣIMMxzzͶm.}rr2u82,|nz^sWqT:0G-X,agZ,[ ___ZhA^^i^ԪUYfzjyʕ+Çm P...DEE͍ٞ&Oi䐘H?~<Æ ԩSvڵk;w,pQ?^i[ $$|l–-[lwdz~yGY~=qqqiVr#(+Fovׯo^fM:tIII);^zaaatؑCQ^=|}}dg݉LJ KRRkצnݺKȠzԮ]WWWEDDDDD ))n+'''$?-rQriA||::}v"""X~%}ԩz݅oɤIppp૯?7_r 4???6nH;>}:۷gɒ%}=z>3f0|vŠAR zO?%,,I O?ÇYv-<lْ_~wy~;5jANNO=ӦMaÆիm7lqv4iĞӕRT&FKndɒ ޽پ}%~'[qrc̙8::kXƺuhӦ X,vmRѹgر à[ntVSO]G}ڵk /hr3I&ѿ>3͛G~~A۷cǎQ|yڵkgdǎl7o&77{NDnHQޯe?;֏? Xj'<<3gҪU+g%%%:иqc/^L~~>b3ydhܸ1 lٲEyfuT?ٳÇӡC۪9(\y)l gee}޶VZb]v{6.4MnJLL [&((5k0uTL@ Wsr~ipqq7<~cѢEdddдiSƌc(/~4MhԨ-[C3UҺukj׮M~x饗h߾=5_?E>}8q"}' 88n^z/b ի-"""""""ؘ1cXnфtRjժYl;v#G0n8<7/R#FBtt4UTO?-v6l'NnݺL8_~_Bff&ƍ^A]nV&O\,!!!3rH<==sto^T\\\ /HHH ((L”)SpssiӦk׮]2d...H8q"mJ/""""""RJ;v OOOv_|Add$ ,gذa-ǭ[fԯ_kժņ شiqqqL0N:7GqOm݆+WdʕJQ `}5KN-leYӲeb=z8yg•z}vj2uT\\\zt/a0`;v_~oaΝԪU֭[[o_M 9r$m۶1tR, w}hBQRbB08s Pqƶ6dgg}vZn EI&,\V`VqF.]K/tEstppg늞/{jo&z"**_~aÆm6LcѢE̘1!CP^=n[111|w9ӭ[7,YBK^b,ZIKKEndJ/""""""R YV lgKo{[U ?&JKnlg8ZVV+PcǎݻM6>UVQ^>d…,[ңG&--;v͝wI ;v,NNN,_XYYY|ӇYfoQx'N`̙ݛ֭[Ӷm[ڵkǻKvvH"""""""̨QXv-IIItܙSMjj*#FiӦ=YfQzunfvAYl<,]۷E:uxӧ۶m#//ݻ3|^yҥ r 'OdСymۖ~͛nu۱cmٳ?|}}Sdٲe;{b&]6+WzԬY8IIIaϞ=1+Vݻi޼U[AAU4wr(1*""""""RL6Ϗ>ҥ`֭[ǺuiӦڵ 4Ϗ{m/o-܂C&9s[NjXj۶m#99;Sع;wfΝrw+cX?W/ >+2x`&L@ڵ=[2b*:zN:J @Ҭ 988qUD)e*Tp^Y```m܊#sC۵kn/J*دa|1,, ˥+:`ӦM(\5ƲeػwB%K[,陙Idd$ϡCիWEDDJZZv|ĉԨQ㪞jUO[rSbTDDDDDDDĎ|Ay͛i|rV^O?DFFsёO>`6mܹs=z4T^1c0~x>|||8q"999]ӧOsOƍ:t(~!?<7|3Vbض㋔Z."""""""bG| 6Çܹsqqqa„ L4~Ç3o<}]7nL*U0Mn-[?aZpbbbXt)&$$/zW^y={믿n7!r}iŨUP3gWK/T,<<]ھ/^W^yի;s^aoݻwfJ܂-"o"""""""v6vX~WVJpp0?#5{4>3;bccҥ  ছnGax{{3j(>CN:ĉٺu+ , ##&M~Jhh(NNN۷' 9r=_5"""""""vְaCRSSؽ{7=z!C /0`&OLrر#˖-Clݺ u߿?999T^ӨQ#*WᄇӰaC*Vh_~ʈ#8s  bTDDDDDDz!KVXiҶm[.]J޽2e ӦMСCz|'|͌=C|b'DEE_0XȾ};w.wu׵)1*""""""RJX,V+a`XTiiiIPPmpp0^^^dee# ɓ'_7ndӣG, lR"""""""""ɓ'iٲ%-[d޽lٲ ЬY36l̙3"$$ GNO̙3[888жm[ԩx{{}vRRRxٲe ={$==CC=DBB~=_5ĨH)ѪU+n6~ׯ?NϞ=qpp࣏>b̙ꫤѬY3fϞM>}#551cO<6l1cƌjRR%:w{%)) Mr ""׉"""""""/ yuM6?'))ÇӢE []pp0Ǐ'##V@@@;[ne׮]dddЪU+ d2d=z8oLm3%FEDDDDDDlƌ}:RPTT#i;Œp=DZc2d=2NQ,::z0qf֬YދؓV\e+WwBBBC %FEDDDDDDD￟cǎ;RgϞA䂔իGz\DIgX,uD9CDDDDDDDDĞJJ>~\@iJOOOG0r$Y`8DDDDDDDDD쩤9s&.77z"XVVCDDDDDDDDJL&''^zOYjULJJCDDDDDDDDJLy8!!Ce_سgOzjjꋦi&;{sPEZZM3336mz%Wilܸ19**jizzGDٻs$BD$BBc(bG[+֞5jU-JTkoMDmM"noO*%y?6>$w~ !B!lO>TP.AAAׯXD uHMMѣGړ'Oގw@1 !B!Bxi3&&f(Դq!EQF|BјTD}ǑZ6999:%%%$!!PbbvV︄~)Rʪ¢JJBKKK{qٳgZmB!/^iVV{MQ jRCUinh^UUpa}%^ӄ wB!ijgϸtRӧO?􉌌<︄B!D~_0>9!r(:v5a###}$B×cZ[H!B!țƨB!B!"ߑĨB!B!"ߑBŋF޼y;vb4"Vӓ ;!B!9DBGҥPC<)Szb4"òehԨ$FB!"Ĩ⥪UFF`aa.]ub4"޽{B!B&5FB!B!$FB!B!$FB!B!BwHJJ /]/>>֭[B!BIBٶmiiiQ.G#B!B]Bw$<B!B@j !B!B!I !B!B!I !B!B!I !B!B!I !B!B!J/B;vvv+WNa䘄Ξ=0+VFaH\0ߵhEQZ1 V5(@EPM.i}(Rpwru"E-chwRo&,,La _"KyUG!3QQQɢEXz5nd=zķ~[vU.]Jbb"^z{֮]dz}vƌPrÇ?uP. IDATr̕+W~:uw(XXXO?}(^?~\`VQ}mQhѮM6-ZIu͛ZmMÇ:DZ}BlR|oQF *熵kҮ];}NX|$F;KBnbժU̚5+&Mow% 4ݲ&M֭[IJJԮ]\;-[; {~~~#UZU/pE߯0r\:uޥF8pRRR>(RRJǎ[\#///sjƍ;ikk;XnQTJV ޝ>}Z!8EQޥfڳgC"[RcT!r/Æ c„ ܸq0c Μ9СC:t(ϴ]hh(#GdڴigzlL81ӲEzj 177'11Ǐ !PtOlذAMfRhQVXQvߗ/_~BwĨ(*EQE) TQQ8+(J)EQ(bk"Oٰaǎۛ=z0uTBBB(]4 vL6ӧckkА%K0n8ʕ+ŋu`kk]cT* . ŋ)[l'BgΛ/^l_hQ}Vo޼y柔,YcB7SE1eJ(QĤYASSS3CCC#Je````R ڴic`jj )RF&$$%&& $M-4MjujBBB|bbb|ZZ[=hB0V}j!֭dɒ >HouV+122%3V5kŊK.Oܹs5jDEEٲe ϟgʕB!uʕ_`iiPb̘1Vϟ_(VMw>T,--&55K.Qfͷ]Tx.-[4wbhhH>}*޸qK![ޙĨ(%̚X[[7)P@eKK"۷/VŲbŊ(P@aR(^8ŋjժ@Ӊƍ^ti@@@Lݺu&%%] =Vkm۷/}~)> {SBܹѣG &88S>|ȉ'h׮ǎѣGRLFVe۶mnܹuѧO֭[ǹsҥ | B&NY}V \rYnpB.\HPPL6ƍEQ[n'իW7,UTK$1*ӧ9{n;? 4NסĨ(FFF z.\ڧ~jռys*UuͩUj*jܻwʕ+_8p˓3ZVߨ9z[K>}UL%JPF Μ97|駺)$99rʡh3f ׮]{=OYE''|?bꦉCվPCѠRP͛wlXқ>{ &jEY]d\3sss>C֬Yu&O$FE&UŤD,Y˶kκRJRo߾[XVW h}ηt҅cii͛ҥ6ٳg.\ "" Ųeˈ&885kҷo_Xd h">޽;˗wބp9hҤ ...wB!6w\,--:u*|Ȗ-[(X ӧOrܺu$ >+;wHgLMM޽;cǎٳgjݾە†  c8::r55j`ggDZcHHH2eаaCƎZXb<|;;;jժnr}?Hֶwݺu6mce|.(^8-=s̨3f_}%B! 2N:QP!HKKqҮ];͛ǪUؘbŊɓԩO֍<>|8xzzҭ[7͛… 166f(P@-^ARRgϞ%&&OOl ҥKXXXдiӷai&bccINN֍{Ǐ'00P7Z4qqqڵ8mOؘN:gWNݺuh֬mۖbŊW_q]Z-ƍ֭[Ӹqc.\8q"=&Mp]/^ }i;wSZ- Μ9CLL nZQfo͌96mS<==Yf ϧ|򘛛ӠABBB3g.]"119ssN"""߿?Æ cL0WWW틛QQQ,\2e燅:uiwJ*bP|?"٫Wю;-ZB o߾=[ !Buܹs9sÇSxqpww׭d<==v*TQFڒƚ5kHHHL2ذf"""5\Zn ٳo{{{=xU_~%G!..?8˗/>iii_ܹVnbɒ%УG,]GGJkc{U;w0sL.]O<_~Yf߿GҢE )… 7n7-[$110M_Exx8Ǐؘ>}Ptiڷo甓.\U21Μ9ŋ:t;ڵ+~~~.\ݻRؾ};>>>l2 OWc81(ۻyڵs2PtirPޞd2%?k׮W\RJY޽{XYY0*Qj*ycݻ7 I䰗]FUB(10󫯾q9no".\>} w 777 ܑ#GP[M 6 FqӧO111K.};B~7ݛ`Ο?Pvm]S!Bnʺu}6jjժѻwoڶm ݻw6m$&&RN>}۷Сf"00pT*>>>L8*UĔ)St2p.\WWW] aaa̝;???>|HQ .?)yPFҺuk6lO&**?N8ALL /L wK.EЮ];W}ׯ'<<:uбcG }49sHKKc@z߿ǏckkKv(U>Bw޽\z<==)S ۟9s]vQhQw˚b_xݻwL۶m+D^ڍE1ҦMHΜ9S\p!3gdذaq9ԩèQtьah4>|+Wg;ǎcŊ8pxj5gϞeEQ\/i ﲌioٳB׵kW7oNƍiܸ1ϟBקj9r$_}|wsyf͚E||<|`hhH߾})\0ׯ_'55 *g4 CѢE *VYpuʕ+|l߾GGG&MǎcժUoɃj5ݻwի8p>GpaNʀݻl߾/} 4Ǐ닇wׯ_ÃׯSlY&L_Wq366B h4"""OD'gVM6ޭ[fǎ8;;s!*W̽{2mcHjj*˗/I&ܾ};ܹ֭[chh:ubӦM}BS^{h;>'&..KKK""";w.VVVlٲooolق 9۷믹~:..._t֍ӡCpwwҥKQT>|???LBfͨ[.^^^<~ur9ڶm;w$--Gq wΔ)Sؼy3d ĉIKKԔ4RRR>}:)))$''SX1ߟ#wEYf._?P!4jcƌ!..KfݲeAQƎKZr;T!Bo-[ΝƏ'=z… cjj7>`4lؐ7aߧܹȑ#}vиqcƍGBB׮]ŅիWVK^:t(+2yd>,;eZ-˖-АOùx"AAAL<9W?8y$seĈ̘1sNΟ?Ͻ{gʕу>?[2zh>BCC?֭nnn̘1Cלy|4iDr t Cԫ[k.\Kq-bcc=z4 FԫWZjѩS't(_<)));˗/`BBB'::+Wrʔ)CΝ?~<pIlll(W|._P|y>3FZf͚l޼ΝKʕYh;vK.3(jժE&M8|0#F`L8J*xb:vȽ{ͱnnn :|M!x^zloԩ 4(mj5'N`۶m0hР\-.ʓ'Orm\BLL x]O<LJh_(p UVTXڒͮCnx".]"::mfeĐZl"Ǐ9ݻwcǎYN|nϏh4h={NTT썎Q獾G ,<䦵5-[`СԮ]5kɓ'f%Ͱ2g$Fٳ'@{;w:tH7hѣGԫW'OPD v횩NNKɩgbbkLٲeuITYO͘&RpvvfϞ=ܻw;;L륤pX:}牏ԩS8;;J%""߯Z___te*ƏO6mS|;wvڬ]ϣR ʹePF J.͹s=MYbʕ+ܸqjժ) #"ox[9} ʹ]vsN HPT憱q+UĩS@̙3kkkzy&666_bkk7ZF=djiiɞ={s ё~d0r Gn(_+!!!899QP!I222k !=z͛73f̠hѢ,]W2p@Erʌ3F]ll,ƍTZUwúo BVj_>WetJpp0vb,^O>?dʕ92[ؾ};gΝy&*UQl S7222ǿd'88kKrL^x;w7y-!!!#o޼ɖ-[8vիWپ};˖-21zevɹs޽+'FϜ9Cr^Z\_{BVWjyddnpnd!@z$uEQj5f|rqq-hhh W\ѽWdm IDAT??*1c}*Uprr61>}ZUֳx⺟_tDsJJ fff899閕,YFǏ_H>x(t#qww2)hHJJz"[f}Zg(3[KHHѣL4vQ^=]23CJJ K( %K=/#Qݺu[n9EVV~3H ግ=skα 2j^/_-[bkk{@H+W&,, 5kfRSSٸq#$%%{n8O?ٿNRHJJҽWRp˞={駟 3IJJ">>^frJT©St/:*TH7f\r=7nFGGN"jVZի144 272h Xl #FÙ3g+Vo߾G+WS700rjegƌs?ըQnݺعرcIMM}z/A\\GL0lG'egɌ=VZgV=;z*T; .L"Exq/硡̚5֭[ӤIJ(Ǐu@WXTHbbbPE70cuM6+W.벝XYY閹ҦMZ-k֬ԩS,X 'kZԜٻee,ɜ)""ҥKKPPPdjHGdjlٲ*UdF[~i݀%ccc4 c,[e9~*T荶M2ַ2:tKKKϊ+r =zLMCcbb "!!333sxIWKKLx֭9>0O}׿ڷ7^:Ǫ*Ϛ5K7c׮]SSSGGG={QիW >q@UKpp0=z[nL6Wڶ|vvv)}VVV<~X^rrC95GRe4 Ǐ}ܕӿ*y׊'O_iHJu?F̀HIIJ*?@7 wtܙvFM8>}вeK;LMMuI3撒HLL j$$$drZnofĈgjjʺuxOիSXMJJҭR޽;ׯ_gѢEh4N>u bŊɾ}ؼycx3]vTRl޼7rINJҥ{߉3gΤ@q 0c 4 K.%>>5ESRRt7nL˖-9x h4֮]/).D^#FZ3WW .eԮxSiiiDGGԁ(vЁ4 ;vɓ's-5j{n;v,-Zggg.\6lLrr2,_>-Zf.^Hxx8ǏaÆ,YM2l0i׮UVE̩S(S 3gΎK.ѭ[7T'''lllpssԔÇG}#_w܉ !D.kҤ ֭cڵeqRTd9b4;mڴaС@{V͍)||||8rK_~(P(N=^BB !!!TR޽{K5_K.g}ݻw  &&5kRJ:Dtt4Ϟ=wޙpjϟÇiРA[2ӯ_?LLLؿ?ƍ#..NWN:o\#;v,ŊСCDDDzW5j\t &O˖-#!!HPP jժ>}jԨȑ#uSj;w۷ ݝmRLVZŋy&qqqmۖ&MyY TRlْo)Stڕ7ұcGO6lN^hР׮]ˮ]hذ!ߟiӦ~ܼysv~Fa̛7J*1uTl=zC~hժ͛7޳fƍ|7 6 gggFE2e:t(t[[[Gƍټy3>>>ԭ[cccqqq:ڷoO@@GɉWһwoV^ʕ+7n{ܜ5jtR(s!7*Zx 6233Mxٱe WX1z¶upy^:+ ?QFYvC600x!JE-^i:„ 2=>rl9rW.cccc5jDqppXYYd Xqrr"""OOOZj|nCƲe(X vvv 4Ok=8p8J.͂ cڵܹskײuVK5jٻw/ڵ+Sb={WWWξ}زeK1cưg+|}}Yf w&>>J*HDDD͜ '''6mJٴi1g_~/$..VZ1vO>Zjɏ?ܹsg_5$O85e„ oSSLa.]W_}ŋ_O5tM4T*s+ .d߾}QfMhР˗/gȐ!<~M6ѱcǜ1*DoI瓚o<y=\k($EEƯ`x{{3~xegwW>>>=z_e!ĻLQ6lcŋK,vEԓ'O$}خV7oTX1˩M^Uӛ.g=p/_- 5-M PFDZ O޾};Q]>ܜ믿Ҽys˘1ct5%Lpſ###jԨ1~:C HϻNՒN+ߌɌoδNƵ|2]vү-7͊=nݚʕ+S|||tHj5iii4kL !ɱ666x{{cmmپ};9|+::իW3n84i7|#IQ!ȣ.^Hǎ={CyA{2?cJΞ=u5Gݻ(p"..P\9X#zꅕ>$22#F#?`mmN&E}||hժU4%tܙׯ3vX]IKK#00D={FTT'NƍDFFrA"""Ԕ;v7 ggg '%%p=z **I&ʍ7/SZ֯_OӦMlnoSϏNHH 99YwCVZˍ7?>W\!11+W#HMLL8pW^%44ǏӴiSڶm 1 @>}PT̞=xBBB۷.Qc̙3,^!ͥKXx1k֬B#͛رcSO>e۶m+VE믿ҥKqttdƍFV(X 'N`|;vSҷo\NDͱz:ͣGlܸ:PHKZnٵk5ɓ'lٲ*U` =!M͚5裏h߾= 45ݻ7oOOO0`se߾}/_!CЧOիuetnYSӧ[︹1sL] lmmi޼9oooo<<<8<={ɉqF>}ʈ#Oڵ+͛7֖5k0fN: iӆ+Wre*UDiѢ۷Etؑ+Wgݨw(E٩(EQF*WQ%ڵ_K-^777N>}X"Nz !ە+|2j4lؐ'OuV.]JxM=b߾}\z5k2~x ,ﰄB7or (@^(Pرׯ[ѣၛ}=zHO$dzyfhѢ;vয়~"..O??77:uSNn۶mi۶-jZꫯtk4:t老^^^2dC yaxxxd; }ܹ̚5LaԩS)R^z޽{iذ!@ٳ;w鉓_\|CCCCXX[nVZO?m6 *D>}25{,--Yj<{ҥRtIG-ZHwfϞFvYsԨQ5J>̕+Wcǎ@'OҪU+HIIa֭DFFұcGJ*kvA޽K"E֭[۷Mĉ9q :4Wgܸq7.Ӳnݺe>|xGj 8:)BЈ3[RJ*]ZTQJ0ۨ][QԨ-v%B#:?Zx>:;׹l;f̘4ҥ ]tIٱdɒzm~aLӜ%I: ||l|{+3i˖O_Ů]޽{ӹsghժ3gLogIB=3f ...7>̲hwGlٲo>YfQjU~'z-""O!42d1gϞ%<>c_> ,I&T\_~?AŊX"j"000?# &::[DqeگeE pEmƒ%KHNNӓի~ZΝ;9y$ԨQ=z'O.ODDҁa3p@u놳3W~ϟ{vѡC≯q〔KnϹgBBB *z*gٙˊyyGY=S bԨQ~Vk׮,Xv1b<==,+oׯ_ǪUZQ Μ9spww'44fւ_"[lݻ>}ĪU9s& Eo$%%QpaUFjոx񢥏SҶm[˨+Vpuϟ/^̫$΅,3 X aFo8o@_08b:4L{O|8 6 Py їcϳ !!! /;@g00F=kt`/09wtL4 .p0@K )# oqaj֬I6m8q]vٳ :N:m65jDfXz5 UT\rcmF:u, UP;wruQKUGbb"-Z*U*Ӧ YTBر#;v$99???n/byݝ2ePl٧.8|2s9dɒ4nܘ>(K 2~x>s-ZDpp0W^L2ȑ .͛7PB(rʅ/Ǐlٲ=z… 3tP ebRRR]Ύ3f0l0N<W\@<фp q4M nܸwy|q1ʗ/O>}9:ϟ?'.\ &7pY  p)R, Z^;;;b ^u9ɯ IDAT~8͚5 X%Cy: L7 ÖPiQa4G^4'1p$%,^#ea^4=nwҺu:"<<}! T2M3ۓ؞0M0Vw+:Xo/a| [횓':}YgggLӤaÆ\7xk2h [VgϦJ*уꫯS < ɓ̚5uX[[3m4-[?@޽ED12DN>?3f̰l+ϟ?3 #88+Wp͟??e˖E)R~Sll,f>˗/Alٲd;;mڴaʔ)|w,X.]`&eʔJ*|L>U/cܘ>ܹsg?VXA|?>:ԩSSn]Μ97 6dԩ̙3*U0gˈ:pB ĨQbҥԩSgϲ}vT͛74MMyUI/#:P^ЎљL< @Ms{a}ӫ`4jժNÇ i6 xBv D~iny@S4-Ϛߚ*!C%$$X7 \]] 4M (`i[`ArITTT>\\\/ʕ+Sre^ʢE,y<hZ)UJJj^||>> 6?Ο?O||<ݻwg֭׏;0rH-JϞ=e˖̘1}*$vvvlٲ˗/SR%֭Kr>@Ӈ9r0tPϟϡC,sFGGm6ڷoϤIݻ7 iӦ׏e2p@\\\Y&Ç?~n899`iѢ _~̜9SpayӧK,aϞ=׏+Wbccʕ+i֬gϦW^ 8P}*UСC-aرcϲ'H ξ󤄛W` |dT"ic00i.m=-}H퇂CgΜ)Wxv… _vm}R RF{rג2anomߦi%%$ 7 ЂH3˗/SV-jժѣGٷo-z/_~(Xx1.]ٳgsIbcc4iVVV4lؐҥK)SDFF2er aʔ)2x`\\\(\0RT)"zR<[[[h;~xy0 ܹscooɦED3mO5$u ,===ZzY<+G2OdZe֭iݺumճ=(rӣdy͚5Yf+V]vk׮ڽko?eѢEU<ɤc[0 %Q} J\a0W@30FMLx>8p` Nk1gݺub&|R;7 [`aM`)#2R}yC ØL\_ь)7P4vԩS?C۶m_~᧟~bԨQQzuƏOt~e*O>+++ѣ֭fO>!99WWW7o58p?$ZjEDO]00n͙3g...Ԯ];,0P,i3LӜk|ih0i0 <) M ry0@[l5 iӣh4z t-.^رc>}z4894aMӼJZ(mF14 ØKJh +4ͫa,'9N7 `zߴΝ#G2rȻU\yq5N:E͚5- ,h6++T eϞsa"""]6wkkk֯_OPPT\YO3FEDDDDD %`HydB:qޡم )R䳣G=zt;zV͝;7_~sԩizۓHx}_Mc[?'Nښ;2|pJ,f[Tmٳg'{uTX1+u<IIIeuY.yşU,JHH98ϝ;705.]ڣf͚+WhѢY]Z/#G?~fVוnOp /iNJJ2rbbߌ`ϏֹܵsIj(Sc#""$W^Y]VZY]Brvv&00P͛gu ͍_7fu)$$$gϞެ8i&i|mF+WV*ZhSMӌzH;%xohӦM{ܹsՒRdڅ ʖi'ifũ3L5[rȑ%;/// `4..>}C/k|Z\xm۶ȏ?ED_fu A O};?@>ˣ3M3yKRgϞ] : h޺u?/y/iӆ6mdu4oȑ;w,#\|cҿ,EDDDDDDDDDUV𰒓9uT(P;W\yU2adu"""""""""򀞺`I].111K""""""""""KM@߾}9}eC~W.\hy_tiFMrr2:t !!43gNNN|VZq"##6m 6|::_j#sMQyuS=h2epssʕ+$%%pۇaxzzHPPAAA$''SbE 0(_xwwwJ.ͱcDzDI*TO>ʕ+Xʕ+ӣG^{lٲb xW2 GqIl´iNf_+V3gN틣Cgż:u>2e駟ϊ+(Q~im=z4>>>}SΝTW^r"66(BBB'''TR/^k׮NR,HE$}8::ҨQ#+@Xez޽;J*RW|hڴ) f͚A SjUʗ/Oݺuzovvv˗봷~PR{~FҾۢaxyyNRȳF=J@@\rK@J{nʖ- 'e;'ĉ>>4k ggg5jġC?>l߾-[R@<== 'N| 4 22ٳg?gDɑ#e[޼y)Y7nLڵYekΜ9TR/N%Rmر#&L .]0`ѸqGYDDDDDD$+<K*KTRx?>q111/^Sy6<3#F?8rC퍛}XX;ϟm۶͛7K,#F ðjР:88@޼y)]4~~~@ʊ%K@)SҥK?~ԩC)Y$Νp-[6<<<(X Ype! y}: GaO&wܴk׎ufYyVZӇJ*eY"""""""OtyܹsS XTRzңk%!!9tŊǃ>=5<|MW)_< ˗/ʕLJUfaoȑ#QMium0>|xR *;_9a{0 )99KF r IDATGHF4i;˖-dɒY]SNqر#&Lʕ+ҷilڴ |M:w/""""""ɰedժUի￟/O<կ=vvv$$$`cc>>hsTlBB˖-\`k׮ͼxMLLC8q"}֖K.gUF 44t]{ԩ/waEϞ=_~ O2Ihh(fȐ!ѣk#F|! .PT$k=zS2dbbbψJ~ ""#F|͌3hҤ \p1c0l0oW^/{=8={k׮xxxжm[Vɓ3yd؈2M0 ?? ,جsE5jd)R)S0a;1?www|||ptt|>:d?04Mt,QD K,L23w\ &L`isAO8u'NHWŊӧOsVZ*T… sE|}}y&۶m$%%{n gΜs"""""""ϸL Fo3M0 www/ޱcB5kfe`Xsŗ_~fSN1+ܹsSo}.")]4eʔ`̘1ٳӧӨQ#Zn @LL ٳgK.͛7]}%o޼Yi ӓ-[)Sȣ`64oa8VW%""""""|ʲ`Nica#G& pmܸq_~5|(&]6ף:sĄY]7}v_[.9r 88N`)RyrZjeiKٴi'Ofڴixzz2n8+̙3> ((e˖'0o>iGTi1M3v+0@pȕ+i͛wu.0#ãÒcp4͘L$`O}0oLL0 nxxYSd5.@DDDDDDDDD$)玂Qy(玂Qy<ӫҋȃ0 #x"TVzeu&44Yƍe3gΰtҬ. è1;+oi"""Q0*"""DFF2~.#˅3f̘g*q ?R;vxsQzu^}լ.b2ݒ%K{yQy FEDD SV!uٳY]<]4Ǩ}Ms4^=>>͛7su֍_(Y$mڴIBEDDD2Qi̝;7|777^z%Ə]]6L0///*Uȑ#0 >>P@7o;#|?K.Ύ *ݻ;w.}L2HY?d… :2tdϞ *PZ,f{Q0*""""ȟ??'O&11?"EPLTmLϞ=ٱcUVŲ/88rʅgϞ%22GGGl+X'O˪s&"""Cj#uVVV.}ݖ̶m(VX+' ȿKAy׮]cݏZdӧO5 ciPPм&MQK ''.MD_sΫ۶m;pĉ.i1 FED$S,XI&aooOrrrsApp0  **9rdU 6RP!w=7n`ǎDDDPpaիǞ={p4jrOo;w.Ã.]7PY|9w&o޼tWWWݻ7\rL<www5ks,Y(5kFڵ zРAԩs񑑑=05kvQ111]vU͛ÇX":uٳ_DDDPJ<<]JXnQQQ*Tdzg̙éS3g/W^ԫW?{rTuطo+VwެYE׏իWӿ6mٳYjє)S͛7qqqɬ㙵c:uDҥiذ!M4_UV=zETT| 2$U}UV%44c?ңG4wuڴiC޼yyW:u*7ndqύ1c`oo͛7駟8{, L4M61uT<<|xLHH_'"".]0oOO4ÐX^{xxhѢ-RƦM&!!M6a&UVe޼yC ͍{Տ[nʊ 2x`ϟov 6'ҭ[7:vH"E駟0aL2:uЧO _|-6l 66?VZ1w\J*'|-[X~]h-s 7nܘÇo\5ǏJ9ԩo&Z_s"̘1ڻ,Ė 4MLZ{,Ҋ6_&Uۨv(ZZʴ}Lk(Q$d߈$G_St༟s׹}_9~r]???v ٳ'?>cƌ᫯l̙3ӧ 6_|Ott4M6ӓVZ_˗Yr%{""")1*""N8P+x?Zlikذ!V">> v)7j8nƍ7ߐMIImr.^Ⱦ}իVVVk׎˗Ӿ}{Uڵٲe $%%[3^{{{c믿~K۝;ww}C0LDGG+1Z^}U/hliLJKuΝ;Z*111Đ=hyFIbofeֻ-$]DAA{Gqqqg?Kh/_ kښP*Ut888h+RBB%%%޾6668hѢ/2/7n'5km -- {{{A̜9 TY_1VwƶFww -- kkkի駟vWZDDD&%FEDD(K) w^ޕ.]|o^$+++lmmvq̙3ڜ?#Gbbbxoj74AY Oeal wxx8ժUzX1Lxxx;;jԨNNN:t8OXX:t`С=",,srr8z1CԩSTTƍuĉcooQw1\]]3CCaaq,>>\c{#Y~)<==ooݺu! ///ٶm1Kڷo*"""Ш#"66}qW틊0L82ׯ_ LOkkk<<<8p?3ƞ@f֭Izx]Szu/^Ljj*:tHjժH&EmF޽ٻw]z@N8رc9~8%%%$$$PXXHVVL88222زe W^%''֭[ǹs爋#::>}m۵k׌$$447nǻk~,]={rرj0~=+ׯPh֬UTaǎ1k,=Jaa!GfɱcǸp{m۶t HFFC ښO?|Ν;СC+㫯]vቈQbTDDѨQ#^{n?j(.\#*vZ>S4iBxx81&L ""&M0a{Hdk׮|cK/ڵkquueܹѤIϟϜ9s`ŊФI:w#'Nёw}ݻw3ydC4m1lذѝ}g 8+VЫW/9r$w+pV^͋/ٳԩSiڴ)ݻwgϞj([oOڵ+111 63gs̐!C73Wo&/]MOOgȑ82ӦMcÆ 4i҄FDС8991uTN:Ev8t ӓ VXAzz:!!!׏ӡCo=z4{I& >-[ХK,X#GxLǎٳ';vw,X͛7EDDD5Qbee5d2 7w"kի\VZVXAΝiԨQ) Gw><<$㏩R }'Nё>}PvmRSSY|9IIIK 0ɓ'@=3g'88~~ʕ+3x`vɓׯo=}l,MF_+--d2accƍw[^,BCC=z,ZtҘ>}:׮]#<<j֬I>}pqq̙3]:uDn6lZÃKٰaf͚ 4y|r9r}͜LHH &&>?[ZZ ܺkk12L}7~oR-4sIDATWll,wl_RXX %;;kגL իİi&\o?ݻwgȑ?+ŋ9~8曌? vSO=e$+K}/_~cM&ӮHDDD,fT … y뭷_>yyy]ÇRreFd"88N:1n86nXni eԨQL&6ö#f֬Y 0;;;~IN kkrI{M^~*wʕ+[z 瓝ͤItSL!;;wy!CnQRR¦Mܹ3Ç'))X}bccYh]tΎP.'N֯ꞒvA:رcm*L3nݺf,FbĈlEsK˒%K+666Ň\\\V*sN:+l߾ts߶f>"""><<<ѣԪUxzz2sLlooW2zhN>5EEEѮ];vI͚5 cÆ 3n8FAZZeRzu2226m:uy4oޜ 0c 7oNݱbɒ%,[|ƏϞ={pss#%%ӬY3֯_Opp03f`ǎx{{`ccIMMCm͛INNfذa1i$6o7:w+Yz5֌37ҸqcbcciѢyyy,YLtt4͛7W^kpuu5]X.Uy< Uغu+_n9wQ*l"BCC6mﶋwwgtt4/W}|߾} 8;;wxת􏣊JJQq"""r^D*W_}er*ׂ x饗~Mii)k֬믿`;{Ǻu b< DII u-w<-- BIIIs.\ ##xo2"77b((((R~G*tqq1l]5d2QTTo{bb"7nܠK.Ʊ>}:K.ePDDDDDDDd{:YYYݺ`Ljɓ'+˗ܹs 2ޛL&٘vvvTT744gy\5k'O$885j߲e>#裏WXQn߽͛73m4Gjj*~!իW7=z޽{MRR#Gߟ˗/3f\]]IJJ֖;e7oX .i0f'ͩS4I0_~E>DDDXjbt𲹃hG9x]z*W^8I  O>ի_~0o<yf̘E3˖-+D%K:˖-͍qƱpBٳgښlBBBg… 26m0p@3xzzﭬY}:ѯ_rnڴ͛ck{5k̸U?;رcvk@IrsWXa$x |}}׿ſ/LBf͌Ͼ̛7믗wʕ 68*Wl,1ܹK.egym3Koܸu~L&qqqTZz>""""""""R͛G߾}o9޸qc۷/EEEꫬ_={?3f0x`1LL:l׮] sܽ{7 4 4Nz8|0YYYL>>}{aggGj7nPF~ϧM6_}YwN>}Z*~a?91+yrxyy-_zu\Jb :wLFwW6}tƌSa=| :իW( G999{ܱ C<ǨX%FEDDDDDDDD(1*"""""""""GQ8JQbTDDDDDDDDD,"""""""""bql<ӹt钹1>>DDDaPDښ*U; @Jjذ! 64w""""""""J{QbTDDDDDDDDD,"""""""""bqĨX%FEDDDDDDDD(1*"""""""""GQ8JQbTDDDDDDDDD,"""""""""bqĨX%FEDDDDDDDD(1*"""""""""GQ8JQbTDDDDDDDDD,"""""""""bqĨX%FEDDDDDDDD(1*"""""""""GQ8@DDRo>Ξ=Kڵ#::=z;d2QTT}{AVXӧ[._~e/"""""r"""f?0aRSSqvv&;;ʕ+cccC׮]}=e֭[~;֭[W_~EDDDDD~KKEDDT Xh^^^r!mII qqqݶL 778~9]vK{Dzz:&K.Q\\|Kk׮}qӍ[neժUԩSl}>??'O8Μ9Cii-mL6m 55޻xL4 6mPn]tB||<|glذ \]]gСTRO?DΟ?/'Oޞ-Zĉ'Z*ƍo߾l۶ŋ@aa!۷g˖-?~SMbb"ݻwgԩ,]>^xH >sL&GYf®]ꫯ8~83i$.]ƍILLٙ*U/вeK-[v3:w+Wd8;;өS'&OϤLJf ethernet_cable device -> hub_or_switch device -> machine_or_router device -> gateway device -> cloud hub_or_switch -> hub hub_or_switch -> switch machine_or_router -> machine machine_or_router -> router } marionnet-0.90.6+bzr434.orig/doc-src/img-src/device-automaton.dot0000600000175000017500000000143112167200764023430 0ustar lucaslucasdigraph device_automaton { rankdir=TB; edge [fontname="Courier-new",fontsize=8]; start [shape=plaintext,label="",color=white] start -> ne [constraint=false] ne [label="non-existing"]; ne -> off [style=dashed, label="|> startup (step 1) "] off -> on [label="|> startup (step 2)"] off -> on [label="|> startup"] on -> off [label="[] gracefully_terminate"] on -> off [label=" | =| terminate"] on -> sleeping [label="|| pause"] sleeping -> on [label=" |> resume"] sleeping -> off [label="| =|\nterminate"] off -> ne [color=red, fontcolor=red,label=" configuration\nchange"] } marionnet-0.90.6+bzr434.orig/doc-src/img-src/class_mariokit.dot0000600000175000017500000000104612167200764023172 0ustar lucaslucasdigraph Netmodel { size="30,30" ratio=1.0 simulated_device nodo [label="node"] simulated_device -> nodo simulated_device -> cable nodo -> device nodo -> machine nodo -> cloud nodo -> gateway component component -> nodo component -> cable fore [label="Xforest.interpreter"] fore -> network fore -> component } marionnet-0.90.6+bzr434.orig/doc-src/img-src/network-emulation-level.fig0000600000175000017500000003210612167200764024737 0ustar lucaslucas#FIG 3.2 Landscape Center Metric A4 100.00 Single -2 1200 2 0 32 #c6b797 0 33 #eff8ff 0 34 #dccba6 0 35 #404040 0 36 #808080 0 37 #c0c0c0 0 38 #e0e0e0 0 39 #8e8f8e 0 40 #aaaaaa 0 41 #555555 0 42 #8e8e8e 0 43 #d7d7d7 0 44 #aeaeae 0 45 #bebebe 0 46 #515151 0 47 #e7e3e7 0 48 #000049 0 49 #797979 0 50 #303430 0 51 #414141 0 52 #c7b696 0 53 #414541 0 54 #c2c2c2 0 55 #6e6e6e 0 56 #444444 0 57 #717171 0 58 #333333 0 59 #949395 0 60 #747075 0 61 #b3b3b3 0 62 #c3c3c3 0 63 #6d6d6d 0 64 #454545 0 65 #e2e2ee 0 66 #94949a 0 67 #dbdbdb 0 68 #a1a1b7 0 69 #9c0000 0 70 #ededed 0 71 #86acff 0 72 #7070ff 0 73 #dd9d93 0 74 #f1ece0 0 75 #e2c8a8 0 76 #e1e1e1 0 77 #d2d2d2 0 78 #da7a1a 0 79 #f1e41a 0 80 #887dc2 0 81 #d6d6d6 0 82 #8c8ca5 0 83 #4a4a4a 0 84 #8c6b6b 0 85 #5a5a5a 0 86 #636363 0 87 #b79b73 0 88 #4193ff 0 89 #bf703b 0 90 #db7700 0 91 #dab800 0 92 #006400 0 93 #5a6b3b 0 94 #d3d3d3 0 95 #8e8ea4 0 96 #f3b95d 0 97 #89996b 0 98 #646464 0 99 #b7e6ff 0 100 #86c0ec 0 101 #bdbdbd 0 102 #d39552 0 103 #98d2fe 0 104 #8c9c6b 0 105 #f76b00 0 106 #5a6b39 0 107 #8c9c6b 0 108 #8c9c7b 0 109 #184a18 0 110 #adadad 0 111 #f7bd5a 0 112 #636b9c 0 113 #f7f7f7 0 114 #de0000 0 115 #adadad 0 116 #f7bd5a 0 117 #adadad 0 118 #f7bd5a 0 119 #636b9c 0 120 #526b29 0 121 #949494 0 122 #006300 0 123 #00634a 0 124 #7b844a 0 125 #e7bd7b 0 126 #a5b5c6 0 127 #6b6b94 0 128 #846b6b 0 129 #529c4a 0 130 #d6e7e7 0 131 #526363 0 132 #186b4a 0 133 #9ca5b5 0 134 #ff9400 0 135 #ff9400 0 136 #00634a 0 137 #7b844a 0 138 #63737b 0 139 #e7bd7b 0 140 #184a18 0 141 #f7bd5a 0 142 #dedede 0 143 #f3eed3 0 144 #f5ae5d 0 145 #95ce99 0 146 #b5157d 0 147 #eeeeee 0 148 #848484 0 149 #7b7b7b 0 150 #005a00 0 151 #e77373 0 152 #ffcb31 0 153 #29794a 0 154 #de2821 0 155 #2159c6 0 156 #f8f8f8 0 157 #e6e6e6 0 158 #21845a 0 159 #ff9408 0 160 #007000 0 161 #d00000 0 162 #fed600 0 163 #d82010 0 164 #003484 0 165 #d62010 0 166 #389000 0 167 #ba0000 0 168 #003380 0 169 #087bd0 0 170 #fbc100 0 171 #840029 0 172 #07399c 0 173 #0063bd 0 174 #39acdf 0 175 #42c0e0 0 176 #31ceff 0 177 #ffde00 0 178 #085a00 0 179 #ff2100 0 180 #f75e08 0 181 #ef7b08 0 182 #ff8200 0 183 #007d00 0 184 #0000be 0 185 #cccccc 0 186 #fff2d3 0 187 #ffe4ae 0 188 #ffd279 0 189 #cfcfcf 0 190 #999999 0 191 #b2b2b2 0 192 #c9c9c9 0 193 #dfd8df 0 194 #f7f3f7 0 195 #cdcdcd 0 196 #6c6c6c 0 197 #868286 0 198 #c7c3c7 0 199 #868686 0 200 #c7c7c7 0 201 #e7e7e7 0 202 #9e9e9e 0 203 #717571 0 204 #757575 0 205 #effbff 0 206 #f3f3f3 0 207 #d7d3d7 0 208 #aeaaae 0 209 #303030 0 210 #515551 0 211 #666666 5 1 0 1 0 38 50 -1 20 0.000 0 1 0 0 -1676.000 6274.109 -2330 7212 -1642 7417 -1022 7212 5 1 0 1 0 38 50 -1 20 0.000 0 1 0 0 -1676.000 11089.109 -2330 12027 -1642 12232 -1022 12027 6 10215 8280 11745 8820 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 11070 8550 11745 8550 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 10215 8280 11070 8280 11070 8820 10215 8820 10215 8280 4 0 0 50 -1 0 12 0.0000 4 120 450 11160 8460 socket\001 4 0 0 50 -1 14 14 0.0000 4 180 750 10260 8775 port1\001 4 0 0 50 -1 24 16 0.0000 4 180 720 10305 8595 hublet\001 -6 6 10215 9630 11745 10170 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 11070 9900 11745 9900 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 10215 9630 11070 9630 11070 10170 10215 10170 10215 9630 4 0 0 50 -1 0 12 0.0000 4 120 450 11160 9810 socket\001 4 0 0 50 -1 14 14 0.0000 4 180 750 10260 10125 port2\001 4 0 0 50 -1 24 16 0.0000 4 180 720 10305 9945 hublet\001 -6 6 10215 10980 11745 11520 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 11070 11250 11745 11250 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 10215 10980 11070 10980 11070 11520 10215 11520 10215 10980 4 0 0 50 -1 0 12 0.0000 4 120 450 11160 11160 socket\001 4 0 0 50 -1 14 14 0.0000 4 180 750 10260 11475 port3\001 4 0 0 50 -1 24 16 0.0000 4 180 720 10305 11295 hublet\001 -6 6 10215 6930 11745 7470 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 11070 7200 11745 7200 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 10215 6930 11070 6930 11070 7470 10215 7470 10215 6930 4 0 0 50 -1 0 12 0.0000 4 120 450 11160 7110 socket\001 4 0 0 50 -1 14 14 0.0000 4 180 750 10260 7425 port0\001 4 0 0 50 -1 24 16 0.0000 4 180 720 10305 7245 hublet\001 -6 6 5625 5580 7155 6120 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6480 5850 7155 5850 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 5625 5580 6480 5580 6480 6120 5625 6120 5625 5580 4 0 0 50 -1 0 12 0.0000 4 120 450 6570 5760 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 630 5715 5895 cable\001 -6 6 11745 6930 13275 7470 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 12600 7200 13275 7200 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 11745 6930 12600 6930 12600 7470 11745 7470 11745 6930 4 0 0 50 -1 0 12 0.0000 4 120 450 12690 7110 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 630 11835 7245 cable\001 -6 6 11745 8280 13275 8820 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 12600 8550 13275 8550 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 11745 8280 12600 8280 12600 8820 11745 8820 11745 8280 4 0 0 50 -1 0 12 0.0000 4 120 450 12690 8460 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 630 11835 8595 cable\001 -6 6 11745 9675 13275 10215 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 12600 9945 13275 9945 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 11745 9675 12600 9675 12600 10215 11745 10215 11745 9675 4 0 0 50 -1 0 12 0.0000 4 120 450 12690 9855 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 630 11835 9990 cable\001 -6 6 11745 10980 13275 11520 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 12600 11250 13275 11250 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 11745 10980 12600 10980 12600 11520 11745 11520 11745 10980 4 0 0 50 -1 0 12 0.0000 4 120 450 12690 11160 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 630 11835 11295 cable\001 -6 6 1125 6255 3060 6795 4 0 0 50 -1 24 16 0.0000 4 180 1920 1125 6435 User Mode Linux\001 4 0 0 50 -1 24 16 0.0000 4 180 765 1755 6795 Kernel\001 -6 6 1125 11655 3060 12195 4 0 0 50 -1 24 16 0.0000 4 180 1920 1125 11835 User Mode Linux\001 4 0 0 50 -1 24 16 0.0000 4 180 765 1665 12195 Kernel\001 -6 1 2 0 1 -1 38 0 0 20 0.000 1 0.0000 -1679 6434 654 217 -2333 6434 -1024 6434 1 2 0 1 -1 38 0 0 20 0.000 1 0.0000 -1679 11249 654 217 -2333 11249 -1024 11249 2 2 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 5 900 5400 3375 5400 3375 7650 900 7650 900 5400 2 2 0 1 0 42 50 -1 20 0.000 0 0 -1 0 0 5 3285 5760 3420 5760 3420 5895 3285 5895 3285 5760 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3420 5850 4095 5850 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 4095 5580 4950 5580 4950 6120 4095 6120 4095 5580 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4950 5850 5625 5850 2 2 0 1 0 42 50 -1 20 0.000 0 0 -1 0 0 5 3285 7110 3420 7110 3420 7245 3285 7245 3285 7110 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3420 7200 4095 7200 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 4095 6930 4950 6930 4950 7470 4095 7470 4095 6930 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6480 7200 7155 7200 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 7155 6930 8010 6930 8010 7470 7155 7470 7155 6930 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4950 7200 5625 7200 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 5625 6930 6480 6930 6480 7470 5625 7470 5625 6930 2 2 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 5 900 13050 3375 13050 3375 10800 900 10800 900 13050 2 2 0 1 0 42 50 -1 20 0.000 0 0 -1 0 0 5 3285 12690 3420 12690 3420 12555 3285 12555 3285 12690 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3420 12600 4095 12600 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 4095 12870 4950 12870 4950 12330 4095 12330 4095 12870 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6480 12600 7155 12600 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4950 12600 5625 12600 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 5625 12870 6480 12870 6480 12330 5625 12330 5625 12870 2 2 0 1 0 42 50 -1 20 0.000 0 0 -1 0 0 5 3285 11340 3420 11340 3420 11205 3285 11205 3285 11340 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3420 11250 4095 11250 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 4095 11520 4950 11520 4950 10980 4095 10980 4095 11520 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6480 11250 7155 11250 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 7155 11520 8010 11520 8010 10980 7155 10980 7155 11520 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4950 11250 5625 11250 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 5625 11520 6480 11520 6480 10980 5625 10980 5625 11520 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 7155 12870 8010 12870 8010 12330 7155 12330 7155 12870 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 8010 7200 8685 7200 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 9540 11250 10215 11250 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 8010 11250 8685 11250 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 9540 7200 10215 7200 2 4 0 1 0 38 50 -1 20 0.000 0 0 7 0 0 5 9540 7470 8690 7470 8690 6930 9540 6930 9540 7470 2 4 0 1 0 38 50 -1 20 0.000 0 0 7 0 0 5 9535 11520 8685 11520 8685 10980 9535 10980 9535 11520 2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 7155 5580 8010 5580 8010 6120 7155 6120 7155 5580 2 2 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 5 13275 6750 14400 6750 14400 11520 13275 11520 13275 6750 2 4 0 1 0 38 70 -1 20 0.000 0 0 7 0 0 5 14670 12645 10665 12645 10665 5850 14670 5850 14670 12645 2 4 0 1 0 38 70 -1 20 0.000 0 0 7 0 0 5 7605 8100 630 8100 630 4815 7605 4815 7605 8100 2 4 0 1 0 38 70 -1 20 0.000 0 0 7 0 0 5 7605 13635 630 13635 630 10350 7605 10350 7605 13635 2 2 0 1 0 42 50 -1 20 0.000 0 0 -1 0 0 5 1571 9154 2711 9154 2711 9347 1571 9347 1571 9154 2 2 0 1 0 42 50 -1 20 0.000 0 0 -1 0 0 5 2070 7575 2205 7575 2205 7710 2070 7710 2070 7575 2 2 0 1 0 42 50 -1 20 0.000 0 0 -1 0 0 5 2070 10875 2205 10875 2205 10740 2070 10740 2070 10875 2 1 0 1 0 7 51 -1 -1 0.000 0 0 -1 0 0 2 2130 7725 2130 10740 2 4 0 1 -1 57 50 -1 20 0.000 0 0 7 0 0 5 -900 10350 -2430 10350 -2430 8100 -900 8100 -900 10350 2 2 0 1 0 38 500 -1 20 0.000 0 0 7 0 0 5 -2324 6410 -1027 6410 -1027 7217 -2324 7217 -2324 6410 2 4 0 1 -1 57 50 -1 20 0.000 0 0 3 0 0 5 -1451 7333 -1918 7333 -1918 6712 -1451 6712 -1451 7333 2 2 0 1 0 38 500 -1 20 0.000 0 0 7 0 0 5 -2324 11225 -1027 11225 -1027 12032 -2324 12032 -2324 11225 2 4 0 1 -1 57 50 -1 20 0.000 0 0 3 0 0 5 -1451 12148 -1918 12148 -1918 11527 -1451 11527 -1451 12148 2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 1 0 3 1 1 1.00 60.00 120.00 900 5580 -1665 5580 -1665 8100 2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 1 0 3 1 1 1.00 60.00 120.00 900 12870 -1710 12870 -1710 10350 4 0 0 50 -1 12 12 0.0000 4 105 420 2790 5895 eth0\001 4 0 0 50 -1 0 12 0.0000 4 120 450 3510 5760 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 720 4185 5895 hublet\001 4 0 0 50 -1 0 12 0.0000 4 120 450 5040 5760 socket\001 4 0 0 50 -1 0 12 0.0000 4 120 450 3510 7110 socket\001 4 0 0 50 -1 0 12 0.0000 4 120 450 6570 7110 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 720 7245 7245 hublet\001 4 0 0 50 -1 0 12 0.0000 4 120 450 5040 7110 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 630 5715 7245 cable\001 4 0 0 50 -1 14 14 0.0000 4 135 600 7290 7425 eth1\001 4 0 0 50 -1 0 12 0.0000 4 120 450 3510 12810 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 720 4185 12735 hublet\001 4 0 0 50 -1 0 12 0.0000 4 120 450 6570 12810 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 720 7245 12735 hublet\001 4 0 0 50 -1 0 12 0.0000 4 120 450 5040 12810 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 630 5715 12735 cable\001 4 0 0 50 -1 12 12 0.0000 4 105 420 2790 11310 eth0\001 4 0 0 50 -1 0 12 0.0000 4 120 450 3510 11460 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 720 4185 11385 hublet\001 4 0 0 50 -1 0 12 0.0000 4 120 450 6570 11460 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 720 7245 11385 hublet\001 4 0 0 50 -1 0 12 0.0000 4 120 450 5040 11460 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 630 5715 11385 cable\001 4 0 0 50 -1 12 12 0.0000 4 105 420 2790 7245 eth1\001 4 0 0 50 -1 14 14 0.0000 4 135 600 7290 11160 eth0\001 4 0 0 50 -1 14 14 0.0000 4 135 600 7290 12510 eth1\001 4 0 0 50 -1 12 12 0.0000 4 105 420 2790 12660 eth1\001 4 0 0 50 -1 0 12 0.0000 4 120 450 8100 7110 socket\001 4 0 0 50 -1 0 12 0.0000 4 120 450 8100 11475 socket\001 4 0 0 50 -1 0 12 0.0000 4 120 450 9630 11475 socket\001 4 0 0 50 -1 11 14 0.0000 4 180 1290 3600 5175 Computer a\001 4 0 0 50 -1 11 14 0.0000 4 195 1260 3600 13500 Computer b\001 4 0 0 50 -1 0 12 0.0000 4 120 450 9630 7110 socket\001 4 0 0 50 -1 24 16 0.0000 4 180 720 7245 5895 hublet\001 4 0 0 50 -1 24 16 0.0000 4 180 555 13590 8955 VDE\001 4 0 0 50 -1 24 16 0.0000 4 180 720 13500 9315 switch\001 4 0 0 50 -1 11 16 0.0000 4 180 750 8685 7245 cable\001 4 0 0 50 -1 14 14 0.0000 4 135 600 7290 6075 eth0\001 4 0 0 50 -1 12 12 0.0000 4 135 945 990 12915 /dev/ubd0\001 4 0 0 50 -1 12 12 0.0000 4 135 945 1035 5625 /dev/ubd0\001 4 0 0 50 -1 24 16 0.0000 4 180 720 4185 7245 hublet\001 4 0 0 50 -1 24 16 0.0000 4 240 930 2835 9315 Host tap\001 4 0 0 50 -1 11 16 0.0000 4 180 750 8685 11295 cable\001 4 0 0 50 -1 12 12 0.0000 4 105 525 1890 7485 eth42\001 4 0 0 50 -1 12 12 0.0000 4 105 525 1890 11070 eth42\001 4 0 7 50 -1 26 16 0.0000 4 225 1320 -2340 8775 Read-Only\001 4 0 7 50 -1 26 16 0.0000 4 180 645 -2025 9810 FILE\001 4 0 7 50 -1 26 16 0.0000 4 225 1425 -2385 9180 Disk Image\001 4 1 -1 0 0 11 12 0.0000 6 165 1050 -1681 6475 Filesystem\001 4 0 7 50 -1 26 10 0.0000 4 120 390 -1891 6953 COW\001 4 0 7 50 -1 26 10 0.0000 4 120 390 -1885 7212 FILE\001 4 1 -1 0 0 11 12 0.0000 6 165 1050 -1681 11290 Filesystem\001 4 0 7 50 -1 26 10 0.0000 4 120 390 -1891 11768 COW\001 4 0 7 50 -1 26 10 0.0000 4 120 390 -1885 12027 FILE\001 4 0 0 50 -1 11 14 0.0000 4 165 1140 12195 6255 Switch S1\001 marionnet-0.90.6+bzr434.orig/doc-src/img-src/layers.fig0000600000175000017500000000362512167200764021451 0ustar lucaslucas#FIG 3.2 Landscape Center Metric A4 100.00 Single -2 1200 2 5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4062.445 5485.924 1350 1350 4095 540 6705 1305 5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4062.445 6835.924 1350 2700 4095 1890 6705 2655 5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4062.445 8185.924 1350 4050 4095 3240 6705 4005 5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4062.445 9535.924 1350 5400 4095 4590 6705 5355 5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4062.445 10885.924 1350 6750 4095 5940 6705 6705 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 1 2 1 1 1.00 60.00 120.00 1 1 1.00 60.00 120.00 6930 1440 6930 4005 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 1 2 1 1 1.00 60.00 120.00 1 1 1.00 60.00 120.00 1125 4095 1125 6705 4 0 0 50 -1 18 14 1.5708 4 165 1275 7290 3375 MARIONNET\001 4 0 0 50 -1 19 14 1.5708 4 210 2130 7650 3870 OCaml, ~12,000 lines\001 4 0 0 50 -1 18 12 0.3491 4 135 645 5850 3015 VNUML\001 4 0 0 50 -1 18 12 0.3491 4 150 510 5985 3375 Netkit\001 4 0 0 50 -1 1 18 0.0000 4 255 3225 2475 1215 Interactive Friendly Interface\001 4 0 0 50 -1 0 18 0.0000 4 180 1455 3330 1665 GUI LAYER\001 4 0 0 50 -1 0 18 0.0000 4 180 2250 2925 3015 CONTROL LAYER\001 4 0 0 50 -1 1 18 0.0000 4 240 3690 2115 3915 Device (Hub/Switch/..) Emulation\001 4 0 0 50 -1 1 18 0.0000 4 255 3855 2115 2565 Network Design and Manangement\001 4 0 0 50 -1 1 18 0.0000 4 255 2895 2475 5220 Single Machine Emulation\001 4 0 0 50 -1 0 18 0.0000 4 180 3330 2295 4365 COMMUNICATION LAYER\001 4 0 0 50 -1 0 18 0.0000 4 180 3120 2385 5715 EMULATION PLATFORM\001 4 0 0 50 -1 1 18 0.0000 4 255 3165 2475 6525 GNU/Linux on x86/powerPC\001 4 0 0 50 -1 0 18 0.0000 4 180 2040 3015 6885 HOST MACHINE\001 4 0 0 50 -1 18 12 0.3491 4 135 375 6075 4860 VDE\001 4 0 0 50 -1 18 12 0.3491 4 195 975 5760 4590 uml_switch\001 4 0 0 50 -1 18 12 0.3491 4 135 390 5940 5760 UML\001 4 0 0 50 -1 19 14 1.5708 4 210 1695 540 6165 C, small patches\001 4 0 0 50 -1 18 14 1.5708 4 165 1275 900 5985 MARIONNET\001 marionnet-0.90.6+bzr434.orig/doc-src/img-src/class_process.dot0000600000175000017500000000065412167200764023035 0ustar lucaslucasdigraph device_automaton { process process -> xnest_process process -> vde_switch_process vde_switch_process -> switch_process vde_switch_process -> hub_process hub_process -> hublet_process vde_switch_process -> gateway_hub_process process -> ethernet_cable_process process -> uml_process } marionnet-0.90.6+bzr434.orig/doc-src/img-src/layers.svg0000600000175000017500000001471012167200764021500 0ustar lucaslucas MARIONNET OCaml, ~12,000 lines VNUML Netkit Interactive Friendly Interface GUI LAYER CONTROL LAYER Device (Hub/Switch/..) Emulation Network Design and Manangement Single Machine Emulation COMMUNICATION LAYER EMULATION PLATFORM GNU/Linux on x86/powerPC HOST MACHINE VDE uml_switch UML C, small patches MARIONNET marionnet-0.90.6+bzr434.orig/doc-src/documentation.texi0000600000175000017500000014704612167200764021674 0ustar lucaslucas\input texinfo @c -*-texinfo-*@c %**start of header @c This file is part of Marionnet, a virtual network laboratory Copyright @c (C) 2008 Marco Stronati @c This documentation falls under the terms of the GNU Free Documentation @c Licence version 1.2 or later. @c You should have received a copy of the GNU Free Documentation License @c along with this program. If not, see . @setfilename documentation.tex @settitle Marionnet developer documentation @c %**end of header @copying Documentation of the Marionnet project oriented at a developer audience. Copyright @copyright{} 2008 Marco Stronati youfind.marco@@gmail.com @end copying @c @c marionnet ocamldoc references @c @macro mariourl{myurl,mystring} @c @ifhtml @c @url{../../_build/marionnet.docdir/\myurl\.html,\mystring\} @c @end ifhtml @c @iftex @c @c @url{/home/paracetamolo/marionnet/DOC/marionnet.docdir/\myurl\.html,\mystring\} @c @url{_build/marionnet.docdir/\myurl\.html,\mystring\} @c @end iftex @c @end macro @c @macro marioscript{myurl,mystring} @c @c @url{/home/paracetamolo/marionnet/DOC/virtual-machine/\myurl\,\mystring\} @c @url{virtual-machine/\myurl\,\mystring\} @c @end macro @c @c put every image in a directory img in the same directory as the file.texi @c @c TODO resize images @c @macro marioimage{imgname,description} @c @float Figure,\imgname\ @c @image{/home/paracetamolo/marionnet/DOC/img/\imgname\} @c \description\ @c @end float @c @end macro @c provide macros mariourl marioimage marioscript with correct paths @include macros.texi @c title and copyright pages for the printed manual @titlepage @title Marionnet developer documentation @subtitle Documentation of the Marionnet project oriented at a developer audience. @author Marco Stronati youfind.marco@@gmail.com @c The following two commands start the copyright page. @page @vskip 0pt plus 1filll @c grab copying info from the previous section @insertcopying @end titlepage @contents @ifnottex @node Top @top Topnode Documentation of the Marionnet project oriented at a developer audience. @end ifnottex @c Menu doesn't appear in printed manual @menu * Abstract :: Abstract * Overview :: Overview * UML :: UML * VDE :: VDE * Ocamlbricks :: Ocamlbricks * Emulation :: Processes * Devices :: Devices * GUI :: GUI * Datastructures :: Datastructures * Daemon :: Daemon * Exam-mode :: Exam-mode * Build system :: Build system * I18n :: I18n * Darcs :: Darcs * Project file :: Project file * Licence :: Licence * Index :: Complete index. @end menu @node Abstract @chapter Abstract @cindex Abstract A virtual network laboratory allowing to emulate a physical network of computers and network devices such as switches or routers in software represents a valuable tool for students, and may also be useful to researchers and system administrators. A tool of this kind, particularly if it aims at being usable by inexperienced students, should offer the same opportunities of configuring and experimenting with components as a physical network, providing also an intuitive graphical user interface for dynamically manipulating the network topology and each individual virtual device. Indeed some projects with similar purposes have been existing for years, and typically use scripting languages such as Python and Bash; by contrast our system, Marionnet, has been implemented using the functional language OCaml in just six man-months and yet providing several important features, such as dynamic reconfiguration, still missing in more mature projects. Building such an inherently concurrent system is nontrivial, requiring the integration of many different components written in different languages and a complex control logic. This is the first chapter. @node Overview @chapter Overview @cindex Overview We can briefly split Marionnet components as in figure: @marioimage{layers,Overview of Marionnet structure.,8cm} Starting from bottom, Marionnet currently runs only on GNU/Linux machines on x86 and powerPC architectures, this is both a technical choice (we are not much interested in Windows or MacOSX support) and a consequence of the use of UML technlogy [@pxref{UML}] that is Linux only by design (we are sorry for *BSD users). @sp 3 @section Single machine emulation On top of a GNU/Linux host, the emulation of guest machines is achieved through User Mode Linux technology, that, as you may guess, allows you to run many Linux kernel in User space as regular processes.@* UML brings many advantages over other emulation solutions: @enumerate @item it is not a machine virtualisation system, is a operating system emulation system (despite this, later we'll use the term virtual machine freely) thus being much faster and lighter. @item the code is mature and well @url{http://user-mode-linux.sourceforge.net, documented} @item the manipulation of virtual machines is estremely easy and handy @item the user experience is 100% compatible with real GNU/Linux machines. @end enumerate @enumerate As well as some limitations: @item is a linux-on-linux-only solution, no other hosts or guests are supported @end enumerate For our pedagogical purpose this was absolutely acceptable considering open source solution should be the privileged choice for teaching, on the other hand the network is less realistic, thus less suitable for the simulation of real environments.@* Other future developing towards open solutions (such as Xen or Qemu) are not planned for now but not discouraged. @sp 1 On the code side we needed to patch UML kernel to introduce a hidden interface allowing us to link host and guest in way transparent for the user [@pxref{UML-ghost}], this allows also to launch graphical applications from guests using the host X server so that machine filesystem are much lighter and only one X server is actually running [@pxref{X-support}]. @sp 1 Much work is also being done on the front of filesystems creation, even if plenty of material is available from the UML project, our memory constraints (every router is a UML machine running quagga) brought us to create a custom mini-distribution called 'pinocchio' [@pxref{UML-filesystems}]. Moreover to minimize disk usage Marionnet also use the common sparse file technique so that only changes are dumped to disk, this also reflect the UI disk treeview [@pxref{GUI-disk}]. @sp 3 @section Device emulation To link together Uml machines in a virtual network we chose once again an external project, @url{http://vde.sourceforge.net,VDE} - Virtual Distributed Ethernet project whose purpose is to emulate cable, hub and switch devices allowing also to introduce perturbations in the communication. @* The software is written in C and only a small part is used by Marionnet; we are currently in very good collaborating relationship with VDE team as we exchanged some patches and advice in the past. @sp 3 @section Objective Caml Until here we analyzed what free software could offer to emulate a virtual network, from now on we'll see what Marionnet added and how. @* The language of choice is OCaml for the following reason: @enumerate @item static type checking and type inferring systems @item functional paradigm @item imperative paradigm (only where stictly needed) @item object system @item stable library @item improved density and readibility of code @end enumerate We strongly believe that without such a tool it would have been unachievable to develop a complex program like Marionnet in such a small amount of time.@* Marionnet can be simply diveded into the fully dynamic control layer @pxref{Devices} and the GUI layer @pxref{GUI}. @sp 3 @section Ocamlbriks During development we felt the need to expand and simplify many of the standard library functions or just to define our new tools, as a result we end up building a small library made of many little unrelated parts, the bricks of our application.@* The library is well documented in the form of code comments and for its nature we think nothing more is necessary to understand and use it. @sp 3 @section Network design and management One of Marionnet biggest enhancement over previous solutions is the possibility to modify the network configuration 'on the fly', while all machines and devices are running. Such dynamic adaptation is perfectly realistic on a real computer network and we believe it is essential for the learning experience of the student. In fact the network, with such a plug&play ability, can be stressed to see how it reacts, for example in routing algorithms this is absolutely crucial.@* To achieve this goal, that is trivial in real world, a great amount of work was necessary to manage all processes and grant concurrency in the execution because nor UML nor VDE supported dynamic reconfiguration, so we need to create and destroy processes every time something changes in the network in a way transparent to the user and, as you'll see later, the number of this processes is not negligible.@* Moreover we trace a graph of the network, that will be visible in the user interface, using @url{http://www.graphviz.org, DOT}. This is also where most of the object oriented OCaml code reside and where it has proven to be a great tool for stability, density of code and bug tracking. @sp 3 @section Graphical User Interface For what concern the interface we chose the @url{http://www.gtk.org, GTK+} toolkit; the staic part is designed with @url{http://glade.gnome.org, Glade 3} while the dynamic part with LablGTK, the OCaml GTK+ binding.@* Our main goal is for it to be simple and intuitive considering is unexperienced audience and also because, as of now, we have really few user-controlled feature and the most of the work should be done inside virtual machines. So the interface has two main purpose: @enumerate @item configure your network layout with the help of the network grap [@pxref{Dot}], the filesystem history tab [@pxref{GUI-disk}] and the defects tab [@pxref{GUI-defects}]. @item fire the network up, stop, suspend it and check whenever something occurs during execution; @* as an example of this it has proven to be really valuable the little blinking interface for hub/switch/router devices [@pxref{Ledgrid}] as it gives live feedback on the device state. @end enumerate Worth noting that from several experiences, student started to be productive after just 15-20 minutes of usage of Marionnet, succeding in creating complex network just after few hours. @node UML @chapter UML @cindex UML @section UML kernel For what concern guest kernels currently we support Linux 2.6.18, of course builded on UML architecture and properly set for networking. When we need to supply some parameters from the OCaml side to a UML instance we simply bind some variables on the kernel command line, and then retrieve them in the emulated computer from the Linux virtual file @code{/proc/cmdline} with the @marioscript{/usr/sbin/marionnet_source_cmdline, script}. @pxref{Exam-mode}. @anchor{UML-ghost} To allow comunication between host and guest without interferring with the virtual network (e.g. invisible to sniffers) we needed to @marioscript{patch,patch} the Linux kernel introducing a ghostified interface.@* A ghostified interface is a network interface which remains fully functional in receiving and sending frames but can not be in any way detected or configured by userspace processes, including utilities like ifconfig, route and netstat, and sniffers like tcpdump.@* An interface can be ghostified and unghostified by calling the new ioctls SIOCGIFGHOSTIFY and SIOCGIFUNGHOSTIFY.@* Ghostification works by making some ioctls fail when their parameter is a currently ghostified interface, returning -ENODEV as if the device did not exist.@sp 1 On Marionnet virtual machines the ghostified interface is @url{http://en.wikipedia.org/wiki/The_Hitchhiker's_Guide_to_the_Galaxy,eth42} and it is connected to a host tap interface rather than to a hublet @pxref{hublet} thus allowing graphical applications to communicate with the host X server.@sp 1 Once in a virtual machine:@* @command{# unghostify eth42}@* @command{# ghostify eth42}@* @c TODO indicare codice, X host e nest @sp 2 @section UML filesystem @anchor{UML-filesystems} The user should be able to choose among several GNU/Linux distribution but as of now we only support debian, despite this marionnetifying a distro is trivial and in future you can expext more choice. In order to save disk space, considering that an average fs take from ~300MB up to several GB, we use as virtual fs a pair of file: @enumerate @item a read only filesystem image @item a sparse file containing only changes relative to the initial image. In UML jargon such a “patch” is called, for understandable reasons, copy-on-write file, or cow. @end enumerate Typical cow files take just few megabytes on disk but require sparse file support on the host filesystem. Such support is in prac- tice always present on GNU/Linux, but it may be lacking on other systems to which the user might want to copy some files. For this reason we work with cows only in temporary directories of the host filesystem, and avoid them while saving a project @pxref{Project file}. @sp 1 UML easily allows one to use an xterm or gnome-terminal as the virtual machine console. Practically the only “customization” we needed consisted in displaying the virtual machine name on the window title bar, to enable users to recognize which console belongs to which machine. This was achieved with a @marioscript{marionnet-xterm-title,script} making the virtual machines print a string with XTerm terminal control sequences at startup.@sp 1 To fully marionnetify a fs, a bunch of other scripts are needed: @enumerate @item @marioscript{marionnet_prepare_startup,startup} @item @marioscript{marionnet_prepare_shutdown,shutdown} @item @marioscript{marionnet_grab_config,Exam script} @pxref{Exam-mode} @end enumerate @sp 1 Currently we use as router an UML machine properly configured with @url{http://www.quagga.net,quagga} suite, this allows to emulete as close as possible a common Cisco router with free software. @c TODO mariokit.ml, simulated_network.ml, router cisco quagga @c TODO cow, swap, memory usage, console, umid @c TODO maeglio device: macchine possono essere shutdown or poweroff @c In this case Xnest processes run on virtual machines, but seen as X clients @c they however require a connection to the host X server. @c talk about message passing between threads @node VDE @chapter VDE @cindex VDE VDE allows one to create virtual switches and hubs connected to the Ethernet interfaces of UML machines and virtual wires. All virtual switch and hub ports are implemented via Unix sockets or tun/tap interfaces. Wires can be destroyed and recreated at runtime without affecting virtual machines. Unfortunately, however, a couple of implementation choices in VDE and UML prevent a direct application of VDE devices to emulate the devices specified by the user in Marionnet. @enumerate @item The first problem is that when a network interface is defined for an UML machine, a switch or hub where to connect it can be specified, but not a wire: in other words, some virtual cables are not directly represented as cables in VDE, and are left implicit. This creates problems with dynamicity: destroying the virtual hub or switch to which a virtual Ethernet interface is connected makes the interface unusable; by contrast we need “stable endpoints” to which we can dynamically connect and disconnect cables which on their turn may be connected to other devices. @item VDE also implements defects as we need them but only in cables, whereas we require the same functionality also for ports.@* @end enumerate We'll see solutions to these issues in the section Devices @pxref{Devices}. @sp 1 Currently we use VDE to emulate: @enumerate @item Hubs and Switches: for each hub or switch the user can specify the number of ports, and —for switches— whether it should sup- port the STP protocol. @item Cables: an Ethernet cable either straight-thru or crossover, they are identical in implementation, we simply don't allow certain kind of incorrect connections (e.g. two machine with a straight cable). @end enumerate @sp 1 Currently supported defects are: @enumerate @item delay @item lost packets @item flipped bits @item bandwidth upper limit @end enumerate They apply to both direction to cables (left-to-right, right-to-left) and to ports (in-to-out,out-to-in). @c TODO dire che i cavi possono essere sospesi (cambiano colore), in modo da @c poter provare come va la rete senza di loro, senza doverli togliere e @c rimettere tutte le volte. @c TODO simulated_network.ml link code @c @node Ocamlbricks @c @chapter Ocamlbricks @c @cindex Ocamlbricks @c state o env usati da talking @node Emulation @chapter Emulation @cindex Emulation To overcome the two problems in the VDE section @pxref{VDE} we chose a two-level emulation approach where each device in the user-level network is represented, in general, by several UML and VDE processes, making up the emulation-level network.@* For what concern the lack of dynamic uml-vde_switch connection we solved the problem introducing a middle stable endpoint that we called hublet. Each ethernet port of each network device is connected to a hublet, that act as interface to which one can connect and disconnect ethernet cables on the fly.@* The lack of port defects was solved by adding an additional cable to each port so that the cable introduces the defects. @anchor{hublet} Hublets are two-port hub processes used as the stable endpoints we need for Ethernet connections: they are only destroyed when a virtual device is destroyed or the number of its ports is changed. Virtual cables can be connected or disconnected from hublets at any moment.@* Altought this solution looks overcomplicated and involves a considerable number of processes it proved to perform well and to introduce a negligible overhead in the packets trasmission. Moreover it was the best we could afford with the technology involved and the time constraints.@sp 1 Our mapping from user-level into emulation level may be most easily understood with an example:@* @marioimage{network-emulation-level, Userl-level & Emulation-level, 7cm} A sample network seen both at user-level and at emulation-level. The virtual computer a is connected to the virtual computer b via the four-port virtual switch S1. User-level network devices are represented as gray boxes with rounded angles, while emulation-level processes running on the host are shown white; the two user-level virtual cables are particular in being the only cases where the two views exactly match, a user-level device being mapped into an emulation-level process. @sp 1 The two levels of emulation are clearly reflected by the structure of our OCaml code. On one hand a hierarchy of classes represents processes, on the other a second distinct hierarchy implements devices, using processes as building blocks. Both processes and devices internally represent the current emulation state as a DFA state (including for example on and off for a device, and running and suspended for a process). In both cases methods are provided for following existing DFA transitions, interacting with the external UML, VDE and updating the emulation state. @marioimage{device-automaton, Device automaton, 9cm} @sp 3 @section Processes The class @mariourl{Simulation_level.process, process} allows to start a generic process with the proper command line arguments, send it signals, stop it (in several ways) and moreover handle the start/stop of the death monitoring @pxref{DeathMonitor}.@* @marioimage{class_process, simulated_network.ml: processes class diagram., 7cm} As you can see from the graph this generic class is inherited by several other classes, related to specific processes, that call the actual external processes: @enumerate @item @url{http://wiki.virtualsquare.org/index.php/VDE#vde_switch, vde_switch} is called when you need to create a switch or a hub @item @url{http://wiki.virtualsquare.org/index.php/VDE#wirefilter, wirefilter} is called when you need to create a cable, some defects may be applied too @item linux-default is called when you need to create a uml machine or a router @end enumerate This layer abstract the processes that can now be used to create our network devices.@* Note that all the processes can be executed concurrently, a mutex mechanism is used to grant a correct behaviour. @sp 3 @section Devices @anchor{Devices} The virtual class device abstract a generic network device allowing to: @enumerate @item change its state following the DFA scheme @item manage hublets @item manage processes involved in the simulation @end enumerate it is then inherited by all hardware specific devices. @marioimage{class_device, simulated_network.ml: devices class diagram., 4cm} Follows an in depth description of each device: @sp 2 @subsection Ethernet cable Virtual Ethernet cable connecting any pair of Ethernet ports: the two endpoints are simply connected by a wirefilter process. This is the only case in witch emulation level perfectly matches user level: this class methods just calls those of ethernet_cable_process.@* A user cable can connect pairs of objects of several kinds. The user is free to connect objects with cables having incorrect crossoverness. @marioimage{cable_crossoverness, Type of cable needed to connect different devices., 2cm} Bandwidth limitation and cable defects due to the cable are directly implemented by the wirefilter process If the user cable "crossoverness" is incorrect then it is configured to lose all packets. @c TODO move in mariokit description and only link here @c read mariokit code and complete description here, now it is too generic @sp 2 @subsubsection Cable reference counter A feature quite useful in practice is the possibility of temporarily disconnecting and then reconnecting a single virtual cable, without destroying it so that you keep the configuration.@* This is nontrivial to implement because of the complexity added by the need for a cable process to have both its endpoints (hublets) alive to be started: for example a cable whose endpoints become alive might be currently in disconnected state (hence the cable process should not be spawn), or the configuration of a currently running cable endpoint could be modified, leaving the cable with only one alive endpoint (and hence the cable process should be terminated).@* We found a very compact and elegant solution to this problem involving a reference counter: each cable object has a mutable integer field reference counter, always in the range [0, 3].@* Reference counter is initialized to 1, and then: @enumerate @item decremented at each disconnection @item incremented at each reconnection @item incremented at each endpoint startup @item decremented at each endpoint shutdown @end enumerate A cable process has be spawn only when the reference counter of its cable object rises from 2 to 3, and must be terminated as soon as reference counter drops from 3 to 2. @sp 2 @subsection Hub or Switch Virtual hub or switch with n ports: a main VDE hub or switch m is connected to n cables c_i , each incorporating the defects of port i. Each cable c_i is connected to a hublet h_i , representing port i as an endpoint. @sp 2 @subsection Router Virtual router with n ports: a router with n ports is represented exactly as a machine with n Ethernet ports. Routing protocols are implemented “in software” on the virtual machine, using the Quagga service. @sp 2 @subsection Machine Virtual computer with n Ethernet cards and m serial ports: A UML process u is connected to n hublets hi_1, and each hi1 is connected to another hublet hi_2 via a cable c_i incorporating the defect of the Ethernet port eth_i. Each user-level eth_i —seen as a connection endpoint— is represented by the hublet hi_2 . The special Ethernet interface eth42 is also always emulated to allow graphical applications to communicate with the host X server. eth42 is ghostified, and connected to a host tap interface rather than to a hublet. @sp 2 @subsection Cloud Cloud: Two hublets h1 and h2 are connected by a cable c. All “defects” like lost packets or delay are implemented in c, while the random ttl decrease is implemented (by convention) in h1. The free endpoints of h1 and h2 represent the two user-level cloud endpoints. @sp 2 @subsection Gateway Gateway: A hublet is connected to a host tap on one side, and has the other side available for connecting cables, as the only gateway endpoint in the user-level network. The only specified parameter for gateways is their IP address.@sp 2 Creating the bridge during a default install require root ??privilegies?? and is too intrusive (may interfere with user configuration) so a @marioscript{prepare-bridge.sh, script} is provided to later configure it at user choice. @c TODO tell more about the bridge @c TODO unclear!! isn't there a cable+hublet more to implement port defects??? @c TODO mariokit device convention, left/right end convention @sp 3 @section DeathMonitor @anchor{DeathMonitor} Death Monitor, as the name suggest, is the part of Marionnet that monitor the processes involved in the device creation, looking for unexpected deaths and eventually reacting with a proper callback function.@* Considering the strong relation whithin processes belonging to the same device it is important, in case one of such processes dies, to handle the whole device by, for example, switching everything off or by starting again the missing process.@* Moreover we want to make sure that no process, no more needed, is forgot running or in any other state, expecially knowing the large number of processes involved. @sp 1 The @mariourl{TODO,list} of processes under control is stored in map structure containing the name of the process, a predicate and a callback function to invoke in case the predicate result true.@* Once a process is started it should be registered in the map, then a @mariourl{TODO,polling} loop will check its predicate and eventually call its callback; finally when the process is stopped it should be removed from the map.@* Now the @mariourl{TODO,default predicate} just verify if the process is alive but it can easily be changed making the death monitor a more general process monitor (for example monitoring used resources).@* At the beginning the implementation was based on unix signals exchanged between parent and child processes, despite this was faster and more fine grained than the polling solution, it proved to be too long to debug.@sp 1 As well as the network simulation, the entire monitoring process is thread safe, thanks to a mutex mechanism. @node Mariokit the core @chapter Mariokit the core @cindex Mariokit the core The file mariokit.ml contains several utilities that are useful to the whole marionnet but not enough general to go into the ocamlbricks library. @* @c TODO evidenziare le più utili @section MSys In the module MSys we find all the necessary to work in the system, in particular we have all the pathname to kernels and filesystem needed by virtual machines.@* @section simulate_device Probably the most important module of the network part of marionnet is Netmodel, it contains a number of classes which abstract simulated_devices and allow to build and manage the network; it also introduces a slightly different convention: @enumerate @item a device is a hub, switch or router @item a cable is crossed or direct @item a port is a eth or tty @item a node may be a device, a machine, a cloud or a gateway @item a repectacle is an object representing both a eth and a tty port, and their addresses @end enumerate @* @marioimage{class_mariokit, mariokit.ml: classes diagram, 7cm} The class virtual simulated_device manage the class device @pxref{Devices} in simulated_network: it uses the same automaton and same exception, but simplify the passages between states of a device. In particular it provides the methods create, destroy, startup, suspend, resume, gracefully_shutdown, poweroff to change state, as well as the methods can_startup etc. to check whether the device is in a state allowing the transition.@* Moreover it define the @mariourl{code_METHODMariokit.Netmodel.simulated_device.destroy_because_of_unexpected_death,callback} needed by the deathmonitor, in this case it simply shutdown the whole device if a single process dies unexpectedly.@* It is interesting the value @mariourl{code_ATTMariokit.Netmodel.simulated_device.is_correct,is_correct}, that when hinerited by cable allows to control whether the user choose the wrong cable, and in this case prevent the cables from being started; this is achieved through the val @mariourl{TODO, polarity} found in the class node, that in the case is the same on both endpoints requires a crossover cable.@* Of course all the methods are thread safe, as well as the other components of the network virtualization.@* @c TODO enqueue dot @c Dotoptions may be separated in future @section Node @mariourl{Mariokit.Netmodel.node, Node} is a class that provides extensive methods to work with receptacles and sockets, thus to manage the connections between elements of the network. In also contains some methods to generate information fot the Dot network representation @pxref{Dot}.@* @c say that every other device inherit this stuff @section Network @anchor{Network} The class @mariourl{Mariokit.Netmodel.network,Network} represent the entire network created on top of the devices analyzed before.@* It maintain in several lists every device present in the network, with specific methods to add and remove each of them, as well as providing methods to access them and set their properties.@* The second big functionality of this class consists in the management of the connections that is possible on each device (receptacles) or on the whole network (sockets).@* Finally it is able to translate the current network in its dot representation, to be displayed in the main Marionnet window @pxref{Dot}. @c TODO clear dot interaction @c ledgrid_manager, dot stuff @c to_forest led_grid eval_forest_attribute cow_file @node State @chapter State @cindex State @mariourl{State.globalState, GlobalState} is the module that represent the whole Marionnet state, it is defined uniquely in @mariourl{Marionnet, Marionnet.ml} as 'st' and then manipulated.@sp 1 Marionnet state can roughly be devided in four parts: project, GUI, dot, network.@* Network state simply allows to access the network class in mariokit @pxref{Network}, that itself is the state of the virtual network.@* The same holds for the Gui state that is a simple access to GUI.window_MARIONNET, the main window of the application, that will be binded to the gui handler by marionnet.ml.@* The project state consist in providing all the attributes to abstract the .mar file @pxref{Project file} and the methods to manipulate them. For example are provided variables for the working directory, project name, project file, hostfs, sketch.dot, etc, and methods to open, save, save as, import and close the project. Moreover the state of the current project is modelled with the type application_state that can assume the values: @enumerate @item NoActiveProject : Working with no project defined. User have to create or open. @item ActiveNotRunnableProject : Working with a project with an empty or non runnable network. @item ActiveRunnableProject : Working with a runnable project. @end enumerate Finally the dot @pxref{dot} representation of the network, from now on the sketch, @c TODO clear dot interaction @c sketch(dot), @c presence of the mutex sketch_mutex @c files: project file, pwd, project name, project directories :"tmp" "states" "netmodel" "scripts" "hostfs" "classtest" "sketch.dot" "sketch.png" "network.xml" "dotoptions.marshal" @c methods to change it @c set_sensitive: disable GUI functions depending on states @node Dot @chapter Dot @cindex Dot @c dotoptions.ml, @node GUI @chapter GUI @cindex GUI One important improvement that Marionnet brought over previous solutions (such as Netkit), is a nice and clear graphical user interface that for teaching pourposes is crucial.@* GTK+ was the obvious choice to make in terms of toolkit for its good intergration will OCaml throught Lablgtk2, the OCaml bindings GTK+; moreover we were already familiar with the library because of previous experiences.@* As designing tool we used @url{http://TODO, Glade2}, from which we obtained the file gui.glade; using the utility provided by lablgtk, lablgladecc2, it is possible to extract from the xml gui.glade, a sort of wrapper in ocaml gui.ml that make easier the binding with the various GUI handler files: @code{$ lablgladecc2 gui.glade > gui.ml} @enumerate @item dotoptions.ml - traslation to Dot graph @item marionnet.ml - main window and application initialization @item simple_dialogs.ml - standard Maionnet dialogs @item state.ml - manages almost the entire application state @item talking.ml - contains all the dialogs for the user @end enumerate Another major structure used in the interface is the treeview, that is widely used by: @enumerate @item defects_interface.ml - the defect tab from which cables and ports can be tuned @item filesystem_history.ml - filesystem tab to choose the boot state for each machine @item network_details_interface.ml- network tab to tune every port and card addresses, MTU and netmask @item state.ml - manages almost the entire application state @item texts_interface.ml - tab showing the student assignement @end enumerate For other widget we prefered to use plain GTK+ to have more control: @enumerate @item ledgrid_manager.ml - shows a grid of led blinking at port activity @item progress_bar.ml - shows a progress bar for longer tasks @item splash.ml - starting Marionnet splash image @end enumerate @c marionnet.ml fa tutti i bindings di st @c talk about glade, gui.glade, gui.ml @section Main @marioimage{main, Main marionnet window with network graph, 12cm} In the part 1 of the main window, we find all the devices available to build our network; clicking on the icon present us a menu allowing to add, remove, modify the properties of a device depending of its kind; this is likely the first place where users will go and the one they will be more familiar with.@sp 1 @marioimage{menu, device management menu, 4cm} @sp 1 Part 2 is the graph of the network, obtained thanks to Dot, that show us the current layout and any further modification, this is very useful to 'materialize' to the user the subject he is dealing with; it worths noting some nice particulars: machine running and idle have different icons (monitor blu or grey); crossover and straight cables have different colours; cables disconnected have different colour too.@* @marioimage{details, Details of dot graph, 6cm} @sp 1 Very important is the possibility to add labels to every device, thus making the graph more readable and expressive: this comes very handy for both students and teachers as it help to disinguish between devices of the same kind, plus add more information e.g. Main router, Web server etc.@* Part 3 is called graph palette and allows to tune some Dot variable to help making the graph more readable, it is very unlikely that a user will use this but sometime it can be necessary. Configurable variables are (top to bottom): @enumerate @item icons size, @item randomly arrange nodes, @item default node arrangement, @item design arcs top down, @item design arcs right left, @item arcs lenght, @item reverse an arc of choice, @item distance from nodes and labels, @item image size, @end enumerate @anchor{GUI-Dot} @c DOT graph: always up-to-date, best representation of the network, Part 4 contains the big buttons to play with what we've just created, we can startup or stop the whole network or shutdown it, that is the equivalent of powering off everything. In the case of a startup, Marionnet will spawn all the necessary processes and soon many ledgrid and terminal emulator will pop up as in figure TODO. In the case of a shutdown the machines will start a normal shutdown process and the other processes will be terminated as we say 'gracefully'. Finally the shutdown is just like pulling the power cord of the entire network off, immediatelly killing every process. @* Note: in case of an incorrect choice of cable crossoverness no warning will be displayed, the link won't simply work as it appends in real world. @marioimage{simpledialogs, Example of use of simpledialogs: saving project on exit?, 2.5cm} @section Network details @marioimage{network_details, Ports and cards settings tab, 9cm} Network details is the interface aimed at configuring devices interfaces for both routers (port#) and machines (eth#). The configurable options that will probably be the most used are IPv4 address, netmask and broadcast address while in case of a IPv6 network we just need to set the address. Additionally we can also set a proper MTU, this can be very useful to study TCP fragmenting properties.@* Of course, at startup this settings will be passed to the UML instances (remember router are UML machines + quagga) that will have their interfaces already configured. @section Defects interface @anchor{GUI-defects} @marioimage{defects, Cables and ports defects tab, 9cm} The defects interface will be most useful to study the behaviour of each TCP/IP layer in case of errors, both single and in burst, an experience that is almost impossible in reality or when it occurs is always to make trouble during an exam!@* User can choose whether the defect should be inward or outward the interface and the kind of malfunction desired: packets loss, packets duplication, flipped bits, max/min delay; of course all the controls are given as percent and then randomly generated.@* @section Disks history interface @anchor{GUI-disk} @marioimage{filesystem_history, Disks history tab, 9cm} The 'Disk' tab is an interface based on a treeview widget allowing to easily navigate in the filesystem history displayed as a forest, showing which state is derived from which other state for each machine and router, allowing to delete uninter- esting states, to add textual comments and to boot a device from any saved state.@* This allows to make incremental modification and verify the different behaviour of the network after each one, a very interesting possibilities also for network managers. @c @marioimage{history-screenshot, Filesystem history interface} @section Assignement interface @c TODO add screenshot The tab 'Assignement' is indended for distributing documentation and exercises to students; they can list available documents (text, dvi, pdf, html are supported) and read them with the default system programs. This can be particularly useful in an exam context to distribute assignements to each student. @section Led grid @anchor{Ledgrid} @sp 2 @marioimage{ledgrid, Led grid for Hub Switch and Router, 3cm} Once the network is started, machines will show their prompt so that the user can start to interact, for what concern network devices such as hubs, switches and router we tryed to emulete as close as possible reality, providing a small blinking led grid. The blinking is non-fictional, for every packet that hit the device ports a blink will appear, making it really useful for immediate feedback on network behaviour, as a matter of fact, it proved to be one of users most useful tool. To distinguish the kind of device and if it is on we chose different led colors and added another little on/off led in the graph icons. @section Progress bar @anchor{progressbar} @sp 2 @marioimage{progress_bar, Progress bar during network startup, 2.5cm} Due to the heavy workload of some operations Marionnet could seem to hang, for example at startup of the network, for this reason we implemented the classic progress bar that ensure the user some work is being done (without the promise of ending soon). @sp 1 This should be extended also to save/load project because the compressing process tend to be very long @pxref{Project file}. @section Terminal @sp 2 @marioimage{machine, Machine terminal waiting for login, 6cm} When a machine boot up, its terminal (xterm) pop up showing the boot process and then wait for root login, we did't feel the need for any other user considering that this is a secure sandbox for any kind of experiments.@* Practically the only “customization” we needed consisted in displaying the virtual machine name on the window title bar, to enable users to recognize which console belongs to which machine (essential when working with more than 3). This was achieved “in software” by making the GNU/Linux system running on virtual machines print a string with XTerm terminal control sequences at startup. @c TODO @c talk about dotoptions @anchor{X-support} @c something in Mariokit.MSys @c theacer releted stuff: assignment, report of exam mode [see UML section], @c disabled gui stuff: serial cable, broadcast @c talking.ml, simple_dialogs.ml @node Datastructures @chapter Datastructures @cindex Datastructures The forest data structure is an algebraic polymorphic data type, used for implementing the data structures displayed in the filesystem history and defects GUI.@sp 1 @code{type ’a forest = Empty @* | NonEmpty of ’a * @* (* first tree root *) @* (’a forest) * (* first tree subtrees *) @* (’a forest);; (* other trees *)} @sp 1 Forests are easy to manipulate in a purely functional style, and we rely on higher order for many operations. Forests are saved into Marionnet project files using OCaml mar- shaling support. @c treeview.ml, forest.ml Xforest state??? graph.ml(usato solo da task_runner.ml) @c treeview used for filesystem_history, network_details_interface, defects_interface, texts_interface @node Options @chapter Options @cindex Options @c Marionnet options management: global_options.ml, initialization.ml marionnet.conf @node Daemon @chapter Daemon @cindex Daemon First versions of Marionnet needed super user privilege to run because they needed to create tap interfaces. To avoid this security risk all super user actions are now performed by a small daemon that is now the only Marionnet part that must be runned as root.@* The daemon, defined in @mariourl{Marionnet-daemon,marionnet-daemon.ml}, is connected to the @mariourl{Daemon_client,Marionnet client}, through a socket and they communicate with a specific language defined in the file @mariourl{Daemon_language,daemon_language.ml}.@* With this mechanism we ensure that the smallest possible amount of code is executed as root.@sp 1 To correctly run Marionnet:@* @code{~$ sudo marionnet-daemon.byte &} @* @code{~$ marionnet.byte} @c needed for graphics on virtual machines and host sockets @c marionnet_daemon.ml, daemon_client.ml, daemon_language.ml, daemon_parameter.ml node Exam-mode @chapter Exam mode @cindex Exam mode In order to help teachers to judge the work of each student, an exam mode is provided with Maionnet, if this option is enabled, several information regarding the machine will be saved. The most interesting thing is the possibility to save the bash history of each student thus being able to see how he worked step by step: altough this could seem excessive it may come handy in some situations.@* To implement the exam mode, we simply invoke UML with the parameter exam=1; the GNU/Linux distributions we provide are modified to check at shutdown time whether exam is bound in @code{/proc/cmdline} and, if that is the case, to run the analysis @marioscript{TODOmarionnet_grab_config, script} that save the root .bashrc and an html copy of the report. To enter exam mode use Marionnet (only) command line option: @code{$ marionnet.byte --exam} @node Project file @chapter Project file @cindex Project file Standard Marionnet files are extended as .mar and inside are simple compressed GNU tar archive.@* As you know, Marionnet saves machine filesystem using sparse file in order to save disk space, so the host filesystem is supposed to support this feature. This could not be the case, when we want to move our Maionnet file .mar to another machine, so the tar may contain sparse files without wasting space and without being sparse themselves, hence they are safe to copy to any filesystem.@* Thanks to sparse file and compression Marionnet is able to save entire filesystem in just few MB, in our tests an average of 3~5 MB, of course the more you modify each machine the bigger the file will be.@* The format has been very carefully designed to be back- and forward-compatible: newer versions of Marionnet can read project saved by older versions and vice-versa: when Marionnet finds some information which it doesn’t “under- stand”, the system simply ignores it. If instead some needed field is lacking then a default value is generated.@sp 1 If you note that Marionnet hangs during saving of project, this is due to the gzip compression process, some user suggested to introduce a GUI widget (progress_bar?) to suggest that the program is just working. @c TODO How it works, back-forward-compatibility @c @mariourl{code_METHODState.globalState.save_project.html, save with simple tar command} @node Build system @appendix Build system @cindex Build system The project is built using Ocamlbuild, a tool automating the compilation of OCaml projects with minimal user input, but much work, that worth attention, is also done in the Makefile.@* The Makefile is an effort to generalize as much as possible the compilation process needed by an OCaml project, as a result it is possible to make it fit your needs by simply configuring the Makefile.local; this file adds some target to specialize the compilation.@* Many information are extracted from files like META and CONFIGME and then used as variable, for example is possible to define installation paths from CONFIGME. @c machine generated files: gui.ml, meta.ml, myocamlbuild.ml, version.ml @c Makefile Makefile.local @node I18n @appendix I18n @cindex I18n Recent effort has been put into Marionnet internationalization because, as of now, a french only interface is available. The goal is to have a default english Marionnet interface and then being able to localize it depending on the system configuration.@* To achieve this we chose to use GNU Gettext technology that is widely used, stable, well documented and, despite its original version is in C, an ocaml library is also available. The library is called Ocaml Gettext, is developed by Sylvain Le Gall, and present differet oprions: it can act simply as a wrapper to Gettext or it can use its own functional implementation of Gettext, called Camomille; under Le Gall advice we chose the functional way.@sp 1 To use Gettext it is necessary to apply the functions s_ and f_ to every string in the code we'd like to translate, the first for regular strings, the latter for strings with formatting characters. This allows to have minor impact on the code and is a fast and easy process. Code sample: @sp 1 @code{ Simple_dialogs.error @* "Invalid directory" @* "Choose a directory existing, modifiable and hosted @* on a filesystem that support sparse files"} @sp 1 @code{ Simple_dialogs.error @* (s_ "Invalid directory") @* (s_ "Choose a directory existing, modifiable and hosted @* on a filesystem that support sparse files")} @sp 1 As you can see it is very clear and readable, moreover parentesis isn't always necessary.@sp 1 Once the code is ready it is necessary to initialise Ocaml Gettext, operation that is done in the module @mariourl{Marionnet_gettext, marionnet_gettext}, now the code is ready to be translated.@* In order to provide Gettext with the strings translated into varios language, we must create several .po files containing the original english strings as identifiers and the relative translated strings that will be eventually substituted; this process can be automated by simply extracting every string in every source file, once again ocaml-gettext can help: @sp 1 @command{~$ ocaml-gettext --action extract *.ml} @sp 1 now we have a .pot file, that is a .po template, that contain nothing but english strings. At this point every translator is supposed to fill the .pot file to create a .po for its own language, graphical tools for both Gnome and KDE can help the translation and note that only basic informatic skills are required to participate in the translation.@* Once the .po are ready they must be compiled into .mo: @sp 1 @code{~$ ocaml-gettext --action compile fr.po} @sp 1 and installed: @sp 1 @code{~$ ocaml-gettext --action install --install-textdomain marionnet --install-destdir ./po *.mo} @sp 1 After installation a number of directories will be created under po/, one for each language, and they will be the source for gettext to find the right string translation.@* All this operation are automatically executed by the Makefile.local so during translation only the files .po are to be taken care of. @sp 1 When Marionnet is launched it will look for the system variable LANG (this may change in other distributions) and depending on his value ocaml-gettext will pick up the right language to display the application. @c how works po/ Makefile or how is integrated into documentation, ?? @node Darcs @appendix Darcs @cindex Darcs Darcs is a distributed revision control system by David Roundy, supporting both ssh and html access, written in the functional language Haskell. Currently we use version 2 of the software that will be soon packaged for the major distribution, more information can be found at @code{http://darcs.net}.@sp 1 Marionnet server is located at @code{marionnet.org} and you can get a fresh copy of the sources throught http with the command:@* @code{~$ darcs get http://darcs.marionnet.org/repos/marionnet}@* and maintain it up to date by pulling new changes (all commands from now on are supposed to be used from within the repository directory):@* @code{~$ darcs pull}@* You can then start to make changes and experiment with the program; to use darcs to keep track of your changes you must record them: @* to record changes on existing files use:@* @code{~$ darcs records}@* to record changes on new file mario.ml you must first add it:@* @code{~$ darcs add mario.ml}@* and then you can use the previous command. During the recording you will be prompted for some info, expecially relevant is the patch desription, than will later remind you briefly what you were doing.@* Once you got your patch ready you can push it to the main server by issuing:@* @code{~$ darcs push darcs@@darcs.marionnet.org:repos/myrepo}@* of course you must have write permission to myrepo, in Marionnet case you just need to contact the developers. @node Licence @appendix Licence @cindex Licence Marionnet is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.@sp 1 Marionnet is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.@sp 4 This documentation is part of Marionnet, a virtual network laboratory,@* Copyright (c) 2008 Marco Stronati @* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. For more information see http://www.gnu.org/licenses. @c The end segment contains commands for generating an index in a node and unnumbered chapter of its own. @node Index @unnumbered Index @c decide which type of index to print, are alphabetically ordered. @printindex cp @c marks the end of the document. @bye marionnet-0.90.6+bzr434.orig/doc-src/macros.texi0000600000175000017500000000127512167200764020300 0ustar lucaslucas@c Included in documentation.texi @c Path to external files: images, script, ocamldoc @c We are supposed to work inside marionnet/doc-src/ @c TODO add @iftex clause to avoid link to ocamldoc in the pdf, they are useless... @c url to ocamldoc @macro mariourl{myurl,description} @url{../_build/marionnet.docdir/\myurl\.html,\description\} @end macro @c url to scripts used in virtual machine @macro marioscript{myscript,description} @url{../virtual-machine/\myscript\,\description\} @end macro @c image in the directory img/ in a nice float with caption @macro marioimage{myimage,description,height} @float Figure,\myimage\ @image{./img/\myimage\,,\height\} \description\ @end float @sp 1 @end macro marionnet-0.90.6+bzr434.orig/doc-src/img/0000700000175000017500000000000012167200764016666 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/doc-src/img/machine.png0000600000175000017500000003515412167200764021012 0ustar lucaslucasPNG  IHDRZ:LsRGBbKGD pHYs  tIME hJtEXtCommentCreated with GIMPW IDATxy^UϷ}.˶dɖXv6$Y ,3b@@ LM 0LAMPS I$8&c '$'Nbǒwy-k-{~W~ӧt>Ϳ~Xv^}1n\>F#-B@XMD䲝}L1FhڕJĽdffFcdxϤ |F]? ;c0ҭ+*GG&NGFʗ_xJVo|jx<ЕKo,LnEoZ>tA yz r_|R.g?-푉{D&Oc#SXlw+r2r]~:y:g'ss{tZ/6:߼zkt2#UoC}78s6nw/3vuo>!>"v[mF{n\3Oe@ ~YV_r se؊lY}jԷ>' A|}W;>=1*9rŏˣ2x@DDg GJg6~ȫotkc OH{x΍nYiGԳuOnc/(9vf;"ztZ"s}Ffo#sm?"cӍQ5p_F+vߊ7i[߻s0@R^fh9~ddrdKY:$G^%3'n)[׍MxU-?qy+V浣idSʭ_~Vx#tWm|#}Z?gюM3qzHZ<;{J=e3G_r77}?OpjY5ޕO-/ʻtPDDv?}Tny_w3Ke۶-Gd-WY^z~>- "[Ӳc]KeVʙpl8.k&DDdĐ;H%]jO7dѯZ29֕yΕѡ uZrWm޼CΙngΐ~o<P[{/ /B75#2]J{׬;q$ WWUK} +m"^ܿwo}K?/V/-?\|:wG=|^yߟݾ7[է$[йg!*/ԩrIYsdvvpI$s{f7-P]_]מ}'K6_> ^|ʳ; crwE)/$^9yjNްk(G=%34~JۑS/7 Wmy ?z?n'kꝛ7R[V{.džՓУHӖ3'd̨\2~WY;5&\8%""|Q>ՇdxVyW[Ddċb.Gv2g۾;}}4<'c]?#g#SK۫{BNOtW{'^6Nk.9Ok. 嵗m;v[^yi'gK;$׳_姵_|9_ ^urXKFW_(""r[oLoB:xR_ڒ/UwBwB9y߇&IY8u,/{MHq[n*N[sLry>ӆ7eՑkU4lwv߳?K]Oßi}廤=2!#ˉW$LLL?|,ny.$:m~F-S2 ;e~aAv]z\ctK_𘴇G5ŧ˧GdaY8}9pXn،<jx1?6+ s'w gdqQsV @iH{xL6]y~qYX9ydIvYٲvX޹YMI%ϗ|@Ʀ7caqQ:#V#""/gO޶kCW_9d[fVzUjXy~z[hlw[e}U?R\\Xγ_W}Q>Ĺ2yŵ/+pgȳO\ZÇsֆ˼C7M,m;2)_zh^ڼYZaiZf'Z:LgNp-׎ɕfM 7 S+aߴ<&vWdqA>&'ɚVǟ\FWm *>{5~7v-""(;!ÓkJgh4Ja0ӲN*;v%ͧ@}D>vE1™ƑgG[O~\ΰ]Ά7o۷ȑ#Gdn^эҙ\﹚^2+QN/=8+|ȸF=4,jǿ\/ruʭ;wUg_>zB_tgDZmy &E—O>. 2DP9L9r2:]g˥=4*nGjUj;G屯[Zg?T\|F`0cy=Z>{`}ZO#7x8&?wV>yYڲE; g>绻l9/,V+3~7^$Qi6FϮK#ckجtHiw|[X#id|24foM Dڝ!M7~%2|ViKՖ3wƤ3:TrgdiIg;1U KPBU*ۙI;#2~řol6w'VKwĦW83<& Je1Hա*뙏H^/?wjy%%cS+Hu+7-/饃K 閜:[5+Fԑ߼Tu IH@FzW/Zh iE 9,˰wHWb1gM@vQ^ӛN$7HЕvX|.i|Y9` u߇JWF߻M;yP#mk{1}(C1+zߦ1Kw1b{Aފ8Wca~^y\k]lwA9d!+r4V-@3!@twqSNQ%k]h,R(b68< / 6?0MрdL>v}m~%IO4pHg nѠb]T>7k}me_wR @s[1#]d\k 5?vl 8٤Cv@@t@WUUVO-IA%2WWWlo[VU727׶98[Idsoi:XdZ \aJIY!}6!IO4eCW?5\[nED1P4@h ќP`tiK@AEO7t[]TxQ:ZГ*,>:HUIѩBoam -W}ŌDWX% w`6U良з@*gd2:nl}ͧ*}KMϫHғTʋ5k51y(O]A7HcY Xŷy.5=Aoi٪mX&yQ 횞F۴l>p9*$-?o)3nA&|䋞oiP_@OXIk}ڛIEz \r7ZM U]wi*z^ӺBV}/e.EѪor+i GZp|&٤*;"lwyZmwӘGzSVm E* &ߓvtMQ~=N?m>/Z¦]?O2 7 #]|ưi;hGAZ! ؞y( .+Y@67 #]|0)M [;8vK~c<-{D7oevf`>/q |b3oHKneַ]UlW mR,G~g Eֶ >|4+ qݵ`~gz_/dU~^]ЙǤSQh}+7EZyOu >2f @5.eӏ|%p Ј@{S?@oG >֗tQ>@}I6F3+@j}V`(uu F,3埽޻gy+{Y:Oǵ)*<1O7oUCsW(7+KW#g2lE(09+2LpuXYqV Ht%]CsW(jbMF#Cs(  t\p*B{7\MSH[v+ZMH){: )31]k:Gq!jӼ6Au/H(jJ]2@$~Xe{O@c8:TeD?)qw;(&V`5 YtlF f7*y4P72oJ(ѦUF)mQ9]bkG+_=6BS6iӯ]632)҈]~Sy9\سҰgQʕr?Z}ʵTkuQn*U&II6[9| Z}!}*98?|cvre&lZ(\rR !twR|, dVy%\k}ٵyI\V)>h{Lhc童etXrjowel+ Q@#]0Ǧ<ufo(_={?s-V?-Zhc>ީ)ݴ~ʸeQxH'W}2!TKo7Ewmj6䈭p)/UPDO\A30ʘ2mwϮs|ksOH{U4涴i鉬*Rs'*ʉoMҷ'\p"[T[Lc˧Q+颀 _`v벚FWߪ2U/1eʷ^:3.z^ebRLtljSyk}CԷ9>v1k+]S3@,aǞEnhmovqPZr@з2W>e6ھs|=ƖOeߤm!ۘ++$Z+613^خc<9h K9q[OZexLHFP3ߘҎ зA׷* '5@Ӟt cU9/"ɽ@ BdoHG;P~.ʯ%m.DH`G;ly2sxUXG~bVͬHb8Ϛ/o.69ɚU/ v#bʧn/} Yik@Z X>[>=Gbǵ\ڴlYYd qAT?2 9Urv`%]/\NW*]gZ3S*f9(cjjWOlia]Uބ_tUt&ɧBl쫉UӴ[Ҕq,/0LSVxYG+.ohi5~l1e;˷">md⭬JYy(Ԍx5hiIDATqyթrZ8oM40U/Ah`oeT7AwL9s]vǴ&ohNe˫t3}g U-K^UyL4i)캜Z50PI-Gj+{?*|_\۬2ˮKe˳j D#@f Y]ƫ1&f.'oGqXV*UNP4(S.*AY"@oZZBF@^A3 z<$@HH Sz:)8c: #7Vxg&( TUgyq#80A4g" @+X ezJOC!c~gS:mPX ,p"FCp?zZn֚8tb 2'^o)$!JOſ37^v춰1 udCV ]W_|K}|l菿)h*e֭RqA+`Ck~#"1y k{^?:sM{%1)\ }]~ZLy($Tcl]Kӭ&3PWncH8q {{"!* H6i:PfeѤZ-仸!@,ZGus^Y<*3R1 ?ZBB^Olђ!77xѤB7!Bӄ$p-Y4\s?Z"*Cg!*BʠX"6 kyb?wsY!$`L*$qp7O`F(rp_0{њ`{VQ*yʞ S_Vf{Ǥ6$l*fؾ65_=*pEQ=bn"ɸ ؐj`"eF1mNeML#뽼&ftњV a[ߢ2j-F~yʡ_g*WhOx4u8$qDMFZRJPE-0e4=)l9)2VVҖBL9|߫M ob-PuCY?Trp,t3f`A1@!bڍѵ_,O^u(OmS{dM,4~8n| Vn,5)ܜ7lʀ1}mߢr6P풂n[P4[^/@C*Hm| etpV>%"/2ֵkfDlnSe5|&ޟl̇U@tJVXKnxt]ӌlF# K)cruZդtw2ZY?|h%p")9'V +<ۭ[{HIA`]NFIJ# V ##ZWp׶'m@ -]uNuۭH{]Q\؁uaNek0 #a8Z<05J6b} l4֥}Y%CcI|H+ր?DZ0 +&wHx@-?[ђ[l9gǴ}nѪ ᕴiR tk瘫꥕f [ccÛW/Mm }_FtIvLo3j;j79wq|#714@l;lB"2jG;Pky\=#]#p^N4}Q 4F4 `G$ J: M34F ʟ@ 5EL\r½.CHm$C bnVZHHg9sP("*ԷYe}&:z;lwJg'h0q^0#m}>Y^"CUUw\˒?FDb6]j4-A$cE>ueYV'T9˓?F ᕴMHF|lwe(2u  #7p 4`L?h{p h`0X#9l?YgS9ӃXix -S$gM^L\g/k!3X zͶZuucWVj] ~ʔm09UvKjMU(wjr yr15ypsY g듾Ơlڒ5= (˘mˬo~TiP2YZo=O͈.U,-9],{j*[I} dp 8hĔnww[.LߘC^T/̓cFLH6}k@ s@Z*U<2Ɋ%7ma 9# iSmQXF0X6lS=zYvpx%q'OUȁhvtu/0UT Zi99%1Q!kpf}mYdP-O{=LJ7$i)rY5`Tj˔~V^Eom I0V U6~Wc0ҕJbذ5>; e)HB B%mQ9._qY_6VeȲ)HBt@u&K@ aݷ+k# qOf5-Z.ү*M: )}{ 8|-(@d0ft30O3B;"^ȩ +g) *V0]ӱz0%}gV<ֹ_t]:tSSJc^J*X4o7=7cSW`҇^τ%ﰡmh֘,Yω#v Lҩj:5}]VU 7H=7"'$\V|&9kMb\rT~uIEg#l/Cvq]WJ\FQs5]դuvlSjjwوSVy\1,@ԟ*Nc䛷#N䖚QKqi|s=m듧!*ekjSmx'v)+j `E߬}:OSlQ"ͺ2spI_+MNJڦ6\T<}qCڷX#]4h{_VUGk Zj_5z[WUS짐>]v1 S̲Qmն~>;R.yWAP#X6XJ\2CA6v6jwiGHtc}Nev؁|X `NԾ>V剩>ۿui_3Ү:2]I:}&k'FTl_j:tZM}p1N˓8_I}}7MF1>!ʈt5pT- .UoYu'X*ۗ-uIr6IĖ Y8C nV:XbsjU݋YE`oumN2N w PIU SO}c`9K ʐ5*kYew4Sۅ#f70!S&_*1eozg`k}c FѢ\#zuiLN'|O8z*Y#}rx;TTUor= XIl;O2y_Nn7eBq5>hoG:{o9SqV.i@X5) lGOnAm jnS\6~w;5v}>(E׭*ѮM]#< *(#Zэļo'Obꁆ-#Ѕd6LH@tF]뛠 Ū7u-O}/˷|l9Foր̉AS Q"#0u ]ow0h$wO7iLc\V˲dV#6lV{ibK6e]n1?4;w9LU>8tWZ Eѫb59.Hnw!*xŜ$PXI+,#wo2=Ș)Ӡ`}Zjk Ķ M0^A>ɭcʮ*_ds&`2WGUk+ @>T~p,/r6dZ׿s] ״Qߐ F6İ+i̠]qr HU/!eM֊Dj#c@~7=++V S:> \ꛗV ȓ˷(Xmh H,ݦc# ii74@OwܩwK2FtWǵO`(XIwo*4Ү)Xf(XI5LNG4@tvqL1iH`# 4`0HF# iH` nZgaN,_Se[uRJ'=LUOdjnWܩc Vk,c b[n Б,F t] F>˃X ԇvm; 5@CiM:̡HAT׬.E-g>ؾoz/<>^P/!yaz{D-r(<}䜗Mg]߬}%"}ynh ֜ 1Tﲚ֚j}_X=1Ei#7 F:ZMF:w_ ?شa[YV3*K:y;UAI1!ⳍ[`㴭oZ(ʧIRQLjYQ9ګh"+M!{e[]zWdY2)JH:O\]LhM})ZG Thohyt\*Su-im_Ii3H'yGP# i/HC?^HF# i4`# 4F06j)3AXI@݌iWUjơetC >Ftp;ϗ7=-)UO[zq:jZ%;tL%epMJHg_Z\\|a3MyeH'6ye@@JǠV.6CANJVսߴ :)M:r@VҦk5m_jdCVսli{V:tAz^7>ΥyզM͙Fs?3;v wyy۶megܹ/V_xqIIzZt:G?<̦M,Xϙ3'r饗o{^yB]wݥwI@.cx<N.];~?d2G?R.,g^%D̙3 /~ J(׮]ԃ>jjjZdyڜ0aꪒ}YJ)!t֭[Uru$RGRckkkU~y^'ջ,tkp2qw3&=ـ2j[nժBSJ?޷z+===++Kz^_^^{^{t(C!++kǎnԩS?'d !dX<|"md0f'NldӦMΎQyǵ}wz>l2 ==} /`0)ڐdGp]wEw3Dىs>r^ZEV |GW_}uQggm:;;m6۲e˴8۟ &= # #0a0 IHLz FH 0>s`L##!!Ͷ`AnO/Icpxͷ|%^Χ|qa.nw$څ0͂ $ڋâlF8XB0aØM SJCPCtvYcLz 0P P#Nf~͚JhaJ̘($px̂E=YUP‹gyd !5^oO1aBDs!.W5ibZSSSu0a0I{[[MMMFflQc4=~pTTVNS*p#)bӤ>@soLzX1I$~gU֬E=Y*GD$UWE!װ.BxK30a2(ꫨ^y?{Q#bi>}`0 |\k,.WNNfZzT;6E0ahX6R&E 3sXe&@#4khoHu aT@'IbZfA[{3-E= ƌ@MPpDW] |VEhД Ѐ\"###|eAFIcB"\TRFTQMQ %Y];9h&1{x`:\3mcM@fV}#CP6+]TT-`Ø(m'*ksJo TL}xA()|Fz"ST:I1#a@OPQm t]h`j3C)b!P@QCm̙c4T}0fAA83C@ oAxO[kAo5JDl1>}|>cFO=qtJ*@[3pvKl$[2IcvB=(DVY4yG]9xF^fNי0fڈW85gW*Ĵ4g{"cevmEÑpџ-`Øh!BwQЀqQ2 I|(P0K.X~둋A4I fЌҪ >ӱ_(Ҧ-ΰ4r&=8[G؂Lk*.,ɲ7< <YX}sc &=YǃocD,B|qM(ٜ:;<^㦄2M6h4:RSz}xĽK LzU$4qstAM%Q jb竭9U_PHxN^>`NʘIc6A*"B}bQ 3x֐ᐿca.Yyiբn5fbfdf7aØU܉ ;1C+:Ѻ3, U-5yȄx>?D(jyNdi$)YC&=ى"N'"ĕL*Gu<!q|s=|m=[2Cq~Z~na=b%Lz:4+舜ϫ;jJ˥jR{#xG`ɿ>(*HOH9\phBnW_o<Ǜ!caaAҡ"e1H1PP%3c4VZ>uӍ8!0 "+ca2b9a0f 1-t 3  ,^"A FVۅN~ EPCW p#9VBfR PgZ7c?4c08O`,5}DW*MCJ(h2xJcX*]]qs:xClp9ѥ46-0f7ѝ VW' IMŤx(';%!cQP37v/-I<0a `a%$b'T;54pNv81zCSs?(eu:aL B9Bz4 Aq*`ØY P8y(r04 @)a>Jy:!(R AdgRJ~8y#1Π 2xABB":KOOјcLzJmo<9X5*0qy흩YB)bn1[,O%GDAnEz ݍ x8qa,")9&2"blfzvef/(/Vk{gOtj ^fNkko t^%qxs8a!!P8,c fLzJAuLdYm t2^tiA 2'ND2F|0a0"1 y驾OC@MNOU7q ֆRexysF(!T)@ `'B&=ruvv"JHH?N땤9 \x{<>H)EDyac5 09 Xc(.!ܵg0gH +Om0[#2c8q[if.*{3l{E= FQR4-Ь5\8b v  dM&=aJ#+þG4 ji71Q%Lzzw]">[w鸪GE=H6H$.H>fUWH3a.XH$t4_}]}FNTop.`HPeL!>D pEM<0&cԃ$ cf 9"40&= #1~{|-]^mIES'_ga`u]o:-DD0a0&ê@Kwv'i`!H,a0&D $R}I&0~iwH>:1~z\>W,sXE9)0'fH>q+N2`$&= #0a0 IHLz F``00 2c$DQ|w`׮]7|s={\{?]ä ׻aÆzzznG}~_~6;%5Lz!KUUU7n{.x;s…֭|ުUV\Y^r[ohߓ |7nF 70o޼M6}O?]v}y]{[l+--U*|rc7|rΝ[lܶmKKK1 ,(t:`00x<B(++5˴Fs۟V{hK>Lϧm=D;2a`L7~r #tJrGZ-]u]-9/~iϑV`Ye Dmu[]=eŅ9mo:}dyeiߺz̫.V<^W|n͗>m|غ8706B##ä;.Be2wtpUJ4}|{6|<+s=>x䟖֞}0Ƕ-DmS/_۫|ƛ;=[?koB#vtc&3u%; S :{}YNȍ 0òlSm _=/c׏wGϴV9u<9sqEQŕ5{6C]s-i);-t˽,lDI&ƏwgqO4iWj37+nVna =ۓnyҊ‡v.BhtZt%Uk/-:,"='Â\8ŹLey6*GOeZBPPRhhwȰζf/fXx,rBݥ 2?;(/]~cG:{K30Fi|Kwj]R=4c^;q-:߽rl;_t˙VzդaGxwkѥNuJGE)ty 'ݢ/ R,p*D{9I&9., F(V; ɴr9 noh642LzH[>&X`$&= #0a0 IHLz F``00`$&= #0a0 IHLz F``00`$&= #0a0 IHLz F``00d(,BoBdYfncٳgk<ʥ,˿+O>q5{Nw3>0Kذ!ӽ3g  lc I3&= f͗D{1a`0ؤ_r`0&='O"Wf[nO>hG pEr̙7x?ю0q˲\SS M&SǏy楤lrq)**JKKuuu1CcR((̃[n%33>P V/ټysFFro|^W{w\rf/ IDATsU[ؼy۷*w17tS{{r'0͟|~ʕ%%%$QӹqƟ'z^iaɒ%qzfh\t阾9s}5?G];on`K|[ܵk4z7C M6=z_LOO]]]7Xx?>YFB^^^NNSO=U]]=33Sutt(嗷o㸅 AJi]]lذAmĉC)z>??nߺuc=&B^^^<n߾;lܸwq!=]]]۶}-?m˹̘{9'={PJ !ř&ڵK3<w;v(WNMMUJo[P# .`ܹ>\*1˖-pz)կ~>,|c0e"cN3<կ~UYɓwqnW ^xnvR)-\۷_^w]vء\_̙3W._~ŋWUUW]uz|n{`01SSS C[ʀtEEPԎU-BlrWFjnnV>z?𫯾dɒO?NT2 TTT:u*~ T3fA wK%燴qq$ӂb6wŋk/^\RR|.((袋^{7l7pX=g?ޱݚo,ю$S"=… =O}}}x*= qn tulbIê/Ix*{too'xСCG=8=1 8֮a~~v>N%'=?xD`Q?w0$ '=~?b.ʱc,4818!ަ|,fن[TT40~+yt!bc0^wO|h/v37K"RRYYY $9yiivld?{qzMM$E39Bjok˝3'5550k,IYY3Ywcl6,V [`|'M3SJN0t{|D) Ј:%ڛѦ1(C*؞ba#˲vM%cTJ5A!Dt@5Tšl ` A * JF(| Q fW efO`O[[[YYY__Zt:ꔃ$I{y9m^#~[t|(DcPJ)t`LQ1]U,Lz3?~xĝ롃]$ 17A3m*5(nݽH8l^k<1Q%ƭa+Fia]#EhP:+I]=MP =Rp]w?~\91YH1--Bgh3==dYjmiIu:cZrrF4-YD{@gpƐ^1[Qh# ɲS>aY-@,!F,A}{ t&KgH8L$IBf6WgS#Kb01D=WseBLeeVC1c8QFk@ `0كÄ>sMb01zUx3NeJe*T!IDe T[c:s\&S#O ]pdeei'Ag(eJauW%!CjM)!T(QI"D$H`@4-P#YQ֠E(%fۃ0x`G5#L(#D,SI" #J(zzQP9JQ (Md'n fVFFcPI"HDȲ'l8᭸YMyv& G#@*0"Od$6ϗhG^\p*tط~puЊ-ac &JT&Tg5f`0'RS#\J&M#L^:;;} IZC e/(*.NDS-6T\z.818$T,SBW^d2Q4H5)(=d21,ˇ8.;;RG!44u|N՛윜)z1uJare:011'c"T c>-:0{P HQF$Q L<``ғ\.0ơH@6Z jIZdI;"~ f3CNhVMᲘ2nCFDd6(Q-ٸ./(JlfdbiTϒ,CGF#-,INR6Q aP( eI,B!T&ޠD)U%Ix8B$IJlgPJi= @ erִj9}kdw42I"@dDИ7P&aS,-@-]ZFi1ijQB IpݥHiizVdRYV٬zjYC>Xm̬lbfee+ Z,nwL?"u#%_;˓r.5+-#*j!Z7l6rZr̭3(,IN11NGM&"I&Xo9"ZG%Q $I(ʲ $HdZ5Xp\f4JմsD93䃫>8M&d6mtɤ1f))$0'7Ȳ̝ksrrO̬,!$En:::fsVVVgGNj8{P7Yc!%+BE ǼQmXKm4QwTpn&QU)) ]]]}}~? *Ebw9̄'y_͋:#Eכc2ApZcZ68 9NA0ƄșY~/--t>Bb;Fl6|^#d6/gx=:K=4vfc4#\4 QJꫩa+jR!Xm)EEYY١PHy^[,V?{f:]0 t./F%# @A_y~b6L W)6>:x zAǣ ܮaJy~j$LO)?F;'|a,OVLš,j6L5Y!FaX6[cCqc&IO[STE[-285-8=*s{8aussA>Gf1f08SQ8gh)#ɰZU +):jHk6/"ݞXDŽ=z2j`2/[XhKΟ1 boy!M W0pV!sz>/qfYo0OB2HBh+Hzh2tBcpD'RN@&st>#<QyݴXYĘYe{8J\k77l(e$ ]}}2)zA7t%˕\T(ϥh"5P  vvbSRlY to܌D [r^_pkCz@D?Vǰjdv)E WE0P BɀTg*h@ytGbs;;[ݾТ|ժhTH ,c#L2>KC# wՖ": tp)P0NCYv&x\ŒF y~Qt9h0A.#g4mM8~aYlH93B<833#wQίuCx!ƴ4'ByØ1ORE4%֖{ȡnY-j !w?Du!jt]P㹐.! ɳikr=IɉH[ieJ?f`(BNS C 5]Gx@v9y=x޾?;>dio7#u:^B ^Oc?s}hc4+ʲ4 UGEVt*)d=rZ.#H7,uBsWAXن5yY.w(^qCLm]9Y^{-C/R96gtVcccaa|{p}eݭsE󭻾QVVy#)7ny=9s%/}>{TU-z<˟{ōO~jp֪^> .X,Y#VZ8yDV]JC) <۴~W onDƌRz(ߒ2+'/S:gHu !rw=ƈAt38o|)6K$ .¹P(bUuUt'_:h4*'k|b/t^\T\|A(**>p`%,啿?^xO{\iRFp,_"泖,]:\];wFjVͦG<63*Ԕ  % ؽR2Ө[~Q <xh ] 9`G !55ǔ)UV^߿敔(}+))-0+n:QeI_yHyeD?+n+,QziLh$.nfAH$z$F :]jjxЩ/ H`0819 :,5q"vPa_ J66')))=V}~c`dp=ؚ߳6mzZ5^nA׫Ԯ}݇뮻}~`2M&ٹsGcc5W_3¾<:/y_Zgyn7矻kkpœF=z!%5%5rlFh zqx3'?R(tǞ(nbϝy=][FFnikTĩC':0a1V&RY!JQ9*T&@}ef9kLΉ w9sk;:::;KϏF'jSSJ2!ʉZԟzIKJK:{LZZzvvδw7 E=DsSRR}WS{̈JHmNnn%%ܘEyqJ1JI&$O I2 yTQqFFFFFF1 ThK0%%fa٪ȻD?+ym IX1!y`0c87=4Zd2ǟ5qzO5_#LF pG0|Cc̶`L:|Q|x'.A) "1I9~LB9X]+< !ǩrDZcv:cܹs˖-J~@ѯqAbbX#(bmo8(@c(**lvsMG'㸡Q1L1J ^h{Hcz"cAcX,e?NwСJvIaL^7U$BkTDBHGqOK8bL&nhh(((H/ f X)yw{r< Þ.f0ĘDGnnѣG)=9i\䉬|CݘbM !鑍s\RUUn՚h_I|+Ǭ&+Wy\ER2T:1PSc/8Ѿ$8G\Dħ?vtF6j]X x>RzŘl0G]tJ9R'8Y8^xG,v!sSev`TTT8p4rsxs=7y;b3f/Zzl.,,#uƘسgk<p ?Gp߾'q={vƕ'N8g31ڻq8d r\>_y߼aCϟ?޽UceUUնmM gh`$5 .<-r޼y:رcLaFG=Jv 1?8KMM=8nDd*=J‹vdӧOBG/Μ93) gJb{;SQQQVVh8U_V_yJɇ[?8U_饗EWlG=gFx휊BIMYY_#錾t;cVlll|8юL-'=/RUUUyyƍ{ihhw ^;\pu|>{キjժ+W.Yd…۶m6'@UUUcccBIz230o޼Yl&Yn]__W_}-/Yb`o~mtҪnaڵV /'… {zzȔsґ#GBŋO>x;cǎJ:3jk3FLaacǎ(tyވ|,`F,`017o`kٙ03售cǎɲh_&&=1.5yܬ_jx.SQQ$d:tN:o膆> Gp}iKxٳgR`@,KQQp?{0I1)o^eN(ڵ`dx܈AcTVV띝ٴxg:]$J'|r)hZ322:::222=ZzDQܹsg[[N[bEVVx>裪SNuww-Yd޽ҹsX̙3^x}N8aZsrru:$I[nW^y_>7njkk?sJiYY9rn;??_{SD_ .]:o<ٳgΜKcÇ^({վl6[,QM&S$pz\sMSS̟?ٲe b]]]NNNtǏ~E)]vbC/^Ҳ~n7 :uqVKK춉61fg4Qs)$"R+$b_}{AШ AA|їjR6K$mܘfMyr8=dIٙ+E\O͕JT*EBՔ˗iIjFFF޾}HF}D"1;;;>>II=44y-2qnMe9////-----Q1ԓfEQdYONgbIhb|0 B( ]QҏL&~?0f\Rvժm6[HYd㸃}ACn0L oP$χ+6557DQ4L-z ÷ot:]*i&˗SSS޽3T yK42eYb}}T*fNh4&p8> d2n!dX,1yLhdr\T~l6jޗw2cl}rL$Ettt5E~+Nĩhɓ'ִ2pWFYl&IL!~ihP(<{lvv6H4Y$?<$ !T""6~fWFYJTt:J}o "SD"qzz'bX,F"^Ç ,! P(Ƀ::h͢U>s\,˞- IO4 @wz6FRT@2F1" 8RTO\Oz!?LH=.- yFʓ>HXېGʌ\E[˨^BaNwaYYQhډ]c ex!-CaXGQYleEژiߤ᪺@[1O :'33@4ʳ #QuÞ9 Y_}SdkhZ!(F"[W-"/15UV٨{_V;s o@6a !bњR[؞j% ](t,˺zzyefffff`HO7L$cgzRlG*Kd)WpЮ@W "D3M3*+Z~GjS hZ<7q]/mUP8֦`8Tn2w19'wN= CkYbXnQYPYZՒtVuPg|89:gܘI(STq"K%%9S(x5?P9$Ѣ'BzPJw sTEaS#jƶmښo頖1D15Q(5+5o;j\[5UVن.e9(M^;Xʎ%GsD\XTXTX̱cׯ_\\S!~*R&G 􄶓m[ /ABEi I*3vb (bo%DTGA=91reմ?I0iųYv䌖ѫ8 ~a['VP ʑL kZŦS@-p Jմ#)urVVQ6b)AӅ|BRr D9<I"_LFYF޾s'=55'/-$44**g,@S\rrrt:l~8":FKX4YXlUԑ>H%(yV##D;FH-+#llJkڈ2m8E _Z,j':6q ˪ #:O8N@P6t[)ζOKZ?k捖SXR 1+Z9; o@^qV֡(Doy.(ť'tj$ˆ -caxm-v9е0&Dʮ^5ey-t[)F8=|8 t> ΥZ8fRVBSggh"5Uչ#8n]vhG(9m+V;JKFmA0IVZ֋bъmB׭{7xFt_$!*+{"s:V%UDA^I,ȥ6_/Jǒ*.RZDVTPt*ڀаjQ#*3RnPfKXՕbTZ!1ŋTjjPFʜs%@6h7t/',ٖ״z>Ƥ-)[78ؚUc^{6itv8.-==4,488p99t˸׈}vTT9%GFJm.$cɌn ܸ;m_YnبѦM92$$ݻy󦆍OL,kV4N9OV#J9HKdۙlitMkqP͕v* Vl^w2MAz*Ԫi=0p鬬6mJi(qE|UWt"wFbM۬MMk# 똡(d ^!#Ď>(*B+z%ء(B%OTB~!#se@A,ZqI#-;N(-"T)%jk,DS @6xKRp*# 9T' &UnmZfc?+! CL:Xev~i,yؚ5Dku`Q\h -m~>>X\ -欬t
HTrr?0p5qtv>U#*4Z),~:ѣW~rS`+M&Ӱ!CG'vuʔ)^g1b;1Ȣŋv#''ĉ\sgBb9bd˖-S ]st:]Æ O+22Գp<1q鲥O.)1լ=x𐧟~{Ⱦ{7n,SSѓ{+RݫZO?iӦ쬬3f֬UKS;c|γfz7n=knR]փ:1Սau\xѯB2 :ȑnnx˗=z4'''22r]:w'cǖ.[z)!<ݩ*-" HJ:'پ}ɓ* e %3g/SݫZڄ N$&iSVVVLL3kĈ+.[z6)R'.n-[K?,GֺU+Q8󗗗W>զ͛g))w &f +qLLm`֬˗nO81ر7fee`Vm۶1aWܹѣ @Z53ݶu[vvօ  bgJ̤̕h!Fg)6 )1b3 IRl"%fV' dɒӑC8c8eOĔX?("F'*' 09JTVV [u>U`Y1A&e4Zm$YVed_XYb+" h!M }GP$!.i=B Оh!wIMut".!Ѯ UcE{uk;nͲ|REMg5+U_S J EYK[eA~j!`ScIPHf!X{ShvLz`}JTEO6_4,"0f'a,lhsSq!lҼq%F_FzbqQ}539|%OдISG2q3֮ݰ~,_<**Zr#232<ߘ8gJW^>^}vjcY[-];fÇ 'aCLLl'P]ree 5?M6]4Xvm9U}syѣG5jx_Y2yѣ>|)-=W\1{*U"VYpiS\R9zta 4ܸ__߹N4q9ݻuSN;e޽{[hZ?>|xuϯ͓mSliӮ[o~SN+W.[QƄ7~чyyӦ$%%A-q_| ?ÇkРM}||x⤉=z3g}tի˗ѨQ#yÆ?0//o:7=jԳv޲e+Za!9bxFweىoL1be[nMF80bƍ1|/lղ%_Z[ݻ9Yfk֬߰#dq\jb=t/lڷw G ޥs_ݱoO:u/a˗/X2!!֭[7kyxEf̀/;|,^n 4uzLj~WLCT[e6IgwPr خ3Gs?Ƴ՚.mJh9)ZGq~k+OE\{П,ȊJp-]j|j&D#fd?e Q PuQ[G謴 *۷CVHHhXt:!;s=#"?jxM736d߇/_U֊ W_=vƟ7F nnݪjTԖ5nw@:t0-9}ta6m|a֭g̙3/<;AakW*ƒoX,qquX={wq11 CZj֭j֪E_ GM({V)ݭb)VKQY*9C6yjj sjOR'ҥ+:M7-Xڒ\zEP[Qoڡ7$w&66ҥ3*A5"US@ϫJB+ *7oUEVͬ{\]5 lT >U%Wkem .V,%fc+ ,^^^[n 3? <[{n{ a !GљeXpb`'Q#s{3ɲ Ǒ@a+WkPpУO" @uƮsn: :vO?@TTTiii|EԨQVΞ ⋳IIMֳ͚@I6) <|/֭[v[6 mqP92x\2t:B]qtL*VM8:hz"K:LB8q$$4i4y{Ig~-;{hH^qssFDD˲tB]&b"~A-cbj zIg%ٳڴiÿ={,o{K^k"lC;55uᢅLOO!SG _wYZ@?DBIBdO):0`~b@X}AprgKТ\PgoPBv@(1tE 9*_6`ۖ |w*K/zQJ%ZR ?pP[E rDk AQkPˁt`0 8{Ja]MdcI8"4y0im-!?J"DڃRSףug<2IJZ^ۊ=WyM'Wkb̈́׼sFy]艱sngN^8WzW@jQQv M N&R.1C^%7 ɃW~}O/"2xymF"vIXR]XЙ:UCE۔{e ތ`!,tnIGK}}}-KÆ W:UETgl|:i*jaEЛhs͵TMߏlٮhMODU͈@ YDh/MʿfR&DNv@iw! Kӯ[PNo?Wb5-;M>K{RׅPB`/,eXB|,Ca?lXwB'ZKwQlUF.͵6(Kc|8Ö,!!oN{{gKrss[YeWWm-fr:?\/;8 Hڟ}}!YQ!!!k$bOaܽd!NŹF_4Aqչ]w| tM}0x>zFOl:'xR\\\p9>u=xb2:4p@[S;Xŋ &6?A=<<!b)PNBc?|cZlu=rȱcm۴ 6N> C uwwgk IߋA"ԉ;x8Bȅ .>T %0L|W6{ĉ /׭0 i !|c,>yZSF8u _eR#,A[YXaSAb8#gϊ/촹6b$B6ЇcXy,) uF7o: 9PVIEm3۶6n腜aVfϦ)-\Ak\R٨!=’ \й)~҂ӊ=10Z~@ +%X8 8$d̸ _.TR>tC fq6~E̤Mv>^^6 H}n\޻8#Ghႏ>˲ŋX1|D2dׇ 2o޼J*U^#--#G6lX/n> YYW^^z9?vXaa—KŹ5S;[E/^{pݺu=P_*N8n>}^~]y}}A9}TNw~ٳc_͖% Ww#B0Ɏ]V"A˂ĭ=ŲRJ3aV|!%>PntOq; G~ө*{"j4h{ IDAT zlUeVBҰQ>::zȐ!M$ Ǐa3v'͛;]v~IͧO>rH7;EIUV˖-7[,O?ݱC%%˖.kժm[._bرSO/.)Yl9\{ qqqR:t3{wڷo{xN H? j.Xؾ}%K'4nԩFֲRfH ђ*Wf)#P1(fᄥX"G!-DIeN@k2g8N( hBqR 1)) j,HwI>) T\l@N] V_.uh,PT ATem?hkR5R,Y>`yjk1AJMyi R:G]+PVgEgB_*3ԾYoam+80nn|DFj*TԚ0i @og@-7Jp{lBt\,pqTLyJ.n c^}+UA,熍6Q]eO]Z9N2vj`UuSAz1CɉicƱYb.vk BRՂ6A֤l ;+kg!^ok{a:aZXcl02OG "D-Mv`$ɈQpeO@@%ö(-vXCA#DD*njTQ̊|V[.ZH9n8;R E]KF g ya{ /"AFXweG}ZZ]e1!ҧ!J,,K̊~A5C9SoKσd?}x1:ac},BdnFlB76z1S!\Bg%dyHňSz(, 0B )| 9B-٤AAaa.䒒۷oKYvP`ٶ2vJ&‰SEKfȑ\]\ 2|fee^;++kܱfqF9~m]r'LSs+R&kVj\)",\*#-ڂ~[4?*2G#Mb ĺ䝮#È/dO':m4o)nIQOxT)umF5W)_ @E QejVk$Ք.{yo<{ʪaL+5܆NAlLGt'U-iKqБUsN톲^Dyֽ ڂOYXV)XslU7%P^'PYȆ)$Z*|d*_΃X)9P<%R:NJnښ7E0 sqEF#!ݝeSIQa#)8qխ]"ժFDV %ws*{,kHq.804r?H3/2h4Ӯ oT~B_B45 ^הUSR$Ћ=~Z8NWyku N ԹT}eŔ5;4}nR:NH?UC8IiyLژRI%  LԒࡵf ]C;R* Eבt=%Sc )<X{Ŵ"ZO+s5ƇN#l؀^h eN UzA p5}JC]US"X!4JX3#f #68l")#2Fb iOy_>(E*BHQQ|u:BcXlNY8k ;-U# E|B3dhN&AR-꠭@PcRb텴 y%SOC2Enϡ%Q g=lbϼ∶YD+Z*ZOǡFr5d7}\S}B3 Q'S'AETh-%!Q ҮwP\J6_,eb%R[a,2OYF~yJ-G铛"3ʆasdU) HE\J [L@Xs|I:‡[KWeĥ$=#V!,ۺ-ۺO0 0,eeЋ40 C)!ZaUڸ h yr|P].>t8!H-qe('*cu  LVvR-mf k'ä́efYB$U\m^yHR*yFUטt1I/r eCID -VaІjO.lU>Er)L'o,f~GR T[F; Gal$?:i[oC>΀ uGIA2/a_i}aď֋IGz #/v^Ȅ8t O J(}emvP &Q'ҋG?*l<$tBy3DV`H]ډ=mfW}E([6sUvrmi[aS_T:e6$(ʕPX$3z mT9:,ٲ-'ZZ쥄5Olـ3BZEWqTn(ln=einɞn%EH1!8\\ΈO>`7O&X'#efE89Bv(@ :3oʦpJץfh*ft'wL=}VX*v*aveJ(̄eʑ~*UZI)BqF((}hR  !DRXP@  T  LPa#  3A   6  8T  LPa#  3)MOZI[~nUm-or'`:û/0zCvYs<_WS5#N>:AAWQ׳2H\;-Ꜯ=7>J~U1yݖI^=f>zdj2AAcWKqܰǴU2[ eïkÇxӗߺ>hˮ |Uhm\ؽ˟65)ƽ̙VhAA k(ntv!LX2^6kjAz^Ro\@~&NKj   [Ղ\|s/+#+sKg?2wO6pg拉N85иnwg%)8:mS]{AE}nKmJ|gOԔ}W[n-ZsK;vUK+L^gc;.[+ة HNIv=r;PZ-)& ]>7SSo%E_^57_oW不ݹo Sp~Y*]V   *g1秜YG]O@эN)kI6#\Z{}r֔E3.mo6 V]MquB?BGAAr iQN;?mU!{~Ɯy:#8lז:17AAq WG6=㍣N g   N ۜyH0֊5h*OAN߂%uz+>5р]yNs AAq68r/F5li^$aߟ- \kt~OVSisgxv^޼όIXyktޘ)bCXqe:IJ\()O;|aU'9/{Ν϶T3ٜ@A_9%>}YW+e<[k:zos\9pi#үf=x gR2m&w|~˼SN4- bkpa}]MF/K}֢Ƽ|3ʪIOO]BI=zDIO[*RuޜжnӐ{GovX\{3e0LE;  VG]-B&gDGKg XJWHL!CbsN1)j:D _uIe go8n^u{%I;>n.:٬K=&7q)!@_7fT}2Z|zܤ?LR'ݿS>S70X;'ߑou q \:fΥjJ jFGGJ<|޶+qK盍C^4{Pdž౥]vu/4۹~Z 5]q"G,Bk|q)k-\˸'_]w5N /o7[-R(K^1OϿ{p+oM  (dmgb_f鳉;紼8{#Rta}SϻѼC/_|#  q\18r/4ƃD mnN8w3˱ IDATs rexFl)Jnx!S7zaMmy\wCEX<|\F$ً ^]ThA| =kv&>PB/n?u/ku{~YMU&Hޑ%i38O_xOv(:ݯ6"̨@!t/'tO^\Ok`ʸN|e3!JTo& oųCCLm{ ٦SM\~<6[ Ka6Wy /Sf }3AuM։6u$ ['W:h1G@oRѴJkx9-AA<& {!촤LXG'.Z[rɘy/^{'7 u5_v%;C1^2 .[fv Kɭ?|x~Q.xI_5\h] Ř{?3 \;uÎBeW .o=}p4&׫Gm7g\jθytWVzA:L9}YsƵ\ߨ@*%5z-篻֬e0',9r鲂㋚{/z.~FAцZکҥ]-"-zʏ.YUko~G͚ҮwT]ɏϚ2VYݨm^>dیGߟn-.~aߔL>>(s>gm^:o} K7PEGѫ!@}:KL0]ǰ:ϐZ-zj, HCwSHh6\4C0,>sH?#~/ Uas&#p7[҃UvjYMg r˽i'GAAM8Ua{Z~vSO8Ykg{|FN;݃>}_ҳd'=,HGY .ovm%yIc=g\D-xMpV3yx)|qk]8tP'ȥ0ڙ;64ޡvKFF]H7Ahxw'5htGdB#5i֮ߺ_-/vl|`qOq_^aVܲnLfl-0mL\FuHb錠zn$b}2=!.}2=A0 Ӿ/!q\IIIppիW]\*ىO6|,{wcQ.]@A䱠CaaWӦMQ^\WU^L&S@@@^^Ra;wG   1Dž+c AAA *lAAq&K?T   ȿTإ  6  8Qa R~,wtyǻg|. [U={]݂Z}t$ţ 62-1lAg 2KRqʚ.=9K'>MI+-h,{ZT vA TVcZX:Upl%}ƶږ~k?UɦuA?*lA';hdدwq\ڮ%;*.ŀswm+tm[Ԁ9Dz^/)cƲĘ1m"z}hlV̓h1-ن)叏7mFFnRLZC#LnA}??@A*T ƥs㛜tu:8lSM?WEnl9sD-WozVVVVVcܝ/?Ʉܹw}7ǁoָmo}).޽{q Ӣ>cq~J{5/?lyۻ+]yG3p`k&이Im,N5u7F!{z pCQ'Aھ=Ϭ*m ¶FJv ٯO\j0O7*85bOIEt7g{2"̥휳og? [dFۭzAv/ݛkW4׭ZI2.9jlʶyU=C<]\B|YUwۚb)5Hхwc{C\A!Pa#<<}Y$Y>7dX}OelI5ojc^;|v <~۳f˃Ev ѱ=W*7]U=}J-qk֚z ~~Po6$s#+׵*=ۄPԅy|ZÒςChbǒ;V1A 6 ȃZ^,7/>zjjC}}61۸3x+wR3W+W=_ԏɧYr丹4D/X{ԬBlh O~ɽOh>?`vT@,F0_Y}]¼| [5/AcG8/.[ At.xaқό92r]W_,;9|.~kH+ Pv1Maj8i{'/e%]>ͧ-j7'WTAAǎ;wtΝ;k׮?O_!W G:8!eR3U{vjʍ]Pa:5WGAA!77ww7n⋛7o:m ۞Y("~ӑS͋l,+l ρ.:ۨe/7|9#  %%%<{?G2t޿5BnIb;@<վIguԨKFݞmݟmܣsB uIxK³e%v\ƩwiL=HӿZD C+z\yZ"vFtr~v`Fy;eMZ+wMoґN耶Rʔ)SVQ-KQ!-*8TZKiiKiJ۴ͽKҤ# m&w{woO>qs^l{=tZwXڱ M7MMu<2oFpu!eV&]P/*ߏn32wpu5PGyd˖-$}Gg~cׯ_`kmloXnغBшE^>>n6޽=,u,i$'?>k4tꍒnC߶7?d}J_lJkƤCd}=6<1bߜr5ܩ+vleKks ܻ{ユߧT ]]+1qH\ܼíff.]#58Ί͹.Χ Oo%K9Ǝh"\kF^ջUF0 7'trMNN>cd9w)&7ԣn@iYqIQS/l3Nn΂ϔ?v{?z4%%99TJ}{ݳ[[Q0\ɿ.2vQQW{o?lmƌ_<6OZsj `ᑯ_Lxtn?]r".EEE3ⲤwG| xp&0 >{䆫ۄGG ԷG lha +CaAPrv~ĘkGFGGGu2zNYW/C^_GVw.tyCU_*}Ύ<&mi_p/_5Q]bZqnǒ_ο[TxtG?A@ ]7]p 6L6s_{xGyߋUųwl= Ñ6]o~y.wQᯌD[m[ŽWvT\CyU{n`|>9?kUQr|8)5Iׇlc0߾j g*|k~jP2}s; -ǂ]3T^1v;S’&M]X%@#lQB6B(",lZnXA˿o=n3ew2Znr}/N}}UFe;<#)'|n]O]5ܗMg]5/rV^}ԁ-o:hcTRGuh!m;^}G=3?<@:G寜x'!,w=KWM~rcb?Qa2~5cƏ>\ɔC{61kַ:Ug$} |=<\k5q)mu#]qPz틎u~';+w_̂p7I3۞Ʈ(B٧XZuw6;}uJ߹cV>i.9eA=ڜSՁh~+qM{&Y\ͪ3æ*Vw_U9ȿZoǍC?3[+Zk3xCf>{Qƅ 'ZIЪ@YH-oqSt=ss/n$~K9n 0R`Wт/~zpXfdO5f p/uuVgG[1ǵ*N?Ev}͹:5}X{eX%U[ub\f}/n~iUW?WF՗Nn^q,U[{Xeͻ X:yT w_U9>p.(9;[*Ilo!tvgz=P] D yj#@6m-* F:@ u[W@۞R%6?},l6m*gqщ^'-JNmK 5 ȦIn OjNyvozyk7%$HV.%r^SIK7޲?{ȖώoҶ9&ƤC-gYsհjw*]Df\f̪DcI_q{$O[ԥ#E nJB֤;{}K*ic?;ax1}/##;u[1}a9V;r玭xBOf}C۽P]vIѪA3qJDd*dmxs[iDT3ĭsUGҖ)/(MszV7ʅ (Jϵp;%  zj5HT_^i\Ð}Chk GF~/ǘePs^5gr]ew*J{s51]0k_䨝,oײǼ0&cEmw]2/ );w"'*m?p2Z]/%y|$&'OOƷ\ֺ𱭣[5f}X2zW~ayӰVjqdAW%q]Pu3]<~.j*ΕóeUdiǨvz_;oE ?):@d;@Jļk\>Q>Z'%W+ 眡JG U8(6F3猱bufyyyas^i{7k<&C^]f4VZ7e+2(W?CVSX'5_6Q xOHa bgw@ ' g_~$L{mxg^[B$;qqG]p'9/oZ ;[xlCR7tIe-V:Õϧ_!=nyC%C["e;S\]j8އ5E_[mr o_&b̧W;n99\ׇIqkÏ-_KSM`tyw ӹpJQ"rw8Y:ؿcT-eaTn@dРPuaezt*<>1Yg*=~R6?_LpDQϻ{FM z^3A{$]􀈴u۳'ka9ʹi5&JИg2ޣo̷Ѧw#i7myk9R'MkcPa1_o;%4u* j`UGh=vڣŷϪ vxvG0,c5dC >T~ߏa]Ӷ7/9/NlwCWNP"*\S;ϘS i(2ΫOq9އ5Þ{د&m0@4X8qJXK_XIZ~.jpliKתW5.̊qp\ܷ%Ť0Ay. Wvה\~+lKU op–{ Ya`>(%FN{9i֬ uyl߱9~[ssչQAEj~>)暷RS$_`:JbUdY58tND~lq_2fFE1;-K}`7Nj0p}-^{gg IyjM/(++H=1/TV}|%3n^ߧw*'~G2KxĦ_pVuO=34؏yK +?>[2C|pO#|5e ~ߴ'uf=X}2UN(y{; otꭗ`,+HMp mMrA_]|ݼc]x֬'kWN~W?6KxDu.&bIiOӶE9>p|9"_v ̆/;>ȭv->vqYQ!ujd+.~FiԴ00Ѕi dK}]-pؗ\+ulױ]l!ԚwoG?(Mc;&tع֮Q}gq[g繫?_Ռ:й}+û⺫hFő"E8T}왷~C:ujy>pN8Uғ>Mgo$lj-*8nHd|Gs?ƒYDNtvoJƿM=\6r?<ŻzGky?^wO7o)V{^m;tnWS7_džoʃrS{IÚa]|>燮ա%<|l+\jh~}.js~rQ2/P~GLl{ww䷲Yua{J V/\pd -fxt|`騃U:CU6k.g-&> uֵkh8֩sss=ڻw,_H.3U󽑖l ?Ughמ}H{ԁ*Ζ0Ȥ~_˝Xoqo_O D;@ݧOڙ h$:]c̼{ݽzڽ{w t-ZsgCp!槕h[f/l_:bB!95W'K:YId؛Cx4t:r&!.y[?ܰok冫!2ْpU>B-)*R/Aj !4PXlu:NZˏF:V':-C+a$)X av _4 ̒WHR\]48 L njͷyƺ ܩwM!4 !Tϖ63>5m}iwKn^+qIR,Zytij!k9gB e1a=Lْ\ ~ ZNQEPL*BZ1'r7G)II745O&^(l:E t-[Y_jYZI 1fN+ LB ?|ɛD!BZIjLqE(PV氅PF7CJ=%7uJNrG05–\aeѤ`Y D!BHeFj5 Lqd\BQ@3h4eRoѾc S&-CwRZ@ ȲC'dIV5yE$J%9(A !BH$V+27qV("dY F#K:;d}c,KIaA!'9~|-_N:qbK瀠{w%'3 3 R7r8cj}HŐhDڏN!B.+45@VkęQ(I#1;vf~n3ÂB eֆiKSNH=TzUB!hJA\3$jaGD6kn}*q.@a.p'J3!3}@нTzMiB!F#77WVõBB`(5Z95Lu\%"1IvQ|Ν0]|E}ڄDkB!o",7R4W+ E((Z!xؒ+]\UVf,2ջ;mmnwa-{M!B.cZ!*!0("P8/kasKS"i\̷v M5!Bq>*Ds-P (ԛ(ja{}LWVi4Rsu!>ՇB! 5f-l *BuU6)4jWpxYSՐ۔&B!3GԊPԻ7"YlECtERU"ZYئ2d**gɕ#(ο]Rs6lp0wĈB!"XʰQ EhVou* 7׿\|PKYڈb6cccML9}߬xL w؆ 6rلBH"\lB"M‘+B"p-FuxZ*p0l޷+CimJ|ꔵnyn^B! BAT`"[<(H[i'eƎ_w״h@͡ 񨻷"B!Z1ӇBC( "0s98k:EصvZ׃lqq$Ƙ6l#K\8tB///Ke'fC;7ȏ8>+&dܲ% `sQF EʼnNmYA!rESD8ƁDpK0EIiDj+>>wމs^tgg=&JAVa{2ɔf ~Дk?3 B!*1gqIּs@8gZwD\b^5]m1%!!7S2CFDڏRx<.hJa7#FB08g8 d\pB$q  s¦v^@YvbLMzt`"pU9eYN3lMُ.sl4ٺm[6l4Bil8LWs1q$f:lk@ά~=진Oܞv`k  )BiZbHK88cqݕāKL\`@Lgۦtm_MC}Imذ@[ Sn;;B!MkA 2.qs( ::siws,Ne[$bL7+mn̐j xCmaN9ﱗS:! 8ǶS*O'BH#Ǚ #B0L@pF"3cHe?گ3,S^af!1#yye=i :~JB!JB̙j! BQT(P g\S9a/[Rϖs{e0x Li_Ι};/ ^`*@jj=7g$B2@Qk ""!aS~)g~^ȫ?x@/odc^4|ϯ=uo?ዑ"=Յ_>^!d "hbcaPP)xUþd۷neW#k1gxN匩;Ng@!kxmO[}1sҊb !E-V/tBH(EauB18^/ـA^g"..YNk`gџ759~$!?OΆwRcI++KE7!B3sZ[ꕎ)FL>ytj{VgBC[tWcƎn1c~WNkoܶ:jXqִR=JQ lkv>BB!"ZuM‘+%P?a$߻r؈ؿ;;;kk*k=~kzΝk~˽|Ht)CAT!V B)ؔ_L5!d QQ#ka1(* p>ԁ{bԌk2i2m~sO5|n:ƀ%Ⱦep!vGs,<Ʉ/sÇ˗(:>6R؍5z^Ȝ P2ƠLF 03SBiZ!(uX>KQ@` q8$uÒ[d;=lŽC[ U'ʲtR]F~@ަm/ah1u^Bx]rg]ˇ=S[ hYL'#*VA/  #P6!W(B& q9d cVlWei=@tttHHuI[}>ݺWp7Y>նg^\0ah{~y'6ĭi4/Nꒇa+QBir8Ɓ#D HՐZsvPSl\Ӟݍ!b$kkAHh^`АKa `~A~ͷʍ|>})a=뽭"@'engZ=4rcA3!rbI1-5""r88G@89a#8L7,񢬕 0`(-- t,z}ŋVAeYʊ # $Wu3]7sYs={XR=7B!c98.q(@Hq#"!笪Q<@N3_vsC$o0 :v  4 !zZYYzŋY!$448$De, tiilV:B!\8s.qs$&I9"*KR=aKTTX({s|*1V1{{y%F%+)1kTŅ! !Bȕ198C#D8gL U? IDATQ{А!w/EE3Э B!Zo9($9r!$$q `0jv-&'ٵkwIyp7D¶DbEtjB!F3sg 8J3IpkU }I.dngNe˖gRjZi^Tl*jeO/Y̓M$B! u,3!I|cr06rع3/\>>zuz~~[_cjcLm٪WB!+8!cȀsc"(ȘʱD칩Jg1wJH!B.1s㜩16jšg Cak5Z/OOi5@oBB!I-b̒8PKB!FԠAU"'k5B!0΀s`1țsȑ1l>'CB!rE`1`<9sڜvRuL6!B!j \%mNc13" CgQM!B09kk`m" DNs !WUV]3gάB!,C]Y56 D&B!9 |hX/ DD!P c?SM,3)[2Ƥf]FwNi&5,f͚m!BH!jZh@!KB*+F: ?&}4C'Fu# /N0o_6dKm۶>]f X+W6@!R PK-il" C0rWs'Y`Gy}ˣ޾G@[{wB{_$6`;5^fB!M"V4aa+(@ x=RlR dzWBwz~Et`1)7wZw sƘ.ϤmQ;DYܛ{y1Y J}a_G1jRI˝鲡_<[k봱.K7a„5kL0B!70gњf`[ClU̖\lll\\\:%66SNe7~wRPR|8_M:dyƀſ).1Xcnx@1@ [yfwy'HSI5Uf|uOoh7Ѿ>&BSIT/\5% !˄yuFDDEPBBt1MRllڵkǎfǎvZ5¡Cn^9Ρz٣Yۗ~h߫Bw2Bl!(B~-BBB(> 5SRuV'Zg3UײkH9)o+~2S?~eى+Vy}LӭOLjZLw7_8ё4cu}MccB!M9VB(Bo5#,e"jD7ooo UE' c3k[tYG.O¡%cYX_3 igeTaƔzObhKY)<6⫉uU+WV/!BukK`B !0aF(rr؍1%! ~~:]l*M٣7\Ej{u>"SiA__7_tPz.17]604Z{3qZЗ,DnIIɸU0rO%BiX(Z("Ѥ(e8U^æӅC<B4|͗xtYW9_>&]? \=*XV5K7!"\Y-3ÿ;;1}2lOGծB!M"X 8}8"S 0s9pxUN"/x AS5kTgB!c8΁q3W\Q7!ȑ1@Il:>'_C7o3wrnG]Zzu~&zlƓsaԍ+E{I3ܡ 5i[h^QpsQc9m9se B6[R~ޙ yƆnGZΟ`֟'sXVxxu79|ʨf݄ڴЎS{(tJXsKm570|{./y?}P5nbSC7r#L}1j_[8d]#Mi|&Ԧvl{EMƙG5(X rWrĬZ~v}7p#P>m~ ns~KfiHa^4vl!LaS7-ne.zo{f.3oT_& ^oV)Cÿ ׵Y„wF}P/p0qV\ڨi9&(ݿe81|۵MM :EB0֖ z5F簩\>]2bF_luٓL_´.e ciVXШAO]-dj}Ao h%qesጁ5k1~XeŠf.vs*.Q{u[rz/m( h6k÷ f7]ׯ_ݾO-kfˎGE8svY톐w_ PSڱuv7`#XJAPGD!Q ictʀxu_Ysh[vS:2KKeYF^!]1iw_a{ʄ)i=Iֵg>r9 78 Rq˖zyϨwaخCIlw 2uc)Ovn3,d©26aeKm4^v'~ig 5i[h^Qp ,/ayYVvaIq9"e(\t6s,,*2Y[O2ȶu/ γmi_&W).me\a[B{6 J0p9g~{p ZՈ* !Z L A rQ6a_Fdsd_]ϚVv* {R2s =}$eF?nį(?=c7dico0Pak6laX/؇\Zz yɰ~un@/S~a]vj 3Kי&Ԧvl{EM, lK5@Nd*(:YEؗ WIb>8m`k2<^"T=!ⶾBQ =|<&=sk=v6fPV&=TH,6ib/4 x!=5mg#@"Uud[jv}i˚PSڱuv7$,5":AB([ua_.o3GiçWpTRYGvX1i|CWˁ}x|1t-_<ƚ|fO T|0QCQYhHfUC/ӁD`ESJs}\,0e|>뼬`!ehlgPSڱuv72]5 P"P(BADD! @B9WrnNv\Mp6 ci%~yu4s4A,ooɁ'Sӻ}FYȇ>q_3*p?|{~,Sj?˛`<s'}Ҭ$i]f<9>}߇7=3*_۵y}} 5i[h^Qp3bT !P"@E("P8mW&l˾#˲VX*#FЭRsYgRXRj 7=٦t?]7p=w 򳩏na b~#[>~`ʅkȫmzrH^lN}yg^´_m4|u>mكV=(-C>u1~iBMmZh)ڽW:DVF *\s-@`BQBQ":liӦC.))s/ݻXQ.[o^kYuϐkwN^{޽{QHe[x]%"BCSsr\wLdRL"$(10)B($L:w{^z޽;y3yxDDsOXj1h`z%fս}t B!ꅎB(s[(2ǫDJ~~M?u_A) 5'S'l ѝf62lB#x a[fiu/$<2ȁve%%駻cY{NK:aoz_k[A%5!ry_ꕎؖfWUNLw݊Z6#&91=*&S_>MVzc}>ص/uz~'l-t y7~%dTY~zߠv]ݻB!rh)B6D@pp"]aù~Oo>-%1W^ oխߠʯS.`;iHx TX;aB!! QQ#ka1(* p~;#1xxo)7ܺsvuZ%RU!<5mRa5]’Jlt~>nLB!rQk\@q9^[sؙ~v'ԧ)li@c`PHVz:]yX:o_sYCgtC]L}yP[hK=nFB!rYRBZA!\p5"2!@ga4oucOԵT<ԥ$$ӥ%%v+-)رGoYVwB!r8*Q2L0As1' P-.&W)(OvZJR M7t2O!xBhv@YiU}  >,OX_bvU+*.q&B!ˉ:<8p䀈IR+pþÀV֑ǍmVB!F1&qԈL8 smU"M>xz˥]ݶ[3}B!&1IH 8  $θsƜa>i,6бGX0ƀ1Ywag༱v:Z?HN:V֪B!Bq9@9GEa $I%S OeZDVZVzc \:Y>VELɉ(M!B08gg(qD@sI x=6C<_B2Y| Rs+WVzU*5E!7P9"G.$΀L0[#kdtafIsK V®.J3 dzf*lB!4~1 &8P0QIL(ΝՈX#lpr{u^7إF;iqN34tS.իd~]a7)~Гy'Wmx eI:iI56-c+ nD$΄$qDs叒V e+aZ-gv']:h^%x \ST[5"睹5 *VƯk]RbG[=#;rʲS/:lO46-c+ nR3gB0d p"cs@S\ 6atQw W+\\=K:$ZvxkwvxtU䀩/Fْߋ8d sBjjB;N&f1s㜩16jJFNR'e.zyeVj_ҏWjmv?`9{I,r֤/#vKS&.XIX:N7qw~Kfes}$0/kr_;}hɛKy7{8[-<-juf<4>q]-LHQcZ3M&!PD zURX ޤ$@ ns?f7I$gfCi4Z7>[#dc,$r,9ܫߦ6+wWtmhm Nl齨j=kR8$–_TnvxEXA~EPo.0GQt~QMOࡇ?+ڧsSw}+Jjۂۤpz/*xAJZu[ m"}"$!9]  0|;BeAϣ5OODd޷cӅ߹+t/<4<Q!.!!˭}9Igd9dnd> G^Ťa뱽.̎dv#S'nۗYZ.!~Ŏ^E-*>!fo}oݒyM,$RK+4r"e~J&916o+y~7fٝEM9'[64Զ'I^TrFJ(-)23`K&QnxWlÆ i)) b2T=:dȐ7.MZ4EE+7WlvMmvjUՈ ET Uz݁ 7^?sϞ=޳gOP?Ǝlܸ5l 9*ֲJͤ%[J!U%LGpǂ!j!ڔF)Ą*T)T!B颉 $9cBj_ !#&TU!PH.UHUJGRHRUB𮐰Hhze )*U!*U6WB GV*Pp\jF`ܮ KmkgBBчo.WqomRqqqOg[Zj$TlBJhBh"BJiWU.*-$rut VhXLDjR%XHDR,#a-)x:BJTA$1s9qV$aZ՚Lh Rr"P$I"8gv-U NI)*%II3F91{s԰AQ8_ym?{h$и.ΉqIJB W8#bJBӹװ.^c\Q8#gM3ι¹BQ87+wC#ںySKl7Ľt=ClqzZz,18g qΙ#EEQ8 W6j&Qcƶ0tٛ =sLCr(믴ۆ-[T4..B+Z`Lp8s֫%RpƤ¸8LJ+aU43ҕl[AR 0Tu?~xvrkST}mc9S8ӊ\q9Wpp0㄄ݚ^C= 3~+&e􉌝|_pn"=7cDPc!% Kvw[Q,Țj֘+/{q{s2 ~(h2s 7ޞX{\ƥDA^#V0[ -[쪯z>QzdGinMx-^ >hUkE1ƙ3^3ծЇbbbϛwUN{x}C{Ed|'wu5gɏ\WNsݦyk/s耩Osʃ WKΧ~S|XNm ˷wV7ޱc9) ιRrE WT)8Ic\MuD /[5Ȝ+0|Zcb+l{mw9F+2XOӠG v]o=60tH+a+q8#8cqN6c.':"a7)S~ٗW&&!_Q3Z Q3 5dK.YOR;-ReEQo<a%(az-_ZpkΘ1i-$\MtDn^Ȓ''b\WT]WVTeښus'E ض}u}.sڶda}0\kc95㜈q"&3rDlr%fu^phVz2#54^藝}G-ز[ w<[fdɰN>׵peԢw6sVJ+F3gLTird\rIEl԰y]nƒ3*͹յ &$eN~o~4<̼ѼgL5٭Yyk/X,\TtspEy>S=/ (mkrNfl:DՅ&lKDgswF ]9ҭxmr`f"҆fY͌1ƜEj^Us:Fd5I-^ Ux6U:lqlUUUEpDo,pժ#_j9SݒQح:GhKOBDhBսڻO9☤霌/ΫVih e,o}dOj_kID OC5ݿz R7iʕܹsh$и$lB[6DH!%Wt`K\Ȧ8a7QaFͣ^>#/v':qPQ^NUUyw[||;Fu?8wlDD~@&PTd-zF `BvvaFRYvdS\-]^ucf04נ!V9tZ¼i^>:uT+XGg0j]|||LLLKqoo;YJ]b}Wusg-=a˖-qqq+Vhߦk"_T$I"s9q1v@dӟ/H,K ءˇw}Z^ZR[2k+JvO7n3(?sK?[Ez4M"66vƍ- Fv-3B Ymcg65Nv9S\ood쳫 ֚8"zO!eC Gõ\H)H gM3(*/Q_SPw .L/_/ߺ9ㅏAj :uUZ4d粀cl[o/'"gq-66!..nƌZN" m5>818'sI&I!ckؗDy]=ν۳/pH,9~;êU=dS?|cyAn}iiX{7uoFt2upTOנc)b.+xD{w]ˈ'y軟ѡ$J -^#d|%')%gR(\*BSs԰qÇڥts1syX`7M-(&&C9en~s#,}q+5Y+?9Woʕoy?K.S?>kQOӈ^?0~!=v=a)1ƝZJ)%g3sIKAsΖw>E&rs,ַF>}2\8O}ZvEs)Τ !I) gĈL0"*L^htqSR}̴2+]R7[{t-HȲL bˊo?~(Hϐ}k9eGNxS$Jv1k;1mLUz^IbE=@cqι`3NL ƸT8g SIzD.\_,WsIhl3!dL23)cJTbͳ4sʎQfkR B Eb[)R")6f: kKׂh-)HHb:DPpIJBR,c;n%$9 HJKD $#bR!U) ]"ΊR֪֒±`Z6QJ)*T!*T)T!I!Qh<_ym?{h$и)B!Umk!`Ą*U % JB I*81UBD͛Zzg%{ֵ =k6lqzZz, -^WUl! Uj]k5l??tU\\XI?mԘÿIyϮo :s"sK֫AQAk_[}7lxGڪmٲqqqDTWXc HԪPKUәU! i| D4}el[AR 07{/xYg<ć}lFnH\\܌3l m3XK !I vKΠKY^jϱ]Ğ?nYu 2DZGPs3F 5z£GyssJD$>,{d.^Hpװg!0 8G^izƌ-=hBJhBh"BJiWUչc#a7sٖY?̺|FK'$Z1S.X5}լ1W_'d_PS_=d&'n~=` KI񕃼F8a*([NbM+.\;/9:wOb9-+xd/:/&]`Ilxf?~x nHIkձN"$Ib s]!D5e˗5v/Yz[dCx[^d۫o;5^Ū(?}=:ooߞ萵:ϦDܶRPVv*W&~̚L$@[V&l)%Z7\Qg g\aqΐ[)SdG{abr5`>\+D=΀oaK.YORGmYc{537.cg߳3q]|k@#$% LsSE19C U9xMD=9|ǿ"2ZS?.z]7w[~r_tmw\gpX ٮu.r.j.m%91Nsqc+\LQ8c\Q8䲆>fuK J9f9nKjZzNm?DDޏ~3_rwC:g+Dd;Q7)r֞ßx~]"hĊ Booؒ̽ GĀ17ֻ/ ]ʹ;i!@Y\J *Sk)U\rFniCF 5s߯]_l\\]^>>1;] '޽ 0@qgRrIRJZO¤`DR bqLǶ^x  8ז r6csrtL6."4"\dIٓ6eIh׎>)$B $sW="HحؕǶ ."p&8RHɵ+\Q$%c1g\J gq1Έ3#b礭͘ˉHD1k3vLdZ 3Wj9DL3$gK}ĈqF㌉4M5K.#鲈}~<\ڸJHؙ6㜤$F8lxo b͝9j]dH:.C"`#ah Z[J"B:RJ69qdkDFZr-$5lsάlI!"$R ؘ{B3 ~7y$ RHbUi"Eld4gycJmZ+$ɴx-$ZZ=[zd:xaôO ZCzg㼈^_}_xّJK{Qv6\KRh72!RBhwqww?`@[aeX,RŜoXа򲲰PmKRUht0ڽOKSvdb$"}6{֪+,X|@ukx 8֎k)IAHATg,}?6U®,m]:x7==cH"D;uɵX,D OTzF(chJy:""]k$&tuU]"dn6wekR UHbBcʣ.ZK$''7'']=͖#Ogj; +(. 1CǾedf-7LrWwX,%F?xvv >Z%an1]`k#۳Æw)FvqINhaUC5;mΕBj!RUU**r}Dp>JbTMDd>Dtĉj16qlܸ1((hƍҩꖘ?TY7ĕ+-7,ۖc܀sFN֫o`&CJKBUakD***=BRBUBU*D5Chؽ') UEE%e&fEDxOJ1nnn~~ݮ]:pz[%vPWLL̪UNjժx=u'"S^\;zɍ)Kئ 1ݛbX%ОH)U!T-GKG۱VVXIvnD;F2=s"Õ&h($}r~  2x{%''n~]w[,Ȏ]S [|xMTkɋw|;o}zUm} ^׵65@5Xk5҅2ε>l:Dj=)+ʵճ^ !T$"O/SUߋlV*ɓOOD={0^۵P2""&mcBvll""2wYE7dT]qlcfiQ(an GCمnPf\\juk[($aLkr얲s܉Ȫ >ۧw-mpkN昘rOOOכZsVsw>hpҪդEl_oCûjWhj+[T>nnnZ 85Tv ,e: .*"g߾sMZ3u:cK6CGo< Ш6@cBhLHPsbgޟrd/Rqydo2|q kݑU'7҇uZR>Rphڳ*3}{ʶI55R.e]=#́68MFşKXc=C[;:ãYEr.KڞW6}_LOhx:Gt>xӽcY|7]?+'W:ܳݯ4ɂqEȶ^löK'mXqI`7nmB-A{/c;iԿuH7\ Mߋ[9GYXh7p"G^flj(.w_$ج'Ҋ\QbI*gؚv]{;f2Ǿ:'݈Tݸ-Z]X?KvݻjOecfG@ZئT˺ѓ7L.s ~_Po_ߠ- Mߊ[/a:k/rw/>=sb)u#c͚,bm9?=}7-QK(cS 羹#ӴXʇST-gLyQkət~ ;o u r-fyEaӢoޛPR>xxQHX ;ti );C';>nMtGe9yioo2ѻmÚ68O !^n0Nzсn;:s_1E|zʁ_x s>}w͞|`r5?w=#{hkqEh'L)(߰yЇWɽɩ^#} _Jowu½pkX}SvyK^nhHح.jWbGJx[N/Gzݽi~2+kzM~ye =S5IsA^1΁|w%mzz^Q(%3w 7nX_?ˍr,nY5#Xj.S7*e* Q|<=**jQm sk[j́68w::?ixQK5y fƬ(GLOn;MZr&P}oes~f[G sr^n2:>q΄r5+=MW(x`@c3= 0$Wڈ];tMۙ[w,3}]x_Zhd%R_-/G=?4Ш[3wIҽOk5o(!㕵㦛{oŶ5Rl)sKdW]9J-5gq%l%τ`^xY;~smjI)@Tߥ`ef"}g~AAF\2O7[La=ӷ78e/Ή*mHk|Z_n?ԳM /744Ӈ.rDQ}wqj^In7bرv {DY~ʫcueJ6#G52gLe~4OrD߲6xlb~}uB"?:" n+~k "%%:{E6m[Rs""K9# ]Q^[k#j́68vlS۽-5^n@.vgVqq덚KDU3lE%AcU2\$l{DRYzYjZ-EyK5. _j*ղJok )5+F!ىȜxY5egDgp{gP&=3eM9<6|Nʃ;gZ\y۪Pimpbs;;oW˘B{.ݒB2풨r-B}9ux1L(xp:5+`?jWC[9C^F=S*WGEv"]:wilل){C'lBԋ~SG$$ H5{y~.WRR[.{/n/.0x{MEE+u>eR ߾bowuy֦Hk۔|&]7OOl>XW/ wUaA<-塿&@+߶x(sCud_%/Syպ]C3S7t 9j&"r:!y]ǭ㈈Rw i洜ȮO˲zQ?\#QToxVQt2<,;+>Br2Ҵm+E75uk>yr1C1ty~?f;DO%GN`oj76-;3䡷o'2e ݿ)"s Mmذ!6665l&!CL&UEϯѣC yCDd O?Y?qwo T1.*JLLһ {6ɓ=zܳgGDFSK6n܈Do0OWrMG ~X Z5ta>}J5;Ij 1!a4&$lƄ ИY,<@{Ӹ2G 1!a4&$lƄ И6@cBn,_sL71Ƽǝ?zn}~b_op]mؘl_5cL wT""YsW6PĪŗwf1n/^}#́68M vkW&T\]tkǿeS^ 3T i͞v6rG PܙĻݿOW=k=׼gJS7c'mDgSIlE_EK_o;w?׏lé68M v+g;o=Z=Ղ1= ]C>z}O/FD4sͶ}zh]BA] ̞˱o4.=Xs«7/<2}ONn1gdy{0玜, (zO_ͯOސ_?{oF@Z&{Q  RO?|Hګ|c{턍Dq^1fz6-bVH5k$bc^<ȽvI{y7 eozמcDC"oY9 12Ƙ|mo.zqG{|pdg}bl/T.svܻ ۝ 홿7gBpա s=~nV@Z&{Q M R:~!#?RRC:f~ygqK2G=cbR\AS`n#7d!Jm+>7~ ^>Svs~͍)eSw'&=qߊ$YS>NkL IDAT^RvɟBf5ԽރulѰ_-6UDD:pȘU[^KΜQjr6*\|Y>w`ezQ6fv@ |j3a^pD7CLnJ(6Y5'J0vs Nl齨&݊ٲ$ wg[aJ_Z֓h=Ugϛ՘iNٜ7oԊnUؑ9aͯϿ*?qr{yGP`)zި1}o|7wGG4:9tj a<44skr{S̐ g{LnmR8SIG(Dӟ:坟^9!vlՖ&]M6#F${xǨ1p] }P7߂,Sķm/=Ӭ!K]+Jm-X`wwg㤨?پw{W8zTPѨXc vnb&5TC µm19qz$yf~Qkʊ5mE7oo?~J1HqRu@.%"KˢZB]_/LVȷg}IDdH{iS/}Uu-^:&58A;tC)/veFj]{ <&MƟ1E{ ^QQ1dw׹ QDDĈ#++63e*IFdw ً~3o7"R;<{#__.۳~~k|77}~/lSV&j濾60wYJ"l,oמ܏z_{ DG[M.%"S57N3޹tYOӟlD$*?~/5seFw5iȢ'<^gN|n4aȗ>T *z^s6ZSS8cQW~UI`,- #,/>7&o YLjh}ݿǿ.+M2t}v;a_ݶME7pX~^3e*l[d@5H Z{m-:ΧsIG`7Թ\lW<=6 ""j*X05FS~NOzmG [d8ly[Zz!A){pG7#aIHOOBTEpS$]m+͈w%D4hzW}zZZp7v Vm; #lt:KGa6w?bZʶRSPif 9N\;*fՔ0"jR_H7|e5B  W 3n?~>(4iYN μ>~>Z[XkJLla1 VfCD{ m䭨぀ |_iTud$Mq75ljW N]=;\2lX&}?~qQ?*lf[y[^lBJIBJ/tFF.6kmTgġ7T2h{Cse!bc32hСKSVVnQ-5q Fo0֪@7cHUCd64ԗW V}gfu jKS)*:jquͰ=^w+r*vq񱧏|5:/m sLƛndWUUa=(do@DFQ4)Dt™wԀ]*-9=N,@QPiMg"# h ڜ(ʑ60;kh4ZljHdRA˰8̱o;uu9GxwY!d}r/>Ͽ=@7,P4Eg_G{xIȰk̇Yv>(<7'~'1>fϞK>}GDzMu0W=tsč^_Rz!>nΜ11999UNNNtL+VN;s>W]ⶋ*л,+۱nZp<[1T|pۗy-@-[;†'V78iȰOĴ3g{-\zj"Zze {GH(P2>gx>{5Wqr˴V{Ewj+iٜįقT-ȰOP[Xk"TRjD 5lН쭫TW;<=/nSW^|+_<eNd/7ȝCZMpS+T~|*榚;|N6Yvu6_|% &ME IvcH(P1(ؾF޾~ږo66f/#3ڦYn] yJǐ,~LۉrJL pĽŹq3:4X{r+c'kDC _^“}iȮӧ)q X%*|sPlq@Ԛ{ِ:5ao7 -R!x7K>I?tSrd˚7cfG vUsc:tn90)Ҿ_]eT y.]pk>ÝJo#ӻ]0p oi}K7t^3}1Mbc6i8*IȰz2l 'IG8,!(6K^"= a()jІ Гa$d= 6@OB Гa$dZĤ+W5q@Eγ7Mg)ѣ/}2J Qx͋//v 0)Yy`cE” ?©w9W68=])^}Y/2*Sݘqi`oB+P 0ZSd;M7oo3wh9G^wCrp˟hWm m?K{0 իW[z>,v]<>3&NnIDZɫi;>clnKm0c#/]V?nzYQ'ݚ1%rs7wvOޯggI!I"_rp 3gVmkfΜyOJwO>[bnǫ=k$)))ye㌷5m?w+ыݐ >5\oÞ=D| Cq/5cЯ鵞[O2g9βVѯFz;:}ȰCa̙˗/_pbz ._H5'xhǏ\<:fvf}DDJ㦏vAoBʸM?xi&`zr?]Cvaj>$ʝ5aQ}\Zf?}@(P.bpț0N[VWޚy#+'җܗZ(6ѓGy5yv~{mG/\# y+O5޺`ceIѝN(`4 Q32iZoϺ|z,1f$Y+s?DOZ<|)0 ;fΜdۏiz`?\ú{%&Ûjpz!4DFTiCK@HB]U]$ 4Ym~؊bB}`,\W4î,+T d攖ĈB- SnQ]] Xj$dX,bLo&"ꜟ,CW]>>#Dv]'3kurhӖo'&%ؿ#PdE2}TwfS(2l ]:^*Wr Ɠ7N'#$ MӴ@ z9b8 W Fݍ*xfozg/pʍ7.[rqG%eӍZJj1|>C8.7nl[;<P4J)#~rB1дFWa3;<{e\T7\~͵'+>|O?w_yO"]wg/8tA;tC œ]YVN(>&@h؈QQĒn qs&T+))".z/{6[Jdxɱh)[oya谖U=?R.)kbKMw޵X`cwԣb_mKQUes!5Y w[,r9Ԧoz8tA;tCڱ:3ѕu5{xTxx|ا4Vbͮ=)ٶn9O}U!2g/{ѿ^hp"AD,v8*-ׂ)c>ȴ{+)mbCRoy~r}ٶS>хs>oƇ7}죦L2eʔ`nNO/+Nݷ)pw6ȃߴt >Pp!BzwADΣOx\3>.H<.9@<.jw_>nſ[R@MQ7R&YϰmKZXOXLHRSnϝ]@~[_xfreۨY_?ϛ9O#U~_}?v-!"gzvOpn]4Tөܦ/<j]P(8p0F9{>el$=.ܔ |7ʍAQ⇚50,xug]cu~PEU}YlSor3;+ܔJ[б==%ul]eM5`IN`}?j@?v1CyԐ%YC{"}ɚdf7}ӹ!mrsH%bĢ *nݡPęoӾ_ a/iѱ6)0K~5;iiuİ9Jsz %G|yRw'SEI򼕏.ý_f A v\LTnrk(\9g-~)fhv=;'F4un ^dpØgo{4>#2fcw]|ׯ}q&"e*QlwwMё5O!u]~;Ht%پŠʤ֎S IDAT SvŹܯ>zݿR8tA;tCBmuD%QV>Ot޴́#w'X[xcb{sJDLaÞY[XKڒOǺ>IdN.mk|fϹ.ֳ\쨾SZSs !>ayË@"D!B]sԲSomki˦S펅']2GăV}ZٵsH?f A;C=:cƂEJ+,,8\W+vnZ\X9olh(*,߻+%-WbκbNW@w q1Y]u0| "bo{:Gy>;FC߸zկIWhag^<{DbۆU׾rBys ׽`W/HIq?=}Wbw,G+]ݕ_ p w@醞kO:cOUSQQQe}yNDC7ЌqNׁ6, qE^""{#+~hy+o13sww=k/Hֻ}mȲ&iݲV[jT\Y~DBLV}Ŭ|~i/_jփէ 9-ilF}Sl+ըT7 =Zj֬Y|^/Թ&Mx4w<55u 3Zk 9N˵sI&h0ocڵkРAƣ%{@ ??Сv=77wĉёN"X,i999}nG#:}>aZn ]Γ2l '!IȰz9>qo}ڰz2l '!IGyt&>rvЇrƍ˖-{}GOJ(6K#ظqcwAD0`>xDWD,=-[,H%I fn7ZUXv}AWpgrYcS'dD[檪mwe.pxnYȰ=N+?JCkcDdZ OZkfz証&a?nʣ0E_rfB㞂w6}W).1aYS~_zM5{]P(8#a&zemx#*~|uJP}[ީx]Ȏl^]WZW^Tó2M p w@醞6~YbO͚4nˎ4J]7 wMo6w " "%y}-0DD̚ʴݛuƓs#YKjuqrv~SRX}ץlT9"iXt T"byO ]S] %ͧV.+㎞-òM{V75Hk<3ƹTRH)W3p w@ @ݟa߻q9܉wpF4j;w0XVQ#Xot ذQket$1kœ# &k?zHrַb+ܓ[PWޤq={ )^jD/8}٦Zv³F-s\)1392?8M2eʔ)*]fڼ\NUWoV Nݿ`?!ֽ~"cf(+Pp!aAm[uU}x|x̴ܭ_ f6 ""3*z /5--ߐ)iٓ?<֦1K̼K5m%67XP6!=R*=<9Ò@[Oav7޸ϵx @/CG{ ږo='n7jN]7-b.s/4V5^w %Pp!a!g([6lMump8xscEnP'ņvרoJ\o)ixy &F;rHF%s$;=}|JDEkR徕e(vn^Fu4e!#bM&9bN˻-cG $ҙ)h vvzt6jN[_mmb~^¡ *vIaN96hZb5z:gʜjT%lvϞKոdtVZ=}DB(aQW[LD%/kj dM|ƫ1Cd7v)F͒$9$^[~ $t»s?{lubacV՟"fWϫ\8tA;tC /5ŌǚM[G6WdVoZ-G̛lS8c&-} J$-J@)GYFR Yg] "RݻϛkFK[8(d}OULq@e6@Æ m4p3}(PV} $BD/rA]sD].o}Ԕ~Pm];uk/3wHT``h1 7k p w@醞~(vkbԥνH~|7ADj>5wodsko~O.|P0Pڛj|yFv~@K4ɨ1ejZӪO4#Qr73'5h́m]^ cnu~ODOp"Sg~pDZuQ?~=]c1K;Hd~OOp w@VZ5k֬‚>j\&Mxo:s׮] 2G2:nN81777:ID%-#3''oa7mՅu _F%EfpikFz >aUXW4ظ& JR")ݤD {ސrk託t|oծ()NOuV#3etDȈZѾ?[7?z[Io pن]'?9v,ϊ4\U\kmCevĈZ9(k|s`̩;twڰ} 3c10hOX2bDĔ*T5qMǢ2fhImӈ8n j+hr;s7?WSC8.% /YHO}ڊkD2b=,uّu>}isFne;PfEXRzX]/zYΰWf%;c-5#z3MDIyZ_Ig&(D/ݪ,h"]ϵf[cɻ^ OznwhBa>73N." ;6ԴH[o ḛ 6mʌSGc$%(Zڙ`i|{qis.0ǯf Y mukMܸ:ak9"#qg% gFf OS2K6h?n1.]30Z6eMzz'\,oKϟ:1IsjMY+)c:hT^Qjw]錬BS)Ch,^_7ڶlo>̚)λ.`hn~"n P1ڽ~[4ֈdsH/.Z'uLw\6pI Wkϱ|گ>oSF!dII R2Ii6oIf_wy쮼'j0`m^sw'MHGl6!Q7BX#o eV/\;ԡpFz[Vݞd Ռ:kKjmnYIrxreƟS׭[ٶM*Ca_fڙ3ѴkK_|h %zy>$_8rVL<rdZbbbF#!hnn=rQAϰd${G:"JKz̤jEEZ^gY^JDkq5D*%<<"#=Mg-Q۩﫪hф`WmX$ۻ뵧Wh\?y[XjqrlcEill4!j* ~- Zk/EGvH$'5oKX}bD@BbbEyyxlZPUaa5 OM 䦤}% x{pDt9qTk/[}MSOzXp3l}j}@(1KDbPРy++ݵu^}`&4M(#Ú<~}m7C|j(23g{W]ⶋ*л,+۱nZp<[1T|pۗu}z.t-?jw큛+awh.}_&QNCIys+&V_/E}ЗQϰUUўK9$ym8?K"[z9s]w޹`\OQTEŻ0:_MU2mp՞8u]>lst%>>+z˥*A8'sv$$zL|>?) DQUWHDB !ԚgK2MM#jMCb=+VZm#n(JJ ~su`s`o]J+I׬46[E25'>FƘ'q$}'u`>"!$s#b/ݕf47[1F#2M|4Qt}HtQ(իW_p=_7eMhSUy; 7UM=3gX댏w{8z&~81" 8pw߽333m.k}[:5I)f6P[֞"<*&)&e|i1RLkYNaI!k!E[mM2Dǜ^Qz+bPl!@Q9maÜ"^UBmuy]Α> .xg.l{vK"!0)Yf#RDQZR8S'1 )zeQ3GP}S:qoqne ޢ؉?(ۗR>QGA1>st=:SWCC… ʈ誫xUodzI#'&:[:QK)|SOOMM(-1L]~V:uTED h--mӪ묆# y3oU9(0{jνK|Ða yxzEy^Y__y G"[3/7qDzٙӧwq͡TqYFQ^{m޼yz+xRBtl]5avjՑ$QVr]N:$=wm8dlF3q:LUS^㎊ptV{v|fv5/yWa (<86xx<>=# >#o?n4}bgاg|y҅ =ff{DcҌ2҈hlf RlTDJ:$=4aBP5gV /iڕW^ٶr111vXk Az^vg_)#ZI"J޾,#c [JxE DU>E rwIcJ| Qlps;a@pCW?=BЛ8eزk]tB+^ZmPzfp}1M7.:{gk y>h#֖dKIQ$jmMa'j(krrs꺽L0c)))Bs ;5:r丱C팑N#Xrfbg6;RŔvں_ѹ3kK0-<ZDMGN).Ws;#H)_uq#gd55j$oQϗcb6f䳦)[KDkM:ggŚ.^X_tҧ~l6_z2$va m͌IILl۸3fR6 QgvLjbdY֛n}˗ү2̡,k"sW5[}Z^%:,طw{*AD2'$Fl)10 L)S =婧*))Yb]wUTTtR)y|c,!m:ٞɣ~}I$I yv3IN gфDsώ۶#m$#kAk'N?8qk(1;.nʈfNI!ۻPѐۤ; f 3)ɖV틏DkyVwIJJ"{j=5zHQSn[U<%1))sIRvLX %q.Ln"z,+VX|UW]s\6vK\1=ga1څl IJv!)ؚ^ W>ޏOJrUSwo )~Z7Yt&Z\p~_-ǥ۰e}X1k֬3gG+ftw-X0CK-z{MˣϻOW,iu~ ~m%CWv\G_i>E-\xZ՚]b蘸nk?GE i7~{醼Y}ZOYO|w-@۰O!˗/@= IDAT_pˏ%["qJM6V$-oڽQӇ;XO =-Dݶx^ XȰj[#{vYcK6 k; }syخ WaBMM͚5y\aZ#"ƈ!}Fy>|wV_>e;ҡ?G#~I)5Ms75yjǍE! ;>Z.))%9-iB`0hPŠ9IB\HMJ)BJB )c3Ns9cq9cc- <郈S0c^>㜷O3bH#~ď?G9~EaR!TUP5Uո­FWtt-[&Mt:O<;!Ȱ{v(5h߁R`2f`0B`"M }bKO#4I)BhB !5˗sp W_G*+ _z- iBR4IRR8Vݗ߮S#~ď?G!d4BhPU;dddݻwҤI'XN*d= ,Yw}.\²c&53v *( lI D$q) ILΘd1Γx덜˜~H/DĤRp$i8#DDHBcBhKz'}1RJ ~ď?G2~ k݆1Xu+6&ǭKy{[tϗC}"BAm]Q+Wϯq+ܠ("\\B8BӄL4!41sƸ8c30Evw"KRDw-X۝≕?G#~Hᒈ %B29i’2jO,B+[ȰOJYY_}v?~Ws7{1b?1‰+L10!$%I. M%bZtd1L)75ǘdDJƈIBp&\IHZ P1)s#~ď?G0~Ib\2EaBɕe1bvaK wu>+W .a/Xb ,v3MUՀKm7s`P I!IBNL0"f McƄssƙ~1sz㨿~qƤBJ&!\cƙ1ƘdkL/3ֵ|^>G#~ďgsFIΘ '"!PIhũwy?0gΜO>$--XDd'+++#|熈$iB|Fh4hPLFEJe}Y}q"RJHNk3r=˖Qɖ&s)IRKmK!ԟZDL$k?$[G#~ď?UF"TM &ij@iRJv)]zx'%KK ]wu˗//**z.mɨ ҿMu)3)q˫e})R0FsAK!$qƄ`sIu4r':z "RM"bBJ$ :O$î#~ď?G;~M-R\H"[<}ݥKQVVW_} "2쓑r+￿[JJJ/^|{7s hP FɠȖkKݒd밐B !)W\H)4)hΥfN|eW>[C![lR/^ R|~Zo %]#~ď?G!ߠ(>4$qNR1!`QI1pRʥKRN8ދ9,I{M7}`m1\HɅB=8BcB FĘrrF-1ƉKƘB\iq1ɥԘ`1 ~=p0NĸG#~ď?^+iBRrɸ\ȖtIdR7|駟& .W^9a,˖-ln`6in9oϮ9WhPFCۭB $EŤ$_hqi\J]h5 sFp_/BʗRri\q[;[D _Öj"~ď?G,~FdRHKƄ$8zGMl6l^h#<{(K.}'FJ+)ܟ9())+ 7(bFZ^B0ɉBcu,Bh7USWAc3}Ҏ\KFRJ1&Ri/?&}|ď?G#`1)\Hb\p 6{F"8|GM᮸K.۷ v9 ~F!kp6LId   Fá}7Q.t2M.X*p*P(r2dtivn6t6)6Zswϧs1JF8041 838}q0aXt<Xea܅O2 8\? ˭c0tݮ!~!~SN1BK083BWktLc6os{Pa;ZK~~B  #}Cj PBnX^ǍCekt\5C?CqQ%,26\KLY#v<*q8!Ϝ>501&&&~ջZn7pڟQ}cbbbbLXj!I1 ʬ>>7)&&&&f'T33eW뎮111wxAaIe_X;4/}>mqS}yk =&&&ۈٯ~17;ҝܶ%doj'Z./=sPP gqL`b!roG&K1EOĔ?L].lZfɋ?O52mx(=fky<9gSaǷ>r؇w\63?,\tbO0͆S9m;~߻ܑ6BͳfRzom )@|0kK~us֝6_t3+{GyÖm>˧^$lT"^;}pz3;*Y)vѧ^{mZr)=oۗ,}ƑcŲuw 'bK!ϓxӧSJRy3Y;U*U`G?QN;ʜ~*?qEvK֏UT&GQhh)]?O59ɒϓ㺂YSg TTK?,5eo|l\RZRucڋ{3L(C验l&2E3-ɯ"(R?vS>|wlR75z*r+POv5wH\D ȣ=#?"Q@evpj.! ib͘gH+#[֕_|YpWnXȚiff盗&K^+9Mju6rV1?3u`'Beev)/mn*r+Pl[16^ůBUpS|f씾J!)H% (˥?>3s`JHҠceY{e?>^?IQKvg;lA2/OUgBѷ.Bk{ Nqv-)-"My;=WwSy%yg?j^_:/{w.b*.vz|7^)ѕ~sh֋޼dޅ͖gU+b4$B||ק].*{Փ=Q"}+/|sE{[{w'P[2ԌL"GTEAkua'ߛ3q٩`N9paPa{]F OfLżK93rj9]uw&i+z{gxWszn'k"H'`q33㮗|8.yt3+FqʳjBHbS[/ 1%7ܚ)ҡy[YM%; #Hۅ-~26;XÉ^8?=D!D(;we-#C]ƪ=/ &qBZZjC+Z#-=X.OZ<έ-ȡ֡޼hdV*G~|Y/kjxgΝ1X;p΂5%6qvNr0GKTd> ۡˮVD[70+ EEѫ6>&9!O?!/ I-_=e(]ź@m/\5ϘKP챣20U{& *lϱ]zsT{+[С~=Bt"Wn9xҕ G) npIڬgt#k3{ԟ٬ӌNj7:ZtB-X T{Uw;*I*s (zf_e:8!4h;J{[6&)iؤ&PlZu qsCW10LB1}[3>qtQ~<_oms,|qd@Rca/w>J~_$da*!D̴a]ꆊD?&]ظՆ?o7Lze 0Zbo}Q2aϞ{/Ρ"F}̱+7,4OР\o տ=9֤*r J\Z#D]&fnM6Y2F>ޝ+W~.rE ]',eYO~ǚI^w֌p}c r^LGm gw4RpPTjTR:ʳ1QUЯKjgtX{JF} ƼPyz3V)&qs{M $wagU+c45ɪҲa;|B/n^p[D4t씇Kみ'tUF9i6]vx>Vk Ꮄc:# j?}zC̎;~:ÓSq Ita_,Y[ M4J|9}չ|eGx!B+mD 7Lr{0!d+<_QinfL%l`AeKQ`n2Cp(B7lzUajM-Sv'+>79*2N]5ȡˮVtoX;J/*|_w{ޏ} j=*OcMw]+M^ŗ/-L-&q~IIsN$R;HtT8|YYH޶/p{/^9ނ#G9牙Qlt]n+"xM%XZ5:vJCGi9+4m7=ydT2#߅]GtQˆ͛7Q6}_;:skc5(>mv-PV}oͻww>qr !Qi͛WR3MkJ3N{ջuvlصIW\'cB#lyZzM7V56ݾH=zF; |«Gu5~iƣo|s"BV}W~NC}~-n\LB<c,,B!FC zI(yeZisYo<1@⹶e}jm,wVRt;+w.lXXa2 s+]} &Ć^C=0Žm7U#z$t;{߱s@DǔC^|!lǃwtK:h.AB3o-t{cOF>垗|_>1u5~Stz=ϖt|\詟(~ph*[yV"ڿP\~|u7]~Rfƒ?ozl!v,I GRiX.l]J6/.^EVy-F5&׻f'͝ho(f(N}닗qN>u5;~K/P2ݯ,\\[rl>؝*e=,/ڱIucW(7&{]\5k[?B;~rslV+BJ߷o_BprO-Rsssef/aoN^nyڹ׭v!VVV kMcOuj:ܑȻS_?>uWy'^ӟya~ pB€.C&=S{* z7|GᇝL#Gᖌ/WUG k ^=9}W'jp uBPIKKv\]q%@8 "Ba8tAPaЖT*UUU!@PYYRi0J$*++JD"lkaz*l>qx~~~HHmxT%hKPaЖ-A @[ 6m *lT%hKqzvl4MvIߝPf[8KiZ& 񠠠PL&HB&aD" d^^ĉ@g6e>_a2]iFzR W*m}{vlZ}W(B$In#)))b\pBP,\՗;oL|W,jqLW336 D:88vSg2]]]mZ Z?~|xxRX˲4M4MQR?x`ee\.gfӦ?vWWߗM9vZe1MƚB:hV(UӋu{}[YYɍ իW߾}ZH$xAU 0 p8HDf:qӧ}ߴеK jzރBIIDIIqvvvIi60D R($I:=0 xȸ',,,l߿HH@ I+q.\76ㆎ1tP N8aXaa9xh{l|< l,׍p? OW\XTEGd ρ??'A{k0nL&ZݷoPkn7IJ,GC IOO;IIRio va, n!Nѝ:+32RtXij)݉L  Gsl{nHN͗ޫ(%U?iųܤGGl޻y'[}Y_fXVj5jW^|gv"$)H$J'OcXVqBЇ~m0Xei٭JR* j)--1֨jTJ-m}~ʧq㕕kgdE+G>?f5f"t(!;[<U.xFM[5-Z3ipn4hPttH$xO>([nlB\6֭Cǐ#F;v ΏLӲבAzݞmsQ˲,ò6 E9|A@`VTRRWPx-8(T ˕Tꃻ4ܜlbILLLTinXnX,fbpKRŝuf4p8 sׅ)A{\Gu`Gp׻j0 ]a,:lwX5II=Hюԋ.`Xaͯ.1KC{peǖY' j2p0֒S۟u54Xppr= obLPMP= [C j/~emW5& [ν<WrFՍ#<|i*v r!B|;c5AZMx >8QN__!C/?5bYDĄnZMPP\c^m0|M1"׳*Hw z]5ISܝ& mSZѢ-VSܦeYs53džj5A΃x, Z/p/X U skľ5cVȸZkii4Ml0nb>,)ܨsS=x<⨨(FtZZ&lsqͤEvvۢᝃ4Aڰ~2@7˭@-_u$BB8cמ² K4<P(bqNNfZRݎ OuGPƎ}֦#eMq|Ч麢b]QwcdU?K=0Ķɖs=S {hfiQwcYCk:C}1]-࢐P  RfWbXWa>xzb'6>etɏZ0ss66c9F]̚i[)H/̽r䥾^|k;"?RWrq״I݋ɣوU(w7)ӂVM:YlgMyz9W~~Ǚ1UT}g.|">k0cO8O-:L+֜dxAklvd\Yi)WaGFF,k2"¶6+F\#  Ea=ٴro={Lۚaw/mqu|nOw>E6Vתn~ q?:<,<88D*UV ++uS~1aXҰ}{W?ȨtC>fo(B?ҪvZBY&.A[S~/?]{_P}o?B&p׿}p=X56h(gQ.(ܼ#\]Ӧ?z)+5ii$) 7w|uŋ1^>|<|YoimU]8]JfQi_路I/?wfWtÔiai -Kv7oP/G9ㆡfBtɡwG."O緬8`)=iTryګn?TB׮m͝kM5 ܵcr97,M wfZ\67bjr#Q h4pjCuh{rǜ_0|y"| _ޱb _7$?p 'y|[¢Œ 2ea*D$^}`rm P%hF(CiYڞ;C^kНf!"'/Zwl궱~8Sqws1'D\@ѐi2xq!j y5`|)I[Lrc(H>S(n$>ǧ; ]iBBEQ8+ ar *zdff)Un#_01w֢:'[5jݥLKOaklPbQ4jE*Q $PQVb0Q5M^/;I#&M=UƼqE}R8x` nn [d\+[U/ܣ&(Je2L&0u^mMՊ8iB2IJ,ȗ)|< lnB:n"G$v=7/J_iST)S(D"Lyݘ l'cGKmQKNO†b_J pg(c,epz[3ʲ'}[ˇ趭wۗr~a TM}G"[%R5]IjDtYIATT=F&SJ2///**2?]!-r)ஏ`7HI~~K7ֻ˖n\uӦ(J׵xzf; Ӑ,C!$=o vP! ~G7~apڴmD*eY0^OQ0 8Kmnbl$|P(Jr\*:/I{ tNUؒ^ӱq7J+dN0%~[uBKC66jaH׿øD}' ^VV~5C(u)N.S`cWn=(/6:hkUɝ> M]"~@"+](YR0ؼɓ1abs/P7]CzfͺhwK saGcO%rBqg e z8[Z8tј@]5s|vU;.0kv\~$(\:[fv MQעzn7 ߿nf???\~ڵIjbc#/v2[iʬOy9ul,$7N_5a'e8v55! rrr7~;ّeY>dD"ƇHRD"P]y|nZZWyk[Fkܧb8z= mS5GP$Qw9J߀~C""cDb ò >{+<ڹƅDDwwă_|!VySҖ A~{{DD%|Lb'4]C]}yBxr^ҺD=7㽞X$iѳ=лK-=ia?9&Bkp |s6k Q 7' na&7ZnXXW(%%%VU׫jȶlF_.*Ci-S$#|lˇG&y mz@f"?~]D=6,!4*!׼@Hmo}ZK۫SpDn_W]L9]Uw>8<>gP訇cs݌![!k՟]X%"33b+P(Db+r9WdbH$ ^asMII!e] a]"B6B|;]_='p/mrÇͱYmCq53_ޕdz3.^w)BaafY@$S(2X"0}[A:0/YJɑՉ-}R!;}llL4Iza%y5-*2BFU*UyyyYYV%IR& ‚B?712qE9d4GT*%P($IrUUUΉ9bƍ>j5LGݽ{7Wxoӯ|C3_nof!$ #~?ӱnY{(! !lTz}aX\  8Np#%c=e'WYetE]o>?x-_On2N,[XXVh4 8$F#Nf+d\AI={<@ 8zh׮]b17ןkq#Cn///߳g@ qlOz3uό[g4'wo Ij?l*..jAAA 겲2ajjj$j5j?C!QɣϜ(Ю]/^LA\a͕Ή64]jnٲsBٞgmAC,m=bAaZ_HMC[ұ__+O} {^h|w۾rqYi%%%T}JD.sWrXj?ɎgVɤ;vX \v_MNNcYS u+>r=z4++K*1x0T!uX:R3r:ή69|%IR*YvL&"ڠ6X&"""--eYFsڵ0aJKK EEEji??| ZJF&z5=77G$9rðQFq4Ms_sΫpQ^=zt޽" "2]!IDATɣ!a}i' "L#H~! nE,MӴF i;a_3 oWUU!8pYf:>@:<75W^t[fffb4 toFa BfY2 @5@z+pqUUΝ3$ɈҒRFafc󇏨u|{T*3O?\UUxQQkvwfn=.((h'q~^.v}߾}NHHҥK@@aUUU:.%%%%%h4rwq<<"ry2#^ *57dbH° WUtZRA2|cK潦i… gϞ宦.Hk < B <ۛˌ u8#(?f {;q }w'x+B,how7×afqlvrP p]e<$'IOy$$$#I#Y#= 'Mz=]r`6 Cr" snquְ}Z[a8dڽ !b(3+ypqNq.hJS+DxdDDX#>!5--7//4$HTG|8qq|6\ !$Cq/*,Hr IBBC6AσהV8+rA loЀ'"T* |=d<88IqMnq\,DB9 nN+oG5q 'x56'AЍ@[ 6m *lT%hKPaЖ-A @[ 6m1ahv8$I pٮf+lnZJFi jP].¦(իzR*!ܾ1pDbsx+j}0vEQ0Ţhz}\ id2#haGk׮ (e M$I, 0Y d2W^'''7}$# l'IPpرc].i4*.b.n>lkRk׮=ٮg# z5,].b˲{ Ssu+t3Hn͕׭80lܗ.tt7H;F @羼nn(v6DKl{\y=f̘u=[scǎuVE(r`>l>'X,/^߿?Ono^ga }w0ABH$uуö.*lU)z~8uL[,Hp8x>\ip knH=H,|>:zHXh#,Bj ,^+(#0+v6ꏽk]y#Bg4?vfhR) y<(jUTUxG gٻgOEebඤT*LWv{IENDB`marionnet-0.90.6+bzr434.orig/doc-src/img/main.png0000600000175000017500000033243012167200764020327 0ustar lucaslucasPNG  IHDR5%sRGB pHYscqtIME  IDATxwxT?l A =Plt۽ p(" 4轊  vX PTTBFfsv793sޙ3} PPa޽l6$ԭWZ}A:u0LBZ~aZ9} Ԯ] PG||poTUwl=I%iһ%Gܣ)[l\qA]qo',M3xIG_Wuҫe( ,]R_W}=+ӧi;rN^~-]_E\5Hw^\=uG̠!=w=i ELЫθ+;J0g(]i~h+'X +3ds?PuILXZa8Ik *ID*3"UFrNRzF.ClyU֮$Q_C24}RM8$l!EA6H*KM\rk][+νYXM|tH)v;IUv݇mzN: Ԅ<E*nLAJ5ӫ _r}THgS*IJ'mzŏ޻ꇈY7Gh455ehgRD_'J*ŝ@biY񔕖:duV]vSxŸW$yT*iFy9""FZ^mZ@"i-u1)͎Q3UE{)x1/ `RHs+ 4߁4zb@n&1h_r|iڴ@Ϫ%䈊i)D/a G 5~?"h!WHa4&+~zVk/{2hJKJ8} QX\Lxh(IuаaC"#Yt}/).v䝝MaQaa$%%9򎊺(Gk-KKK9u49\(*ZXII$''t>5j$<<;wrL&VO!.{1^J:(3fh X@c>KiR~5:NUV< &\X D05_z5S,@m-3sge瀞ݎ$ˆy Ϯ85^zdKL@^._2"^,WYFc`f贕ןO_S+v;~v"pLQiyZ)}\K!1^q&خ3<Ә]z[1yf ժW!۶m@HH˗-^^?}$s]&FhӦWU&j3aK- hժ%YY}ɤk1X1j;IǧfGHKk{$ȅ:8yʋh՚7& 5zfn/?ּW9ޯo"mzҫ>jƌ%4jR "gvCNTs#wOD,uN{%+9\^=V)Cpu_g'9SS7'qH@BBe7nLYi)f=4KMZjA 'QAgyc,9g>q111 T={HMM%'ZԪU ΅ >~Xx8MSRԩS$''i8|>} y"ʥT;rMH\qᄇHL+3Q?&$q\!ӟ1meK9jdgglR:}6C-?#|*|[ VT"{D #0=++Fh;M @hhuodȑ"Iys/<  n|,_yyٽEQhٲ%#Gkqw֭[0|G޽Dxq2};]zz:>5ruV{;wRQaYF  7&[.8ஃ}2fh~xu6oDAA5bرtS?y3*۷obڌ#Gѧo_wƍyKyn,[yէM71n8BC6r2͚oAs4n҄~,ZEF5zmfsgϙ믿ιgiܤ y-|h̞CZ˖^-[1cƸe[~=n׏q0'5to{n&˖. ǎST_b%J^y6J+q|/4}.'f;Eq[Jn{%4Ij䬟L*J(Hp(H>3ot$ٙ/Q쒟+K:;qI둇,M:VVKUgESgL' .ٺꩨn=re.{ױu=BYg%7ɒ] 斳.(H&ݿ;zG=5}ԀXl6hVK@bSa6CnN.6 db{ӦML8.[dI{t V.dE]~d9#$/7jaL<]wFH+E.#W#*":Q>=0-"U ߭k77oExP/E4vk.:oMtkfz"?Wp!w9G"$ 72j䃤wdŊ0LL2QF2o[n{̙Ѱa>S^|E?0}[{shР> ,^GϿ@$6o},]hfϙͤɓxEaWnZk|.1+ldvjBCCV͚Mt3iӦ_$a|~:vʕ?"2&Mwޥ507nd-8q> }eŊX6Gz,7m}Æ!o]ALL 3 m6]ƚիk zŋG#2'g)DGGӻ̟~p!O?4E< ,XA<5;p|𡛨p!O?E<#sNZƛnӆ'NsSHo6q{ޑVHLL <4cǎrnV#Gi$Gh{A>c:u /'gPTXȌOh$6lw}Ϻk3f4 F~yj֮^͘cj*W^?T/Z;>Ժvc O]V~`pL~N°a /r 7xSZ?vǚ5k4MjjW5 =۷_ЦME!++$==>KsW_ܔѥKgL&;vDQw_-ZDZ4$IΝ; 2[%4s… \s4JNoW;[c{~l5USk:]pmѦ=<={'nC$Z:7,^HDYY0LdfB$t7۷m˅_ѦM=3oYw9-˕?HÆɘf9aINNfѪUKdY&+kl`ٲ6op]hԨ?,ݺu噧;Ssx״iX[n&cG ]?LWS6Rvw~%aJŹs9Y lڜ½fƍ|0fOs;$#c3߭-Z( tNƍyj ״IcO,׻Ҵ dlD\Zϵk:ڧϷf:w4Ki,m @WOAQN$]|DΝ1\Hk6p.l2wtO8kVW^nlZj 4 4t$H+YKǮrp>x=P4NN}˳mHx,UDwjfE'V^:/7BLvoIU-jڕkאFZ|49므Na]Gf!W{Hpa˖DEE\Yy]%O-[x衇2d(11vҜI[9`ܸyСÈvk?L&ATt`皰}&JU=4-?aFجV5KǨ{M kW'H=Bg}4qj*ZjED^6s!Vntevr-R |.__`|.]M4'}<%\z^ N?GٕVuI (ᑧGߓU>Fu>.Bϥϥxr,6{J*_NI%6GQL(<q Ek׎M69c/TP1jP]عc#騏%ں}V:;z[n-[ػw=ѺMÐ0w)BEE֭c^m޲eKmƞ={i۶-{ךּFNsQg Ћtݡ+k 0͵pj&%8's'@.R-7]T ֘镪{0:Vŏ9pCLnu]dЄkǧRASщyh{u( ƍGef|0g,dY桇T{n泜?>͛6QZZJ^#LrrrṙjU]U(yvϞ=L:Ÿ|xv͆bl\^NyYePZRBqQS\Lqq1EEE/.bEEiUy\S㪓~%tδ%SRZHL_ZZJ:}3R=4{]\iҖ9QVVFSlurOy9eΏl٦eeU}67Sn6?fW:G-+*+*PٌbRQALEE V+ebjX-lV+Vb`j8l6O?vo(vs:j-[yֵ{|OHMMeнü%@QQ!!&¼ORsu&k:뢢"L&)@7L{VLԯW{?H) #D؝ë`ޱ \۫'np+v`M5WԺ9 Ya#۶d_aOx~ٓ_G{x Qϗ٨\s 潅fơoW]L0Tmg1 * ;tҴ)ÇS t77l`„ ^oCcQso12j'6#kGk'a MN;XV:7tWY4k֌CҮ][ 60i$giӺͷp=޽'Ob9ܗһwo^~y.:vd3jhZd5zkeܗHOOgiP5^ޮM֭5AڴiQ#ֽ[.; i֬﹇6[qm~:Lg ԬYo*> ]{-/"ڷgɌVy?zh54q)[nC,6=ztkk(7ֵ>ݺu?bҽ[W;ej*iۮ[( 7p/"'Oꫮ;n[omˀsºNz^}뮻^xm0yd>F5Inh%gm&:/:_Q4{ U=wK&6P<:/ȥEɟ@e.7jmXEZUQt{*zsZλL,Yy'NSZZ굷Ad4z z]X,u6_Y 6;j>1ӇYv:ʫAԌfl1.W^MN;d->uڿIb!.>뮽ETnюO~I !5-M!ICuvWatd_O0AN%uO8]k.Ch1k>}v|nsJAkTbCyVNqСgõcueSe3wRq># {L`>J~lFۆZ f޽{΋/Q:W5Ⱥ^"b+y6l-_b%%8\ |} GS%)I2+ΥӱIB(; Dы]g)X7Υ*&%{~:ƹ 榤n+wFoN+v+N'Z?Q񹔝*NEYre!#Urd.9+gT.V^8}3]}Q,v\S/,srrshP_lԮ[XҨwRXaaaNS#!2 ɽun6,YBzz~+ޏc3ٞu.]:s`>geiO4JmN/pYftB!qL{tN/ީJD2ІZST?Pg7fPd֟[}t0DSmUX韘3:1)23uSǥ .Q{XŒ6/fpC}Wv\ÛZk(ԨY{H#vmϣ:us٤hAӿ0;o-5o; gaWj֨{nTw\K9p`/ ᧕9АJr9_F\g?o9q'JJ`脺0ٟzGFG酝C/H4"-vϦ%@w.(^Dl<էr':]g0!x},kUeص&/'B7aG&$8%gg( iu'|ͱOڍ{F%d33WfQ~IJoGxWu;w;'ݟ((KK$jq57 Z'&&Q:&k*fl6#2))MIԉ( r;BnDԙwTT1XdbIrȑ#dePi649z-[ټyƍazd;98$!?ZK>7l|p1^e4:b#YyUlj:Ozq;/<ͰĆo=7]S3k$o/A{) IǤ;Gǒ?Yyk L$({f7FVvo@aP0\;CX<'c"hJ`鲫ALtr76菩@< !2VǨdն l*?1V}|Z|sj1LXVʜDZj#y-Ufh1 ةݴXjMS6sƓJdC5D>EKML4SVӕޛ0yiP|LÞzj5ogWɢ޾(]v IWK됋]6kK8e^;sEEMd&(wi6xP/YIN Q¿TK]g_Ao^RЄO&<_CJ֮~l]!BbP@cD"uUt3/HC\&v_2ML N>c6gӕ7g.ez=}Zxw[M1#*pWS X@R2 '&&SvEq7cZ߬ VVV,Ʉ)$ESal.zCVVV,ud4uwk.ggu 4qY|VZy*ROT"JOk]<'#_J2 *%Қ3#_3q6<HWeMdeE^1Ǩ~ue4[1 ` A,ݮi;wӦaxܤxF1)2^_ZJߪ2_My 4,Z5Zc!^tuW~IR+_Y^/*@1reX4ٳ%ɩUUuqWr۞%=e/%JֻW *ʂc瓟ǹX8gͯW'8#kW8i"o<ęsg8S\qtegG*/AIEףÀ|\'KTdӇGj>vabr(w︷%|/Ĕ3rs٬+Kcu{=k)eqn &y|!]Hh,yw_0;7;)>yvHOj;of{(~Ƀ/ Jv/V3Xo/GWxHE,;X^V{/F깖i\,uiw*JcTW\*!o͓ӥ#=FrTv{[oMtl,noRzO ͽѯ\:/lLB_Nɑsd.y`'odMDGyΟb#i:W-o?[9ð̽=N_qh>wM3d=7 *at2TEtK*:pܗs#zm#g9{t#o K`~C;T]+!KYNgyw O{P`9Ƈe}a?g?yMŗ^$WKKlWeOyfԸgT,@qcлPY}~%M]ǿ@mo~o8s0u8y~ȇWMh?_Z5sr#hh'VMj${hr]̸.G>ђÁ Y;oڭC Pz~4qg#>0esӌ/_YdWFVONsW7sŴ/80QZboc||3zظFti nrjb+msU&O dGm ԟң-9ڀ{$:ɐ &zLãk8X?Ib u_iw# Np9PeksmDa40;,|*#ˈ6 F6-avNU 霰3>Seޔ쥉[@h?Jѕ;0' V8[ 9HjGSHs%=BefaD$u 9[Mؐ'Rbr:[)m,bR.@HMy."kWF!5[7T-0[9osɛ ZODے{/hjs_^ D]B3A"/loGk9J4i">/gj9nH T/xed՚qcB]rO!3[ ;f\ZzZ NR\6JRYfw2gy&gf2k4^U}Ye/\ҘL>ƒ4md]‰F=IzsdɫY>[X.II6<^`P ƿIW\ˏRᕶrMd]"`;JxE3I9Z%W4)qa<E@x-k')D-'Suyߵ<7l?yL|H]>[i  * 9713wl: U?bt'/`(?-AjShs-C.Uey#;K: $iAߧwtm.vK>GCX? C(G&xצVt#b{5 u/EKpo,^`Xw1kco{#MHzZmF$E]~M›=:ĦMck+?;{n4O%66&W%YpS6Ò^G%HF}U-fb6tI<ǖXmƶw4fM%1 r<8|Eꫴ}ObGߕ@ 'Y1z5IxH(-~p.dr ɡ>|$^5;[O|艻{f}%jDׯCuS05,cp`T:s Q"Vlgʲϙ޷%S L{m4β?DZ_Ȍ/?H KUā]z%:ϯMc`4KI!%}xoݖ^ ]R,}aw %%=c|6nMݧ _qr/|i))4S߇x [e9/=t=ۧBb);W_W"%%Cy|zY<~W9o~>}%z.䖔A.))gqo9 rCF-,=O~9tFZ\`%'CՓ <ɽj)h?]bVm HѩhPYFthENri=/mc$96anuS.KRxӌ-<)Zg)3 yVΜG3Ѱs푠ePfiVoβt!~/=FqLcOl{ʽYlU_!/sޕ4 K1r2_)'m{oW_G`ٙ.w5xgv̼E|2q8#nyW1}z237%d{̀RF֛]_2w퇙\Y=A|=L 3iVYǺ*zǷp6cy\Jޞv[}g⍙;eg<97m*R/SR)q!@͔Z < biS)V sNtXf;ysQ~ݴsG?ƒa'l=9Nƹ$:w$\W5 ?"|bh|e๑il9 5^I5>{LϤk^ RH9Ê/;vHDU+~׼-t&V0uCo]4ŕ,cm? rM^5[IN1[_{C,eהVTI`kIUURrEM߶/+ΜUHl$.GPS]m4{&NgV5^™PN:]$tKa:3'wP+Fn\GFBX!kN|sj;Y><2޽6@gꩃx} ^צGK/>0;) \Ű7}}O1rIUs?'狮Q*|S?1eYvd^K r+;4&V*TZ|yo3]h.ՠq|ToNN't~n b̜Zf/7* XQ u-CIiR3XXoWk.hzoMLcRFLCFp]BJs8k#/͠觸=)zH&”\+QĹ[@lQ )< Mgqְet0;?se4oݕO~ַķ{uk.G PI'_g1^݆1p7]7~MyOrF| SӐ?)vԢC=;rh_7 H:M绝iۼ9-;ak v}_t&NLī<>^9gL$Mt/m)EJ, (".+{rUkQAQȾt۴MlmIf?Y2LҴigLfry3gyϜP)Ǜ h>ZlmBAtR|> XVN'6l@)EaxF||os>N*;BA8޾^l6Uլ^Z"H$iL4)?|?_ݼ@$u={s=NjX BN!T9i `ΝX,+Us9e9WG>4N ~ ȥ9p:tIhZq^])z{{eG "Bf3ߢBfAA8RV+aȥpXv%_ Eoo/8NVȥ LTe' Gr؈].b#̝;+{P A2u?qݔvZΙȤå+"AAāB!JJJK;?\nڴ ۍaAAp4\  ᐶA)#ߧ18qK#,Ygmu pWu;I]w軻4ւwZߛ;.qz\d KOmmtme9 ?QA'7#qAAD.hR  9erѸ  BQW:mh<x.XBSŷRTI@R4DZCs.-,g.!+\^8+=TM:[6r|O !sD,&aT\6w ;vcj"=pK+w5 2'<?ҕK|D"qi |cetu']ʍ7ޘ2yme(%{>hZCB+/]Jbɮ4嗿 r(.Ȯ(V6WM* #_!ϽW?mOw`k<9\9מ}~M̮)]͏r"WLxxRI6Oh}{x{=gbϿH3D3r{x(m8߳/M|fN\ro)y\| տ,?7@p{SKvWe~1z[xߔ\r qTZ+r)Ba̅/eP?/drp}4?|G8|ٽӋOg.z1]ON kcϚp6yz:}.~͇izwgckK [z%/=ցY>_ >jwrnjyhS_{->?SOi?;?G}Mۦsɕ8si@p'?~_uV?YXx۾5Gi=Ԍu?+[~{5o>(nC[t7\J:]V 4 5 >< ,_+T](U,*i\|NMVw#~bN^+P6:^kKw06ϗ~vo.w }Ԧ*.8wrRLE1vG+L^9f%OZ6 ̇dhH8zk$ v5Ϊ$AQ9Ǹ#ݼWgN'oqȥ yi~#02/_:J#ɞ J>E|{)ǃر]]t5Ss5ף(S|ʄz<f_k] RwQ:kN]"o/30Z!v?kξ4?ࢺpU ?2Γ}+W ?ʭHD.ArVy.׿_~+l/i:zέҦk%.}#Xb-7v<+:JGHrdo?}ӗ:pSVu"?V2uFRθz[׹%|좩ذ1pnwna|誥 'eZW o/ea?;f?恛m|ò dRDŽO{gղehmm!^c!] a{d x߿uUlĽ~8.rXfMΥfzWN=UU9Cz{9{&s;A~AA ,..43fL$ A2+yeE4Q_aMhOбGG|_Tɿ_/ y%WIAٌ}J,"*ew6QeNjA/B/K%aDTc4 ]bH#!QK-|TY ~ s?KE_VubW frdĕK%ɿ_[Leh;.#`DRJi6!vb{<Ҩ%aGAܥqV.%nxj>Zl-wҥK|ո<.Mzc޽1YePTjA4io٫Jo3gw96,:vlIic{ȼ3YeP+՟H[ C6mҥKzG//񾴭  d7Z|}{uz}S`{b}Pm$fX. pfN-iV?}[lxlyjr!½ؕL֚+3Ӌ@{H+~?iA?4 oƊnaQesKr:~j9}?ȆŜ>g"EC#C#˥ݰ@3)3Ƨ%w#f )  s!}d^;xۗ-8mK<WY[9[N?=_ʚ IDATK獿e ~+p8D.͘iT&F? ҽTtdZ}YxMӤ:  G үsI;nO^ʬxq(?Lџs]c1ӹ#Qſ}7\|)۹ \8w|_.UǾ NͩbEb-ţhTnrxߖT4ǚGJ6D|-IIJJJ2t pɇMl~\:ITfS k`&w֮%r 0>b'1R1[FK1CGiX[$y_~-L)fp8Qˌ ٥uAArC.ŌerWD |ض%љzrX)5!4N?>-G'{]rAA52*x#I.q[G 5n}3tB5DPix祧yԕW2eȰiٳvNN:BF-,!>Ow{KY5GJw6!6ŢaR#PDj(LQF)ŵ^]wݕFQQw}7Gd' 1I&rLqT nsq;y퍵hD"^36n3t3 ZlT{qD]_;3+WrwP[[ˋ/ȧ>)>1sL-Z$;JewLԆ^RImE7odϡd˾zE,Y0OEֿA㶍g_G״+V4wgȥ c{߼y3.3g&wttk.*++2eJ:)**bժUpYg?3<{o]v O>.&5el~i.;~ڊ*kj)tz]EVTAi3 1)٤A٫0Uk3;i.Bz>O{n:Z8xַo[Ce]ƪU0 6lsMeN: &ɂ dO.&O~o{7̝; W>.2."R+ 5k6mdA'f`ư';7Y;E R75bm5[9dA)+tww裏ri_UVGMg͛uOFSN`AFft^k-[p9psq,e#{ gAu.;wQ)bNAY٪]H8ɉjcD8{ =nfϟOמAtNXz"ˈ\#g TtӢ~^2L0G>URGq$I( 걒LBciXisJl 6tAHOUUTWW\NX$.W2.*Q!umL%]`0Y2`N]] =H4Y ()Щ4J AHCII %%%<" S\ B~ezLW2}8HɌh|ޱLM(pp9myBCj1$9B0a2^4>NApL].E]&7IoKb-~҂HBA lr, ȥp! k3>$7JK-)rR$u8 H$ަf**Z.@LL3BKK+SȨ< r)ڵϥ L,dZ4>؀'8<{ty2a*^ ŸoA5f]HEiD r) z6D0osя^ʤM;`k_i.."Bp!RvnkCGn5<ϰhG0RNUem4bX^V3-B%n9aʥR4n={ΫĜ 'A8RɌ#i2}djɒ9(Ѯ{\Oi g8"ڐ}\mAr׎<9quĆƙޟ#w)HC'9\"GdLŌG/seqKTZ6O4v/T) *{qgaKw) 1M3+r`щ;Gka02dF\Cjf]0!EA1#:V2DcD/aBe8}z:}Ka455@[k~/'5kޠJSSsΥ=MUu;v`!ZYhz ͒KZ3ZR.7vrުoz$YNtPF tuuz cNaa!nEqI V5E0Ar9}^BwjnSSmF8׬y#1:1fE;vlO,! >C72~Iz?TX+וNn!_*k"k*+;3btww~Z5 BX ,V+NYpѢa%PJaeK'Ţ,؋Jhv%?..7 e.7>7^N97QyB+y"*Na\9{j!5sFLEl#O:UՓ8twuG_`) )..,u\"% y0gܝ2TVyߎ;R@J2͆ut[l(0OiiS Nw?l6 hԵRG4bK"4X |WfZ}}vٵn9#iSNޣ+e80\z3w.u'SZZ% RU]IHc|fSOf egggbKUu5UUl66A8jerqrO%`LNچ$ǪC#n4SDSD"!.t@tq'si]fj`MqhKIÌ u﮼kj [6 N5S^YC}bV֠Ro12}B  6ڈ8%iF[>= bX,:POw%Io] 3E=] ]Xp6}0Ch+"&QDǰ( Aŝw>“O>wGzkk׾P2toN 6˛.m#Q&d& GAaB`LȒRӰlX,APӴ8Rpsӳ)[/C7,c@=Y C0[7eoB`,:VDݔ2{s)LF_owUD0:,`bpsWc$p(*{좾~jFSbq q3kʩN54!Nv܁? ӦSYU-І􍙴zeQʔ3# CCߣG/ri`X @7unZTÅYLÎK[[ۨ.vKKa L?|*5k6`蜴t]f`w8p]T$l8FyyNgdU.+΂qC[-I?r B^f! X0[s:]$d5iƐ`ߦ 01[Q¡0qa5t4]CX g(a 4 4u}!lf9(-ʣ|{G -Wh`Æwx酧ٝ(S  Y,X]/܁ wd!r\r|c ?9܍K_uM-5)VP2$Hhaq1֏GQŖ6-nmXm蚆k C$Z#3/n` >,;~0N#\e΢ hfh"aPKt =?dd4ArK2P6o4dR'.)Ӕ+VԮF&-mNv]0t0ať}VF.ԭ MSWWMإ0Cy=g6| VIղYqyy8]L(ڰ@ HaQf#\@+!%3^dy6|b0txGR17ӭ7E&M{;9X-:Vj`xCݝDLjձYBn9P Sa``a%ڥWZi& p8fĤ]u $پ}'$Ӧe?DˣM| 9V WA$8T9vU#w>F)P(Lmm}V'ry01Mł# =q jj-Ѣ`(3L,%ڈb$*%f EEZD'襦i̘1-[fpZQF0@gWL4и_PRRHa >UVN’A 8 Â_UN*F/$uF tlVnc/{f6uvA$wt:L0৯^0Mž}-sz{jLSֶ?!&e-aW !Opv~5HpD 4} 1BEO0ZV\"t~ӷ`Dʌhy@JD%R\bձXtkK0D"&FDCMJGץ LTCSS֎N2hG%\)OlYp×>}vځIsH Q}TM_h Ê줻߇[4N t8yØh !0̹ WY%oo{jEI(;bhz`CtMC0ME4D*EDZjkپ}+-뿈n# }׿gìYs`\3p}Tj#޶Am"z4bR@hKNjLN TO? \C،cAvJ^wޤJ6+ }mGh^8_mGs9`IN ]י5kfuM$D"(XKȥ 1YP@Xe pMn1'1f8"E2>Q[SKӦRGw7RMa h۳OrP u=88&iGF \JRrɴI;g٨KGPTt L덍_llkchFii):PX9OUPTTH*A1D.A"iQXT0bmVHh,nNE()xPJ)(p]H`@,Ash9îEFOOOf7*iR4,b$FىWEQGARa%ZuaQu קۘ/b>vC$2H955kq3BJR8>}1V{rp?0i5vMs29:gzLS"Ș#%%%r d.iJEqyC_]ˏ(\q"Y.eoe(vG{Ar-*$0;aLJ0CǢcrRxKԑ'Oȥ0L&[)e D"ʔ\}ʹ Fi-VHưQAAXrF{GV:1+U~{:֠gl-KA B>NSg2䡴)G"Іa3맷>Jbj1t V@ 2U6 GD.!R#at3o,6Oͳ ˳'} NVTD"!.t@tq'smpE:MY l޴g~ f"yϒ숪 YK M12pG@ju040$r)LX]}t{N?jUড~ E[^%.'ܱ\*%=eF#QK ]GAL$ǸCo{~ Mw(Qk2B0Q t?+x펻jv nW!P~?m8'};>OSZFii'F RjB{> h`/#2ĐҍCޞ%M@MKl+4GO.KaBz;֛g/Ag'9Z%@͆]HW[^~w_"i㻄BP22cu2Lٟ/ht]i#F^gh^"}x!!{zz8eZneF_dҥo~Q\ \ܮ &n@1eLsMnR\q(/t\ r .On?Vw9Ev cRЃcOak|0S(E˓OHc#M/W ЈAvܹ D.tHKAw̯fxFy@v }Yv&a 3OYsn7bUFtO[o R)!Ow iŖm[r/c]6s?s1e4~IX,@cڵDv  2.Poo^;>zŧƾR&FaC\ BQt]g֬9̚541Mp8L  b3.GE.08(iA]uY+bEU  躎bp4 ʥRY|bͳ o3OLw>=[zڼy ikލg74uSXxlxEZw'Ž0P @kn|b^ǣ)][3xps?㇎&g  2F,s;&9QkS12/Ifͬ]L[+yZ7tb“OW_HuۈgVErsV܅ETZ(' yitq,B8*rrՏ }<ƮmM ۏ\U]=N>cQM CUէ]>z#m^~e>)r)B ?ϋ/O~ [_PJqY1Sd r9ud. ]K?_xgnDU]}"ҘLnٸT]>zmNq+crD B?7ptvv￟=od pXǣm_+Y$ڑ ? 0w\nV/g暄l~d…\r% Ol28 NsظUz K+Σ>ʫJ.GӴa{СRk_Kߠqx. *BmKŝhΦ2{ fLLRRV;{pƍݻwҥcҐ ԦM5gL[[ũ٘kqюL BM3o\DC7f=m!"9b4rԝ͕:  ,Tr!0 UQ (68K&5AA}(=*_Zu* j.=M+"s͏Qd'$Y Nq߯mٯ }_}oF傚KW1kQ<#WC|F8éo,_;>@XsUA4O# ,/_॓}ۇ9|@(8>^n~X/Q~86J7.Ab0xW"{{gHj~Vleu>AA^9߳?w=~tk٭{ZyW4 ,Uq|N^N|_ZtOzOan3u9~6zf;}{xoߟC>|VWPp̥Ka8A +{`*a/ ]b/=W?FC8}|G.nQzU6giͼ ʳ8oݚϾm.Ys8w,K?UA'ynk!Ź#=>XX#W)yi;[ O>5h[W{7_S=cQ A*mMANw Ʈ_~bGwwv?p uR?p;CgNW3:zѻQ6=ǧ@K})yZ\6]H NA{w Ni MQY#g~s ?|7&>m;'U}'>=e1 B4Sw!PqKOw4 b.W.Z\EU[ 3 iAAiPDslY-. 5AwQ1  KAḀ   RAA*RD@>A PigOdq]\u ~􅷉AAf`.q;g7(@~.6HD>0lAaUbRd2TΥk\ ɧ6EAaaeᑊȥO-tB69KaHά  :޼&<>iij$OV۽eGRRuAAqbض+O@w.H)"AAei|~7mDZ7*?{h\.sZ*~  Te>>ŧsGE?1  +w;)x >d2|_ҥKw}AV6* IDAT|cԩSb_ؽ KaQd2?~@ ֭[KqyY~]v]pOt>~o~3gΰyfi\AeDݻwsEi9|~~O&ŷz\.344JSS۶m5AXZ_4 _,/3aMkosWMTYPsy25Sxi,CSyLXV\q]l&oYr94MCUU\qj@0|Ǿ+dYE!L`&o ?aaX9rn1ihPPp]d~XXb*Ǐ$cae+/{c_?Bx<صkWIl֭[mUӧqUQAFCMUE!ŀEkH~)>rްe˫Pn+w减+]}6c~M>`߇Md&قY D~4]C kjj"Es [4Ψ5vl汬mm{S?CH7sjLT~;`ppwݬ_׽u2 +D顸]1LoOA7VvmrBit#]Ǟ S;*Clڵ#x3G_k;w ټ]%( oYz  &\65p_8~ ixtOS4rqlxE>m.{ Uʽ e yr =]`_=]s/ mje]:ʊLJoe+/ruVnv򕯰}vwb&=hjj=y Ppyp[ߊqa(ㅟ{?;QPm ^>N",dzoFz0ýüTwLuVXOظkɪ mm45v=G Mxg[n.hTTFA];G 8ғ\yظowe.)by`NzN&Y-:RCUkm6lHoXv-?<< y__AAXZ_Ncc Sh=_[xk[Z b.7n& m4Ng&XYz1'+r/DEQ8x`E4AAl_#lțnuc"p=06EݨdXܸ>sMKb,AA&߹籠9vt, XٞM~={_VVw9R8ZwSg}& /RpzpuGUa`xrV AJ'G^~a5TǸ#/iD#ֶo$Šg/?9nζm+>O/~=g8x4 _ND5tݷ0J/TK\ 0ࡒ|_>…Kdki2AV|Ijt:MbduWԕ뺠(\݂@v s)xT*p0^-2FTgug5*gsup4'͝Z΂fBرSnAX ֻp<>4FrQLi+_>4AT6K"|60z=+pj_̥P~![wteyqQ 8w,eq&:::; Tu޶m;Fe>ٺu+HT>T1BM[L|}vv.ȥΕ+i{%)7) Q$eY𑇉=|>\oōO:JU`lG1|Xx|X>HAXΞ9c?ɤ?ӟpisc:2P(788@&Y~A`DW!\L2->"nqdH`6۶fju]/,Re|&|vɻ"k74wGʀՒ hò,켾O4%b.hW>e0Sm& Q E|OCCvjddҩ\u)'6[Q;;w]z6ls)eq~sE122Boo>`(JevD"Aww7i>),[lFWl%ൊcW22 3aVnyp``YCWWz+.]s),V* +#`6oR!.ʸQL^K_a͎;{ py>/Ym98_x?Ώ~#ieuNELWG$׬ 3<*IgdttKGs)Ld7qZ\QR:-L2zUJ֔,e3,V^(}+EM"Y +MӸ馛*n; iLWB''*1-3c4ZI`xPuό$FboNfdD\.Gs˹hV 0S]W9-ſ T͢,v&'eͬ՞W.]1 6IVap}U4J2Btgz:_>US +U撚42t` y8̪Gg;-l2@Nˌ ђ}94PU(ڴm ж~;y0Mk)21lTu6)Pnuץ&q ?6D&T}_ƵEH]Tb.WsءgTuZ0L/&th(r(n)Y>=^<ł-I*ػ,NGF0>O"yJdYfN\;?=I$aCDfYq:_ t^`_ˍRk}$!gr.RLcEmfMt 1˜W`R R6-#LHʣJ,>8e4*A]؃j%QQ(R;mא-CkkkE˧^BcD.\N0Gc9˦,r)1qX{lDu!IeQqE.7L$z)H>[vr<9:H,S39^G疦ȻWF)+d-hd0˂K}f39z{{innh0;{;8c-[LL򮶚pEVxue;Q=dY2`(2cl`/`\ f" B5s9}w]N5q*|鴾H|xEt'ӲD"FSSD/\ +Px_iZ3o[ UMf}Iዣ<܌}+]hl^˚^:Ǻ /FYA&Ye AΏMMfeP&qII3z W Qꂵ8mcY 6g2Yңu:S PX~ӻ\.% +r]=fVWLNb0#њeNg.@#Y Fewa~驉mH9Z-2kKlr*sYhyyr/Ur9KeUíĆFhil`&`eY$SiHaqu떪g<'64L0U-2ҷ'fZ#kMK-ֈu]|>/-x})RDLLp&z 5V]XhggʹY&w @]j,? xT$Z=wh]_(rSR$iQw'lT;~_ FcchhVM53.sg=F}CIn4^e<#WNW+TbU0ho^\a$Gmga,suu!"хY "rU̵juϊ?cmʝ|%}TYX>BtJ dw).t ʗI WTH2 zoS|\ x< hjj.,+OcS#>s1MZ׬!ݍg؎===AZZZ#HF twwԄ\|` @Kk+( tzNurHGBǭy͝֏&cºVfu!͐NqKZy2|fquvqKs)̓#+7enՑ޵F5*oLd\rW.wq9FFFev(Mzuޞn4l\ixoh`]D˶1h.Ë%rY̺ˌNGY斄BqhrPTO0&aY5v.',z5ZQx<@"@/EcAlƶ ?}}B!l&0<Db۶eć$L$1Ml&0͐^ˆ0{16cN0:U &T,~"S~qU kc6L);:ui.Ü"\Jq'Ra /ؙJdqϟ͵gzD]iniL&M6!oY%:?i\.?i2ȭҼ {M ӣҪ߁RJ|~ DuB0nPЈ+/ Ȍ r q׵]zF(3Fu+'X⩵Z aAyaLfL 7fZ,tK0M`06Ujg\ aR0Lyv{FVܱKdN#3/P(L(.b?Ur / zrr9`u iRUUK|ޒTU׋a%񘘦9jBfχ Cǿ h,SDggH b.ggB\wศVZ BM]{<^^uuI~\\7b.W:nՎ 9է'[aEg+aPU;6mIwN_ϲ,vV2h:: {A("68alڲ?3B466qY:(..!sE^/F=Lk#j5u*"~2͟L뫥?osZ1FShɴ 5R"KeNj#|?٩#MmcԒ*#."U 渑dSąB`}G( ѲD@ @bdq(J0uLj>H6χzg~ǃl"n]g*֍{OO $L]H<4pWOUִ^UUN9ڵkfg_p̹JJ~S4\EQj;-L^nwQ".;UDZſlfhh+=1RuulX$8s%]rihԟd7*ysjF:s.9):63ҢϦMD3 7n S說uVb_V:l)ekX[1;5R4u<^oE;CॣI8߫|6qC{a)y9WZF#u4GxgذUJq( h;w0=$FAz6nD.ib,uqgbrQ]ظ[&\b|jeYd/#soqکu9@BV1Tl#}5/\p͛֗[Z?ITUUK/b.%w#tlD}}#[9-z1F.r+DbtĨީLdTSR`(4S6͜OD݇gׯ_o^!U4m4 A\e89Z;/a};hR\.O/R߼Si46R! Nm2'Wrjf!ኪovlX (*NMÜ4@_3z IKc`(M[kVP崤8k,RSа`1Y"qrBޘ\VBMhX_3$jn6#~O)ZZ3Hru RU;ŶMc]UB q:MM sϹs) óʮ\e_9u t;3)>EA/n$gPt JqH- ]+M؊MBOpinj``0,5sYN<vג B >W:Lx-9f\SUE❠LL'ch^UM,ac; \O0q\l%s]7DTMsٿfg2Y>d&ʦPX\' 1 N.]N8i"nci*8#)&|P]m,^{NѣGʁ䜊 sldp.&./w a*Uh}2/K/wߍiB!{9n&~|hNdPǧF͗O+oӅ37u MSPz_!ʲ}s(8%wHf5$pɺs)N\8sl&U5rEq>U[9kh;<{8D㛦i\|>l^+C<$'{(=0N@rڽU0|~Px|ljh7z( HT*a %{5=drqQ*Z9Eja4WVv_̙3l۶MHk'PqfÁ}l󮪡\PH5LY"oY~^>sJ7ylG>*/I_'^;;-s9јlcϸN㦛cNĆbX9 u9{y;;v q_ǶIufwy85yWݬع};s 7Ghiن-[h횞.j8M$es 9Ul*$Pry9% r& qF9"yt:K!L+U mEPԱizعgoif6qxru0.ֵ3O2&Ԡ9IUUH:j|٘PgGf4Vu]UG-Nz渲VPUp`E5b8ݽChilzr!u=4Il݈<Z"zf:4n6 ƅX{^AjL65L]Q0=yX,KWQu,pQ㙆i p<#rp& $ 15?O:@ea.ub|:3Wӹ\ CWqwqضy#Ϝ#}v!OvaBcұil6YsbGXŴ#G;Ajux̪_RXwfN} {A 0Gr]!#t]'H(8 +\yp32@wOLL&C&2uuuӦ \֖V"מtwEQWB!YWӪP*(_Fl^6lI/+tnbTʾ}x'8tмMUKB^4tMg0åŹXB~ -t˥,؈n ===XUzzz9qpXpDo8⊪jjS~(ixLsn{.dIH';zÞ={y9{,[lqci!g*<^P]םyyaK/S ! RP_QD+$G |>/l믻W04ӧp"MkVF=é.VuQk\oF T";LèLa򺃇|ӟ?xğ=Wla]WWdž x\֐*rY8ԑrs(j\t~9SOMy]Ǘ XDQv>H<>QüG2pnrQ ~|>r9 M7hkkGSWPrxaeYt]7Ɵ="so1>Í7ox#O?$[۳g?0444HՌpSQH$jaVSL&C޶DASUI&:;  B)<X+\zyт3ضSi+w,D/c;7L$4A]N޲PسB|$zVWpAv$se=RJѧmUժ$y$qO,JWW;Xh4ʑ#GۤM|FQ,+4זJ]wJ//,VUʿA'vэO:go~'z|^zm zKVD}E]vfŽ?38.⣥V3E׾ݪwDw=ouIGŤ/蹶,\V>y;bW+={׽ObdZ,]mhT J\X9G9Hwhww7?0 F@׿?Pd2I?---c.A ePSCsiU9j$omv:,V:uuz{{J QT}Ν;/~ѣGMӦ~Kq9*m^u)??_"8t> ;wfq::|IΜ9S:_1RX*_W ;eݙl5U JKaųo>_~/o>5<>󤣣y[dI̘m)-I$M/Bf(&4 4ӥ!ILX'Y5xtC%K%Y>w]ٔi& YFF&̘':HX*gI?'۳g>,<({᪫?1112G }..uo#__~={Eii) >Wjk͎&U5.E/v-ΜfmKw_gVhdd\8Ӈ"%%2\tڥA^O\c ܳg W^y%?ٲeAx=OϞ={7ARR".C9*u̧FXG.h t4v@ψo<βYb.h{Axk7e VRU"##/ͅ.EaÆ 9r;wb0ĨKeLuإ-B]jTTT!Vqų{ֱ'Rf&''M8yCEg{Z#=CCC򗿜gΜq]J1SO*bU Ld"33R1FpA*++ N;݋@=..n<_2QQQ<_.`;_lDn~)߯[t)fAXs jkkI0hiib"##پ};^fxGyGʢ񓯾*vg.ڹ2Xq%^ :::ƿ[UV($&&rs?W^g?be$33h`$%Qii)ڌ۷WU^xi-à_ IDAT j!cۇpcn"22r,&//W_}NdBMM z+tM N5\Czz:ӧinnͧpQ a ,'iiiv?.XDEE#iljjjؼy3E̞={_~yy3}nK_Ңx.W$;˾>)jAXᨪJNNǎc풖hJ[[/EUU<6mqqqٳ\{\wuq!9IrA;\ĥ\ry40|̻1a;aͥ3gΐ#YAlܸ(^yN:07ojqH`>#|_ඟٻwd |sv? 6,z.Aڵk)..q4"nF8uk׮!W]uÜ%1Bн6q #??N+ q8Fk) Z.)(X)v!(D+ M(,,$33%fͬZ ¼DK SPyy9r-b,STTDgg'l۶M )Y@d:WAV(~N<)X@~_Gvv6=?|';dpp_~뮻m۶~^|E=Jvv6C+ALff&%%%h2qA8v=oG?)))'?СC|+_رckQQQAff233)((`ppP¬,+-.eƍ8q:RRR K/Dnn..0bݓ۵k׸vz'ts}KL0и!JJJD\ EEU !""$E\.fb:5)'X,l*/`pb!Ffw-8Hq @~~>tvv1.͛7*?j]v[o#z->Htans*rE2CxlTН7M7ӧ!IMMtRVV&ƸDNG>w3<ÕW^l3}vطo7x#O}SbTa֌u[|<+ؽ{7& bMdE!//.2L&ez^yJKKx//|>ٴiR;-., #&&1 8&l?.ia;ƦMăDGz2e\\.\k[yHurO6Wfrsn Ɯg\3{f֑D+J~;v{CV )))S\\,XB)--e֭ 1Huu̩_š/ir&|†<{P_=?j[N?ONUW$3M|g0?N wޑ"UF^^_~Y"0LlذAxi뇟Qe^MVNb*Q7d$q7wߍIioR}Wᅴ-tA2i.%Ɔ kFV)t:IKD pqn݊^/~g{:NDdTmtuuuȞ󎯋a_}[ /uːBRy21 dggSVV&.Gj#X < TLvf_=o9?pxLEM ܾ',enk|a;An#}k|;`{gE\ -bAV,SUU%XD8y$۶m$,0s{֌qpn@2KY%Ȝ8um_|#Iߞ/G2I;T_?b?7yܖ^oH%6*>Ȯo+tEbAV=NTJKKYvd8r6mtq23:hgZ> <>la/bM#b~#ValOy3?]q"i@Ovt:6nHUUeee~222$ ⋴=c=/wo'**J xzzz8}4_=N+@  ".W.[~}a2x0!))ٽ{577sm/;1,8raaaܝHmm-Nk& BjGb0R}+إ:KMxbp8,bbbʢEĥ 7nwa׮];vlJ=ߏfnzZbY6ٽ{7(0 ͥE\ r- MMMtvvя~ó>KLL ׯRQQAnnLBL{=?1444^z ǃje޽"9r˅磩i]a$%TWW555b0ahWN^^ƺu&ge͚5S dggS[[ˆ k;fJKKp vA]]WAq)$@8<#oR^^Οٟe1 yyy~:::.khh2223֯ PgFfyF7pl 6v""X-t6ruWOoC5*(m3DǺt-p8a͚5׳vZ*++f޽ Bp8p\>}+bR=p1hmm%""B6TVVg_aE˦J }wNpu:S@?@{Wħ7gS3AЏJN'96Һ8R^sPRR<xFjkkO:q嗋!عs'GQz`<󴷷ڵK 6DGG{) hq (o3^pOrWl$;w nçeS30X"n#0+9]A\x8 *4[IC]K;tuvR},U b.Csi0뮻hkkjNJ3rUWɓ+41 \{ꁏ㴷鈌c@[[UUU۷o;p;>pGX|>{IOO?cX-l6V G_,RW7t OQ7o&v4HM]Ú5磧ͣ` bARxx4|ws z{X3{YAX|403---p뭷1B޾~\|~z!,z<^N qiնCdÆL&7MX,>cˍ(Jlڴ{Fd Lmm-c@aM$_ㅔ MuT531^ a,ؾa:6`ש 08/Tj^y.s)BhKll,"./BAA $%%1OR4LYY5$&&(Q4@$cKMgfq!}o%yQCۻdL ?4z͍^럒D=%<܅֧QMV,v+#3zU5Ԟ9ETt( Q1)t:(..f틖Fe@CC~#\.A<6z[3n.Jt:ӀdJL#'jj3'*~IԍΈ@ψπԜ (.8Df:b A=Jyy9999b L||#%\k K׋7yj#c6m4my!ǏTEz,:6}Y>ṃȋG〇~/D}EUikkI.XV֮]Kqq w!QTU, {}DEEr4.e3 #g0FrOc+:HH@ \E 4 8:c"\.Fbz.lVAgƍ<444Hl(Y81Fl8yՆа{^²'On]x_.#a, ̖񑉉w|8\rw Q\\,#DQUWȈp+OR]SCRbGD\ hSAΘ`_.AXDDDIՏ?x- Q[[Kggg\륨Ǹn;ƙ3g&}Ƒ#Gw8r btBqq<JKKٲe A Tq)\y͇+v]Ƀ>Doo/utttqŮ+P!__rW6oLff&W^y%|S"..;v>1~4|>bU@~~> s/**l6+ \Ҭ|".e-OE{ٲe+7n"++Cޕ["~z>:Dvv6Oߦ;w^zi1zzzٷo+F]-m"""(--]Qlj'ضm:N Rq)I}}=)))׋aBn~_qmǏcF#+;v:ujgxr6l)Lyc)RX4^eP}z=^Gpk׮eDtt4;v옔")) `RSO=o[~%\e_Nbuwwsiv1FAq) NOorOw7NI̔bY>ȍ7(\ (++#t:̔Lll,ʼnMOѣEEGٸQ 300@aa!w;y$޽{W OuuuPgGGرCR "<| IDAT“O>; |> O>moC rNuuu466R)sQBg@AX2rss)--f+v]Ƀ>DMM5y_*V|hA{=֬Yy a!eP::u ^+2e]gggg>MAd"""HNN|'N={!))={q=r۹+`BU @UTbbc*T!//GsN 4թ?ӷ GB²cW>Ost¼BQ__l"**V(Fgg'MM".WrI?ccl 4Mw{=DGaqD,7kϞ=nPǝv4M#Gu>Dii O?34M{e<7yd׮+KAIOgg=8#C-XRYYIff&gΜ/ㄅaZI]tvvxVĹF+Ebb"eeeⲪ7xfSUYW_3ĉ\s5㍘['L&⩧y5Մgz+u&rjsˁȈp4~ iiFSɺa)i[FXu]D!_b|cǎmcc^ԩ+%h2aKrrssy%++9}Ͻdee '++kʺ;̖-[ٸqvpлٟ&j؁ϳVѫ_=Xi4T̿ +kTTrVzicpՓf+뮻o޼e^JEE{6 ])K&y7T[?'nT󙜥#Cސ?EXhwb⬎3S uwV_TTTIe2&^w1Q 1E,@)Y SR^7i+ KOnn.GEi4755qwθNkL=8%s¶?m7vv=[?Q>8f <z?MV -kuu6LVC=y(rI0VfS!.;۴풽!j4V Bo>jkjz|M8V>8^VFRr2NS* оAj'22j`wlimmb,ւڵk)))YpqyX~=1113n=:\TtOgpVmB'crOq 1&4W5\9xoY?37~rr=M}xs{K4 h\ 7~1qzp+?ш%Nl\ܔZN#, GXXiok "0QDj@@PPJ9q:U`fU bbbt|'y'̤۷?EEEl޼~s׾ٳUR(') ?S-; 4My=@fc-71QJC>p7[س;5čy/}c ֳ|ÒKLelh '&f.;OIEƆ, ؚ"6OBb"Ô>=vS_Wǩ'9u$b ̑F$V53)Dgb8넕K~~>gϞ4o|ᇼxxW{),,r [˫9FZZ$a9WSXDGlsw7n%;>5;Ofu޿k|_w'.E6%=7?Av\Ĺ=8n҃;DZu~wb2 ;:E@^h44 ϋNaw؉r[Ci455rI<ޑVÁ p ߇+EbRx9ѴIOU"N__/6}On)y :ĉ'ˀz<ɪc188@CC:ujұ:;;9q7pÌubV<ӷ<<R>c ?s_=>a/;y󿳐g(섯<єvݻ? ŘykRӨ<}䴵rς~jjj BPT4088'y9lL` R[[KRrՊlFQvqtwwS|C҉Z@EvO|6Gi5 IeTf ;~^q1:=X,28-HtPVVƶmtq 7Ξ={ؽ{7.~ԩS8p`ұXyD[jESɚ|9&2'צwy_xAS9=kՕ'(#!1$"RQQQ_o+/|gy[ne2??_7Aq9cx^^ߜNա7t_t:t:w}6vN*wEz200.*6 >Y֋z=UU%,, HC}=uz`. L3?l#qT19QX}-[ 5_`hK{N{TuLN<> m` jh4RQQ;Cdd$??yG'X{96mڄ`k!!!A *\.|>/==}hZ`Wcn=M}E^GQ9wc /su·֤^PX.'fĤ$|>Ξ=K)1$)(2IL*$vq9՛9&0R_4`۰YolDS k**0|VvHANoo/G*((`Ϟ==%n{ʴ7oW_}UUٶmRqxBPe93~ !L&A 4'$PW[KC}=kRS/QlMwxDA9@Pˉ]ڨFb=Nji0HJ#6.zTNOM>9E2iY4LF4n^x=^{-tww /0I&''s뭷b4)((n61 r9[Lx^L&ӂ{.ɫ~A ..noͼ1pX˅m+"Vfc>&z"bƃ90m-HX;GQPԑX֥{_5D\_["FmAXN)ѹi$mjK?а ه4UQ_[AtL"ё%\``I3##v6yimmeÆΜ9s8skGߒNp:tg&$IKC5]^laj׻BzJk9.P x^~)%bTQnPu:v YʽIr.1o9O6=ΔuDy/~? iA ం@&= w-{= ϩSIHJ!&>NG]sۛ.r6nSNng{S FbB,&,.%-6'aQ #*u^/D/݆k ߄ٳgygI]AFU&6eQ3 uOIˀa2\CFz$¹űI{pAYمF\|~Έٴp}Po0,ĦQWEL_UF}}=;wNox -4&RW[Ú',4&cLX47CDD/GJK48lv-T9uD`ChNn)St3 ?\4 `8'j' wfA. p}tTJ Gl{Ձ`4ւcw:QUp|>/=L&#| vc0uwiV@O7(`i0؜NEe~,6;f>?VC׍|0-h_w6@LL 455-y4&*6bbgx̯v`ϳnne|475Lrr2aN'yv`IB# UQho#\Lbis.e2usˉ#YFդu#+IײO?Z@F[JlB<[' uwRZpCTlaH*ʊ D'bX>}J|J*}=t45pذm'Z pE抠OdLft:8\.2r1-T(863GT|:>1 I6c0ؐO|=O[тťp38G[Wsle9)ikN8ޞZ9:/R/V Ek[2EE@@<=xsiܞnz{{ 1[̄c696h<W7nvZ @ogu-GF\_(t`wPdfxhvlaNښ4v6M JOg;z&zpEp?[Aw{6Xjk1׃^o  UUwm*G h218\r".gCxTMTW(h~4E'-͍tb; wpMWW'>Ԍy%XҮr188HuMYM}]*6[{$(59ycE@&F\FF񸪢 Rf܅2jMDXm7iЊ6]yDLz-{:FrU 0z;;Xz;;D@o00[uwx9M=bAo41Ӎb%<:NOwG;=6Tk**I-6;(0?0>:>iF[Fk`t", IC117ǻƄ~8z eySU%N5 M&zzz&(+u\i3 3y0'z-o,MM;9u:6itlj+vE0;}46=!v2*. e祳шktg؍=SǷ7XlqqjX0[ RՊdF`*F6tq1jr*6=8DzGiH`7 \12 |QQ92F9YD\Stvx4' 1SG9}^Kp*$} qBc BP4t|qy~wnsޥ{-"TԕF3)uyg?\K)}4յiݤhNGUU\ѱ$cp4\Q1/E]$\ IDAT*@דhԇG:gBcY"bIJ!GW{1 IDR}$^T+U'0$QuX`4IXO bSl=įIbwxuXtA{EH]$![=c;v(.}&7KWS,ڱ+b$ETD  b?Xt|g`wgޙ9ws(r-9j4qEl'#e91eKD\ }yGazy5߲m`D&q%&@^Ou"*nڲOumj}e[QV]gKᨴYӴC- CD-[Lqe'#t17(8(d񐞝K,6xT5 6;XlvRQ5ˍ`$yDc4/eb( f=f,vG4erz&`˅l&-+]qE)2r0̱@$Aq) :`2ek7̾骦b4t뜴\ a7ft*ڊu: =ʽel"(\Nm}8+cHOd2Ħ)f7/cHJ'bMn2k _^6u/O:I%mY`q*x:A\2PD$D*bVKTX HMKk57mMoUNU5|~B 0-/crv '99Ր0BbUs\#XjVq9#".pp"\wc~|>/'NЅ AX|$tE6DOF' Jt͎X,$'tYF`VܮǗ8{=8ϑXwITsjK,xH!99Րxo7, ]k׹uruJ+ [F4* CdTjTT;Z8Dۆio@,rFfbZ# ".%ǎ]uF#qm6jjIL׻]/X__GMMvw->Kz&%IT:9=(wLDj$DŽݺPt\Т]˩ 7t+ɫ)p=N\+gÆ)JLj4 'ǹo=7ڬȑ#->=w (ft&eѪ[Vɭ*f=xX5\lYmⱙTU7O3NQ ".{e軎a2F}}=JK9u{?ޚ` @MMLzwZ6[B!**n3rH233lҽXztRmaٓ [;"#5O=Is(+&ºmEeg"w4ʌ.[B5}SUyKתEL%*ll<DT7%׫IOvaL=rtFC !;w/]GAiZOQ@SU~_|>  aAo<yGc6Y^f#%%q7꯫~{р1 pZ۩tښn߾bvIRR2f)Mw%|<ĊSMhɛ6dǯ؜⎂yvu(.H󐑑 e+PLX{DwRU@?/k+tAQ:7{O`]1^Q7zc2 ".fcDz: x^*nߦ%t=%܀RC$1 :ݷP(D$&'g$DfGuKdYVo}B ]w}?RS׀h&7RUCGj6"FQ]ǎMIIi"׌&>,șf;Uh{jS::]}ZO&mccqHt-/6 ͆>چ1!-o.{1*K'3vU5ZqH/4;H==<-k A>/n{y6F%&0u5ᴨ&cn).5 _@%If]v 7';:粱lGhGлsM5pNcel:pOWwC0 ҅M84_lhozq{e 8,&.xuɤ)SQ v2ś\;o~LX~QoFiII K0V[2X1']pD9 fpyrAKAq993H}eՊjΝ;(Vf7u BIjkqXML< 7跶b̴Y T^FN^z|2o"mDzy-S#%  GXmQe4G+-iZuTՀ E4,@EEeOIb :~,c,s+".hjWۂ',Hq/Da=X1S Dia5zcj'L&ΎT͑+FL&&S q$0ۊaMAAk})I{k(--#Gz꼹<OF=;/I r1zn|CiI "pj%倧aZ)?wK֣d3Q׽d] #GL\L &2&FuMQUA`5h$uW }!OpV=_];񹉌M 7Qqb Aq)ލ㡮KbB q9;`DQ\.9995݄AhDtTU`0`XNbb">4VVVe[laڵ"0AQ0 躡ᤣ3uDis{` HM#ܦLeKvd2D40:o0~$%%h].3} _?&9}~*.O2Juu 9z)W@Rb׮\Si2`XxzBXŝH\bft:}$,YlwݞgMQRHJJ~v@ ͛:vB*-htd`qfI# 9Si;Ţ=+fo7UUUvVZdbʕW7#s|b⿥Pjy> >eŴe$((Z=me1j.^nΖ.2=ÊbQaȣc0?ZՇHr8y|ldLLH44ޣe7qqq$''7F%)):BT{87vz{y,Zahu FͰx\AFPX;qJ_X9ba{!sǠnVqN7nbR#[I?IY(FtZ$eQ),!sc2xꩧ(**b˖-,X{H$¢E4]sV|\L(`0Fk7^{ב"O7[NQUM!/3^" mIt `0ȯ/|ԉstYYɭ:M_mLFTPT|)->#&Ϝӓcfؽ{7Ɍ5ݻwl2H /Ѕ0kXsOD\}MS:q mP O6b2禓챋Q'.e}< qYnVuM;Pd,]Rnv?DZ_^rƂ9;j0 ѣG={6 lʕ+ʒQӐrW@0kUU ]z. <LMlirJ?~nD6 9s .tܤ,[P}ӗJ)ttFzpxC|opt3e?~+ػw/۶mc抑 J-/>=ؚ-\* ;.˞Tqք4](ýKW  KWȀץ+];iνl|8Çk-{z kTːRp.]ʁعs'/&??_ FFSQԵBk} h5{1.2"|\?#FFəNq4Uu=[رyVa@Ko؛@}PexYftq!&XP}7kf#u-_*_xkQeTsVu]8xO]jw^B&MôOWI9ǰK_IwKxM=g#.ˮ U~,W'}Oē#d32휾tR2IrˆPΨsNi֗ oF#3gfoY );f0gߋ/sA\ r2'-_W.+[9s`69pP3fQhLEd0wU=׆z-Rc=iKk~IywB;j!^| /~*_8v0 _/ܹvIVVG (q b^[>ם9g'Hv'0áȣ3!рÙJ>^Wt `2[ɍ;~b{^,CaX8x pٳg4DG=VzQ-ţ=FT<EL;o2e XpᰶGSrl{5%s!gTmgIw. 0 dg<0pرm*ܧuPV²I0`1姎g6rOɈ^E+Dg뵓8u5MQ\r_ykG$PPPba݄a/^2J(ӭy jKAq7t+J}Yppx&B֢1ߝhZSւznՏ/$ctnu@K#9̺y>SU|b_}G[#Gκu먬d֭A1 F_fP Ͽ9:^TfKN+C>,+zɴ{W699Cѿ4ΫlJᯘl!Bcߡ3>3# S0}!uio\K8sgÆFGپ}%%7ln+ٺu+[la͚5*=??tQaóIIߐ0x<vjjj ai!({ IDATLV3vjXTt"WQ[[FYxj@5@ h `FM]Fxrsct]+rPxynR&7oųz PԙО 222ZˎHHH-[i&|I\.Q]/hɅk54ivNY" {z*2|XMո7N{Kd;oc2q/jNfVf.&ŶbaADyQB8֯_϶mb̤$1bZ~ N6bƮ "()x" d`RW:[>vWU]kQ>>ͅ!-&ћҪ#'I6kג͛uEZj:z]cY+RD\'-#j|XC|b. ;o0b0ڨ*jTTjjsD:$pFu+-k xȏIBfV^MZZ[lbo~ϨH@C0O6 nsaP1&ot[ۘRGl 0  VPSQqGNEL<5A 77l,gNNjG͔d2b rss)**.AABa5;%47j̝NVY=Hǹq7ƄQbA 64C tZQ E=-OK5~oAC ~?vw2fsx4$huNrg͚jB!fϞ-F$:Pt2>Ɗ,{$GXA#]ό]tXE?DB0+_2 WS':ljt{_jLTj-k:H{`7E Ɣ)SX,߿`0Ȃ 0G4~]<فcu@OGZ$N03ό͞K]l6n.oеuuM"48k?ηIÒ,֭[GQQEEE\UR+7x})l|m$1  HorbDL;i'2'L6=2*5M륦We.uMq8lviNjMRXXH]]7oQAoN0*=o<=U MC1o^*) ?F̹)8-FꂑV^N4RJѫIP6[^.$j!*z.!qRÍ D"lڴz1J7К*j _gȤ|uD,fE( .0+ NLܵ}9lFѥZ!t]k!4i:х* ˖^KMt ܳY*n7ׯd2[oQUU%FiC8fǎȡC(,,p#G|r-[Ƶ/^; l9xu YAMy\"%;ha33~L.W!X^M~}Ju;{ocFؼŏ.e1 2#?uֱc6mիIK4.M|>6lʕ+;]z7|cW/>HǾ"V?rj5zƦQn/[SS\otóy:U벂wYk>zW^yǝnsjPkît; Jak܌D\^š#1X\h-HTf9Y޽RIqXL,vM?'Hje͚5ڵ-[rJ~_H$E^y^z%^׿u~w~?θqΝ;Yh , o<e'I|!^|6ArdRM\qIhS Ȯܮ/N䖮aɞɡûXV²dJ.B?D+Wo>mO6( >(V>}?n׋iܼy'RPPn9d]{!-~cyaYf? +f'b:^nLhRH@ט1*50>͊Eńd'ңgf9rG>}:_~_~P(D8ֺk,)-Kծs,WMa)BеV'V[{1[xWM_:dތH0#}UJZ0߃sê CP\6S+2b2+pYwI0`+¸qX,A,Y8VL&vɓ' BL6-vǎ2ydϟ[W__ӧOiG`f=_[; ( mqDB|MU#KH&S 8-*oa) FŚ5kرc;v`!y'Oĉ9 TƓa42S\bATlT},ZnCuO#;Sqلi0.zetPKp#33uQTT֭[Yz5VU #edI\v3A[ >^YD1TBOxލUÎa唴"%%شi~_"%UIOrgaD5wYp+&,RzNB>YT-gQ֯_OQQok׮%.N*=7xc*H幥0e4DY}9S4K _j_"C43gFifXVz-ܹ#Fl;|_9g "Gnh6z <8v;֭cǎlڴիW3bD'FNʙ3g8<0i$F=mw (̟δ)âϨ.<8Ծ|vC' ǦL p{U3(~@`f+tP[#, k֬!##[R]nܸYx1ޣz>8^^;xa8 /rj]mF٥JnRV7]`Q<8><{Nߔ 3[?6LbFAF/_پ};K,a̘1;tGrev;nT~?ӧOvѠ:m|OĠ(,!Ib\4-475 %:l(PG)Y 'F='J)MA*u[];tB`ԟVt湼vfy%K`ؽ{7P &Zܹsܸq~P(ěoIjjjlƍ UWx\V^)9 !k9u0cFzl('qؚS Rʼn lz'ŷY0M* P{: c5Sqi*Z;E+÷W[1 ֭ 4/rVmk~cmLJlNϗ6fmi\*}~u^?k3g2syzslV_{dl6y3f4_^ɓ1͘fƎ7o2D|x<[p2gr:8޺FfPD"5a.;[Rn;CΈ8fvkrҝ.ms|0{b3ƥKF_1?n[qyL` Ncz!V+$0wnƶX,͓*TUUaIOO'==EQ(..`!jX-e2{7qeēgnzި!?u70P0vh﷋ "A.l-8r7;c3.*ET }ɓYd 'N`Nrr2ex"'N}z[JBe51_|LEueVo0 %zwq2S\ą _Y3Q 7 &tke&@w0D_^5wC-oXMC@!NDC]o cZٵk`G}[}vBFcs5i$6mDUU9sЉr5Lu`g ܨQuO\Uu~uj`t~lsuΔ?>[i< O~P0|[1U+J,u$bS|Io޽{),,xgs$eO0 lx~:o{1 '9sZ/zQ!#8\~Ztқ|}$v@n;sG#ѿWF .f~ ӦM 0냼$@o>=TAĥ ٳgc8t@GyD2@:jTC f3HuwL:5 ,\pH%T+ENs'%Ր ".Ad7ݻ ,Y$V\=u7gƸTbF}A3(?55kpUoN8Gt`Ǒ{w1g",a W".A [JlB ZzviAĥ M:PXXgӦM|>1J?M'9qbAD0x<:ob~>?qw||iL(FAĥ CEaa!7RYY)FCWx?Eas)9,Aq)<$Epl]D6oLyy'뺎h2*76ْ*^}8 v4lAq)l6zj(**W9rukW?oo}>W_֮ȑ}m{7o6S7ym)I)8lN\%?Fe˖sN/^L~~~ۙ;o>6|:矾jwϟ K0}ofii ?q_9_:p oPʲ9+fA5¢E6m{ɓnG1c&SN`< ]uϜ9+?~YYYXgN۩/wcGWyqa)E?쩧>K/ܧ9txfi>F RGdddn:غu+Wj[/r23z~o;|ue}tssYHt AJ\- ]aT()))شi~2/]b=FK}_mٖfD3I/,/a)KA~zTUeƍǾ+(/HbRR'&% /RP0O~l%7 IDAT)<ijCnn.YYY17ofٲe,\=]^b;Y5/g( sgÆG Μ9[oÆ2w| `30caZٳg`ɓ'sŸ\zݧNw|;w??`֭$$$vҗԫ#yӗ,Hp 222(C `BT 9s0g{=>nQ/8qbT|| _`֬Y3/~|j_~s jçt*,V^Ê+D 0lϥ<}gƌXV8@0d޼yn7j*'~x<,šoK/+ɦhηNZCN KA'Nbo> -BE> ٌҗij>ۣS$I9-rAD\A0D;v,]v Xt)F;wtK\^~&4]L]]v"77bF8~ur<QN KA:999Y۷sQ222رcW2''rbA"PU5_.f$ ̝ɗ^D__zc Ecߝ%PY_t}{t{|钜dAD\ 4McD"/_h$))yQ^^G}/۽z/q[Y8=S3HIpݵ<‹$&%uLbRϿ"d 09L G ^-[orJjjj8tYYY̚5[l2T|v G%9VƢ󎏪J3Nd2%(͆ +X۪**v׮޻Ϻ6,tBB iM&3{d@x>asi7Q]ı}tm1$ƍ;|~RȂ Aؕp'駟ꫯ HOOCUU SYYIm:C4+ih6BZ|0a2ڶ:2F,':4~X8\a̯I sTfkAP ` z< Ң"V+F8̗_`X,f3b6[ Ç8Pf,ͨ^GSUE0 t]G4RRuV+_ϩn*Ka2b`XZnn,KT*"SAEBm ]שcڵiUQf,fmlD5q:ZޏF]c2z[F$-b6"$[ÌGZJJ94#fhƲe|X,fq'$BbRRTpn*TB7$s.݇i׳j>[8Sd ee UU1ffŤ aFappX'1:k9rQj4=UUQTUQPZbB1, GfKOѣ[ZroՊkTWWS^^Ο~?6 ؍w$11Kw zK3<P &>W{_)eQj5,\IلpLiMU1pQoC=eL 5tMu]ifn6DլFUkU5J"(AiR0) b"*;̻l!*0zEzÑt]NM5="RGr&i96]uyg|Q(K;Cjlb;c+0>Z؈5kpdNJae\[O -u1N@Kaw3zQ[hG^˨"Rij;!tx(jRiKِyk6ѼEG^hfuJJ&`əٝ.%#QD ".3&@Xp {(.Oªa NjV&%moNG?#9wjq`M,ms3n?X̡dyZº]`:vSQTl1v Z0q[1a6Xfš;XL fтzaPy#ܲh^L&lXRs3h(/1%U4y".Aq)t61VFtE*OD\ ]Ou &LKXlN2ǐ7|?v}KJF SSUAcCa]c#NV)SUK*[z*dRPUiIU6Qe>"0Մ;Abz<5>jZ6K7  AbZ HnUBhjt_͘d8\^E߫#OEBAoيݙ+%TGCJBlj^}H̡d5+P*L&p%ĐK;o$Y x<I,63)1i}6b;)\2rp;Dh<{a= s[* ".NTCW [$oDQ83|qI4{k>`s&DlY,OFUWQ^x= 4y75mu"=mz0´׉m7n&l6;8N ɩe琘?{/ԧ#xTc RKYCsB"JʗTSWS{TWH?:g_Ff )YddhSU׬m$!3`R6;1Xqq:]ĹOJ&>!8n6 %d ` kšTAD\ ݙ@svla o:]\-t ÅSW'.)llҲsIEBx"= u4ukN 躎Għat@c( XNOlv ͆-Ɓ#։-&G8X ;uGh$|1cȗJ"Ka/euP?}"s/a ٕKsS͞X.>)bsKl;) zc@P] 1̖a~Nl%ԌtN\F8bbȁ,V Á=Ʊycv4ZTAD\ {!'@!>6" NpI g`2ɴNbwNhGa2ڭNHD\EׄbE~Aq)tv6&7b?fSlBE%EBm,S[o1+5Q{ #j:}< Ka`ðh*0H=R|"l4-]ΪK *FUS-~벓n R&(;p+a`2Gӏ %11U 5s հӌj~g@r҉s:7zƹ Kah%"r[yDnJA >ZL3Jq6QۦNNY#Aq)t?v@һ6@o@֩VK~|MM!V{[f`*e띳5lD!k9l6y ".=;`d~BרP(D8f1c5o,۸3p96Oi2K,!//OeOv_MAAzD 8Aأ)..tn˞ 77EQ(..fΜ9┝)"Na=8233p)$%%D\ 'ЭQUUeOAiAA鈸o/ŽA` nIaa!F8d'+NX Ð}rwe /^,NX^/NS|=p@q vbbb iRwAhC#liAAD\ BbG KA (XVx^:aA𧿇[S:'x o8kq*9>Fw*W>!6xzV@/{SZ}'KisKiAyy ͥ:e8mWgRcYeܽxo&˖|rr2~2.di}=!P6d̸ ͥn?_QK\^Ē?09>_Ks}'"._2ʴ_pM SW䓨nvu &ێ y)o g]s2CR{.3~yxM"!!:70҆Nޟj W"1!˾'L%Mm_FK߽SG=/{~^o>@ZB ),fAxAvjPSWtݿW=st XF Dg70P9jO.秐+84W=םe^ͳ_eov.K"nkI;o`Kz-BN~>=H2v\?S|(qYK2~$E <~뫿I9yݼ}8Cr΅QطsdDܧ+?pK o#G10#vzf0Nԏq˓?ҾU0Yx7}쑞: qţ}/I;ḙNaxV[VF<NmkHnp( Sl,MEH~5>ŵτg$edq\u|wYrh׬L}yC1uXQ1#n}#ڿܟ:ߢ"s]k9՗ҿu#/_Goɖ7Xk_q'gs@rK2peqcܷP0U\C4XY^՜\6$6A05\x7jVSC6Ӣ>eŗRyG|8Zyy^KYo2V'3<ۆf5$Vvw`TEE_o>8̶;ٻSūݮ㲄Yij72Tjzq_GPQW_~K(?u>{|L#ο!KJ*o?}r?e  YǸ\~!CՆ+{RI߿x>Eӷy Rbl=/_cnZ%#?:,LSy9\dF=448{?¥l[`xN;Q܃!0etUCjtj?/>oy)Y^f= sobOT,<wp=]ʋw|M q@|daU֔C#<:sa;aա)HӠG3Ftyi=qL=HTX 4937wc` ©);0V"mzRdbICȰ|n>?9#/m  m fս1yrvB})H6Glo1 —t^6vhe4`X?en|CrۆOJ.3y8*uGup3\lF??2wqaA֖V@JsWY%m̰N4[DMЖ͔̮&cDjo^7zLp˖W2+DG$ot\yI 7T͸|e <;c Fr)+rv)V•*Im 0m$z o\c: L5R^xd N7&6jX․lߥ:;>}v&eD {Ew ',Vx1ٻVz=eM.%_͠a45浤h-Z,ԎXt --^m])~*IƚI¢-ޭޱM֫я8Dۜ}7XӘy/qȳAOtw jZВeK7췤pg$D'o@k_ QhpkL|Gn־A0睟hJ?Dc;i51ifհ*?/,ĤN'_MW@zFl'-!ylf,PƼޫ-5dZNViYq/{)LgςsJZusjI8!ZKqucܛwWA'3zSi[G$ /sxg¢cD .$.]J`BFYGqUc/HMtzRpt5$5Xe߷[)nk-L'N};])c/3µm>آ}sI7çMo G89҃|${7,S|ɂ߽oIɬJFJ^AfsdNir7jPK"uD@kѱAz^O4j,I:Vms+q4~L<<;:I56Խ\Pwg{95,+ЯO||XOaz c0(\.ħ+)#ih-'{jY3{/O/gI#P_^;PH韌%f0giͲZzO\>6:@u'g]r?\z\OɜOxcvlڃ^o :d>4X197?—KC4U݋72i+4[ەbEx> żVCܨ]}jݍᱲ 䨟􀇊_tԕq#آ}}`!OcpgcgHBL}1n8֬^E9\M]=FOVc s"guqu.vp~j~Q>[.Ҁz#axm+.i6Ȕ9믙/~.7ԁEqg½Rxpk{1L:.=EE;UU̞=T|Kcc#qqq]޽{#miR; `;~eӰ~CӠ M(D\vqm0ΞΑxBĥ Rq);^\nӰS,ߠmͫ\rœ|q"~&?x3#cG Mcߌ/~/LH;7y+<=Mfxy  Xk͞2D`qr AAېN$AAF0&I!ئ-BʂAao@4s) ۀaB!n8Ca B N  11Q|=Jcc8b'*Vtl68DvBO ;;[  ;sٍl("w"& EQAAD\$$$PWW'g' Z 9݈8jkkq);XXL&E\ ®PRRBVV,zG lvSZZJBB@x<qݘJAJII t]\Ʋxbn7111h&EnCv (Aml6Xd yyy]nxk իxSAa/"q]\E9s7AAr$;;uq( n͐!Cē  B@bdE`ĈKAn&0xoZmn9o6_g&ޖq~7o'_Io>,7xLŌ(˅at]'i q&aAJ<u :bX, hIHp,N3A>Dq V 66VlvQ_OzXL$[J\xX7+.ۍKbBOD7$3Al ¶HJL`R]q ӻW.^Ę q딖fj||App8pջ7(*'Ht]Rm0 p8{!Rzr|>f"altOǃdBQ,f#?#GpH =p8ҐnAض6%1&=/t]g??o.`MB GaEQPUՊf# 2< }9jtT BON0DQ, {v(RzT|>O(/GuijjBQ222&..Xhllr0v~W֬Yǟ$^$.wUՕ-@vV.nwAv;55hhh  hnnfԨQ 0xv;%zd~ϟϬY8J׮7_S&$% {S>UՕXV//$=5DBx2RzF555@ss3D;8rssql6L&S@ut]G4n7 `ƌr|{L>h rwiF($11G2xwNVݛnc quOmmmt|cԨQybQqٺ' BX,bbb8s9s&f͊Ϗ?zL>K:R=[\fbлwoTU+WRQYFzZ'bX::ɔKAq6sϔhhh`ь3,l6%*,E>U`^萹z衘L&fΜd3ేJ {--e``RLB}}Vbr$O\\FOeCE$vry^7 MMM$&&2j(;̯luz(k{!PTTݲc8N)_Ǡl}dDo  @Eӷ/VKQ\ t]0~OO_ʄ}IOK"=3_[Ma?쩇gOK:['jWQŝݡz"q۝엟Lss3GydTXZ}e3UUX,l6l61118N&MM?H{&ۯ՝*&0E- =6flVD7NO2f?h6N$b~

    I#E[Yn`6 {jˎy^1^6:1.Ďc;bAH466rAѧObbbCf_|Mѣu'h*wu,?p[Eay1m{3:3 a@X9GBX6RRIOϠ5%3#L\.7f%2'n1Oe`R9lHO&#$^8ӓ„k^dA3INbF<^쓝LFI|Yt;>d'Y0^^@aXGz??L:s28b0~UC{}5?yù陬;KO/p :>& %7=|_ s~֖.[Pu}ܯ`_bwjڕ`rm1t<^'KrYl:z9klӓHOc3 q2c>י82~0s~VA];7 :@vCfP4`0֎<[/Y^ɺust0hs]:k?e,xJ6VipL:ac3yNiPzf>>e+lqkJVgb<罰Pgw%sN}Xk;{R5]e;B!*֑ࢶoOfrֺ`!]SWkw%&(c!P  ?wEeZܶlwەkod PpGYYNɊs@~z278)/nğk_س9sm;liq㬪2*.{a455EZ`0H  LATΫl?L:*˪ʭvg[koa޾w1ci~x%zD;SnzLZ'DLS`nۘVCQ%33 #jJJ6e?|%Gcas[efq-fu4EZ1=[¬rL;i0ɶm,zyMS_b)IIv?O~BY8;#r gn!msyVH =ëE*੟rlvk g?N,'٣/GwXk5|{ϳ׽@ˊՕG(Ŀg ?hZj L(bz{N/?sDzV .+ѡxsssײu9:sCq i oo{֕j_ ᖘzq'y x+ڱR5gXMa*-CG$[NH a6IMM|bvTQU]qp7ikdOrrM4a%S[NfF )dYeek- Q71KMQ>C"gV5s)f~o ='7n n\.<Ǎ*? F=4F_ń,u3vaݰ 'v &. 9ǜAA . iAjk(((ZbyÏ&i\6gȴaMNRλ[]8_ ҙ4F3hy9?p)r9%cEJqgB->9'WxM$rCrt:Jmq3[2OCp]q:ͣUVQ^^Nmm-x<jkk׋ߦ/QĖQ0mٮK1Z8u./K=Z>FSd26Zў̖Jss3e(^^L($77a27cjIeQ2쨖|reyljooݞ ٿ:1ϙ4s}55U|ppndt@wisLB[{l5>߅t6g?r(;ə*4׼Lx4Z'õq&L(܉rMCIf'ppNXh:5Օ 8MYUZK}X|mG s"+.߳K1eQ76׆ȊŖQ^G?ٛ-_n8&mۈ`u1աnx93CD:&\]yGp׳9,v:_峣R"yJ:Yɘ71|_ğ ]_[^5j)v/4U]k(^[uߟ`0Hee%aì^>}X| I|--U&/%sg&bbbRAcux-,`5HRVI֗RzKGE߱^k4ٓp`8`aTKO+ߺ9ޘӰs/;rܓ#ݚ:(qv{u:hjjd2z;{[PZV6däm[__Ng܎j{~1Iixڱm] nTUi HElb IDATkVQ]]M0"6EFF9P-iw :7dOF\gQh 3,v3͊IvFX?TovMΚzO9sssE oe:%S̪[˧Of%ggv19vp9~!J] {K]ש(%///:_ROg-vS 7fcĘiT%//z xRRR(--% HJJrvZ ߟt8.ݺ|w5&Z.zN_]w=*)q\{L;>-m$p͗ayL< !~{o\}6qq5GxT5te%MiI>&3}x2ԖtƟOONy+۝ؖ$D:TUV s"[jԝp$669e 3%9eYWcd}w57Fc_spIxCm *fՂj'&&M(Y+WƝW~8b l{:pɠr޹XFgѫPNo` .a^r:kCǟǙO/?fG'n7&k27_LSM^Hz`&S/c?gsc2Q(>vc>-s6'\9Gx].ٵt;6ؚklWka}&o =0 QW(]V+TTTL}}=Qzr(++rHyjLt\,:^: G1W6\'򭴹:cp}1_a8[g +g qٯo&e} g\m{H[{ I8sǥE*)#vwJڸݙX,_΅#։ɤlqю1~=_~Δ^nO3D^z֝?Ղ;>Yп_,oB˖d7 n~ JJJ j%!!SUUEzz:8*++픖.U#vG٦4;&^/Ǐ#vnb0uT:l7d*B_yyijjoދt6޽ƶUq}[m42z4KI4QӆЦ"$&Ć4!Ich&QcPբMBMz26]P& i87'i;9S8MSصO?oϛ}rq\~7RF} Y7jF"Odk&PU 8vX z:Y˙$&&'`&|JUBoh-HM^-/:8+chGÅǗuZ|rȽg+._p8X,P(4100*@ 0F N( !J tQgH-[gt?\.}(x'ZXtT 8x N'DQĖMfqfcfN۲?ur_ 6E*B4:^d#\n';}4澵>g9k~v"l&i;W(^j$< w@:FA4E8aDUU a\ $IL_M:ooBK|!.hooǾ}-n%Kr'Lb(hiᎺ}K@*5gbrj)`]jt$ Q{,wӫX/tchh`vh4 ߏ!x^{{D"M,݋J:q{ܼGD??Viv!+M0skWZ;X:;;qEnHwmx!;&48v{Lxi.DTe84P__n@ ~0 b1|>eJ׼l pR/4MCGGA@KK=]-ncCL&ىCA4HH`ߥ;NQ &xѰ**PUD)p*[T0 444#uuuu^Hс)DJNY{/o x̙3ؽ{7jkkNp8miXZz-\p.^ŻhEed݂k >Uvma08RI9rb8N[n(p7bCCb  UA;ϖbgo"CE ^î] e\Z_g:>#8p WVVbgv{Ē˕=a<`TW%n0:6gNC";qX `0ϸ:1b?+*_-.A8|06n܈M6!  cdd]]]c(o3{R$ A4M:LÄ$91::ѱk2A (ADȒ I!KҼGrg+%I2v!{ $ :ɥ(TUöu'^TzZ.{+:κ*UNgkSi̦f?Ȥ30 d !q8p8"CQPd@e(a'DVœ?)v=Ο gaLMMbjj>! MFc9#R&6E2. { {L'"$I$PUm.TFlIƍq:Q4UE<>shl{ި$Is\H$l4"3o;lw7.v}~߼QQQʏ~"Q_af N.wfKq#Rr-v4D":yq/hDgDEc_Prmf0Q\. {/n'B ff8]G~FTDOo]rYe*9Qri4ۚ/(7NDkw$"3bVPrҵ?ڛ{T`<9{OV'tCjϴ'csǏgmBߏ  MmṟqZ,޹^3~?g|_`-IYfY - E3~?g⿥j(1e?g3;Pq$ZCq"1~?gH4j5lޡ"??g3~M$3?g3;pQBߥ^&PMDDDDDKTUEdC;$"""U䒈\K""""*a0 躎t:#"""*3@$%o\R)$I~.Q$TUXYrdpyl۶ ~033%"""*3rAuQ|vbֶK&ȥalU""""&]-nM[ωxG{{{%KIdsK"""a%%K;-n&G,X.xm zK""""bbZɥ %L""""&YгDDDDV\\-NDDDry znXZ-,VFΝ; O.'"""*-+lkk& 2%G.JJF,_)H$pi<גT*&$"""* +t$4M7#T*r#}ME{2H@4t: p`tdo EDDDDPZS7o(@]z-XZ H$Ti}:(`tl-FDDDDy]XA%3;r Gn*dYf Ѣ2 Y!2voגKˡ16>#"""%~<'DBvu  mIENDB`marionnet-0.90.6+bzr434.orig/doc-src/img/simpledialogs.png0000600000175000017500000003551612167200764022244 0ustar lucaslucasPNG  IHDR^(t IDATxw|lO#$)@H%4( VTDX\*] UP*Q J=*HHo&d ~k`sffw{ΔUTU;!g+:pۦ !@+V.(#R6iMB!ywn]A!BLƚ^|nz~A_ ! cwz4͛iD X ]o/Yt eGФs6_!DsX?ב/]n)SC.^u gFR)x*OdV]Jut360vevc04,z M ܓocUtBqѩϢPgv{:=>s5a݇_:Hhrw,'aK'*o=;0j[.uu(q3nb`t; **( cٴ}gIԑ~p],]L2$6)ezxu;)T^-;°9pGSbruΈ}[`X*`= CȶL/[gݒO6޼EIz_jmBPUx_ȱ nj)sk<罟?Za|4,B z)UN,'Pa=U\bu7iA~1.&@LIg-UVUUs㌆Eb41q0Mk/ذ>(cY!mV r⢣4! gdCLPsq8R=Vs=dliX,h(1*2C._Q]1g<5gV(FWoU.(5!VJfΚ3ᣃUǃ ڲuh 6?zJaf>B㘞q=;eDھ54R-ChGQ 礵9V`l]Ȑ׈X?f܇GhN8jxP!Vj7k Mωh>0w S"LFzXU0fuw5? wftu!)kQﱒz>}cװďӻ*SVX}NB.4,uOrsO후^'LUyl%6VG'v,7hJqcDܨr]zWJZC3[,NķK2FKؾ6 ,VC ?l;8 wp&Ϥf]1qd>!MO{V8ͦto z2*QN"2n]!YI=p,]='wb=eU}54qGwر0ZIɴKT8X+.N DžMu<:e~BUɫ~vtǸYa -2bBUг#c**RQ=TyՖryrFcЙʝOH%b6),,V mT|Թ]u sh ]S`8_Z%9`?P땑%VbBT4 gL˯dT4O xmяU+0'?(d[JAY4z#fhި[Cm؝w߶:Ee !ũnX+,CuSOYQ@C6%( Ʀ-09hh ^| n,V9wuZ=/!:ǃ(v|&'c@ nW:!84e|USV*elҜйS:/{Ͼ4GQǓF?*ykOBIW~L`> B! _P㢀dcB!ąn—źBqB!<B!<B!<B!<B!<B!<B!<B!<B!<B!<B!<B!K㓕gXrF!^uB!?* v>4vfWj!]?B: HsW>Lz<<k5W?;̿ƶäBQ{4qc^§~C2hivnׯîyØ 绹B!.> '@R3~xyB:Ѩpv\`3oyB;uB!*Yp*[0n 9gi< I!hЀI8V[2h1蔢(P7B/K 1THZ$$B`YptaihZ5!&xjg6Nct<8'&*O 7W}B!5HT5-^9'ȘޭiՄ_CQ8ZB_8ve3㑮aWîf~:'$B8{@V%+;Tɠ#]gYz8$!'!)©^pa mU:5LW`Xr.K= y)sp"sptɹB!- g\h[t&**v|CV^acZ5)fuϨ*fDHBT/Yy8ڨXLԣgsy⏣=^|lLZ>O)?X"(Ւ?-Vf_BRѱDEOdenSත8ê_<5u|'[õFTM$MAXmy˭9n!OK8{b9[vͮ#_)p]~QKJzM} мL[*[tt;6f}cH6:W%1a{6/!tG<~0nnBTo_$%1Smi"Ǿ7mgx{ºϞaIeoN)}V6n'P~o(-Ab13bcdeJA|SfΣOgԺ\UՠJL-9]Bo?^E&B+?Ʀ9^z~`_~튯Ӏ\3[GvEy99Ao}~?oSDf%`WU>[}so<tq?Kd n k媪ŧ w<-|2oyt;e攥, 1,:ػG-ۙ%%*f_UB:4d cʫ{ 9uq̂o20:/c;7(˩|t% {.F6s%!r d;ҷ3Yfo8FZe/EQ~,vjE3Em^Qz8؟+&w y8:eU]Ԥ d֔suK"WzS-ݵG^BTG=WT?'qhKǁ$yWmV*Ys ; 嬗*ӀL˶!<pG+)pΑD5ydLGZ GUaS¹J{Qoo v Z~ c`(<5~٫\rWSo Q7@#nQ|. ߳S][oqfj^>~`OχC%Hٺ$s V`=w嚷X{;|ӽRX>ƿ[ ?YOX[f 0:>@wCH_uh=ɢ&7; }Vl+AX}ܪ-1zGtӫa`7Zl0y3~fwme׏!SLJ <묒u5oPxlwyV׿em?-K؝WU8;°WU\_ǯy{'x[XD^ݔ]F{r[GZx^~o"S@65DQSKġʄ]UhCi ~t+f7Ydʠ0~D\oO&wgfMs`u`Ӟ%۱e'HECh5V!g/ [ig65-]w6wL_V=e#tN~ {$d yC΁xGs7 8RLmSaV\בF&o]Ƙ=bfHq`=|2q4lߜNOfLv_uo;:u_6[syzd4ͼ4m;/=E_S%YĈHB^IWEդzD3EiC"/YS:ڼluTrϳ:~njkJۀςe(t:Ю!- : sD2uQ6%T)8GmX,qy^s"nկ9ڢp%1@$˔W U"flaVMQjYG(4O4P9|^Fھaؑ1?(ȒWȾ3p۝J^bҡHQestrnnOo-넝]8ci̾$fN!/&niw3O>7%(%&UY1[Up~SC?0.oꗟ1^xOǜ7_},y{RXz-=[8h8@Q7yu֡Vi&y:|393c\Xv_v--|E?qt|@n`_ [[]]6m9uf6gKb5{j+s+\uvI+^ 1y@|~qu{TU][X^BEFmCQxW\t˵}È֢1ʇ;䙨֒^f.%{#U>X4\VcmCIm(F׹?FTE$˻c4r-9ytpƕǭ!+{C_;q,N`|\ y[p YW=e6g8wuarQOr^vI^?=ZU[8DꡎcTat ǒIK pBTݜ d ɕg!yÀFlUE(#)K^syUp ..pc>'_ID]E=≮5B^QWH:.i9[DUa֓UnsE7pu9tQ&\X4,)|(ZYB Qjn5B, IDAT?QCGRGw P/.JDu#, [L8F [|,uU}wc ӣx ዃ>A!3$=$۠*˶t-w]?}g[t?1gLn< pBQ?*AFGxMreeN){lp?WJS~8N! c B!RUUl66 Nx s䦢yP[Fƅyl7piW\Z*?x0ƒvIP !pitn''ƴdŦR!yY[FƵQo=8?xbLK›J6V#Q)èuFp7zUc.d4ڮB\5 ݏOpUTNXG f#XLHV~/\LXUu&!zHV-Z2+7eƂ␼(^ao}큒8eD3ZK綹]!ȽdžJXr[t/ p#(7 5?![H IJ9FrPpXEQrBk@** AcFAѠ(A\U*$oڞF%zM6hs6G8Fhgَv!zHG)p*XՠQ4%BRѢjhleB7M̯Y2?uilBuY6Y!ūo5 ^<(TՎ(vhTT\C#x痣<7Zmy;Nd8>4" >gk,*E=%B84ȽXEA]R#;``r^hNѪڶ`^ *\ӯMQ6O7f1LdsSqFqG0R"X!Y+v;*ݮpժ%M 4pЦV%F,&:C 49dgtE F!4y@qPBPє83gցz&a_'ni.܊BvNA2y( 'xBOK@wq㣠jhJWy|$aډ׮ >^F#&Dҽ D!Uu^BLb4:yÿfV.sǨzB!jQdy\jj5B!.rvBBBBBBBBBBBBBo㷕 !⼸cC>;&?T B!39hp4B!.r R!@R!@R!@R!ܳX$*:|7A {=]N Q(}OiTU=Mh)RSe`—d҃#X)\ N'q)lه3qٌj5p.LrAݼH޸sԩ#}/!q- !d[}|#NmhڄvS8Dc؅mR-9tJZ<8ޙMӡC0EF͓l9xSXkb|!$I>+F$*a-#Ǘ֡n#:艬̮% Eλ 3OGD*:?? ֜99f^^PP@Ht`=SТ7Un$6&1so.BKٖFѐSA9svr Ӊ}xsre͒IK {*MTt,]&}OEzxdǏ?BHłIpb+}IIP۶٨`41)M|/>}~܇Xcg$7>_lH@")jw<CSV+4,e&{a!yGClngYٸ oX̩mN% TͩXlfdNxp>uzLz]nűUTre\0 66C(pn~//YYwjCAСϜU%/'~KP/sɼ׍[طs?wq9Ky~XH@Zϝ[H^vdnߎhĖ-5554liiXSSQt:2m#*29yKŕd|ϫRXoKQ{-<1$lA3SF-\[: 2ȱcICђ1<6ʓrϟrӿ,Zz<7H)gЬlOd]wwÇQi;uae(<OCØ}ӓ/ ^D'>ZʗSTARN}o 40kRdfDIME&5MZZc%5Mf&jf&$B5#i j!{թ s(8sǠᨨøy9e1 wH`R'($5 AtJS@:d`& X\坠Ex0o,Uq3x,Vy)N.}w@}ElK1_v؟+&w yl '7ozwVkUz@IҖ- 99w/#GtΆO>q硄\64qCӄI ;7<`,/}'\MX:g}F||%_G]'wuV\$ E;yf  r,44ΐ9'Mj*sЦ9w1oF7WPCGW{je7ʪCao1=R"0﭂QƝX;![;۹H@Zϝw45fgct99`LKC.#]FL貳`4YY{y]+BАx‰OfL9g}Mj32( ?=Ӻ]+oYk1 & vm 4X)`ba |,޸'9my1& LC37+#'50+vڀ`.HXS#Zcz^Y6j[)٥ ##SkV{筱Zѫ*U#`*5k>),/GpsҲ,)ȯr(Fk[KWnXQ%-_cA*]S֠3h5&d0iћL 4zߖm|\@^X& h-.VtQy* o;|4an}9_7z|: }.4ToԼɍC;2NYf#kk@ $C,ߜD3f`H^lUsEC>uDRJ}uHNv6^ I &9YY4Աzʹa$&= Zs8 Goɷ/_5]J5ddhG2331M#\ ^Ttd2zAdhFљ;F&sWkD:Qfʆ{QF2 WyE@>]]3geMrw-;WcAvjՋ\Z~zR'7z Z`"+=Ny9/f {NP?Ї޷=[klNamԯ?i2ލ-) ]$X#;;mT[i3`[)KY,fL^ ^KV~4`8IE [W~:)媱y^ڗyy`43BQP+ udB58K}T.=_Q樥)D~+mb#y$>}na+{]"r$F:=ZV58XGAN8ׁ^o@tSJM\3)pJ+&;sG A&z#Gb,(vHڻhwG5͉3)͇C7-3)ʞ%P 1hk]g̺"HǵB&۹H@ZϝwH\/c{V@4=5IQ+3qro}<<3pcuIr r8\w?z)u1 ;"6GmhQha8&MEhޟ#҈ ?<#ay=CBNr"'ƺ31ΰyb:UAHذ[@#a#^OFJBXvڵ+տy,O9s}YKwp"La~'I7s#v+ n<6|Ӻ 4eSζH/( :>zu6Uq;7 $ Eλ8ir,?MP ؜3z=9ωB }gP4ACOG2]0dʷX<Kp}-| 0ytRpp&m4hbݦbjWAKӄ3GsI=nf5Sl ӿ';;Q2se6~wk$ ^݈>$e3|9ƺ] x8|F#a-X@AmH[i:t@Ӻ5lmG唨%8~߭i } *^|)sw3B˄gU-Iq3Ž|صuɠp6:xWq;{0[ Eoغulj/ՊjuNG^O*1O#ߥ_x5׷y4/L7:y-TP5ح <-![ޭZ^wrW/LR_dC̻osr^u: //Rm6X$h:vդ;1n j==]yBZ7oÎ~mI# NrB hnv-jmz/VB+Vk!VkǠu%V6+vF`g2;>|9MH؍chb)`($yiV 燢((qvVEXN@.膟O|7t6y'r8y7I6^ѣMgC/mS4 ZUg/zNkӢg"t::NVEוXϲGRJC}}}ePڶmyh, **:рhd`0Tx?Kcީ6k'Fh`0*vVfGEEѠj_Q*jGRJCZ-x{{7XAcAXMCp5 :|:!=PYZ,VQ*ʪXEݒXE㷕 BQ$ EI|xidsH@ q/l HQ-rH&ۧq"g !H@ !H@ !H@ !H@ !H@ !%[01ynBqd}rymB(抇!8|IR^IENDB`marionnet-0.90.6+bzr434.orig/doc-src/img/class_mariokit.png0000600000175000017500000014165712167200764022420 0ustar lucaslucasPNG  IHDRYVsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxwXg>Eb+P(;ӧO!cC[[[¨$͡i,,,ģGe#''***@6mЦMBf "DDD 00ϡpC2J'xI߾}iii3 333KQ܌1RoB:((011 VZ]jGDw4kLxЮ]z1+#GeV)nǏϟ> GGG]"+ҥK8r0x`xxx`PUUďdطoN8UUUe:b\pǡQFuf}ro>:t999:t(<<<п]yyy8y$qYbܸq0almm.B8c+W/DHHz 1bjPZZ> ooo`駟`mm-viR70XDDD`ȑ޽;ZlG'N5n3gĥKpm(((cǎ4ibcc.8cV||āpihjjhҤIJڴiԤ2R)VXM6ܹspuu$cpg{!)#T* dԬY3JII46mT˨7k{?~6m*3& uI7oѣI&TTTDIII4|pH$믿ҥK?ϟ-iiiӗ_~I4o<*..w2йshƍz CoF(22oN(%%ExO?$;Q۶m^xg}-Lcdd+Wٳghٲ%ڵk b1bZeYaÆ066+tZ: ;;5k֠uB_}pw]]QQQo"22RXno.y&F)w455Ycxx8зo_o%ӾyMKKWDfYmڴ˗?'O"44NBJJ BBBl2ZRaaar5j9˗/ mmm96mBN_K.a*?Rrr2R)222JTFɞBxl=/_B*666]cYQQQU*w3,}:|}}ydff<ӨJ^KQQ $&&bĉ8x /_Ǐ#44 .D߾}>,JWj9z r8ܩvvO2QQQ7nn߾Xm۶1** III000{x9Ο?UVXZz5z!2hc >|TUUѣGn޽dnnN/ |||̌:u*EGGݻԔu0UV7Њ+hРAi]ԩS'@ƍ۷o ݾ}ZnMH[[&OLIIIDDt-222e˖ѱch޼ytUaD">}P||<%$$2͝;Ν;GvvvMFgRTT$===:y$Q^ӿo߾BƍJMM!C)))Q)44|}}Ғܹsz׻}״f 6V"ԴiSھ}pYqq1-^uܙ|||vsrrҒ7nL .$LF?:;?~LDDwƍ駟իWD"{WNciDaÆ!22!!!xhjjVT||3L0111bjwbpqqA˖-[Q_[pp35?t?~ +++̛7w4&WbĉEAA°~XXX]{qp3> ... q5tڵÚ5kx+p9 w8scC۷ވ<<<0f4mTXz9|||۷oǏ;Zl)vy]v ؿ?ѻwoxxx`ĈcRSSqax{{# pwwڷo/vy1T*ŋo>=zyyy(w3V{$%%!(( ĝ;w1cݺu+׽n{|\rEP}pvv¼hS ÇѨQ#t]x:w\܌1VŸqAAAHKK:t.^BDDn޼)a``'''a%ںJnRqp3X%߿/IPP㡠-[M6 mڴe]bb""##!܎pvv)f*ē'O J+mڴ9 !v5"##.PVVOe}7cUB1͛7ҲCF-Z`ӦM>/V6nŋ$ /^?99952OV7cQ?())a56)S@II ;v쨱y2y܌1V6l؀9s@UU۠A̝;6l@qqq͗8c:}40gΜܹs+:t͸W9cI=z@Vm6Q?w\͛Scu͛7ѩS'J?~VZUzSa܌1VL0iiiDcٳgEScuH||܌1Vd2lܸ̓tRO7c'N@BBfϞ-v)?O7c֭Ô)S#v)`…ظq# .fZڵk _|!v)e={6o>Kt0ƍ|?~\Rkɒ%8{,߿˩8c9_8;;]{={ fff8v,v97cbK,A@@.\&N8\|YR-nмysxyy]rΝ;ر#^ {{{˩scR;v쀶6F-v)֡Cإ[܌1V IRlܸχTȲepQ<~XR%n9̚5KR*wް.^fZh>}:.R-[]v!99YRneBBBpu,\PR*m̘1Ö-[.^1V˸>,r%k֬A\\4h v9oq3X-;v K,6c c׮]bRpp3X-qFAR>`dbSopp3X-;wbbRe,XϟѣbRopp3X-}vbȑbRe 0a KfZ6l (v9Ujɒ% C@@إ ܫ1j}?3dH$8qBR<ntN:ѳgODFFUVbSqp3ƘȮ^ Jrt邭[]Jc"?~2c DFF"((HRj=Uc5 &&&|2,^!!!zإzcլ-[_Iw Z1ƪ٦M0ehjj]J֫W/X[[SRj5Uc($$DV.ۻw/̙gϞQFbS+7cUMLa- IDAT64n8hkkcbRkqp3X5y9]JGQQJ܌1VM)`4{ls2pp3X5(((ເURF0}t[NRj%nGAAL"v)u… q]\tIRjUcظqإYcƌAnn.N>-v) 7cU`899!** bSg]z܌1VƎl?bR9::m۶|z8c NUرc@\\.Vi1V_~bR/ 6 ͚5֭[.f*RPP۷)`UH"`ѢEزe .Vf*çUSB*b޽bR+pp3XٴiN KWcnY91ƪDPPCXXX]Nccc=z Qqp3XyyyAOOÇ"קBԩS/ pu\Rj7cU9CCC,[  5N>ͽɫaccPܿ >|kkkܽ{Wj 7cUPPUUL&_333н{w<{ PTT"Dp4$!''6lDs&O-Zٳg(,,DaaQ-==] koq3X --㔕QTTÇرc5\Yl2oPQQAaaa˃Z V&n"d2;+**BCC!!!h۶m WWz ]tA||{;..-ZûcRSS mDUUUUDOO/_|˗/k*qqp3XzqJJJ8{,jEpݛ${ߗ1*PRR‰'T},-- @".eeenc+()) H$xV3AYYY&. ܌1VPP;&bU]re27cw{D" 0uT+vq4c+BII ~-.\(vIÇc׮]PPPŋbTc>*IIIHLLDRRrrr=>4 555ǻ=\]]zzz000'sOYQQbcc4H$aÆe>^ L#Gbԩd:K1i$dffbx)? dee!33~/**MMR?Ѷm[߉/*w>SSSK6h޷)((l5hkk !;O=aCbb"bbbɓR??Leee4jAC&}0cbb@D(**all SSSL:::b/z#77{<~2 hԨo03 HRM6h۶ܣy.nNƒJx}-YCCR0MMMQ_O^^;W.(y}&&&i۴i Q_ϧ&-- W\App0@ӦMfffh޼y|]˗/Gqq1bccVM4A׮]ѭ[7t;wzT_d2\~8s @D۵kmܹsXvm7??QQQVQ\\ === @~j|匃W'O JѸqcjݺ5-= =[yILLoz۶mѨQ#_A-tHHá [[[t)6l(vܿ!!!  H`kk+ynЬY3˭5q9ܹsHMMEN0`ڵ(Ç ٳg燌 t `gg'wZu<|Ǖ+WStuud-@k4PpuuM[2 Ǒ]]]888ֹs:?!##W\ʕ+Ά)[[[ˬq񁗗 ~۷hA!RW^ٳg7n@WW?>,,,e\TTqe#!!pqqѶm[]jpDDDիGTT7n ''';v  11=zѣ֭[]^Jw.^ڵkhݺ5VZ]bJLL֭[m6cԩ8q">jj^ӧuVܸq… ѧO*w=S%a[VVVbIHHHދK.ѣG\GDD>>>x1ѣG^5ؿ?||||gpwwرc՝_7hٲ%ϟS*ǎC֭`L8j7bcc6m244$wwwHc'>>G3f @FFFl2{U@ruu%ԱcGӧbUkݽ{V\I$Hݽ?'&&رc ݛN:E2L첪Ull,-[7nLFFFtяnȠ;w+)((%}wuS3$;;;!֭[G bVBCCO>$HhرJJU={"M4./jܸ1uԉnܸ!v95.;;/_NJJJ4bt[uHqq19sƍG 4&Mܹs)44TG +WR˖-IQQ @ޔ+vivu8p I$3f ݿ_˗/+))))&&F>ѣGԣGjذ!mذ.IToߦΝ;6]ъ+H__TUU͍N8AbƪL&K.IKKhƌujrbb" >$ ѽ{.޹x"9992͝;rrr.6nHjjj4h ZC*ƍICCŋ+(( 6YYY)--MX ˣPnHUU/_Nb^dhhHNNNK\p,,,}%v9r[RSS#oooK{diiIqqq垎:x mٲ.daaAiӦZ~#eeeZd ^kPzz: >SUXt)Ӆ .Φ=z =y\pp2@jjjb $VK'5i҄ZjEǎ$"zQrȑIO/BJJJl2ю#d2;w.ihh(5EԷo_j޼9=|%ݝh|<)--.]JQS?֫WUVԮ];>|2P^`Ңw]O$CCOXjX :999AΝ.O>ɓ'NSN5:"^3S.]`ԨQذaCʕ+֭|}}ѯ_o}RXXgggۻ'Ě+IOO\]])%%Jڼ|2ݹsJ :rHjw}TYYYtȑ*=*::|}}),,3gR ȑ#56_"~5jT'NI..ǎ…  p|֭v JC }0dȐ O_7oDN*\9sacc[a;wƀ0a̰{ntxR׮]z2 >>> o`` BCC=z>ȑ#O qщ'(55 iʕ7RGԻwoɡ<ꫯ i rvv[իo!uuuڲe ?7oNxb9s&_y8p($$^|I#G$;;;JLL"o 7K+V&MД)S6hҤIG/_&3336lݼy:vHoiӦIII"""(**LMMiȐ!t-JNN>vW]\\\hŊ6==fϞMh֬Yԯ_?Zx1? <4m4 ӧOSFhѢEDDڵ+ӭ[(!!IYYd2M<йsv9s&>0qDCIIItU222Kѝ;wSNw`IWW҄ﵒ]^^^dkk[s˒B֭[qp`ҤI4iҤJOG***NDo~a!C&zTRR 6oLK*"3gT*`px񂌌/p! . pwwV<+RTTtuu˗ 322HUUB@r)/ )S޽{V"x'OHYY~G9[nE/7HKKK.̙C[n%_VݻP@@@_~g*9s4hQmdeeUODz)**<'<<!HUU̙#<ˋׯ1B{ѢE,"GGG255%wlА EEE5lؐ܄˗p,y֬Y_  0ߒ%esrrHYYYnʪJV>}J*|=d%**11ŋQF^z1c5lP8#O>ԳgOvONFFF{Ak>salٲzo߾ӧMD$KVI-[}Jr Z+5ˆ#m6e˖waJ$())q0sss7?u!bbbl:zL&É'аaCx =BJJ |ra---hhhT[ZZZ°f͚=رcPPPׅ:ƌh4o5jv؁+V@AA.]ٳ6^7. {ѣGajj/P\\cŋz}ojݺ5*=<{ -Z6 gggaرc1vXC&w=6m@OOGO?(++3mhh(7ɓߪPWW ׇ=F%K@vv6z)L;رcdH$PSS HJJ=ܽ{C[cǎEtt4LLLI!uuulߥYfH$[6Uɓ'̄M(Y1KKK>}/]v8viFtt4Y_ٳ4h{bA^^L|||Э[7]%#G`РAµ wC*_xSǎqML6Mn8444]1cSLW1yD"A^^^*Q\\{BAA={ի!ܧO"77SLtvr+7oGFF&L sbp ѡCR5t2;"""0g̘1/rrr*bS^ 4;ɓ'EFFtttNNNdUϴ#Çx ן===9θqѴi2MDx%1n8 dr+UdE833."¼y`iiYacc;wbРAشi;Z III8uƍ'<ɓ'n+<޽+W`ܹ6 *###۷/5{_^vƍ/{*055>MiLV>}*\xRSSC@@+UG GGG`K MKK /rrrgffBAA 6<+*""mڴӲeKxXZZZ˗!?? "\rEnU]RRR. {"455o+,ݸqԸy_++66޻ZYzzzh޼9ܹSm(̚5 NBxx8rrrdhjjb߾}8{,+<HOOkCQQuѣQTTTiBDu\"prrJMm?~ 6ڵk1uTe2Y[o\V[[iii0::gG ,d䟣iӦ066ƺuv_pѰ |}}j...Px888 33Sn9xhժ<==ˈkkΜ98qRRRJz,Y%;wxU͛HI&ȑ#֭[J - IDATlٲEld2PPP(x;<䶐m۶ŀVjy=7Ѿ}{r{nuuR!R/^D͡mg}۷oWio. ~[GūWQ &@YYC 󡦦];v[6b^* Ƌ/^d}YlҢgϖ7|@ׯ_'Tܹ3]ҨQUF 6$MMM=z4 6Z VEe֯_?1cGh"@4n8_MI?S޽?III@fٵk;w ÆN*** 7Jΰߩ=Jڵ>D;jkkSpp0IRڵk =I"u0]x~iRVV&MЄ _~Beם333IIIIs̡&MЎ;O+K.)uVoݺE 6@oݺPfhԩ($UUUڶmm޼Y)SP>}o޼IJJJnQXXH}nݺQFFz&L c~ե:%#""?\RiqjժUZ*LAAM6W_}}VXT*D"?ܹmb FF{wWcs:M-eIYB(GQAYa3 11|OOOA6YXjƏ_6lD777lذMoC 8tk֬@ @ii)'''AKK UUUHNNJKKTVV"vvvFzz:V\M6ٳgXfMK 7?6mc_VZ㡤߇'rssѷo_~~~hѢ̙Yfnܸw999ٳ'BCC1`t1X[[(//6f̘>Ο .`ժU)Syy96n܈SY}YY:WWWݻ(++'߿GGG899Ii۶-,YR޽{CKK OcggP(vvvpvvcEhh( Lxzz"??ŋxzzÇر#*++ѵkW|ܾ}Iڰa`9s&;K.IwS]];q[l){ʤ +\-'O 11opaҥ駟d2aooɓ'.Wa;vġC6&IKKbbb^y.7jjj0|pD"cֳgO?4I޽AQTJ-X W_b#%W]]~Gfjj؋/8ɱrJfff8]dz[sTfaaa[`]ZclԨQ 6;!/}vfddĦL"}YcPqK.3f0cccf``ٳg+QN>cZblرN޽07{*i6k,Ξ=uJOOgNNNĄm߾1IFF`-Z`k׮}T*8p{L 0KKKh"u4D"}w֖`Vժ*c֩S'fffƾ; l޼yLWWߟ8qH"ƍ! ,##Hd.akqUǏƍիYrrM'Hٖ-['xK.oi?deVYYɶmڷoZjV\ɲ2/6|Î=glĈLWW-_=yH #Hɓ'kժ۳gOGŭ&n޼ɖ,Yz0###V^.]DEα7nm۶qƱ6m0CO?UkײP^^6nȺw.}ʦM*ermGёdaSXX֭c3f̨pu m6fkktuuٌ3d T =~Att4n޼  ptt6֭[x"Ǐsp3iii CxxA5&MB```\ի̌*y&n޼ //ݺuWu~E^b!>>aaa8t ///zzz\ǔb\t 8<ЩS'L8&MB~7oĦMo>XXX ((~~~pqqiѸӧOĉ8y$ ya2*,,D\\bccquܼy<kz]Boݺ5ǩURR"-o`M6ϛP(',,,RjjjH$&&ի€wwwv}$&&"!!~:ttt7775 x\GDAA~7?~III044/aÆI˩,SNHOOG1|pL>rxYLukD"Qb%ڵkMXWMM 󑗗\Iܹ7n ''gٳ5|"99YZv.]accWWWt6667e(tXܿGVVn޼$]v~0`\p9i)>zT*$OMM ݻ7n͛HMMŅ PYY 7771ÇG>}QYYYB{nbxD33zEnaa!9 WMWWWNI$TVV[ee%JKKr~)j\K.o={T7 c 7nܐ޾}YYYں^ؠUV000hؿo(--m𖗗,iI߿٨Camm ;;;iQk} _ԩSAFFmOTުxbccahhج۷-B^^"$Pܼy0`p1|GH$2HHd1iӦA$?hvi@ff&w.t(7QI;vdr<*oW_!22'O *n 񨼕Ν;vZ>|XKn*&*K(쌻9s fϞ۷WǾslmmezLB䍊,PD"[y\zƍ×_~3f؏=Bii)qCMTVϞ=ѺukuT ''ҥ̏M#,\P!cfffB__:tPx7QyxHJJRؘT޲#F 6mRظ֭R<[wEMT>6]^ʻy xse:%LuBdA׹0`Ν;'C8'OFnn.a``3331 CԂP(Drr2>Ν;Gg`ѢEp"##Ѯ];}tU" TD-/_d|*ۺu+n݊#GNK$DVVQѴq9smڴ:N=TDQqbkkm*Y79l29rN qy)JKKJ&jC)򎈈P޲e ֯_ߟ8 dgg]&*e]Ԯ: `Ϟ=60551Qi2*nvB!n߾|ŋ1e['N:kmڱ㹎FRW^ѣ1o<̟?8oDK:&jUkzy6j(m茛*n:w]ZO>Űaзo_/J+Pqu@MԒP(_4m^+ 94H$&*%ggg|$%%qUkwE+((ɓ'a``uF)))Aaa!]&*%===8::"66(D?FZZR&k錛:U]Wmyv--{ҥ8rbbb`mmuw ===sfQȁP(DJJ Δ{˖-ذa6":uRy*nQUUT42~WDܹ31i6*nLMMѻwo. }ym&jMUseya̘1Xp6TD]Pq6h $&&*5ࢼ޽ÇcرXjǓ7*n.ZϑufSdyaذapvvΝ;6ӧTD-Pqfii.]ty-EwQQ`aap|h*n:w],J5 b'N̎%H]]]XXXpf&jO݊OyK$!++ O *ZM 7Q{BwQdJ=k,ٳh߾R*1*nusss;dW_5BCCqI8%:&Ak5mۆիWȑ#prrSJnQquBM4:7>t>s޽Æ sJdggDmPq  q<~(r舳g6ϟ?`[AAA Jxeeeϧ3n6F۷/بVLߦv 77QTD#|}qo/oumD"ttth 7QTDcu^W궕icԮҢowD=d1B!^b(?˻P2m *n1D(LիmeTDPqjty- בuCM4&]5k,#<<gΜQqu#:!$ aTVVBWW8rW +++vڥ7lTDZB HMM:ܽj+Ӂܹs8zFynF111A߾}~M[jRyD"hkkҒ( 78~1[jJyno38B jYVﲕ&7ݘF78BŸvQd)[{yR0i׮vVT˛θ:&Is5{+Su-o*nFR⮬ĨQdwEE&jh$P<ܽ{(M&HHӧO̬Ǭ\;;;1*nvFڵ+,,,T{֬Yř3gо}{I-ʻv ,?7(*n<<<u&ɓաѱcGZM&KUsj+SyPD%*nB!ݻ\4ڛ2U.o+*n 9nVMM7XZZZpssS~LA˛+*n ]qwƏ?Lmb ;V Yj,[LcHtW9XnnnHMMEMMMxvvvrn OUUU+>|(vq4ʕ+6s|rEWF355Sr=޳g:c̘1Jkc,]k֬iU]]7oޔnkڹsgeBDM4agg@-[PYYe3zhܽ{~- C^-[&:}\сx<\!KTDx<رbXZUUUCFF._wY@$5x?χ=.]ptر wc޽;:w >ҬFxx8߿1% p]\rpssBYN"]Dc"99)))ҽ a``Wlfffܹ37%O0ǎ^FV?`ĉr Hp!|7̔.L2vz񊋋q 997 PXXwjѢdnn899 :thJG믿pYiptt1oߎ۷UVhٲ%Zl-Zx oCjj*!HЫW/899<}>dXp+wR18q+VkM dee5(чPumNNNrרe˖055EYYrrrPXXrHKKCjj* aaa!-qh6*n={ =='''ٳb/_;S^^?)))HIIA\\rss1tPL:YYYXt)x<NUV]vPZTTVX$|@GG3gĦMPZZGb޽p:tOOOi7X:%%%!55N:#&D!jF,Ç3>:t,Y222!**M2hтiiivڱ0ePFLJx<Ŵ㙡!322bӧOgL"(,ӽ{؊+ xllݬJayTD?۳-Z`v9&9t56g6h &MD"vafnn0kkkʸG}ČYnѣGDHTD-ddd#G2>>uWJJJbnnnLWW-^=H c6k,&;v={6+)):Z=/`L(#"EMTZyy93gӹ(d666ul׮]\Ǒ;X̾{fddΞ=uFb'NΔsF7C3ضmuwRUU͛7c:u*l=U]II &Ox[ӦM{q(%%gӧOqq׏HDQqt%wב,%%GFnpaiӆH2s=5 1?~\pJ|8z(ك@# Z?}{yyaر8uJ6899!558p ^u$p`mm$.m޽{7`ĉo^ !r<=!jǎL[[ر(2WVVƍnj؍7,ϟg-YԩSĄ-\(DT9QIII?iӦqG.c č7 ccc#l8::bƌXz5q&..0yd BMTBnn.[rGJJJ₮]رc*rM68u݄n݊ŋ#!!:TDUUU |>.\P;Ν;prr… |r4Zpp0qelْ8 1m4DGGhݺ5q&Jop5sGa"##tՋ8ou!%%EKUTT}}C47QjUUUܹ3>s|\Q8___t Qvvv*UN8ܿ_eNTz_"*/$$9s&Qڵk1h DEEmE!$$rC㑚ŋ+tRl߾#Fx ؽ{7&NO?T.9F [[[lڴI.'.*ncXnfΜ cff###šZn :={͛6,[GBՅ N:WF[[ƅ 3x/sNe BjQquyܻw9QÀ2_|۷'N`ɒ% [ \L4 :!TDi>{@D"ykv?bϟ?Gff̎)K022er7}~b[w+k^_/@#99"Ml6"GNpeL<&&& ģGH$˗6mW"1i$|ؿ\~ӦMC׮]k׮fvXi;33S&S/^ė_~+V'N^zz:_Ř1cp_]]>ZB?üƀ]Ju"jirfgΝ 7n|2bᅲf޼ylԨQwg˖-oȐ!l͚5Hcwa>>>_j޽akq!88M2Y_ĉYuu5cUVI$ z0G0EEE۷o31Y``˖/_.ֹsf}GaFFF:!oCgDitbt [bԨQ?ccc]ϟ?Gdd$.\K_{gʕ055۱}vxpf |&3R̛7|oÇ9s`^@kg„ Fݱm6xM}K,cL211H$BJJJ?[[[(*\ Ub1>_8m4H$>|?wohB;?ѣGw}׬s~Ny*n|>:vlU{499="??/^+|CE":w,BΝ!k811#Fxk"""p1Z 3g[;`n߾֭[3r&J{sNS^^2鲯.]`ڴiHLLϥp+bʔ)ƍQYY >++ 7n ((W^ō7xb۷Y% ܹ}֭&y[[[x{{_~U۷oG=";vrk_wm}! ;vʕ+!/~~~MX,F;ٸq#߿F >;x crg1WWWm6֬Y$Xbfff̌׏XO?effj6o<&,=~sdee1֭[><;v\\0SSS6g3cɉ`,**1+++$ [|9֭ꫯ󙟟wc2qFLMMoc,//y{{3LGG쯿jb„ lڴi:!oC!J+%%...~žUUUϒH$FǎQSS]]z)//evs?#;;|>_&ǔǏSN8zh;ӧOa``}}Co˯See%nGXϞ=@ h/^@NaL6Y"MRswwGnݰ{np666;w.-Zuך1c233uά_ׯH$qkD-ZGNNQ8qV_ !!\GDUU6l؀yQi3n$ z쉑#Gb\Q8{{{bڵ\Gy+0ܩ vڅ 055:QstM,Y۷#==8 yfܹsG)*K.ũS47`TD!茛 $''F6::طo&NuF[r%6l؀XUSSoooTUU!&&ɉBPqPVVwww#22w|2e]`a̘1s_˜7o:+W47Q"裏zjEii) ;wN)MII ѣG>|Xmڽ{7>S\xnnn\!D=EԹsgcƍPSSu$ϟ#<<\%Kx+YDDbcc7x:Xv->clݺJ(7Q)ވѣG1l0pI&###\t mڴ:R"%%pqqֵʠSL9s&:!R4UNBBBvލ~ ;wƠAзo_[f?矣}/0w\37oָ=fϞ;w`ѱcG|嗸qٞ={[  6]~Im; ji]v1@knݺŖ.]:v|>>|8;p+//WH\n:֧O鳹GVPPc B־}{v5dRF?f6l` 0`۸qp+++ѣGѣ6377g ,`B')hҾkZ ?3O% .^={ѣ߿?'''899k׮xMPUUk׮!%%)))HMMŭ[`ii)S`ԩm***(DDD`MΠӱw^"??z~лwof-:ʕ+5j> :c"oTD%UWW?Ƒ#Gp!ϼx/^Drr2"hٲ%ZlVZIݢE Ϟ=CAA޽{z**++ѩS'iɸI$,X۷oǞ={Tj_ryňGRR`>|}}} 0VVVhٲ%̤_-[eee>o?FZZaddGGG&&&\؄47Q9%%% qI߿I9}4F͛7#33O>EAA QUUeaffKKKH$lٲmRkbɒ%Xf 5,77)))|2rss}j[ZZ ר[n} =zPmXf&*ѣG1b ++&kʔ)(..7NVTT+g1{llذYH,6 ׯ&&&oVi"""o}ۮyaرطo_/]z)믘0am(5*m)Jx"<<<g6ǎ@ LԩS;}Ȑ!CBBϟ$!D}Pq ???|'ؿ#@ !鉶m>V߾}Oݻ7BCCevL===pZn-qBCCv :tϺkZoB7ѣGI&ѣח8 FPP\_+88X,i7!pjӦM?~VZ>zdee HJJBϞ=2nQQL>]^KKK 7oބh*nW\+ }aOac/ˣ1i7!ꏊɓ'鉑#Gĉ044T!!!0a:qIk QSTDv؁ѣGt IDATcصkBbbb:M^ɓ6]^tah7!jͿo̙3;w_I...?yd!##Cc׮ϧބ*n"syf>;v4D"AXXtyްay!MCMApr xBSm`:tUUU\G^t)&DQqfٷoٳg#$$:::\Gr|ذahӦ QGFUUN}Zk|L4IkZoBT7i۷o:::HJJ ב^hӦ uW F\\&D5Pq  .UV\GzL4 ZZWؿ?Q^v~Kk QRݍ(CWYOOHu=$%%)4y]J9]^ŋi7!Jֆ 0i$ŦM,Vhh(`oou7 BFFҸF֛߉ '$ ϟe˖!,, .:Rp$Ʋҟu֛eDMꩨqo>DEEaܸq\Gjܽ{AAA\Gi`A,s;''Hh4*n"3x{{#-- :R`РAԩQe(((繎(uzZoB8DM߇*++q%уHVSS4y-[b*1]^z RSSꊮ]"&&\Gz'gϞEqq1Ǝuwq;<ڶmuw6ydkx ]]]c[TUU!88?#N:ҥ &7nttt$P}i7!EŭA燘ۛH͒ .4y- .Ek Q*n ӧtuf Cǎuf Fjj*n߾ufs_u$Bz*\\\`nn8tЁH2ɓ'qYz~!44(V֛9VsΝP(Đ!CpipI&n޼?SR'5&D؞={{aܹطo$3!!!pppPdҤIFBBQdz"?Tjjʕ裏uV:L1ư~9Kmκk]pBZM KR+5559s&8p{\GX 2>TY~_|<# ~~~֛f3n5 ?@ttZ6rGJQ^^H&DvD^^ ,$%%ёHrQYYÇ4y-ccctykB!&@FF\\\ТE $&&ښHr*3(r?EEE\Gڵަ֛&Vqpww-[rIBBB0f|Yc:ZoB[cС6máu$z9N<䵴1a.Ek i:z:Zn,Y?:B:t:\<@ǎ#7k;t耠 <| .:!JθUD"ܹs|rkLi/'M k,YBk iZǭB8pss:dggppp:ܭXGEzz:Qz8tƭ">}!CڵkHLLԨV#J&Oׯի\GQZMHPqwbIII޽;ב.$$DoJݻIoR'ZMQq+dGF۶mp'2220yd(Tpp0Duބ;~8@;v -Z:'BBBΝ;sE&L|\x( WɉzTJj۶m O?ԯ#Qڶm ___.Caʔ)֛: c /… g,]Hp={qq8r˹ ---lٲMHLTVVbڴi8u"""0x`#qnԩ(..FDDQ8QVVsssܹ'N:BCCbΜ9X~=x<בx9F#22{:jKkwaQ\ KSP@ { j%14j"S$&1 T P " uY_uXeu͵33g9gsƍ=z4rXc„ ٖ:\_o\#xs߿BC a[ !66999lKa7gܬs5xyyOے43ת͛sYכ7ƢgϞ0`> D¶$!''GmF `رM6:MθYb2dfΜ7BKKmIann={-E# ŋq=h \_o g,O>VŋٖDDD`ܸq\ѩS'8::rj_r8q7 r1/_hL2mIݻwq%_!22mGe_ŋs}9q7RƑ#G?`РAlKX"""ggghƍCZZ.\כwSp:uĶ$&22mWC۶m5?GuLƶ$z3n5s-t bgϞے4;v,R4 رlKX*z>}^9y$|||cǎȈmIODD|}}annζEEEe[Fx[Ml۶ ~~~+++7{ gj 44ǏDze˰l2KS5}:"""m۶-Od077ƍ!ĉ000@~~>4R k֬MmIFȶR;ΝC\\uƶ$<eeeiӦA*B,-QcɓGD"Bii)4ʾޭ[ƸqS̜9mYq9992drssqڲ-IٷoDGD"|BB.LZKK US('`כÕ:r]t <ϟL-)))`QVVM6ǎcAQFĉ jMxy^9^ϫ}ǎ[m_pl߾uo37YwϟGxhѢ5nJJJXYd @4Pt7Me_SNU3gb…k gܯ0l0Uۻw/틀DEEAWW&L7*E[[k͛q=ǬYCtt4*98kغu+] `֭+W!!!? XT8)))6#гgO^U1⠯_qVVV8s ѡC*c/\Euw x_5J%'Nĉ'`lٲgf[f:҂ PֈP(łq;>|8_RDRR=ʢ:p]˖-CAASJ%4=zK@T23XxzzbΝUq5ZٳgWZ7w5dff~P6U*dpXT~PRR\hkkرc`YY`ذaT"W~G*iP(p>}qp g0gΜjr\ͦ3K}cǎ,j\|9s&&;͛7kTB!BBBHǛ_\z5[QQwbȑLݩga͚5\Z!C@$ATr5wW^ő#GWr#!!UѨ,dff*H$ a``ڵH$/|>_x<.^cǎaРAΫ13deeA*B*yT*!UD¼?||,Ua۶mٳ'.]T4 ??RTT]]]UYaccf󃟟N> ĉ *7ZZZXxqɓ'5reF"[F{k2\.۷ׯ#11z)ǃX,f U.//bL YKK puu\]]VDEE! w"pwwW_}4k֬~OP(p}"%%EՁ*5kVF,xzV 888ёy XSHHHӧn:( fT5mmmD"Aii)cyyygصСCxzzpvvnRQ  Ç! ayy<nܸggj{1RRR,65P(ЋPZZgϞ!x }dooOHOOhΝǶӧOӂ Ã|>Ҹq̙3l#fϟ?D"vQxx8eddWjA.ɓ'ޞx<mۖvz6mD]t!G 6Г'OؖVkhΝ4zh@-^P*IdjjJaaaSeP\\LJpBJl˪7N>M$ ޞBCC)))^^999I&>OnnnvZ*--e[G-qgggٳI__hӦMTQQQ JHHӴiH$QN(**J%jÇi޼yԼysH$_Rjj*۲Ꝍ Z`>M>nܸZsQrww'===o5  m޼ڴiCfffjժFU_֮]KnnniСtF}45k1ٖɸW\IL[n%BQ_XѣG_yzz۷ٖNФIH d2EFFRn <ؖHR'@@SNո(++0222"gggJIIa[[P(hʕdllLFFFMJJJ:ϧcRff&۲8ނZwvv6 2iݺu)g[&===Z~=rވRkג 9;;ѣGٖ ԫW/ѡd2ے^Kjj*9::=XˣQFX,{-\r<<|ȶ$#//>ZDvu|w$heաCА D%%%la8rYXXP۶ml8=zD#F PHs[̙3@ck.ꦴ&NHt-PYY1ZhAg[s'OOO ^r%ikkӁؖVܹCm۶1chIdd$iiiѬY4fB-ZP@@@5ʸgѡSN[FP(ߟ,,,(==5R|}}WNά?~B!mذ5 ɍ7H__BBBXձj*rJVu4&RRR‚ho4u֑P(}5G&/Qvvv矛K]t!zA)((ݻSvX{.ѬYMCH(ڵkJO:uD;wn(Ԃrvvf)..~ywYY9::I.7X?@ܠ.ZD"k7 dooOnnnT\\̶&O-ɨm۶4w܆h"333 kDtt4b1uV6غu+ttta޽ "/ Ο?۷oe˖8p r9? tA%݋/">>=z@nT&/**Ž;PZZ#GM6>F>OOOܼyi|aNG-ڴim۶\|qqq0`:uꤲoJJ Ο?ϟcСpttT^.HOO䟚 |x<piBt#ݻ_}Μ93g 00m۶UIŋӧO1l07)))044D֭[ 7ķoǑ!''a077GTT 1zh& L1xwbĉ?)) pppQ󑜜K.ѡC8p8prssѷo_n .]˗!͛7T*ETTڷo]ӧBCC!R)x;wx<^?~<<<(&&>|H#GTW_і-[ƍ4l0""ڼy3ӧ3Svt='}vfD ݻwSaa!Y[[W_}|O?oF4m4200sŢEgϞuJ&H(Enn.M>ĉ)((BCCܜ),,BCCi֬Y$ U&?i̘1$ĉ}j֭˗#4uT:u*}7$LO -]^J,X@&MCP(TB~z)99ϟO:::tZJڵkGGҨuV4=zD~zJE#GdߵkW @7nܠ ٳ'2y6nH(&&^F{{{S۶m4O>xbˣ:?&" Q[!"YTTDt-VZX,Ç͛7hĈj*R*4|rss##-_v,&L8'+++&x.''HOOa@ct9s\\\ŋDD4vX_1m+O?N.7;v&//ŋkGbk֬Q)i۶m̺ϫ={T\B诿"Y*t/)))* rtthf}ш#Q]ve!PX v":QaaaԱc:C~`}@eu簽{իW3)22^>*]iٲeD?~5O?ڵk|.))Q1n"p@.\`bUiܸqu8CDj SJzE;ܹs۸]FBΜ9쓚Joayո>_ҠATٸmFuJ& ѹsA{f>.!sss/_Lӧ oGі-[!!!T& YZZT`"##iǎDrlKKKz*ݼyuܙ<<}o߾zy+W9wq|(:% Hb֭[ݻkƌ3gb_;ָ͛7_{AINNF֭v( PK@ `үO* W D8t0tP4k֌9o:Qy~JNND"QojD}R2U?.xТE f}Ϟ=o߾NC&( :6l0޽ g fB 6@P .1'OAAAvL0[lO?}aҤIXp!֭[6mLƤeѰҥKѧO:tׯӹ^*3Jqvvs6qޭ=~rK2e lق ǎSYP(PZZ }}}e%(((xC4oN&:uk׮{o3fZ;Dg"??_eT*U&}}}ܸq2LeL&CfffӽrJ[6jޞi1 Fq*U… *&*[?Zrlvss$&&)#44P(~@"`ʔ)mzWw JOOgO:8x oߎٳg7nĚ5k0efbB `ڴi՞O>` >>h֬ٻ*\v ;ws:NvqqAFFF2Bȑ#̺r@EEK.8{,mrssm6kO!J1k֬*ڕwXjsa'"ХK<}˗/gҐd_UߕzѩS'L-Tsѯ_?@aa!^ ˱rJf6խn7iҥ ***0w\tCCCallG\=H&R!a2_ׅmĈx8SNaرwC|=ƹuְıcǘu2\Yk۷P4jBOOvvvuErr2? }dd$={|xWϟOm۶Ht%"z5L<zE&M":ﯶ5*myu@-b-YPll,K.daaAD/uttՕVXA3f KKKHԣG@OGTFWT~6s!tm"zH# 1ŕJ%ݛP.]hʔ)Dׯ_%ٶm)UVǣVZQ@@yzza?ά̌I&QXX2DD;v$Z|9ҠA3;H ڵ͛GOV'|RĸqhҤIuJ'---4h}4oMАS-Tz=zȑ#3gǣɓ'W_hTrqD 7jشiZlԜkC@@Zj7oBTbƌ066ƒ%K}}}1MGځ$ԊSSSxuVW^ϱw^t "۷ѳgOdgg 'O>:uꄌ t>>>χ%Ν {{{hkkcĉh֬вeKF~ ͚5q!166^zӧ033ѽ{wŋ(//ǽ{ЫW/<~غu+:u6mڀ`mm?-Z\.G׮]V)]Ftt4UZ{ Rp;Ơ7޽{CTK.eZΞ=˜j ӧtwikK.UΝ!CBx1N: @ >f̘iӦU L@ F`mm33+ʂzQ*k֬AII O^8jAun?7}[zj244v"jѩS'6mٸq#jm۶X,2ݍ7hڵ%QܼyvA+Wq?۷oQ;jsժUjI6vBCCԴAZ&H(z:EH$R-N]( S{^Ӊ!@@iiijKT72CZZZD}![[[Zt)+~~~W/ש(DZ8jK]^^N6664s̆hxԧo_M֔`y <\ngd*[>$j=Unn.Qrrr2J `кjݺx{j4nZZZ*^r, US TJdgg)wgϞdccӠs5d2rww'__F|wd`` SIKKIOO'޽;-Z&z9vP(={4zMNNNQ>}ʪ77KLАOSNըI(_R(l˩wH,S@@@Ƃy-,,GՐF$HD!!!<;7ɓ'Ғ\\\())I4BAK,!PH&Lv8VM 55|}}IGG-ZQIP*1uЁΞ=˶j9z(ߛ ,X@B7%%%4{l 4dJOOg[d2Zd 5k֌zE)))lK⨁w6n"<=z4ikke77qѣI$ںu+rފ233#[[[nwgϞ%///ӣ0~Qvl˩4x`222弑7n7O?$ϕJ%>|Ą֯_϶$7P+d͚5$HʊBAAA$LJ߿϶w"??>3b&a5RZnǣѣG7.s4~x4~F7mII }$ݽ|RIk֬!333_4F _%;;; SNN۲8ނ:7K !###_QKJJ(j #33-ZD椫KSNըEZZ1̙3Ν;l˪5N"///ѡoFor9^ZjEaÆF^&QDDyyyǣSttt=HNN>̌,Xj/w]IQQOԢE 233yf}%JKKi߾}4bxԯ_?:y$۲ꕊ ڱcٓP=hժU%U={F7o'WWWZzoHCvvvdllL/-I|Zv-9::ύ&._L&L mmmEѥK?~֭[G}%E\FJw%%%%b ruu%dooOͣΪV֭[i̘1GO.\`[IJJӧ% [[[/=L&x3g#?~<9smyjVZEwN;eggvMF"mmm255o5;;~ruu%G͛7q͛ٳgl˫2:v  SSSDjj*nݺx>8v>} 'pIDAT}}};w;Zj6b<IIIHHH˗ϟC"ƍÈ#|J%^͛x9|>GGGibbV7YJ*e&%%Ehkk>>>Lj8zi0~"ׯ#11x!H$ U^QPPRѬY3nnnpuuEǎ;rqHIIAJJ mx<!H ʋT*EQQR)󾸸 IHWjmmݤjԵӧVmnn.FFF0221$ JKK|塠^wwwxzzjjoϙr꒑W/zzzUʌD"P(T)+Zf UJ•+]d ߆{###nݺwʪrT*\^5vX͛El{Ǔ'OØKQQtuu3u166W~Ꙓ<}2SY.H$ԔC`2nõpppppp4"8hDpш7G#3nFgθ988888qsppppp4"8hDpш7G#3nFg/V IENDB`marionnet-0.90.6+bzr434.orig/doc-src/img/network-emulation-level.png0000600000175000017500000031460612167200764024201 0ustar lucaslucasPNG  IHDRF4XsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxyxMDH BBDb^R%*Ֆ境[5T'ƨs2GI Gyl߾ӧOCڵ9}4vvvtؑӧOw^<<<ׯ*U"%%;wr8p TX`8y$ٳTRg~J*ń dڴi߿OOOƏOӦM޽;?3ڵkлwo233ٷoO&//jժk.7oN^ FQQQ^D5kƉ'HII瞣F^H`TDD:~8= 40C a͚5$''ƸqHKKu,[3g2tP֭ˈ#988ܹs';;OΧ~ʬY׬Y3Ѭ]UV1j(;k `֭?~;;;Ξ=Kf͈7d֭4nܘ4VX˗ILLG!11Hdddիy뭷HJJqٳhy7fH"""ݻ (({+WҥKȀXp!=&իWc @͚5ٽ{9`[.kȟLVsaҥqa8IS}||8sL#G|@~7ХKƎ֭[۷/_50|p|}}prrbܹ= &r}bccyHJJbȐ!,[关=]4bTDD5]~Blذs@ff&닳3VVB 澼pwwƍiӆ͛sF#FgOvv6<>}`ի\pe!ixx8'OE\~:ꫯRR%222޽;OMf̯O:lY|yZl #GS\\\/^ѣԩNNNtRF 5j`4i҄3f@oN;ҼysvII&޽+VJvK UdD._ٲe-] mFll,+Ve˖+W@K.yfiԨ\|-[`0۷/ر[[[ٳgٵk͚5Zj|̝;-[sj֬IӦM1 cFFFrQq<==ٷoN[n)S֭[1Srr2aaaTVƍر .PjU7o~G'<<˗/ӦM 6lnݺԮ]/_sRSSׯҨEDDDN()FHa?ο/OÆ 1c^^^.KD"""w5FEDD1Hpp0`|GJDDDDDƨH1f2XxqmFDDDDD`TDD^z.CDDDDD䡣"""""""""R(G8 FEDDDDDDDDQ0*"""""""""%Q)qH`TDDDDDDDDDJ"""""""""R(G8 FEDDDDDDDDıt"p;|0[lt"e22dKt)""""""RD:rO<.EbN# FEOa2D,L2.ADDDDDDG8 FEDDDDDDDDQ0*"""""""""%Q)qH`TDDDDDDDDDJ"r_?cegg'"""""""_ FE6l999l?ƍEvzcǎaݻw3c L&ӟ~z>voMJJ=*"""""""`TDpjժ-y{{sN233X$$$Pn?lWzunzG?aaaK.?y۷WDDDDDDD}gK/vϟɓ'quu-ѣG9tyۖ-[Xld2߳l2bbb ;o< hdŊ=zl2L&nnn+WDK~[BHϟOff&K6o ctؑ;~{H"""""""b6. uWW˗/ѱ322Ai-Xv-O>]_QhhKxhԮ]@KQdRSS駟,]C#((5kZ"͛-]wNNXKd2q…%&%/"""?%>\`ߟ5yؕ*UGݺu)SL`n|nj7d2sNsңGĉ׏7oÆ m۶dggc0aҤITZg~meeE&MسgM6B 0`=z`0?ҬY3x֭[gkk=Iw^&Md2,.--˗`4!!W2p@Kbq'N`޽*=y$mҥгg@"k?~`TDDD|M&SWI~~~-[>>/_www  !!kkk I!!!/y'nvnٲCq /1118qŋӿx"[n%33'Nvv6?tűj*vZNDDDDDDD "RHIIN:7}t8p .]bҤI|G@th}Y.\HӦM ;biӦyd",,gycU\@BBBv/| aaa1tPz-,Xo:{lyU]ta+3af̘Q`4h*4Ǝ- vvv >ѤJbС :}ׯO lq?yd+nҥ =-ﹸx2jUDDDDDDD~H}`DzCx"""""""R|h*C"%%oҥ}W_}ůjR>8w-رc.EDDDDQĵk9r?wYYY*)*qqq,Z3gQǏ犤(EGG3{l.^xGuEDDD,O}`2hhz޶ϛ tȑ#IHHJ+^zԪU}^p1ccWۦMVz>{#""x뭷JWZcTDD۳k.ϟdbrEC6m_z*L:ǡC;v,;vdĈ,Yxx"GePF q2aʗ/ %::o^JHHgժU޽Xիѣ}Y9sн{w G}ĵkHJJW^aڵ?ɓ'ꫯl3.9rssy7PNb…:t,>|8իWgŜ9s3gХK}Ys?1ׯ駟gϞL>7n˗/ҥKL2[EDDDJ6)B&_~6mhoƆqѥKNʍ78q"ǏgΜ9ۓ @FF9:)))l۶ ???Xh={֖aÆ)}\Bxx8?ܹ39L4z1k,Y`SL> cΜ9 6s)ԩC||N8ɓ'Y`c͚5ȱcXb-ZY))B^z1dyG ֭[˒%Klٲ888booMΦAZ www|||xy-v~%;ZO>-[m۶@&Mعs'xxx8qUVJ矩R >>>;?೒4iBŊ޽;իW'))]v /Ξ={ϏQFXt)|XXUVLJ{N:=))BԩS3g_IF777tB\\Gtܙ˗/3sLQFqqnܸa><8111 07|>SNQF ϏuIjj* ׏-[l2ʖ-K||ᣏ>aÆ wɓ駟8x }Ã3x`Zl5>׮]h4{1h nܸ>ٳ:t(ʕ<==޽;5o&""ÇJfhذ_'!! 6;vMxx8gΜ!55Ν;{8BCCy뭷XbՋO?ڵk~z Ϗ'|FF-HII!99wyQFLV:t(Gƍl___F#~!zҧ~G"##9x )))t<*-[Fjj*ׯ_gȑΝ;ڵk1b6lޞz+WRB6mD߾}iڴ)s'VZԩST1L17x^{m2~xRSS'$$rq%f͚Epp06mIMMO>ѯwɓ޽ZlY~'\BRR/JEDDD+"""YHNN0NNN棏>*;;;zŊ+0`7à+Wl;c mFnn.m۶%**͛!ȑ#"##7j*W~!5fլXy`ڵkl޼EkuƍAya~q?'z">>7޶\ºu`ewZjTV+V$886c~ݦMxK/֭[著vڑΪUnf񤧧o߾{ҤI=@3Ekȟ*2XYYa0Fy=G{(cEu蘭Y]jI""""D#FEDoرcٙf߾}TZ *ȑ#$ y'gwߑNNhѢDo޼֭[Ӳe[OKKcڴi$''өS'?ȭ4bTDD,"//'NX2;;pz쉭-888kOݻę3g MII!%%O?D~nYQFrr27nƆ6n܈d"((vҤIxzzgϞ[qttd֭XYYQR%Zhaf͚Ŝ9s2djժ̘1ٳgiٲ%}=bܸqƆ dӦMtޝ%K/ -[X~-O<~@yw۷T5uT=JTT)S`~izqO`…4hЀ72~xzꅣca,X?B_SON߾}yGoi;k,֬YݻiԨjբe˖|'1x5FEDDS0*""ٳ9v*T **qƙ}q~m jW^1w{9ILLO>䯁gcch,u1/55d)lnaZhaR裏l2N:ov 00^:uسgOuŋ,\ \•+W p%vI޽1 k׎Pڷo?rʄo>.^Hzz-4hu@@7n_gϞݴi...Qd2{"F/^XÇi޼mݺڵkC?[N:,Y۷nڴ ggg"""ٳX[[DIJ Cuu*"}@_:tȼ-""5kگ7!M^.Ze)+VGs+{5)SeddӡC ˜1c~<|y'~ۛcǎ1bU{z݉?ECffy۩S yo:dO8@Z ۛx v6lZѾ}{=^ C5k~ /44hP9K#"r|Jyyy>裥5jX{̙M&S0xyڴiCJ;w.~) .d˔)˗ͯo7}>|>>8::~֭[_Eׯǎcر=z^z<Μ9Cff&$%%1aHLL$,,+GGGV\ɹs爊bl!ܳ>KRR'N$''(%/Eq3Qׯ_';; J*ƍb̙>|L> gݺu9rXmF۶mڵ+#S,X@BBt֍2vXrrrT}̝;KҰaC,X@rr2/2K.wߥaÆxzzҮ];}.]4Ç'44st;3f`ҥZ'xW_}_|իWyf7o˙0a/ILLdʔ)\xnݺC˖->}:!!!:uիO2}tJzz:/fٲe /ЬY3]bԩ^ ?ٳgR :t/jժL2sҮ];ڵkǠAyy7vF|ߟ\֭k~3f + 6dذa?.]h"f͚ߟ^zбcGâE dٖ\"%WͫiRDDY@@ԩS`2pYdbZDߜVZ.]JΝ ,>En&NH= }vq1ydkh4b2NNNm۾ ĉ3f=09~w͇6~ v^^VVV{d20w{ڵk0`}n݊9h, ,bmmm7444'88]/TR??o)*"ʻ{yʕ=nY?LSEDD.ల*mGٽ*r+++Bץm8{GB/qϒMϯHR|Hq4zhwwq`TDDDDDD+WkJ.M2e ]#DH f0<}}}Xյ`eQ' @EتQ#PYzzzO>K.qy.^hG=6**˗/ɒ%ٳO>#GŋIJJ'%"""rW^W_ϏSzuy222Xz5UV%++~ooo<==1b-4h???^u(0`VVVtؑT OSDDD4&)ƌ7|ѣ d̘1 *y/ӷo_7o`˗/_O?#Gŵkpwwwww?\TDDDR&M6Q|yv;pvvf̘13rH4hPHћ-[Fթ\2_~%{ˋRJxxSZZDDDD"""""%`+++4h`ޠA 5Lk~f͚={{~E}:""""Lk:u GGG2339rRV-/_۷/5j`\rYfÒ%KOOO  /̙3޽;^^^;gQ0*""""RB;|g888pBn݊#uGN4ҥK'KNիW^4lؐhRSSv 6$11t<<< d˖-<|>ki*H accڴiÄ h4Kό1Gyիŕ-""""""""\N#&l¨QhѢCG5x?Nff&~~~?5kȍ7ؼy3 ry*UDJ3?ё3g2{ljna>oo"`TDDDDDDDsuueƌj kkk ?,\~=C رc 2'''%&&___NNNkiccC gϞtܙ9s~\\\Xp!M4k׮tޝ&Mprrrpqqa޼yL:<2j(*Udܹs=zt 33jժ=|`0@ipMҥK;9:::ږve4dee@?Y@*o293gNKN>ݻYf +yyy|A#J@@VVVQV-רQ|~;]="" lmm <̙3@HN;;;N>͕+WnݺӔ)SHOOgʔ)l߾{Ν;9xP7aooOFzJ F PƦrŊjZYYUuppprtt,Pk׮+Wsrr)U?6888poDVVdggEfffswss/]tu֙YYYׯ_b2edd|  5Lv.""""""""L`ӦM 0'Opqz͡Cxgi۶-&T>s~ϟORRaaa\-[ҵkW֬YÚ5k8y$Ջ^zpUӧ{圌F#'NdڵqU֯_@HH+Wf޽l۶uԩSyꩧnJPbŊ{+W[2e۷o_> ~.~~~KX([[[<==kY0LĴzڶm<))idJd"""""""R2O@DDgΜՕ!!!$&&/ 22m۶;À0 >5kңG\\\0`X[[Ӻuk^yؼy3ϏҫW/L&VVV<Ԯ].]uVhܸ1͛7|iԨzȑ#|dff裏ҽ{wz)~v؁;l߾N:=+/3dz5T\gg.]x4j`ggyپ}{κuDGGǧ=]&)ߛߜP.]JΝ ,>En&NH=psst)""T4**jkc0ZϜ9={t-""|7w&o?爲evԩSN:nݺͧeʔsζ;w^;w.)))Fիg^T4h@ff&+W-[P\;>Npp0\puz6vbذa$%%=UTa֭駟Yf=#""""""RRM`]Zɝ:u?gΜ=Bѿ͍1cTXjUVӦMWRyK%Wk׎CQ~}.]ĬY̡(@hh(\taÆ'<Α#GZ*VVVlܸÇhJff&.]bРADFFU( ?0vؿ\gӦM}\tqp)Ν;'""""""RY0#<wXTߡw Rl DEwc 5&A%5~Ec좀RTBQi9\QL4 hg}֞ðf̙3fʕW.SEQh֭֬[G^KƸM>}(LLLhҤ xyy9va4hwQ<N./~ !B!ToTdJv~^;v^zo#0N:xyy5ѣǯ+V\(3#BjժER([lsU~<J*XjΝKƍu?5k[biiddd́^Y7n t邩)&&&Ԯ]`M6RbE~gTU?gժU//^o,B!BLXUVU[#ET)W7&==???|||:t(CramAfܹsЮWug̘Ѫ\r3:!^ǃ^(vʕ<Ν:ĸqWܻwEQX~=&MbŴlْ+i>r62S&epuu%,,ÇӲe|_gbcc L2ܯ9uiiiyKݻwIKKcL4ݻwӭ[7Muu/_}~HNN&##_(^:FƍTX[[ۿB!BQ^{QPEQt޽Qٲe_axM}&L@GG#G2g ĺuصkƄQfM5#5m۷O5M6[~ ʖ-K^HHHӄ2c 6l\e˖qyBBB(_<';;cC;FΝ&44e˖qu233iѢ={ӓtttÇ4k֌nݺE3g[y4h``ccOQ{+ Q@rsW^|ȑƍԩSGxʕq-=ʞ={ظq##FUU߿?ڵӜFNNNWDD@t 6pݛo%J`ggǽ{ ֖:uꠣxPPP6J*ŝ;w,_)g%000b~tu_Vge>=x{{ӥKnJƍ%K ccc\]]~:YYYDDDfZnM^xׯ|I޸qCsӦMz쉞 ၩ)ÇhтH֭޽;>>>ܽ{^z( 'OVZŋ;( Zb۶mL0 RZ5233bҤIt1O}[[[prr"&&Ν;k>;w./_FGGccc9z(??3we3}tMFVV+W\]]5ڵks],X7'Odʔ)ܿk>dYlK`xxxPV-RSS[.nbرɓٿ?h0`o,]TtMNNlٲ0rH8pԯ_E?˗&11:0|\\\/Xt)W\AKK-Zn:Kٸq#QQQRzu"##m۶53go!B!vbx[ "71ڤI7oŋIKK3=488j֬ɉ'HMM ׯ e˖%11UU9|0~~~KʕQUU347@=000ѣ={g:t@xx8|\~GGG*VHQ6&&u1}tXt)/^aÆ)Su֑ADD& 9=Ϝ9C||^~l;o+):w\7oN\\VB!B!_o%Fٳg Hʖ-޽{9<:::h0䧟~ŅMgϞG!B!Bk1A`RSSVLҒ:^&E=zĔ)S(SLB!B!o5x`n޼w}ǧ~vY/RU-[pe?)Z!B!Bro4b4W*UXhь7HmgذaXYY1on݊3]tXborHl߾H>#f͚[UB!B!BkXؘ=zУGYx14lؐFI9o\xkkku놝]Q%B!B!?R Ctvvٙ4|}}Yb=ʊ&MPV݈dΟ?ϙ3gHHHΎf͚ѵkW:nĉU#Gr kKu:=z`yVwL!B!KEEEnݺk̘1deeʵ޻sSDŘ' ߴXp!?ܹsԫW(;zjL2eʼv7А]S'|; !B!=1*E駟~ԩS\tӭ[7J.QǏӫW/>cƎ˙3gG<|8ɓ'ٳg;v@KK WWW֯_׉dٓ۷s}Ea͚5׏c2k,z쉃Gehkk`ˆfѢE >Ȟ7!B!]#Q!x iJܜ ҰaCMp֯_ODDmڴm۶K6mhӦ @)FFF :Tӎ6Ŋc…SNiӦ9sSSS֯_OʕĄYfz!B!9BЮ]y>?|QF4j(]v}lmѢ-ZSB!B!xB!B!B7%Q!B!B!Ŀ$FB!B!:5FK(|oߦB >}ZsL2888X"%K 99ccc?~ :::XB!B!B~h56l<~777Zj9C ]v$$$СCȈӱcG4iBnݰȈ:!Z!B!B^'Fpss#55///\¶mSNsq.]ĩSPnnn\v7nOFF@N7o߿('B!B!( ubsss4M*SBmڴܪUիW7qpp@[[C{+[_v'ڝ;wz*(&&&vժ|EJ3f իWYn]QNׯ_Q K׉Q]vEiҤ \v k׮#j֬I{.Gѣn~:ժUUUvׯ_/!B! ̪VReɓ+5h@)vvvmF򳵵l/؄B3Qsqܹ|sSSSYf|#B!x(bZN;OWLmf?zE2'Y![W !B!x)GGǵsu$Es)̙3KۯS_GU!ĻGB!B277oڱc*TP:```ӫ/_~zQ"GB!B񎲲٩SEGQ̚uB!y$1*B#^ʤIXjUQ" oƘ1cصkWQ" }R:x IDAT6lgΜ)PDPe(Eq(k;e9ŋ/QPm+2BQX5DPU 0xE̙øq:ĨBpqqÇŽRcǎ_QAJw]QF\x'OR}GTV峷ubŊXB}RJsEQPgJvER]J8tPG%SSS y111pT}#Q!-LJׯ)z*y&''s)Xմqubbby&'NLJBꙀ?NS #==BΊ(5eÁ@SEQ)R]QCEQŊL|a@@}"( P0BSO%M&((EZE\Sn&<(E) ؐ=T%ˋ7nf&M۷oo߾$%%ʠAv}ѣ6TUe={EQ4;wdƒ@RR<(+Or:DVV#Fɓ,ZC*.\`СЩS'̜97nʕ+ٳg˗/gҤIDEELBB>,ފw_NB!īSU BBB;v,ܹuFr6lnnnlذ'NΝ;͛_077͛ܺu --- 8rhiiѺukJ4-z17n ))!CuVڴiCvb/_???Cff&дq% ٲe :tW^hkkӥKRXXѿ֯_?@*Ux =">>y摐5m:t+++VZ(Yx8;;#Uy6JQ=`P_U$EQ/( ZUEFWUե,I}XBU՝-T%r@(@OGyZ7PUy]Wt6pTUuLi=W RUu!I<JPP' nݺŌ3ڵ+{ҥK4nܘ> ,--%;;1c_ӴiS 'ZB ,, kkk/N :w`ĉܹsǏ_|@Æ 9u+V`РA4k֌ *`ccCXX;3fPjUTU_|}Y9NNN| ##FBHQ&Oի133իdggPvm2339x ZZZhi*ܹ3Ogar=ܹiرc8;;3uT֯_)! _%;v,'O\vM3źvܾ}Wbh;vԴDdd~ШQ#N֭[3gN!JY&{Ã;wfnJu`ffi# @3ӴoߞS{nFU'Y/]>y:m^UPUUO<ӆ P̀eWU Ϭ^6|x~瞩S(FOoeUU7`O|WFɒ%3rܼy{a``@ݺuP\t Π &MٳN:1!CW^sʕ<9;;111UV%l|2)))@̜4Nʒ%K8~8/^X$1*BUiiiܽ{{Ν;WfOtt4KO>}v4Y5mGGG<Xgj6e={6hkkkqM/חu8lР[ߟ .|r]v%##Yfɓ'$++ӧKVVYYYEj OOO<==IIIvښM;bbbh޼9jܹsuf.\Iߟk׮ Ǐ9k ϙ3mm֣+rZ}rVaDQr(26P7.Ue+ x`_rF{6|z 8SZQ,(`(O(RIQE*yyyb vܹsi޼9w%66ҢE \\\8r?```ԩS5k7oSSS3gؽ{7ZZZ\=͛^:ϧQFk~ҺukU7 % bDGGSZ5`ǎ D.yAB!s|]z`s[.m۶ͷnvv6۶m;;;>CԩÏ?ȤIfСW_lڴ֭[͵kdԨQ|tޝeҩS'lmmիTZE_Rv{nvɓ'{oo+~xxxPgʕ\zLÆ i$%%l2zꅓ+Ww,^ӧ<<<{ 4 *еkW&%%=z0zh޽˰a8~8| JbTTbŊ1n8CQwر'N}3j(HKKcÆ E%&&2gڵkGjհf]۷/ԯ_=z9q?~nݺ1{lϙ>}:ڵx̙3EQcԩ 6% n~[nZj_eϞ=ӣG|_MFDDqqqxzzbnnm%ej(==t 'v (ʗ2(J#`0[Q'P(\`B=… ܹsUU6e7sqܾ}[[["lEr;HWe0NQ]` `s_nG`(ˀ4EQڐBw 9kMZ`Y#FDvvYr%W\!&&իWŏ?HRRfff̟?MCn޼ٳ144F1`;*U5-[ښSSre,X… %<>>رjժY]リBÆ iݺ5C lٲ4i'''zɬY裏pqqaL<`J(ݺuc̘1t֍QFaccC͚5qwwԩSMNNN>|M6ѽ{|4nܘ翓;ҲeK"##5M6iӦ/߅ ZZZ$$$p! v߽{ w߾}XZZj^ Jչx"7o~aQ\9ٸq#7ηNzX|9{eůڴvZ֭_W~3IWU@U_E بE)]EQ3PR9ъʩSSU5;_3~v7y{f"..---k!CHII!%%E3ٙ;v`kk l9x`tuuquu%++ ]]],,,pww'99Y3>u֔*U*@Quee|gggGԴk˗/Çk>,COOO|MӦMiܸ1X[[ń 0aԪUK`m߾=_~%zzzcƌN(QwwwLMMQUP/RR%IKKTPcccӹ}kڵiР`j-/}CEXb&_({6q`hhϿqXOOPf~!<|v,--/1bK4hЀ;w|-ӗ;:::XXX`aa±@5ol jժQN?ԩS'N&Fs_>3mff_iӦ\rG:::ҴiSu>N>޽{_˗cmm]QUU$rFv>[ S3_>w8C=>%E ǚ5gggG4S 3Ŀj"D>WOg~ժf++ۥKvƉц Rj<>wwwVXZK􄄄nݺBI>;4r&E?][##ٳMR'88.]Ė-[8<%JЌB!Ļ),,SNuBɓ\|xٳ;wѣ?ycǎk.x"׬׻wol9¦M4Bz.PZ<ҌN>z(iiiUٸq)xYxUZlIٲe 9UU֖'HPP7n$11իӷo_<== &11SF M; 27nPJ&M\L6 ___-[ȑ#ۗ(vשQƻ8{n6mD||3ʔ)@֭[Gbb"-[d̘1hkkz׮]LZ*SLw>|8ׯ_jժ̜9SSSN:ѣGIHHcǎ|G̘1xYxfeDW^DEEѠA&Nˆgݻw3grM*VȸqXd ƍ#33e˖}v:t@N Gxرcڤb``_Af̘ADD3JWWh+ԩ?=BKKիWk6366fʔ)aaaXYYYСC,\@IKKdɒlٲGGB|F.]… M65 sM3gqqq[$+ɓs16m~hxzzEݺu166O>lܸZǏҘ9sfPg}F6m8uvʕ+8::ҤIXt);wdɒxxxвe?Uػw/mۖÇH߄xW#FULQU .pNͩ_>|)kر̖-[=9Çs޽|눷ӓǏƱc4kO?iF,Y0-[FxxYhkkW_oٵytܙ/ajժENߨRjժNfmGkһwo9r$SLl0n88?Ș1cXpau]-[Ҹqc~?MV_v WWWJ*ŦMCXf̘͛7rűdiӦF[:tڵk^zͨ(>c233ٶmmۖh7oΠA_>ԬYzϓH>}ؼy35k㸻PԩS|DDDPvmV^M^$7ۘLBVHNNf%!!!yشi| woaϞ=(Q )JLLᆪiӦ*U1cưqF '}U<==y .]۷s<ŋڵ++VdȐ!̛7=x ]tI&X???{~h߾=.f!UUqwwg|7Я_?/@QvA/5so><<T$F_| www٪URw]7o(_qQ1???xl۷Gѣ?e묬طoJ;pڷo_}PGl7n_|G~~>LLL0o޼Ru>v,,,e?SNE@@lڿ?.]ӧGcnh6oewһE...hѢ֬YMMM(**"-b@@Zj֭[&A*ѣ1c 8;;qO>-wk֬P|fll'ؿg]y666t_~em'O [[rO`̙3C 3g*^~=ñ|r عs'ڶm+ncc2Xbk֬A`` A?K.hܸ1>3hiiaÆ χ\\\пRpK^kΟ?&Ml~_T*K 5k J'{pssëW,|cʔ)X~=TUUe7! TڤIL>&&&5}tL07oF˖-u pqqA6m0sLXZZbذa8{,ѫW/B" n?~Νøq0tP(**";;Evv6===̚5 efffb޽믱yfa֭/::7nĈ#гgOî]]LT#|CKDG]jihh`qFu´i ̚5 M45n݊ݻcܸqo|^`` n݊^z'OKɓ۷[v'G177GJJ >}ZܿE(]ve%IK'tDEEowVoRRRc5 IDATɓ' ĉϊ ,^^^DzeC[@֭q .] xX}QQQڕl .Y'|Rf(q⒞#F!d7_OB߹s@a%+I6oYRIHHe/^ĥK`llc„ ٳg%d[[vѣq022RIԒ8AAAen*fddHRO>7J8x TUU+]yh"$K#mٲ˖-CѲeKܹs5k e-Z&211A+[z z s|$$$ Rol֪dIΉQMMMݾ}֗/A||~/`͚5쎉G֭!kѢ&Lssshhh ""gmٲ%LMMU᰾IR!33ҏmeggK5j5ADBBBΝ;#)) ݺuî]0n8t5ˆ#du_צMٌ݃_E[[ >|[m'dx@q=R>%?W4aI=z.ʶgr޽<7x.J[$) /ƅ  6nݒ/s\~.}]za„ LȨVw=+B >6'';v=xbԫWO>];4PHd|@rrrhsΝי155h֭e% T---ؔQ2>22RlժUׯl&@"+ayj歊߻ȐH$oPsNNKTRRD")7<4nX\y=SRR޽{!!w^zV4J"@kR2+'O0e4j'Nܹsh.s.+/LoٲVi9ʇRPPU{T >fۺu%K^RTv!ֽ^.**27^_]IvJ$4nܸ԰tС$$$ܖKDD // .du*ߤ(2+jjTL"@]]eć%FK.́e*,z/ՒIIIXre7;wCKK֝wIkw{Whh(oߎ/7oeǏz/\ݿ_6aDPP4h;;r٦Mx{{UV䝧'?~-ߪC[֮U{Wؒd(x葬7YzAEEa[۷ݻ(u9XYYACC@7++ ˇ&FDQUW%C_ ccc<.\ { gΜ """^Š+d=̊p%4iDdm֬DQľ}d=RǍ]]] ˖EGGCGG!!!صk>|ǏW t~+Qdd$4igϞ~.(1jjj*kuo֝;w0zhŽFq9!&&8}4J%=322šqƈӧO+UСC 55U ͛WBZ;FU(SSSkor.Je_u˗/`QQQn򎇈mX[[CMMM6ݻweXCnp-٬׹(**(DP|ʒ]$ЇKMM$XTT eCn޼ 333hii ظq#d/_ ddd@UU111pvvF߾}q! &MB||lÇѵkWL6 ƍ555`ll ]]]xxx ''[o:̘1-'|aÆ .Dzk׮{AAAb =h޼99333dee͛9s& # ==ݻ7Ν?&LԩS%5L&::Z6){`mmhxB^йsg_>nܸL`ǎ;v,ahh+W`Νhذ!<==1~xtϟ?ZaÆaܹ8wϟ9s %%nnnؾ};8w yTӧ駟BUUiiiO_B| ťKpuux0m4 4Hֳtijg ٳ;*++ߣ]v8r.\;w`8tallWI$((HNNu#)) qqq ڵkDuGEƍcǎaСHOOG-uVaaaشiA,ܺu ~-F`\|YvqHIIepڵ kY?~DQLwLDD_bkŊصkw.ck.hԨbbbp)t=O?ܹsߩ=N>]OB___vQ]޽{x . 77 pttD@@|}}ѫW/ݻWƕ+W`cckȑ#ݻwahhyaرXv-V^ {{{,\ Frr2///3/_O?ǏiӦpttСC_oٲGEZZΝ+WpBŋu&ڶm<==qI|ppp мyshiia۶mȀ;R)/_._v4k ͚5ӧѬY3.]®]sNt?3g8/^DAA7o077;ZjCCC;v ;v쀇{{{ $$!!!PSS w^dffbڴi'O&qmGƖ-[gn...z}ի¢L9affs!)) &&&hݺ6C@@ׯC]]FNNz uuuhjj^z͛7ѫW/t 5a!&&vvv8p qA!$$CϞ=ѣGR<>|-Z@-mmmaذab͚5O믿ٳvΝ ///$$$ @Æ q)Q[[vuuEnd?[[[cʼn'ct{ 9TpzwJJJիeeel߾ʘ;w. "** gϞDQ \]]zj,]ƸtڵkǏ??rVXm۶EApp0z!LTWo-VIV~=zt۱cTT#2DEEa奆ɛKUuVڵk8yTbiiyرc+wȑ#87i/Ɛ!Cjuϗ+V`Ϟ=CRSSxZ\}|}}eɫaס%QP>|`رDQ&X*Ӏv]ƠWWe˖}*b)fmm?U uɼy0~Z5~ɒ%o'OèT֭[m6;Q#^_^)̿7ĉ+Nj>h aD=GFFx'QǪRv&%%ᜋ8999ٕ?E{RPP*MUKD}Q<J.# x9sL;tP)C}}}dggWFSF*V$غuk?}t("""""""":ʊX` ["""?~H$055EJJ ׯ_y8jժn߾=ٳg~g"""""""""pU7KT#v4`'jjjW .Ĝ9s }}}()UhxaVQQ<==s~EQ̨Pӧaoo_˗tRhҤIJR8p7n܀ahhX]$$$޽{8p`EQĖ-[DQFa֬Y%Qh Q8jܼѣJAx԰sNHKK+ҴiS=mڴy6qȑwFm;DDDDDT튊0qD8;;ɩԺ B]]7oD~~n۶ f͂.^zU!;puuŦMW} T*ٳWsDDգ}` :VWWwuӱc6iݺ[Ӿ}{o߾ 8q+//Ϟ=,3yEDDDDu۷}}}= ޽ݻwGVо}{ 2W\Avv6v :ӧnj3|Dw" ӧacc޽{N*Ϟ=È#``` [wBII &L3gcENNv ј1c HGEnpe ݙ%ZK.(` ׯ`kkk8pm۶}@^|W]|9:!!~hhFQ->}:޽ ddd`8y$舢" 0uTڵT;_|㑓˒( ҥ ߿_V[=m'JE*-YENN$ `ccݻwCpss ݋7oB\~8}45(**0 2DSǎS/Q5kbu(X ` Ν=_~ ,++ 7nȿpBlxxxBzzn ˂ GY#Gɓ'ٳ1zh(**¢L;رcpvvѩS'9Q헞.jtOGU:u۷oc֭0aOL0/Ʊc0w\l^^^?իWm۶={6Ξ=3f`߾}+-Z`pss7Ahڴ,l>rrr ".5&1:QCBׯwݷoX5СC=֭[C]]]",, 9wMKzUhllѴK( ɝT*RRR0i$<ܽ{`ll ӓ +… ajj +++"<<*/+WPWƦ=o eeemӧO|ׯpm$&&bÆ ӧ`Ŋq=YZZZǝ;wSj:::wKMHH(3QmR#E a/mmm{--& 4kժv-7mTzzz: ?-- . O H{UJjjjBNNΝϟ_mm۶ZZZ>wǎòed˂sN`ʔ)֭[NDDDCCCbҥPSS@* ˢ(ԩw]gpp:tw(rSXXDyQ]aÆ۸taii eeexzzb̘1PPPŋ3|WPQQ) HKKQeii $&&B*DDUO߉ҀR\S--555[*((k+((()))I444J)hjj*JR՜ܬl1''H*dgggeggg>XZ]ㆈӧOw^Y>} EQQlYRR/^Ǐ#77}t*;""̙3Xx1,--ϟs?~<ѫW/lܸW\AXX"""f|gغu+`ʔ)8r+WD׮]qy(+зo_hhh_{R^xgÆ dϋʕ+9s@CCCnժUXhQޢ 4+$$$cLDDcܸq޽;N<ׯ _}+fڵC7nRRR0p@iӦÀХKhjjڵC޽K@UQQ<VE1I&K߿uĉer瓓 @;v+N>ۗ걹n:5 GEdd$fΜÇCEEի^],H`cc#{lgg;w C[[лwoxyyF]<Q55ѷ!bA'b#Zx V^h,Yk֬ MǏcѢEՓ=OQQ;vҥKqUl߾\|FFFp%$lѬY3&E\͛7ܹs1wr[[[cݺueaӦMOw֍\@tto_ /5!00)3KuEVVDQ1ydPf;cǎe+**bڵoϤIJ=zG<GpQ)˗/cڵHNNPRRN(P\GkժUhܸ1F`ٺ 6W^EJJ 23KAp1Q(Q {ny@DDDDDDT'p(=Q pBy@DDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT01JDDDDDDDDDuDDDDDDDDDT(;ya0{A({U:?(Q-Wҟ)JQXX,0Daaa """z[u61*I-pUNUȋ򎃈??ȋ򎃈mߢ_9EDEBT ܺuDDDTn޼XPP@qQ%E񕿿bNNC!"":$''(zDDDD5C]OBpB%EDDL^l{QYlYlDDdyADDD.tbTŧ()e9CT)233n߾}իy򎅈jWݾ}hffc!"""z` "{Q1wժUk… 2Xzu׏EDD̕w}Vw0T>c==򎃈HM+*ՄQSS """"""""2QApZJMM J򎃈H1jդI UF`!8䩼Ĩ"{R5<[c6cb&FabEy@DDDDDDTט-022R(X bǎԔƍ)0jp; r11JDDDDDDT߿Dޡݼy JFJMMŁF0ydy@T!'"""""""":Q"""""""""s%"""""""":Q"""""""""s%""""""Z@!P(:R UT̘1Ǐw(cbjD/o}DDSQQeс=jĉU}lQEq dddsҥ py⫯& &&000ȑ#&kgϞ=(,,DΝaccK.!fΜ ]]]4n_|INN" [F^^~w(++cȐ!PRR<}O% uuu@^^D}NBVVF̞=GϞ=yT(Xzk׮AE;ǠAK\~2dΜ9wwwY^½{ЦMt[nD"Az0|pe˖033ٰaдiS<|;v,t邼<|Çk. :۶m<|={VX-["99&M15kmFGK5 {Qѣq N:9ӧO#  ~hii!009s&6o }}}7 QѪU+@QQ***Ғ9***ضm-Zh֬annٳ8t\\\`aa}ϟGbb"sNhhh ;;~~~H$˃.!Ԡ!CQ"""""""&L|899aժU@||l ӑ 'ޤR):'''",,  ONN#ܹsaL:wF\\\ۼys#++KPv~555?GF`` dY>>ܹ3g$''cHJJ*y~&Fj{{{kٳaccSSrBaaaѣA*jjjXp!>|CCCׯ޽{d 2;v,:vUV!888}44hOOO~g̙32e 5j{{{~888]vׯ_ѭ[7iͫ,77K.Ell,F ,ZK,CWW000EPTTڵk˗/ѩS'lذǎ ԩZh?D@@j'""""""a<==1|pHKK{?{ ,(wݻwezzzOʕ++lήc{{r'N_~HMM-w#`ggKKKUstoaÆ2ˆ !CZfjjkVaÆZD#0bĈ j%""""""aԠ())A~vܹhxT u(AUU"801JDDDDDD6 N.811[n([kA/OQQQIJT%""""""ЦMbȑD?666駟gϞ3fLv6oތ-[}u...h׮u놾}j33gϞEZZlmmakk __?:ɓ'ppp5lmmfٺ_~={D߾}ѩS'L>LiQ1~x ?ӿ&HwߡSNСNuDDDDDDD5Tbb"Μ9g~cǰk.Y`bb___m۶Xn_Q oool޼ǎ׉xlقիWc޽&N\|Æ Czpܹs:tסˆ#+W+V@pp0O7n7oD`` Pj&Fj ,Y͛7ǜ9sP~}<}дiSɶUUU5tuumkĉ066ƨQЦMW8z׮]֭:uDN:gΜ$!((C 1ХK@QQ]vM6եK⯿*Ն VXmmm̟?jjj8rH ; MMM]v8~8pj JODDDDDDTC5jmڴP<ɎW VQQAϞ=e,--q-<|ݺu+}ll,~ѼysTawPVV%11/Iv[ZZ( DDD%=zaÆxlyyy8p hj%""""""aߏ@DGGGƱc }aҤIի;;;M6x|rddd`X~=cdggzmݺaaaƦM0c \cƌ>sA[[Cloooy\/ƍlH(:t(={Ço<;v硢 6 ##CŨQ0f={;w!66wFZZnݺoe0o< <:t7F&M >L0jjj(BAAǖ-[d}|2.\ ,Zׯ_GFF{{{L8O>ťK`gg@pE={͛7#==z0m4"::˖-Au4ց'Ou4h`Μ9LLL0|pӧDQ#~G9s>Ą 7@CCqqq044Ν;OбcGxyyAAA7oFǎvD(Q 3r2˾rm߾=ڷo/{<~RgϞ x6.]yImHL8u~; 2d "[faaQ?eƍcʔ) 5FyQ222Y窢'BYY***(,,͛*mVz]]]A@=ЫW/@EO<h}EÆ A _x@YYFDdddU|E)ٳg˃ ШQ# <zzzPTTD||<"""УG#44.]BDDD°ad aÆ8t[NDDDDDDΟ?۷cٲe߿?^xEEDDT[|pbiӦXhttt H x{{˶ݻ7 lٲژ9s&F-[ -- !Ξ= oooL>:u6v ppp555|oQYYQe1A N8q***hذ!ݻ]UVHII01 h/1cpyڳg޽f͚.]5F SSSv8~8"""0h :wqYW__ ['d2Gjf̝feZjliݰi(353E$Ȕ)\ȕ$H0Çu9_8;;{eܘ0ao65ݻwrJN>͈##M_}PRD,ljѸ8-ZDFԩ>>>a&jѢVrrr"<<~SNNrr2@ar肣ǏuV6mJժUm񸹹Ѿ}{ﶿ2 *wYӹZVHIIF1g QFTVjl2ԩCpp0 6͍ *{q̙+""""""cKqƬ[iӦ1o<˄ ={6TRШQ#VXA`` [lo%33䄻;x{{s, ֭ ^)kqbjrI[cǎܹJpp-YzuFideee~J֭֭... ˪U P¥bQwwwڶmkͯZ]pp0qssbŊ@G%W322HLL W4۷/lwwwbbb8~`{뭷8p[n~Adffr뭷or3gÇ~+K.gϞL6oйsg^z%BBBZxzzŜ9s8p+"R*\3FM$%%Wiii G޳=G^^>>> :vɜ9sڵ+7|+,mő֭[m"eddp![b"5j԰%bcbb8uT+z'7oETZ͛… /\2uӓurIO^^:u-{ %&&XUTa=v%FMLr2--h Att4#$$Zj+> 6lՕLeI˗Ϗ'OGpp0!!!Npp-08}4?/~ZjQZ5Vmgm3 IDATڵHOOgѢEg~ײsޗT_x@:ġC.%HI~h۶-{eŊL>͛?BCCUg|8$ nX{ۖ]RNӾ}dK1h :ĭj]vqaoNVQ7n-""""""eHIIIaرӦMUV+WGGGرcaÆdee~N?~<gƌ4h'''Μ9C&M߿?^^^tԉm۶b[hѢ6l/BD:hllm{9qsΥVZdffgIJJb֬YDDDӧɓ@ᙡoaaa899Ȯ]_>!!!شi6mwfϞ=888k׮}""""""RԬY#GPzbHYd 111׶288?T[{0h׮{jX~=?#999DDDЦMۊٳgY,_銈e'Fرc;vMٿb/8qbaKll߶$_IHHF0 +7o΢E%^EDDDDDDZx\\\x6lXhGGGzYbwEǩW+UVjoYrrrX,888ХKviZ/""""""WG}:...<@ٶ:bC?ҩS'L~;v.yyWc*HbbE!ȑ#OO;0̚5knX-}Y{ 78'''>:D6mӧOKqF ĝwIrr23f ++)S޽{={6?83f{\rDEE1o++u[o3FEDDDDDDDDJSzu-[F|||5k0tЋǸqHLLdʔ)lѣ)_m۶~`ڵ@K.$$$￳pB>G{PbTDDDDDDDDkҤ  `EFFyfz8tL8n '?S[l!==v;lu>>>1 ^Jr+wygVH7<1*"""""""""e"""""""""R(1*"""""""""e"""""""""R\hqqqNNNx{{SZzNDDDDDDDDDr\VZjѿ (VO^^999DGGi&m <==t, >bπl+>mʕ+o`Ү` C||{rr2gΜbb)=.i%'&&MݺuZ*k&::___ppp\rUV%((?''', ׳FϜ9/yrnnn₃Ǐ'00 8z(ʕnݺrbzxxxCRRRcUZ`ϧo߾tR~¨PN:us'55RJp]w~޽{quu塇 >>ͪUXzy~턇c999lٲ5{|ر֟jeʕ4nܘbcc3gVݻӢE bccʢwdzd*f͚ѦM9tݺuٙ 6Arr2Ջ raʕ+G=Xb6l7."""""""""Uՠo\v-[FDEEpBz-N:SիWsi6m_ˊk˖-|׶|ᇜ77vE+7.6mʑ#GXf G=mժUiݺ5,^+-;;y׮]۷b帹qw l޼www;Fƍmuwwm?}4gr899A&MˣYf+Wʕ+GڵIHHȕ*+FlϽ6nH\\r-ԨQ㼶۷ח ᆱ&YYYSPPp٢i{nyiѢ- jPx վ}hܸ1-[N:@|*W#P¨\2vb]ȥ+F}|| ѣ>|m7oҥKN:Mƍٸqc_54hЀf͚ϯOýd'''ϟ֭[y'ksNBBB0M5jk.پ};Ǐ'??'''l6jԈ6')qKTnnnu}}};QPP`4Mc)%%Fn/RbŊtWWWҘ?>Kr J*ѰaC}]lB͚53f A/???:ua00MXE+7ʊV VNNNIbb"aaaDÆ 9uɉ,ۊÇ`tMԨQm/PNtG}t)"rڽ{z2a.ڵk###iEDDDDDD$M2h =zcǎ899͆ ذaiӆ:www G!!!OOOڵR#x={tss{sb1N4 *ؾjՊFvZ.[y.] aÆ1|p|}}qpp^|y6mD&M&;;krIxx8K,!==VJժUmc_cۥQM4k׮iӆ /_Gȵf0նo~A%0 (vik è4#iin:QzEnܸH233i۶- 4ѕ>M0cƌʭV+ am+skNN[nbHhh('Om%[ jXλݾrs[%ƞ{^5??888Vôi jr1rssټy3DGGS|ybcc&** (LVT wwwjժŎ;8}4}˗/'((TNV+a0p@mMIMM%551M3eƋm48[a 304Wan&[61zvހ"""""R5hЀ6mPre[ʕ+?%%F  ˖-a*lݺuTZ`~iΜ9C~~>|7[!( n+.6Wi<kK.tҥX?l`nJ|'@N...dgg9*0V@' X`f9u^@,pmˀ@_`aL4?K7ֳΘ9l}qei&k |)p4MV )V+K,aϞ=iӆÇӺukbbbˋjժg3wK,LJȠw899裏ܹsqsscС'p n6:wlw}ǺuY&Ç?[+)*"E1_@_1 pk øl]m`>pw]m̳+%FaB5p=a@k`iF큗9gcJ5a_[~oի3sLFItt4999⋌?LV+~!>(N0 ֭[ǔ)SdŊL:Çs rrrZ*~~~呜l;ѣoߞ?~a^zbq}嗼[=zq1vX{kN+FED4bF<4͉g˶/(L~b0diqԳ(4՟gT5M{0Ro)\iQ|kKax(\ZF@)V\8p UVtޝqj֬w=öm #((-[ȑ#`޽s_RZ5}YۘӦMcΝJȍfkSVHiv€@׳M\SNڷoO\\<@rrrȰ͆ غu+{O>>}qƱc^xߏ>}Ǚ3gZ_WaJݜM|Baqpa\Fa"r03>JཱིN?CH+0 vΰgoVqsinx l.z/FDDDDD ছn"00]Ү];0`@6ss..zANTSO=ڵkiڴ)O>$K,`ذa2x`:wǏga۶mt֍3c ͛ǻKӦM裏x;v,6l ""C~1J/""vc 8a8]%znݨφa8Y Øw 0Ms0E} Xq@RjyqDDDDDl}/((vӦM) T%W_}1ߏj / /@~~>NN!C0dȐ<"RX,ȋ7+v=kR _0!v&[/gr4ͬKGDDDDD(`K\qpp5 .kELJHH駟;KeXF8;;g8.GAA h0f-a4M[;%""""""%PbTDŲ1\0Y,C.4ADDDDDD.._2GQ)s2GQ)s2GQ)s2GQ)s2GQ)s2GQ)s2GQ)s2GQ)s2GQ)s25a8,Bnnpuu"Rv)1*""""""rҸq<== KAAkdddX~z>c2]J\g.3g ^C';)tƨ9rh6mptth]vѰa:88Pj`˖-֭Kʕ/:^ZZ۶mh;)~Gve0JƎk0DJT*ԩS*UqrrJ*u!$$VvaX"7o>"##ٙ """0 4ٽ{7NB ԪU 777"##n:f͚e0J%E4++VnKٳ%KD~˗nK߿KIʕ j`233oϞ=۷uNFF>,,AࠓDDDDDDD|||BlD.f,yoV:vʕ+˳%*mm _WTgZWV @^^PruƲk׮K/""""j|k IDAT"""CAA?R&F-ZCRRk֬!==٪U+j֬a_k:\V1cO_30")mJV]6 d|xxx#PF [ɓ'9y5SDDDDDDDθq.ڵkٴi'OƑHiqC$F3228ue<ѣG뺌)""""""";z(_}Oqw}c8pUuqq_~89w߱|r[YrׯKxG%//#FC1emƼyػw/ӧOɉիWشiNiӦ̝;Ν;3~xQFJ 222xW4iC b?Uy4hЀ/;vDAAڵ~ DDDDDDDkҤ >,iii7˗燇|r߿?/"۶m#''?,XٴimѣIMMxzzͶm.}rr2u82,|nz^sWqT:0G-X,agZ,[ ___ZhA^^i^ԪUYfzjyʕ+Çm P...DEE͍ٞ&Oi䐘H?~<Æ ԩSvڵk;w,pQ?^i[ $$|l–-[lwdz~yGY~=qqqiVr#(+Fovׯo^fM:tIII);^zaaatؑCQ^=|}}dg݉LJ KRRkצnݺKȠzԮ]WWWEDDDDD ))n+'''$?-rQriA||::}v"""X~%}ԩz݅oɤIppp૯?7_r 4???6nH;>}:۷gɒ%}=z>3f0|vŠAR zO?%,,I O?ÇYv-<lْ_~wy~;5jANNO=ӦMaÆիm7lqv4iĞӕRT&FKndɒ ޽پ}%~'[qrc̙8::kXƺuhӦ X,vmRѹgر à[ntVSO]G}ڵk /hr3I&ѿ>3͛G~~A۷cǎQ|yڵkgdǎl7o&77{NDnHQޯe?;֏? Xj'<<3gҪU+g%%%:иqc/^L~~>b3ydhܸ1 lٲEyfuT?ٳÇӡC۪9(\y)l gee}޶VZb]v{6.4MnJLL [&((5k0uTL@ Wsr~ipqq7<~cѢEdddдiSƌc(/~4MhԨ-[C3UҺukj׮M~x饗h߾=5_?E>}8q"}' 88n^z/b ի-"""""""ؘ1cXnфtRjժYl;v#G0n8<7/R#FBtt4UTO?-v6l'NnݺL8_~_Bff&ƍ^A]nV&O\,!!!3rH<==sto^T\\\ /HHH ((L”)SpssiӦk׮]2d...H8q"mJ/""""""RJ;v OOOv_|Add$ ,gذa-ǭ[fԯ_kժņ شiqqqL0N:7GqOm݆+WdʕJQ `}5KN-leYӲeb=z8yg•z}vj2uT\\\zt/a0`;v_~oaΝԪU֭[[o_M 9r$m۶1tR, w}hBQRbB08s Pqƶ6dgg}vZn EI&,\V`VqF.]K/tEstppg늞/{jo&z"**_~aÆm6LcѢE̘1!CP^=n[111|w9ӭ[7,YBK^b,ZIKKEndJ/""""""R YV lgKo{[U ?&JKnlg8ZVV+PcǎݻM6>UVQ^>d…,[ңG&--;v͝wI ;v,NNN,_XYYY|ӇYfoQx'N`̙ݛ֭[Ӷm[ڵkǻKvvH"""""""̨QXv-IIItܙSMjj*#FiӦ=YfQzunfvAYl<,]۷E:uxӧ۶m#//ݻ3|^yҥ r 'OdСymۖ~͛nu۱cmٳ?|}}Sdٲe;{b&]6+WzԬY8IIIaϞ=1+Vݻi޼U[AAU4wr(1*""""""RL6Ϗ>ҥ`֭[ǺuiӦڵ 4Ϗ{m/o-܂C&9s[NjXj۶m#99;Sع;wfΝrw+cX?W/ >+2x`&L@ڵ=[2b*:zN:J @Ҭ 988qUD)e*Tp^Y```m܊#sC۵kn/J*دa|1,, ˥+:`ӦM(\5ƲeػwB%K[,陙Idd$ϡCիWEDDJZZv|ĉԨQ㪞jUO[rSbTDDDDDDDĎ|Ay͛i|rV^O?DFFsёO>`6mܹs=z4T^1c0~x>|||8q"999]ӧOsOƍ:t(~!?<7|3Vbض㋔Z."""""""bG| 6Çܹsqqqa„ L4~Ç3o<}]7nL*U0Mn-[?aZpbbbXt)&$$/zW^y={믿n7!r}iŨUP3gWK/T,<<]ھ/^W^yի;s^aoݻwfJ܂-"o"""""""v6vX~WVJpp0?#5{4>3;bccҥ  ছnGax{{3j(>CN:ĉٺu+ , ##&M~Jhh(NNN۷' 9r=_5"""""""vְaCRSSؽ{7=z!C /0`&OLrر#˖-Clݺ u߿?999T^ӨQ#*WᄇӰaC*Vh_~ʈ#8s  bTDDDDDDz!KVXiҶm[.]J޽2e ӦMСCz|'|͌=C|b'DEE_0XȾ};w.wu׵)1*""""""RJX,V+a`XTiiiIPPmpp0^^^dee# ɓ'_7ndӣG, lR"""""""""ɓ'iٲ%-[d޽lٲ ЬY36l̙3"$$ GNO̙3[888жm[ԩx{{}vRRRxٲe ={$==CC=DBB~=_5ĨH)ѪU+n6~ׯ?NϞ=qpp࣏>b̙ꫤѬY3fϞM>}#551cO<6l1cƌjRR%:w{%)) Mr ""׉"""""""/ yuM6?'))ÇӢE []pp0Ǐ'##V@@@;[ne׮]dddЪU+ d2d=z8oLm3%FEDDDDDDlƌ}:RPTT#i;Œp=DZc2d=2NQ,::z0qf֬YދؓV\e+WwBBBC %FEDDDDDDD￟cǎ;RgϞA䂔իGz\DIgX,uD9CDDDDDDDDĞJJ>~\@iJOOOG0r$Y`8DDDDDDDDD쩤9s&.77z"XVVCDDDDDDDDJL&''^zOYjULJJCDDDDDDDDJLy8!!Ce_سgOzjjꋦi&;{sPEZZM3336mz%Wilܸ19**jizzGDٻs$BD$BBc(bG[+֞5jU-JTkoMDmM"noO*%y?6>$w~ !B!lO>TP.AAAׯXD uHMMѣGړ'Oގw@1 !B!Bxi3&&f(Դq!EQF|BјTD}ǑZ6999:%%%$!!PbbvV︄~)Rʪ¢JJBKKK{qٳgZmB!/^iVV{MQ jRCUinh^UUpa}%^ӄ wB!ijgϸtRӧO?􉌌<︄B!D~_0>9!r(:v5a###}$B×cZ[H!B!țƨB!B!"ߑĨB!B!"ߑBŋF޼y;vb4"Vӓ ;!B!9DBGҥPC<)Szb4"òehԨ$FB!"Ĩ⥪UFF`aa.]ub4"޽{B!B&5FB!B!$FB!B!$FB!B!BwHJJ /]/>>֭[B!BIBٶmiiiQ.G#B!B]Bw$<B!B@j !B!B!I !B!B!I !B!B!I !B!B!I !B!B!J/B;vvv+WNa䘄Ξ=0+VFaH\0ߵhEQZ1 V5(@EPM.i}(Rpwru"E-chwRo&,,La _"KyUG!3QQQɢEXz5nd=zķ~[vU.]Jbb"^z{֮]dz}vƌPrÇ?uP. IDATr̕+W~:uw(XXXO?}(^?~\`VQ}mQhѮM6-ZIu͛ZmMÇ:DZ}BlR|oQF *熵kҮ];}NX|$F;KBnbժU̚5+&Mow% 4ݲ&M֭[IJJԮ]\;-[; {~~~#UZU/pE߯0r\:uޥF8pRRR>(RRJǎ[\#///sjƍ;ikk;XnQTJV ޝ>}Z!8EQޥfڳgC"[RcT!r/Æ c„ ܸq0c Μ9СC:t(ϴ]hh(#GdڴigzlL81ӲEzj 177'11Ǐ !PtOlذAMfRhQVXQvߗ/_~BwĨ(*EQE) TQQ8+(J)EQ(bk"Oٰaǎۛ=z0uTBBB(]4 vL6ӧckkА%K0n8ʕ+ŋu`kk]cT* . ŋ)[l'BgΛ/^l_hQ}Vo޼y柔,YcB7SE1eJ(QĤYASSS3CCC#Je````R ڴic`jj )RF&$$%&& $M-4MjujBBB|bbb|ZZ[=hB0V}j!֭dɒ >HouV+122%3V5kŊK.Oܹs5jDEEٲe ϟgʕB!uʕ_`iiPb̘1Vϟ_(VMw>T,--&55K.Qfͷ]Tx.-[4wbhhH>}*޸qK![ޙĨ(%̚X[[7)P@eKK"۷/VŲbŊ(P@aR(^8ŋjժ@Ӊƍ^ti@@@Lݺu&%%] =Vkm۷/}~)> {SBܹѣG &88S>|ȉ'h׮ǎѣGRLFVe۶mnܹuѧO֭[ǹsҥ | B&NY}V \rYnpB.\HPPL6ƍEQ[n'իW7,UTK$1*ӧ9{n;? 4NסĨ(FFF z.\ڧ~jռys*UuͩUj*jܻwʕ+_8p˓3ZVߨ9z[K>}UL%JPF Μ97|駺)$99rʡh3f ׮]{=OYE''|?bꦉCվPCѠRP͛wlXқ>{ &jEY]d\3sss>C֬Yu&O$FE&UŤD,Y˶kκRJRo߾[XVW h}ηt҅cii͛ҥ6ٳg.\ "" Ųeˈ&885kҷo_Xd h">޽;˗wބp9hҤ ...wB!6w\,--:u*|Ȗ-[(X ӧOrܺu$ >+;wHgLMM޽;cǎٳgjݾە†  c8::r55j`ggDZcHHH2eаaCƎZXb<|;;;jժnr}?Hֶwݺu6mce|.(^8-=s̨3f_}%B! 2N:QP!HKKqҮ];͛ǪUؘbŊɓԩO֍<>|8xzzҭ[7͛… 166f(P@-^ARRgϞ%&&OOl ҥKXXXдiӷai&bccINN֍{Ǐ'00P7Z4qqqڵ8mOؘN:gWNݺuh֬mۖbŊW_q]Z-ƍ֭[Ӹqc.\8q"=&Mp]/^ }i;wSZ- Μ9CLL nZQfo͌96mS<==Yf ϧ|򘛛ӠABBB3g.]"119ssN"""߿?Æ cL0WWW틛QQQ,\2e燅:uiwJ*bP|?"٫Wю;-ZB o߾=[ !Buܹs9sÇSxqpww׭d<==v*TQFڒƚ5kHHHL2ذf"""5\Zn ٳo{{{=xU_~%G!..?8˗/>iii_ܹVnbɒ%УG,]GGJkc{U;w0sL.]O<_~Yf߿GҢE )… 7n7-[$110M_Exx8Ǐؘ>}Ptiڷo甓.\U21Μ9ŋ:t;ڵ+~~~.\ݻRؾ};>>>l2 OWc81(ۻyڵs2PtirPޞd2%?k׮W\RJY޽{XYY0*Qj*ycݻ7 I䰗]FUB(10󫯾q9no".\>} w 777 ܑ#GP[M 6 FqӧO111K.};B~7ݛ`Ο?Pvm]S!Bnʺu}6jjժѻwoڶm ݻw6m$&&RN>}۷Сf"00pT*>>>L8*UĔ)St2p.\WWW] aaa̝;???>|HQ .?)yPFҺuk6lO&**?N8ALL /L wK.EЮ];W}ׯ'<<:uбcG }49sHKKc@z߿ǏckkKv(U>Bw޽\z<==)S ۟9s]vQhQw˚b_xݻwL۶m+D^ڍE1ҦMHΜ9S\p!3gdذaq9ԩèQtьah4>|+Wg;ǎcŊ8pxj5gϞeEQ\/i ﲌioٳB׵kW7oNƍiܸ1ϟBקj9r$_}|wsyf͚E||<|`hhH߾})\0ׯ_'55 *g4 CѢE *VYpuʕ+|l߾GGG&MǎcժUoɃj5ݻwի8p>GpaNʀݻl߾/} 4Ǐ닇wׯ_ÃׯSlY&L_Wq366B h4"""OD'gVM6ޭ[fǎ8;;s!*W̽{2mcHjj*˗/I&ܾ};ܹ֭[chh:ubӦM}BS^{h;>'&..KKK""";w.VVVlٲooolق 9۷믹~:..._t֍ӡCpwwҥKQT>|???LBfͨ[.^^^<~ur9ڶm;w$--Gq wΔ)Sؼy3d ĉIKKԔ4RRR>}:)))$''SX1ߟ#wEYf._?P!4jcƌ!..KfݲeAQƎKZr;T!Bo-[ΝƏ'=z… cjj7>`4lؐ7aߧܹȑ#}vиqcƍGBB׮]ŅիWVK^:t(+2yd>,;eZ-˖-АOùx"AAAL<9W?8y$seĈ̘1sNΟ?Ͻ{gʕу>?[2zh>BCC?֭nnn̘1Cלy|4iDr t Cԫ[k.\Kq-bcc=z4 FԫWZjѩS't(_<)));˗/`BBB'::+Wrʔ)CΝ?~<pIlll(W|._P|y>3FZf͚l޼ΝKʕYh;vK.3(jժE&M8|0#F`L8J*xb:vȽ{ͱnnn :|M!x^zloԩ 4(mj5'N`۶m0hР\-.ʓ'Orm\BLL x]O<LJh_(p UVTXڒͮCnx".]"::mfeĐZl"Ǐ9ݻwcǎYN|nϏh4h={NTT썎Q獾G ,<䦵5-[`СԮ]5kɓ'f%Ͱ2g$Fٳ'@{;w:tH7hѣGԫW'OPD v횩NNKɩgbbkLٲeuITYO͘&RpvvfϞ=ܻw;;L륤pX:}牏ԩS8;;J%""߯Z___te*ƏO6mS|;wvڬ]ϣR ʹePF J.͹s=MYbʕ+ܸqjժ) #"ox[9} ʹ]vsN HPT憱q+UĩS@̙3kkkzy&666_bkk7ZF=djiiɞ={s ё~d0r Gn(_+!!!899QP!I222k !=z͛73f̠hѢ,]W2p@Erʌ3F]ll,ƍTZUwúo BVj_>WetJpp0vb,^O>?dʕ92[ؾ};gΝy&*UQl S7222ǿd'88kKrL^x;w7y-!!!#o޼ɖ-[8vիWپ};˖-21zevɹs޽+'FϜ9Cr^Z\_{BVWjyddnpnd!@z$uEQj5f|rqq-hhh W\ѽWdm IDAT??*1c}*Uprr61>}ZUֳx⺟_tDsJJ fff899閕,YFǏ_H>x(t#qww2)hHJJz"[f}Zg(3[KHHѣL4vQ^=]23CJJ K( %K=/#Qݺu[n9EVV~3H ግ=skα 2j^/_-[bkk{@H+W&,, 5kfRSSٸq#$%%{n8O?ٿNRHJJҽWRp˞={駟 3IJJ">>^frJT©St/:*TH7f\r=7nFGGN"jVZի144 272h Xl #FÙ3g+Vo߾G+WS700rjegƌs?ըQnݺعرcIMM}z/A\\GL0lG'egɌ=VZgV=;z*T; .L"Exq/硡̚5֭[ӤIJ(Ǐu@WXTHbbbPE70cuM6+W.벝XYY閹ҦMZ-k֬ԩS,X 'kZԜٻee,ɜ)""ҥKKPPPdjHGdjlٲ*UdF[~i݀%ccc4 c,[e9~*T荶M2ַ2:tKKKϊ+r =zLMCcbb "!!333sxIWKKLx֭9>0O}׿ڷ7^:Ǫ*Ϛ5K7c׮]SSSGGG={QիW >q@UKpp0=z[nL6Wڶ|vvv)}VVV<~X^rrC95GRe4 Ǐ}ܕӿ*y׊'O_iHJu?F̀HIIJ*?@7 wtܙvFM8>}вeK;LMMuI3撒HLL j$$$drZnofĈgjjʺuxOիSXMJJҭR޽;ׯ_gѢEh4N>u bŊɾ}ؼycx3]vTRl޼7rINJҥ{߉3gΤ@q 0c 4 K.%>>5ESRRt7nL˖-9x h4֮]/).D^#FZ3WW .eԮxSiiiDGGԁ(vЁ4 ;vɓ's-5j{n;v,-Zggg.\6lLrr2,_>-Zf.^Hxx8ǏaÆ,YM2l0i׮UVE̩S(S 3gΎK.ѭ[7T'''lllpssԔÇG}#_w܉ !D.kҤ ֭cڵeqRTd9b4;mڴaС@{V͍)||||8rK_~(P(N=^BB !!!TR޽{K5_K.g}ݻw  &&5kRJ:Dtt4Ϟ=wޙpjϟÇiРA[2ӯ_?LLLؿ?ƍ#..NWN:o\#;v,ŊСCDDDzW5j\t &O˖-#!!HPP jժ>}jԨȑ#uSj;w۷ ݝmRLVZŋy&qqqmۖ&MyY TRlْo)Stڕ7ұcGO6lN^hР׮]ˮ]hذ!ߟiӦ~ܼysv~Fa̛7J*1uTl=zC~hժ͛7޳fƍ|7 6 gggFE2e:t(t[[[Gƍټy3>>>ԭ[cccqqq:ڷoO@@GɉWһwoV^ʕ+7n{ܜ5jtR(s!7*Zx 6233Mxٱe WX1z¶upy^:+ ?QFYvC600x!JE-^i:„ 2=>rl9rW.cccc5jDqppXYYd Xqrr"""OOOZj|nCƲe(X vvv 4Ok=8p8J.͂ cڵܹskײuVK5jٻw/ڵ+Sb={WWWξ}زeK1cưg+|}}Yf w&>>J*HDDD͜ '''6mJٴi1g_~/$..VZ1vO>Zjɏ?ܹsg_5$O85e„ oSSLa.]W_}ŋ_O5tM4T*s+ .d߾}QfMhР˗/gȐ!<~M6ѱcǜ1*DoI瓚o<y=\k($EEƯ`x{{3~xegwW>>>=z_e!ĻLQ6lcŋK,vEԓ'O$}خV7oTX1˩M^Uӛ.g=p/_- 5-M PFDZ O޾};Q]>ܜ믿Ҽys˘1ct5%Lpſ###jԨ1~:C HϻNՒN+ߌɌoδNƵ|2]vү-7͊=nݚʕ+S|||tHj5iii4kL !ɱ666x{{cmmپ};9|+::իW3n84i7|#IQ!ȣ.^Hǎ={CyA{2?cJΞ=u5Gݻ(p"..P\9X#zꅕ>$22#F#?`mmN&E}||hժU4%tܙׯ3vX]IKK#00D={FTT'NƍDFFrA"""Ԕ;v7 ggg '%%p=z **I&ʍ7/SZ֯_OӦMlnoSϏNHH 99YwCVZˍ7?>W\!11+W#HMLL8pW^%44ǏӴiSڶm 1 @>}PT̞=xBBB۷.Qc̙3,^!ͥKXx1k֬B#͛رcSO>e۶m+VE믿ҥKqttdƍFV(X 'N`|;vSҷo\NDͱz:ͣGlܸ:PHKZnٵk5ɓ'lٲ*U` =!M͚5裏h߾= 45ݻ7oOOO0`se߾}/_!CЧOիuetnYSӧ[︹1sL] lmmi޼9oooo<<<8<={ɉqF>}ʈ#Oڵ+͛7֖5k0fN: iӆ+Wre*UDiѢ۷Etؑ+Wgݨw(E٩(EQF*WQ%ڵ_K-^777N>}X"Nz !ە+|2j4lؐ'OuV.]JxM=b߾}\z5k2~x ,ﰄB7or (@^(Pرׯ[ѣၛ}=zHO$dzyfhѢ;vয়~"..O??77:uSNn۶mi۶-jZꫯtk4:t老^^^2dC yaxxxd; }ܹ̚5LaԩS)R^z޽{iذ!@ٳ;w鉓_\|CCCCXX[nVZO?m6 *D>}25{,--Yj<{ҥRtIG-ZHwfϞFvYsԨQ5J>̕+Wcǎ@'OҪU+HIIa֭DFFұcGJ*kvA޽K"E֭[۷Mĉ9q :4Wgܸq7.Ӳnݺe>|xGj 8:)BЈ3[RJ*]ZTQJ0ۨ][QԨ-v%B#:?Zx>:;׹l;f̘4ҥ ]tIٱdɒzm~aLӜ%I: ||l|{+3i˖O_Ů]޽{ӹsghժ3gLogIB=3f ...7>̲hwGlٲo>YfQjU~'z-""O!42d1gϞ%<>c_> ,I&T\_~?AŊX"j"000?# &::[DqeگeE pEmƒ%KHNNӓի~ZΝ;9y$ԨQ=z'O.ODDҁa3p@u놳3W~ϟ{vѡC≯q〔KnϹgBBB *z*gٙˊyyGY=S bԨQ~Vk׮,Xv1b<==,+oׯ_ǪUZQ Μ9spww'44fւ_"[lݻ>}ĪU9s& Eo$%%QpaUFjոx񢥏SҶm[˨+Vpuϟ/^̫$΅,3 X aFo8o@_08b:4L{O|8 6 Py їcϳ !!! /;@g00F=kt`/09wtL4 .p0@K )# oqaj֬I6m8q]vٳ :N:m65jDfXz5 UT\rcmF:u, UP;wruQKUGbb"-Z*U*Ӧ YTBر#;v$99???n/byݝ2ePl٧.8|2s9dɒ4nܘ>(K 2~x>s-ZDpp0W^L2ȑ .͛7PB(rʅ/Ǐlٲ=z… 3tP ebRRR]Ύ3f0l0N<W\@<фp q4M nܸwy|q1ʗ/O>}9:ϟ?'.\ &7pY  p)R, Z^;;;b ^u9ɯ IDAT~8͚5 X%Cy: L7 ÖPiQa4G^4'1p$%,^#ea^4=nwҺu:"<<}! T2M3ۓ؞0M0Vw+:Xo/a| [횓':}YgggLӤaÆ\7xk2h [VgϦJ*уꫯS < ɓ̚5uX[[3m4-[?@޽ED12DN>?3f̰l+ϟ?3 #88+Wp͟??e˖E)R~Sll,f>˗/Alٲd;;mڴaʔ)|w,X.]`&eʔJ*|L>U/cܘ>ܹsg?VXA|?>:ԩSSn]Μ97 6dԩ̙3*U0gˈ:pB ĨQbҥԩSgϲ}vT͛74MMyUI/#:P^ЎљL< @Ms{a}ӫ`4jժNÇ i6 xBv D~iny@S4-Ϛߚ*!C%$$X7 \]] 4M (`i[`ArITTT>\\\/ʕ+Sre^ʢE,y<hZ)UJJj^||>> 6?Ο?O||<ݻwg֭׏;0rH-JϞ=e˖̘1}*$vvvlٲ˗/SR%֭Kr>@Ӈ9r0tPϟϡC,sFGGm6ڷoϤIݻ7 iӦ׏e2p@\\\Y&Ç?~n899`iѢ _~̜9SpayӧK,aϞ=׏+Wbccʕ+i֬gϦW^ 8P}*UСC-aرcϲ'H ξ󤄛W` |dT"ic00i.m=-}H퇂CgΜ)Wxv… _vm}R RF{rג2anomߦi%%$ 7 ЂH3˗/SV-jժѣGٷo-z/_~(Xx1.]ٳgsIbcc4iVVV4lؐҥK)SDFF2er aʔ)2x`\\\(\0RT)"zR<[[[h;~xy0 ܹscooɦED3mO5$u ,===ZzY<+G2OdZe֭iݺumճ=(rӣdy͚5Yf+V]vk׮ڽko?eѢEU<ɤc[0 %Q} J\a0W@30FMLx>8p` Nk1gݺub&|R;7 [`aM`)#2R}yC ØL\_ь)7P4vԩS?C۶m_~᧟~bԨQQzuƏOt~e*O>+++ѣ֭fO>!99WWW7o58p?$ZjEDO]00n͙3g...Ԯ];,0P,i3LӜk|ih0i0 <) M ry0@[l5 iӣh4z t-.^رc>}z4894aMӼJZ(mF14 ØKJh +4ͫa,'9N7 `zߴΝ#G2rȻU\yq5N:E͚5- ,h6++T eϞsa"""]6wkkk֯_OPPT\YO3FEDDDDD %`HydB:qޡم )R䳣G=zt;zV͝;7_~sԩizۓHx}_Mc[?'Nښ;2|pJ,f[Tmٳg'{uTX1+u<IIIeuY.yşU,JHH98ϝ;705.]ڣf͚+WhѢY]Z/#G?~fVוnOp /iNJJ2rbbߌ`ϏֹܵsIj(Sc#""$W^Y]VZY]Brvv&00P͛gu ͍_7fu)$$$gϞެ8i&i|mF+WV*ZhSMӌzH;%xohӦM{ܹsՒRdڅ ʖi'ifũ3L5[rȑ%;/// `4..>}C/k|Z\xm۶ȏ?ED_fu A O};?@>ˣ3M3yKRgϞ] : h޺u?/y/iӆ6mdu4oȑ;w,#\|cҿ,EDDDDDDDDDUV𰒓9uT(P;W\yU2adu"""""""""򀞺`I].111K""""""""""KM@߾}9}eC~W.\hy_tiFMrr2:t !!43gNNN|VZq"##6m 6|::_j#sMQyuS=h2epssʕ+$%%pۇaxzzHPPAAA$''SbE 0(_xwwwJ.ͱcDzDI*TO>ʕ+Xʕ+ӣG^{lٲb xW2 GqIl´iNf_+V3gN틣Cgż:u>2e駟ϊ+(Q~im=z4>>>}SΝTW^r"66(BBB'''TR/^k׮NR,HE$}8::ҨQ#+@Xez޽;J*RW|hڴ) f͚A SjUʗ/Oݺuzovvv˗봷~PR{~FҾۢaxyyNRȳF=J@@\rK@J{nʖ- 'e;'ĉ>>4k ggg5jġC?>l߾-[R@<== 'N| 4 22ٳg?gDɑ#e[޼y)Y7nLڵYekΜ9TR/N%Rmر#&L .]0`ѸqGYDDDDDD$+<K*KTRx?>q111/^Sy6<3#F?8rC퍛}XX;ϟm۶͛7K,#F ðjР:88@޼y)]4~~~@ʊ%K@)SҥK?~ԩC)Y$Νp-[6<<<(X Ype! y}: GaO&wܴk׎ufYyVZӇJ*eY"""""""OtyܹsS XTRzңk%!!9tŊǃ>=5<|MW)_< ˗/ʕLJUfaoȑ#QMium0>|xR *;_9a{0 )99KF r IDATGHF4i;˖-dɒY]SNqر#&Lʕ+ҷilڴ |M:w/""""""ɰedժUի￟/O<կ=vvv$$$`cc>>hsTlBB˖-\`k׮ͼxMLLC8q"}֖K.gUF 44t]{ԩ/waEϞ=_~ O2Ihh(fȐ!ѣk#F|! .PT$k=zS2dbbbψJ~ ""#F|͌3hҤ \p1c0l0oW^/{=8={k׮xxxжm[Vɓ3yd؈2M0 ?? ,جsE5jd)R)S0a;1?www|||ptt|>:d?04Mt,QD K,L23w\ &L`isAO8u'NHWŊӧOsVZ*T… sE|}}y&۶m$%%{n gΜs"""""""ϸL Fo3M0 www/ޱcB5kfe`Xsŗ_~fSN1+ܹsSo}.")]4eʔ`̘1ٳӧӨQ#Zn @LL ٳgK.͛7]}%o޼Yi ӓ-[)Sȣ`64oa8VW%""""""|ʲ`Nica#G& pmܸq_~5|(&]6ף:sĄY]7}v_[.9r 88N`)RyrZjeiKٴi'Ofڴixzz2n8+̙3> ((e˖'0o>iGTi1M3v+0@pȕ+i͛wu.0#ãÒcp4͘L$`O}0oLL0 nxxYSd5.@DDDDDDDDD$)玂Qy(玂Qy<ӫҋȃ0 #x"TVzeu&44Yƍe3gΰtҬ. è1;+oi"""Q0*"""DFF2~.#˅3f̘g*q ?R;vxsQzu^}լ.b2ݒ%K{yQy FEDD SV!uٳY]<]4Ǩ}Ms4^=>>͛7su֍_(Y$mڴIBEDDD2Qi̝;7|777^z%Ə]]6L0///*Uȑ#0 >>P@7o;#|?K.Ύ *ݻ;w.}L2HY?d… :2tdϞ *PZ,f{Q0*""""ȟ??'O&11?"EPLTmLϞ=ٱcUVŲ/88rʅgϞ%22GGGl+X'O˪s&"""Cj#uVVV.}ݖ̶m(VX+' ȿKAy׮]cݏZdӧO5 ciPPм&MQK ''.MD_sΫ۶m;pĉ.i1 FED$S,XI&aooOrrrsApp0  **9rdU 6RP!w=7n`ǎDDDPpaիǞ={p4jrOo;w.Ã.]7PY|9w&o޼tWWWݻ7\rL<www5ks,Y(5kFڵ zРAԩs񑑑=05kvQ111]vU͛ÇX":uٳ_DDDPJ<<]JXnQQQ*Tdzg̙éS3g/W^ԫW?{rTuطo+VwެYE׏իWӿ6mٳYjє)S͛7qqqɬ㙵c:uDҥiذ!M4_UV=zETT| 2$U}UV%44c?ңG4wuڴiC޼yyW:u*7ndqύ1c`oo͛7駟8{, L4M61uT<<|xLHH_'"".]0oOO4ÐX^{xxhѢ-RƦM&!!M6a&UVe޼yC ͍{Տ[nʊ 2x`ϟov 6'ҭ[7:vH"E駟0aL2:uЧO _|-6l 66?VZ1w\J*'|-[X~]h-s 7nܘÇo\5ǏJ9ԩo&Z_s"̘1ڻ,Ė 4MLZ{,Ҋ6_&Uۨv(ZZʴ}Lk(Q$d߈$G_St༟s׹}_9~r]???v ٳ'?>cƌ᫯l̙3ӧ 6_|Ott4M6ӓVZ_˗Yr%{""")1*""N8P+x?Zlikذ!V">> v)7j8nƍ7ߐMIImr.^Ⱦ}իVVVk׎˗Ӿ}{Uڵٲe $%%[3^{{{c믿~K۝;ww}C0LDGG+1Z^}U/hliLJKuΝ;Z*111Đ=hyFIbofeֻ-$]DAA{Gqqqg?Kh/_ kښP*Ut888h+RBB%%%޾6668hѢ/2/7n'5km -- {{{A̜9 TY_1VwƶFww -- kkkի駟vWZDDD&%FEDD(K) w^ޕ.]|o^$+++lmmvq̙3ڜ?#Gbbbxoj74AY Oeal wxx8ժUzX1Lxxx;;jԨNNN:t8OXX:t`С=",,srr8z1CԩSTTƍuĉcooQw1\]]3CCaaq,>>\c{#Y~)<==ooݺu! ///ٶm1Kڷo*"""Ш#"66}qW틊0L82ׯ_ LOkkk<<<8p?3ƞ@f֭Izx]Szu/^Ljj*:tHjժH&EmF޽ٻw]z@N8رc9~8%%%$$$PXXHVVL88222زe W^%''֭[ǹs爋#::>}m۵k׌$$447nǻk~,]={rرj0~=+ׯPh֬UTaǎ1k,=Jaa!GfɱcǸp{m۶t HFFC ښO?|Ν;СC+㫯]vቈQbTDDѨQ#^{n?j(.\#*vZ>S4iBxx81&L ""&M0a{Hdk׮|cK/ڵkquueܹѤIϟϜ9s`ŊФI:w#'Nёw}ݻw3ydC4m1lذѝ}g 8+VЫW/9r$w+pV^͋/ٳԩSiڴ)ݻwgϞj([oOڵ+111 63gs̐!C73Wo&/]MOOgȑ82ӦMcÆ 4i҄FDС8991uTN:Ev8t ӓ VXAzz:!!!׏ӡCo=z4{I& >-[ХK,X#GxLǎٳ';vw,X͛7EDDD5Qbee5d2 7w"kի\VZVXAΝiԨQ) Gw><<$㏩R }'Nё>}PvmRSSY|9IIIK 0ɓ'@=3g'88~~ʕ+3x`vɓׯo=}l,MF_+--d2accƍw[^,BCC=z,ZtҘ>}:׮]#<<j֬I>}pqq̙3]:uDn6lZÃKٰaf͚ 4y|r9r}͜LHH &&>?[ZZ ܺkk12L}7~oR-4sIDATWll,wl_RXX %;;kגL իİi&\o?ݻwgȑ?+ŋ9~8曌? vSO=e$+K}/_~cM&ӮHDDD,fT … y뭷_>yyy]ÇRreFd"88N:1n86nXni eԨQL&6ö#f֬Y 0;;;~IN kkrI{M^~*wʕ+[z 瓝ͤItSL!;;wy!CnQRR¦Mܹ3Ç'))X}bccYh]tΎP.'N֯ꞒvA:رcm*L3nݺf,FbĈlEsK˒%K+666Ň\\\V*sN:+l߾ts߶f>"""><<<ѣԪUxzz2sLlooW2zhN>5EEEѮ];vI͚5 cÆ 3n8FAZZeRzu2226m:uy4oޜ 0c 7oNݱbɒ%,[|ƏϞ={pss#%%ӬY3֯_Opp03f`ǎx{{`ccIMMCm͛INNfذa1i$6o7:w+Yz5֌37ҸqcbcciѢyyy,YLtt4͛7W^kpuu5]X.Uy< Uغu+_n9wQ*l"BCC6mﶋwwgtt4/W}|߾} 8;;wxת􏣊JJQq"""r^D*W_}er*ׂ x饗~Mii)k֬믿`;{Ǻu b< DII u-w<-- BIIIs.\ ##xo2"77b((((R~G*tqq1l]5d2QTTo{bb"7nܠK.Ʊ>}:K.ePDDDDDDDd{:YYYݺ`Ljɓ'+˗ܹs 2ޛL&٘vvvTT744gy\5k'O$885j߲e>#裏WXQn߽͛73m4Gjj*~!իW7=z޽{MRR#Gߟ˗/3f\]]IJJ֖;e7oX .i0f'ͩS4I0_~E>DDDXjbt𲹃hG9x]z*W^8I  O>ի_~0o<yf̘E3˖-+D%K:˖-͍qƱpBٳgښlBBBg… 26m0p@3xzzﭬY}:ѯ_rnڴ͛ck{5k̸U?;رcvk@IrsWXa$x |}}׿ſ/LBf͌Ͼ̛7믗wʕ 68*Wl,1ܹK.egym3Koܸu~L&qqqTZz>""""""""R͛G߾}o9޸qc۷/EEEꫬ_={?3f0x`1LL:l׮] sܽ{7 4 4Nz8|0YYYL>>}{aggGj7nPF~ϧM6_}YwN>}Z*~a?91+yrxyy-_zu\Jb :wLFwW6}tƌSa=| :իW( G999{ܱ C<ǨX%FEDDDDDDDD(1*"""""""""GQ8JQbTDDDDDDDDD,"""""""""bql<ӹt钹1>>DDDaPDښ*U; @Jjذ! 64w""""""""J{QbTDDDDDDDDD,"""""""""bqĨX%FEDDDDDDDD(1*"""""""""GQ8JQbTDDDDDDDDD,"""""""""bqĨX%FEDDDDDDDD(1*"""""""""GQ8JQbTDDDDDDDDD,"""""""""bqĨX%FEDDDDDDDD(1*"""""""""GQ8@DDRo>Ξ=Kڵ#::=z;d2QTT}{AVXӧ[._~e/"""""r"""f?0aRSSqvv&;;ʕ+cccC׮]}=e֭[~;֭[W_~EDDDDD~KKEDDT Xh^^^r!mII qqqݶL 778~9]vK{Dzz:&K.Q\\|Kk׮}qӍ[neժUԩSl}>??'O8Μ9Cii-mL6m 55޻xL4 6mPn]tB||<|glذ \]]gСTRO?DΟ?/'Oޞ-Zĉ'Z*ƍo߾l۶ŋ@aa!۷g˖-?~SMbb"ݻwgԩ,]>^xH >sL&GYf®]ꫯ8~83i$.]ƍILLٙ*U/вeK-[v3:w+Wd8;;өS'&OϤLJf} %%C#OF S\\DEE!::<{ իWEnOEEEX,WBvv6deeѿW4BHB1!|xn݂X,FϞ=a``Pҿfzz:(DEEÇ())aoocBVVAI!ĄRG}6|}}Xhhh:t(TTTx+Wׯ_,--aoo;;;tڵsBHsG1!ҋ//agg;;;-\q 7;!4TB$&&bΝߡ˗O?cwߏSNapuuŔ)S -MWB6* !ݻ;vFFFpuuP(dٳgؽ{7~7t˖-ܹs!//w4BĄyyyq XYYaʕ=z4߱˗/qAٳ8|0lmmE!M bBy1o<5jߑ]II ֯_]va̙ؽ{7E!Me#sj0͛7B__/^;!4* !m^tt4qe\|hiBo;!4 2Aibcc1zh >Ǐ"ߑ={BCi?~ ᯿ ߑc" D! bBH 275077?lll BĄ6'??0001j(ԯ*QbBHzj9s111;N`ѢEq!AQALiSп;v ~)qZ  CCC=z8Ҡ &)SLgwڵk7n0h BHfaȑ}6wtQ!PALi3-[,l>|8rssѡCBHQ&!mFDD V===:uѾ}{@AAΞ=iӦʕ+HMM_|˃/{{{())UFEE#XZZ5!-- N2NZm"$ttt0rHpCYYwCJJ OBinhfBH }}z-3899aҤIعs'n݊/b=z4c{.0gطo6oތܻwǏVXb 9sSNÐ!Cpqׯ_'|SN^w0sL <-ۿ?`HHH`˖-|YYY^!47TBڄTdgg׻ ٳ'6lӧm۶!$$СC1w\@>}p%CRR3f̀&M|PRR¬YPQQD|ضmЯ_?]#G~)LLL">>^V\\ )))bʔ)\?S~ quBHsB]&!mƒ !!]]z]v===3foLLLUp]|y潳={6RSSi&>}'O ~yyyXt)9OOOaV tܹBHsC]&!m>XxUee%^|ޖ޽{x=BÛ$%_kkkCYYxy1ܻwuWu(**† p-tVVV5? ޏ922PALideeqDD 0cƌj׿9zVA| @[[Fc {n/,,/ " W^nOKK`ӦM333x{{C ptU׋ɓ'Gvv{[?$**& *TBڌA5HA|! >>زe CYYY#%%ǎ\|ѣG!!!ɓ'c„ رcSbܸqIzk׮"0qDL6 ...7o 66Ojjj OOO$8n HMMENNĄV& wO?8䷺!N:L$''7oի`A ڨIII8q Э[7|PUUnѣG &`ĉO>ÇGGGXZZBFF_q'ڷo'W^^CEENNNTc߾}pssCVVBZ:* !mƫW `ƍu^ ><!aKWC! B yyy|رc[#>Fee%@,7ta۶mPTTŋB! bBH2k,b͚5uZ{z)ك۷WA!u 9@@@@>Ʀմgeea߾}ؿ?\]]_՝ HTVV BvvvPRRjBHCҬUTT֭[DBjj*̸"{~'34vKBBv܉cǎA]]˗/̙3Ѯ]FfII .^H___cܸq 8q":vh&ڠ씗'Ν;\5 NNN4iwRSSg:t2e `nn㔔.\aꊉ'6ywyy9^ HoG PGGGt֭IB@1!(..ŋV+TUUǬY`a„ :wwDTVVݻ󃿿?"""ЫW/_}NwD[o޼ɵa\뿺: !mĄ"ϟX[[ ͮiaa!f͚ .ÇDž 닀|&&&6l ```@^^21Ɛ(DEE!""W^Evv6aoowh1;wpÓ`bbPPXoP &4x{{/_,+++F?#JJJ允VK499}􁒒\,J ??/_3++ v //===cذaZذamۆ+Wb˖- v]C H$H$Bll,ȍ w Z-WXX ::+`㑗fxPTTDYY ߚ5OVVҥ  }}}@__ベ3gbȐ!8s :uT''>㈈ۗk9666;!(TB1wr-066;G9wfΜ1cĉnɓ'k׮D;R".]l)뉛PALw['w|Ghظq#mۆ7bݺu-GCԩS'OښH]C BBQQ焄 bBHʪjgg}۷oɓ;ob1V^7oƚ5k`&BǏ&!և bB.\H$JJJ`ii ;v;bKHHD"MΞ=?BFvԠD"x{{#//cƌuڕ&D1!m\~~>CBB666lq GGG̙3Gxx8&N={˫~:<==t9߳gO#BĄAH$•+Wо}{C(b„ -r:y$̙!!##HMM Ԩc}6whrr2LMMSHiTF<lqptt,,,lq =~g|W|iJKK1w\xyy?hc2Khh(W?z &;!PALH+OOOxzzٳ'7qȑ#lֵ3gδcXn6mڄk=xB:22 &&G>}ý&&&mn(*/^#>} ??? 8H-7f̘{{{55㐐hjjrٰa~FHKE1!@xx8wX7&& ATy;vo2ppp@׮]q9tޝHz) {ܑsssNH @1!-c wत$p-T:::|Gl6^ P 8q۷;RI&ɓ'1ߑt~`` TTTcǎmS} iI &ih#Fpũ9z(.\e˖ataq1LߑZJq#ɤ`СD |G$UFMqutܙt4FG:}4fϞ ns5W5k.\sa|GjݻMc <+wB&M*QALڄ7[?+XZZB(bĉر#y 8|0-ZD]cJϞ=wMCC4*IU\\ .~~~(++aggG㚡8@YY~~~޽;ߑHԩS1yd>||G"o:ٸ<qYz*666pvv xNHޥjZ333_t{;;;|G"M 0+w:X~=cիݻiiiL<aaa񁙙1I3UQQŋ'Nɓq,^С>}J}[,n զn׮IF1iv ܾ}z1|pHHHRff&444P\\ 044Dǎʛ]kVZJ@v_~9!</^4  amm1Tf!!!D B!鄌l޼y8~8˹F'OWNݱh"͏.iii<~m^zD"prr=H* obccDDD@WW DFFBFF杭pwwK$M3F$ӓNS5KI D1iu7{ZZFAٓݻ˗/DU!ŋ>I?!QQQ֗.] ))F)hC߿}p]񜜜65*Ib\~‹/0j(8;;cҤI֭IE޽QPPKKKcXp!yNIZ:u à PVV0lW! /bbbf w<Ҍ1bߋ!%%999orrr5ҧ~5XOO/i(BBBpA:u (//@ @bb"zQ0޹?oL#>+x=2INwޅ:7Yׂ1`7A!:Ƌڷo֥i߾}HIIgϐ%77{!s=\[QQQb޽;z]zޭ[f5w{xx8sc pppJn^zlTYu999(,,|}ר 5>Q^^έ]0k"--:vUUUtpww$1e >]NN>O!$?ǏGrr2GGǷlUezs?)!!OYYY@UUKVuQVVk)55+o޼nݺqSHoӱcrusT,HNNFrr2>}|)WwdYYYo1\qܱcGwݻ7:ԚUS[- .((ǏW+x>LfAZuQPP[SZ|ZkjM~󺒒dffUgdd1U5p@AWW^81޽+WDee%$%%[c?΢"?X,5aggG}oDZZӧOk,pKKK夤RC+((b[4jEݻw!U^^^rrr5>V hjjr?vh+Ҳɓ'~L5f,uuuRYY}}-}}"ۣGfeG,ٳgoʏ?FXX SSSׂͦ DHKKc066.,_QEzz:}HIIccc 2&LZse|*Ҙ:u*Ə\t pppP(Ą Zs>ܑjoQQso}TTWW4Ϗ*--Errrsss d]]]Zi>^x'$$p۔b5WKK~Uu꧲^ d]]] 2l3ԫWp!ڵ EEEXx1?~ WPP3g`iiQیŅ 7>>rrr>{ Ezz:`hhV\5SPPPfhh( !!~q'Leee~㧟~z |oaƌؽ{7Ν;/_bԨQ4iq9xyy!((]t3.]/  ⨨(޽'OD޽1g888зFPZZk׮A$ԩSҥ TUUZ111񕔔 00@BBѣGs]qDW~EEE@XXBBBp%a N)//Ǎ7ASSVVV 1Tm\K[pecȑ-w:߿?bccg}Yfa޽q;;;:#effǏǝ;w쌕+WȨ6@ee%ccǎelرϏUVV6I-'*''`,<>>;;wDRRfϞ˗CKK&} :IJJ2GGGvuc^ۛ3;… |zٌ3bg|"-lLEEu֍m޼1?z XTTq1---ַo_Re>XWTT0GGGֳgO! ʸoPfy9r$k߾=[d 5!q}36yfqNEII [jbǏo1 ),,dc{LJ}p|USSCtt4꽎W^ڵ[׳Z?޳gO￈oh/_K.pqqX,nmo>}:v؁#GCN4ئյkW$$$ ,,:vk׮ɲ& B޽1r: W_GFFΞ= ii&:t@`` jI^^^^^իy ⼼5PTTĖ-[3MC+**y'&&Tw輙o]kmoUUUڵ 'ODVVV!Bpp0Ν;=z{=izs][k&|ߺN85kּsyN>yz.j:u7ehhsѣvZQꫯl2:jzn;uy7[ky… !_k_c>OϬv̙3PTTkc022j+Ǜ׻Ϯ}|j*gi_@JJܳg455g8p l_~8ܺu PPP_fff8uf͚EEEC۶mzЀݻGaرYPZZ `С(..F@@O'''@FF:n݊kr 5ki&ȑ#oez* ѡC,YVoPXX_~Æ Ñ#G`t]tޘҰm6=z4TUU/h=6n܈cbƍն_VV'Obpuu->|ݞ{b֭[7rlذ;V\ KKKnjޗ_~Y&333̝;k/a5ٰadddiӦ:/={`ܹO?HOOoؼy['O`aaEEE8;;ٳgmEEE8~86m===L4 `Θ?>~7tnnnطoFm۶a޽ի pҥj Į]`eeׯ_Gnn..]Ǐ9(((vZ,X'O8pڵ ?#^c SXX 9999UMrssoofϞZa``___8;;CQQzׯkB]]4h QQQ[֭èQ/T+: 믿bڵXp!B!ӹ#""?cѣG۲qF=z_}\\\jTG2ɓ,44͞=ډ% ?~<XFFSWWg_~%w͛73wwwommm6fqkuuu_}vضmjm޼`...,..yyy1 ֡CV^^Ξ?lmm ۹s'z*;z(cSs gl޽1JKKYPPcuoUUUvZcL(r7LZZegg3[b2‚1KJJbK,/9::{9{,SPP`b^1CCCv-VRRfΜɺv~eݺunҤIL__{ݺuLZZ[=z_L^^nC$}6{%;q۷͛k=ĉ%ټyc3###fjjÃ`w_ӧYEEcҒӓ`=⮻p`EEE1<KMMe1TTT؁Xii)vZ=#F`̆ X 2/dwa۷oglǎԔ{dff25556k,n...l߾}#F`VVV1ƲٰaøO<p'8>}-\[]]]Çc7Ӻz_~ v:/F9R5UNHH9pV\^|bccYَ;pbAAc ,`,::)((0]]]}:SVVU^p!SWWs و#ŋc߯{0IIIō72333n]v1lŊ,&&0 g{ծPD)(HS) ƨXb,KLc{h_Lؒ+"JX@)R4Q:ҙ?s.#a(, s杙Ssf}q  6Ŷոlqq1ݻ7EEEѕ+WΎD"гg#_M{%"ŋG>|Hb6nHD/:34S*RΝi…DD#1b͛7lݺ[ ?wy먟Msέk~}uz޽K_5ѣGʊ[ AeXr%]z'O&'''"ztww:^zˈDDׯ_Ws.k.^2444FR uz7aU'pfϞMݺu#o&}w~ڿ?yxxϧORYYѢE 2>]xԩS*; 6P(b ɉI.WXFsruٲeOr\LNN&u (4l0*--%"nyy9D"O6mJo!C6_:*3g$oTJb.e Tv`ΝD۷)**Ν˽ׯsgddЃhڵ4dno s߶mrRaLBݺurݫ-KKKddd>_'|BFޛ[Zb:Wܮ0ƌCD/m|LMMUNd=|Ŷwj_f NL-\:u=oݝ<<<S~) 2N}-[P޽5JX(Av h&Ljx<ʶTRCy?TyI">ׯS\\|DAAݽ{^quuD܁үJB;iϝDZ|9rc}JVVV*'*5x9Sϯ\M6===oTT#FA0h 8pӃ& ߿~mdž-8p 3444\e>ϑ;w_~*۷⫶>}puѢEŸq+V@zz:v튃uŋѣ._\]vU233ajj=_ێB"[?zFwttt```MCϞ=eAI__V5kpM888*)Sжm[:t [[[;v 2 >444j|HMM|:B֩SKfff|V|bbbPZZZXwܹǵoߞDGGGnDll,x̙0113֭[;;;n>+V@FFtk&U&&&*_9)P?ѣx{{#66֝ڵk-aaa0229h 9s7o$xzzz "@*"**  rJVZ~kΝ;x뭷Tqڵk>Ϟ=P\\\}erR]PtI=~:Z_qz뭷uJ9"FUD"ATTܹ>}qw^|Ʈ\3gDll,4b(//Gnݰk.899qYz5ܹ;;;>},ccY9MRiIIIodٙ[^w%-- gTq ###X[[K.2dDDD?`„ pttĀtRAOOpB/ɝ;wzzzUfJEEEȨcǎ8|0Z=633NN妣Ep8s п9r^VzzzSe` &222} rrr]*ׯBCCѥK̟?3fwΜ9z*d2F۷ҲΏggg6ȼCaByp:r\*%''zD;# D"?^ݦX,{g#G@.رc8s 233q%u {! WWZ?u 4`ff&+7/j###ܹs`eyyyJϯ4_CCzEEEp ,\ z<ە<^^GnaffVu}֝;wȔJxq'<<Or7nݺ]]]L4 Vkm x#t]tQƹ{t6X$ٳgDBBB@RRRz̟?[oT/o0`V\cǢ^9--ʬSe  vՆL&ׯW^&Lĕ+W0x{{Çڵ+>׎Q[(,,D߾}Hoڵ+*t|>,,,p%4kkk?Xt)? 0111>R|*nkEDD@CC;}W}nnnjݻ7"##1n8lٲOӱn:k׮6l84#WQ.k]tUAHHH_ϫd2ܿ뗣#D"QpqqAn Jq%v`ee*:u lj'/ݻ\,˗ĉkZPVVV6B!ܸTaii7nTu _+++dJg)uPܾ}{ŋ*e2N< t iiijS.O?~w,[ FJg{LĞ>}:ttt`Q))+++Tѣ^7fffƍ ???^z!""'NĎ;j}|acc726mIoH*ܹ2]yȽ FNN/ .ۇ/"..{by111n݊˗/ܹsu~iii¸Wja:y$BJH@N͜9ڷoOD/ỺP(SZZЊ+H.Srr2͜9{/9;;s[[[Ӝ9sH.S|||jV!t7oAq+/!Y *ы6\O\NO?ы6/|>zA/_Hڸq#)iӦMΝK111A}gĈ*m*A:tT_MP(Ti >zw`S*//'@@˗/禝?paI$ʕ+IP͛7sԾ}{֭[GZZZ*}scM9M8C\::11ڵkW`}6mpmfOy{{Sǎyr*I_Gنb!255^jppc׭[GRSSi3fڴ呡!oߞ?N[|}} yxx۷)11vvD/8>}^{eeeԶmoSJJJʊ,YRƕ+WոAhLyfv .^H999M۷o'*LLLH__JOOsΩ &ԢP(HWWkLDYk\GQHH-_`ϧ"zQGBvJ/^(ڼy3m2e RNN6eee\Т"n~J[n2Od22336.--+3z%K{& +{{{5jI$-v^^Pܕ}E} ^d.]p+(;=ǣŋsGDD.[9sΩO u ^p!mݺ&OLcƌ:\x -[Lx~~>͘1J>>>4dND/zrssS9())ٳg'>OT #///?he6m|@gϞUV^˗sJbb"ikk:}ʊѣG\X///sիI,Snh˖-xbrttVxӧ=vIÇ[ҺԿ9s&} BSN>g:t@f͢3gڵk_?ǎիWsQ߾}U:ӕbŴw^$Ņ> TJϟ?)S'mmm;w.ыnvAvZ@;wqSc͛iɒ%u ?~J(darvv{ҤIhժU*ݻdkkKZe555 C… t!i\߿?7ڱcm޼FWIP¢/u{}.׬P(hÆ $9;;t|dDmڴSHH7oÇIWWD"΂s iTPP@mF<ڶmK8vJ7nܠ(իŋSaa!瓷7x< 4bdllL*^ܹs>gϞ*ݕ+WhԩHƏOJ4tPڹs'yzzڵkKFFF7Sv :<ر#}駵<2Ϛ5lBf͢AqիԽ{w@>p-.. oM>>>4rHT/^$SSSn\HRZt) B@}U9 #FЉ'~P ‚f̘AgΜ׫̷&^J|>a>crvv%9BdffF/={Pǎiʕ3 ׏ݻG׻K? . ihhÇ)"")*v~G7ʕ+{\g<== <;(&zؽ{7ݻi̙`bbbgϞhݺu*tttڪ 6Б#Gh޼y\ˉ'Ұaرc҉BeT ".P(H.Sii)we :@*,,NE?~\r)YBzYRr9=~R$ %$$:)o$ŋuz|m;vBa|n%.Pbbb/SSS@/p֖L&WRSS\% +R/==z\j=L&ٳg^EVVuޝzYvyyߊ E))) W饢:- @9RU]VVF LPPRRR5#@|5*))ZϣW'D/;UR &}UҥK$?"%%T2ny,**~>x<mٲ +Hu %&&['OTd23ۈJ˱rYJMMIw}/Ujvbf4I7n]^?K,D"'}`ؼy3V^H5;vW_}[nzUiӧdaaA&MRQMcPuhȈ."Q IDAT]} 233#;;F9{ƨW\\\oΟ?O;v$k/,,ǓX,۷b8LOĉ.A7ijj\|ݻ4wSsgkse UH_~Y]ŰaðvZb*Ǐ?HTbtUe5, 6 NNN8|XsΘ7o7iFF\]]iҰm6rdgg%ILLĢEi&,YǏvح$0uTXXX`ݺu8}4zQiY?@t8887J"য়~„  p%xzz6zHNNƖ-[0qDO\/QVVrd$** O^m++ 26Lᅮ1۷;DKΞ=VFnܸA魷j3Ezz:Mm۶Mrӈ#H__?ZSv,>}zZ9(%$$޽{[|ٳg4qDD_7HgR(t%1bx<|HCC{=44t:x @ wyn߾j># _iVz-ZB![NYN}iӆVX1xƣP(חJ<J.$ ;vHBڵkGSN#GTü IIIo>7n萖yzz҅ Z\snT XLo߾fuir9ݾ}֭[Gz"Gfff>7 ѧ~ʾmQxZp!iiiQU.S[uJ~7Hoĉk5)**"ڵ+ijjܹs)""BeQyyyt)={6'www/)$$Ņq_E~)sWF裏ŋIsURRBh" H+W7n4oͥ'N{GFFFo߾_sWk d2}SitԩV0uc:p?!Coe;4zqm۶QI P۶miʔ)믿uDPЃh֭2-3ۼ+Wp̎?Iwm аaÈ㑗}R]}$%%aϞ=駟0j(;cƌ~V)<<Epp0cڴiMo-;;˗ 333W^puu+]*?~#44;b3f ===u$/^?rrrйsg͍[nj]*>w aooco6BmtqiXZZb„ F~}N&ƍ8s Ν; L>+W|co7H V***˗q!77رc1n87S8 /.^4Ջ{/]b"#,, x`bb…cePf-h;744yyyӃ3z^zͭ]̠1r`DFFB"p!⍅MNݻw aaax9 TN6s.HIIӧq^^^0a H\|gΜ/0h L0&Liлwopssk'd` $$YYY066ѣ1qD1qE qqq*Gaaa(,,DUVJC[[[e!++ ʯaiiɽNOcccu*p+))I$nޡC*) Ѯ];f 2 yyyAzzJU Յ%+FiFͯ)"Bzzz8HOOB,--+Ν;Kϟ?Gnn.={ƽ'OTߪlIJpRr055m6 xݻǽdU @84@\g*\faaޱcFoT[JJ {ZZ`cc~{:6DgϞU SSS!J<m۶! a``ߛK#"#''*?_5<455aii D>I&Օ96D"ArrrW,sM[[s9@-//WYgjr˃L&|tԩ7m2 QQQ*!9** r"@Ν+͡(u#%%ܭiiiJDprrR Mn]l:YYYB2lɓ'Jx011.b1U~V7M,C.%%%*?VVVL+\}}}tԩR`W:u,p3'˱{nlܸ666Xlڶm[m@S@(ԄH$RtZBRuVPP<( nMM*U_Sy͛Xr%BCC1|lذ۷W4Qϟ?GfffYRR=m۶ׯμ>PXʐbկ 355m THMMU gjj*wR:::֮PRRR[QQ222@DzŠSNQ(r^^+˿B T СxMSpp0,X$lݺ ,YJ!Ρ2 5ЯަMJMXf 駟>n˴NeeesAAA났L&{zRvU:-62M˔p٧Mwx*2|300oK9q14ϟc͚58pN&&&.KExx8\\\,d2شir9֯_ 4 0LӴp0L3s)! /_Ʊcǚ\nB!,Xx,[ k׮N< v 0 üi,3L$$$`ԨQ5kϟH 6Le8Xv-ٳg KcaZ$ 6oތݻC"شi k.pppȑ#1b4a`ajƍpvvW^En]VbiiG"44nnn>}:]0 ӌ@0sbȐ!x3gVgϞt;;;,[0  S "¡C`gg{͛8x J2x`-6mč 0 051T!&&Xt)>sVwYL5&Oر-|||T.v0 0aa*(--Ś5k6m ::VP(TwikB,\Xd ֬Y:u 0 ü #GĉbjIGG֭CBB<==1k,#00Pݥ1 0M LSL2cǎbcc1i$uԓvލ8t Çȑ#a&bR(ػw/ccSwidee~ xիf̘Ǐ4a`iBCCѧO]7oݻwѫW/u4 ggg㯿Çagg˗#++Kݥ1 0j1Ӫ?;%KgBk1dѣ󃍍 k4aFMX `Z?8<|}} ̄C.Q)S &&۶mlmm~d2u0 42/)) cǎŴi0k,DGGcԨQ.i444xb$$$`ѢEXj4a@̴X2 ۷o# -[@,4 QFaƌpwwǵk]0 X fZ...عs'ك7nAe1M1~Cѣa1Ӣ`޼y8p <Oݥ1͈5?C.3gDRRKca LqQ֭[z*~,sqq+WpƢ[n㏑a7bKHHbɒ%bZaÆ!$$Gŋamm͆jciAX f-T[{H$ƍ!]x<*C`߾}J.afիv܉{밳SwYL+Pq>_|p)cabY)((G} qqq7o44:_ĬYлwo_.a%fCy9\t ǎC]aaoo#GbĈ Uwi 0L @4yԩS1sLDEEaĈ.aTXZZѣ P(Mu0 ü LP(>mƮ44i={^ǏK,AFFKca1$O>X~=n݊[nIe1L 4w'_7nDaaKca^1Ӥ?%Kg*}zoԩ \ S8f޽4h={ֈ2 4_,3'VG&a޽;$ |8T10L1S+Dӧ#77>wݻw;v׮]C׮]X-3}JN'NTSEL}uDTTѿx{{#&&i&HR( T*Us 0M LرH$H$#G矣_~prrB\\ΝRvvvppp=z4ӧq- SNw$JGa` Y2&˱xbGd^r3gM۷/nܸ#""@~T'ObjacL05 @P'0x`:URSSѹsgb1rrr ]*޽{hѢFay`g""xy0 鯿¯177_4i -aҥB%KpFay`y͛7D"r9>#7beLM)/1c 4'O"<<\9SU }J#S0 ôvDH$x)>666 KKKLPN:sU,,,L48d2=z(DEE!""aaaHKKB|>СCܿ_-EEExn+U<+-ahhX\Z'ǫ2(6\!77\RHwCCCYcRqqq@xx8""",JԩSMLLzZZϟ? ={3z =AAA\Jݻ7FO>h#""wEpp0޽xtttiiiY駉IݒHOOGrr2T~&''#%%eeeptt;www8::& \P{."## SSS 4)))HLLT2V j|WVVV)Կ!ְ̌qffb999xJD"AǎE{{{t m۶UwVTT'Op$%%AP ĉ1vXhiif#L;;;d@v IDATK"BFF½ǏCGG*!B%x?Fbb"T~&&&|>:t ʅ;ccfn2DgeeHHHnHMM\. VVV3+4q2#00@rr2B!\ɛ-[@__ňFTTabb!C`ȑ9r׭b\t ';rO>pssK}㲳rA0vXL8C a' !!!wBBB BHKKKƆʊ5qyCR)\10'&& <pwwG޽v0MH ?ܹmmm.l 2 qqq>,Fȑ#opN>˗/C `̘10a333u6z*N>@b;&Mȑ#Y8x Lh. 222 ]tA޽ѻwo666077R'"“'Ohsǃɉ$2@+W ;; oFb᭞aaa|2._[nAKK C Q0zhtYe6,={ zzzzĉ1|pĤ ӧ"¨Q0i$7E5xܹs Q(--9Auj^}!!!HLLH$*3 Z\ z*8gϢM6>|8w}p q5. '&&bСXh^y*>>;v ###x{{cĉh8s .\\EaŊ011QwyFP֭[8<Ο?pssS =iMrrrTӧq0~xxxx3 PɡvJB&L@W\!\Z;w.bС_RRR]NSN%@@ .BPwY-D"Ç=iiiѢE(11Qe5":}4͙3H Ѐhǎ5{14l0Р6mД)S~\u0-JķoߦYfuؑKz䉺b*ͥ]vQnH 5˃ 3f x<=z4ݼyS%X Μ9C$hƌuF͟?]S_H$#G6:D:::Ŗ75w1ϧ[)ڵk)44Te1-Ltt4}7ԱcG200uQffbfC!уnݺr7 && @bmFRT%qhʔ)E>>>.? tR*--UwIUz }gGg*..VwYL W^^N"{{{Ŵh"v 05q\\yxxv ML) 駟Ν;.n޼IԽ{wTw9ĽzAQQQ.Cs%HDtq֜it Ν;Go6 2e ݻwOe1L֤Gm߷o(Z gx<̛7qqqprrB~vZճo> <ƍCHHw﮶Z 2<pY֓iӦ)))EXXM@ژև AAAy&лwo5 .a&u'|W$ СC.iD~~~G~aDHB~F}^~֯_Oj;S|y211! QK :111AmڴÇird ^z5iiiVúu( Ώ/..3g`UCpp0Ҕ)Sm|ߤ$222իWq}R7yB'-5r裏H իI"4s7wtСz|JR~:}'YJ roISS&Od3:4@|iﯶr9:UK:u>}Z(ӣ-[4s 9VghݺuW'[[[9Okg"((_}U>BY燫Wb |/‚ `jjZyc„ o֥{y&1vX$Q&K8o{6(  ԍZGRuvWkڪU\ںu:FA@A@l{$7G-s%9+99I^?pA{'gƦM~zٵkN8˗/=Om9E|U^{?cCv"##?(:tِ׷ArQVVGΝ;Hŋlق2cՐH$X|9ʰyfȑ#$L<%%%ꫯ`ffPRRÇ#::D)S{rcڵHIIܹs1z:Wpp0ߏ#G"!!GAVD7nǪU믿"** *ݻݻwCCC9s&#..GAff&LMMmmmD"?___TTT?F^DG111EEEEii)bbbЭ[7̜9ޯakk@ٳ;wY8닽{-%uVdeeaݺuׇХK|r/H9q嘘߿:u~7>c 0ӧOqE044D||<~#;;cǎŘ1c###@zz:鉶m^Ǐ#559r?4$$$@,テ $ ;"DGGظI߻ヒ%KƊ+ήAz* 8;;Epqqܹsaaax1j*!((^^^(--'|kkk|X;v .]d`}6D".]JlݺUO,c娨͛ 99iiiXr%  6@*_}Zh 'Oĸq0nܸz7ob˖-PRRŋllڴ Xho>\~-[Ć 7" @FSSNϟǦMYfaʔ)># GGGcϞ=Xnw㏐H$F>})=VXX"!!"ӧO<88ǎý{0qD̞=[Xvmɓ'(,,ć~sssӧC"`ڵ:ذaf͚ӧcǎڞ&E6ٴiYYY5Ռ3Ν;DDG , "$200Ç \Pxx0oƍ/PYY޽ZlIo|޽RSSy<~h޼ydffFDD4n8j׮-Y]FtLiiih"@Æ 6w}G-[$mmm*(({O?֬YCF:vuޝ?~LDDW^%MMMڹsW>򨴴ڴi#+++Sll,I$Zx1 9s-ZDDU&?$"d5jT6C ^ϗҒ6n 06mD.\ ;;;߿ζm\vvv4x`᱗iӆ̙CvS?~(,,~+}wyfjӦ PDDEGG̙3 ͙3~u<[` :,ׯ' {n~_5Haކ hӦM6-[l"6e?LP>}ĄhժUtU>>xbD4hР:oҊ+hϞ=deeEԩSZb'ڵkiBdjjJ/Ujkk+qm4hpLB;wҥK$JŋmFDU={ 7oݾ}BCCiҤIDTݻwu...pmXShӻ۶mKرc?Zl)$$jڴir#I999gBܽ{wKjt/RP7nu]XIՕ\TTKb/]Dѣrɒ^.ڴiC_~J:::KAAAFYYY˗/ӡCh͚54c  [-ZD]t9www' /+XL***tҥC_^~zRSS=zFB|Hiii-׭Xxxcѣ.\+AAAJs!"-[effQu&K<==gϞBO/rU%8/g2e ͜9;99 ;wٳ~O'999d``@¹߿? /_NBF"o.gԩB!!!4c ؼy3 떔M:UО={u.LLLSx| ( /Xք866V7w\@/_s,4vXqyy9Ҍ3<%Km<ُ'OX,& ?7ߐD"PСEDD9׏'***BKLL Q猱гٳg׸-[F{nж5bLL {gfBFFya|b9rmmmdCKKK:OII!ʕ+&̫4441,]]]aq)΃YA߾}QPP`\x0'O\v z*^$O0= nܸ!w{==z#FGWN%99MX177GEE뵏֭[gȐ!봽jEk}x@ T7ort .\~µM6aQF ={/  ٞ#>|?:u &Lx}AGȶݻW핔7jjjpss?TZZ?c1QQQ044_ eeeܼyZZZkwU|g6mnnnh۶-z-lݺ:tcǢ={ӧ-Zspp@hhheh4 q֭G|ؿ?lmmqaY0d޽@U={ lELL eu높g *1wDGG#!!R}A__rýO>vrrrпXD3gۇ7ng777Weiժ //e}(..~rٵ&7k%77XԸVd?ڵk@wԩSC ŋcb/ty}|iӦaڵј:u*3f !!A kkm<[+)}/ϓ%%@6,XXX@UU?J?rddd '' htAAAXb8M6V(/pҥoll,ڵkퟧgϞ l9 ~ ;wJVw؁ bɒ%rUv!J/NII ^^^~:?KKK7۷Ǯ]] ĢEk.l߾ӦMkodَ/\֭3*++ r5())7@Rǣm۶x1喧!&&000 k.\~]1::]vEHH-Zݻwc :Wh7II{7nofYؽ{7$\ 1c`dd///,\"gƍ1bĈzNMMPUPU@Ur\}RM~ݻT oooKB"XZZ_v cƌ~m())aŊBWXXo`_|!눍~Ge˖رc:t耂011&,XϿ^qo/+^_m>PU'Xooozdgg#,,LakEUUsţGb޽; !C@GGk֬~%''c˖-Ñٳg K.UV? UUU^Z=***ЪU+ٳ VdN:WWoIIIdhh(אIB༼D ^z 쬭iڵEǏ &xw^jݺuCNk.R)޽Ј#('' cÆ Bæ.].3fΜIF"---͡CHSS6nH4|5kVu֍GgΜ!!P˖-#4o'77+kؠbȑԿ3f@&&&Խ{wrwwիW [W^M護ޢ'g}Fӓ($$D"1,X@bRSS#HD:u"kkkUu˖-s ȨHe^$K&Lz>}:EGG˭ʕ+}d;())˅Q?Csd񤡡AGѣGܹsI$ ymjժ-[޽K_}3Fs]ؐ mݺ^Jo-]R)bڱcÇSJJ]ee%-X:wL~~~tQׯ腷n"CCC@dooO<7$HEE:uD=z>GNNNGiii4f;fɒ%4~xG\麚:u*kDDu5ٳg.\zE"$&&ݽF꯬2󕔔D(b?F@@*Q,((˗ѺukƂF-JJJpvvƝ;wfffujD +++=zֈ[o%ãGRk055ENǕGTTu놞={ 0&&pww7mee%_Txxx5@qq1=z### 8P{3$$EEEC"G>}:VZU뢢۷Ǵi?kbRꍂz쉖-[B"ٳANptIn0 !33NNN֭[G$a͚5>>7}ΝPVV2hXXX}޼y2dcРAgNXX1tP$9!!7oބПrss!ahh({Vcf qiurM4 ׯW"µkׄǺh۶-"""y]tзu˖-@OOºyyyw`ggWb]ڢW^qy8:: %r544jͭF}\\|{@ȽRRRxbB}tt҂G|wXjnݺ#fQ%o#&&wܑkddd]gϞh۶70zh$''_h*\rC1iҤW< U^^ceeQF ldժUXnܹ.]{. &`ǎuJ8ӧOxWVVbӦMotXr%6o,7۶m5TצML:UaƌBB,y9/n:?~FƚF3Rݻ舉'4zW}ӦD*bv^50`[gF.]T2^6kE̙3oqȑW Uu/]!C )) {F{[n 988@$!$$G6vD/R/|}}KQQQl7yyyX`;'N`Aa5#**ڵkGTPPp&))f̘AO>_):W{=jݺ0"2uT:ѧ~Jں^颣IWW>QQQBzzz@9ϒOSNv E)995EJKKk׮dmmM'NPt8/L"ƍI$mݺU)x"+g؛UINNܹS9r)++C[[[Z3gbbbp…v+*O>PUUšCjXUVV ue^E͍M@@}]wї=VZCbX,~~rI**\ OCdM&88֭Ñ#G`]Vn(X#vifff󃓓y!??_aV /tttpΝמ U#p;wzzzppp}^{ ,w4dX*b͚5pssC߾}qa%1/mmm[pssɓ'o hR tl.]СCbܼy7nd(N._LdllLRt8%x"YYY1>|XQUb6l 5556mZЀHGG߯pj瓦&o&t#ث&HСCԣGRUUYfQxxb{#b"2ꫯHMM<<<(..N!AӦM#%%%;w.):Ɔ,--Ν;щ'H__z?233髯"===211~kJJJ_;6-Yco7&!$wwwР3fЭ[0?>P׮]O!=Wqq1͙3TTTh̙CE,ѨQHYYKŊΊhƍԾ}{Ң1cЮ]a!?'F6 fL޸Xĉ4l0DdooO۶mkҭdtׯ ڳgUTT(::r |ӧ:w^"B`` N:SNر#ƌ1cƠ_~o|;rHRܾ}[V"##aee%\+}d'28vmۆ7nO>4i<<<ic/СC8{,v oooL6Mz)ڵkq ƍO\\|}}m6 K,JHHׯCKK ÇG߾} {{{afִI$pssStTbb"6n܈#G -- }1~xo^5zaaa_t SNł "??gϞ BUUݻw0u҅KpD(ܽ{WBBBPVVvÇǨQ`hhpkҚdB\]tt4Ν;ʕ+ӧ<<<{{{D"EF+WٟS";w ___ƢGBr%:UwStt4w.'E? 00{. ---C.IRt9ߠ ={p 0cWO+//Ǎ79,, FFFpqq`oo f=KRRBCC!!!A(u)8~8|}}Ν;pqq v,Jʕ+HIIsWBr,D֭ѭ[7XZZ ,--谛|"66111p5rrrK~6c^JK.޽{ Ehh(󡭭 {{{ rnݠ_X!%999hѢu&Z!1pYΝ;C-$$...o| ߿7 H$ \]]1bĈfQ/u> 66qqqEvv6٪'f.  ,--\35넸6 Br,⠤Ν;fff055neScNb1RSS"LHIIAdd$>| ?d?p%4 ;;prrڷo:ST4$&&"11 HLLDLL SSS!իz (PAA\\ǐH$Ѐ,,,ЦM55"Bnn.3338CII Bm֭}Xz q}"**J.LKKD"ך(kjj֘444jWReee(--Eiil~ZZʦ'O###6dRXܹs!!!B(nh߾\lbbMMMhii S-kii}Wyy9JJJ9IIIroRR***!; %ަ 8!$ ?~,$111HKK ())uֵ&˲PSSp[n9X eeed777hBall +++!m߾=^k{8!~ARO򄄵 ;媪Ԅ:***PVVƠ.$011&ccc^2<~XHJO(**XTZ>TTTuuuD˿:eee!сW̸f%ۜHNB$AMMMHE"~uU}jjjЀ3Kטc+$^ټr!9~^ɲGc $M)))8s &O ]]g(s{U***U[QQ"znJ31V_3 Ut81XҴZF0c1VO3cfbc1֬qBc1ƚ5Nc1X 1c1k8!f1c'Č1cYㄘ1c5k3cfbc1֬qBc1ƚ5Nc1X 1c1k8!f1c'Č1cYㄘ1c5k3cfbc1֬qBc1ƚ5Nc1X 1c1k8!f1c'Č1cYㄘ1c5k3cfbc1֬qBc1ƚ5Nc1X 1c1kTc[~=„999?jjjAa=>c1ᄘ&HMM {1rǏBb1-`\055T*}:-[Dvv\1c1qbƚ cccJJ0i$Nc1pBX5c (++׺L,cڴi9"cq*5Q000D",Af1ƚ6djժ^X]]ӧOd1?X6}tD"y2e"b12XVZZ }}} cFc5.\BXCUU@Uu_Q1c 'Č5qӦMCee%.cՆL0I$ ??]tAxxCb1.!fSQQ{5kba1!E{1D2Tlj׮D"qEhjjBCCr444}H1kU&kdR)ӑRcJNNFjj*ķSWWˡRg/e]]]Դdff]1coNSܿKz҄FprɨLLLj>W6GAAttt$V\RRd!!ř PSS\666455sc:℘W,11!!! n㡬 Io[+:g*))KeIIIGll,ЩS'888pppg13ҥK Bhh(BCCmmm]vmu q}SXX`hh($={c5S3b1n޼sܹs> "ZXXp=[TUՈP...1ث 1c/$/_Fyy9aÆaذaptt$ q9={СCaÆHa2k8!fbbbc}VVV̙3ѺukEc 1cի_qItx9jcڵ yyy#Cѡ1{q3n쥦b„ |>h"455fܻwڵ+֯_Tc5b\e5;v,e7N!Wm6,[ G޽{c5Bf!;;(..ƅ `ffVmsrrB_XX >sDs1y+9uuuEcY'H0f7 o۶ ;wƜ9s<رca``Z׉ٳǏ7Xq `ƌ1X# 1k ׯv/vvv@EE3ܹ3| kkk|8:v숯p5]t3g`ggwww0rHl߾%%%x1uT .\@۶m.,߹s'~\|}9shc aIDAT@YY{eǎʕ+O?H$ҥKcǎz`1cMԁHOOѳgOX""%MDDYYYo.lj*Do͍TTT(22222޽b1PBBM64aa_x/@˗/'TJiii4bRVVl""ZhPAASee%˅}瓶6DDI&&&"F~)8qfϞ-,۸q#0""k ˽t""*..%K븫+,,$t޽1X%Ĭzlll^x? pmu@eeZ3c ())E?>$3{y&?O>ҥKann 7XduǏHccc,[ I&A[[q1l0}Gaa!n ;w=_~AFF>|' Ο?hժV^˗/V\)UVX`"""e˖5lxQci^YWm!ö!Ii]aaa/Ҁ(ôiӄֺm߾}qEDEE!44FU-[ DHu}}0k:5YVt266,--k].˞ׅ[CACCڵ{:qYŸt$I 1_vGwN~ G"Bll,cM 'ĬɲE\\\M6p^swB"`.aǎrO<U%/R}B&88BcڸBUUFB|mtfffpttDnn..\ ,Jغu+K.믿N.))JWbʕسgqa~w,]ϟfO%<<ܹsg1pB̚,wwwm۶FRYO<aNv_֫6zݻwݻ_"©S@DPSSPPܹ_}lmm@-''0tPt+VG}bѢEHKKC.]Cll,]VP ܯ OOO8::P:`Ŋv횐B»pBcĉX|9lق &ҥKc 4[lYfa̙G h„ 055E~T%ĕ9s%ϳqFܼA3kzocb16mڄs i]ر)))ЀLLLqFhhhݺuv{ٳ|///~?@~p{XnD".\gС0߀`jj͛7#00~g & >>W\!-[N:*!Fpp0nܸsss|h۶-n|}}۷o ݻw\xϟG||<°l2aHJJ| 61ƚQ-=3D {޽{]| B@@k%H0`_^k!1ƚ'e5i8r\]]ѷo_xyy):Wٳ7osYr9Zl"""0c19&۶mbPU)>|xC0?mϞ=fSBLDXx1oߎSN51juY+++x{{C"ͮ044/&_|<3g`1X#uYrL6 رcz+r9̛78qD)g1Vͫ5{#GDDD,--ŋHa(##SLȑ#1bĈfU=1XpB̚ccc>|N_]ӊ @&666x!e(:4c'Ĭ1b1i$?&LkׯO|rUa1{CpB̚5---㏸{.`oo}b/eXd`˖-֭ }}}aِڌ1X]p:ƪymۆ?={6Ν;*:4BCCuV߿ZZZĜ9s5b1`3V"۷>>> ðabȑ)--űc۷o_~7oyzc=bí[ャGBGGC  ###Ed=zΝùspUbƌF׮]c&b(''ϟǹspy\" ==HIIAJJp2n;uꤐc 1c #$O'I45& Z˖(--EYYpC*BII &ikk+2cu 1cor"99fB[2TTT@]] tmtuuķm۶< c&bc1֬q>c1֬qBc1ƚ5Nc1X 1c1kn%F~IENDB`marionnet-0.90.6+bzr434.orig/doc-src/img/progress_bar.png0000600000175000017500000002454212167200764022075 0ustar lucaslucasPNG  IHDR* IDATxw|Tے즓jHH#"ᇀ >EQ ȣȣ+t % :$$'llK[pϲޙsΜ;{v;^}w=@`GDQ ǗE@PD~!S܎,o !F L @ &I˕;{r)s=g^A铙& !A%.;RҭCDKWiࠬT23B")XW < H$͖_Vz S"YK;Ig\*2F mQzJOarHBBA79JZcqħaIX-,@"X-c SLGG>N̙ғ>Hn?Jd7*H,_aԾMvsM+qXEFA~?yD.XeJ0K; UKsH}${uFԯ¿ZW~5L3w7Guŋxmy(2Ggj94Ia|w7gxm%u HIr#&-bv!6|^YfcD*t C%'3fu=yuvн~RJb{܊56{4 WozJ5؆~RAŠaEƂT&ϛcUN:Kj2E'E(*6fK(eŎi\ 뱖MzǙ$e U8"wrE"w;T9\hXm / 37O4)Ty>WwQ6e|=Zީu;~N Yt46N.tmhᤐ2kU 1,z:҇Ԥ8HI,ҧ&rs@~s l"7%+ER? UV "=ư8KSkQhi^ 'pwsKNzHFFlG2&dߏz5*R!XpA eǥߞФQ\Ȁiӓ8V%z=!5}uʛiU#_=OzQm>?ѯBԕ.6=k|w472;<wgG6s=O,N2Zڌc_aٻ|h;mrи s؆R`N}G&@ewI͊u߂ Z|r=F8KϺ-GXσ.;k:QgH n-:߽O(|*xRQ!V:ZiA~9M̃[ DUR Uv^Tt`"ejL*!EcqG j>NYQEn$ӕI? Ϳ q#{6sBrK)._m^L"ɪcɤ hˍD#R%~KJCӠjZ!uz=R#RqN^e]*{Cb"%[>$b9F-zT/>:f/:1k$$Ʊt_%N2 1$ɨ"9}>>o[=4]6$9wۅX5 8J2xa2łN^AIz'!0ԫQy%3INUY5/M-.$H|GLKb(߭E&H֡𺳂|yʁ:?r!ʠ_$2cp[rX [~HDwuj+_6.?;Xѓ Y6z cqwEْIwEAq)5 FÎ^d֮1{`뙔mZUTD1wQJ&\Ѵ!-\̀fq("nlpO*,S\KOSCݨoVEFKLIgT;sʚ8~`BSy`tf01e7:uo=bJ,NԪ8dsNo{o1 $骂F:m>9Z$zO='#: gx*߀Lw3#T)w|"i^f>N.eE`J"ŋHڸ:wMjlNjѢ&JG_r?6*HBvXcNZwsDPzJ[*|3zL1I~xO6Z̍k.둼Ԧ1!兡j|wo:ORsi @s#2*̨k,K7r-jK?~r T1v+t䵱c jNu!x&\/''*펋?L?@C)2{&cWѕFFHSwG[ W\kte(yŖD ;~^5߷ah(8Wi¿&sMK6՜-Gw1uSi y8"stZm\OHρ8&sG ^JG)P|*O)qmoAOҕC\dAY [g E!ZND22s?ϱ%DqIh u%NʻS> @⃬ܚSZ>*'p*d\Ě1ݙ(+Ѱ(~]* ԨFw8 8bc|-[&-'yܞ4Kԕ:݇1W/w_A&rsRוVr]bZr/0b l /#‰ՀĵNb*0a% #cn& 7{1o֌R-j诲8|{2ikG~~$>}kqc0҄mA}v?oEw4@P> Z:!G*@`@%&7m\_v}E_ yz613qrfE9_mm*V!'xYp U{ A*3A|ԅ6xuM;d@ {DvTJ ="PH9˜]h~R!] "P~ cUusЮL.<5WwkslN E!' mbX\E[rs3D,Yɠa3Z_8ca[j8ZϹ-sŚSQ J:CD 9Zbz>Cya}2nr:BU6 Q ܂B#sS݁FN.KC՗-ʦH[/)ő-PAٻIt-Kbkѻ{bT~ZƼ9gylPp/v*uȘgf'+6Q#ղ%^esO2A`=K_/r7I^ɣٳǑsehOϦ5w.W/nϰm3 A!FTԫ!a~RZ{м ][UD~Yf>8åDjy.Z>\3Q ؿ3t"w?rnm_0=>Rh X;e=R_( 43?wŖP;rSߙo73,o!'~Ȝ-lc1Eu[ O˜n\Zc֌}ܪҒqEo?!UyeSO'/'oB#!kSeJePz/.Pi3FXb TY!GU>n>mHBڥUqʈD4%Sh[A{_2km<?逳28tExj2yx"+n|^ka~D|g xN7H}ɝGOmBQIPGrG׏^4 AΦ2[ ~27k~H=MuZq٬եN jpk'WQ>TS+|p:Ÿ]:L=r P5uv6O>gc)7uC* ayw #v ^TsB|q UPIr)TчPԥU5Xt4o7U5Hcit}2g-tǼ:PEAF%l,N)sRaִxRKO1)qh9=ׂ(w` 6B̹}+}e߲sII%/}1AFJO"P#R`:Ԇg9&gIc_4?s&R™N(!nY9KZ8 " %$=$TN'1M}DfJÇ`9$0n^TDH=ÿ-lbs~ޜz5dMx=ԯ=ۮ'. p~%NL? DE~-vnUAevh]=*nw+@\iܴLyFVw8YkrInҀv96n@$KfQbmiz WTnjbM+Pz UZ5ỮI-Bso9iM-4\S֢sCp_4YUp|4jsvZO%Q#S^CRXo8xDzW1y!cRf8VG38=)1G64 ڴ5N-@{Qj.nh{ {ԣ#r {EhLJcz Pe@ZeoAi1A"Rrɿ- r(ڒy=A)@`Q;P٥$3bD%X{k!$!U#B@`v'1O'KƗߣ7I]0uJeg1*1;/Վ-B@`-{:uhL Ⱥ8v}:/^ojN^DdrZv?z?b5lAX%|Rb%z4z5^΃?/_T)~֓v?xWJyv{ KWBIćb;HAf*n0|7SR+|B"tJ;H EI fsT)Y<#^ Ry|H9gБv+?} )bv}=w?2Vԓ~k7MC]R ċ,Ԟ>mFzBڄz$/il j C)<5w<ǖ GSL!m47i/o5 N1iH|}璬hWALLW;d䇧1GU\ң},A60 !Yx~f1l;f7lodF^c^ph |Լm_ ]ƱS>k&1l5Y%17!-&Ɖ 9^YW$BHnn ˡeoPq9-ڙU,<Fdxas+ :;YB7|S~xJw1TeY9 mU*Mxiai>3fq4MJi@x eן9R P~TnH5@ gκr|\zLٷUL3i.37V6gz-!3ͥS6;C+64. llv%rjNgHQȲ{S/4Wy2t U~6f+X*׌V镡K)\ieCI:sT%-O@vF-NfZ @Pdeeǔ,,Z'IwwwmkԨQcǎuqqab@`!t~Oշo_n,.\믿#}ٳg[*-Ç~퐐vBBBv9tPKX3fl~ [o!#?>TT3f ~pill3gίڬ&܆ȑ#xpAii믿܆Ƕ:coC /AAAeeeV0 r}n MOO51 *8 'O 466޺u_~Ɓno +\ȼ45ppphllD{!Cp"뻌^QQj 6&jժ+V sE'''۷###B;w6mZYIz&>sСC+**; -U2˲[n裏ߵk.YĂƙ yiB`{BJmN:X>@o~wOTx>|5jȯ@H$ >{hb`0ǻヒ>|X.WՇ¿'NhAÍ7S{~mXD0/=zts*f?񮮮!Lv iiiUUU!x1Yܹsg͚5qqqNNNRۻ[nSN=z(h$˲Ǐ?~|hhKǎ'O0Br|˖-0IIIz˖-Ri-rJ\QbΞ;wnDDCVa| zԩA W^;lMO%"##ϟ5˛ip D_vqcƌћ_W̙##??_({077C|||Μ9#}JI%[h:R/ B䌎֭[WVVj()) ʢ077חEzk7\P 8ǧL>#(b֓D*úǏϫ[nX_d q:1D,(iy'VH~rϏ1nIw+PVV־}{#ڷo_ZZjUz=j֭[ sAW{yR(](g}}=K$gϞJRR&''k%WT8iѢEyyyJ&55v944Nڵ^:??_.WVV&&&r_Λ7Oo-/X!nݺBJCEDD>H>yR+W rük4=˗/Szz:\<v߱cÇGg=D @ĬY3u_ uT3&&&"*d݆F5up?Jk4F,˟F!@`Xݻw/'e͛7H1; 7<==~ ,[ 6667JN6j2Bʫ)v{zM>3&=gff dɒL+\"gnTaa!o۶ɓcjiܹPQe%_ZZcHZY oXb\B(eWZEĊyZ~W,ӢE 'Ot&z\IwEE]sl- )tc=)<<͛7o޼pE70;P1bDLLLLLL~jjjxe(!یN)!e!y̤BGF%:::;;ӦM#dgg[o߾{&߻֭yŞƍ:{,CִdddpG4zMրaʕ+{զMcLUU˗۷jժI&iJF'jkkkňKyFQNPuvNmmc͛G X@XNJ90,t=D#` 5 #a6dqAAI{,^6PZZZTT͵`Yd^A}"#Y 2ŋpb.=4%P]k|m"""zs'F:t? oߞ{R eg͚|r\C|}} 6-[:uS6ç򐐐f1yLɓ'"NNXXSXzU xP 0a~F///?wB8V?~|ZZ+&,A+((1 쐭-BdZ^|EE]ǎ#KZZZyy93t҅Bx@f#x|y)橑^u X2ۍwNv_\~ xP  !s$L=z>$ѹr zj0@sjdd$AfnRXX rϰ w,M`}?x'q}#88X7V"4!1w۷~RtᆕJ:FIIIA=G>իzuMBImۃt|}"kP {@QY9Bm0VTd0@N%"O^򒕕N{駟(6O8A~M@&۷.wﶼiK/l޼Y:BrԀxLsΑ#! <}o7n҂Ǔ'O_~es4#BIIIzݻlETCjht:;2IDϡjc0hBO<9ǒoʔ)Sx >k]t.\J0LBBIuV (RL(,ʧOc]+P(znɓ=ߐ-B3gΤ?'H1yZhM^p!'х\\0LHH2 q^zPRRuQH9B-==]7;wG!:F4}PPNryׯ׽G466\lܸQW[:ގicK9My剻(fٴi9rdZZӧO?~:c 2 on֬Y#ˉjrwvv^hQ^^R;{, uOy ŚEyEEyu\tVєܹ~jժUEE=L֣GR!~3g EcccmmmAAARRҔ)Snnnwe6}7uesBm۶|4:73 #Hls9<(YpDgϞGVշoꫯ?k )ϟuRYUUOdBCCkjj 0 $$$* #G<|PTVVdf B(::1D-o4BmtDZQ쥜@& # =AQ~13:w|uC-0F4}uu5M޽+SYYn?~L!阦\=^ tEPر#&&ߡ]]]t2ghR9g///Dw^-%**11qȑAAARɩ]v&L8re. V<8f̘'''T?pŋ6uֈ\.OJJ1cFTT~m٩SmAlذsΎR4 w޺bMxo~GG'OWTVV._W^xI+sNZm>,**Wav;233͛ףGDٳgτ 9";&\E"a5H$Ώm `;`` S`0v N)0;`` S`0v ^aYe}5!4wޕ,f@#@_iB`` S`0v N)0;`` TǏ_z޽{:t߿||$Is 0 ˲mp]9,, fYcǎo憘>!10(7$ UUU?sZZZ^^^YYY}}s˖-;v/pA-,XPVVFӧϖ-[ dVEpx*嶈U<G1<++o߾k+> f ֮Zjr"6`oFˍnaYv…_a۷Ϟ=Vxom^3O?$~ YaH!tҥn߾i +o!OB222>|R ?f|oll3gίJQ3zyo^/AAAeeeV>0 r}n 4ehРA><^pvvqƙ3g~G޽_W V۷oP(BFx%]6vbP6mx%ioFfWn=e*MAvpp?RSSEJk7aa.r]F>p0 bҥCn߾UrJREEEX~ΝBbsw\ŴC_ [&ꫯg 8p@+Jg4!~V\#|||Ξ=;a..._|Mg(X~b IDATN?VXDn߾ZfJ̅Nڽ{)SB^^^BjuUUUqԩ8ڊ|r5eн{:tVBǏ1b$G!2VvOMM BG|NNN^B%%%2vriF~wuuEd'NOKK#x1Yܹsg͚5qqqNNNRۻ[nSN=zhcc#=9˲Ǐ?~|hhKǎ'O0Br|˖-0IIIz˖-Ri-rJ\QbΞ;wnDDCVaglڴ ƍ'f$rtt766>|t3"##ϟ5WXK/aGuqqyGgJef1D4#2 t MHa{ `!s=n8{̘1zX^9sH~;+]YYYLLP޽{z ۡC^ >>>gΜSK\\luuСCy;w^uuuӦM*˕J%]U! CRΝ;G+mhe+++Ν? 6+1c#Bhر=h/_NYߩSׯ=oݺ$''SƲUpFFV)@|ϋg3(8 g}D7w-4́F$J=<<~QFkDV`Qͭͅ#G...O>-Z‡b.P(DպuJ] %%%!!!^^^YYYR4hѢXo-+R g]]Kbbbd2] 4;H2 ssΝ;w.;;[W[&!uYYYcKKK1c^ 3oZ [L8^ϝ;wƒaaaX{@w޸`*z;ꊱԆ3>{u)/^k Qk2# o6f4 7k.Jd,Y__R]/ ={LLL,..V**4999..̟?_+JƱNNN-S*555ܵˡuuuBl׮6xr211;~7oZ _`B{ݺu*LJ 2}P}; W\ .~|4 i˗/ǵdj&_ZZ\Je>}H+++jueeÇ Bb{ͻUw/\QQhjjjΝ;G!4i$35aÆ(OOO\.T'QfX{6B:BgϞBqe3 A b"V^Q-[D¸_|DwY]E76<`Y|W)Ȅ{Wa^xG) ]m ̚5 ˄in۶ G+`{͛  u떖L&#AKG¥RihhƔ2ls١C^ߟƍ7H"nʫ^X7xW/b^ͤ/v}aaa}}=Ulܸ^Z0̺u̦Mt3"&MGaW5DQ*O?2D@LzyֺɈ˗_|BOXJÙ~[R__NbMvܹj\.X!L) Ҍ. +V9sJM"[Ǐ!p QVVe&44Gmٲ7\.o۶-4hP,~7w]%Bʕ+ic4^eo޼ZlIyj=4}g&SP(&E/$:Rf͚EQ5g,ֺukݏ T wCiM7GZ466<|pX{6DrIM&N{nC)~jR^K'NMxe23V,X5#_7!X]ѐUo.Yݻw/'BwRn OOOǁ@-[\]]މoPr*/h9rg}F>|.l 4}gS]]m^ͤ潽+**tq-Zx EՓ'O'O eD]vŊ+VetZ?vX¤$nYz6ēٳgO$LTTԒ%K233|u\Yq g}nICC9ev۶mBʵN(7^#d$Дo(6Vz'hDGG&!1fϞMcȼ P_p!ZO3D޽{ׅ7NW_}5좣Vͫ'|+buӅE;f1%kJJnyX???тYz6 ӦMhԥW^]Ț#tK:P0 ӭ[7~eʽFHPlI 䫪#w)V-ZīW^ǎ3B30ݲK‹S>zh%.!WiL\3k҂B4 hsA,#Y,DXXj&5/tl!$fkj2oM7vӦM7n߾}x3_^Kk.0*S(]fz0# äswvvrr?CdbθJ؃(I)1@OQ7HkHɣFff^=Fzj777!mݺܹsy5@E *bB+'5=Gk@o2R=zi޽{%%%Z.s9FW 33sBeHk.j5ٕhڴi$;wc\6 l߾Լ"Δ2U.mJx1zf_|1ŋ=7oc^zp͛7k9a__aÆ͟?˖-N*--Ūnj>8P% 2 z@~C-^dXnz,L祸믿>|8ɓ)7ҚGUUU g4qwڕW4b=/~z7P("=PxrsO/)AXLcԓBbbb҄wj-AbB+'{ʹiLtҥi_~eL64{.EEEXM6blST/_^nq􉉉fIkFGT>}3 'L,@dg(" :֭[8+qWW.&Gd# ?{7 b  ,X޽{d￳,{]"C!?~ݸqC|*ZSzԑXz,9{ŋ?0 b f@xV"!!!pl>lo=t"Rϕ+WիWSfEdd$Pr),,}Ef tˣK,uuu70ab sYs!#F0bJTTq)dk АQPP W^{srr̒,c$ĉ#Gh4G!!!qqq:X 55U| !d}=Y //^4B?`+% y"B1QJǻ>… ȡw:unܸq#I"^dńbMWӧӕ9sh=4K_%vDPtؑ-ކ>v=OPUUEfhQZZ_uJŸ/LIk 3gΌ1^|Zd\ڵ?Sowub}׶mp`׮])wazA/'7f @Ǐ֭#wLGueYLF+kidDгR$z!ńbMW^QQ+Y*R>ҩT*2cJ*s3Vzφdׯ1 P(msΥ8c ,,^I^^^Cɷ5\ȋqƑkeAYzP'cٳgYFC2Bh/㮮\Lzy?߷o`\AĈ'7f @#GX2!kL۵ \ C9T… Z! BfQ>}tȕP(}]d쬄OBϋҥKZsW1b"\ح0daٴi9rdZZӧO?~:c 2 ֬YBW]]-ZT*Ξ=K+pݓBfQ^QQA^-899}.]h4%%%;w$"ZjUQQAJ[-#''ll [vmff&+W|ZG6R&_ihBF{ȑj4ʟOtt4.11 0`߾}%%%jZT޼ys۶mdyCnnҚxBqq1'z7>2LƝ 駟9s\P466$%%M2斓#hۼys}}=02L7bz^<'cܹ ٟ| rEjW^]E76v+7L]];JBg ihhyqww駟˖-#J^Jf* _Z@bBfQβ <<<DfggVEz֧@_!ݻ׮];uQh\F3d16lJZυ;x\" ތ:="LԩS=Ċi8GyeddPNtB-x7S1b, ?/bcFk8#ܽ{k׮Bu.KuׯS07bĄb,E[ bi*++Nt!CK"qƏcOE&%%=Y'ر5k$iȈ V7l@^ !HƌSTTD%",z^YYYܽ޽{r M. z4ZMmi Ŏ;bbb|||B]t3gw R3gD" ۻwJ8rȠ TԮ] &9rކP3fLHHT*8pŋ&uVҁKJJÇH$WW^xaС*633s޼y=zH$={LHH;0 :eʔp%,,޵k-)ib`imy8w^?|'O69Фcs(rrr~gP׮]ɑyddd<u-  z;w1%%%SN 6Io!m@.^a]R'6mڼ+Mm%X  ?c{ƍ سgOIIFQ*۷o޽Nu[B@ `#_=--Mᄏw^DV@o NNN))))2...+Wܳg< ކBe[~? >}*Jw>tI&6`A<B0.iB`` S`0v N)0;`` S`0v N)0;`` S23JrW޻w߿C0`D"iJ"aYirJJJZ`AYYEO>[l0`@ӘD OHMV˷> @Pdeeǔ\,Z-UBH$M,5/+BUUU?sZZZ^^^YYY}}s˖-;v0Wf< |'"qpp*.MY799!0XZ΅K ؕ92l…nnnt0`+WX03@oC7mDVOwGV_vСCG!Ƥ9҆_z%MqL}T*]ܹҶ<7ֆB_V? ,ѿiD`0` wסF- ҥKIݾ}X ZԩSNJ+۷?>bY8zFh!95jc46ѿ阀+WB>>>gϞ0aH/~rߦ3,?`%X|OMM B`ӫW/PhhhIIEm&.W30!!!?zoiz.?cیK/kk abI]Y{uAV#?>bI4M=Beee0VlzLt:uTTTX& Ǐұcɓ'0 #R\.߾}{lll@@Gdde*++$z݇jBQ[&ם;w֬Y$Ju6uԣG6666%L}lڴ ? 7N̓B7xaJHHrpp?kDj(..^bK/_=z={T*ҚxΞ;wnDDCVa8zb>9 IDAT71Y7-=Q>ya>>uTG*>y7a@@)׷~˫?!!86[YYYLLd޽IFZpvЁWϙ3gVŋBcƌb" i?x`Ŋ}J>>> Z~=o[[#0WbE;3ʹsSÆ Y__?gVi45*((H*zxxw555z5p }" RqOxRգG>3f )ǎ#1fi:u~m֭[@rr2h,ˮZgddhM6M(wWW˗+J!]I?-~ݻ7APRRÇ _ܖ?~3xJZ]YYy!C޽{nu "/'''WTTh4sν;$vҤIfLko===rP5Dɚ5kbNNN W\ .Z|4qoUohkX|˗y+Ν;N09 'N $7_JmpW$afϞMo޼YH3B(88֭[Z28}XXyk"jt1b$wD2gΜZLmPVˆؿ"v}q0/S(5kŽ,0ӦM;w\uu\.?,X,f}Fw.7U/Wݸq#[zauM6fDyO4I!棏>"W0w5DQ*O?2D,y} B[nՕL1VMq;y$驪~~~'Nܽ{}ĿK0 Z '۶m@V޸q݋W(Vф-[m۶2 Ҍ|Bbǎ׋q"R[vgg'Oݻw/n>rHC7#J0W"lw/S^1򩼼<(-d _ٙ;'\|Yk F>;@> 1.T*Y(̙Znr.].zh0:Ը{7mcc# >\+8*--M(7oc-[꾂L7VMtٳ'&**jɒ%!Qnn.߳g7mvرc4dI+Ã)=-[ j7xC(9.Fi$ ( }}^C$7_Xi_p!ZK4ݻW(9i g+׏nRN#aaa󒵐a+z^ V ?ͮd;t@ 0 -ܔ']D(8~o1ӧO퍣oF5-)SRRtΛ7i=-}W8w?|k+oU 0arrr֯_+tfҥKy_am۶ {8ĝ}SXRRUKy }Wpcnj P^_ғqVH+Ƞ뭷ޢKނ /v-Zh"JvQʕ+BM}"{ h!A< EV"nܸQw F5rzƲZ ı ZGQz7cYGhEJb[7=رc#ӳk׮Օ_@AA 'q ;d̙8{ZjN^#bIFO_!kkkňVUU}">T+$F)0Oƒ:uoQ?֏ # ]lUU˗۷jժI&i}iI߾}q`zz:=gϊQnJ3sȡBs&BCCȥ uּ<5fIk.}㣵:׶?S+!mKK8p ]oʕ9ߪZa ästrrߣ$e޽CZjw~dxb-$S^ۄbQ y5gr۳gBK.%7:_jHȊOOOcC_N9NKee ^{5NF=z<ܔgtp 0.7B9qssӍݴizƍ۷o_}}fҚx8so=sgTTN2 m뺇1 }vRG yyqY$0a~G#jϝ;DZ%K+R ZlDI8eFP`IT*xC1~l1z"k4իW!Zn=w\JvQd^Q**7TiG54ݻwO>Ck'+EKFW 33sBNeHk.j5ٕeڴi$;wKDrA899i!Q.ƥ5ZX J:ڵnM`o 'Bo߾p7}޽]Cy%%F[W^51CQKYI.X ˆiv,ѿX3=2 uTaϟe˖SNb) y$H!H 3s ,UV|ZPrrVF1b}}=vqqÇ'pb!ԵkWJcG*7T,KһvDPtؑT+Q;>}Jɮ :OrS4T*,gJZO믿Hu9sfĈ˅~XfY=s Q{X8/ &>{l1>|H&?ohh jP  /W!Ube2,ԓJ%գG+BM:ոz'$--!;;qrw}'d9ˋXOqA 560eYV&Ջ7S? |߾}\3 f @Y Ð~FQ(dڹsRr1c (BE;^^^5\zƍGvŠLȮbR2UORRLK o5oq;Ȗ3gҟ犋|dd$)^p!' UH?S=<<.\0 Y b Ä s8wP^tOZ())!xpx]ܹ<AXO4K/óݩXlʔ)wy_ Egdd*tF.F+@/O߀j2,nL&~ OϜ9S^^P(kkk LBvGqsszppKG曺2'NʴmVﶻ͛73 #pTuu5y&vvv^hQ^^R;{ȑ#IpBaPt, 9zBgϞGVշoꫯB1r_T*RSSLhhُiԵǢ-%YDF92--ӧ?NMM1cYG>YFkP^t;d[.r0lVVw-}޻wW\dAbz/H*++Nt!C~"!*++_ u?~Ǐ)>}Jdf1cL/oViiPr"&2Қx?d\.OJJ1cFTT~mwQMoB@]2+RDP8 Xu:+Jtt*.u9E 9s.XъE"ՎP%*jYn.ɽO͛^W>}L}S4Ȅ\/_fJ kZOOϱcǦ;~?yXX YǏ߷o_m=IR{5 }BussbBHII QQQd~*z@7ut˖-ݺuH$ɩ{QQQ:g %///..n...5$$$>>.BV_xqΜ9}%AD۷[FK򒼅JѣGL/{pذaVjվQmE<-X&20AXVY%ht>b`:H$2{"@TPPp a-c 6aˀ!{?|P{m2,00z<##c%>>> ÔZJV(2ڵرc[;KGG˗۶mHMM---UT 099988ѣ$&11tiB6ETN0!33d̙3>Lc :XdDnݺTXP/p?BopppTTԬY|` .4!;`Na0`0S ) v ;`Na0`0S ) v ;`Na0`0Sm𣱱1==ܹs?Ǐ{;L<9""B u`EshA?tw]hhIN*HZ:16m;rrڵ+""ղ}Ħi>|8ypʕͤ;VXA̟?„ P*7o<~S LOO8q0`=ʦݻwOSqq1`Hsθ u bꊊN>OYTTY _mFO<ٳ\.gfҤI2yͩS0 ӵkbgggSW?ue?<{9tИ#Gvѱݻ.]:p'Ohmxiך2jΝ;iM6tz:lt5[ك]]]I|JJ0멫oD缼LYW6!((CwwoFV? wvv_[9[~J`j'cbbȟΝk|L ֮]+ك{l28==e3[ou"R֭[a~aH$_|d󟭗(@ @S#3G\2݊WUUUCIDATKe#=MãaW^yxx/(( e[nc줮pP{q^J%0Ν{wM6QT w0"cEQe@Wpp0yP]]yƍD"wwe˖ݼylK:;;Dz+***))I*uj`ZɉK|>}ȃʖIÇ7n'Bo=w3g455Z&,d2Yrr1c|||D"׬YHٱc$4m4.qppXd ytIӰ|O^RRvÇH$ƖkKl 򒼅O)JIX̳gϦL²VNs 2֬ Z__?o7lؠKV0;v0;+a} wvޝv{nc9a=z~ACCٟ8"*O>չn8000!!!77 XjVWdd\.JV/ZpϤo߾ty󲳳_z%nݺrJGGGaX^J+** \W#̥Dyٓg͚!'DÝ%m-LtH@ vΎ/Pv~ XZnll8 k חth"獍%a]tR̊c{;Cfff:t a:u%3ZFQ]]͞M39 N*5cƌ6w~XڗOݹssH=:~077cǎکcW\|w,d&џ]1b6%מ]}·Z|MMD"!>#muFbuZ~pEoUΏaL/ر˗/Y˗Nq}.ɛ@cfĉ~N}KQp\와 d'h4;v0xO=ooiӦ9rX+y 0:Wϝ;?,,LO^.;;C1ntʪpLz5J"L>B,&z^$KV'''ͺ|raǽ*T*Ն [.].]tsmY<# Es;onN@رcɪ;sLs>z:KM( pON屜k.cOdF[W*tVyd2z)y9ho^[Gh09|}}6kHJρnVV&\dga/ڛ,_l֠ ۝cUj[{zz?~ٲev(++#ithpmv0zkʕdխZ ä,5Qړk+))پ}{tt4DٳYޤjcd=^[XUUߊ;ڢ[BK3IA$k׮fd9d?tu<1v_&wڊH+'''۝cUQFeff+E .ϟ}_/k>}7#?FkOnPcccnn͛h9t/myL^.\ 6m EcԿymQ-Zh!]kA2N?:=zd2% 00,2kŗٹsg޽˽R$̻Ǫw,\D=|U66@_}}==ڵki:uɍמܤ^zÇ-ɫjz… 5Mmmx;ڢ[ 4zs/&V駟L>`eB+Ë7-yRhecŋz yNo\~<ذaItd{dA9 L><^v-Piټfj˞YYYYYYچ0$f̘A:uJR9s(iO\xG[6 3^&mٳg"www{GWUUߒΞ=k)X4U$,?>KҥKI2W^M6P=)W_V~eN~fNNKٳ3((2Z=`v0z̾}4{׏1QxٓO0FC%m:  ]].]S'$$떗?ߚZh!fnJ:r9pҥ,,X*SLhEkOeYX*++ɤ+BlANBayy9[|ݣxb.?{\dl α*&0h4,\SSu~F/ЫM2 3tP5or'WT777g҃?/m: Q!!!$lڴit.y9hh4ԿԿBXt+W/ݺu+s֭oŦuјm۶wO,---籱'O :wΝo޼ ˵o:{lcK=їpB.\~k}^W`rΜ9XԮs3\~1:tڵk:SBKzG/+ƍ#lY^cƌ!K GIbbbbjKԖ-[3f KΎ/ƠQj%b?~}MDK~.??Ŋf ΐ񅰇+ࢠN0L@@MH\~=11Q~?S\,/{Cј#G*JBq={ЯuD"۷jKTII [&'~ࢱ ?XK-Čսk.D(߿_=z0ݻS<||T>}^xa2y~pNN9Ν;lϟ puu`鐽8Vׯwu믿5k i8oY*j\rOؒ$M_ءՖ䵡5 {ꕧ'm#T:yd _x,/_~m|]0Ibb~s:A omڢle*ʤ$e1`ʔ)콱xQPPd"## ٛ7o?Fqtچ cLFo񅰇qyRtܹ&9zhk!,ߓWWWӋ ܹcxoK޽{iEqiࢱIf%y i7`@oJH҄PرcSRRLWRTIIIspp >>> S*G2eX, Æ [jίozޓfdǎ[`AXX9UյO>'O޾}{II ~8r|޽F`ɩ9994FPƺ Çs_PDFFzxxŽJMM%w6 {@7ut˖-ݺuH$ɩ{QQQ-pOV/^8gΜ}D" -%myIB8 o+ m1rZy[g|&EGG?Fm@38qa zzЁoC ؎rÇ:d2Y```ii)0t0&4`5}||)++[jZ֏Q(111d$еkױcǶv6%˗/'mZZZR EaaarrrppѣGILbb" ӄlR0aBffș3g>|X BV K,aH$֭KMMH `2` ?>x𠺺Z(GEE͚51 `NS ) v ;`Na00 sȑNFKv V* IENDB`marionnet-0.90.6+bzr434.orig/doc-src/img/device-automaton.png0000600000175000017500000012244012167200764022645 0ustar lucaslucasPNG  IHDR sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxy\M׽%*DJ-ZQ3YJd˷a;ce2c(HfTPhѾ-to3],I9-q{=o9c BiԄ|@!G Bi(B!M%|B! ;Br#%%iii(,,DII[eeePVV;jjjPUU:ڷoA^T h>!)))o}dffՅL~WWRR‹/8())Aii)  ''===RG(b1.} ]v#aii :R(e{TTD"̤I:t6Vۓ'O7oJ[||!y9N<#G`a ڷowIIIKgBNNAwO\ȑ#8| ڵkwxP'MTll,֬Y}/СC!R-UQQGbոsƏfff|FHF&%,, @VVΞ=+FɾvaĈy&N:aĈ;!Ic9"##)SgC"Q>iTBBBзo_l޼SN;RM6mq8::!I#F`Μ9M.K$!??LjDž j1={6L<~i쨇OH^zAEEΝWnݺEEEXXX|~3gDPP"##mikShh(lmmTGDDA:''O>>>:uTٳgqADEEy2 񁭭-"## ]]]hiiU+"իC-͛7qmx8{,ѡC())1k׮!%%cFGG㈋CEEtttp99PQQ@ rss{nB @"ʕ+.|||p]trrr2a˖-x5k---yc׮]ٳgAyFH=j*<P(d}avb}:wV\QF-ZڴiF)̋/+Ynn.;| ,`V"H H'Nc۷oUョ CCC7sss!55&&&ؿ?+OϞ=!HpQ888@YY{`bbwرc(++_-6j(cٲe7V}EE*b `ܹJmח~N: =%bbbxt-[y144DAA󡡡Q"p(]t:5LII eee011ABBƏ_d>*.*))!--zX,FLL ;+}駟py\u/7|;vȑ#޹χN8ǃ1gϞ[PP997 %|"&&&?;; _QQ"4iƎ ꢤb022Bxx8***V @ ظZ2dd  |佟~ ˗/Ƿ~ua…} ϰq?~ ;;;0bB.JQ)++C^ qiRw$ ܹ"pC+66F.\@K#4O%%%BOO ҥ z~˖-)?Nɞ:D=|hmܸ~-[J bڴi8s ̘1i(F޽{3f w^8;;Rwe?Zk/!hH4j!CT#۷1f|DXX%{B>!JSVVƆ p%<{ VVV:t(_whM•+W [[[!$$;&>i2zSN֭[PQQAϞ=SNZɓ'쌾}BSS8quwx4IIӥKacc7"##4_VVV􄵵5w^XZZ!MM#M^ff&/8piiiptt1n8^oP<|G?"""`hh1c[zG@B(򊈈,YΝD"%<<<+++ë7>[[[#%|BUVV9s'z 9rwޅ1\\\GGGXZZB^^X,Ɲ;wp\|IIIҥ4wԉ0 !A >|8RSSqa899ɼSN!,, HHH lmm舮]FFF<}75nJHH&pDEE :8!CQ'M^jj*ajj ???w\DDD <<\Ɂ6СC000@6mcFJJ CE/\iF:Q;tBGOǏZqRRRRRl0Ơ }}}TTT 5555"%%%2bץHOOƒTA(BGGAEE~66H7v.._'!O2,]-kYYҤIGZZ Z"PUU^xTTTrrr҆:ڷo/exѾ}{!a @߾u+!>ir 憤$>}|$UVV^{YY:P( ii@e^( Wk>iR1`TTT; {kuk`wo"GD8;;Yfr %W (+|-YY!VP4}EfpANr> wmE5IMM&Q,F7''H$\o@UFx4OG⧟~hkkS1cM&m'48IsNxzzRa**w}ڸ!ItQ97nW_}w8 c@6@Nv~B$Fի;v,V\ICȑU*K/YBɞzQ)**B{.\ ((;w[&Bj>it"""`gg>Xy9Ъr_$lmGG@i(FӧHIIߡ4|G ӧ//6BHQ' ^ii) yyy\zpycǀ{h>! yM"`̘1x q[AJA[`_ӧOCGGp755`V`z iϟ@uJӒs;BH5Q' D"w|;IOBJ0iPƍw͛P|;􊊀ˁ3' ѣGq!P5/xw4O<̜9=lllT5|GByJAPȫ #!]' X,FRR:vw(u'NFϟuwǏuw7)*O{^BjI@ɾ(-QQ@Ϟ7Wwĺ9ϫ\BB^g?/!u>ҥK|AަU+q~2ׇs!s#ʾ&{+KM˫~_B'ZFF  !oH$\Jwp3b`ܜ^mSd`pm[@GK'O[@AJ@f&м9r,sYh5߽ |7TI{s?%KcG.釆r R}{`j.߻5&~puI}vQw_4 8w~03n/^N֭q6oz\`0`@`".YDv]V>33Q6m}3`.}ߪw`dvvw"`c<]w~݄%|Rm۶ f; >ݻ@N .q3B!m pݻ.p[[qmlw38ߟ{ޥ 7 P|~388tKRT$$pA(DA!%|Ro###5FYM6xQ AzE‚^9qOYd`dd|m%ۅB.ff\#gϸJ))h…\ySrr%שqU32C×j)g(z+&&0L~{j-M6!//;vbbbj-Bzz[?tk|' lذǎ^G/?0f 7d ?][<67|XY,#vgs@O^&?cq3gTΞ}"py- O-sssܹrrru헖ۻwFAAg^x[fjgΜA\\]@,DM$P:00IIIU}[(Ǭy}}}x{{#!3g_}e.& \ kiq׸>zׯs&UpvMd>f gO@q1d} n#}de˗ٴ HM'WOzb Flp&n3Oϗ?!'Ҵi0k,!(( .3&Lggg7W^^aÆ12 >ڵCaڴi@YY:w 6 CCCܽ{ ۡ ]]]lܸSLƍѱcGW^?deeA(_~矫ķxbaҤIt#F۷6oߎgϞ_~Ǐ+VsΘ?>rrr00|;l ++Kf_| ;wp=O!'kHm OsnB:,Ey!ڵk55:+ /bǎ3g0a2\~ZZZy/333lݺ^!oU#FÇ033H$BVp5<~aؿ@H$y&R٫CYYYAhhgq/̟?3g΄nݺkbGQQlll0rH_^^ <\-""B|PWWGΝʡjhݺ5555n>!Z>Q[WܹE~~~ٳg|NMM gΜ={ ''ɿ?5kСC ͛7T]АNKymx++ Xf?___:u 7n\X塯[" US)33oIJJ :tPRzwU\:!Q[:uBllGg8y$Əe˖AեS ENNLLL"\}#q5rӧjۦMr9R#IennqMiӦU볭Z‰'pq8;;tRʕ+ի݋>>>PUUL8Q:F^ KKKL:jjj8|0\`رDHH4557uT 2@\\Ν;[[[l'O.^ [[[̟?9X,sa.TyMzz:@WW CCCq_\ ݿN$erޤLv3U֫˻,}RoܹVњWg7~~~z*֯_ϮZ C Gsܹpqq#_z5\]]_[sQq_ϭ{&+p&WH l_srzGsunޗ_s }Yq#\_wn Dۏ>|%9QVVa7сrEV=_aŵr=z^-P[=|ƸD~"Պw ˭|WTpO>ƍ ̙í;2mv7"8@!%| ͟?'N@LL _/:{ܭeO;BH55| ǯw(MOd$W(ICC6l@EEߡ4-gC{ !А>!nbc {zKIIw(ӧ% iOb8IǏ#..3g; M(@Q'Bq1߿֭;ƥ7nWl QArht;v쀗lmmѧOCj֯ӧ(Feرppp;]n@|GC4i4ZT~^33!|$O7obw( ӷm|GB4O-GGG`Ĉx6o ڸl ZZ|GC4Ok׮aׯCc+` !JIs8pp/WWn(@ i,_3itC~~=%{B&(++øq㪼'xb]kb˓|455%^{'=ypwwOiT O<̙3!!!?$}ƺuТE ,YNExx8{!77EEE2SSS2en ,//MMM]v#>kD"App0v ())aСڵ+`eeZ!Mff4#,, 6660aƎ+]$`PC "Ш8! %|I$]O>!)**k׮t_{ɓ'8p &N!C|ҥ>/vލL|嗘={6 |=W6 ]>!`ooDR=,Z˗/ֱJKKc044Ĵi0vXhkkvD"ŋ쌽;B_?`p^c#=JŰ忉P(ę3g_81۷/Fyy9~gL8^VKHH… q1L8+WD۶mRD|b+V@bb[=%sOOOdeeXtӧOǤIɓ'd&&&Dž ;bݺu|EC'MZBB:uDP(su CHHO8qơw?oS^k$ vooo :۷o aBjY~򉘘 ++ addKUňYj* 6 ñc\SLAhh(nܸ^zQEBB!l\x8s ӡriћcǎa8qvڅ#FuxFX{|D% y4\xΝùsc(**UV 5!֪rx{{7nxwBHA pB_Xf ԙѣG֭[!O8wӓpTII wvĉv!z_0!ՔѣGc>*=P|CH'<==˗/71l0x1>}Zg JG\\0`cРA4ipGA@@?!??@]]366!PPPǏi?88QQQ߿t&uVٹ?>|0plܸhٲ%V\"$ y<Z111oޣG\z񰰰MMMRyy9p?!!!(**D"жm["&TO;CQQ UCCCѭ[7yk">> ˗q9ŋPVVƋ/ (&/772 smmmšwur=z@^^7ot{hh(HDFFJD"%|BJ*,,Io{TDmۢm۶ӃΟ?_3 `lݺ)))000@ZZ_III2OMMœ'OPZZ :ׯ!HC#ڵ$ !/Q' Raa!RSS"55U&W.i hݺ5B򡭭 @P\sN~UV̓1q1C!!!...ضmƌl۶ "NNNXjƌss:1&&rrr Djj*֬Y]vA(wb۷qqdffB"@^^۷6 ύ? BHQi]R0i"5W>8}}}@__Jo۶-ttt>7yy 8044o?8tǏ_᯿Byy9D"QTTTPRROIIARR$(++@je˖K҈P'X,FzzyeOz4֦MOE=~:?W}yyyC\\㑐 MYYYH$yc"|4oޜطoO&ٻƥKϕ`ߤݯ::R@˖- 022k%BJƊxibLϞ=i011Ko߾=ynݺ^Smۢ[nFAA QXXb(//Ib}[GRSS! ͷh߾}|>y'HG+fddZh;cǎ055Y_z5QPP??? $$m۶EAABCCaiiwxȑ#qm6m}m6L<>D7 $%%!##rrrh׮бcGSNԩSb SO HR%!%%PQQ4+ 48{,|}}f͚a̘1򂽽=ƌpܼyIԆ_v-VX7ns8y$Əo#//<4kDqD"RSSeqqqEBBb1ann.077BTN7JMc =;w;wHLLH$Wzo]vzݻwヽ{"77\]] \qq1w===6ϝ;WWW|x\oݺwwwѣӫ?? .ĢE|jȟ?ӧȑ#2=}ccc$$$.?~p www 8AOPYYY2"nl tR{(CW;wjFFFn6cǎشi2220f̝;rǏcxevאa̙8t9򃏱k.̚5 7oV^]s8uR:thюD"A\\DBaa!Zl)M :2i(eeey&] //I얖M7TS111ذav ---̚5 3f̨;ωD"̞=>>>9s&~UرcoQVVXqqq>|8ݻ8;;b.]B@@;L888nnnԩSci$ enBaa!455akk+066F?y'J<k׮!""DZ 011iԳBxx8,YgϢW^;w.?d@,XXd ̙SS߾}GHH̙%KRCH+Wbҥt"##pwwGnݚϟ?G-`cc#s9cǎ /1R1cԩL]]}l… 0۷o!C0@ nݺKbmܸjՊ2HK,oL„B!swwg|F ~c=z`BiӆM6[`SRRbۛEFFOAA۶mѣإKxC=yر 2)++35556|pva ëw$ gbseL 0MMMj4a4*~ =z>QIJJ²e˰g+V@=<L-TiÇٳ'I+[3t] IDATӧ2#111hѢ56Jo:u Nٳgs899 BΝ/'tL2։D"DGG޽{2VRRwh ي+>3dvC#h=7nCff&zQFaĈtͳ9wOyyyܹz;zG֨ONN>a5 1\z13g΄5LqqqҞ۷aff&[YY^sܿ-\2[n?`|F^S^^ξk& 7U|Eaa!STTd֬YwXRII ۿ?߿?ٙ>|d}xj*fkk0333?hCkUìo߾L 0;;;vZwh- Y˖-ŋٽ{7&|;\JW_}TUUX~~>a5hl͚5ޞ`;vd=}6ߡ5bH?33[nŶmPPPqa4 QRR@Rӯ_?\pDf{LL -rssuVlܸ}JM6aÆH$;ڱcG_Ӻ}6 2̌nܸwZA$Çؘۗ^JEEE|G5jLˣ;w5i҄V\.^zEԧO;D+>YMJJJbfYo]wZ#88FAԾ}{ڱc H|ϧ}ѯJʴzj;S o߾%---`;E||U,!!=;R 1ח7oN:::t}0UڷoOÇ;Jk.j׮1GV"999۷/;bO<~<W>\ff&&L~a !߱*Dܹ( SdeetR͛7_wZC[[.\޽{zjXZZŋ|ǒX;v͛7q-[|FbaڵpqqAÆ 0EHHϟI&o߾HJJ;V䄨((((SNػw/ߑ$oժUѣHtڕ(\t Ϟ=̙30Ƃ t;VѢE \z9s&wKR/^ ?[nE:u͛1f/|Ga L> e~M$%%|ǒ^ܰyf\t }3D$4hQFZ k֬#pA#*ZZZ@ `iiHZ YsN\|666չiݻwT T`ܹغu+Ə۷ViР^-Z|G]|"´iӰo>\rVVVձYGAAAر#ׯwhSLfΜ *JJJ|2ڷosss<{HuV>|~~~޽{ulYXXLMM053>e˖ٳ|ǩUq9߿;o^߼ye˖a033 !Pn]c0L1bL> .Daa!qj999;v ʘ0aqx#?o 22rv+j{=zTeۻqOɓ'EEEbժUUAZZz*?S޽*Qajj WWW@LL  ~쳇bСQ.\cǾ{hzj 0°q*͛7aggaÆǙ3gzzzzj\ZTTWZZ]1R͙3~ ---lٲK%cΝ;ӧOW999xwoTo1yd4o޼R:u}FaXbE;?-o݅ ~իW#**Jrbݺupuu)狵={ ,--k4cHHH-]ӧOGϞ=qԩ2 ʕ+aoo+++̚5 N2dHGUE^^ہF+W|3;;3g΄P( """}v|pss%pMn#Gرc ?ё{XTT*s!pppaê:\|}ѣ 000a?~=zsp1;vZD"1`"$$ wٳg~zlܸgΜ)QΝ[ "oĉewMHHS}v888 &&"GA~d'O?ĨQ0a:t{acc{a޽ի3g"9rHxyy˗/ᄒիz쉍7"77޽_aaa(((ɓ'yիWe3g΄3'n׮]à "==6mB޽uVsƍxb:t6668p ޼y @(ѣ6GâEh"XYY?ٺu+ѿ9r;w`ѢEppp@FF222caÆ ;}tcȑѷf@vvv4}oZ4{l>Y[[P(};zΝݻwDDѶmݝ[˗IrJںu+yyy*S^^CK.~0""+VPff&͘1<<IDD_&ϳjo2dkkKo߾8244" &@@W\oߒ%ݾ}uȐ!w^g???5jTTիW~Q~~>spp0M:tuui֬YQz^^^b ""Φ4""j֬Ygz%uԉQFpBΦ<֭=[y& :,YB۷8 # j㿓ѣK,E:::-~^zE᤬L'N ""mmmrqq ˣˣ,6lݺuvM#G7 Lǎ)""233iРAt]""ի9߰a_ӽ{w%""UUU""s 8NJDDABeѢEo>M6egg/7iӺum۶Myyydקx"5mڔ<==ǏԫW/sу>|HDDa$'''=ͥ)SpsqF.ہhɔIAAAdoo_"eee3N:ΦMԴږqnĈtQDNDD4x`ݻ7%''S^^ٓN|r_ڵk[ԤO>n ]z^|IDDTXXH߿' JHH ""GGG M}”)SP~}AAA[AAӦM իW{3?׮]x]caa!.]PUUX~}N%Tb-"&)n0`4h .(N: &ϯK֬Y,xzzh>\99͋_'%%ŝ)#*RRRJXf O>ߐvʊkᤥ $$%?%%ܝdbb@5V$;;ǎàAgZ /9]J$̛78y$G߯f͚; Ȕ\MX3\\}0aqqCAAAnԨ91c\\\JmPYtuuQXXך SSS.ٳgZe'tJ^^DbuQPP9saÆعs'fϞ]ͅ+.--WC_6mB.]J.UҰ Pb;rrr%v{\FAA"DQFF~ AD޽;ЫWJ>8j(t-5X >}edds΅ֶܹTGDGGC(bӦMgϞqcbbubϞ=n[SS 9+sssܸq>}-[XXݻw#77v*tb͚5_hjjŋ\''''?hٲ%t&M@QQ7oDzz:w.֯_ .`ǎHOO/q''EEE.WGذaܹWWW4mڴԲO>2\]]1zhSU|>4>>M4¸hii!:: ¡CJ,{Y~шQIɓ+WprrrrJ6l֯_>iii7o ХKtСNXXX999yf<...2d 99rBLL 7n܀.t:u|wkz)ӧOڷoeSPP(y-,,UkEf͚Ru}u/ C ###U*| CJJJΎx15o߾w `bbRX鉣G",,J^kڵ+\=p%\t Ç]Y `cXz5ԩ n²e˰vZ١k׮044/hݺ5|M6ѣ1tP۷mڴСCacccƌW{W^@$۷m۶{ȑ#֭[o߾&OnݺA[[]t޽{1o<(++@a~]]]qERŋ CϞ=K͛#G{ɡ$j֬|||eܼygĤD^nQFAKK 0n8x p?~fff4hw:u5pLS@<***ݻ7޽QFA(b033+a,PRR:X~ Jݾegʔ)qB! yf{ ),4hЀ[߳Ǵh޼90|`ڴi:u*ך;~x}֭KYYY_]jv+竤sHpp0988Tz'OЈ#~8Ƿɡf͚і-[JN{nɒ%%:>N{mڴŋcF*Q\\ݿڵkudT4h cw4k֬[ȺUll,ѹs"vߪ=6lM6aɒ%/455iWdAΟ}6mT\ puuƍ1eʔ2{kƍs aaa\KC֭}r[6oތ@[[G|@```ƧNµkJ,gff~U+ 2Um۶3f 6mTx)Q|R`̙-l~-[b˖-hiiihԨjݻwc\Mfff@%k XZZ"##;#+[xx8 coߞ8b#u7hhh`Сr ''NJ}-ԠAb\#^Ճj IDAT[m/V-2?a߽wܽ{7QJ_ ٳxqfjŋq0)==|ɓ'СCv2ezVZ̙3ؿ?N g]3.==/aÆAJJ Ǐ;TKݻ͛8{,B!޼yS]f$)f͚2`rGd"7FmUm߻w/6oތiӦaر%ƛgjnݺaÆ W KLL/ƍwFݺuѽ{w\r(bK/6ydܸqU*5>S̜9FO5S|}]v5jކڠgϞ;XZϝ=z7bh۶-M8Nv킆I\LճӧOw*{>O9qD<SNܹs9999s| |veɉ(?<{(UN" ~:u`ɒ%- ó!1iӦp|}}٪+޿ӧcܸq<(((e˖W&M`۶mx1ԸJnʮe:u___ݻ}i~zڵkXcT9,ڶmǏ#>> 7o & <} GGG5 q~zHOO;FQK:tmېm۶ł X񯡬닣GzwA׮]ѹsgܹ8 >_Ew*Wc ~ubĉ E||<\\\?_YZZ"88077GRRߑF,Ξ=  2Ν"ߑ_#믘;w.޽L27oބ+56޽ EEE|Gb*c 2K.ݻ!--w$_ôlgFpp00uTܺu FFF3[kgE 7n7nݻwg11H$ٳ1k,8p-;`5kܹW^ϟ?ǐ!C[[[_>;*Ƃ & ++X S)oFΝqql$= % ''w*S/hт;OOOǥKÇSNh޼9qq?/Ɲ;w===aYff&M t? ߱ry|Ǩr?]|DY6m6m SSS,[ 7n@FFߑjƈ@>}  Hw, ]]]탲2߱ ւ/EDwITTT0 " fffҥ ڵk)))t u6Gzz:޿t"** #G 6lԫWL9|r;w3f̀;֭w,L>8s Q+(33Fpp0޽4Ԕ 011ASx=NӧOcʕpss@Pyhh(޽(Pn](((Ç%AÆ ѲeK&&&֮qEmc\'OP(LLL|!CI&n\Vg`ѣG>>>>>ׯq1bGGS!Ȑ@ ;ĉ***;jWTTD۷o:uꐾ>'99͛G͛7'ׯ:uD"Q戉E:IKK]xZ36"‚P׮]ϏXLx!DT9VYvv6ݺu֭[G$UUU@***dggGV"z=QkD?~< ݻ7=x峲ƍUlrww'%%%ե͛7SJJJ=eҵkɉH(Rxx8߱jX7o5nܘ֭K&L0c1Uw `_|;FdbbBrrrޞI|ǭ1>|H{&@@cǎ6oLt^QQ9r_~Saa=I s<*"N>M$%%E;v;vǏƈiӨO>| V%PNNݻiԩdiiI***dddC4tPܹsN Tߟ:wL`XAACUjdllLtRʪb@Tn]ڰaq$H$˗/oFʤHNNNtm1b֥KZl1Ă$))hƍ4vX222"EEE@u%?~ ggg\x8V4 :?ƙ3g`ffw*@\~ׯ_ǃP~}B <gQN:t(b OǏ.#yyyhiiASSm۶m۶-jkYq ~7ٳԨu ŋkݰpuušCRCHHWCCC!##nݺ044ivtD"4n5; >HNNFTT>}X爏GAAQjg@SSF $$$M6%"++ۛgڵpwwGHHtuu#./p֘^ ְHĻww`PAA^|ϟ˗/K |3ТE 3gmV`ees!((vvv8v R I 333h/^رcbb?SNyT#F@$UɄ9Nt+53V3X$$$ [ZhQEٳg0dggIOVVD'bڵ՚//^Lwww^ӧ@dd$"""CB[[ְTTTx,hѢ.\^zuվװψE~~~;PPP@6mжm[n-[DV[q/P@ ?HKKCjj*RRRd$''#%%x4nܸʳI .`fl3;;> {dd$=zsܹ3  ѼyjNׯǮ]W%-3G|||PTTDVJԾ7ƍH)))HKKiӦXhƍEE2׋6v [[[n߇صkW?wjjjgϞкukի<""hiiaܸqXpaSD"ngׯ_s4iRbG 22oF^^^]{ś:вeK߿Æ )IQFaʕe./_rEŋ㑝 iiim۶{!##Sͯa[[[4iǎ,h?zqqqo޼9LLL*\*oSCSSEEEHNN.2SDEE[;{nl߾ÇG-ЬYZ{m3gV\*qqqx5@=nݚa燛7o"::ZK_WW+Ď𙟊)BCCiY)))=ڵkj833hР:tP7::۷H$Bdd$8&&۷֭/om۶E%RLؽ{w>vcGO%))NJ<ѪU+B(b֭pppba\zӦM?:OSIMM/''BASS={%,,,дiSn9s@KKKَ;UV!-- ߿?222Ǐ}2dD"4jϟŚOVV+ź<,Yg/wj#Cg1ddd@$A @OO3fٳgOb۶mptt,Q?~oߢ]vbϷ~zX[[8ݫW/dff F999ԫW۷ǝ;wĞ|jӧղ-;w"++ (3????t u߿bKɓRטw111++++ְaC=a(##Xt.űװ#|Q~}=lrrrx} بQR=xׯzU?*66m۶;TںuP~}L< .]] >T@ m۶xط% /^p=y?~ط-={V-7FyfCNN/^-+*ၠJ >|V|www(++ :%F LLLDVV{߿ #+V@v0bĈrIOOGHHw+. Dnn./#,, #p}7n(13e ++ Hh8 ׯ%g)**BPP>}TgaBKKZ( 0!!'NĔ)Sиqc8q배0XZZHKKÎ;#n???拎4ڴi#08<|Ǻu*'ݻwHMMEDD .o߾~:k׮֬Ycx,Yĉpqq… 1vX\p\3!;;;8;;;vǏ|DΝ;t #99J'''ׯ_1h ;w7?P|||={|999 )KguVb!r7o;r3p#!!%r_>BSSСCKKD(qyV V̝;&LѨQ#T;OOOtz; |___ܹ׮]Ʊ:upѩS'xzzy:sC|Yhe鲖)((޽{@s&%%]baaСCpBl߾˗/;NJOOǾ}k.0wy-1w\o^ fϞcǢwސǏvZ喑AVpBdeeѣG\~kkk]=+\]]1c  xu-lF'̙`tؑ8fСxLwLbooo"$$?)))x v YYYD (++ӧhҤ TTT?4h\e>رc}}BUUGe*"}Gĉ%Ŕ/^ ''ǏW] 1l0/^D:u$Xg*$##Sppp1c3g"<<\򂹹9ڶmMq5^ecʚ1cܹ___4mڔ8| `HNNƪUp=cǎذaĞ!''W\ȑ# sθ{.{.BCCq]DFFB$Ehڴ)TTT rWPP^ꖐj &&&u-7)PXX'++|BX07 5,YŋFaa$@^^7#ݗmٲ%ѬYڮQTTT1+WD^2LšK.0`IXg CCC|]fiiiׯ_ŀa%55nZK IDATuC֭qeaFC ^zbʕ++|RRR;w.+ /RRR`mmzɓW+ #Ҡ)))onK b0[B(((ڵkboXg jٖVXQeRRR8~8+ /޼yP%%%~+ #aàV>@W[) +++4hPVV;R >Ht4jԨڶ'--e˖qF/^;vãڲ0LRRШQ#\z5WVFïNcƌAFJѣGtRvS-aeef͚ϯZ:,XWG@hӦMnSVV+V@ƍKwttĎ;Fa՚y~VVVhѢ._̮ b3z}KO4 1bojNv^P(DVp%607Yd RSS|GbjBhhh… PTT;R3RTTDNN1Jټy3 ;;;6.S%aii MMM\x{1ba$|))) 5prr]vAZZH?VFIz\x?>q...Xr%w 0&|h۶-|||`ggN:ɉH `\v ݻw;O3sգGlذ'NDhh(q [XZZɓ's+ԑ3j׮ԩ|UUU={'O'q GڵkeH[` $-- ==W^^^pssqj; Ǖ+W0sL#1_`1Gxx81*eȑx!F'OYf|Gbvvv%Ÿqoܸ///[0dXXX`2W^ň#0i$DEEʰvZdeea͚5_䄉'"00?006l "<~睡iӦA(111xf̘=ŋq1ʕ+_G߿?^~KB(:Xz5~n݂!ddd]0Ě3gu޽dnnH[z5ihhӧOԦMDTXXHDDS266&",?r͙3LLL(11_""sSjj*={|Ǐ'999zI:u]Fcǎ%===Zt)={H0'''ŋ~>}@KK zzzҥ n޼ @D̙3G||Wo3fӧ^>>>hذ!pidggs_6llll0y !`cc $$ 4@ǎe˖2)deeeeeݻgΜAff&"## D M0wqQ_#BK( JKJej%.JJK/7w5E"h M|p|{}{=_j֬I^wԮ];r n޼IRR'Odm۶'[eff2dMFHH˖-XX)ȴ}:5jW_eܸq;7nдiSeĉ|7̘1B}}}?~^W:u3lハ7oƆ>fff8;;3l0,XQ077ۛ5jвeKCo‚֭[ΡjU7n$88Vʄ x嗋ݻӧOnܸvbZ*SNeҥdff\S+WҢE 2228{,SN-Wiχ|/D9En%"" #Kvv6?)S\JLL?ԩS0f4ڱD!=|!9sss{ܹcX<255Ϗ r}+yyyUV \pcJH[.?ǎW86j(XvQʍsB@@V"44&MKAR Z-{a͚5,YD8bnn΄ 7oj)rrr1cڵiӦv,QIҥ ֭cҤIvرcIOOgƍjG)N8A6m oeǎX[[KqR`ܹs4h۷oW;S{7nv<󒕕ĉܹ3۷'..K2J_ jҥL4`vr-lll S;Np!F^'((#rFzBTP| +V`ĈԮ]ѣG3{l*{ݻ9wwwzŅ ؋b/D6rHBBB;v,/V;S4iIIIٳG('$$Vˑ#G駟X|9ժUS;(䒾2d_~%ӦMS;Nɓ'ՎR;㉍ϏiӦaffv,QUU;8p fff 8,f͚v":u*vvvҳgOJ^%=)BTBՋjժo>6lhw=lmm4iRYf֬YՋvڡIOO'##𓞞Nff&UV KKKÏegϞe?~O>?+++c L ԭ[ׯfϞM^^6mbȐ!+==x∋#>>cbb%z h4TV KKK5jN+ckk[j޺u>kһwo,X][TnR,, &_L?LQRKf*tg;###j֬Itt47~v߿֭[9x k׎={AǎKrzQNXX߱ÃwyW^yH$%%1qDѣ9s&jzx4)B^{5?eiiڴ)QQQT^H/XE];{,aaaOiӆq1xG'##Yf-^0FB(BJo߾}FQ(...ʃN~~WRҪU+%((Hw^)ŋ_|QUC_EyCBBkkkYfݻUN+\^^\|ebbo; LsSu1w\._[oŸqҥ󎯚{i&_~ܾ}h>S|}}155U;rw!*Çn(fffPτ  p7smV=}1118p,='|"^9B ?r=4 撗@@@we,_[[[_onҫW/# a __nCtt4 RF V^ՎYf駟b ϒ%K_ڱ/x: .dʔ) :OOO+s!**ѣGLxx8jG|!D3g6o,"fDDDڑD%&O( ̛7={H/"SSSoN޽޽;ǎS;Ĥ !V~~>|!!![H劑ׯgуp#JJxBUVk.>>Ϭ;w0c 6lX>ޞѣG9ؘ+Wyf9ZQ9I_H?nnn?~\ʯWlذᙷ88::ұcR;x{{ӧeJ(5R+HPPsiۗj/+RSSj,Z///JB. ! ɓ۷m]t8ϟ玈?x4"##~撔@bb"'N(o~~>v #**G9r[n=5?υ䐓õk׸y#?% 4(r~_{d6l֭[iذa#77֭[!J ggg.\@vvvX~=ݣ_~?~ Nk޼9ƬY@:!!}]jUݻ/>6ÇK|FÃغu+ `xzzMxI .q[B\BLnn.111k׮XmyfFEy7ѣaZZaꝥ%Gf׏w}_-[(8;;3k,RSSܹ3'OYf6O}Z/BBʊ+Wj]\ٳ4i///Xt)oȈ*UвeKÇ'Npyڶmĉ133C0`9txxxF`ٲe4i֭҄[Gdd$[nQF5ƍ򙴟Idd$'NʊVZѭ[7؁q9ڶm͛ywI>!J o%%%Ѿ}{zƍe9bJHH_m۶ٳG8*{ׅeJ9x /ӸҡCmۦvQIIB<GӇ{8z(ݺuW^l۶ #JJ HZ-Gիs5#y۶mG 2חB|!D5i҄4 : ՎU\z~1dNJ``` ,IB<kkk=ʂ ꫯh۶-'NP;V?>ڱ !A0zhiѢ*}oV;jN8AvY`jJXBHB5׿ 4n.\vRٱc]vSN8::ѣ(s !JݝX8{,tޝݻwXHII᫯ƆÇcggǙ3god[QfɍwܩSX|9~-uLJӴiS^رcY۷ӰaCƌÈ#Qx")B&--kײj*\VgϞxxxеkW^x#_~08tӧO2ya!G TgDD]tgϞt N2DEEr&&&ҠA<<<ݝ5kQ⒂/(uYYY>|0BCCx"UTᥗ^BPZ.{5∍-?ԔΝ;Dl[5IB.--8∏7<_QSzu,--ҲcKKKz=dddaxLn޼Iff&hZt:t:t:vvvr[Q!IBY'!! ngffRjBwQFt:6m*SD"_!dBQ HB!*)B!D% _!9SL~WIENDB`marionnet-0.90.6+bzr434.orig/doc-src/img/ledgrid.png0000600000175000017500000002652112167200764021016 0ustar lucaslucasPNG  IHDR=sRGB pHYs  tIME 17 tEXtCommentCreated with GIMPW IDATxw\S?7H[61 EQqTںWmke]uՊuVq(Á$GPyG{ss] ˲FOИ[<C lS3}kT"挞0]<CqbF6}kTܹsr$Am,OC yV{$7'H^$9z&&5=$C<[yVY;H^(=I&11ttEO7!yH Cvy  zn5>5Z#yHo1 Cݍv0O:^<$C<ŭy9h p8T<$C򴯸el,Аo 9S}SC<$Ӿ_hks?{̀0w3 ?r@C|jzH!y]rrrj2V/q4f34 {Z_E%eWco':m\,%ٵ{:?+S*OF+J==Uw7l3sK.jC4@G(ûUK&22\34Ά8Z#Ig.OSqUT,|!o9X(*64y ,?u)Vu}N4yv4mNjӻo@-/1 M /8z:\ T* !yKWnd{wW?d'Ͽ|mmsKPF}G;f&FYE]]C<[y[LM UJNjVqQIH':>3Fɉ7<'?Ɲ":Uj}#4[$ӿN< 6GdKʋ*NTJK<[y[ 3[쬛W}qRz.x()P@Ub+J_YG9M3C#L/PGQ{;T_K-ثNZ%sScsSc,K|Φ Ӓů>yrYeҊy|6fJQ-zRM,llCOU0L1fK*%X-9&$,.HY'>~xbQw2R\/ܺ^Qwfyjns3o7;+eo%pY,W'Z X8XWMyo:jcip;/`I{=TRWww[{ kkeee|MK+kц_֑;mr5̮:1wKzuӬjcy2A@bggieӂi\.GGgbjYq8WGK[˪rD\a`hyZ%L<ZM_ u>2rkV]<"-//rnݍM3mpvnNE# vyB3ñ|y`->UT^LIbt=m/=pxN5O>iyAb⭂¼7L Iiy|g@_‚:,k]"S ZcEdِzi$*uU/xnͺ5*5benfng`ljf.sy#W)UΩ ܖIܸQXzHV\B;..)ry|6ibelmbXrrRAù<,X+sa8:"{ҺqCj-K<yz=7?}YH:~7zskV&1~sʶ12&1zZع|_+T[DP 8,\hws9hO̓+9َ`c+!Jܪ;n`^䀮RSwTTp͠k|o~/^'H/i^I츯URkeuc%zIm[v$R{Ы_O(fkTF{Je׀'TQ |GcɹUKSOox{rL"I<[TjF-R@Y7FHeWa~?}<3u&UJ'ogcׇˏs]q׍V׿ne:%pSTIEevt@@/nx8T5Xs?`7\un }%իepXYPqmGs~E=Pyw#\}WBֿ0g]MՀ?ʜSKGOh{Fv^yy"-[BMMݘ4ǓHVuD&$U]P9kXl@!U@ڱn O15_=從/sxޣS뺮Cd\ TEQ̱ۉ&&gYy̩}[dϬ\ZZRc/>Z?dq݌җN9p0s4=@wt7[\1'؈v\ԓS|U[8.\lo_t@`m_ )LYB׷}*R|B=}9 n'T?gcdFqF79u_jx5gA d·E]:jƽkf!xkNZxIq9e~7D ǕO(!>,hx)2ߜ[ zܴ,],JF7yj~χ[%wpa]s-qal&<8 `Mdn%8vjHb㪅bEN]ɜg&?5il}Nf\C! %?P듇gkS͜S|]q3>g5G%+ M4zq53EQ\*:ª1<Bɂ lTּa+X5  9YD䙅 [} yPյ%.z4I 2V*w"W (e VtgeɃ4%Js(KK=IJ~i<~ԺM_ß;R\P עU{RC_;-'b@YTX]zc؞̸[}L'\ ˳jԵR]@lH5Nڥ>rȜgӸ.C@flzUK>{Vw6uG1)_ԊZ=ڴֆ:KAݵ^ߴ5na݆:M@+H"h8 T0 sJ*fuHf?ke#n&-R]c ߥ[:Gv=H۹xyYލ}ߟ1'!\UH)' 蘨Wy;p__P({|i?$=wLh$6 M׸g=uH7Q'=m$ `b?*P^|׏ +踿|Q,ۛ&wq_2r{ߟ_T^tOo佾-R={{ĭ'b2*EY狨:^܂WMttx _\0̪d6/0A vzMvR_zAEoU|N~mK~x?sc?Wү)F wGuso7ic(/~;`>/Peto'T\I~``ŞC={"͟~-_>mc[O=K߾`F6}kw y6gO5g_v/@$Sw jME@AP" [A-* AAP" :=z`[׭9%Wߡ9K*j(N+/?r&~~-؊+Gv >r.*1\}͟ל_̨v?zJr>uޛ/w3$C<4P oIkJKo}K,1egx7yœ?-q#Y'w3_~`O+X;g}ظˇL6cq+wI!y(nʌ_~{Ua>;%[5\q`־;y2㉿>F_cm'_EoՋskqFo| Hٹj I!y(nrCwG(`0\#BqyWXWݞ,oVco` +>R@KȧӋ$C<P,`,,695*/Mf&Lle,_a%:C<$Oe(Yr:ƺ5^c @%ogRjR̛p:)=_RqiÒtf!yH[m [[s[ ֍āc/rō[|pH<Cq Wl&P[v%OQkѬUQpkmMǼek9{LI!y(niw FƣmV*ӂL4ʭ_l|@nRN%I!y(nqCJ:t1~*G>w|ek~3.Mʽ6I!y(nk1b"wn֏w8Um_6) Uzco?6LvhZOSP']0dI!yG}Γ@]&klZ6G!bc\ y CǮG9o'x|[5sա @`kҲocB<$CPz8_en4f%/~$Cj}w93]^>\;OKb?f$C<'OCqKuzۅr@ (lzO/]7( ⽿T-v/)o?`xm]yA: -{x#mZyc<$C< L;5J.>f eRӇ-sb}e=/'V?h+FkKeO<+Sw,ILS>6<דKe:*3wI':ȳ+[&릹T5榯#7~ĊJlgYGd v_2M8MέlA捷<A!2+22gBI!)K%nhr'OFU& ؏0t@GL9wB0.]:iyľhncڃnm)R춰l!{Z}Ypkd8smT'rÂNuzbX6V05nf }޷s^5u?@׿[%bj$(e9vPCoB̾ ޘcc-86jP-yZraÅAwa?TDޢG(.Add!3 (-ktP W 47}_}Q pmZ +s:ߴvl~vF[+IU4; l1<`3Oonzyjyby,2TT!E)۸ CS'nn9]ؽ?:+߲Nnxbs1yfQˮyN{ Pvp=axis^Νlr9^ZkL9jbLY{ҐFohnZկ MIJ}{V@E+/׸`XuvWdERd˼ѾX (BuleI削)d]%)B㱻wHyj:|9]|/|k>ݝt^P7Fµ9@=𕜍d(t:=>s1k΂.)_=!yHy~K] ǐԩ"" "* !y:<糐Te{bFKI*!y:u|X~ğfr8A<$q޽ɀv#:)Ɨ5^u $(9`;C,+9uqf:U_k<ƔӠƚQ}WTgR~5%`@gk?+z|_؂s+W+dخzrBMvɠ //s`M7Q9kXl@!T'hyH!y>nH'o7l + )Py[Go3@}8u>N[~' u$Ro5 v1;8#4׀:대nu&.OQ].$#rq- O| p ꮧ%-K Y4܄W PƝ-C<$O- bǑ<_ He.WwlKDWr|X’O+H]x!Dl⥈|:X_]{(ݿNތI _UUPwR[?#&{uyO;k(ʐvOl& ,|ZPX xJ /tB\C!⼎<$C}R=r{klz^l[.6xUM_C %ؑ.CB עs{vZT̎Cـw_"@?ܙ@Mᩑ.ꥉB5]oC-?\-}|Ox"s1yVQS"bswi3LKHMT%P1-C<$O-e)8z+P~~ɬ.t )v #6?o^AAUUW2ф":NO߬|Ǎh?.[k-P^P# $ VuH<{h\>Jj&TOsk<$CЌ[3N7S# '&}Yߥ_SN=$|M}GR7/ԩ1}eՎz1>q˒{z8{s86n=zOE?[~K 0c͇ Rufy5wy Zk귛>7T#yHiEIF6}kw c֜b}ܦ!F#?Ϟ>1k΂.)_=!yH1Q&f1$At,xTe{bj yVr yV{Fe/ HyNfa v/Q-!H֬9 8A$Ѧq@^o`T&W!HHOK%B y6aYvTDs ޽C*df?IL0)^s3=cz,Eo>oeSIS1PE~^^^6o˰3IڤJ6^EyaFdf2H@a^ƅ+1JrH$q(y.Rt\B.,̏|FxWr,L Pф5.vft{1K2/icHE  7lDiF&I"P4&g&\`f?ga^4=FsV?)d<4.tatַdV DzYeMY$@I2$V6Aل) m0ʴ-I") IS+Af6DӒDr xGpAa%I[ PRHP K4-I IhF|8ǁ2mK2H;kI`U`|2mKBRwYwE`sx/46PJ:$˥$I+]G1iJ:r@uf6TÒdJ<VxǛ$mp$>!;$m@IDMte;z{nDIv toכ٫Z$N 8 7#in\ ͋'s=[UI=()Y:fm9$Px`Q3FlNZ@Ih“ efJ5,IVGҴxsxs5fPV%@ UnpoOgv3TÒ$i3GZtTR%-Fރ+p7pTaIy$ld;psz$PDmRJ]" \ p=WUIG P,ger$IZIK[c]ifJ6)igJƛLn$IHN <N_UI{ Pd ޞyqۓ$I@Ғ=g|1K#P2N$- \hfCJ6)IA$M ܀T$c(I4s55o˵*ID _7/˵*i+J@R`k<+uf6\$I&Il/t9Y(@.xұ쑒MJ$iv$M )(٤$R9r-J$iybxXoX@uH<.]V%I>: \jfK5*iRG([,#˵*Im i`KEd$IHZ 8>/٤Hԁ.[6$I&#iN`W`$.)٤I;J6)I"';3{df PBRw ޼3Ujf.?,fv|l; >G?<@3DҾx|܁4afv{HIFEފ9q14m.fvNԵ0\>~aKh([m\x^e["&H 00lg |of{{(g`+(|05S¶>[?h8{?Nu?V&l'9\8̞sb_Jڰ⩋8mqau``h\m%-ffG]+74} ϏǻM Y=j^יUAR.f69<'Kz 8~)ٴjH_}G3;^O<Жefx$0.P~nc i`.6&Fk$XVnr]<ISHX 8x81Kxsx& <2w#i<j'!kGIGJ:8PI{,01M[4[㉆nO ԏǀπ& 6 {bY|G«4ǯux84Jc:p'pDo?wu).`wI,L öʹ 6~)K:2I^0 %m 6o}웒M*Ef'\?#lx̾Q-z] mfI{q!p] iqqt]e{[10_̆I &7Ѽ= *tr$pǧ'Δt2Xry.^*3Ö!ˇK,=XzK2vqt#b8`Ş[7c3 UWFm_cvƽwDZM k ۜ /%V  x=Yqq^i 8]ѱYGnTRiޒt ̸<~j$m3*K8 HF6xƱ؍:g涪e2:w59.Umu/p@(ҸxsXWL{=F-qAtu sϚٷ[]=:Mp}h '-H/7pKJ+jěxV)~~ <>e]}ft폿q OW&S3WXoly`JB|x`IS^cۊ u?EaI}FYE, L^{jET^+3̾*Wyw.61+b%kq?q?+1NO>$bf=eJZ"g8=T0 VЯ.#ƪヰw(wof?șp~n/7U^Ta8c$,>7hΝs 3:E^ I+D$M+ٍۚ%Ԗ RX܋S|h/Ĝ{!W3x%*iYIA_~N_Ib^nez`]޴pT͌x *lj7s+ Ow&o2.~mOL9X+#i]ܻqr$nVGI$ɚptދV0kl[K4q>~,٤M6tz?Iz? %i-`*~cm9dB1o8?: $-DzZ~wonI4v _8%I$ISU{n=RD M3s\$IdB|[J D>x#1$I$iX`|0m$I$i"*0|Xl8CI$I lA/ۖ$I$IƟ@I$I9F$I$uG $I$I@I$I)$I$;R%I$IRwJ$I:EIf-ێ2H$I$&6 R%I$IY!%Ca$I$I}`Z໲ )%I$I}-iimR%I$I}2G|〲 ,I~v2v{Wf~.`º)Iy>.wR`ݪ2ߘ]M{f`V3{ƺEdf/~uc_=6&),7c3)'IGDҔԅEJ2R%I;@cl\ fn,T5   t>o}[Vnm_ <]X?8, …¶Eҝf6d<#I: +} 3eHiYN9'` .Bvn/ܳ`al;eFaǵQn+Hj>[X xT׳00zԻcan沯mN912}W]9e Pq${zn33j9쇪0M)_UMaؗhF$mYXO3;F?֪ļ¢_j;?H ǐ$yɪZdX}vWZif&i;pRk;X_lfX}.ioHI&!B3kLh{&śӾhjIQ0$ kfߔlR(I>s[+$M7}tjy!{᢬;pE{@$E6%IFRW`&<~EwuMb;~)i*k'#l`#eĴ0b- {>3srIt<$m3&i(0ѪK71]jf7jU!/ScxZL/n=5cu3ۧ.@C]O~.>j$IIP}ވX_a`5{K s{aco=وoC/Å2Z†$IJY'eGIE/qn|.X"~|VokCI]רx4?m)i B0Cۆ$I>J6݄',\PR"TOu^2Ufc8X)G٧:}|q7u0LoJ \q;g36ː$z(I,a3]pa3+z -vk3PD9.к03POLY$6ۛ"{a1>4-czG{fXaCK|RoJ$Ig1@I$I)$I$;R%I$IRwJ$IH$I$Iݑ(I$I#P$I$uG $I$I@I$I)$I$;R%I$IRwJ$IH$I$Iݑ(I$I#P$I$uG H#;`5U*j]uuÁ_ax||af6^$I%Pff.|N& X5Ck,~iFݪ5US%ub2+\f6lOm(I:3t. xx̾neSNj$#pq,H0XX .W c OS%IҺJv"n*SBqq?A=umDsؗ1XMr4[1[mee3LOH$m IԷj$17 + I:V bf߶I4eL`r`a<؀w LhXSpQ0~(Ȥ.t,p}S-Mz4:s_kq /s1ɀMb<嘆ϭhnJf$kggؙ>V} `Xѫf6 B={R% Bg! k[i< iqQ ޤ6) }QyI;P6%I4*.x:ね/b 3k.IR 3 WY=Ԗxx>-$i(I@ qY IDAT*Rk (U'2 xǀ2mKJ&<>G"3'3+0&%͌? K34IJ&PRăa9`e7!y0ٜt}1U/,:/ dji&I+(bx%8Y𦁇2mK"z=S%ڒsQͽIG%Pҡ .xt.1K5,Iᩘ*VvW[ Mf&Pҡa$V==|)٩%$647> fBU$I PҮ Jxw{2`4f6 i&O}=SuIW}ܤJI=HoO$ܸ%J>]xPzs#ps4޳d P2^gS`es}QUI38: 00cFG >r-_3(`$p%pA$I[ EwwJ)rKZ)RfhCS%"iU{$b7#I&:|l[/6g7xI ZSg[ѣPs@x5{$ɘĸR;gutx3 {%i엉6nlXc&IąWٖ%$Ifa5*iN I#3r-KC_́p/ޭÍ @ʾ==$I &i*,i.xO df7cHch!-`M3{I" |v&%I[4w| /f@x^x6+b~!`a`.|HA8N)٤6K&0V=I}욲I̾o>yaT ûbT )y3"qzF)9'Wgq-ߧ] l4][ʎAR'|,uq IAu=?g@g-f%3wsJǚ= %QH,ofUp )}W ۝$ㅙ}1=oSN0J6 ^+A |l#|쵆6DIH?3̞k}م֝yf6 o"A#cTms#d!3[ }!f4q~\\7~sjf{snj;>a)~&f'xI}ʶN ,>􈤁M`xKX8W$X59M$0ҚtHl*C[ſ³GfmI3k(x-:Fʬ{vffAn9SIk/*mKG&fÛȾǽ_lZ<[6\ > |L˗7ʷvDЮ4\Ŋ!|m= HZҊISPO7kIsTm7cfQwWI+Iƺ";V-w|URT iqcH `EbuLʫ6-]XXc'ڲw|vIJU]+i)Io%+vH egog].']˩fZZB̒\X+U旋KҒHZ.ؘYNm|.M7]JcZ~;'7*?;p3l. .^>i.-l;.8*'g7n:0'c} \}N܈7eLqn@{L]i4<pT,?s^kS< G~&֝pcOwq8f|G\w7΅:ׅ T_}OOoB붨n8{u}W\{{>gemq \a1Jà5+{UO\JEQ)wzlxoq.VqܕB55Í1/\ݏ{X?+hx͈ u= R_177}^(Fs@99X] ~V(@sp2^a/1|]5+}㺜˗oM myc~ȸq*>Ap7w9WD_$v6Za>-3{6m`)MPc$g. 4%Gs[;SƼf {+\}P*mWf. ЬxKᜬkI>6"~dB;M,g^x^߂cCqo=xuw<uVi=2xT$+tQUgO|ܧ_$C C {7Uslsf[n-=O{ծ=}3DJZ)fa.G+ܓ9oFlQ?7is11^SYqW$]x7 l.< 2ؔ>sM+ۖ[TlfM}|KW34Pxⲵ @/ad(k_G7 ts@Ivbd5֝6VVu*_$>ºklsޮ}:Rպ񷭙b7dh\0>g=OʜǴlo7cgTZ2Sޑ鎰1i7~3,Wu-pqtCmPǿb?{oΪz}cx.Ӂp2JsNk\ϓp9|⎅_np9Y?<MeGϏXk u{mT~K࿟g${&'7~(٤!rg4ӊ_ߔ,,Aҋ f6\ޕ}N~Z(>k%V"޼w踙6pUIUEºk'30r]pBxW;֯uu@J<ȤlfWj~Yڮx;.ގS4v[Wď-I;n_..IJWղ/ۆxlɵf7CX΁k*Tcu=lKp x-a" =ľB-\L]I+F$m/^Is1LWаJoxʅGth~7ck<~g6yc.2X58Qf%)B}DL#b`Ҫc?KR3V}MI<vo٧ؤ{,px$P+"iEv0i'Hzخaq!ҜCo$~ـ² fsi%›ϴ ߜH^xla!R: <0wIRI<&-κ͒f!|ȓxK_onJ4;[x/t5i6xh(=@-HwGe96L2DSxPi:3{Ty`\KךR K:< af_>tmx1-5J,xHM.P i)<0 ˁ$I D3` < xz myp7)~$I>09.thH=zކe8OzL3lwy2ޫ  &cIl(tM$I4GfxRƱY&6LgS?cfϽ-IꉧXOorkyR5e0qqO$I !R)mOWi' Xf_r7>fA3KwHy D]+(4J6)I$ltfD%iIs ̆6|@i:@9X$IT!ބ9(58B{Ck6<eX]EFٝ>'6f`)$I[l}I=5J5iftu14 'r3AЋc]bf&$IFBpF^xʪ1-x&@@w2Tܜ;4~p@c6=@I$I!ivxxe{Ihf|! vHҝzn/7lG3[JQk@I$IC0;wI|iq/µ'\7uEOg'xZ6 ~0?o'4.oct$u7 <7 ތJ$I:˧/~ms#)۸@Zx-25 <쌪u)s]ctЗx0x?ٽf/$i"Y?OxR>fpfxn6/Gl#_Fw<ȾU<w]VVoZ#<^ky`&Ͷ̞o87ӄ_9P2aQf;<$7fH'з \6#Wlƶ+lm_cRa@X4]l `WGN>O#þfP)']-GҦ+ ?'Yג̆ C%͉aN½#Uxߙ$ 1~X^?`?>pDcfu ~!`?s)qLxO6́|Fk[q *8uƻ> ]{i|0Q5}&>#`nYYGĶ7}u` IDAT~l`_-cwB?G|1]X?>ސX755==ŀqqV(w"0+#p#\寈89_pA7<`@f848˴XA`ٲO~N9 47IЪ֎(9Fٕ۫9} \nk)pb:N(,Y|hoQX"fl~vװO9=!v< HׁūuQCv²Y} LZo&<4k\a(&E|PIl+SylNt~KY ˻/_^训tlp]$f|@[U-,Ge'@teWJqX|>P3;̮Xã{\&1'p^|02g)90S,[O3'x#>5 bś$Ľ9c8;KR%&oz\rGŦԝ?!p:*/g% E|h.UE0El^2aƾ9dxo?s<+Pq N&0_|~܄s7{9gu{ݚb`XM*̈%WXߔclfK;0;K-(š"šC8E K~8ARs&;+I]9s|gٙ3G?+oUof6VAx*Qxt$nE7QJ.bI8d+1<;cWE 76]2 fv%镴fvX[ŴEz\!VB^ 1RJPdXԂiw&T.n{_IoNhv»~O[NkdZHꋿ3.}W<@1>`W#6m~ȸp ٰ,$ ǭ#9v3~Ml֡m.hwh 3Uٝg~KmM)$?S*$ƫ(T_ R7^~5u Μxc*柆L XFR4#+3;2->SoPRzQ"*p Ϩh* 3/;* ixeC/vz" [xa|:<mf/ǘpbSW.$or*n pB֑I: m//gۗ}afMY'eGw1*P,@/3 ($I$X7nO9R~ Ia>nZMJX$I$`.Ɖf_=/[kE:O<_:P$*$t$I$IFؽoZi_cߕ4|PĪ P$I$d I1I* ,ZfԂqxf1;IA/RJ$IV<_1_Y} xsx^xfy'U !$I$I-KUuIM f0Lq4#$I$Ijԧx6>6M P$I$MT¯Y\rMz%I$IRs$M+=m}hՒb%I$$"i,]hn/X0 4̎hjP*@I$IB$gf% l,V ǬA|1[`I[ nI$IscH`QVI[Mj3/Pic9{}Ԡ%I$IkfùhIn f{XFx6A4EcH(I$IJH<lƭ=ÀxcHId4n~bx06젒. VaxOlmqfM9V1q SS(; Iٛm$HJ1MӂBVN9*Yf‹U/OFMa^̚I:>Vcf*_VSgZwفJ x(Ńq%3 K53l f,%I'&2"o <~+*PEyޢ91-߄wG(51iGHl;ʚWX*$SӸzIWYm;.7V֎Y̘VRRJJb|f~O9WhoضDscza+yqEi(}Y[铉Au6 q \9x8 %)1[³itHW?FH(I)Gg1p+FX>ofXN}[^mj\>s4[ x  5O[M[xC!: 8Tn] u]_:W▞6:U,?o1Uϴ0o21, $?Qw7Xok-ͬݘ45j[̉"}ߔ/و Itp -nNų^wÃ/;-;s}kAK -[0ٚZ2|߽_T^$iC$u}b*,:oHw,L:<354qDRbq<(c^o/eobn8 wg Ń5'4EOά2=z]$|nf/72~\:8NM.iJVBҌO0-aNNR i,1}+FCWlt}$XHz퇻(/]\.YsJ5[t9KZ/1I*@IR",㏤LN&(Wip+#x=!N4%cTz 岅UR\c^i,00n: O]Z4woE,%DW=߅exU. Y_<ydf)[{ ^J^=ll48VR1@V!ި8R̆V1@I Y/Νԋ+"+mU`?Is%2&h0%݇?[J֩y=;5a57QQJxj(I*4W~o7IZ( }3w j/ZI=OEqںFk! `+j 4?N*@IWGR`mAO;x#W?N2Ѳx7!Cxpu> A,q~,{~V0*KXW/pgRbvIg%ҹTdl*Ɉ7f{%/y$zݤI {JAf6R%IґHZ85 08x4آZԈl\E$I21 `=%\ef+]Rolg݀gp]61+K(,J֞[3'I \`QpqI*`ROvǕ[RL4aVofW$Ifpt܏ĕ+",Honҁx~]M(i1q}O`=?S$I6aq :0'3 *ш`IA"33Ic Ѝ4Հ݁πK:$I2 0tqcuJĕJg6k3{ʩ%U x`x&WՎI$h){>tI Y=>0Kw 8Xʩ%!if`/ X$IG$]H QfX}KjTY`f[KzXKfvOSI@’NN0]T~$ fv0`%IWK,fIW,$>0-@]I ه(I0sͿpdP&`?<]S\|V> GW$I iC}³xGw$m\L|< <   P!xv6ߖ$II1u pZ lRu|u~$M \mfHI$햨2{ur[_ZΠHXX ]H/]Vg$I=QehYTs$%)׀e}MnZ:~ >\g$I:,Q`!l3{ՎlW,q9^olu"$ ,:"%Itx"s"iNL3{΢uuƕ/oŴKzaH ;?h|ăpIGH>7jR^ƭW +nEu0"j33inR|P^³bGf]^mU"P3E**G'rw+EcҰ'Dcfم-̗hY敀yplтq_ݽ3?Z ,Iw 3f6:f8^_$ZocZ Yœ5}uѵ*~Ueu5bf< (_=71fN܂W\1bf當(̎>.-_#X/q. /uml"?ĹܥX֡fv[j efJXPfvslg{ Gfvbȳ~{0 UaQ:(mo^~ԀHG^)Qa;K5\v2p]+i}]3㸖"s}grt텗֍{$~ l& mE|zPLx\qm7~wݍ^c\/:+~̀QB38pj4^{SN-W]S[Fd<rL1WtUc "iQIo7YՆnmHabhOܝi'_ҳ(cOh*QrxϘ[,+)Mø3R=2 Z_X3;.ai>J9f 9Sѥq?mj5̞2O%?7!xG8Ǿ^{lrsǂMY->+'cu>-^{Bm8Õا㜁+_Z3il4(pE8 0+Y/M3k,{*k358]+3{9pu['x/K_P<\x>9 ^oy*dkԿ/P7-'Jʽ~/e㮋ȵ4V݇gU}­4O7%0E؏,[>[έ+]>]bx8wڳpelI<8{%kgߞmDXqM֍;Kc.S`F ψ{>x@ŸJt}|_;|8q͖ĸ;68oclgҼ pŨ[|?WW(8m|.= IzWf<%:hR$u/~1^dfGg黫,;0\6:37zV FhRXRV!fZ\o &,sx8xHZWn?@iޚqwHDH|l::?]\o:kKڠlnw'㖓pE `V3n*T/ovkJQcwcs}\Xm7=a•֨~xӺ?+=L6@mǗ[?\!*b>0P/bP4P4m/KCfV ZW)#B$| S(ŵ7$w%]+w1P^,m6;L~oGp8=C?㖶%[f%~^ xlx g\^zӿ>O3Sc =+i j1>Iّ,nUO], S<KJ+,oÁì!x8~VOpeeyEIGKzW721Eシb?Oט2w+}MMPV!@W3x ?Ff4QBX}IJX/Jnf%1v.]Sfvd(*/O}+IꏿXhfgd9%p& 3{ -K[[뺰>}IvoC#Sqz]IXp}qw"2S~A9*j IĵWoU;y+xJc6믉+[T$I$,G뿘7am}̀'iٗ1=:+k#䁢c+8wiOw06ݳ7Rb^"V*ff_5v*m>ǘًtǭzI'I3mf_ ΑS+[܂ nmզTZI97n erԇ񸱧-H7M3-rA)]PJX+"i{<$3{$I$pU[iNՐ/ȹlQH P+"W n$I$}iJڪu&q7{5f!"iȘ:Ou$I93VRI`_ٚ7773.!<}^yPI$I:'Dp4pIΜm\]-) dEë noX$I$I3d! ȶN6-O$I$-#c&IsK af;$I$tMinI$IT$I$r ,I$I.GR$(iG&I$IҙR տB$I$IR_3I$I<]MZI$I$Ie IY$I$IHQpg.@u%I$I:ҕ-h8)H$I$+)@橛$I$Iԕ.IZ4kWu'I$I:% `3\)$I$Idz F .470x mfgUX X 6mpuu<0_89g*f~•[kc߯5/c!m| \|1f `ؾV3p$0&~ȼp]?2\-&g ndq> Wzw.- 9 -b1] | l,bޅq~^kN9uT~!08ʲmYU_m[ 8 4XIiYҺ: lds*\(oOJo$熐4 n))-x/;#,`_ź+n)?܊yxVGygV YH[LTšF5r<75R6I+?+d8 X8WlNz>_ a=f6WqM ̆V9V'{}ž~jy9Z,"2I?P P쀻 n̾ߜ.|^e|WQeYTKFܲ_Ų=nըdOz*ijC%\]Ȱkp\%{wWǺWycf63cf2▏$M["\ZQsYKrWc \A[8!f efdg1Z(/dI̞II(imw`fH?lb{Ev-Ck .źe5>c_NA3[jY`Ys rcءdEoq#݀qQe KC+ pyP6lb5 I㖴c:W6Pt֕t? ؤ#i Iӗ,ѷ3q}+.4t'mG*@I!i* PV}(V0W|hbg9=.?썦vjfOq<3y=?T!iZk'0z5yOlie[ʻ9WctjΗ3nUh Be"mFSj<^ga23u W(M~t#q$4(jM KԸr_d(iE\;Ij,]fv3xigFƽg=(LmfMAr5pC(q ᮯup@oI+g}%IhH')t`l[:PPYV.0@%LafDH3'X`fb<Y>UGKk<[P -eZ9ƺ?3zd;-lLA ߔ'Ǖo4Wrk΀ǎOù2/ 4ji<{෸̰"$x Ƹ Lgfzf {x;^wlw;~v'H(im.w*4O,xW`*c|,JM7/y^(fdF5<>-XEӳJG xzc'ikTxPfn%ٸȘ`MofE`sWd_/or/ pL8(s09j 3LMz`~bı\Wo~oժoQ:+J4vV\,w6 m)2m`Jw_Ӵ݁V,-?x"+X+1'Sƹܶkj?T9y7~q=Xb;GJoQzNJqӝcgуx$cD֊Ŷn~ۘ m!NjS\_85)~. zU KNo-3{3nQxge|3V=&*IZעWIbVY> [𭙕ِX<<<~*`\!z̾,-gYȢVEEXUqw"3*=)E5Ɗ1smR>KX'(Xw3kiޗVʴ4Fe(̄iҘmTfΝihRVNAx\xVA+ eצx֛*YI"$I!ie\Ygĭ7Ãqh^"3;R9r#nQw^btJ7$I$@޸5#<`es_<p, J|$It $ٲҝZx|moB2At&T$I21{rx x0:xqxĸT~:%I$[pkf4Lof4%[|pUH(I$DfBxq;I̾md= YcKNDBL$I:QyvIY5!W̾⵰~lmٓC'I$IE]󯀻m"(o7$jH P$In9$+77׿[Wlldfu%Um,i.IE1Ѥ P$IҮ(I7bf[]r;/5]$ ۳,΄ד.D*@I$I@Ҝׁ[{65΋F{xMc-xSm^WHZ%:?coz>tQRJ$It~%if3{w{.nٙo&p?%plV3ΎyokٶfO33RJ$IwsۗOl7%:Lmf3C&3;>nC*@I$I{:] P #4f3b&,$IeI 㖡 ^OR RJ$Ip7ׁy=IjF*@I4)*3]MՖM& Oi]o]=~">6MQ'̆IH(I߮9i:&'<<}S*󾭅"jL4m3W̛ YRb9|\ɕ9IO*@I҉ O-+7@("Ixeb1H6x̾k=$i %I5}13g1=S^G=qo"Kh(ЦB'IF]*i)`C3;޲$] I32xLu\bf_O¤H!V\1z x=SYLqu)$5FҼ019 @d i]X}d,2mTuI`pu]J&TdإhpaEVkwӅL,f n<_R_9c Q3ֲv$ ܃+벣|%]`IB$- J kDK(qE59iDFX4XXޔ W>廓$ P4B,e/u~ GAfi=eka+ IDATD\x\_^x{pܖ&O*@IH^ }<ݍhI2DjB4'^q\!jRW ,h;%WníOncm.x2٤tY"/0/?u}UOْ4=~ݯ_ 3{Imspp)WK/ep~6A1f!`Goi8dteBu;?OG-I 3H2S<27$f i=/3{0fD;`f$=­>kIZ[oVl#tj$-߸џn5*X#1ٍ+KZopGti}[~7$= #i ~X8},{pFǑԀTNEOYX{O%6LD]|2"87[dB_"&I'5} wty~x0JnfI >zuLRJ:4lg|˛RL>\LUu+IK5n2!uq0?IZwaF}-/q%iI23{-:>tH$lz9k$I"i>)p 0+f-ËX~=WJ&%I+f9q‡$I0H%i$גvƳS ᮾZmhkS&@mg6IS²).=F~O{sKK Wv66;,R҆47 ^ hRDjvx#BcU$I&;+p]fM] $ })@OeM٭m!dH}v^tŢlIҙC}Ûޚ{I=h.+M|ܤ:^*TIgYHҪ&,xPqh&i?<`5XKgUl3R%IҙvC"ls2IÁ,C2|<`ffIk+&Y)Y{z-It"l 0PҼƭB7U(i))@݁Iļp{` I3A u4 nx 8>TItECH\%+4Gs Ы6*gX#zE{hI=֞]ړ$I{ Roƽ=5=Q_Js ЅV}#`:x!YI'Gjx'xlO)K@H&i֋,/M*@f.kŢ!5eaIobfvwTAҔk#1,H$IGF"JweoEioGZ0b3g2iM ixۓxi'I)Wo2gŮMsi>^{ XWҠ6{5WRBb~xK:$IRs<>h:`Iכ,ZR\9YA!v>l$Iҿ tp^~l}Kڊ x-9̯^(WҊHウ}[g$Iڜt5pu|/ 3]_fHR_`]y<`3{xd  N Oc7$I8OEfUEKZj﯀$]\/?)_H~ޏ Ӂ{K~gt#Fi<-{=77k5qeqQ5 OW 4]|Of0?9kB~x錪CVxSA:fnK:f[8YH |LQeskz`LQ}Iyd8X=o &wosh]ISJYQ^M ^\ܽH) )P$xHqbiw^="Ŋr~3ݽInn|g3;̽;̶2:sn x?syipMp:MBN%Ajf_w?ZlC[0sϚTmVv\@O4z ,X٫q$q%c ^HL~7&cD/5 8m3RORW0I٫ǻBg`6ÓG+蜸\ V5Imf_/6:ǒfW1E3<!x\ktb=N-i%!𭙝 ijG(3#"s'\X:8ӕ=k"ԟ>gsԔf Vdz֋hA2x#+IImfAҼxS☞od1OpAhV\24u\j-p6 1{ٙcpImmdWo3gTOon%3($텛W1$-  }bv3%-Ly*:hag~l]c@9m3_,Gc H&%pii |.F~}]?Ba1xB[J nÅ}5]6]_-q_ij#h!1Yc渷Έ߼ zJĽ%ͫs/M`r{ܧcV`u%.x xC킿;6z.̜[:eF5OJFlb%-|ef_J .dfFzo0&q-G~05yTޔfvrUp[ x7Gc\1na`_3ڵ}k3jJ ״ 0^|Ip-L.'\ȸ+\7e=ךBDog-._ #[  DQl|r}™qmr2pJ5:5&h>\ ~~}.$|-. .HRw39"˖.2sE$0Gv@>@+|i SoYtv%5bfGu2\$\۸|z0+ϸY7nF[X9",'\vzORY%&jLД濸^Ѷ1OSZevEڸV OM杅g{MdSֲ, …'%*r8$-)ik{K0.^7bֿ!{?7h~%8fo\{= C`OU5@NM]o[ف+HloCJ~;@OO\횘v'y!˿GxH4OOW\3>jf%59p)c|r33WP<.\:^2q`lIog=y\5&dYt.$'U(3'pG >ρknBt0S?µU{'MDBfvYkwVt.8L *CVPD~Qzop \@; C.x<%0sy}hof`G3^'xY%\h-+q"IW5/K! 3{J:uωwkEi(m6G{fuDž7[07M .?o g#OȄ 5"m4S=!,dfEwl$I2&ȓoFҍ9#puxpZJ )pf6AWI <*et)-i!jG o.IP/h fk+pX| Ǘo<MM$"p/\pyҤ U lG:G$I$ v/}(^lڊ&QmMV 16ʨO0-ǵy^ >I$IӢ4JCU_ wX^4Iqz6=xNYq9G\)%I$IR;bA$'`d#X ~5}0pˀ5V @I$I$PES3eϧKOk9[q$I$I&I82/6y`R$I$IVQM);$ dkn+֐4HjH^Ҷx%z'p I$It"Fs/{9컺 B86GMRkΓNI$IT4=^cQIyQW1:̎@Ձ#q9K"H3H(I$Iѣ$dfו/BO#. fuḿ.Jv.xlGq4n*+!5=O.[Zb;|¾4/4ZYK/795Gg䥿"iZh(`7V)Aion3;,ir3{FTfA -kMe1_9?IlV\k6qkfW;&nV&&K}Z?d|SKXΑ7okCb⮸M`>o>^X%풉$=&|gm$u0?Hꉛ7w|} RJԓBPMSn*[/'H3DҒ>4sǙcON ZKw-=<@kls=%, .} 4 _WHdt$MUWxX5oD?%$ZPf5;ˬWe9q \% nfǙu:_;oGü0m ΍b'0O~Sz2,>'jMM}4 yAxbL 8 {3IL>/59Ņƹǥ?&H+2ɏßK}q-fv[ O%M&io1dXnZ̆ s/ t+ᑀ[▇ou%@Sޒ_דj @p)y]q ?4Թ}}ef'lO|Vfv{ aZpc=b IzZӸG`sI1$>{63)0\ 5fv>9/D066lBǁmKlzu@+-(~K>O_PhنTl.#Z&ofC\v5]I۰>?n /:- Br~ ߺ9p%ݶdRK:/E1+.%G8̀?hIwI!Jj1#$ut#MbdyH;I+E0lI3[&^ǬSpnY}pmfE ?mO6@ZkJFs q|&mpa9^oegI8ĺ=" W/){s-\й ?EtI+A'˛JfvB  3̶Èo?jī<茗7cXAm~A/t*mONH}=&ciBu9bn\*ٿfHm!mSӔ'i8_Ƹ&I縙k TsgZf6腿W?uzZ麺E͏c%frBdfBxzB=>3Nٛк0n,`ύ S//fvhfOL U!?bfvG`W:H:&3>! M$ "\x(KJ*S.2b4i&7,r*pJҺhkIĸ6`QI[HPVßMg\Ӹaia[xsUٿzi;Γ$m,Z<$}x439tBDN #oX]bvs4/4P^͜=瘱tK㿥/Gs %)7NM#Ϯ45U;+iI]"rhN`}AD(SqOPdmTvg|.IWہWlk3{PȝҥcMZyul (/0j`Ȩz*F.P3,c٧մ}?,/x\Sd_p AK)|1fMN}CQ~e,Uȷ7b^/vٹ!8F4->? pBwI'*< d1|(&67KFp3;}$I2",<@Qg}<b.k 9NFs􂗁KoZߘzӔ/1.q62]$I9I_עv %)$ej @'J?g+!Iw$I$I2óލG7,;Gfգ lxœU|$I$m@-i<0~5`Q<|=϶9.f$I$IڄZx򸃁3#Y53{^|x (嬱H$I$Ij?CSUoWq3˸oΛu Ci)fkY$I$IM xb٫O,uIƎgP&I$I- fvarFh1ގs=;^:I$II=Ypd#cLk3& s|mt, }\%I$Iɩwzk5f6oE<z3I$IM-*?p!h"ڦ jw`V```&`ݵK$Isb"đߘIw 7oZ=i&hX]/sfc+ϕ /l\^&X dz͏Ւ$c\̾*if#8ρB:wNH%Jygp $w/-SUW]$Mh,/s8 :?ϒ$ uv6~XL˲UC @I2VH zgO`RpX>at{3u 4#~/fƟ133H*G1 NMi%dzUO I0p W\^,Oy %f,!0NO0:0+ |Ddf?wIc4>@IG"&9UQ>+>딠4A3WY&&WWF3IꌵHҲ[m0$HX'}Hg`f__A!!i2`A``#IS~1(IXk$] l'EmJ$Z"q0$4%.-;^fscF$ZPTy/M춶`tT"¸L \eJ &ǵC{OCfb>$ Tފϩ*wǒ.ޤLH*S> QN:*tW,Hn 'fiA3{aMQMzO+챊Cs6Y`p9\l|86r$G~ `Oƣ{5D7hI2M2$*n|r MSt ܏g 4$mh,HXG~xƗK3h6Àhcy4.,=kfC:$ ċbx/iN&Z-i\  ofg֑&\"$xuܴ51~>\lu`M|.x̾jdRQovMPR4G\px$i#$u]#np#EÝ7?5;$D f^C$5jI2 FxNufvVcG$ x8J$-כ bT%]Ym7_XgRY&I^ĵ@E0B| %IAvCd]p#C%IDh6SR|?/5IH PP$M;ROp30ՙKe'f5;I~iNFjZx8xVt>$M  y&!"H_\#< X$IQi蠒 6#2ONx'p[fMރG#)%uGҬx;$I:"":̞h쨒 tNB<R!#IVQwwvC/5:ÒUḢ\~=I5p?0 p!%%cMh{p}k{7vTIt&`Kۆ.(cJڞuRۓ$I@ҲybDjHZ |?T^o$IF̞D$̓%3'T%\fƎ*I6f pnx`%^7;P2 l;p ]O#Ϯ%- )I&Ǝ.i4#sL\df5xHI$uGҴ"x] R Rɑ[apU'Lr2; -]"in<: m3wUB=0E4ffgFޱ iT$z| Qc[e StnfͨK_4Ӷ^*e>3;b$fv\NHZb5 Q47nĝ0c[I "̝.@2Uv,,<;bL\< M?KBϧlTj?$=/:26ᎍ>֏>VQdfM\ K%-]n q!i`g1h#Յz 6v_8)lI]ˍ%.2`2>`rD 3ff[/skN:fijFn tm`C&ҾpdҶDa7vY]ʹwnt7qMTsױ1jx#%K.Qi'quwi>:ضeiۚ{Kΰ/~ҶKj:J 7Y;WJZל|l*0/q#)Xs SEJ 755d9|*iq`kx35LK/'f]of7$µl=q nJ̆TDl4.씿BKIl$~WϷ84ı o2>@0X ̶jƘNN}X3UͬŦ7X )`E|R lk# 3I1 ɷ$M Q@/f9³w43^j *[fcUO$la-3;:vᒾ/ `m<{$ \lfT`:}I'/?6J~~?/($wK{?٠R=?pI=Ġn3kom`y~4;;ޫf MfK|{~FsBzAi j|.t01C3װ4n>yc,{ -?fvhDdIK: _<>rUɹ5fhiv+U0{y̾ gS91_G&gB`yWҍQOfV9262ψIq;n ߪ֙y~% kފk2<ag w}ǜkYNp73fvJ{AEuv0.mdfD٣"1IJ7IBr]'&\84wÅi$6*9KY&aE\}̾v_%MN26xhI+H II2z̶1vTfxJ``[ `!2% I[1mߓfM4, _F\x ПVOY))k6^jg܇~M/< T1IJuݸpLPqwy:_bF2?5&V{ e\^#phy1Lδ.]isk0\R~ls3hfبf3kVu33;ג!0&u`wa>ff'7xHd4_ 'KV(pabG)XǞkaY742-k,dTAb83{2ƵƤ.-U>njfZwҶCn9ṫ=h^Z Mp0%݆VKfiepqMRHB!Ԋٮ\SfҝqOpAkIϡY Ѝ6}V…%dk/g mv3ơI;"5@9>afK p;¼xHBYH>'jUvN,&o\1%pBEu03f bI1=b[;N DNu,_%MZJcw -&pc=a:wP^2̀ oSڒ2ДO}R0#2G?hF8w5u㿕Sb nnKBY7}m3 I]BG8/;Rq-壴cOy"Q;4xI;7=#$-iF+3R`HZ = R`fU%R2OGĨfsEWf*?kTɳD埁X IDAT6=MEc\ wh-^\\*pخq$$%M%ۧM~֒N5Wx}*xRkI}bӚ?}HQG  Hy wޢ$-k%Cp_q&q!8f\sKwO⦰bx)fV};2Bp'5!\󶁤)%m \kJU$Չ&6w~ ]$3{v}玓t=eXA^&`w\pu&eV|/h,ŎWq6j(ra3>RXdŖ],[L4-~'K?ff{H:$efFsYk"\@zpYfv0Ae`3/m])34 ׷Z#q-:KfvEMf6gQ\ |hfD}k7K~_qޫpܽf/~/[ZpM ,;l]p_*}[ə$u/k +Eh~{M:zpij6/N <Z%4^lXؚIs΋';fzᦧ1T ;Aѳ@'3{x\&N7hԤA"yH:;f{L^5I2矺 -̝UH@Ѵ;:jv*pߊR$#w|.#QDA YФ>@N3>2> X 7+F'I$i[$̓'|OR:Ctt0pl#mOjgms"˙ö)$It?f6OqaD0&΢G36}lH/yUKƗ$ItOxnIژN!ȼ&] G?<)yi$IK*kY M,&05k'[+pS)$I$e{3;83bmKggx||TN6ř +I$i3{̶zH0:әL`:A3}k97eh%I$<ʉYV~t PdPݦϒfPSWjO'I$k3;/q= N#ul9H"iw܉`3-Γ$It.mpnLLt3񍸐.t6Ág̮y*vҖ/*7I/i[OOIt 2 ,IG_`msTŗ-Y| f%=; ,+i nՈK'võ@IZnԻ7IK |+3X}/i[n`I/5- Q-=g$%IV-/D[)+o4S7wI3p&v.m(490% 8S[oASӤ qUOe@3n:MRKc5}̬pǸ3IG @I2~ywnO!k;a`U'M~Bu^n…}k Sܼ5xdm.i'`HH==xLyoLך$I'$i=c\O.搴Q~ISڑqcpK}|T1LĨ~-gN{fZŃwN1Q<ܽ'>|FCܑ$d$]rdB`i`1>T3c$!T7m}GK*2+6oCX\p9\2Z$M&o9%M iBԥ1oV%ĀS%( iG< H4X\ԌN}3V+EuaqW\[U)(XT+ID:A'I+tX'i `70"N1"I}c^V5J7 ~ܱz*`w3b<-%$]jfO73x6$fY;?BL&tQw.<د-q`MIϢ'8$ESɋ$u1683Lx>.#6Cg4Yyf[㜓ٱN'/4+.HM'LD]&u}9ffh>̾8~"`%VSSC~~>WhJ}ׯ_CQQ044nFFF[./ajXaj.)) gϞř3gpM`ddT֤I׫W^ Tnݺvvvhٲe92aj*V`ax9s޸>5kaÆaȐ!011Ze)..FXX|}}qvvvAeaz`a "aոwڴi;;;١s|DFFr:""۷… PwXa*J*ԩSXj?I&aܹhܸ1Ѿ۷oeرu… 1f())a9 ,0L#G"22SNٳQ~}c},l۶ ۶m.N8va9.d0 Sxxxǚ5kEyMMM,[ O>E֭ѥKٳX 60 SEbʔ)ڵk1sLcU(www̜9ǡCZ `aJƠA<}HMM\0 ?Xes/^@all'NVZ|Gt&M¹sp nݚH Xa9={~2ߑx#J0ܺuJ0L`aFNz*444Ļ"XXX ++ ׮]ߑ[aFN=/_?+GEEΝaذa`c0 S3Xa9tU000;ILLD6mpQ >8 T260 #.\ѣG[y˃/e{s9sܶ-5kiӦaҥJd`?2 șsXlYlÇݻ77oޔ6`prrB~~~m[,X8v/g?l 0!"wعsgmĉpvvF||ƎDk֬ɓ=GOO{1nܸ}b̘1I&EFNd4iܹsssxxxK.(..j``0U + 0r< G0o<8pԩƏ_1/ ѣG미tC$gϞ_Km3..+֯_CCCmK.ŋ/{AZ0|pt G\\mۖXaa9ѣG6 ===4jԈ\&MJ=={ӧObx9 P~};Gի6'OC[.Kڧ f͚YGG^M68rwmaXa9RN|6;;}Ett4ڵk]`jaaFkOyXa؅ aHPPlllPPPP`ll\\O舭["** Dڵamml4l*-D͛cƍprr*uŋj*2  1 \pZZZ)JJJ`ii H<;w"Qg5l;v˼ aV`aHZZ7ny;صkajjN:!,, j$ Fnݺ}t[z .]7n'''lDhh( * 8t޼y e3ر#?y; T-2 șѣG#>>o;D߾}annׇܿ- ss.q0L.%0 Ãh!88W^Enn.:vsss,Zz*92d._Ν;?񰶶/kkk : cza# 0 55.]FYSSSѬY3C >\"رcq?~VVVo߆#q̙RkҾ>>>x" ЧO :C AӦMyH0LE`aʕ+\a} Я_?j꫷'HpBl޼Xz5*TիWcŊ_e˖"PRR˗/~~~HMMEΝ1tP :۷ TV`aʁX,Ɲ;wz=Bу+;w%1zh4j'N@֭ȟ$5 QQQ8x V߿ ::zzz\޽;[aV`a(22 µkPPP###j*X~=&LPrUT*űc0c tǎnm?>>+wAݺu1x`vT!2 |/^p#.]«WвeRX֭[|}}1w\B̘1K,͛W%q1Y/_DII zꅽ{~}ܹsApp0D"; aV`a>!;;/_Jkll,իWjk-*%Ǐׯc̙Xx1ԩ<ڵ 6mH$ܹs믿vڕ=zÆ o͛71i$aƍ3fL$7oB[[ =,,,jf 7V`qU 00111hԨ̸*/s0{l\|SNŲeʭL}ϟ`ddچ BCClBvv6#<<qqqJՅ1lll0tP|kظq#V\nݺa޽m՛7opyx{{#00***Iu #XeZ!"sƍD۷/`ii6mobٲeػw/y /d999\|wDaaaǩpeVMM \i-(((X%%%FFF044!+5<{ SL˗`,Zܹs򂿿?D"  0BTcXa4"00AAAHOOGǎaee+++уb)vˡ-[ښLyyy܈jvv67op 6&444Z rةS0k,c޽ׯ_g<\p^^^!`ccÇ|Gd*Xabܸq@DDׯ XYY 6;g]xgFZZ0eD"c}ҫWШQ#DGG6g .ľ}0rHlڴ ;Wx"<==qHR 04hPCfXah^zݻwFY+{yٳI&aŊz6}Y{}Ν;4i^xE" ΝCII [[cXeF.eff"88˚֭[VVV033Rofff wF߾}uVk׎X_Xߩ[l:w{X(..F`` 燂XXXC aWc`a Hp]޿߿?WZ7owo&w^A[[6mͪR}'11SNE`` ~7,YDnW'|}}C SXe7 \a Ann.tnݺ!">};233h"L>ʮZ ;^^^9s&jժݻwҒH%H///={YYY033 &7s{O2 Sirssqen.ӧO-oenn^aK.U̟?QQQ1c,XWU.ˆؽ{7e˖^2HR\r+o޼A޽;;;?Ya* + TLrDӧWZqnbYc ˜1c|r\T1i$$$$`ڵ8q\92 ׯ_Μ94Gƍ0XaUjj*WXtЁ[-W^r&HLLĒ%Kpq 8k׮V>wTsXt):t}C|&D7ore6%%>|8r SQXeڵk\HԫW[5;fx-V^]v֭C^U!S}'99ӧODž 0g,]k;7#"ܽ{8s еkW888J0_ ,0,22+׮]T*)7jll\eޖ-Bl۶ k׮EÆ f 6X:w|||0}tD"ڵ 666|G.߇3peVOOx S.Xe޼y rhժU5YkՄR)> 777d2ťʮ-s%Kca۶m❃re6>>FFFppp#вeK1L0$ ܹÇPWW7Z~b…HIIyZ%n.^`y!&M8^'O߱EDDpiƢ[npvvcXa ,0/^p588011%,--ajjZ#F֭[7o߿ɓ'cŨW߱*]M)gڵ ;ڶm}ȈXÇɓ'+ΰC:u0_ ,PŸ~:WZ+++X[[¢FwbbbpB Zhw,ԤNJJ fΜ ̚5 ˗/R/2 ׮]PXXv+0+ S?ŋqְFNW_#55nnnpwwG~n:tԉXcڴi "ܹ|G%%%q9())#GYJT2L5VPP˗/sO>EӦMjnn.?999Xnn }}}[|ǒ5@~~>ܰuVbǎhҤ ߱*L^^Ξ= ^zprr3tw4=zohc2|8\\\лwo1X?iii܅[rGlU%IMMŪUpAo+W ߱j4V`+փ/ 116m¸qT%Bpp00n83\ͱXnFY=z---XXXphԨ1kt]{AVb 6X5?bbbҥKpRh֬DM6a055w*#99'O$&&...e+LK.!//&&&(k׮]! Yddd`Æ رctuuGGG;< &@EE>dR(,,oZz)&N;w gfD+WgΜ~g]v|c +LV\\k׮/^Dtt4ttt XZZnݺ|ǬyflݺҥK1j(GD H>@D4mڴo͛066;R'OC׮]1~x899N:|c+Lύ^r%%%0555 ###6dzBBB34mڔ`nnҖؽ{7֭[PEaĉPVV;'Oѣ!?OII ۶mïCSL2sss#UYbΝ;Ѽys7cǎE&M|%V`*)22p ݛ+|GdS\\c͚5Ř?>NZjhkkzf o>ؼy3Uѣpwwdzg`ii  <]WαT YYYFYSRRЪU+*Yhh(LLL>XÇ?@nn.Ν3gU!NNN8sL ߿?yLVsݼy 222uV1H7ӧOVZ5j\\\СC1C #d2ݿV\I=z PH4h ڹs'=}5ٳgI(?zD"?ZlId̬Ly8w Bرc|GъhҥH666wj#77!==GÇ ?C a'~U"V` URR7nŋGdd$իKKKr_O055E\\K*D"@-xJT$L PUU۷ot9v ̜9pww 6ꈌd(w܁;N:EEE9ǏGǎV˔gϞq!!!(**BnݸQΝ;r#b1,--q-|1HJJbVcs͛1vX>|8}sA۶mh"d2>%%%֭[rRPP///ڵk066 lN7b=bM,CEEjnսx|5=~NbccѸqRҪUD")u@YYԱ&S%"5 ^^^,]]]vJLT$Tb_AASա:u@SSZB۶mѶm[iӦJ#pyX_>(Ĕ)S вeK\r::: Ehh(^xLA Ԅwt:t2Ud2HJJ*U^x/_rKGmmmԮ]"QPP/_/zzz0226!!!pttDFFTTTɃ1&&8uЮ];O駟ЦMJN^qkHNN.UP{:֭MYZ/_ J"GmfбcG4o_]vaƌz|H$H$ԨQ#,Y]ZH$<{ HIIdA➣ pPGGZZZʏO}*d/,,rשSqhݺ5ZjNK.!22H$uBCCK֌ (((yh۶-Zj _JR%fdd 66x%qƥ m^znnnx Wdhܸ1]Vn_q]"""b-Z Zl mmmX[[D dffr866HII2 ѥKt  d-EEEx1=z0VtttRc<-- ˃P(D-ڴi}} *JJJйsgs888 <<[JJJ|8?_q <|Zq@ǚL&Clll7o@YYڵCƍP6mpo+|SP<{ ?.URccc[@&MB֦MM\ʔkd444׻[fU!HpM >Lcƌn)++SPPGI$ٙ*E|#@@۬[XXHG! EEE۷/["""*r5BQQ̙3~ Ot֭R ===RTTbyUQQ5k&++KJdiiI7ohUy2BCCiʕԽ{w MNNNt *..;"o… 4w\`bbB3g$OOOJMM;&t:{,=SRRgf"*,,;fJtر#)((P˖-i$V!JJJÃwN rX^zE"苿@ HD>>>_~M...$ ܜ|H͚5# LJH__̃LV`e2IAA:wL'.o3:uGG\B!?KZVZBJJJ8~%ӓCO>YmG ]~~>߿:vH"|*w2^J'OH$"+++:|0eff)Gtq%%%%ҢS```:Kg&HDvvv5OyuڕԩC;v쨴= 믿h˖-h"0aؐ15mڔTUUˊT-i֖ԩSjk}wɡ۷>)**҈#>xL&4Z~=듂ٓV^M^^^tڵk_.]Js̡I&ȑ#itu_B)^+VP&Mv4a6E\zH$QvhU~;wՕ4iB dffF{ׯ_ta&HDקɓ'ӕ+WB!>|8GGGene!uuu8qW?L6**LMMI]]vQ-UgdggGB͛G|Gjժ萇`J+**-[*ٳJPO&&&DӦMD#1rիW`]6oߞQFMtT &HD۶m; \(<<(֭[L;vS-..e˖ 8ԸqcjժY 4~x6Z=lllHII/_.\~zMB\\\XqeʫWh餤D&&&w$NQQ 6tttjD*OH˗/- B:{,o*ۑ#GH$QHH͛d``@' ȏ,8q")((Є b=SNrWA 4 y&q4`RPP#FPll,ߑ*(11[ڨW^t5^呅RLL Yϓ ͞=IrJ7̙Cu֥糏NBFEo޼)|z*nݚZnٳIQQ-ZT#a޾}Kcǎ%PH-T*%K 2ȔXrtt$@@ӦMmée˖r}UBjjjiӦJۧT*%rpp}TJ?~q_,۶m#PH/p|' j֬Y_D*҄ HMM\Rf7V_~MM.\3˗IGGLMM+uQq B6m:t*mɱ3gΐbM tҥO>DǏ{ѡChΝ"%%G{c^|Iǎs뾋hԨQ#zUnsfΜIZZZ_}D"k׮ٳ)--MJJ]vџYmT54nܸ:>>>6nH~~~ߕ<-))5kF&&&r=:CNK~qGrWΫ)RSSW^S.EEEԪU+>}z&dԽ{J511!r߮T*PZfMtXXXH/^ӧÇ'd!UUJ)O&555rtt}UG!EEE3f'GԴirQQuԉ,,,*e#ooo tկ~N||<2_AF"ЁH ԨW^%555{n_XXHׯ'2zzARQQ322#STe˖Աc>nرԵkJJ|+XLԢEJY͍4h 3T'$*$ RPP?xiVZU_X!X IDATXY[[2="@@- ήL;LF(9CCC-Yl%"8qbX"8RWW[VIMM%MM2]FըKD][ [%"1bTd2ݛ /w''/X?O{y^zM:uc<%%TTTxG)==Z9?k,jժU 0BT*%@Pw҈#>z>qqqطonɓ'K}N TȾWQQJ|=D"Q~%Ka Ϯ]аaC,^[^nj{IA/Ƒ#G5۽{7q̙rN:w_~?O{-իJۧ Ξ=ϟWUy&j׮ѣGW>$??ijgxPQOOӧ{ѱ¶Pic?C {>zGmݺ?3իW杦`Ϟ=+rrrǏWWWߥ1c!!!+))7Ə~ o{.M0^666HNNӧׯ_cݻQRR~XXX`˖- "ٳq puuE\\W q),_õk׸R)='N`̙غuG'''χ1rH6n}mu6l&LPMSScǎ͛/Xd f͚͛SRRcǎyEqofW(4DA'6111&jkO5{^b@4 T>PuS;{f3sŋ>O? ɓÇr޺u ;wO?> rsN,_-BXXX'%%^^^8r7'OĔ)Si!!!ok.ܸq#G̙3+\t333sN1| ?^r1̚5 _~%ΏϞ=Ï?۷qw)pUL6 Xp!F޽O? ,{رcqFn_|;v,bbb 0m4DGGc7oa7n|}}F L˗/cԩx9ϟ#GB"h_oŊ+WuKXXuVg㐒M6aڴiOqA\v III,ؽ{7f͚%wmӧOc޼yHHHPz?r&Ocrŋ7nƎ+WrJ;ƍCPPرcq9@nn.v܉={4?~x\x3gb(,,~i׮+=F냴4cǎu*G*ܹsXr%ϟ_٭[䎫n^ue֭J9s`رrD~ gڵkٳ:EBB*|I͛ntM> )==,,,hҀqppN:ʕ+ݻ4fRVV @R͛GB)&&&OLϏ~78p ݿ>@C͛7֭[ 9rҥK?$LF~'n@ q_l冷uvZ&"666Թsg/i߾}ԯ_? ٳBhBEEE4vXҢi/ϤIP[Z M:.\@G!uuunذadmm}OJJ"n:nZ֭[n4|ڻw/уx<^bbbȈnݺEDVVV4i$"*ё~+VpE~~>9::rΝ1YFQ6L&.]PΝ4h%$$Г'Oh<޽{˭?N999T\\Lfff0%%%G7o ruu%ggj7y&ZQw!%%Z'DDDP.\H~z}v &^||Çs###W^#""?>p!ƍ֭[7|Coߦ $"HSSJ={3M>.\@rXLϧ}Rkho%oooNIMM(77=z츰۷o:mٲ[Ԕ&L}?y$ׯQiڽ{7ׯi+***ѣGPXXyyyZhYk5aaa!ٳgknupww ԩ255ǏX,qZjQuaɒ%DTzSRRz)**"rNP)))JJJhƌBDDpB@DT%?JRrtt/J3^ Ԕ+۾::ҷo_Zpaʨׯ#X\2{ܱvqxGDB8@\AAAF۷o122)Sp>LkLF?RII SC222=|¼ kAKKK:}4EEEQTTM:|>-^:t(Hưzj2e W3gbݻWcǎU;vSQ\\УGޞ[6vĈETzRXz5w_z5>|L/ek׎5k-Z'CH{y~gիW)e~!yxxpߧL"g`bq|wff& BڵkxzzV8Yaɒ%˗.d)44J{(ncc#rIOOO>wH$:eqQƗfee{n۶m#ss:1{ljժ]"*͜9BNSN%DBDmۖ[Ņ֬Y}ϧUVq7ƍ;r2''x<mڴ[o l4gڵkI$q7^^^~z\b P톋GU:BqNǏVٿܱCTjo[ۛ444kVΝOPP; '|BK,ǖ-[;vJk˗Q~s9a``P灆?N\x"K.qL>]8D2h"={6:Dh۶mDTzUUU+Wr|djjwo?tttId2YQΝ[/TtM$"/*/YF+6?? *vNZZZZ^zUݻTUUFYܴiS ,1w,sۤ$(++COO˗/S$&&ڵkv\]]qFu]UUUs6m@qe(t577+ѴH$⦙pOn݂*?s|g L&ŋMXd {d|ğW^իWr嘚޽{#>> x@pC*b˖-rԔ6mpꛗ/_rs]xޔՙP~=cBL8;;Mݻ7ڵkJH$BVj{h۶-  6Tn[3fٳg:ɓ|;y%XNرc{sdZ=mmmhiizSm۶Nex}}}X6""<gΜA@@wIOOGppyBMM }TTTi***#aMMMhkkO>P( "\~_FFFزe6!J$7 GVVsru|W^U8ܐo@dggslU]_jCv_r$33iiiСCIIIA^^@>bpqqAbb"6nT֘@p733[lsѣk..|xg͛7 /^MPTT$w Okn޼>N:SϞ=5;ѺuJ*=rrr^?~=zZ5T_9m۶^! M6(**BFFFLlYඛuV SX[[c֬YVfY9sf6'''O>rllݺ2e w* ӧO1yzGIIIb2+u f늛ëU'QPPP!|>"p]L4 _|<'OrrҤIoo>L0ݻ`/6ȑ# !..ڵKes>Յ?~\ԄÇ_ڵkqFzy9vGGG|gZӧOѯ_3f`޽P(D~ݻwرcv ?? úurJ>| ,^}:=zuͭlӦ 222*111~2.ʎox233췱g̘1s̩p#XD"ATTTiׇP(ӹiFKKAnz߶MUge-zUz?wVX,Fdddݰ8::VŬ*Zn 11=pME_"{ׇWnMLL*~_~ܧO`Ν?1sLL6 'NM-KDpss |||L;w.֭Czzz O kkk$&&VT x<LMM+Sƛ277GRRwP]t ޙ~}rrrZa_333KLL ꛄٳJ[[g͚Uxƌxѭ[7899K.Xti.u*ooaÆA  FEEɓDUהյ[[n?\2*Qdre9---(ޕJJhݺ5z쉣G… J˹Go˦fqq1JJJ՛e|c֭8}4^6mT!C¢ N``8[l=@|nnnoooܹsGnz`` 󵹹9률ֆ@ Ɖ'_ J~n;U]_jʆ שptts|NN.\#Gᅦ܍|PP^|]ݻ'WOB!'/p׭3g ==]n3f#G`bbmmm|x8pqSX166/~W 2N(otLd:u5j(DEET*EII 6o̝ʮAeX[nɝ7_aÆ}JGqˎ(///H$^RZwH>_yFeǏ'UUU.C\vtuu k׎,--m۶7֬YC>$j۶-=y$ [رc)??o߾ttt‚fϞMDA_59spbf͚K$z9=~7xCԭ[71ǎK4yjw~D^KKK:u7TUUiذa_'pI1####:v]vF)@Do&LFԥK@dnn^_Ԕk]ƻXd Ը#<8q"cDII Ǔ% nTHRQQ!kkkM6q2^ONmڴӧOӥKLJ֯__#=4m4ڵ+ݹsK}^xA}ᒧ#G]~^zE#G ed2uQ.?'-WPP@?3sYv⎷zaDZ"*(( L% 0RSS)//MƍR333455p.6%%I(r=гgϨ۷K,Zv->}ѣiҥ&MDO< d``@\bJbb"WΝ;GGFԣG@O&TJn"ԿȠ\5j;vL&h277'djjJ\BMu & Zt)EDDЌ3hƌ$I&q!899Q\\\UVQnn.7˗Իwo)""VZE^^^rI"&G{&Z2p@n^zQVhʔ)L/_Ν;222"sss.%33kkJzz:6G!==:u DB;v$裏ߟrssIKKiSښ eСG'OWRff&# JAOMM%mmmLD4m40kiԥKj߾}z#ҪUoRېi׬,+ihh7pTII 9r;~?N=zӣGh-7L}HIICܹÃÃM0ƌCÆ #[k?}vtQ栲|KKZw,k@__eD"7n:WSSCp}nY+++A*"00Zj={&󡯯{{{|R_B{{{<~b@xYnLL ܹ'' M8s +mƮ XH$ ggghhhpɁW?~ '''Z sέU!99vvv7o.]Zϵ(++gϞJA\t ¥KЯ_?$C(W^5N*#""055E^{q-@]ou뒓biiir1r $FFF\z<}`\\n޼\" IDAT>}p1HsW TUUuttQ <Օ۷8wz%" 2dwr@igM\b1<<޽{7HeC`̙3=H\e9v7M..\Ӈ%hݻxbWXh|qqq믿"B||<=fc^F;w.l^~~~>|xW4/ё}ǀU]ׯ'>Og͇|4hs4Rf̘AtڵF6C1޽7IcJ "==:`TիWؘz)׉|cpT5aԻwoRVV&}}}ݻ7=zNqͶmH]]NJiiiu.oǎAIII?~B\.FTTx<|r˼׷^*@;v;*ꫯH(ŋш-t2e |ڱctHRG< %1u!&&ƌCJJJ4gΜM}}o߾VID ?͙&Vŕ+WHCCB"YC"JΎFhlJHRrww=zujXD;;;244PuCVV}hƌ>9|0S䆒d48@FFFdggG7nP"" %OOOx4n8nI&$&&ҴiӈS>}(00PzhРAdffF \9wW_}ێ MMcI__>}m`J8^lD"2d{ݼ8qnݚQȠiӦM>MFhN"… !iĈdll\pGP(SWuԩSɓ ؔ]r#ٳ'ijj҆ Q;iȑi…?^Cq"ccc:p@=b4b֭[GFQQQN.\@$hΜ92*%%%-ZDjjjԹs:ِH$4i۷-YsN5!Xjihh7 7o$eeeڰaC%*Qذaijj -[L3iFڵk4j(u),,EP(ӯZd8ϟ?%KЖ-[UQΝ;Ջv{IKKm۶ч~ |&c-hΜ9$ o|EKj|>#ܠ M1cƐ@5-SN&}^?ښB!7n޼YbD~~>ԥK.Y)))rJ255%5551cKibѣI PNhr#)5Gn߾M#SSSx֭[k= yI;w@ CCCk׮5y&'O6mڐ;wNr R6nHZZZBaaa$D"|>YFrLFK.%G˖-QCG ly4tPxDv"X\_`Ԁ8?>꒾>}7hYBII =zG_~tf5\)$hԨQM.>d@~~~dhhH<<I"(Z^ͥ9Ѻjܻw\]]IKK6lФoJO4vъE>>>ENf`O .$===2443fЉ'(''!6??~Lׯ'wwwxHwÇ4sLRWW'SSS3g;wEM :|0M2tuuȈb(HߟMF$hРAb |2)Z"P@@}IItܹq=޽;ihh… [LGu S@ ѣG7z_%,,Ύ.^h9ԩSdiiIֵ΍h[Faa!޽FM$ ?GX, .ܹsCi޼y]GVVmݺ|||H]]ݝ~f8ԑdBV^z'===;v,Zՠ<%%%t5oޞ)M>;$m͛ۛHUUhƍhyMXL4o<&daaAf͢ӧO7"--8@'N$###RRR"'''͛QjCQPP@W^UV;ijjj߾=M8mFMQeKB&Qll,4m4N e˖޷߸qƍGBh-f|-[F&&&Ck&!%%%?~|h iȑDF:DDXږqy\|СЭ[7ehhy G*"66ǽ{tXZZ^^^hMx]zEEEW```h ŋr޽{XRR< $''CEE;v5lll`cckkkX[[CCCCѲEtt4bbbhƢpssC>}nݺA (Zv#%%'n݊lU Lŋ}6lll0gB]]]ׯc… AÇCMMMrssq ۷W\A^fѣ^W-OII nܸP T SS ]v\b<|Pά>x֖3Y={Dǎ-RTT q:66Rfffr%5L94(++SNowrr+|e8Cpf+&&SSSЖ7mڴ+/^pKJJA[[[fYCJJJ… x"bccѶm[xxxer$%%t xyy՛ijػw/N< 1b|}}1`F;ŋطoΜ9HѣGcĉׯ_nI(3u/<@~~>`nn33*_ZZZ J ëW*_*oZjVZ ZLMMaffmmmE4^xҺVXX -ж 5!+onPRR555n022ӚR|x^~W^}.?˗GvLjieO ^r-lmmagg[[[X[[7SlDEE!22QQQxj A`:28}4gϞpvv mߤ $${ݺu yyy„ eez֛4Y[2 ?Çٳ d455̆ԠZP(X,Faa! QPP}ꕟd9M2cffKKvS=xIII a!WkTTUU!PTTUUPPׯ_VX PQQceѥKXXX(p2jD"A\\bbbŋ =++[GYYFFFrVWWPVV{u>D"@,EEE5,]A{aa![KKRSndd֭[cǎH$R_@i}y&BBB8 xRFt邢"C(V0ud0a]@tС)"83+MMM1ފL())AWWMaǎØ1cw^?Aqxzz"??eI3FNNq իA%H0zh!000wšjr L8Wn0 (..ӧOl ƻPZ@#G /| y ,Q ?~aÆaҤIot[Z"##t; ۈH'OM60`^z(e0f`w OOOt7onmr-` "]nSUUΝ. `0o , mmm>|:fh%|M444B ٍ`4}e0,;:%%Νk=XCDFF6z l:::X,`4]e0`޼yz*Ο?VZ5mmmICb$$$( \t :t`  ,Q ;n݊'O*xYoL&S\|9r$`4e0ĉ?>o_!,,, !22:::2ڴi˗/Ç3fLFc0-f`rܺu Xr%&L0JJJf\ h߾=.]7obĉd`0 3  :Xx尞 X|',>xaOOO4Z_DPmt/^1gEa0 X{X,СC#G@ (ZP ?nr-e8;;ؽ{7ϟh9 CA4+5 d2|}} ܾ}Qz}vvvDJJ LLL-42zӧOjjjXr%1FX{q%ܸqId\ BQQQ2(\Rʀp11jjjXh%1F0[lڴ 'ODN-VVV,ѨDFFJJJN ֯_h9 a-SN᫯®](ZN888 44T2pppPj3j(ܹSLf̘hI `-;w`Xb|}}-筸 88X2pqqQ-[SX{E\\|||0a,YDrމ3,X|+ZϟYRǰ3PPPSB[[>>>`0xoHOO'eE˩0+aC$k׮R+Νŋc̘1 Rр0x/6lp&PWW- #`4 ҥ D"Ԛ+V`ʔ)-`4*`"¤Iٳ&ku`qƢ9ƿVƍƍh׮%1z2Z< .?Ο?֭[+ZNaXw^txꕢ%1zXFfӦMX~=N8Ν;+ZNpqqӧOh)LBBZH'N@OOQ$Q0h9ssŎ;*ZN)I QF &88MzٚϣÆ CQQ%1zXF$88ƍòe0qDE˩eY,ѐ<^˺,O>Ÿq J-`-L`7ƍS/8XFCR*M6x"1sLEa03EFF<==ѭ[7lݺUr f` L&Chhh5`kkСCo-`f`-" >***ͪ/^ 99YR-h 8q~7[Nr F`" "L< 8<455-^ke4Ӄ48سg,X{*Z%-^h"\pAAAͲw` :Tr-`8;;+ZF1fcڴiÐ!C-`f`͞-[`ݺum_ա8W^fff Rhn$&&BUUFFFܴ` 8Pٳg#55}.]^z)Z,Ѭ9w l߾ PCy&V\!C&&&x񢢥1ǎ1+V ,, ;vTFgٲe6mh9 ()ZQBCCѯ_?,\K.Uz'((W\;wp]C(B,s]v SRFs1bJJJD(..ݻwGWWWEmpd2ƏׯƍP$Q e4i>} MOHH@Ϟ=;v(H]ò}v̘1=x[Cm@D8z(F݈GII 7nPђ ;`!&agg+Wp233.]`۶m TװL6 ]v}kw`"E&1CIInnnyP'N@OOFnn|"’%KPPP Me4i:L 4˗/X,ƈ# pرxcL0R~~~\?[Xe4YN<)gJJJ(PY/W.`kkENN*SXr5cǎH$lڵK f`MCUh())Ann.R 066ի! *[aeeU> oV5틘μիWMc0XFxad2d2VXAu)Rann.jVTT ,VXYYə0@{{{L2Eqe1gΜ9%%R2Qf`MSNA$U9_$UVXx1TTTQbd23Z񦁕Jضm{Xf^ˇ T*zd0 3&ÇQ\\\a:ǃ&M?Vy Çs^ M6 VhXZZrE"&O *j222xyիWUHU`0ۉ&Eff&222}Ά:]]]]GGڏ'Ϟ=+w([oX~=5e  1sLlذ8|0@[[{/ =piɔ%8VAqq1444 ===ddd`̄D"P۷V?;wYLH\pQyyyBff&>K$|滖{0oZ`o%55wޕ{eddpy<tttq[NUUNNNpuu+w^C  ={B\)((Çq} |sBdgg#++ yyyvʽLLL1!)) шޣ BhiiASSPVVF^^rrr*w_ mll?IKY[lqF wܩt=T#,, GVVrQΖUUUE.]nݺ[nh ,CB:u Oݻw5558::r}\+v-{\+w"88044+<<<0n8(..|}}aÆݵO^^9sx1d2̦עzu~}YeJRfee!==wݻ(]vŠA0rHo߾=mddd{!::Lsssά|ի\#66V$(#nnnpwwKɶDҰn:H$ @߾}} 5 #G]fD;wŋx"BBBe~\kJMOvv6gh###q5B[[ߋllذ+ѽ{wxyyСC kCΙ+Wի044cǢgϞ ]@}D~!޽UD"Ә1c瓲2͚5^zը:DB# OSNgϒX,VڴiC֖+P֬YCfffڷoOVǏ+LSJJ mܸHII,,,h-<` {L&={ի)11QѲٳm6rpp ---PѲDqq1رHCCҥKTRRhiUK?Y[[}WhY-$ؘ455iʔ)t!JOOWZE;رcMהbںu+!-YBCCadccCxbT,^a=#00IMM/_NT)2vI[&sss:x%՘"ںu+YXX6}wΜHR:pّ }甔hY͚˗/ȑ#瓍 mذrrr-^ O>̌V^ݬ[R)۷,--IKKVXAN_{wWcUi_EJBKiL3 &ec|1WHЦ/g{i,C}|<ΣznDBv"kkk244_~ɷq8r=z4رc)77H濫,YBZZZԫW/d;;9|0k׎hҥTRRvFdt!rvv&uuu5kVojG!{{{xOΝc;Ӛ5kCNcǎ-^ōd2:rm:UF4h 4sLӔd2]iI ѣ8Mf֭E jVʕ+@ZpdlGR*4rHRUU)S(|҇YZZR||vvr Ӝ9s؎B˖-#MMM`; +RRRё\]][ܔ8|0 ꫯN{MdeeE={bPAAYZZR?N,w}GZZZtup8+`[dѡիWE.^H|> ϧǏA<}:wL}Z&<<|>olGi6 ٙXݜ]YYInnnԳgOb-&NHlN-P($[[[ d;JHKK`G^-;;ڵkG#F Tv&vCW^dkkKYYYM޿T*C6ylKNNNVN-T*%???rvvV]!88llltٳgI]]֬Yd}6ԪU+o؎ҤBCCIMM8vf|}}]v֤}ϝ;(99IU&ԥKS} 8Q!"b`y9x ƌtЁ8M/jkkakkCWxMBB<==}GΝ;???;v }q5H!Cx ޽{prr‰'0p@̲-[/`;V\ۂ ;w[PUUv),,Rj?>rrr~~òe#+wKKF!JQ\\ dꫯp=\vM.)+H'''aly'2 ϟ?s]XXccc5arssKbƌ /((Ϟ=Ù3gWsh"=zwޅ*q87cw#/.]"JMMK{999HQk[,,,hr&555djjgDivz*Ç7~򒝝M;&6?Lm۶mKIRZd Ђ x=HDZZZ4}&LWIWWWGJOO'G111 9yَW}˵ǏF/okk(,,H,+e˖FV\7H$"555DD}9;;5P322HSSvw&I %z۷(իR))|g &Bh Hr^#GG ɓ'0g'v ^&Ms$z=UUUlٲGZZB())aѢE i_[4ygq&yW\AMM  C$!..eeeeHKKÃؙ*-- iii(**zm;D"0糳eee@EEB~~~xPXXXrŽOIIG}[n gggܺum)FSQQ<T*b^rbb">}fee!&&{mA$<|˥R+gee555z*^fII bbbPZZ~߅ڴiF&))) "x{{7T/>^.8w?~\.ɘgyyyeO?a۶mb1bcc<999HOOo}jݺ5:v۷o7NS  ==۷W2dOsss8p/D`=~zmH$ 2'uVC]^:wr=hiiʪQ|T*E>}QE "(Luu5{nbڴihӦ ;x!tttPUUh_nn.fϞ-[ӧ033c:3f f͚{{{LBAAB!:w;w0Ü9si&<{ nxǎYf!!!Z d^^FDFF_5,,,[/ҥKqAٳVVV8|:nnnqFxX[[7xŋ?~!++ X,Fpp0FR޽{gV1)//ܹsaooO[n!::DT0lݺϟ#V\ jnnnpvv_WWW| ~|t7±9#s̡?\FGGz弽ituuΝ˜wssVZQff&?x< 2D,YB^^^rohڨ6Ą9sСCDb11cs v9 bi&i&cƌ!T*%///￙ϟ_oyyyQII \455QwժUҨ6Qs]{M6s \'((|MN޽KRG2_pa>yzzP($k@P5fccC#GdΟ?ФIڷoO&Mb3`g;88P޽ ^z575k 4Qm̞=СCnݺERi***HOO&L\I/f޽0;]|Pll,s+VЊ+SN% ӧO':r6/?Rp ==:uRXC a~޽{Mz***\uKЧOtǏg6ˋG`ՆJKK_}eFIttt{2]]]QYYɌ޽{ݻwgF ϳgƍd É']LJY Ffі͛}mttt`gg###Gu-Gdx1rW]]͌_pׯs˗ԩSf榻III=ou1bfn; }0c ̘1xwѣG$%%);;FѪU+aà]HHHs=mmmxzzb(//g,Yݻc}}}f\\\|6Ñ>8W^^]]&KCC555n(,,RiӦQm`ƍ6m.]cԨQCBBqF}QFaΝ5k{֭[CKKLEEmV}{XD"jjj>oS*..fNyzݺ%%%Jx055Eee%"""(&%%UV<֊x|>3_799<k׮ڡFFFAuu?䶣M;]OnԓbcڴipwwTTT^;Y7tّؑ:ڵk'vѱcGYG^#!!!z*,--u1svv;q 899aʔ)8s 222PTT O*"''`ii٢W֭)=z>>>q}1Jkyb3˭[`kk/vvv Y7*_7:] |@2ܘMRSSei,m:uꤐ2555bf_MM ^{ۗO?~߿.]0{6Tll,ܹWWW\|...9mĉ8u.])S`044ȑ#}xz]vWvڱcGXRSS-+zx_DyLZYYMuxxxWx֭[]~ܼy޼y;-55W ظ8tԉҮVo UqqqMoӦ QNzp=tYr8-@N2P7woQSS+VիXx1pufi'5552Emrr2޽Co*-,,P(lpزe @]]Ǐ7W A]](((g}Vuϑ p]DFFO?~g|غu+ƏSSSꢪ _^lNuttlT mڴAbbb "zHII 06ՐJ(++CTTn޼-[޽{c?~s N:SSSښ9 ssslذ7nѣGvZxzz2wppÇ OOO|'Bn`ooόGFFB[[򂮮._Dt ̓6N>(mh߾}id2̝;ƍk[P8- 5'G)d2tX|9qXsi#++˰aP[['O*?)SYHa-ő#G0zh$''ss`ڴiBrrBGDpssB5gɓ9y bӦMXx1?~ mmm㰢O>Сo߮>RRRhxyy)N"hyXb˖ N9rFZ LGGG| c;F\BTUUK,َ_={em2vXdff; m۶a…ȐREѣGpttݻ-i8T 777tTh_DGGG 8~< & ++R(#mABCCg}~e7bbfEȀ"##Bee%0}t̝;8 tRlݺV9Xz5~'\ݻ&M£G>QXLb͚5lpފ+`["8::bԨQ1?øqpʕ.-OXA!++ IIIvNkjkkDg*l` ͛$}֍jkk o\̘1{Err2:(&>t-G.]D|>4;w^IJ@fffݤ}++LFAAAԶm[d;N*..&^ vZxm۶&dffFAAAM޷ذa r Q8w-кuHKKn߾v dkkK_[[K}%;;;z+w}G-u&Էo_YYx1|ڷokI[[BCCY'Oϧ?(; /:PAAQHTYYZ2޽;yxxY&LF$ҥKlaUMM 2ڴiC111lQzUUU4i$t1бcLjю;؎d]F:::?y/\BUUU'|BtMՓ'OӓlllѣGlǡOR=ܜΟ?v&UXXH~~~G7qX,oTUUi„ TTTv$?Pm۶Jٲe x<:u*ֲG6oLNvql &hĉEb;\ܺu,--[ HD'Gsm?N&&&_$˗ёiǎ$؎( TUUoR#ҥKdjjJv Ԥ]vi_|>6M_~Ν#333ruuT(DUUM2x<$َb1Zwt#F"IOOƍlGz&###:qq&%%iqi'www|2qˣGhĈh͚5lOEEE4x`RWW`;\TVVҚ5kԔ,--9!;; B4p@QTTDaaadiiIaJlz'͛G***4xf]ҴiH]] # Hvv6 >>|v 4k,RWW'JLLd;{9y$yxxϧq5=iŊdbbB[UVQyy9۱h  >OvZ lR7n 0>o߾JAAAJ2PH=ikk=EFFÑ S޽I]]fΜI?f;R=%%%vZ222;ѣGَ(gϞ>x<=َNiٲedllLfffn:b;VGԶm[ҢvZ|b wwwRQQ~_Ehrq 555JFF^<==IEEiӦMTSSvI$сLJx<Q@@m߾YA,Sll,-^zIdddDӦM4)Mݺu#Խ{w_)''XT\\L;v~ǣvƍv1C~@dd$d2F`xzz*PRoٳgO1vX < M8z(>CE^dYD"޽'Oȑ#HJJB0l0 >PQQi<2Ps̙3Ǐagg___033c5X,ƃp%9s/^DUU<<< l*ؿ?ߏLxzz"00 ud((( ~DEEAOOÇѣ<Wr8z("""p9 ѣנ333\~+Ǝ ^)";v !accz'FBIIIHJJ۷btÇǰa"{iTDEE!** Ѩо}/_ iiiHMMEZZsz!$ lllo߾ӓ[UBBߏ ??FFFpuuEݙ۷oHLLč7GFx8 ~:<}ڰ+'TTTS^^?]]]t={;Ѯ];RDrr2S\޾}ɨ.͡Tw^OO(--EII JJJsSNLaܵkWm۶l}[D"#55)*SSSq}TWWC zzze~w@ ϟ?Ǔ'OfffLOG!==)4o޼7o 033a PRRPȜ?yO>NNNPSScs8M+`9,;;7n@~~>B!S^ZZ mmm544d~n]v=I==z;w)JKKK^VV zE>󻡡!i!EDFjj*>A$AGGb;v7*'D")) O`%TUmKR5=M'hg9jRҖDN|)T墏2dYV&ӹ@eYtG 2!=K[k j;$e% D*+A@ JWJW]ST G<4ҫYyۺN\t0'<謦.V+dmT^e*$ `*;yDraQQ@@@Qa!0'N_~qqqnNN7+gKm3^6m-!c%p ؉2Ri@EQjNh;2ʬw)ieLgGUS[DUKgA;10ZO-УWqj/@:ör'V$LgZ/ą !Rr/h iGC)4t,˫V_4B)AdӅ|Brb:!&J \*lup0u;w獵yGFFzyy=|#΢l>}%''G՚.򟦴wPDOlE5`&VY􂡲!O)#1BhH!`CIS^5ˏ&S)iv\\,h4`CUF' V2*\qgmܡњIK!beYSaJ:`,峬-8%4\,ɒB+``N@ E&|$ڄX5bC F7n+'eC\6 pPL4ŗ:kJ~v&p&r@CS^]`[;̓l~zff߿N\wQQѽ;w;Vr...Lj(3f3;;ۚb[Fϝ޽WdcΛ֫W\\\mV5,L8~nݻq"3ZS5^YnNm߾dΩM:iӓd_mg&rBʸ/-9yAHi~DCll ;w^8"K#3mۉ]DD)|S RJ"RUm^ $kmPmX^+"l\e.ӲPNPFݪe>\*[ePzj¾8ATT=^1#B OM{X /deZ,k^8ԡ ew; o~4] i[gŤV вB#6"4"{KOkr'c^O;nGj ,j0Ln`zE׮];|ڵByDj$|PCo^.իyV}=ul6\>ʕaY?۶kWюSC P3.2qZPE߂"; [DiDag۷}搥DR4IsQZ.TIligo4f>R$dV` .;m(K)0P/'8GIA}!XgW"A 0 t.`Gee@U[݅KZj%d6#2 $ x %I8^Zn+ ?w Cq"q= Zt޶l9(3m\mNƓ$K&%",˦W^a쬬̌ 5jԨq;pGFzwwwmP‚y?w:?ݰQ-[~5jTPPܿ- 5JLH()G'^[~&%eee}mE;"GpL_eBt&?gWž"=u %p Z$c4QQE5t璝9{6++mvmʪ,,ZT)qTO#]Pi6s.+ATr)auVpG7f;z ibIeeՔYOk\ŕ>B*A@TDOtRjWQ/J/"bŊ YCQvT2yh ^e;HA|ӃG$y-Cu$PߏJumƮzoJm`=ȨM>t+F(#!'ڴ[5\-ө? [Jalم&\^O2zP\p ŌFX9l1gee>8#BpK?"##S?ӠAj֌ręet;jczW T߸Np=lذnjYoOU߮2LÇ0N{)S[hh{nȑnoc,޽kwNNɓd:ϝ#֩3jVZq.~ϟj 6>@bB²Μ9c4jՊ2d>K[ro8gƍ#-T>fU6n[lʊ1cfڵvj'sapss ҥk1cƸ@ZQpyؾ#;;,bk&`!F3Y[ 31poh& 1H5ZD fbbk"ײe҅LBVF?(&3TkI7ĜF*Mļ_ƈm7۾QV-" hI&#?(UTK:BV *4@h(E-$٭*zWFw3F?0dY0. F 4V%ZVMCO#Q_ O$v ek@0.\j誉eZUޒv.Ba}\k |$כZr7x]\: }ؒoJB)!$JM_jKsL 8ꉝdTK?RZ>/0VQҫV+vPY%-|@;Hb ѝ%H|!0\ tB 6oٹrFŢպh !wM=z [lҳgЪ..nnFӎ͛7>pFq3-_;FL^>zHFFƔɓ&N4ʲlzlܸVZJʫLL\x8{l/7lR[.&&7ojOxv'Ny6۶mWa);>fիDTȾcpдiرcgxxbiԨFLX;U֮)..a_~AÆ_ p=X~=hƍjpn òlzuz}6tȑGW,_ѺMk8q|M\x8'7MVժUIBW UaY^z~\">޽;<<`04jvaXׯhN>é$&$˺ugӨq~a:W ֭o>75ޮS}4wпˉoIJJ_^pEga4>?9h4sK"T#D%ѵk;k׮P}< }V11È֢XB)dUf,dR 5PNWVR5Zd(>\fM75Td)"Dr?fM)?'cCULu)ƀ ޑKC"j*HyWUBDۚYZʍt!-ʺ5eݪjZǕU)iK- >UdWn!ŒX8$+VF#Z<==U+oߦg~Qhh;oݺx BOQhX Q#{w0,KήZž3+ݻס#^fmnww)""_~Ȏ;}#Gddd>ʢԬYӖ@tUq/%ITTZֳ*UjIIgw^t۷oۭng~hV1ZÃǑ@Ъ |մjժj !tNձڵkqvZpu0~٧G =iFEE vISФiSzrn}-Iӥʲ|CFs IXwV$=%j|DGXS2}m[s|rvYpeG鶛 *5-mѢJOO!3+ (mjh,d B1p"!1[gq>&,})+4yRbBѣcX6l DJg:m'J?eemelN1[X{p̘X, ~SuCA^>eQUBw&MLHH3fApկ_O0 0Ho#?K8IβJiuLDltN?>7^}5___R'6F~1/* f0ZXLm~6Xfb03YvN̤{62,AHUl)q.p:1 7RSSrQR-V5[!h@[`$YmBn2%AW =;V V8 .3|!h%5JgEc2 lAfՑF]DH'#]:zAh%a+.AAoO{wKsss~XR$2"|+W,quUтÇ9^v8 Hi/~>ތ!,ٰAHm~0Z-|<\k5Ca渘 (#E)b?ui1|;½ (ӕrB4qq4΋b?`BPn(:AKUaBF^/s1pCv ෕EhOr@1/Ğv^ "!yi2y K[-Cgo%\iDV_fS wTYHH{\`$ݡ@%Ylrqeh,rAAcMz&}ب'fe+H==7kJ8vI%q3kVj ",[mټ!?/wU p{XYvYWnZXQwԬ~E7WJ:?:['.ɓ֭۷7>x=Gl 9j̘ы-yff䈑2o9tWRFiii;q`Nyڵ5j' jhx߹5S;[ E/Y6l8o\\ɓ'~ݸ~}i78Y}4wܸ;w|Wff72ty;~ukj֬Mq'~ݼqUmهbJ0cFph4Ej4Q#Gy9ƌ3r-XP.Z@ь=aǏku!o,\0E0<6"͝mNFHLHiڗ& IDAT<}4YJ[U& XG FXd `\Zҏ+F R 1-Y e,UT!5~ҦsF5Ui"P66^ WDLƑxHCW [R%o쵶R+[KC4\EaɆj2YAv76>+R" CE%!ͫ20lXea[waZ-0Laa7a> miAC@^^VEjDع }V cY$9ՆUb:kCGl^SA~3ڴgE[lz)6'틋M={f-Ru軹YJH<}~Ky۷o矵jj;1T[jLw~g/RѠaի6lXfMpСqo)$x}~~~/CUB`Nw8ܚک-ǺxqȐ:>sYtЁ;.BP{pYZl9wF ԫ[~o4mdܸ7[ǹ 555ڴi:xpֵc_ѽ[|\n^0A>-ZL6m$_* |DD[j| 쳝:v|`4._u֬tU!nzŊKNyh\|EVt:}||tq9w}CW bOHKlGׄXxO?d&ۣnjQKMh'բ%.?"C,"믴u!OpGa&ee$ΰ,"tF/h!,҃ͩte%(mzyAORUPy2Egd9hv nbe6ޥ*ks@[TyS*F2<MڠTЪy^M̚$[ h;2hOhdjXiȄRf'F;ɔBTaͭ>UxDdU L|wwնU5ľgA;Saf-Z7_WZߨ{R)W6LtڰqckWﴌKF"kTcX͗תTڏ=/еAfϩhG(+e@#.a-[ pZP8XBE~ۍ0{dK]ܠA9s?f5UF0_5*,$쇶sM`5X?X{"Č?HuOCLN^=Ibި8}~JbN4Oeع$nTjevYI%/vj߱ o}CZ#-IύB(H#ĽD,1߱7ZFH S  kׂzvgQ~gzRGllؼysF {}ݸr&1zfM/_x3)?Վ߰1斕=l߾]P<Tq*WE`ؐ$D\mה!,otʆ]v2"Y;z]Rrd$\+O˨M_PidR% SS\"J Q;\.uO'z[BT ;UZHTڑāB߬TT ;z &Pkq5eL ";>ce\C_`,FW٪t|D8LB+sF??r.\``@pH ]h4޹s'~jm#‰ؓE˗/fF vuq)UؿOVVػ{ǭ[&vZu}fAL8ֲ܌tUbreb JD[iG]UOF'q}TҔB;:2/$rƇD# W Dձj˔Bʖ$Yd/j"آQu pjIC3b g)Q\%/[ u +Q$^wI>%ݴ/n+?oeq_TMς Ln6sAd<%u(ӫt2 :),YRrrrR_b1 fTFMx{{+F:R:8vĿ&舰I2ozjDFg_.֟\6[,kmRH HUWӨ|vפ'n)/6"VvP* AMuk)hM\8Z剕5kH(.ukB~ZS%1mWldi:(1T=dmWʚAGfQiV>zA[7 :EgiJwg7cC)mQyo/ /[e'8\B6KBMgM.Y#1(9BlNh@T+A h0b2 www MƢBGS88V"FCxDxDXU0Kύh1VAqz>]É+[bJTx3USzJIWt PVrU4ʼnKq❔$uAb&ULVsFI9X"n  aE$2 *kc-&o-ߧC׏D򳼇֚6tW r*/Tҍ;]GZ Dr(b S̲\J, i~ʣe@]/0+a~rYzP BXxš.D) $sJ'3 #n68Rm"ߩD\ `Rp dO -Q~<!EEEGu!5C/:݈p3htZJ4AHjNz;FT%NAuBf^ N-dfRuQCmEΡuOQ L=lԢ\:dBNgIJ*k=Jnn Uqe]ͦjIH_2T*)K~D6KAv)٘O@z kYbi6eg)%On2;5hgȆ9VA[D;;&K:Wb#64m SUI6%il$AZVc"KBTP![6(Z+ ,٤Ҫ.h,ŧFn2M ~[2e_;"PY(ߊ. rsnXеgbip@gbݐ@h37 ! FgEX% `Dl&}d:P.BM೰FD;ITjA*$Y^cMk\4M"U(vDoZ?!E%PP"[t[ T55ek(ܐ YhDŽ[5MQI@F،{XW&^h#BۇO o>LׅqY8;D`[km @xR0BGslRu~^?"1mm b``Ԁ0&=4CMŒ|]XT&-,xD?cR^mD[ Se'CZeFɎʖgbI[DjBȖsH۱u&8`j*5UtQ9fxRJ,;X2)TM:@)%R쒞*!$D M:u-,PԅL-;T⪱Y @-J6WTly(Q6dH)J m:P9*h+GHF.cT4ӂX1W駬gT,l{hO/Һ @6 G A cpF(xPXP@+  2AAAJ hAA)5(AAԠFAAR2AAAJ hAA)5ѹ;hk=lVܲfw??0NW0ཱུYeeOqѩ  ȣG~mʼ3aݴ&spd+ kn ]w޵?Nj~mMvF5AAHlx0n>UJf_IzrP. >{97 Ca }E{Y?'ŸhAAy88aoW6aM['W]YaZRte}tj1h)寏7tF:OL{m_mtU"πHnIiyG~S7x x5tp7 nybňv5:.~׷~8r5*;Rol٧YNEt~7%7^h\=Pt+P4z  <8AF\W@W0es;#+s[_`3L6hI<5ndIu)8>aSv\w}ؑƥ1^]S֟̽Ԕk7'4]XFd0ŗwyWm{]}N\lOoLMh2䔔뇾葳Ge k߁*nI2aZA_zW/ L7/CVs~zݫV0O旦aEl  ȓJy6us~ʹ5Gխ`(y뷽"D1{=Bz~]󷧴*$c~g ^]h_y[nwy#7y;G/h2@y6%/ qS=%7n=l]QfҚvX+g;1-.S~J1>u:Fd$1G4 <Ɍ)* 1R.ƚ6~`i  \h_5mopх6-A/CzT9Ksͤ1OlnJOW]yjFf$TVƔLߨ@W#0vXqP?YRl"1,|kV :zǀW7pvkvejAA }ʯ p/Lɓ<ٜw=KK'n$)]4ůJYΖlkce˿mܹnlId Ygl`*7oۙ{)W3E[ٔRYrvK.S  <<_1>})hIݷVQTJ]booܣ&+tovպjXSťO^Rpq+݇҇;PӶF1uSɮV.w}z s"t9f  O"^FkC^;gmKJ-XSNhMP^͝9`'j 0gfN ^Ka0tL;_a7ݞt{ɐ{ԮFuzȰ?_\1桕c-v}}FƮV\=cz 3s Kqڅ_ӹQ4;@Ay"hB="l_G]cV&-zF/M@5 {AK7p1dosb|!:rH^_gxnXcoQ>z*exn4|ۃ :`@j!A!M_P_~JMqǴK˟Ί;4}dppdؼal;} ޭoލ6eHs;.bAA j̞={:tzd/oo{N֖~C-Voh;ߪ|@A(77AA{-wt:[!*3lCA"*"i.Y7|Krss===]]y#  65j`YB|zJNNt..nAAIl+**2ѓVussww_GA䱂P謬‡`nh4>>>Γ?%%Ec# D_z3 ,B*ěB˲yh4^^^YYY  aWWvAA ~Ƃ  A<h4 8  RjPF#  H>OAAZ4[<;tڏlWgA'2'ZCAAq6  ΖIT\j0mX q\7trJZꝋkwuyg `JyhIϦdf,O{.ܿeZ\;Vqq5X6YO󒞝ҵrv %xoo>{7ڞCy)}:oOh_Y7>$< ;Sю  P8[FnvoC0 l?^6cp.A19sk6b uOc&q-y;2Цvdtѩg]1[V>`+3 /a'miZ:+|vgcvp<[)ʇzs[`\m4x.7S^jߠVTTT&]Fq8nI]߻W3I-wjU]ɫXBiNjM]#~?޷cبZMd ֳ;o[7[EEEŶ}m,k̜^>TQQQ-{O_P%e]g\3ATTTTTU7ʦAAy8YF3_vS]Ǿrp~EWh"l;`fT0a0<$6V7Wc͟3}lHϢ| ښھ3}aTSr+JY~,ߌ"]"iBڌu}'}7aʖW 6gw+^{团?~ݟ }ܫK|q.'؝pų~y_3u IDAT)FF޷q_ײy?L:e-9p̡ VM]v@óo~ϙs iuiI hC?8W/]rʕ+;Dn'q==bz*|Fo2@am_O)Í3;jBwՀ)z:yY+_eМ Fq=Z?aLMz2MT#_b +F፹C~uݹw-xxJ@h_ AA-N̙/xL9e$}1t5kgznU$/ Bj]LiriuAnRcwv~uTwи !iz(7Ogqz溹/ ,ԔljJ<~㛧`bj'1o\%D21ѺN}Ů$q^ ;b;m%JM܀-wO`⤎A9Zwޅ-wϥ}nz!KνP?ܣ_ubh߭rm!5ld`$ k  #se`FR2tuIHœNwBH$ tI=}:!y[5qѸomxo߸mp ,NwdWjP93MNjrb=G%Xpjw'kJ,ׄ4hkϷδ>nʸW]RtDڅJ,lxg3놺2nWnO aꈺ Oԯ^xv(=xi7UiQYm  $hM {贤+LXG/=9dȼW?[ v5_*Yw@cgoe0]>1g wos^>H`)igtwp+G7" -ݯ0wp/)Z_'e~a֔qo,nF{,ΡKfܽ=|Ge\ho}g|6ԅzusn͖_VjdWn9;)CrtÏ6t k+n٣voCz\p/zk^zfǀ%OM؃!UV|*MʍGNeꦵ4NzKÝ!OGAA9*Z8Ʃ+^V=}>vN_x_J9ߝY.Xb{dwt}W6 >+vXאEK/w{+{uLޝ},YF|oTw'ϯz T$m}nҾu}?iUGe7|H%Mר~Zy %5Kt0: mW|_~pؤyU?ֱNKavo9Vė}֍nύFAc\LlW&&K9hh-iQ7::K3wYz/x㕄mۙʬ~Uݘ^㴱qUw랎Hn ý3B@pTzt0xTz`P7`LqSڶ^tt]|va]]J(<M؄VqnN~AA`ӡC))&nݾӴiӢ"I釃ӧ !>>zO,mF }yyyժUh/A nnnA!{hCb0 SJvĊoxorw[.J;xA"F)/ڐ^|UIյ_n;k>Iƭd(}^ RPF#Ư}'(oIJ}hem]|+; |:M  N=v]KLc%ٴ?2jp٭ZN)Nng@Ntb2yWrR]5]N Sy9䳱E6HaJ#u:fQN\פ'!?p^w7HѕMi^#Pk6D5TޖuebUDy8Fq./oz70ƆOO7b4/$?YۺuvcM6kndeeeee9g>dw_ٽo_N]ZӐJn>-̝v"Grnj[3#]e~gՅZtJڭFU,۟ w k u{.7-I#&ekA\\GpW{Ʒs\S<%۰v߳uCzdXR~[~h}=g +=#}3k5,.0V+w/_ w* @ ,\}3Ȓmw-`u7VwU&tхʤ zٌqMJ^ʷ-Tonǧ~o>ɒ{?fA:GS v$k;lrMMPx-}FDeiEnlVB|$u 2ph(w3wX\y Aih:՗ `z٭w Rf|2֘_,Q朻9\N] "\5ƴKij۳gIK?yIj#; ɒ,̭{S#:~Bڿ+g57pֳ疕׬>7h= S$y [#K76V+5@ٳgORRF}nӦM,xήh/AAaUC-8޽{ukW9ýґS+Vl|_4  WFS\)-n96aʲb1 AAg\]]ZFcs tyeG9-0L:.00}AAA ٞ*QFߥ!0  'xxx_f9;;F,(AAy|JNNtN- ' DBrý{wW@EBBBӦM !AA{f^?qD ;"%//h,AA(&?//O3a*LIfuppecq99=z+C) "  _l6-sٶV4mܠI+`8ԶACɗUU!  <8!ȴ%Fk V +  d4)f7y0B,XE2 !Ε,!ϟT4Eqqq,(-#AA AUݼh40V d+0K" Q=}OohAAhF6(\zND!{Jmj"o[yJAAA'|Őۑ h4?eA:shAL3 )65sҁ~RFlAAAhN?kʯ( ,+ 2*i~'"  k׮߿Khߺ:h4-F#*h.O~naD5{y#J2GAAO޽ /ܽ{wݺuW``y+prY!"fXԳ5Da}Ԍ"pUr]?mغNlAAyӧݻw͛/֭[?i!Vd!|Ő)ieh4^I1A((,p񲭳ZpcfAAy0 :w\JOG?~|С?VuĂNOX3O7\uܨg(?;{p, G7AyG步YytyfyyӲ0͌23oDEE[ny,. -3;3<3د~mo7kst|gdlݸIj#Z ?h돽~Ya#ߗRK?AaIN;l l>xy4iܫWM Ob)K6e|/X5loQ w\(r1~ W#_ |ǣU&Zq4I'7O?ϻI~caj[o=zT[N>},X*FsuևR]#Vx[UߗGط]`Vkߑ~.oyeݯѻ8Tm9˜_4]La/OFOrɏ2wWuNފ~з z?ux6!QxEo{ʉjٰ1n0٫wەo'ʨ@Sc`Մ &5osw]qh˪o/Tt1Iyyy?#,Z_~0|>’$*Xػ{#] a ?ϑÇ 4yWcVk\jfd1l[&r'Lŭ?ٿ2O^I&Z3gf=ŷw gkPIݔհp>ZSq**yƉ%Lߊ}2Ug{.8Zp6lظqko[nƍrE s8/~KB?ς[=䬌dݘK/ތ….hߨS4/룉':k @+g;Q<:zzaOE4GVM iݠMۯZ,9/V:hΦm^a%R_gO=jxyo[#e6ߵ2C?|&ݨSL{ɦB<,p#32ln}=_'@:L~TDe_[|ʞ+qg`O+G|xfa kcârY\7e,vrJb>)}^^;kwÏ>nR'dIČ2>yZ3!>|K/T♣G~,lG(V0zft njh߲pݿ%TogZ|a+&~Oa_U>lr&\~=EE\FZ{rѢ{./FgrGAwg=^}78`Qa:*S^iMoo0j]fU.E]o߂>z'1\VvNTP1eʯc>?p혫Z;e/䘜UTvSV{xMGOڳbo\?}Mޏwێ{#?~ŇA}>)U Z>y~t1Fg X.6*v h6kۉ7o\}?hԗfY+PdQohU^PەU>ܩ4{qƉ_yBK-ݻpoz"Զw_/|"OʇF؆3:b33@cR\V۹ByܪOߍ6MM]J+'^ؼ\y&t+LΪ*)oyxp=l͌i;_ν׮9e:~NoT_Ҏ,sճ;_ՔUjZ{gkf+ܛ>7{;;+Y&ew^Ftm?|3eY?Ge,?~Ul>߫( jӮObS<ү't[}Ɵ[sJa+U/ {6&ڡ0/oK`dh__"#y~ܮgiL,"pz qIy/pR3` .s z{FŎMAOX9z]~sm08 IDATJ~UTjSV):]aN޺8?7~b>4GŪq̲W@{BXH+硥i%Khᓗ>?/NmPBǶkK //ei罼"soWthPVF3vP\Vr 5@LJwoITÎiIEKSτn/ r^K&2'/b{TA}0[fj1:}u^ۡmQo ń_^i;uCA?ll?ܵCzt\,63!z,M0=dh_RQ4yy{2Wlܪu_|_ZY5@e6e%hLpb᎝7/c<?syM!.w;.=ɧi㿞В_ՔU ?y|;U8x戕FgcG[mV7~*QW׏no<)*޻p8ڥ]_]7Z=ѧD ШUTԡ]Sv(CP;7Q#ב_t6Dغ)/bu9pBHZ}\;[u->f셱h#im IU'k1}E!7^3nZ՟Nՙیgu_ S"S (=FQ{%y}fS\of8jg ; pnVxYѡS62֜|zCVm*8iƂ; Ꭱ?v/F_o ,KzX*)&8yf{R&-&d+w8u15t4ںoѿH}`tKoΛ/?>YUX`GckE-SQPma}?\-SLjW5hn;Z+Wh{qOzݨF0{ם݆jWz?SXoݞao+d)M4s"Jtbx\|ZNLx82\ҷe)RJJ!'B꭬|S4l޳_εwI(ص9X RYѷhuuݴM`GX+A: L6ǎj&n:[/4>Kؽѓu 썆ܢY & 0*>g9K6Fy~Kcs0mh_`X-_Q0Mm>4aC=<'s`Sezͻkޭ_hvG PU|S`lU{#lRQuޟX]]˱Eख़7xo{zڅp!~gfe_ՔU &?y Z/vω/O^' SU|mj3 ,8FY i_,[FV Sog^(Ͱk8znc^~[]\pU{-:2xTKw]KQ=RSS-*llKmD1_VypnoE+)}Tt ?y$G3ӥѥ9Ƹhӆo,% 2WOD3p^\t*Q\:AJ`\P(t7+ҽ!>lQoڶMknk¬{̜{i7@bǿ)MyESVAuDq^WWASB mx b| s{"vbNtϣ gI7?% 6#=P2mֺIj{ ;W_Zqe&)q ;Ya6&gݔ&wtfON)ł|zW9[42_Ǘ޶|*CO~USV)1J}giHQ:ƟXz_w2ۨVo}=n? 2 Nfl W7rLXŅe^a̫XȽ-n'_Ξ|oQ>ݻr% 0'_>FaFy>4K{e ~DJ!(66Jo:u~T||BV(>ʺ޾}{W(mo8eP*nЦې>~%8?}Bi˔ {(lBPʅדtX8txю"xZqX5h2tV~:nN6{-#wLݬ~f}zyȔr.[[{v7">?JVwyopK-{k7y V+:L~ֽǤ2ÍMc m~]:6nڢ+Ki_}ֵ7fTpM;ٖ~[_tݎ{Y6ר2W}ǙdM6msWϯ4䬚"߸- J×;l۰Qݓs߼g&mm>v4>;O7گj*3x=jQ6^nаQfR{l+{mXʦqsNfFƍ ۙQ>o¹;pɠ /fVJ]Unn70~s\տ.b$V{>4~>rŵBisn\JZFVNnVNNfvNvn^ZsArZzv@}aLI:Գgq }yyyh)8TVb%+=f+=J7uFG^.дh)3=}_ [JI#/(Ej1E{7S6le6wgg􈈈߻h BQݻU_鳮!B~߶!6.q\. rT#n5e{{sεkܹs^u<@T֩uak~):!Z@;t4ڴlZ0f%;dTD˱!S*dsQdw6bwQ o%O|"BS3ƕJT 9UJQHQJ̜y~S"-+ӼT0-=W(>f/OQ*d2*(sd;Ed+HwXgz8W-3B!*@SXT LF3)VQ)%ir3UDVo_ʹ3&.wpOIKo c'.=.1Ĵ[v^Q mܬ)D!\YVVTgYBwiB!rREI14ETȉ:2SB\Ch0:Ν{9^)r tGׇΥsň L!d2*QJ !(r wc%B! D!r*2Qd"!A.IhDƨ Ʉ (0MOz̰|%˸7ɭF+T&#s - cQB!SK rLQ4B("'TP*PƘ(ƙ ,hZV֞ FޢQ%DD?(4CمX/ږpP(d6JA *QDd\aW!B \.W(TC)I("S(T LL&&)YљyoP]Hyܾqf\J%/"݌O&jڶhV#uᅴjJ%D*( ko d6Q@` CB!cdU(T, %"L$42%o^Reh/WƦmTyW]U \<@ lzw"s3?&5NTKB!j8*L.8pLA" A2J沲awz. 2|*L)b@v 3K+ʿ~]4B!Wzz@e9 LN) @@F:"X޴Y3UƲ_9p˫T@&3]ACfB!kStw1Va"93x-tۢEJ6[:7;^XLe&hB!㎃.vf1EWct>Θ83DV6L&Eɩ hofh8D6hB!"(qA"ݑE֦lmrhrR&eX΁B! 1)uYi9(M3Teh[;J6b2cCSc!B E&J+\G"#U\!W(US2-+ZSXhi4r,ED_!P 31744ږ!BH9J9㜉qkk [e w1ttv?EbXsQ,3,wp6UԔ#:4oٵsE4'֭J ;30F!P5csm4gL`s(RNE&֌sfYͥ/*M0V_ar*7R3i}7qn׾X0;C#BL1sQ! i9gFF˺ hTud>~>92Zͣ^ B+Cq9'"@) YPilecwbg?'"֞~b;/[B9ҭB!LV?Ra401SA PPB)1xF;;;~/==ĔÇ>|SJ+HLJ?oԋ>۷kăj~EV0~٠&Yƕ ߭vB!*R%89΁QB@)"{PJl0t 88xْ "ouw"Ͻ3ç#=t:P,΋b.1Eo!BՈP]I4%qB)0N@JEpF%@(FI k:1=;fIygf4>^7w.XLMOLwc)#BU5JUs.R"PqPjӃbSTckgnmuq|]5-5av!B5!@)0J)gS P "g8'8B!B)-PB (B)P xфhB!Ԡh(!ҏC"U|H(1w!!B詡M5J ᔀ6EXB!%@)JӇ̠MAN(fјF!BO iHh]EX&6 }7!Bi!垩.X֏A@ s7EcB!g\=39gfѺhCnS!BU?к+6 4g3Kt30B!h ]g@3&lYf!B=xQp`_9@cƃcn/`6!B=U8*78p"Мs)9gG&aB!TLH8Zii /1D!BIK?k+9i 81kB!zik88Ldș:{z5}, ܿimWҭ^+մxvoV?GtU4woZ;ٴM]*o__4PfSibr M&]=6$Uj:ǵ첿ne֦x~?ګUej-cU~=NJ]|4c]7աNח>;N7fyw<ޒ1MkKħIIϯYe!PuphsΌ18c(r1EqDƙ1~=-Ŀ&οw:ɣc=e/(>툯 ?y+9#G~^5ЪK|?0b̄ʼK KVzwjYO3wu{wS|36 1qM5e)K;*T & 07U}y!"MYd{mMW̵TW9mO]lyXj~{⃬g HY;[XڡAr:29'19.|Zwv\ēAa{L[80ED1Dam052(jҮ`cܤ#GȧkQ Cԫ6RXs&rfV^KsWso%ߧζxt^C}Zz:wZw˜Pw%_GkؖE|>~cTLZV~x⤷= n~=BMYcWC2/k%VWYk-OaE;lPU۔}Tʹɽ%Wtd}oqK9bnH_ʵM<Ds.2&J2棵cFKh;L7蚍g]|ꨔ>Nv#Uˆ뫔*euף$릏_OtU)ۍ6.<}ԗuUm|;z&-,pEIs`obWy0XyjoypdOr׉=k;D݂&vOs@}|^po~+htSZgcYnmlNt4,)W@uҲ+y L9a&PS Z;R -vo=l`NslO_,f#錱/,ďw:^2 +)ql񔽝7|۵_Mww턠^*ʹEW׆'V)H:G(]UJW7+ǭd*_{FKx3ص<,g9;NEujo]7|zkWU!(HgQ@K%EiV*heA]!?.Mt!]~̹{/ ֥]NߖP)'wl0f@VAҍ4o-kt;89 /97Ĭ\{bK/sI*uݤwoXу٦X.Nf3Mݍmvm!o+twO{ 4U @9@ IDATWcSU|ύ>k;лf!A޷94ln.%h2˻㙦14gH!NjTBQ1iP׈"TJHk//;7o߱\n|\RRbPgX_%kخ MiJfny'DФ\RC_,MA%Pt+ݩ @o[P{7{GN7b-?/=nN6Z~~`'+.): 1n}U;{J9ٴנv.Etg𓗫)sjfSmWza_S|a~#>i >$]ٜayOW+^0"hG7v[_/1']tBR%ځEqEsf>b{]>hzLшVRXXz%%[U.Ɓi߄U]%@^^A'oN׺xBS{>Ž alNF/$Ю*e3MM ox}a~cmV^-.'1X&31B8%>^strxB[/^HIIxDiVXZªcRTMjta-w#|f0-YvhTvkҽѬ0JmNrY+._})}~ԇ4~A6:J6 N&׏W{8,޿tSbF-x ;qtwM7eSFnʂ?V y[gfg7c`[fzoѤڰؐ {ˍNk=Azs` EМSA(@Iѥeek96661!wNLH8wlbBKIoDD<|p'N$&$^_bBKkxnjnZF\wע $xt(qU߿GJ6 %˿W%#ܕ6)>W8;u?ddD|ԛ?.P y'1/>a)єo.kFl\vAA?ziՐF۔e~4MU3fћ &7j1Obd=YVE:΄\),Ȉ>!kj}W-L3ض?Qcy-9WM s0myߨIñjdg4nFuJUKl콀4>BaR=LKWô쀀wV(!φ(~LKY¸ulmm#n[szzzDDD3C!BH0՛(6Tr`ٍ4W%;;ӳVZ* rs BRI=<==< \(ζ<~f5B!TPB T3J)E"*j:8" hт (Ǧ-6 ;3jL&ɲ338cjHgWKXB!H (E"19Jau=zlZ*Uܜ)!B=D;( pN9e J#P*SysځCl+Ñe!B=\@ c PJ Js9!"HiV* `c[&l5! B!UPBJ %R"҄Ig K00Z.VO.T]Nm!BJH#IȚF;նwJK!BU%m46bn!B!PUEiJ)hzvdz2!B9p&\PNN80i0 Ӳ;}t>jkB^0BC1m-r9㌙nGFjC|lecwbg?'"֞~b;/[B .ީҌԂ"B!ГI{|3GԌ1QGsf4.ՂH0]n]Ç~JpppY/,HLJ?NHKud#?׹> 6ڀ&vWWTMU5B'v8i,ZB9g"g"90#88xÇrÇ߽{ "o߽ݷSޙ!J_oޫԙ2~5Ϲ97\ήjzB!881Ac1.3&2ΰ6# ZCs:sj?Ͷ*$lG_yצ[\:ߍUB!*FEkhQdCߙ!YItϞ=Mr$GfxvibEs*~Eq5cN%xm܈& Y;y3;8?.{BCCǍF!P äZe\"cL24Dc6-0)29 ѬII7w-.Sx鎢iZ~B9#v rqLߟ!BaDΘȘtDEE,b=eAzŒg=;շ)>ţ4e]Ұmu> vZӖ2w&)!BL Z=s&2Ɓ3}NW$G;+hR$'&.ߖ5"^wE0\s)^!Fs-IusEʩ4XBs/ pU߰Cs:ѳa2: _P_Z_DcvV|pGkwݻu3pJ!BU3&r.ڡ:D}a4"00"L4Zl6٪KIOONC!?=)6E=l)vKSZ-×Z獫fB!TcqbhQ;ԝ 8p RtSfh!B=jgQ*&opNecL(T.F!B!Zdҭ%(RJ)!RT2B!C* 88*P" @)`6!B!-B@*.;M Tq&3 Pbfa B!ӂB)((&T(3l2hB!ԠDysF "E`S*`m4B!B:DQ99NR*39B *-Q/B! @(A p`P *PRF !B%RU( 1BAT`+( B!zr@ r9 rFsB!PC^vf!B=1d@ %T B@)HEb C B!S"P)H?T!F#B6L( pRS8u"BB P !3hSЄ)'t4f{z5}, ܿimWҭ^+մxvoV?GtU4woZ;ٴM]*o__dj8Mw#\BdV„dž:^MC︖]p)=K֕O:gS{5wTJ=?s ҵOXk!pBa3R&6 }70~=-Ŀ&οw:ɣc=e/(>툯 ?y+9#G~^5ЪK|?0b̄ʼK KVzwjYO3wu{wS|36 1qM5e)K;*T & 07U}y!"MYTUym:8{Sl5BO<)Lu~L"q@;a*LL&..J M,[u:#GSz5tq8oK[-e&?K#ޡP8~M>vs{Ojdz*GK鋫yoH^7^fP~x⤷bjWZJC#zmCpr+_>墩϶p[*B'!@(_Y(9θ6zfs07zwt:*ϳӷ }G0"*Jm3 -#S)]UJv#>?MĽ ?OGjmtߎIb_άOT`oWy0XyjoypdOr׉=k;D݂&vOs@}Pw/ 鷒FO9MɊ/xtS<O%W%nʢe,[WVaŮ!z:hh\)s`ϹIߐJRfA ,Pw|حU7ɓq|zC=rNZv%ן Z;jy/־CKt}[~ۄ(zI瓼:Ntz;n|E/Z8x>ZnrvBP}/Uܢk +Дe~$M]W}tUtu 1kBJv !S pƤt4c9㜙0ԗOZf˼k) .G|֥n ǜ>wvT2[=Bӯ%;o63D FʷbhAsui1+)ñ=rJ]7)&ݛVh٦X.Nf5ݔ&ns̃|5ח5Ty_}MAy֕}7?{Vrv܍x鳽B/L+g/tG O?rKְ]%ҔNdIrᇾ6Y7s J60VSW:XnūTYţu'|'J_-uT0Ǖǁ{Zրy7^ݾMqNlڻlPջA 4O^y4M[WmWza_S|&!K8bh9992%s\n+Ɓi߄U]%@^^AtOϿw:٧_kbT{>Ž alNFbo!>8uߡ]x]Ҳ&D&D70d Q+*2wb%\{O ~|cG쟖,3n ?JefKonJppl3 n/s lfTU<;/6.2ġҿ6|2{))RwA+wOLk\g+ڮuc xSMYqs;>5 &&l Z;n\\mMUPA^N~;%Y w?G[?sФ){VG{Ӱ]C!ē"2.r.2m4}GUl?3w[ͦR &B cEEEQ;>۳>ŎEbxE< IDAT!)&@BzzdS6 %{LsgdY!dYB8f۷oJO;k6 \Addhf,f>Uj{%7QǏ,5„B!%n\oSRZnZ6aZm6jA>MB6ai5GrLÇV jb:~\FNB‚\.7xi >= B!1g C!@!2\P4ھKmޝG\91bfXDvdnqW܌%WNawtϮ+(۩ģZ朌CF0xL?udȨGL B!*eBYVK 2.Porqt 0ϙ}f)U7/r|qG>p*1UsKKj NJN'{vL !BE-(@6Yȕ:6 1[7[oUuȨaRJPH͛Aa]SO޵RM!! QVgQa_(Z eD*AW[tC7-z#-7UgoJE]u J]:g*Aj j^.&!BH)ٳ mo@0Y8ggri5:o;tR1bfj/(/- (-MAiqVWuDys5ZU^Zj5ZrUY&%V֤5ヌ]8GB!rR BY$ZF!U"2!@gFwcSz{f.d5ºjSO?l1huJkoP= ^zWPXפCqX܌^4Z]EiO@O@o@PψAy~%'B!A΅@s82`F6kFE J-;p ;pD]/d[(xyV8;8 `GAPOװJc!B!S\\p909 "g(@$2C;U>^3`Wk]禹= B!1cgqG֌1$9gNuYSMƾ]2m4W=KػH?հ"H!Bȅ1IH28  $θsƜ]FgM1[ 0z8 ֹl)a17̩QClB!K gq%.PpQĸ$I8GD#rIj茴S%eU75DfZ1ƠtVS,˲10lig4!BHgIM3&IL(sΒRפ k r3'B!NJsgJ8 P0ohFAKX8mƨq'I'75䦞JZg۶m;}v !B3sg 8J3Ip4(JffMo`y=!;qĶ~Qv^{w*oK__a~Vڶm፟A4!BڙRę$qnPQp@Tzjl5hZw<]KMN.W;nm6ΤMf7'@U ̿+}.DB!䂣Ԣ%΄`23D22&7)tMj$\=f\&. )l♭1w܍7e&غϪnⳫ#:i4B!8c39Si&Z0(NN'MvrjjZVMи{ݼ3tI˩7Ν;766)'OG]4SNxdS2ov|9Ag zArC!re(Irw4O3p~khE;'6='|댗SG=x8%_uIfOz;6<,zVudk n}[FPM!| g90ȟc1<8os.~Ӛ8qeˢ***9Ӛ=e{1ϫoϚ `} y,3 9&g~:.=ʍ >|C!y0w\NXuu+5Vs#CD,IƮZ*&&@g&X6rYnկ<D B&mM-׼]WyW0 ]m>/'hRu٨_gԲ GQ7.࢑~i7kB!!eT%t" ^n<swSkO\IGGF~:t !B.d CɘA`QBQǡ4B!t3V՛YUFmϞeM.1$B!}9e-ZBDD! YBBj4!B!q@BheY@AфB!(Z,PFg, LBv֍4B!tBɡЎ@De!\e,4B!tY2 ! awEȲ`ej B!ݡ#{F! Jl'i}Q*..yQ#!B!"QC M9reζwFI" !Bx2,ۗꐫ tȈBvʞF7apB!B.nhKٷ-D& @@`sck|&B!YV y$!quTMB!"*F Apƀ934{pYj=[vT&B!908 (K\ 2HpMFB!rc $8Ӝq% I(qoUx_qejcݳ[g k~3F!BqL39Se@$qI$ι%MeN[p˺@wӂ` `ۢq ߼u2~g|$Mb]ʽtfw閩;zhB8sT# JLbse9ꍮd+L<}%wtZT>?=ԠQ0j[O~3#/QnG?v 9SB I *_zjf˙lǭ^=RB!t"LLp\ (1ƁhW{Y3Ϳ>viJۗ8!K]r4oywpdY[7t$@3NlG:t:}{0{ )>6:zB,E98sȸ%e`3`z]m ?&&bbb͡lI']ܘ't;c2~qK;T,B=EXeR~xrⱎ-!B:Zi`K1$Ι%jdBx/9cO7Ν 7ΝWˡMh)M7>| 5V&|_''COeaƹc+ Dz.6{xvs Jl =^B!t" )r}!1Ih6RI߿lV9ϡl3|D1k1ٯW3h/WzdT;N[r!Pl?*yY7PUy"!RX=/!B:-q&3.1Dqq #c20 CJ[Aɤg͜ꤗܠv\$\nZr,!B:3ʞZ3v,1@hjh/¤׭nF|qi|c?u{⇵#}ؾܺZ@ʕZ䖜}{7 xI!N1Ƹ=mƪhfĐ+o7Rk*ww?i7gm#$ƽ zטi rʩSE Ʃ˲\zG^}{E y<+3cŻkOB!\(+鳨j/-2mBIVsei~Z㻺_>M鐮OhlHH+Hk3 ^>AAa]úɞ4:\g ˠBS Ε9]vivڥ|zjuP{̚oB7-ϞϤܷk)Wt%`߾c?$?󇪅{/Y0x[њջEI(7,⺡]빭܎ L-UΡZ}B7+XVȾίu F!ҦdJ3?d@qyl[5uwˋIi~a>DՅ?Ғ1Ӯ("ljȨ ('[XΗ7ס ac̣ͥ͟Ϙ}~CfY!c5nk2+gǼÕ kY K.Un$fnM8O ;Ցc&m7 :q㾃\݃憪I0/OLե%|k̷Ɵ.EϠ CwOO4;TSܾZH?oZwq&3f7c.X-.!K}uǢB $DdB %ȡ%ilo52`t c ^zWKxh sz GB/c'Ģ(g~L ?ݚ< ::zJxР9G^ޓWP:+䑴\Fkk SnƷ[=5GфFCU& :xcQ-{S۔^$3lQ&C9/SHNBȥO6Oʂv808s  PWit>;ץ^գ{.oe|VsmKi*n~6n>AnВ~B^5n^j<`Aw}baXޒ!t3C|Q=gzI'k%E%a~2Vrʤ_M'hI:Rpx{j.WWj=%itk9lÆ{9ͷN[Uށӧ_lRWwc {)̩~AӦ@[{Jà5muKe7?'l {";xh9i/)m5ZrnJ)[J}zӇVTG'ЄPL7{zp3"hknz(cxA!A:E9'f CB m=7_V/?Kޣ&\$m:{\+q)lwΆBdcgqG֌1$9gP鍎0 r=ݭ^ȭq2\8F 47xHmLJ v^sAN !7!NqTVuF;YGWrI2,jޯ=wa?4\_wi\9Ok?Jg#RvYc>[/P͘~;0ZXu#5ʹɧI;]iVyclpjB:ƀs&q !\(P8GDB0sZOtAtj{3qz]kg IDATT $;$GǍ$.nZKK%-W]:ZUdBΙ rS~Ϫ1}AUt"+y1X͢i~eg]*>kzcvoLOsViZg~i72G3BC9aoLxXgƅ~:_4/i F9V欖ʷm+?~лQOO MjABl8s.qs$e&I9"KRF8RI*EIeeeE9C8!~p*.NXa01q!=u=eyz3g-˫sAI6'Wɢ=ϝ(lwJ9]sB+*yij6՘zM;|s|3V\yV$ eEN[ oPL3p9ԯ?\` uY~_bqjF.NBH'IM3&IL(siE@WnݔW̻ѥFv_}Bܳxuen5k`aSqDYvM`ϙ%[6&ͨZخZlLbK[weQcgmszv4C; V\tuˮzPXyE~'t>nÎa*wAj[…S# (=МsB #ARIg &s16pUᅏ6kp7[ 4=o0nPd=?P y0mi|PRj8{xxB6Vj{AGzFw[UJ^gɖC=s9W|Dp}7\&I49gŊ-ίy]Fe>~ gkO  ,ϭ_v;(Sqw.ÃT._h ,ʱtjB:csq`((q$& AZ:Z[uw]ttT_.qս *Һ?.E8&&L74@\7 6y=cvN Zs֪m ת-#\6Go7j\{J B#r㓒 {T`G 56Pyͺ>}ޯ6echʩfʇ*[O5$qN4;1wH(k<LJwuTZˆ ]V^К @p3uPzE^蕚ݱS#(+uHqIY*393KqLmݻHCzʬk]c@Xfî5"sOnz;93-ύZpm_kk杅 ?="HgXSi_<ߚBcC[е 4ۘpA\ )z>5Q]*7ʅ@ӹ6K3'] Owʂ_vm=NB5g M~90mhbւ&Fk3S+=:ӓXig3|sd߂+F!䒧Ԣ%΄`23D22&+P۷o:zl2@AQqddhe...>~xdd+iTuc߯_R&B!-s+6a6YlVY WT, YhՇvfG\\|@u#&&"ho茸:rY(&Bq!i{8 yA7u6!p75cIB! g90ΘJ5 #c#mZ;;zB!\vg;h !B(gq8`)1" CgSM!B: ƀq\=3f " FB!Rͱ$tu볒=E@@hB!B쪖FG(@(n1@6ϫNw~!BY+-PɦsTAhB!BBɗQQdt(&B!"jP2fžG(@ 'QS!B,g7ڞ=J4]bH!BHrZʵB@! ,HhҾf?o]m4B!:>B!PVBLeBr4фB!PjѲ@ўE ,80YBّ[7:؊On~~%6.K62|ܬ]Z?YOn>c߁>|Z?۠}v U-=RP֜>O cx&BnwМw7iA맯t,֯Gs\85B!6UuhGUZ ʲr$i5UHw\ǩV޵{ҿ~hSb`}$<Ѯ]jތLzխ Qm~դp8תeˮz'r(}5ŏ\g 8[K_e}4 U%{_G_ڦ ܟ&,yw^fj7T 5V64pׄuih!K=mBB],@uM^Y 󙯯zKPş@ M'?@˩ϟ>l͎c/}2Ѿj=k_q+*aѻW53Ti+u|Z4*☧_{B#y- 1s2Ltt-4.!K@#{F! Jl\liN3 -2O3F-ZuMQ.}޷r9@d>||z_At^?ſ\]kǽZ)>YCϟ?eke)QU<`mڞmЏ){.>om~(;8ڒAl<\mU jҘ=E?kdOg7M:.!N@ P:"dYv,avF_i{fo^4IN+,I޷SO+g3s w}3`=W՗{wp)tѶkG>e,(7w=г 'J`C˴m5|@^Ȟj˺c- TZǁ]M%;_woN題)' =ξwׄ!z{PX[;$/]~(3J2~p};W_~$SήZ?/yO}{̑rjB:BFeReB!dQ8T 0X&ڷ{yhtf?!u*|O-yx 5h%XSAmzv@ 3jnLޙ2wfrY^GV]Wer)/ܿN\˴ujR(qsgx9)7Vx6wφ}ee OY@P͙~Ԍk߻oBw/֫>Hm+p}cGk~{s̤_2i__!Nв};(d9ӂw,Sھt^гf2(кVm˶.Y'[X0e#|s7l;p JXz7 opk@Kc݊ jF(D>ͯ #o}͙ /|zʙ >=kqݭnJ5֣u_tWOz2zovmiHB!YV y$!qΜTP D佳Bjc{}WҪ5?īOrTi#!.so +O愍bRwz6$@Z-J`kXҾ}ˏ}Dhtݛ/̠ƲC%)O^8ƿKv ǍuޭՄw@(eN[C*mu!tJS8p%9g1.q3IqIU/VGN̯V=FzzzϩyVƿGxl j免PY&Sst)^KvX}.X7ZelƜ^$~')eg[_^@')\ n.7nׄuYz+7Juμ܎oNE_nM oЂ%tOzEgbn\sڧ1ygz-]^wxzS%KI/x8nʳwks(~dY]Ηjh(Jcfr<@H܂nr6 =ŏ|3b)={潭YtQ-~w9fV흅=UVOBH'êZ8:03$.I\b4]bx&^b›i7y5w"g#nA{oG[QO8nѝC`<9xl C/t}pw[ ˼w-g˻/=Е{oeA:K/eIG {BM7ʅ`Q/7g񋏗x段˧7Lj֘-޲ꥴH|^ͷsTeVȍ;n/2a]3=>v?xhs6!=7 pjB.yqT# JLRe9F۷GEEM=c6822h42-e]\\|Rs#QCw~vxou:B!.y9s++leQ9 5Z# Ϛ7|8?ot]VtB!ąwDs&)rp\bș0-1΀q'y2i$sj\npd;B!Rڡm 8sh8YK( kNAB!\jALpQ r Idc-xG!BB)FKq%88c q^4cN04B!t1gLPJԌ) ΀hB!BR3qr<7uPo4!B,0΀s`1Q2͐qr4A{B!\+R=mƪӌs@ cϵPS!B,3w$Ukr0PRg@DtESM!B: ƀqVueRFhϞ@DAhB!Bhh?P5B!Vs0@!r(,.1$f͚fdɒ6 !BHXݹqKij4!B!U dJJJ4E# W4%ϟyl//1 )Fc4.K0tjcz{2Ƙgi}wdMiW?}_bXy&91)]w֭⓯m?mn]1gģq%?r"c= NQ>c~1`˂ w~1+S;،v55QU܌/K@\t`嘃K&-@n}ʲ 'l7w3]y҂P5Y?<[4*s~XhJkpjB:ta9 !P,,@Y(,P8[ :t:7wV~MJl1WU7PEeN:eӏG1&L{Ngmi}yݼ2&l<є䧯" _z$?-pW,9;}6n3f? 8sٲ+^-#B.BVg憌]{lܽg;6 ]8Pc xǿ4a4=1ީ+Ec=|ԭommA(cP5F?to;[i1VO׵ esc ĺRVNBH'" eaB,, !, Ymԡi%>P%/MtLhh4^ͦRˇ^q}ju^=23m6t[ABB!Z{wRrZ}/}_>sHY?OT4 LJ^>]kXS2 >'8mfpwL::l] ~U`zF9w'YID/~Yxu__Pgbߝ3,rsƜx`4ߺ?'1 ΩU:fOsw['B@>%%E6m/tss3-99yZ1tS4طޫf dSn+և{̑C+~{l,=1ur>[^졃̹bv)(n׼V֪${͎)ݴrH\H}It3B!rm]yK ;ߪ|"^frCBU&|rk1Ô7Nvԇ>0}\ݵOD!R4=+W ! YJo]jd(fq-tEpw>|,۷5/*.Z2g&M4xFM\^V}' !Qylv|֜P$xz)Z󒋽-ɥG * IDATOXysިgFX,J9] @er.o^ZhR]85B!"ZeQm̑mpz6Cnʇ_CX{m YiSjpPrWݞyz^۫ !ERXqݻV{geͫnhJݓve˭D7y7c7>V;> z__rIÔ-M^zϡoh_Ƹv42usln|"/f}J>k|ͽWCB1o>r׷&3Ev}7/5KhƝ+1,*rzs޹S#(ٳ mo@a_C$t_ۯ4jJUPPkZ@ܼ'NxFDFd Voc6?i yC @7=>-\4?#Ezy~Ki~[!InYu`jl{K,i[\ߘ^rT{)~L2Bs?GRc.g;W r?_ |Zծgjլ1[(M%vS9/Ի_1>ڕ}]V_cf?H,X #|ش[^عvs!\s8MЈ\%!"$.q$f۷o:zl2@AQqddhTan3ɉADrst:mzFVxXH^9{O#Gzڵj*((T鴓&Nq,...>~xddJ>u[#vy;L!oXsمEe6M}FQfZz E@""bX EE ,XP.@ 'w3c/! cܳYyvnvFJ%.Rv_nXf۳o-xyymݺ5**j֭v"lmwذaC#iaaa,.)$˖_ #ظwn9c;J%̽ Șsb⤔LI48FSэΝ~":PJbR1^al6ѷO]wyz9r$.>>UO604URJ)gW82_MC,B<)%)ohۋPf%6.#=< xhpnc7z˪gw,RxR)% e;3*4K#bwlfABþGO./_ND:Хdڙc5 ɉ0hǬ+%K寿+.z#qY?޹z]SG=O= SʊDF?yp3⒲3|<{{ N%T]snP(->rk]W~C%92 -A'>3UJ$Bo4T<zL_cڣ'iˍo3f_;Y,~]F=#."Aӫz?zg:S=کeE*gcZ ;[>Go 9Pu̹C*n{.b3W6*{vWJ%RJJ"%U(`z;#L_r@#,ܑ[֑&,v^@ok.H&/Wޞ9aH.3HRoYsu{okq.ߑa9C0a'Lp'Mw*k+)0y f=C0j&rmK ѣ6[!i;N[f2&xP۲*?`T^=xт'5uU|dco7mm qS\֜%[7_buwY׬Onk ~ӜJ@ )w{ K;Kh{k2gߗM 7#"C,Y<ݾqپ"rxm̘I?+kgxԻw;>Y\G2͝_}5 p;9xHIw%@o[hha7PUCO+ Яk ,L?S㇮z񾪯 j %3~s?WZ搬9w|+ {>-Crn͡sMJe+E3W/gh{?կp䱸ޯa^]=?3,F>%_5@ˠIU6èIJw-R %Fgǭ|k򅟵UWzw߻OPt=cg׋Nz5-_ᚬs#oWOܲ_u}zuj$R?Ue]PJqKYA>O_n?9JiUY3+]G+pK:xP{lxA}YTkՕ~$ׯKə B*-;9|hjKfm?􎗞<áoūZֱʯ @ ,LͫPIyE^a>:ҝ+Y1ƄU; P=lƽL<򣾡4 -<9ZC:K)ƿz2lb?.nC=1q/RJI!TRH g)Ga+J?_Y8|{J:Vs՝=\Gr]N]);M=j AJtfeB-jҮ漳;?$i ~ѿS)p_5>~xaLhMUS͡Dn⑍sb}bxU3>]UJޭ9TBia ٍm܀-1CIR*aL-RH)RI)uGGd.RNNN@|--޷p3e/@㚀Z@y끷? Y*o5-[U }~:O-Zd|hѢ*6Sacc5dxFkjϬ{Zzk{ꂊ}76{T5ΡZJ{ƅ^ Ɍ߿81]ݵ'_]}l.yo>_԰'hq]<0TB)w-T$ĄRJQZ[~kߔHE?3q{3uGnfnY7?D}&jgۛV; w}.{;|zXə~4ǿsIdU{:.Jv{͜MsY1:k=tQy,n;l=St^?[/}rr |s\VUK֫1Tև^Ċ-NgA¶3oQO\P,XШZ^f9y{?mw:We?;__<ЋR}mҵs2o}qBi0ҨK{RBH!]ѵFC3ѳ[d >}9zzlt9l=?l|\AͽhD4xё_o r]re&:<\|+iS~n}1yӧ{><ۏ5s/5Ƿ-G*P w^|\"{US?8stPTszd3V~=ࠀ7yua۹.]nl W1eI\8kځޞ>:WD7=z>48f!RH^wE !ۅTA_1bD\1GI ef 0XLfsrr80`#y ]|N\*&$)R4ke4}JIb7iRJM"s2X[ P"#NsΘ1؃s `0upN'NJJ׸48'F1FgqMJ{9kK%5+I3jetxa3RNNcsq'b\rIRӸqJ2X(଴Yq$gLi 19gJ \qal4@)ƈsq&9S+RJ94$#RJch""b'I8'׸ƹ`LrFcl4qfJ)I8i3kRI$چtRe3#I3JiC4q1ΉAsYvm =20gq)ň3Θ"bR$cCѧaƍÇoWMd8ץ?[6ܻ _֮]kDT{&ӌ^hKSICF1bL1ƠS7bĈ76ի̟gT/ pa18'b(gKt:ei?~|T*?෯^CzSc8#Ήܥ53?d3FhѧeժUue҇C^'nOc[}gᯟ1*܃1fmw2D'zg¤oeܿ)a851e31vwڸCNj2 >3pZ/;zB W\9/yyc|aA; ^ΒrV XW>/OHe(oFDt=$AmDD2c^zu}7%tH;tF !.]pӅB"%j2tmܸq…6l&LC}_@Zts3{nҳ 0ύ 2>5pnp*.pr.t].'׹RRJB iٸqWZUsÆPnMIi;QWSI)YT>ohmೢ3zфy p%NK7H!.D5&RB.QKo4F:DJ;cl>EOswxZƕ+#_#*:՚VnQ_<䣤Z.]+g߬]Y p8ө\?p8Np8.\q~":ǎyydddyxzd%1lbnb[,"hզSVHOm|*tFoN R~ڍͩ#و%jI'|MM ;ï~_tʶ4kB8]BB !9IJJɤz͡N>SR!?uF|CG<[\X Z̎G!tm2Bߴ}? M_=SSްaC=V1tαw آg=ĺU3:mSzCg~ ]\V:WRu-2&베pJ)TBJ)t2ƤJ*)%ct6E[|6v5tH^emuXZUJOt>t$n?ȝN'u㩙yvVVcGcb:vHHD[ ܕv8~E1%RvmN Zc$mc=\V{-Wpnt-NE>r]ZO93h07MB d%`!cz,z_ڵkpQhz?E "")U¤)EDJ)pgVk}6C5DӘ=lsoooOߠ禠!.rAuH)ssskՈFkV79yyam:VSӴ|2XuOOy4+cfaM[\S}m\p$%gJ኏O5i\31XQa~~UD)Q_jDf(ݾߜ0/?]0 ۶l\cE>y9#Wdi9yN:AAnڒ1"FQBy`UF/]ILjKHnszgFxdeZiTb3yQtl'dsKH q**ra,t8r %kW4[9%8My1q-=X=+/OTAWJ._s)zzx{8DQѸ㌱Xet@T'?ԥgpP;QnfHKMݲ?Υ;+W,d,^35ӜN{xxkdɒiӦی5k[RK,@R\\玜N8("N[  c@(Fffm/(^>k1FD)N|[9DD'k|ҏ'\F?G#0+ B‚<0 __߾}PC貳]gxxD~!ŬM&Y&MLIӈRJIR$TR)%PJI)TTRIsgqgeJ'"RNWJjcqK\|FL#?Gȿ!ׅB*"!R*%4L^Zgn۶mM?1S\\\~/KMj5M&,4Mfe"J2TR))PJJRIz%iF9g1q1Tz>V*IhF|wX)TBEJJ8RU?B|?G#ߥ.RJ(]H).dJ!9t}0`)iDTRRbjxnuPF75k֬˗/Zh=Ӳ,fpڙiM)w I#)HJ1#b5$KJ1N4RΉ)J#nS$$qF$0s)1i<HD|dg/J)4?G#ϟs c+)ʎ1k]juڲe|I&-XˀPFnmÆ D$-III7x}8ͻ馛NާQXTi+8i41EJ1IΘ:c$H#Έ1Δ9'qȸ3N #262FDL3R*DB1* ÓN'b983s#?G ƹ+$)#Hi M J u&M5w_uU_|EHHHu+A}bbbƎd}ݱcVu%/si&fҸdHI)Rrb1 1&$c`RJƹ9hJ/8cxAJ1I)B0ƄLIA1&*όȈXv">G#/iBB0#bd'")]өӈhƌmڴwy饗~m۶K)2ԭX"))~7Dt!ȡ.]s8\&͚l6i٤Y̚RrW1CJ")#2q"pݍMB1RoH;rY|%RIw_ *w|?G#_rB:)J t04"7nܱcǞ{Ǐ\r֬Yu)QFI&Z*>>~޼yaaa7pCu{2"͐2RR*ΔbBpRirnIRN(0cRIƈs.Iq%"ΘsHN(#")YeCiKD9&q1璈K\d#E?G#$I")U(?:/_`"ر P>m۶]~7߼cǎ+!!aƌ5o\kh4n2iff2-&M4 RjJ?qJ)Y[g'.2"U2+)TJ %K3frU#?Gȿg)2f DKE)N\*[4Ԃ ^|ETTTԊ+X >-!!!}ݔ)S֭[z뭕u$ 1θ5c;"2.+\*ťR8R0$#bL3b'\c͗!bR|ӈ3J2NR2RI&qq|19'b\sEP[|?G#_RIMq%S)D)ƘRU̿Q:mҥ'߯(O̙'xzzn(94lfSERRI 13.]kI5sFƒTnTRSrR\0q-9w_A^S25Fs}XKW?G#͟.kI#]3)1Z^yzzZ;gż@Ӵ DPJ=LTDDݸ#%+h|hBTB܃No4z/ m|?G#ߠKB!BJť;Ϟq0fPC]WSxnXXȣ5xJШ9U>2 )q;3osg;g>TRR:TC'tn8RV;Lvus}С0^(}W͝k,sQLy2=ڷoߢ"]כ;3Ŕ)S;3h HuI+yvv/2-Bl6(ʾY}}|KT,0U>d&)sʯ+M<<<ߺuN焲":~=UJayyy5w gio;`28III͝K+((޽{sgqٷo_sp)((n, 8w (X>GspuoKy8w U/P*nB8SgZQI4͝4MJ$.;nZ[hE[,:+Vg` ^ՋH\v| UC$.syaڂ[Cˮ3jR}í͝GINNVJ<'~KzWaSJ6߿ǜ%Mҥ4MSJ%''׺G՝#qGzP߈3}:wd|b#G9r]~^Oڴx,PF7%}:v z)OaaBJYi#~KjhT:(٫n?tujY8cF@jVvvvvN-ԩR^TTkf $uk)+:tԈ|.lg4wFUGef p{^^m{uKCp ;֧W*rWMկsΝv޶s=K\=8s{lSXF:p:Gu:WFL:%~AS7tMǯ| {<Գ+;7ݘh ҨΝ;wu, |k/ݥsΑCdK8܆hHhsڪq0ƣ7ۥs]ba2[WLc>}ooӚ#$ByV9[߻sĨif<48nB";݉ʌ䅉xoݎ};~Y<61~s>cϞ?Gp}9o۶=zzȱ{뀃{~;~zsb鷽~V"Uo7ٿ}CܖF, [RCںRz{}I:tp[s$Hds嬽\W:[pQӗ,RP|yќF|x[Y}F{xSD"˴we KX\KzE>_t?V~1}vr˳_E-_w373YMo ?qeef36 ݟ>w>p\;r;x}Ԁ`I6hW!TcQ[́?ڰЁ-/1Mѻ.ݪG6v͏uɳ|gڼ yޜÛ5ߡYet؉gfR>\]C>FuwC#6o!Qn,NsO=[Y5GP5@ޟ"bGؿggur*9wޝ>[ŷ0וouʈX?e=?G=ciGβ{˻OZ/X|(3;;;;;BrGvzI)5tc;_+#&-9deX? 깕:u1xvvۃ=exuR[0,, "=/S1f޷SwQs]ռ.n~sܑ H\*uÞ۵-vgHόP~W9w 0qf8xXxnt?؛>婗=Bz\U/nT62ZόmhtϽs&oޭzi;Ҫ-E̩ͳ3Zd'Ez5ڝUzցêSZO_Z>CWf"3svx[T.ͻwD(ݬ%)y,HLN\5)R)_3,s^mJGvto`7s&zg:kz]DWJ—sy'5}w$9:J$ nvJ3c|;!Yڧ+3.߯CW}vwV:Rt"؟ 0U#qG};w.Aj;4871K;IόV6wܣ+#&/!U89ܪ'z~*ڇZo0lP[=ة%}΁&_w~P= /m.2*򅊏1h n$yt#r }/ 6}g4$Whxa3>8-f?O7ڏ;3Z{k ˺YɑiBy>>5S}泡գA6סYet82Z&PX+ }3/?#aWfАC~ׅ=wYwKnlN_H3FTdɋɿVӳ&~++uoG.~ȕ#0U/ IDATcAKx}ɥ[K+6YW~J1oMPGsWխuz_y(5zkW7s䲝nzꩂmo3۽zV|[ܹ5qe9f]n1vi1U,a,9 Ӑ:year Z]u5]/has)w׃#qGzPʝ"{Ke-L$܇PmAF\Ǐθql/^6a6Y:J\qw1裬c}N횭ݠCᄏ!PwGO|?xp G?xmizINo_zoC2"^\V O7}lU|SI޺SGŽ~"roMciyy[sc\UIƷB/OL)2{:Q)mymC-w%`5n{u۟GH^ه>mICzwu|_|i=[a 19^{S׭[Wߦw\٦>0:{v2br:4Z!ҭ]#"f=n}\U|#P>OP+k4qhXw:/qC͞}np<Нq[z'~L5n?\=O~;V%Y6wrį~j2sx@皭mTp1T<4G̠-Dn-y}T/-%S^o?v] 5\C*qg4xʴ2rۃ;hsr<=fssҤpAùs F=ke99y;B5w:"xxxzyy=o7Zys 5k4ZVIK<.d~Aas-e ͝NMZs-E<*iqe";;}E;hIǏ'h4:k\p>)EBBB\llNNvQQQQQ!yzzyzzڷof-\;Y+CJbh~-78נ\; EEE[l>p8R18wZ]v0_V-\;Y+(R ]dЄZlkùMŶ<ׄ[l޵sur9)R\4bZN];ߧo ZVѤ/p:sلks N8sMINBr[jED RJ///ͶbtKC ԂƔ}h?u[=pu:EEE%%% ֭f3< FQ߾}wڵep^{ݸ@̵-K .5ވ⢢Tr!O/ﰐ([;B15vJwM߹r5WӤ$mzBK RQtuAAodaCAm{;X( G3fL||R84M=LtH,KFz0 seQKQQEb@$X oP$L>0ES/**pd{獜<9xojj2LF$n1i:,9a„|2O?0|Zk!ޮ@/\(L^!yޏPpǎvJQ0QP3Gحbq{{}8;vY|[}m[ h};q*O;J}|>7eC+`bZqT*JZjs!xۍjy-"kܛOQBBc,J "T(&Vu7u:=FSVq]0=OKNxzك́/}7Ld!s[}2]>"+!{y,7sQrԪ;a"Ӷq{uEQe) M#൫c c$>W 2_j'}Anw6fz#*zIV-an1ؽ}|ifJh{i|j˜Írz;=ءuI ]/|Z̢["d׏K3۬ċ&znx_>d51]EV͖uךl{!LñieYU(&%%w|CZ'lKJyA6͚0?8;D/r'4:#0BQQ4EMQrEQDe CzZzzz6JSTTw*y*dT)wq_Ժ~򊏧5G o^7nPJ&S,/xZ\'%pQEy?ae+ +>PrP[I8T5Lޕ+%r_5+?{ _Twooް譢@ʇ]w s|(>~۲ e…n՝$U1f(է⤇c]&\9a E:L,RÕ;}İ}Qk|xC?e>uaũ6ԫC\EdFGEUnɤ֏cLĄĸxF]WW]8UWWM6m_(7`{'x}+^|rC?ݟs^qT?BgsnQ/B!o3kcW6+h_f*fORfZO!?B؇nHa:JY _}k+?[nH =~&<|>-ڤѤl6! .U0ET٤իM+?.yLN]DŽ"\rN#׍TnM[ )eBHĀ`Y6666--]RVUUWu2i/` 9}YPM$ iYl?;.c:cD+sfK8OZsͼ< 碩vǷE>vq|SuIT[nmM}׀[*Kg3jfȍ( um(jc;fOO`O?%L>ShsÐ.Veff"0'OL~emzж5q /,]j6!ó޼[Lj~g 0=px }Y2S_1W<5;+/́\0KxbዖLg0)ZP7> $jp`W4ByyyEEEuuunry<%/ ^qHӴdEQ$wCCתZ"MhugcҕXA)f'%*dѸea-=ES4*8N.s>U6i,/y,uO;lSֵu[TBmjjmlhZN(j{G[W8 (bQ @D&mo,jn%Yn%)f9(⒒zW sNk jZ$nO0ei{;T/~YՁ:;,6&vmOc{"OqG XCө !f+wjж{n'f? 7ՄL`Vib5FgQyl8B%Я 㬇QŚ4Ng\\$Iђ$]Iy{oM`AQ2ǏqisrQ!V8\gWY=Y2+El8Fg*F LE_db_><6w;nLf4Z\+^CYp Ne[B555Qxt'L=+ N,u[u\$ju?(!1=jHH9 R) 4ieYUp,Ky *Jo%Xmq:;n;5&6V4,Z!Ds$Hm/Hߜ}JhG=0k`{[mǥݰ|B+1nV!QKVK_uF1cpŖe_|#z(Ue)))fԩSd-d4KJJRRO*~WonJ]7䶳z` KiS7!w:cƐ-Kڼ_-Y_BBɧ:۴O/KU!%W>z_z ;bW9&g_D5o^ltMV1(r I$I|L qBPTZVkYBM$] {^;[@ S7U)BwaBE:|g竪Ǐ8R?]3PRJͺm+<W_{wk%C)b3 %/3r򥧳%k^ n6:%[(nl|'7Rc_߸ eʃye?4Ɯuax-q_x֏鬆!K@/!WL~(swO=|-QnV'DgEiJJyv RVV|sssLL^/--2ƴkɶw8?wAe)7 Jlѓ[=۹n>.a|iO$F~O޺rۑj z={瓅яc|lM1FfbY7&~3M.sӐq*[]8-!aL2+M pVVS5nGkҥjt>F=>~|lHM汆smBQaNPjANjOaQ1:5Q.k'sKЌQI]ا?zp !t#9 =O_4"خ~\q?<;Ӳ!B:A5dod|=%7Z IDAT5νsuEKE7#{xT`W3:o&qT,!`_B\[eS2AcS*u;!7aHYiqBBB0 >rL&I~cXz0ޅtK'k}KZE[F LgN}_[9P'P1V| {JF_ ǷmGώkFKќxn?&E_BC-ԏnyLZ<>i6}B7`S5[Gc)(( ԑI6HfT*U*Zh4$$h4jZR!t:&9raq TCbs_Xc32)XsG+C:DYdڳgϤIJ>B(j*EV 8QP8zuF?|q熦2g\R)IrG}}(bR3 :&JKQtgWM۱mIMv=ٕ۴wR OqS=+Vp"/%9YPX,p8fBZt:өR1ko)ZW755y<)Sƨ(JqsۑREI$w!/|MMM9997n$=Oxe{׍^sO[zϪoF[!*+B**19/%#"Q4F! !mp5\$a>5NR4CFE$oUM}dv_3~졯F,^0exN-^'q]r&֢eee6tbd$l6KTQQ8x<4sAp^nBu0G\}J2''gȐ! zizժUm Zd G yfJ#.&}h crz껑rdkAM#BcH$5^Im5>sKO4v~Ai/^g1vBwbJ}?(B(;;{aa=|:8^PBQɝ}>oAp7%kjO{'A=ѣ nT-!UP1 #vQiW?O¾l75=dA^eebq8d XYYmހ),c8m;yMՏ?qJ"3avTWhEqH&9yVef:w G#ԗ@wu/q{qE8VyŦu:Z!A-ac KIIIyyyc\ZZ I4 >ϋ1f tJkgM=q"HVڵ)SfQ,Ѥ:xk :''g˖-jaĤ˳BrN#cShL1(MB $!,h6KJJDQ$7 "1[z>,{%b}}=Bh۶mۂ v{ P($^vmAAF!WߴxI/\Y@osthф1’$I BmabЁ}#F 8.)9YYt:fsaa!EQ~#co{`/}[ki.//gg͚5~xFCz hQݻqFZ-˲ыܮ!ZEo| "(#"֪ΚښZBBe%Nb@3\,Ιl9l6S%4Mu2Ѩ N/xFQ4 êT r/0lFƠAaց2vdF3 u4/_2^kdAR׻Rei z2dF4m4Ę}5p4/o6db 553dk.Fi4D;M厲cz:@t:mbB\ }ykkg3ڑcMӴAW*cc-/4NUzvF#hhj n z"k @XX=C֖LhZ=b @Oo?< h h h h h h h h h h $I( }q tΝ<|>h6#S7(РR EBт 8qbȑF!:ǨjF#X}7RE~xcAP*Ey^rڭb(MMM h [$4=yφHILLcq\L)ic i4-NGr謬φƒ &?@rӧ\!tMz%I`111 1Sԁ7ȏ^oC}ҡ'ci $iFg! 1c @n:ˡq!鍎d%C:ˡq!EQ72i s萗#5oCw6<4Lrhf;2SdНӦMm :`h]b?Ӄ)UT mz3f /|r3FߙCSAÆhCrv3/MӤj` ` EMu(䡪ʊ; HLFt 6㸚jBA!rvJv [ٳJ|j c\Z昒E#(JзMrZeB-ٽ[hQRl;'A|>m}˲&MF4زysm]]/ h4.EufTcᨒ4IENDB`marionnet-0.90.6+bzr434.orig/doc-src/img/menu.png0000600000175000017500000005140112167200764020343 0ustar lucaslucasPNG  IHDR8UosRGBbKGD pHYs  tIME 9V|tEXtCommentCreated with GIMPW IDATxwxۆ-FBC(iAQ(OEb XQAh"JE:Tۦf7&l%l¹k/33R+@p# "I,BT؉j%$c.ڬK]'#=3C ,˨1Opj*QT.! D`nbU G*t1gd+ƿ=u(~]S_92Z\ D(`M˜II5ۺ)I*G ~wDpiN} l8hPI2:7nn2Z:>K$+tjqwxDUUӿYMd-$)E&qʲb#Vg ռ̴l6h6.V-qxD5O%I* [m+0VQT "c4-4oby)@\bFMuԄ؋l\;mѼCU?5 O*TBdywiDRkuEfVN_w6]kwDTvbQ,ڢ66BV Z"*~\6\V$ٞ@ RDRiȲm-_t1y#WGܜ^T"BA*غ[ٔ):M$RSHKI&66hа![(*^G55$H4mHԸT8xԔ(RKsyRRޡ*$'Ͻ{ؼ'PA)}oo#ƣuxHZiK6mm뤒$"ETX-3F`[*TDYf%^/ ZjMCX 1KQ\'j-hydOoHF#Ne;jT:#7f Qm^Fc: GΘm&Ze4RMr!&F=]t:$$AO;RdI ˅bZ ~Ær Oz~]/W}NSIccZkN\>ʨ--bC UjZf5j }-i$OzF;hj1j$׎֯=^! hB:TшZSYL)_-~~Hg.j]a\ǓRDmO0|H7hX΃E$.]l7Jȫu*c.9|4ZCPM"YtQkݨS>UuFlDX $XzE۰= rs^6a/* EA-Ȳ.ZMjl:~ZbUTQ^C_MY  ej}5 ֪NZl9.o5pK}SSRMWsW%dY"֟'hT3u0[,BŎp)TTLcEbԻhZ\4]?w)wOj,R䩌{hUABl:"T'Rp'&k:[ٸi=P%*S(`ȸO6 F`$!5~X 6B={_C󦦦fyrU7qcb>bѽhGFVĪiѢ@ F t1UP zy.^D=,ڥݶ}z/#ժqȨ2j,;mm0@~uH].^8/AK}2a͚wr +{EBwz m-;>"sJe>bb- Ԣ$fVpvwJ#)=}MZ02VoDT)fa-9gX/ŝ"6/G~_WE pU U @PER_@ *nP#at71,<lHwzAuS' caۉζwA;Hs秾*fhfLM gl$1L p:-ٙheK³^ R:fݼ bJOڥ5a8t bצ\gi,Ά/.usYphЗz+ƺzAuN}wG%,X uѠhĬ\̑,ϳhD^I]il{sD!͑ѳ( 6 Oz믓㸽!kYy6fa(R %mFyE9kGfXx랉:&^@O BJYζRR/Uk^QU[xTrq.H}!T@ *:jUVCF1lkb{9d$M=gܺr?: #>^̜5=nofDU> Y~e7B11a繲TXNWuFr2A'ck=ܙrr}wfR MxS_}n.EuyݷeHzfǎԩSn ~|KK 6:w<ы{kFJm`}rȿ,^ <C%$["YP4Q1K'lV6G皜#J*ӻ{9mŎSK~xM=jyH@.qNqVŃ՝CR2. 71K:5HէL|Sv{4)r0퇼go=@]Q33%)9lcQ$#:sYd)yFH/OIzgC ji̢_{T>Mxe]f}YWt~m iȗS#9H>`"Y&R6}7'Ync]LQ}IuT;.k#njg3k ׄ^tuwԲI}&~?2\Tq;GRXs_O ǘ|17Zz1e{oWrrD|l2*YBy x.jMګ#ک\s]H/ǒ!6.kmHqnv'䐙p_FǗ}񗴴xpv2~GJ^>dBy|@RT4cѱqt,qĞ=/sH4 #P<wcza0:a"'cr8lg+:V*2YYY iظc_{|C>Fܼ>B@%I(HmulmE9pE_ѩc V-ljǏqP7 ݻjppBJKK RNs4kԔT24{9ñж?^yne(v:4~J^B%jLdk_K &pZSBs N:LGFP l8r'w,#%(T}CuELFiyf530YzeɔGzN>9Ytk I{Ey!RrkWC` kҖay,#I*TR%u'K`\ .ͼNL¿Y Q'l(:K mL(`r+ql: h]0|]rS'I- U- K׫WjStz3jdIBT2R%5J6Wl\3?7j"cΊsvңNŽFSi?Q'߻P*<|hա3mu_2L;|іTV<_#^z~D&r!64 NXa73歪~\1f[D _lr/$cA6QPZ4|Q:}c^`MmLZ=E'ZMf_"z`H9(go{gvg}<ƬdNb_8&DVuyp{#L$zk c@Nοe\x97T_5YZgۛ]6ߝT_>%toX3O?/}a8ńi ($&%ܹl?"CiD*ß߾SfQ\3ߙ)~?qwij&ܨ-/V PS D6ɬ݊@p3F*-8L "@ uƫTqDDP@ *PAj&GfiF1q!R ǪLY ҨT\d6y'"ȏȫ6Bp8ƙcje33ЪϏ?1ٓ7c }7bė8px]+ 'F|Ͽ z}5Ae= 7!wWAp˾3ºs*Z ՄF#ϓh?RxSۂ4nz + ,z_"kӛ1%|b?k\$t\¬WҵMAJަ'^WM+=}-i"Gt qfF=,ii.V*y;rEi(*o?u _>\mb2Hh@`7f& zeq<1mFG:yqsmnf{]Zʳ}g-/~#i\ƽ8ћ? Ԩmߝ= ] Do\a@i!rw>=$s~MPP )3}}$[I05N-:aX X4#17idrwY -`Bzh9?)[?>ӓ (j @&^̬~`넉},?lgKsM*ۧNc{K]CPp;dNz#1l,WXI 3ho'O1◟t^Tõ-|VCiJeXx.u@({̾OzsАj[=i$[CqF譅ZNVޛ 4NA慨M9ĉ9=lڳ 1Xyײ4 'A>x=n 6o֔ϦMv9W:/: rP5˶sfϰ,5n|tL25s:/_osWiT.%^n}#d j^Ħxlk;/8AȨش Q8jZ6 ~7oҚV GXEڌ7/:ZS˫UEMo % ː@wM|^y??9Ƚ\yhȐGq+؟eq/3 Nreo^4+-:rʠoH] 7xups/D.~,^sƾ[Յѫp?w%X3Z;{VpdX8pa9W/fUcmPЊPewa7_pIVC{LZ? pqs{h <Nyed5F8A!3{5ΘL˸nmWҶoyuҿ<:u*(J]lL [J*Ims+.OdRUl˜®)#ynYm^ˬ qf}b{,t׷VO:Lϋ'{@[ݽTϭr/_c8ʙcrPU@ BP@ Be~=S1`L/@ pav)|AUJq0 m);ya@K*0`H4&  s?}hfػf:C2w£ zLEU xʹy#iQJG@=<+.,CYBApt1$duG# N6)]Rs|ɴGc̏g[(y^hm IDAT5h.*8 o ލyg넉?61ډMоLSQ1c`.TEQvLS~_G^⼋޺%=>EQr`ח|})ݝQ8sb;}̣!G3f"D9{Leedyv4f|1k)7*d¼;/rAp/ʃ/"koP2>?_zyՓ`Z֊y 9X]6iW $r&gj/]8eڭS GTW}Orb ~~lX/?#&/$_??{Va*tw8.1 KLݟqLMX]f潱Yײ1pn篼 boUxa oMVwss?q];o=X%^a߁3b!ՠUVn={p1:u<3 ;߽rI? #^:Dω4&R~z Y;5.s fbwKbgU uv] (^#^þpҲUK^z4 q'n…Khւ'Z|k||'LӔ@^x)[IyMSwd#YzOw KN;08]i |^ |]yΥW ,T oo/ k/l]=rxb%~KuIUYn [}=:ҴU: rnHo(,]ΥW\o~Tפ Ӻ 1@p#!z%H)#is&!T bY ݜZ*!TY6}>Oy#R p]iCO9,g`WiMܜ_*qQ9|*JThswO<MQUgxב$15fِAìݖž441[VPXa~J]^2||L^:M}џ1aaEga_bO괈p߇h7%8?\2nmhNǫi$/w;wY$Նߖ %5U8i,qv#qmdtۣVlYvIxͻ<ɤ5Wȱ.f}wzc&<]8q%ØrviMXx+:†Rv1o$;.7Be]~?VޥcizWOs<\;ߒͩ+ư اWwfJr)iv-oETrxyIh%;ؿv._uM 0}$#Jٹ4tu ?>ٕǬ[9d'ݚ1!ݢ ÉK.m>]mfEϳq#Ҹrk!|}+1)uT5@c|~y9۴.O4~żuۻ{1: SeuzO7MQDfN*+'}ȏ0O&%} ֹ¦s$(zdK۬~.߶YF4~ oq<ּÛ(q8IGpHy,bLCqm'S:*Y@ռ3oﮮ4S?qqG7Ags^nc:~x}^5C>{K_s b(1dŲ8DXɇտr&7'ɦ&ԝ ݕ|y!d3p9Kq4#TA?`wۖ eڸGTՙ/LVg56 {a0G u0-y]s=q&M˿n%ځr;P-E-;o/USyݼΧx+Xl6FHM%:GT뛚?̶ml7lؐUVQ9*(6nSAlܲ3b4:½팘8F(zqW~[_|dzm6>c/\|!C~̅W>~A!i .^thMFXYulsOھʖT۲.b@xaM(Q,1yVn^СC>}fyBBŋ¢EhӦ o6޸1|p ѣG9{ljnnWKEyz ެ߼+WVy gIl@`AU/[ 21w8 h; #2DU)޸e?FqFe>tڕŋSvmڶmKxx8;w&66z:t@ 2doݺuʪBUTHLn^.HKO;0jSa-ŕcFc1w.ipV#ڡB;H0gWXI +<([=뛝͑#Gx뭷3gfȑܹ͛s)nʞ={ر#/?Ϗ .'3++uDxxxZA%PI*dIӖWahu/Wcu@lU$aB6Ęyײ4 'A oro52|}SRR?>UV|hZEatܙ:0m4N~7oҚV GиL^^y??9Ƚ\yhȐGMB[\cq-}gY߃.Z$ °aè_>:ur7(0 /ߑ}ݻѠ~}'vY ?gKV״Qr^ʫ@۠e2q駟( +B=?Fѣ=5j\i,G+^a0ppʻ,(?8T9㇐,jJT31"+y#j}חZ&au Ey}}]MVQǬ7_?s]4+cTRS>pDLIsuAn7ޡERv1.#ꖯfoe HxK۽V\Y`lCe܇У]~jdz&I%w(!53֓o_!QiXxr{ .M>.wrb*{&<[ϳy<2#\@[[Wjȓs9{>L#Co9\5v/d$~ťD|99xxS%^ZBt}}R\T W.:u@BBjYő`MRr2aHIN!&6 \牾|5: __AyS_IRl"Q͍667a jeDT%EIMUj5UފE%}M­tXNHMtn(PR% u!Juk%K*|3*2nn|}ܐeEWRGu{DTG׳N{EcVXlRӐPxIqEW*9JRX-LJA7TI/*9m#B<A +pEUc Pn2׈rQUP}RߢX)ROk5rA>Gͳ꥾׋~k~SYQUQu @eYV*۵JI{|?ү3YD"iY]_tr*'*RQ?5j[m]g#^B33p2Y$6"?^`B(:_f"UžSl*Zړ,5#aP  F]`+O#݈} \Ww~4`]+_?<=Pe||F2p2<-kOZ-Kšweĕ[ 9\^ C&,NaCL~r WS[S'30e:L?1ETYyҜkXZsgLKf7)t{1li]=YYNjLY|}h4[f/]X̪b Xc-Ha!u;v3#1)4$YŘ3Oqiu8Ғ ^zaP}`X͙x3;_W}o`Ly#|>FOQZ d:1کT;U",%؞Xmqt &6.d2❦oJcu}wСG`;jLm֤ZEl=nѭ?sXDIDAT]ifgY}Q}ꨯoqQDRM{7'e0HII%:.,}>^jJe_Ϭ]N^^7Www/HJjBr1(!kYyd#3\)oI^Kp8բm\^$I_b)jifdpU.gDQp.4m\oE)PNV%/7d1+TkVy3{-?F)_6>Ӣhhdzj@2jѨ5dkt>W>VR47wW»,\O\E}I[q4/pՈݹó Q|JaCO񈧔e͢)FxoAXJ]ռt^NZJA%$I&#%Y~1<T, Wk]i?q$/]K$$Ԉ .N\!QXNC p]ZSbeT|#{u$-ޟh$;)Qަ $'^UV7Z-\WI!˒I(xidHP0fV1d=4 /}Qxyq +Õ,lG/iE-b`fnQivk+25gcvGDNN. ٤AQ!K 1AD@VPfIF20Q, bTQ#Ū(r1q'9[i٤gz%Ton>\I#j61?O FJ%#fT96Z` bjXJ-#u#'yV-ըhTh*<<=1 $]EFFVY>" v (%- Jc~^.njeTTWO/P-,l2rPk=ШUThRHڵkR#(77MA$FcBT 6 shwT?xJ($_'ǝZk őwnu̬ŷ8%IXJO[(\DpHO V?[UT' C)@1Ɨm2}ؗr|$KId֬o~󛙶w5˻hay"0 ?o4bQXZ ~DuAe]׹H5J)<_wY+Fd2mDZ+|% OQR Qz8 .gBo~ͮ# D<+8鲅F8v-q=LPC(Z4M)q5U~|=+r|y7=G\_ Fk{Ǫ}TwYg~%)2f=׽`̀V1TizJ)|%@D,5$ D9\-%cTMmƹsXy!$U#YTH>_ǒ4 SS[ds9qPnH$J.E*=ttt &qaLjBDה%2}^I&ivWZ{4Fumu!p"Jdk (7q9t`?q_I͒vl/':)+YfdUع,y˧h:3W"1B];+ 3!V/BrfT&˅sdy3Xys(9 jW Uc!k,dVVnN|,2>y%ҴZ)%RGsK v]16 fǐRDCN鸓LzɩbaW2J3I:T E"t5/eij0Њ%ns𞻹xWV)h="m Wc#U UsUH )QQq)߿v<ϻC[gzfKw\kmFR YeN!pH8\3$ˑ[]]]H@|ޭk*QRضE*m[|4m#tuwI|bFKzB<2:*$RʊkRy#:qfJgRnt "aɩ@믾&ƍS~ruS)l0e&ss^LCC=i".B -|զZY{" K95"LHc%'>v&gYd!+W==Ez~A+i\[B]1ZM(v?sSL!ܐE][I#2سق{;q[ u(/^ڵ,.ZaxK4d2<|0M{fM\ס)ޤ#@)Y#YHgHZc7MuYTB5VXOY\wJ"p4Ɖ'{<#F-.Ff3 SѺ>DH$fuyb1l;== 1RIɊ ĺU [ +Yѥ !6LZ(5u 7X}]_\j')ի8~8c'<23,}5[>ܾO]_0V6lj~㍛k$/`XJgG{GTl򁣑ptF)H"0@T6US\Zc%^Dic<~VRoi3/aŬmVj岨o1$WdbmCڵ u$ecYe77ŐtwuoR+=cT) fӍ2eoɢ-?֮MxJCG{; 133K2qb#$Sqlk !QJlFI3j]vn])T"5L :a>5O^ɩU #.͍46P@hjl/$ӻqvbYسwSUr}B lhۏQϻ4s}[[[,(13S9ᡡ6fR45.L9_LlCC儇uQ( ]TOޏΟ4\b1y#dӳCTM0vXƒ 7x_p8~C6!f2<ЏhX8HV :eY|GDKx7m2A)|ԽL>],d8DH$yc pq=ԩSe&ɚ>U=4"###eNP5Z)̳jeF444K/aY.Gz"hɚQ Uhj4ZF UBh4ZF UBh4ZMlf F0{pY~}駜>}SN1::Zϲ,~cOԍpf ?pm ~ۚ]0*~!Xz>^ux78{,| qi>2Xm귾\|^7B; 000 'O.v<#eQ9r˲p5a9D#.a7IENDB`marionnet-0.90.6+bzr434.orig/doc-src/img/filesystem_history.png0000600000175000017500000025065612167200764023361 0ustar lucaslucasPNG  IHDRy] pHYscq IDATxw|咐FR(! Q "^R#BQTDbZBIB -tBzOr. D@|Λ7of};v( BPhƿV-+w)5K͚55c2BP( aw+++ѹKKJL&˲ݸB z1FU/BR̖+Kk<(ZC4:Ƀ ߆\$6brmU6SFB1ȓ0E$&Yk'M ykR:c0dEH<"tYeUJ.1I۬U1@SIԎpYH%r,L䑧"$ըAnOOPU6;fY6Z{E۰c,҆2,K-ʒט**+dg_R;s '2AŢU'=umͥ=ijCųC@RӉFaFVsqsj..:>;+d2=n#vzשHr}rzE ')Lr. IU1d'JvG1)r6qz-eUHU䤏XbE#~>K-[\wyHiPxHcF)Iv,qYR3*bwJ!ΉpX̭XDK,+s\GeY\-Zi*oKp&ƢfVa^9.쩰/xI*#vh*2JkA5OH@D ORNt*zv] [5WنSrPSr%UXэ))-*-)بQj]>j)?fAέHzP2_A B+uBdWةG{$| ɫ6Y-Y:Lپ$=Nva[c~ML7UN J?H V_vf缜,Z}Ue$AdӅ|BrV2asGV3p<C[R\|ݬBgGG_`WW օTfLuOO''$|Fc6OIA r-!7X!lEXH$t @JrDv N,NZru'`8&$ l$iv BY12;XlD1*> ClPuwxD@$s6|hrUcXb fY<)d7ieT :K,;Ada@ɆU'=YUHE7\dlrDb6B+' bk(Ny D cm/QNOڒ-wU[ Ϊkϫfq,,SF 瑋S77;wy5˲YY~xxc䎎zdT~Ȑ!C;wu "S01wzÇ\\\b6[?曯ϟ?hb4y8?_}yqddcj1 3gΗ_}q~:u&O|ԩ_o p·aabh'1!aUIIIF)4С:w  ][|}ƍ]=e ֪K/=Zapŋڵ;??…ݻwqYkԥ˘1c\#\tiO?TB֭[srs###ϛ.Nl)))qTOhպ59r{ȑ+?MIN &nZl}4o֌(eݻ[vQ"evp_`ժUԭ;k̄-[DEE}Qώ;Ə5B@@nݺ? !.ϟ?oyyo4ZRbdJ%F%&Y%F\l&  "($9p2ŵ \*G!x.+>y-BF|W0f!RrJ- >`0&k!1a #B >/B1 Ⅻ>B6cN`PeT{a$XcmamœHd!N d'؃0P $@\a*/ j ./D!DV J{F2⹐hP k,eRy Fy/F8,NDcȮ0˲{&UG 0 l,1+Sr+Oc#Zqs=իW?_yضuOۢ͛;k,c||1cbڽAhicƌ^jukΝqӦK5kw77}N<9bƍvww ?6mjУ{wqrr $%%~W9x`-ZY ۸q3g9/gԨ11M0̴iSG/=vl[92u1GR;徾;[l.N81l&Mbv}SL?A=8UlٲQlƭ[[50SN9c{\reWkb6Em駹{b#owo\vڦ-[̝qaAo{g+?uUu8qb11Mw1w '|bXKB˒Mf/_^n}XO7ч0 zC&L?|ذn~Ç0~;w#:th͚5߷F8~֯UV!#GجYj4 4p[iI߷uZ-?LԢE-[BƏ#saٳcǎ}C__x /`g71˲7+Μ>i7oD͛7G@ii34h4O7jP=Ytg69;xpppb Wad`YN^^^N@?TE_ @eؑTdt 6rH{l{!H BP,]Adw.TWٝ ^Hu{D(#RlL~U4Yw+qWI}*IlCzƕUSublՔȡvN+rq j,zcl4Y_[;u:>u7///{# 0fJ@ Ŭ-%U̘w|{9 X{?[ӿ}cZwЏ\R^z_8B܇$?\_OVĊb ;^E} GBetwÇu ʉq- z^Ν]˿Qؔ1vpps$xi[HڴiC0+r e˗;z4++!"ň^ H0,F2ȋqrp9D< Ar(ݩb_dN5/G lē"6/Sy qAX'w@1}>*TM*= B˽5^8rvU_ #mq)g.d׮ ~K ĨWM|?ޒşp ~W3󵣤&LeeL4rHĞc4 FFqr`௣)!>f ajڍm+g=0C `0tP7mӧN=7[,&M2WW\=U0 >)~!&zp2a~*Bb2H`զPz1Q8GtTY9%BkAߧ" '40 >E1c4Niw IĈ{=9Č@    bsyK{tn1>;#, !IJ=:#^̷]يo׭e7FbV(*c|6)lƍ;vZR6lxĉ ';I[3Õ5bμ$<,|xСbqNz)::ZT+&Ca%JP#lٳ0r(j3gϊɖ'j5A_c뒹<2Q cɎvbI=*zUEhި!#1("胈v>K# Na>oqZ#f9 Ȏ b2^V.ey\y$"5W#+ ˲,w)[g_}httt6jދ-ll5mťigtz/AS'>lJ ј쬍i m[ 6nX7`pWE&޿&ˠ 7>l]s J?/*pt6b굴w *h??jqN͛ K>x 5r0˖.Y|0#Ge1ZE.^4web:Ҕ°RO(!1u62H 7=a%Ko IDATgff,]aQFT ҄ԆL0Q.\ҥT|_o~PRRҶm;Y`EYYYYYK/Cch.;<);?ld(+t-S̙sitf:`I{w۶mX^Wbӊ۴`0^֬fRND#ʦKqY)-ac{7v0 $Ǎ1>PRRҮ}6| >ϛyJD$.& ]s6nXZZzӧA֜fd2Fh0JJJKKJJ(REH-QD(OTs eeF;n4 .h h48ah2r6F#91d2&d:؁M&(`2&l6b'rGMfl6,͘eYnfYe1e1X,e- > p2Յ_&LG%%%q0XrPaZ-(h4Dbzu|No_IUAs.V UkБu :VZ :|stZhvY6?L={Z-8g|;餿?z.j׮glٲ3bĈJeoٲUMK/ع eF"rUqdB&MmHHȰaÚ7}G'N(7z=zt6Ί2#ޒtANm%Q^RpGkr_-Ν_ԩh\sv褗p$&滍B2dHӦ1o<#brρt֝;/о=ɒ:t͛79k֨QE\bcl:tEll,aF?%**r1M4;v I&6}_~A6j԰O9Lc¤]^zF˖-Сò˚6m:c1c6 yq$'Nuk֮3ڶiӦ`Xfm֭AZYhպuMfs[Ar횵[B{5Y^Xpѝ;w{ʫ* µ a|Ί|ʎ;.YqFSN7~]zswĉZ}a0*+//Hum ?`YǘS7#i2Ոu NWFm$b-AJyEzNUĤzeR= wRl$*ֶ7&QKk7` I/̉W i*M?2 dE `` 66.`G)T\R">"{T+0H]&IN[~67k ri\6bb6_>w~-"LZYTPEYuڨQyC7AӨ9q`rfڵKƍ͛/Zܹun^`;(!tͳ~դ1rFbE NDHw4ixSP+I@"ҳ@M((cKl~EB+>G{tG*GG\XwހD!? 0zT!BB ¶ Dx?Is[Ċ I\.l 'V!"WdC 7 \3x`! n`\qJU!ъ5>_a eM@x*D3 ?=: b8U|.n ,`~ OcX(7py1 ]4a80L~AAvvV`@jx`0][_zS(*ޘ *"{l۶-&G_}-ƕ7oԛgаFM"Gܼ;qQL%un6rR!Y.gW&-ZЮ]GlNJK/:ɪx< yH.-i@[b$lWem+#F Ͽ\AVBHxPhf|3 uAauˮeM{t8TYw爩+ j?I9P8%Im HU^M@'EIwтӣj*&Ơ]VHّubO6٪ʦ~Ɩv*rpdJIR&r1~%eml/C,Tv_b1 |C+*UU'O85a蠀ZRrn:`\Μbٴ}_ȕӍ_ci\fk$FCKeœJd*dxL| )I{@udĹIPRېV QF֚"ufd_Bz*¤^k#KeȌ˶+ -D=d< BL |J3uz\}U,AF, @>_ bw{YB6(d|!,i 5O. ߈z$ 9A h p˟cE3H p*BY`1K d,-)R%J1Fu,UF!0(0(ˊeDrelF4^rV M ½_z/ ;1;pmȅ6z#h@LG$YDhA3cO(<,BDGt $?iC "!1 dr/$i pIa{%AZw~*ˆob+7Mwzai[7O3( $,̍pI_Pܳ 'Q?e?wdObd]*%FX@r(Y eIj(W&3TJ(QMkPstTYyV; WaiC<#lUQ .NܲVrAx1bΕ QFYKW)Z#by1kkMZ5i`++ovڪUY]*$/5L7_ܱWU%}ע=n oÞ|]fѯblo6}+ux[Â49~0c}S"x}vfs)rW?GDG(}Y&(qQv7v6Ͼz_nŋyZ]ىgfpyۑ/gcomll1H`VnvZBP(O0bD zF_#aɑ|\ZDʁ=h4z]?p+wѨsJ/8ƫGKc}Xj7Wwi0D{dǠwNAͼ>ͱ;umrcc`I( By H\Gtژd&.P'i)2K:xp[ gg)ZlAz{WzxdK7VCŃ2<<{Vh܊;T.IEn2p qYΔ{DOf#ƶ|G{Uukv BZxM[T=aM2qKi܁sn |ajv `8k7js_m%]Ű$ZBP('u;?y.b)8\4a||0`NY?$-6kݬ7'(@H6 yi~3tB'H{o=NI>_o0 ݳrTn_Da9vFc,ӎ 5Wpߘ}/vb)˼ _ TQ4;P( wt0E;.uIӤإ;>9Yo5 hܿu}6wp;doOWïN뱛 5upnsczSeޣ{z֝;qTvό:~ۖqaN hUpk9kRS?Uٯ~`m9+fb( ByAk߾}& \rrwmݤS?urVq WBP=c Wn7Ng,4-أΜJL_I[BP(Z_]Q( B<&CP( 婅:: BPZCP( 婅:: BPZuŲb!HyxZFaVR( HQqtL&SIIN~=幸hK( B@漼u,[\\XlzpqqquuMKKtE B]Wzz9Ulvuu,,,,--5ۢ ɉBP#`"\RRhmz1 z֭[ ø?0}vz D=`0,1V<0ce 60Z577qCP(G !j! ByPG)) ?ut( BBP(P( Byj^1и>BP(;?#z5U1Z!b! Vw=|}ujP( Q͂ԞCk`+ Jm BP>1\̆DP{[hF&4B_5z2W c=wN>?̢P( ɤ͓ltn! /u"AM~wuu"f$qy٢ [k>{s\Wuٖ#byG?3Y-.nӯMNiwK>&l‹}Кp1xyd{G6CFP(SՎ9eI ;gכt󁤴̌;/l{uN0e]ȉ;tĴSsr/,l ߧwze.߿sn['tw`ܵ"f3"3wxus/Z#r⒳Kz;85LE ;`ɩzb;l/ʾQQG4`MK ~=s齟āj=[ L7sNxy&K)'7)Fv)wɄ/?}_~;y\⭍7)^7k.=S"&|}$浼4wܓER4~{^CטEG/]rʕ+6eQ( Up}X?:y߷y9}ۨ<6e i:;WkʺZߪiTm]^&U%`qvӚ pˋmy޷$޵4Ȃ /_ *[Gsgt VZWfi*.EG+/0~5[ߨ'گn)zӝ ;vۢ #ɾ v3w~Fk&~I \@"a;v#Cj?7yR 7ҽb<-) TaιpOY/C%ڸiN .ZpA⏇L=Cy0G;<΄E'wGc5[ qd}\ʲ 77>Z0TPSvٵWrQkZViUus>Eu>شfvbw i_o"VK8[|/ p'{Zja߻iP/`MndʾQTi'} dz>`}&˫Q- y?( vIUc(Yz.UՖ BA::~Sd/y wp 9|97Wkʺ_=VѥAkjTyMg'7_>o g5ѿ#@ m<[򑳷Wl ]8ÂqM{ E'sA8 QݿJ~j[lЫׂ2[ k{i7 ݂us$[@bμpZX]wƜ}=؋lI Y]s7ͱ+N^"g]`H oCP( `ҥ:-1dW_. :v/0ԅ@WƔy-z'ρd3&Nyne!1z,5vzsޱ_Д᧹q8G҅=Ջޞ߻,30Z)jK(q墫onO,I0]YcxmCp\S'Ex^zDn^:wc4z9f%Oս~5]?ݔl*IY5bj9Gf{娱x;1NzKÝ3Y~+ B< U>6ڬX-g}Fx^5jU].|x闬\Ibf..lݍ]U#x#Yk\[c+ѡ;|5~!>Fx#muZX\l6߷W~ZC=1FGm/id_ []c~C\%:٩74xjyBɰi k}8cCIOkvKqYR 5|st( f|Wj"fgц-G;Ҏo\#we ;Ε٬MȀ,\cnQ[_m0,,i1+5СR%ff''{[t5BP(׾}&nݾӬYRGVuqqIJJ?$g2t1Oڵk?n+( RTX>~GbAլYqcy̵, ya=3gRˡP(sG˲FF׮]spx͎>N׋|[G:JK.a  By<CIIKz6FEyqҚm#c\PP𸭠P(#::'!󟥤q@P(Gj4QِCGL_xrHQ( )((sqqjl?Dqq6BP(UkZZN% ""G<h8BPJf^OLL@ BP(O&ӳPv\\pMBP(ʿ̲8P( ByjBP(x%;BP('kx&P( ByCP( EttBProSg7@`zAu5[xc,' iFЈBQAuR˟mjTI4^6}ţYݞyo纉_\2T>/u>(ѡP(jύm)k3Wc=ջ켾c@[w&mH3=^C( ut(:NGYg&+9fboQ#q~ufݸNa5t:}ۻ?/Xt:<"9 '֍k|#:]wPZgZ:}m[0gu:^Q뒊0@­ދm&ݚO\vݦ>H2.מtymW˰FP Yr18Ϫ"By`CPlfI+AJL7|lˁ7o8u^ZeGnge獍x#77777b0lwLXߧtyY+uЩ#r翵ʞ"\q!ftޥ+[}~x,)<#9M>w336+ĸrY֐tgǔj1M<4LFPl&tj-շ,e횜Lf?]!fLڿbP3j?+J+)|ny,y|mFי}%wK8bJDZkk[}(s׶l,~sak{q kuGO5߆=?{n)5pi!?ag>d RPGBئZC=<˭8mC7!m\t~^͹A:WUQ?sݏIC@ۣS<uuwZqWgMM=2N3%6RMMٕ{!6ck| ~ VkXN,7kxS*FP P(;hulλٱhԄuJA],%l{ξMңϼpY("3Y gG'6xFnƷ_nn_ow;=w/S `uͭvy!g\%us5ds(w3Xcw:R(:(=N^z%R7yR'y1YJ'L⻘s1GjZ>[ }5-`̼v۸4Cӗ!nwiܼ|c%١g[hƋ'zڎXgkOnP}x37иx9J6 ;yjlsȋ}myqK֞/O-P h߾}۷OOg2͚5+--X3//q[AP(  ׯv'M|}}¼ʑ_?~Dṭ/BP(ʿutWJ*1яPe-DLFP(Gj4agg/d2t:oom BP((((sqqjU~&VG[P)0`1BNJBP(GkZZNpTӪ0Jq]vgmIysƖ+s02!!16i PýU"fR]zq{+`0 C瞋wtt\pŋcccOaSB, f!GPAV`Xo?~_~eС b֬Y{]pSBC!/l*roK6ޚǯטհѐE﬽XsSJfKLoS}|oڟwtv?[Rq/x kz<}+!>o }Mʺ+цOFeXhСC`ܸq~!_^ק[t(B-4ŪP1R(K%9:VSHh(hL\1ؘ1]NNN6E~"E 7vg}z[eSOճ؆ Rmdo!<E j[󠦿Sc{akڌQcf@,7IN^rޖSn\z 7=s}[f%;މ;]gN|(1''Ottpp8t̋-cWβl;-=v/var'T&OW?>W>p*W?΁6AIWe^ፎOzfլON7U NzՄбwpӿFbgޜ9x3)tK58[utwJCH|ύ;c3K4EjXZqjHBgR<V.f\$'&}Hç}1>k鲣E5 |ށzގ"ɧwx?{Hwc;($?Zꎈe}B$O i>^fU}? :4Y}^6{Du7̪GJ()<城s~odkOv/rkGVթ%y~6Q,oezׄЩEen^uζ;Uŝ6rH$bʧWr]iә>}kDkO:61Ci$#FP9&c|[>kbQ0X>#f,d90MΧ爀Fc~:E4q U-EϫWU#S_Vv]Y LTǓv   :bv-~5aF=4bwe*quw&.WMY.\Et>kWM+AL)4G1{ g۝JRJH*u׳3ܚUxܸO+q>t8gšBBլ@j j0hBBCiJH!Vqǹ 'Gm#U+my3ҔQZ)#ĜY=wbJ<yj\n:\)xk+=k60wK=?ۣW[eL1RXh4Ks |ToS>ޒJ*uoW~l 2q S384jSWY6:UCDSΌp2Yf<4<@#Xt| _oXcYMZ%ճ7Z6/7P*ey&'sja\"F\ѭ2NڶX+]:& IDATŒgzf#?:9u30&Izf8?I/8;+P)@}Fc!ɾF.]_kũo$te!_ךmӟԔO߿-kh?{F$iA˯5 ]+y,rjvl:Ę- c3t=e}?#֬E߈pxHwZVgOu`0k@EEEO_*U# ZF]fDL(U񣧏=}GUJKL:R R,,l,2֦״Ԕ6S Y)EH*bH$bN"7ywwQ>xsS ~%:e%jy^[oūKR^xʄ(m 1_bmvYUs ?:osez}Y O;`oO.[>}+}E-vIUו%_ܷ~ѳCpk$:7k}Y0ħkYZ~5a5jJ{T|`<$,⒒{O$B]eȸ0&B0Ҁ?}gskTM4EleT,6 6$RR !edjdl j֩4(8Ԝ[Ms2%R'#$*=s۶+]}lԴME-}ş6[E4?34F̎X1sX^Q1\Ψ1  7Fa:y5?~$vC&fGYͲTCufVӡ}FlȯWބ7+9|KjZiZе ̋WԳ&΀[L[VECSSVgݝ`,lޮ?vQ{wn?$%)^]ihשJ| Ia1j#덄 ;!'i.a޺>pssS* y Z{rAvM5a0 &fo]ddWy@"a vw'$1{L&TӘm0&Qb`;;aܱ4T WYjRse."08t!.iT"" Ud>5#4VNUnf ۵qV$\YeWnj1B!iULVRww0 `02D0"sF"Y-"kS0[`0)Fa^ٴ*'Ϯ+D*;[;Ǡ@^,[͒Nymb0 -(S% ڞ1.uE ĞfFvq4o󼡞"<7SSȜ,O4T}ͪ?v2DPƌr}U?a{uݺXq~V+ 5K_'nkc2}>i*M^H&g PJ8{E(D>RR?C)m_g͋dcO14t;2GTG^hؤblԦ]㿋6lo;=jY ݍc%~r cs8cj͓|V&QO(!<mUG&!k=} q.Hra|?C]B*%>bJ)"h00c09򊉉&)QQQN!9 T-MXQ}k}-֪ltueta )?ϳCvhwRL>taû,GYg^`}:o3f-9~䗇S+te٧۲=Y`(~=ʢQot}Eᙏ+,ʂRb,H/w|v-y7Tz\K(זį!󎫬K>oϜCVFp:OSgٗzLܦoSTWQ]3?<|ET&k*";*o)}$&N{i3c}/{m^! F!t6PS 080FcRljuqmݺ5**ѣm;>SBD I?qƔ M.}~R>{ޮy[tbR E@vltvPvHmroAUޙ}6BcQnQԳi2s׹oyz74dmN%4OR >?)z<ʺ1~سEAkstItr]ou7 rE߾2թ) ~ONK݆y[\Wy}d}Am*BG|2˧W;7`<8ƀ0`@)`B `s F]\_ 4Xv 7ZJY ,#S=]ͷ:,kw %j`1 A.&g)VXyɬsXd(aq,qm%&eY?ĕ#e\OTDʣmʗdZxZ~~ْVikY2"ؿm[uE9V->&.DWIETY$ :"C8]ޡp!9 V~10F8cdvQL;Orsw !L""2hdkcKwFWD,mz3K* J}{ Գ!C;V)!ĦKԐ.ZZ>ϐI 4: Tz6/xXg&=6_PYt7zT}#w ;Ob98q*μkJytQC϶!AJb(}AҭA&7kVwBU?In1\K-Z M]Mn宏v\1}21Zz~C?ܓ')[*$!6:(xWӝڵpB|$BMT/´_G5Pn8u1הsQ^|Gk%2vp nIm/]n)tu7ِYc:)?-4sbEƃ# !FCd!scti(2Sݫl q eFOmShS); =613K_sȱ3:VHIYFvVjbpP&o'^δK^7{)]PEUF6Tl4Y_\̫zL C@3l6l^@f4 q XZe4898Ba<(/KM#17Ԩ`@eўbPx&nɏ-jʃsl/ڲ{ڢG:z;oh ʔ3~:{\0ߑnYzn>խd_zJ7f 4>6ôeO0D7cּ֯:hSdʂd_[狟-+._CEQJSƮ>>K ]}]M9q!001w8 bt_̑(n*v{ BRz%,-SFJzAGv>W5$-^Ș)\$]_Jz裎͂Џ/Q,|ʡs+8ˠ!DT95X 9)ˇ8E,:,Aȭw{h{y`ϗDjxL&UT*o,: `0-FC##ƀ1 d7 `pɘ#6^ePc?.|Kk\n^VU꺔?*H.{F|{W˟S.KZloVul=R..9~ɴ]drܣm[[Up} wK[~w u=F726Ljj:z=GC={vlSspf052m!PBxuEjP{j't́۩Ey:C?c]Uw[촑3g?>]Rxa4/ ZB}M^?2+Jv=JvlzhJssyA@YyByJyb!򊉉&bbbxϺK)ɻТ5308Blܮ2؍i~Ki턴)J< IDATM{6={uǍk֨G>=nܯ6Q9I" n6cyO{IuxxD|_Bx"e2K-rQ8`39wcʜ#w[5vdŐӇF*R[qHgfTG?}NɁE촱8-d|>i~Ê!ޝ}{zڮ !>RU?gWoOi*!k9s>F> JwmG(OM~nlgrֲ_1v`k\ObT_pm ?5bgJVBҚo|N#*Rr:ǻG+W9<@{>567"t m'uճkцMܱwFK81-"?|a?xE<9ה=U֜*923_ Gԙ\O>k(k/|'>L ]lQE怡0& #2$ᓼ'?嗾Z1q֖m-:[z2A))C̎,9dR0 |#ۥ]e4'|R_+g~$2f g"{Eˌjyt*ӷ'}:998穪Ty2_g^nŕ_o[gAvϧo}弣&48Yk液n6p6%(uiiFI䬑Ջ(vk#|3cƆ[5$ XV͸X9.[?02/pi#* nͼPYU}cyC;͗ /Bz:ǿO CHj u׳2a !WKEc^N @)0F0Q:"dezFNP&?1!>###,,,/7O]PJ$⌌Z)ǎer"99900R۾CW2yHUiië*H^=ӳwb']F)irN<ٻW ;sGpߥC|=&|v6i(iASW$k7 fkDzIlށi' T/ͺ}tK{緫'٘}p5V-2st0Y hScwcN{-Q?6GזAZtcF!ZzާڍS-ñMsW(EsM<^Jׁ>bacOuK@ "ŠE'|Txؿ[|mKc?B{,_ 5]Oտ_+=(ݐgpXAbie`Eq("R氽 F.SW+9###/7Sɷrscc/]"'&$&'>}T^nnFFF+yqW %%wUZpW*籣9q$) ǐcEǻ?8E:&K 99^'%tR5 Ic.-|zemfYv'dpxm ,HWv9܁֤wjm\ܥRHWWO8 `CaOa@a89B!{:9[&&uߜ\>,,}'/[a#,,L.ء}'2+s%//o?Ο9݈dŅ14[0szG^Y:-gMNH¦.{%VV&\6.~tMfߍ "?KO1}Vfie^=ot"n *;šy|3ԕ̋Ox'ke;_5z7W{Sz]c?2LV$\Ty\/t~_0uRNO<7\z :Cei+^<L×U7 R%-ZqN>v¿.ex*;goL%)* (ݛy-̻6=n8PPa0hRndH$yn騝 =F=OiG{u¤coJhņ\1,xrac@8Ø0F0`עӘ]խ*ZXkR o L.z@p~Y(G@Uei5L8#`\T-Sj5oejonxΟ5,;gp |6s-^gE @٪.-a4y7$|ܑ3 ǿ}ǧ۹X.mKcK?3zGE^pzjO vb|"%5_Ο{fB)[?c}V4i#/g7C$UߔwgEz9ZƵs>(Hcپ/gKy6|8jue^)Pt puo.>ؽi_yZ@CAr@oqKb@'ϗ_Ū~ѷÀm|{'u[״BKۇlf!WDubuGx~cW쟻wl0B RˆØ#;7tȑ̌Jr "##5 ߅# __TZίbb22=<ʖZ'&rwwf-[nD"KJJjuXXd.0;e*^~w}E|K@>Ƶ~ eSǵmzCK"qfxl{ |}Euz5vztE.޾eR7Ϸn U]]ʋ xP  Q&J" Dȷ]:at[>wîAO[s>_Ey[7*4 z]ֹW/P~ō^}G%^Psn}vmqTr*3ӷM [y>V`U;M)N]7߯Xǽdsg֣n#dɲ[$rZk7rw h# 3RfsK}4;wvdUeMŒc(p^~ҲB]Nѭ|MXF8/?*B k>K`oRn$n8-(),mѩՓ\EVf{nhD|װ:(D=(]k6&r9.^r^Msd^3xpW?[PQgxkj_O|H>[%9j;۵2yoDвˤ;[_Ea:ַCEZ,w:xvcw8ӫ}?9TQ>&:oɜ[J~z?Bn͟w2b^8Lhě]&)έ NA#^ eN>3u})qkJ=4m7qln?hC.:?\`(۵y:ҮcOK.@Z&2D2ϑ=}Q,6Nri. دTАg+5\bQqh0J:R 'TL079y%@iޘ;v=t!E_7&+rH!c8_9|5Gb/%HR,u`;א|žLjե__zz/)9:SV'ԮZfG7Nىս>&ŵw4:v(äRH›MkMiN$sH"r#tE$w .{EqT\3TQvjjv`w2S /J*پϭݘcEI*ӥbӻ/MJqlPE57ݘr@_Vzܥ˵+2#_g}䤵"ϰ98s\{,PKZ?e]Y+RhH+qމgb6Q\m2 %$1MHPR!PE"!v)&t|DI9M/NZot/Go0K'<@`n8VLQh϶[8/wCa!qV{·#eU쪡yD4^o=?%4xo yLG߶!Bm1ڂс~3?5]#oX ye{dnn:8]UM~gTZXa-B/Yk$ 4l)E97wWN\zBu؛1-Gd)F;;腁beYUc%2A=t o}sus䮑 =4 " G_vRzq5A10?B25ϩ)|piKKمܽ 5Ff(i-SǶwS+4+FI4rB)Hxd:ueдZ`jZڈH.]pψ0uMZloPEhH AvzT.7VX+n\U/ߚyFuurQ+_PG]o gz=ȱ IDAT^|t5gWpှcVzѢpជcEShD;.ny3~] +ߓmAg(G 2pS16<J>sɽBVC'2еd{zZ[ s+)ȵ:BSxLb+\s[4\.8PW9cN<_٘eY? J*kj*ҪS,!6a#""H(\$TfIMKcɥMh&MYX&R6ꍤ9h ȫWQ yG` udJ#r[Wn yX+ @KFhT \{5j^Rb-qX%0bN,P;\e^17\N:zR_umgRʒJ:QV "T8}06# u¼OY[ Uv$e5"u3VŎ\8NWA2M dT8$NT;D~nե,1҂9v}CHJ:C^W+Mq4K˝rDtsMѮ|ۦgdgޛ2[Ly?dHG?YM4 aGx)c vښBwnjxd)<' ztb6Ņy)tO0.J*!$WEDG΂/Jb]ѯcS@y[5^ ,Sxlj=Ei1NK &{ːLA[+%R>JF>cbN*u߸OjXQ]8\[S! \UZ o47aRD?#Rt#6!ou{iybr]= 9\@0u'NT`R{잆݇~$MnVzj,(T7LH,7*V.,\q2.0hM#V@4X='%p0B khx]SZNkƌ3[.ÜOdT+FJ-"yTEQ$"M ]W,6G< :FrQܱ sspK _|f@˿?3Ubeo>ipzU}z=֬?v?1Xp;o';41`).*MۖWQ;&'_~/25W~4fs]vHlaX3G'+MޚZqz{wm?{CK|O鰸ZrꞮ-(ylQ+Ҕ_9[=׾CM1v W;n D;|F +|+!3nH \{hw礳J̜9>Wow+I[Njɫ# ei4Lۊ?wMA4+WW h x.N@3ŻWQHNIwG ϕ|L ,(!"hKtRDJI'Ю]F]TX`XB_("h4+4`h4!+++!!a; F+dQF\gő6^ ~ry̙N?7?>}X A~N@ɬy&ǧ|@Ttl0Ȥ b@-2rg\#"zN=}r[(PJ!674qcA"1˺b08kOWglUGbfύS‚#q+ %Gc1FHriafB`W}Q5ꏤ8NZR b  &0E8E`0 5Ba8ncaL(8L 0  `0 ƈØR 0aÈ"J(A :L0 f`dPL)Qaqa"L1X`0k caD0Sŀ18D B:]ʫM`0o@0 "P9a,"D0Y`0k $0r@q#wj:R:`0 !8ƘJ09 "iM ئ `0A#!`Bcs0 `0 %e$$0( `0 a 0ؔj Fft=RMH}F`0k#F4qEbM:̢]?/Uz=kawCi)< "1/õ?M1nGwFGݽaH)+獋Jo;jƋ Ba-<cYrlu:HbBR7.:ٟO>ٝ~sW{\ ?K !ʫ?r!!Άa^;ټoqReTZ=ku͖q2LS~w"e $-z5sJ7A^/g b3Ix=WǔſMèŽN"3>?s[lZ"uWM"dWV6΂ b%{@ B(Yt?M1n{ᑏ5Fsߞ55xr_/{ȓzIJ':\Q)=`tKH =oq_}d\Zy3?[NoeOo2 +Ē|$Z З'M$1Ͽ V+O~nSf=s2{jeo&t3w؞ϞVzUCws7,$@ք_12Y~kB/5"~ڋ3r&)k1?=D4Ei OY,X?6V0RqBMY%ʊ?Vy!˰cJZV&s]WıӦ%$C @YtBzgwqm$|p;|xY𵻊jϝtt;֜NRgS.ɩ՚WX8g:\QRYƏOu5e׽fRudăonI,+1 S缒aco(Ys;^߼@,X1Ar}e|ZH++'m:WX/ˇaWNᘧΨ=#3ԺѢ'Lr㛿5ZUהKK?+JKRe侟-E=Z^Rx}3G TgޏS](5`/2٠\*@@ L:RҡCe]]Ym2p_kڃm%]u ]rĊ~&ƵfBpןCؽ?0O>uG使=;  wq̻Z!V;q=_ }K>wo@_)%'rV]en1jBacFX9T;w.rQj6YwΊkҔK]'=CۦnDe>b{MVj&z;ޔEl>tO˛_yڨ#hO/QRݰ1AS@_RB5':iѡ̸d\̚taQ6m|-|gX|ؕpeß{0ɳ۟XW=ًCQG J௲rg0vՆ۷]*3F?H/??3[FLE%$ ̃#".&;*[5ΐjC+nn_OXR'a5ykA`{hM7%A@'bLRx\7@@PC"ʌ kTrho_ R?E"IPJ%#PJlZa+ pB 7u '4 ZiɌU/m{m_Ww%!y4\utjxۋ_\8PFZgMq Љ=f- V eOzrS/F\xRnKx>K#4Z C&i[|0];=He3h"|`̫OiWj_.Y˦=f?4_3jcܳwԷ1O))fnS|e3B`i2cZfcTN(ki[ )W{KGvm0 9CP""I鈔a݌pt#_+_~pX-05-'R.u))[M(*S9dʓqcj8Gg[~t7߿p!ޮr x?"TgUՅ|4ŷB"Х_'+FR7ثUgΙ?*?nIK%*r ~-#~N5#5?eho\++ IS#dY\Jb7"r(PBJct?.{W'^*gDrl'% F@Lťv mIr]|ZzJ'Nk|+s)em.SeK>ji_1 QSq)qmġ2Wu.WSeNjs,gX~KPbISݛ/N,T5jzkWq֖sA{]j< aɑ$R"P"ZLtWG_ᑭk\+Ci)q4K˝r>2 4:PZtNET#zxk͎&R} &ް__'_Ҏ,E綕`O>Ҡ#{k8+GnIKGS5׸޺wwKR[/Zٶ뀹j?Xj __M7+hFkeNZxLY77Dh?msȡp)JH'-,q*݆B %DE*B(JH((R*j6mD 7LڣC,ȱtRom>w,9H}Q3n9wBGZpoh Q}:o=T9tʼAܝ↑z؊_V/A󌀴or`iN>r/1HeNajKzu+[1#JWa ) M?LF_Z T[q&C5kg`0 2A)P{ !R )lȝtҪ?ٞ[UMGBbF.7ORǗ~A!괪y>9{L0 q@))%CYsDPBERq!w-}শrٔݟXBJea^n¼\7.ATIn̔u<<~A!G҃#KyQAxtRU_kz:^ãLƾq YGIj`0 5H(%@" c2QLV<6LMcmL"hc+xPVRy ƿdu 1Z[1`$_4ših8[^`0kA'L1PJ18Ò8EghW$,osB]~ֿfrG`0 !#]PJ)aaL`JcQKuwj{P˃cwU/iǪ޲C"H `\(ƈT FÔR ȠuBismY^J9';~?ۢ4rQB.ҫ0 *`ƘÄ1E!,"8)"s)*35TX"+mBiT(E4 Bܐ̮`0 F!10u1BApGk-E#謆| `tkX1ÈRL1!8aP@28CCMS;۪rg2.;w:9:a„+6`\`BcL!L98B ` qG&C.eKOLy ;0Ww|{Jp1p-] Zj);w:k {ICSWf-|8?ee^K8fȿf>aH%|v%cɡ7]گ;f0.'R8LR c[2'RRIN(Z陮(rΛa:-w:Lon'vk|u7/虯Ux 3|cks2K_ap: ɕ3] j٥](g]5 r s8A!c(Ea H;uT*8< (/I 鴈MEC=v㇭9°k D˷純iW`Nᾋ\9,yK7 U'Hݾ2*Vb*qq#H:HaJ"w :$rOV!+rLttp]<;PyTҽ.Wc2k'GH4晁! os8H)dߔMi_?;khOO!$1 ?! |J m&By MjM !!& i/vYxà`5B!~3W&$i;뤑Lدo/9_y6j8@ķs,IZsnm:|[4tEϲ̚m<B_LZb6HF*AA<:#ѭ)SA IDATEF7A(f116طhK?ɌWk|>ؒ+2ߥ~ 7/N`rÎU[Q}ė)ha7L:1o.7vkGpFo;sf,?jۻnXK]ɞוo! T8Q|tGb7T{^ޝ/i>רϭ<{[7dU{uyhW߱ZXopG&>WmRG,߾x-[h1blxkeK##(mD+?BZ:¬ H_ݠ3Wtᄁ܇}V*Jf<.Z?#PNaܩԓ1 g &a2PO\܍C}o ޾;~Xc2Z3}ėL: "z.ޱwO>ߘ[2Ёj0bصX`o[Mmz_?E)Zw3~ui?)p%v_H(Ss`끷hm {RI*r r+r˩v֦g.rc&TRjƬWNݷi5yc¹\x_~L o~{YVϛTG^St27eQM&s :9@Cs9/7+3BxPK1:y$S?RznOnI-JzT+nڙsZ M^7nB d#_x|g}&`H)4yj }!/3Sp6U5_IBՉLg:9+,&a+,^ymZrUvA7in_Xb<x-q 5ߔh,(PMl9w7!AC`wdБc-Gڱ،#ht6(jCHz~)+ |B 7uLh[ڐ3$ᖗ6o|+4؋c„ cҝ< ܸetGcWqMb p a⚕bJ6ݑxwimЛ"YA1Bi^ΊjsSbs[\- +BTV}湪 klFV~|5yu-koŰn%Aj*O s5h| :OYf9:ʪ{RJF9`\FV&}c4RIB)%0GMu>^{d݈S|sN+ v%q/atc\&W#3rq$X"|sGnq{ vcƃ#iE_JX.Xk, W!$ʷejbeVp^R0Yyf6ڿeKBwo)^(tOY(H/MhN=#urG_-M `q9+k4ΡR б/ kZ{]bh76 ;ɒ80]+yZ0,o9`ߐPx6Gj{G(8w_dڠ5t̒FI i`nc$8w?!sJW^v1'q=0Hma x4L3j"|ZkS`w8ksQ q4eS?!PJ)!PJ:aBR۽7w{rD4WNiw }6݀;wJQH/.w/ը`Uo4!TA- :Or.c2V=7WƬ*_6hT/l97 V}}e-e"c*NQD=WMoKGS5 o2~_b,>?/_qinXgȬ9)3xN hcbeNs[tɔ1w+E"4TM߲Ι+3oѠHG3,q6S0H/@LtWܓy Pr2eg7t F$'K%M?.|ϕ9@+2!*P~蛷RP,F1C~2E&,u ~g)"tV(ڮܓل.g,C>ٽr!͘w{oB<|giz`0MBtdʪg^g}~2%(q˻\q>:yYbD.!4?Rk F'MP)nԱ(ج;ΛBv=ztA~bꚄFQ\4`JHHXB>`0u:S= V^^VQ dH@DQrٱ'n:-===>>>==G**84,%%ݶ `t/ldAC) `\sR*)RJHDBHDJDBB;p2`0!BEiBAH(!"#: `0=G$TԦs%D`@H!]8o `0 "&[ݲC(" !"bB`0 F&lD"RBDBl+Q$CsH\W `0)s P[$C؁h4]7kE `t XڹC WR*"XJ"w DBm`0 rC )E[ڕCĖr%RJ:^&t:Y`0 ƕR制rJ"H$@0FFX`0- Gt(H.*J#p(FBMB(3 `\~EB(maN0Bc\ZctEǦg쪆Yt `t/$ƀ0`@)`B `s Q`0nBa8ncaL(8L 0`Njwãw Ol8X3NE_6+1ZV+C{#.`0A{OJ|iyu:hvW~LļT1ƈ#1 Bq0qƘР,:Wϑ_d64/W>zԟU@o߸$c8mV-2!e= 卯Z*phSeq Cc0:f˸os[}:^4~!JgUz6o?W.m$~CWdv %zC1#D9E!1F@0Řk+F%L\-=?-Kƹ`MҲ+PʧgG~7\vG?C茱UP6@^U%x om-\LyG`_GZ2"#51㳯abK:3Dܩq ##(1!JB:(3UF+)T˞ opJ_]85nE7B\$rwx+~O-,y?An2vK VzG>|!u_8wh[ J@,X?6V>#RqBM 2VBaǔ0[L~ OM9=3oXHZ xcv=u{a2Y~kB/5"~ڋ3r&)>3܃ODJEi l З'MI %ڜ]WRKalKˆ!1 09910YN"PՑ=tIN݈1zR+QP)Cz}7ܳzgZ{Ҽ;HT{˿?ȾnǗ͇iy+O5|{KuzھX,Mټ$ |=m㯍mV߿w,ˎs.>De>bWj&z;;q^F>>,>'՘^:v F!8ƘJ09 "^޽05/lP2|[\+$栜BkA9U]9}~zU_AN[M؝g_#1A qԸwzၟ __mAhu[II]a 1֨CURkUn=Ͷ?]:[Sxks6-v4`ރ}e5.A@g57lhɾīgdB2sH\_Y1ɠa$"!J`cDū)늊c_yUOwަۃւMKfrik.= Qpiߧ F#A!G Sp=45=#(@y##۠1sMOO=#uؘZ3FMCuˏ?Ug}@Vp>))媿Nv Bd@@56(Fqա ?|OҪBK-^Չזʑ(6ػ}UAXÁ`Z˙U#w>,ڇKG?w/Ϫ2 0ڐC.T5jz|kW,+8w_!̤6{oˎ;r%)5^W\ ͍[KOVi6Z{p_}Lʖr<v Fw0 / ڡI *'yͱf?]u @5p=kdN`㺆%\%-[<ٯnc+fDW)5l)LmO˗.ztJAcfܹd]CTdI6^gԌwl\ugN5 ϞC!n,)WmΟ}etG$ ˙*$""ؑjGv=zj (v `0dee%$$ZS `\F0̞߰u ϋ h@_,â@DQDA!>z|ʤnnn^PT!a=SRRg0 pfJ@&t `t/Ps.?E PB)Raa0 ѽԦo  ?"y:hYt `t;(S(TT=R*YtgNaB`0 FfαP HHR:"%ĦxXz9`0k C)H ڕ!NN`0^[zFF_0 br*I"")mQ)-̫D`gAdr\PrB!*\.cEQyZ5';[R@R*Ji  `\CT6J(!(r H(!":yfrOW**R2r\8M8 JEQxjr=-%(Vy^VgpxTxt/cyIqԿS 1.;w:9:a„+6`\PJDJEI&GmQ$PQeB84 28+-lx)R|JU߸q VZ_^^Tp==G;Pe` D7RPQED(Pc1`伩.:},.ήxBtR%4aoH7RԬQjʽzӞio.|6 k^O=㟈9R; caXNhn P:w;۬fAN\Kk$L+{!` ơ8J)"p  :bbk]<|0ivjK@ц4kX{=W{, ?D˷純iW`Nᾋ\9,y@һ:E?UZS9++)}" cȢsz>yd3'5'vpRSy)뮟xSx[F{;F=<3кc3$@MNЇt?~eAJ>7eSӓC{|"kCϊtA)C?R)EaԄg?0CI)!!~uDA2m5 oF!o=|7mg4{ IDAT?%3G(B{z-ႚ2yjz\!$HZz'AWOM@ɼM~r}v KM5xW9ɤOouA6w>n : HgYfͶI!`D'01Bqaq#qc;%b1['f̽*@(f27]ֹ^R?RNwߊ[gJǑNpa[1܊&|Oop+3p"07v؃O_{_zpF?;{jԟ-k򸌕q*{F=tfʫؐ4dqէ?+:q?u@7pG'ks( ϳ/mY7$Bjrzt/_z+׏zp|Uw̝h<ڸJq/ EMwk{7=-6zno1ɽEhgQBZ:¬ H_EAGt"ŧR F'Aq!9,Yl(b00@0%1ƨeX ;] [[/W>&f`|)m(6)L߾3Lޞq/V2a۷}uWO ;.k#f~7[,S%g~u%v_H(Ss`끷hmc&|Rj\frvܻI!՟Z1땹gm}2 rޝYܛ$ҲhDeA@EvdAuFAvu3.( (#JGJ-۴Iiy~M6-m&޾}sͿ^:O*|?`4'jև703{ٿ ԱZϚז u~UYM&l\Rq]:=럫xQňr`0;"gIq'fƤey4u7W,MΜ@DѠ|oyMeKs%œs蹳O p˔19~\k΢ s[N޵^Y;n:'hQ84NDAq}ӫ[SFo׾'>} ӓ7V{)ھV',rھe;Ꮋ>8`9:,;k8oWٓUt?/}y;#-1y¼Ҏ?}v|k6FLo֪lza A{6AcWs;.~͙\/yUx/)g 3ZT6 ]9k[J'/88:V=םO)|``E|u='.+6񺿭/yBeV7V5dSƵ-s+%t>X˳ot8*>U)W6H< fa'lNȢ+fX̔DHhqq2 =l|5dN oS1g[{j}{~_NM7 k[OMJֿ>K˿^WZe/َWYږS+{0qUuh$Wm)~EVԓM;'ƿ\T>w;ݾUo\-[Vf4֒:=}SjW,m|q %tۖ;IC"∈:a31Q5r1焉ɔ8{:y/D|%E9'Dw˘F}K4ҧgKU'R}{g$^[)}Xw]ƲZ*Wl=tXg5tzj6T1=[۷2HOz+sZHR@nBE|[%-KT_23m)mRG[׷|@һo5=^zN5 SYؔỶc$$nj医PR7"?&E9oWzF#-)7Va't~x˭>mwۓ=MϫO<5$?s;㺯>'m-oJ304!J\9}ws#7WAiϿmߺrg"ٰ?sq!AņiqmkɀaN9{Ҽ]M>~wU̩Ȋq,ꗽYTE+D.,","1Pd"oF'+x?[ٚ=37-UϦ?ʓfP֡ٷ\ve$.:+W1cϿC-eG}JGC%t,m|]VQO?ݻ÷f^y9Wŋf6ŧ}op'Fx?=~'! TGږ9_~o7Jfwu~Ϝg=į /N|WL0|Vec6&a3f!3`']S<̩yDO55,Z{ύ3Z---VZhQ,eFPKK} /83hA$RUż^ʎs<5??ҥ .\tiYI1L9gE`9!b!bK-$"8XDYT$dbDnz92:a(Uo+#"er\N:y:YpjnUj~q]U dfb 38}MӨY"Oj]%8a|CacjFJ4hFs:YDZT&[LLs/_~YWYMX;DjĩlV{D:GsLNN'2:Y4h,:N%u[( :qHo*iH5tySSo/g}1O\gbd ]@fVªc33ԫ7j{F'|xߧt Ufj>\4GUUj^MH` 2Zj,s{bUU}* ]!̢aӗIev̼yUa=a妢JО?---cKxU{e]{5f 4` SjdjU똚i0tE,*1pJ,^L‰WQ! @ @2z3iW@G͓FSM!bFM,B6JFFDXo d LJ:fQI̩32"aFJ]WSnaLBNDD9FFƗpJXHHȌDMI8a"#BFfr02<"D91%N,,NLHLEEI焍MMM  #ޘ0cE+!HQ<oټz ]JN3t5RN}}C}}}e:wiӦlZ7md"V_?zΚJKJJJJya9SL$kVޱ@ Kͩ6jj{Gjޫz5M7|rrrҲ;{z4ћ&x|# ׿ʫLDO{k~vFY*Wf^z50UUW:f5:99K]a7EDuond3T!j8JM-^LZTcDN,` 3f> po +Z8{55tM=[kDDʪ⢡kjX0`| 㛰('?bȈR N,/eXSd2IDιիW;-: }QʹJMRLbXՈ81 tԂ-gLo`U*+OȟЛ^{ܓO9yA2igCs8=j^B,BNDXLy2:DTZZZUU0qS N/++kji-,ص2+fW^Y.,8E|rb!1!36%眄'r$Bc^l5k"ڹqgiYi߂uuִ#;'''77'H?ז/Xn暚`41fT\cff,DHLIDeFpO; Y+ 06U%++;_SOZ2ڴyi}onnnooSLs2ZiI3$ܸ 3cRet \00jެ hdoz LJ&/z=ԓ;;:.<| Ia7H"jo^W㌰8QS1ٱxv93Db&΍YNAI[XL}mHժQ"͉Y4t%2IMF >kqDDLsdD,cToEDUXMŜ;vjJBJ"Kq@f g]9auNHY$PvTȌ)]5r( 9N1;fapP~+}#NY٘Y 0" t̒J׈aMx x]!)"f jR1S0 ,"'5K(D4#o$ g8щ:abFFi7_@X N_|4jfmonZ"gW NP瘚!L߬qKoUMTL4u,݄8jaCFh8l/fdF4V:ѭdlewo d3R cR"ojToCWYl/ƝhjU8*:63S^MzSFjVpUU&V5TK t\ǥ%x5o9jj > T@o04rr9̎7>GN` 2MxU{e]{5CW,\0'ߘzU#Sjt0(+݊t E8^ދI8**DN ,ͼ]5OMf6@2r|4EFԈ E: ٸv%[7nΟPcǎҲܼܦzRߑ *V"b#;i!cwfq嘙IXcfwtvF*ٶe}OObлJ&N0u[\ëfg='ؚX<ܱٛLz>JO5({ϻl{yM˻ 浴wOH\p {ܳasěf+ּѓdSϚf'3^q͋+˷nRTTԛ| 2TEyU55U#Q5T_>RCMd{삲+z {:''7w#{{{WZݓ(NfwX21$zG~+>D%QPU]4y#Xň?0΄z5o5Q# :^U{cVDb}gn}pk7վ ?h3fz'ɞ# [:|GS˘(L> Cimi1}Ȝ3> g,DkxGs(/%ڇ9xkHבG=d Դô; &X oZdU 7|PS=5:꣱ut\v0z7mmUfȁd0y,NX#1/m۲~ %%: I$5OM(9q1 -///fdBpZམx<Lj03Uo7uU/OXpa翾$;: ZZX IDATm9#K_xqIc]c"&f:yR6'LȊ^MÉ>mS#<ЏzJN2֩;7)4q= '+.cD]Df<,ɤvZ_^#Աwq[mM$Z;F`MX TYddDNEHxFl@LA鍵?gfϞ\yӲv"Ĭ=dqq yeBmI_A~暵oO,gf.@8ʹJMRLbXՈ81 t&u' 99M,3k,":C?;ejC}6H_͋d,]Vo[|gl3<Ƞ6wZm^QY9B'#$\ k8}XEȉ0+23UFS}`Q&A}UUZV:|#(^b붕Ƕ7纞ΟU9_v tT}Z`U*d:Ah+^ͫZ1vȒūvv' 3Do2Tz7L, оW@'),S-1|St Ą::sm]n==A܅33"m4MNߪZڈbbynAXwFϼ#ߎ[xY*13Մf(%bMEo*DeդՇѶm۶mrƺk0wXCc}ꐹGdų̌•ζ͛7&.7qNGOpG}9iҤI&ڴj ;#//k.]k/{,b17mG~4X:|jR/+-nni?{YZZds%z:Ϛ3QP^^u };:FU[[['N8|Sclua999nٶ4g'MB"& ZzՄ,9c! 򲳳ojl-izڵs d`egg bFGBw{SIiDޛ3ښ 5x;@qΪɓ-Q<#c0t\LL1 fqnzoOm&hMՇeDD}NeE֭}gSgھgti}rgW%ڭ[;aiA7?Kg͚8JNs[هQA=M_3iF 3՝}uuu=h#l\;c,݃{޹O1s֖F`]puuuDTSSs%twwG#aZd"ՓIv[X`\W\}-++kҥ^{~/[+#d2 Hqb `_c0go/s83+++?O<_瞽ia4 H[yoJs,AwDX^$O$z!{1"m .Ə~{h:SfnXj}m-LC߼qaG'QZGgREً8'H45 )3JNnA٬MM½yW57>z?:oCU唙Diug,x{˙Id og:d^]i-5g>tGQ+3{9:;+*wZxC`@n{sΛn){?R:c[BnAY\|G[7cᾏN2dknŋŋÝ Z0pOU-;mڰC\17f͚=Cokjl0yg3m!ywu֭[xO555{ywy^06OsUK۷MiL $77G9fϞ裏3+!܂ec O<ŋ/، tv3}[ne8FxBo[ykZZZƺ 茆핎/q"pS 3~ٮO߳k]V5?"?O"Ddhrܸ/,,?~ii)::#'e˖GC3(: /\b~]tў$:z""&N}rBXȌDYY}@LQ䙄YkM˜) K٘(TDH16vO$N8l_\G☝c'$z&&&17W\qΝ;oz^QQ1TI~Pf>=ܺs0AKxEa"0J)* :#Ube"FY<*(T&JeSaxxp6f3U&35csJ*3¦=[}T ?T}G 'uqp-%ef3MA;)tMӦM-[v>}޼ tl0}Ѻ:"җ4̿ Q=%LUK$1'11wNˋ,, sff~jLLFN]8)#"Ŀ훚EiJ2?ȢGjL@{ AAڛ ׁ3񝔈>lܸ;زec=~voެ1t﮸ŋ~UUUPGr43)B //3U6c% )uFEjL"dbF¬"bdLDܿ >DwZ Aj&Dܿ}b2Է?WyM̈x'%{/͞=K/ݻj:aO=_ꫯ~ߺuM74a$fHI,1dzb΢K\!OK-,JLi_"1 E»~QP /S#K]ja*jf4>s8<('}G`뿆BDa:3!Ct{.\裏5RQQky'o։'^veI.9J%ÙxΉ w֮ӮQDLTUTճ2Q4P8E1qt KBd{oHXH̳'̓gfBzt?I,L#1ebb"rZ޼>Cw}7}?҂:tW~~Oh*Dv9"ιx㱾@>L4ٌ$ޅų&TC'"L"(F ?"_f&HDQ|*g}7E?7#3iGUęxaU3-.nBxwҼ}cz0 {x<ճoݼ~!sR>hu''1\LqffflBfJjIx9z0 />fv9f Wdf}n{OfYUܮeWaA>1D?UU4F|L{v"UfӺyGCz.:+-:P_xlvCnv,"\<74\N;(z /#Qpe'"9q¸^1E"1jTUh_¢Ϫ"Q)C?^Ȍż7Tߴq]{kϾkĉN:]C3JKKcO7ee9Y9'bs. w%̬h85l" pTRa63Eh茘A=7Z}MyRG`>{ UמDiGVO&'utUU_ܧxjjjD߾:ƺ R[[Xw޶bXOOʕ+g͚5ܡ񫹹y0.`[k֬YzuUUPV!_ro['O:u ۰a󻺺ڙ u5׌u22P ["\XX@-:!:{{iӦ񶶶pzwdݞb}@0-\nnʕ+LRYY9٥/ |/= u/:oA,ƺ0aXƁSu@ ÎQZ _F@A@&H@#+;;N}ޛQkoyk1F4{GN?]3ZO/|ï[xGKtu_|"jc/{4ؘ=64jllDgT%j_m8:ic/u۳tҭju֭ۗٷF=? Qjcܶm >RIʯ>^m;g9z`~_:Ts̶m6 ppC3| 4{ni;75qqqUygnм<7fwmO9Kkcݟ|62GTpߧv;;;pǫD͒cZܼc7u>ScfI}[AvOd:)Qjc1Sڰ??eCO䎧'7=>tՇtշ^hDD~c̩3˾xuWqTWWW}{/eiwt~C/.^۽ɓ}>'W=׮WWWWYX֪D~cUX5󫫫z&ڰ|GUWWxk-}WO>4|]~aIisק>:;6o*h|s.<_]"5}+ʏkh U Xw5ϻ%; )JOs^}xwZY}t*| _{4Vxo64LJ;:7`2ɦMMߩ]zһZ'>{j M{rs/u,:=UЍ ?o9{m}1*ūD>pzeŪ|s/TBG6w*k/5K+M=Å oZMͽ3O/-)));KnNK/|y( KWLMh.&"?8<&"ZxUhqC/Qv{k|)]6G!~G?M>Nqs zV~_9DD3Ok_z;FhÊ>{FE4+Γ'(zkn/[xhasG6mjW s1 ɚX]$%wo-.Y 5]_|3 +t>_jщ1" v۟YzOW$C=K 2 @g5lQC;m-vgk玮Soz^^&ߺs.Ë+nYv?ڗܷ8>_E-->t,kw~tY&C{gO_:aFi|Ӫ7{gZۋCvX;my؂~8*X_?l5\<Q MOܯYu?gq~_#,bKu!߹f:;_خS d_}YbJrcB ENu O;(gsQ„No~>7^C=':gd掉Z="uYԓ>غlG{d}»ϼs?ʼ1gNwnWϸaHբN8$z?aǥ,ؕsn=Ow+L{&gQOI'-ֳ~'6wT?|@SMm0.-:pK{?c7/L=O;KG>Y} j_K{l^)g)<t!e%6*kh` ]4q,酎]<ʷҿ:|薇|{v7C`B3j| ڗ頠iS[ޡw$/+fxss|UE?V?{DwkkW/tV~ؚ6OxgɀGݹ9*w4 |OshA㪺CgQw 6l%\1ýV,l4/8rSwe?_ObK;Ëw9ýJݻw;YZqvN\H.97TVkφ-X?i?\E>euԕ) !y Տ-J'1?oyK7N~k\Q'wNtY 'B镹OU.X BR-E13^WUvN\Hbܤ囟׾9m j,A,@@*Ѫ7ek mmVxapQIw避<1nPڀiO+ֺG(q[wb]sEZ,5 0OFhnoA&f)B)>xGܯ_۷T-0[[hS'nif}ǺRӇ6F;J1w0֧g\uEjjƨ<-7=!ke멅K9dqWFV*K_eyg+R[g߸-V.|]|4x3 Mmx]2|c??ygϩr׍/޻s0i]v./#D@?}g5jwe ޽{ǎ[TXqBLqp ӄiZXXVwѝbHp[>m寗 ucccO!UUUuٷ=noyd<75ߢa/gn&5~{W?qSиܓt=&!7Ҕ{LY蒐 LvY"!Lo>Ht.,'V5zϴJou֭XudϟEA]p<%:0g#2<´WE_3eן@NφI&=ޤǻ@X+Zta<@Ql(΂DhzT :#wFf$IQQD\V+J !Dr@ \L&"] K*8! pJE N_wT*t].#t.Z]WWGӴRx<]n#J1 ZJNjcbbj"Ѓ$ItiiNk٬V+M$ Wt=DR\\㭛ZoJɓ4Mr?KOF.Kq\ww)Ht:NJLLlQ4jwڕ\ܜHӴ։Bq<77ȑ#!,$PfYP\ qi322BXBkA^ ZׂD$: @z-HtkA^ Zu !AAT'QDhi펠ը4MzˇQ z`GO qv'Zs<z]IIV& Q KϊjJKK zt:B RPд.>!l6xWn艂-1ydM녨F'x\NgUuD"Q(Uƨҝ](3h+lpl޴vl6^74-Jf!A88eYSSSo^WWhx߼iYĺpͷhjt5,z^s9{+NTI$  P Ǩ8-_ՉUC4r$I K2<{^rܹsbĈTJQ8._uJ$, Z gn cŲY5K{^e?~.baCG^sFWTirn{b#H|FLJhFQT*Jr\RM6M\:(|W^=[Z|]n0! !Ag=HDJiFekZXUYYhozJEQ:EǼ  ނ}^||9['i};}x$ͥKvJP(fC'7gnTux9ò39qQ8c 46692))I.-V$I~,zw8!$8K/!C9&&fܸq{qcgMXO W#&DO-/z%iT(TQQQ\\Tj)6h&) q qy}MK!PćqŶtf:`k[eV߰)suwʬ=r&B1jNGgDEuaAbt^﫭۪q\NrS,+vI5ZU;yޫ~VX߷o p1y!)L(Ļm%' C0"Lr;;20x𐫯'Oϣu!Ų N&ν#[i)s6Xb0 &6q]ۇM1LD#' Am:e{8l0찴V/bkwN2 cD xN/s\m&v}a_3pZEN;{th0}_u 3\q:-W>/rP3":;q'66VIN/aYa)тuH$IR"(Dq\vΞ}W{o2o}쓓6@Lv !=!00q 0 o&qs$Ihڔ䔔RQP}ϪJa0œ%^c]%ݶW/r]6ˉjv}S {|KV-6qv'_-_*ʾ{ #/X=摯N0Y5sɷ5dc6=obֲi'vo.^W }Ҍ{skŢx7wU跄\7Ot;?xox[>dSoΚK]gܣ]aլ[UQUW0sM.*d5 ,;}'wo4ܴjow :χ?o>R|'=[[=ci.면3_}p_l?kl<6Yҋ)0aUb ;כb0sKq8Kl""--MLt*+;Tn7t}Q#86-9?qSÛgeb+^!A/ou擭T,z}\l\ttJ!.U^(o O9[ \uv>'\6'bl!}bS[Z8>>4}-ʅa̿$x@д931"A1gj?I˽>.XuzIIOIwK0j/V#A8{lj#јl׆nԮX$>x/:@~ͧoOMoyn@w؛GG>#L-qaW`$s>yyYu}YH`+[sE gDF54y_Oe_ 4Q.R_vަ ?|-ކ:LF#eVО :~08I)HTWWTWW3R1bhJMy_}u^!T!yo2,N[w gJf SR˾ԫ5*y1-r֔xo/éܑHuFvÀ;KsoyK<'q\UEibbXo0Ѷz颢Ąc7i{IDATlwi yB/I̓#J[IM-O!|kcm8-N/;&*[DWҸkd!F+97)i/WwV̙i  8#R0ʲ+_#P(D"T*FQT; n#"^]]-&:b/yja_)69Bi\&&jqA TUUɕI}뛢Qk1 |GVu[ێ۽hƢrIҴE~.uso8ƋvymEWbBs, t. 3L\:;{+N[%? z|\~!Hw\{>D{%d~Sw +sxI]˷v*{+>?o7$H6`T90'$%Ys~\Ω d" gDEuW!!DDAAֈAH$+JJR)J\.~߼biP1.:p")b퉦/Ç止tb2ҡG'/Qs5)AT",~o~A!j~r^|/޸gߐtŭK&}cd .bcn iʛn}sڠĴyx +gm.MdK>pES̉)W^~~PU+-wCCs{,H ^7,@ .f?N&M fNL/.fJ et`OUJ$V[QQvV^sc###5bCƙڨay=O/h|ᓻ2Sc󗷗G-Iw_w]91-C}鱯ʐ?^uhWL{ĐW7ngee?iR)>sɒ%=1 iG}$v;ݻwoܸQyfً0_}o[&C Ϙ EuUE9BH&%$۷/$[mh1!t Vcd8NA)C3 ?}j“ScP$?,}! jnXvrBDNg(--5LQQQ X,^`y<**ReqK7tJm1xȰ$JwޝP(78Xhs^/05556mJ82L0A@M;!k(|cB(D˃ C 02e5ƛ1*o1ָ?#*zCosj؂I߿ ZyD}Gƕ3z~ 08rX^^n2x/++UUU<766*Jmw.2@qgM8|WeB6lxZ>Jx=1qݓn+6Q5>kBlO =>:H@ 9uT*X)6Q*qPjg%lP<<]{Ⱥ3l?]QQiXı4MWTTh4.Wa՞gDwGu[jf)JKJJ,qܸ `rYM"޽ٳ* ѣS4sR&}vrB!;1y!٢ФhB$PR c4Z++ BrFggg `0JJJbccyjnp܂^ڟ&9SXX wڅaĻu<{͛7r Ϛ'#4GE! ZOT#" rh݋aH93 EEElj3YE"tIw.X#mΝ;l6{^D{:8x1˩^fM^^B{߹`Q7A]h:#k< NK k/.*qa-[ܹ3--mQQQWWW; ȴiiL >ALtP*s %ո\=)d.>Aꖂ8zOcシ.|NegcL:Z ՠ[@T'QRp y\2KiA]"Zc6G+]܊$Q z`GOh5i4**P \Rdf!Q z`GOG]8Pr<Fۧ%w9jbՠ ATB4/FׂD$: @z-HtkA^ ZׂDVg]g9~;#uĒ\YN{tMt@x,^.\ݫrr&Nv^}MWЀnI&%Ŀ/p@w`]N!W.ĉ#FI2 vjt-:^a%!$$0 '=X֖U5XMrr%IMu5q[U(;@jРAETWK% !{׮XsLwRLr2 %YY8Bñ.$h/Grkj @5u:޻gs:d$(@8cYב$9v8KtD7m릲tMӧOb@IENDB`marionnet-0.90.6+bzr434.orig/doc-src/NETWORK-SIMULATION0000600000175000017500000001005312167200764020651 0ustar lucaslucas Compilation of the user network into the simulated network ========================================================== machines -------- Each machine is implemented by a Machine connected to one distinct Hublet SM1-J per network interface ethJ. Bandwidth limitation and defects due to a _port_ (not to a cable) are implemented via Y cables named YM-J linking each SM1-J hublet with another hublet named SM2-J. SM2-J can be throght as the node implementing ethJ, and the wire connected to it can be safely destroyed and re-created at runtime, without stopping the simuation. +------+ +-----+ YM-0 +-----+ | Eth0-----------|SM1-0|-----------|SM2-0|[[eth0]] | | +-----+ +-----+ | M | | | -----Ssl0 | | | +-----+ YM-1 +-----+ | Eth1-----------+SM1-1|-----------|SM2-1|[[eth1]] +------+ +-----+ +-----+ Serial lines are non-movable, and directly implemented by M's ssl? interfaces as emulated by UML. Serial lines can only directly link pairs of machines. switches/hubs ------------- A switch or hub is implemented by a Switch connected to one Hublet SS-J by a wire YS-J, for each port J. YS-J embodies the defects of portJ. Each hublet SS-J is the implementation of portJ. Note that the index of the Switch port where an YS-J is connected is not significant. This simplifies the implementation, as VDE switches don't allow to specify which port should be involved at connection time. +-------+ | | YS-1 +----+ |Whatever-----------+SS-1|[[port1]] | | +----+ | | | | YS-2 +----+ |Whatever-----------+SS-2|[[port2]] | | +----+ | S | | | YS-3 +----+ |Whatever-----------+SS-3|[[port3]] | | +----+ | | | | YS-4 +----+ |Whatever-----------+SS-4|[[port4]] | | +----+ +-------+ routers ------- As a router is implemented by a (properly configured) Machine, it is compiled just as a machine, where ethJ is replaced by port(J+1). Routers have no serial lines. +------+ +-----+ YM-0 +-----+ | Eth0-----------|SM1-0|-----------|SM2-0|[[port1]] | | +-----+ +-----+ | | | | +-----+ YM-1 +-----+ | Eth1-----------+SM1-1|-----------|SM2-1|[[port2]] | | +-----+ +-----+ | M | | | +-----+ YM-2 +-----+ | Eth2-----------+SM1-2|-----------|SM2-1|[[port3]] | | +-----+ +-----+ | | | | +-----+ YM-3 +-----+ | Eth3-----------+SM1-3|-----------|SM2-1|[[port4]] | | +-----+ +-----+ +------+ cables ------ A user cable can connect pairs of objects of several kinds. The user is free to connect objects with cables having incorrect crossoverness. Objects to link | Correct "crossoverness" .................................................. machine to machine | x machine to switch/hub | c machine to router | c switch/hub to switch/hub | x router to switch/hub | x router to router | x (we don't mention symmetrical cases) In all the cases above a user cable can be compiled into a simulated Cable Y. Bandwidth limitation and cable defects due to the cable itself can be directly implemented within the Cable. If the user cable "crossoverness" is incorrect then Y in configured to lose all packets. Y ---------------- Ghostified Interfaces --------------------- Each Machine implementing a machine or a router (To do: is it needed for routers?) has an extra interface Eth42, ghostified at startup, and linked to a host tap device. gateways -------- A gateway is compiled into a Hublet SG connected via a cable Y to a two-port Hub G (which does not represent a user-network Port), at one end of which there's a tap host interface. All the defects of the single gateway port eth0, if any, are implemented in Y. +---+ Y +--+ (tap)| H +---------+SG|[[eth0]] +---+ +--+ marionnet-0.90.6+bzr434.orig/doc/0000700000175000017500000000000012167200764015325 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/gui/0000700000175000017500000000000012167200764015344 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/gui/gui_menubar_MARIONNET.ml0000600000175000017500000003075712167200764021625 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009 Luca Saiu Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext;; (** Gui completion for the menubar_MARIONNET widget defined with glade. *) (* Shortcuts *) module EDialog = Talking.EDialog module Msg = Talking.Msg let mkenv = Environment.make_string_env let check_path_name_validity_and_add_extension_if_needed = Talking.check_path_name_validity_and_add_extension_if_needed open GdkKeysyms open GtkStock module Make (State:sig val st:State.globalState end) = struct open State (* Create the factory linked to the menubar. *) module F = Menu_factory.Make (struct let parent = Menu_factory.Menubar st#mainwin#menubar_MARIONNET let window = st#mainwin#window_MARIONNET end) include F (* **************************************** * Menu "Project" * **************************************** *) let project = add_menu (s_ "_Project" ) module Common_dialogs = struct (* Dialog used both for "New" and "Open" *) let save_current () = if st#active_project then EDialog.ask_question ~help:None ~cancel:true ~gen_id:"save_current" ~title:(s_ "Close" ) ~question:(s_ "Do you want to save the current project?") () else (Some (mkenv [("save_current","no")])) end type env = string Environment.string_env let env_to_string (t:env) = t#to_string (fun s->s) module Created_entry_project_new = Menu_factory.Make_entry (struct type t = env let to_string = env_to_string let text = (s_ "New" ) let stock = `NEW let key = (Some _N) let dialog = let filename () = EDialog.ask_for_fresh_writable_filename ~title:(s_ "Name of the new project" ) ~filter_names:[`MAR;`ALL] ~help:(Some Msg.help_nom_pour_le_projet) () in (EDialog.sequence [Common_dialogs.save_current; filename]) let reaction r = begin st#shutdown_everything (); let filename = check_path_name_validity_and_add_extension_if_needed (r#get "filename") in let actions () = begin st#close_project; st#new_project filename ; end in if (st#active_project) && ((r#get "save_current") = "yes") then (st#save_project; Task_runner.the_task_runner#schedule ~name:"new project" actions) else (actions ()) end end) (F) let project_new = Created_entry_project_new.item module Created_entry_project_open = Menu_factory.Make_entry (struct type t = env let to_string = env_to_string let text = (s_ "Open" ) let stock = `OPEN let key = (Some _O) let dialog = let filename_dialog () = EDialog.ask_for_existing_filename ~title:(s_ "Open an existing Marionnet project" ) ~filter_names:[`MAR; `ALL] ~help:(Some Msg.help_nom_pour_le_projet) () in (EDialog.sequence [Common_dialogs.save_current; filename_dialog]) let reaction r = begin st#shutdown_everything (); let filename = (r#get "filename") in let actions () = begin st#close_project; try st#open_project filename; with e -> ((Simple_dialogs.error (s_ "Open a project") ((s_ "Failed to open the file ")^filename) ()); raise e) end in if (st#active_project) && ((r#get "save_current")="yes") then (st#save_project; Task_runner.the_task_runner#schedule ~name:"open_project" actions) else (actions ()) end end) (F) let project_open = Created_entry_project_open.item let project_save = add_stock_item (s_ "Save" ) ~stock:`SAVE ~callback:(fun () -> if st#is_there_something_on_or_sleeping () then Msg.error_saving_while_something_up () else st#save_project) () module Created_entry_project_save_as = Menu_factory.Make_entry (struct type t = env let to_string = env_to_string let text = (s_ "Save as" ) let stock = `SAVE_AS let key = None let dialog () = EDialog.ask_for_fresh_writable_filename ~title:(s_ "Save as" ) ~filter_names:[`MAR; `ALL] ~help:(Some Msg.help_nom_pour_le_projet) () let reaction r = if st#is_there_something_on_or_sleeping () then Msg.error_saving_while_something_up () else let filename = check_path_name_validity_and_add_extension_if_needed ~extension:"mar" (r#get "filename") in try st#save_project_as filename; with _ -> (Simple_dialogs.error (s_ "Save project as") ((s_ "Failed to save the project into the file ")^filename) ()) end) (F) let project_save_as = Created_entry_project_save_as.item module Created_entry_project_copy_to = Menu_factory.Make_entry (struct type t = env let to_string = env_to_string let text = (s_ "Copy to" ) let stock = `SAVE_AS let key = None let dialog () = EDialog.ask_for_fresh_writable_filename ~title:(s_ "Copy to" ) ~filter_names:[`MAR; `ALL] ~help:(Some Msg.help_nom_pour_le_projet) () let reaction r = if st#is_there_something_on_or_sleeping () then Msg.error_saving_while_something_up () else let filename = check_path_name_validity_and_add_extension_if_needed ~extension:"mar" (r#get "filename") in try st#copy_project_into filename with _ -> (Simple_dialogs.error (s_ "Project copy to" ) ((s_ "Failed to copy the project into the file ")^filename) ()) end) (F) let project_copy_to = Created_entry_project_copy_to.item module Created_entry_project_close = Menu_factory.Make_entry (struct type t = env let to_string = env_to_string let text = (s_ "Close" ) let stock = `CLOSE let key = (Some _W) let dialog () = EDialog.ask_question ~help:None ~cancel:true ~title:(s_ "Close" ) ~question:(s_ "Do you want to save the current project?") () let reaction r = begin st#shutdown_everything (); let () = if (st#active_project) && ((r#get "answer") = "yes") then st#save_project else () in st#close_project; end end) (F) let project_close = Created_entry_project_close.item let separator = project#add_separator () module Created_entry_project_export = Menu_factory.Make_entry (struct type t = env let to_string = env_to_string let text = (s_ "Export image" ) let stock = `CONVERT let key = None let dialog () = let extra_widget = let (combo_box, get_selected) = Dot_widget.combo_of_working_output_formats ~active:`png () in let widget_reader () = let frm = get_selected () in Dot.string_of_output_format frm in let table = GPack.table ~rows:2 ~columns:1 ~row_spacings:10 ~homogeneous:false () in let _ = GMisc.label ~xalign:0.5 ~markup:(""^(s_ "Output format")^"") ~packing:(table#attach ~left:0 ~top:0) () in (table#attach ~left:0 ~top:1 combo_box#coerce); (table#coerce, widget_reader) in EDialog.ask_for_fresh_writable_filename ~title:(s_ "Export network image" ) ~filters:(Dot_widget.make_all_working_filters ()) ~filter_names:[`ALL] ~extra_widget ~help:None () let reaction r = let output_format = (r#get "extra_widget") in let filename = check_path_name_validity_and_add_extension_if_needed ~extension:output_format (r#get "filename") in let command = Printf.sprintf "dot -T%s -o %s %s" output_format filename st#dotSketchFile in let on_error () = Simple_dialogs.error "Export network image" ((s_ "Failed to export network image to the file ")^filename^" (format "^output_format^")") () in try Log.system_or_fail command; st#flash ~delay:8000 ((s_ "Network image correctly exported to the file ")^filename) with _ -> on_error () end) (F) let project_export = Created_entry_project_export.item module Created_entry_project_quit = Menu_factory.Make_entry (struct type t = env let to_string = env_to_string let text = (s_ "Quit") let stock = `QUIT let key = (Some _Q) let dialog () = if ((not st#active_project) || st#project_already_saved) then (Some (mkenv [("answer","no")])) else Talking.EDialog.ask_question ~help:None ~cancel:true ~title:(s_ "Quit") ~question:(s_ "Do you want to save\nthe current project before quitting?") () let reaction r = (* At this point the user really wants to quit the application. *) let save = (st#active_project) && ((r#get "answer") = "yes") in (match st#is_there_something_on_or_sleeping (), save with | true, true -> st#shutdown_everything (); st#save_project; | true, false -> st#poweroff_everything (); | false, true -> st#save_project; | false, false -> () ); Log.printf "Killing the death monitor thread...\n"; Death_monitor.stop_polling_loop (); st#network#destroy_process_before_quitting (); st#close_project; st#quit_async () end) (F) let project_quit = Created_entry_project_quit.item (* **************************************** * Menu "Options" * **************************************** *) let options = add_menu (s_ "_Options") module Created_entry_options_cwd = Menu_factory.Make_entry (struct type t = env let to_string = env_to_string let text = (s_ "Change the temporary working directory") let stock = `DIRECTORY let key = None let dialog () = Talking.EDialog.ask_for_existing_writable_folder_pathname_supporting_sparse_files ~title:(s_ "Choose the temporary working directory") ~help:(Some Msg.help_repertoire_de_travail) () let reaction r = st#temporary_directory#set (r#get "foldername") end) (F) let options_cwd = Created_entry_options_cwd.item let options_autogenerate_ip_addresses = add_check_item (s_ "Auto-generation of IP address" ) ~active:Global_options.autogenerate_ip_addresses_default ~callback:(fun active -> Log.printf "You toggled the option (IP)\n"; Global_options.set_autogenerate_ip_addresses active) () let options_debug_mode = add_check_item (s_ "Debug mode") ~active:(Global_options.Debug_level.are_we_debugging ()) ~callback:(fun active -> Log.printf "You toggled the option (debug)\n"; Global_options.Debug_level.set 1) () let options_keep_all_snapshots_when_saving = add_check_item (s_ "Keep all snapshots when saving (not only the most recent ones)") ~active:(Global_options.Keep_all_snapshots_when_saving.extract ()) ~callback:(fun active -> Log.printf "You toggled the option (keep al snapshots)\n"; Global_options.Keep_all_snapshots_when_saving.set active) () (** Hidden to user in this version. *) let workaround_wirefilter_problem = add_check_item "Workaround wirefilter problem" ~active:Global_options.workaround_wirefilter_problem_default ~callback:(fun active -> Log.printf "You toggled the option (wirefilter)\n"; flush_all (); Global_options.set_workaround_wirefilter_problem active) () let () = workaround_wirefilter_problem#coerce#misc#hide () (* **************************************** * Menu "Help" * **************************************** *) let help = add_menu (s_ "_Help") let help_apropos = let module D = Gui_dialog_A_PROPOS.Make (State) in let callback () = let dialog = D.dialog () in let _ = dialog#closebutton_A_PROPOS#connect#clicked ~callback:(dialog#toplevel#destroy) in () in add_stock_item (s_ "Help") ~stock:`ABOUT ~callback () (* **************************************** * Sensitiveness * **************************************** *) let () = List.iter (* when Active *) (fun w -> st#sensitive_when_Active#insert w#coerce) [project_save; project_save_as; project_copy_to; project_close; project_export] let () = List.iter (* when NoActive *) (fun w -> st#sensitive_when_NoActive#insert w#coerce) [options_cwd] end marionnet-0.90.6+bzr434.orig/gui/talking.ml0000600000175000017500000003522012167200764017333 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007, 2009 Luca Saiu Copyright (C) 2007, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** All dialogs are implemented here. This module provide the capability for user to talk with the application. Specifically, the name "Talking" stands here for "Talking with user". *) #load "include_as_string_p4.cmo" ;; (** Return the given pathname as it is, if it doesn't contain funny characters we don't want to bother supporting, like ' ', otherwise raise an exception. No check is performed on the pathname actual existence or permissions: *) let check_pathname_validity pathname = if StrExtra.First.matchingp (Str.regexp "^[.a-zA-Z0-9_\\/\\-]+$") pathname then pathname else failwith "The pathname "^ pathname ^" contains funny characters, and we don't support it";; (** Return true iff the the given directory exists and is on a filesystem supporting sparse files. This function doesn't check whether the directory is writable: *) let does_directory_support_sparse_files pathname = (* All the intelligence of this method lies in the external script, loaded at preprocessing time: *) let content = INCLUDE_AS_STRING "scripts/can-directory-host-sparse-files.sh" in try match UnixExtra.script content [(check_pathname_validity pathname)] with | (0,_,_) -> true | _ -> false with _ -> false ;; (* Shortcuts *) let mkenv = Environment.make_string_env ;; (* **************************************** * Module MSG * **************************************** *) open Gettext;; (** Some tools for building simple help, error, warning and info dialogs *) module Msg = struct (** I moved some stuff into simple_dialogs.ml. It's useful for lots of other modules, not only for talking. --L. *) (** Specific help constructors*) (** Why you have to choose a folder to work *) let help_repertoire_de_travail = let title = (s_ "CHOOSE A TEMPORARY WORKING DIRECTORY") in let msg = (s_ "Marionnet can use a directory of your choice for its temporary files. \ Every file created in the directory will be deleted at exit time. \ If the program is run from the Marionnet live DVD, you are advised to \ use a persistent directory (in /mnt/hd*), in order to not waste \ your system physical memory.") in Simple_dialogs.help title msg ;; let error_saving_while_something_up = Simple_dialogs.error (s_ "Warning") (s_ "The project can't be saved right now. \ One or more network components are still running. \ Please stop them before saving.") ;; (** Why you have to choose a name for your project *) let help_nom_pour_le_projet = let title = (s_ "CHOOSE A NAME FOR THE PROJECT") in let msg = (s_ "\ Marionnet saves every files belonging to a project in a file with extension .mar. \ It is a standard gzipped tarball which can also be opened with standard tools.") in Simple_dialogs.help title msg ;; end;; (* module Msg *) (** Check that the given pathname is acceptable, and that it has the correct extension or no extension; if the argument has the corret extension then just return it; it it's otherwise valid but has no extension then return the argument with the extension appended; if it's invalid or has a wrong extension then show an appropriate error message and raise an exception. This function is thought as a 'filter' thru which user-supplied filenames should be always sent before use. The optional argument extension should be a string with *no* dot *) let check_path_name_validity_and_add_extension_if_needed ?(extension="mar") path_name = let directory = Filename.dirname path_name in let correct_extension = "." ^ extension in let directory = try check_pathname_validity directory with _ -> begin Simple_dialogs.error (s_ "Invalid directory name") (Printf.sprintf (f_ "The name \"%s\" is not a valid directory.\n\nDirectory names \ must contain only letters, numbers, dots, dashes ('-') and underscores ('_').") directory) (); failwith "the given directory name is invalid"; end in let path_name = Filename.basename path_name in let check_chopped_basename_validity chopped_basename = if StrExtra.Class.identifierp ~allow_dash:() chopped_basename then chopped_basename else begin Simple_dialogs.error (s_ "Invalid file name") (Printf.sprintf (f_ "The name \"%s\" is not a valid file name.\n\nA valid file \ name must start with a letter and can contain letters, numbers, dashes ('-') and underscores ('_').") chopped_basename) (); failwith "the given file name is invalid"; end in if Filename.check_suffix path_name correct_extension then (* path_name does end with the correct extension; just check that its chopped version is ok: *) Printf.sprintf "%s/%s%s" directory (check_chopped_basename_validity (Filename.chop_extension path_name)) correct_extension else (* path_name doesn't end with the correct extension: *) try let _ = Filename.chop_extension path_name in (* There is an extension but it's not the correct one; fail: *) Simple_dialogs.error (s_ "Invalid file extension") (Printf.sprintf (f_ "The file \"%s\" must have an extension \"%s\", or no extension at all (in which case the extension \"%s\" will be added automatically).") path_name correct_extension correct_extension) (); failwith ("the given file name has an extension but it's not \"" ^ correct_extension ^ "\"."); with Invalid_argument _ -> (* There is no extension; just check that the filename is otherwise valid, and add the extension: *) Printf.sprintf "%s/%s%s" directory (check_chopped_basename_validity path_name) correct_extension;; (* **************************************** * Module EDialog * **************************************** *) (** An EDialog (for Environnemnt Dialog) is a dialog which may returns an environnement in the form (id,value) suitable for functions implementing reactions *) module EDialog = struct (** An edialog is a dialog which returns an env as result if succeed *) type env = string Environment.string_env type edialog = unit -> env option (** Dialog related exceptions. *) exception BadDialog of string * string;; exception StrangeDialog of string * string * (string Environment.string_env);; exception IncompleteDialog;; (** The (and) composition of edialogs is again an env option *) let rec compose (dl:edialog list) () (*: ((('a,'b) Environment.env) option)*) = match dl with | [] -> raise (Failure "EDialog.compose") | [d] -> d () | d::l -> (match d () with | None -> None | Some (r:env) -> (match (compose l ()) with | None -> None | Some z -> Some (Environment.string_env_updated_by r z) ) ) ;; (** Alias for edialog composition *) let sequence = compose;; (** Auxiliary functions for file/folder chooser dialogs *) let default d = function | None -> d | Some v -> v ;; (** Filters *) let image_filter () = let f = GFile.filter ~name:"Images" () in f#add_custom [ `MIME_TYPE ] (fun info -> let mime = List.assoc `MIME_TYPE info in StringExtra.is_prefix "image/" mime) ; f ;; (* let all_files () = let f = GFile.filter ~name:"All" () in (f#add_pattern "*"); f ;; *) let all_files () = GFile.filter ~name:"All" () ~patterns: ["*"] ;; let script_filter () = GFile.filter ~name:"Scripts Shell/Python (*.sh *.py)" ~patterns:[ "*.sh"; "*.py" ] () ;; let mar_filter () = GFile.filter ~name:"Marionnet projects (*.mar)" ~patterns:[ "*.mar"; ] () ;; let xml_filter () = GFile.filter ~name:"XML files (*.xml)" ~patterns:[ "*.xml"; "*.XML" ] () ;; let jpeg_filter () = GFile.filter ~name:"JPEG files (*.jpg *.jpeg)" ~patterns:[ "*.jpg"; "*.JPG"; "*.jpeg"; "*.JPEG" ] ();; let png_filter () = GFile.filter ~name:"PNG files (*.png)" ~patterns:[ "*.png"; "*.PNG" ] () ;; (** Filters for Marionnet *) (* type filter_name = [ `MAR | `ALL | `IMG | `SCRIPT | `XML | `JPEG | `PNG ];; *) (** The kit of all defined filters *) let allfilters = [ `ALL ; `MAR ; `IMG ; `SCRIPT ; `XML ; `JPEG ] ;; let get_filter_by_name = function | `MAR -> mar_filter () | `IMG -> image_filter () | `SCRIPT -> script_filter () | `XML -> xml_filter () | `JPEG -> jpeg_filter () | `PNG -> png_filter () | `ALL -> all_files () | `DOT name -> Dot_widget.filter_of_format name ;; (* (`vmlz, "vmlz", "Compressed Vector Markup Language (VML)", "XML document text (gzip compressed data, from Unix)"); *) (** The edialog asking for file or folder. It returns a simple environment with an unique identifier [gen_id] bound to the selected name *) let ask_for_file ?(enrich=mkenv []) ?(title="FILE SELECTION") ?(valid:(string->bool)=(fun x->true)) ?(filter_names = allfilters) ?(filters:(GFile.filter list)=[]) ?(extra_widget:(GObj.widget * (unit -> string)) option) ?(action=`OPEN) ?(gen_id="filename") ?(help=None)() = let dialog = GWindow.file_chooser_dialog ~icon:Icon.icon_pixbuf ~action:action ~title ~modal:true () in dialog#unselect_all ; if (help=None) then () else dialog#add_button_stock `HELP `HELP ; dialog#add_button_stock `CANCEL `CANCEL ; dialog#add_button_stock `OK `OK; ignore (dialog#set_current_folder (Initialization.cwd_at_startup_time)); dialog#set_default_response `OK; Option.iter (fun (w,r) -> dialog#set_extra_widget w) extra_widget; if (action=`SELECT_FOLDER) then (try (dialog#add_shortcut_folder "/tmp") with _ -> ()); if (action=`OPEN or action=`SAVE) then begin let filter_list = List.append (List.map get_filter_by_name filter_names) filters in List.iter dialog#add_filter filter_list; end; let result = (ref None) in let cont = ref true in while (!cont = true) do begin match dialog#run () with | `OK -> (match dialog#filename with | None -> () | Some fname -> if (valid fname) then begin cont := false; enrich#add (gen_id,fname); Option.iter (fun (w,reader) -> enrich#add ("extra_widget",reader ())) extra_widget; result := Some enrich end ) | `HELP -> (match help with | Some f -> f (); | None -> () ) | _ -> cont := false end done; dialog#destroy (); !result ;; (** The edialog asking for an existing and writable directory. *) let ask_for_existing_writable_folder_pathname_supporting_sparse_files ?(enrich=mkenv []) ?(help=None) ~title () = let valid = fun pathname -> if (not (Sys.file_exists pathname)) or (not (Shell.dir_comfortable pathname)) or (not (does_directory_support_sparse_files pathname)) then begin Simple_dialogs.error (s_ "Invalid directory") (s_ "Choose a directory which is existing, modifiable and hosted on a filesystem supporting sparse files (ext2, ext3, ext4, reiserfs, NTFS, ...)") (); false; end else true in ask_for_file ~enrich ~title ~valid ~filter_names:[] ~action:`SELECT_FOLDER ~gen_id:"foldername" ~help () ;; (** The edialog asking for a fresh and writable filename. *) let ask_for_fresh_writable_filename ?(enrich=mkenv []) ~title ?(filters:(GFile.filter list) option) ?filter_names ?(extra_widget:(GObj.widget * (unit -> string)) option) ?(help=None) = let valid x = if (Sys.file_exists x) then ((Simple_dialogs.error (s_ "Name choice") (s_ "A file with the same name already exists!\n\nChoose another name for your file.") ()); false) else (Shell.freshname_possible x) in let result = ask_for_file ~enrich ~title ~valid ?filters ?filter_names ?extra_widget ~action:`SAVE ~gen_id:"filename" ~help in result;; (** The edialog asking for an existing filename. *) let ask_for_existing_filename ?(enrich=mkenv []) ~title ?(filter_names = allfilters) ?(help=None) () = let valid = fun x -> if not (Sys.file_exists x) then ((Simple_dialogs.error (s_ "File choice") (s_ "The file doesn't exists!\nYou must choose an exiting file name.") ()); false) else (Shell.regfile_modifiable x) in ask_for_file ~enrich ~title ~valid ~filter_names ~action:`OPEN ~gen_id:"filename" ~help () ;; (** Generic constructor for question dialogs. With the 'enrich' optional parameter the dialog can enrich a given environnement. Otherwise it creates a new one. *) let ask_question ?(enrich=mkenv []) ?(title="QUESTION") ?(gen_id="answer") ?(help=None) ?(cancel=false) ~(question:string) () = let dialog=new Gui.dialog_QUESTION () in if (help=None) then () else dialog#toplevel#add_button_stock `HELP `HELP ; if (cancel=false) then () else dialog#toplevel#add_button_stock `CANCEL `CANCEL ; dialog#toplevel#set_title title; dialog#title_QUESTION#set_use_markup true; dialog#title_QUESTION#set_label question; ignore (dialog#toplevel#event#connect#delete ~callback:(fun _ -> Log.printf "Sorry, no, you can't close the dialog. Please make a decision.\n"; true)); let result = (ref None) in let cont = ref true in while (!cont = true) do match dialog#toplevel#run () with | `YES -> begin cont := false; enrich#add (gen_id,"yes"); result := Some enrich end | `NO -> begin cont := false; enrich#add (gen_id,"no" ); result := Some enrich end | `HELP -> (match help with | Some f -> f (); | None -> () ) | `CANCEL when cancel -> begin cont := false; result := None end | _ -> cont := true; (* No, the user has to make a decision *) done; dialog#toplevel#destroy (); !result ;; end;; (* EDialog *) marionnet-0.90.6+bzr434.orig/gui/menu_factory.ml0000600000175000017500000001543512167200764020403 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** Tools for making menus (with or without a menubar). *) #load "include_type_definitions_p4.cmo" ;; INCLUDE DEFINITIONS "gui/menu_factory.mli" let fresh_path = let x = ref 0 in function () -> let result = "/") in let () = incr x in result (** Make a module with tools for adding and managing items to a given parent (menubar or menuitem). If a menubar not provided, a fresh one is created just for the factory definition. In this case, the connection with the menu_item_skel parent will be fixed after the inclusion by a calling to the function get_menu (). *) module Make (M: Parents) = struct (* In the case of menu_item, this value will be defined immediately. *) let current_menu = ref None let accel_path = fresh_path () let create_shell_for_simple_menu menu = let result = (new GMenu.factory ~accel_path menu) in let () = M.window#add_accel_group result#accel_group in let () = (current_menu := Some result) in (result#menu :> GMenu.menu_shell) let create_subshell_for_menu_item mi = let simple_menu = GMenu.menu ~packing:(mi#set_submenu) () in create_shell_for_simple_menu simple_menu let shell = match M.parent with | Menubar mb -> mb | Menuitem mi -> create_subshell_for_menu_item mi | Menu m -> create_shell_for_simple_menu m let factory = new GMenu.factory ~accel_path shell let accel_group = factory#accel_group let () = M.window#add_accel_group accel_group (* This function is typically called only when the parent is a menu_item. *) let get_current_menu () = match !current_menu with | Some menu -> menu | None -> failwith "No current menu defined in this factory." (* Typically used for menubars *) let add_menu title = let menu = factory#add_submenu title in let result = new GMenu.factory menu ~accel_path ~accel_group in let () = (current_menu := Some result) in result (* Useful for dynamic submenus. *) let recreate_subshell () = match M.parent with | Menuitem mi -> let s = match mi#get_submenu with Some x -> x | None -> assert false in s#destroy (); create_subshell_for_menu_item mi | Menubar _ -> failwith "Not allowed action: this factory has been created for a menubar." | _ -> assert false (* Now tools: *) let not_implemented_yet _ = Log.printf "NOT IMPLEMENTED YET!!!!!\n" let monitor label _ = Log.printf "Menu entry with label \"%s\" selected by user\n" label let add_item ?(menu = get_current_menu ()) ?submenu ?(key=0) label ?(callback=(monitor label)) () = let result = menu#add_item label ~key ~callback in let () = match submenu with None -> () | Some submenu -> (result#set_submenu submenu) in result let add_stock_item ?(menu = get_current_menu ()) ?submenu ?(key=0) label ~stock ?(callback=(monitor label)) () = let result = menu#add_image_item ~image:(GMisc.image ~stock ())#coerce ~key ~callback ~label () in let () = match submenu with None -> () | Some submenu -> (result#set_submenu submenu) in result let add_imagefile_item ?(menu = get_current_menu ()) ?submenu ?(key=0) ?(label="") file ?(callback=(monitor file)) () = let result = menu#add_image_item ~label ~image:(GMisc.image ~file ())#coerce ~key ~callback () in let () = match submenu with None -> () | Some submenu -> (result#set_submenu submenu) in result let add_check_item ?(menu = get_current_menu ()) ?(active=false) ?(key=0) label ?(callback=(monitor label)) () = menu#add_check_item label ~key ~active ~callback let add_separator ?(menu = get_current_menu ()) () = ignore (menu#add_separator ()) (* Useful shortcuts when the result of the functor is included. *) let parent = M.parent let window = M.window end (* Shortcuts *) let mkenv = Environment.make_string_env (** Useful when there is no dialog preceeding the reaction: *) let no_dialog_but_simply_return_name = fun name () -> Some name module Side_effects_of (E:sig type t val to_string : t -> string end) = struct let none_effect () = Log.printf "--- Dialog result: NOTHING TO DO (CANCELED)\n" let some_effect t = let msg = Printf.sprintf "--- Dialog result:\n%s------------------\n" (E.to_string t) in (Log.printf "%s" msg) end let compose ?none_effect ?some_effect (heuristic:'a -> 'b option) (procedure:'b -> unit) = fun x -> match (heuristic x), none_effect, some_effect with | None , None , _ -> () | None , Some f, _ -> let () = f () in () | Some y , _ , None -> procedure y | Some y , _ , Some f -> let () = f y in (procedure y) module Make_entry = functor (E : Entry_definition) -> functor (F : Factory) -> struct let item = let key = match E.key with None -> 0 | Some k -> k in F.add_stock_item ~key E.text ~stock:E.stock () include Side_effects_of (E) let callback = compose ~none_effect ~some_effect (E.dialog) (E.reaction) let connect = item#connect#activate ~callback end module Make_entry_with_children = functor (E : Entry_with_children_definition) -> functor (F : Factory) -> struct let item = F.add_stock_item E.text ~stock:E.stock () (* Submenu *) module Submenu = Make (struct let parent = Menuitem (item :> GMenu.menu_item_skel) let window = F.window end) include Side_effects_of (E) let callback name = compose ~none_effect ~some_effect (E.dialog name) (E.reaction) let item_callback () = begin ignore (Submenu.recreate_subshell ()); (List.iter (fun name -> ignore (Submenu.add_stock_item name ~stock:E.stock ~callback:(fun () -> callback name ()) () ) ) (E.dynlist ())) end let _ = item#connect#activate ~callback:item_callback let submenu = (Submenu.get_current_menu ())#menu end (** {2 Examples} include Menu_factory.Make_entry (F) (struct let text = "EASY" let stock = `NEW let dialog = Menu_factory.no_dialog "" let reaction _ = () end) *) marionnet-0.90.6+bzr434.orig/gui/glade-2.0.dtd0000600000175000017500000000417412167200764017422 0ustar lucaslucas marionnet-0.90.6+bzr434.orig/gui/ledgrid.ml0000600000175000017500000004614612167200764017325 0ustar lucaslucas(* This file is part of our reusable OCaml BRICKS library Copyright (C) 2007, 2008 Luca Saiu This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** Ledgrid widgets. *) (** {2 Constants} Some global constant definitions, for fine-tuning. *) (** The duration of a LED light "flash", in milliseconds: *) let flash_duration = 80 (* 125 *) (** The duration of a LED light "blink", in milliseconds. The time is measured from the first to the last state change: *) let blink_duration = 250 (** How many times a LED light changes state during a blink. This includes both on->off and off->on transitions: *) let blink_toggles_no = 8 (* 4 times on + 4 times off *) (** {2 Exception} The ways this brick can fail. *) (** An exception raised whenever the user refers a non-existing LED light: in a LED grid *) exception Non_existing_led_light of int * int (** An exception raised whenever the user refers a non-existing port in a device LED grid: *) exception Non_existing_port of int (** {2 Utility stuff} *) (** Make a pixmap data structure (not a widget) from the given file: *) let make_pixmap_from_xpm_file ~file_name = GDraw.pixmap_from_xpm ~file:file_name () (** {2 A single LED light} Gtk+ simulation of just {e one} LED light. Particularly useful when arranged in a grid. *) (** A LED light is a widget mimicking a single physical LED light, whose state at any given moment can be on or off: its state is represented as a boolean value, and by convention 'true' means 'on'. A LED light keeps its default state until its state is explitly changed by the user. The user can simply set the object's state, or can set its state *also changing the default*. As soon as the current state changes the widget's appearance on screen is updated. A LED light can be also 'flashed', i.e. set to its non-default value for a short time, after which it automatically reverts to its default state, or 'blinked', i.e. ordered to repeatedly toggle its state very fast for a short time, before automatically reverting to its default state. Flashing and blinking are *asynchronous* operations: when the user requests them they are scheduled to be executed in background, and the user is immediately given back control. This allows us to use concurrency in an extremely simple way, without even exposing a thread interface. LED lights can be used in isolation, but they are mainly intended to be arranged within a grid, allowing for more complex behaviour. Note that already initialized Gtk+ pixmap objects of type GDraw.pixmap (and *not* widgets) must be explicitly supplied at construction time. Pixmaps can and should be shared among differnet LED lights. *) class led_light ?default:(default=false) ?x:(x= -1) ?y:(y= -1) ~off_pixmap ~on_pixmap ~packing () = object(self) (** A notebook with hidden tabs and border is the main widget: it contains two pages with the 'on' and 'off' pixmaps, and can easily change state by 'going' to a different page: *) val notebook = let notebook = GPack.notebook ~tab_pos:`TOP ~packing ~show_border:false ~show_tabs:false () in let _ = (* "on" pixmap widget *) GMisc.pixmap off_pixmap ~packing:(fun widget -> ignore (notebook#insert_page ~pos:0 widget)) () in let _ = (* "on" pixmap widget *) GMisc.pixmap on_pixmap ~packing:(fun widget -> ignore (notebook#insert_page ~pos:1 widget)) () in notebook (** Default state and current state; see above: *) val default = ref(default) val state = ref(false) (** Return the current default state: *) method get_default = !default (** Update the default state *and also the current state*; this changes the widget's appearance if the new value is different from the current state: *) method set_default value = default := value; self#set value; () (** Return the current state: *) method get = !state (** Update the current state, possibly changing the widget's appearance: *) method set value = state := value; notebook#goto_page (if value then 1 else 0); () (** Set the widget current state to be equal to its default. This may change the widget's appearance: *) method reset = self#set(!default); () (** Set the widget current state to be on if it's currently off, or vice-versa. This always changes the widget's appearance: *) method toggle = self#set(not self#get); () (** Return the widget position as it was set at creation time, or (-1, -1) if it was not set: *) method get_position = x, y (** Return the main Gtk+ widget making up the LED light: *) method get_widget = notebook (** Order the LED light to flash (see above) for the established time, and return immediately: *) method flash = self#set (not !default); ignore (GMain.Timeout.add flash_duration (function () -> self#reset; false)) (** Schedule the LED light to blink 'times' times, then to reset itself. This is internally used to implement blinking: *) method private blink_this_number_of_times times = if times = 0 then self#set(!default) else begin self#toggle; ignore (GMain.Timeout.add (blink_duration / blink_toggles_no) (fun () -> self#blink_this_number_of_times (times - 1); false)); end (** Order the LED light to blink (see above) for the established time, and return immediately: *) method blink = self#blink_this_number_of_times blink_toggles_no; () (** This just assures that the default state reflects what is visually displayed at creation time: *) initializer self#set !default end (** These variables are just used as parameters to Array.make so that types can be correctly inferred. useless_label's widget is never displayed: *) let useless_array_of_led_light_options = Array.make 0 None let useless_label = GMisc.label () (** {2 LED grid} Gtk+ simulation of a {e grid} of LED lights. *) (** A LED grid visually represents a matrix of LED lights, where each light is independently controllable. A light is identified by its 0-based coordinates, where the origin is top-left. The optional parameter no_leds_at represents a list of coordinates (such as [(0, 1); (3, 4)]) where *no* lights should be placed. Each end of each row and column contains an optional, user-settable text label. Vertical labels can be rotated, to allow for denser writing in vertical. The constructor expects three file names identifying the XPM images to use for the 'on' state, the 'off' state, and for representing the absence of a light. All three pixmaps should have the same size. *) class led_grid ?default:(default=false) ~on_xpm_file_name ~off_xpm_file_name ~nothing_xpm_file_name ~columns ~rows ~packing ?angle:(angle=90.0) ?no_leds_at:(no_leds_at=[]) () = object(self) (** The pixmap objects made from user-supplied files. Notice how the same three pixmaps are shared among all the lights (and 'holes'): *) val off_pixmap = make_pixmap_from_xpm_file ~file_name:off_xpm_file_name val on_pixmap = make_pixmap_from_xpm_file ~file_name:on_xpm_file_name val nothing_pixmap = make_pixmap_from_xpm_file ~file_name:nothing_xpm_file_name (** A two-dimensional matrix of led_light option: *) val led_lights_matrix = Array.make columns useless_array_of_led_light_options (** Arrays holding the label widgets decorating each end of rows and columns: *) val left_labels = Array.make rows useless_label val right_labels = Array.make rows useless_label val top_labels = Array.make columns useless_label val bottom_labels = Array.make columns useless_label (** The Gtk+ widget holding the whole grid: *) val table_widget = GPack.table ~columns:(columns + 2) ~rows:(rows + 2) ~row_spacings:0 ~col_spacings:0 ~border_width:0 ~packing () (* To do: use Jean's sets instead of this ugly hash: *) (** A set of positions which should be left empty. This structure must be accessed associatively at initialization time, and is more efficient than a list: *) val no_leds_at = let hash = Hashtbl.create (columns * rows) in List.iter (fun x_y -> Hashtbl.add hash x_y ()) no_leds_at; hash (** Initialize the complex state of the grid: *) initializer for x = 0 to columns - 1 do Array.set led_lights_matrix x (Array.make rows None); for y = 0 to rows - 1 do if Hashtbl.mem no_leds_at (x, y) then begin let _ = GMisc.pixmap nothing_pixmap ~packing:(table_widget#attach ~left:(x + 1) ~top:(y + 1) ~expand:`BOTH) () in Array.set (Array.get led_lights_matrix x) y None end else let new_led_light = new led_light ~packing:(table_widget#attach ~left:(x + 1) ~top:(y + 1) ~expand:`BOTH) ~off_pixmap ~on_pixmap ~default ~x ~y () in Array.set (Array.get led_lights_matrix x) y (Some new_led_light) done; done; for y = 0 to rows - 1 do let left_label = GMisc.label ~packing:(table_widget#attach ~left:0 ~top:(y + 1)) () in let right_label = GMisc.label ~packing:(table_widget#attach ~left:(columns + 1) ~top:(y + 1)) () in Array.set left_labels y left_label; Array.set right_labels y right_label; done; for x = 0 to columns - 1 do let top_label = GMisc.label ~packing:(table_widget#attach ~left:(x + 1) ~top:0) () in let bottom_label = GMisc.label ~packing:(table_widget#attach ~left:(x + 1) ~top:(rows + 1)) () in top_label#set_angle angle; bottom_label#set_angle angle; Array.set top_labels x top_label; Array.set bottom_labels x bottom_label; done (** Return the LED light identified by (x, y), or throw an exception if no light is present at that position: *) method get_led_light x y = match Array.get (Array.get led_lights_matrix x) y with None -> raise (Non_existing_led_light(x, y)) | Some(led_light) -> led_light method get = self#get_led_light (** Return a random LED light belonging to the grid, if it exists, or loop forever. This is useful for debugging (and for demos :-)): *) method get_random_led_light = let x, y = (Random.int columns, Random.int rows) in try self#get_led_light x y with Non_existing_led_light(_) -> self#get_random_led_light (** Get and set the text of each label. Notice that all arrays are 0-based: *) method get_top_label x = (Array.get top_labels x)#text method set_top_label x text = (Array.get top_labels x)#set_text text method get_bottom_label x = (Array.get bottom_labels x)#text method set_bottom_label x text = (Array.get bottom_labels x)#set_text text method get_left_label y = (Array.get left_labels y)#text method set_left_label y text = (Array.get left_labels y)#set_text text method get_right_label y = (Array.get right_labels y)#text method set_right_label y text = (Array.get right_labels y)#set_text text (* Set the rotation angle, (90.0 degrees by default) for column labels: *) method set_top_labels_angle alpha = for x = 0 to columns - 1 do (Array.get top_labels x)#set_angle alpha; done method set_bottom_labels_angle alpha = for x = 0 to columns - 1 do (Array.get bottom_labels x)#set_angle alpha; done (** Return the Gtk+ widget holding the whole grid: *) method get_widget = table_widget end (** To do: recycle this from Jean's library *) let rec range a b = if a > b then [] else a :: (range (a + 1) b) (** {2 Device LED Grid} A matrix of LED lights simulating the control panel of a phisical network device such as a switch or a router. *) (** A 'device LED grid' is a LED grid specialized as a realistic simulation of the control panel of a physical device such as a switch, a hub or a router. A device LED's appearance can be customized at creation time, and this class allows us to control each _port_, abstracting from the position of the light or lights representing the port state. Port information can be displayed in either one or two lines, and an optional "100Mb/s" array of lights can also be shown. The number of ports must be even when two lines are requested. Three pixmap file names are required at creation time, as for the LED grid. Labels are automatically set. Reflecting the interface of common network devices, it can be said that a port is either in 'connected' or 'disconnected' state, meaning that its associated lights are 'on' or 'off' (and discounting flashes and blinks). Notice that, as in most real-world switch and hubs, port numeration is 1-based. *) class device_led_grid ~on_xpm_file_name ~off_xpm_file_name ~nothing_xpm_file_name ?(show_100_mbs=true) ~ports ?(port_labelling_offset=0) ~packing ?(angle=90.0) ?(lines=1) () = (* Let's prevent stupid errors... *) let _ = assert(ports > 1) in let _ = assert(((ports mod 2) = 0) or (lines = 1)) in let _ = assert((lines = 1) or (lines = 2)) in object(self) inherit led_grid ~default:false ~on_xpm_file_name ~off_xpm_file_name ~nothing_xpm_file_name ~columns:(if lines = 1 then ports else ports / 2) ~angle ~rows:(match lines, show_100_mbs with | 1, false -> 1 | 1, true -> 2 | 2, false -> 3 | 2, true -> 5 | _ -> assert false) ~no_leds_at:(match lines, show_100_mbs with | 1, _ -> [] | 2, false -> List.map (function x -> x, 1) (range 0 (ports - 1)) | 2, true -> List.map (function x -> x, 2) (range 0 (ports / 2 - 1)) | _ -> assert false) ~packing () as super (** Initialize the complex state of this object: *) initializer for x = 0 to (if lines = 1 then ports - 1 else ports / 2 - 1) do (* self#set_top_label x (string_of_int (x + 1)); *) self#set_top_label x (string_of_int (x+port_labelling_offset)); (* 0-based numbering *) done; if lines = 2 then for x = ports / 2 to ports - 1 do self#set_bottom_label (x - ports / 2) (string_of_int (x+port_labelling_offset)); (* 0-based numbering *) done; self#set_right_label 0 "TX/RX"; match lines, show_100_mbs with 1, false -> () | 2, false -> self#set_right_label 2 "TX/RX" | 1, true -> self#set_right_label 1 "100Mb/s" | 2, true -> self#set_right_label 1 "100Mb/s"; self#set_right_label 3 "100Mb/s"; self#set_right_label 4 "TX/RX" | _ -> assert false; (** Given a port number, return a list of pairs of coordinates identifying the inolved lights: *) method private port_to_positions port = let port = port + 1 in (* kludge to implement 0-based numbering... *) match lines, show_100_mbs, port <= (ports / 2) with 1, false, _ -> [ port - 1, 0 ] | 2, false, true -> [ port - 1, 0 ] | 2, false, false -> [ port - (ports / 2) - 1, 2 ] | 1, true, _ -> [ port - 1, 0; port - 1, 1 ] | 2, true, true -> [ port - 1, 0; port - 1, 1 ] | 2, true, false -> [ port - (ports / 2) - 1, 3; port - (ports / 2) - 1, 4 ] | _ -> assert false (** Print the port->coordinates mapping before returning the result of calling port_to_positions: *) method private port_to_positions_ port = let positions = self#port_to_positions port in (*List.iter (function x, y -> print_int port; print_string " -> ("; print_int x; print_string ", "; print_int y; print_string ")\n") positions;*) positions (** Given a port number, return the list of LED lights representing it: *) method private port_to_led_lights port = let positions = self#port_to_positions port in List.map (function x, y -> super#get x y) positions (** For each LED light representing the given port, call the given function and return the list of results: *) method private for_each_led_light (f : led_light -> 'a) (port : int) : 'a list = List.map (function x, y -> f (super#get x y)) (self#port_to_positions port); (** Ask every LED light representing the given port to (asynchronously) flash: *) method flash port = ignore (self#for_each_led_light (function led -> led#flash) port) (** Ask every LED light representing the given port to (asynchronously) blink: *) method blink port = ignore (self#for_each_led_light (function led -> led#blink) port) (** Set the state of all LED lights representing a port, updating their default state: this is a good way to indicate a cable connection or disconnection: *) method set port value = ignore (self#for_each_led_light (function led -> led#set_default value) port) method connect port = self#set port true method disconnect port = self#set port false (** Return the number of a random port currently in the 'On' state, or loop forever if no such port exists. This is useful for debugging and demos :-) *) method random_connected_port = (* This does not terminate if there are no connected ports! *) (* let port = (Random.int ports) + 1 in *) let port = (Random.int ports) in (* 0-based numbering *) if self#is_connected port then port else self#random_connected_port (** Return true iff the given port is in connected state: *) method is_connected port = List.hd (List.map (function led -> led#get_default) (self#port_to_led_lights port)) end (** {3 Example} A trivial usage example. {[let main ports () = let window = GWindow.window ~title:"Switch n.2" ~border_width:0 () in window#connect#destroy ~callback:GMain.Main.quit; let grid = new device_led_grid ~packing:window#add ~ports ~show_100_mbs:true ~lines:2 ~off_xpm_file_name:"sample-files/off.xpm" ~on_xpm_file_name:"sample-files/on.xpm" ~nothing_xpm_file_name:"sample-files/nothing.xpm" () in for i = 1 to ports / 3 do grid#connect ((Random.int ports) + 1); done; (** Simulate a distinct communication between two ports every 50 milliseconds: *) GMain.Timeout.add 50 (function () -> grid#blink (grid#random_connected_port); grid#blink (grid#random_connected_port); true); window#show (); Main.main () let _ = main 64 ()]} *) (* To do: should any out-of-bounds access raise a non-existing-led-light exception? *) marionnet-0.90.6+bzr434.orig/gui/gui_component-node-without-state.ml-template0000600000175000017500000000437512167200764026132 0ustar lucaslucas(** Gui completion for the MACHINE component. *) (* Shortcuts *) type env = string Environment.string_env let mkenv = Environment.make_string_env module Make_menus (State : sig val st:State.globalState end) = struct open State module Toolbar_entry = struct let imagefile = <> (* Ex: "ico.hub.palette.png" *) let tooltip = <> (* Ex: "Répéteur (hub)" *) end module Add = struct let key = <> (* Ex: Some GdkKeysyms._M *) let dialog = <> (* Ex: let module M = Gui_dialog_MACHINE.Make (State) in M.dialog ~title:"Machine ajout" ~update:None *) let reaction r = <> end module Properties = struct let dynlist = <> let dialog = fun name -> <> (* Ex: let m = (st#network#getMachineByName name) in let title = "Machine propriétés" in let module M = Gui_dialog_MACHINE.Make (State) in M.dialog ~title:(title^" "^name) ~update:(Some m) *) let reaction r = <> end module Remove = struct let dynlist = <> let dialog name = <> (* Ex: Talking.EDialog.ask_question ~help:None ~cancel:false ~enrich:(mkenv [("name",name)]) ~gen_id:"answer" ~title:"Supprimer" ~question:("Confirmez-vous la suppression de "^name^"\net de tous le cables éventuellement branchés à cette machine ?") *) let reaction r = <> end module Startup = struct let dynlist = <> let dialog = <> let reaction r = <> end module Stop = struct let dynlist = <> let dialog = <> let reaction r = <> end module Suspend = struct let dynlist = <> let dialog = <> let reaction r = <> end module Resume = struct let dynlist = <> let dialog = <> let reaction r = <> end module Create_entries_for_MY_COMPONENT = Gui_toolbar_COMPONENTS_layouts.Layout_for_network_node (State) (Toolbar_entry) (Add) (Properties) (Remove) (Startup) (Stop) (Suspend) (Resume) end marionnet-0.90.6+bzr434.orig/gui/talking.mli0000600000175000017500000001063312167200764017505 0ustar lucaslucas(* This file is part of marionnet Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) val check_pathname_validity : string -> string val does_directory_support_sparse_files : string -> bool module Msg : sig val help_repertoire_de_travail : unit -> unit val error_saving_while_something_up : unit -> unit val help_nom_pour_le_projet : unit -> unit end val check_path_name_validity_and_add_extension_if_needed : ?extension:string -> string -> string module EDialog : sig type edialog = unit -> string Environment.string_env option exception BadDialog of string * string exception StrangeDialog of string * string * string Environment.string_env exception IncompleteDialog val compose : edialog list -> unit -> string Environment.string_env option val sequence : edialog list -> unit -> string Environment.string_env option val image_filter : unit -> GFile.filter val all_files : unit -> GFile.filter val script_filter : unit -> GFile.filter val mar_filter : unit -> GFile.filter val xml_filter : unit -> GFile.filter val jpeg_filter : unit -> GFile.filter val png_filter : unit -> GFile.filter val allfilters : [> `ALL | `IMG | `JPEG | `MAR | `SCRIPT | `XML ] list val get_filter_by_name : [< `ALL | `DOT of Dot.output_format | `IMG | `JPEG | `MAR | `PNG | `SCRIPT | `XML ] -> GFile.filter val ask_for_file : ?enrich:string Environment.string_env -> ?title:string -> ?valid:(string -> bool) -> ?filter_names:[< `ALL | `DOT of Dot.output_format | `IMG | `JPEG | `MAR | `PNG | `SCRIPT | `XML > `ALL `IMG `JPEG `MAR `SCRIPT `XML ] list -> ?filters:GFile.filter list -> ?extra_widget:GObj.widget * (unit -> string) -> ?action:GtkEnums.file_chooser_action -> ?gen_id:string -> ?help:(unit -> unit) option -> unit -> string Environment.string_env option val ask_for_existing_writable_folder_pathname_supporting_sparse_files : ?enrich:Shell.filexpr Environment.string_env -> ?help:(unit -> unit) option -> title:string -> unit -> Shell.filexpr Environment.string_env option val ask_for_fresh_writable_filename : ?enrich:string Environment.string_env -> title:string -> ?filters:GFile.filter list -> ?filter_names:[< `ALL | `DOT of Dot.output_format | `IMG | `JPEG | `MAR | `PNG | `SCRIPT | `XML > `ALL `IMG `JPEG `MAR `SCRIPT `XML ] list -> ?extra_widget:GObj.widget * (unit -> string) -> ?help:(unit -> unit) option -> unit -> string Environment.string_env option val ask_for_existing_filename : ?enrich:Shell.filexpr Environment.string_env -> title:string -> ?filter_names:[< `ALL | `DOT of Dot.output_format | `IMG | `JPEG | `MAR | `PNG | `SCRIPT | `XML > `ALL `IMG `JPEG `MAR `SCRIPT `XML ] list -> ?help:(unit -> unit) option -> unit -> string Environment.string_env option val ask_question : ?enrich:string Environment.string_env -> ?title:string -> ?gen_id:string -> ?help:(unit -> unit) option -> ?cancel:bool -> question:string -> unit -> string Environment.string_env option end marionnet-0.90.6+bzr434.orig/gui/gui_bricks.mli0000600000175000017500000001506012167200764020174 0ustar lucaslucas(* This file is part of Marionnet Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) val make_form_with_labels : ?section_no:int -> ?row_spacings:int -> ?col_spacings:int -> ?packing:(GObj.widget -> unit) -> string list -> < add : GObj.widget -> unit; add_with_tooltip : ?just_for_label:unit -> string -> GObj.widget -> unit; add_section: ?fg:string -> ?size:string -> ?no_line:unit -> string -> unit; coerce : GObj.widget; table : GPack.table > val wrap_with_label : ?tooltip:string -> ?packing:(GObj.widget -> unit) -> ?labelpos:[< `EAST | `NORTH | `SOUTH | `WEST > `NORTH ] -> string -> (< coerce : GObj.widget; .. > as 'a) -> 'a val entry_with_label : ?tooltip:string -> ?packing:(GObj.widget -> unit) -> ?max_length:int -> ?entry_text:string -> ?labelpos:[< `EAST | `NORTH | `SOUTH | `WEST > `NORTH ] -> string -> GEdit.entry val spin_byte : ?tooltip:string -> ?label:string -> ?labelpos:[< `EAST | `NORTH | `SOUTH | `WEST > `NORTH ] -> ?lower:int -> ?upper:int -> ?step_incr:int -> ?packing:(GObj.widget -> unit) -> int -> GEdit.spin_button val spin_ipv4_address : ?tooltip:string -> ?byte_tooltips: string array -> ?label:string -> ?labelpos:[< `EAST | `NORTH | `SOUTH | `WEST > `NORTH ] -> ?packing:(GObj.widget -> unit) -> int -> int -> int -> int -> GEdit.spin_button * GEdit.spin_button * GEdit.spin_button * GEdit.spin_button val spin_ipv4_address_with_cidr_netmask : ?tooltip:string -> ?byte_tooltips: string array -> ?label:string -> ?labelpos:[< `EAST | `NORTH | `SOUTH | `WEST > `NORTH ] -> ?packing:(GObj.widget -> unit) -> int -> int -> int -> int -> int -> GEdit.spin_button * GEdit.spin_button * GEdit.spin_button * GEdit.spin_button * GEdit.spin_button val make_tooltips_for_container : < connect : < destroy : callback:('a -> unit) -> 'b; .. >; .. > -> GObj.widget -> string -> unit module Ok_callback : sig val check_name : string -> string -> (string->bool) -> 'a -> 'a option end module Dialog_run : sig val ok_or_cancel : [ `CANCEL | `DELETE_EVENT | `HELP | `OK ] GWindow.dialog -> get_widget_data:(unit -> 'a) -> ok_callback:('a -> 'b option) -> ?help_callback:(unit -> unit) -> unit -> 'b option val yes_or_cancel : [ `CANCEL | `DELETE_EVENT | `HELP | `YES ] GWindow.dialog -> ?help_callback:(unit -> unit) -> context:'a -> unit -> 'a option val yes_no_or_cancel : [ `CANCEL | `DELETE_EVENT | `HELP | `NO | `YES ] GWindow.dialog -> ?help_callback:(unit -> unit) -> context:'a -> unit -> ('a * bool) option end (* Dialog_run *) module Dialog : sig val yes_or_cancel_question : ?title:string -> ?help_callback:(unit -> unit) -> ?image_filename:string -> ?markup:string -> ?text:string -> context:'a -> unit -> 'a option val yes_no_or_cancel_question : ?title:string -> ?help_callback:(unit -> unit) -> ?image_filename:string -> ?markup:string -> ?text:string -> context:'a -> unit -> ('a * bool) option end (* Dialog *) val set_marionnet_icon : [> ] GWindow.dialog -> unit (* < set_icon : GdkPixbuf.pixbuf option -> 'a; .. > -> 'a = *) type packing_function = GObj.widget -> unit val make_combo_boxes_of_vm_installations: ?on_distrib_change:(string -> unit) -> ?on_variant_change:(string -> unit) -> ?on_kernel_change:(string -> unit) -> ?distribution:string -> ?variant:string -> ?kernel:string -> ?updating:unit -> packing:(packing_function * packing_function * packing_function) -> Disk.virtual_machine_installations -> Widget.ComboTextTree.comboTextTree module Dialog_add_or_update : sig val make_window_image_name_and_label : title:string -> image_file:string -> image_tooltip : string -> name:string -> name_tooltip : string -> ?label:string -> ?label_tooltip : string -> unit -> [ `CANCEL | `DELETE_EVENT | `HELP | `OK ] GWindow.dialog * GMisc.image * GEdit.entry * GEdit.entry end module Reactive_widget : sig class cable_input_widget : ?n0:string -> ?p0:string -> ?n1:string -> ?p1:string -> ?width:int -> ?height:int -> packing_n0:(GObj.widget -> unit) -> packing_p0:(GObj.widget -> unit) -> packing_n1:(GObj.widget -> unit) -> packing_p1:(GObj.widget -> unit) -> free_node_port_list:(string * string) list -> unit -> object method destroy : unit method get_widget_data : (string option * string option) * (string option * string option) method system : Chip.system end val guess_humanly_speaking_enpoints : (string * string) list -> string option -> string option -> string option -> string option -> (string option * string option) * (string option * string option) end val button_image : ?window:GWindow.window -> ?callback:(unit->unit) -> ?label:string -> ?label_position:[ `BOTTOM | `LEFT | `RIGHT | `TOP ] -> ?tooltip:string -> packing:(GObj.widget -> unit) -> ?stock:GtkStock.id -> ?stock_size:[ `BUTTON | `DIALOG | `DND | `INVALID | `LARGE_TOOLBAR | `MENU | `SMALL_TOOLBAR ] -> ?file:string -> unit -> GButton.button val button_image_popuping_a_menu : ?window:GWindow.window -> ?renewer:(GMenu.menu -> unit) -> ?label:string -> ?label_position:[ `BOTTOM | `LEFT | `RIGHT | `TOP ] -> ?tooltip:string -> packing:(GObj.widget -> unit) -> ?stock:GtkStock.id -> ?stock_size:[ `BUTTON | `DIALOG | `DND | `INVALID | `LARGE_TOOLBAR | `MENU | `SMALL_TOOLBAR ] -> ?file:string -> unit -> (GMenu.menu * GButton.button * GPack.box) val make_check_items_renewer_v1 : get_label_active_callback_list:(unit -> (string * bool * (bool -> unit)) list) -> unit -> (GMenu.menu -> unit) val make_check_items_renewer_v2 : get_label_active_list:(unit -> (string * bool) list) -> callback:(string -> bool -> unit) -> unit -> (GMenu.menu -> unit) val test : unit -> char option marionnet-0.90.6+bzr434.orig/gui/menu_factory.mli0000600000175000017500000001003512167200764020543 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (* A menu can be attached to a menubar or to a menu_item_skel (as a submenu). *) type menu_parent = Menubar of GMenu.menu_shell | Menuitem of GMenu.menu_item_skel | Menu of GMenu.menu module type Factory = sig val factory : GMenu.menu_shell GMenu.factory val accel_group : Gtk.accel_group val add_menu : string -> GMenu.menu GMenu.factory val not_implemented_yet : 'a -> unit val monitor : string -> 'a -> unit val add_item : ?menu:GMenu.menu GMenu.factory -> ?submenu:GMenu.menu -> ?key:Gdk.keysym -> string -> ?callback:(unit -> unit) -> unit -> GMenu.menu_item val add_stock_item : ?menu:GMenu.menu GMenu.factory -> ?submenu:GMenu.menu -> ?key:Gdk.keysym -> string -> stock:GtkStock.id -> ?callback:(unit -> unit) -> unit -> GMenu.image_menu_item val add_imagefile_item : ?menu:GMenu.menu GMenu.factory -> ?submenu:GMenu.menu -> ?key:Gdk.keysym -> ?label:string -> string -> ?callback:(unit -> unit) -> unit -> GMenu.image_menu_item val add_check_item : ?menu:GMenu.menu GMenu.factory -> ?active:bool -> ?key:Gdk.keysym -> string -> ?callback:(bool -> unit) -> unit -> GMenu.check_menu_item val add_separator : ?menu:GMenu.menu GMenu.factory -> unit -> unit val get_current_menu : unit -> GMenu.menu GMenu.factory val parent : menu_parent val window : GWindow.window end module type Parents = sig val parent: menu_parent val window : GWindow.window end module Make : functor (M : Parents) -> Factory type env = string Environment.string_env type name = string val mkenv : (string * 'a) list -> 'a Environment.string_env val no_dialog_but_simply_return_name : string -> unit -> string option module type Entry_definition = sig type t val text : string val stock : GtkStock.id val key : Gdk.keysym option val to_string : t -> string val dialog : unit -> t option val reaction : t -> unit end module type Entry_with_children_definition = sig type t val text : string val stock : GtkStock.id val dynlist : unit -> string list val to_string : t -> string val dialog : name -> unit -> t option val reaction : t -> unit end module type Entry_callbacks = sig type t val key : Gdk.keysym option val to_string : t -> string val dialog : unit -> t option val reaction : t -> unit end module type Entry_with_children_callbacks = sig type t val dynlist : unit -> string list val to_string : t -> string val dialog : name -> unit -> t option val reaction : t -> unit end module Make_entry : functor (E : Entry_definition) -> functor (F : Factory) -> sig val item : GMenu.image_menu_item val callback : unit -> unit end module Make_entry_with_children : functor (E : Entry_with_children_definition) -> functor (F : Factory) -> sig val item : GMenu.image_menu_item val submenu : GMenu.menu val callback : name -> unit -> unit end marionnet-0.90.6+bzr434.orig/gui/gui_toolbar_COMPONENTS.ml0000600000175000017500000000604512167200764021760 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** Gui completion for the toolbar_COMPONENTS widget defined with glade. *) open Gettext module Make (State : sig val st:State.globalState end) = struct module Direct = struct let crossover = false end module Crossover = struct let crossover = true end module Params = struct include State let packing = `toolbar st#mainwin#toolbar_COMPONENTS end module Menus_for_machine = Machine.Make_menus (Params) module Menus_for_hub = Hub.Make_menus (Params) module Menus_for_switch = Switch. Make_menus (Params) module Menus_for_router = Router. Make_menus (Params) module Menus_for_direct_cable = Cable. Make_menus (Params) (Direct) module Menus_for_crossover_cable = Cable. Make_menus (Params) (Crossover) module Menus_for_cloud = Cloud. Make_menus (Params) (* World gateway and bridge in the same sub-toolbar: *) module World_access_button = struct module F = Menu_factory.Make (struct let toolbar = State.st#mainwin#toolbar_COMPONENTS let image_menu_item = Gui_toolbar_COMPONENTS_layouts.Toolbar.append_image_menu toolbar "ico.world.palette.png" (s_ "Real world access") let parent = Menu_factory.Menuitem (image_menu_item :> GMenu.menu_item_skel) let window = State.st#mainwin#window_MARIONNET end) let world_gateway_menu_parent = let filename = Filename.concat Initialization.Path.images "ico.world_gateway.palette.png" in F.add_imagefile_item ~label:"Gateway" filename () let world_bridge_menu_parent = let filename = Filename.concat Initialization.Path.images "ico.world_bridge.palette.png" in F.add_imagefile_item ~label:"Bridge" filename () end module Params_for_world_gateway = struct include State let menu_parent = World_access_button.world_gateway_menu_parent let packing = `menu_parent (Menu_factory.Menuitem (menu_parent :> GMenu.menu_item_skel)) end module Params_for_world_bridge = struct include State let menu_parent = World_access_button.world_bridge_menu_parent let packing = `menu_parent (Menu_factory.Menuitem (menu_parent :> GMenu.menu_item_skel)) end module Menus_for_world_gateway = World_gateway. Make_menus (Params_for_world_gateway) module Menus_for_world_bridge = World_bridge. Make_menus (Params_for_world_bridge) end marionnet-0.90.6+bzr434.orig/gui/gui_dialog_toolkit.ml0000600000175000017500000001052112167200764021547 0ustar lucaslucasn(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009 Luca Saiu Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext;; (** Common tools for setting labels and tips in a dialog. *) module Make (Toplevel : sig val toplevel : GWindow.dialog_any end) = struct open Toplevel module Label = struct let set label text = label#set_use_markup true; label#set_label text end module Tooltip = struct let setter = let result = (GData.tooltips ()) in let _ = toplevel#connect#destroy ~callback:(fun _ -> result#destroy ()) in result let set w text = setter#set_tip w#coerce ~text let set_both w1 w2 text = List.iter (fun w -> setter#set_tip w ~text) [w1#coerce;w2#coerce] (* Common text for dialog's tooltips *) module Text = struct let component_label = (s_ "Label to be written in the network sketch, next to the element icon." ) let component_label_with_suggestion = component_label^" "^(s_ "It is advisable to use as label the IP address of the element (for example \"192.168.1.0/24\")." ) let append_label_suggestion_to msg = msg^" "^(s_ "It is advisable to use as label the IP address of the element (for example \"192.168.1.0/24\")." ) end (* Tooltip.Text *) end (* Tooltip *) type env = string Environment.string_env (* Moved from talking.ml. Generic dialog loop for component INSERT/UPDATE. The inserted or updated name must be unique in the network. *) let dialog_loop ?(help=None) dialog (scan_dialog:unit->env) (st:State.globalState) = let result = (ref None) in let cont = ref true in begin while (!cont = true) do begin match dialog#toplevel#run () with | `OK -> begin try let r = scan_dialog () in let (action,name,oldname) = (r#get("action"),r#get("name"),r#get("oldname")) in (* OK only if the name is not already used in the network (and not empty). *) if ((action="add") && (st#network#name_exists name)) or ((action="update") && (not (name=oldname)) && (st#network#name_exists name)) then (Simple_dialogs.error (s_ "Name conflict" ) (Printf.sprintf(f_ "The name '%s' is already used in the virtual network. The names of virtual network elements must be unique." ) name) ()) else (result := Some r ; cont := false) with | Talking.EDialog.IncompleteDialog -> cont := true | (Talking.EDialog.BadDialog (title,msg)) -> (Simple_dialogs.error title msg ()) | (Talking.EDialog.StrangeDialog (title,msg,r)) -> (*(Msg.warning title msg ()); *) begin match Talking.EDialog.ask_question ~gen_id:"answer" ~title:(s_ "CONFIRM") ~question:(msg^(s_ "\nDo you confirm this connection?" )) ~help:None ~cancel:false () with | Some e -> if (e#get("answer")="yes") then (result := Some r ; cont := false) else cont := true | None -> (*raise (Failure "Unexpected result of dialog ask_question")*) cont := true (* Consider as the answer "no" *) end end | `HELP -> (match help with | Some f -> f (); | None -> () ) | _ -> result := None ; cont := false end done; (* Close the dialog and return its result. *) dialog#toplevel#destroy (); !result end end (* Make *) marionnet-0.90.6+bzr434.orig/gui/gui_window_MARIONNET.ml0000600000175000017500000001466012167200764021476 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009 Luca Saiu Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext;; (** Gui completion for the widget window_MARIONNET (main window) defined with glade. *) module Make (State : sig val st:State.globalState end) = struct open State let w = st#mainwin (* Labels in main window *) let () = begin w#label_VIRTUAL_NETWORK#set_label (s_ "Virtual network"); w#label_TAB_DOCUMENTS#set_label (s_ "Project documents") end (* ***************************************** * Gui motherboard * ***************************************** *) module Motherboard = Motherboard_builder. Make (State) (* ***************************************** * MENUS Project, Options, ... * ***************************************** *) module Created_menubar_MARIONNET = Gui_menubar_MARIONNET.Make (State) (* ***************************************** * notebook_CENTRAL * ***************************************** *) (* Tool -> ocamlbricks widget.ml ? *) let get_tab_labels_of notebook = let mill widget = (GMisc.label_cast (notebook#get_tab_label widget)) in List.map mill notebook#children let tuple2_of_list = function [l1;l2] -> (l1,l2) | _ -> assert false let tuple4_of_list = function [l1;l2;l3;l4] -> (l1,l2,l3,l4) | _ -> assert false let () = begin let labels = get_tab_labels_of w#notebook_CENTRAL in let (l1,l2) = tuple2_of_list labels in List.iter (fun l -> l#set_use_markup true) labels ; l1#set_label (s_ "Components"); l2#set_label (s_ "Documents"); end (* ***************************************** * notebook_INTERNAL * ***************************************** *) let () = begin let labels = get_tab_labels_of w#notebook_INTERNAL in let (l1,l2,l3,l4) = tuple4_of_list labels in List.iter (fun l -> l#set_use_markup true) labels ; let set l text = l#set_label (""^text^"") in set l1 (s_ "Image") ; set l2 (s_ "Interfaces") ; set l3 (s_ "Defects") ; set l4 (s_ "Disks") ; end (* ***************************************** * toolbar_DOT_TUNING * ***************************************** *) module Created_toolbar_DOT_TUNING = Gui_toolbar_DOT_TUNING. Make (State) (* ***************************************** * BASE BUTTONS * ***************************************** *) let () = begin w#hbox_BASE#set_homogeneous true; w#hbox_BASE#set_spacing 5; w#hbox_BASE#set_border_width 0; end let button_BASE_STARTUP_EVERYTHING = Gui_bricks.button_image ~label:(s_ "Start all") ~stock:`MEDIA_PLAY ~tooltip:(s_ "Start the virtual network (machines, switch, hub, etc) locally on this machine") ~label_position:`BOTTOM ~stock_size:`DND ~packing:w#hbox_BASE#add () let (menu_BASE_PAUSE_SOMETHING, button_BASE_PAUSE_SOMETHING, box_BASE_PAUSE_SOMETHING) = let renewer = let get_label_active_callback_list () = let name_kind_suspended_list : (string * [`Node|`Cable] * bool) list = st#network#get_component_names_that_can_suspend_or_resume () in List.map (fun (name, kind, suspended) -> let callback b = if b = suspended then () else match suspended with | true -> (st#network#get_component_by_name ~kind name)#resume | false -> (st#network#get_component_by_name ~kind name)#suspend in (name, suspended, callback) ) name_kind_suspended_list in Gui_bricks.make_check_items_renewer_v1 ~get_label_active_callback_list () (* end of renewer () *) in Gui_bricks.button_image_popuping_a_menu ~label:(s_ "Suspend") ~stock:`MEDIA_PAUSE ~renewer ~tooltip:(s_ "Suspend the activity of a network component") ~label_position:`BOTTOM ~stock_size:`DND ~packing:w#hbox_BASE#add () let button_BASE_SHUTDOWN_EVERYTHING = Gui_bricks.button_image ~label:(s_ "Shutdown all") ~stock:`MEDIA_STOP ~tooltip:(s_ "Gracefully stop every element of the network") ~label_position:`BOTTOM ~stock_size:`DND ~packing:w#hbox_BASE#add () let button_BASE_POWEROFF_EVERYTHING = Gui_bricks.button_image ~label:(s_ "Power-off all") ~file:"ico.poweroff.24x24.png" ~tooltip:(s_ "(Ungracefully) shutdown every element of the network, as in a power-off") ~label_position:`BOTTOM ~packing:w#hbox_BASE#add () (* Just a thunk, the button is not really built. We leave this code in order to not remove the gettext key associated to this `tooltip' and this `label': *) let button_BASE_BROADCAST () = Gui_bricks.button_image ~label:(s_ "Broadcast") ~tooltip:(s_ "Broadcast the specification of the virtual network on a real network") ~file:"ico.diffuser.orig.png" ~label_position:`BOTTOM ~packing:w#hbox_BASE#add () (* Connections *) let () = let _ = button_BASE_STARTUP_EVERYTHING#connect#clicked ~callback:(fun () -> st#startup_everything ()) in let _ = button_BASE_SHUTDOWN_EVERYTHING#connect#clicked ~callback:(fun () -> match Simple_dialogs.confirm_dialog ~question:(s_ "Are you sure that you want to stop\nall the running components?") () with Some true -> st#shutdown_everything () | Some false -> () | None -> ()) in let _ = button_BASE_POWEROFF_EVERYTHING#connect#clicked ~callback:(fun () -> match Simple_dialogs.confirm_dialog ~question:(s_ "Are you sure that you want to power off\nall the running components? It is also possible to shut them down graciously...") () with Some true -> st#poweroff_everything () | Some false -> () | None -> () ) in let _ = let callback = (fun _ -> Created_menubar_MARIONNET.Created_entry_project_quit.callback (); true) in w#toplevel#event#connect#delete ~callback in () end marionnet-0.90.6+bzr434.orig/gui/gui.xml0000600000175000017500000017741712167200764016675 0ustar lucaslucas 600 400 True Marionnet GTK_WIN_POS_CENTER 750 690 marionnet-launcher.png True True False False True True True 88 True True GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC GTK_CORNER_TOP_RIGHT True True GTK_SHADOW_NONE True True True GTK_ORIENTATION_VERTICAL False False False False 1 True False False 1 True True ---Réseau virtuel--- False False True True GTK_POS_BOTTOM True True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True gtk-missing-image 44 True GTK_ORIENTATION_VERTICAL GTK_TOOLBAR_BOTH True True <small><small>---Nœuds---</small></small> True GTK_JUSTIFY_CENTER False False True 52 True True GTK_UPDATE_DELAYED 2 0 3 1 1 0 True 0 False GTK_POS_RIGHT False False True True True GTK_RELIEF_NONE 0 True ico.dado.24.png False False True True True GTK_RELIEF_NONE 0 True ico.dado-no.24.png False False True 6 True False False True True <small><small>---Arcs---</small></small> True GTK_JUSTIFY_CENTER False False True True True GTK_RELIEF_NONE 0 True gtk-go-down 2 False False True True True GTK_RELIEF_NONE 0 True gtk-go-forward 2 False False True 54 True True GTK_UPDATE_DELAYED 3.1619999999999999 0 20 1 1 0 True 0 False GTK_POS_RIGHT False False True True True True True True cable droit True True item21 True True ico.cable.direct.invert.png True cable croisé True True item5 True True ico.cable.crossed.invert.png True 0 ico.invert-arcs.png False False True True True GTK_RELIEF_NONE 0 True ico.splines.png 2 False False True 6 True False False True True <small><small>---Labels---</small></small> True GTK_JUSTIFY_CENTER False False True 54 True True GTK_UPDATE_DELAYED 0 0 20 1 1 0 True 0 False GTK_POS_RIGHT False False True 6 True False False True True <small><small>---Surface---</small></small> True GTK_JUSTIFY_CENTER False False True 54 True True GTK_UPDATE_DELAYED 0 0 100 1 10 0 True 0 False GTK_POS_RIGHT False False True 6 True False False False False 1 90 True 10 2 <i>---Image---</i> True tab False True 2 90 True <i>---Interfaces---</i> True tab 2 False True 3 90 True <i>---Anomalies---</i> True tab 3 False True 4 90 True <i>---Disques---</i> True tab 4 False 1 2 True 10 2 <i>---Composants---</i> True True tab False True True ---Documents du projet--- False False True 1 2 True 10 2 <i>---Énoncé---</i> True tab 2 False 1 True False 10 2 True False False 3 True À propos False True marionnet-launcher.png GDK_WINDOW_TYPE_HINT_DIALOG True True True True Marionnet True GTK_JUSTIFY_CENTER True False False True True True 2 GTK_POLICY_NEVER GTK_POLICY_NEVER GTK_SHADOW_ETCHED_OUT True 2 True 10 10 ico.marionnet-final.orig.png True True True 10 10 True GTK_JUSTIFY_FILL True 82 True 10 ---À propos--- tab False True True GTK_JUSTIFY_FILL 1 82 True 10 ---Auteurs--- tab 1 False True True GTK_JUSTIFY_FILL True 2 82 True 10 ---Licence--- tab 2 False True True True GTK_JUSTIFY_FILL True True True True True logo.paris13.png 1 1 3 82 True ---Thanks--- tab 3 False 1 1 2 True GTK_BUTTONBOX_END True True True gtk-close True -7 False False False GTK_PACK_END True Message False True GTK_WIN_POS_CENTER True marionnet-launcher.png GDK_WINDOW_TYPE_HINT_DIALOG True True True True 10 10 gtk-missing-image False True 10 10 <b>Title</b> True GTK_JUSTIFY_CENTER False 1 False False True 10 10 Content True GTK_JUSTIFY_FILL True 1 2 True GTK_BUTTONBOX_END True True True gtk-close True -7 False False False GTK_PACK_END True Message False True GTK_WIN_POS_CENTER True marionnet-launcher.png GDK_WINDOW_TYPE_HINT_DIALOG True True True True 10 10 ico.question-2.orig.png False True 10 10 <b>Title</b> True GTK_JUSTIFY_CENTER False 1 False False 2 True GTK_BUTTONBOX_END True True True gtk-no True -9 False False True True True gtk-yes True -8 False False 1 False GTK_PACK_END marionnet-0.90.6+bzr434.orig/gui/gui_source_editing.ml0000600000175000017500000001126112167200764021550 0ustar lucaslucas (* Ex: `id "sh" our `mime "text/x-ocaml" *) type language_identification = [ `id of string | `mime_type of string ] ;; (* Our `language_manager' is an object encapsulating a `GSourceView2.source_language_manager' with a convenient interface: *) let language_manager () = let m = GSourceView2.source_language_manager ~default:false in object (self) (* For debugging: *) method print_list = let i = ref 0 in List.iter (fun id -> incr i; match m#language id with Some lang -> let name = lang#name in let section = lang#section in Printf.kfprintf flush stdout "%2d: %-20s %-30s (section: %s)\n" !i id name section | None -> ()) m#language_ids method get_language_by_id id = (m#language id) method get_language_by_mime_type mime_type = (m#guess_language ~content_type:mime_type ()) method get_language (li:language_identification) = match li with | `id x -> self#get_language_by_id x | `mime_type x -> self#get_language_by_mime_type x method add_path ?(append:unit option) path = let current_list = m#search_path in let new_list = if append=None then path::current_list else List.append current_list [path] in m#set_search_path new_list initializer (* The file `vde_switch.lang' will be installed in the marionnet's home: *) self#add_path (Initialization.Path.marionnet_home) end (* object language_manager *) (* Redefined now as a lazy value: *) let language_manager = lazy (language_manager ()) let window ?(language:language_identification option) ?(font_name="Monospace 11") ?auto_indent ?(right_margin_position=80) ?(content="") ?modal ?(height=500) ?(width=650) ?(draw_spaces=[`SPACE; `NEWLINE]) ?close_means_cancel ?create_as_dialog (* not as window (in order to be drawn on top of another dialog) *) ?(position=`CENTER) ~title ~(result:(string option) Egg.t) () = let modal = Option.to_bool modal in let (win, vbox, win_connect_destroy) = match create_as_dialog with | None -> let win = GWindow.window ~modal ~title ~position () in let () = win#set_destroy_with_parent true in ((win :> GWindow.window_skel), GPack.vbox ~packing:win#add (), win#connect#destroy) | Some () -> let win = GWindow.dialog ~destroy_with_parent:true ~modal ~title ~position () in ((win :> GWindow.window_skel), win#vbox, win#connect#destroy) in let scrolled_win = GBin.scrolled_window ~hpolicy:`AUTOMATIC ~vpolicy:`AUTOMATIC ~packing:vbox#add () in let source_view = GSourceView2.source_view ~auto_indent:(Option.to_bool auto_indent) ~insert_spaces_instead_of_tabs:true ~tab_width:2 ~show_line_numbers:true ~right_margin_position ~show_right_margin:true ~packing:scrolled_win#add ~height ~width () in let hbox = GPack.hbox ~packing:vbox#add ~homogeneous:true () in vbox#set_child_packing ~expand:false ~fill:false hbox#coerce; let button_cancel = GButton.button ~stock:`CANCEL ~packing:hbox#add () in let button_ok = GButton.button ~stock:`OK ~packing:hbox#add () in List.iter (fun w -> hbox#set_child_packing ~expand:false ~fill:false w#coerce) [button_cancel; button_ok]; let language_manager = Lazy.force language_manager in let lang = Option.bind language (language_manager#get_language) in win#set_allow_shrink true; source_view#misc#modify_font_by_name font_name; source_view#source_buffer#set_highlight_matching_brackets true; source_view#source_buffer#set_language lang; source_view#source_buffer#set_highlight_syntax true; source_view#set_smart_home_end `AFTER; source_view#set_draw_spaces draw_spaces; source_view#source_buffer#begin_not_undoable_action (); source_view#source_buffer#set_text content; source_view#source_buffer#end_not_undoable_action (); let get_text () = Some (source_view#source_buffer#get_text ()) in (* Callbacks. Note that the egg is released before destroying the window, because this action provoke the execution of the close_callback, that may release another result. Callbacks are linearized in order to prevent to call them twice (callback -> win#destroy -> callback). *) let cancel_callback = Thunk.linearize (fun () -> Egg.release result None; win#destroy ()) in let ok_callback = Thunk.linearize (fun () -> Egg.release result (get_text ()); win#destroy ()) in let close_callback = if close_means_cancel=None then ok_callback else cancel_callback in ignore (button_cancel#connect#clicked ~callback:cancel_callback); ignore (button_ok#connect#clicked ~callback:ok_callback); ignore (win_connect_destroy close_callback); (* --- *) win#misc#grab_focus (); win#show (); ;; marionnet-0.90.6+bzr434.orig/gui/gui_dialog_A_PROPOS.ml0000600000175000017500000001040512167200764021345 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007 Luca Saiu Copyright (C) 2007, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext;; (** Gui completion for the dialog_A_PROPOS widget defined with glade. *) (* Shortcuts *) let mkenv = Environment.make_string_env module Make (State:sig val st:State.globalState end) = struct open State (* User handler for dialog completion. *) let dialog () = let d = new Gui.dialog_A_PROPOS () in d#toplevel#set_title (s_ "About"); (* Labels *) let () = begin let set label text = label#set_use_markup true; label#set_label text in set d#label_dialog_A_PROPOS_a_propos (s_ "About"); let text_title = Printf.sprintf "%s" (s_ "Marionnet, a virtual network laboratory") in let text_subtitle = Printf.sprintf "Version %s revno %s - %s" Version.version Meta.revision Meta.source_date in let title = Printf.sprintf "\n%s\n%s\n" text_title text_subtitle in set d#label_dialog_A_PROPOS_title title; set d#label_dialog_A_PROPOS_a_propos_content (s_ "Marionnet is an environment for the simulation of a network composed of GNU/Linux machines. This software was thought for students to experiment with bulding and configuring networks, and for teachers to prepare excercises and tests.\n\nMarionnet is based on the UML features of the Linux kernel.\nhttp://www.marionnet.org\n"); set d#label_dialog_A_PROPOS_authors (s_ "Authors"); set d#label_dialog_A_PROPOS_authors_content " Jean-Vincent Loddo <loddo@lipn.univ-paris13.fr> Département R&T - IUT de Villetaneuse Laboratoire d'Informatique de Paris Nord (LIPN) Université Paris 13\n Luca Saiu <saiu@lipn.univ-paris13.fr> Laboratoire d'Informatique de Paris Nord (LIPN) Université Paris 13\n\n"; set d#label_dialog_A_PROPOS_license (s_ "License"); set d#label_dialog_A_PROPOS_license_content " Copyright (C) 2007, 2008, 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010 Luca Saiu Copyright (C) 2007, 2008, 2009, 2010 Université Paris 13\n Marionnet is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.\n\n"; set d#label_dialog_A_PROPOS_thanks "Thanks"; set d#label_dialog_A_PROPOS_thanks_content "We wish to thank Jeff Dike and the other authors of UML for their nice work, which made Marionnet possible; Renzo Davoli for VDE, the powerful communication infrastructure that we used and modified; the authors of OCaml for their nice language; and of course the whole free software community, of which the GNU and Linux projects remain the foremost contributors.\n This beautiful logo was designed by Silviu Barsanu:\nhttp://www.silviubarsanu.evonet.ro"; set d#label_dialog_A_PROPOS_thanks_sponsors "Marionnet is sponsored as an\ne-learning project since 2007 by"; end in d end marionnet-0.90.6+bzr434.orig/gui/gui_toolbar_DOT_TUNING.ml0000600000175000017500000002516712167200764022013 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** Gui completion for the toolbar_DOT_TUNING widget defined with glade. *) open Gettext open Sugar (* for '=>' and '||' *) (* This functor defines the dot tuning toolbar driver of the global state. *) module Make (State : sig val st:State.globalState end) = struct open State let w = st#mainwin (* Labels *) let () = begin let set label text = label#set_use_markup true; label#set_label (""^text^"") in set w#label_DOT_TUNING_NODES (s_ "Nodes") ; set w#label_DOT_TUNING_EDGES (s_ "Edges" ) ; set w#label_DOT_TUNING_LABELS (s_ "Labels") ; set w#label_DOT_TUNING_AREA (s_ "Surface") ; end (* Tooltips *) let () = begin let set w text = (GData.tooltips ())#set_tip w ~text in set w#label_DOT_TUNING_NODES#coerce (s_ "Tuning of graph nodes") ; set w#vscale_DOT_TUNING_ICONSIZE#coerce (s_ "Tuning of icon size (machines, switch, hub, etc), without changing the icon arrangement") ; set w#button_DOT_TUNING_SHUFFLE#coerce (s_ "Randomly arrange nodes") ; set w#button_DOT_TUNING_UNSHUFFLE#coerce (s_ "Go back to the standard node arrangement (not random)") ; set w#label_DOT_TUNING_EDGES#coerce (s_ "Tuning of graph edges") ; set w#button_DOT_TUNING_RANKDIR_TB#coerce (s_ "Arrange edges top-to-bottom") ; set w#button_DOT_TUNING_RANKDIR_LR#coerce (s_ "Arrange edges left-to-right") ; set w#vscale_DOT_TUNING_NODESEP#coerce (s_ "Minimun edge size") ; set w#menubar_DOT_TUNING_INVERT#coerce (s_ "Reverse an edge") ; set w#button_DOT_TUNING_CURVED_LINES#coerce (s_ "Switch between straight and curved lines") ; set w#label_DOT_TUNING_LABELS#coerce (s_ "Tuning edge endpoint labels") ; set w#vscale_DOT_TUNING_LABELDISTANCE#coerce (s_ "Distance between labels and icons") ; set w#vscale_DOT_TUNING_EXTRASIZE#coerce (s_ "Canvas size"); set w#label_DOT_TUNING_AREA#coerce (s_ "Tuning of the graph size. The surface may increase up to double (100%) the original, in which case case elements are arranged to completely fill the available space.") ; end (* ******************************* * High-level toolbar driver * ******************************* *) (** Methods for reading or setting related widgets in a more abstract way. *) class high_level_toolbar_driver () = (* The iconsize converter float -> string *) let iconsize_of_float x = match (int_of_float x) with | 0 -> "small" | 1 -> "med" | 2 -> "large" | 3 -> "xxl" | default -> "large" in (* The iconsize converter string -> float *) let float_of_iconsize s = match s with | "small" -> 0. | "med" -> 1. | "large" -> 2. | "xxl" -> 3. | default -> 2. in object (self) (** iconsize tuning *) method get_iconsize : string = iconsize_of_float (w#vscale_DOT_TUNING_ICONSIZE#adjustment#value) method set_iconsize (x:string) = x => (float_of_iconsize || w#vscale_DOT_TUNING_ICONSIZE#adjustment#set_value) (** nodesep tuning *) (* Non-linear (quadratic) adjustment in the range [0,2] inches *) method get_nodesep : float = let formule = fun x -> (((x /. 20.) ** 2.) *. 2.) in w#vscale_DOT_TUNING_NODESEP#adjustment#value => formule method set_nodesep (y:float) = let inverse = fun y -> 20. *. sqrt (y /. 2.) in y => (inverse || w#vscale_DOT_TUNING_NODESEP#adjustment#set_value) (** labeldistance tuning *) (* Non-linear (quadratic) adjustment in the range [0,2] inches *) method get_labeldistance : float = let formule = fun x -> (((x /. 20.) ** 2.) *. 2.) in w#vscale_DOT_TUNING_LABELDISTANCE#adjustment#value => formule method set_labeldistance (y:float) = let inverse = fun y -> 20. *. sqrt (y /. 2.) in y => (inverse || w#vscale_DOT_TUNING_LABELDISTANCE#adjustment#set_value) (** extrasize tuning *) method get_extrasize : float = w#vscale_DOT_TUNING_EXTRASIZE#adjustment#value method set_extrasize (x:float) = w#vscale_DOT_TUNING_EXTRASIZE#adjustment#set_value x (** Handling the network image *) method get_image = w#sketch#pixbuf method get_image_current_width = (GdkPixbuf.get_width w#sketch#pixbuf) method get_image_current_height = (GdkPixbuf.get_height w#sketch#pixbuf) val mutable image_original_width = None val mutable image_original_height = None (** Called in update_sketch: *) method reset_image_size () = image_original_width <- None; image_original_height <- None (* Get and affect if need (but only the first time) *) method get_image_original_width = match image_original_width with | None -> (let x = self#get_image_current_width in image_original_width <- Some x; x) | Some x -> x (* Get and affect if need (but only the first time) *) method get_image_original_height = match image_original_height with | None -> (let x = self#get_image_current_height in image_original_height <- Some x; x) | Some x -> x end;; (* class high_level_toolbar_driver *) (* Enrich the global state structure with a new toolbar driver. *) st#dotoptions#set_toolbar_driver (new high_level_toolbar_driver ()) (* ******************************* * Callbacks definition * ******************************* *) let (opt,net) = (st#dotoptions, st#network) (* Tool *) let fold_lines = function [] -> "" | l-> List.fold_left (fun x y -> x^" "^y) (List.hd l) (List.tl l) (** Reaction for the iconsize tuning *) let iconsize_react () = if opt#gui_callbacks_disable then () else begin let size = opt#toolbar_driver#get_iconsize in opt#iconsize#set size; st#flash ~delay:4000 (Printf.sprintf (f_ "The icon size is fixed to value %s (default=large)") size); end (** Reaction for the shuffle tuning *) let shuffle_react () = begin opt#shuffler#set (ListExtra.shuffleIndexes (net#nodes#get)); let namelist = net#get_node_names => ( (ListExtra.permute opt#shuffler_as_function) || fold_lines ) in st#flash ~delay:4000 ((s_ "Icons randomly arranged: ")^namelist); end (** Reaction for the unshuffle tuning *) let unshuffle_react () = begin opt#reset_shuffler (); let namelist = (net#get_node_names => fold_lines) in st#flash ~delay:4000 ((s_ "Default icon arrangement: ")^namelist); end (** Reaction for the rankdir tunings *) let rankdir_react x () = begin st#dotoptions#rankdir#set x; let msg = match x with | "TB" -> (s_ "Arrange edges top-to-bottom (default)") | "LR" -> (s_ "Arrange edges left-to-right") | _ -> "Not valid Rankdir" in st#flash ~delay:4000 msg; end (** Reaction for the nodesep tuning *) let nodesep_react () = if opt#gui_callbacks_disable then () else begin let y = opt#toolbar_driver#get_nodesep in opt#nodesep#set y; st#flash (Printf.sprintf (f_ "The minimum edge size (distance between nodes) is fixed to the value %s (default=0.5)") (string_of_float y)); end (** Reaction for the labeldistance tuning *) let labeldistance_react () = if opt#gui_callbacks_disable then () else begin let y = opt#toolbar_driver#get_labeldistance in opt#labeldistance#set y; st#flash (Printf.sprintf (f_ "The distance between labels and icons is fixed to the value %s (default=1.6)") (string_of_float y)); end (** Reaction for the extrasize_x tuning *) let extrasize_react () = if opt#gui_callbacks_disable then () else begin let y = opt#toolbar_driver#get_extrasize in opt#extrasize#set y; st#flash (Printf.sprintf (f_ "The canvas size is fixed to %s%% of the minimun value to contain the graph (default=0%%)") (string_of_int (int_of_float y)) ); end (** Reaction for a rotate tuning *) let reverse_edge_callback x () = begin let c = (st#network#get_cable_by_name x) in c#set_reversed (not c#is_reversed); st#flash (Printf.sprintf (f_ "Cable %s reversed") x); end (** Reaction for the spline's (straight/curved) tuning *) let curved_lines_react () = if opt#gui_callbacks_disable then () else begin (* `set' means `commute' for reactive switches (wswitch): *) st#dotoptions#curved_lines#set (); let msg = match st#dotoptions#curved_lines#get with | true -> (s_ "Switched to curved lines") | false -> (s_ "Switched to straight lines") in st#flash ~delay:4000 msg; end (* Connections *) let _ = w#vscale_DOT_TUNING_ICONSIZE#connect#value_changed iconsize_react let _ = w#button_DOT_TUNING_SHUFFLE#connect#clicked shuffle_react let _ = w#button_DOT_TUNING_UNSHUFFLE#connect#clicked unshuffle_react let _ = w#button_DOT_TUNING_RANKDIR_TB#connect#clicked (rankdir_react "TB") let _ = w#button_DOT_TUNING_RANKDIR_LR#connect#clicked (rankdir_react "LR") let _ = w#vscale_DOT_TUNING_NODESEP#connect#value_changed nodesep_react let _ = w#vscale_DOT_TUNING_LABELDISTANCE#connect#value_changed labeldistance_react let _ = w#vscale_DOT_TUNING_EXTRASIZE#connect#value_changed extrasize_react let _ = w#button_DOT_TUNING_CURVED_LINES#connect#clicked curved_lines_react (** Generic connect function for rotate menus. *) let connect_rotate_menu ~widget ~widget_menu ~dynList = begin let set_active cname = (List.mem cname st#network#reversed_cables) in (Widget.DynamicSubmenu.make ~set_active ~submenu:widget_menu ~menu:widget ~dynList ~action:reverse_edge_callback ()) ; () end (* Ensure that the image will be shown (in spite of a possibly opposite Gnome/Ubuntu global setting) *) let () = st#mainwin#imagemenuitem_DOT_TUNING_INVERT#image#misc#show () (* Connect INVERT_DIRECT *) let _ = connect_rotate_menu ~widget:st#mainwin#imagemenuitem_DOT_TUNING_INVERT_DIRECT ~widget_menu:st#mainwin#imagemenuitem_DOT_TUNING_INVERT_DIRECT_menu ~dynList:(fun () -> st#network#get_direct_cable_names) (* Connect INVERT_CROSSOVER *) let _ = connect_rotate_menu ~widget:st#mainwin#imagemenuitem_DOT_TUNING_INVERT_CROSSOVER ~widget_menu:st#mainwin#imagemenuitem_DOT_TUNING_INVERT_CROSSOVER_menu ~dynList:(fun () -> st#network#get_crossover_cable_names) end (* Make *) marionnet-0.90.6+bzr434.orig/gui/simple_dialogs.ml0000600000175000017500000001325112167200764020675 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008, 2009 Luca Saiu Copyright (C) 2007, 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext;; (** Convert ocaml (ISO-8859-1) string in UTF-8 format *) (* let utf8 x = Glib.Convert.convert x "UTF-8" "ISO-8859-1";; *) let utf8 x = x;; (* We currently don't use this. It works better :-) *) (** Generic constructor for message dialog *) let message win_title msg_title msg_content img_file () = let d=new Gui.dialog_MESSAGE () in d#toplevel#set_resizable true; let _ = d#closebutton_MESSAGE#connect#clicked ~callback:(d#toplevel#destroy) in d#toplevel#set_icon (Some Icon.icon_pixbuf); d#toplevel#set_title (utf8 win_title); d#title#set_use_markup true; d#title#set_label (""^msg_title^""); d#title#set_selectable true; d#content#set_label msg_content; d#content#set_selectable true; d#image#set_file (Initialization.Path.images ^ img_file); () ;; (** Specific constructor for help messages *) let help title msg () = message (s_ "Help") title msg "ico.help.orig.png" ();; (** Specific constructor for error messages *) let error title msg () = message (s_ "Error") title msg "ico.error.orig.png" ();; (** Specific constructor for warning messages *) let warning title msg () = message (s_ "Warning") title msg "ico.warning.orig.png" ();; (** Specific constructor for info messages *) let info title msg () = message (s_ "Information") title msg "ico.info.orig.png" ();; (** Show a new dialog displaying a progress bar *) let make_progress_bar_dialog = Progress_bar.make_progress_bar_dialog;; (** Destroy a dialog which was previously created by make_progress_bar_dialog *) let destroy_progress_bar_dialog dialog = Progress_bar.destroy_progress_bar_dialog dialog;; let confirm_dialog ~question ?(cancel = false) () = let dialog = new Gui.dialog_QUESTION () in dialog#toplevel#set_icon (Some Icon.icon_pixbuf); dialog#toplevel#set_title (utf8 "Confirmation"); dialog#title_QUESTION#set_use_markup true; dialog#title_QUESTION#set_label question; ignore (dialog#toplevel#event#connect#delete ~callback:(fun _ -> Log.printf "Sorry, no, you can't close the dialog. Please make a decision.\n"; true)); (if cancel then dialog#toplevel#add_button_stock `CANCEL `CANCEL); let result = (ref None) in let cont = ref true in while (!cont = true) do begin match dialog#toplevel#run () with | `YES -> begin cont := false; result := Some true; end | `NO -> begin cont := false; result := Some false end | `CANCEL -> cont := false; result := None | _ -> (* The user tried to close the dialog. No, we refuse: let him/her try again *) (*assert false*) () end done; dialog#toplevel#destroy (); !result; (** Only internally used: *) exception TheUserCanceled;; (** Show a modal dialog prompting the user for a text, and return the text as entered by the user. A predicate checking that the text supplied by the user is valid and a callback to be automatically invoked at each text update can be optionally supplied. Two callbacks should be supplied, to be called in case of success or cancel. *) let ask_text_dialog ~title ~label ?(initial_text="") ?(constraint_predicate=(fun _ -> true)) ?(invalid_text_message=(s_ "Sorry, the size is invalid.")) ?(changed_callback=(fun _ -> ())) ?max_length ?(enable_cancel=false) ?(cancel_callback=(fun () -> ())) ~ok_callback () = let window = GWindow.window ~title ~modal:true ~position:`CENTER ~type_hint:`DIALOG ~icon:Icon.icon_pixbuf ~resizable:false () in let vbox = GPack.vbox ~packing:window#add () in let _ = GMisc.label ~text:label ~packing:vbox#add ~line_wrap:true () in let entry = GEdit.entry ~text:initial_text ?max_length ~packing:vbox#add () in ignore (entry#connect#changed ~callback:(fun () -> changed_callback entry#text)); let hbox = GPack.hbox ~packing:vbox#add ~homogeneous:true () in let button_ok = GButton.button ~stock:`OK ~packing:hbox#add () in (if enable_cancel then let button_cancel = GButton.button ~stock:`CANCEL ~packing:hbox#add () in ignore (button_cancel#connect#clicked ~callback:(fun () -> window#destroy (); cancel_callback ()))); let ok_callback window entry () = let text = entry#text in if constraint_predicate text then begin window#destroy (); ok_callback text end else begin error (s_ "Invalid size") invalid_text_message () end in ignore (button_ok#connect#clicked ~callback:(ok_callback window entry)); let _ = window#event#connect#key_press ~callback: begin fun ev -> (if GdkEvent.Key.keyval ev = GdkKeysyms._Return then ok_callback window entry ()); false end in button_ok#misc#set_can_default true; button_ok#misc#grab_default (); window#show ();; marionnet-0.90.6+bzr434.orig/gui/gui_toolbar_COMPONENTS_layouts.mli0000600000175000017500000000637712167200764023721 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) module Toolbar : sig val append_image_menu : GButton.toolbar -> string -> string -> GMenu.image_menu_item end module type Toolbar_entry = sig val imagefile : string val tooltip : string val packing : [ `toolbar of GButton.toolbar | `menu_parent of Menu_factory.menu_parent ] end module type State = sig val st:State.globalState end (** Called for instance by gui_cloud.ml *) module Layout_for_network_node : functor (State : State) -> functor (Toolbar_entry : Toolbar_entry) -> functor (Add : Menu_factory.Entry_callbacks) -> functor (Properties : Menu_factory.Entry_with_children_callbacks) -> functor (Remove : Menu_factory.Entry_with_children_callbacks) -> functor (Startup : Menu_factory.Entry_with_children_callbacks) -> functor (Stop : Menu_factory.Entry_with_children_callbacks) -> functor (Suspend : Menu_factory.Entry_with_children_callbacks) -> functor (Resume : Menu_factory.Entry_with_children_callbacks) -> sig module F:Menu_factory.Factory end (** Called for instance by gui_machine.ml *) module Layout_for_network_node_with_state : functor (State : State) -> functor (Toolbar_entry : Toolbar_entry) -> functor (Add : Menu_factory.Entry_callbacks) -> functor (Properties : Menu_factory.Entry_with_children_callbacks) -> functor (Remove : Menu_factory.Entry_with_children_callbacks) -> functor (Startup : Menu_factory.Entry_with_children_callbacks) -> functor (Stop : Menu_factory.Entry_with_children_callbacks) -> functor (Suspend : Menu_factory.Entry_with_children_callbacks) -> functor (Resume : Menu_factory.Entry_with_children_callbacks) -> functor (Ungracefully_stop : Menu_factory.Entry_with_children_callbacks) -> sig module F:Menu_factory.Factory end (** Called for instance by gui_cable.ml *) module Layout_for_network_edge : functor (State : State) -> functor (Toolbar_entry : Toolbar_entry) -> functor (Add : Menu_factory.Entry_callbacks) -> functor (Properties : Menu_factory.Entry_with_children_callbacks) -> functor (Remove : Menu_factory.Entry_with_children_callbacks) -> functor (Disconnect : Menu_factory.Entry_with_children_callbacks) -> functor (Reconnect : Menu_factory.Entry_with_children_callbacks) -> sig module F:Menu_factory.Factory module Created_Add : (* Useful handler for cable sensitiveness. *) sig val item : GMenu.image_menu_item val callback : unit -> unit end end marionnet-0.90.6+bzr434.orig/gui/gui_component-node-with-state.ml-template0000600000175000017500000000466012167200764025377 0ustar lucaslucas(** Gui completion for the MACHINE component. *) (* Shortcuts *) type env = string Environment.string_env let mkenv = Environment.make_string_env module Make_menus (State : sig val st:State.globalState end) = struct open State module Toolbar_entry = struct let imagefile = <> (* Ex: "ico.machine.palette.png" *) let tooltip = <> (* Ex: "Machine" *) end module Add = struct let key = <> (* Ex: Some GdkKeysyms._M *) let dialog = <> (* Ex: let module M = Gui_dialog_MACHINE.Make (State) in M.dialog ~title:"Machine ajout" ~update:None *) let reaction r = <> end module Properties = struct let dynlist = <> let dialog = fun name -> <> (* Ex: let m = (st#network#getMachineByName name) in let title = "Machine propriétés" in let module M = Gui_dialog_MACHINE.Make (State) in M.dialog ~title:(title^" "^name) ~update:(Some m) *) let reaction r = <> end module Remove = struct let dynlist = <> let dialog name = <> (* Ex: Talking.EDialog.ask_question ~help:None ~cancel:false ~enrich:(mkenv [("name",name)]) ~gen_id:"answer" ~title:"Supprimer" ~question:("Confirmez-vous la suppression de "^name^"\net de tous le cables éventuellement branchés à cette machine ?") *) let reaction r = <> end module Startup = struct let dynlist = <> let dialog = <> let reaction r = <> end module Stop = struct let dynlist = <> let dialog = <> let reaction r = <> end module Suspend = struct let dynlist = <> let dialog = <> let reaction r = <> end module Resume = struct let dynlist = <> let dialog = <> let reaction r = <> end module Ungracefully_stop = struct let dynlist = <> let dialog name = <> let reaction r = <> end module Create_entries_for_MY_COMPONENT = Gui_toolbar_COMPONENTS_layouts.Layout_for_network_node_with_state (State) (Toolbar_entry) (Add) (Properties) (Remove) (Startup) (Stop) (Suspend) (Resume) (Ungracefully_stop) end marionnet-0.90.6+bzr434.orig/gui/gui_toolbar_COMPONENTS_layouts.ml0000600000175000017500000001621412167200764023537 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext;; (** Layouts for component-related menus. See the file gui_machine.ml for an example of application. *) (** Function which appends entries to a toolbar *) module Toolbar = struct (* Note that ~label:"" is very important in the call of GMenu.image_menu_item. Actually, it is a workaround of something that resemble to a bug in lablgtk: if not present, another external function is internally called by this function and the result is a menu entry with an horizontal line in background... *) let append_image_menu (toolbar:GButton.toolbar) filename tooltip = let slot = GButton.tool_item ~packing:toolbar#insert () in let menubar = GMenu.menu_bar ~border_width:0 ~width:0 ~height:56 (* 60 *) ~packing:(slot#add) () in let image = GMisc.image ~xalign:0.5 ~yalign:0.5 ~xpad:0 ~ypad:0 ~file:(Initialization.Path.images^filename) () in let result = GMenu.image_menu_item ~label:"" ~image ~packing:menubar#add () in let set_tooltip w text = (GData.tooltips ())#set_tip w ~text in result#image#misc#show (); set_tooltip slot#coerce tooltip; result end (* module Toolbar *) module type Toolbar_entry = sig val imagefile : string val tooltip : string val packing : [ `toolbar of GButton.toolbar | `menu_parent of Menu_factory.menu_parent ] end module type State = sig val st:State.globalState end module Layout_for_network_component (State : sig val st:State.globalState end) (Toolbar_entry : Toolbar_entry) (Add : Menu_factory.Entry_callbacks) (Properties : Menu_factory.Entry_with_children_callbacks) (Remove : Menu_factory.Entry_with_children_callbacks) = struct let menu_parent = match Toolbar_entry.packing with | `toolbar toolbar -> let image_menu_item = Toolbar.append_image_menu toolbar Toolbar_entry.imagefile Toolbar_entry.tooltip in Menu_factory.Menuitem (image_menu_item :> GMenu.menu_item_skel) | `menu_parent p -> p module F = Menu_factory.Make (struct let parent = menu_parent let window = State.st#mainwin#window_MARIONNET end) module Add' = struct include Add let text = (s_ "Add") let stock = `ADD end module Properties' = struct include Properties let text = (s_ "Modify") let stock = `PROPERTIES end module Remove' = struct include Remove let text = (s_ "Remove") let stock= `REMOVE end module Created_Add = Menu_factory.Make_entry (Add') (F) module Created_Properties = Menu_factory.Make_entry_with_children (Properties') (F) module Created_Remove = Menu_factory.Make_entry_with_children (Remove') (F) end module Layout_for_network_node (State : sig val st:State.globalState end) (Toolbar_entry : Toolbar_entry) (Add : Menu_factory.Entry_callbacks) (Properties : Menu_factory.Entry_with_children_callbacks) (Remove : Menu_factory.Entry_with_children_callbacks) (Startup : Menu_factory.Entry_with_children_callbacks) (Stop : Menu_factory.Entry_with_children_callbacks) (Suspend : Menu_factory.Entry_with_children_callbacks) (Resume : Menu_factory.Entry_with_children_callbacks) = struct module Startup' = struct include Startup let text = (s_ "Start") let stock = `EXECUTE end module Stop' = struct include Stop let text = (s_ "Stop") let stock = `MEDIA_STOP end module Suspend' = struct include Suspend let text = (s_ "Suspend") let stock = `MEDIA_PAUSE end module Resume' = struct include Resume let text = (s_ "Resume") let stock = `MEDIA_PLAY end module Created_entries_for_network_component = Layout_for_network_component (State) (Toolbar_entry) (Add) (Properties) (Remove) module F = Created_entries_for_network_component.F let () = F.add_separator () module Created_Startup = Menu_factory.Make_entry_with_children (Startup') (F) module Created_Stop = Menu_factory.Make_entry_with_children (Stop') (F) let () = F.add_separator () module Created_Suspend = Menu_factory.Make_entry_with_children (Suspend') (F) module Created_Resume = Menu_factory.Make_entry_with_children (Resume') (F) end module Layout_for_network_node_with_state (State : sig val st:State.globalState end) (Toolbar_entry : Toolbar_entry) (Add : Menu_factory.Entry_callbacks) (Properties : Menu_factory.Entry_with_children_callbacks) (Remove : Menu_factory.Entry_with_children_callbacks) (Startup : Menu_factory.Entry_with_children_callbacks) (Stop : Menu_factory.Entry_with_children_callbacks) (Suspend : Menu_factory.Entry_with_children_callbacks) (Resume : Menu_factory.Entry_with_children_callbacks) (Ungracefully_stop : Menu_factory.Entry_with_children_callbacks) = struct module Ungracefully_stop' = struct include Ungracefully_stop let text = (s_ "Power-off") let stock = `DISCONNECT end module Created_entries_for_network_node = Layout_for_network_node (State) (Toolbar_entry) (Add) (Properties) (Remove) (Startup) (Stop) (Suspend) (Resume) module F = Created_entries_for_network_node.F let () = F.add_separator () module Created_Ungracefully_stop = Menu_factory.Make_entry_with_children (Ungracefully_stop') (F) end module Layout_for_network_edge (State : sig val st:State.globalState end) (Toolbar_entry : Toolbar_entry) (Add : Menu_factory.Entry_callbacks) (Properties : Menu_factory.Entry_with_children_callbacks) (Remove : Menu_factory.Entry_with_children_callbacks) (Disconnect : Menu_factory.Entry_with_children_callbacks) (Reconnect : Menu_factory.Entry_with_children_callbacks) = struct module Disconnect' = struct include Disconnect let text = (s_ "Disconnect") let stock = `DISCONNECT end module Reconnect' = struct include Reconnect let text = (s_ "Re-connect") let stock = `CONNECT end module Created_entries_for_network_component = Layout_for_network_component (State) (Toolbar_entry) (Add) (Properties) (Remove) module F = Created_entries_for_network_component.F let () = F.add_separator () module Created_Disconnect = Menu_factory.Make_entry_with_children (Disconnect') (F) module Created_Reconnect = Menu_factory.Make_entry_with_children (Reconnect') (F) (* Cable sensitiveness *) module Created_Add = Created_entries_for_network_component.Created_Add let () = State.st#add_sensitive_cable Created_Add.item#coerce end marionnet-0.90.6+bzr434.orig/gui/ledgrid_manager.ml0000600000175000017500000003262712167200764021016 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008, 2009 Luca Saiu Copyright (C) 2008, 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) let blinker_thread_socket_file_name = let result = UnixExtra.temp_file ~prefix:".marionnet-blinker-server-socket-" () in Log.printf "The blinker server socket is %s\n" result; result;; class ledgrid_manager = object (self) (** Synchornization is automatically managed by methods, thus making ledgrid_manager a monitor *) val mutex = Mutex.create () method private lock = Mutex.lock mutex method private unlock = Mutex.unlock mutex val id_to_data = Hashmap.make () method blinker_thread_socket_file_name = blinker_thread_socket_file_name (** Return a tuple (window, device, name, connected_port_indices). This is {e unlocked}! *) method private lookup (id : int) = try Hashmap.lookup id_to_data id with _ -> begin failwith ("id_to_device: No device has id " ^ (string_of_int id)) end (** This is {e unlocked}! *) method private id_to_device (id : int) = let _, device, _, _ = self#lookup id in device (** This is {e unlocked}! *) method private id_to_window (id : int) = let window, _, _, _ = self#lookup id in window (** This is {e unlocked}! *) method private id_to_name (id : int) = let _, _, name, _ = self#lookup id in name (** This is {e unlocked}! *) method private id_to_connected_ports (id : int) = let _, _, _, connected_ports = self#lookup id in connected_ports method get_connected_ports ~id () = self#lock; let result = self#id_to_connected_ports id in self#unlock; result (** This is {e unlocked}! *) method private update_connected_ports (id : int) new_connected_ports = let window, device, name, _ = self#lookup id in Hashmap.replace id_to_data id (window, device, name, new_connected_ports) (** Make the given ledgrid window always on top, and visible (this is a harmless side effect of the implementation; we always need the window to be visible anyway when calling this method) *) method private set_always_on_top id value : unit = let window = self#id_to_window id in (* window#misc#set_property "keep-above" (`BOOL true); *) let is_window_visible = true (*window#misc#hidden*) in (if is_window_visible then window#misc#hide ()); (* window#misc#set_property "keep-above" (`BOOL true); *) window#set_type_hint (if value then `DIALOG else `NORMAL); window#set_position `MOUSE; (if is_window_visible then window#misc#show ()); (** This is {e unlocked}! *) method private make_widget ~id ~port_no ?port_labelling_offset ~title ~label ~image_directory () = let window = GWindow.window ~icon:Icon.icon_pixbuf ~title ~border_width:0 ~resizable:false () in let frame = GBin.frame ~label (* ~shadow_type:`ETCHED_OUT *) ~packing:window#add () in (* let box = GPack.box `HORIZONTAL ~packing:frame#add () in *) let vbox = GPack.box `VERTICAL ~packing:frame#add () in let box = GPack.box `HORIZONTAL ~packing:vbox#add () in let always_on_top_box = GPack.box `HORIZONTAL ~packing:vbox#add () in let check_button = GButton.check_button (*~stock:`CUT*) ~label:"Always on top" ~packing:always_on_top_box#add () in ignore (check_button#connect#clicked ~callback:(fun () -> let state = check_button#active in self#set_always_on_top id state)); (* Make a label which we don't need to name: *) ignore (GMisc.label ~text:"Activity" ~packing:box#add ()); ignore (window#event#connect#delete ~callback:(fun _ -> Log.printf "Sorry, no, you can't\n"; true)); let device = new Ledgrid.device_led_grid ~packing:box#add ~ports:port_no ~show_100_mbs:false ~lines:(if port_no > 8 then 2 else 1) ~angle:(if port_no > 8 then 90.0 else 0.0) ~off_xpm_file_name:(image_directory^"/off.xpm") ~on_xpm_file_name:(image_directory^"/on.xpm") ?port_labelling_offset ~nothing_xpm_file_name:(image_directory^"/nothing.xpm") () in (* Note how the window is {e not} shown by default: it's appropriate to show it only when the device is started up. *) window, device method make_device_ledgrid ~id ~title ~label ~port_no ?port_labelling_offset ~image_directory ?connected_ports:(connected_ports=[])() = self#lock; Log.printf "Making a ledgrid with title %s (id=%d) with %d ports.\n" title id port_no; let ledgrid_widget, window_widget = self#make_widget ~id ~port_no ?port_labelling_offset ~title ~label ~image_directory () in Hashmap.add id_to_data id (ledgrid_widget, window_widget, title, connected_ports); ignore (List.map (fun port -> self#set_port_connection_state ~id ~port ~value:true ()) connected_ports); Log.printf ~v:2 "Ok, done.\n"; Log.printf ~v:2 "Testing (1): is id=%d present in the table?...\n" id; (try let _ = self#id_to_device id in Log.printf ~v:2 "Ok, passed.\n"; with _ -> Log.printf ~v:2 "FAILED.\n"); Log.printf ~v:2 "Testing (2): is id=%d present in the table?...\n" id; (try let _ = self#lookup id in Log.printf ~v:2 "Ok, passed.\n"; with _ -> Log.printf ~v:2 "FAILED.\n"); self#unlock method show_device_ledgrid ~id () = self#lock; (try (self#id_to_window id)#show (); with _ -> Log.printf "Warning: id %d unknown in show_device_ledgrid\n" id); self#unlock method hide_device_ledgrid ~id () = self#lock; (try (self#id_to_window id)#misc#hide (); with _ -> Log.printf "Warning: id %d unknown in show_device_ledgrid\n" id); self#unlock method destroy_device_ledgrid ~id () = self#lock; Log.printf "Destroying the ledgrid with id %d\n" id; (try (self#id_to_window id)#misc#hide (); (self#id_to_window id)#destroy (); Hashmap.remove id_to_data id with _ -> Log.printf "WARNING: failed in destroy_device_ledgrid: id is %d\n" id ); self#unlock method set_port_connection_state ~id ~port ~value () = self#lock; Log.printf "Making the port %d of device %d %s\n" port id (if value then " connected" else " disconnected"); (try (self#id_to_device id)#set port value; let new_connected_ports = if value then port :: (self#id_to_connected_ports id) else List.filter (fun p -> p != port) (self#id_to_connected_ports id) in self#update_connected_ports id new_connected_ports; with _ -> Log.printf "WARNING: failed in set_port_connection_state: id=%d port=%d\n" id port ); self#unlock method flash ~id ~port () = self#lock; (try (* Annoying for the world_gateway *) (* Log.print_string ("Flashing port " ^ (string_of_int port) ^ " of device " ^ *) (* (self#id_to_name id) ^ "\n"); *) (self#id_to_device id)#flash port; with _ -> ()) (* Log.printf "WARNING: failed in flashing (id: %i; port: %i)\n" id port) *); self#unlock (** Destroy all currently existing widgets and their data, so that we can start afresh with a new network: *) method reset = (* Log.print_string "\n\n*************** LEDgrid_manager: reset was called.\n\n"; *) let hashmap_as_alist = Hashmap.to_list id_to_data in ignore (List.map (fun (id, _) -> self#destroy_device_ledgrid ~id (); Hashmap.remove id_to_data id) hashmap_as_alist); val blinker_thread = ref None; method blinker_thread = match !blinker_thread with (Some blinker_thread) -> blinker_thread | None -> assert false method private make_blinker_thread = Log.printf ("Making a blinker thread\n"); Thread.create (fun () -> Log.printf ("Making the socket\n"); let socket = Unix.socket Unix.PF_UNIX Unix.SOCK_DGRAM 0 in let _ = try Unix.unlink blinker_thread_socket_file_name with _ -> () in Log.printf ("Binding the socket\n"); let _ = Unix.bind socket (Unix.ADDR_UNIX blinker_thread_socket_file_name) in Log.printf ("Still alive\n"); let maximum_message_size = 1000 in let buffer = String.create maximum_message_size in Log.printf ("Ok, entering the thread main loop\n"); while true; do (* ==== Beginning of the reasonable version ==== *) (** This commented-out version was absolutely reasonable and it worked with the old patched VDE, but for some strange reason I can't understand now recvfrom() fails, always receiving the correct message. The VDE code looks correct. Oh, well. This functionality is not critical anyway, and even one wrong blink every now and then would not be serious. Anyway, this seems to work perfectly. Go figure. *) (* Log.print_string ("\nWaiting for a string...\n"); *) (* let length = *) (* try *) (* let (length, _) = recvfrom socket buffer 0 maximum_message_size [] in length *) (* with Unix.Unix_error(error, string1, string2) -> begin *) (* Log.printf "SSSSSS recvfrom() failed: %s (\"%s\", \"%s\").\n" (Unix.error_message error) string1 string2; flush_all (); *) (* let message = String.sub buffer 0 (maximum_message_size - 1) in *) (* Log.printf "SSSSSS the possibly invalid message is >%s<\n" message; *) (* 0; *) (* end *) (* | e -> begin *) (* Log.printf "SSSSSS recvfrom() failed with a non-unix error: %s.\n" (Printexc.to_string e); flush_all (); *) (* 0; *) (* end in *) (* try *) (* let (id, port) = *) (* Scanf.sscanf message "%i %i" (fun id port -> (id, port)) *) (* in *) (* self#flash ~id ~port (); *) (* ==== End of the reasonable version ==== *) (* ==== Beginning of the unreasonable version ==== *) (try ignore (Unix.recvfrom socket buffer 0 maximum_message_size []) with _ -> ()); let length = try String.index buffer '\n' with _ -> 0 in let message = String.sub buffer 0 length in try let id1, port1, id2, port2 = (** This long formatted string is passed to VDE as a cable identifier. This allows us to easily understand which LEDs to work on when we receive a blinking command. *) Scanf.sscanf message "((id: %i; port: %i)(id: %i; port: %i))" (fun id1 port1 id2 port2 -> (id1, port1, id2, port2)) in self#flash ~id:id1 ~port:port1 (); self#flash ~id:id2 ~port:port2 (); (* ==== End of the unreasonable version ==== *) with _ -> try let _ = Scanf.sscanf message "please-die" (fun x -> x) in Log.printf ("Exiting the LEDgrid manager blinker thread\n"); Unix.close socket; let _ = try Unix.unlink blinker_thread_socket_file_name with _ -> () in Thread.exit (); Log.printf ("!!! This should never be reached !!!\n"); with _ -> Log.printf "Warning: can't understand the message '%s'\n" message; done) () initializer blinker_thread := Some self#make_blinker_thread (** This should be called before termination *) method kill_blinker_thread = let client_socket = Unix.socket Unix.PF_UNIX Unix.SOCK_DGRAM 0 in let client_socket_file_name = Filename.temp_file "blinker-killer-client-socket-" "" in (try Unix.unlink client_socket_file_name with _ -> ()); Unix.bind client_socket (Unix.ADDR_UNIX client_socket_file_name); Log.printf "Sending the message \"please-die\" to the blinker thread...\n"; flush_all (); let message = "please-die" in (try ignore (Unix.sendto client_socket message 0 ((String.length message)) [] (Unix.ADDR_UNIX blinker_thread_socket_file_name)); with _ -> begin Log.printf "VERY SERIOUS: sending the message \"please-die\" to the blinker thread failed.\n"; end); Log.printf " Ok.\n"; (* Make sure this arrives right now: *) (* flush_all (); *) (* Thread.join (self#blinker_thread); *) Log.printf "Ok, the blinker thread has exited now.\n"; (try Unix.unlink client_socket_file_name with _ -> ()); (try Unix.unlink blinker_thread_socket_file_name with _ -> ()); (* Thread.kill self#blinker_thread *) end;; (** There must be exactly one instance of ledgrid_manager: *) let the_one_and_only_ledgrid_manager = new ledgrid_manager;; marionnet-0.90.6+bzr434.orig/gui/gui_bricks.ml0000600000175000017500000006553212167200764020034 0ustar lucaslucas(* This file is part of Marionnet Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext (** {b Example}: {[ let tooltips = Gui_Bricks.make_tooltips_for_container window in tooltips label#coerce "hello"; tooltips entry#coerce "salut"; ]} *) let make_tooltips_for_container w = let result = (GData.tooltips ()) in let _ = w#connect#destroy ~callback:(fun _ -> result#destroy ()) in fun (widget:GObj.widget) text -> result#set_tip widget ~text (** Make a classic rectangular input form with field labels at the left side and input widgets at the right side of each line. Labels are get from the input string list while input widgets are added later using the method [add]. {b Example}: {[... let form = Gui_Bricks.make_form_with_labels ~packing:vbox#add ["IPv4 address"; "DHCP service"] in let ipv4address = GEdit.entry ~text:"10.0.2.1" ~packing:form#add () in let dhcp_enabled = GButton.check_button ~packing:form#add () in ...}] *) let make_form_with_labels ?(section_no=0) ?(row_spacings=10) ?(col_spacings=10) ?packing string_list = let rows = (List.length string_list) + (section_no * 2) in let table = GPack.table ~row_spacings ~col_spacings ~rows ~columns:2 ~homogeneous:false ?packing () in let labels = Array.mapi (fun i label_text -> let label = GMisc.label ~xalign:0. ~markup:label_text () in label) (Array.of_list string_list) in let tooltip = make_tooltips_for_container table in object (self) method table = table method coerce = table#coerce val mutable field_index = 0 val mutable row_index = 0 method private aligned_widget widget = let box = GBin.alignment ~xalign:0. ~yalign:0.5 ~xscale:0.0 ~yscale:0.0 () in box#add widget#coerce; box method add = let top = row_index in (* top is in the closure *) let field = field_index in table#attach ~left:0 ~top (Array.get labels field)#coerce; row_index <- row_index+1; field_index <- field_index+1; (function widget -> table#attach ~left:1 ~top (self#aligned_widget widget)#coerce; ) method add_section ?(fg="lightgray") ?(size="large") ?no_line markup = let markup = Printf.sprintf "%s" fg size markup; in let label = GMisc.label ~xalign:0. ~markup () in let top = row_index+1 in row_index <- row_index+2; (* additional line for vertical spacing *) table#attach ~left:0 ~top label#coerce; (match no_line with | None -> table#attach ~left:1 ~top (GMisc.separator `HORIZONTAL ())#coerce | _ -> ()); method add_with_tooltip ?just_for_label text = let top = row_index in (* top is in the closure *) let field = field_index in table#attach ~left:0 ~top (Array.get labels field)#coerce; row_index <- row_index+1; field_index <- field_index+1; (function widget -> table#attach ~left:1 ~top (self#aligned_widget widget)#coerce; (if just_for_label = None then tooltip widget text); tooltip ((Array.get labels field)#coerce) text; ) end (** Wrap the given widget with a label, using an hidden table which will be packaged in its container (if provided). The result is the input widget itself. {b Example}: {[ let entry_with_label ?packing ?max_length ?entry_text ?labelpos label_text = let entry = GEdit.entry ?text:entry_text ?max_length () in Gui_Bricks.wrap_with_label ?packing ?labelpos label_text entry ]} *) let wrap_with_label ?tooltip ?packing ?(labelpos=`NORTH) label_text widget = let label = GMisc.label ~text:label_text () in let (rows, columns) = match labelpos with | `NORTH | `SOUTH -> 2,1 | `EAST | `WEST -> 1,2 in let table = GPack.table ~rows ~columns ~homogeneous:true ?packing () in let () = match labelpos with | `NORTH -> table#attach ~left:0 ~top:0 label#coerce; table#attach ~left:0 ~top:1 widget#coerce | `SOUTH -> table#attach ~left:0 ~top:0 widget#coerce; table#attach ~left:0 ~top:1 label#coerce | `WEST -> table#attach ~left:0 ~top:0 label#coerce; table#attach ~left:1 ~top:0 widget#coerce | `EAST -> table#attach ~left:0 ~top:0 widget#coerce; table#attach ~left:1 ~top:0 label#coerce in Option.iter ((make_tooltips_for_container table) table#coerce) tooltip; widget (** A simple [GEdit.entry] equipped by a label specified as a string. *) let entry_with_label ?tooltip ?packing ?max_length ?entry_text ?labelpos label_text = let entry = GEdit.entry ?text:entry_text ?max_length () in wrap_with_label ?tooltip ?packing ?labelpos label_text entry (** Not in the interface.*) let add_tooltip_label_and_labelpos_parameters ?tooltip ?label ?labelpos ?packing maker = match label with | None -> maker ?tooltip ?packing () | Some label_text -> let result = maker ?tooltip:None ?packing:None () in let _ = wrap_with_label ?tooltip ?packing ?labelpos label_text result in result (** A spin for bytes, i.e. for values in the range [0..255]. *) let spin_byte ?tooltip ?label ?labelpos ?(lower=0) ?(upper=255) ?(step_incr=1) ?packing value = let lower = float_of_int lower in let upper = float_of_int upper in let step_incr = float_of_int step_incr in let maker ?tooltip ?packing () = let sb = GEdit.spin_button ?packing (*~width:50*) (* 60 *) ~digits:0 ~numeric:true () in sb#adjustment#set_bounds ~lower ~upper ~step_incr (); sb#set_value (float_of_int value); Option.iter ((make_tooltips_for_container sb) sb#coerce) tooltip; sb in add_tooltip_label_and_labelpos_parameters ?tooltip ?label ?labelpos ?packing maker ;; let byte_tooltips_default_array = Array.of_list [ (s_ "First byte of the IPv4 address" ); (s_ "Second byte of the IPv4 address" ); (s_ "Third byte of the IPv4 address" ); (s_ "Fourth byte of the IPv4 address" ); (s_ "Netmask (CIDR notation)" ); ] (** Four spins for asking for an ipv4 address. *) let spin_ipv4_address ?tooltip ?byte_tooltips ?label ?labelpos ?packing v1 v2 v3 v4 = let byte_tooltips = match byte_tooltips with | None -> byte_tooltips_default_array | Some a -> a in let (tooltip_s1, tooltip_s2, tooltip_s3, tooltip_s4) = let a = byte_tooltips in (a.(0), a.(1), a.(2), a.(3)) in let maker ?packing () = let table = GPack.table ~rows:1 ~columns:7 ~homogeneous:false ?packing () in let dot ~left = GMisc.label ~packing:(table#attach ~left ~top:0) ~width:15 ~markup:"." () in let s1 = spin_byte ~tooltip:tooltip_s1 ~packing:(table#attach ~left:0 ~top:0) v1 in let _1 = dot ~left:1 in let s2 = spin_byte ~tooltip:tooltip_s2 ~packing:(table#attach ~left:2 ~top:0) v2 in let _2 = dot ~left:3 in let s3 = spin_byte ~tooltip:tooltip_s3 ~packing:(table#attach ~left:4 ~top:0) v3 in let _3 = dot ~left:5 in let s4 = spin_byte ~tooltip:tooltip_s4 ~packing:(table#attach ~left:6 ~top:0) v4 in (table,(s1,s2,s3,s4)) in match label with | None -> snd (maker ?packing ()) | Some label_text -> let (table,(s1,s2,s3,s4)) = maker ?packing:None () in let _ = wrap_with_label ?tooltip ?packing ?labelpos label_text table in (s1,s2,s3,s4) (** Four spins for asking for an ipv4 address, and a fifth for the netmask (in CIDR notation). *) let spin_ipv4_address_with_cidr_netmask ?tooltip ?byte_tooltips ?label ?labelpos ?packing v1 v2 v3 v4 v5 = let byte_tooltips = match byte_tooltips with | None -> byte_tooltips_default_array | Some a -> a in let (tooltip_s1, tooltip_s2, tooltip_s3, tooltip_s4, tooltip_s5) = let a = byte_tooltips in (a.(0), a.(1), a.(2), a.(3), a.(4)) in let maker ?packing () = let table = GPack.table ~rows:1 ~columns:9 ~homogeneous:false ?packing () in let dot ~left = GMisc.label ~packing:(table#attach ~left ~top:0) ~width:15 ~markup:"." () in let s1 = spin_byte ~tooltip:tooltip_s1 ~packing:(table#attach ~left:0 ~top:0) v1 in let _1 = dot ~left:1 in let s2 = spin_byte ~tooltip:tooltip_s2 ~packing:(table#attach ~left:2 ~top:0) v2 in let _2 = dot ~left:3 in let s3 = spin_byte ~tooltip:tooltip_s3 ~packing:(table#attach ~left:4 ~top:0) v3 in let _3 = dot ~left:5 in let s4 = spin_byte ~tooltip:tooltip_s4 ~packing:(table#attach ~left:6 ~top:0) v4 in let _slash = GMisc.label ~packing:(table#attach ~left:7 ~top:0) ~width:15 ~markup:"/" () in let s5 = spin_byte ~tooltip:tooltip_s5 ~packing:(table#attach ~left:8 ~top:0) v5 in (table,(s1,s2,s3,s4,s5)) in match label with | None -> snd (maker ?packing ()) | Some label_text -> let (table,(s1,s2,s3,s4,s5)) = maker ?packing:None () in let _ = wrap_with_label ?tooltip ?packing ?labelpos label_text table in (s1,s2,s3,s4,s5) let add_help_button_if_necessary window = function | None -> (fun () -> ()) | Some f -> (window#add_button_stock `HELP `HELP; f) module Ok_callback = struct let check_name name old_name name_exists t = if not (StrExtra.Class.identifierp name) then begin Simple_dialogs.error (s_ "Ill-formed name" ) ("Admissible characters are letters and underscores." ) (); None (* refused *) end else if (name <> old_name) && name_exists name then begin Simple_dialogs.error (s_ "Name conflict" ) (Printf.sprintf(f_ "The name '%s' is already used in the virtual network. The names of virtual network elements must be unique." ) name) (); None (* refused *) end else Some t (* accepted *) end (* module Ok_callback *) (** Wrappers for the method [run] of a dialog window. *) module Dialog_run = struct (** Wrapper for the method [run] of a dialog window. The function [get_widget_data] must extract the values from the dialog. The function [ok_callback] must check these values: if it consider that are incorrect, it returns [None] in order to continue the loop. Otherwise it builds the result [Some something] of the loop. If the [?help_callback] is not provided, the help button is not built. *) let ok_or_cancel (w:[ `CANCEL | `DELETE_EVENT | `HELP | `OK ] GWindow.dialog) ~(get_widget_data:unit -> 'a) ~(ok_callback:'a -> 'b option) ?help_callback () = begin let help_callback = add_help_button_if_necessary w help_callback in w#add_button_stock `CANCEL `CANCEL; w#add_button_stock `OK `OK; w#set_default_response `OK; w#set_response_sensitive `OK true; let result = ref None in let rec loop () = match w#run () with | `DELETE_EVENT | `CANCEL -> () | `HELP -> (help_callback ()); loop () | `OK -> (match ok_callback (get_widget_data ()) with | None -> loop () | Some d -> result := Some d ) in (* The enter key has the same effect than pressing the OK button: *) let f_enter () = match ok_callback (get_widget_data ()) with | None -> () | Some d -> (result := Some d; ignore (w#event#send (GdkEvent.create `DELETE))) in let _ = w#event#connect#key_press ~callback: begin fun ev -> (if GdkEvent.Key.keyval ev = GdkKeysyms._Return then f_enter ()); false end in loop (); w#destroy (); !result end let set_key_meaning_to window key result value = let f_key () = (result := value; ignore (window#event#send (GdkEvent.create `DELETE))) in ignore (window#event#connect#key_press ~callback: begin fun ev -> (if GdkEvent.Key.keyval ev = key then f_key ()); false end) let yes_or_cancel (w:[ `CANCEL | `DELETE_EVENT | `HELP | `YES ] GWindow.dialog) ?help_callback ~(context:'a) () : 'a option = begin let help_callback = add_help_button_if_necessary w help_callback in w#add_button_stock `CANCEL `CANCEL; w#add_button_stock `YES `YES; w#set_default_response `YES; w#set_response_sensitive `YES true; let result = ref None in let rec loop () = match w#run () with | `DELETE_EVENT | `CANCEL -> () | `HELP -> (help_callback ()); loop () | `YES -> result := Some context in (* The enter key has the same effect than pressing the YES button: *) set_key_meaning_to w GdkKeysyms._Return result (Some context); loop (); w#destroy (); !result end (* Example: do you want to save the project before quitting? *) let yes_no_or_cancel (w:[ `CANCEL | `DELETE_EVENT | `HELP | `NO | `YES ] GWindow.dialog) ?help_callback ~(context:'a) () : ('a * bool) option = begin let help_callback = add_help_button_if_necessary w help_callback in w#add_button_stock `CANCEL `CANCEL; w#add_button_stock `NO `NO; w#add_button_stock `YES `YES; w#set_default_response `YES; w#set_response_sensitive `YES true; let result = ref None in let rec loop () = match w#run () with | `DELETE_EVENT | `CANCEL -> () | `HELP -> (help_callback ()); loop () | `YES -> result := Some (context,true) | `NO -> result := Some (context,false) in (* The enter key has the same effect than pressing the YES button: *) set_key_meaning_to w GdkKeysyms._Return result (Some (context,true)); loop (); w#destroy (); !result end end (* module Dialog_run *) let set_marionnet_icon window = let icon = let icon_file = Initialization.Path.images^"marionnet-launcher.png" in GdkPixbuf.from_file icon_file in (window#set_icon (Some icon)) module Dialog = struct let make_a_window_for_a_question ?(title="Question") ?(image_filename=Initialization.Path.images^"ico.question-2.orig.png") ?markup ?text () = let w = GWindow.dialog ~destroy_with_parent:true ~title ~modal:true ~resizable:false ~position:`CENTER () in set_marionnet_icon w; let hbox = GPack.hbox ~homogeneous:false ~border_width:20 ~spacing:10 ~packing:w#vbox#add () in let _image = GMisc.image ~file:image_filename ~xalign:0.5 ~packing:hbox#add () in let _label = GMisc.label ?markup ?text ~justify:`CENTER ~xalign:0.5 ~xpad:10 ~ypad:10 ~packing:hbox#add () in w let yes_or_cancel_question ?title ?help_callback ?image_filename ?markup ?text ~(context:'a) () : 'a option = let w = make_a_window_for_a_question ?title ?image_filename ?markup ?text () in Dialog_run.yes_or_cancel w ?help_callback ~context () let yes_no_or_cancel_question ?title ?help_callback ?image_filename ?markup ?text ~(context:'a) () : ('a * bool) option = let w = make_a_window_for_a_question ?title ?image_filename ?markup ?text () in Dialog_run.yes_no_or_cancel w ?help_callback ~context () end (* module Dialog *) type packing_function = GObj.widget -> unit let make_combo_boxes_of_vm_installations ?on_distrib_change ?on_variant_change ?on_kernel_change ?distribution ?variant ?kernel ?updating ~packing (vm_installations : Disk.virtual_machine_installations) = (* Convert updating as boolean: *) let updating = (updating<>None) in (* Resolve the initial choice for distribution: *) let distribution = match distribution with | None -> Option.extract vm_installations#filesystems#get_default_epithet | Some x -> x in (* Resolve the initial choice for variant: *) let variant = match variant with | None -> "none" | Some x -> x in (* Resolve the initial choice for kernel: *) let kernel = match kernel with | None -> fst (List.hd (vm_installations#supported_kernels_of distribution)) | Some x -> x in let (packing_distribution, packing_variant, packing_kernel) = packing in (* The user can't change filesystem and variant any more once the device has been created. TODO: release this constraint. *) let distribution_widget = let distribution_choices = match updating with | false -> (vm_installations#filesystems#get_epithet_list) | true -> [distribution] in let variant_choices = fun epithet -> match updating with | false -> "none"::(vm_installations#variants_of epithet)#get_epithet_list | true -> [variant] in let kernel_choices = fun epithet -> List.map fst (vm_installations#supported_kernels_of epithet) in Widget.ComboTextTree.fromListWithTwoSlaves ~masterCallback:on_distrib_change ~masterPacking:(Some packing_distribution) distribution_choices ~slave0Callback:on_variant_change ~slave0Packing:(Some packing_variant) variant_choices ~slave1Callback:on_kernel_change ~slave1Packing:(Some packing_kernel) kernel_choices in let initial_variant_widget = distribution_widget#slave0 and initial_kernel_widget = distribution_widget#slave1 in (* Initialization: *) let () = (* Setting active values: *) distribution_widget#set_active_value distribution; initial_variant_widget#set_active_value variant; initial_kernel_widget#set_active_value kernel; (* Blocking changes updating: *) if updating then begin distribution_widget#box#misc#set_sensitive false; initial_variant_widget#box#misc#set_sensitive false; end else () in (* The result: *) distribution_widget module Dialog_add_or_update = struct let make_window_image_name_and_label ~title ~image_file ~image_tooltip ~name ~name_tooltip ?label ?label_tooltip () = let w = GWindow.dialog ~destroy_with_parent:true ~title ~modal:true ~position:`CENTER () in set_marionnet_icon w; let tooltips = make_tooltips_for_container w in let hbox = GPack.hbox ~homogeneous:true ~border_width:20 ~spacing:10 ~packing:w#vbox#add () in let image = GMisc.image ~file:image_file ~xalign:0.5 ~packing:hbox#add () in tooltips image#coerce image_tooltip; let vbox = GPack.vbox ~spacing:10 ~packing:hbox#add () in let name = entry_with_label ~tooltip:name_tooltip ~packing:vbox#add ~entry_text:name (s_ "Name") in let label = let tooltip = match label_tooltip with | None -> (s_ "Label to be written in the network sketch, next to the element icon." ) | Some x -> x in entry_with_label ~tooltip ~packing:vbox#add ?entry_text:label (s_ "Label") in ignore (GMisc.separator `HORIZONTAL ~packing:w#vbox#add ()); (w,image,name,label) end (* module Dialog_add_or_update *) #load "chip_parser_p4.cmo" ;; module Reactive_widget = struct class combo_box_text ?name ?parent ?system ~(strings:string list) ?active ?width ?height ~packing () = let system = Option.extract system ~fallback:Chip.get_or_initialize_current_system in let name = match name with None -> Chip.fresh_wire_name "combo_box_text" | Some x -> x in let make_widget ?(active=0) strings = let w = GEdit.combo_box_text ~strings ~use_markup:true ~active ~packing ?width ?height () in ignore ((fst w)#connect#changed (fun _ -> ignore system#stabilize)); w in object (self) inherit [string list * int option, string option] Chip.wire ~name ?parent system val mutable content = make_widget ?active strings val mutable strings_content = strings method reset () = assert false (* unused! *) method get_alone = GEdit.text_combo_get_active content method set_alone (strings, active) = let active = match active with | Some i -> Some i | None -> (* The old selected string, if exists, is recovered: *) let active_string = GEdit.text_combo_get_active content in Option.bind active_string (fun x -> ListExtra.indexOf x strings) in (match strings = strings_content with | true -> Option.iter ((fst content)#set_active) active | false -> (fst content)#destroy (); content <- make_widget ?active strings; strings_content <- strings; ) method destroy = (fst content)#destroy end let partition ?(loopback=true) xys n0 p0 n1 p1 = let nodes_of xys = ListExtra.uniq (List.map fst xys) in let substract (n0,p0) xys = match n0,p0 with | (Some n0, Some p0) -> List.filter ((<>)(n0,p0)) xys | (Some n0, None) -> List.filter (fun (n,p)->n<>n0) xys | _ -> xys in let (>>=) = Option.bind in let index_of n xs = n >>= (fun n -> (Option.map fst (ListExtra.searchi ((=)n) xs))) in let ports_of n xys = match n with | None -> [] | Some x -> ListExtra.filter_map (fun (n,p)-> if n=x then Some p else None) xys in let xs0 = nodes_of xys in let xs0_active = index_of n0 xs0 in let ys0 = ports_of n0 xys in let ys0_active = index_of p0 ys0 in let (xs1, ys1) = let xys' = match loopback with | true -> substract (n0,p0) xys | false -> substract (n0,None) xys in (nodes_of xys', ports_of n1 xys') in let xs1_active = index_of n1 xs1 in let ys1_active = index_of p1 ys1 in let w1 = (xs0, xs0_active) in let w2 = (ys0, ys0_active) in let w3 = (xs1, xs1_active) in let w4 = (ys1, ys1_active) in (w1,w2,w3,w4) ;; let guess_humanly_speaking_enpoints xys n0 p0 n1 p1 = let ((xs0,_),(ys0,_),(xs1,_),(ys1,_)) = partition ~loopback:false xys n0 p0 n1 p1 in let x0 = Option.apply_or_catch List.hd xs0 in let y0 = Option.apply_or_catch List.hd ys0 in let x1 = Option.apply_or_catch List.hd xs1 in let y1 = Option.apply_or_catch List.hd ys1 in ((x0,y0),(x1,y1)) chip partition_chip (xys:(string * string) list) : (x0,y0,x1,y1) -> (w1,w2,w3,w4) = (partition xys x0 y0 x1 y1) ;; class cable_input_widget ?n0 ?p0 ?n1 ?p1 ?width ?height ~packing_n0 ~packing_p0 ~packing_n1 ~packing_p1 ~free_node_port_list () = let (w1,w2,w3,w4) = partition free_node_port_list n0 p0 n1 p1 in let (xs0, xs0_active) = w1 in let (ys0, ys0_active) = w2 in let (xs1, xs1_active) = w3 in let (ys1, ys1_active) = w4 in let system = new Chip.system () in let n0_widget = let packing = packing_n0 in new combo_box_text ~name:"n0" ~system ~strings:xs0 ?active:xs0_active ?width ?height ~packing () in let p0_widget = let packing = packing_p0 in new combo_box_text ~name:"p0" ~system ~strings:ys0 ?active:ys0_active ?width ?height ~packing () in let n1_widget = let packing = packing_n1 in new combo_box_text ~name:"n1" ~system ~strings:xs1 ?active:xs1_active ?width ?height ~packing () in let p1_widget = let packing = packing_p1 in new combo_box_text ~name:"p1" ~system ~strings:ys1 ?active:ys1_active ?width ?height ~packing () in let _partition_chip = new partition_chip free_node_port_list ~system ~x0:n0_widget ~y0:p0_widget ~x1:n1_widget ~y1:p1_widget ~w1:n0_widget ~w2:p0_widget ~w3:n1_widget ~w4:p1_widget () in object (self) method get_widget_data = ((n0_widget#get, p0_widget#get), (n1_widget#get, p1_widget#get)) method system = system method destroy = List.iter (fun w->w#destroy ()) [n0_widget; p0_widget; n1_widget; p1_widget] initializer ignore system#stabilize; end end (* Reactive_widget *) let make_image_with_either_stock_or_file ?window ?stock_size ?stock ?file () = let make_with_file file = (* Complete the filename if necessary: *) let file = if (Filename.is_implicit file) then Filename.concat (Initialization.Path.images) file else file in let pixmap = GDraw.pixmap_from_xpm ?window ~file () in let image = GMisc.pixmap pixmap () in image in let make_with_stock stock = let icon_size = stock_size in GMisc.image ?icon_size ~stock () in match stock,file with | None, Some file -> make_with_file file | Some stock, None -> make_with_stock stock | _,_ -> failwith "Gui_Bricks.button_image: either ?stock or ?file is required" (* The label and image positions are relative. Gtk speaks about the image position with respect to the label. So, if we want indeed to speak about the label position with respect to the image, we have to invert the value: *) let opposite_position = function `BOTTOM -> `TOP | `LEFT -> `RIGHT | `RIGHT -> `LEFT | `TOP -> `BOTTOM let button_image ?window ?callback ?label ?label_position ?tooltip ~packing ?stock ?stock_size ?file () = let image = make_image_with_either_stock_or_file ?window ?stock_size ?stock ?file () in let button = GButton.button ~packing () in let () = button#set_image image#coerce in let () = match callback with | None -> () | Some callback -> ignore (button#connect#clicked ~callback) in let set_tooltip text = (GData.tooltips ())#set_tip button#coerce ~text in let () = Option.iter (button#set_label) label; Option.iter (fun p -> button#set_image_position (opposite_position p)) label_position; Option.iter set_tooltip tooltip in button (** The ~renewer parameter allows us to generate dynamic menus (see the function `make_check_items_renewer_v1' below) *) let button_image_popuping_a_menu ?window ?renewer ?label ?label_position ?tooltip ~packing ?stock ?stock_size ?file () : (GMenu.menu * GButton.button * GPack.box) = let hbox = GPack.vbox ~homogeneous:false ~packing () in let button = button_image ?window ?label ?label_position ?tooltip ~packing:(hbox#add) ?stock ?stock_size ?file () in let menubar = GMenu.menu_bar ~packing:(hbox#add) () in let () = menubar#misc#hide () in let factory = new GMenu.factory menubar in let menu = factory#add_submenu "" in let _connect_clicked = let callback () = menu#popup ~button:0 ~time:(GtkMain.Main.get_current_event_time ()) in (* Call before the renewer if provided: *) let callback = match renewer with | None -> callback | Some renewer -> (fun () -> (renewer menu); callback ()) in button#connect#clicked ~callback in (menu, button, hbox) let make_check_items_renewer_v1 ~get_label_active_callback_list (* unit -> (string * bool * (bool -> unit)) list *) () = fun (menu:GMenu.menu) -> begin let () = List.iter (menu#remove) (menu#children) in let label_active_callback_list = get_label_active_callback_list () in let () = List.iter (fun (label, active, callback) -> let item = GMenu.check_menu_item ~active ~label ~packing:(menu#append) () in let _ = item#connect#toggled ~callback:(fun () -> callback item#active) in ()) label_active_callback_list in () end let make_check_items_renewer_v2 ~get_label_active_list (* unit -> (string * bool) list *) ~callback (* string -> bool -> unit *) () = let get_label_active_callback_list () = List.map (fun (label, active) -> (label, active, (fun b -> callback label b))) (get_label_active_list ()) in make_check_items_renewer_v1 ~get_label_active_callback_list () let test () = Dialog.yes_or_cancel_question ~markup:"test bold" ~context:'a' () marionnet-0.90.6+bzr434.orig/router.ml0000600000175000017500000005505712167200764016450 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext;; (** Gui-related stuff for the user-level component "router". *) (* The module containing the add/update dialog is defined later, using the syntax extension "where" *) #load "where_p4.cmo" ;; (* Router related constants: *) (* TODO: make it configurable! *) module Const = struct let port_no_default = 4 let port_no_min = 4 let port_no_max = 16 let port_0_ip_config_default = Initialization.router_port0_default_ipv4_config let memory_default = 48 end (* The type of data returned by the dialog: *) module Data = struct type t = { name : string; label : string; port_0_ip_config : Ipv4.config; port_no : int; distribution : string; (* epithet *) variant : string option; kernel : string; (* epithet *) show_unix_terminal : bool; old_name : string; } let to_string t = "" (* TODO? *) end (* Data *) module Make_menus (Params : sig val st : State.globalState val packing : [ `toolbar of GButton.toolbar | `menu_parent of Menu_factory.menu_parent ] end) = struct open Params module Toolbar_entry = struct let imagefile = "ico.router.palette.png" let tooltip = (s_ "Router") let packing = Params.packing end module Add = struct include Data let key = Some GdkKeysyms._R let ok_callback t = Gui_bricks.Ok_callback.check_name t.name t.old_name st#network#name_exists t let dialog () = let name = st#network#suggestedName "R" in Dialog_add_or_update.make ~title:(s_ "Add router") ~name ~ok_callback () let reaction { name = name; label = label; port_0_ip_config = port_0_ip_config; port_no = port_no; distribution = distribution; variant = variant; kernel = kernel; show_unix_terminal = show_unix_terminal; old_name = _ ; } = let action () = ignore ( new User_level_router.router (* defined later with WHERE *) ~network:st#network ~name ~label ~port_0_ip_config ~epithet:distribution ?variant:variant ~kernel ~port_no ~show_unix_terminal ()) in st#network_change action (); end (* Add *) module Properties = struct include Data let dynlist () = st#network#get_nodes_that_can_startup ~devkind:`Router () let dialog name () = let r = (st#network#get_node_by_name name) in let r = ((Obj.magic r):> User_level_router.router) in let title = (s_ "Modify router")^" "^name in let label = r#get_label in let distribution = r#get_epithet in let variant = r#get_variant in let kernel = r#get_kernel in let show_unix_terminal = r#get_show_unix_terminal in let port_no = r#get_port_no in let port_0_ip_config = r#get_port_0_ip_config in (* The user cannot remove receptacles used by a cable. *) let port_no_min = st#network#port_no_lower_of (r :> User_level.node) in Dialog_add_or_update.make ~title ~name ~label ~distribution ?variant ~show_unix_terminal ~port_no ~port_no_min ~port_0_ip_config ~kernel ~updating:() (* the user cannot change the distrib & variant *) ~ok_callback:Add.ok_callback () let reaction { name = name; label = label; port_0_ip_config = port_0_ip_config; port_no = port_no; kernel = kernel; show_unix_terminal = show_unix_terminal; old_name = old_name; } = let d = (st#network#get_node_by_name old_name) in let r = ((Obj.magic d):> User_level_router.router) in let action () = r#update_router_with ~name ~label ~port_0_ip_config ~port_no ~kernel ~show_unix_terminal in st#network_change action (); end (* Properties *) module Remove = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist = Properties.dynlist let dialog name () = Gui_bricks.Dialog.yes_or_cancel_question ~title:(s_ "Remove") ~markup:(Printf.sprintf (f_ "Are you sure that you want to remove %s\nand all the cables connected to this %s?") name (s_ "router")) ~context:name () let reaction name = let d = (st#network#get_node_by_name name) in let r = ((Obj.magic d):> User_level_router.router) in let action () = r#destroy in st#network_change action (); end module Startup = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist = Properties.dynlist let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#startup end module Stop = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist () = st#network#get_nodes_that_can_gracefully_shutdown ~devkind:`Router () let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#gracefully_shutdown end module Suspend = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist () = st#network#get_nodes_that_can_suspend ~devkind:`Router () let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#suspend end module Resume = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist () = st#network#get_nodes_that_can_resume ~devkind:`Router () let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#resume end module Create_entries = Gui_toolbar_COMPONENTS_layouts.Layout_for_network_node (Params) (Toolbar_entry) (Add) (Properties) (Remove) (Startup) (Stop) (Suspend) (Resume) (* Subscribe this kind of component to the network club: *) st#network#subscribe_a_try_to_add_procedure Eval_forest_child.try_to_add_router; end (*-----*) WHERE (*-----*) module Dialog_add_or_update = struct (* This function may be useful for testing the widget creation without recompiling the whole project. *) let make ?(title="Add a router") ?(name="") ?label ?(port_0_ip_config=Const.port_0_ip_config_default) ?(port_no=Const.port_no_default) ?(port_no_min=Const.port_no_min) ?(port_no_max=Const.port_no_max) ?distribution ?variant ?kernel ?(updating:unit option) ?(show_unix_terminal=false) ?(help_callback=help_callback) (* defined backward with "WHERE" *) ?(ok_callback=(fun data -> Some data)) ?(dialog_image_file=Initialization.Path.images^"ico.router.dialog.png") () :'result option = let old_name = name in let ((b1,b2,b3,b4),b5) = port_0_ip_config in let vm_installations = Disk.get_router_installations () in let (w,_,name,label) = Gui_bricks.Dialog_add_or_update.make_window_image_name_and_label ~title ~image_file:dialog_image_file ~image_tooltip:(s_ "Router") ~name ~name_tooltip:(s_ "Router name. This name must be unique in the virtual network. Suggested: R1, R2, ...") ?label () in let ((s1,s2,s3,s4,s5), port_no, distribution_variant_kernel, show_unix_terminal) = let vbox = GPack.vbox ~homogeneous:false ~border_width:20 ~spacing:10 ~packing:w#vbox#add () in let form = Gui_bricks.make_form_with_labels ~packing:vbox#add [(s_ "Ports number"); (s_ "Port 0 address"); (s_ "Distribution"); (s_ "Variant"); (s_ "Kernel"); (s_ "Show unix terminal"); ] in form#add_section ~no_line:() "Hardware"; let port_no = Gui_bricks.spin_byte ~lower:port_no_min ~upper:port_no_max ~step_incr:2 ~packing:(form#add_with_tooltip (s_ "Number of router ports" )) port_no in let port_0_ip_config = Gui_bricks.spin_ipv4_address_with_cidr_netmask ~packing:(form#add_with_tooltip ~just_for_label:() (s_ "IPv4 configuration of the first router port (0)")) b1 b2 b3 b4 b5 in form#add_section "Software"; let distribution_variant_kernel = let packing_distribution = form#add_with_tooltip (s_ "GNU/Linux distribution installed on the router." ) in let packing_variant = form#add_with_tooltip (s_ "Initial hard disk state. The router will start by default with this variant of the chosen distribution." ) in let packing_kernel = form#add_with_tooltip (s_ "Linux kernel version used for this router." ) in let packing = (packing_distribution, packing_variant, packing_kernel) in Gui_bricks.make_combo_boxes_of_vm_installations ?distribution ?variant ?kernel ?updating ~packing vm_installations in form#add_section "Access"; let show_unix_terminal = GButton.check_button ~active:show_unix_terminal ~packing:(form#add_with_tooltip (s_ "Do you want access the router also by a Unix terminal?" )) () in (port_0_ip_config, port_no, distribution_variant_kernel, show_unix_terminal) in let get_widget_data () :'result = let name = name#text in let label = label#text in let port_0_ip_config = let s1 = int_of_float s1#value in let s2 = int_of_float s2#value in let s3 = int_of_float s3#value in let s4 = int_of_float s4#value in let s5 = int_of_float s5#value in ((s1,s2,s3,s4),s5) in let port_no = int_of_float port_no#value in let distribution = distribution_variant_kernel#selected in let variant = distribution_variant_kernel#slave0#selected in let kernel = distribution_variant_kernel#slave1#selected in let variant = match variant with | "none" -> None | x -> Some x in let show_unix_terminal = show_unix_terminal#active in { Data.name = name; Data.label = label; Data.port_0_ip_config = port_0_ip_config; Data.port_no = port_no; Data.distribution = distribution; Data.variant = variant; Data.kernel = kernel; Data.show_unix_terminal = show_unix_terminal; Data.old_name = old_name; } in (* The result of make is the result of the dialog loop (of type 'result option): *) Gui_bricks.Dialog_run.ok_or_cancel w ~ok_callback ~help_callback ~get_widget_data () (*-----*) WHERE (*-----*) let help_callback = let title = (s_ "ADD OR MODIFY A ROUTER") in let msg = (s_ "\ In this dialog window you can define the name of an IP router \ and set many parameters for it:\n\n\ - Label: a string appearing near the router icon in the network graph; \ this field is exclusively for graphic purposes, is not taken in consideration \ for the configuration.\n\ - Nb of Ports: the number of ports of the router (default 4); this number must \ not be increased without a reason, because the number of processes needed for the \ device emulation is proportional to his ports number.\n\n\ The emulation of this device is realised with the program 'quagga' derived from \ the project 'zebra'.\n\n\ Every interface of the router can be configured in the tab \ 'Interfaces'. Once started, the router will answer to the telnet \ protocol on every configured interface, on the following tcp ports:\n\n\ zebra\t\t2601/tcp\t\t# zebra vty\n\ ripd\t\t\t2602/tcp\t\t# RIPd vty\n\ ripngd\t\t2603/tcp\t\t# RIPngd vty\n\ ospfd\t\t2604/tcp\t\t# OSPFd vty\n\ bgpd\t\t2605/tcp\t\t# BGPd vty\n\ ospf6d\t\t2606/tcp\t\t# OSPF6d vty\n\ isisd\t\t\t2608/tcp\t\t# ISISd vty\n\n\ Password: zebra") in Simple_dialogs.help title msg ;; end (*-----*) WHERE (*-----*) module Eval_forest_child = struct let try_to_add_router (network:User_level.network) ((root,children):Xforest.tree) = try (match root with | ("router", attrs) -> let name = List.assoc "name" attrs in let port_no = int_of_string (List.assoc "port_no" attrs) in Log.printf "Importing router \"%s\" with %d ports...\n" name port_no; let x = new User_level_router.router ~network ~name ~port_no () in x#from_tree ("router", attrs) children; Log.printf "Router \"%s\" successfully imported.\n" name; true (* backward compatibility *) | ("device", attrs) -> let name = List.assoc "name" attrs in let port_no = int_of_string (List.assoc "eth" attrs) in let kind = List.assoc "kind" attrs in (match kind with | "router" -> Log.printf "Importing router \"%s\" with %d ports...\n" name port_no; let r = new User_level_router.router ~network ~name ~port_no () in let x = (r :> User_level.node_with_ledgrid_and_defects) in x#from_tree ("device", attrs) children ; Log.printf "Router \"%s\" successfully imported.\n" name; true | _ -> false ) | _ -> false ) with _ -> false end (* module Eval_forest_child *) (*-----*) WHERE (*-----*) module User_level_router = struct class router ~(network:User_level.network) ~name ?(port_0_ip_config=Const.port_0_ip_config_default) ?label ?epithet ?variant ?kernel ?(show_unix_terminal=false) ?terminal ~port_no () = let vm_installations = Disk.get_router_installations () in let network_alias = network in (* The ifconfig treeview wants a port 0 configuration at creation time:*) let ifconfig_port_row_completions = let (ipv4,cidr) = port_0_ip_config in (* the class parameter *) let netmask_string = (Ipv4.to_string (Ipv4.netmask_of_cidr cidr)) in [ ("port0", [ "IPv4 address", Treeview.Row_item.String (Ipv4.to_string ipv4); "IPv4 netmask", Treeview.Row_item.String netmask_string; ]) ] in object (self) inherit OoExtra.destroy_methods () inherit User_level.node_with_ledgrid_and_defects ~network ~name ?label ~devkind:`Router ~port_no ~port_no_min:Const.port_no_min ~port_no_max:Const.port_no_max ~port_prefix:"port" () as self_as_node_with_ledgrid_and_defects inherit User_level.virtual_machine_with_history_and_ifconfig ~network:network_alias ?epithet ?variant ?kernel ?terminal ~history_icon:"router" ~ifconfig_device_type:"router" ~ifconfig_port_row_completions ~vm_installations () as self_as_virtual_machine_with_history_and_ifconfig method polarity = User_level.MDI method string_of_devkind = "router" method ledgrid_label = "Router" method defects_device_type = "router" method dotImg iconsize = let imgDir = Initialization.Path.images in (imgDir^"ico.router."^(self#string_of_simulated_device_state)^"."^iconsize^".png") (** Get the full host pathname to the directory containing the guest hostfs filesystem: *) method hostfs_directory_pathname = let d = ((Option.extract !simulated_device) :> User_level.node Simulation_level.router) in d#hostfs_directory_pathname val mutable show_unix_terminal : bool = show_unix_terminal method get_show_unix_terminal = show_unix_terminal method set_show_unix_terminal x = show_unix_terminal <- x (** Create the simulated device *) method private make_simulated_device = let id = self#id in let cow_file_name, dynamically_get_the_cow_file_name_source = self#create_cow_file_name_and_thunk_to_get_the_source in let () = Log.printf "About to start the router %s\n with filesystem: %s\n cow file: %s\n kernel: %s\n" self#name self#get_filesystem_file_name cow_file_name self#get_kernel_file_name in new Simulation_level.router ~parent:self ~kernel_file_name:self#get_kernel_file_name ?kernel_console_arguments:self#get_kernel_console_arguments ?filesystem_relay_script:self#get_filesystem_relay_script ~filesystem_file_name:self#get_filesystem_file_name ~dynamically_get_the_cow_file_name_source ~cow_file_name ~states_directory:(self#get_states_directory) ~ethernet_interface_no:self#get_port_no ~umid:self#get_name ~id ~show_unix_terminal:self#get_show_unix_terminal ~unexpected_death_callback:self#destroy_because_of_unexpected_death () (** Here we also have to manage cow files... *) method private gracefully_shutdown_right_now = self_as_node_with_ledgrid_and_defects#gracefully_shutdown_right_now; (* We have to manage the hostfs stuff (when in exam mode) and destroy the simulated device, so that we can use a new cow file the next time: *) Log.printf "Calling hostfs_directory_pathname on %s...\n" self#name; let hostfs_directory_pathname = self#hostfs_directory_pathname in Log.printf "Ok, we're still alive\n"; (* If we're in exam mode then make the report available in the texts treeview: *) (if Initialization.are_we_in_exam_mode then begin let treeview_documents = Treeview_documents.extract () in Log.printf "Adding the report on %s to the texts interface\n" self#name; treeview_documents#import_report ~machine_or_router_name:self#name ~pathname:(hostfs_directory_pathname ^ "/report.html") (); Log.printf "Added the report on %s to the texts interface\n" self#name; end); (* ...And destroy, so that the next time we have to re-create the process command line can use a new cow file (see the make_simulated_device method) *) self#destroy_right_now (** Here we also have to manage LED grids and, for routers, cow files: *) method private poweroff_right_now = self_as_node_with_ledgrid_and_defects#poweroff_right_now; (* Destroy, so that the next time we have to re-create a simulated device, and we start with a new cow: *) self#destroy_right_now method to_tree = Forest.tree_of_leaf ("router", [ ("name" , self#get_name ); ("label" , self#get_label); ("distrib" , self#get_epithet ); ("variant" , self#get_variant_as_string); ("kernel" , self#get_kernel ); ("show_unix_terminal" , string_of_bool (self#get_show_unix_terminal)); ("terminal" , self#get_terminal ); ("port_no" , (string_of_int self#get_port_no)) ; ]) (** A machine has just attributes (no children) in this version. *) method eval_forest_attribute = function | ("name" , x ) -> self#set_name x | ("label" , x ) -> self#set_label x | ("distrib" , x ) -> self#set_epithet x | ("variant" , "") -> self#set_variant None | ("variant" , x ) -> self#set_variant (Some x) | ("kernel" , x ) -> self#set_kernel x | ("show_unix_terminal", x ) -> self#set_show_unix_terminal (bool_of_string x) | ("terminal" , x ) -> self#set_terminal x | ("port_no" , x ) -> self#set_port_no (int_of_string x) | _ -> () (* Forward-comp. *) method private get_assoc_list_from_ifconfig ~key = List.map (fun i -> (i,network#ifconfig#get_port_attribute_by_index self#get_name i key)) (ListExtra.range 0 (self#get_port_no - 1)) method get_mac_addresses = self#get_assoc_list_from_ifconfig ~key:"MAC address" method get_ipv4_addresses = self#get_assoc_list_from_ifconfig ~key:"IPv4 address" (* other: "MTU", "IPv4 netmask", "IPv4 broadcast", "IPv6 address" *) method get_port_0_ip_config = let name = self#get_name in let ipv4 = Ipv4.of_string (network#ifconfig#get_port_attribute_by_index name 0 "IPv4 address") in let cidr = Ipv4.cidr_of_netmask (Ipv4.netmask_of_string (network#ifconfig#get_port_attribute_by_index name 0 "IPv4 netmask")) in (ipv4, cidr) method set_port_0_ipv4_address (ipv4:Ipv4.t) = network#ifconfig#set_port_string_attribute_by_index self#get_name 0 "IPv4 address" (Ipv4.to_string ipv4); method set_port_0_ipv4_netmask_by_cidr cidr = let netmask_as_string = Ipv4.to_string (Ipv4.netmask_of_cidr cidr) in network#ifconfig#set_port_string_attribute_by_index self#get_name 0 "IPv4 netmask" netmask_as_string method set_port_0_ip_config port_0_ip_config = let (ipv4,cidr) = port_0_ip_config in self#set_port_0_ipv4_address ipv4; self#set_port_0_ipv4_netmask_by_cidr cidr; method update_router_with ~name ~label ~port_0_ip_config ~port_no ~kernel ~show_unix_terminal = (* first action: *) self_as_virtual_machine_with_history_and_ifconfig#update_virtual_machine_with ~name ~port_no kernel; (* then we can set the object property "name" (read by #get_name): *) self_as_node_with_ledgrid_and_defects#update_with ~name ~label ~port_no; self#set_port_0_ip_config port_0_ip_config; self#set_show_unix_terminal show_unix_terminal; end;; end (* module User_level_router *) (*-----*) WHERE (*-----*) module Simulation_level = struct (** A router: just a [machine_or_router] with [router = true] *) class ['parent] router = fun ~(parent:'parent) ~dynamically_get_the_cow_file_name_source ~(cow_file_name) ~states_directory ~(kernel_file_name) ?(kernel_console_arguments) ?(filesystem_relay_script) ~(filesystem_file_name) ~(ethernet_interface_no) ?umid ~id ~show_unix_terminal ~unexpected_death_callback () -> object(self) inherit ['parent] Simulation_level.machine_or_router ~parent ~router:true ~filesystem_file_name(* :"/usr/marionnet/filesystems/router.debian.lenny.sid.fs" *) ~kernel_file_name ?kernel_console_arguments ?filesystem_relay_script ~dynamically_get_the_cow_file_name_source ~cow_file_name ~states_directory ~ethernet_interface_no ~memory:Const.memory_default ?umid (* Change this when debugging the router device *) ~console_no:1 ~console:"none" (* To do: this should be "none" for releases and "xterm" for debugging *) ~id ~show_unix_terminal ~xnest:false ~unexpected_death_callback () as super method device_type = "router" end end (* module Simulation_level *) (** Just for testing: *) let test = Dialog_add_or_update.make marionnet-0.90.6+bzr434.orig/gettext_extract_pot_p4.conf0000600000175000017500000000014512167200764022134 0ustar lucaslucasproject_id_version = marionnet report_bugs_to = https://bugs.launchpad.net/marionnet charset = utf-8 marionnet-0.90.6+bzr434.orig/disk.ml0000600000175000017500000005552412167200764016061 0ustar lucaslucas(* This file is part of marionnet Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext (* `epithet' is almost a phantom type (almost because it is not abstract): *) type 'a epithet = string type variant = string type filename = string type dirname = string type realpath = string let string_of_epithet_kind = function | `distrib -> "distribution" | `variant -> "variant" | `kernel -> "kernel" | _ -> assert false class terminal_manager () = let hostxserver_name = "X HOST" in let xnest_name = "X NEST" in let nox_name = "No X" in object (self) method get_choice_list = [ hostxserver_name; xnest_name; nox_name ] method get_default = hostxserver_name method is_valid_choice x = List.mem x self#get_choice_list method is_hostxserver = ((=)hostxserver_name) method is_xnest = ((=)xnest_name) method is_nox = ((=)nox_name) end (** Read the given directory searching for names like [~prefix ^ "xxxxx"]; return the list of epithets ["xxxxx"]. *) let read_epithet_list ~prefix ~dir = let prefix_length = String.length prefix in let remove_prefix s = String.sub s prefix_length ((String.length s) - prefix_length) in let name_filter file_name = ((String.length file_name) > prefix_length) && ((String.sub file_name 0 prefix_length) = prefix) in let xs = SysExtra.readdir_as_list ~only_not_directories:() ~name_filter ~name_converter:remove_prefix dir in Log.printf ~v:2 "Searching in %s:\n" dir; List.iter (fun x -> Log.printf ~v:2 " - found %s%s\n" prefix x) xs; xs let machine_prefix = "machine-" let router_prefix = "router-" let kernel_prefix = "linux-" let root_filesystem_searching_list = [ Initialization.Path.filesystems; ] let user_filesystem_searching_list = [ Initialization.Path.user_filesystems; ] (* In the order of priority: *) let kernel_searching_list = [ Initialization.Path.user_kernels; Initialization.Path.kernels; ] module String_map = MapExtra.String_map (* For a given choice the last binding with a directory will wins building the mapping. So we reverse the searching list: *) let make_epithet_to_dir_mapping ~kind ?realpath ~prefix ~directory_searching_list () = Log.printf "Searching for a (%s) prefix: \"%s\"\n" (string_of_epithet_kind kind) prefix; let normalize_dir = match realpath with | None -> (fun x -> Some x) | Some () -> (fun x -> UnixExtra.realpath x) in let searching_list = List.rev directory_searching_list in let xss = List.map (fun dir -> let epithet_list = read_epithet_list ~prefix ~dir in List.map (fun x -> (x, (normalize_dir dir))) epithet_list ) searching_list in let yss = List.flatten xss in let yss = List.filter (fun (e,d)->d<>None) yss in let yss = List.map (function (e, Some dir)->(e,dir) | _ -> assert false) yss in (List.iter (function (e,d) -> Log.printf "* %s -> %s\n" e d) yss); String_map.of_list yss (** epithet -> (variant list) * dir *) let make_epithet_to_variant_list_and_dir_mapping ~prefix ~epithet_to_dir_mapping = String_map.mapi (fun epithet dir -> let dir = Printf.sprintf "%s/%s%s_variants" dir prefix epithet in ((read_epithet_list ~prefix:"" ~dir), dir) ) epithet_to_dir_mapping class type ['a] epithet_manager_object = object (* Constructor's arguments: *) method directory_searching_list : dirname list method prefix : string (* "machine-", "router-", "kernel-", "" (nothing for variants) *) (* Public interface: *) method get_epithet_list : 'a epithet list method get_default_epithet : 'a epithet option method epithet_exists : 'a epithet -> bool method realpath_of_epithet : 'a epithet -> realpath method resolve_epithet_symlink : 'a epithet -> 'a epithet (* Morally private methods: *) method epithets_of_filename : ?no_symlinks:unit -> filename -> ('a epithet) list method epithets_sharing_the_same_realpath_of : ?no_symlinks:unit -> ('a epithet) -> ('a epithet) list method filename_of_epithet : ('a epithet) -> filename method realpath_exists : string -> bool method filter : ('a epithet -> bool) -> unit end class ['a] epithet_manager : ?default_epithet:('a epithet) -> ?filter:('a epithet->bool) -> kind: [> `distrib | `kernel | `variant ] -> directory_searching_list:string list -> prefix:string -> unit -> ['a] epithet_manager_object = fun ?(default_epithet="default") ?filter ~kind ~directory_searching_list ~prefix (* "machine-", "router-", "linux-", "" (for variants), ... *) () -> let epithet_to_dir_mapping = make_epithet_to_dir_mapping ~kind ~realpath:() ~prefix ~directory_searching_list () in (* Filter the list if required with the optional parameter `filter': *) let epithet_to_dir_mapping = match filter with | None -> epithet_to_dir_mapping | Some f -> String_map.filter (fun epth _dir -> f epth) epithet_to_dir_mapping in object (self) (* The version stored in the object is the destructive (non-persistent) version of the same mapping: *) val mutable epithet_to_dir_mapping = epithet_to_dir_mapping (* Destructive filter application: *) method filter f = epithet_to_dir_mapping <- String_map.filter (fun epth _dir -> f epth) (epithet_to_dir_mapping) method directory_searching_list = directory_searching_list method prefix = prefix method get_epithet_list : 'a epithet list = String_map.domain epithet_to_dir_mapping method epithet_exists (epithet:'a epithet) : bool = String_map.mem epithet epithet_to_dir_mapping method (*private*) filename_of_epithet (epithet:'a epithet) = let dir = String_map.find epithet epithet_to_dir_mapping in (Printf.sprintf "%s/%s%s" dir prefix epithet) method realpath_of_epithet (epithet:'a epithet) : realpath = let filename = (self#filename_of_epithet epithet) in match (UnixExtra.realpath filename) with | Some x -> x | None -> filename method (*private*) epithets_of_filename ?no_symlinks (filename:string) : ('a epithet) list = let realpath = Option.extract (UnixExtra.realpath filename) in let pred = match no_symlinks with | None -> (fun e -> (self#realpath_of_epithet e) = realpath) | Some () -> (fun e -> (not (UnixExtra.is_symlink (self#filename_of_epithet e))) && ((self#realpath_of_epithet e) = realpath)) in (List.filter pred self#get_epithet_list) (* [machine-]default -> [machine-]debian-51426 *) method resolve_epithet_symlink (epithet:'a epithet) : 'a epithet = let filename = self#filename_of_epithet epithet in match UnixExtra.is_symlink filename with | false -> epithet | true -> (match (self#epithets_of_filename ~no_symlinks:() filename) with | [] -> epithet | epithet'::_ -> epithet' (* we get the first *) ) method epithets_sharing_the_same_realpath_of ?(no_symlinks:unit option) (epithet:'a epithet) : ('a epithet) list = let filename = self#filename_of_epithet epithet in self#epithets_of_filename ?no_symlinks filename method realpath_exists filename = let xs = List.map (self#filename_of_epithet) self#get_epithet_list in List.mem filename xs (* When a machine is created, we call this method to set a default epithet.*) method get_default_epithet : 'a epithet option = if self#epithet_exists default_epithet then (Some default_epithet) else let xs = self#get_epithet_list in match xs with | [] -> None | x::_ -> Some x (* We get the first as default... *) end (* class epithet_manager *) let get_and_parse_SUPPORTED_KERNELS (t : Configuration_files.t) : string -> (unit, string option) Either.t = let x = Configuration_files.get_string_list_variable "SUPPORTED_KERNELS" t in let brackets = (Str.regexp "^\\[\\(.*\\)\\]$") in let slashes = (Str.regexp "^/\\(.*\\)/$") in let extract result = let (_,_,groups) = Option.extract result in List.hd groups in let rec loop acc = function | [] -> (List.rev acc) | x::xs when (StrExtra.First.matchingp brackets x) -> let brackets_content = extract (StrExtra.First.matching brackets x) in loop ((`Brackets brackets_content)::acc) xs | x::xs when (StrExtra.First.matchingp slashes x) -> let slashes_content = extract (StrExtra.First.matching slashes x) in loop ((`Slashes slashes_content)::acc) xs | x::xs -> loop ((`AString x)::acc) xs in let token_list : ([`Brackets of string | `Slashes of string | `AString of string] list) option = Option.map (loop []) x in let rec collapse_AString acc = function | [] -> List.rev acc | (`AString x)::(`AString y)::zs -> collapse_AString acc ((`AString (String.concat " " [x;y]))::zs) | x::ys -> collapse_AString (x::acc) ys in let token_list = Option.map (collapse_AString []) token_list in let rec parse acc = function | [] -> List.rev acc | (`Brackets x)::(`AString y)::zs -> parse (((`kernel_epithet x), Some y)::acc) zs | (`Brackets x)::zs -> parse (((`kernel_epithet x), None)::acc) zs | (`Slashes x)::(`AString y)::zs -> parse (((`kernel_regexpr (Str.regexp x)), Some y)::acc) zs | (`Slashes x)::zs -> parse (((`kernel_regexpr (Str.regexp x)), None)::acc) zs | (`AString x)::_ -> let msg = Printf.sprintf "Parsing variable SUPPORTED_KERNELS: unexpected string `%s'" x in failwith msg in let parsing_result : ([> `kernel_epithet of string | `kernel_regexpr of Str.regexp ] * string option) list option = Option.map (parse []) token_list in let parsing_result_as_predicate_list : ((string -> bool) * string option) list option = let epithet_predicate_of = function | `kernel_epithet x -> ((=)x) | `kernel_regexpr r -> (StrExtra.First.matchingp r) in Option.map (List.map (fun (k,so) -> ((epithet_predicate_of k),so))) parsing_result in function epithet -> match parsing_result_as_predicate_list with | None -> Either.Right (None) (* The epithet is ok, without special console options *) | Some pred_so_list -> begin match (ListExtra.search (fun (pred,so) -> pred epithet) pred_so_list) with | None -> Either.Left () (* The epithet will be not accepted *) | Some (_,options) -> Either.Right (options) (* The epithet is ok, may be with options *) end (* end of get_and_parse_SUPPORTED_KERNELS() *) class virtual_machine_installations ?(user_filesystem_searching_list = user_filesystem_searching_list) ?(root_filesystem_searching_list = root_filesystem_searching_list) ?(kernel_searching_list=kernel_searching_list) ?(kernel_prefix = kernel_prefix) ?(kernel_default_epithet:[`kernel] epithet option) ?(filesystem_default_epithet:[`distrib] epithet option) ~prefix (* "machine-", "router-", ... *) () = (* The actual filesystem searching list is the merge of user (prioritary) and root lists: *) let filesystem_searching_list = List.append user_filesystem_searching_list root_filesystem_searching_list in let filter_dot_relay = StrExtra.First.matchingp (Str.regexp "[.]relay\\($\\|[._-][a-zA-Z0-9._-]*[~]?$\\)") in let filter_exclude_names_ending_with_dot_conf_or_dot_relay x = not ((StrExtra.First.matchingp (Str.regexp "[.]conf[~]?$") x) || (filter_dot_relay x)) in (* The manager of all filesystem epithets: *) let filesystems : [`distrib] epithet_manager = new epithet_manager ~filter:filter_exclude_names_ending_with_dot_conf_or_dot_relay ~kind:`distrib ~prefix ~directory_searching_list:filesystem_searching_list ?default_epithet:filesystem_default_epithet () in (* The manager of all kernel epithets: *) let kernels : [`kernel] epithet_manager = new epithet_manager ~filter:filter_exclude_names_ending_with_dot_conf_or_dot_relay ~kind:`kernel ~prefix:kernel_prefix ~directory_searching_list:kernel_searching_list ?default_epithet:kernel_default_epithet () in (* The kit of managers (one per filesystem epithet) for variant epithets. This mapping is created from `filesystems#get_epithet_list' *) let filesystem_variants_mapping = let epithet_manager_of filesystem_epithet : [`variant] epithet_manager = begin let directory_searching_list_of e = List.map (fun dir -> Printf.sprintf "%s/%s%s_variants" dir prefix e) filesystem_searching_list in let directory_searching_list = let epithets = filesystems#epithets_sharing_the_same_realpath_of filesystem_epithet in let epithets = ListExtra.lift_to_the_top_positions ((=)filesystem_epithet) epithets in List.flatten (List.map directory_searching_list_of epithets) in new epithet_manager ~kind:`variant ~prefix:"" ~directory_searching_list () end in let assoc_list : ([`distrib] epithet * [`variant] epithet_manager) list = List.map (fun e -> (e,epithet_manager_of e)) filesystems#get_epithet_list in String_map.of_list assoc_list in (* Now we build the mapping filesystem-epithet -> Configuration_files.t option *) let filesystem_config_mapping = let mill = fun filesystem_epithet -> let filename = filesystems#filename_of_epithet (filesystem_epithet) in let config_file = Printf.sprintf "%s.conf" (filename) in let result = match Sys.file_exists (config_file) with | false -> None | true -> let () = Log.printf "configuration file found for \"%s\"\n" filesystem_epithet in let config = Configuration_files.make ~dont_read_environment:() ~file_names:[config_file] ~variables:[ "MD5SUM"; "AUTHOR"; "DATE"; "MTIME"; "SUPPORTED_KERNELS"; "X11_SUPPORT"; "MEMORY_MIN_SIZE"; "MEMORY_SUGGESTED_SIZE"; "MULTIPLE_CONSOLES_SUPPORT"; "BINARY_LIST"; ] () in Some (config) in result (* end mill () *) in String_map.of_list (List.map (fun e -> (e, mill e)) filesystems#get_epithet_list) in (* Now we build the mapping filesystem-epithet -> marionnet_relay-script list *) let filesystem_relay_script_mapping = let mill = fun filesystem_epithet -> let filename = filesystems#filename_of_epithet (filesystem_epithet) in let dot_relay_file = Printf.sprintf "%s.relay" (filename) in let result = match Sys.file_exists (dot_relay_file) with | false -> None | true -> let () = Log.printf "relay script found for \"%s\"\n" filesystem_epithet in Some (dot_relay_file) in result (* end mill () *) in String_map.of_list (List.map (fun e -> (e, mill e)) filesystems#get_epithet_list) in (* Now the mapping filesystem-epithet -> [(kernel1, console-options1); (kernel2, console-options2);...] option *) let filesystem_kernels_mapping = let mill = fun filesystem_epithet -> let config = String_map.find (filesystem_epithet) (filesystem_config_mapping) in Option.bind config (fun config_t -> try let filter : [`kernel] epithet -> (unit, string option) Either.t = get_and_parse_SUPPORTED_KERNELS config_t in let ks = kernels#get_epithet_list in let ks = List.map (fun k -> (k, filter k)) ks in let ks = List.filter (fun (k,r) -> r <> Either.Left ()) ks in let ks = List.map (fun (k,r) -> (k, Either.extract r)) ks in let () = Log.printf "Selected kernels for \"%s\": [%s]\n" filesystem_epithet (String.concat " " (List.map fst ks)) in (Some ks) with Failure msg -> let () = Log.printf "%s => \"%s\" config file ignored!\n" msg filesystem_epithet in None) in String_map.of_list (List.map (fun e -> (e, mill e)) filesystems#get_epithet_list) in (* The manager for terminal (X support): *) let terminal_manager = new terminal_manager () in object (self) method filesystem_searching_list = filesystem_searching_list method kernel_searching_list = kernel_searching_list method kernel_prefix = kernel_prefix method prefix = prefix method filesystems = filesystems method kernels = kernels method variants_of filesystem_epithet = String_map.find (filesystem_epithet) (filesystem_variants_mapping) method relay_script_of filesystem_epithet = String_map.find (filesystem_epithet) (filesystem_relay_script_mapping) (* Here, if we replace the first two lines of the following definition by: --- method supported_kernels_of (filesystem_epithet:[`distrib] epithet) : ([`kernel] epithet * (string option)) list = --- we obtain an error message about the method's type: [ `distrib ] epithet -> ('c epithet * string option) list where 'c is unbound *) method supported_kernels_of : [`distrib] epithet -> ([`kernel] epithet * (string option)) list = fun filesystem_epithet -> match String_map.find (filesystem_epithet) (filesystem_kernels_mapping) with | None -> List.map (fun k -> (k,None)) kernels#get_epithet_list | Some ks -> ks (* Do not propose any filesystems which haven't at least one compatible installed kernel: *) initializer filesystems#filter (fun e -> (self#supported_kernels_of e)<>[]) method get_kernel_console_arguments : [`distrib] epithet -> [`kernel] epithet -> string option = fun filesystem_epithet kernel_epithet -> try let ks = self#supported_kernels_of (filesystem_epithet) in List.assoc (kernel_epithet) ks with Not_found -> let () = Log.printf "Disk.virtual_machine_installations#get_kernel_console_arguments: couple (%s,%s) unknown!\n" (filesystem_epithet) (kernel_epithet) in None (** Terminal choices to handle uml machines. The list doesn't depend on the choosen distribution (in this version): *) method terminal_manager_of (_: [`distrib] epithet) = terminal_manager method root_export_dirname epithet = let root_dir = List.hd root_filesystem_searching_list in (Printf.sprintf "%s/%s%s_variants" root_dir prefix epithet) method user_export_dirname epithet = let user_dir = List.hd user_filesystem_searching_list in (Printf.sprintf "%s/%s%s_variants" user_dir prefix epithet) method multiple_consoles_supported_by epithet = let config = String_map.find (epithet) (filesystem_config_mapping) in if config = None then false else (* continue: *) let x = Configuration_files.get_bool_variable "MULTIPLE_CONSOLES_SUPPORT" (Option.extract config) in (x = Some true) method check_filesystems_MTIME_consistency () = let check = fun filesystem_epithet -> let config = String_map.find (filesystem_epithet) (filesystem_config_mapping) in if config = None then () else (* continue: *) let mtime = Configuration_files.get_int_variable "MTIME" (Option.extract config) in Option.iter (fun expected_mtime -> let realpath = filesystems#realpath_of_epithet (filesystem_epithet) in let actual_mtime = int_of_float ((Unix.stat realpath).Unix.st_mtime) in if actual_mtime = expected_mtime then () else (* warning: *) let title = (s_ "Modification time (MTIME) inconsistency") in let message = Printf.sprintf (f_ "The filesystem `%s%s' has the mtime %d, but the expected value was %d.\nPlease run the command:\n\nsudo touch -d @%d %s\n\nin order to fix this inconsistency. Otherwise, machines or routers with this filesystem defined in a project created elsewhere can not be restarted.") (prefix) (filesystem_epithet) (actual_mtime) (expected_mtime) (expected_mtime) (realpath) in Simple_dialogs.warning title message ()) mtime in List.iter (check) filesystems#get_epithet_list end let get_router_installations ?(user_filesystem_searching_list = user_filesystem_searching_list) ?(root_filesystem_searching_list = root_filesystem_searching_list) ?(kernel_searching_list=kernel_searching_list) ?(kernel_prefix = kernel_prefix) ?(kernel_default_epithet=Initialization.router_kernel_default_epithet) ?(filesystem_default_epithet=Initialization.router_filesystem_default_epithet) () = new virtual_machine_installations ~prefix:"router-" ~kernel_default_epithet ~filesystem_default_epithet () let get_machine_installations ?(user_filesystem_searching_list = user_filesystem_searching_list) ?(root_filesystem_searching_list = root_filesystem_searching_list) ?(kernel_searching_list=kernel_searching_list) ?(kernel_prefix = kernel_prefix) ?(kernel_default_epithet=Initialization.machine_kernel_default_epithet) ?(filesystem_default_epithet=Initialization.machine_filesystem_default_epithet) () = new virtual_machine_installations ~prefix:"machine-" ~kernel_default_epithet ~filesystem_default_epithet () let vm_installations_and_epithet_of_prefixed_filesystem prefixed_filesystem = try let p = String.index prefixed_filesystem '-' in let prefix = String.sub prefixed_filesystem 0 (p+1) in let epithet = String.sub prefixed_filesystem (p+1) ((String.length prefixed_filesystem)-(p+1)) in let vm_installations = (match prefix with | "machine-" -> get_machine_installations () | "router-" -> get_router_installations () | _ -> (assert false) ) in (vm_installations, epithet) with _ -> failwith (Printf.sprintf "vm_installations_and_epithet_of_prefixed_filesystem: %s" prefixed_filesystem) let user_export_dirname_of_prefixed_filesystem prefixed_filesystem = let (vm_installations, epithet) = vm_installations_and_epithet_of_prefixed_filesystem prefixed_filesystem in vm_installations#user_export_dirname epithet let root_export_dirname_of_prefixed_filesystem prefixed_filesystem = let (vm_installations, epithet) = vm_installations_and_epithet_of_prefixed_filesystem prefixed_filesystem in vm_installations#root_export_dirname epithet module Make_and_check_installations (Unit:sig end) = struct let machines = get_machine_installations () let routers = get_router_installations () let () = begin machines#check_filesystems_MTIME_consistency (); routers#check_filesystems_MTIME_consistency (); end end (* Make_and_check_installations *) marionnet-0.90.6+bzr434.orig/serial.mli0000600000175000017500000000172412167200764016550 0ustar lucaslucas(* This file is part of marionnet Copyright (C) 2011 Jean-Vincent Loddo This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) val send_command : ?umid:string -> ?con:string -> ?pts:string -> string -> unit val send_command_and_wait_answer : ?timeout:float -> ?buffer_size:int -> ?umid:string -> ?con:string -> ?pts:string -> string -> (StringExtra.Text.t * int) marionnet-0.90.6+bzr434.orig/state.ml0000600000175000017500000006513512167200764016246 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2007, 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** Provide the class modelling the global state of the application. *) open Gettext;; let commit_suicide signal = raise Exit;; (** Model for the global state of the application. The sensitive or visible properties of some widgets depend on this value.*) type application_state = | NoActiveProject (** Working with no project defined. User have to create or open. *) | ActiveNotRunnableProject (** Working with a project with an empty or non runnable network. *) | ActiveRunnableProject (** Working with a runnable project. *) ;; type filename = string;; (* Example of hierarchy: /tmp/marionnet-588078453.dir/ /tmp/marionnet-588078453.dir/sparse-swap-410647109 /tmp/marionnet-588078453.dir/sparse-swap-922455527 /tmp/marionnet-588078453.dir/test_machine /tmp/marionnet-588078453.dir/test_machine/classtest /tmp/marionnet-588078453.dir/test_machine/tmp /tmp/marionnet-588078453.dir/test_machine/tmp/sketch.dot /tmp/marionnet-588078453.dir/test_machine/tmp/sketch.png /tmp/marionnet-588078453.dir/test_machine/states /tmp/marionnet-588078453.dir/test_machine/states/states-forest /tmp/marionnet-588078453.dir/test_machine/states/ports-counters /tmp/marionnet-588078453.dir/test_machine/states/ports /tmp/marionnet-588078453.dir/test_machine/states/defects /tmp/marionnet-588078453.dir/test_machine/states/texts /tmp/marionnet-588078453.dir/test_machine/scripts /tmp/marionnet-588078453.dir/test_machine/netmodel /tmp/marionnet-588078453.dir/test_machine/netmodel/dotoptions.marshal /tmp/marionnet-588078453.dir/test_machine/netmodel/network.xml /tmp/marionnet-588078453.dir/test_machine/hostfs /tmp/marionnet-588078453.dir/test_machine/hostfs/2 /tmp/marionnet-588078453.dir/test_machine/hostfs/2/boot_parameters /tmp/marionnet-588078453.dir/test_machine/hostfs/1 /tmp/marionnet-588078453.dir/test_machine/hostfs/1/boot_parameters Here: temporary_directory = "/tmp" project_working_directory = "/tmp/marionnet-588078453.dir" get_project_subdirs_prefix = "/tmp/marionnet-588078453.dir/test_machine/" complete_dir "foo" = "/tmp/marionnet-588078453.dir/test_machine/foo" *) (** The class modelling the global state of the application. *) class globalState = fun () -> let system = new Chip.system ~name:"motherboard" () in let win = new Gui.window_MARIONNET () in let net = new User_level.network () in object (self) (** Main window. *) method mainwin = win (** Virtual network. *) method network = net (** Motherboard is set in Motherboard_builder. *) method motherboard = Option.extract !Motherboard.content method system = system (** Access methods for the dot options, used for drawing the virtual network. *) method dotoptions = net#dotoptions (** Show something on statusbar. *) method flash ?(delay:int=2000) (msg:string) = let statusbar_ctx = win#statusbar#new_context "global" in statusbar_ctx#flash ~delay msg (** The state of application.*) val app_state = Chip.wref ~name:"app_state" NoActiveProject method app_state = app_state method app_state_as_string = match app_state#get with | NoActiveProject -> "NoActiveProject" | ActiveNotRunnableProject -> "ActiveNotRunnableProject" | ActiveRunnableProject -> "ActiveRunnableProject" (** Are we working with an active project. *) (* method active_project = (app_state#get_alone <> NoActiveProject) *) method active_project = (app_state#get_alone <> NoActiveProject) val sensitive_when_Active = Chip.wlist ~name:"sensitive_when_Active" [] val sensitive_when_Runnable = Chip.wlist ~name:"sensitive_when_Runnable" [] val sensitive_when_NoActive = Chip.wlist ~name:"sensitive_when_NoActive" [] method sensitive_when_Active : GObj.widget Chip.wlist = sensitive_when_Active method sensitive_when_Runnable : GObj.widget Chip.wlist = sensitive_when_Runnable method sensitive_when_NoActive : GObj.widget Chip.wlist = sensitive_when_NoActive (** The project filename. *) val project_filename = Chip.wref ~name:"project_filename" None method project_filename = project_filename (** The project name. *) val mutable project_name = Chip.wref ~name:"project_name" None method project_name = project_name (** by default, the name of the project is the basename of filename without the extension. *) method private default_project_name_of ~filename = let base = (Filename.basename filename) in try (Filename.chop_extension base) with _ -> base (** The parent of the project working directory: *) val temporary_directory = Chip.wref ~name:"temporary_directory" "/tmp" method temporary_directory = temporary_directory (** The project working directory: *) val project_working_directory = Chip.wref ~name:"project_working_directory" None method project_working_directory = project_working_directory method private make_the_project_working_directory = let pwd = UnixExtra.temp_dir ~parent:(temporary_directory#get) ~prefix:"marionnet-" ~suffix:".dir" () in project_working_directory#set (Some pwd); pwd (** Supposing all optional value defined: *) method private complete_dir dir = let pwd = Option.extract project_working_directory#get in let prn = Option.extract project_name#get in FilenameExtra.concat_list [pwd; prn; dir] method private get_project_subdirs_prefix = self#complete_dir "" method tmpDir = self#complete_dir "tmp" method patchesDir = self#complete_dir "states" method netmodelDir = self#complete_dir "netmodel" method scriptsDir = self#complete_dir "scripts" method hostfsDir = self#complete_dir "hostfs" method classtestDir = self#complete_dir "classtest" method dotSketchFile = Filename.concat self#tmpDir "sketch.dot" method pngSketchFile = Filename.concat self#tmpDir "sketch.png" method networkFile = Filename.concat self#netmodelDir "network.xml" method dotoptionsFile = Filename.concat self#netmodelDir "dotoptions.marshal" (** New project which will be saved into the given filename. *) method new_project ~filename = begin (* First reset the old network, waiting for all devices to terminate: *) self#network#ledgrid_manager#reset; self#network#reset () ; project_filename#set (Some filename) ; project_name#set (Some (self#default_project_name_of ~filename)); ignore (self#make_the_project_working_directory); (* Create the directory skeleton: *) let prefix = self#get_project_subdirs_prefix in Unix.mkdir prefix 0o755 ; List.iter (fun x-> Unix.mkdir (Filename.concat prefix x) 0o755) ["states"; "netmodel"; "scripts"; "hostfs"; "classtest"; "tmp"]; (* Treeview data should be saved within prefix: *) self#clear_treeviews; (* Reset dotoptions *) self#dotoptions#reset_defaults () ; (* Set the app_state. *) app_state#set ActiveNotRunnableProject ; (* Force GUI coherence. *) self#gui_coherence () ; (* Refresh the network sketch *) self#refresh_sketch () ; end (** Close the current project. The project is lost if the user hasn't saved it. *) method close_project = let close_project_sync () = begin Log.printf "state#close_project_sync: starting...\n"; (* Destroy whatever the LEDgrid manager is managing: *) self#network#ledgrid_manager#reset; (match app_state#get with | NoActiveProject -> Log.printf "state#close_project_sync: no project opened.\n" | _ -> begin self#network#reset ~scheduled:true (); (* Unset the project filename. *) project_filename#set None ; (* Unset the project name. *) project_name#set None ; let cmd = Printf.sprintf "rm -rf %s" (Option.extract project_working_directory#get) in (* Update the network sketch (now empty) *) self#mainwin#sketch#set_file "" ; (* Unset the project working directory. *) project_working_directory#set None; (* Set the app_state. *) app_state#set NoActiveProject; (* Force GUI coherence. *) self#gui_coherence (); Log.printf "Destroying the old working directory (%s)...\n" cmd; Log.system_or_ignore cmd; Log.printf "Done.\n"; end (* there was an active project *) ); (* Clear all treeviews, just in case. *) self#clear_treeviews; Log.printf "state#close_project_sync: done.\n"; end (* thunk *) in ignore (Task_runner.the_task_runner#schedule ~name:"close_project_sync" close_project_sync); (** Read the pseudo-XML file containing the network definition. *) method import_network ?(emergency:(unit->unit)=(fun x->x)) ?(dotAction:(unit->unit)=fun x->x) (f:filename) = begin (* Backup the network. *) self#network#save_to_buffers; (* Plan to restore the network if something goes wrong. *) let emergency = fun e -> Log.printf "import_network: emergency (%s)!!!\n" (Printexc.to_string e); self#network#restore_from_buffers; emergency () in (* Read the given file. *) (if (Shell.regfile_readable f) then try let result = User_level.Xml.load_network self#network f in Log.printf ("import_network: network imported\n"); result with e -> (emergency e; raise e) else begin emergency (Failure "file not readable"); raise (Failure "state#import_network: cannot open the xml file") end ); (* Fix the app_state and update it if necessary *) app_state#set ActiveNotRunnableProject ; self#update_state (); (* is it runnable? *) (* Undump Dot_tuning.network *) dotAction (); (* Force GUI coherence. *) self#gui_coherence (); (* Update the network sketch *) self#refresh_sketch (); end (** Close the current project and extract the given filename in a fresh project working directory. *) method open_project ~filename = begin (* First close the current project, if necessary: *) self#close_project; (* Set the project filename *) project_filename#set (Some filename); let pwd = self#make_the_project_working_directory in let opening_project_progress_bar = let opening_word = (s_ "Opening") in let text_on_label = Printf.sprintf "%s" opening_word in Progress_bar.make_progress_bar_dialog ~modal:true ~title:(s_ "Work in progress") ~text_on_label ~text_on_sub_label:(Printf.sprintf (f_ "%s") filename) () in opening_project_progress_bar#show (); (* Extract the mar file into the pwdir *) let command_line = Printf.sprintf "tar -xSvzf %s -C %s" (Option.extract project_filename#get) pwd in let synchronous_loading () = begin Log.system_or_fail command_line; (* Look for the name of the root directory of the mar file. Some checks here. *) let mar_inner_dir = try (match (SysExtra.readdir_as_list pwd) with | [x] -> let skel = (SysExtra.readdir_as_list (Filename.concat pwd x)) in if ListExtra.subset skel ["states";"netmodel";"scripts";"hostfs";"classtest"] then x else failwith "state#open_project: no expected content in the project root directory." | _ -> failwith "state#open_project: no rootname found in the project directory." ) with e -> begin self#close_project; raise e; end; in (* Set the project name *) project_name#set (Some mar_inner_dir); let prefix = self#get_project_subdirs_prefix in (* Create the tmp subdirectory. *) Unix.mkdir (prefix^"tmp") 0o755 ; (* Dot_tuning.network will be undumped after the network, in order to support cable inversions. *) let dotAction () = begin (try self#dotoptions#load_from_file self#dotoptionsFile; Log.printf ("state#open_project: dotoptions recovered\n"); with e -> begin Log.printf ("state#open_project: cannot read the dotoptions file => resetting defaults\n"); self#dotoptions#reset_defaults () end); self#dotoptions#set_toolbar_widgets () end in Log.printf ("state#open_project: calling import_network\n"); (* Undump treeview's data. Doing this action now we allow components to modify the treeviews according to the marionnet version: *) self#load_treeviews; (* Second, read the xml file containing the network definition. If something goes wrong, close the project. *) (try self#import_network ~emergency:(fun () -> self#close_project) ~dotAction self#networkFile with e -> self#clear_treeviews; Log.printf "Failed with exception %s\n" (Printexc.to_string e); ); self#register_state_after_save_or_open; () end (* synchronous_loading *) in let _ = Task_runner.the_task_runner#schedule ~name:"state#open_project.synchronous_loading" (fun () -> try synchronous_loading () with e -> begin Log.printf "Failed loading the project `%s'. The next reported exception is harmless.\n" filename; let error_msg = Printf.sprintf "%s\n\n%s" filename (s_ "Please ensure that the file be well-formed.") in Simple_dialogs.error (s_ "Failed loading the project") error_msg (); raise e; end) in (* Remove now the progress_bar: *) let _ = Task_runner.the_task_runner#schedule ~name:"destroy opening project progress bar" (fun () -> Progress_bar.destroy_progress_bar_dialog (opening_project_progress_bar)) in () end (*** BEGIN: this part of code tries to understand if the project must be really saved before exiting. *) val mutable refresh_sketch_counter_value_after_last_save = None method set_project_not_already_saved = refresh_sketch_counter_value_after_last_save <- None method treeview = object method ifconfig = Treeview_ifconfig.extract () method history = Treeview_history.extract () method defects = Treeview_defects.extract () method documents = Treeview_documents.extract () end method private get_treeview_list : Treeview.t list = begin let t1 = Treeview_ifconfig.extract () in let t2 = Treeview_history.extract () in let t3 = Treeview_defects.extract () in let t4 = Treeview_documents.extract () in [ (t1 :> Treeview.t); (t2 :> Treeview.t); (t3 :> Treeview.t); (t4 :> Treeview.t); ] end method private load_treeviews = List.iter (fun (treeview : Treeview.t) -> treeview#load) self#get_treeview_list method private save_treeviews = List.iter (fun (treeview : Treeview.t) -> treeview#save ()) self#get_treeview_list method private clear_treeviews = List.iter (fun (treeview : Treeview.t) -> treeview#clear) self#get_treeview_list method private get_treeview_complete_forest_list = List.map (fun (treeview : Treeview.t) -> treeview#get_complete_forest) self#get_treeview_list val mutable treeview_forest_list_after_save = None method private register_state_after_save_or_open = begin refresh_sketch_counter_value_after_last_save <- Some self#refresh_sketch_counter#get; treeview_forest_list_after_save <- Some (self#get_treeview_complete_forest_list); end method project_already_saved = (match refresh_sketch_counter_value_after_last_save, self#refresh_sketch_counter#get with (* Efficient test: *) | Some x, y when x=y -> Log.printf "The project *seems* already saved.\n"; (* Potentially expensive test: *) if (treeview_forest_list_after_save = (Some self#get_treeview_complete_forest_list)) then begin Log.printf "The project *is* already saved.\n"; true end else begin Log.printf "Something has changed in treeviews: the project must be re-saved.\n"; false end | Some x, y -> (Log.printf "The project seems not already saved (x=%d, y=%d).\n" x y; false) | None, y -> (Log.printf "The project seems not already saved (x=None, y=%d).\n" y; false) ) (*** END: this part of code try to understand if the project must be really saved before exiting. *) (** Rewrite the compressed archive prj_filename with the content of the project working directory (pwdir). *) method save_project = if self#active_project then begin Log.printf "state#save_project starting...\n"; let filename = Option.extract project_filename#get in let project_working_directory = Option.extract project_working_directory#get in let project_name = Option.extract project_name#get in (* Progress bar periodic callback. *) let fill = (* disk usage (in kb) with the unix command *) let du x = match UnixExtra.run ("du -sk "^x) with | kb, (Unix.WEXITED 0) -> (try Some (float_of_string (List.hd (StringExtra.split ~d:'\t' kb))) with _ -> None) | _,_ -> None in (* disk usage (in kb) with the unix library *) let du_file_in_kb x = try Some (float_of_int ((Unix.stat x).Unix.st_size / 1024)) with _ -> None in let round x = float_of_string (Printf.sprintf "%.2f" (if x<1. then x else 1.)) (* workaround strange lablgtk behaviour *) in match (du project_working_directory) with | Some kb_flatten -> fun () -> (match du_file_in_kb filename with | Some kb_compressed -> round (0.05 +. (kb_compressed *. 8.) /. kb_flatten) | None -> 0.5) | None -> fun () -> 0.5 in let window = let text_about_saved_snapshots = match Global_options.Keep_all_snapshots_when_saving.extract () with | true -> s_ "Project with all snapshots" | false -> s_ "Project with the most recent snapshots" in let saving_word = (s_ "Saving") in let text_on_label = Printf.sprintf "%s\n%s" saving_word text_about_saved_snapshots in Progress_bar.make_progress_bar_dialog ~modal:true ~title:(s_ "Work in progress") ~kind:(Progress_bar.Fill fill) ~text_on_label ~text_on_sub_label:(Printf.sprintf (f_ "%s") filename) () in (* Write the network xml file *) User_level.Xml.save_network self#network self#networkFile ; (* Save also dotoptions for drawing image. *) self#dotoptions#save_to_file self#dotoptionsFile; (* Save treeviews (just to play it safe, because treeview files should be automatically) re-written at every update): *) self#save_treeviews; (* (Re)write the .mar file *) let cmd = let exclude_command_section = let excluded_cows = self#treeview#history#get_files_may_not_be_saved in let excluded_items = List.map (Printf.sprintf "--exclude states/%s") excluded_cows in String.concat " " ("--exclude tmp"::excluded_items) in Printf.sprintf "tar -cSvzf %s -C %s %s %s" filename project_working_directory exclude_command_section project_name in let _ = Task_runner.the_task_runner#schedule ~name:"tar" (fun () -> Log.system_or_ignore cmd) in let _ = Task_runner.the_task_runner#schedule ~name:"destroy saving progress bar" (fun () -> Progress_bar.destroy_progress_bar_dialog window) in self#register_state_after_save_or_open; Log.printf "state#save_project (main thread) finished.\n"; end (** Update the project filename to the given string, and save: *) method save_project_as ~filename = if self#active_project then try let new_project_name = (self#default_project_name_of ~filename) in (* Set the project name *) self#change_project_name new_project_name; (* Set the project filename *) project_filename#set (Some filename) ; (* Save the project *) self#save_project; with e -> (raise e) (** Save the project into the given file, but without changing its name in the copy we're editing. Implemented by temporarily updating the name, saving then switch back to the old name. *) method copy_project_into ~filename = if self#active_project then try let original_project_name = Option.extract project_name#get in let original_filename = project_filename#get in let temporary_project_name = self#default_project_name_of ~filename in (* Temporarily update names...: *) self#change_project_name temporary_project_name; project_filename#set (Some filename) ; (* Save the project *) self#save_project; (* Reset names ensuring synchronisation *) Task_runner.the_task_runner#schedule ~name:"copy_project_into" (fun () -> (* Reset names to their old values: *) self#change_project_name original_project_name; project_filename#set original_filename); with e -> (raise e) (** Change the prj_name. This simply means to change the name of the mar root directory in the project working directory. *) method change_project_name new_name = let old_name = Option.extract project_name#get in if new_name = old_name then () else begin (* Set the project name. *) project_name#set (Some new_name) ; (* Rename the root directory in the pwdir. *) let cmd = let pwd = Option.extract project_working_directory#get in let old_pathname = Filename.concat pwd old_name in let new_pathname = Filename.concat pwd new_name in Printf.sprintf "mv %s %s" old_pathname new_pathname in Log.system_or_ignore cmd; end val mutable sensitive_cables : GObj.widget list = [] method add_sensitive_cable x = sensitive_cables <- x::sensitive_cables (** Forbid cable additions if there are not enough free ports; explicitly enable them if free ports are enough: *) method update_cable_sensitivity () = let condition = self#network#are_there_almost_2_free_endpoints in (List.iter (fun x->x#misc#set_sensitive condition) sensitive_cables) val refresh_sketch_counter = Chip.wcounter ~name:"refresh_sketch_counter" () method refresh_sketch_counter = refresh_sketch_counter method refresh_sketch () = refresh_sketch_counter#set (); method network_change : 'a. ('a -> unit) -> 'a -> unit = fun action obj -> begin action obj; self#update_state (); self#update_cable_sensitivity (); self#dotoptions#reset_shuffler (); self#dotoptions#reset_extrasize (); refresh_sketch_counter#set (); end (** Update the state and force the gui coherence. If a project is active, there are two possibilities: 1) there is at least a machine => the project is runnable 2) else => the project is not runnable *) method update_state () = begin let old = app_state in begin match app_state#get_alone with | NoActiveProject -> () | _ -> app_state#set (* TODO: this is a rule (chip) in a reactive system! *) (if self#network#nodes#get = [] then ActiveNotRunnableProject else ActiveRunnableProject) end; if app_state <> old then self#gui_coherence () else () end (** Force coherence between state and sensitive attributes of mainwin's widgets *) method gui_coherence () = self#update_state () ; self#update_cable_sensitivity (); (* Begin of methods moved from talking.ml *) method make_names_and_thunks verb what_to_do_with_a_node = List.map (fun node -> ( (verb ^ " " ^ node#get_name), (fun () -> let progress_bar = Simple_dialogs.make_progress_bar_dialog ~title:(verb ^ " " ^ node#get_name) ~text_on_bar:(s_ "Wait please...") () in begin try what_to_do_with_a_node node; with e -> Log.printf "Warning (q): \"%s %s\" raised an exception (%s)\n" verb node#name (Printexc.to_string e); Log.print_backtrace (); end; Simple_dialogs.destroy_progress_bar_dialog progress_bar)) ) self#network#nodes#get method do_something_with_every_node_in_sequence verb what_to_do_with_a_node = List.iter (fun (name, thunk) -> Task_runner.the_task_runner#schedule ~name thunk) (self#make_names_and_thunks verb what_to_do_with_a_node) method do_something_with_every_node_in_parallel verb what_to_do_with_a_node = Task_runner.the_task_runner#schedule_parallel (self#make_names_and_thunks verb what_to_do_with_a_node);; method startup_everything () = self#do_something_with_every_node_in_sequence "Startup" (fun node -> node#startup_right_now) method shutdown_everything () = self#do_something_with_every_node_in_parallel "Shut down" (fun node -> node#gracefully_shutdown_right_now) method poweroff_everything () = self#do_something_with_every_node_in_sequence "Power-off" (fun node -> node#poweroff_right_now) (** Return true iff there is some node on or sleeping *) method is_there_something_on_or_sleeping () = let result = List.exists (fun node -> node#can_gracefully_shutdown or node#can_resume) self#network#nodes#get in begin Log.printf "is_there_something_on_or_sleeping: %s\n" (if result then "yes" else "no"); result end (* End of functions moved from talking.ml *) method quit_async () = let quit () = begin Log.printf "Starting the last job...\n"; self#network#destroy_process_before_quitting (); (* Log.printf "Killing the task runner thread...\n"; Task_runner.the_task_runner#terminate; *) Log.printf "Killing the blinker thread...\n"; self#network#ledgrid_manager#kill_blinker_thread; Log.printf "Ok, the blinker thread was killed.\n"; flush_all (); Log.printf "Synced.\n"; Log.printf "state#quit: done.\n"; GtkMain.Main.quit (); end in begin Task_runner.the_task_runner#schedule ~name:"quit" quit; Log.printf "Main thread: quit has been scheduled.\n"; end end;; (* class globalState *) marionnet-0.90.6+bzr434.orig/cow_files.mli0000600000175000017500000000331112167200764017235 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2012 Jean-Vincent Loddo This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (* Useful tools to manage cow files. *) (** Create a fresh filename, without making the file (empty cow files are not allowed) *) val make_temporary_cow_file_name : states_directory:string -> unit -> string (** Alias for make_temporary_cow_file_name: *) val make_fresh_cow_file_name : states_directory:string -> unit -> string (** Make a sparse copy of the given file, and return the (relative) name of the copy. Note that this also succeeds when the source file does not exist, as it's the case with 'fresh' states. If not given, a cow_file_name is created, then used as target file. Both the source_pathname and cow_file_name may be implicit or absolute. *) val duplicate_cow_file_into_states_directory : source_pathname:string -> states_directory:string -> ?cow_file_name:string -> unit -> string (** Note that the cow_file_name may be implicit or absolute: *) val cow_file_exists : states_directory:string -> cow_file_name:string -> unit -> bool marionnet-0.90.6+bzr434.orig/RPMS/0000700000175000017500000000000012167200764015341 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/RPMS/Makefile0000600000175000017500000000715212167200764017010 0ustar lucaslucas#DO not use this makefile directly, it must be called by the #marionnet root makefile RPMTOPDIR= $(HOME)/tmp/rpm FIX_VERSION_RPM = \ if echo $$version | grep snapshot &> /dev/null; then \ version="$$version"`date +"%Y%m%d"`; \ fi # construct RPM necessary structure and spec file RPMDIRSTRUCT= \ echo "Construction of RPM directory Structure";\ rm -rf $(RPMTOPDIR);\ mkdir -p $(RPMTOPDIR)/BUILD ;\ mkdir -p $(RPMTOPDIR)/RPMS ;\ mkdir -p $(RPMTOPDIR)/SOURCES ;\ mkdir -p $(RPMTOPDIR)/SPECS ;\ mkdir -p $(RPMTOPDIR)/SRPMS;\ echo -e "%define version $$version" > $(RPMTOPDIR)/SPECS/$$name.spec;\ cat RPMS/$$name.spec >> $(RPMTOPDIR)/SPECS/$$name.spec;\ rm -rf $(RPMTOPDIR)/_tarball ;\ mkdir -p $(RPMTOPDIR)/_tarball/$$name-$$version rpms : rpm-common rpm-fs-machines rpm-fs-routers rpm-kernels # RPM creation suppose that the directory name is at the format name-version rpm-common : @($(call READ_META, name, version); \ $(call FIX_VERSION_RPM); \ echo $$version;\ name=$$name-common;\ $(call RPMDIRSTRUCT);\ rm -rf _build/* ;\ echo "Copy files to temporary directory";\ tar --exclude _darcs --exclude share/filesystems --exclude share/kernels \ -cf - . | tar -C $(RPMTOPDIR)/_tarball/$$name-$$version -xf - ; \ mkdir $(RPMTOPDIR)/_tarball/$$name-$$version/share/filesystems;\ mkdir $(RPMTOPDIR)/_tarball/$$name-$$version/share/kernels;\ cd $(RPMTOPDIR)/_tarball ;\ echo "Creation of tarball common";\ tar -czf \ $(RPMTOPDIR)/SOURCES/$$name-$$version.tar.gz $$name-$$version;\ echo "Tarball-common constructed." ;\ echo "RPM common creation.";\ rpmbuild --sign -bb $(RPMTOPDIR)/SPECS/$$name.spec; \ mv $(RPMTOPDIR)/RPMS/*/*.rpm ~) rpm-fs-machines : @($(call READ_META, name, version); \ $(call FIX_VERSION_RPM); \ name=$$name-fs-machines-default;\ $(call RPMDIRSTRUCT, name, version);\ rm -rf _build/* ;\ echo "Creation of tarball filesystems";\ mkdir -p $(RPMTOPDIR)/_tarball/$$name-$$version/share/filesystems;\ cp -a --sparse=auto share/filesystems/machine* $(RPMTOPDIR)/_tarball/$$name-$$version/share/filesystems;\ cd $(RPMTOPDIR)/_tarball;\ tar --sparse -czvf $(RPMTOPDIR)/SOURCES/$$name-$$version.tar.gz $$name-$$version/share/filesystems/machine*;\ echo "RPM fs-machines-default creation";\ rpmbuild -bb $(RPMTOPDIR)/SPECS/$$name.spec;\ mv $(RPMTOPDIR)/RPMS/*/*.rpm ~) rpm-fs-routers : @($(call READ_META, name, version); \ $(call FIX_VERSION_RPM); \ name=$$name-fs-routers-default;\ $(call RPMDIRSTRUCT, name, version);\ rm -rf _build/* ;\ echo "Creation of tarball filesystems for routers";\ mkdir -p $(RPMTOPDIR)/_tarball/$$name-$$version/share/filesystems;\ cp -a --sparse=auto share/filesystems/router* $(RPMTOPDIR)/_tarball/$$name-$$version/share/filesystems;\ cd $(RPMTOPDIR)/_tarball;\ tar --sparse -czvf $(RPMTOPDIR)/SOURCES/$$name-$$version.tar.gz $$name-$$version/share/filesystems/router*;\ echo "RPM fs-routers-default creation";\ rpmbuild --sign -bb $(RPMTOPDIR)/SPECS/$$name.spec;\ mv $(RPMTOPDIR)/RPMS/*/*.rpm ~) rpm-kernels : @($(call READ_META, name, version); \ $(call FIX_VERSION_RPM); \ name=$$name-kernels-default;\ $(call RPMDIRSTRUCT, name, version);\ rm -rf _build/* ;\ echo "Creation of tarball kernel";\ mkdir -p $(RPMTOPDIR)/_tarball/$$name-$$version/share/kernels;\ cp -a share/kernels $(RPMTOPDIR)/_tarball/$$name-$$version/share;\ cd $(RPMTOPDIR)/_tarball;\ tar -czvf $(RPMTOPDIR)/SOURCES/$$name-$$version.tar.gz $$name-$$version/share/kernels;\ echo "RPM kernel-default creation";\ rpmbuild --sign -bb $(RPMTOPDIR)/SPECS/$$name.spec; \ mv $(RPMTOPDIR)/RPMS/*/*.rpm ~) marionnet-0.90.6+bzr434.orig/RPMS/marionnet-fs-routers-default.spec0000600000175000017500000000226212167200764023746 0ustar lucaslucas%define name marionnet-fs-routers-default summary: virtual routers for marionnet Name: %{name} Version: %{version} Release: 1 Source: %{name}-%{version}.tar.gz Vendor: Jean-Vicent Loddo and Luca Saiu - LIPN - Universite Paris 13 Packager: Franck Butelle URL: http://www.marionnet.org License: GPL Group: Emulators BuildRoot: %{_tmppath}/%{name}-%{version} Provides: marionnet-routers-default Requires: marionnet-common %description Default virtual machine for routers (debian linux 2.6.18) used by marionnet. %prep %setup %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/usr/local/share/marionnet/filesystems cp -a --sparse=auto share/filesystems/router* $RPM_BUILD_ROOT/usr/local/share/marionnet/filesystems %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) /usr/local/share/marionnet/filesystems/router* %changelog * Sun Nov 08 2009 F. BUTELLE - rename router -> routers, added symlinks * Wed Jun 06 2009 F. BUTELLE - division in common, kernel-default, fs-machine-default, fs-router-default * Sun Jun 06 2009 F. BUTELLE - Initial version of the spec file marionnet-0.90.6+bzr434.orig/RPMS/network-scripts/0000700000175000017500000000000012167200764020517 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/RPMS/network-scripts/br00000600000175000017500000000006112167200764021124 0ustar lucaslucasDEVICE=br0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Bridge marionnet-0.90.6+bzr434.orig/RPMS/marionnet-fs-machines-default.spec0000600000175000017500000000233312167200764024031 0ustar lucaslucas%define name marionnet-fs-machines-default summary: virtual machines (debian and pinocchio) for marionnet Name: %{name} Version: %{version} Release: 1 Source: %{name}-%{version}.tar.gz Vendor: Jean-Vicent Loddo and Luca Saiu - LIPN - Universite Paris 13 Packager: Franck Butelle URL: http://www.marionnet.org License: GPL Group: Emulators BuildRoot: %{_tmppath}/%{name}-%{version} Provides: marionnet-machines-default Requires: marionnet-common %description Default virtual machines (debian linux 2.6.18 and Pinocchio) for marionnet. %prep %setup %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/usr/local/share/marionnet/filesystems echo `pwd` cp -a --sparse=auto share/filesystems/machine* $RPM_BUILD_ROOT/usr/local/share/marionnet/filesystems %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) /usr/local/share/marionnet/filesystems/machine* %changelog * Sun Nov 09 2009 F. BUTELLE - renamed machine ->machines, added symlinks * Wed Jun 06 2009 F. BUTELLE - division in common, kernel-default, fs-machine-default, fs-router-default * Sun Jun 06 2009 F. BUTELLE - Initial version of the spec file marionnet-0.90.6+bzr434.orig/RPMS/marionnet-common.spec0000600000175000017500000001004512167200764021501 0ustar lucaslucas%define name marionnet-common # The following is needed to not call strip on the byte codes... %define debug_package %{nil} %define __os_install_post %{nil} summary: a virtual network laboratory Name: %{name} Version: %{version} Release: 1 Source0: %{name}-%{version}.tar.gz Vendor: Jean-Vicent Loddo and Luca Saiu - LIPN - Universite Paris 13 Packager: Franck Butelle URL: http://www.marionnet.org License: GPL v2+ Group: Emulators BuildRoot: %{_tmppath}/%{name}-%{version} Provides: marionnet marionnet-daemon Requires: glibc vde2 bridge-utils uml-utilities graphviz Requires(hint): xterm %description It allows users to define, configure and run complex computer networks without any need for physical setup. Only a single, possibly even non-networked GNU/Linux host machine is required to simulate a whole Ethernet network complete with computers, routers, hubs, switchs, cables, and more. Support is also provided for integrating the virtual network with the physical host network. As Marionnet is meant to be used also by inexperienced people, it features a very intuitive graphical user interface. Marionnet is written in the mostly functional language OCaml with just some little bits of C, and depends on User Mode Linux and VDE for the simulation part. %prep %setup %build make %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/etc/sysconfig/network-scripts sed -i -e 's|^prefix=.*$|prefix='$RPM_BUILD_ROOT/usr/local'|' \ -e 's|^configurationprefix=.*$|configurationprefix='$RPM_BUILD_ROOT/etc'|' \ -e 's|^localeprefix=.*$|localeprefix='$RPM_BUILD_ROOT/usr/share/locale'|' \ CONFIGME make install # to have a desktop link desktop-file-install --dir=$RPM_BUILD_ROOT/%{_datadir}/applications marionnet.desktop %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc COPYING AUTHORS BUILD-TIME README THANKS %config /etc/marionnet/marionnet.conf /usr/local/share/marionnet /usr/local/bin/marionnet.byte /usr/local/sbin/marionnet-daemon.byte /usr/share/locale/*/LC_MESSAGES/marionnet.mo %{_datadir}/applications/marionnet.desktop %post if [ $1 == 1 ]; then #first install if [ -e /usr/bin/desktop-file-install ]; then desktop-file-install --rebuild-mime-info-cache %{_datadir}/applications/marionnet.desktop fi # try to bring up a bridge, only on wired network interface if [ -e /etc/sysconfig/network-scripts/ifcfg-eth0 ]; then if grep 'ONBOOT=yes' /etc/sysconfig/network-scripts/ifcfg-eth0 >/dev/null; then echo -e "DEVICE=br0\nTYPE=Bridge\nONBOOT=yes" > /etc/sysconfig/network-scripts/ifcfg-br0 grep 'BOOTPROTO=' /etc/sysconfig/network-scripts/ifcfg-eth0 >> /etc/sysconfig/network-scripts/ifcfg-br0 grep 'IPADDR=' /etc/sysconfig/network-scripts/ifcfg-eth0 >> /etc/sysconfig/network-scripts/ifcfg-br0 grep 'NETMASK=' /etc/sysconfig/network-scripts/ifcfg-eth0 >> /etc/sysconfig/network-scripts/ifcfg-br0 echo 'BRIDGE=br0' >> /etc/sysconfig/network-scripts/ifcfg-eth0 chmod +x /etc/sysconfig/network-scripts/ifcfg-br0 /etc/init.d/network restart fi fi if [ ! -e /etc/sysconfig/network-scripts/ifcfg-br0 ]; then echo "Bridge not configured, you will not be able to access to physical" echo "network from marionnet. See brctl and /etc/marionnet/marionnet.conf" fi echo "Do not forget to install virtual machine images..." fi %postun if [ $1 = 0 ]; then # uninstall if [ -e /etc/sysconfig/network-scripts/ifcfg-br0 ]; then rm -f /etc/sysconfig/network-scripts/ifcfg-br0 sed -i /etc/sysconfig/network-scripts/ifcfg-eth0 -e '/^BRIDGE=br0/d' /etc/init.d/network restart brctl delif br0 eth0 fi if [ -e /usr/bin/update-desktop-database ]; then rm -f %{_datadir}/applications/marionnet.desktop /usr/bin/update-desktop-database fi fi %changelog * Sun Nov 08 2009 F. BUTELLE - simplification of the spec file, addition of br0 stuff * Wed Jun 06 2009 F. BUTELLE - division in common, kernel-default, fs-machine-default, fs-router-default * Sun Jun 06 2009 F. BUTELLE - Initial version of the spec file marionnet-0.90.6+bzr434.orig/RPMS/marionnet-kernels-default.spec0000600000175000017500000000221712167200764023300 0ustar lucaslucas%define name marionnet-kernels-default summary: UML kernels for marionnet Name: %{name} Version: %{version} Release: 1 Source: %{name}-%{version}.tar.gz Vendor: Jean-Vicent Loddo and Luca Saiu - LIPN - Universite Paris 13 Packager: Franck Butelle URL: http://www.marionnet.org/download/snapshots/stuff/ License: GPL v2+ Group: Emulators BuildRoot: %{_tmppath}/%{name}-%{version} Provides: marionnet-kernels-default Requires: marionnet-common %description The default UML kernels for marionnet (based on debian linux 2.6.18). %prep %setup %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/usr/local/share/marionnet/kernels cp -a share/kernels $RPM_BUILD_ROOT/usr/local/share/marionnet %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) /usr/local/share/marionnet/kernels/* %changelog * Sun Nov 08 2009 F. BUTELLE - renamed kernels-default, added symlinks. * Wed Jun 06 2009 F. BUTELLE - division in common, kernel-default, fs-machine-default, fs-router-default * Sun Jun 06 2009 F. BUTELLE - Initial version of the spec file marionnet-0.90.6+bzr434.orig/graph.ml0000600000175000017500000002100712167200764016215 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2009 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (* open PreludeExtra.Prelude;; *) (* We want synchronous terminal output *) (** A general-purpose polymorphic graph data structure, written in imperative style. Nodes are identified by automatically-assigned unique ids, which are used also to recognize endpoints, for each edge. The implementation should be reasonably efficient, but remove_node can be optimized. remove_edge is difficult to make better because of a (gratuitous, in my opinion) restriction in Hashtbl: it's not allowed to remove a pair , but only to blindly remove the "current" binding of key. So I have to get all bindings, filter them out, remove all bindings from the table, and reinsert the surviving ones. *) type id = int;; let fresh_id = Counter.make_int_generator () type 'a graph = (* Nodes: *) (id, 'a) Hashtbl.t * (* Edges, as a set of ordered node pairs: *) ((id, id) Hashtbl.t) * (* for the edge "x |-> y" x is the key, y is the value *) (* Reversed edges, as a set of ordered node pairs: *) ((id, id) Hashtbl.t);; let make_empty_graph () : 'a graph = Hashtbl.create 257, Hashtbl.create 257, Hashtbl.create 257;; let add_node node (graph : 'a graph) = let nodes, _, _ = graph in let id = fresh_id () in Hashtbl.add nodes id node; id;; let get_node_ids (graph : 'a graph) : id list = let nodes, _, _ = graph in Hashtbl.fold (fun id _ list -> id :: list) nodes [];; let get_node (id : id) (graph : 'a graph) : 'a = let nodes, _, _ = graph in Hashtbl.find nodes id;; let get_forward_star id (graph : 'a graph) = let _, edges, _ = graph in Hashtbl.find_all edges id;; let get_backward_star id (graph : 'a graph) = let _, _, backward_edges = graph in Hashtbl.find_all backward_edges id;; (** Print an understandable representation of a graph, given a function printing a node: *) let print_graph (print_node : 'a -> unit) (graph : 'a graph) = let ids : id list = List.sort compare (get_node_ids graph) in print_string "Nodes:\n"; List.iter (fun id -> let node : 'a = get_node id graph in Printf.printf "%i. " id; print_node node; print_string "\n") ids; print_string "Edges:\n"; List.iter (fun from_id -> let forward_star = List.sort compare (get_forward_star from_id graph) in if forward_star <> [] then begin List.iter (fun to_id -> Printf.printf "%i -> %i; " from_id to_id) forward_star; print_string "\n"; end) ids;; let has_edge from_id to_id (graph : 'a graph) = List.exists (fun a_to_id -> a_to_id = to_id) (get_forward_star from_id graph);; let add_edge source_id destination_id (graph : 'a graph) = if not (has_edge source_id destination_id graph) then begin let _, edges, reversed_edges = graph in Hashtbl.add edges source_id destination_id; Hashtbl.add reversed_edges destination_id source_id; end;; let clear (graph : 'a graph) = let nodes, forward_edges, backward_edges = graph in Hashtbl.clear nodes; Hashtbl.clear forward_edges; Hashtbl.clear backward_edges;; let get_forward_edges (graph : 'a graph) = let _, edges, _ = graph in Hashtbl.fold (fun from_id to_id list -> (from_id, to_id) :: list) edges [];; let get_backward_edges (graph : 'a graph) = let _, edges, _ = graph in Hashtbl.fold (fun from_id to_id list -> (to_id, from_id) :: list) edges [];; (** Remove the edge (from_id |-> to_id), if it exists, otherwise do nothing. In any case *don't* remove any node. Yes, this implementation sucks: see the comment at the beginning to understand why I had to do it this way. *) let remove_edge from_id to_id (graph : 'a graph) = let _, forward_edges, backward_edges = graph in (* Get the current forward star of from_id and the current backward star of to_id: the edge we want to remove, if it exists, is in both: *) let forward_star = get_forward_star from_id graph in let backward_star = get_backward_star to_id graph in (* Temporarily remove all the edges from from_id and all the edges to to_id: *) List.iter (fun _ -> Hashtbl.remove forward_edges from_id) forward_star; List.iter (fun _ -> Hashtbl.remove backward_edges to_id) backward_star; (* Re-insert all the edges, except the one we want to remove: *) List.iter (fun a_to_id -> if a_to_id <> to_id then Hashtbl.add forward_edges from_id a_to_id) forward_star; List.iter (fun a_from_id -> if a_from_id <> from_id then Hashtbl.add backward_edges to_id a_from_id) backward_star;; (** Remove the given node, if it exists; otherwise do nothing *) let remove_node id (graph : 'a graph) = let nodes, _, _ = graph in (* print_string "================ Before:\n"; print_graph print_string graph; *) (* First remove all edges involving id... *) let forward_star = get_forward_star id graph in List.iter (fun to_node -> remove_edge id to_node graph) forward_star; let backward_star = get_backward_star id graph in List.iter (fun from_node -> remove_edge from_node id graph) backward_star; (* print_string "================ After edges removal:\n"; print_graph print_string graph; *) (* ...then remove the node: *) Hashtbl.remove nodes id; (* print_string "================ After node removal:\n"; print_graph print_string graph *) ;; (** Given a graph and its root, return a list of the reachable node ids in some unspecified topological sort, where if a |-> b is an edge b precedes a in the result. Forward edges are taken as elements of a 'source depends on destination' relation. This also works when the graph is made of several distinct connected components: every node is returned (exactly once). If the graph is cyclic then the result is undefined. *) let topological_sort (graph : 'a graph) = let nodes = get_node_ids graph in let touched_nodes = Hashtbl.create (List.length nodes) in let result = ref [] in let rec depth_first_visit root = if not (Hashtbl.mem touched_nodes root) then begin Hashtbl.add touched_nodes root (); List.iter depth_first_visit (get_forward_star root graph); result := root :: !result; end in List.iter depth_first_visit (List.filter (fun node -> get_backward_star node graph = []) nodes); List.rev !result;; (* (** Example *) let rec print_list print_node g xs = match xs with [] -> print_string "\n"; | id :: ys -> (print_node (get_node id g); print_string " "; print_list print_node g ys);; let _ = let g = make_empty_graph () in (* let a = add_node "a" g in *) (* let b = add_node "b" g in *) (* let c = add_node "c" g in *) (* let _ = add_edge a b g in *) (* let _ = add_edge a c g in *) (* let _ = add_edge b c g in *) (* let _ = add_edge b b g in *) (* let _ = remove_node a g in *) (* let n1 = add_node "a" g in *) (* let n2 = add_node "b" g in *) (* let n3 = add_node "c" g in *) (* let n4 = add_node "d" g in *) (* let n5 = add_node "e" g in *) (* let n6 = add_node "f" g in *) (* let n7 = add_node "g" g in *) (* let n8 = add_node "h" g in *) (* let n9 = add_node "i" g in *) let n4 = add_node "d" g in let n2 = add_node "b" g in let n1 = add_node "a" g in let n8 = add_node "h" g in let n3 = add_node "c" g in let n6 = add_node "f" g in let n9 = add_node "i" g in let n5 = add_node "e" g in let n7 = add_node "g" g in let _ = add_edge n1 n2 g in let _ = add_edge n2 n3 g in let _ = add_edge n1 n4 g in let _ = add_edge n1 n5 g in let _ = add_edge n3 n5 g in let _ = add_edge n5 n6 g in let _ = add_edge n7 n4 g in let _ = add_edge n5 n8 g in let _ = add_edge n8 n7 g in print_graph print_string g; print_string "\nTopological sort: "; print_list print_string g (topological_sort g); print_string "\n";; *) marionnet-0.90.6+bzr434.orig/scripts/0000700000175000017500000000000012167200764016247 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/scripts/can-directory-host-sparse-files.sh0000700000175000017500000000277012167200764024725 0ustar lucaslucas#!/bin/bash # This file is part of Marionnet, a virtual network laboratory # Copyright (C) 2007 Jean-Vincent Loddo # Copyright (C) 2007 Luca Saiu # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . DIR=${1:-$PWD} [[ -d "$DIR" ]] || { echo "Directory doesn't exist. Exiting." exit 3 } >&2 # The mounted directory containing $DIR: # (note that df resolves symlinks, relative paths and paths not in normal form) MOUNTED_DIR=$(df -P "$DIR" | tail -n -1 | awk '{print $NF}') # The related filesystem type: FSTYPE=$(mount -l | awk '$3 == "'${MOUNTED_DIR}'" {print $5}') [[ -n "$FSTYPE" ]] || { echo "Cannot determine the filesystem type. Exiting." exit 2 } >&2 # Check if the filesystem type belongs the white list. # Note that apparently xfs no longer supports sparse files in Ubuntu 12.04 (kernel 3.2). WHITE_LIST="reiserfs reiser4 ext4 ext4dev ext3 ext2 udf ntfs jfs ufs tmpfs vxfs xiafs" echo "$WHITE_LIST" | grep -qw "$FSTYPE" exit $? marionnet-0.90.6+bzr434.orig/treeview_defects.ml0000600000175000017500000004474712167200764020463 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext;; module Row_item = Treeview.Row_item ;; module Row = Treeview.Row ;; (** The direction in which data flow in a single port; this is the 'resolution' of each defect, for each port: *) type port_direction = InToOut | OutToIn;; let string_of_port_direction d = match d with InToOut -> "outward" | OutToIn -> "inward";; type column_header = string (** The direction in which data flow in a single port; this is the 'resolution' of each defect, for each port: *) type cable_direction = LeftToRight | RightToLeft;; let string_of_cable_direction d = match d with LeftToRight -> "rightward" | RightToLeft -> "leftward";; class t = fun ~packing ~after_user_edit_callback () -> object(self) inherit Treeview.treeview_with_a_primary_key_Name_column ~packing ~highlight_color:"Light Coral" ~hide_reserved_fields:true () as super val loss_header = "Loss %" method get_row_loss = self#get_String_field (loss_header) method set_row_loss = self#set_String_field (loss_header) val duplication_header = "Duplication %" method get_row_duplication = self#get_String_field (duplication_header) method set_row_duplication = self#set_String_field (duplication_header) val flipped_bits_header = "Flipped bits %" method get_row_flipped_bits = self#get_String_field (flipped_bits_header) method set_row_flipped_bits = self#set_String_field (flipped_bits_header) val minimum_delay_header = "Minimum delay (ms)" method get_row_minimum_delay = self#get_String_field (minimum_delay_header) method set_row_minimum_delay = self#set_String_field (minimum_delay_header) val maximum_delay_header = "Maximum delay (ms)" method get_row_maximum_delay = self#get_String_field (maximum_delay_header) method set_row_maximum_delay = self#set_String_field (maximum_delay_header) val type_header = "Type" method get_row_type = self#get_Icon_field (type_header) method set_row_type = self#set_Icon_field (type_header) val uneditable_header = "_uneditable" method get_row_uneditable = self#get_CheckBox_field (uneditable_header) method non_defective_defaults = [ loss_header, Row_item.String "0"; duplication_header, Row_item.String "0"; flipped_bits_header, Row_item.String "0"; minimum_delay_header, Row_item.String "0"; maximum_delay_header, Row_item.String "0"; ] method defective_defaults = [ loss_header, Row_item.String "5"; duplication_header, Row_item.String "5"; flipped_bits_header, Row_item.String "0.01"; minimum_delay_header, Row_item.String "50"; maximum_delay_header, Row_item.String "100"; ] method add_device ?(defective_by_default=false) ~device_name ~device_type ~port_no ~port_prefix ~user_port_offset () = Log.printf "Making a defect treeview entry for %s \"%s\" with %d ports (prefix %s, user port offset %d).\n" device_type device_name port_no port_prefix user_port_offset; let row_id = self#add_row [ name_header, Row_item.String device_name; type_header, Row_item.Icon device_type; uneditable_header, Row_item.CheckBox true; ] in self#update_port_no ~defective_by_default ~device_name ~port_no ~port_prefix ~user_port_offset (); self#collapse_row row_id; method add_cable ~cable_name ~cable_type ~left_name ~right_name () = let cable_type = match cable_type with | "direct" -> "straight-cable" | "crossover" -> "crossover-cable" | "nullmodem" -> assert false | _ -> assert false in let cable_row_id = self#add_row [ name_header, Row_item.String cable_name; type_header, Row_item.Icon cable_type; uneditable_header, Row_item.CheckBox true; ] in ignore (self#add_row ~parent_row_id:cable_row_id (List.append [name_header, Row_item.String left_name; type_header, Row_item.Icon "leftward"] self#non_defective_defaults)); ignore (self#add_row ~parent_row_id:cable_row_id (List.append [name_header, Row_item.String right_name; type_header, Row_item.Icon "rightward"] self#non_defective_defaults)); self#collapse_row cable_row_id; (* Used importing hub/switch/.. for backward compatibility: *) method change_port_user_offset ~device_name ~user_port_offset = let offset = user_port_offset in let update name = try Scanf.sscanf name "eth%i" (fun i -> Printf.sprintf "eth%d" (i+offset)) with _ -> try Scanf.sscanf name "port%i" (fun i -> Printf.sprintf "port%d" (i+offset)) with _ -> name in let device_row_id = self#unique_row_id_of_name device_name in let port_row_ids = Forest.children_nodes device_row_id !id_forest in List.iter (self#update_row_name update) port_row_ids method private add_port ?(defective_by_default=false) ~device_name ~port_prefix ~user_port_offset = let defaults = if defective_by_default then self#defective_defaults else self#non_defective_defaults in let device_row_id = self#unique_row_id_of_name device_name in let current_port_no = self#children_no_of ~parent_name:device_name in let current_user_port_index = current_port_no + user_port_offset in let port_type = match self#get_row_type (device_row_id) with | "machine" (*| "world_bridge"*) -> "machine-port" | "gateway" (* retro-compatibility *) -> "machine-port" | _ -> "other-device-port" in let port_row_id = self#add_row ~parent_row_id:device_row_id [ name_header, Row_item.String (Printf.sprintf "%s%i" port_prefix current_user_port_index); type_header, Row_item.Icon port_type; uneditable_header, Row_item.CheckBox true; ] in let _inward_row_id = (self#add_row ~parent_row_id:port_row_id (List.append [name_header, Row_item.String "inward"; type_header, Row_item.Icon "inward"] self#non_defective_defaults)) in let outward_row_id = (self#add_row ~parent_row_id:port_row_id (List.append [name_header, Row_item.String "outward"; type_header, Row_item.Icon "outward"] defaults)) in if defective_by_default then begin (* In a single direction suffice: *) self#show_that_it_is_defective outward_row_id; end method update_port_no ?(defective_by_default=false) ~device_name ~port_no ~port_prefix ~user_port_offset () = let add_child_of device_name = self#add_port ~defective_by_default ~device_name ~port_prefix ~user_port_offset in self#update_children_no ~add_child_of ~parent_name:device_name port_no method get_port_data device_name port_name port_direction = let port_row = self#get_complete_row_of_child ~parent_name:device_name ~child_name:port_name in let port_id = self#id_of_complete_row port_row in let port_direction_ids = self#children_of port_id in let port_direction_str = string_of_port_direction (port_direction) in List.find (fun row -> Row.Icon_field.eq ~field:type_header ~value:port_direction_str row) (List.map self#get_row port_direction_ids) method get_cable_data cable_name cable_direction = let cable_row_id = self#unique_row_id_of_name cable_name in let cable_direction_ids = self#children_of cable_row_id in let cable_direction_str = string_of_cable_direction (cable_direction) in let filtered_cable_directions = List.filter (fun row -> Row.Icon_field.eq ~field:type_header ~value:cable_direction_str row) (List.map self#get_row cable_direction_ids) in assert(List.length filtered_cable_directions = 1); List.hd filtered_cable_directions method rename_cable_endpoints cable_name left_endpoint_name right_endpoint_name = let cable_row_id = self#unique_row_id_of_name cable_name in let cable_direction_ids = self#children_of cable_row_id in assert (List.length cable_direction_ids = 2); let directions = List.map self#get_complete_row cable_direction_ids in let leftward_direction = List.find (fun row -> Row.Icon_field.eq ~field:type_header ~value:"leftward" row) directions in let rightward_direction = List.find (fun row -> Row.Icon_field.eq ~field:type_header ~value:"rightward" row) directions in self#set_row_name (Row.get_id leftward_direction) (left_endpoint_name); self#set_row_name (Row.get_id rightward_direction) (right_endpoint_name); (** Return a single port attribute as an item: *) method get_port_attribute device_name port_name port_direction field = let row = self#get_port_data (device_name) (port_name) (port_direction) in float_of_string (Row.String_field.get ~field row) method get_port_attribute_of ~device_name ~port_prefix ~port_index ~user_port_offset ~port_direction ~column_header () = let user_port_index = port_index + user_port_offset in let port_name = Printf.sprintf "%s%i" port_prefix user_port_index in self#get_port_attribute device_name port_name port_direction column_header (** Return a single cable attribute as an item: *) method get_cable_attribute cable_name cable_direction field = let row = self#get_cable_data (cable_name) (cable_direction) in float_of_string (Row.String_field.get ~field row) method private is_empty_or_a_number_between s minimum maximum = s = "" or (try Scanf.sscanf s "%f" (fun x -> x >= minimum && x <= maximum) with _ -> false) method private is_a_valid_percentage s = self#is_empty_or_a_number_between s 0.0 100.0 method private is_a_valid_non_100_percentage s = self#is_empty_or_a_number_between s 0.0 99.0 method private is_a_valid_delay s = self#is_empty_or_a_number_between s 0.0 100000.0 method private show_that_it_is_defective row_id = self#highlight_row row_id method private show_that_it_is_not_defective row_id = self#unhighlight_row row_id (** Return true iff there exists at least a defect in the given row. If given, use the given values for minimum and maximum delay instead of the ones found in the row: *) method private is_defective ?minimum_delay ?maximum_delay row_id = let row = List.filter (fun (header, _) -> let c = String.get header ((String.length header) - 1) in ((c = ')' or c = '%') && (* we're interested in percentages and times *) (match minimum_delay with None -> true | Some _ -> not (header = minimum_delay_header)) && (match maximum_delay with None -> true | Some _ -> not (header = maximum_delay_header)))) (self#get_row row_id) in let values = List.map (fun (_, i) -> let s = Row_item.extract_String i in try float_of_string s with _ -> 0.0) row in let values = match maximum_delay with None -> values | Some x -> x :: values in let values = match minimum_delay with None -> values | Some x -> x :: values in List.exists (fun x -> x > 0.0) values method private show_defectiveness ?minimum_delay ?maximum_delay row_id = if self#is_defective ?minimum_delay ?maximum_delay row_id then self#show_that_it_is_defective row_id else self#show_that_it_is_not_defective row_id (** grandparent for devices, parent for cables: *) method private relevant_device_name_for_row_id row_id = try self#get_row_grandparent_name row_id with _ -> self#get_row_parent_name row_id initializer let _ = self#add_checkbox_column ~header:uneditable_header ~hidden:true ~default:(fun () -> Row_item.CheckBox false) () in let _ = self#add_icon_column ~header:type_header ~shown_header:(s_ "Type") ~strings_and_pixbufs:[ "machine", Initialization.Path.images^"treeview-icons/machine.xpm"; "hub", Initialization.Path.images^"treeview-icons/hub.xpm"; "switch", Initialization.Path.images^"treeview-icons/switch.xpm"; "router", Initialization.Path.images^"treeview-icons/router.xpm"; "cloud", Initialization.Path.images^"treeview-icons/cloud.xpm"; "world_bridge", Initialization.Path.images^"treeview-icons/world.xpm"; "gateway" (* retro-compatibility: *), Initialization.Path.images^"treeview-icons/world.xpm"; "straight-cable", Initialization.Path.images^"treeview-icons/cable-grey.xpm"; "crossover-cable", Initialization.Path.images^"treeview-icons/cable-blue.xpm"; "machine-port", Initialization.Path.images^"treeview-icons/network-card.xpm"; "other-device-port", Initialization.Path.images^"treeview-icons/port.xpm"; "rightward", Initialization.Path.images^"treeview-icons/left-to-right.xpm"; "leftward", Initialization.Path.images^"treeview-icons/right-to-left.xpm"; "outward", Initialization.Path.images^"treeview-icons/in-to-out.xpm"; "inward", Initialization.Path.images^"treeview-icons/out-to-in.xpm"; ] () in let loss = self#add_editable_string_column ~header:loss_header ~shown_header:(s_ "Loss %") ~default:(fun () -> Row_item.String "") ~constraint_predicate:(fun i -> let i = Row_item.extract_String i in self#is_a_valid_percentage i) () in loss#set_after_edit_commit_callback (fun row_id _ _ -> self#show_defectiveness row_id); let duplication = self#add_editable_string_column ~header:duplication_header ~shown_header:(s_ "Duplication %") ~default:(fun () -> Row_item.String "") ~constraint_predicate:(fun i -> let i = Row_item.extract_String i in self#is_a_valid_non_100_percentage i) () in duplication#set_after_edit_commit_callback (fun row_id _ _ -> self#show_defectiveness row_id); let flipped_bits = self#add_editable_string_column ~header:flipped_bits_header ~shown_header:(s_ "Flipped bits %") ~default:(fun () -> Row_item.String "") ~constraint_predicate:(fun i -> let i = Row_item.extract_String i in self#is_a_valid_percentage i) () in flipped_bits#set_after_edit_commit_callback (fun row_id _ content -> self#show_defectiveness row_id; let content = float_of_string content in if content > 1.0 then Simple_dialogs.warning (s_ "This value may be too high") (s_ "Please consider that a flipped bits percentage greater than 1% implies *many* transmission errors.\n\nAnyway you are free to experiment with any percentage.") ()); let minimum_delay = self#add_editable_string_column ~header:minimum_delay_header ~shown_header:(s_ "Minimum delay (ms)") ~default:(fun () -> Row_item.String "") ~constraint_predicate:(fun i -> let i = Row_item.extract_String i in self#is_a_valid_delay i) () in minimum_delay#set_after_edit_commit_callback (fun row_id _ new_content -> let minimum_delay = if new_content = "" then 0.0 else float_of_string new_content in let maximum_delay = self#get_row_maximum_delay row_id in let maximum_delay = if maximum_delay = "" then 0.0 else float_of_string maximum_delay in (if minimum_delay > maximum_delay then self#set_row_maximum_delay row_id (string_of_float minimum_delay)); self#show_defectiveness ~maximum_delay:(max minimum_delay maximum_delay) row_id); let maximum_delay = self#add_editable_string_column ~header:maximum_delay_header ~shown_header:(s_ "Maximum delay (ms)") ~default:(fun () -> Row_item.String "") ~constraint_predicate:(fun i -> let i = Row_item.extract_String i in self#is_a_valid_delay i) () in maximum_delay#set_after_edit_commit_callback (fun row_id _ new_content -> let maximum_delay = if new_content = "" then 0.0 else float_of_string new_content in let minimum_delay = self#get_row_minimum_delay row_id in let minimum_delay = if minimum_delay = "" then 0.0 else float_of_string minimum_delay in (if minimum_delay > maximum_delay then self#set_row_minimum_delay row_id (string_of_float maximum_delay)); self#show_defectiveness ~minimum_delay:(min minimum_delay maximum_delay) row_id); self#add_row_constraint ~name:(s_ "you should choose a direction to define this parameter") (fun row -> let uneditable = Row.CheckBox_field.get ~field:uneditable_header row in (not uneditable) or (List.for_all (fun (name, value) -> name = name_header or name = type_header or name = uneditable_header or self#is_column_reserved name or value = Row_item.String "") row)); self#set_after_update_callback (fun row_id -> after_user_edit_callback (self#relevant_device_name_for_row_id row_id)); (* Make internal data structures: no more columns can be added now: *) self#create_store_and_view; (* Setup the contextual menu: *) self#set_contextual_menu_title "Defects operations"; end;; class treeview = t module The_unique_treeview = Stateful_modules.Variable (struct type t = treeview let name = Some "treeview_defects" end) let extract = The_unique_treeview.extract let make ~(window:GWindow.window) ~(hbox:GPack.box) ~after_user_edit_callback () = let result = new t ~packing:(hbox#add) ~after_user_edit_callback () in let () = Treeview.add_expand_and_collapse_button ~window ~hbox (result:>Treeview.t) in The_unique_treeview.set result; result ;; marionnet-0.90.6+bzr434.orig/task_runner.ml0000600000175000017500000001571712167200764017462 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008 Luca Saiu Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Graph;; open Message_passing;; let do_in_parallel thunks = (* Make a thread per thunk: *) let threads = List.map (fun thunk -> Thread.create (fun () -> try thunk () with e -> begin Log.printf "!!!! do_in_parallel: a thunk failed (%s)\n" (Printexc.to_string e); flush_all (); end) ()) thunks in (* Wait that they terminate: *) List.iter (fun thread -> try Thread.join thread; with e -> begin Log.printf "!!!!!!!!!!!!!!! This should not happen: join failed (%s)\n" (Printexc.to_string e); flush_all () end) threads;; (** A thunk is trivially represented a unit->unit function: *) type thunk = unit -> unit;; (** A task is a thunk, to be executed by the task-runner thread: *) type task = thunk;; (** A graph of tasks combines tasks with their dependency relation: *) type task_graph = thunk graph;; (** This is only used internally. *) exception Kill_task_runner;; (** This class allows the user to enqueue tasks (represented as thunks) to be executed one after another, all in the same thread which is created at initialization time. *) class task_runner = object(self) val queue : (string * (unit -> unit)) queue = new queue val run_again = ref true initializer (* (\** Handle SIGCHLD by default: *\) *) (* Signals.install_sigchld_handler (); *) (* No, absolutely not! :-) *) ignore (Thread.create (fun () -> while !run_again do Log.printf "task_runner: I'm ready for the next task...\n"; let name, task = queue#dequeue in self#run name task; done) ()) method run name task = flush_all (); try Log.printf "task_runner: Executing the task \"%s\"\n" name; task (); Log.printf "task_runner: The task \"%s\" succeeded.\n" name; with Kill_task_runner -> begin Log.printf "task_runner: The task runner was explicitly killed.\n"; run_again := false; end | e -> begin Log.printf "task_runner: WARNING: the asynchronous task \"%s\" raised an exception\n\t(%s).\n\tTHIS MAY BE SERIOUS.\n\tAnyway, I'm going to continue with the next task.\n" name (Printexc.to_string e) ; end method schedule ?(name="[unnamed task]") task = queue#enqueue (name, task) method prepend ?(name="[unnamed task]") task = queue#prepend (name, task) (** This queue is only used for synchronization purposes. Message-passing synchronizations is way spiffier :-) *) val dummy_queue : unit queue = new queue (** Wait that all tasks which are currently scheduled terminate, synchronously. In the mean time more tasks can be scheduled as usual. *) method wait_for_all_currently_scheduled_tasks = self#schedule ~name:"wait until all scheduled tasks terminate" (fun () -> dummy_queue#enqueue ()); Log.printf "Waiting for all currently enqueued tasks to terminate...\n"; let () = dummy_queue#dequeue in Log.printf "...all right, we have been signaled: tasks did terminate.\n"; method schedule_parallel (names_and_thunks : (string * thunk) list) = let parallel_task_name = List.fold_left (fun s name -> s ^ name ^ " || ") "In parallel: " (List.map (fun (name, _) -> name) names_and_thunks) in let parallel_task_thunk = fun () -> let threads = List.map (fun (name, thunk) -> name, Thread.create thunk ()) names_and_thunks in List.iter (fun (name, thread) -> Log.printf "Joining \"%s\"...\n" name; (try Thread.join thread; with e -> begin Log.printf "!!!!!!!!!!!!!!! This should not happen: join failed (%s)\n" (Printexc.to_string e); end); Log.printf "I have joined \"%s\" with success\n" name;) threads in (* self#schedule ~name:parallel_task_name parallel_task_thunk *) self#prepend ~name:parallel_task_name parallel_task_thunk (** A user-friendly way to schedule a set of tasks with a dependency graph. The description is a list of triples . *) method schedule_tasks description = let g = make_empty_graph () in (* First make the nodes, and a local name -> id table: *) let table = Hashtbl.create ((List.length (get_node_ids g)) * 2) in List.iter (fun (name, _, thunk) -> let id = add_node (name, thunk) g in Hashtbl.add table name id) description; (* Now make edges: *) List.iter (fun (name, dependencies, _) -> List.iter (fun a_dependency -> add_edge (Hashtbl.find table name) (Hashtbl.find table a_dependency) g) dependencies) description; (* Ok, we have the graph. Now we can use it to schedule tasks in some reasonable order: *) List.iter (fun id -> let name, thunk = get_node id g in self#schedule ~name thunk) (topological_sort g) (* method terminate = self#prepend ~name:"Destroying the task runner" (fun () -> raise Kill_task_runner)*) end;; let the_task_runner = new task_runner;; (* let g = schedule_tasks [ "a", [], (fun () -> print_string "a\n"); "b", ["c"], (fun () -> print_string "b\n"); "c", ["a"], (fun () -> print_string "c\n"); ];; let sorted_nodes = topological_sort g;; let _ = List.iter (fun id -> let name, thunk = get_node id g in Log.printf "Executing %s\n" name; thunk ();) sorted_nodes;; *) (* ------------------------------------------------------------------------------------ *) (* Example: *) (* let _ = schedule_tasks [ "a", [], (fun () -> print_string "(a) This will come first.\n"); "b", ["c"], (fun () -> print_string "(b) This will come after c.\n"); "c", ["a"], (fun () -> print_string "(c) This will come after a.\n"); ];; Unix.sleep 3;; *) marionnet-0.90.6+bzr434.orig/marionnet-toplevel0000700000175000017500000001035312167200764020334 0ustar lucaslucas#!/bin/bash # This file is part of Marionnet, a virtual network laboratory # Copyright (C) 2010 Jean-Vincent Loddo # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e if [[ $1 = "--help" || $1 = "-h" || $1 = "-help" ]]; then echo "Usage: $(basename $0) [[/][.ml]] [OCAML_OPTIONS]" echo ' Launch marionnet in a toplevel or test a specific module. Internally, the script gets (from the ocamlbuild log) the correct command line for compiling marionnet.byte as defined by ocamlbuild, then it simply replaces "ocamlc.opt" by "ocamlmktop" and the target "marionnet.byte" by the temporary name of the toplevel. If a module pattern (ex: gui_router_dialog_widget) or a module filename (ex: gui/gui_router_dialog_widget.ml) is provided as argument, the script builds a toplevel that will load just the required modules for this argument (it deletes modules cited after the pattern in the command line defined by ocamlbuild). Furthermore, the toplevel will call a function called "make", with the actual (), supposed defined in the module. This is not a strict requirement: we can also test modules which have not this function. In this case, the call to "make" will simply fail, without any undesirable effect.' | fmt echo echo -e "Examples: \t./$(basename $0) \t./$(basename $0) gui/gui_router_dialog_widget.ml \t./$(basename $0) gui_hub \t./$(basename $0) splash" exit 0 fi TOP=/tmp/$(basename $0) make marionnet.byte # Get the correct command line for compiling marionnet.byte # then replace "ocamlc.opt" by "ocamlmktop" # and the target "marionnet.byte" by $TOP CMD=$(grep 'ocamlc.opt .*-o marionnet.byte' _build/_build/_log \ | sed -e 's/\/usr\/bin\/ocamlc.opt/ocamlmktop -I _build/' \ | sed -e "s/marionnet.byte/\/tmp\/$(basename $0)/" ) # Manage the optional argument (if it isn't an option) if [[ -n "$1" && "$1" = "${1#-}" ]]; then MODULE_BASENAME=$(basename ${1%.*}) CMD=$(echo "$CMD" \ | tr ' ' '\n' \ | awk "/$MODULE_BASENAME/ {print; stop=1} (stop != 1) {print}" \ | tr '\n' ' ') CMD+=" -o $TOP" INIT="-init $TOP.init" MODULE_NAME=$(echo "$MODULE_BASENAME" | sed 's/\<./\u&/') if [[ -n "$2" ]]; then FUNCTION_NAME=$2 shift else FUNCTION_NAME="test" fi cat >$TOP.init <$TOP.init </dev/null; then rlwrap $TOP $INCLUDES $INIT "$@" elif which ledit &>/dev/null; then ledit $TOP $INCLUDES $INIT "$@" else eval $TOP $INCLUDES $INIT "$@" rm -f $TOP fi # The executable is not removed from /tmp/ in order to reuse the history # of commands (managed by rlwrap and ledit) marionnet-0.90.6+bzr434.orig/world_gateway.ml0000600000175000017500000003747412167200764020003 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** "world gateway" component implementation. *) open Gettext;; (* Switch related constants: *) (* TODO: make it configurable! *) module Const = struct let port_no_default = 4 let port_no_min = 4 let port_no_max = 16 let network_config_default = ((10,0,2,1),24) let network_address_default = "10.0.2.0" end #load "where_p4.cmo" ;; (* The type of data exchanged with the dialog: *) module Data = struct type t = { name : string; label : string; network_config : Ipv4.config; dhcp_enabled : bool; port_no : int; old_name : string; } let to_string t = "" (* TODO? *) end (* Data *) module Tool = struct let network_address_of_config (config:Ipv4.config) = let ((i1,i2,i3,_),_) = config in Printf.sprintf "%i.%i.%i.%i" i1 i2 i3 0 end (* module Tool *) module Make_menus (Params : sig val st : State.globalState val packing : [ `toolbar of GButton.toolbar | `menu_parent of Menu_factory.menu_parent ] end) = struct open Params module Toolbar_entry = struct let imagefile = "ico.world_gateway.palette.png" let tooltip = (s_ "World gateway (router)") let packing = Params.packing end module Add = struct include Data let key = Some GdkKeysyms._G let ok_callback t = Gui_bricks.Ok_callback.check_name t.name t.old_name st#network#name_exists t let dialog () = let name = st#network#suggestedName "G" in Dialog_add_or_update.make ~title:(s_ "Add world gateway") ~name ~ok_callback () let reaction { name = name; label = label; network_config = network_config; dhcp_enabled = dhcp_enabled; port_no = port_no; old_name = _ ; } = let action () = ignore ( new User_level_world_gateway.world_gateway ~network:st#network ~name ~label ~port_no ~network_address:(Tool.network_address_of_config network_config) ~dhcp_enabled ()) in st#network_change action (); end module Properties = struct include Data let dynlist () = st#network#get_nodes_that_can_startup ~devkind:`World_gateway () let dialog name () = let d = (st#network#get_node_by_name name) in let g = ((Obj.magic d):> User_level_world_gateway.world_gateway) in let title = (s_ "Modify world gateway")^" "^name in let label = g#get_label in (* With the current version of slirpvde i4 is always 1 and cidr is 24 *) let network_config = let fixed_cidr = 24 in ((Ipv4.of_string g#get_network_address), fixed_cidr) in let dhcp_enabled = g#get_dhcp_enabled in let port_no = g#get_port_no in (* The user cannot remove receptacles used by a cable. *) let port_no_min = st#network#port_no_lower_of (g :> User_level.node) in Dialog_add_or_update.make ~title ~name ~label ~network_config ~dhcp_enabled ~port_no ~port_no_min ~ok_callback:Add.ok_callback () let reaction { name = name; label = label; network_config = network_config; dhcp_enabled = dhcp_enabled; port_no = port_no; old_name = old_name ; } = let d = (st#network#get_node_by_name old_name) in let g = ((Obj.magic d):> User_level_world_gateway.world_gateway) in let action () = g#update_world_gateway_with ~name ~label ~network_config ~dhcp_enabled ~port_no in st#network_change action (); end module Remove = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist = Properties.dynlist let dialog name () = Gui_bricks.Dialog.yes_or_cancel_question ~title:(s_ "Remove") ~markup:(Printf.sprintf (f_ "Are you sure that you want to remove %s\nand all the cables connected to this %s?") name (s_ "gateway")) ~context:name () let reaction name = let d = (st#network#get_node_by_name name) in let g = ((Obj.magic d):> User_level_world_gateway.world_gateway) in let action () = g#destroy in st#network_change action (); end module Startup = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist = Properties.dynlist let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#startup end module Stop = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist = st#network#get_nodes_that_can_gracefully_shutdown ~devkind:`World_gateway let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#gracefully_shutdown end module Suspend = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist () = st#network#get_nodes_that_can_suspend ~devkind:`World_gateway () let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#suspend end module Resume = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist () = st#network#get_nodes_that_can_resume ~devkind:`World_gateway () let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#resume end module Create_entries = Gui_toolbar_COMPONENTS_layouts.Layout_for_network_node (Params) (Toolbar_entry) (Add) (Properties) (Remove) (Startup) (Stop) (Suspend) (Resume) (* Subscribe this kind of component to the network club: *) st#network#subscribe_a_try_to_add_procedure Eval_forest_child.try_to_add_world_gateway; end (*-----*) WHERE (*-----*) module Dialog_add_or_update = struct (* This function may be useful for testing the widget creation without recompiling the whole project. *) let make ?(title="Add a world gateway") ?(name="") ?label ?(network_config=Const.network_config_default) ?(dhcp_enabled=true) ?(port_no=Const.port_no_default) ?(port_no_min=Const.port_no_min) ?(port_no_max=Const.port_no_max) ?(help_callback=help_callback) (* defined backward with "WHERE" *) ?(ok_callback=(fun data -> Some data)) ?(dialog_image_file=Initialization.Path.images^"ico.world_gateway.dialog.png") () :'result option = let old_name = name in let ((b1,b2,b3,b4),b5) = network_config in let (w,_,name,label) = Gui_bricks.Dialog_add_or_update.make_window_image_name_and_label ~title ~image_file:dialog_image_file ~image_tooltip:(s_ "World gateway") ~name ~name_tooltip:(s_ "World gateway name. This name must be unique in the virtual network. Suggested: G1, G2, ...") ?label () in let ((s1,s2,s3,s4,s5), dhcp_enabled, port_no) = let vbox = GPack.vbox ~homogeneous:false ~border_width:20 ~spacing:10 ~packing:w#vbox#add () in let form = Gui_bricks.make_form_with_labels ~packing:vbox#add [(s_ "IPv4 address"); (s_ "DHCP service"); (s_ "Integrated switch ports")] in let network_config = Gui_bricks.spin_ipv4_address_with_cidr_netmask ~packing:(form#add_with_tooltip ~just_for_label:() "IPv4 address of the gateway") b1 b2 b3 b4 b5 in let dhcp_enabled = GButton.check_button ~active:dhcp_enabled ~packing:(form#add_with_tooltip (s_ "Should the gateway provide a DHCP service?" )) () in let port_no = Gui_bricks.spin_byte ~packing:(form#add_with_tooltip (s_ "The number of ports of the integrated switch" )) ~lower:port_no_min ~upper:port_no_max ~step_incr:2 port_no in (network_config, dhcp_enabled, port_no) in s4#misc#set_sensitive false; s5#misc#set_sensitive false; let get_widget_data () :'result = let name = name#text in let label = label#text in let network_config = let s1 = int_of_float s1#value in let s2 = int_of_float s2#value in let s3 = int_of_float s3#value in let s4 = int_of_float s4#value in let s5 = int_of_float s5#value in ((s1,s2,s3,s4),s5) in let dhcp_enabled = dhcp_enabled#active in let port_no = int_of_float port_no#value in { Data.name = name; Data.label = label; Data.network_config = network_config; Data.dhcp_enabled = dhcp_enabled; Data.port_no = port_no; Data.old_name = old_name; } in (* The result of make is the result of the dialog loop (of type 'result option): *) Gui_bricks.Dialog_run.ok_or_cancel w ~ok_callback ~help_callback ~get_widget_data () (*-----*) WHERE (*-----*) let help_callback = let title = (s_ "ADD OR MODIFY A WORLD GATEWAY") in let msg = (s_ "\ In this dialog window you can define the name of a gateway \ to the real world (i.e. the world of the host machine) \ and set many parameters for it:\n\n\ - Label: a string appearing near the router icon in the network graph; \ this field is exclusively for graphic purposes, is not taken in consideration \ for the configuration.\n\n\ - Ipv4 address: the address of the gateway that will be used by the virtual \ machines connected to it.\n\n\ - DHCP service: enabling this option, machines will be able to use the world gateway \ as DHCP server, receiving leases in the range defined by the Ipv4 address. \ This service also provides a DNS proxy\n\n\ - Integrated switch ports: \ the number of ports of the integrated switch (default 4); this number must \ not be increased without a good reason, because the number of processes needed for the \ device emulation is proportional to its ports number.\n\n\ The emulation of this device is realised with the program 'slirpvde' derived from \ the project VDE.\n") in Simple_dialogs.help title msg ;; end (*-----*) WHERE (*-----*) module Eval_forest_child = struct let try_to_add_world_gateway (network:User_level.network) ((root,children):Xforest.tree) = try (match root with | ("world_gateway", attrs) -> let name = List.assoc "name" attrs in let port_no = try int_of_string (List.assoc "port_no" attrs) with _ -> Const.port_no_default in Log.printf "Importing world gateway \"%s\" with %d ports...\n" name port_no; let x = new User_level_world_gateway.world_gateway ~network ~name ~port_no () in x#from_tree ("world_gateway", attrs) children; Log.printf "World gateway \"%s\" successfully imported.\n" name; true | _ -> false ) with _ -> false end (* module Eval_forest_child *) (*-----*) WHERE (*-----*) module User_level_world_gateway = struct (** A gateway has an associated network address and a dhcp server capability. *) class world_gateway = fun ~(network:User_level.network) ~name ?label ?(port_no=4) ?(network_address=Const.network_address_default) ?(dhcp_enabled=true) () -> object (self) inherit OoExtra.destroy_methods () inherit User_level.node_with_ledgrid_and_defects ~network ~name ?label ~devkind:`World_gateway ~port_no ~port_no_min:Const.port_no_min ~port_no_max:Const.port_no_max ~port_prefix:"port" (* because these ports are of the integrated switch *) ~user_port_offset:1 (* because is a switch *) () as self_as_node_with_ledgrid_and_defects method ledgrid_label = "World gateway" method defects_device_type = "router" method polarity = User_level.Intelligent method string_of_devkind = "world_gateway" method dotImg (z:User_level.iconsize) = let imgDir = Initialization.Path.images in (imgDir^"ico.world_gateway."^(self#string_of_simulated_device_state)^"."^z^".png") method show = (self#name^" (world gateway)") val mutable network_address : string = network_address method get_network_address = network_address method set_network_address x = network_address <- self#check_network_address x method private check_network_address x = x (* TODO *) val mutable dhcp_enabled : bool = dhcp_enabled method get_dhcp_enabled = dhcp_enabled method set_dhcp_enabled x = dhcp_enabled <- x (** Redefined:*) method gw_ipv4_address = let (b1,b2,b3,_) = Ipv4.of_string self#get_network_address in let last_byte = 2 in (b1,b2,b3, last_byte) method gw_ipv4_address_as_string : string = Ipv4.to_string self#gw_ipv4_address (** Redefined:*) method label_for_dot = let ip_gw = Ipv4.string_of_config (self#gw_ipv4_address, 24) in match self#get_label with | "" -> ip_gw | _ -> Printf.sprintf "%s
    %s" ip_gw self#get_label method to_tree = Forest.tree_of_leaf ("world_gateway", [ ("name", self#get_name); ("label", self#get_label); ("network_address", self#get_network_address); ("dhcp_enabled", (string_of_bool self#get_dhcp_enabled)); ("port_no", (string_of_int self#get_port_no)); ]) (** A world_bridge has just attributes (no children) in this version. *) method eval_forest_attribute = function | ("name" , x ) -> self#set_name x | ("label" , x ) -> self#set_label x | ("network_address", x ) -> self#set_network_address x | ("dhcp_enabled", x) -> self#set_dhcp_enabled (bool_of_string x) | ("port_no", x) -> self#set_port_no (int_of_string x) | _ -> assert false (** Create the simulated device *) method private make_simulated_device = ((new Simulation_level_world_gateway.world_gateway ~parent:self ~port_no:self#get_port_no ~network_address ~dhcp_enabled ~unexpected_death_callback:self#destroy_because_of_unexpected_death ()) :> User_level.node Simulation_level.device) method update_world_gateway_with ~name ~label ~port_no ~network_config ~dhcp_enabled = (* The following call ensure that the simulated device will be destroyed: *) self_as_node_with_ledgrid_and_defects#update_with ~name ~label ~port_no; self#set_network_address (Tool.network_address_of_config network_config); self#set_dhcp_enabled dhcp_enabled; end (* class world_gateway *) end (* module User_level_world_gateway *) (*-----*) WHERE (*-----*) module Simulation_level_world_gateway = struct class ['parent] world_gateway = fun ~(parent:'parent) ~port_no ~network_address (* default 10.0.2.0 *) ~dhcp_enabled ~unexpected_death_callback () -> (* an additional port will be used by the world *) let hublet_no = port_no + 1 in let last_user_visible_port_index = port_no - 1 in object (self) inherit ['parent] Switch.Simulation_level_switch.switch ~parent ~hublet_no ~last_user_visible_port_index ~unexpected_death_callback () as super method device_type = "world_gateway" initializer let last_reserved_port = port_no in let slirpvde_socket = (self#get_hublet_process_of_port last_reserved_port)#get_socket_name in self#add_accessory_process (new Simulation_level.slirpvde_process ~existing_socket_name:slirpvde_socket ~network:network_address ?dhcp:(Option.of_bool dhcp_enabled) ~unexpected_death_callback:self#execute_the_unexpected_death_callback ()) end;; end (* module Simulation_level_world_gateway *) (** Just for testing: *) let test = Dialog_add_or_update.make marionnet-0.90.6+bzr434.orig/marionnet.odocl0000600000175000017500000000240312167200764017577 0ustar lucaslucas# This file is part of our reusable OCaml BRICKS library # Copyright (C) 2008 Luca Saiu # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This is simply a list of the OCaml modules (*not* filenames) for which # documentation should be generated: Command_line Daemon_client Daemon_language Daemon_parameters Death_monitor Treeview_defects Treeview_history Forest Global_options Graph Icon Initialization Ledgrid_manager Log Mariokit Marionnet Marionnet-daemon Message_passing Meta Treeview_ifconfig Print_forest_frontend Print_treeview Progress_bar Recursive_mutex Row_item Simple_dialogs Simulation_level Splash State Strings Talking Task_runner Treeview_documents Timestamp Treeview X Xforest marionnet-0.90.6+bzr434.orig/daemon_client.ml0000600000175000017500000001313612167200764017721 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2008, 2009 Luca Saiu Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2008, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** This is the client side of the Marionnet-daemon support: *) open Daemon_language;; open Gettext;; module Recursive_mutex = MutexExtra.Recursive ;; let socket_name = Daemon_parameters.socket_name;; let inter_keepalive_interval = Daemon_parameters.inter_keepalive_interval;; (** The mutex we use to avoid sending concurrent messages to the same socket from different threads: *) let the_daemon_client_mutex = Recursive_mutex.create ();; (** The socket used to communicate with the daemon: *) let the_daemon_client_socket = Unix.socket Unix.PF_UNIX Unix.SOCK_STREAM 0;; (** Is the connection with the daemon currently up? *) let can_we_communicate_with_the_daemon_bool_ref = ref true;; let can_we_communicate_with_the_daemon () = Recursive_mutex.with_mutex the_daemon_client_mutex (fun () -> !can_we_communicate_with_the_daemon_bool_ref);; (** Stop trying to communicate with the daemon: *) let disable_daemon_support () = Recursive_mutex.with_mutex the_daemon_client_mutex (fun () -> can_we_communicate_with_the_daemon_bool_ref := false);; (** Send the given request (in abstract syntax) to the server, and return its response, still in abstract syntax. Synchronization is correctly performed *within* this function, so the caller doesn't need to worry about it: *) let ask_the_server request = Recursive_mutex.with_mutex the_daemon_client_mutex (fun () -> try (* Log.printf "I am about to send %s\n" (string_of_daemon_request request); flush_all ();*) if can_we_communicate_with_the_daemon () then begin let buffer = String.make message_length 'x' in let request_as_string = print_request request in (* Log.printf "The request is %s\n" (string_of_daemon_request request); flush_all ();*) let sent_byte_no = Unix.send the_daemon_client_socket request_as_string 0 message_length [] in (if not (sent_byte_no == sent_byte_no) then failwith "send() failed"); let received_byte_no = Unix.read the_daemon_client_socket buffer 0 message_length in (if received_byte_no < message_length then failwith "recv() failed, or the message is ill-formed"); let response = parse_response buffer in (* Log.printf "The response is %s\n" (string_of_daemon_response response); flush_all ();*) response end else (Error "the socket to the daemon is down"); with e -> begin Log.printf "ask_the_server failed: %s\n" (Printexc.to_string e); flush_all (); disable_daemon_support (); Simple_dialogs.error (s_ "Failure in daemon communication") (s_ "Error in trying to communicate with the daemon.\nThe application should remain usable, but without the features requiring root access...") (); (Error "the socket to the daemon just went down"); end);; (** The thunk implementing the thread which periodically sends keepalives: *) let thread_sending_keepalives_thunk () = try while true do let _ = ask_the_server IAmAlive in (try Thread.delay inter_keepalive_interval; with e -> begin Log.printf "delay failed (%s). This should not be a problem.\n" (Printexc.to_string e); flush_all (); end); done; with e -> begin Log.printf "The keepalive-sending thread failed: %s.\n" (Printexc.to_string e); Log.printf "Bailing out.\n"; flush_all (); end;; (** This should be called *before* communicating with the daemon in any way: *) let initialize_daemon_client () = Log.printf "Connecting to the daemon socket...\n"; flush_all (); Unix.connect the_daemon_client_socket (Unix.ADDR_UNIX socket_name); Log.printf "Ok, connected with success.\n"; flush_all ();; (** Make a new thread sending keepalives to the daemon: *) let start_thread_sending_keepalives () = ignore (Thread.create thread_sending_keepalives_thunk ());; (* initialize_daemon_client ();; *) (* start_thread_sending_keepalives ();; *) (* let main = *) (* try *) (* while true do *) (* Thread.delay 20.0; *) (* let request = *) (* if (Random.float 10.0) < 1.0 then *) (* DestroyAllMyResources *) (* else *) (* Make (AnyTap(42, "42.42.42.42")) in *) (* Log.printf "Request: %s\n" (string_of_daemon_request request); *) (* flush_all (); *) (* let response = *) (* ask_the_server request in *) (* Log.printf "Response: %s\n" (string_of_daemon_response response); *) (* Log.printf "\n"; *) (* flush_all (); *) (* done *) (* with e -> begin *) (* Log.printf "The daemon client failed: %s\n." (Printexc.to_string e); *) (* Log.printf "Bailing out.\n"; *) (* flush_all (); *) (* end;; *) marionnet-0.90.6+bzr434.orig/world_bridge.ml0000600000175000017500000003635712167200764017575 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** "world bridge" component implementation. *) #load "where_p4.cmo" ;; open Gettext (* World bridge related constants: *) (* TODO: make it configurable! *) module Const = struct let port_no_default = 1 let port_no_min = 1 let port_no_max = 1 end (* The type of data exchanged with the dialog: *) module Data = struct type t = { name : string; label : string; old_name : string; } let to_string t = "" (* TODO? *) end (* Data *) module Make_menus (Params : sig val st : State.globalState val packing : [ `toolbar of GButton.toolbar | `menu_parent of Menu_factory.menu_parent ] end) = struct open Params module Toolbar_entry = struct let imagefile = "ico.world_bridge.palette.png" let tooltip = (s_ "World bridge") let packing = Params.packing end module Add = struct include Data let key = Some GdkKeysyms._B let ok_callback t = Gui_bricks.Ok_callback.check_name t.name t.old_name st#network#name_exists t let dialog () = let name = st#network#suggestedName "B" in Dialog_add_or_update.make ~title:(s_ "Add world bridge") ~name ~ok_callback () let reaction { name = name; label = label } = let action () = ignore ( new User_level_world_bridge.world_bridge ~network:st#network ~name ~label ()) in st#network_change action (); end module Properties = struct include Data let dynlist () = st#network#get_nodes_that_can_startup ~devkind:`World_bridge () let dialog name () = let d = (st#network#get_node_by_name name) in let title = (s_ "Modify world bridge")^" "^name in let label = d#get_label in Dialog_add_or_update.make ~title ~name ~label ~ok_callback:Add.ok_callback () let reaction { name = name; label = label; old_name = old_name } = let d = (st#network#get_node_by_name old_name) in let h = ((Obj.magic d):> User_level_world_bridge.world_bridge) in let action () = h#update_world_bridge_with ~name ~label in st#network_change action (); end module Remove = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist = Properties.dynlist let dialog name () = Gui_bricks.Dialog.yes_or_cancel_question ~title:(s_ "Remove") ~markup:(Printf.sprintf (f_ "Are you sure that you want to remove %s\nand all the cables connected to this %s?") name (s_ "world bridge")) ~context:name () let reaction name = let d = (st#network#get_node_by_name name) in let h = ((Obj.magic d):> User_level_world_bridge.world_bridge) in let action () = h#destroy in st#network_change action (); end module Startup = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist = Properties.dynlist let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#startup end module Stop = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist () = st#network#get_nodes_that_can_gracefully_shutdown ~devkind:`World_bridge () let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#gracefully_shutdown end module Suspend = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist () = st#network#get_nodes_that_can_suspend ~devkind:`World_bridge () let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#suspend end module Resume = struct type t = string (* just the name *) let to_string = (Printf.sprintf "name = %s\n") let dynlist () = st#network#get_nodes_that_can_resume ~devkind:`World_bridge () let dialog = Menu_factory.no_dialog_but_simply_return_name let reaction name = (st#network#get_node_by_name name)#resume end module Create_entries = Gui_toolbar_COMPONENTS_layouts.Layout_for_network_node (Params) (Toolbar_entry) (Add) (Properties) (Remove) (Startup) (Stop) (Suspend) (Resume) (* Subscribe this kind of component to the network club: *) st#network#subscribe_a_try_to_add_procedure Eval_forest_child.try_to_add_world_bridge; end (*-----*) WHERE (*-----*) module Dialog_add_or_update = struct (* This function may be useful for testing the widget creation without recompiling the whole project. *) let make ?(title="Add world bridge") ?(name="") ?label ?(help_callback=help_callback) (* defined backward with "WHERE" *) ?(ok_callback=(fun data -> Some data)) ?(dialog_image_file=Initialization.Path.images^"ico.world_bridge.dialog.png") () :'result option = let old_name = name in let (w,_,name,label) = Gui_bricks.Dialog_add_or_update.make_window_image_name_and_label ~title ~image_file:dialog_image_file ~image_tooltip:(s_ "World bridge") ~name ~name_tooltip:(s_ "World bridge name. This name must be unique in the virtual network. Suggested: B1, B2, ...") ?label () in let get_widget_data () :'result = let name = name#text in let label = label#text in { Data.name = name; Data.label = label; Data.old_name = old_name; } in (* The result of make is the result of the dialog loop (of type 'result option): *) Gui_bricks.Dialog_run.ok_or_cancel w ~ok_callback ~help_callback ~get_widget_data () (*-----*) WHERE (*-----*) let help_callback = let title = (s_ "ADD OR MODIFY A WORLD BRIDGE") in (* TODO: rename "ethernet socket" => "world bridge" in all translations!*) let msg = (s_ "\ In this dialog window you can define the name of an Ethernet socket \ and set parameters for it. This component allows the user to connect the virtual \ network to a Linux bridge whose name is defined by the user via the \ configuration variable called MARIONNET_BRIDGE (in marionnet.conf or provide on \ the command line).\n\n\ If the bridge is correctly set on the host (before starting the network), virtual \ machines will be able to access to the same network services (DHCP, DNS, NFS, \ ...) that the host can access on its local network; if the host is on the Internet \ then also the virtual machines linked to the socket will be.\n \n \ To create a bridge on your (real) host using the same network as eth0 (by \ example) you need to : 1) create a bridge with the name define in marionnet.conf \ by MARIONNET_BRIDGE, 2) put and configure eth0 (on your real host) in the \ bridge and 3) put an IP address on the bridge (with dhclient or ifconfig/route).\n\n\ In such a case, after having start the virtual network in marionnet you can \ configure an ethernet card of a virtual machines which is connect to the \ Ethernet socket (or on the same network) in order to give access to your \ local network to it.\n\n \ The socket also allows team-work in a network laboratory, by creating a \ connection between Marionnet instances running on different machines. \ For more information about bridge et Ethernet socket configuration, please \ see the Marionnet Wiki on the marionnet.org website.") in Simple_dialogs.help title msg ;; end (*-----*) WHERE (*-----*) module Eval_forest_child = struct let try_to_add_world_bridge (network:User_level.network) ((root,children):Xforest.tree) = try (match root with | ("world_bridge", attrs) | ("gateway" (* retro-compatibility *), attrs) -> let name = List.assoc "name" attrs in Log.printf "Importing world bridge \"%s\"...\n" name; let x = new User_level_world_bridge.world_bridge ~network ~name () in x#from_tree ("world_bridge", attrs) children ; Log.printf "World bridge \"%s\" successfully imported.\n" name; true | _ -> false ) with _ -> false end (* module Eval_forest_child *) (*-----*) WHERE (*-----*) module User_level_world_bridge = struct class world_bridge = fun ~network ~name ?label () -> object (self) inherit OoExtra.destroy_methods () inherit User_level.node_with_defects ~network ~name ?label ~devkind:`World_bridge ~port_no:Const.port_no_default ~port_no_min:Const.port_no_min ~port_no_max:Const.port_no_max ~user_port_offset:0 ~port_prefix:"eth" () as self_as_node_with_defects method defects_device_type = "world_bridge" method polarity = User_level.Intelligent (* Because is not pedagogic anyway. *) method string_of_devkind = "world_bridge" method dotImg iconsize = let imgDir = Initialization.Path.images in (imgDir^"ico.world_bridge."^(self#string_of_simulated_device_state)^"."^iconsize^".png") method update_world_bridge_with ~name ~label = self_as_node_with_defects#update_with ~name ~label ~port_no:1; (** Create the simulated device *) method private make_simulated_device = ((new Simulation_level_world_bridge.world_bridge ~parent:self ~bridge_name:Global_options.ethernet_socket_bridge_name ~unexpected_death_callback:self#destroy_because_of_unexpected_death ()) :> User_level.node Simulation_level.device) method to_tree = Forest.tree_of_leaf ("world_bridge", [ ("name" , self#get_name ); ("label" , self#get_label); ]) method eval_forest_attribute = function | ("name" , x ) -> self#set_name x | ("label" , x ) -> self#set_label x | _ -> () (* Forward-comp. *) end (* class world_bridge *) end (* module User_level_world_bridge *) (*-----*) WHERE (*-----*) module Simulation_level_world_bridge = struct open Daemon_language (** A World Bridge hub process is just a hub process with exactly two ports, of which the first one is connected to the given host tun/tap interface: *) class world_bridge_hub_process = fun ~tap_name ~unexpected_death_callback () -> object(self) inherit Simulation_level.vde_switch_process ~port_no:2 ~hub:true ~tap_name ~socket_name_prefix:"world_bridge_hub-socket-" ~unexpected_death_callback () as super end class ['parent] world_bridge = fun (* ~id *) ~(parent:'parent) ~bridge_name ~unexpected_death_callback () -> object(self) inherit ['parent] Simulation_level.device ~parent ~hublet_no:1 ~unexpected_death_callback () as super method device_type = "world_bridge" val the_hublet_process = ref None method private get_the_hublet_process = match !the_hublet_process with Some the_hublet_process -> the_hublet_process | None -> failwith "world_bridge: get_the_hublet_process was called when there is no such process" val world_bridge_hub_process = ref None method private get_world_bridge_hub_process = match !world_bridge_hub_process with | Some p -> p | None -> failwith "world_bridge: get_world_bridge_hub_process was called when there is no such process" val world_bridge_tap_name = ref None method private get_world_bridge_tap_name = match !world_bridge_tap_name with | Some t -> t | None -> failwith "world_bridge_tap_name: non existing tap" (** Create the tap via the daemon, and return its name. Fail if a the tap already exists: *) method private make_world_bridge_tap = match !world_bridge_tap_name with None -> let tap_name = let server_response = Daemon_client.ask_the_server (Make (AnySocketTap((Unix.getuid ()), bridge_name))) in (match server_response with | Created (SocketTap(tap_name, _, _)) -> tap_name | _ -> "non-existing-tap") in world_bridge_tap_name := Some tap_name; tap_name | Some _ -> failwith "a tap for the world bridge already exists" method private destroy_world_bridge_tap = (try ignore (Daemon_client.ask_the_server (Destroy (SocketTap(self#get_world_bridge_tap_name, (Unix.getuid ()), bridge_name)))); with e -> begin Log.printf "WARNING: Failed in destroying a host tap for a world bridge: %s\n" (Printexc.to_string e); end); world_bridge_tap_name := None val internal_cable_process = ref None initializer assert ((List.length self#get_hublet_process_list) = 1); the_hublet_process := Some (self#get_hublet_process_of_port 0); world_bridge_hub_process := Some self#make_world_bridge_hub_process method private make_world_bridge_hub_process = new world_bridge_hub_process ~tap_name:self#make_world_bridge_tap ~unexpected_death_callback:self#execute_the_unexpected_death_callback () method spawn_processes = (match !world_bridge_hub_process with | None -> world_bridge_hub_process := Some self#make_world_bridge_hub_process | Some the_world_bridge_hub_process -> ()); (* Spawn the hub process, and wait to be sure it's started: *) self#get_world_bridge_hub_process#spawn; (* Create the internal cable process from the single hublet to the hub, and spawn it: *) let the_internal_cable_process = Simulation_level.make_ethernet_cable_process ~left_end:self#get_world_bridge_hub_process ~right_end:self#get_the_hublet_process ~leftward_defects:(parent#ports_card#get_my_inward_defects_by_index 0) ~rightward_defects:(parent#ports_card#get_my_outward_defects_by_index 0) ~unexpected_death_callback:self#execute_the_unexpected_death_callback () in internal_cable_process := Some the_internal_cable_process; the_internal_cable_process#spawn method terminate_processes = (* Terminate the internal cable process and the hub process: *) (match !internal_cable_process with Some the_internal_cable_process -> Task_runner.do_in_parallel [ (fun () -> the_internal_cable_process#terminate); (fun () -> self#get_world_bridge_hub_process#terminate) ] | None -> assert false); (* Destroy the tap, via the daemon: *) self#destroy_world_bridge_tap; (* Unreference everything: *) internal_cable_process := None; world_bridge_hub_process := None; (** As world bridges are stateless from the point of view of the user, stop/continue aren't distinguishable from terminate/spawn: *) method stop_processes = self#terminate_processes method continue_processes = self#spawn_processes end end (* module Simulation_level_world_bridge *) (** Just for testing: *) let test = Dialog_add_or_update.make marionnet-0.90.6+bzr434.orig/INSTALL0000600000175000017500000001642212167200764015620 0ustar lucaslucasThis file is part of our build system for OCaml projects. Copyright (C) 2008 Luca Saiu This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . These are generic installation instructions, applyable to all the OCaml projects released by Jean-Vincent Loddo and Luca Saiu. Requirements ============ GNU Make and OCamlBuild are always required *for compilation*. Please also see the file "REQUIREMENTS" for the specific build-time and runtime requirements of this particular project. Configuration ============= Configuration is currently manual, but very easy; you need to edit the CONFIGME text file, which is actually a bash script. CONFIGME contains three distinct sections: you can setup: * Configuration time parameters, for example enabling or disabling some features. * Installation parametetrs, for example installation paths. * Default settings which will be copied into /etc/PROJECTNAME; such default settings are overridable by each user by creating a ~/.PROJECTNAME file. A "configure" script is also provided just in order to make the feel of the configuration more "standard", but the script is currently limited to printing a message asking the user to edit CONFIGME. Compilation =========== You can build all the default targets by simply running GNU make, with no parameters; this means just typing make on GNU systems such as GNU/Linux, and possibly gmake on other systems such as BSD. From now on we are going to assume that GNU Make is installed as "make". Programs and libraries are always created in the "_build/" subdirectory. Make should print "Success" at the end of the compilation process if all goes well. Some other useful targets are "programs", "libraries" and "data", which build only programs, only libraries, or only machine-generated data, respectively. Potential parallelism in building is currently not exploited. Installation and uninstallation =============================== Installation and uninstallation are very easy, if you have correctly setup paths in the configuration phase. Installation ------------ In order to install the package on your system (in the pathnames you have specified at configuration time) just build the target "install". On GNU systems this means typing make install . Note that, at least as of now, only a single version at the time can be installed for each package. Uninstallation -------------- If you have already installed your package but you want to remove it, then build the target "uninstall" by typing make uninstall . Note that you need to have the same CONFIGME you have used when you configured the package for installation: CONFIGME contains the path information, which is obviously required also at uninstallation time. OCamlDoc source documentation ============================= You can generate OCamlDoc source documentation in HTML format by building the target "ocamldoc". Note that the OCamlDoc settings are not the default ones supported by OCamlBuild, and in particular they include module implementations, and not only their signatures. Documentation is generated in the directory _build/PROJECTNAME.docdir/ . Making tarballs =============== The build system includes some features to generate source and binary tarballs in a very convenient way; this is particularly useful when you have downloaded a snapshot of the package from a revision-control system such as CVS or darcs, and you want to distribute an easy-to-use tarball to other users. Source tarballs --------------- You can generate a source gzipped tarball with a suitable name is by building the "dist" target: make dist Notice that the tarball is actually generated in the "_build/" directory. Binary tarballs --------------- Binary tarballs don't contain sources, but are installable and uninstallable by building the appropriate Make target after decompression. Their file name also includes the operating system and hardware architecture name. You can generate a binary tarball by building the "dist-binary" target: make dist-binary The tarball is generated in "_build/". An important reminder about binary tarballs ------------------------------------------- There shouldn't be any need to remind you of this, but just to play it safe: remember that the GPL requires you to *ALSO DISTRIBUTE SOURCES* if you distribute binaries. Hence, if you make a binary tarball available, then you should also publish a source tarball in the same place (this is the simplest alternative; another possibility is to provide a *written* offer, valid for at least three years, to also supply the sources at no additional charge; see the GPL text for all the details). How this system works ===================== This system uses a combination of GNU Make and OCamlBuild to create targets: OCamlBuild is only used for automatic dependency tracking, which is by itself a quite complex job. Its configuration is customized by a _tags file and a plugin, myocamlbuild.ml: *both* files are automatically generated from the information present int META (which includes the package name, version string, and the like), from the CONFIGME file, and from the results of build-time analyes of the source directories. We conceptually always work on a *flat directory structure*, in which any file can refer any other -- unless there are circular dependencies: this is a current, quite unfortunate limitation of OCaml. Notice that different Makefiles for each directory are *NOT* required, nor supported. See the section "An alternative Approach to subdirectories" in the AutoMake manual for justifications of this idea. The build system logic is independent from the particular project and is implemented in the main "Makefile". Despite such Makefile being quite readable and well-commented, its behavior is not completely trivial, requiring some minor GNU Make and Bash magic. For each project a Makefile.local file (included by the main Makefile) defines some variables such as PROGRAMS and LIBRARIES, and optionally provides rules to build automatically generated sources. Makefile.local can extend the behavior of most targets by defining "-local" targets. For each library provided by the project (of course they may be zero) an ".mllib" file is provided listing the OCaml modules (*modules*, not file names) to be included. When generation of OCamlDoc source documentation is desired, a "PROJECTNAME.odocl" file is provided, again containing a list of OCaml modules. Please see the Makefile for more details. Bug reporting, suggestions and discussions ========================================== Bugs in this build system should be reported by using the Savane interface at https://savane.marionnet.org/projects/marionnet or to the public mailing list marionnet-dev@marionnet.org . The mailing list can also be used for general discussions about the build system. We welcome feedback. marionnet-0.90.6+bzr434.orig/motherboard_builder.ml0000600000175000017500000002074612167200764021141 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2009, 2010 Jean-Vincent Loddo Copyright (C) 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** Gui reactive system. *) open Gettext;; #load "include_type_definitions_p4.cmo" ;; INCLUDE DEFINITIONS "motherboard_builder.mli" ;; #load "chip_parser_p4.cmo" ;; module Make (S : sig val st:State.globalState end) = struct open S let w = st#mainwin let system = st#system (* Main window title manager *) chip main_window_title_manager : (project_filename) -> () = let title = match project_filename with | None -> Initialization.window_title | Some filename -> (Initialization.window_title ^ " - " ^ filename) in w#window_MARIONNET#set_title title let main_window_title_manager = new main_window_title_manager ~name:"main_window_title_manager" ~project_filename:st#project_filename ();; (* Sensitiveness manager *) chip sensitiveness_manager : ( app_state, wa:(GObj.widget list), wr:(GObj.widget list), wn:(GObj.widget list)) -> () = let print_log () = Log.printf "sensitiveness_manager: the project is in the state: %s #wa=%d #wr=%d #wn=%d\n" st#app_state_as_string (List.length wa) (List.length wr) (List.length wn) in (match app_state with | State.NoActiveProject -> print_log (); List.iter (fun x->x#misc#set_sensitive false) (wa@wr) ; List.iter (fun x->x#misc#set_sensitive true) wn; | State.ActiveNotRunnableProject -> print_log (); List.iter (fun x->x#misc#set_sensitive true) wa ; List.iter (fun x->x#misc#set_sensitive false) (wr@wn); | State.ActiveRunnableProject -> print_log (); List.iter (fun x->x#misc#set_sensitive true) (wa@wr) ; List.iter (fun x->x#misc#set_sensitive false) wn; ) let sensitiveness_manager = new sensitiveness_manager ~name:"sensitiveness_manager" ~app_state:st#app_state ~wa:st#sensitive_when_Active#coerce ~wr:st#sensitive_when_Runnable#coerce ~wn:st#sensitive_when_NoActive#coerce () ;; (* Dot tuning manager. Is a toggling chip of arity 6. *) chip dot_tuning_manager : (iconsize : string , rankdir : string , curved_lines : bool , shuffler : int list, nodesep : float , labeldistance : float , extrasize : float , reversed_list : (int * bool) list ) -> (y) = () ;; let refresh_sketch_counter = st#refresh_sketch_counter let reversed_rj45cables_cable = Chip.cable ~name:"reversed_rj45cables_cable" () let dot_tuning_manager = let d = st#network#dotoptions in new dot_tuning_manager ~name:"dot_tuning_manager" ~iconsize:d#iconsize ~rankdir:d#rankdir ~curved_lines:d#curved_lines#as_wire ~shuffler:d#shuffler ~nodesep:d#nodesep ~labeldistance:d#labeldistance ~extrasize:d#extrasize ~reversed_list:(reversed_rj45cables_cable :> (int * bool, (int * bool) list) Chip.wire) ~y:refresh_sketch_counter () chip sketch_refresher : (app_state, x:int) -> () = (* Do not refresh if there isn't an active project. This is not correct in general. FIX IT *) if (app_state <> State.NoActiveProject) then begin self#tracing#message "refreshing..."; (* Similar to State.globalState#refresh_sketch but without locking sketch. *) let fs = st#dotSketchFile in let ft = st#pngSketchFile in try begin let ch = open_out fs in output_string ch (st#network#dotTrad ()); close_out ch; let command_line = let splines = string_of_bool (st#network#dotoptions#curved_lines#get) in Printf.sprintf "dot -Gsplines=%s -Efontname=FreeSans -Nfontname=FreeSans -Tpng -o %s %s" splines ft fs in self#tracing#message "The dot command line is"; self#tracing#message command_line; let exit_code = Sys.command command_line in self#tracing#message (Printf.sprintf "dot exited with exit code %i" exit_code); st#mainwin#sketch#set_file st#pngSketchFile ; (if not (exit_code = 0) then Simple_dialogs.error (s_ "dot failed") (Printf.sprintf (f_ "Invoking dot failed. Did you install graphviz?\n\ The command line is\n%s\nand the exit code is %i.\n\ Marionnet will work, but you will not see the network graph picture until you fix the problem.\n\ There is no need to restart the application.") command_line exit_code) ()); end with e -> (Log.printf "Warning: exception raised in sketch_refresher:\n%s\nIgnoring.\n" (Printexc.to_string e)) end let sketch_refresher = new sketch_refresher ~name:"sketch_refresher" ~app_state:st#app_state ~x:refresh_sketch_counter () (* Debugging: press F2 for printing the list of current components to stderr. *) let _ = st#mainwin#toplevel#event#connect#key_press ~callback: (fun k -> (if GdkEvent.Key.keyval k = GdkKeysyms._F2 then system#show_component_list ()); false) (* Debugging: press F3 to display the dot representation of the motherboard. *) let _ = let display () = begin let fs = "/tmp/gui_motherboard.dot" in let ft = "/tmp/gui_motherboard.png" in let ch = open_out fs in output_string ch (system#to_dot); close_out ch; ignore (Sys.command ("dot -Tpng -o "^ft^" "^fs^" && display "^ft^" &")) end in st#mainwin#toplevel#event#connect#key_press ~callback: (fun k -> (if GdkEvent.Key.keyval k = GdkKeysyms._F3 then display ()); false) (* Debugging: press F5 for immediately exiting the gtk main loop (only in the toplevel) *) let _ = if List.mem (Array.get Sys.argv 0) ["/tmp/marionnet-toplevel"; "/tmp/marionnet-utop"] then let stars = "*************************************" in Printf.kfprintf flush stdout "%s\nPress F5 to switch to the toplevel.\n%s\n\n" stars stars; ignore (st#mainwin#toplevel#event#connect#key_press ~callback:(fun k -> (match (GdkEvent.Key.keyval k) = GdkKeysyms._F5 with | true -> Printf.kfprintf flush stdout "%s\nYou are now in the toplevel.\nType:\nGMain.Main.main ();;\nto come back to the Marionnet window.\n%s\n\n" stars stars; GtkMain.Main.quit () | false -> () ); false)) else () chip treeview_filenames : (pwd:string option, prn:string option) -> (h,i,d,t,d1,d2,d3,d4) = match pwd, prn with | (Some pwd), (Some prn) -> let prefix = FilenameExtra.concat_list [pwd; prn] in let concat = Filename.concat in let dir = Some (concat prefix "states/") in let h = Some (concat prefix "states/states-forest") in let i = Some (concat prefix "states/ports") in let d = Some (concat prefix "states/defects") in let t = Some (concat prefix "states/texts") in (h,i,d,t,dir,dir,dir,dir) | _,_ -> (None, None, None, None, None, None, None, None) ;; let () = let m = object method reversed_rj45cables_cable = reversed_rj45cables_cable method project_working_directory = Option.extract st#project_working_directory#get end in Motherboard.set m ;; (* Must be called only when treeview are made: *) let set_treeview_filenames_invariant () = let _ = new treeview_filenames ~pwd:st#project_working_directory ~prn:st#project_name ~h:st#treeview#history#filename ~i:st#treeview#ifconfig#filename ~d:st#treeview#defects#filename ~t:st#treeview#documents#filename ~d1:st#treeview#history#directory ~d2:st#treeview#ifconfig#directory ~d3:st#treeview#defects#directory ~d4:st#treeview#documents#directory () in () ;; (* let pippo = WGButton.button ~name:"button_pippo" system ~label:"PIPPO" ~packing:(st#mainwin#hbuttonbox_BASE#pack) () chip f_class : (x:int) -> (y) = () ;; let f = new f_class ~x:pippo#wire#enter ~y:refresh_sketch_counter ()*) end marionnet-0.90.6+bzr434.orig/splash.ml0000600000175000017500000000754212167200764016416 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2007, 2008, 2009 Luca Saiu Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2007, 2008, 2009, 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) open Gettext;; (* span foreground="red" *) let text_title = Printf.sprintf "%s" (s_ "Marionnet, a virtual network laboratory") ;; let text_subtitle = match Initialization.released with | true -> "Version " ^ Initialization.user_intelligible_version ^ " - " ^ Meta.source_date_utc_yy_mm_dd ^ "" | false -> "Version " ^ Initialization.user_intelligible_version ^ " - " ^ Meta.source_date ^ "" ;; let text = "Copyright (C) 2007-2012 Jean-Vincent Loddo Copyright (C) 2007-2012 Luca Saiu Copyright (C) 2007-2012 Université Paris 13 Marionnet comes with absolutely no warranty. This is free software, covered by the GNU GPL. You are welcome to redistribute it under certain conditions; see the file `COPYING' for details.";; let handle_click window _ = Log.printf "handle_click: the splash screen was closed\n"; window#misc#hide (); window#destroy (); true;; let splash_image = GDraw.pixmap_from_xpm ~file:(Initialization.Path.images^"splash.300x348.xpm") ();; let splash = GWindow.window ~resizable:false ~border_width:10 ~position:`CENTER ~type_hint:`DIALOG ~modal:true ~wm_name:"Marionnet splash screen" ~icon:Icon.icon_pixbuf ();; splash#set_title (s_ "Welcome to Marionnet");; let event_box = GBin.event_box ~packing:splash#add () in let box = GPack.vbox ~spacing:5 ~border_width:2 ~packing:event_box#add () in let _image = GMisc.pixmap splash_image ~packing:(box#pack ~padding:3) () in let _title = let align = GBin.alignment ~xalign:1. ~packing:box#add () in let table = GPack.table ~rows:2 ~columns:1 ~row_spacings:0 ~homogeneous:false ~packing:(align#add) () in let attach = table#attach ~expand:`X ~fill:`BOTH ~left:0 in let _ = GMisc.label ~markup:text_title ~packing:(attach ~top:0) ~xalign:0.5 ~line_wrap:false () in let _ = GMisc.label ~markup:text_subtitle ~packing:(attach ~top:1) ~xalign:0.5 ~line_wrap:false () in () in let _ = GMisc.label ~markup:text ~packing:box#add ~line_wrap:false () in let table = GPack.table ~rows:1 ~columns:3 ~col_spacings:20 ~homogeneous:true ~packing:box#add () in let _logo_paris13 = GMisc.image ~file:(Initialization.Path.images^"logo.paris13.96x96.png") ~xalign:0.5 ~packing:(table#attach ~left:0 ~top:0) () in let _logo_iutv = GMisc.image ~file:(Initialization.Path.images^"logo.iutv.96x96.png") ~xalign:0.5 ~packing:(table#attach ~left:1 ~top:0) () in let _logo_lipn = GMisc.image ~file:(Initialization.Path.images^"logo.lipn.96x96.png") ~xalign:0.5 ~packing:(table#attach ~left:2 ~top:0) () in let _ = event_box#event#connect#button_press ~callback:(handle_click splash) in let _ = splash#event#connect#key_press ~callback:(fun ev -> handle_click splash ()) in () ;; let show_splash ?timeout () = (match timeout with Some timeout -> ignore (GMain.Timeout.add ~ms:timeout ~callback:(fun () -> ignore (handle_click splash ()); false)) | None -> ()); splash#show ();; marionnet-0.90.6+bzr434.orig/x.mli0000600000175000017500000000205412167200764015535 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2011 Jean-Vincent Loddo Copyright (C) 2011 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) (** Parts of the environment variable DISPLAY. *) (* The syntax of $DISPLAY is: [host]:display[.screen] *) val host : string (* "localhost" by default *) val display : string val screen : string (* "0" by default *) val get_unused_local_display : unit -> string marionnet-0.90.6+bzr434.orig/CONFIGME0000600000175000017500000000703412167200764015700 0ustar lucaslucas# This -*- sh -*- script is part of our reusable OCaml BRICKS library # Copyright (C) 2008 2011 Luca Saiu # Copyright (C) 2008 2012 Jean-Vincent Loddo # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . ########################################################################### ########################################################################### # This file should be hand-edited at configuration time, before compiling. ########################################################################### ########################################################################### ########################################################################### # Section 1: Configuration choices ########################################################################### # (this section is empty for ocamlbricks). ########################################################################### # Section 2: Installation setup: prefixes, and the like ########################################################################### # Installation prefix, for example /usr or /usr/local # *No* trailing slash should be included. prefix=/usr/local # Prefix for host-wide configuration files; you should probably keep the # default setting: configurationprefix=/etc # Prefix for the locale files localeprefix=${prefix}/share/locale # Prefix for documentation files; you should probably keep the # default setting: documentationprefix=${prefix}/share/doc # Location of the standard Ocaml libraries required to compile # and link the project. # *No* trailing slash should be included. ocaml_libraryprefix=$(ocamlc -where || exit -1) # #ocaml_libraryprefix=/mystrangepath # Installation prefix for OCaml libraries built by the project. # By default they will be installed into ${ocaml_libraryprefix}, but you # can change it if you really want to install into a different, custom prefix. # *No* trailing slash should be included. libraryprefix=${ocaml_libraryprefix} # # This definition may be appropriate for debian packaging: #libraryprefix=debian/tmp/${ocaml_libraryprefix} # This should be defined as the absolute path to a directory containing # the already configured OCaml source; in alternative, is your GNU/Linux # distribution packages OCaml headers (debian and its offspring install # headers in /usr/include/caml), you can set this to the full path of # the directory containing OCaml headers. ocaml_sources=${ocaml_libraryprefix}/caml # # This definition is appropriate for debian-like distributions: #ocaml_sources=/usr/include/caml # # This is reasonable if you have downloaded and configured the OCaml # sources yourself, somewhere: #ocaml_sources=/home/luca/projects-by-others/ocaml-3.11.2 ########################################################################### # Section 3: Default configuration. This will end up in /etc/$name at # installation time, providing the default host configuration for this # package. Individual users can still override defaults by defining their # own ~/.$name customization file. marionnet-0.90.6+bzr434.orig/gettext.mli0000600000175000017500000000160612167200764016754 0ustar lucaslucas(* This file is part of Marionnet, a virtual network laboratory Copyright (C) 2010 Jean-Vincent Loddo Copyright (C) 2010 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *) val s_ : string -> string val f_ : ('a, 'b, 'c) format -> ('a, 'b, 'c) format val localeprefix : string marionnet-0.90.6+bzr434.orig/COPYING0000600000175000017500000004311012167200764015614 0ustar lucaslucas GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. marionnet-0.90.6+bzr434.orig/share/0000700000175000017500000000000012167200764015662 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/share/README.id_rsa_marionnet0000600000175000017500000000056412167200764022065 0ustar lucaslucasExample of how to exploit the key `id_rsa_marionnet' ---------------------------------------------------- m1# /etc/init.d/sshd start host# route ... 172.23.0.1 * 255.255.255.255 UH 0 0 0 tap677104 ... host# ssh -i id_rsa_marionnet student@172.23.0.1 host# ssh -i id_rsa_marionnet root@172.23.0.1 host# scp -i id_rsa_marionnet root@172.23.0.1: marionnet-0.90.6+bzr434.orig/share/filesystems/0000700000175000017500000000000012167200764020231 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/share/filesystems/machine-pinocchio-14787.conf0000600000175000017500000002161012167200764025147 0ustar lucaslucas# Marionnet filesystem's configuration file. # The full Bash syntax may be used. # The output of the command `md5sum' on the filesystem: MD5SUM=1899ad5902a9491bb6f7e642e3352426 # The output (first field) of the command `sum' on the filesystem: SUM=14787 # The creator of the filesystem: AUTHOR="Jonathan Roudiere" # The creation date: DATE=2008 # The modification time (MTIME). Because of a user-mode-linux's protection # mechanism, this setting is very important for sharing marionnet's projects # between different installations. For instance, if you open on your laptop # a project created at the university, the involved filesystems must be the # same, of course, but they must also have exactly the same MTIME. # # Thus, it's a good idea to run this post-installation command: # # sudo touch -d $(date -d "@$MTIME") $FILESYSTEM # # where $MTIME is the value indicated below, and $FILESYSTEM is the location # of the filesystem image on your disk. # # On the other hand, if you are providing a new filesystem, you can set this # variable (once your filesystem is completely finished and stable) simply # running the command: # # stat -c "%Y" $FILESYSTEM # MTIME=1291054770 # Supported kernel(s) with their console-related parameters (according to the # content of /etc/inittab). The variable SUPPORTED_KERNELS may contain a list # of statements of the form: # # KERNEL [PARAMS] [KERNEL [PARAMS]].. # # where # # KERNEL ::= "[" EPITHET "]" # | "/" REGEXP "/" # # PARAMS is a string # EPITHET # is the suffix (the substring after "linux-") of an available # kernel in a "kernels/" directory # REGEXP is a regular expression (possibly denoting some epithets) # # Several statements KERNEL [PARAMS] may be specified. Note that if you are # using the += assignment operator to catenate statements, please dont forget # the blank character to separe words (example: SUPPORTED_KERNELS+=" ..."). # # Examples: # SUPPORTED_KERNELS='[2.6.18-ghost] con=none ssl=xterm console=ttyS0' # SUPPORTED_KERNELS+=' /3[.]2[.]..*/ con0=xterm' # SUPPORTED_KERNELS='[2.6.18-ghost] con=none ssl=xterm console=ttyS0' # X11 compliance. The possible (multiple) choices are "xhosted" and "xnested". # The value "none" is equivalent to leave this variable empty, which means # that the filesystem doesn't have the support to display X programs. # # Examples: # X11_SUPPORT+="xhosted" # X11_SUPPORT+="xnested" # X11_SUPPORT="none" # X11_SUPPORT="none" # Minimum size in Mb of RAM to allocate to this virtual machine. # For machines with graphical programs it may be suitable to set # at least 48 Mb of RAM. MEMORY_MIN_SIZE=24 # Default value proposed to the user in the machine's dialogs. MEMORY_SUGGESTED_SIZE=32 # Support for multiple consoles. MULTIPLE_CONSOLES_SUPPORT=false # Sorted list of available binaries. BINARY_LIST='addgroup adduser adjtimex ar arp arpd arping ash attr authdaemond authenumerate authpasswd authtest awk badblocks basename bash bashbug bbconfig bc berkeley_db_svc blkid bootlogd brctl bunzip2 bunzip2 busybox bzcat bzcmp bzdiff bzegrep bzfgrep bzgrep bzip2 bzip2recover bzless bzmore c_rehash cal captoinfo cat catv certtool chacl chage chat chattr chattr chfn chgpasswd chgrp chmod chown chpasswd chpst chroot chrt chsh chvt cksum clear cmp comm comp_err courier-config courierauthconfig courierldapaliasd courierlogger couriertcpd couriertls cp cpio crond crontab cryptpw ctstat cttyhack cut date db_archive db_checkpoint db_deadlock db_dump db_hotbackup db_load db_printlog db_recover db_stat db_upgrade db_verify dbclient dbilogstrip dbiprof dbiproxy dc dd deallocvt delgroup deliverquota deluser depmod df dhclient dhclient-script dhcpcd dhcpd dhcrelay diff dig dirname dmesg dnsd dnsdomainname dnssec-keygen dnssec-signzone domainname dos2unix dpkg dpkg-deb dropbear dropbearconvert dropbearkey du dumpe2fs dumpkmap dumpleases e2fsck e2image e2label echo ed egrep eject enable_ssl.sh env envdir envuidgid ether-wake ettercap etterfilter etterlog expand expiry exportfs expr faillog fakeidentd false fbset fdflush fdformat fdisk fetchmail fgrep file filefrag find find findfs fold free freeramdisk fsck fsck.ext2 fsck.ext3 fsck.minix ftp ftp.krb5 ftpcount ftpd ftpd.krb5 ftpdctl ftpget ftpput ftpshut ftptop ftpwho fuser gawk genl getent getfacl getfattr getopt getty ghostify gnutls-cli gnutls-cli-debug gnutls-serv gpasswd gpg-error grep groupadd groupdel groupmems groupmod groups grpck grpconv grpunconv gss-client gss-server gss_clnt_send_err gss_destroy_creds gunzip gzexe gzip halt hd hdparm head hexdump host hostid hostname htop hwclock id ifcfg ifconfig ifdown ifenslave ifstat ifup igawk imapd imapd imapd-ssl in.proftpd inetd infocmp infotocap init innochecksum insmod install ip ip6tables ipaddr ipcalc ipcrm ipcs iplink ipmaddr iproute iprule iptables iptables-restore iptables-save iptables-xml iptunnel iptunnel itox k5srvutil kadmin kadmin.local kadmind kbd_mode kdb5_ldap_util kdb5_util kdestroy kill killall killall killall5 kinit klist klogd klogd klogind kpasswd kprop kpropd krb5-config krb5-send-pr krb524d krb524init krb5kdc kshd ksu ktutil kvno last lastb lastlog ldapadd ldapcompare ldapdelete ldapexop ldapmodify ldapmodrdn ldappasswd ldapsearch ldapwhoami length less lighttpd lighttpd-angel links linux32 linux64 ln lnstat loadfont loadkmap locale locale-gen localedef locate logger login login.debian login.krb5 login.krb5 login.shadow logname logoutd logread logsave losetup lpd lpq lpr ls lsattr lsattr lsmod lsmod lwresd lzmacat mailbot maildiracl maildirkw maildirmake maildrop mailq makedat makedevs makemime makeuserdb marionnet_grab_config md5sum mdev mesg microcom mii-tool mkdevs.sh mkdir mke2fs mkfifo mkfs.ext2 mkfs.ext3 mkfs.minix mkimapdcert mklost+found mknod mkpasswd mkpop3dcert mkswap mktemp modinfo modprobe more mount mount.nfs mount.nfs4 mountpoint msql2mysql mt mv my_print_defaults myisam_ftdump myisamchk myisamlog myisampack mysql mysql_client_test mysql_config mysql_convert_table_format mysql_create_system_tables mysql_explain_log mysql_find_rows mysql_fix_extensions mysql_fix_privilege_tables mysql_install_db mysql_secure_installation mysql_setpermission mysql_tableinfo mysql_tzinfo_to_sql mysql_upgrade mysql_upgrade_shell mysql_waitpid mysql_zap mysqlaccess mysqladmin mysqlbinlog mysqlbug mysqlcheck mysqld mysqld_multi mysqld_safe mysqldump mysqldumpslow mysqlhotcopy mysqlimport mysqlmanager mysqlshow mysqltest mysqltestmanager mysqltestmanager-pwgen mysqltestmanagerc named named-checkconf named-checkzone named-compilezone nameif nano nast nc ncurses5-config netstat newaliases newgrp newusers nfsstat nice nisdomainname nmap nmeter nohup nologin nscd nscd_nischeck nslookup nstat nsupdate ntp-keygen ntp-wait ntpd ntpdate ntpdc ntpq ntptime ntptrace od oldfuser omshell openssl openvt pam_tally passwd passwd.old patch pcre-config pcregrep pcretest peekfd perl perl5.8.8 perror pgawk pgrep pidof ping ping.orig ping6 ping6 pipe_progress pivot_root pkill plipconfig pluginviewer pmap pmap_dump pmap_set pop3d pop3d-ssl portmap postalias postcat postconf postdrop postfix postkick postlock postlog postmap postqueue postsuper poweroff prename printenv printf proftpd proftpdshell ps pscan psed psktool pstree pstree.x11 pw2userdb pwcheck pwck pwconv pwd pwdx pwunconv raidautorun rarp rcp rcp.krb5 rdate readahead readlink readprofile realpath reboot recup_para.sh reformail reformime renice replace reset resize resize2fs resolve_stack_dump resolveip retawq rlogin rlogin.krb5 rm rmdir rmmod rmt rnano rndc rndc-confgen route routef routel rpc.gssd rpc.idmapd rpc.mountd rpc.nfsd rpc.statd rpc.svcgssd rpcdebug rpcinfo rpm rpm2cpio rsh rsh.krb5 rtacct rtmon rtpr rtstat run-parts runlevel runsv runsvdir rx safe_finger saslauthd sasldblistusers2 saslpasswd2 sclient scp script sed sendmail sendmail seq setarch setconsole setfacl setfattr setkeycodes setlogcons setsid setuidgid sg sh sha1sum sharedindexinstall sharedindexsplit showmount shutdown sim_client sim_server skill slabtop slapacl slapadd slapauth slapcat slapd slapdn slapindex slappasswd slaptest slattach sleep slurpd sm-notify snice sntp softlimit sort spawn-fcgi sperl5.8.8 split sqlite3 srptool ss sserver ssh start-statd start-stop-daemon stat strace strings stty su suidperl sulogin sum sv svlogd swapoff swapon switch_root sync sysctl syslogd tac tack tail talk tar taskset tc tclsh tclsh8.4 tcpd tcpdchk tcpdmatch tcpdump tcpsvd tee telinit telnet telnet.krb5 telnetd telnetd.krb5 test testmxlookup testsaslauthd tftp tftpd tic tickadj time tload toe top touch tput tr traceroute true try-from tset tty ttysize tune2fs udhcpc udhcpd udpsvd umount umount.nfs umount.nfs4 uname uncompress unexpand unghostify uniq unix2dos unix_chkpwd unix_update unlzma unzip updatedb uptime useradd userdb userdb-test-cram-md5 userdbpw userdel usermod usleep utmpdump uuclient uudecode uuencode uuidgen uuserver v4rcp vconfig vi vim vim.basic vlock vmstat vtysh vtysh w wall watch watch watchdog wc wget which who whoami whois xargs xinetd yes ypdomainname zcat zcip zcmp zdiff zegrep zfgrep zforce zgrep zless zmore znew' marionnet-0.90.6+bzr434.orig/share/filesystems/machine-template.relay0000600000175000017500000000142612167200764024511 0ustar lucaslucas# This script will be copied into the guest directory /mnt/hostfs/ when # a virtual machine will be started by marionnet. In this way, it will # be sourced as final step of the script `/etc/init.d/marionnet_relay' # during the virtual machine bootstrap process. # # Note that this hook mecanism is running only for virtual machines # built after July 2013. Indeed, for older machines, the script # `marionnet_relay' (or `marionnet_prepare_startup') doesn't take # care of files ending with the suffix ".relay" in the directory /mnt/hostfs/. # Example # ------- # Create /dev/tty12 and launch the daemon `syslogd' (busybox version) # on this console: # # [[ -e /dev/tty12 ]] || mknod /dev/tty12 c 4 12 # chown -v root:tty /dev/tty12 # syslogd -O /dev/tty12 # # J.V. Loddo - July 2013. marionnet-0.90.6+bzr434.orig/share/filesystems/machine-template.conf0000600000175000017500000000552712167200764024330 0ustar lucaslucas# Marionnet filesystem's configuration file. # The full Bash syntax may be used here. # # Some assignments used in this template are kept # from our old machine-pinocchio-14787 # The output of the command `md5sum' on the filesystem: MD5SUM=1899ad5902a9491bb6f7e642e3352426 # The output (first field) of the command `sum' on the filesystem: SUM=14787 # The creator of the filesystem: AUTHOR="Jonathan Roudiere" # The creation date: DATE=2008 # The modification time (MTIME). Because of a user-mode-linux's protection # mechanism, this setting is very important for sharing marionnet's projects # between different installations. For instance, if you open on your laptop # a project created at the university, the involved filesystems must be the # same, of course, but they must also have exactly the same MTIME. # # Thus, it's a good idea to run this post-installation command: # # sudo touch -d $(date -d "@$MTIME") $FILESYSTEM # # where $MTIME is the value indicated below, and $FILESYSTEM is the location # of the filesystem image on your disk. # # On the other hand, if you are providing a new filesystem, you can set this # variable (once your filesystem is completely finished and stable) simply # running the command: # # stat -c "%Y" $FILESYSTEM # MTIME=1291054770 # Supported kernel(s) with their console-related parameters (according to the # content of /etc/inittab). The variable SUPPORTED_KERNELS may contain a list # of statements of the form: # # KERNEL [PARAMS] [KERNEL [PARAMS]].. # # where # # KERNEL ::= "[" EPITHET "]" # | "/" REGEXP "/" # # PARAMS is a string # EPITHET # is the suffix (the substring after "linux-") of an available # kernel in a "kernels/" directory # REGEXP is a regular expression (possibly denoting some epithets) # # Several statements KERNEL [PARAMS] may be specified. Note that if you are # using the += assignment operator to catenate statements, please dont forget # the blank character to separe words (example: SUPPORTED_KERNELS+=" ..."). # # Examples: # SUPPORTED_KERNELS='[2.6.18-ghost] con=none ssl=xterm console=ttyS0' # SUPPORTED_KERNELS+=' /3[.]2[.]..*/ con0=xterm' # SUPPORTED_KERNELS='/3.2.44/' # X11 compliance. The possible (multiple) choices are "xhosted" and "xnested". # The value "none" is equivalent to leave this variable empty, which means # that the filesystem doesn't have the support to display X programs. # # Examples: # X11_SUPPORT+="xhosted" # X11_SUPPORT+="xnested" # X11_SUPPORT="none" # X11_SUPPORT="none" # Minimum size in Mb of RAM to allocate to this virtual machine. # For machines with graphical programs it may be suitable to set # at least 48 Mb of RAM. MEMORY_MIN_SIZE=24 # Default value proposed to the user in the machine's dialogs. MEMORY_SUGGESTED_SIZE=48 # Support for multiple consoles. MULTIPLE_CONSOLES_SUPPORT=true # Sorted list of available binaries. BINARY_LIST="" marionnet-0.90.6+bzr434.orig/share/filesystems/router-pinocchio-09157.conf0000600000175000017500000001322412167200764025060 0ustar lucaslucas# Marionnet filesystem's configuration file. # The full Bash syntax may be used. # The output of the command `md5sum' on the filesystem: MD5SUM=d366c44d9b96fc52149cff0f4b90a0d6 # The output (first field) of the command `sum' on the filesystem: SUM=09157 # The creator of the filesystem: AUTHOR="Jonathan Roudiere" # The creation date: DATE=2008 # The modification time (MTIME). Because of a user-mode-linux's protection # mechanism, this setting is very important for sharing marionnet's projects # between different installations. For instance, if you open on your laptop # a project created at the university, the involved filesystems must be the # same, of course, but they must also have exactly the same MTIME. # # Thus, it's a good idea to run this post-installation command: # # sudo touch -d $(date -d "@$MTIME") $FILESYSTEM # # where $MTIME is the value indicated below, and $FILESYSTEM is the location # of the filesystem image on your disk. # # On the other hand, if you are providing a new filesystem, you can set this # variable (once your filesystem is completely finished and stable) simply # running the command: # # stat -c "%Y" $FILESYSTEM # MTIME=1291054558 # Supported kernel(s) with their console-related parameters (according to the # content of /etc/inittab). The variable SUPPORTED_KERNELS may contain a list # of statements of the form: # # KERNEL [PARAMS] [KERNEL [PARAMS]].. # # where # # KERNEL ::= "[" EPITHET "]" # | "/" REGEXP "/" # # PARAMS is a string # EPITHET # is the suffix (the substring after "linux-") of an available # kernel in a "kernels/" directory # REGEXP is a regular expression (possibly denoting some epithets) # # Several statements KERNEL [PARAMS] may be specified. Note that if you are # using the += assignment operator to catenate statements, please dont forget # the blank character to separe words (example: SUPPORTED_KERNELS+=" ..."). # # Examples: # SUPPORTED_KERNELS='[2.6.18-ghost] con=none ssl=xterm console=ttyS0' # SUPPORTED_KERNELS+=' /3[.]2[.]..*/ con0=xterm' # SUPPORTED_KERNELS='[2.6.18-ghost]' # X11 compliance. The possible (multiple) choices are "xhosted" and "xnested". # The value "none" is equivalent to leave this variable empty, which means # that the filesystem doesn't have the support to display X programs. # # Examples: # X11_SUPPORT+="xhosted" # X11_SUPPORT+="xnested" # X11_SUPPORT="none" # X11_SUPPORT="none" # Minimum size in Mb of RAM to allocate to this virtual machine. # For machines with graphical programs it may be suitable to set # at least 48 Mb of RAM. MEMORY_MIN_SIZE=24 # Default value proposed to the user in the machine's dialogs. MEMORY_SUGGESTED_SIZE=32 # Support for multiple consoles. MULTIPLE_CONSOLES_SUPPORT=false BINARY_LIST='addgroup adduser adjtimex ar arp arpd arping ash attr awk badblocks basename bash bashbug bbconfig bc blkid bootlogd brctl bunzip2 bunzip2 busybox bzcat bzcmp bzdiff bzegrep bzfgrep bzgrep bzip2 bzip2recover bzless bzmore c_rehash cal captoinfo cat catv chacl chat chattr chattr chgrp chmod chown chpasswd chpst chroot chrt chvt cksum clear cmp comm cp cpio crond crontab cryptpw ctstat cttyhack cut date dbclient dc dd deallocvt delgroup deluser depmod df dhcprelay diff dirname dmesg dnsd dos2unix dpkg dpkg-deb dropbear dropbearconvert dropbearkey du dumpe2fs dumpkmap dumpleases e2fsck e2image e2label echo ed egrep eject env envdir envuidgid ether-wake expand expr fakeidentd false fbset fdflush fdformat fdisk fetchmail fgrep file filefrag find find findfs fold free freeramdisk fsck fsck.ext2 fsck.ext3 fsck.minix ftp ftpget ftpput fuser gawk genl getfacl getfattr getopt getty ghostify grep gunzip gzexe gzip halt hd hdparm head hexdump hostid hostname htop httpd hwclock id ifcfg ifconfig ifdown ifenslave ifstat ifup igawk inetd infocmp infotocap init insmod install ip ip6tables ipaddr ipcalc ipcrm ipcs iplink iproute iprule iptables iptables-restore iptables-save iptables-xml iptunnel kbd_mode kill killall killall5 klogd klogd last lastb length less lighttpd lighttpd-angel links linux32 linux64 ln lnstat loadfont loadkmap locale localedef locate logger login logname logread logsave losetup lpd lpq lpr ls lsattr lsattr lsmod lsmod lzmacat makedevs marionnet_grab_config md5sum mdev mesg microcom microperl mkdevs.sh mkdir mke2fs mkfifo mkfs.ext2 mkfs.ext3 mkfs.minix mklost+found mknod mkpasswd mkswap mktemp modinfo modprobe more mount mountpoint mt mv nameif nano nc ncurses5-config netstat nice nmap nmeter nohup nslookup nstat od openssl openvt pam_tally passwd patch pcre-config pcregrep pcretest perl pgawk pgrep pidof ping ping6 ping6 pipe_progress pivot_root pkill pmap poweroff printenv printf ps pscan pwd pwdx raidautorun rcp rdate readahead readlink readprofile realpath reboot renice reset resize resize2fs retawq rlogin rm rmdir rmmod rmt rnano route routef routel rpm rpm2cpio rsh rtacct rtmon rtpr rtstat run-parts runlevel runsv runsvdir rx scp script sed sendmail seq setarch setconsole setfacl setfattr setkeycodes setlogcons setsid setuidgid sh sha1sum shutdown skill slabtop slattach sleep snice softlimit sort spawn-fcgi split sqlite3 ss ssh start-stop-daemon stat strings stty su sulogin sum sv svlogd swapoff swapon switch_root sync sysctl syslogd tac tack tail talk tar taskset tc tcpdump tcpsvd tee telinit telnet telnetd test tftp tftpd tic time tload toe top touch tput tr traceroute true tset tty ttysize tune2fs udhcpc udhcpd udpsvd umount uname uncompress unexpand unghostify uniq unix2dos unix_chkpwd unix_update unlzma unzip updatedb uptime usleep utmpdump uudecode uuencode uuidgen vconfig vi vlock vmstat vtysh vtysh w wall watch watch watchdog wc wget which who whoami whois xargs yes zcat zcip zcmp zdiff zegrep zfgrep zforce zgrep zless zmore znew' marionnet-0.90.6+bzr434.orig/share/filesystems/machine-debian-lenny-sid-2008.conf0000600000175000017500000004315112167200764026221 0ustar lucaslucas# Marionnet filesystem's configuration file. # The full Bash syntax may be used. # The output of the command `md5sum' on the filesystem: MD5SUM=ec6cddd04bf7d6911f6a2f4e98a15e48 # The output (first field) of the command `sum' on the filesystem: SUM=63381 # The creator of the filesystem: AUTHOR="Luca Saiu" # The creation date: DATE=2008 # The modification time (MTIME). Because of a user-mode-linux's protection # mechanism, this setting is very important for sharing marionnet's projects # between different installations. For instance, if you open on your laptop # a project created at the university, the involved filesystems must be the # same, of course, but they must also have exactly the same MTIME. # # Thus, it's a good idea to run this post-installation command: # # sudo touch -d $(date -d "@$MTIME") $FILESYSTEM # # where $MTIME is the value indicated below, and $FILESYSTEM is the location # of the filesystem image on your disk. # # On the other hand, if you are providing a new filesystem, you can set this # variable (once your filesystem is completely finished and stable) simply # running the command: # # stat -c "%Y" $FILESYSTEM # MTIME=1291051963 # Supported kernel(s) with their console-related parameters (according to the # content of /etc/inittab). The variable SUPPORTED_KERNELS may contain a list # of statements of the form: # # KERNEL [PARAMS] [KERNEL [PARAMS]].. # # where # # KERNEL ::= "[" EPITHET "]" # | "/" REGEXP "/" # # PARAMS is a string # EPITHET # is the suffix (the substring after "linux-") of an available # kernel in a "kernels/" directory # REGEXP is a regular expression (possibly denoting some epithets) # # Several statements KERNEL [PARAMS] may be specified. Note that if you are # using the += assignment operator to catenate statements, please dont forget # the blank character to separe words (example: SUPPORTED_KERNELS+=" ..."). # # Examples: # SUPPORTED_KERNELS='[2.6.18-ghost] con=none ssl=xterm console=ttyS0' # SUPPORTED_KERNELS+=' /3[.]2[.]..*/ con0=xterm' # SUPPORTED_KERNELS='[2.6.18-ghost] con=none ssl=xterm console=ttyS0' # X11 compliance. The possible (multiple) choices are "xhosted" and "xnested". # The value "none" is equivalent to leave this variable empty, which means # that the filesystem doesn't have the support to display X programs. # # Examples: # X11_SUPPORT+="xhosted" # X11_SUPPORT+="xnested" # X11_SUPPORT="none" # X11_SUPPORT="xhosted" # Minimum size in Mb of RAM to allocate to this virtual machine. # For machines with graphical programs it may be suitable to set # at least 48 Mb of RAM. MEMORY_MIN_SIZE=32 # Default value proposed to the user in the machine's dialogs. MEMORY_SUGGESTED_SIZE=48 # Support for multiple consoles. MULTIPLE_CONSOLES_SUPPORT=false # Sorted list of available binaries. BINARY_LIST='822-date a2dismod a2dissite a2enmod a2ensite a2p ab accessdb acleandir.rc aclocal aclocal-1.8 acpid acpi_listen addgroup addpart addr2line add-shell adduser adnsheloex adnshost adnslogres adnsresfilter adv1tov2 aecho afmdiff.awk afpd afpd-mtab.pl akodeplay amuFormat.sh apache2 apache2ctl apple_chfile apple_cp apple_file apple_mv apple_rm appres apropos apt-cache apt-cdrom apt-config apt-extracttemplates apt-ftparchive apt-get aptitude aptitude-create-state-bundle aptitude-run-state-bundle apt-key apt-mark apt-sortpkgs ar arp artscat artsd artsdsp artsmessage artsplay artsrec artsshell artswrapper as asip-status.pl asn1Coding asn1Decoding asn1Parser asn2deb aspell aspell-autobuildhash aspell-import atalkd atobm audit2allow audit2why autoconf autodns-dhcp_cron autodns-dhcp_ddns autoheader autom4te automake automake-1.8 autopoint autoreconf autoscan autoupdate awk b2m badblocks balou-export-theme balou-install-theme basename bash bashbug bc bdftopcf bdftops bdftruncate beforelight berdecode binheader biosdecode bitmap blkid blockdev bmtoa bootlogd bsd-write buildhash bunzip2 busybox bzcat bzcmp bzdiff bzegrep bzexe bzfgrep bzgrep bzip2 bzip2recover bzless bzmore c2ph c89 c89-gcc c99 c99-gcc cal calendar capinfos capitalize captoinfo cat catchsegv catman cc ccmakedep cdbs-edit-patch cfdisk cfg2html cfg2html-linux c++filt chage chattr chcat chcon check_forensic checkgid chfn chgpasswd chgrp chkdupexe chmod chown chpasswd chroot chrt chsh cjpeg cksum cleanappledouble.pl cleanlinks cleanup-info clear clear_console clock cmdtool cmp cnid2_create cnid_dbd cnid_index cnid_maint cnid_metad col colcrt colrm column comm compose compress-dummy cp cpan cpgr cpio cpp cpp-4.1 cpp-4.2 cppw Crack Crack-Reporter cramfsck c_rehash cron crontab csh csplit csslint-0.6 ctags ctags ctags-exuberant ctrlaltdel cupsdconf cupsdoprint cut cytune dash date dbmmanage dbus-cleanup-sockets dbus-daemon dbus-monitor dbus-send dbus-uuidgen dc dcop dcopclient dcopfind dcopobject dcopquit dcopref dcopserver dcopserver_shutdown dcopstart dd ddate debconf debconf-apt-progress debconf-communicate debconf-copydb debconf-escape debconf-gettextize debconf-set-selections debconf-show debconf-updatepo debugfs defoma defoma-app defoma-font defoma-hints defoma-id defoma-psfont-installer defoma-reconfigure defoma-subst defoma-user delgroup delpart deluser depmod desktop-file-install desktop-file-validate dexconf df dga dh_builddeb dh_clean dhclient dhclient3 dhclient-script dh_compress dhcpd3 dhcping dhcrelay3 dh_desktop dh_fixperms dh_gconf dh_gencontrol dh_gtkmodules dh_icons dh_install dh_installcatalogs dh_installchangelogs dh_installcron dh_installdeb dh_installdebconf dh_installdefoma dh_installdirs dh_installdocs dh_installemacsen dh_installexamples dh_installifupdown dh_installinfo dh_installinit dh_installlogcheck dh_installlogrotate dh_installman dh_installmanpages dh_installmenu dh_installmime dh_installmodules dh_installpam dh_installppp dh_installudev dh_installwm dh_installxfonts dh_installxmlcatalogs dh_link dh_listpackages dh_makeshlibs dh_md5sums dh_movefiles dh_ocaml dh_pangomodules dh_perl dh_pycentral dh_pysupport dh_python dh_scrollkeeper dh_shlibdeps dh_strip dh_suidregister dh_testdir dh_testroot dh_testversion dh_undocumented dh_usrlocal diff diff3 dig dir dircolors dirname djpeg dmesg dmidecode dnsdomainname dnssec-keygen dnssec-signzone domainname dotlockfile dpkg dpkg-architecture dpkg-buildpackage dpkg-checkbuilddeps dpkg-deb dpkg-distaddfile dpkg-divert dpkg-genchanges dpkg-gencontrol dpkg-gensymbols dpkg-name dpkg-parsechangelog dpkg-preconfigure dpkg-query dpkg-reconfigure dpkg-scanpackages dpkg-scansources dpkg-shlibdeps dpkg-source dpkg-split dpkg-statoverride dprofpp dselect dtd2vim du dumpcap dumpe2fs dumphint dumpleases dvipdf e2fsck e2image e2label ebrowse echo edit editcap editor editres egrep eject emacs emacs-23.0.0 emacsclient enc2xs env envsubst eps2eps eqn erb erb1.8 esdcat esdctl esddsp esdfilt esdloop esdmon esdplay esdrec esdsample etags etags ex exifautotran exo-csource exo-desktop-item-edit exo-eject exo-mount exo-open exo-preferred-applications exo-unmount expand expiry exportfs expr factor faillog false famd fc-cache fc-cat fc-list fc-match fdformat fdisk fgrep file filefrag filesharelist fileshareset find find2perl findaffix findfs finger firefox fixfiles flock fmt fold font2c fontname fontprop fortune free freetype-config fribidi from fsck fsck.cramfs fsck.ext2 fsck.ext3 fsck.minix fsck.nfs fslsfonts fstobdf ftp fuser fvwm fvwm2 fvwm-bug FvwmCommand fvwm-config fvwm-convert-2.4 fvwm-convert-2.6 fvwm-menu-desktop fvwm-menu-directory fvwm-menu-headlines fvwm-menu-xlock fvwm-perllib fvwm-root gawk gcc gcc-4.1 gcc-4.2 gccbug-4.1 gccmakedep gconf-merge-tree gconf-schemas gconftool gconftool-2 gcore gcov gcov-4.1 gcov-4.2 gdb gdbserver gdbtui gdk-pixbuf-csource gdk-pixbuf-query-loaders gencat genhomedircon geqn getconf getent getopt gettext gettextize gettext.sh getty getzones ghostify ginstall-info gksu gksudo gksu-properties glib-genmarshal glib-gettextize glib-mkenums gnome-keyring-daemon gobject-query gpasswd gpg gpg-convert-from-106 gpgsplit gpgv gpg-zip gpic gprof grep grep-changelog groff grog grops grotty groupadd groupdel groupmod groups grpck grpconv grpunconv grub grub-floppy grub-install grub-install grub-md5-crypt grub-reboot grub-set-default grub-terminfo gs gsbj gsdj gsdj500 gs-gpl gslj gslp gsnd gss_clnt_send_err gss_destroy_creds gtbl gtk-builder-convert gtk-query-immodules-2.0 gtk-update-icon-cache gunzip gv gzexe gzip h2ph h2xs halt hd head helpztags hexdump host hostid hostname hqx2bin htcacheclean htdbm htdigest html2text htpasswd httxt2dbm hwclock i386 i486-linux-gnu-cpp i486-linux-gnu-cpp-4.1 i486-linux-gnu-cpp-4.2 i486-linux-gnu-gcc i486-linux-gnu-gcc-4.1 i486-linux-gnu-gcc-4.2 iceauth iceweasel ico icombine iconv iconvconfig id identd idl2deb idl2wrs ifconfig ifdown ifnames ifup igawk ijoin ikeygen imagetops imake inetd inetutils-ifconfig inetutils-telnet info infobrowser infocmp infokey infotocap init insert_brackets insmod install install-info installkernel install-menu install-menu install-sgmlcatalog instmodsh invoke-rc.d ionice ip6tables ip6tables-restore ip6tables-save ipcrm ipcs ipmaddr iptables iptables-restore iptables-save iptables-xml iptunnel isosize ispell ispell-autobuildhash ispellconfig ispell-wrapper jack_alias jack_bufsize jack_connect jackd jack_disconnect jack_evmon jack_freewheel jack_impulse_grabber jack_load jack_lsp jack_metro jack_midiseq jack_midisine jack_monitor_client jackrec jack_showtime jack_simple_client jack_transport jack_unload jmacs joe john join jpegexiforient jpegtran jpico jstar kab2kabc kaddprinterwizard kate kbuildsycoca kcmshell kconf_update kcookiejar kde-config kded kdeinit kdeinit_shutdown kdeinit_wrapper kde-menu kdesu_stub kdontchangethehostname kdostartupconfig kedit kfile kfmexec kgrantpty khotnewstuff kill killall killall5 kinstalltheme kioexec kio_http_cache_cleaner kioslave kio_uiserver klauncher klogd kmailservice koi8rxterm kpac_dhcp_helper kregexpeditor ksendbugmail kshell kstartupconfig ktelnetservice ktradertest kwrapper kwrite labltk laptop-detect last lastb lastlog lcf ld ldconfig ldd less lessecho lessfile lesskey lesspipe lexgrog lft lft.db libnetcfg libpng12-config libpng-config libtool libtoolize line link links links2 linux32 linux64 listres ln lndir lnusertemp load_policy locale localedef locale-gen logger login logname logresolve logsave look lorder losetup lp2pap.sh ls lsattr lsmod lsmod lsof lspci lspci lspgpot lsusb lsusb luit lxterm lynx lynx.stable lz lzcat lzma lzma_alone m4 macbinary macusers mailer mail-files mailq mailshar make makedepend MAKEDEV make_driver_db_cups make_driver_db_lpr makeg makeinfo make-ssl-cert makestrs man mandb manpath marionnet_grab_config mattrib mawk mbadblocks mbchk mcat mcd mcheck mclasserase mcomp mcookie mcopy md5sum md5sum.textutils mdel mdeltree mdir mdu megatron meinproc mergecap mergelib mesg mformat mii-tool minfo mkbimage mkboot mkchdr mkcramfs mkdir mkdirhier mke2fs mkfifo mkfontdir mkfontscale mkfs mkfs.bfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.minix mkhtmlindex mkinitramfs mkinitramfs-kpkg mklost+found mkmanifest mknod mkpasswd mkswap mktemp mlabel mmd mmount mmove modinfo modprobe more mount mount.cifs mount.nfs mount.nfs4 mountpoint mount.smbfs mozilla mozilla-firefox mpack mpartition mrd mren msgattrib msgcat msgcmp msgcomm msgconv msgen msgexec msgfilter msgfmt msggrep msginit msgmerge msgunfmt msguniq mshowfat mt mt-gnu mtools mtoolstest mtr mtrace mtype munchlist munpack mv mxtar mzip nadheader named named-checkconf named-checkzone named-compilezone namei nameif nano nano nawk nbplkup nbprgstr nbpunrgstr nc ncal nc.traditional ncurses5-config ncursesw5-config neqn net netatalk-uniconv netcat netkit-ftp netstat newaliases newgrp newrole newusers nfsstat ngettext nice nisdomainname nl nm nmblookup nohup nologin nroff nslookup nsupdate nu objcopy objdump ocaml ocamlbrowser ocamlbuild ocamlbuild.byte ocamlbuild.native ocamlc ocamlcp ocamldebug ocamldep ocamldoc ocamldumpobj ocamllex ocaml-md5sums ocamlmklib ocamlmktop ocamlobjinfo ocamlopt ocamlprof ocamlrun ocamlyacc oclock od oldfuser omnicpp omniidl omniidlrun.py omshell open_init_pty openssl ownership owplaces pager pam_getenv pam_tally pango-querymodules pango-view pap papd paperconf paperconfig papstatus partx passwd paste patch pathchk pcimodules pcretest pdb pdb2.4 pdf2dsc pdf2ps pdfopt peekfd perl perl5.8.8 perlbug perlcc perldoc perlivp pf2afm pfbtopfa pftp pg pgawk pgrep pic pico piconv pidof ping ping6 pinky pivot_root pkg-config pkill pl2pm plipconfig pmap pmap_dump pmap_set po2debconf pod2html pod2latex pod2man pod2text pod2usage podchecker podebconf-display-po podebconf-report-po podselect portmap postalias postcat postconf postdrop postfix postkick postlock postlog postmap postqueue postsuper poweroff pphs pr precat prename preunzip prezip prezip-bin print printafm printenv printf props prove ps ps2ascii ps2epsi ps2pdf ps2pdf12 ps2pdf13 ps2pdf14 ps2pdfwr ps2ps ps2ps2 ps2txt psed psorder pstree pstree.x11 pstruct ptbl ptx pval pwck pwconv pwd pwdx pwunconv pycentral py_compilefiles pydoc pydoc2.4 pygettext pygettext2.4 pysupport-movemodules pysupport-parseversions python python2.4 pyversions qmqp-sink qmqp-source qshape querybts ramsize ranlib rarp raw rbash rclock rcp rcs-checkin rdev rdjpgcom readelf readlink readprofile reboot recode-sr-latin remove_brackets remove-default-ispell remove-default-wordlist remove-shell remsync rename rename.ul renice rep reportbug report-hw rep-remote reset resize resize2fs restorecon rev revpath rgrep rjoe rlogin rm rmail rmail rmdir rmmod rmt rmt-tar rnano rndc rndc-confgen rootflags rotatelogs route roxterm roxterm-config rpcdebug rpcgen rpc.gssd rpc.idmapd rpcinfo rpc.mountd rpc.nfsd rpc.statd rpc.svcgssd rpc.yppasswdd rpc.ypxfrd rsh rstart rstartd rtcwake ruby ruby1.8 runcon run_init runlevel run-mailcap run-parts run-with-aspell rview rvim rxvt rxvt-xpm rxvt-xterm s2p safe_finger savelog sawfish sawfish-client sawfish-ui scp script scriptreplay sdiff se_apt-get se_aptitude secon sed se_dpkg se_dpkg-reconfigure se_dselect see select-default-ispell select-default-iwrap select-default-wordlist semanage semodule semodule_deps semodule_expand semodule_link semodule_package sendmail sensible-browser sensible-editor sensible-pager sepolgen-ifgen seq sessreg sestatus se_synaptic setarch setfiles setpci setpci setsebool setsid setterm setxkbmap sfdisk sftp sg sh sha1sum sha224sum sha256sum sha384sum sha512sum shadowconfig shar shelltool shift_lines showfont showmount showppd showrgb shred shutdown single2bin size skill slabtop slattach sleep slogin smbmount smbpasswd smbumount sm-notify smproxy smtp-sink smtp-source snacc snacc-config snice soelim sort sperl5.8.8 splain split split-logfile sprof sq ssh ssh-add ssh-agent ssh-argv0 ssh-copy-id sshd ssh-keygen ssh-keyscan start_kdeinit start_kdeinit_wrapper startpar start-stop-daemon startx startxfce4 stat strace strfile strings strip stty su sudo sudoedit suidperl sulogin sum su-to-root su-to-root swapoff swapon sync sysctl syslogd syslogd-listfiles syslog-facility tac tail tailf tar tasksel taskset tbl tclsh tclsh8.4 tcpd tcpdchk tcpdmatch tcpdump tcptraceroute tcptraceroute.db tcsh tcsh tee telinit telnet telnetd telnet.netkit tempfile test testparm testrb testrb1.8 texi2dvi texi2pdf texindex text2pcap textedit tftp tgz thunar Thunar tic time timelord tload toe top touch touch tput tr traceproto traceproto.db traceroute traceroute traceroute6 traceroute6.db traceroute.db traceroute-nanog traceroute-nanog.db tracert tracert.db troff true tryaffix try-from tset tshark tsort tty tune2fs tunelp tzselect ucf ucfq ucfr ucs2any udevcontrol udevd udevinfo udevmonitor udevsettle udevtest udevtrigger udhcpc udhcpd ul umount umount.cifs umount.nfs umount.nfs4 unafs uname unbin uncompress unexpand unghostify unhex uniq unique unix_chkpwd unlink unlzma unshadow unshar unsingle unsq unstr update-alternatives update-catalog update-default-aspell update-default-ispell update-default-wordlist update-desktop-database update-dictcommon-aspell update-fonts-alias update-fonts-dir update-fonts-scale update-gconf-defaults update-gdkpixbuf-loaders update-grub update-grub update-gtk-immodules update-icon-caches update-inetd update-initramfs update-ispell-dictionary update-locale update-menus update-mime update-mime-database update-modules update-openoffice-dicts update-pangox-aliases update-passwd update-pciids update-python-modules update-rc.d update-usbids update-xmlcatalog uptime useradd userdel usermod users uudecode uuencode uxterm uz validlocale vdir vi vidmode view viewres vigr vim vim-addons vim.basic vimdiff vimplate vim.tiny vimtutor vipw visudo vmstat volname vpddecode w w3m w3mman wall watch wc wftopfa wget whatis whereis which which whiptail who whoami whois wireshark wish wish8.4 word-list-compress w.procps write wrjpgcom www-browser X X11 x11perf x11perfcomp xargs xauth xauth_switch_to_sun-des-1 xbiff xcalc xclipboard xclock xcmsdb xconsole xcursorgen xcutsel xdbedizzy xditview xdpyinfo xdriinfo xedit xev xeyes xfbrowser4 xfce4-about xfce4-autostart-editor xfce4-kiosk-query xfce4-menueditor xfce4-panel xfce4-popup-menu xfce4-popup-windowlist xfce4-session xfce4-session-logout xfce4-terminal xfce4-terminal.wrapper xfce4-tips xfce-mcs-manager xfce-setting-show xfd xfdesktop xfhelp4 xflock4 xfmountdev4 xfontsel xfrun4 xfsinfo xfsm-shutdown-helper xft-config xfterm4 xfwm4 xgamma xgc xgettext xhost xinit xkbbell xkbcomp xkbevd xkbprint xkbvleds xkbwatch xkill xlinks2 xload xlogo xlsatoms xlsclients xlsfonts xmag xman xmessage xmkmf xmodmap xmore xon xpmroot xprop xrandr xrdb xrefresh x-session-manager xset xsetmode xsetpointer xsetroot xsm xstdcmap xsubpp xterm xtermcontrol x-terminal-emulator xtermset xtrapchar xtrapin xtrapinfo xtrapout xtrapproto xtrapreset xtrapstats xvidtune xvinfo xwd x-window-manager xwininfo xwud x-www-browser xxd yes ypbind ypcat ypchfn ypchsh ypdomainname ypmatch yppasswd yppoll yppush ypserv ypserv_test ypset yptest ypwhich zcat zcmp zdiff zdump zegrep zfgrep zforce zgrep zic zless zmore znew zsoelim' marionnet-0.90.6+bzr434.orig/share/filesystems/machine-mandriva20100215.conf0000600000175000017500000003202212167200764025117 0ustar lucaslucas# Marionnet filesystem's configuration file. # The full Bash syntax may be used. # The output of the command `md5sum' on the filesystem: MD5SUM=2827c482f34ccf2687bfb6416d0d4711 # The output (first field) of the command `sum' on the filesystem: SUM=09476 # The creator of the filesystem: AUTHOR="Franck Butelle" # The creation date: DATE=2010 # The modification time (MTIME). Because of a user-mode-linux's protection # mechanism, this setting is very important for sharing marionnet's projects # between different installations. For instance, if you open on your laptop # a project created at the university, the involved filesystems must be the # same, of course, but they must also have exactly the same MTIME. # # Thus, it's a good idea to run this post-installation command: # # sudo touch -d $(date -d "@$MTIME") $FILESYSTEM # # where $MTIME is the value indicated below, and $FILESYSTEM is the location # of the filesystem image on your disk. # # On the other hand, if you are providing a new filesystem, you can set this # variable (once your filesystem is completely finished and stable) simply # running the command: # # stat -c "%Y" $FILESYSTEM # MTIME=1291052912 # Supported kernel(s) with their console-related parameters (according to the # content of /etc/inittab). The variable SUPPORTED_KERNELS may contain a list # of statements of the form: # # KERNEL [PARAMS] [KERNEL [PARAMS]].. # # where # # KERNEL ::= "[" EPITHET "]" # | "/" REGEXP "/" # # PARAMS is a string # EPITHET # is the suffix (the substring after "linux-") of an available # kernel in a "kernels/" directory # REGEXP is a regular expression (possibly denoting some epithets) # # Several statements KERNEL [PARAMS] may be specified. Note that if you are # using the += assignment operator to catenate statements, please dont forget # the blank character to separe words (example: SUPPORTED_KERNELS+=" ..."). # # Examples: # SUPPORTED_KERNELS='[2.6.18-ghost] con=none ssl=xterm console=ttyS0' # SUPPORTED_KERNELS+=' /3[.]2[.]..*/ con0=xterm' # SUPPORTED_KERNELS='[2.6.18-ghost] con=none ssl=xterm console=ttyS0' # X11 compliance. The possible (multiple) choices are "xhosted" and "xnested". # The value "none" is equivalent to leave this variable empty, which means # that the filesystem doesn't have the support to display X programs. # # Examples: # X11_SUPPORT+="xhosted" # X11_SUPPORT+="xnested" # X11_SUPPORT="none" # X11_SUPPORT="xhosted" # Minimum size in Mb of RAM to allocate to this virtual machine. # For machines with graphical programs it may be suitable to set # at least 48 Mb of RAM. MEMORY_MIN_SIZE=24 # Default value proposed to the user in the machine's dialogs. MEMORY_SUGGESTED_SIZE=48 # Support for multiple consoles. MULTIPLE_CONSOLES_SUPPORT=false # Sorted list of available binaries. BINARY_LIST='2to3 a2p ab about-mandriva activation-client addbuiltin addpart addr2line adduser advxsplitlogfile advxsplitlogfile.pl agetty alsa.agent alsa.agent alsa_in alsa_out alternatives apachectl appletviewer apropos apt ar arch aria2c arp arping arping as atob aumix-text avahi-autoipd avahi-browse avahi-browse-domains avahi-daemon avahi-publish avahi-publish-address avahi-publish-service avahi-resolve avahi-resolve-address avahi-resolve-host-name avahi-set-host-name awk awk badblocks baddbdir base64 basename bash bash3 bashbug berkeley_db_svc bgpd blkid blockdev bltest bonobo-activation-sysconf bonobo-slay bootlogd brctl btoa build-classpath build-classpath-directory build-jar-repository bunzip2 bzcat bzdiff bzgrep bzip2 bzip2recover bzless bzme bzmore c89 c99 cal captoinfo cat catchsegv cc ccp certcgi certutil cfdisk c++filt chacl chage chattr chcon check-binary-files checkcert check_forensic checkgid chfn chgrp chkconfig chksession chmod chown chpasswd chroot chrt chsh chvt ck-history ck-launch-session ck-list-sessions ck-log-system-restart ck-log-system-start ck-log-system-stop cksum clean-binary-files clear clock clock clockdiff cmp cmsutil code2color col colcrt colrm column comm conflict consolehelper console-kit-daemon consoletype ControlPanel convertsession cp cpio cpp cpp-4.4.1 cracklib-check cracklib-format cracklib-packer cracklib-unpacker create-cracklib-dict create-jar-links create_static_dev_nodes c_rehash crlutil crmftest crond crontab cryptsetup csplit ctrlaltdel ctstat cut cut cytune date db_archive db_checkpoint db_codegen db_deadlock db_dump db_dump185 db_hotbackup db_load dbmmanage db_printlog db_recover db_stat dbtest db_upgrade dbus-cleanup-sockets dbus-daemon dbus-launch dbus-monitor dbus-send dbus-uuidgen db_verify dd ddate deallocvt debugfs delpart depmod derdump desktop-file-install desktop-file-validate df dhclient dhclient-script dhcpd dhcpd-chroot.sh dhcpd-conf-to-ldap.pl dhcpreport.pl diff diff3 diff-jars dig digest dir dircolors dirname dlist_test dmesg dmeventd dmsetup dmsetup-static dmsetup.static dnsdomainname dns-keygen dnssec-dsfromkey dnssec-keyfromlabel dnssec-keygen dnssec-makekeyset dnssec-signkey dnssec-signzone doexec domainname du dumpcap dumpcap dumpe2fs dumpkeys e2freefrag e2fsck e2fsck.static e2image e2label e2undo e3jsize ebtables-restore ebtables-save echo echo-client-2 ed egrep eject env env eqn esd esdcompat ether-wake ethtool ettercap etterfilter etterlog ex expand expiry exportfs expr expr extcheck factor faillog false fc-cache fc-cat fc-list fc-match fc-query fc-scan fdformat fdisk fgconsole fgrep file filefrag find find find2perl findfs find-jar fipstest firefox flock flock fmt fndSession fold free free fsck fsck.cramfs fsck.ext2 fsck.ext3 fsck.ext4 fsck.ext4dev fsck.minix fstab-decode ftp ftpd fuser gawk gawk gawk-3.1.7 gcc gcc-4.4.1 gcc4.4-version gccbug gconf-merge-tree gconftool gconftool-2 gcov gdk-pixbuf-query-loaders gencat gendiff generate-modprobe.conf genhdlist2 genhostid genl geqn getconf get_device get_driver getent getfacl getkey getkeycodes get_module getopt gettext gettext ghost2 ghostify glibc-post-wrapper gmake gnome-open gnomevfs-cat gnomevfs-copy gnomevfs-df gnomevfs-info gnomevfs-ls gnomevfs-mkdir gnomevfs-monitor gnomevfs-mv gnomevfs-rm gnroff gpasswd gpg gpgsplit gpgv gpg-zip gprof grep groff grotty groupadd groupdel groupmod groups grpck grpconv grpunconv grub grub-install grub-md5-crypt grub-terminfo gss_clnt_send_err gss_destroy_creds gtar gtbl gtk-query-immodules-2.0 gtk-update-icon-cache gtroff gunzip gunzip gzexe gzip gzip hald hal-device hal-disable-polling hal-find-by-capability hal-find-by-property hal-get-property hal-is-caller-locked-out hal-is-caller-privileged hal-lock hal-set-property hal-setup-keymap halt halt head hexdump hibernate-cleanup.sh host hostid hostname hping hping2 htdbm htdigest HtmlConverter htpasswd httpd httxt2dbm hwclock i386 i586-manbo-linux-gnu-gcc i586-manbo-linux-gnu-gcc-4.4.1 i586-mandriva-linux-gnu-gcc i586-mandriva-linux-gnu-gcc-4.4.1 iconv iconvconfig id idlj ifcfg ifconfig ifdown ifenslave ifmetric ifplugd ifplugstatus ifstat ifup igawk inetdconvert infocmp infotocap init initlog insmod install install-info in.tftpd ionice ionice ior-decode-2 ip ip6tables ip6tables-multi ip6tables-restore ip6tables-save ipcalc ipcmk ipcrm ipcs ipmaddr iproute-arpd ipsec iptables iptables-multi iptables-restore iptables-save iptables-xml iptunnel isisd isosize jackd jack_netsource jar jarsigner java javac javadoc javah javap javaws jconsole jdb jhat jinfo jmap join jps jrunscript jsadebugd jstack jstat jstatd jvmjar kbd_mode kbd_mode kbdrate kdeDesktopCleanup keytool kill kill killall killall5 klogd klogd last lastb lastlog lchage lchfn lchsh ld ldap2zone ldapadd ldapcompare ldapdelete ldapexop ldapmodify ldapmodrdn ldappasswd ldapsearch ldapurl ldapwhoami ldattach ldconfig ldd lddlibc4 less lessecho lesskey lesspipe.sh lgroupadd lgroupdel lgroupmod lid linc-cleanup-sockets link linux32 linux64 listhome list_hooks.pl ln lnewusers lnstat loadkeys loadkeys loadunimap locale localedef locale_install.sh locale_uninstall.sh logger logger login login login.krb5 logname logoutd logresolve logresolve.pl logrotate logsave log_server_status look losetup lpasswd ls lsattr lscpu lshal lsmod lspci lspgpot lsusb luseradd luserdel lusermod lwresd lynx lzcat lzcmp lzdiff lzegrep lzfgrep lzgrep lzless lzma lzmadec lzmainfo lzmore mailq make makedev makepqg makewhatis man man2dvi man2html mangle manpath mapscrn marionnet_grab_config mawk mbchk mcookie md5sum mdv-network-event mesg mii-diag mii-tool mingetty mkdict mkdir mke2fs mke3fs mkfifo mkfontdir mkfontscale mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.ext4dev mkfs.minix mkhomedir_helper mklost+found mknod mkswap mktemp mktemp modinfo modprobe mod_ssl-gentestcrt modutil more mount mount.nfs mount.nfs4 mountpoint mozilla-firefox mv named named-bootconf named-checkconf named-checkzone named-compilezone namei nameif nano native2ascii nc ncat ncurses5-config ncursesw5-config ndiff netcat netreport netstat newaliases newgrp newusers nfsddebug nfsdebug nfsstat ngettext nice nisdomainname nl nm nmap nohup nologin nonspr10 nroff nslookup nstat nsupdate objcopy objdump ocspclnt od oidcalc oldfind omshell openssl openvt orbd ospf6d ospfclient ospfd p7content p7env p7sign p7verify pack200 packer pam_console_apply pam_tally2 pam_timestamp_check pango-querymodules-32 partmon partx passwd paste pathchk pcimodules peekfd perl perl5 perl5.10.1 perlbug perlthanks pgawk pgrep pidof pidof ping ping6 pinky pivot_root pk11mode pk12util pkaction pkcheck pkexec pkg-config pkill plainrsa-gen plipconfig pmap pod2html pod2latex pod2man pod2text policytool polkit-action polkit-auth polkit-config-file-validate polkit-policy-file-validate postalias postcat postconf postdrop postfinger postfix postfix-chroot.sh postkick postlock postlog postmap postmulti postqueue postsuper poweroff poweroff pp ppl-config ppp-watch pr prcsys print-cups.sh printenv printf procps3-kill protoize ps psfaddtable psfgettable psfstriptable psfxtable pstree pstree.x11 ptx pulseaudio pwck pwconv pwd pwdx pwunconv pydoc python python2.6 qmqp-sink qmqp-source qshape query-loc queryperf racoon racoonctl ranlib raw rbash rdisc readelf readlink readprofile reboot reboot rebuild-jar-repository rebuild-security-providers red remtest rename renice reset resetall reset_sound reset_sound resize2fs resizecons resolvconf rev ripd ripngd rm rmail rmdir rmic rmid rmiregistry rmmod rmold rmt rmt-tar rnano rndc rndc-confgen rotatelogs route routef routel rpcbind rpcdebug rpcgen rpc.gssd rpc.idmapd rpcinfo rpcinfo rpc.mountd rpc.nfsd rpc.statd rpc.svcgssd rpc.yppasswdd rpc.ypxfrd rpm rpm2cpio rpmdb rpm-find-leaves rpmgraph rpmquery rpmsign rpmverify rsaperf rsync rtacct rtcwake rtkitctl rtmon rtpr rtstat runcon runlevel run-parts rurpme rurpmi s2p safe_finger sash schemagen scp script sdiff sdrtest securetty sed selfserv sendmail sendmail.postfix seq serialver servertool service setarch setfacl setfont setfont setkey setkeycodes setleds setmetamode setpci setsid setsysfont set_tcb setterm sfdisk sftp sg sh sha1sum sha224sum sha256sum sha384sum sha512sum shell-quote shlibsign showconsolefont showkey showmount shred shuf shutdown signtool signver size skill slabtop slapacl slapadd slapauth slapcat slapd slapdn slapindex slappasswd slapschema slaptest slattach sleep sln slogin smicache smidiff smidump smilint smime smiquery smistrip smixlate sm-notify smtp-sink smtp-source snice sort splain split split-logfile sprof ss ssh ssh-add ssh-agent ssh-copy-id sshd ssh-keygen ssh-keyscan ssleay ssltap start-statd start_udev.orig stat stdbuf strings strip strsclnt stty su sudo sudoedit sudoers2ldif sulogin sum supermount swapoff swapon switch_root sxw2txt symkeyutil sync sysctl syslogd syslogd systool sys-unconfig tabs tac tac tail tailf tar tar-backup tar-restore taskset tbl tc tcb_convert tcb_unconvert tcpd tcpdchk tcpdmatch tcpdump tee telinit telnet test tftp tic time timeout tload tnameserv toe top touch tput tr tracepath tracepath6 traceroute6 troff true truncate try-from tset tsort tstclnt ttmkfdir ttmkfdir tty tune2fs tunelp typelib-dump tzselect udevadm udevd udev_import_usermap ul umount umount.hal umount.nfs umount.nfs4 uname unexpand unghostify unicode_start unicode_start unicode_stop unicode_stop uniq unix_chkpwd unix_update unlink unlzma unpack200 unprotoize unxz update-alternatives update-desktop-database update_dhcp.pl update-localtime update-menus update-mime-database update-usbids.sh uptime urpme urpmf urpmi urpmi.addmedia urpmi.removemedia urpmi_rpm-find-leaves urpmi.update urpmq usb-devices usb_id useradd userdel userhelper usermod usernetctl users usleep utempter utmpdump uuidgen vconfig vdir vfychain vfyserv vi vi vigr vim vimdiff vim-enhanced vimtutor vipw visudo vlan-test vmstat volname vpn-start vpn-stop vtysh w wall watch watchquagga wc wget whatis whereis which who whoami wireshark wireshark-root wireshark-root write wsgen wsimport www-browser xargs xdg-desktop-icon xdg-desktop-menu xdg-email xdg-icon-resource xdg_menu xdg-mime xdg-open xdg-screensaver xdg-settings xdg-user-dir xdg-user-dirs-gtk-update xdg-user-dirs-update xinetd xjc xprop xvt xxd xz xzcat xzcmp xzdec xzdiff xzegrep xzfgrep xzgrep xzless xzme xzmore yes ypbind ypcat ypchfn ypchsh ypdomainname ypmatch yppasswd yppoll yppush ypserv ypset yptest ypwhich zcat zcat zcmp zdiff zdump zebra zegrep zfgrep zforce zgrep zic zless zmore znew zonetoldap' marionnet-0.90.6+bzr434.orig/share/palette-icons/0000700000175000017500000000000012167200764020431 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/share/kernels/0000700000175000017500000000000012167200764017325 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/share/images/0000700000175000017500000000000012167200764017127 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/share/images/ico.cloud.pause.xxl.png0000600000175000017500000000747212167200764023456 0ustar lucaslucasPNG  IHDRZDt"tEXtSoftwareAdobe ImageReadyqe<IDATx\ PWI 7VbkO\W {Lwmt٥n];Su:ێ; Z{Z]QT)g9E$ 9 /w_}O Yl6 >&Щݿ[7'p pSC^ C u2 (m@CC67挌 g!s~zf +8~몮[%Ύ#3NyBA~-2:6}-ꭩ¼#ip 4b77fƆϋ#Рr/dWvuc+81 [  }}ږB!3~&l4-{΃6]صcg DDX;D99_g|HnٕKV@hx4Z^n:&eu>,zd|֩EDǧsB@@V  OGt8Ϗ|Ŋа0w+u92QDկ'AR!./ zȻx8ߴgg#\ w:{/cu׬?'bc9[SC*힉?2Յ2FXTRZ}T2C/}n&V:t 0׏ywZq85U`g7nK~"$)&PԆ@= jӌIsa%0\h@RNOOM%?Ȉ >Ћ$ƒ<Krگ~mSw/Iڍ })RhA~AUOx$,X}~RLdÎ)Ȩj =]qH.^Jܟj @-[y2%㰮dO (0Ur"`Lٟ]3w͞VCo0la\5>_~>.%աV)m 4#C&d2UpB3b8xHXvn*VH,uiu\^υĹ mރyr#d/o4({@9Aky. L ׯ߀h 6GnS4 5Cmm`Or$ONe$k׮j7AtT\vQ$yg1П|gu`H$xEE mT}]epx=w* t?W 'obהn}aTOѩ➭+SC~n1"Tt[^$ ) 8s12&^ܣ@/lغwZ{tQvԞJu`j!K\fs?S?e7# i_tE'*uƺ ]~8wcL|?"bqbqq_~ \Qhh`"5셜 k3yA&V\mi'!C8BuW_e4Н\ 4zkL~4`54݄iK$8}᫯7)pά9&0sww])1 \nL"ݖ*fn^"hKC6`Mgˆxqhf}p4rX6f,ZTVW(`uP\1߮wCC]T)F\oq)f"+Nu! HBks5 %!,S[ aڀf%]_SB\}14 ѨՒ"2ERs"4; J5ᾝ?1q+u%P^<^ 2d8)$Gq-+9A14wnpK*+I.27\. 4LPD P($ȿ (r]Z\a &\.7CyiiL&;BFM4޴ysa‚еdTH}]ԢCOtV^ a4+Sir} +ؽwgrq:bi@C8taghl VT$'[^on}|}3vf2ؙ:a2K4Nok-hޮ'T*-&(0*jR#_z,[צhEb"TTM1bRu5 Dž-/FTd(XJele& -Ww$y/Lj@VjLE_jGJ%Tt4d@Q>>>; fO IR9F1[Q#1p4:N0BT5$'ub5lk AxՁ cJʨ:87xﱊ?Δ BQ;Iggx{{X)_`՛ g0~P:(& te>5r&]$A$:f`7 ֖x82rt!kxxOΦ޳ZBvEg1NAjN8m`-͢N-UmZ\F@3 Nv$IVɐ늃!3!Sd/ =c>}328ק;SRV lg6;up97WhժQӊwx!9Adz`K7w {JZ`9 ΨOJ9x1|-L"47CGG;to͊'~fAo3`XĕQ]@j h\PP߃7 %ׇ>:Q^`2g`lM49g+W=n(D"-QR ZQ6UnԸ纀NWֿ6[lhcT*l rZwp#wNCNDKEG.]XH<+FfNمXR X%~) `3=Ԇtܻ]ikIBaΕ`;\yV NE,a2* }#inȎYJG>W"^#hѤhyPv9ئgyrSxΫDT"Vf^ ##@ʉ4ZWpr{@3v9)IJ!82NNN $]Oη1t61bk62FxCDx%2**dtalY_U10c=# ǿ**?b֪FGG7{{md ?@>aOA_ )H''/744H|f4j@ݽC&rs`C\P7vҬ)wJ.?wO~!hX, AoO46܁Rɥܜ2h2$׋ J?nuoppn߆܋756$S]XFOaN?e.܋cq]*sD~\zoooN]X&9h^&9([KX[Hdii6_ c=$>˚͸V6}KsҲҒӰ!6j`뗞lYRLL p 0^mjlb >jc$ d|kkj?X$^H ?MyIENDB`marionnet-0.90.6+bzr434.orig/share/images/splash.300x348.xpm0000600000175000017500000277074512167200764022127 0ustar lucaslucas/* XPM */ static char * splash_300x348_xpm[] = { "300 348 27539 3", " c None", ". c #1F00B2", "+ c #2100B1", "@ c #2F13AB", "# c #3016A5", "$ c #351DA6", "% c #8B81B8", "& c #C5C4C3", "* c #C2C2C3", "= c #BDBDBF", "- c #BEBEBD", "; c #BEBEBE", "> c #BFBEBC", ", c #BEBDBD", "' c #BDBEBE", ") c #BAC2C2", "! c #BBC3C2", "~ c #BFBFBE", "{ c #C0BDBC", "] c #BFBEBD", "^ c #BDBEBD", "/ c #BEBDC1", "( c #BEBCC0", "_ c #BEBDBE", ": c #BFBDBC", "< c #C0BEBD", "[ c #C0BEBC", "} c #BEBCBE", "| c #BDBDBE", "1 c #BFBFBD", "2 c #BCC0C0", "3 c #B9C3C4", "4 c #BDC0BF", "5 c #BDBDC1", "6 c #BEBCBC", "7 c #BCBFBF", "8 c #BAC3C3", "9 c #BFBDBE", "0 c #BEBCC1", "a c #BDBDC0", "b c #C1C0BA", "c c #C0C0B9", "d c #BEBDBF", "e c #BEBDC0", "f c #BFBDBD", "g c #C1BDBC", "h c #BDC0BE", "i c #BAC3C2", "j c #C3C1C7", "k c #BCB4C1", "l c #9895B0", "m c #513998", "n c #29018B", "o c #2B048C", "p c #3313A2", "q c #1F00B1", "r c #2E13AB", "s c #2E15A5", "t c #351CA7", "u c #BBC2C2", "v c #BDBCC1", "w c #BDBDBD", "x c #BFBEBE", "y c #C0BFBA", "z c #BEC0BE", "A c #C3C0C7", "B c #BCB5C1", "C c #50399A", "D c #29028D", "E c #2A048E", "F c #3111A2", "G c #2000AF", "H c #2000AE", "I c #2407AD", "J c #2406AA", "K c #3217AA", "L c #8B80B8", "M c #BCC1C1", "N c #BEC0BF", "O c #BFBFBC", "P c #C0BFBB", "Q c #C0BEC2", "R c #BFBDC5", "S c #BCC1C0", "T c #BBC1C2", "U c #BBC0C0", "V c #BFBEBF", "W c #BDC0C0", "X c #BDBFBE", "Y c #BFBDC4", "Z c #C0BBC3", "` c #BEBEBF", " . c #BDBFC2", ".. c #C2C1C4", "+. c #B8B6C0", "@. c #9391B3", "#. c #4A34A6", "$. c #20009F", "%. c #20029F", "&. c #2307A6", "*. c #2101AC", "=. c #1F00AD", "-. c #1E00AB", ";. c #3013AC", ">. c #8980BB", ",. c #C2C3C4", "'. c #C2C2C2", "). c #BEBFBE", "!. c #BEBDBC", "~. c #BEBEBC", "{. c #BBC1C1", "]. c #BEBFBF", "^. c #C0C0BA", "/. c #C1BCC0", "(. c #BAC1C1", "_. c #C0BDC3", ":. c #C1BCC2", "<. c #C1C1C2", "[. c #B6B6BF", "}. c #918EB8", "|. c #452FB3", "1. c #1A00B0", "2. c #1A00AD", "3. c #1D00AB", "4. c #2101AD", "5. c #3012AB", "6. c #857FBE", "7. c #BDC4C6", "8. c #C1C3BF", "9. c #BDBEBF", "0. c #BFBDBF", "a. c #BDBCC0", "b. c #C1C0BB", "c. c #BAC2C3", "d. c #C1C1C1", "e. c #B6B5C0", "f. c #928DBA", "g. c #452EB9", "h. c #1A00B7", "i. c #1C00B1", "j. c #2000B0", "k. c #2100AF", "l. c #1C00AC", "m. c #280BA7", "n. c #857BB9", "o. c #C1C5C3", "p. c #C2C3BF", "q. c #BDBFBF", "r. c #BFBFBB", "s. c #C3C3BB", "t. c #B9B7BB", "u. c #938DB9", "v. c #442EB7", "w. c #1800B3", "x. c #1B00B1", "y. c #2000B1", "z. c #2001AD", "A. c #2200B1", "B. c #1A00AB", "C. c #2306A3", "D. c #8377B7", "E. c #C3C5C3", "F. c #C2C4C0", "G. c #BCBFC0", "H. c #BCBEBF", "I. c #BCC2C2", "J. c #BEC1C0", "K. c #BFBDC0", "L. c #C0BFBD", "M. c #C0BEBF", "N. c #BEBFC0", "O. c #C3C4BC", "P. c #B9B8BB", "Q. c #442EB4", "R. c #1700B0", "S. c #1800B0", "T. c #2307A4", "U. c #7F76B9", "V. c #BFC4C6", "W. c #C1C3C0", "X. c #BCC1C2", "Y. c #BDBFBD", "Z. c #BFBCBF", "`. c #BCBFC2", " + c #C0C3C2", ".+ c #B7B6BF", "++ c #938CBA", "@+ c #442EB3", "#+ c #1D00AE", "$+ c #2D0FAA", "%+ c #877DBA", "&+ c #C1C4C3", "*+ c #BDBCBF", "=+ c #BEC1BC", "-+ c #C1BEBD", ";+ c #C2BEBC", ">+ c #BEBFBD", ",+ c #BCC4C3", "'+ c #BCC1BF", ")+ c #B9B9B9", "!+ c #B3B8B9", "~+ c #B2B8B9", "{+ c #B6B6B7", "]+ c #AEB0B4", "^+ c #AAB0B5", "/+ c #AFB4B9", "(+ c #B5B6B8", "_+ c #B5B5B7", ":+ c #B0B5B8", "<+ c #AFB8BA", "[+ c #B2B6B7", "}+ c #B4B1B0", "|+ c #AEABAC", "1+ c #AEAEB1", "2+ c #B5B9BB", "3+ c #BFBFBF", "4+ c #BDC1C0", "5+ c #C3C5BD", "6+ c #B8B7BB", "7+ c #442EB0", "8+ c #1700AC", "9+ c #1900AF", "0+ c #2100AD", "a+ c #1E00AD", "b+ c #2E10AA", "c+ c #887DBA", "d+ c #C3C4C3", "e+ c #C0C0C0", "f+ c #C1C0C0", "g+ c #BFC4C4", "h+ c #BEC5C6", "i+ c #BFC3C3", "j+ c #C0C1C2", "k+ c #C2C2BF", "l+ c #C2C1C1", "m+ c #C0C0C4", "n+ c #C2C1C0", "o+ c #C4C2BD", "p+ c #C1C0BE", "q+ c #BCC2C0", "r+ c #BDC2C1", "s+ c #BDBCBD", "t+ c #B9BABC", "u+ c #BBBBBD", "v+ c #BBBEC0", "w+ c #B8C0C4", "x+ c #B6C1C3", "y+ c #B3BDBF", "z+ c #B1B7BB", "A+ c #ADBABE", "B+ c #B0BCC1", "C+ c #B6BAC0", "D+ c #AEB6BC", "E+ c #A9B5BD", "F+ c #AEB8C1", "G+ c #B5BAC0", "H+ c #B5BABF", "I+ c #B0BAC1", "J+ c #AFBDC4", "K+ c #B1BDC1", "L+ c #B5B6B7", "M+ c #ADAFB2", "N+ c #A9AEB3", "O+ c #AEB2B6", "P+ c #BBBABA", "Q+ c #BFBCBE", "R+ c #C5C3BC", "S+ c #BBB7BC", "T+ c #948CBA", "U+ c #1B00A9", "V+ c #2509A5", "W+ c #8078BB", "X+ c #BDC0C2", "Y+ c #C0BDBF", "Z+ c #C0BDC0", "`+ c #BFBEC1", " @ c #C0C0BB", ".@ c #BEBEC0", "+@ c #BFBDC2", "@@ c #B9BABF", "#@ c #AEB5BD", "$@ c #B2B8C2", "%@ c #B6BDC7", "&@ c #B6BDC8", "*@ c #AFBBC1", "=@ c #ACBBBE", "-@ c #ADBEC2", ";@ c #B3C2CA", ">@ c #BBC7D1", ",@ c #C1CAD3", "'@ c #BFCBD2", ")@ c #BECBD1", "!@ c #BECAD1", "~@ c #BFCAD1", "{@ c #BFCCD4", "]@ c #C0CDD3", "^@ c #C0CBD1", "/@ c #BCC8CF", "(@ c #B3BEC8", "_@ c #ACB4BC", ":@ c #AFAEB1", "<@ c #B6B2B2", "[@ c #BDBCBC", "}@ c #C0BFBC", "|@ c #C5C0C3", "1@ c #BBB3C2", "2@ c #948CBB", "3@ c #442EB2", "4@ c #1700AF", "5@ c #1900B0", "6@ c #1C00AA", "7@ c #2B0DA9", "8@ c #857DBA", "9@ c #BCBDBD", "0@ c #BFC0C0", "a@ c #C3C4C4", "b@ c #C9CAC9", "c@ c #C5C7C7", "d@ c #B8BABB", "e@ c #A6A9AB", "f@ c #9F9EA1", "g@ c #A09BA1", "h@ c #9898A1", "i@ c #97959A", "j@ c #A09392", "k@ c #A2989C", "l@ c #A3999D", "m@ c #A59392", "n@ c #999492", "o@ c #999694", "p@ c #A59494", "q@ c #A2959B", "r@ c #A4A1A4", "s@ c #AFB6AD", "t@ c #BDBDB8", "u@ c #C5C2C3", "v@ c #C9C9CB", "w@ c #CACACB", "x@ c #C6C6C7", "y@ c #BFBEC0", "z@ c #BDBBB9", "A@ c #B6B7B7", "B@ c #AFB5BB", "C@ c #B4B8C2", "D@ c #B6BCC5", "E@ c #B4BEC8", "F@ c #BAC4CF", "G@ c #BEC7D2", "H@ c #BDC7D2", "I@ c #BAC6CC", "J@ c #B8C5CD", "K@ c #BBC8D0", "L@ c #BFCBD4", "M@ c #C2CDD7", "N@ c #C4CED9", "O@ c #C5D0D9", "P@ c #C4D1D8", "Q@ c #C3D0D8", "R@ c #C3CFD8", "S@ c #C4D0D8", "T@ c #C3D1D8", "U@ c #BECCD5", "V@ c #BAC7D2", "W@ c #B9C4CE", "X@ c #C1C1C9", "Y@ c #BDBBBF", "Z@ c #AFB4B6", "`@ c #B4BDB5", " # c #BCC2B9", ".# c #C0BFBE", "+# c #C1BEBE", "@# c #C3C1C0", "## c #B8B4C0", "$# c #938CBB", "%# c #1E00AA", "&# c #3115AC", "*# c #8D7FBA", "=# c #BCBEBE", "-# c #C0BEBE", ";# c #C1C0C1", "># c #BCBBBB", ",# c #AFAEAF", "'# c #A5A4A5", ")# c #9C9A9B", "!# c #8F8E90", "~# c #7A7C80", "{# c #6E6D73", "]# c #6E676F", "^# c #6B6A75", "/# c #706971", "(# c #766467", "_# c #71666C", ":# c #71656C", "<# c #756063", "[# c #696167", "}# c #676065", "|# c #6F5B5E", "1# c #716067", "2# c #756D75", "3# c #7F797E", "4# c #888484", "5# c #918E8E", "6# c #999798", "7# c #9E9B9E", "8# c #A7A6A8", "9# c #B6B6B6", "0# c #C3C3C3", "a# c #BBBBBF", "b# c #B5B7BB", "c# c #B0B6BB", "d# c #AFB9C2", "e# c #B2BCC7", "f# c #B6C1CD", "g# c #BCC9D2", "h# c #C2CED8", "i# c #C4CFD8", "j# c #C3D0D6", "k# c #C3CFD6", "l# c #C3CED7", "m# c #C5CED8", "n# c #C4CED8", "o# c #C3CDD7", "p# c #C2CFD7", "q# c #C2CFD8", "r# c #C2D0D8", "s# c #C2CFD6", "t# c #BDCBD3", "u# c #BECAD4", "v# c #C9CED9", "w# c #C2C6CE", "x# c #B4BCBE", "y# c #B2C2BB", "z# c #B8C4BC", "A# c #BBBDBC", "B# c #BEBCBF", "C# c #BFBDC1", "D# c #C1C2BD", "E# c #B6B6BD", "F# c #1F00AA", "G# c #3219A9", "H# c #8F80BA", "I# c #C7C2C4", "J# c #C3C3C0", "K# c #BCC2C3", "L# c #BCB9BB", "M# c #A6A3A2", "N# c #807C7F", "O# c #5C575F", "P# c #514A52", "Q# c #575153", "R# c #535257", "S# c #494852", "T# c #48404C", "U# c #58525C", "V# c #625D67", "W# c #5C5A64", "X# c #51505A", "Y# c #4E4B56", "Z# c #544C57", "`# c #564F5A", " $ c #504953", ".$ c #4A404A", "+$ c #504A52", "@$ c #56485A", "#$ c #543655", "$$ c #4A3C4A", "%$ c #474648", "&$ c #4E4951", "*$ c #534C57", "=$ c #6C6971", "-$ c #939496", ";$ c #ABA9A9", ">$ c #B6B4B3", ",$ c #BBBBBC", "'$ c #B5B6B9", ")$ c #B0B7BD", "!$ c #B5C0C7", "~$ c #BEC9D3", "{$ c #BCC7D2", "]$ c #BBC8D2", "^$ c #C1CED7", "/$ c #C3D0D7", "($ c #C3CFD7", "_$ c #C2D0D7", ":$ c #C4D0D9", "<$ c #BECBD6", "[$ c #C0CBD2", "}$ c #C6CFCF", "|$ c #BCCDCD", "1$ c #B3C3C5", "2$ c #B4B7BA", "3$ c #BABABB", "4$ c #C1BFB9", "5$ c #BDC3BF", "6$ c #B7B5BD", "7$ c #2100AE", "8$ c #1F00AC", "9$ c #3218A8", "0$ c #8D81B8", "a$ c #C0BDBD", "b$ c #BBBFBF", "c$ c #C2BFBF", "d$ c #CDC4C3", "e$ c #C2BABD", "f$ c #9F9FA6", "g$ c #75777C", "h$ c #5F585A", "i$ c #584647", "j$ c #3D2D45", "k$ c #38314C", "l$ c #4F4E58", "m$ c #5C6167", "n$ c #5F616A", "o$ c #675E68", "p$ c #7D7882", "q$ c #8E909B", "r$ c #9097A2", "s$ c #8F94A0", "t$ c #8D919D", "u$ c #8B919B", "v$ c #8E919D", "w$ c #8D8E9B", "x$ c #898A97", "y$ c #8C909A", "z$ c #8D8C9B", "A$ c #858094", "B$ c #7C7A88", "C$ c #777A81", "D$ c #72757E", "E$ c #5F5F6A", "F$ c #514E58", "G$ c #4F4A50", "H$ c #564E53", "I$ c #5F595E", "J$ c #706E71", "K$ c #999D97", "L$ c #B8BCB5", "M$ c #C0C1BF", "N$ c #C1C0BF", "O$ c #B9BBBC", "P$ c #ADB6B9", "Q$ c #B4C0C7", "R$ c #C2CED7", "S$ c #C0CED6", "T$ c #BCC9D3", "U$ c #BBC8D1", "V$ c #C1CDD2", "W$ c #BDCCD4", "X$ c #B3C1CA", "Y$ c #ACB3BA", "Z$ c #B1B4B7", "`$ c #C0BEBA", " % c #BCBFC1", ".% c #C5C5C3", "+% c #C7C7C6", "@% c #C7CAC8", "#% c #C4CBCA", "$% c #C1C6C5", "%% c #BFC0BF", "&% c #C2C2BE", "*% c #B7B5BC", "=% c #2101AB", "-% c #2100AC", ";% c #1F00AE", ">% c #8D84BA", ",% c #C5C6C3", "'% c #BCC2C1", ")% c #BFC1C2", "!% c #BBB9B9", "~% c #B4AAAC", "{% c #998E94", "]% c #6C6872", "^% c #3C3B47", "/% c #30262C", "(% c #3C252A", "_% c #311F39", ":% c #433D5B", "<% c #717382", "[% c #7B828A", "}% c #7D8088", "|% c #8D8891", "1% c #A0A0AA", "2% c #AFB6C1", "3% c #B6BFCB", "4% c #B3BAC6", "5% c #B0BAC4", "6% c #B4BFC8", "7% c #B7C1CB", "8% c #B8C1CC", "9% c #B8C0CD", "0% c #B7BFCC", "a% c #B6C2CC", "b% c #B3C4CA", "c% c #AEB9C1", "d% c #A9B1BB", "e% c #A3ADB5", "f% c #8C959D", "g% c #6D7179", "h% c #555359", "i% c #4E4C53", "j% c #46444C", "k% c #434146", "l% c #656A66", "m% c #959A95", "n% c #B9BAB9", "o% c #B6BABC", "p% c #B2BEC3", "q% c #BCC9D0", "r% c #C5D1D9", "s% c #C5CFD9", "t% c #C6CFD9", "u% c #C4D1D9", "v% c #C0CCD4", "w% c #BECAD5", "x% c #BAC5CF", "y% c #B1BCC4", "z% c #B5B3B5", "A% c #BBB7B6", "B% c #BDBBBC", "C% c #C0BFBF", "D% c #C1C1C0", "E% c #C2C1BF", "F% c #C2C0C0", "G% c #C0BFC2", "H% c #BFBFC1", "I% c #BDBDBC", "J% c #B8BABC", "K% c #ACADB0", "L% c #A4A4A6", "M% c #A1A2A5", "N% c #A3A9AB", "O% c #AFB3B3", "P% c #BCBCBC", "Q% c #BDBCBE", "R% c #BEC0C0", "S% c #B8B5BD", "T% c #3216AD", "U% c #8F86BE", "V% c #C8CAC5", "W% c #C3C4BF", "X% c #B9B8B7", "Y% c #9F9FA0", "Z% c #76737A", "`% c #534B56", " & c #3B313F", ".& c #302835", "+& c #2F2531", "@& c #342632", "#& c #332836", "$& c #5A5564", "%& c #9598A3", "&& c #9296A1", "*& c #898E97", "=& c #969DA5", "-& c #A6AEB5", ";& c #AEB8C2", ">& c #AFB9C6", ",& c #A0AAB4", "'& c #9DA8B1", ")& c #ABB7C2", "!& c #B0BEC7", "~& c #B1BEC6", "{& c #AFBBC7", "]& c #AFBAC7", "^& c #B0BCC7", "/& c #AFBFC6", "(& c #A5B4BB", "_& c #A2AFB7", ":& c #A9B4BB", "<& c #A8B5BD", "[& c #A2AEB5", "}& c #99A3A6", "|& c #96A0A8", "1& c #7E868E", "2& c #585A5E", "3& c #464647", "4& c #646567", "5& c #9D9FA0", "6& c #BCBBBC", "7& c #B6B6B9", "8& c #B2B3B6", "9& c #B7BBC0", "0& c #BFC9D2", "a& c #C2CED6", "b& c #C3CED8", "c& c #C2CDD6", "d& c #C1CCD5", "e& c #BDC9D3", "f& c #C0CBD5", "g& c #C4CDD8", "h& c #C4CDD7", "i& c #C3CDD8", "j& c #C3CDD5", "k& c #C2CDD5", "l& c #C1CDD7", "m& c #BFCAD3", "n& c #B7BDC2", "o& c #B2B2B3", "p& c #B2AFAE", "q& c #BAB8BA", "r& c #C0BEC0", "s& c #B6B7BF", "t& c #9A9EA7", "u& c #767882", "v& c #61636B", "w& c #5E5D65", "x& c #69666E", "y& c #868589", "z& c #A6A6A7", "A& c #C3C2C0", "B& c #B8B5BF", "C& c #3217AB", "D& c #9082BC", "E& c #C9C5C6", "F& c #C3C3BF", "G& c #BCC0BF", "H& c #BCBBB7", "I& c #969493", "J& c #5F5961", "K& c #444049", "L& c #39333A", "M& c #31272E", "N& c #3D3237", "O& c #4C4549", "P& c #5B5660", "Q& c #6F6A7D", "R& c #7A7B8E", "S& c #7F8892", "T& c #8D99A3", "U& c #909AA6", "V& c #8A939C", "W& c #9BA5AC", "X& c #A5AFB8", "Y& c #9FABB4", "Z& c #9CAAB1", "`& c #9BA7AF", " * c #98A4AE", ".* c #9EACB5", "+* c #A2B1B9", "@* c #A1AFBA", "#* c #A6B4BF", "$* c #9FACB6", "%* c #8B959E", "&* c #7B8890", "** c #7E8B92", "=* c #919BA3", "-* c #A7B4BB", ";* c #B1BFC6", ">* c #B0BBC4", ",* c #AEBCC5", "'* c #A6B4B9", ")* c #8E9799", "!* c #59575D", "~* c #3F3B42", "{* c #545459", "]* c #948F99", "^* c #BDB6C1", "/* c #C3C1C3", "(* c #BFC0BE", "_* c #B5B5B5", ":* c #A5A6A7", "<* c #B0B5B9", "[* c #BFC8CE", "}* c #C7D1DC", "|* c #C7D0DB", "1* c #B8C2CB", "2* c #AFB6C0", "3* c #AFB7BD", "4* c #ADB8BD", "5* c #A8B3BB", "6* c #ABB7C0", "7* c #ABB8C1", "8* c #A7B4BD", "9* c #ADB9C1", "0* c #ABB5BF", "a* c #A9B3BB", "b* c #ABB4BF", "c* c #B1BBC7", "d* c #BDC8D3", "e* c #C8D5DD", "f* c #CAD4DE", "g* c #C9D3DD", "h* c #C4D2DC", "i* c #C2CED5", "j* c #BFC7CE", "k* c #BCC0C6", "l* c #BEBFC2", "m* c #BFBFC0", "n* c #C4C2C2", "o* c #C6C4C3", "p* c #C5C9C8", "q* c #C4CACA", "r* c #C3C5C5", "s* c #B4B5B7", "t* c #A5A8AE", "u* c #A29EA3", "v* c #A1999E", "w* c #A19A9E", "x* c #A09E9F", "y* c #9FA1A4", "z* c #A3A4AA", "A* c #AFB2B3", "B* c #CCC8CE", "C* c #CDC6CF", "D* c #C8C4CA", "E* c #C6C5C5", "F* c #C5C5C4", "G* c #C2C3C3", "H* c #B9B9BB", "I* c #82838C", "J* c #52515E", "K* c #413D49", "L* c #4B494F", "M* c #545259", "N* c #554F59", "O* c #4B474E", "P* c #525156", "Q* c #727176", "R* c #A3A4A6", "S* c #C0C1C1", "T* c #C4C5C4", "U* c #BFBFC2", "V* c #BBC1C3", "W* c #B9B5BF", "X* c #3218A9", "Y* c #8E80BA", "Z* c #C6C3C5", "`* c #C1C3C1", " = c #C0C0C2", ".= c #B9B9BA", "+= c #949591", "@= c #5F5C5D", "#= c #342A36", "$= c #322935", "%= c #332C33", "&= c #2E2629", "*= c #3D3739", "== c #5D5B5F", "-= c #7C7F89", ";= c #8C8EA3", ">= c #87889E", ",= c #7B7F8D", "'= c #8C94A5", ")= c #959DAF", "!= c #8D97A0", "~= c #99A2AA", "{= c #9CA6AE", "]= c #95A0A7", "^= c #9EAAB1", "/= c #A0ADB4", "(= c #98A1A8", "_= c #9BA6AC", ":= c #9AA7AF", "<= c #95A0A9", "[= c #848D96", "}= c #717982", "|= c #6E7880", "1= c #78838D", "2= c #8A959F", "3= c #A1AEB6", "4= c #ADBAC3", "5= c #ACB8C4", "6= c #ABB9C3", "7= c #AFBFC4", "8= c #ABB9BC", "9= c #898B94", "0= c #56535D", "a= c #37363E", "b= c #685F6F", "c= c #9E95A3", "d= c #B5B4B7", "e= c #C0C0BF", "f= c #C2C2C1", "g= c #C3C2C2", "h= c #B1B0B0", "i= c #96979A", "j= c #ADB5BC", "k= c #C4D2D9", "l= c #C0CDD6", "m= c #BECBD3", "n= c #BAC7CF", "o= c #BAC6CE", "p= c #B2BDC5", "q= c #ACB3BD", "r= c #ADB5BB", "s= c #ACB7BB", "t= c #A9B4BC", "u= c #ABB8BF", "v= c #A9B7BF", "w= c #A5B2BB", "x= c #A7B2B9", "y= c #AFBAC5", "z= c #C3D1D9", "A= c #BFCBD3", "B= c #B1BCC6", "C= c #AEB9C2", "D= c #ABB5BE", "E= c #BDC9D2", "F= c #BCC2C5", "G= c #B7B9B9", "H= c #BDBBC0", "I= c #C4C0C4", "J= c #BEBCC2", "K= c #B6B4B8", "L= c #ADACAC", "M= c #A7ACAC", "N= c #9EA4A5", "O= c #939398", "P= c #89898D", "Q= c #7D7D84", "R= c #70707A", "S= c #6E6972", "T= c #706770", "U= c #726972", "V= c #706E75", "W= c #6F7179", "X= c #71727D", "Y= c #7D7C83", "Z= c #8C888F", "`= c #99929E", " - c #A59BA8", ".- c #A8A2AB", "+- c #A8A7AB", "@- c #A9ABAC", "#- c #B3B3B3", "$- c #C1BFBE", "%- c #C5C3C2", "&- c #B8B8B7", "*- c #929395", "=- c #4F5058", "-- c #3B3744", ";- c #57525E", ">- c #707078", ",- c #797C83", "'- c #76767E", ")- c #5B5C65", "!- c #4B4D56", "~- c #51535A", "{- c #6A6D73", "]- c #8D8E91", "^- c #AFACAE", "/- c #C2BFC4", "(- c #C0BDBE", "_- c #C1BDBB", ":- c #C3C2BF", "<- c #B7B5C0", "[- c #1F01AF", "}- c #2000AD", "|- c #3217AC", "1- c #8C81BA", "2- c #C3C6C4", "3- c #BFC8C3", "4- c #C0BEBB", "5- c #C3C0C3", "6- c #BBBABD", "7- c #9F9FA1", "8- c #595A5A", "9- c #2E2B2F", "0- c #2D232F", "a- c #342836", "b- c #2E242E", "c- c #261F24", "d- c #353138", "e- c #5D606A", "f- c #858E9A", "g- c #777E8A", "h- c #797785", "i- c #978EA0", "j- c #9893AD", "k- c #969BB1", "l- c #9EAAB4", "m- c #9DA9AF", "n- c #97A1A8", "o- c #929CA4", "p- c #96A1A8", "q- c #9EA7B0", "r- c #A2A7B1", "s- c #9B9DA3", "t- c #969B9F", "u- c #929CA2", "v- c #7A818A", "w- c #6A7078", "x- c #6F767E", "y- c #808A92", "z- c #8F9AA3", "A- c #95A2B0", "B- c #9FADB7", "C- c #A7B5BD", "D- c #ABB6C2", "E- c #ACBCC1", "F- c #ADBCBF", "G- c #B5BEC7", "H- c #90939E", "I- c #504F58", "J- c #47424E", "K- c #6A646E", "L- c #939497", "M- c #B3B4B4", "N- c #C0BFC0", "O- c #C0BEC1", "P- c #C5C3C0", "Q- c #8E9198", "R- c #AAB2BB", "S- c #C6D2D9", "T- c #C4D2D8", "U- c #BDC9D4", "V- c #C4CED7", "W- c #B2BFC7", "X- c #A6B5BB", "Y- c #A7B5BC", "Z- c #B4C0C9", "`- c #BDC9D1", " ; c #BEC8D2", ".; c #BECBD2", "+; c #BDCAD2", "@; c #C1CED6", "#; c #C8D5DC", "$; c #B6C2CA", "%; c #8C97A0", "&; c #8A949C", "*; c #898E93", "=; c #91959C", "-; c #A8AEB8", ";; c #BECAD2", ">; c #B3BFC3", ",; c #ABB2B5", "'; c #B3B4B7", "); c #BBBABF", "!; c #BDBEC1", "~; c #C0BFC1", "{; c #C1BBC4", "]; c #ADABB6", "^; c #93969C", "/; c #7F8185", "(; c #75787A", "_; c #66666B", ":; c #524C56", "<; c #47434F", "[; c #45424E", "}; c #48424D", "|; c #4A4752", "1; c #504D58", "2; c #554F5A", "3; c #504F59", "4; c #4B4B55", "5; c #48434F", "6; c #423844", "7; c #403844", "8; c #474350", "9; c #5F5A65", "0; c #6E6A74", "a; c #71727C", "b; c #73757A", "c; c #8B8C8F", "d; c #AFAFB2", "e; c #BEC0BD", "f; c #9B9C9F", "g; c #59585F", "h; c #3F3E46", "i; c #63646D", "j; c #9CA1AC", "k; c #A8B0BD", "l; c #A5AFB9", "m; c #A7B1B9", "n; c #A3ADB7", "o; c #9099A4", "p; c #707780", "q; c #3F424C", "r; c #46434D", "s; c #807981", "t; c #B2A9B3", "u; c #C4BEC6", "v; c #C1BFC0", "w; c #BCBEC3", "x; c #BBC2C3", "y; c #BEBEBB", "z; c #C1BFBA", "A; c #C1BCC1", "B; c #C2BBC2", "C; c #2100B0", "D; c #1F00AB", "E; c #3217AD", "F; c #8E80BC", "G; c #C2C4C3", "H; c #C1C1B9", "I; c #C8C4C4", "J; c #A7A4A5", "K; c #676368", "L; c #383335", "M; c #2B2329", "N; c #312633", "O; c #352B34", "P; c #31262D", "Q; c #2D242E", "R; c #37313D", "S; c #888D97", "T; c #5A5D67", "U; c #5B5A66", "V; c #9B9CA8", "W; c #ABB1C0", "X; c #A0AAB8", "Y; c #96A5AB", "Z; c #8E9CA3", "`; c #94A0A8", " > c #9FACB3", ".> c #95A1AB", "+> c #8F99A3", "@> c #959CA6", "#> c #9A9AAC", "$> c #8E8EA0", "%> c #787D88", "&> c #6E757E", "*> c #737C85", "=> c #838C94", "-> c #929EA9", ";> c #98A3B0", ">> c #95A0AB", ",> c #919EA6", "'> c #99A6AE", ")> c #A8B3C0", "!> c #ABB7C1", "~> c #A8B6BD", "{> c #AAB8BC", "]> c #BBC9CF", "^> c #A2ACB3", "/> c #65676F", "(> c #3E3742", "_> c #47404A", ":> c #696A71", "<> c #7E8187", "[> c #999BA1", "}> c #C0C1C6", "|> c #ADADB0", "1> c #94959A", "2> c #AEB5BB", "3> c #C5D2D9", "4> c #C1CBD5", "5> c #C1CBD6", "6> c #B9C3CC", "7> c #ADB8C0", "8> c #ACB8BF", "9> c #B1BDC5", "0> c #B6C1CB", "a> c #BAC5CE", "b> c #BDC8D1", "c> c #AEB9C0", "d> c #AAB6BE", "e> c #A5B1B9", "f> c #9AA3A7", "g> c #878A8E", "h> c #8A8E93", "i> c #A2ADB2", "j> c #B9C0C7", "k> c #BDBEC4", "l> c #B5B5B9", "m> c #B7BCBD", "n> c #C3C2C1", "o> c #A0A0A8", "p> c #817D87", "q> c #6C6A73", "r> c #6B6C75", "s> c #767880", "t> c #7D7E86", "u> c #7F8088", "v> c #81818C", "w> c #838896", "x> c #88919D", "y> c #8E969E", "z> c #8D909C", "A> c #8E8596", "B> c #807884", "C> c #6B666F", "D> c #3A343C", "E> c #47434B", "F> c #6E707B", "G> c #797983", "H> c #6D6D78", "I> c #5E616B", "J> c #4A4850", "K> c #524E55", "L> c #79787F", "M> c #B0AFB4", "N> c #CFCED1", "O> c #CBCCCB", "P> c #9EA0A0", "Q> c #666469", "R> c #443E49", "S> c #6D6F7B", "T> c #9DA6B1", "U> c #B0BBC8", "V> c #AEB9C6", "W> c #AFBBC4", "X> c #B1BCC5", "Y> c #99A5B0", "Z> c #7A808B", "`> c #5B5963", " , c #504751", "., c #7E727D", "+, c #ABA3AB", "@, c #BFBCBD", "#, c #BFBCBC", "$, c #BFBEBB", "%, c #BEC0C2", "&, c #BCC0C3", "*, c #B7B6C0", "=, c #1900B1", "-, c #1F00AF", ";, c #8F7FBC", ">, c #C8C2C6", ",, c #BFBCC0", "', c #C1BAC3", "), c #BAC4C4", "!, c #B7B5B8", "~, c #828083", "{, c #3A353B", "], c #2C2329", "^, c #332930", "/, c #332832", "(, c #2F262B", "_, c #2D2428", ":, c #332830", "<, c #4E434D", "[, c #6B6672", "}, c #777A87", "|, c #4D505C", "1, c #4C4C57", "2, c #7B7F87", "3, c #949DA3", "4, c #94A1A9", "5, c #909EA6", "6, c #8B95A5", "7, c #909AA8", "8, c #98A6AE", "9, c #95A1AA", "0, c #8C98A1", "a, c #86919A", "b, c #898FA3", "c, c #7E7F96", "d, c #6B6D79", "e, c #778087", "f, c #89969D", "g, c #939FA6", "h, c #98A5B0", "i, c #98A5B2", "j, c #959FAA", "k, c #8C99A1", "l, c #95A2AB", "m, c #AAB6BF", "n, c #B2BFC2", "o, c #B2C0C0", "p, c #AFBCC0", "q, c #ADBAC0", "r, c #8E969C", "s, c #595961", "t, c #332C38", "u, c #362C38", "v, c #4F474F", "w, c #72737C", "x, c #B0B0B5", "y, c #C1C0C5", "z, c #A4A5A8", "A, c #9A9EA0", "B, c #B2BCC0", "C, c #C5D1D8", "D, c #BBC7CF", "E, c #AEBAC2", "F, c #A7B1BA", "G, c #B2BDC7", "H, c #C6D1D9", "I, c #C8D3DC", "J, c #B5C2C8", "K, c #9DA5A9", "L, c #909599", "M, c #969FA1", "N, c #B6BBC1", "O, c #C4C3CB", "P, c #B9B9BD", "Q, c #B8BDBF", "R, c #C4C2C0", "S, c #BAB8B7", "T, c #A3A2A4", "U, c #8E9096", "V, c #777A85", "W, c #636770", "X, c #61646C", "Y, c #767982", "Z, c #A0A7AF", "`, c #A3A8B0", " ' c #9EA2AD", ".' c #989DA9", "+' c #929AA6", "@' c #828C92", "#' c #82838E", "$' c #867E8F", "%' c #7C717D", "&' c #6D646C", "*' c #5E5962", "=' c #48464C", "-' c #65666D", ";' c #A1A6B1", ">' c #A2A8B3", ",' c #8B909A", "'' c #787E87", ")' c #64626D", "!' c #4F4A55", "~' c #818188", "{' c #ACACB0", "]' c #676868", "^' c #39363A", "/' c #3B343C", "(' c #7A7D89", "_' c #A8B3BE", ":' c #AFBAC2", "<' c #ACB7C1", "[' c #AAB5BF", "}' c #A9B5BB", "|' c #ACB7BF", "1' c #AFB8C2", "2' c #AEB4BD", "3' c #8D9099", "4' c #615F6A", "5' c #635D67", "6' c #8B868C", "7' c #B6B5B7", "8' c #BCBEC1", "9' c #C1C1C3", "0' c #3216AC", "a' c #907FBC", "b' c #C7C4C6", "c' c #C0C7C4", "d' c #BCBDC0", "e' c #C3BFC5", "f' c #C2BAC5", "g' c #95949E", "h' c #57575F", "i' c #282328", "j' c #29212A", "k' c #342934", "l' c #33292E", "m' c #282125", "n' c #231C21", "o' c #30272C", "p' c #685D63", "q' c #777480", "r' c #586173", "s' c #4C525F", "t' c #4C4952", "u' c #4C4751", "v' c #5E5D67", "w' c #7A828C", "x' c #939FAC", "y' c #969BB2", "z' c #8B8EA5", "A' c #828E98", "B' c #919CA3", "C' c #929DA4", "D' c #808D94", "E' c #737F8A", "F' c #6F7782", "G' c #747680", "H' c #858C94", "I' c #939EA6", "J' c #96A3AB", "K' c #96A3AA", "L' c #96A3AE", "M' c #98A4B2", "N' c #96A4AF", "O' c #9CABB2", "P' c #A9B7BB", "Q' c #B3C1B9", "R' c #B7C6BD", "S' c #B1BEC2", "T' c #979DA7", "U' c #3E3D45", "V' c #282834", "W' c #312832", "X' c #473034", "Y' c #3E2F38", "Z' c #5B5761", "`' c #9C9DA1", " ) c #95989B", ".) c #97A1A4", "+) c #B3C0C5", "@) c #ACBAC0", "#) c #B3BFCA", "$) c #BDCAD3", "%) c #BECBD4", "&) c #BDCAD4", "*) c #C6D0DA", "=) c #B3BBC0", "-) c #A4A8AA", ";) c #A7AFB4", ">) c #B2B9C0", ",) c #BBBCC1", "') c #BDBDC2", ")) c #BDBEC0", "!) c #BFBCBA", "~) c #9D9A9C", "{) c #68676D", "]) c #565861", "^) c #646975", "/) c #7D8893", "() c #919DA6", "_) c #A0ACB4", ":) c #ABB7BE", "<) c #AFBABE", "[) c #9BA4A9", "}) c #777B85", "|) c #5E5A65", "1) c #4B4853", "2) c #3C3D48", "3) c #343239", "4) c #38353C", "5) c #45424F", "6) c #49434F", "7) c #5A5961", "8) c #5B5C64", "9) c #777C86", "0) c #A5AFBB", "a) c #AEB7C1", "b) c #A4AFB6", "c) c #9EABB2", "d) c #A4ABB6", "e) c #7B7C87", "f) c #3A3941", "g) c #494850", "h) c #606066", "i) c #57565A", "j) c #363538", "k) c #272629", "l) c #363437", "m) c #585A62", "n) c #828892", "o) c #A4AFB7", "p) c #ACB9BF", "q) c #AAB9BD", "r) c #AAB9BF", "s) c #ADB9C0", "t) c #B3B7BC", "u) c #B0B6BC", "v) c #AAB4BD", "w) c #9EA7B4", "x) c #737884", "y) c #787981", "z) c #AAABAE", "A) c #8B84BC", "B) c #C2C9C4", "C) c #C2C5C0", "D) c #BAC0C2", "E) c #C4C5C8", "F) c #C6BABF", "G) c #776E78", "H) c #38313E", "I) c #2B222D", "J) c #2F262D", "K) c #33292F", "L) c #322931", "M) c #2A262E", "N) c #211C2C", "O) c #281F38", "P) c #626271", "Q) c #757B84", "R) c #565966", "S) c #4D4B57", "T) c #413B47", "U) c #312D38", "V) c #4B4A56", "W) c #89979E", "X) c #8C94A3", "Y) c #8C92A3", "Z) c #8D99A6", "`) c #8D9AA2", " ! c #828D95", ".! c #727C84", "+! c #6D757B", "@! c #787B87", "#! c #87869C", "$! c #7F8292", "%! c #868D96", "&! c #98A5AC", "*! c #8E969F", "=! c #899099", "-! c #96A1AB", ";! c #A8B7BE", ">! c #A7B6BB", ",! c #96A3A7", "'! c #838F8E", ")! c #8C9A99", "!! c #9CA9AE", "~! c #6C6C77", "{! c #443D49", "]! c #3E3C46", "^! c #41424B", "/! c #3E3940", "(! c #3B2C2E", "_! c #3A2D34", ":! c #4C444F", "~ c #B9B1B1", ",~ c #64565E", "'~ c #2C212B", ")~ c #2F242F", "!~ c #342834", "~~ c #2B2530", "{~ c #322D43", "]~ c #484166", "^~ c #5A5F74", "/~ c #5A6067", "(~ c #4D4751", "_~ c #443A43", ":~ c #352D37", "<~ c #282733", "[~ c #4A4B55", "}~ c #727681", "|~ c #878D9F", "1~ c #858A96", "2~ c #798086", "3~ c #717881", "4~ c #748189", "5~ c #748089", "6~ c #6E787F", "7~ c #757980", "8~ c #878997", "9~ c #9394AB", "0~ c #6A6B7C", "a~ c #5C5E68", "b~ c #737781", "c~ c #757780", "d~ c #6D6F78", "e~ c #6F767F", "f~ c #919BA2", "g~ c #909B9F", "h~ c #6B7275", "i~ c #4D5256", "j~ c #595D63", "k~ c #6E747B", "l~ c #3B343F", "m~ c #636771", "n~ c #797D86", "o~ c #605F66", "p~ c #372F36", "q~ c #372E37", "r~ c #49424E", "s~ c #645E67", "t~ c #9A989C", "u~ c #BBBCBD", "v~ c #9E9D9A", "w~ c #80807E", "x~ c #7A7A7F", "y~ c #A7AFB6", "z~ c #C4D0D7", "A~ c #B9C6CC", "B~ c #B0BEC4", "C~ c #B5C0C9", "D~ c #BFCCD6", "E~ c #BDCBD4", "F~ c #C5D2DA", "G~ c #C3D0D9", "H~ c #A3AFB9", "I~ c #9EABB3", "J~ c #B5C3CA", "K~ c #B4BDC1", "L~ c #B2B5B7", "M~ c #A2A2A2", "N~ c #858588", "O~ c #62636D", "P~ c #70717C", "Q~ c #9FA4AA", "R~ c #B5BEC4", "S~ c #B2BEC7", "T~ c #A5B1BC", "U~ c #939EA9", "V~ c #777F87", "W~ c #57585E", "X~ c #3C343E", "Y~ c #38313D", "Z~ c #4A4855", "`~ c #64636E", " { c #9398A1", ".{ c #A7B3BD", "+{ c #B4C0CB", "@{ c #B7C0CB", "#{ c #B8BFCA", "${ c #B6BFCA", "%{ c #ACBCC2", "&{ c #A6B4BB", "*{ c #ACBAC2", "={ c #A5ACB7", "-{ c #777982", ";{ c #453E4A", ">{ c #2C202B", ",{ c #2A1E23", "'{ c #2D2328", "){ c #4C4750", "!{ c #747881", "~{ c #65656F", "{{ c #4B4650", "]{ c #4A4951", "^{ c #7E838A", "/{ c #A5B0B8", "({ c #ADB9C4", "_{ c #ABB6C0", ":{ c #A9B5BC", "<{ c #AFB7C3", "[{ c #999DA7", "}{ c #7C7E84", "|{ c #9D9DA4", "1{ c #BCBCC1", "2{ c #C4C4BA", "3{ c #BAB8B9", "4{ c #8E81BC", "5{ c #C7C3C5", "6{ c #C0C1C0", "7{ c #BABBBB", "8{ c #9F9EA0", "9{ c #564F52", "0{ c #2C2126", "a{ c #2F2529", "b{ c #342932", "c{ c #342835", "d{ c #2A1F2B", "e{ c #4B4357", "f{ c #7D7B98", "g{ c #5D5C6C", "h{ c #39343C", "i{ c #362C37", "j{ c #362B32", "k{ c #2C262B", "l{ c #292731", "m{ c #4A4C50", "n{ c #73707F", "o{ c #887EA2", "p{ c #7B788B", "q{ c #555558", "r{ c #343135", "s{ c #535961", "t{ c #6F7B84", "u{ c #737C84", "v{ c #7A8189", "w{ c #89919B", "x{ c #8B939E", "y{ c #4F545F", "z{ c #2C2935", "A{ c #39313D", "B{ c #524E58", "C{ c #4C4B54", "D{ c #373943", "E{ c #5B5D65", "F{ c #606366", "G{ c #3A3B3D", "H{ c #2E292C", "I{ c #373035", "J{ c #3F3B41", "K{ c #372D38", "L{ c #58555F", "M{ c #98A3AB", "N{ c #868A92", "O{ c #3F3642", "P{ c #322934", "Q{ c #4F4752", "R{ c #797079", "S{ c #A8A5A8", "T{ c #B6B7B9", "U{ c #8C8C8E", "V{ c #7A7A7E", "W{ c #8D8F97", "X{ c #B3BBC4", "Y{ c #BECAD0", "Z{ c #ADB8BE", "`{ c #BCC7CF", " ] c #C1CDD5", ".] c #A3B1B9", "+] c #ADB3B5", "@] c #BCBCBB", "#] c #99989A", "$] c #6F7074", "%] c #616168", "&] c #898E98", "*] c #A9B1BE", "=] c #AEB8C4", "-] c #B2C0C8", ";] c #A8B5BC", ">] c #868F98", ",] c #50535E", "'] c #33333F", ")] c #383742", "!] c #45434C", "~] c #605F68", "{] c #858891", "]] c #9BA2AA", "^] c #A5B0B7", "/] c #AEBEC6", "(] c #B0BEC6", "_] c #AFB9C1", ":] c #AFBEC5", "<] c #AEBDC4", "[] c #AAB8BD", "}] c #AFBBC2", "|] c #ACBBC2", "1] c #ADBDC4", "2] c #A0A5B0", "3] c #635F6B", "4] c #382F38", "5] c #2F2629", "6] c #221A1E", "7] c #3A363D", "8] c #70727B", "9] c #9A93A3", "0] c #7C7281", "a] c #3B3840", "b] c #45454C", "c] c #797D85", "d] c #A5B3BB", "e] c #AFBDC5", "f] c #ABB9C0", "g] c #AAB9BC", "h] c #B4BFC7", "i] c #929AA2", "j] c #606169", "k] c #7C7D86", "l] c #A9AAAE", "m] c #BFBFBA", "n] c #BEC4C1", "o] c #B9B6BC", "p] c #3216AE", "q] c #C3C7C4", "r] c #C2C4BF", "s] c #B2B2B4", "t] c #87898C", "u] c #484849", "v] c #282428", "w] c #28252D", "x] c #302733", "y] c #332E36", "z] c #312731", "A] c #4F4856", "B] c #787888", "C] c #524E5B", "D] c #312431", "E] c #302431", "F] c #2F282C", "G] c #29272C", "H] c #2E2D38", "I] c #515159", "J] c #6A5F6A", "K] c #685061", "L] c #4E4451", "M] c #34333B", "N] c #2F2931", "O] c #514F58", "P] c #6A6C76", "Q] c #6C6D75", "R] c #6B6F78", "S] c #666D77", "T] c #585E68", "U] c #3B3845", "V] c #2C232F", "W] c #312831", "X] c #39313E", "Y] c #2E2733", "Z] c #3B353B", "`] c #3E383B", " ^ c #2F272E", ".^ c #291E27", "+^ c #281B24", "@^ c #30252F", "#^ c #5E5863", "$^ c #91959F", "%^ c #B2C2C8", "&^ c #C2CFD9", "*^ c #9699A4", "=^ c #4A414E", "-^ c #2F2430", ";^ c #433C46", ">^ c #6D6A74", ",^ c #A7A2AC", "'^ c #C5BEC5", ")^ c #838183", "!^ c #7B7A7F", "~^ c #A3ABB3", "{^ c #BDC6CE", "]^ c #AAAFB8", "^^ c #B1BBC2", "/^ c #C1CDD6", "(^ c #A1ADB6", "_^ c #9CAAB4", ":^ c #B6C3CD", "<^ c #B3BCC1", "[^ c #B2B5B6", "}^ c #C8C8C7", "|^ c #B7B7B8", "1^ c #8D8E93", "2^ c #6B6F76", "3^ c #6F737C", "4^ c #ABB4BE", "5^ c #B3C1CB", "6^ c #B0BFC8", "7^ c #8F9AA2", "8^ c #53555C", "9^ c #35303A", "0^ c #413C48", "a^ c #61606B", "b^ c #777B83", "c^ c #8C939B", "d^ c #A1ACB3", "e^ c #A3B2B9", "f^ c #A5B3BA", "g^ c #AAB7C1", "h^ c #AAB6BC", "i^ c #ABBCC2", "j^ c #AABAC1", "k^ c #AFB8BE", "l^ c #B0B6BA", "m^ c #ABB5BB", "n^ c #ACB9C0", "o^ c #ADBCC3", "p^ c #AEBBC2", "q^ c #B1BEC5", "r^ c #ADB8C1", "s^ c #959CA4", "t^ c #83878D", "u^ c #7B7981", "v^ c #5D5B70", "w^ c #45445B", "x^ c #444452", "y^ c #6E6877", "z^ c #67606C", "A^ c #302C32", "B^ c #15171B", "C^ c #444A51", "D^ c #92A0A7", "E^ c #ABBBC0", "F^ c #ACBBC0", "G^ c #ABBABF", "H^ c #BAC6CF", "I^ c #939AA4", "J^ c #4D4D58", "K^ c #4A4C56", "L^ c #807F87", "M^ c #BAB4BA", "N^ c #C2C2C4", "O^ c #BFC6C0", "P^ c #B4BAC0", "Q^ c #1700AE", "R^ c #1900AC", "S^ c #C3C8C4", "T^ c #AEAEAD", "U^ c #797A7C", "V^ c #424045", "W^ c #29252C", "X^ c #292531", "Y^ c #302A37", "Z^ c #332D38", "`^ c #35333C", " / c #433F47", "./ c #545159", "+/ c #595B64", "@/ c #413C47", "#/ c #322632", "$/ c #322733", "%/ c #2C262C", "&/ c #302E34", "*/ c #41404B", "=/ c #55535E", "-/ c #564B52", ";/ c #463033", ">/ c #2D222B", ",/ c #302C39", "'/ c #56505A", ")/ c #59545E", "!/ c #59535E", "~/ c #56555E", "{/ c #494953", "]/ c #373340", "^/ c #312836", "// c #362C36", "(/ c #352B36", "_/ c #302331", ":/ c #302330", "( c #8E80BD", ",( c #C6C3C4", "'( c #C8C7C2", ")( c #ACADA8", "!( c #707173", "~( c #413B45", "{( c #302531", "]( c #302634", "^( c #36313E", "/( c #363542", "(( c #383844", "_( c #56555C", ":( c #5B5B61", "<( c #42424C", "[( c #332D34", "}( c #31282D", "|( c #312A31", "1( c #2E2530", "2( c #3E3641", "3( c #58535D", "4( c #514C57", "5( c #413742", "6( c #352832", "7( c #2D212D", "8( c #3D3541", "9( c #514954", "0( c #443C47", "a( c #443D47", "b( c #453F49", "c( c #332936", "d( c #302532", "e( c #372E3A", "f( c #3F3843", "g( c #382F3B", "h( c #322635", "i( c #332735", "j( c #2A242F", "k( c #2C2A35", "l( c #42404C", "m( c #656A74", "n( c #88949D", "o( c #A4B2BE", "p( c #B3C2CB", "q( c #B7C7CE", "r( c #B5C6CE", "s( c #BECFD7", "t( c #9DA9B0", "u( c #5D5D66", "v( c #393541", "w( c #3D3C49", "x( c #60626D", "y( c #A1A0A7", "z( c #C3C1C4", "A( c #C2C0BF", "B( c #BABABD", "C( c #A9ABAD", "D( c #8A8C92", "E( c #9398A2", "F( c #BBC5CF", "G( c #BFC8D3", "H( c #B0B8C4", "I( c #A6B2BA", "J( c #B7C4CC", "K( c #C5D1DA", "L( c #C4CFD9", "M( c #C1CFD7", "N( c #C0C4C8", "O( c #BCC1C7", "P( c #BCC1C8", "Q( c #BAB9BD", "R( c #BEC5C5", "S( c #6C717A", "T( c #727982", "U( c #869298", "V( c #9AA3A6", "W( c #A8ACAF", "X( c #AAB2B8", "Y( c #AAB6BD", "Z( c #AAB9BE", "`( c #A1AFB3", " _ c #8B979F", "._ c #889198", "+_ c #8F97A1", "@_ c #98A3B1", "#_ c #A7B5BE", "$_ c #A8B7BF", "%_ c #9DABB8", "&_ c #9FA6B3", "*_ c #A6ADB7", "=_ c #ABB9BF", "-_ c #ACBABF", ";_ c #AFBBC3", ">_ c #ADB9BE", ",_ c #ACB8BD", "'_ c #ABB8BE", ")_ c #ABBAC0", "!_ c #ACBBC1", "~_ c #ABBABE", "{_ c #ACB9BE", "]_ c #AEB9C5", "^_ c #B5C0D0", "/_ c #888E9E", "(_ c #3C3543", "__ c #221921", ":_ c #262228", "<_ c #36353C", "[_ c #5C565D", "}_ c #88858D", "|_ c #A6B1B9", "1_ c #ABB8BC", "2_ c #ABB9BD", "3_ c #AAB5BC", "4_ c #ABB8BD", "5_ c #B6C3C9", "6_ c #8E959F", "7_ c #454551", "8_ c #2C2733", "9_ c #625B62", "0_ c #B3B0AD", "a_ c #C5C4C2", "b_ c #C4C0C3", "c_ c #BAB4C3", "d_ c #1F00B0", "e_ c #8D80BB", "f_ c #C5C3C3", "g_ c #C7C7C5", "h_ c #A8A9A9", "i_ c #66686F", "j_ c #3E3C43", "k_ c #302B31", "l_ c #322A32", "m_ c #413E48", "n_ c #44444F", "o_ c #3B3A47", "p_ c #4A4852", "q_ c #4C484E", "r_ c #373138", "s_ c #2A262A", "t_ c #2A2527", "u_ c #30292C", "v_ c #403942", "w_ c #4D4652", "x_ c #504A53", "y_ c #433944", "z_ c #362C39", "A_ c #332937", "B_ c #3E2A30", "C_ c #45313E", "D_ c #433856", "E_ c #392F44", "F_ c #322732", "G_ c #332734", "H_ c #322631", "I_ c #2D232C", "J_ c #2F242E", "K_ c #332B37", "L_ c #3E3843", "M_ c #4B4651", "N_ c #615C68", "O_ c #686A74", "P_ c #737A82", "Q_ c #879198", "R_ c #9CAAB0", "S_ c #ADBDC5", "T_ c #B8CAD2", "U_ c #B7CAD1", "V_ c #B4C6CD", "W_ c #B5C5CC", "X_ c #BDCFD6", "Y_ c #9FADB4", "Z_ c #666B73", "`_ c #4F5059", " : c #46434E", ".: c #48414D", "+: c #7B727C", "@: c #A9A4A9", "#: c #C2C0B8", "$: c #B8B8B5", "%: c #A1A4A5", "&: c #8E8F96", "*: c #9CA2AD", "=: c #BCC8D1", "-: c #A2ACB6", ";: c #B3BFC8", ">: c #C3CED9", ",: c #C6CFD5", "': c #C1CAD0", "): c #B6C4C9", "!: c #B7C2C9", "~: c #B5B6BA", "{: c #C1C4C5", "]: c #B6BBBD", "^: c #999B9D", "/: c #5E5F65", "(: c #4F515B", "_: c #747780", ":: c #99A4AB", "<: c #A8B5B8", "[: c #A9B3B5", "}: c #B5BEC6", "|: c #B6BFC9", "1: c #A2AEB6", "2: c #869397", "3: c #7F8B90", "4: c #8A979F", "5: c #97A4AC", "6: c #9AA7B1", "7: c #9EAAB2", "8: c #92A0A9", "9: c #95A0AE", "0: c #A1ABB9", "a: c #AAB9C1", "b: c #ABBAC2", "c: c #AAB4C1", "d: c #AAB5C1", "e: c #ABB6C4", "f: c #B0BECB", "g: c #808897", "h: c #312E3B", "i: c #1A1118", "j: c #211C22", "k: c #393842", "l: c #827E86", "m: c #B0B1B6", "n: c #B4BEC4", "o: c #A9B8BC", "p: c #A9B6BB", "q: c #B9C6CD", "r: c #9198A0", "s: c #312B38", "t: c #B2B2AF", "u: c #C3C3C1", "v: c #C1BCBC", "w: c #C5C2BD", "x: c #BBB6BD", "y: c #C4C4C2", "z: c #A5A6AA", "A: c #61646D", "B: c #3B3B42", "C: c #2D2A2E", "D: c #2E2A31", "E: c #4D4C52", "F: c #54545C", "G: c #3E3E4B", "H: c #3B3643", "I: c #3A303A", "J: c #292329", "K: c #30262D", "L: c #423A42", "M: c #48404F", "N: c #3E3749", "O: c #34293A", "P: c #2D2230", "Q: c #2F232F", "R: c #3E292E", "S: c #412C39", "T: c #362B4A", "U: c #372F46", "V: c #443B45", "W: c #3D3542", "X: c #433E48", "Y: c #535259", "Z: c #5E5B63", "`: c #646671", " < c #6A6F77", ".< c #7C8289", "+< c #939BA3", "@< c #A0AAB2", "#< c #AAB8BE", "$< c #B5C6CB", "%< c #B7C9CF", "&< c #B6C6CE", "*< c #B5C5CD", "=< c #B4C5CC", "-< c #B9CAD1", ";< c #A8B8BF", ">< c #868F97", ",< c #6F747C", "'< c #504E57", ")< c #332B36", "!< c #584E57", "~< c #908A8F", "{< c #B9B7B9", "]< c #C7C6BD", "^< c #B3B2AC", "/< c #939293", "(< c #95989F", "_< c #AFB6BF", ":< c #C3CCD4", "<< c #A1A8AF", "[< c #9BA3AA", "}< c #BDC6D0", "|< c #C5CFD7", "1< c #C5CCD5", "2< c #C4D1DA", "3< c #BECCD4", "4< c #B5C4C9", "5< c #B8C7CE", "6< c #B8C2C9", "7< c #B2B3B7", "8< c #B8B8B8", "9< c #C5C0C8", "0< c #A5A1A9", "a< c #6C6B72", "b< c #585764", "c< c #5E5D6C", "d< c #6E6F79", "e< c #89929A", "f< c #A0AEB5", "g< c #A4ADB6", "h< c #959AA6", "i< c #858D95", "j< c #757F82", "k< c #758186", "l< c #86929B", "m< c #909DA5", "n< c #A0ADB6", "o< c #9AA4AC", "p< c #909AA2", "q< c #8C989F", "r< c #93A2AD", "s< c #A1AEBA", "t< c #ABB8C0", "u< c #B0BCC2", "v< c #ADBCC1", "w< c #ADBAC2", "x< c #ABB5C1", "y< c #AAB8C5", "z< c #86919D", "A< c #4C4D57", "B< c #2B262E", "C< c #221D25", "D< c #302D37", "E< c #67696D", "F< c #919598", "G< c #9CA5AD", "H< c #AFBEC4", "I< c #ADBBC1", "J< c #AAB7BC", "K< c #B6C3CA", "L< c #3E3743", "M< c #3E3844", "N< c #77767D", "O< c #B4B4B5", "P< c #BAB9B8", "Q< c #8D82B9", "R< c #C5C4C1", "S< c #A5A6A9", "T< c #62656D", "U< c #3D3743", "V< c #2C2430", "W< c #292732", "X< c #525358", "Y< c #5C5D63", "Z< c #3F3F4A", "`< c #352E3C", " [ c #2F252F", ".[ c #251F23", "+[ c #2B232B", "@[ c #322834", "#[ c #372D41", "$[ c #332A4D", "%[ c #322840", "&[ c #332733", "*[ c #332834", "=[ c #3D313B", "-[ c #463E48", ";[ c #4C4A57", ">[ c #575764", ",[ c #686A72", "'[ c #78787E", ")[ c #686B72", "![ c #707981", "~[ c #ACB6BE", "{[ c #B1C3C9", "][ c #B4C6CB", "^[ c #B6C9CE", "/[ c #B7CBD2", "([ c #B6C9D0", "_[ c #B7C6CF", ":[ c #B8C4D0", "<[ c #B6C5CD", "[[ c #B4C6CC", "}[ c #B5C6CD", "|[ c #B7C6CE", "1[ c #B1BDC6", "2[ c #8F99A1", "3[ c #595E66", "4[ c #302F37", "5[ c #4D494E", "6[ c #888487", "7[ c #B7B7B7", "8[ c #C8C7C3", "9[ c #ABA9A3", "0[ c #7E7B7C", "a[ c #989FA5", "b[ c #C0C9D1", "c[ c #C9CCD5", "d[ c #A4A4A8", "e[ c #9EA2A6", "f[ c #BDC6CF", "g[ c #BECAD3", "h[ c #C2CCD5", "i[ c #C2CDD4", "j[ c #C3C8CC", "k[ c #C3C7CA", "l[ c #C2CBD3", "m[ c #BCC8D3", "n[ c #BBC7D2", "o[ c #C0CBD4", "p[ c #C4CED6", "q[ c #C0CDD5", "r[ c #BAC7D0", "s[ c #C1CFD9", "t[ c #BAC4CB", "u[ c #AAADB0", "v[ c #C1BFC1", "w[ c #C2BBC5", "x[ c #BCB1C1", "y[ c #8B8090", "z[ c #504854", "A[ c #6E6B81", "B[ c #828299", "C[ c #6E707D", "D[ c #717A82", "E[ c #53545D", "F[ c #63656A", "G[ c #838B8E", "H[ c #93A0A4", "I[ c #93A0A8", "J[ c #919FA6", "K[ c #9CA9B1", "L[ c #A7B2BE", "M[ c #93A0A9", "N[ c #86929A", "O[ c #8D98A0", "P[ c #9BA9B1", "Q[ c #AAB5BD", "R[ c #ABB7BD", "S[ c #ABBBC1", "T[ c #ACBEC3", "U[ c #AEBCC2", "V[ c #AFBCC3", "W[ c #A9B3BD", "X[ c #AAB4BC", "Y[ c #8C9093", "Z[ c #54545D", "`[ c #241F26", " } c #322E31", ".} c #4B4D50", "+} c #9BA7AE", "@} c #ADBBC0", "#} c #ABBABD", "$} c #A8B4BB", "%} c #757D86", "&} c #35343F", "*} c #554E59", "=} c #938D93", "-} c #B9B8BA", ";} c #BAB9B9", ">} c #C7C3C3", ",} c #A6A7A8", "'} c #64666D", ")} c #302D3B", "!} c #2E2836", "~} c #47414C", "{} c #4A464D", "]} c #383238", "^} c #322A2F", "/} c #2E242B", "(} c #261C26", "_} c #2D222D", ":} c #352B37", "<} c #39333E", "[} c #3E3942", "}} c #393140", "|} c #33283F", "1} c #453F4C", "2} c #5C5860", "3} c #6D6B74", "4} c #80808C", "5} c #8D919C", "6} c #929DA2", "7} c #98A3A9", "8} c #A0ACB2", "9} c #A6B2B7", "0} c #9EABB1", "a} c #A2B1B8", "b} c #B3C4CB", "c} c #BBCBD2", "d} c #BCCBD3", "e} c #BACAD2", "f} c #B8CAD0", "g} c #B6CAD0", "h} c #B6CACE", "i} c #B5C9CE", "j} c #B4C6CE", "k} c #B4C5CD", "l} c #B3C6CC", "m} c #BACBD0", "n} c #BCCACF", "o} c #9DACB3", "p} c #666E76", "q} c #3C3940", "r} c #58565F", "s} c #8F9096", "t} c #B8B9B9", "u} c #C3C2C5", "v} c #A09F9F", "w} c #6C6A6D", "x} c #A1ABB4", "y} c #B8C1C9", "z} c #A7AEB2", "A} c #A8AEB2", "B} c #BFC8D1", "C} c #B3C1C6", "D} c #AFBAC6", "E} c #B0BBC6", "F} c #B2B9C3", "G} c #B1B9C2", "H} c #B1BBC5", "I} c #AFBAC1", "J} c #B0BAC2", "K} c #ADB7C0", "L} c #B0BAC5", "M} c #B4BECA", "N} c #C5D3DC", "O} c #B9C4CB", "P} c #A8ABAD", "Q} c #B2B2B5", "R} c #C1BDC0", "S} c #94929D", "T} c #666270", "U} c #514B57", "V} c #6D6978", "W} c #828596", "X} c #848D9B", "Y} c #929AA7", "Z} c #B0BCC3", "`} c #5C616A", " | c #3C3840", ".| c #6B646A", "+| c #959BA1", "@| c #97A5AC", "#| c #86949D", "$| c #93A2A8", "%| c #9EACB4", "&| c #98A4B0", "*| c #8D99A2", "=| c #909AA1", "-| c #9AA8AF", ";| c #A3AFB7", ">| c #ABB6BD", ",| c #AEBBC3", "'| c #A8B1BA", ")| c #858E98", "!| c #555863", "~| c #2E2730", "{| c #322023", "]| c #3A2B2E", "^| c #3E3E45", "/| c #646670", "(| c #93979F", "_| c #B0BBC2", ":| c #AEBCC1", "<| c #AAB8BA", "[| c #9BA3AB", "}| c #676974", "|| c #35363E", "1| c #716B70", "2| c #AEA9AB", "3| c #BBB4C0", "4| c #948BBA", "5| c #462EB3", "6| c #C7C2C3", "7| c #A7A7A8", "8| c #66656D", "9| c #454049", "0| c #332835", "a| c #3B323E", "b| c #3D353D", "c| c #352D30", "d| c #2E2528", "e| c #352B32", "f| c #453C48", "g| c #58525D", "h| c #5F5D68", "i| c #5C606B", "j| c #666A73", "k| c #666870", "l| c #615D67", "m| c #77777D", "n| c #90959B", "o| c #A3A8B1", "p| c #B3BBC6", "q| c #BAC8D1", "r| c #B9CDD2", "s| c #BACCD1", "t| c #BBCAD0", "u| c #B7C9D0", "v| c #B8C9D0", "w| c #B4C7CC", "x| c #B5C6CC", "y| c #B8CACF", "z| c #3D3A40", "A| c #6A686E", "B| c #A2A3AA", "C| c #BCBCBF", "D| c #C1C1C5", "E| c #999A9D", "F| c #5D5E61", "G| c #63666C", "H| c #848E95", "I| c #9DACB4", "J| c #A7B6BA", "K| c #B3BFC4", "L| c #BBC9CE", "M| c #B2C0C6", "N| c #ADBAC1", "O| c #B2BCC8", "P| c #B0BAC3", "Q| c #ADBBC3", "R| c #B1BCC7", "S| c #B1BCC8", "T| c #B1BCC9", "U| c #B1BBC3", "V| c #B3BECA", "W| c #C7D4DD", "X| c #BAC5CB", "Y| c #A8ACAE", "Z| c #B2B2B6", "`| c #C5C3C7", " 1 c #C1BFBF", ".1 c #75747A", "+1 c #4E4C56", "@1 c #646169", "#1 c #7A7981", "$1 c #8B929C", "%1 c #9EACB8", "&1 c #BBC4CF", "*1 c #50535A", "=1 c #38353B", "-1 c #78747C", ";1 c #9BA0A9", ">1 c #86949C", ",1 c #9AA6AE", "'1 c #A1ABB5", ")1 c #909CA6", "!1 c #8E99A2", "~1 c #9BA6AE", "{1 c #9DA8AF", "]1 c #939CA5", "^1 c #879199", "/1 c #ACB6C0", "(1 c #ACB9C1", "_1 c #ACBABE", ":1 c #AAB5BB", "<1 c #A9B2BA", "[1 c #ACBCC3", "}1 c #ABBBC2", "|1 c #ACB7C3", "11 c #A8B5BE", "21 c #7E848D", "31 c #443C48", "41 c #432E36", "51 c #534246", "61 c #565359", "71 c #49444D", "81 c #63626A", "91 c #9BA4AC", "01 c #ABB6BF", "a1 c #ADB9C3", "b1 c #ACB9C3", "c1 c #8C919B", "d1 c #585861", "e1 c #3C3A42", "f1 c #858284", "g1 c #BEBCBB", "h1 c #B9B4C2", "i1 c #472EB3", "j1 c #1E00B0", "k1 c #8D82BA", "l1 c #C6C5C1", "m1 c #C4C3BE", "n1 c #A9A7A9", "o1 c #6A666F", "p1 c #4F3D42", "q1 c #422C32", "r1 c #362834", "s1 c #362F39", "t1 c #3A343A", "u1 c #2E242D", "v1 c #443B47", "w1 c #767580", "x1 c #A3AAB7", "y1 c #949FAD", "z1 c #9AA8B1", "A1 c #A8AFB9", "B1 c #AFB7C0", "C1 c #B8C4CF", "D1 c #B9C7D0", "E1 c #B8CCD1", "F1 c #B7C8CF", "G1 c #B6C8CF", "H1 c #B6C7CE", "I1 c #B5C7CD", "J1 c #B4C7CD", "K1 c #B7C8D0", "L1 c #B5C5D0", "M1 c #A2ABB6", "N1 c #686B73", "O1 c #353437", "P1 c #787676", "Q1 c #B8B5B6", "R1 c #C0BFC3", "S1 c #BDC2BF", "T1 c #C1C2C4", "U1 c #96969A", "V1 c #535457", "W1 c #5C5C60", "X1 c #7A7F84", "Y1 c #8C99A0", "Z1 c #A9B8C0", "`1 c #C0CAD4", " 2 c #BFCAD5", ".2 c #BFCAD4", "+2 c #BFC9D3", "@2 c #BEC9D2", "#2 c #C1C9D4", "$2 c #BFC9D4", "%2 c #BFCCD5", "&2 c #C6D4DB", "*2 c #B9C4C9", "=2 c #B3B2B5", "-2 c #C6C4C8", ";2 c #BFBEC2", ">2 c #6A656E", ",2 c #4B454F", "'2 c #75757B", ")2 c #999EA4", "!2 c #A6B1BA", "~2 c #ADBBC4", "{2 c #B4C2CA", "]2 c #ABB5BD", "^2 c #4B4A50", "/2 c #363339", "(2 c #797F87", "_2 c #989DA6", ":2 c #989FA8", "<2 c #98A5AD", "[2 c #A2ABB5", "}2 c #A2A9B3", "|2 c #95A1A9", "12 c #8F9DA4", "22 c #8F9BA2", "32 c #858D96", "42 c #9299A1", "52 c #ABB6C1", "62 c #ABB9C1", "72 c #AEBBC1", "82 c #B7C3CB", "92 c #979EA7", "02 c #5A5560", "a2 c #453E48", "b2 c #6C6A70", "c2 c #9B9B9F", "d2 c #5F5A60", "e2 c #46434A", "f2 c #757C84", "g2 c #B1BDCD", "h2 c #ADBBD0", "i2 c #787E8A", "j2 c #484850", "k2 c #44444D", "l2 c #919094", "m2 c #B7B5BE", "n2 c #452EB3", "o2 c #8986BA", "p2 c #C2C9C1", "q2 c #C3C3BE", "r2 c #C6C6C4", "s2 c #ABA9AA", "t2 c #746F74", "u2 c #564B50", "v2 c #4B3746", "w2 c #452745", "x2 c #3B293E", "y2 c #342C35", "z2 c #362D35", "A2 c #3E373E", "B2 c #65646C", "C2 c #9EA3AE", "D2 c #B8C3CF", "E2 c #B8C5D2", "F2 c #B2BFCC", "G2 c #B2C2CB", "H2 c #B9C9D0", "I2 c #BAC9D0", "J2 c #B8C8D0", "K2 c #B8C7D0", "L2 c #B7C5CD", "M2 c #B7C6CC", "N2 c #B7C9D2", "O2 c #B7C5D0", "P2 c #A4AAB6", "Q2 c #696A72", "R2 c #35353A", "S2 c #7F7E80", "T2 c #C4C1C2", "U2 c #CDCCCD", "V2 c #CACAC9", "W2 c #C7C6C4", "X2 c #C4C1BF", "Y2 c #BEC0BB", "Z2 c #C0C5C2", "`2 c #C1C3C2", " 3 c #BDBCBB", ".3 c #BBBCBE", "+3 c #919396", "@3 c #504F54", "#3 c #403E41", "$3 c #606266", "%3 c #8F9AA1", "&3 c #B4C1CB", "*3 c #B2B8C3", "=3 c #AEBBC4", "-3 c #AFB7C1", ";3 c #AFB4BF", ">3 c #AEB4BE", ",3 c #B2BCC4", "'3 c #B0BBBF", ")3 c #AFB7BF", "!3 c #AFB9BE", "~3 c #B4C0C3", "{3 c #BBC7CE", "]3 c #BACCD4", "^3 c #BBCDD2", "/3 c #AFBBBE", "(3 c #9EA0A2", "_3 c #B3B1AD", ":3 c #B9BCC2", "<3 c #787A84", "[3 c #5C6068", "}3 c #787E85", "|3 c #A3ADB6", "13 c #ADBAC4", "23 c #9FADB5", "33 c #A3B3BA", "43 c #B0BFC7", "53 c #4C4450", "63 c #362E39", "73 c #767A83", "83 c #9A9DA7", "93 c #A2A8B1", "03 c #A5B0B9", "a3 c #A1AAB3", "b3 c #9AA8AC", "c3 c #9AA8AB", "d3 c #9AA7AC", "e3 c #95A4AB", "f3 c #929BA4", "g3 c #898F98", "h3 c #878F97", "i3 c #8C949C", "j3 c #939EA4", "k3 c #ADBBC5", "l3 c #AEBEC4", "m3 c #ADBCC4", "n3 c #AAB6C0", "o3 c #ADBBBF", "p3 c #B3C2C8", "q3 c #71717B", "r3 c #3E3B44", "s3 c #615F65", "t3 c #B2B0B5", "u3 c #9D94A0", "v3 c #6B6371", "w3 c #5D6169", "x3 c #8E9AA1", "y3 c #B3C1CD", "z3 c #A9B5C3", "A3 c #59565C", "B3 c #9C9A9F", "C3 c #C2C2BD", "D3 c #B7B6BD", "E3 c #8A84BC", "F3 c #C2C8C4", "G3 c #C1C5C0", "H3 c #7E7B7E", "I3 c #605E64", "J3 c #524657", "K3 c #472C4B", "L3 c #3A2839", "M3 c #2E2431", "N3 c #30263A", "O3 c #504E59", "P3 c #83888D", "Q3 c #B8C7D2", "R3 c #B6C7D1", "S3 c #BAC6D2", "T3 c #B4C8CC", "U3 c #B7C5CC", "V3 c #B6C6CD", "W3 c #B6C5CC", "X3 c #B3C6CD", "Y3 c #B7CAD2", "Z3 c #B7C6D1", "`3 c #A0A9B3", " 4 c #6C6E77", ".4 c #424149", "+4 c #AFB0B3", "@4 c #A4A4A4", "#4 c #9E9C9E", "$4 c #A8A7A9", "%4 c #B7B6B8", "&4 c #B6B8B7", "*4 c #A09B9B", "=4 c #A4A3A2", "-4 c #878889", ";4 c #504F53", ">4 c #2F2D2F", ",4 c #505053", "'4 c #979FA6", ")4 c #BCC8D0", "!4 c #C2CCD6", "~4 c #BDC7D1", "{4 c #ACB1BC", "]4 c #ACB1BB", "^4 c #ACB0BC", "/4 c #AFB8C1", "(4 c #ADB8C2", "_4 c #ADB8BC", ":4 c #ACB3BB", "<4 c #A9B3B8", "[4 c #AEBABF", "}4 c #B9C4CC", "|4 c #BFCDD6", "14 c #B5C5CF", "24 c #B2C3CB", "34 c #A7B2B8", "44 c #B3B4AE", "54 c #B7B6B5", "64 c #9798A1", "74 c #797E88", "84 c #6F757E", "94 c #787C84", "04 c #8F96A1", "a4 c #9CA5B1", "b4 c #9DA8B2", "c4 c #A6B4BC", "d4 c #B0BDC5", "e4 c #A7AFB8", "f4 c #64616D", "g4 c #56515E", "h4 c #84858F", "i4 c #7C7E87", "j4 c #7C8089", "k4 c #969DA4", "l4 c #A3ABAF", "m4 c #99A2A5", "n4 c #8F9B9E", "o4 c #929FA5", "p4 c #9EAAB3", "q4 c #A9B2B9", "r4 c #A4ADB4", "s4 c #95A0A8", "t4 c #8E99A1", "u4 c #8A939A", "v4 c #8A9598", "w4 c #9CA7B0", "x4 c #AAB5C0", "y4 c #AAB8C0", "z4 c #A4B3BB", "A4 c #A8B4C0", "B4 c #AAB7BE", "C4 c #ACB7C2", "D4 c #AFB9C4", "E4 c #AABABE", "F4 c #ACBBC3", "G4 c #A5B1B8", "H4 c #868892", "I4 c #403A43", "J4 c #504A51", "K4 c #A7A6AB", "L4 c #C6BDCC", "M4 c #928A9A", "N4 c #52555C", "O4 c #7E8A91", "P4 c #555865", "Q4 c #3D3B45", "R4 c #6F6C70", "S4 c #A9A6AB", "T4 c #C1C0C4", "U4 c #8E7FBD", "V4 c #C5C4C6", "W4 c #BFC7C4", "X4 c #C3C3C2", "Y4 c #B0B1B2", "Z4 c #898A8E", "`4 c #6D6B73", " 5 c #544E5A", ".5 c #3A3440", "+5 c #322B2E", "@5 c #2D2331", "#5 c #31284A", "$5 c #626579", "%5 c #97A2A8", "&5 c #B4C3CA", "*5 c #B6C6CF", "=5 c #B9C6D1", "-5 c #B4C7CF", ";5 c #B6C5CE", ">5 c #B7C9D1", ",5 c #95A3AB", "'5 c #6B6E77", ")5 c #81838A", "!5 c #524D55", "~5 c #6C6973", "{5 c #9597A0", "]5 c #C1BFBD", "^5 c #A0A1A3", "/5 c #838286", "(5 c #797577", "_5 c #8E8B89", ":5 c #858582", "<5 c #5B5B5D", "[5 c #333235", "}5 c #515254", "|5 c #BEC9D0", "15 c #C3CCD6", "25 c #C0C9D3", "35 c #BFC8D2", "45 c #C0C9D4", "55 c #B9C5CE", "65 c #B6BECA", "75 c #AEBAC6", "85 c #A3A6AA", "95 c #B7B8B8", "05 c #9E9DA1", "a5 c #65616B", "b5 c #686874", "c5 c #7D7C86", "d5 c #847E86", "e5 c #7B7A83", "f5 c #8B8E99", "g5 c #AAB2BE", "h5 c #B0BCC5", "i5 c #ADBCC2", "j5 c #8C969D", "k5 c #8A919A", "l5 c #9DA0AB", "m5 c #3E3642", "n5 c #76767B", "o5 c #98979B", "p5 c #8C878E", "q5 c #757A82", "r5 c #78848C", "s5 c #9399A1", "t5 c #ADAFB4", "u5 c #ABB0B4", "v5 c #99A5AC", "w5 c #A0AFB7", "x5 c #A2B0B5", "y5 c #98A4A7", "z5 c #9EA8AE", "A5 c #9AA7B0", "B5 c #A3B1B8", "C5 c #ACBCC0", "D5 c #AAB6BB", "E5 c #989CA4", "F5 c #4B4450", "G5 c #49424B", "H5 c #97979A", "I5 c #CBC6CF", "J5 c #9D97A2", "K5 c #4C5056", "L5 c #767F85", "M5 c #4D515C", "N5 c #3C3B45", "O5 c #838385", "P5 c #442FB3", "Q5 c #C6C2C5", "R5 c #C4C2C6", "S5 c #C5C0C6", "T5 c #C0BCC4", "U5 c #A7A9AC", "V5 c #78757D", "W5 c #4D4752", "X5 c #342F39", "Y5 c #30262F", "Z5 c #352B38", "`5 c #484357", " 6 c #848B9B", ".6 c #AEBEC7", "+6 c #B7C5CF", "@6 c #B6C5CF", "#6 c #B4C5CB", "$6 c #B6C5CB", "%6 c #B6C7CC", "&6 c #B5C5CB", "*6 c #88969C", "=6 c #5D6369", "-6 c #4A494F", ";6 c #45444C", ">6 c #4B4B51", ",6 c #555054", "'6 c #4E464F", ")6 c #4C4752", "!6 c #626169", "~6 c #A0A0A1", "{6 c #C5C2C1", "]6 c #C3C0BF", "^6 c #8D8D8F", "/6 c #7A7E83", "(6 c #949BA0", "_6 c #AEB5B8", ":6 c #A8AFB2", "<6 c #838B90", "[6 c #3E4348", "}6 c #484F53", "|6 c #97A4A7", "16 c #C5CED9", "26 c #C7D2DB", "36 c #C8D5DB", "46 c #CCD1DA", "56 c #CBCFD8", "66 c #C6D2DA", "76 c #C8D6DD", "86 c #CCD8E0", "96 c #CDD9E2", "06 c #CCD8E1", "a6 c #C9D5DE", "b6 c #C6D0DB", "c6 c #C2D1D9", "d6 c #C5D0DA", "e6 c #C6CFD8", "f6 c #C6D4DD", "g6 c #C6D4D9", "h6 c #C7D4DA", "i6 c #C9D5DD", "j6 c #C7D4DC", "k6 c #B2BEC4", "l6 c #B1B8BF", "m6 c #B0B3B7", "n6 c #ACAEB0", "o6 c #8E8E93", "p6 c #44414D", "q6 c #54515D", "r6 c #83838D", "s6 c #9FA1AB", "t6 c #9FA1AD", "u6 c #ABB7BF", "v6 c #AEBBC0", "w6 c #A9B6BC", "x6 c #A8B2BB", "y6 c #A9B0B9", "z6 c #9AA1AC", "A6 c #7C7D87", "B6 c #58535B", "C6 c #46454A", "D6 c #483D4D", "E6 c #543654", "F6 c #564E61", "G6 c #4C515A", "H6 c #858382", "I6 c #AAACAA", "J6 c #A6ADB0", "K6 c #A7B1B7", "L6 c #A8B4BA", "M6 c #A6B1B8", "N6 c #A7B4B8", "O6 c #A2AEB4", "P6 c #A1AEB4", "Q6 c #AAB8C2", "R6 c #ACB8C1", "S6 c #A8BBBE", "T6 c #A2BCBA", "U6 c #A6BABC", "V6 c #A8B6BE", "W6 c #A7B6BD", "X6 c #B1BDC2", "Y6 c #ABB1BB", "Z6 c #564F5D", "`6 c #433843", " 7 c #847E84", ".7 c #BBB6B9", "+7 c #948F93", "@7 c #47484F", "#7 c #798289", "$7 c #A0ADB5", "%7 c #494D55", "&7 c #47464C", "*7 c #97989B", "=7 c #BBBCBF", "-7 c #BFC3C2", ";7 c #B7B4C0", ">7 c #8C84BA", ",7 c #C6C5C4", "'7 c #C6C0C4", ")7 c #BCBFC3", "!7 c #C1BABF", "~7 c #B1ABB3", "{7 c #908E93", "]7 c #615E64", "^7 c #403741", "/7 c #322734", "(7 c #2F222E", "_7 c #39303A", ":7 c #595960", "<7 c #97A2AD", "[7 c #BACCD5", "}7 c #B8C9D1", "|7 c #B6C6CC", "17 c #B7CAD0", "27 c #B5CAD1", "37 c #B6CBD2", "47 c #BACCD3", "57 c #BCCCD3", "67 c #B9CAD0", "77 c #BBCDD4", "87 c #4B4C52", "97 c #47444A", "07 c #424249", "a7 c #595A60", "b7 c #7D7C81", "c7 c #494750", "d7 c #3C3A3F", "e7 c #8A8788", "f7 c #C2C4C2", "g7 c #8E8C8C", "h7 c #888C8F", "i7 c #B4C2C7", "j7 c #C9D8DE", "k7 c #C0CED5", "l7 c #485056", "m7 c #494F52", "n7 c #9FA8AC", "o7 c #C3CED5", "p7 c #C2CCD7", "q7 c #B8C4CD", "r7 c #B2BEC5", "s7 c #B9BDC5", "t7 c #BBBDC5", "u7 c #B3BCC3", "v7 c #AAB3BA", "w7 c #BAC5CC", "x7 c #C4CFD6", "y7 c #C8D2DA", "z7 c #BCC7D0", "A7 c #C2CBD6", "B7 c #C7D2DC", "C7 c #C6D2DC", "D7 c #C2D1D8", "E7 c #BCC7CE", "F7 c #B6C0C7", "G7 c #B3BFC6", "H7 c #B2BBC4", "I7 c #BBC8CE", "J7 c #ADB4B8", "K7 c #A8AAAF", "L7 c #96999D", "M7 c #9A9C9E", "N7 c #808186", "O7 c #545561", "P7 c #686A77", "Q7 c #9699A3", "R7 c #B6BBC5", "S7 c #BAC1CB", "T7 c #A9B6BD", "U7 c #B2BFC6", "V7 c #ADB7BF", "W7 c #8C9196", "X7 c #575C63", "Y7 c #484053", "Z7 c #5D4563", "`7 c #746A7C", " 8 c #5A5B62", ".8 c #2E2A2F", "+8 c #514B4C", "@8 c #817D7C", "#8 c #9A999A", "$8 c #ACB2B1", "%8 c #B0BFBD", "&8 c #ABC0BF", "*8 c #AEBEC1", "=8 c #A7B4BA", "-8 c #A4B2BA", ";8 c #A9B8BE", ">8 c #ABB9C2", ",8 c #ABB7C3", "'8 c #A8BCBF", ")8 c #A1BFB7", "!8 c #A6BBB9", "~8 c #ACB8BE", "{8 c #A7B6BC", "]8 c #A9B8BD", "^8 c #B3C1C7", "/8 c #B3BDC7", "(8 c #605F6B", "_8 c #413844", ":8 c #716871", "<8 c #AEA9AA", "[8 c #959292", "}8 c #828C93", "|8 c #494A54", "18 c #55535B", "28 c #A6A6AA", "38 c #C0C2C2", "48 c #C1C4C1", "58 c #B7B6BE", "68 c #1E00B1", "78 c #C9CAC5", "88 c #BFC2BB", "98 c #ADAAA7", "08 c #837F81", "a8 c #564F57", "b8 c #39323B", "c8 c #332935", "d8 c #2D222A", "e8 c #3B343A", "f8 c #61626A", "g8 c #9BA8B0", "h8 c #B9CBD2", "i8 c #B4C5CE", "j8 c #B8C5CC", "k8 c #B8C6CC", "l8 c #B6C7CD", "m8 c #B8C7CC", "n8 c #BAC7CE", "o8 c #B9C7CD", "p8 c #B5C8CD", "q8 c #B0C9D0", "r8 c #B1C8D1", "s8 c #B4C7CB", "t8 c #B9CDD4", "u8 c #6B6E79", "v8 c #56515A", "w8 c #777B84", "x8 c #98A2A9", "y8 c #A9B3BA", "z8 c #889199", "A8 c #51545C", "B8 c #343137", "C8 c #807A7C", "D8 c #BABAB9", "E8 c #BDC5C5", "F8 c #9B9893", "G8 c #989A9A", "H8 c #BBC6CC", "I8 c #C9D6DD", "J8 c #A9B7BE", "K8 c #51565A", "L8 c #535455", "M8 c #ADAFB1", "N8 c #CAD1D8", "O8 c #B1BFC7", "P8 c #9AA4A9", "Q8 c #9CA5A9", "R8 c #90969F", "S8 c #878A94", "T8 c #7A7C83", "U8 c #707277", "V8 c #7F878E", "W8 c #9CA6AD", "X8 c #B7C1C3", "Y8 c #C0CBD0", "Z8 c #9298A1", "`8 c #8A8F97", " 9 c #B8C0CB", ".9 c #A5ACB0", "+9 c #969A9F", "@9 c #A3ABB5", "#9 c #A1A6B0", "$9 c #B3BEC6", "%9 c #C7D3DA", "&9 c #A4ABB4", "*9 c #9A9EA8", "=9 c #787E86", "-9 c #74777B", ";9 c #787A7F", ">9 c #7D8089", ",9 c #949DA9", "'9 c #AEB5C0", ")9 c #BDBEC5", "!9 c #B5BDC2", "~9 c #A9B7BD", "{9 c #99A0AB", "]9 c #A1A7B3", "^9 c #98979D", "/9 c #38303B", "(9 c #483E48", "_9 c #716C70", ":9 c #A4A9A2", "<9 c #B2C6B9", "[9 c #A4C3B9", "}9 c #AABEC0", "|9 c #A5B2B9", "19 c #9AA7B4", "29 c #98A5AE", "39 c #A4B2B9", "49 c #ACBAC3", "59 c #A9BABC", "69 c #A9B9BB", "79 c #B1C0C7", "89 c #6A6E78", "99 c #43414C", "09 c #5C5761", "a9 c #A7A5A7", "b9 c #A1A2A3", "c9 c #62646D", "d9 c #89929B", "e9 c #A5ADB6", "f9 c #838690", "g9 c #4C4B57", "h9 c #616169", "i9 c #948DBA", "j9 c #9082BD", "k9 c #C8C5C5", "l9 c #828282", "m9 c #5F5B5D", "n9 c #625860", "o9 c #5D566E", "p9 c #4F4B64", "q9 c #332A2F", "r9 c #474349", "s9 c #BED1D8", "t9 c #B5C3CC", "u9 c #B8C8D2", "v9 c #BDCFD5", "w9 c #BFD1D5", "x9 c #BFD2D6", "y9 c #BDD4D8", "z9 c #BDD5DA", "A9 c #C1D4DB", "B9 c #C1D4DC", "C9 c #C0D2D9", "D9 c #BCCFD5", "E9 c #B8CBD2", "F9 c #B8C8CE", "G9 c #BDCDD4", "H9 c #AAB9C0", "I9 c #9DA9B2", "J9 c #737A84", "K9 c #696A76", "L9 c #696A75", "M9 c #70757D", "N9 c #7E8990", "O9 c #9AABB3", "P9 c #B1C1CA", "Q9 c #7A838C", "R9 c #61646E", "S9 c #81848E", "T9 c #A1ABB2", "U9 c #B4C2C9", "V9 c #B4C1C8", "W9 c #53555F", "X9 c #524E53", "Y9 c #94908C", "Z9 c #C1BEBC", "`9 c #9D9C9C", " 0 c #BCC5CC", ".0 c #C7D4DB", "+0 c #C0CDD4", "@0 c #A4B2B8", "#0 c #4E5053", "$0 c #545255", "%0 c #AFB5BA", "&0 c #CAD5DC", "*0 c #BFCDD5", "=0 c #AEBBC5", "-0 c #A4B0BB", ";0 c #A8B3BC", ">0 c #AFBCC1", ",0 c #ACB6BD", "'0 c #A5AEB7", ")0 c #9AA2AA", "!0 c #8C939A", "~0 c #7D858E", "{0 c #74797F", "]0 c #82878C", "^0 c #9CA2A8", "/0 c #ACB2BB", "(0 c #878E98", "_0 c #88919A", ":0 c #C9D3DE", "<0 c #BBC2CB", "[0 c #A8ACB2", "}0 c #B4C1CA", "|0 c #A3AEB7", "10 c #8A8E95", "20 c #899299", "30 c #889096", "40 c #9299A0", "50 c #A2AEB8", "60 c #B3BCC7", "70 c #B3BAC4", "80 c #AAB2BA", "90 c #ABB6BE", "00 c #B6C1C9", "a0 c #B0BCC6", "b0 c #909BA3", "c0 c #A1A5AC", "d0 c #AAADB5", "e0 c #9AA1AB", "f0 c #999DA2", "g0 c #8F8E91", "h0 c #807E82", "i0 c #B1BBC8", "j0 c #B3BAC5", "k0 c #ADB7BD", "l0 c #B1C2C7", "m0 c #B8C5C9", "n0 c #9298A3", "o0 c #636974", "p0 c #454650", "q0 c #413F46", "r0 c #5B5D61", "s0 c #747E7D", "t0 c #869593", "u0 c #A7B4B5", "v0 c #B6C3C8", "w0 c #AEBDC5", "x0 c #A4B3BD", "y0 c #9DAAB3", "z0 c #ADB8BF", "A0 c #A2BCB8", "B0 c #A7BBBB", "C0 c #AEBDC2", "D0 c #6C737B", "E0 c #423F49", "F0 c #4A434E", "G0 c #9B9EA1", "H0 c #A6ACAC", "I0 c #6D7175", "J0 c #858D99", "K0 c #9AA7B3", "L0 c #828C95", "M0 c #525762", "N0 c #686A71", "O0 c #AFB0B1", "P0 c #C5C0BF", "Q0 c #BCB4BF", "R0 c #8F7FBD", "S0 c #C8C1C5", "T0 c #5E5E62", "U0 c #4F4D52", "V0 c #848189", "W0 c #8E91A9", "X0 c #7F839D", "Y0 c #6B6C78", "Z0 c #413D44", "`0 c #44424B", " a c #777D86", ".a c #A5B1BA", "+a c #B2C2C9", "@a c #99A6AD", "#a c #868E94", "$a c #80848D", "%a c #878B98", "&a c #91999F", "*a c #90989E", "=a c #8B999D", "-a c #8C9CA0", ";a c #92A0A5", ">a c #93A0A6", ",a c #B2C0C7", "'a c #B5C7CE", ")a c #A8B4B9", "!a c #A0A7B0", "~a c #969BA7", "{a c #838A94", "]a c #737C83", "^a c #6D7379", "/a c #666770", "(a c #44424D", "_a c #433C47", ":a c #4B444F", "b c #878F9B", ",b c #95A1AF", "'b c #7C858E", ")b c #5D636B", "!b c #76797F", "~b c #B2B3B3", "{b c #BAB3C4", "]b c #948BBB", "^b c #442EAF", "/b c #C8C2C4", "(b c #9D9EA0", "_b c #4C4B50", ":b c #4A4C53", "c c #C3CFD9", ",c c #949CA4", "'c c #7A7C81", ")c c #93999B", "!c c #B0BABE", "~c c #BBC6CE", "{c c #7B8289", "]c c #919AA1", "^c c #ACB8C0", "/c c #B1BDC4", "(c c #ADBEC4", "_c c #AEBAC4", ":c c #99A5AD", "d c #C1C3C3", ",d c #C0BCC0", "'d c #C0C2C1", ")d c #959495", "!d c #909397", "~d c #B4BEC7", "{d c #80888C", "]d c #7C8387", "^d c #9399A2", "/d c #9AA2AC", "(d c #C0C9D0", "_d c #AAACB1", ":d c #8A8B91", "e c #888A8F", ",e c #84868C", "'e c #7F848D", ")e c #7E808A", "!e c #707079", "~e c #575961", "{e c #433B48", "]e c #423B47", "^e c #54515A", "/e c #7E868B", "(e c #ADBFC4", "_e c #BACED3", ":e c #B1C3C8", "f c #A8B6BC", ",f c #ACB5BF", "'f c #63616B", ")f c #3D353F", "!f c #5A545E", "~f c #A6A8A5", "{f c #A0A4A1", "]f c #5D5E67", "^f c #7A7A81", "/f c #807E84", "(f c #5C5862", "_f c #8F8D94", ":f c #C6C3BC", "g c #6D7075", ",g c #8C929D", "'g c #B3BEC5", ")g c #B2C0C5", "!g c #B1C0C4", "~g c #B3BEC7", "{g c #ABAEB4", "]g c #A2A5AA", "^g c #949FA6", "/g c #555862", "(g c #686D75", "_g c #9FABB0", ":g c #A5B4BA", "h c #9AA4AA", ",h c #8D979C", "'h c #64666B", ")h c #4D4E51", "!h c #585B60", "~h c #70777E", "{h c #787D81", "]h c #6D7174", "^h c #5F6269", "/h c #64666A", "(h c #616266", "_h c #56565B", ":h c #595B5F", "i c #B0BEC2", ",i c #7F878C", "'i c #403F47", ")i c #6F6D6C", "!i c #AAABA6", "~i c #BCBFBE", "{i c #BBBDBF", "]i c #B7C0C7", "^i c #9AA5B0", "/i c #C5CFD8", "(i c #CED8E1", "_i c #ACBCBE", ":i c #788F88", "j c #595C67", ",j c #4E4A55", "'j c #4C4650", ")j c #47434A", "!j c #454148", "~j c #46414A", "{j c #4D4853", "]j c #61626C", "^j c #949EA7", "/j c #BAC6D1", "(j c #BACBD2", "_j c #A8B9BE", ":j c #6F757C", "k c #3D4449", ",k c #434B52", "'k c #81868B", ")k c #ABA9B1", "!k c #888B94", "~k c #40414D", "{k c #6A6A74", "]k c #A7A7AA", "^k c #C2C3BE", "/k c #C7C9C3", "(k c #969594", "_k c #49454E", ":k c #B8C6CE", "l c #999DA5", ",l c #9DAAB2", "'l c #909AA3", ")l c #7C8189", "!l c #6A6D74", "~l c #63636C", "{l c #72747A", "]l c #8D959A", "^l c #ABB9B6", "/l c #B4C3C2", "(l c #818A92", "_l c #36393D", ":l c #575A60", "m c #99A5AE", ",m c #A5B5BA", "'m c #AFBBC0", ")m c #B3C1BC", "!m c #B7C4BF", "~m c #7C7F8B", "{m c #5D5B63", "]m c #5D5A60", "^m c #726A6F", "/m c #848088", "(m c #889299", "_m c #787D82", ":m c #5A5A5E", "n c #666D74", ",n c #8C979F", "'n c #A3AFB2", ")n c #B1BCC2", "!n c #6A6F78", "~n c #3A3843", "{n c #5A545A", "]n c #5A6066", "^n c #565A5D", "/n c #535356", "(n c #48474E", "_n c #45444F", ":n c #3B3A44", "o c #8B949C", ",o c #959FA7", "'o c #9CA4AC", ")o c #A9B6BF", "!o c #C0C5C7", "~o c #BBC6CA", "{o c #B5C5C8", "]o c #B2C3C8", "^o c #AFB7C2", "/o c #7E848E", "(o c #2A222E", "_o c #5D5963", ":o c #6D6F76", "p c #868D90", ",p c #81878E", "'p c #A7B3B9", ")p c #B3BFC5", "!p c #828894", "~p c #535360", "{p c #443F4A", "]p c #5D5964", "^p c #676C77", "/p c #969BA1", "(p c #BEC1C5", "_p c #C0C3C8", ":p c #A2A4A9", "

    q c #919BA0", ",q c #B6C4C8", "'q c #ACBFC5", ")q c #AEC3C8", "!q c #A9B7C1", "~q c #8F97A3", "{q c #6A7079", "]q c #54515B", "^q c #62616B", "/q c #999FA7", "(q c #5E5F68", "_q c #302E3A", ":q c #797B86", "r c #434248", ",r c #727074", "'r c #A9A9AC", ")r c #ADABAD", "!r c #B6B7B6", "~r c #C4C3BD", "{r c #BDBCC2", "]r c #BCBCBD", "^r c #B4B4B7", "/r c #A3A3A3", "(r c #949497", "_r c #8B8C8B", ":r c #858787", "s c #A2B2B8", ",s c #B9CBD1", "'s c #868B92", ")s c #7E7E83", "!s c #A8A8AB", "~s c #B3B6AF", "{s c #899089", "]s c #626364", "^s c #7B7A7C", "/s c #A6A9AD", "(s c #A3AEB9", "_s c #B7BBBF", ":s c #737578", "t c #A3A9B2", ",t c #899098", "'t c #7C858D", ")t c #919DA2", "!t c #B5C2CB", "~t c #A0ACB6", "{t c #CBD7E0", "]t c #B0C2C3", "^t c #80978F", "/t c #818A88", "(t c #939093", "_t c #A9A9AA", ":t c #A7ACAE", "u c #888587", ",u c #9EA0A5", "'u c #8D9295", ")u c #899397", "!u c #B8C4CA", "~u c #BAC4CC", "{u c #9AA0A9", "]u c #9BA2AB", "^u c #828992", "/u c #A0ABB3", "(u c #98A3AE", "_u c #A7B3BE", ":u c #C8D4DE", "v c #BEC1BF", ",v c #AAAFB5", "'v c #8C7777", ")v c #A49A9D", "!v c #8F9599", "~v c #B9C5CB", "{v c #C0CED7", "]v c #AAB0BB", "^v c #C0CCD3", "/v c #A8AEBA", "(v c #A6AEB7", "_v c #A9B3BC", ":v c #BFCAD2", "w c #7C7B88", ",w c #8C919C", "'w c #A0A8AE", ")w c #B0B7BA", "!w c #B8BEC4", "~w c #BBC2C8", "{w c #BBC2C4", "]w c #BCB9B8", "^w c #8F9198", "/w c #84838A", "(w c #A49A9C", "_w c #BBB5B6", ":w c #959095", "x c #BBCAD3", ",x c #B6C9CF", "'x c #B3C7CE", ")x c #BDCFD7", "!x c #A6B3BC", "~x c #828A93", "{x c #929EA5", "]x c #8A989F", "^x c #9DABB3", "/x c #B5C1CD", "(x c #B7C4D0", "_x c #A1B1B9", ":x c #95959E", "y c #8B939B", ",y c #808890", "'y c #B7C8CC", ")y c #B8C8CC", "!y c #B4CCD4", "~y c #A6BCC4", "{y c #879397", "]y c #9AA5AA", "^y c #C0CFDA", "/y c #9CA6B2", "(y c #94A2A9", "_y c #97A4AA", ":y c #A8B9C1", "z c #B0C1C8", ",z c #5C636A", "'z c #92A2AA", ")z c #8B969D", "!z c #B0C2C7", "~z c #B3CACF", "{z c #A4ACB1", "]z c #83878F", "^z c #A7A5AC", "/z c #C5C2C5", "(z c #BAB9BE", "_z c #A19FA4", ":z c #878487", "A c #838B94", ",A c #86939A", "'A c #768087", ")A c #666E74", "!A c #A0B0B9", "~A c #6E7A83", "{A c #B7C6CB", "]A c #B6C4CC", "^A c #B6C4CB", "/A c #B3C2C7", "(A c #B5C7CB", "_A c #8F939B", ":A c #A8A9AC", "B c #9C9FA3", ",B c #91969C", "'B c #959B9F", ")B c #BBC7CD", "!B c #C5D3DB", "~B c #A6ACB8", "{B c #7F8590", "]B c #686669", "^B c #62646E", "/B c #7D838C", "(B c #868D93", "_B c #8D8F93", ":B c #909198", "C c #A6ABB2", ",C c #A2A9B2", "'C c #A2AAB3", ")C c #ADB6C0", "!C c #B4BAC3", "~C c #B6BEC8", "{C c #BBC7D0", "]C c #C1CED5", "^C c #B7C3CD", "/C c #B4C0CD", "(C c #C6D2DE", "_C c #5E6266", ":C c #747579", "D c #897C7F", ",D c #8A878D", "'D c #878B92", ")D c #615F68", "!D c #9DA3AA", "~D c #A7B0B8", "{D c #ADC1C6", "]D c #ADC3C8", "^D c #AFC2C5", "/D c #B2C3C3", "(D c #AEBDBF", "_D c #B3BCC5", ":D c #B4BBC6", "E c #BDCCD2", ",E c #BDD0D5", "'E c #B0C0C6", ")E c #8B9AA2", "!E c #6D747E", "~E c #777D87", "{E c #939DA5", "]E c #5D626B", "^E c #788189", "/E c #525860", "(E c #697078", "_E c #9AA8AE", ":E c #B6C8CC", "F c #A0AFB6", ",F c #A4AFB8", "'F c #AAB3BC", ")F c #9FA8B1", "!F c #BEC7D1", "~F c #C1CBD3", "{F c #C0C8D3", "]F c #494C54", "^F c #807F81", "/F c #AAA7A4", "(F c #9D9B97", "_F c #A9A9A9", ":F c #BABABC", "G c #98A4AB", ",G c #696D70", "'G c #5D595C", ")G c #7D7C82", "!G c #ABB2BD", "~G c #B7BAC7", "{G c #A9A0B2", "]G c #574A5A", "^G c #3F3845", "/G c #757680", "(G c #ADADB1", "_G c #BDBEC2", ":G c #C3C3BD", "H c #93A2AA", ",H c #7F8A92", "'H c #A7B6C0", ")H c #A7B5C0", "!H c #97A0AD", "~H c #9B9DB5", "{H c #AEB6C8", "]H c #B9C8D1", "^H c #9CADB5", "/H c #66747E", "(H c #707A84", "_H c #9099A0", ":H c #8F9296", "I c #9E9B9C", ",I c #C4C3C3", "'I c #AFB0B0", ")I c #8A8B8F", "!I c #81848A", "~I c #888998", "{I c #9190A9", "]I c #9EA2B5", "^I c #A5B1BB", "/I c #A7B3BC", "(I c #AFB3C0", "_I c #B5BAC7", ":I c #B1BBC4", "J c #868C9C", ",J c #A6B2BE", "'J c #B5C3CB", ")J c #B9C8CD", "!J c #B5CBCF", "~J c #B9CFD4", "{J c #BBC9D1", "]J c #A9B1BA", "^J c #878C94", "/J c #5F5E6A", "(J c #413F4C", "_J c #8E929F", ":J c #9CA3AE", "K c #4E4E57", ",K c #3E333F", "'K c #4A404C", ")K c #6A6B77", "!K c #BBC6D1", "~K c #8C9BA3", "{K c #453942", "]K c #352632", "^K c #281E28", "/K c #2C282B", "(K c #646365", "_K c #9B9B9D", ":K c #B8B4BF", "L c #302633", ",L c #3A313D", "'L c #645F67", ")L c #9E9FA2", "!L c #B8BCBA", "~L c #BFC1BC", "{L c #C2C1BA", "]L c #BDBFBC", "^L c #BAB3C2", "/L c #91949A", "(L c #8A929D", "_L c #91A2A8", ":L c #8999A1", "M c #53535A", ",M c #737880", "'M c #A8B1B8", ")M c #AEC1C7", "!M c #AFBCC6", "~M c #9EA9B3", "{M c #574F54", "]M c #716F79", "^M c #757784", "/M c #544E5B", "(M c #3E2642", "_M c #533E58", ":M c #B4B7B6", "N c #555663", ",N c #696D74", "'N c #888F95", ")N c #AEBCC6", "!N c #B2BFC8", "~N c #ACBBC4", "{N c #A6B2BF", "]N c #A1ACB7", "^N c #7D848C", "/N c #545660", "(N c #8E96A2", "_N c #A5AEB8", ":N c #79757E", "O c #848B97", ",O c #40404C", "'O c #808892", ")O c #A6ADB5", "!O c #8B858D", "~O c #593F46", "{O c #59424A", "]O c #7D7B84", "^O c #868385", "/O c #A2A2A4", "(O c #A1A4AA", "_O c #9DA0A7", ":O c #BBC3C3", "P c #A2ACB0", ",P c #B5C0C3", "'P c #B1BDC0", ")P c #A8B4B8", "!P c #94A0A3", "~P c #7C8689", "{P c #7A8187", "]P c #7D8186", "^P c #7A7B7E", "/P c #73757B", "(P c #6B7076", "_P c #6D7376", ":P c #BCC4C2", "

    Q c #72747C", ",Q c #6A6D72", "'Q c #686C6E", ")Q c #85898F", "!Q c #A2A9B0", "~Q c #AFB9BB", "{Q c #B5BEBD", "]Q c #BBBFBC", "^Q c #C4C4BB", "/Q c #BBB8B8", "(Q c #948DB9", "_Q c #1D00A9", ":Q c #3116AC", "R c #98A1AA", ",R c #BFCED8", "'R c #A4B1BB", ")R c #7A818C", "!R c #565A64", "~R c #7A8891", "{R c #A2B5BE", "]R c #B2C5C9", "^R c #A0A6B0", "/R c #6A6975", "(R c #717882", "_R c #95A5AB", ":R c #828A8F", "S c #858287", ",S c #5B5862", "'S c #65656D", ")S c #A0A09F", "!S c #C3C2BD", "~S c #B9BDBF", "{S c #A2A3AC", "]S c #555961", "^S c #4C4E54", "/S c #858087", "(S c #8C898F", "_S c #86878A", ":S c #959699", "T c #B9C1C0", ",T c #C8CBCB", "'T c #626366", ")T c #4C4D55", "!T c #5B606A", "~T c #A1B1B5", "{T c #B4C3C7", "]T c #ACC1C6", "^T c #949CA5", "/T c #6A747C", "(T c #6D737D", "_T c #A4B3B9", ":T c #B2C2CC", "U c #9DA4AE", ",U c #B8CAD3", "'U c #B0BFC6", ")U c #8F9DA3", "!U c #5F676C", "~U c #959697", "{U c #989A9C", "]U c #797B7E", "^U c #929497", "/U c #CBCCCA", "(U c #9E9D9E", "_U c #717175", ":U c #CECDCC", "V c #ADC1C5", ",V c #B0C6CB", "'V c #B3BDC8", ")V c #B1C1C7", "!V c #797E86", "~V c #52555E", "{V c #606972", "]V c #A6B3BB", "^V c #97A0A9", "/V c #79797E", "(V c #68666A", "_V c #6B7277", ":V c #929FA3", "W c #9FACBA", ",W c #A5B5BC", "'W c #A6B6BC", ")W c #A2ACB7", "!W c #747982", "~W c #9B9C9E", "{W c #AEADB1", "]W c #54535A", "^W c #45454D", "/W c #4E4E55", "(W c #525157", "_W c #55535D", ":W c #484853", "X c #676F75", ",X c #60676D", "'X c #B4C4C8", ")X c #AEC2C8", "!X c #AAB7C2", "~X c #99A2AB", "{X c #43424E", "]X c #626771", "^X c #B0BEC9", "/X c #A1ABB7", "(X c #8E939E", "_X c #62616A", ":X c #81888D", "Y c #9AA9B3", ",Y c #BCCCD6", "'Y c #BCCFD7", ")Y c #B4C9CF", "!Y c #B2C8CC", "~Y c #B4C9CE", "{Y c #B2C8CD", "]Y c #B2C6CA", "^Y c #98A3AA", "/Y c #525B65", "(Y c #444C59", "_Y c #5F646F", ":Y c #B7C7D4", "Z c #7F868F", ",Z c #A0B3B9", "'Z c #6F808A", ")Z c #7A8692", "!Z c #939EA8", "~Z c #9BAAB3", "{Z c #9CAFB5", "]Z c #A2B5BA", "^Z c #ACBFC4", "/Z c #A7B8BC", "(Z c #9CABB1", "_Z c #979BA6", ":Z c #838892", "` c #B0C6C9", ",` c #A7B5BB", "'` c #7F8187", ")` c #959CA0", "!` c #6C767D", "~` c #545A62", "{` c #A4ACB4", "]` c #8D9AA1", "^` c #79828A", "/` c #696B75", "(` c #6E6E79", "_` c #8B929F", ":` c #A3B1BC", "<` c #9AA2A6", "[` c #6C6F76", "}` c #50525D", "|` c #7B747D", "1` c #9A9DA9", "2` c #ADB9C5", "3` c #777C84", "4` c #8C8B91", "5` c #B7B5B6", "6` c #1A00B1", "7` c #1E00B2", "8` c #B3B0B5", "9` c #89858D", "0` c #656266", "a` c #514E56", "b` c #494854", "c` c #555159", "d` c #4D4C56", "e` c #4A464E", "f` c #49464F", "g` c #4D4D56", "h` c #514853", "i` c #4A424E", "j` c #403F4C", "k` c #5E656E", "l` c #808A90", "m` c #79838C", "n` c #86939C", "o` c #B5C9CD", "p` c #BAC6D0", "q` c #97A6AD", "r` c #7E8B93", "s` c #9CA6AF", "t` c #8C9198", "u` c #959DA6", "v` c #9CA8B1", "w` c #A2B3BA", "x` c #A2AFB9", "y` c #A2B1BC", "z` c #A2B3BD", "A` c #A1B3BB", "B` c #A1B3BA", "C` c #A4B5BB", "D` c #A2B2BA", "E` c #A7B7BF", "F` c #99A7AE", "G` c #9FAEB4", "H` c #7B8992", "I` c #737E86", "J` c #A6B3B9", "K` c #B1C1C5", "L` c #A3ACB0", "M` c #898A91", "N` c #7D8085", "O` c #757577", "P` c #737475", "Q` c #767B7D", "R` c #7D8081", "S` c #797A7D", "T` c #717278", "U` c #7B787A", "V` c #817D7E", "W` c #7F7F80", "X` c #838788", "Y` c #808180", "Z` c #7A7E80", "`` c #5D6165", " . c #414044", ". . c #949397", "+ . c #989799", "@ . c #8A988F", "# . c #7F8E84", "$ . c #727573", "% . c #47454A", "& . c #4D4D55", "* . c #83858C", "= . c #9A9CA1", "- . c #7A777E", "; . c #4A454E", "> . c #59565A", ", . c #7A7A7B", "' . c #8E8E90", ") . c #94949A", "! . c #9B9A9D", "~ . c #A29F9D", "{ . c #78777B", "] . c #4B4B52", "^ . c #74797E", "/ . c #8B959C", "( . c #A0AEB6", "_ . c #A0A7BA", ": . c #9599AC", "< . c #6F7178", "[ . c #AEB7BD", "} . c #B2B9BC", "| . c #626870", "1 . c #747781", "2 . c #80848E", "3 . c #7A8088", "4 . c #75797E", "5 . c #73767C", "6 . c #747880", "7 . c #7A7D85", "8 . c #848590", "9 . c #90929D", "0 . c #989FAB", "a . c #BDD0D6", "b . c #A2B0B6", "c . c #838A90", "d . c #696972", "e . c #706776", "f . c #8B8293", "g . c #A4A6B1", "h . c #ABB3C0", "i . c #ADBAC7", "j . c #868C95", "k . c #89898F", "l . c #B4B3B5", "m . c #462EB0", "n . c #1D00B0", "o . c #1B00AD", "p . c #C8C6C6", "q . c #A19EA2", "r . c #615C67", "s . c #6E6B73", "t . c #83858A", "u . c #7F858D", "v . c #83898F", "w . c #888A90", "x . c #73757F", "y . c #686B74", "z . c #61656E", "A . c #5D606B", "B . c #595964", "C . c #53505A", "D . c #534D56", "E . c #4E4851", "F . c #4D4B54", "G . c #6D767E", "H . c #96A4AC", "I . c #79868E", "J . c #BECED6", "K . c #BCCED2", "L . c #BAC9D2", "M . c #B7C8D2", "N . c #AEBABD", "O . c #656A6E", "P . c #696E72", "Q . c #6C757A", "R . c #71777D", "S . c #74797C", "T . c #7D7E82", "U . c #787A7D", "V . c #777F83", "W . c #767F84", "X . c #73787E", "Y . c #70787E", "Z . c #697075", "` . c #65666A", " .. c #888B95", "... c #7D908B", "+.. c #728781", "@.. c #70767A", "#.. c #72767F", "$.. c #5A5D64", "%.. c #62656A", "&.. c #72767C", "*.. c #7C808A", "=.. c #82868E", "-.. c #878A8C", ";.. c #8A8C8A", ">.. c #8A8C8F", ",.. c #6E7077", "'.. c #494A51", ").. c #6F757A", "!.. c #7A7E88", "~.. c #828B95", "{.. c #828A95", "].. c #878F96", "^.. c #859099", "/.. c #858A9F", "(.. c #84859A", "_.. c #7E7E85", ":.. c #5F6065", "<.. c #595C65", "[.. c #727880", "}.. c #7E8089", "|.. c #828187", "1.. c #86868B", "2.. c #91979D", "3.. c #717880", "4.. c #7D828C", "5.. c #7B7D85", "6.. c #9C9FAA", "7.. c #A6ABB6", "8.. c #ADBAC5", "9.. c #AEBBC7", "0.. c #A2AFBB", "a.. c #91A3AD", "b.. c #99AEB6", "c.. c #848690", "d.. c #9A94A3", "e.. c #AFACBC", "f.. c #B7C0CD", "g.. c #B1BFCA", "h.. c #A7B3BB", "i.. c #9BA2A9", "j.. c #8F9396", "k.. c #A0A4A7", "l.. c #452EB0", "m.. c #1D00AD", "n.. c #1C00A9", "o.. c #938F91", "p.. c #53525C", "q.. c #838692", "r.. c #B5BBC3", "s.. c #B8B3BF", "t.. c #B3B5C1", "u.. c #A5B2B8", "v.. c #9199A3", "w.. c #888F98", "x.. c #888B90", "y.. c #89878A", "z.. c #898A8D", "A.. c #9AA4A8", "B.. c #7D878D", "C.. c #B8C9CE", "D.. c #838E95", "E.. c #B9CACF", "F.. c #808E95", "G.. c #A9B1BD", "H.. c #818C91", "I.. c #95A0A5", "J.. c #A5B3B9", "K.. c #A4B3B8", "L.. c #ADB7B8", "M.. c #ACB2BA", "N.. c #ADB5B8", "O.. c #A9B4B8", "P.. c #A7B1B6", "Q.. c #AAB4B8", "R.. c #ACB3BE", "S.. c #94A1AA", "T.. c #96A3AC", "U.. c #8F9A9E", "V.. c #909A9D", "W.. c #96A2A7", "X.. c #919C9F", "Y.. c #888C95", "Z.. c #747B83", "`.. c #828D94", " +. c #868D97", ".+. c #868A94", "++. c #7E808B", "@+. c #777A84", "#+. c #6E7883", "$+. c #727A83", "%+. c #6D7278", "&+. c #5E6169", "*+. c #5C5762", "=+. c #4F4D55", "-+. c #5A5C65", ";+. c #656872", ">+. c #686B75", ",+. c #696C76", "'+. c #9196A1", ")+. c #7F8A94", "!+. c #8996A1", "~+. c #8E97A3", "{+. c #767C87", "]+. c #545E6F", "^+. c #6B7C8B", "/+. c #A8BCC2", "(+. c #A4ACB9", "_+. c #A5ACB6", ":+. c #A9B4BE", "<+. c #B9C4D0", "[+. c #97A1A9", "}+. c #AEBBBF", "|+. c #96A0A3", "1+. c #828B8E", "2+. c #A6A8A9", "3+. c #8B81BA", "4+. c #BCCED4", "5+. c #BDC5CD", "6+. c #BACBD3", "7+. c #AFC0C8", "8+. c #ABBCC5", "9+. c #AEB7BE", "0+. c #AEB9BE", "a+. c #B0CAD3", "b+. c #B0C9D3", "c+. c #8A949A", "d+. c #BFCDD4", "e+. c #7C8890", "f+. c #6F7E8A", "g+. c #677383", "h+. c #585B68", "i+. c #979FA9", "j+. c #86959C", "k+. c #828C96", "l+. c #ACB2BF", "m+. c #9CACB3", "n+. c #7D888D", "o+. c #B9CBCF", "p+. c #B7CBD0", "q+. c #BACACD", "r+. c #BACACE", "s+. c #BBCCCE", "t+. c #B9C1CC", "u+. c #ADBDC2", "v+. c #A8B4BE", "w+. c #A6B0BA", "x+. c #A6AFB7", "y+. c #A5B5BB", "z+. c #A3B1BA", "A+. c #A0ACB3", "B+. c #9CA9AF", "C+. c #9BA6B1", "D+. c #99A8AD", "E+. c #9CA7AD", "F+. c #959EA4", "G+. c #90999F", "H+. c #8C959B", "I+. c #6B737C", "J+. c #585F68", "K+. c #4E505A", "L+. c #524C57", "M+. c #6F6F7A", "N+. c #8C929E", "O+. c #9CA4AF", "P+. c #A1ACB6", "Q+. c #839098", "R+. c #8A9AA6", "S+. c #94A5B0", "T+. c #B2BDCA", "U+. c #8B9099", "V+. c #A3B0B7", "W+. c #9FAAAF", "X+. c #777C7F", "Y+. c #8F9398", "Z+. c #B1B1B5", "`+. c #BAB6B5", " @. c #B4B2B1", ".@. c #B9B7B5", "+@. c #BCBEC0", "@@. c #B9B7BA", "#@. c #8C80BB", "$@. c #74767F", "%@. c #6E7176", "&@. c #9CA7AC", "*@. c #B6C8D2", "=@. c #B2C9D2", "-@. c #B1C9D3", ";@. c #B0C9D1", ">@. c #909CA5", ",@. c #82858F", "'@. c #737E87", ")@. c #667783", "!@. c #606F80", "~@. c #676E79", "{@. c #656970", "]@. c #878B95", "^@. c #B4C4CD", "/@. c #AAB3BD", "(@. c #B4C8CE", "_@. c #BACDD2", ":@. c #BBCED4", "<@. c #6A757E", "[@. c #555D65", "}@. c #4F535C", "|@. c #575760", "1@. c #7B7E88", "2@. c #7B848D", "3@. c #7A8790", "4@. c #848F95", "5@. c #B4C4CE", "6@. c #AEC3C9", "7@. c #A9B9BE", "8@. c #9BAAAE", "9@. c #8B989F", "0@. c #767B85", "a@. c #62626D", "b@. c #96A3A8", "c@. c #9297A1", "d@. c #9FACB5", "e@. c #BCCCD5", "f@. c #94949B", "g@. c #A8A5A7", "h@. c #A1A6A9", "i@. c #A2A7A9", "j@. c #A4A8AB", "k@. c #9CA1A4", "l@. c #93979B", "m@. c #A1A1A4", "n@. c #C4C3BC", "o@. c #BAB8BB", "p@. c #696C72", "q@. c #80888F", "r@. c #B4C6D0", "s@. c #848D95", "t@. c #828D96", "u@. c #9AA7B2", "v@. c #B4C1CC", "w@. c #89939A", "x@. c #6F7881", "y@. c #97A2AA", "z@. c #9DA9B1", "A@. c #A8B8C1", "B@. c #AAB8C3", "C@. c #AEC1C6", "D@. c #AFC6C9", "E@. c #B1C3C7", "F@. c #B2C1CE", "G@. c #ADB9C6", "H@. c #ADC0C7", "I@. c #96A6AD", "J@. c #B4C4CA", "K@. c #B3C6CA", "L@. c #A0AFB5", "M@. c #656871", "N@. c #9FA9B5", "O@. c #BBC7D3", "P@. c #B9CDD5", "Q@. c #A2B0B7", "R@. c #88969D", "S@. c #76838B", "T@. c #6C727A", "U@. c #6B7179", "V@. c #6D737C", "W@. c #6F7981", "X@. c #6D7A82", "Y@. c #6F7C85", "Z@. c #6C787D", "`@. c #757E83", " #. c #788387", ".#. c #5B6068", "+#. c #494955", "@#. c #3E3D4A", "##. c #57555F", "$#. c #A2B0BD", "%#. c #81858A", "&#. c #95979E", "*#. c #9FA6AE", "=#. c #A3ADB2", "-#. c #A6B0B2", ";#. c #A5AFB3", ">#. c #9DA3AD", ",#. c #ADAFB6", "'#. c #B9B6BF", ")#. c #8E7FBB", "!#. c #7A7C7B", "~#. c #60616A", "{#. c #85869C", "]#. c #828C94", "^#. c #6D7680", "/#. c #7C8088", "(#. c #91989D", "_#. c #AFBEC1", ":#. c #99A6B1", "<#. c #768188", "[#. c #808992", "}#. c #929FA7", "|#. c #A8B9BD", "1#. c #BBCFD6", "2#. c #71767C", "3#. c #7B8691", "4#. c #A6B5BD", "5#. c #B7C7D0", "6#. c #A1B2B9", "7#. c #9FAEB5", "8#. c #9EA9B0", "9#. c #98A5AB", "0#. c #B0C2CB", "a#. c #94A7AB", "b#. c #89989E", "c#. c #878D9A", "d#. c #858A97", "e#. c #97A3A9", "f#. c #B3C1C9", "g#. c #93A0AA", "h#. c #969EA5", "i#. c #8A8F96", "j#. c #B0C0C5", "k#. c #BAC1C2", "l#. c #717271", "m#. c #8C8EA4", "n#. c #ADB9C8", "o#. c #B1C3C6", "p#. c #B2C0C9", "q#. c #B3C7CB", "r#. c #6D757E", "s#. c #595D67", "t#. c #68686C", "u#. c #9BA8AD", "v#. c #B7C2CB", "w#. c #95A4B1", "x#. c #788590", "y#. c #B6C3CF", "z#. c #9CACB2", "A#. c #808C95", "B#. c #B4C8D1", "C#. c #B4C5C9", "D#. c #BCC9D4", "E#. c #A7B8C0", "F#. c #9EB0B9", "G#. c #7B8088", "H#. c #51525B", "I#. c #5C646D", "J#. c #96A5AC", "K#. c #BAC8D0", "L#. c #B3C8CD", "M#. c #BBCBD7", "N#. c #B9CBD5", "O#. c #BAC8CD", "P#. c #BAC6CB", "Q#. c #B1BDC3", "R#. c #B6BFC1", "S#. c #B9B5BE", "T#. c #676568", "U#. c #5A5D62", "V#. c #A6B4BA", "W#. c #B2BFC9", "X#. c #787F88", "Y#. c #676A6F", "Z#. c #5E5C62", "`#. c #5B5760", " $. c #6A7884", ".$. c #6C7C85", "+$. c #9BA9AE", "@$. c #B9C7D2", "#$. c #8A99A0", "$$. c #63727D", "%$. c #91A1AA", "&$. c #74818A", "*$. c #A5B3B8", "=$. c #717781", "-$. c #45434E", ";$. c #55555E", ">$. c #B8CCD4", ",$. c #89969E", "'$. c #B0C0CA", ")$. c #B9C4C6", "!$. c #B8C3C7", "~$. c #A2B1B7", "{$. c #B3B7BA", "]$. c #C5C5C5", "^$. c #BDBFC1", "/$. c #ABB1B8", "($. c #B0C4C8", "_$. c #949AA3", ":$. c #868993", "<$. c #7B828B", "[$. c #767C85", "}$. c #808990", "|$. c #B8C6D0", "1$. c #AEBDC6", "2$. c #8F9CA5", "3$. c #7A8990", "4$. c #9BACB4", "5$. c #98A4AF", "6$. c #637078", "7$. c #859198", "8$. c #B1C8D0", "9$. c #B1C4CB", "0$. c #919DA7", "a$. c #A0AEB7", "b$. c #4A4650", "c$. c #B7C5C9", "d$. c #BACBCF", "e$. c #B1BBC6", "f$. c #AFB9BF", "g$. c #B3B5B8", "h$. c #BCB9BA", "i$. c #C1BBC1", "j$. c #C9C2C4", "k$. c #C5C3BE", "l$. c #BABCBE", "m$. c #A2AAAF", "n$. c #5E606B", "o$. c #626570", "p$. c #B7CBCF", "q$. c #8A929B", "r$. c #A0A6B1", "s$. c #9AA7AB", "t$. c #BCCDD4", "u$. c #ADC6CB", "v$. c #BBCDD5", "w$. c #808A8E", "x$. c #7E888E", "y$. c #B1C4CC", "z$. c #737C81", "A$. c #97A5AB", "B$. c #BBC8D3", "C$. c #B6C6D0", "D$. c #BACFD3", "E$. c #7A8A93", "F$. c #B2BEC6", "G$. c #B1BAC0", "H$. c #B8B5C0", "I$. c #C6C5BB", "J$. c #9A9DA0", "K$. c #62646B", "L$. c #69707B", "M$. c #A8B7C2", "N$. c #B6C4D0", "O$. c #A6B2BC", "P$. c #848C94", "Q$. c #869199", "R$. c #707B83", "S$. c #5A5E63", "T$. c #838587", "U$. c #ABB6BB", "V$. c #B5CAD2", "W$. c #B2C7D0", "X$. c #AEC9D1", "Y$. c #A4AFB1", "Z$. c #79858B", "`$. c #808B95", " %. c #A6B3BE", ".%. c #9EA4AE", "+%. c #68666F", "@%. c #B1CAD2", "#%. c #B2C9CF", "$%. c #BDD1D6", "%%. c #9AAEB3", "&%. c #85949D", "*%. c #B3B5B9", "=%. c #B9BBBA", "-%. c #C0C4C0", ";%. c #B4B2B3", ">%. c #948E92", ",%. c #696870", "'%. c #757D88", ")%. c #A1B0B8", "!%. c #ADBDC8", "~%. c #ACBDC7", "{%. c #BECED5", "]%. c #5F666E", "^%. c #51535D", "/%. c #B5C7D0", "(%. c #7B868D", "_%. c #95A2AC", ":%. c #9CA2AA", "<%. c #A4AAB3", "[%. c #8C9096", "}%. c #A2A8B0", "|%. c #B9C6D0", "1%. c #BCD1D9", "2%. c #C0D3D8", "3%. c #93A1A9", "4%. c #4D5460", "5%. c #737D8B", "6%. c #BBBFC3", "7%. c #C3C4BD", "8%. c #442EB5", "9%. c #1700B1", "0%. c #C6C4C5", "a%. c #C4C3C1", "b%. c #AEACAE", "c%. c #857E84", "d%. c #6B6C74", "e%. c #ABBDC9", "f%. c #BAC8CE", "g%. c #A8B9C0", "h%. c #858D9B", "i%. c #848E9B", "j%. c #8B959D", "k%. c #494C57", "l%. c #52535E", "m%. c #9FA7B1", "n%. c #7C848C", "o%. c #B5CBD3", "p%. c #AFC4CB", "q%. c #7A868C", "r%. c #818E95", "s%. c #777E85", "t%. c #7B7C85", "u%. c #B8C6D2", "v%. c #BDCCD3", "w%. c #7D7D86", "x%. c #65646B", "y%. c #76747E", "z%. c #B4C3CE", "A%. c #C3D7DE", "B%. c #939DA7", "C%. c #4A4A56", "D%. c #6C727F", "E%. c #A1AEBB", "F%. c #ADB7BB", "G%. c #B6BBBC", "H%. c #C4C4BC", "I%. c #8985BC", "J%. c #C3C9C2", "K%. c #C5C5BC", "L%. c #6B7178", "M%. c #8899A1", "N%. c #AAC3CC", "O%. c #8E9EA5", "P%. c #6B747D", "Q%. c #5C5E67", "R%. c #63656C", "S%. c #373641", "T%. c #54555C", "U%. c #999BA0", "V%. c #99A1AA", "W%. c #98A6B0", "X%. c #B8C5D1", "Y%. c #8E9BA4", "Z%. c #7F8A91", "`%. c #B7D0D8", " &. c #9FB6BE", ".&. c #778488", "+&. c #616B6F", "@&. c #7C888C", "#&. c #7D828A", "$&. c #B4C7D1", "%&. c #B4C5D1", "&&. c #5F5D64", "*&. c #3F3B44", "=&. c #3C3A46", "-&. c #45404C", ";&. c #504C56", ">&. c #BFD2DC", ",&. c #5A5B64", "'&. c #697079", ")&. c #95A3AC", "!&. c #B2B6BA", "~&. c #442FAF", "{&. c #1700AB", "]&. c #8B84BA", "^&. c #C3C8C1", "/&. c #C9C8CC", "(&. c #A4A2A7", "_&. c #65656C", ":&. c #747C83", "<&. c #99AAB1", "[&. c #A2B4B9", "}&. c #92A1A7", "|&. c #8D989E", "1&. c #9098A2", "2&. c #8A9199", "3&. c #848891", "4&. c #494851", "5&. c #403B43", "6&. c #5B545C", "7&. c #7B838B", "8&. c #859298", "9&. c #A4B3BA", "0&. c #BBCED7", "a&. c #94A1AD", "b&. c #585E67", "c&. c #6D747B", "d&. c #99A7AC", "e&. c #7D7F88", "f&. c #676C72", "g&. c #7D878F", "h&. c #ABB8C2", "i&. c #BFD0D9", "j&. c #696F7A", "k&. c #60636F", "l&. c #9CA5B0", "m&. c #98A2AC", "n&. c #767E88", "o&. c #666872", "p&. c #352F32", "q&. c #323035", "r&. c #4A4D57", "s&. c #6A6F7A", "t&. c #52555D", "u&. c #666D73", "v&. c #859196", "w&. c #9EACB1", "x&. c #788087", "y&. c #9BA9B2", "z&. c #6C757E", "A&. c #B2B9C4", "B&. c #C3BCC0", "C&. c #C5C1C1", "D&. c #462EB1", "E&. c #1A00AE", "F&. c #8F81BA", "G&. c #C5C4C9", "H&. c #99989D", "I&. c #B4C6CA", "J&. c #BBCAD4", "K&. c #BCCBD5", "L&. c #A4ABB3", "M&. c #494651", "N&. c #666A71", "O&. c #B6C9CD", "P&. c #909AA4", "Q&. c #7A848D", "R&. c #878F9A", "S&. c #545661", "T&. c #61646B", "U&. c #585B64", "V&. c #9197A3", "W&. c #B6CED6", "X&. c #ADBEC7", "Y&. c #A8B5C0", "Z&. c #A0ACB7", "`&. c #8A96A1", " *. c #50515D", ".*. c #403E4A", "+*. c #646872", "@*. c #868991", "#*. c #777A82", "$*. c #6E737B", "%*. c #919DA5", "&*. c #61666D", "**. c #5B5D67", "=*. c #4C4851", "-*. c #434348", ";*. c #778188", ">*. c #51515B", ",*. c #34323C", "'*. c #373841", ")*. c #52585F", "!*. c #C0CFD6", "~*. c #53535B", "{*. c #6A6E77", "]*. c #75828B", "^*. c #666E77", "/*. c #7F888F", "(*. c #B6C0CA", "_*. c #AFBBC5", ":*. c #B7BCC2", "<*. c #C0BDC5", "[*. c #C4C2C4", "}*. c #88898E", "|*. c #4F4E56", "1*. c #7F8591", "2*. c #545760", "3*. c #8C959E", "4*. c #9BA1AD", "5*. c #70747E", "6*. c #79828B", "7*. c #94A1A8", "8*. c #BACCD6", "9*. c #B7C3CE", "0*. c #585860", "a*. c #767781", "b*. c #B3C9CE", "c*. c #B0C9D2", "d*. c #AFC1CC", "e*. c #A5B0BC", "f*. c #85919C", "g*. c #63616D", "h*. c #4A4853", "i*. c #55616B", "j*. c #7B8A95", "k*. c #8E98A0", "l*. c #86888E", "m*. c #53515C", "n*. c #5D5A63", "o*. c #64656D", "p*. c #757D85", "q*. c #B2C4CC", "r*. c #9DA9B7", "s*. c #7E828A", "t*. c #7B7881", "u*. c #78737B", "v*. c #77828C", "w*. c #A0B0B8", "x*. c #79828D", "y*. c #444451", "z*. c #34323F", "A*. c #33323F", "B*. c #3A3A46", "C*. c #5C616B", "D*. c #8A969D", "E*. c #464049", "F*. c #758088", "G*. c #62666E", "H*. c #BABDC1", "I*. c #C5C3C4", "J*. c #AEB3B3", "K*. c #7E8084", "L*. c #4F5359", "M*. c #A4B4BF", "N*. c #63676D", "O*. c #7B7D87", "P*. c #60656D", "Q*. c #7D838B", "R*. c #A3B2B7", "S*. c #BCCAD1", "T*. c #839096", "U*. c #6D7981", "V*. c #636A75", "W*. c #60626E", "X*. c #6B6D74", "Y*. c #7F858F", "Z*. c #8E9AA8", "`*. c #8C99A3", " =. c #9198A3", ".=. c #8B93A0", "+=. c #8D949E", "@=. c #9197A2", "#=. c #969FA8", "$=. c #9BA8AF", "%=. c #A1AEB8", "&=. c #ABB9C4", "*=. c #ABBAC5", "==. c #9EACB0", "-=. c #A4B5BE", ";=. c #ACBCC5", ">=. c #6E7581", ",=. c #5F606C", "'=. c #4C4A52", ")=. c #49505A", "!=. c #707E88", "~=. c #818890", "{=. c #474449", "]=. c #49494D", "^=. c #5D6168", "/=. c #B4BEC9", "(=. c #B8BCC2", "_=. c #1D00AF", ":=. c #1C00AE", "<=. c #C2C3C1", "[=. c #BEC1C1", "}=. c #AAAEB0", "|=. c #7D7E81", "1=. c #53585D", "2=. c #859399", "3=. c #676E72", "4=. c #73767E", "5=. c #BED2D8", "6=. c #93A4AA", "7=. c #565E64", "8=. c #89959C", "9=. c #717C83", "0=. c #79848A", "a=. c #A0AFB8", "b=. c #8A939B", "c=. c #767C84", "d=. c #575D63", "e=. c #585B65", "f=. c #6E7078", "g=. c #878A93", "h=. c #A1ADBB", "i=. c #98A7B1", "j=. c #62656E", "k=. c #BDCBD7", "l=. c #BBC8D5", "m=. c #BBCAD5", "n=. c #BACBD5", "o=. c #BBC9D2", "p=. c #9DAAB4", "q=. c #7C8186", "r=. c #67737B", "s=. c #7A8B95", "t=. c #B2C5CE", "u=. c #575A5F", "v=. c #45474B", "w=. c #54565C", "x=. c #99A3A8", "y=. c #B5C4CA", "z=. c #AFBAC4", "A=. c #B8BCBF", "B=. c #ABACAF", "C=. c #7E7E81", "D=. c #585960", "E=. c #859297", "F=. c #676F74", "G=. c #9BAFB8", "H=. c #B4CBD4", "I=. c #BBD1D6", "J=. c #90A2A7", "K=. c #555E63", "L=. c #8C949E", "M=. c #808D95", "N=. c #77858D", "O=. c #A2B6BB", "P=. c #BFD2D9", "Q=. c #9BA8AE", "R=. c #64686B", "S=. c #878D90", "T=. c #8F9CA4", "U=. c #6F7781", "V=. c #54555E", "W=. c #7E8991", "X=. c #B3C1CC", "Y=. c #9196A2", "Z=. c #85949A", "`=. c #BDCBD6", " -. c #B9CAD5", ".-. c #6B717A", "+-. c #48474F", "@-. c #47464B", "#-. c #56565A", "$-. c #B9BCBA", "%-. c #BBB3C3", "&-. c #1D00B2", "*-. c #1D00B1", "=-. c #3316AC", "--. c #A3A4A3", ";-. c #797A7F", ">-. c #828F94", ",-. c #697176", "'-. c #7C838B", ")-. c #9EB3BC", "!-. c #B2CDD6", "~-. c #555963", "{-. c #79818A", "]-. c #BDD3DA", "^-. c #9AA8AD", "/-. c #616369", "(-. c #767C7E", "_-. c #9EACAE", ":-. c #B2C1C9", "<-. c #707D87", "[-. c #686E78", "}-. c #9BAAB2", "|-. c #A6B8BE", "1-. c #61686E", "2-. c #81888C", "3-. c #89939C", "4-. c #5C5F68", "5-. c #44444B", "6-. c #3E3D42", "7-. c #505257", "8-. c #777E84", "9-. c #B7BBBA", "0-. c #1E01B0", "a-. c #9D9E9D", "b-. c #696D76", "c-. c #BBCBD0", "d-. c #818C92", "e-. c #6D777D", "f-. c #A7BCC4", "g-. c #B3C8D0", "h-. c #4D4E5A", "i-. c #B4C4CF", "j-. c #79818B", "k-. c #727B84", "l-. c #838B92", "m-. c #8E989F", "n-. c #9CAAAF", "o-. c #64696F", "p-. c #6E7379", "q-. c #949FA4", "r-. c #A7B6BE", "s-. c #69747E", "t-. c #60707A", "u-. c #737D87", "v-. c #BACDD5", "w-. c #BDCDD5", "x-. c #798088", "y-. c #43454E", "z-. c #5E6670", "A-. c #96A5AE", "B-. c #B6BEBF", "C-. c #2000AC", "D-. c #767A7E", "E-. c #6A7277", "F-. c #9AA5AC", "G-. c #7C888E", "H-. c #A1B5BA", "I-. c #BECFD3", "J-. c #474854", "K-. c #777F88", "L-. c #9DA7AF", "M-. c #9DA9B6", "N-. c #8F9BA0", "O-. c #A7B0BA", "P-. c #6B7B85", "Q-. c #595B63", "R-. c #6E727A", "S-. c #646D73", "T-. c #6E717A", "U-. c #949BA4", "V-. c #515A60", "W-. c #474C52", "X-. c #8C9EA5", "Y-. c #A3BAC3", "Z-. c #AFC3CA", "`-. c #BACACF", " ;. c #BDC9D5", ".;. c #949EA4", "+;. c #51525C", "@;. c #3F3E47", "#;. c #403F48", "$;. c #4A4A55", "%;. c #9C9D9E", "&;. c #696F77", "*;. c #9AA6AC", "=;. c #BED0D5", "-;. c #5C5E69", ";;. c #757C87", ">;. c #9CABB3", ",;. c #888F96", "';. c #869097", ");. c #8F969F", "!;. c #9397A4", "~;. c #7D8891", "{;. c #A3ACB5", "];. c #BCD0D6", "^;. c #5D5E68", "/;. c #8D979F", "(;. c #C1D3DA", "_;. c #8BA0A6", ":;. c #8EA3A9", "<;. c #6A727A", "[;. c #73737F", "};. c #969CA6", "|;. c #4C5B67", "1;. c #3E4850", "2;. c #5D6269", "3;. c #5A5E69", "4;. c #555662", "5;. c #C1D2D6", "6;. c #3F3942", "7;. c #44414B", "8;. c #77888E", "9;. c #A4BEC4", "0;. c #B7BDC0", "a;. c #C2BDBF", "b;. c #77787C", "c;. c #B0C0C9", "d;. c #B8C6CF", "e;. c #7B818A", "f;. c #777F8A", "g;. c #929FA9", "h;. c #76767C", "i;. c #889196", "j;. c #939DA3", "k;. c #8E939B", "l;. c #60646D", "m;. c #585863", "n;. c #9297A2", "o;. c #A3ACB7", "p;. c #99A1A8", "q;. c #73868C", "r;. c #7D9298", "s;. c #73747E", "t;. c #9096A0", "u;. c #4C5864", "v;. c #636C78", "w;. c #BACED4", "x;. c #51555F", "y;. c #B1C3CB", "z;. c #BED1D6", "A;. c #A4B1B7", "B;. c #49454F", "C;. c #6C7C83", "D;. c #99B2B9", "E;. c #B2C7CC", "F;. c #A6A5A2", "G;. c #7C7B79", "H;. c #606067", "I;. c #949DA7", "J;. c #B6C6CA", "K;. c #848A93", "L;. c #797A83", "M;. c #99A5AB", "N;. c #A4AEB1", "O;. c #757981", "P;. c #4C5057", "Q;. c #88949C", "R;. c #61656D", "S;. c #5B5E66", "T;. c #858F98", "U;. c #81828D", "V;. c #999EA7", "W;. c #9498A1", "X;. c #81858E", "Y;. c #758087", "Z;. c #6C747D", "`;. c #8F949D", " >. c #ADBDC1", ".>. c #79848C", "+>. c #767A85", "@>. c #9FA7B3", "#>. c #B8CDD4", "$>. c #5C6269", "%>. c #A9BBBF", "&>. c #7F8C93", "*>. c #4E505D", "=>. c #34333E", "->. c #3A3D44", ";>. c #B0B5BB", ">>. c #C0BFB9", ",>. c #C2C4BE", "'>. c #807F7F", ")>. c #5F5E66", "!>. c #939AA6", "~>. c #BDC8D5", "{>. c #A3B8C1", "]>. c #9FAFB5", "^>. c #676E75", "/>. c #A7B9BF", "(>. c #646970", "_>. c #AFC0C9", ":>. c #B9C9D4", "<>. c #7A8589", "[>. c #5C6067", "}>. c #595C62", "|>. c #686B6E", "1>. c #717379", "2>. c #565763", "3>. c #4F4F5B", "4>. c #707479", "5>. c #686973", "6>. c #767681", "7>. c #7E7F88", "8>. c #8E8895", "9>. c #9C96A4", "0>. c #ABACB6", "a>. c #B7B8C1", "b>. c #BABAC1", "c>. c #B3B6BD", "d>. c #AFADB9", "e>. c #AAA7B5", "f>. c #A2A6B0", "g>. c #A4AFB9", "h>. c #ABB3B7", "i>. c #B6BEC6", "j>. c #BBC6CF", "k>. c #8C9AA0", "l>. c #686C76", "m>. c #B7CCD2", "n>. c #5E636B", "o>. c #6C7479", "p>. c #9BA9AF", "q>. c #5B626B", "r>. c #34363F", "s>. c #3C3E45", "t>. c #B7CCD1", "u>. c #AFB5B9", "v>. c #B9B6BA", "w>. c #C1BBC0", "x>. c #BEC1C3", "y>. c #8A85BB", "z>. c #ABABAB", "A>. c #808085", "B>. c #606269", "C>. c #BDCAD5", "D>. c #BAD1D8", "E>. c #9EB3BA", "F>. c #7B858B", "G>. c #52575D", "H>. c #636971", "I>. c #B7C6D2", "J>. c #A8B5BF", "K>. c #89949B", "L>. c #6F7980", "M>. c #899499", "N>. c #949CA7", "O>. c #687076", "P>. c #5E5F67", "Q>. c #79757D", "R>. c #A29FA4", "S>. c #9A9BA3", "T>. c #575A65", "U>. c #84848F", "V>. c #95929C", "W>. c #878790", "X>. c #B8C1CB", "Y>. c #71767F", "Z>. c #737882", "`>. c #7F848E", " ,. c #8C9095", ".,. c #9995A2", "+,. c #ACA6B6", "@,. c #BBBBC5", "#,. c #BABCC5", "$,. c #B0B1B7", "%,. c #A5A5A9", "&,. c #9F98A5", "*,. c #9E95A6", "=,. c #9D99A6", "-,. c #A6ADB8", ";,. c #999BA4", ">,. c #7F7F84", ",,. c #93969E", "',. c #ABB5C0", "),. c #BCD1D6", "!,. c #BDD0D8", "~,. c #BACBD7", "{,. c #8B949F", "],. c #9AAAAF", "^,. c #636D72", "/,. c #383B41", "(,. c #403F46", "_,. c #7C8A90", ":,. c #ADB5B9", "<,. c #C0B9C2", "[,. c #BDC0C4", "},. c #818386", "|,. c #B9C5D1", "1,. c #99A6AB", "2,. c #788188", "3,. c #9CA8AE", "4,. c #A5B4BC", "5,. c #A3B2BB", "6,. c #97A0AA", "7,. c #656974", "8,. c #43444C", "9,. c #A8AFBA", "0,. c #ADC0C8", "a,. c #99A0A4", "b,. c #87898D", "c,. c #63636B", "d,. c #56585C", "e,. c #676B6F", "f,. c #898C94", "g,. c #A6A2AD", "h,. c #BCB3BE", "i,. c #C1B8C3", "j,. c #9B9AA4", "k,. c #626772", "l,. c #BCBCC6", "m,. c #B6ACBD", "n,. c #938B9C", "o,. c #787C86", "p,. c #9BA4AD", "q,. c #A1AAB6", "r,. c #A8B4BC", "s,. c #A6B0B6", "t,. c #82858C", "u,. c #928E9C", "v,. c #A196A9", "w,. c #A4A9B5", "x,. c #4C4C53", "y,. c #575E64", "z,. c #B5C8D2", "A,. c #B8C8D4", "B,. c #B5C4D1", "C,. c #919BA6", "D,. c #697179", "E,. c #98A7AE", "F,. c #B0C7CF", "G,. c #B3C4CF", "H,. c #5E686E", "I,. c #393D42", "J,. c #3F3F47", "K,. c #353E4A", "L,. c #5A6A74", "M,. c #B9CCCF", "N,. c #A9B5B9", "O,. c #AFB5B6", "P,. c #C6C3C2", "Q,. c #C5C4BD", "R,. c #61656B", "S,. c #BCCAD3", "T,. c #9DA4AB", "U,. c #989FA7", "V,. c #8D939A", "W,. c #A2ABB4", "X,. c #9EA9B1", "Y,. c #94A3A9", "Z,. c #90A0A8", "`,. c #94A3AB", " '. c #818D91", ".'. c #778086", "+'. c #B9CDD3", "@'. c #B5CBD0", "#'. c #A6B4B8", "$'. c #A4B2B7", "%'. c #5B5F69", "&'. c #41414C", "*'. c #7A828D", "='. c #8D9197", "-'. c #8B9096", ";'. c #9FB2B9", ">'. c #71757D", ",'. c #9A999D", "''. c #BAB6C0", ")'. c #C7C4D1", "!'. c #B4B4C1", "~'. c #90929C", "{'. c #6D6D73", "]'. c #797E89", "^'. c #C7CAD2", "/'. c #D4D4D9", "('. c #ACA7B2", "_'. c #82808E", ":'. c #787E88", "<'. c #BDCED3", "['. c #7D9099", "}'. c #BECED3", "|'. c #B8C9CC", "1'. c #A9BFC4", "2'. c #A4B7BC", "3'. c #7A7E86", "4'. c #787783", "5'. c #787482", "6'. c #6F717B", "7'. c #70747D", "8'. c #767A82", "9'. c #65666E", "0'. c #56565C", "a'. c #666A72", "b'. c #B8CBCF", "c'. c #B6CBD0", "d'. c #B5CBD1", "e'. c #707880", "f'. c #98A5AF", "g'. c #BBCCD5", "h'. c #78818B", "i'. c #717883", "j'. c #575A64", "k'. c #A2B6BD", "l'. c #AABDC4", "m'. c #BFCFD3", "n'. c #C0D0D6", "o'. c #BBD0D5", "p'. c #BBCED3", "q'. c #BDCCD5", "r'. c #BBCBD4", "s'. c #A0ABB5", "t'. c #45484F", "u'. c #37383F", "v'. c #3C3F45", "w'. c #2D353D", "x'. c #4F5B63", "y'. c #99A8AF", "z'. c #BAB3C1", "A'. c #8B81BB", "B'. c #C5C4C0", "C'. c #9299A5", "D'. c #848F96", "E'. c #6D7178", "F'. c #66666F", "G'. c #5F5F65", "H'. c #5F656F", "I'. c #6B7279", "J'. c #6B747C", "K'. c #6A737B", "L'. c #6D757C", "M'. c #717780", "N'. c #7C828A", "O'. c #5F646B", "P'. c #B1C5CC", "Q'. c #A0B4B9", "R'. c #909EA5", "S'. c #9EAFB5", "T'. c #747F87", "U'. c #7A7D86", "V'. c #686D74", "W'. c #757F87", "X'. c #96A1A4", "Y'. c #969FA4", "Z'. c #81888F", "`'. c #444550", " ). c #4C4D58", ".). c #797A84", "+). c #96949A", "@). c #A69EAA", "#). c #9896A0", "$). c #6F7377", "%). c #8D8F96", "&). c #B5BCC7", "*). c #CAC9D6", "=). c #C3BEC8", "-). c #7E8086", ";). c #899199", ">). c #95A6AE", ",). c #5B6871", "'). c #666973", ")). c #878891", "!). c #9FADB3", "~). c #AAC0C4", "{). c #B0C8CC", "]). c #B7C3C9", "^). c #80858D", "/). c #767B84", "(). c #696C75", "_). c #4B4C55", ":). c #505157", "<). c #7B7F85", "[). c #88949A", "}). c #AEC2CB", "|). c #AEC0CA", "1). c #7E838D", "2). c #AABAC4", "3). c #96A1A6", "4). c #9AA4AB", "5). c #767881", "6). c #575761", "7). c #413F49", "8). c #5E5D68", "9). c #7C868E", "0). c #A0AFB4", "a). c #A2B3B8", "b). c #A5B6BB", "c). c #A6B7BC", "d). c #A5B6BD", "e). c #A7B4BE", "f). c #AFC1C9", "g). c #B0C4CA", "h). c #4C4A53", "i). c #343138", "j). c #373A3F", "k). c #35383C", "l). c #AFB7BE", "m). c #5E616A", "n). c #AEC0C8", "o). c #575A62", "p). c #3B3A42", "q). c #45434B", "r). c #41414B", "s). c #3E3E48", "t). c #424349", "u). c #414248", "v). c #404044", "w). c #46474F", "x). c #54565F", "y). c #64666C", "z). c #6D6F7A", "A). c #757782", "B). c #787983", "C). c #646A70", "D). c #BFD1D6", "E). c #A4B6BC", "F). c #7B8891", "G). c #6A777F", "H). c #839299", "I). c #6B7788", "J). c #657381", "K). c #5C5C68", "L). c #7F838D", "M). c #757C82", "N). c #737478", "O). c #4E4E56", "P). c #5F6063", "Q). c #595B5E", "R). c #4E4C51", "S). c #48424C", "T). c #59555F", "U). c #5D5962", "V). c #5F5964", "W). c #595D61", "X). c #7D868D", "Y). c #A9ADB5", "Z). c #C6C5CE", "`). c #CCCCD6", " !. c #BFB6C8", ".!. c #968D9D", "+!. c #AEC3CC", "@!. c #B2CAD2", "#!. c #49444E", "$!. c #4E4752", "%!. c #687079", "&!. c #7D8992", "*!. c #B0C3C6", "=!. c #B4C1C6", "-!. c #A6B5B9", ";!. c #A0ABB2", ">!. c #6F7680", ",!. c #6F6F78", "'!. c #868B8E", ")!. c #869398", "!!. c #919FA5", "~!. c #909FA7", "{!. c #9FAEB6", "]!. c #9DABB7", "^!. c #9CAAB7", "/!. c #595B65", "(!. c #AEC0C9", "_!. c #5C6069", ":!. c #686D76", "~. c #706C79", ",~. c #5B5765", "'~. c #5E5C66", ")~. c #5B5960", "!~. c #6C6E73", "~~. c #B6CCD2", "{~. c #7E868F", "]~. c #6D6A73", "^~. c #706D76", "/~. c #686570", "(~. c #585A61", "_~. c #55595F", ":~. c #60646C", "<~. c #737E84", "[~. c #B9C8CB", "}~. c #B2BDC8", "|~. c #797F85", "1~. c #A1A4AB", "2~. c #8B9097", "3~. c #88939A", "4~. c #6E777F", "5~. c #768187", "6~. c #7A858C", "7~. c #818A94", "8~. c #898F99", "9~. c #7F8B92", "0~. c #818A93", "a~. c #666D78", "b~. c #848E9A", "c~. c #BDCED6", "d~. c #8C96A0", "e~. c #6E6B71", "f~. c #6A676F", "g~. c #38333C", "h~. c #352E35", "i~. c #3C343D", "j~. c #424147", "k~. c #424246", "l~. c #3D393F", "m~. c #39383E", "n~. c #3A3C44", "o~. c #40424C", "p~. c #474751", "q~. c #454349", "r~. c #49494E", "s~. c #585B5D", "t~. c #53585B", "u~. c #5C6066", "v~. c #C0D1D8", "w~. c #BFD3DA", "x~. c #BDD1D8", "y~. c #8AA0AC", "z~. c #7F9096", "A~. c #879297", "B~. c #B9CDD1", "C~. c #A3B2BC", "D~. c #99A8B1", "E~. c #6B757B", "F~. c #4B5158", "G~. c #484952", "H~. c #43434D", "I~. c #3C3944", "J~. c #3B3743", "K~. c #505058", "L~. c #6E7277", "M~. c #868D92", "N~. c #929CA0", "O~. c #A0AEB3", "P~. c #B5B8BB", "Q~. c #BAB7BD", "R~. c #2100B2", "S~. c #B5B7B7", "T~. c #62676F", "U~. c #595C64", "V~. c #73737A", "W~. c #CBCBCF", "X~. c #E4E4E7", "Y~. c #DAD9DF", "Z~. c #D5D4DC", "`~. c #DBDAE2", " {. c #DDDBE4", ".{. c #D6D4DE", "+{. c #D6D5DF", "@{. c #D0CED4", "#{. c #C3BFC1", "${. c #B9BAC1", "%{. c #B7B5C4", "&{. c #B5ACBD", "*{. c #AAA6B3", "={. c #8E9298", "-{. c #555661", ";{. c #C6C7D3", ">{. c #D7D4DE", ",{. c #B3B0B6", "'{. c #969BA2", "){. c #919CA9", "!{. c #737984", "~{. c #A0AAB6", "{{. c #50515B", "]{. c #656B75", "^{. c #7E898F", "/{. c #898C9B", "({. c #898E9A", "_{. c #848D97", ":{. c #868B94", "<{. c #90999D", "[{. c #797C82", "}{. c #5A5A62", "|{. c #43464E", "1{. c #D9DADF", "2{. c #DDDDE0", "3{. c #DADADD", "4{. c #E2E2E8", "5{. c #A3A3AC", "6{. c #474651", "7{. c #757985", "8{. c #BBBDCA", "9{. c #D1CED8", "0{. c #CDCBD0", "a{. c #ABACB1", "b{. c #7A7A84", "c{. c #6A6D78", "d{. c #848992", "e{. c #73767B", "f{. c #6B6F75", "g{. c #A0A7B1", "h{. c #7F838C", "i{. c #403C43", "j{. c #48494F", "k{. c #4D5156", "l{. c #4E5157", "m{. c #72787C", "n{. c #8B9598", "o{. c #95A2A7", "p{. c #A0ABB7", "q{. c #A9B5C1", "r{. c #808B8F", "s{. c #757F84", "t{. c #808790", "u{. c #838E94", "v{. c #ABBEC3", "w{. c #42444C", "x{. c #5B666F", "y{. c #656E76", "z{. c #63696F", "A{. c #60686D", "B{. c #5E666B", "C{. c #60636B", "D{. c #69686E", "E{. c #848892", "F{. c #8B8F99", "G{. c #8C939C", "H{. c #7B878E", "I{. c #6F7A81", "J{. c #717981", "K{. c #838A91", "L{. c #61686F", "M{. c #85909D", "N{. c #ABBBC9", "O{. c #808591", "P{. c #5D5C64", "Q{. c #625E63", "R{. c #717174", "S{. c #68696F", "T{. c #36323A", "U{. c #302930", "V{. c #332D33", "W{. c #343134", "X{. c #333033", "Y{. c #342E33", "Z{. c #38353E", "`{. c #3B3A41", " ]. c #3B393C", ".]. c #3B3B43", "+]. c #43444E", "@]. c #54545A", "#]. c #535459", "$]. c #515153", "%]. c #4E4D4E", "&]. c #64676C", "*]. c #828990", "=]. c #4F4F53", "-]. c #848A92", ";]. c #8C9CA5", ">]. c #748B97", ",]. c #677880", "']. c #758085", ")]. c #707980", "!]. c #6C737A", "~]. c #5C626A", "{]. c #5D5F6A", "]]. c #B2B5B9", "^]. c #B6B7C0", "/]. c #6C7579", "(]. c #94A4AB", "_]. c #B2C3C7", ":]. c #74737B", "<]. c #CCC9D2", "[]. c #E3E1EA", "}]. c #DCDAE4", "|]. c #DCD9E3", "1]. c #DBDBE0", "2]. c #DCDBE0", "3]. c #DCDAE3", "4]. c #DBD8E2", "5]. c #D9D5DE", "6]. c #D7D5DE", "7]. c #D6D3DE", "8]. c #D5D1DC", "9]. c #D1D0D7", "0]. c #CCCED0", "a]. c #C6C8C9", "b]. c #BABFC7", "c]. c #A5ADB9", "d]. c #96A0A9", "e]. c #838993", "f]. c #666974", "g]. c #98A0AA", "h]. c #BDCBD5", "i]. c #C0C4CE", "j]. c #D0CDD7", "k]. c #D8D4DF", "l]. c #BBBBC6", "m]. c #98A4AD", "n]. c #52535D", "o]. c #A6B3C3", "p]. c #A8B5CA", "q]. c #ACBAC8", "r]. c #A8B7C0", "s]. c #A4B1B6", "t]. c #A7B9BD", "u]. c #ABBFC3", "v]. c #8F989F", "w]. c #46464E", "x]. c #B9C2CB", "y]. c #DCDDE6", "z]. c #DBD8E1", "A]. c #D3D2D9", "B]. c #DFDEE7", "C]. c #A2A1A9", "D]. c #B9BAC5", "E]. c #C6C0CB", "F]. c #9F9BA5", "G]. c #7A7C85", "H]. c #9295A0", "I]. c #ADB7C1", "J]. c #818C93", "K]. c #6F767D", "L]. c #A5B4BF", "M]. c #767F87", "N]. c #47434C", "O]. c #5D6468", "P]. c #707478", "Q]. c #3D3D44", "R]. c #39393F", "S]. c #54555D", "T]. c #7A858B", "U]. c #6D777C", "V]. c #7B878F", "W]. c #7D888F", "X]. c #ABBDC2", "Y]. c #7C7F83", "Z]. c #484447", "`]. c #53616B", " ^. c #626970", ".^. c #5C6469", "+^. c #555559", "@^. c #4A4950", "#^. c #48454D", "$^. c #4C4D54", "%^. c #52565F", "&^. c #54535E", "*^. c #5A5761", "=^. c #6A6E73", "-^. c #BBCAD7", ";^. c #BAC8D4", ">^. c #A3B0BB", ",^. c #808B94", "'^. c #8C989E", ")^. c #B5BFCA", "!^. c #747481", "~^. c #4D4851", "{^. c #4A484C", "]^. c #48484E", "^^. c #46464D", "/^. c #46464B", "(^. c #3E3A40", "_^. c #363137", ":^. c #333134", "<^. c #333337", "[^. c #312F35", "}^. c #322C33", "|^. c #45454E", "1^. c #454548", "2^. c #4D5157", "3^. c #6C6D72", "4^. c #72777D", "5^. c #4C4B4F", "6^. c #353234", "7^. c #47484D", "8^. c #778289", "9^. c #848790", "0^. c #64636C", "a^. c #52525B", "b^. c #5C5C64", "c^. c #686670", "d^. c #76828A", "e^. c #76828B", "f^. c #7A858D", "g^. c #7D878E", "h^. c #686C75", "i^. c #4D4F53", "j^. c #4A484F", "k^. c #737982", "l^. c #A0A8B1", "m^. c #B9C9D2", "n^. c #B4BAC1", "o^. c #B2B3AD", "p^. c #919491", "q^. c #B5CCD3", "r^. c #B3CBD3", "s^. c #78767F", "t^. c #D5D0DB", "u^. c #EDE9F4", "v^. c #E6E2ED", "w^. c #E5E1EC", "x^. c #E2E1E5", "y^. c #E0E1E5", "z^. c #E4E1EB", "A^. c #E4E0EB", "B^. c #E5E3EC", "C^. c #E5E4EB", "D^. c #E5E4E9", "E^. c #E6E4ED", "F^. c #E6E4EC", "G^. c #EBE8EE", "H^. c #E8E5EC", "I^. c #ADAEC5", "J^. c #9094AE", "K^. c #A1A9B7", "L^. c #848C95", "M^. c #BDC1CB", "N^. c #D8D5DF", "O^. c #C1C5D2", "P^. c #989FAC", "Q^. c #BECFD4", "R^. c #727981", "S^. c #A2ABB3", "T^. c #9BA4AF", "U^. c #9CA8B3", "V^. c #9AA3AB", "W^. c #9AA1A7", "X^. c #7E828C", "Y^. c #585A63", "Z^. c #404048", "`^. c #6D6E77", " /. c #C2C5CE", "./. c #E0E2E9", "+/. c #E0DEE5", "@/. c #DDDAE3", "#/. c #E3E2EC", "$/. c #A5A5AE", "%/. c #8B8C94", "&/. c #839399", "*/. c #89949E", "=/. c #6A6972", "-/. c #72747F", ";/. c #626873", ">/. c #545B62", ",/. c #64676F", "'/. c #81868E", ")/. c #97A6AA", "!/. c #80898F", "~/. c #404249", "{/. c #37393F", "]/. c #3B3E44", "^/. c #464E53", "//. c #61686D", "(/. c #7A7D84", "_/. c #81858B", ":/. c #54545B", "(. c #8E98A3", ",(. c #6C6E76", "'(. c #666972", ")(. c #727075", "!(. c #717277", "~(. c #70757B", "{(. c #737479", "](. c #727279", "^(. c #494B54", "/(. c #A7A3AB", "((. c #C2C1CA", "_(. c #97959F", ":(. c #43454F", "<(. c #4A4A4F", "[(. c #5F6064", "}(. c #9EAEB4", "|(. c #A6B9BE", "1(. c #6F6F77", "2(. c #4E515B", "3(. c #B8CDD1", "4(. c #6A757A", "5(. c #575A61", "6(. c #474A51", "7(. c #56555A", "8(. c #4B4750", "9(. c #413B44", "0(. c #454549", "a(. c #7B858A", "b(. c #A8B8C0", "c(. c #A8B8BD", "d(. c #4D5056", "e(. c #C1D3D8", "f(. c #BCCDD1", "g(. c #BCD0D5", "h(. c #BCCCD1", "i(. c #BBCCD0", "j(. c #BACCD0", "k(. c #BCC6D1", "l(. c #B0B9C3", "m(. c #6E7580", "n(. c #68737C", "o(. c #9DA7AE", "p(. c #67757F", "q(. c #5B666E", "r(. c #6F777E", "s(. c #7F8C96", "t(. c #99A7B4", "u(. c #5A616E", "v(. c #555E68", "w(. c #8E9BA2", "x(. c #8C999D", "y(. c #8D999B", "z(. c #8A959A", "A(. c #8C989C", "B(. c #87959A", "C(. c #7D8A8D", "D(. c #7E898C", "E(. c #788287", "F(. c #46484B", "G(. c #3B3A3E", "H(. c #484A51", "I(. c #4E545B", "J(. c #585C63", "K(. c #717179", "L(. c #BCC9D5", "M(. c #7A7E89", "N(. c #888D91", "O(. c #91979B", "P(. c #B2B4B7", "Q(. c #C5BFC1", "R(. c #BBB4C3", "S(. c #1D01B1", "T(. c #1D01B0", "U(. c #868D94", "V(. c #858893", "W(. c #839199", "X(. c #4F5257", "Y(. c #3F3E42", "Z(. c #5A5E66", "`(. c #676870", " _. c #707075", "._. c #6F6B74", "+_. c #72717B", "@_. c #73737D", "#_. c #6F6B75", "$_. c #68686B", "%_. c #6D6971", "&_. c #6E6671", "*_. c #72727B", "=_. c #6B6B78", "-_. c #A9AFBB", ";_. c #65747E", ">_. c #6B7A85", ",_. c #C1C4C8", "'_. c #D9D8DD", ")_. c #DAD7E0", "!_. c #C3CBD8", "~_. c #9299A6", "{_. c #676570", "]_. c #979AA6", "^_. c #9EA5B1", "/_. c #473F4B", "(_. c #4F4F52", "__. c #57585A", ":_. c #5B5C5E", "<_. c #595A62", "[_. c #757983", "}_. c #8D959D", "|_. c #757276", "1_. c #7F7E81", "2_. c #808287", "3_. c #84848E", "4_. c #948D96", "5_. c #747077", "6_. c #373B41", "7_. c #2C2D2F", "8_. c #858F92", "9_. c #B2C7CD", "0_. c #B2CBD5", "a_. c #B3C7D2", "b_. c #B9CFD3", "c_. c #AABCC1", "d_. c #98A3AF", "e_. c #A1ACB2", "f_. c #78828C", "g_. c #758189", "h_. c #AABBC1", "i_. c #939CA4", "j_. c #676C75", "k_. c #343139", "l_. c #43434A", "m_. c #70767C", "n_. c #464B4F", "o_. c #58636A", "p_. c #A3BBC3", "q_. c #B3CACE", "r_. c #A5B0B6", "s_. c #A0ACAF", "t_. c #8D969F", "u_. c #5F6B76", "v_. c #6C7D86", "w_. c #A0A7B2", "x_. c #575E66", "y_. c #5F676D", "z_. c #707A82", "A_. c #919FA7", "B_. c #566570", "C_. c #4D5B67", "D_. c #A5B6BC", "E_. c #767E85", "F_. c #B4BBC5", "G_. c #AABFC2", "H_. c #A9BDC1", "I_. c #6D7274", "J_. c #58595C", "K_. c #585D63", "L_. c #B8C6D1", "M_. c #B5C2CD", "N_. c #B8B5BE", "O_. c #8D7FBB", "P_. c #818690", "Q_. c #656C72", "R_. c #575C65", "S_. c #66696D", "T_. c #707276", "U_. c #6F6E73", "V_. c #706E78", "W_. c #72737D", "X_. c #5A5F64", "Y_. c #575B61", "Z_. c #56515C", "`_. c #5F5B65", " :. c #6F7278", ".:. c #BBCDD1", "+:. c #97A4AD", "@:. c #626C76", "#:. c #6E7782", "$:. c #ACB4C0", "%:. c #9FA4AF", "&:. c #C3C4CC", "*:. c #DEDBE2", "=:. c #B7B5BF", "-:. c #7C7881", ";:. c #534C56", ">:. c #9DA1AB", ",:. c #6B6D76", "':. c #56545E", "):. c #53515A", "!:. c #5B646E", "~:. c #5B676E", "{:. c #879296", "]:. c #929C9F", "^:. c #8F989C", "/:. c #8F9DA2", "(:. c #7A7E84", "_:. c #81888E", "::. c #60626A", "<:. c #454147", "[:. c #2C2D30", "}:. c #464849", "|:. c #798284", "1:. c #A7B7BB", "2:. c #B3C3CF", "3:. c #B6C6D2", "4:. c #9CAAB3", "5:. c #86959D", "6:. c #BBC8D4", "7:. c #9AA7AD", "8:. c #848B8F", "9:. c #6E7179", "0:. c #9AA6AB", "a:. c #737F86", "b:. c #3E4148", "c:. c #3C3E46", "d:. c #696E76", "e:. c #686D70", "f:. c #666D70", "g:. c #656B70", "h:. c #64676E", "i:. c #60646B", "j:. c #60666E", "k:. c #656973", "l:. c #62646C", "m:. c #60646A", "n:. c #5F646C", "o:. c #5C5E66", "p:. c #55525C", "q:. c #7F8A95", "r:. c #57646E", "s:. c #6E7A82", "t:. c #9DABB1", "u:. c #879596", "v:. c #51535F", "w:. c #443D48", "x:. c #8E959E", "y:. c #9299A2", "z:. c #959BA4", "A:. c #BBCCCF", "B:. c #BECFD2", "C:. c #C6D8DC", "D:. c #C3D6DA", "E:. c #848F93", "F:. c #5D6267", "G:. c #484B4E", "H:. c #3D4144", "I:. c #525C64", "J:. c #C0BCBF", "K:. c #3014AC", "L:. c #8A7FBA", "M:. c #8D8D93", "N:. c #81858D", "O:. c #B6C4CE", "P:. c #8F9499", "Q:. c #9FA5AA", "R:. c #90979E", "S:. c #92989D", "T:. c #8B979E", "U:. c #818D92", "V:. c #7C898E", "W:. c #5F626B", "X:. c #666C76", "Y:. c #98A1AB", "Z:. c #ACB1B9", "`:. c #CECDD6", " <. c #E2DFE9", ".<. c #DEDAE4", "+<. c #A49DA5", "@<. c #625962", "#<. c #48404B", "$<. c #979CA6", "%<. c #6F737B", "&<. c #B9CED5", "*<. c #565960", "=<. c #77838E", "-<. c #6E7E88", ";<. c #A9BFC6", "><. c #BBCED2", ",<. c #4E4F56", "'<. c #7B8589", ")<. c #A1B2B7", "!<. c #B4C3C6", "~<. c #B1C1CC", "{<. c #848F97", "]<. c #818B93", "^<. c #A4B0B9", "/<. c #B5C9D2", "(<. c #B7CCD0", "_<. c #B8CACD", ":<. c #A7B9C0", "<<. c #7F8D95", "[<. c #42434A", "}<. c #50525B", "|<. c #54565A", "1<. c #54555A", "2<. c #53545A", "3<. c #484852", "4<. c #575A63", "5<. c #565961", "6<. c #4B4550", "7<. c #73747D", "8<. c #929DA3", "9<. c #69737B", "0<. c #596771", "a<. c #717C86", "b<. c #879097", "c<. c #6E7784", "d<. c #5D5C66", "e<. c #696C73", "f<. c #4A454F", "g<. c #433B47", "h<. c #6C6F78", "i<. c #7D828B", "j<. c #6E6F78", "k<. c #65646D", "l<. c #61626B", "m<. c #626069", "n<. c #656D74", "o<. c #889397", "p<. c #8C969A", "q<. c #95A1A5", "r<. c #6C757C", "s<. c #484B53", "t<. c #403E46", "u<. c #474548", "v<. c #50565A", "w<. c #616F79", "x<. c #8E99A5", "y<. c #B0BCBF", "z<. c #B1BCBA", "A<. c #BABCBC", "B<. c #888B8E", "C<. c #808389", "D<. c #A5B2BD", "E<. c #828E96", "F<. c #B2C4CD", "G<. c #B3C0CA", "H<. c #A2AFB5", "I<. c #64717F", "J<. c #616D7E", "K<. c #A8B4C1", "L<. c #676B75", "M<. c #989AA2", "N<. c #C7C8CC", "O<. c #D9D7DE", "P<. c #DFDCE6", "Q<. c #8E8C95", "R<. c #514D56", "S<. c #828891", "T<. c #767F86", "U<. c #ACBBC6", "V<. c #BCCED6", "W<. c #54565E", "X<. c #676B74", "Y<. c #757F8A", "Z<. c #A7BFC7", "`<. c #B9D0D6", " [. c #9398A0", ".[. c #80878F", "+[. c #A8BCC4", "@[. c #B1C8CF", "#[. c #B8C7CB", "$[. c #AABCC5", "%[. c #62707B", "&[. c #566169", "*[. c #747C82", "=[. c #B9CCD0", "-[. c #7B808A", ";[. c #B0C4CC", ">[. c #737E83", ",[. c #697277", "'[. c #87939A", ")[. c #7B7F89", "![. c #87949B", "~[. c #83898E", "{[. c #63676C", "][. c #656E75", "^[. c #636A74", "/[. c #585A64", "([. c #777C81", "_[. c #848B9A", ":[. c #717492", "<[. c #686E81", "[[. c #696C70", "}[. c #514D55", "|[. c #817D86", "1[. c #7D797F", "2[. c #3D3C41", "3[. c #484C53", "4[. c #474950", "5[. c #4D4F56", "6[. c #55575F", "7[. c #38363F", "8[. c #6E7275", "9[. c #8F9B9F", "0[. c #B6C2BD", "a[. c #B5C0B7", "b[. c #B5B8B7", "c[. c #70757C", "d[. c #A5B1B7", "e[. c #BCCCD4", "f[. c #BACAD4", "g[. c #BACAD5", "h[. c #6A737F", "i[. c #646C7A", "j[. c #A8B4BD", "k[. c #A19DA4", "l[. c #CAC9CC", "m[. c #CDC6D2", "n[. c #C2BBCC", "o[. c #B0B3BF", "p[. c #4C4F58", "q[. c #403F4B", "r[. c #636970", "s[. c #656D73", "t[. c #949CA6", "u[. c #AABAC3", "v[. c #7A8C89", "w[. c #839893", "x[. c #B2CED5", "y[. c #B2D0D9", "z[. c #B8D4DC", "A[. c #A3BEC7", "B[. c #8898A2", "C[. c #A3A6AD", "D[. c #828F99", "E[. c #5C686F", "F[. c #747D81", "G[. c #7D858C", "H[. c #778187", "I[. c #848C93", "J[. c #A8B7C1", "K[. c #9AA4AF", "L[. c #636872", "M[. c #697076", "N[. c #686E76", "O[. c #808690", "P[. c #878896", "Q[. c #747884", "R[. c #58555D", "S[. c #525159", "T[. c #686E77", "U[. c #8A91A4", "V[. c #9CA5B8", "W[. c #9FAAB4", "X[. c #A3ACB3", "Y[. c #6B737A", "Z[. c #5E626A", "`[. c #70747B", " }. c #6B7378", ".}. c #848E93", "+}. c #6C747B", "@}. c #61676F", "#}. c #95A1A6", "$}. c #909FA6", "%}. c #B0C1C2", "&}. c #B1BBBB", "*}. c #C1C0C2", "=}. c #BBBFC0", "-}. c #BABCBD", ";}. c #A1B1B7", ">}. c #96A2A9", ",}. c #A1ADB3", "'}. c #747F85", ")}. c #525056", "!}. c #736F75", "~}. c #88818D", "{}. c #807887", "]}. c #6B7379", "^}. c #393641", "/}. c #555C62", "(}. c #64646E", "_}. c #AFC0CB", ":}. c #B4C0CC", "<}. c #9EA1A9", "[}. c #5E6369", "}}. c #677279", "|}. c #8A959D", "1}. c #6F847E", "2}. c #789088", "3}. c #ACBFC2", "4}. c #B8C7CA", "5}. c #B5BCC2", "6}. c #B6B4BC", "7}. c #BAB3BB", "8}. c #BDBBC2", "9}. c #ACA7AE", "0}. c #92858E", "a}. c #999399", "b}. c #95979F", "c}. c #7D858F", "d}. c #788187", "e}. c #A9B9BF", "f}. c #A5B0BB", "g}. c #858C98", "h}. c #4D4C58", "i}. c #97A1AA", "j}. c #687177", "k}. c #707C81", "l}. c #C0D3DA", "m}. c #5C636C", "n}. c #93979C", "o}. c #878C93", "p}. c #514D59", "q}. c #4A4851", "r}. c #A0ADC0", "s}. c #B5C4D6", "t}. c #B9CFD6", "u}. c #BCCCD0", "v}. c #B7C5CA", "w}. c #ACBFC6", "x}. c #BABBBD", "y}. c #C2BEC0", "z}. c #C0BFC4", "A}. c #BEC3C5", "B}. c #BCBDBB", "C}. c #BCBFBB", "D}. c #ACB5B6", "E}. c #768186", "F}. c #828E92", "G}. c #4A4E53", "H}. c #333436", "I}. c #323538", "J}. c #353C40", "K}. c #393F43", "L}. c #3C363F", "M}. c #686A70", "N}. c #4B4C56", "O}. c #413F4B", "P}. c #484A54", "Q}. c #575E65", "R}. c #717D86", "S}. c #9EAFBA", "T}. c #626C74", "U}. c #6D7F89", "V}. c #BDCAD0", "W}. c #727E81", "X}. c #7A8788", "Y}. c #B5CACE", "Z}. c #C39597", "`}. c #CA7579", " |. c #CB7579", ".|. c #CC7C80", "+|. c #C67174", "@|. c #AD5B5D", "#|. c #724E55", "$|. c #4C4953", "%|. c #453C47", "&|. c #595560", "*|. c #5A6068", "=|. c #6F7C81", "-|. c #A7BCC1", ";|. c #BBCFD5", ">|. c #52595F", ",|. c #6C757D", "'|. c #939EAA", ")|. c #818B94", "!|. c #53535D", "~|. c #757781", "{|. c #A1ADB8", "]|. c #B8CCCF", "^|. c #AEC1C9", "/|. c #B8BBBC", "(|. c #C2BCC2", "_|. c #C3BBC7", ":|. c #C1BBC6", "<|. c #B9B7BD", "[|. c #B5BAB8", "}|. c #B7C3B8", "||. c #BBC1BB", "1|. c #B8B9BA", "2|. c #A1A5A7", "3|. c #767577", "4|. c #7E7F83", "5|. c #A5AEB6", "6|. c #96A2AB", "7|. c #93A1A7", "8|. c #A7BAC0", "9|. c #859498", "0|. c #80858E", "a|. c #5D636A", "b|. c #717C81", "c|. c #414046", "d|. c #454446", "e|. c #666B70", "f|. c #778085", "g|. c #727679", "h|. c #636163", "i|. c #4A464B", "j|. c #373640", "k|. c #5B5E65", "l|. c #4A5363", "m|. c #565867", "n|. c #65666F", "o|. c #8D9DA2", "p|. c #8B9BA1", "q|. c #6F7A80", "r|. c #8F979C", "s|. c #68727B", "t|. c #AABBC3", "u|. c #84929A", "v|. c #7C878F", "w|. c #798388", "x|. c #B4CED3", "y|. c #D07479", "z|. c #E23438", "A|. c #E62526", "B|. c #E92628", "C|. c #EC2122", "D|. c #DE1E1E", "E|. c #9B3234", "F|. c #71575C", "G|. c #7A8188", "H|. c #B4C2CC", "I|. c #B1C8CE", "J|. c #B4CDD4", "K|. c #7D848E", "L|. c #554F5B", "M|. c #585561", "N|. c #494A53", "O|. c #646B72", "P|. c #95A5AE", "Q|. c #ADB9BD", "R|. c #959A9E", "S|. c #4A4A4E", "T|. c #666E73", "U|. c #9CB1BC", "V|. c #A2B7C0", "W|. c #7D8A90", "X|. c #413F4A", "Y|. c #453F4A", "Z|. c #818B92", "`|. c #B1B4C2", " 1. c #B0B1C5", ".1. c #B2B0C5", "+1. c #ACADC2", "@1. c #AEB3BD", "#1. c #BABFBA", "$1. c #8D81BA", "%1. c #C5C5C0", "&1. c #C2C1C2", "*1. c #B3B4B6", "=1. c #757376", "-1. c #83838A", ";1. c #BDC7D5", ">1. c #8C929C", ",1. c #869498", "'1. c #6B7377", ")1. c #6D7077", "!1. c #737A81", "~1. c #46464C", "{1. c #55575B", "]1. c #B9C4CA", "^1. c #5D5A61", "/1. c #66727B", "(1. c #596677", "_1. c #717885", ":1. c #757D84", "<1. c #A1B4BA", "[1. c #A1B5B9", "}1. c #737E81", "|1. c #7A8389", "11. c #808891", "21. c #636C75", "31. c #818F97", "41. c #84919A", "51. c #7E888C", "61. c #A5B5B9", "71. c #B2CFD2", "81. c #B7C8C8", "91. c #D5686C", "01. c #EC171B", "a1. c #F60101", "b1. c #FA0000", "c1. c #FD0000", "d1. c #F50303", "e1. c #CA3E3F", "f1. c #AD8689", "g1. c #A6B7BD", "h1. c #B2C8D0", "i1. c #B6CCD3", "j1. c #869197", "k1. c #AEB9C3", "l1. c #969FA7", "m1. c #838A93", "n1. c #707580", "o1. c #83838B", "p1. c #747176", "q1. c #57545D", "r1. c #535056", "s1. c #798185", "t1. c #ABBFC7", "u1. c #50555C", "v1. c #403C46", "w1. c #3F3842", "x1. c #95A3A9", "y1. c #B0B9C0", "z1. c #C3C2BB", "A1. c #B3B4C0", "B1. c #9196CA", "C1. c #747AD2", "D1. c #696DD6", "E1. c #696CD5", "F1. c #6568D7", "G1. c #8183D0", "H1. c #B3B4C2", "I1. c #C2BFBC", "J1. c #442EAE", "K1. c #C7C5BF", "L1. c #C6C5BA", "M1. c #C0C1BB", "N1. c #B0B0B4", "O1. c #75747B", "P1. c #BCC7D5", "Q1. c #B2C6CD", "R1. c #B2C7CB", "S1. c #6E787C", "T1. c #5D656B", "U1. c #60646E", "V1. c #93A1A8", "W1. c #6D767C", "X1. c #484D52", "Y1. c #575E63", "Z1. c #C0D0D7", "`1. c #BAC2CC", " 2. c #454550", ".2. c #78828B", "+2. c #77858E", "@2. c #727E87", "#2. c #A0B1B9", "$2. c #737F83", "%2. c #586069", "&2. c #7F8991", "*2. c #7D888C", "=2. c #A3B8BC", "-2. c #B1C7CD", ";2. c #AFCDCC", ">2. c #B7C6BC", ",2. c #D46766", "'2. c #EB191E", ")2. c #F50204", "!2. c #FA0001", "~2. c #F00606", "{2. c #D85456", "]2. c #C3A0A6", "^2. c #A7B8BD", "/2. c #8D999D", "(2. c #A5B2B6", "_2. c #B7C7D2", ":2. c #B1C7D0", "<2. c #89959B", "[2. c #A7B8C1", "}2. c #72767D", "|2. c #47424C", "12. c #4B444E", "22. c #463E49", "32. c #706D77", "42. c #9DA3AC", "52. c #989EA9", "62. c #423C46", "72. c #423C47", "82. c #545960", "92. c #BBCACF", "02. c #808E96", "a2. c #B6C5D1", "b2. c #AAABC2", "c2. c #6A70D3", "d2. c #282CE6", "e2. c #1213EF", "f2. c #1314EF", "g2. c #0F0FF2", "h2. c #4142E5", "i2. c #A3A7CB", "j2. c #BFC5C1", "k2. c #452EAE", "l2. c #C5C5C1", "m2. c #C4C4C0", "n2. c #84858C", "o2. c #8C98A3", "p2. c #B0BECA", "q2. c #B8C8D3", "r2. c #94A1AB", "s2. c #56646D", "t2. c #414651", "u2. c #62656F", "v2. c #98A4AA", "w2. c #51585E", "x2. c #61676B", "y2. c #BFCED9", "z2. c #43444D", "A2. c #767783", "B2. c #9299A3", "C2. c #9AAAB2", "D2. c #7B878C", "E2. c #A1ACB5", "F2. c #707A81", "G2. c #6B737B", "H2. c #606871", "I2. c #656D76", "J2. c #89949C", "K2. c #849299", "L2. c #B1C1C4", "M2. c #768084", "N2. c #717C82", "O2. c #B2CDCD", "P2. c #BBC2BA", "Q2. c #D86060", "R2. c #EB1216", "S2. c #F10000", "T2. c #F80000", "U2. c #F90000", "V2. c #EF0000", "W2. c #DB5255", "X2. c #C5A3A8", "Y2. c #A6B1B2", "Z2. c #BCC7CA", "`2. c #BCC6CD", " 3. c #BEC6CB", ".3. c #BEC5CA", "+3. c #BEC6CC", "@3. c #A6C8D1", "#3. c #A3C8D1", "$3. c #A3C8D2", "%3. c #A1C9D3", "&3. c #A4C8D2", "*3. c #A7CBD5", "=3. c #A4C8D1", "-3. c #8196A1", ";3. c #A9ABB1", ">3. c #BDC2C6", ",3. c #BCC7CC", "'3. c #AAB6C1", ")3. c #97A3AD", "!3. c #929CA6", "~3. c #61666F", "{3. c #37333E", "]3. c #403B47", "^3. c #5A5661", "/3. c #413F48", "(3. c #575862", "_3. c #94A0A6", ":3. c #AEBAC0", "<3. c #C9C8BA", "[3. c #A2A3C5", "}3. c #4F55DB", "|3. c #0E11ED", "13. c #0000F5", "23. c #0000F8", "33. c #3132E9", "43. c #9FA5CD", "53. c #B6B8BF", "63. c #462EAF", "73. c #1A00AC", "83. c #7F7F87", "93. c #7C8288", "03. c #96A3AD", "a3. c #66737E", "b3. c #606973", "c3. c #7D878C", "d3. c #52545A", "e3. c #524F56", "f3. c #8A939E", "g3. c #37353E", "h3. c #838792", "i3. c #A8B9C2", "j3. c #A7AEBA", "k3. c #69747D", "l3. c #909BA1", "m3. c #79878E", "n3. c #717B81", "o3. c #B2CBCF", "p3. c #B8C2C3", "q3. c #D1777B", "r3. c #E2393E", "s3. c #E42729", "t3. c #E82628", "u3. c #EA2425", "v3. c #E4292A", "w3. c #D46C6E", "x3. c #C2AAAF", "y3. c #8D9597", "z3. c #BCC7C9", "A3. c #ACC9CF", "B3. c #A5CBD1", "C3. c #9CCED3", "D3. c #9ACFD6", "E3. c #90D1DB", "F3. c #7ED2E0", "G3. c #7AD2E1", "H3. c #7BD2E0", "I3. c #7CD2E0", "J3. c #7DD5E3", "K3. c #7BD3E0", "L3. c #6BB2BF", "M3. c #6FA6B1", "N3. c #89B9C1", "O3. c #9FC7CE", "P3. c #ADC9D0", "Q3. c #B1BECA", "R3. c #A4AFBB", "S3. c #585C65", "T3. c #B0BDC0", "U3. c #848A90", "V3. c #6B6E76", "W3. c #919AA4", "X3. c #868B95", "Y3. c #9FA7AF", "Z3. c #96A2AC", "`3. c #B2BEC9", " 4. c #B7BBBD", ".4. c #C8C8BB", "+4. c #A2A4C4", "@4. c #5158D9", "#4. c #1317EC", "$4. c #0000F3", "%4. c #0401F3", "&4. c #0000F7", "*4. c #3335E9", "=4. c #A1A6CC", "-4. c #B9B5BC", ";4. c #472EB2", ">4. c #C7C2C5", ",4. c #A9A9AE", "'4. c #7D7D83", ")4. c #828287", "!4. c #9EA5A8", "~4. c #889093", "{4. c #555259", "]4. c #3B323D", "^4. c #444551", "/4. c #3F4048", "(4. c #38383F", "_4. c #333038", ":4. c #403E47", "<4. c #8F99A0", "[4. c #ABBAC3", "}4. c #969AA4", "|4. c #A5ABB7", "14. c #828E95", "24. c #ADC8CE", "34. c #C2A7AE", "44. c #CF8990", "54. c #CF8085", "64. c #CF8084", "74. c #CF7D82", "84. c #CE7F84", "94. c #C6A2A3", "04. c #A4ACB0", "a4. c #B0CAD0", "b4. c #9ACDD8", "c4. c #83CFDB", "d4. c #6FD7E1", "e4. c #5CDEE6", "f4. c #59E0E7", "g4. c #56E0EB", "h4. c #4EE2F2", "i4. c #4DE2F3", "j4. c #4EE2F3", "k4. c #50DCE8", "l4. c #52DAE2", "m4. c #57DCE4", "n4. c #67D8E1", "o4. c #86D0DB", "p4. c #AACAD3", "q4. c #A3AEBA", "r4. c #B8C6CA", "s4. c #96A1AA", "t4. c #AEBCC7", "u4. c #B1B5B9", "v4. c #C5C8BD", "w4. c #A7A9C3", "x4. c #6167D5", "y4. c #1A1EEA", "z4. c #0000F6", "A4. c #3133E8", "B4. c #A0A6CC", "C4. c #1C00B4", "D4. c #3217AE", "E4. c #C7C4C2", "F4. c #C5C6C5", "G4. c #7E8289", "H4. c #B2C7CA", "I4. c #B8C5CB", "J4. c #BDCCCF", "K4. c #A8AFB7", "L4. c #888A94", "M4. c #646974", "N4. c #6A6D75", "O4. c #6A686D", "P4. c #AABCC4", "Q4. c #8C9AA3", "R4. c #848C9D", "S4. c #ACB8CA", "T4. c #798084", "U4. c #74797D", "V4. c #B4C6D2", "W4. c #BBC1CA", "X4. c #BFBBC2", "Y4. c #BEB7C0", "Z4. c #BEB6C0", "`4. c #BFB6C0", " 5. c #BFB7C1", ".5. c #BBBFC6", "+5. c #B7C6CA", "@5. c #BECCCD", "#5. c #839DAE", "$5. c #87B7C4", "%5. c #83D4DE", "&5. c #65DCEB", "*5. c #56DEEF", "=5. c #4EE1F0", "-5. c #46E4F2", ";5. c #43DFEB", ">5. c #43DEEB", ",5. c #44E3F4", "'5. c #44E5F7", ")5. c #44E4F7", "!5. c #44E4F6", "~5. c #43E4F7", "{5. c #46E7F5", "]5. c #47E7F5", "^5. c #45E6F5", "/5. c #4FE1EB", "(5. c #5DDDE7", "_5. c #6ADBE8", ":5. c #7DD4DF", "<5. c #99CBD4", "[5. c #C2C9D0", "}5. c #BEC9D1", "|5. c #91A7AE", "15. c #A3BBC4", "25. c #B4C9D1", "35. c #BCCBD1", "45. c #87919C", "55. c #A3AFBC", "65. c #B8C7D3", "75. c #B4C4D0", "85. c #B3C5CF", "95. c #96A0AB", "05. c #B3C8D2", "a5. c #AEB6BB", "b5. c #B9BBBB", "c5. c #C0BABB", "d5. c #C1B8BB", "e5. c #C7C8C0", "f5. c #A2A4C6", "g5. c #5358DA", "h5. c #1418F0", "i5. c #0101EE", "j5. c #0000F4", "k5. c #3033E7", "l5. c #9BA2C8", "m5. c #BEC2BF", "n5. c #BFBCC3", "o5. c #C0BBC1", "p5. c #C3C1BB", "q5. c #B9B5BB", "r5. c #1A02AD", "s5. c #1901B6", "t5. c #1A00B6", "u5. c #2F18AF", "v5. c #C5C7C3", "w5. c #C0C7BF", "x5. c #BCC0BD", "y5. c #ACAEAE", "z5. c #82848B", "A5. c #757E88", "B5. c #8C9DA6", "C5. c #B9D1D8", "D5. c #B6CFD8", "E5. c #B4CFD6", "F5. c #B6D0D5", "G5. c #B7CED3", "H5. c #B5CCD2", "I5. c #B0CFD6", "J5. c #B1CFD7", "K5. c #B6CED4", "L5. c #BACDD3", "M5. c #BBCCD1", "N5. c #BACDD1", "O5. c #B6CDD3", "P5. c #B3C5D0", "Q5. c #96A1AD", "R5. c #A9C1C6", "S5. c #B4CDD2", "T5. c #B4CFD5", "U5. c #B4D0D8", "V5. c #B5D0D6", "W5. c #B6CFD4", "X5. c #B7CFD4", "Y5. c #BACED8", "Z5. c #AFC3CF", "`5. c #9DB3BD", " 6. c #9BAFB6", ".6. c #A1B0B5", "+6. c #A1ACAF", "@6. c #89969C", "#6. c #A5B8BE", "$6. c #A8BBC2", "%6. c #9198A1", "&6. c #A4AEB9", "*6. c #8E939C", "=6. c #9FA9BB", "-6. c #B7C6D9", ";6. c #7A8890", ">6. c #B2C5CF", ",6. c #B3C8CC", "'6. c #737A7F", ")6. c #BCCBCF", "!6. c #B7C9D4", "~6. c #B6C9D6", "{6. c #B5CAD4", "]6. c #B4C9D3", "^6. c #9FC3D3", "/6. c #71BCD2", "(6. c #64CCDD", "_6. c #59DEEC", ":6. c #46E5F6", "<6. c #44E5F5", "[6. c #46E5F4", "}6. c #45E5F7", "|6. c #41E1F2", "16. c #3FE2F5", "26. c #41EAFB", "36. c #43ECFB", "46. c #44EBFB", "56. c #42EDFB", "66. c #42ECFB", "76. c #43ECFA", "86. c #44EBFA", "96. c #44EAFB", "06. c #45E7F8", "a6. c #48E4F4", "b6. c #4CE4EE", "c6. c #47E4F0", "d6. c #42E5F6", "e6. c #51DFEF", "f6. c #6FD6E3", "g6. c #92D0D9", "h6. c #AFCDD6", "i6. c #AEC4CC", "j6. c #B3C8D1", "k6. c #9AADB6", "l6. c #8FADB2", "m6. c #A1C4CA", "n6. c #B1D2DA", "o6. c #B3D0D8", "p6. c #B4CED6", "q6. c #B3CBD4", "r6. c #8E949D", "s6. c #7B8C8F", "t6. c #B6CACD", "u6. c #B7CBCE", "v6. c #B8CED1", "w6. c #B9D0CE", "x6. c #BACFCC", "y6. c #B9CCCA", "z6. c #B8C9CA", "A6. c #9AA6B0", "B6. c #B4CAD1", "C6. c #B9CCCD", "D6. c #BBCECC", "E6. c #BBCFCD", "F6. c #BBCECD", "G6. c #B5C8C8", "H6. c #B7C9CB", "I6. c #B5C5D2", "J6. c #B3C6D0", "K6. c #B9BCBD", "L6. c #BFBABB", "M6. c #C2B7B9", "N6. c #CCC9BD", "O6. c #A4A5C5", "P6. c #5157DA", "Q6. c #1216F3", "R6. c #0201EE", "S6. c #99A3CC", "T6. c #C2BCC4", "U6. c #C4BCC4", "V6. c #C2BEBE", "W6. c #C6C5C0", "X6. c #BAB8BF", "Y6. c #1704A6", "Z6. c #1704A7", "`6. c #1801B5", " 7. c #1B00B4", ".7. c #3218AB", "+7. c #8F80BB", "@7. c #BECABB", "#7. c #BCC1BA", "$7. c #898B8F", "%7. c #888E95", "&7. c #B2BBBE", "*7. c #C7CBD0", "=7. c #C5C9D3", "-7. c #C0C8D1", ";7. c #C1BEC8", ">7. c #C2C0C6", ",7. c #BFC5CA", "'7. c #B1CAD1", ")7. c #C0C5C9", "!7. c #BDC7CA", "~7. c #B2C9D0", "{7. c #8B97A0", "]7. c #B8C4C5", "^7. c #A3B9C0", "/7. c #A7BEC8", "(7. c #718088", "_7. c #6B7C85", ":7. c #BDC9CB", "<7. c #BAC5C7", "[7. c #B9C6CB", "}7. c #B2C8CE", "|7. c #AFC6CC", "17. c #B1C9D0", "27. c #A4C9DE", "37. c #80D0E9", "47. c #58DCE9", "57. c #4AE2EF", "67. c #47E4F6", "77. c #44E6F7", "87. c #4AE4F0", "97. c #4BE4EF", "07. c #47E5F5", "a7. c #45E3F5", "b7. c #46E4F5", "c7. c #4EE3EC", "d7. c #4DE3EC", "e7. c #4DE3EB", "f7. c #48E4F3", "g7. c #48E5F3", "h7. c #4AE4F2", "i7. c #45E5F6", "j7. c #43E5F7", "k7. c #46E4F6", "l7. c #4BE3F2", "m7. c #57E0E9", "n7. c #7DD4DE", "o7. c #A0CBD5", "p7. c #A9B5B7", "q7. c #9A9FA6", "r7. c #ACC3CC", "s7. c #B5C6D1", "t7. c #A9B7C0", "u7. c #97A5A9", "v7. c #ABBCBF", "w7. c #B5C5D1", "x7. c #8C9AA2", "y7. c #B8C4D1", "z7. c #BFCAD6", "A7. c #728B81", "B7. c #A0AAA6", "C7. c #C2C9CE", "D7. c #AEC9D2", "E7. c #AFC9D2", "F7. c #AECAD3", "G7. c #B0CAD1", "H7. c #B3C4C7", "I7. c #B1BED3", "J7. c #AFBED0", "K7. c #B0C8D1", "L7. c #B1C7D3", "M7. c #AFBBC6", "N7. c #B8BDBE", "O7. c #CAC6BA", "P7. c #A9AAC2", "Q7. c #6167D6", "R7. c #191DF0", "S7. c #0000FA", "T7. c #0301F3", "U7. c #3134EB", "V7. c #99A4D4", "W7. c #C2C1C8", "X7. c #C3BBC2", "Y7. c #C1BDBD", "Z7. c #C2BBC3", "`7. c #BFBCC1", " 8. c #C8C9C7", ".8. c #BBBBC3", "+8. c #1A03AA", "@8. c #1A02AC", "#8. c #1401B7", "$8. c #480D91", "%8. c #9C70A4", "&8. c #C9B4B4", "*8. c #C5B6B1", "=8. c #C0B7B6", "-8. c #C1BBBB", ";8. c #AFBCBA", ">8. c #8A9D9B", ",8. c #877475", "'8. c #9F6B6F", ")8. c #BF7C7F", "!8. c #D5747A", "~8. c #DB696F", "{8. c #D66870", "]8. c #CA6B7B", "^8. c #C4798E", "/8. c #C594A7", "(8. c #C4B8BF", "_8. c #BFCCD0", ":8. c #B8CDD6", "<8. c #B4C8D2", "[8. c #B3CFD6", "}8. c #B8CED6", "|8. c #BFBEC6", "18. c #BFA8AC", "28. c #BF9397", "38. c #C38489", "48. c #CA737A", "58. c #D3686F", "68. c #D8686D", "78. c #CF757A", "88. c #C4858A", "98. c #BE999E", "08. c #BABFC1", "a8. c #B9D2D4", "b8. c #8E989C", "c8. c #A5B1B6", "d8. c #BAD3DA", "e8. c #91A4A5", "f8. c #908B91", "g8. c #B898A6", "h8. c #C89697", "i8. c #C48C88", "j8. c #C18387", "k8. c #CC7379", "l8. c #D4696E", "m8. c #D36A70", "n8. c #D56971", "o8. c #D66A72", "p8. c #CC767C", "q8. c #C4878A", "r8. c #C1999D", "s8. c #C4B0B7", "t8. c #B1D4D9", "u8. c #B4D5D9", "v8. c #A5BABF", "w8. c #A0B1B7", "x8. c #9EADB4", "y8. c #B6C8D4", "z8. c #B2C2CE", "A8. c #958991", "B8. c #8B7B7F", "C8. c #9EA1A5", "D8. c #B8B0B5", "E8. c #BEB6BB", "F8. c #B7C1C6", "G8. c #B5CCD0", "H8. c #B9D5D8", "I8. c #BBD2D6", "J8. c #BDC6CA", "K8. c #BDBDC4", "L8. c #C2BCC5", "M8. c #BCB8C0", "N8. c #78858C", "O8. c #6D878C", "P8. c #A5BDC3", "Q8. c #BCCBCE", "R8. c #C0BAC3", "S8. c #BEBAC1", "T8. c #BDB9C0", "U8. c #AFC9D0", "V8. c #91CDD6", "W8. c #70D6EA", "X8. c #57DFF5", "Y8. c #4AE6F4", "Z8. c #45E4F7", "`8. c #46E6F7", " 9. c #46ECF7", ".9. c #49F2FB", "+9. c #53EEFB", "@9. c #62D2D9", "#9. c #73AFB2", "$9. c #809298", "%9. c #828F93", "&9. c #8B878A", "*9. c #98767D", "=9. c #9C7486", "-9. c #967C8B", ";9. c #878C92", ">9. c #65A7B8", ",9. c #4BCEE2", "'9. c #41F1FB", ")9. c #3FF3FF", "!9. c #43EAFF", "~9. c #47E6F8", "{9. c #47E5F7", "]9. c #44E5F6", "^9. c #45E5F3", "/9. c #53E0EA", "(9. c #76D5DE", "_9. c #9DCAD4", ":9. c #9DA2A7", "<9. c #B8AFB6", "[9. c #C0B8C0", "}9. c #BFBAC1", "|9. c #BDBAC1", "19. c #BAC3C6", "29. c #B6C8C9", "39. c #AECDD5", "49. c #B1D0DA", "59. c #B7C1AD", "69. c #B39B8A", "79. c #B56976", "89. c #C86370", "99. c #D46A6E", "09. c #D4696F", "a9. c #D6666F", "b9. c #D17175", "c9. c #C88986", "d9. c #C2AAAD", "e9. c #BDC5CC", "f9. c #B1CDD3", "g9. c #8DA3AB", "h9. c #8B9AA3", "i9. c #AEC8CE", "j9. c #A7CBCD", "k9. c #A8C8CD", "l9. c #ABBBCA", "m9. c #AFB6CB", "n9. c #BCCADA", "o9. c #9EB3B1", "p9. c #739075", "q9. c #AABB9F", "r9. c #BCD8CE", "s9. c #8DC5D1", "t9. c #7FA2D2", "u9. c #7C89D5", "v9. c #6E7BD9", "w9. c #636FDA", "x9. c #626EDA", "y9. c #6C77D8", "z9. c #7682D1", "A9. c #8B96CC", "B9. c #A7B1CA", "C9. c #BECFD0", "D9. c #A3B4BA", "E9. c #B8C1CA", "F9. c #C5BCC6", "G9. c #C3C6CD", "H9. c #BCC9CE", "I9. c #AFB8C9", "J9. c #9199CE", "K9. c #7A84D4", "L9. c #707AD6", "M9. c #6670D8", "N9. c #6169DA", "O9. c #626AD8", "P9. c #6972D8", "Q9. c #727DD7", "R9. c #7F8ED4", "S9. c #9BA5CC", "T9. c #B2BCCA", "U9. c #B8CFD0", "V9. c #B3B9BD", "W9. c #BEBDBB", "X9. c #BCBEBD", "Y9. c #B6BBC0", "Z9. c #BABDC0", "`9. c #9B9EC7", " 0. c #595FD8", ".0. c #171CF0", "+0. c #0000FC", "@0. c #3032E3", "#0. c #959DCE", "$0. c #B5B7C6", "%0. c #B1B1C4", "&0. c #B1B2C1", "*0. c #BAB4C1", "=0. c #BBB2C2", "-0. c #B1B2C2", ";0. c #B3B8C0", ">0. c #B5B9C1", ",0. c #B3B6C5", "'0. c #C0C2BE", ")0. c #BABABA", "!0. c #1A00B5", "~0. c #1C00B3", "{0. c #2402AA", "]0. c #4A0087", "^0. c #85055B", "/0. c #BD4663", "(0. c #D76D6D", "_0. c #D86E6F", ":0. c #CC9196", "<0. c #C2B6B9", "[0. c #BEC4C3", "}0. c #C2BDBD", "|0. c #B9A19F", "10. c #AA7774", "20. c #B44D4D", "30. c #C8393B", "40. c #D93438", "50. c #E72428", "60. c #EE1A1C", "70. c #EB1B1F", "80. c #DD1A28", "90. c #D62C3E", "00. c #D6505F", "a0. c #D2767C", "b0. c #C8979A", "c0. c #BDB0B7", "d0. c #B7BFC5", "e0. c #B7B0BA", "f0. c #C397A3", "g0. c #D3787F", "h0. c #D95D60", "i0. c #D9484B", "j0. c #DB373A", "k0. c #E72327", "l0. c #EE181C", "m0. c #EB1B1E", "n0. c #E0292E", "o0. c #DB393D", "p0. c #D94C4F", "q0. c #D07776", "r0. c #C6A1A2", "s0. c #BDBBC1", "t0. c #A4B8BE", "u0. c #879AA3", "v0. c #BCCBD0", "w0. c #C3BCC3", "x0. c #CB9DA0", "y0. c #AE6C6D", "z0. c #AD5459", "A0. c #CF535F", "B0. c #DF4B49", "C0. c #DF4038", "D0. c #DC3537", "E0. c #E72429", "F0. c #ED1A1D", "G0. c #EC1B1F", "H0. c #ED1B1F", "I0. c #ED191D", "J0. c #E02A2F", "K0. c #D83C3F", "L0. c #D74D4F", "M0. c #D7646A", "N0. c #CD8086", "O0. c #BD9CA2", "P0. c #8A9BA3", "Q0. c #A0B1B6", "R0. c #B7CCD4", "S0. c #BAB6C1", "T0. c #B86C71", "U0. c #B84C4D", "V0. c #BE6466", "W0. c #D0676A", "X0. c #D07679", "Y0. c #BD9B9F", "Z0. c #B7C9D5", "`0. c #B6CBD4", " a. c #B9BEC2", ".a. c #BCACAE", "+a. c #C6A0A1", "@a. c #CF9193", "#a. c #D28083", "$a. c #D5767B", "%a. c #DB747B", "&a. c #D7737A", "*a. c #A6575C", "=a. c #977174", "-a. c #B6CCD1", ";a. c #BDAFB2", ">a. c #CC8E91", ",a. c #D5777D", "'a. c #D67379", ")a. c #D77178", "!a. c #D4787F", "~a. c #C3A7AC", "{a. c #94CDD7", "]a. c #68D8E4", "^a. c #4BE2F1", "/a. c #43E6F7", "(a. c #42E9F9", "_a. c #42E6F6", ":a. c #52D1DA", "b. c #6E72D6", ",b. c #4F53DB", "'b. c #373CE0", ")b. c #292EE4", "!b. c #1E20E7", "~b. c #191AE7", "{b. c #191BE9", "]b. c #2123E9", "^b. c #2B30E5", "/b. c #3C41DF", "(b. c #5B5DD7", "_b. c #7376D5", ":b. c #848CD6", "c. c #ED0F12", ",c. c #F50D0C", "'c. c #F70A08", ")c. c #F60808", "!c. c #F80404", "~c. c #F80204", "{c. c #F70204", "]c. c #F80203", "^c. c #F2070A", "/c. c #F00A0C", "(c. c #F00E0E", "_c. c #EB1214", ":c. c #E61D1E", "d. c #EB130F", ",d. c #F50609", "'d. c #F90105", ")d. c #F90103", "!d. c #F90102", "~d. c #F90002", "{d. c #F70403", "]d. c #F20B08", "^d. c #ED1110", "/d. c #E3282B", "(d. c #CF5357", "_d. c #9E6869", ":d. c #92898A", "e. c #1C01B9", ",e. c #37039D", "'e. c #87055D", ")e. c #E60412", "!e. c #F50100", "~e. c #DC4D46", "{e. c #CF7D77", "]e. c #D46D6E", "^e. c #DF4246", "/e. c #E91D22", "(e. c #F1050B", "_e. c #F50105", ":e. c #FB0001", "f. c #947380", ",f. c #CA3337", "'f. c #E80F0F", ")f. c #EE0303", "!f. c #EC0203", "~f. c #F00101", "{f. c #FD0001", "]f. c #E11912", "^f. c #C6433C", "/f. c #A27A80", "(f. c #5CC7DA", "_f. c #3AEDFF", ":f. c #43E9FA", "g. c #1313DB", ",g. c #0000EE", "'g. c #0000F2", ")g. c #0101F9", "!g. c #0303F3", "~g. c #0102F7", "{g. c #1418CC", "]g. c #3934A3", "^g. c #4E3598", "/g. c #3313A8", "(g. c #1702BC", "_g. c #34039F", ":g. c #820661", "h. c #7585A1", ",h. c #7A869E", "'h. c #907784", ")h. c #CF2E31", "!h. c #F90101", "~h. c #E01A1D", "{h. c #C05058", "]h. c #AD7981", "^h. c #BA7575", "/h. c #D94C43", "(h. c #EA1612", "_h. c #FC0101", ":h. c #FC0102", "i. c #768C98", ",i. c #677DA5", "'i. c #4B54C6", ")i. c #1C1CE7", "!i. c #0201F8", "~i. c #0000FE", "{i. c #1315F3", "]i. c #393DE1", "^i. c #2D30E0", "/i. c #1516E5", "(i. c #0909E8", "_i. c #0202F3", ":i. c #0100F8", "j. c #C80F29", ",j. c #C80E2B", "'j. c #BC0F27", ")j. c #D40B19", "!j. c #ED060E", "~j. c #F4050A", "{j. c #F40509", "]j. c #F30806", "^j. c #D6171E", "/j. c #B52036", "(j. c #CE1923", "_j. c #EF0B0A", ":j. c #F60103", "k. c #313560", ",k. c #2A366E", "'k. c #355686", ")k. c #4391B3", "!k. c #4DCCE3", "~k. c #43DEF3", "{k. c #3DDCF1", "]k. c #41DAEC", "^k. c #3EDDE9", "/k. c #3AE2EC", "(k. c #4BD0DC", "_k. c #95747F", ":k. c #D6252B", "l. c #0102F4", ",l. c #0001F2", "'l. c #0101F2", ")l. c #1417CA", "!l. c #222B95", "~l. c #27346C", "{l. c #293663", "]l. c #2D3A68", "^l. c #364270", "/l. c #4C5973", "(l. c #515C75", "_l. c #424A77", ":l. c #384274", "m. c #701C47", ",m. c #581F55", "'m. c #502152", ")m. c #58214B", "!m. c #622044", "~m. c #6D1F3C", "{m. c #791D38", "]m. c #AB1327", "^m. c #ED050D", "/m. c #FA0304", "(m. c #F40503", "_m. c #F30104", ":m. c #B40C1D", "n. c #44D6EB", ",n. c #43D7E9", "'n. c #3FEAF4", ")n. c #4FD5DB", "!n. c #7D9096", "~n. c #C93438", "{n. c #F50406", "]n. c #F20604", "^n. c #D92322", "/n. c #A46068", "(n. c #7F919B", "_n. c #70AAB2", ":n. c #60C1C3", "o. c #1A255C", ",o. c #17206A", "'o. c #0E1397", ")o. c #0205CD", "!o. c #0000EA", "~o. c #0001FB", "{o. c #0500F1", "]o. c #0C07D4", "^o. c #1015AD", "/o. c #16208B", "(o. c #1A2577", "_o. c #1C286E", ":o. c #1D276E", "p. c #F50503", ",p. c #D00B12", "'p. c #691F3E", ")p. c #2F265E", "!p. c #1F2867", "~p. c #1B2A65", "{p. c #1C2B62", "]p. c #1D2B65", "^p. c #1C2A68", "/p. c #1C2B65", "(p. c #1D2965", "_p. c #212766", ":p. c #1F2A5E", "q. c #38DAE6", ",q. c #39DAE6", "'q. c #3DD7E8", ")q. c #3BDEEE", "!q. c #38E7F0", "~q. c #41D5DF", "{q. c #6D9FAB", "]q. c #AE5662", "^q. c #E4181C", "/q. c #F00404", "(q. c #E31111", "_q. c #AF4C4C", ":q. c #61AEB3", "r. c #222765", ",r. c #1E2A67", "'r. c #1B2762", ")r. c #2A3467", "!r. c #7F98A8", "~r. c #82A2D9", "{r. c #3048E3", "]r. c #090EEA", "^r. c #0200F5", "/r. c #0B0BF2", "(r. c #3536D4", "_r. c #5E61AF", ":r. c #3D28AF", "s. c #F20506", ",s. c #F50502", "'s. c #EF0605", ")s. c #EC080A", "!s. c #A5132C", "~s. c #35255D", "{s. c #1A2A60", "]s. c #22285C", "^s. c #222864", "/s. c #1E2965", "(s. c #222767", "_s. c #212A64", ":s. c #B11320", "t. c #1A2C61", ",t. c #362851", "'t. c #9C172A", ")t. c #E9070C", "!t. c #FC0103", "~t. c #F70206", "{t. c #FA0406", "]t. c #871B31", "^t. c #362857", "/t. c #1C2A63", "(t. c #1D2C5D", "_t. c #1B2671", ":t. c #1219A0", "u. c #BF0F18", ",u. c #FD0300", "'u. c #E1060A", ")u. c #941428", "!u. c #452155", "~u. c #202965", "{u. c #212866", "]u. c #1C2A64", "^u. c #1D2A64", "/u. c #202966", "(u. c #202866", "_u. c #1F2767", ":u. c #1E2768", "v. c #42E7F1", ",v. c #3BBCD0", "'v. c #316692", ")v. c #473754", "!v. c #901C25", "~v. c #E60706", "{v. c #C00E1D", "]v. c #7D193D", "^v. c #422259", "/v. c #222663", "(v. c #182965", "_v. c #1D295F", ":v. c #1B2957", "w. c #402751", ",w. c #AE1322", "'w. c #F40405", ")w. c #F80402", "!w. c #FE0200", "~w. c #E8060A", "{w. c #A81228", "]w. c #4B214D", "^w. c #1A2864", "/w. c #1A2A69", "(w. c #202967", "_w. c #1E2963", ":w. c #212867", "x. c #ED0707", ",x. c #9F132D", "'x. c #4E2052", ")x. c #1B2A61", "!x. c #1B2959", "~x. c #1C2B5E", "{x. c #19296A", "]x. c #18286C", "^x. c #551E4D", "/x. c #AA1125", "(x. c #EB0608", "_x. c #9D1433", ":x. c #4A2355", "y. c #20295F", ",y. c #22295E", "'y. c #2B285B", ")y. c #2B2955", "!y. c #23295A", "~y. c #1D2B5B", "{y. c #4C234C", "]y. c #A11530", "^y. c #DE0912", "/y. c #F80301", "(y. c #FF0205", "_y. c #BA1020", ":y. c #462549", "z. c #1E2C5E", ",z. c #1B2770", "'z. c #12199F", ")z. c #1B296C", "!z. c #1D2B61", "~z. c #1F2865", "{z. c #1D2C63", "]z. c #1B2674", "^z. c #080BD2", "/z. c #0204EF", "(z. c #0101F4", "_z. c #0608DA", ":z. c #131C96", "A. c #BA101D", ",A. c #46254A", "'A. c #1C2B61", ")A. c #222964", "!A. c #B51221", "~A. c #D80812", "{A. c #7C183C", "]A. c #32265A", "^A. c #182A66", "/A. c #202868", "(A. c #212868", "_A. c #202A5E", ":A. c #242A59", "B. c #1D2A5C", ",B. c #16218D", "'B. c #0E0FD5", ")B. c #0504F0", "!B. c #0B03DF", "~B. c #1511AA", "{B. c #1A276C", "]B. c #1B2D5E", "^B. c #1B2C60", "/B. c #1B2B5E", "(B. c #1B2B61", "_B. c #1B2C62", ":B. c #1B2C61", "C. c #232A59", ",C. c #232A5A", "'C. c #1F295D", ")C. c #5E1E45", "!C. c #B00F21", "~C. c #FE0002", "{C. c #E8060F", "]C. c #761F46", "^C. c #336B97", "/C. c #3DC8E2", "(C. c #40E0F3", "_C. c #3BDCF0", ":C. c #36DFF3", "D. c #2405AC", ",D. c #2200AE", "'D. c #1B02BA", ")D. c #0C06D2", "!D. c #1902BD", "~D. c #1E00B4", "{D. c #E30517", "]D. c #A80542", "^D. c #540383", "/D. c #2201AC", "(D. c #1F00B5", "_D. c #1B02B6", ":D. c #1D0389", "E. c #971633", ",E. c #43255A", "'E. c #1B2A68", ")E. c #1C2959", "!E. c #1C2961", "~E. c #2B295D", "{E. c #761D3A", "]E. c #E2080F", "^E. c #FA0307", "/E. c #AC0F27", "(E. c #561F4E", "_E. c #1E2A5F", ":E. c #1B276F", "F. c #1C2951", ",F. c #1C295B", "'F. c #172967", ")F. c #662549", "!F. c #B71824", "~F. c #EE070C", "{F. c #8D4055", "]F. c #4891A9", "^F. c #39D3E5", "/F. c #3ADFF0", "(F. c #3CDBEC", "_F. c #35E3F5", ":F. c #4ACCDB", "G. c #F90306", ",G. c #ED040A", "'G. c #4F2246", ")G. c #142A5B", "!G. c #192A64", "~G. c #1B2A63", "{G. c #222862", "]G. c #5D1D4D", "^G. c #B71126", "/G. c #F70401", "(G. c #F60505", "_G. c #DF0810", ":G. c #DA0710", "H. c #192478", ",H. c #1A2573", "'H. c #1015A7", ")H. c #0304E8", "!H. c #0102F5", "~H. c #0202EF", "{H. c #0201EF", "]H. c #0201F4", "^H. c #0301F4", "/H. c #0504F8", "(H. c #0707F6", "_H. c #0505F0", ":H. c #0505EF", "I. c #D22B2F", ",I. c #758F9A", "'I. c #44CDDF", ")I. c #39DFF3", "!I. c #3ADEF0", "~I. c #3BDAEA", "{I. c #3CE3F4", "]I. c #46D6EC", "^I. c #546A7C", "/I. c #8C1723", "(I. c #DC040D", "_I. c #F90206", ":I. c #991534", "J. c #272962", ",J. c #222961", "'J. c #212861", ")J. c #102B66", "!J. c #2F2557", "~J. c #811833", "{J. c #D80810", "]J. c #C20E1B", "^J. c #472549", "/J. c #1B2C5B", "(J. c #1F2862", "_J. c #1A276F", ":J. c #1F286A", "K. c #828DD0", ",K. c #8490D0", "'K. c #7D85CD", ")K. c #4834AE", "!K. c #2201A3", "~K. c #1901BE", "{K. c #0804DF", "]K. c #0305EB", "^K. c #0203EE", "/K. c #0902E2", "(K. c #1C00BB", "_K. c #1F00B8", ":K. c #FD0301", "L. c #40D1EB", ",L. c #3CDDED", "'L. c #3DDDEE", ")L. c #46C7D8", "!L. c #526472", "~L. c #911821", "{L. c #E70207", "]L. c #92172F", "^L. c #3B2758", "/L. c #1E2A68", "(L. c #1D2961", "_L. c #1A2959", ":L. c #1B2A56", "M. c #3AE1F0", ",M. c #37E2F4", "'M. c #43CDDE", ")M. c #6C93A1", "!M. c #C63235", "~M. c #FA0100", "{M. c #FA0104", "]M. c #DE2121", "^M. c #8F777B", "/M. c #58CCD8", "(M. c #40DDF1", "_M. c #36B1CD", ":M. c #2B6A95", "N. c #FB0200", ",N. c #C00F28", "'N. c #522046", ")N. c #142A5C", "!N. c #0F2B68", "~N. c #4C224F", "{N. c #C10E23", "]N. c #F00509", "^N. c #F80201", "/N. c #C10E1D", "(N. c #4F224B", "_N. c #182A6B", ":N. c #162A65", "O. c #1D2C64", ",O. c #182661", "'O. c #56637F", ")O. c #94A2A6", "!O. c #B9CDCE", "~O. c #635AAA", "{O. c #280C9E", "]O. c #2300AC", "^O. c #1B02B8", "/O. c #0A03E3", "(O. c #1802BF", "_O. c #FC0303", ":O. c #F90503", "P. c #1E2C60", ",P. c #131D96", "'P. c #1C276F", ")P. c #1F2A5C", "!P. c #212863", "~P. c #172384", "{P. c #0606DA", "]P. c #13149A", "^P. c #1A2375", "/P. c #151F8C", "(P. c #0909D6", "_P. c #0100F4", ":P. c #0201F0", "Q. c #3FD7EB", ",Q. c #3EE2F4", "'Q. c #43E4F4", ")Q. c #52D4EA", "!Q. c #8C869A", "~Q. c #D91D27", "{Q. c #F30106", "]Q. c #EE1F21", "^Q. c #AF6E77", "/Q. c #56C9DC", "(Q. c #3BE0F5", "_Q. c #45E0F4", ":Q. c #3EC2DE", "R. c #3FDEF0", ",R. c #3DDEF2", "'R. c #3DDCEA", ")R. c #36E4F4", "!R. c #3DDBEF", "~R. c #92767E", "{R. c #DB1F1E", "]R. c #EC1214", "^R. c #A07377", "/R. c #58C4CB", "(R. c #3BE0EB", "_R. c #45E2ED", ":R. c #49E2EC", "S. c #F10507", ",S. c #AE1325", "'S. c #3E2552", ")S. c #1C2963", "!S. c #202863", "~S. c #192A6A", "{S. c #172C63", "]S. c #1C2B5C", "^S. c #24275F", "/S. c #5B1E4D", "(S. c #B41029", "_S. c #EB050C", ":S. c #C10E17", "T. c #7F9AA6", ",T. c #BCCED0", "'T. c #BCCDCA", ")T. c #B9C8C7", "!T. c #A1B5CF", "~T. c #98AED8", "{T. c #95A3D5", "]T. c #5C54B6", "^T. c #2A13A5", "/T. c #1C01AE", "(T. c #1A02B7", "_T. c #0C07D0", ":T. c #0E07CD", "U. c #283F70", ",U. c #4A2247", "'U. c #981427", ")U. c #E8060C", "!U. c #392756", "~U. c #1C2955", "{U. c #192863", "]U. c #182773", "^U. c #182873", "/U. c #E3060B", "(U. c #A91228", "_U. c #1A2B64", ":U. c #212A5E", "V. c #F00312", ",V. c #861737", "'V. c #362A58", ")V. c #2A3E72", "!V. c #346E97", "~V. c #3FA9C6", "{V. c #44D6ED", "]V. c #3EDFF5", "^V. c #65A7B6", "/V. c #B6494C", "(V. c #E90F0E", "_V. c #F10506", ":V. c #DB1C21", "W. c #2203A9", ",W. c #1905B8", "'W. c #1C03B7", ")W. c #A80541", "!W. c #540386", "~W. c #2400B4", "{W. c #1D00B7", "]W. c #4235A0", "^W. c #9798AF", "/W. c #C58880", "(W. c #F50205", "_W. c #721843", ":W. c #232663", "X. c #1A2A54", ",X. c #1A294D", "'X. c #1B2958", ")X. c #1E2962", "!X. c #1D276A", "~X. c #19286F", "{X. c #E2090E", "]X. c #AC0F1E", "^X. c #5A1E45", "/X. c #282862", "(X. c #1C285C", "_X. c #1D2964", ":X. c #080DCD", "Y. c #272859", ",Y. c #203C76", "'Y. c #2C6591", ")Y. c #3B9AB6", "!Y. c #42C8DB", "~Y. c #40DCEE", "{Y. c #3EDCF0", "]Y. c #3FDCEC", "^Y. c #52C4D1", "/Y. c #A0626B", "(Y. c #E2171B", "_Y. c #E61416", ":Y. c #D4272C", "Z. c #F40407", ",Z. c #A70540", "'Z. c #2400B5", ")Z. c #150099", "!Z. c #4231A4", "~Z. c #958CBB", "{Z. c #C48185", "]Z. c #DE403C", "^Z. c #F40B0C", "/Z. c #F70005", "(Z. c #FE0204", "_Z. c #F30409", ":Z. c #6F1333", "`. c #3DDEEF", ",`. c #44DFF0", "'`. c #5FB7C5", ")`. c #92727B", "!`. c #CC2E30", "~`. c #F20404", "{`. c #F40200", "]`. c #EE0708", "^`. c #EE0A0C", "/`. c #E81314", "(`. c #E11A1B", "_`. c #DF1E1F", ":`. c #DD1E21", "<`. c #E31418", "[`. c #EC0408", "}`. c #F00201", "|`. c #CC2B2B", "1`. c #897F86", "2`. c #55BFCC", "3`. c #3EDAE8", "4`. c #3EDAEE", "5`. c #3DDAEB", "6`. c #35D3E5", "7`. c #2AA8C5", "8`. c #216692", "9`. c #1B3168", "0`. c #151D5C", "a`. c #18225C", "b`. c #3F2344", "c`. c #8F1723", "d`. c #E40808", "e`. c #8E0F2C", "f`. c #351A50", "g`. c #16205B", "h`. c #15235C", "i`. c #16195C", "j`. c #141A55", "k`. c #141D4F", "l`. c #151E4D", "m`. c #162153", "n`. c #162357", "o`. c #16235A", "p`. c #15225C", "q`. c #17215B", "r`. c #281C55", "s`. c #751238", "t`. c #DD080D", "u`. c #F70501", "v`. c #A2111E", "w`. c #4D2142", "x`. c #23285D", "y`. c #172158", "z`. c #162456", "A`. c #131F69", "B`. c #0B129B", "C`. c #0103DF", "D`. c #0206D8", "E`. c #0B1681", "F`. c #162263", "G`. c #1A255F", "H`. c #172359", "I`. c #1B265B", "J`. c #1C265C", "K`. c #18215C", "L`. c #16215B", "M`. c #1C235E", "N`. c #172264", "O`. c #0C187D", "P`. c #0308CC", "Q`. c #0203F1", "R`. c #0101E5", "S`. c #0A07A8", "T`. c #181C74", "U`. c #1D2860", "V`. c #1A275E", "W`. c #15215E", "X`. c #131C5C", "Y`. c #162358", "Z`. c #19235D", "``. c #181E73", " + c #080C9F", ". + c #0000C8", "+ + c #0000E0", "@ + c #0503E9", "# + c #0507E1", "$ + c #0706E7", "% + c #0705EF", "& + c #0505F3", "* + c #0403F4", "= + c #1514E9", "- + c #464CDA", "; + c #504BBE", "> + c #3D28AC", ", + c #2607AA", "' + c #1405C5", ") + c #0706E3", "! + c #0204F8", "~ + c #0001FD", "{ + c #0003F8", "] + c #0003F2", "^ + c #0906DF", "/ + c #1506C2", "( + c #33029F", "_ + c #7E0764", ": + c #E00B18", "< + c #FF0600", "[ + c #F8040A", "} + c #AC0540", "| + c #570381", "1 + c #150098", "2 + c #4131A6", "3 + c #948CBD", "4 + c #C68482", "5 + c #E04236", "6 + c #F10B08", "7 + c #F20105", "8 + c #933044", "9 + c #4A5076", "0 + c #405280", "a + c #46557E", "b + c #49587F", "c + c #4A5880", "d + c #495781", "e + c #485281", "f + c #454A7D", "g + c #3F4171", "h + c #404670", "i + c #47557B", "j + c #49587E", "k + c #425A83", "l + c #4A557E", "m + c #A4293F", "n + c #E6080D", "o + c #EF0101", "p + c #F00000", "q + c #E6070C", "r + c #C21B2D", "s + c #724265", "t + c #445784", "u + c #4A5681", "v + c #4A577F", "w + c #4A567E", "x + c #495480", "y + c #465682", "z + c #49567E", "A + c #604E73", "B + c #98405C", "C + c #D62E3A", "D + c #EF1519", "E + c #F30306", "F + c #F50002", "G + c #F50101", "H + c #F20201", "I + c #F30100", "J + c #EF0708", "K + c #ED1B1A", "L + c #E23336", "M + c #9C445D", "N + c #7F4361", "O + c #A0333E", "P + c #DC0F11", "Q + c #C81623", "R + c #78435F", "S + c #4D507E", "T + c #3E497C", "U + c #3B456D", "V + c #454D75", "W + c #4B5680", "X + c #4A5881", "Y + c #495983", "Z + c #4A547E", "` + c #5F4367", " .+ c #BE1725", "..+ c #F80001", "+.+ c #D70C14", "@.+ c #952944", "#.+ c #5E4A70", "$.+ c #475B82", "%.+ c #485981", "&.+ c #495581", "*.+ c #485581", "=.+ c #4A5781", "-.+ c #4B587F", ";.+ c #4D5A83", ">.+ c #46527A", ",.+ c #3C446A", "'.+ c #434162", ").+ c #464B6E", "!.+ c #4A557A", "~.+ c #804057", "{.+ c #C21D24", "].+ c #EE0406", "^.+ c #993245", "/.+ c #5E5173", "(.+ c #505984", "_.+ c #505583", ":.+ c #4F608B", "<.+ c #507EA3", "[.+ c #61AFC4", "}.+ c #5FD1DE", "|.+ c #4ADBEC", "1.+ c #3EE2F3", "2.+ c #3FE6F7", "3.+ c #55C4CF", "4.+ c #8B8487", "5.+ c #C44242", "6.+ c #E31A1A", "7.+ c #EA0909", "8.+ c #EE0203", "9.+ c #F70002", "0.+ c #E01A20", "a.+ c #BE4349", "b.+ c #8F7C82", "c.+ c #57C3D1", "d.+ c #3DE4F5", "e.+ c #40DFF1", "f.+ c #3CDEF1", "g.+ c #41DFF1", "h.+ c #51D7E7", "i.+ c #58C9DB", "j.+ c #53A2BC", "k.+ c #4A6E95", "l.+ c #495A82", "m.+ c #43577F", "n.+ c #405279", "o.+ c #594258", "p.+ c #99242B", "q.+ c #E10708", "r.+ c #F30102", "s.+ c #AA233D", "t.+ c #674671", "u.+ c #4B5781", "v.+ c #485882", "w.+ c #475282", "x.+ c #454C81", "y.+ c #444B78", "z.+ c #42496F", "A.+ c #40466C", "B.+ c #444F7A", "C.+ c #495583", "D.+ c #495582", "E.+ c #4A5580", "F.+ c #485982", "G.+ c #495981", "H.+ c #5C4E79", "I.+ c #972D4C", "J.+ c #B51E21", "K.+ c #734054", "L.+ c #505481", "M.+ c #485785", "N.+ c #4A587F", "O.+ c #4F5A79", "P.+ c #414A88", "Q.+ c #2329AE", "R.+ c #0D0FDF", "S.+ c #0A11DB", "T.+ c #2C4096", "U.+ c #495681", "V.+ c #505882", "W.+ c #4B557D", "X.+ c #3F4B74", "Y.+ c #3E4C74", "Z.+ c #47577F", "`.+ c #4B5981", " ++ c #4A597F", ".++ c #48587E", "+++ c #485580", "@++ c #48577E", "#++ c #505C82", "$++ c #4D5687", "%++ c #374096", "&++ c #0E12D1", "*++ c #030CE9", "=++ c #1A31BC", "-++ c #3C4D91", ";++ c #485179", ">++ c #424E73", ",++ c #44547D", "'++ c #49597F", ")++ c #46537E", "!++ c #465180", "~++ c #485481", "{++ c #505A83", "]++ c #424B9B", "^++ c #373CBA", "/++ c #3234D2", "(++ c #2022E5", "_++ c #0F10F0", ":++ c #0505F5", "<++ c #0200F8", "[++ c #0A0AEA", "}++ c #1615EB", "|++ c #1E25E6", "1++ c #3F4BDF", "2++ c #6A72D6", "3++ c #5D57BB", "4++ c #3B25AB", "5++ c #2305AE", "6++ c #1A04B7", "7++ c #1305C9", "8++ c #0E04E1", "9++ c #0604F2", "0++ c #0101FB", "a++ c #0806E0", "b++ c #2001B2", "c++ c #3202A0", "d++ c #7A0867", "e++ c #D90F1F", "f++ c #EF0B0B", "g++ c #ED0511", "h++ c #E50321", "i++ c #A2044D", "j++ c #560481", "k++ c #2501A9", "l++ c #17009A", "m++ c #4134A1", "n++ c #9397B1", "o++ c #C68A80", "p++ c #DD493F", "q++ c #E91718", "r++ c #EA0E12", "s++ c #EC0A0C", "t++ c #EA1114", "u++ c #C9707A", "v++ c #ABB3C1", "w++ c #9EB7C2", "x++ c #9DB4BC", "y++ c #A0B5BF", "z++ c #A4B4C4", "A++ c #A1AFC7", "B++ c #9EAAC3", "C++ c #9BA5B9", "D++ c #8B8CA8", "E++ c #8B8FA9", "F++ c #9BAEBA", "G++ c #A0B6BD", "H++ c #9DB9C4", "I++ c #A4AEBD", "J++ c #CC5C66", "K++ c #E81D21", "L++ c #EA0E11", "M++ c #EB0B0D", "N++ c #E3191C", "O++ c #CF4047", "P++ c #B38995", "Q++ c #A1B0C5", "R++ c #9DAEC9", "S++ c #A2B1C6", "T++ c #A6B3C2", "U++ c #A5AEBD", "V++ c #A0AAC4", "W++ c #9EACC3", "X++ c #A1B0BC", "Y++ c #A3B5C2", "Z++ c #B2ADBC", "`++ c #C9909A", " @+ c #CF4D54", ".@+ c #DB1920", "+@+ c #F0060B", "@@+ c #F90405", "#@+ c #EB0E11", "$@+ c #DC2A2E", "%@+ c #D25B5E", "&@+ c #CA9195", "*@+ c #B2B4C2", "=@+ c #AEA1AB", "-@+ c #C7655F", ";@+ c #E12725", ">@+ c #EB0E10", ",@+ c #E10105", "'@+ c #CE343D", ")@+ c #B699A2", "!@+ c #A7B5CC", "~@+ c #919FB8", "{@+ c #7D8998", "]@+ c #939BAA", "^@+ c #A6B0C1", "/@+ c #A6B5C5", "(@+ c #A6B8C8", "_@+ c #9EB0C3", ":@+ c #9C90A6", "<@+ c #CC3B46", "[@+ c #EE0C0D", "}@+ c #ED0D0F", "|@+ c #EC090B", "1@+ c #E02225", "2@+ c #C65B62", "3@+ c #AD9CA8", "4@+ c #A3BBC7", "5@+ c #A4B8C4", "6@+ c #A0ADC4", "7@+ c #9FADC6", "8@+ c #A4B3C5", "9@+ c #A0AEC6", "0@+ c #9FADC5", "a@+ c #A4B4C2", "b@+ c #A5B5C3", "c@+ c #A4B5C3", "d@+ c #A5B6C1", "e@+ c #A8BAC9", "f@+ c #99A6B6", "g@+ c #7D8692", "h@+ c #899BA5", "i@+ c #BA787F", "j@+ c #D43438", "k@+ c #E90D0E", "l@+ c #EF0807", "m@+ c #E90405", "n@+ c #DA0D14", "o@+ c #C07177", "p@+ c #ADB4BA", "q@+ c #A6B2C1", "r@+ c #A6B4C5", "s@+ c #A5B9C9", "t@+ c #AAC2CE", "u@+ c #96CDD6", "v@+ c #70D5E1", "w@+ c #50DFEF", "x@+ c #42E7FA", "y@+ c #44E7F5", "z@+ c #54D7DF", "A@+ c #7EA7A5", "B@+ c #AA6766", "C@+ c #CD2E33", "D@+ c #E70E11", "E@+ c #F60408", "F@+ c #F10607", "G@+ c #F40605", "H@+ c #F10706", "I@+ c #E90B0C", "J@+ c #D52329", "K@+ c #A16A7B", "L@+ c #70ADC3", "M@+ c #52D5E6", "N@+ c #45E4F5", "O@+ c #43E7F9", "P@+ c #40E5F7", "Q@+ c #54DEEF", "R@+ c #7FD0DD", "S@+ c #9AC9D5", "T@+ c #A3C1CD", "U@+ c #A4B6C3", "V@+ c #A3B6C0", "W@+ c #95B1BB", "X@+ c #849FAA", "Y@+ c #8A787E", "Z@+ c #B14447", "`@+ c #E11719", " #+ c #EC0B0D", ".#+ c #EA1113", "+#+ c #D15C64", "@#+ c #B69EAC", "##+ c #9FB0C7", "$#+ c #9DAAC7", "%#+ c #9DA9C6", "&#+ c #9BA7B9", "*#+ c #909DA6", "=#+ c #949FB6", "-#+ c #9EABC9", ";#+ c #9FABC7", ">#+ c #A3B0C5", ",#+ c #A2B8C7", "'#+ c #A0B8C6", ")#+ c #AEAAB8", "!#+ c #CA6D77", "~#+ c #E51E22", "{#+ c #EB0B0E", "]#+ c #EC0C0E", "^#+ c #EB1013", "/#+ c #D44041", "(#+ c #B77B86", "_#+ c #A1A6BF", ":#+ c #9CB3C5", "<#+ c #A0B5BE", "[#+ c #A4B5C0", "}#+ c #ADB7BC", "|#+ c #9298C1", "1#+ c #5B60CF", "2#+ c #3539DE", "3#+ c #0E0EE9", "4#+ c #0402EC", "5#+ c #2832E1", "6#+ c #7090CA", "7#+ c #9CAFC0", "8#+ c #A7AFBD", "9#+ c #7D8A96", "0#+ c #7C8C99", "a#+ c #9AB1BE", "b#+ c #A6BAC6", "c#+ c #A3B7BF", "d#+ c #9FB5BD", "e#+ c #9EADC4", "f#+ c #9FB4BF", "g#+ c #A6B8C2", "h#+ c #A3AFC3", "i#+ c #888EC4", "j#+ c #3739D9", "k#+ c #0707EC", "l#+ c #0605F2", "m#+ c #0601EF", "n#+ c #1C2FE3", "o#+ c #4A82D0", "p#+ c #7C9EBA", "q#+ c #8B95A4", "r#+ c #84909B", "s#+ c #93A9B5", "t#+ c #A0BAC6", "u#+ c #A1B4BF", "v#+ c #A5B4C4", "w#+ c #A0ADC6", "x#+ c #A5B3C4", "y#+ c #A0ADC8", "z#+ c #9EAACD", "A#+ c #9AA5D2", "B#+ c #6E76D7", "C#+ c #4347DD", "D#+ c #282AE4", "E#+ c #0F10EF", "F#+ c #0203F4", "G#+ c #0204F3", "H#+ c #0505F4", "I#+ c #0705F5", "J#+ c #0705F6", "K#+ c #0506EE", "L#+ c #0306EB", "M#+ c #0607EB", "N#+ c #1718E6", "O#+ c #3132E0", "P#+ c #4C51DB", "Q#+ c #6882D6", "R#+ c #90AED2", "S#+ c #AAB9D1", "T#+ c #6C74D8", "U#+ c #312ACB", "V#+ c #2006B3", "W#+ c #2001B1", "X#+ c #1E01BE", "Y#+ c #1308DA", "Z#+ c #0B0AEE", "`#+ c #0705F4", " $+ c #0603F5", ".$+ c #0906DC", "+$+ c #1606C1", "@$+ c #2700AA", "#$+ c #430493", "$$+ c #670973", "%$+ c #6F0969", "&$+ c #6E066D", "*$+ c #6B0473", "=$+ c #510289", "-$+ c #34019F", ";$+ c #41329D", ">$+ c #939AAF", ",$+ c #BFACA3", "'$+ c #CB9190", ")$+ c #D07D86", "!$+ c #D17984", "~$+ c #D1787E", "{$+ c #CF7D7E", "]$+ c #C8ADB0", "^$+ c #BBCFD2", "/$+ c #B5CCCC", "($+ c #B4CBCE", "_$+ c #B9C8D4", ":$+ c #B8CED0", "<$+ c #B8CFD3", "[$+ c #C8A1A3", "}$+ c #D18383", "|$+ c #CF7D7D", "1$+ c #CE7B7E", "2$+ c #BA6F72", "3$+ c #9E6A6E", "4$+ c #AFA3A5", "5$+ c #BFCACF", "6$+ c #B8CBD4", "7$+ c #AC8D92", "8$+ c #B56B6F", "9$+ c #D66067", "0$+ c #E14B50", "a$+ c #E03A38", "b$+ c #E3342B", "c$+ c #E12928", "d$+ c #E02A2E", "e$+ c #E03B3C", "f$+ c #DE4C4E", "g$+ c #DA5E60", "h$+ c #D37376", "i$+ c #C68B91", "j$+ c #BDA7AD", "k$+ c #B8CFD6", "l$+ c #BFC5C8", "m$+ c #CCA7A3", "n$+ c #D08988", "o$+ c #D17E81", "p$+ c #CF7C7F", "q$+ c #AF5B5F", "r$+ c #A87277", "s$+ c #BBBAC0", "t$+ c #BED2DB", "u$+ c #87969C", "v$+ c #B7BBC1", "w$+ c #C79295", "x$+ c #D07D7A", "y$+ c #CB8078", "z$+ c #BE736A", "A$+ c #B3706A", "B$+ c #AF8685", "C$+ c #B2B7BD", "D$+ c #B9D2D9", "E$+ c #BDCED4", "F$+ c #BAC9D3", "G$+ c #B7CAD4", "H$+ c #BACED5", "I$+ c #B9C9CD", "J$+ c #BECFD6", "K$+ c #99ADB1", "L$+ c #B5C6C9", "M$+ c #C5ACB4", "N$+ c #CD878F", "O$+ c #D37476", "P$+ c #D47171", "Q$+ c #D26E70", "R$+ c #CB7477", "S$+ c #BEAAAB", "T$+ c #B8CBCE", "U$+ c #AFCAD3", "V$+ c #9CCDD6", "W$+ c #72D6E2", "X$+ c #40E6F8", "Y$+ c #43E5F8", "Z$+ c #45E8F9", "`$+ c #46E9F8", " %+ c #57D9DF", ".%+ c #69C0C3", "+%+ c #7BA4AA", "@%+ c #977D8C", "#%+ c #AC616F", "$%+ c #B75058", "%%+ c #C33B3E", "&%+ c #C92F30", "*%+ c #CA3032", "=%+ c #DD3943", "-%+ c #DC464F", ";%+ c #BC5557", ">%+ c #976F74", ",%+ c #85888F", "'%+ c #7C9EA5", ")%+ c #63C3D2", "!%+ c #4CDEF4", "~%+ c #43EAFC", "{%+ c #42E8FA", "]%+ c #43E7F6", "^%+ c #46E6EF", "/%+ c #5CDDEA", "(%+ c #80D2DF", "_%+ c #A5CAD1", ":%+ c #A4A8B4", "<%+ c #98939C", "[%+ c #A9878A", "}%+ c #C87F7F", "|%+ c #D07C80", "1%+ c #CE7A7D", "2%+ c #CE7D7E", "3%+ c #C9A2A2", "4%+ c #C2C2C5", "5%+ c #BAC6D3", "6%+ c #A6B6B9", "7%+ c #95ACAF", "8%+ c #A8BBC5", "9%+ c #B9C9D5", "0%+ c #B6CDD6", "a%+ c #C7ABB3", "b%+ c #CE8485", "c%+ c #C1716B", "d%+ c #B86A66", "e%+ c #BC6F70", "f%+ c #C19294", "g%+ c #C1B3BA", "h%+ c #BDCACC", "i%+ c #B1BCCB", "j%+ c #9AA5D4", "k%+ c #8691D7", "l%+ c #7A82D8", "m%+ c #727ADA", "n%+ c #6B71DA", "o%+ c #7E8BD9", "p%+ c #A4BBD6", "q%+ c #BBC9CC", "r%+ c #8F999F", "s%+ c #BDD2D6", "t%+ c #BACFD0", "u%+ c #BAC9D4", "v%+ c #AEBAD2", "w%+ c #8898D6", "x%+ c #6F7FDC", "y%+ c #6D75DF", "z%+ c #6B71DD", "A%+ c #7D88D7", "B%+ c #9BAFCD", "C%+ c #9BA5A8", "D%+ c #ACC0C3", "E%+ c #B9D1D5", "F%+ c #B9CED2", "G%+ c #BACED0", "H%+ c #BCCED1", "I%+ c #A3B6CF", "J%+ c #92A0D1", "K%+ c #8590D5", "L%+ c #6F72D8", "M%+ c #5765D5", "N%+ c #4467D5", "O%+ c #3649DD", "P%+ c #3232E3", "Q%+ c #3132E2", "R%+ c #3234E3", "S%+ c #3233E3", "T%+ c #2C50DE", "U%+ c #3F6BD9", "V%+ c #677CD4", "W%+ c #7C88D4", "X%+ c #8995D4", "Y%+ c #97A2D3", "Z%+ c #A2B7D1", "`%+ c #B5CED1", " &+ c #7673C1", ".&+ c #3624B3", "+&+ c #2104AD", "@&+ c #1E03BB", "#&+ c #1606CA", "$&+ c #0D07D9", "%&+ c #0906DE", "&&+ c #0806DE", "*&+ c #0906DD", "=&+ c #0C07DC", "-&+ c #0B04DC", ";&+ c #1301D1", ">&+ c #1603C2", ",&+ c #1A03B7", "'&+ c #1B03AD", ")&+ c #1B03AC", "!&+ c #1B03AB", "~&+ c #15009A", "{&+ c #42309C", "]&+ c #9498AF", "^&+ c #B6C0BE", "/&+ c #BDC4C7", "(&+ c #C1C4CD", "_&+ c #C1C4D0", ":&+ c #BBC7C9", "<&+ c #B8C9CB", "[&+ c #B0C5CB", "}&+ c #B9C6C9", "|&+ c #BBC7C8", "1&+ c #B9C8C9", "2&+ c #B9CACD", "3&+ c #9AAAAD", "4&+ c #758084", "5&+ c #9AA4A7", "6&+ c #BBC9CA", "7&+ c #99ABAE", "8&+ c #9BA0A4", "9&+ c #BCA9B0", "0&+ c #C5999F", "a&+ c #C78586", "b&+ c #CC7D77", "c&+ c #CA7172", "d&+ c #C6747A", "e&+ c #C4878B", "f&+ c #C49A9E", "g&+ c #C2ACB0", "h&+ c #B9C8CE", "i&+ c #B5CBD2", "j&+ c #B3CAD1", "k&+ c #BFC9CD", "l&+ c #BCC8CC", "m&+ c #BECACE", "n&+ c #909EA2", "o&+ c #9FB3B7", "p&+ c #839198", "q&+ c #9EADB5", "r&+ c #B9C6C7", "s&+ c #BAC6C7", "t&+ c #BBCBC9", "u&+ c #B5CDC5", "v&+ c #A5BCB3", "w&+ c #95A5A2", "x&+ c #939C9F", "y&+ c #859098", "z&+ c #BFC1CA", "A&+ c #BFC0C4", "B&+ c #B0C5CC", "C&+ c #B1C7D1", "D&+ c #95CDD6", "E&+ c #74D4E0", "F&+ c #5ADEED", "G&+ c #4BE5F4", "H&+ c #44E7F6", "I&+ c #42E6F8", "J&+ c #47E6F4", "K&+ c #47EAF5", "L&+ c #47EBF6", "M&+ c #56D4E8", "N&+ c #66BBD2", "O&+ c #71A9B7", "P&+ c #819198", "Q&+ c #888388", "R&+ c #898489", "S&+ c #A28D9C", "T&+ c #A09AAA", "U&+ c #7AACB4", "V&+ c #53C9D5", "W&+ c #43E1EE", "X&+ c #45EBF7", "Y&+ c #44EBF8", "Z&+ c #42E7F9", "`&+ c #48E3F4", " *+ c #4EE1F1", ".*+ c #5BDDED", "+*+ c #84D1DF", "@*+ c #A7C8D2", "#*+ c #A7A1B1", "$*+ c #969DAA", "%*+ c #B4C4C6", "&*+ c #BAC7CC", "**+ c #B9C7C9", "=*+ c #B9C7C7", "-*+ c #91AAB0", ";*+ c #A5BBC1", ">*+ c #A4B5B2", ",*+ c #97A9A5", "'*+ c #9DACAE", ")*+ c #B4C3D0", "!*+ c #BAC3CF", "~*+ c #C2BEC8", "{*+ c #B4B4BD", "]*+ c #A1A8B0", "^*+ c #A9BABE", "/*+ c #B5CCCE", "(*+ c #BACDCC", "_*+ c #BBCBCE", ":*+ c #A2B7C5", "<*+ c #8CB9C5", "[*+ c #7A95CE", "}*+ c #727BD4", "|*+ c #727CD5", "1*+ c #737ED4", "2*+ c #747AD4", "3*+ c #747DD3", "4*+ c #6F9BD0", "5*+ c #87BBCB", "6*+ c #B0CDC8", "7*+ c #BCD0CA", "8*+ c #BBCDCC", "9*+ c #766BA9", "0*+ c #3B1D99", "a*+ c #2202A8", "b*+ c #1605BF", "c*+ c #1506C3", "d*+ c #1506C1", "e*+ c #1505C2", "f*+ c #1406C2", "g*+ c #1905BD", "h*+ c #2000B6", "i*+ c #1A00B2", "j*+ c #1A00B4", "k*+ c #1B00B3", "l*+ c #1C00AB", "m*+ c #442F9C", "n*+ c #B1C1C1", "o*+ c #C1C9CC", "p*+ c #BDCBD0", "q*+ c #B4CCD0", "r*+ c #B4CACE", "s*+ c #B6D1D5", "t*+ c #97B0B6", "u*+ c #718189", "v*+ c #96A5AD", "w*+ c #97A9B0", "x*+ c #BBBDC2", "y*+ c #B9BAC0", "z*+ c #B6BCC3", "A*+ c #B5C1C8", "B*+ c #B4CBD0", "C*+ c #B6CDD4", "D*+ c #8FA4AB", "E*+ c #8C9EA6", "F*+ c #B9CBCE", "G*+ c #A0B0B7", "H*+ c #B5CDD2", "I*+ c #B3CED0", "J*+ c #A9C1C4", "K*+ c #9BAEB3", "L*+ c #A6B9BF", "M*+ c #B1C9D2", "N*+ c #A2CAD5", "O*+ c #8BCFDB", "P*+ c #62DCE6", "Q*+ c #49E4EF", "R*+ c #45E5F5", "S*+ c #45E6F7", "T*+ c #44E8F9", "U*+ c #43EAFA", "V*+ c #45E7F9", "W*+ c #47E3F6", "X*+ c #4ADFF0", "Y*+ c #4CDCEA", "Z*+ c #4ED8E7", "`*+ c #53DAEB", " =+ c #53DCED", ".=+ c #4BE0F0", "+=+ c #42E9FB", "@=+ c #43EBFA", "#=+ c #44E8F8", "$=+ c #44E6F8", "%=+ c #5ADCE9", "&=+ c #70D4E6", "*=+ c #84CFEA", "==+ c #A6CADC", "-=+ c #A0B4BA", ";=+ c #B3CBD2", ">=+ c #99A9B1", ",=+ c #A3BAC0", "'=+ c #96A9AF", ")=+ c #97A8AF", "!=+ c #B7CACC", "~=+ c #B8CBCD", "{=+ c #B9CBCC", "]=+ c #B8CACC", "^=+ c #B9CACC", "/=+ c #B9C9CB", "(=+ c #B5C8CA", "_=+ c #B2CACA", ":=+ c #AEC3CB", "<=+ c #ACBECD", "[=+ c #ACBECF", "}=+ c #ACBECE", "|=+ c #AEBECD", "1=+ c #B0BFCC", "2=+ c #B3C7C6", "3=+ c #B9CDCA", "4=+ c #BACECC", "5=+ c #BDCCD0", "6=+ c #766DAA", "7=+ c #3C1F9A", "8=+ c #1D00AA", "9=+ c #432F9B", "0=+ c #9598AF", "a=+ c #AFC4C6", "b=+ c #919EA4", "c=+ c #AABCBF", "d=+ c #B3CAD2", "e=+ c #B3C9D1", "f=+ c #B3C9D0", "g=+ c #91A0A8", "h=+ c #B9CACE", "i=+ c #A1B0BA", "j=+ c #A9BBC0", "k=+ c #9AAAB1", "l=+ c #B2C7CF", "m=+ c #ABC8CF", "n=+ c #88C0C6", "o=+ c #74C4CC", "p=+ c #70D4E2", "q=+ c #53E1EF", "r=+ c #41E6F2", "s=+ c #43E6F1", "t=+ c #41E8F6", "u=+ c #3EE9FA", "v=+ c #3EEAF9", "w=+ c #3FEBFC", "x=+ c #40ECFE", "y=+ c #40EBFE", "z=+ c #3EEBFD", "A=+ c #3DEBFC", "B=+ c #3DEAFC", "C=+ c #3FE8FB", "D=+ c #3FE7F7", "E=+ c #42E6F2", "F=+ c #51E2F0", "G=+ c #61DEED", "H=+ c #6FD7E6", "I=+ c #8BD0D9", "J=+ c #A1CAD4", "K=+ c #ABC8D8", "L=+ c #B4C7D3", "M=+ c #96A1AC", "N=+ c #BAC7CD", "O=+ c #BCCCCE", "P=+ c #C2CFD1", "Q=+ c #C1CACC", "R=+ c #BAC7CA", "S=+ c #BACCCF", "T=+ c #7F7DAF", "U=+ c #452FA1", "V=+ c #2406AB", "W=+ c #15009B", "X=+ c #43309B", "Y=+ c #9398AF", "Z=+ c #B0C5C8", "`=+ c #A2AAB5", " -+ c #7E858D", ".-+ c #919CA5", "+-+ c #A1AFB9", "@-+ c #A3ACB4", "#-+ c #9EAFB3", "$-+ c #95ABB1", "%-+ c #99C2CB", "&-+ c #7DD5DE", "*-+ c #63DDE4", "=-+ c #5DDDE6", "--+ c #59DEEB", ";-+ c #56DFF2", ">-+ c #54DFF7", ",-+ c #4FE0F4", "'-+ c #4DE1F1", ")-+ c #4CE1F1", "!-+ c #4CE1F2", "~-+ c #4FE0F1", "{-+ c #56DFEF", "]-+ c #56DFF0", "^-+ c #5BDFED", "/-+ c #66DCE3", "(-+ c #6FCCD5", "_-+ c #81C5D1", ":-+ c #9AC7D4", "<-+ c #AFC7D0", "[-+ c #94A3AC", "}-+ c #7F8C94", "|-+ c #8585AE", "1-+ c #4C3AA3", "2-+ c #2408AD", "3-+ c #1C00B0", "4-+ c #15009C", "5-+ c #9399AF", "6-+ c #B2C4C5", "7-+ c #96A4AD", "8-+ c #939CA9", "9-+ c #AEB6C1", "0-+ c #A2AFB2", "a-+ c #9CA7A9", "b-+ c #ADC5C9", "c-+ c #A1CCD3", "d-+ c #8CCFDA", "e-+ c #86CFD9", "f-+ c #86CFE3", "g-+ c #80D0F3", "h-+ c #72D4EB", "i-+ c #69D7E2", "j-+ c #69D6E2", "k-+ c #67D7E4", "l-+ c #71D4E1", "m-+ c #84D0DC", "n-+ c #85CFDC", "o-+ c #8FCFDA", "p-+ c #A0C9CE", "q-+ c #90ABB0", "r-+ c #94A6B0", "s-+ c #91A1A9", "t-+ c #8483AF", "u-+ c #4C3AA5", "v-+ c #2509AE", "w-+ c #1C01AD", "x-+ c #1B01AC", "y-+ c #41309B", "z-+ c #9198AE", "A-+ c #B2C4C4", "B-+ c #AFC7CE", "C-+ c #B2CBD6", "D-+ c #87949C", "E-+ c #97ADB2", "F-+ c #ACC8CF", "G-+ c #ACC8D3", "H-+ c #AAC9DB", "I-+ c #A3CAD7", "J-+ c #9FCCD2", "K-+ c #9ECDD2", "L-+ c #9CCCD3", "M-+ c #9FCBD4", "N-+ c #A4CAD4", "O-+ c #A9C9D5", "P-+ c #AAC8CD", "Q-+ c #A5C1BC", "R-+ c #90A0A3", "S-+ c #969EAA", "T-+ c #A4ADB7", "U-+ c #9FAFB6", "V-+ c #828BCD", "W-+ c #4740C2", "X-+ c #240AB3", "Y-+ c #1E01AD", "Z-+ c #402F9B", "`-+ c #8C95AE", " ;+ c #B0C3C4", ".;+ c #A4B3B7", "+;+ c #B0C7CD", "@;+ c #B3CBD5", "#;+ c #91A0A9", "$;+ c #99A8B0", "%;+ c #90A8AF", "&;+ c #A8BCC1", "*;+ c #BAC9CD", "=;+ c #BAC9CC", "-;+ c #A5BFBC", ";;+ c #8FA1A5", ">;+ c #92A2AB", ",;+ c #848DD0", "';+ c #463FC3", ");+ c #230AB3", "!;+ c #18009C", "~;+ c #402D9B", "{;+ c #8B94B0", "];+ c #8A97A0", "^;+ c #9DACB2", "/;+ c #B1CBD3", "(;+ c #A8BABF", "_;+ c #A6B4BD", ":;+ c #98A9B0", "<;+ c #B2BDC6", "[;+ c #BCCDD3", "};+ c #8687B9", "|;+ c #493BAA", "1;+ c #2109AF", "2;+ c #17009D", "3;+ c #422E9B", "4;+ c #9394AF", "5;+ c #B2C3C5", "6;+ c #6F7478", "7;+ c #6C7275", "8;+ c #859097", "9;+ c #B3C3CD", "0;+ c #8286CA", "a;+ c #473EC2", "b;+ c #220AB3", "c;+ c #44309B", "d;+ c #989AB1", "e;+ c #B5C4C5", "f;+ c #8D909B", "g;+ c #71787B", "h;+ c #A6B5BA", "i;+ c #A3B4BC", "j;+ c #9CA6B0", "k;+ c #A2ACB2", "l;+ c #B9C9CC", "m;+ c #B6C0C8", "n;+ c #838ECA", "o;+ c #4A46C2", "p;+ c #240CB4", "q;+ c #44329C", "r;+ c #979EB4", "s;+ c #B4C6C7", "t;+ c #A6B5BE", "u;+ c #B7C6C8", "v;+ c #BAC1C4", "w;+ c #B7C4C9", "x;+ c #BECED7", "y;+ c #AAB3BE", "z;+ c #8D919B", "A;+ c #A8B3B8", "B;+ c #747F83", "C;+ c #6C7379", "D;+ c #A3B5BE", "E;+ c #94A0A9", "F;+ c #93A1AB", "G;+ c #849098", "H;+ c #A9B5C2", "I;+ c #8E99A4", "J;+ c #B6BCC1", "K;+ c #9BA6A9", "L;+ c #A6BBC2", "M;+ c #B2CBD2", "N;+ c #9099AD", "O;+ c #564FA1", "P;+ c #270DAE", "Q;+ c #969AB2", "R;+ c #B4C3C5", "S;+ c #B9C7CA", "T;+ c #B9C3C6", "U;+ c #B6BFC2", "V;+ c #B4C7C9", "W;+ c #B4C7C3", "X;+ c #A8B6B6", "Y;+ c #8B8F83", "Z;+ c #989E96", "`;+ c #ACB9B7", " >+ c #727680", ".>+ c #ACBAC4", "+>+ c #9EAEB8", "@>+ c #96ACB3", "#>+ c #909EA8", "$>+ c #A2B1B6", "%>+ c #94A2A8", "&>+ c #909DA4", "*>+ c #B8BDC1", "=>+ c #9CA6A8", "->+ c #A6B7BB", ";>+ c #B1C6CD", ">>+ c #9EA1AF", ",>+ c #6756A1", "'>+ c #2A0FAD", ")>+ c #9697AF", "!>+ c #B6C6C6", "~>+ c #B8C5BB", "{>+ c #A9B9B8", "]>+ c #909786", "^>+ c #8F927E", "/>+ c #9EA59D", "(>+ c #B2BDC9", "_>+ c #A0B0BB", ":>+ c #8EA7AE", "<>+ c #A3BABF", "[>+ c #939EA7", "}>+ c #A5B2BC", "|>+ c #849099", "1>+ c #B4BCC0", "2>+ c #A9AEB1", "3>+ c #A5A4B7", "4>+ c #6F5BAA", "5>+ c #2A10AE", "6>+ c #16009D", "7>+ c #42309B", "8>+ c #9499AF", "9>+ c #B3C4C5", "0>+ c #B5C7D1", "a>+ c #9EA8B0", "b>+ c #909BA5", "c>+ c #A5B6BF", "d>+ c #B6C6C9", "e>+ c #BAC4C3", "f>+ c #AEBFC1", "g>+ c #9CA59B", "h>+ c #898D78", "i>+ c #939A8B", "j>+ c #A9B0BB", "k>+ c #8E979F", "l>+ c #939FA9", "m>+ c #94A0AB", "n>+ c #869198", "o>+ c #A5A3B6", "p>+ c #6E5AAA", "q>+ c #2810AE", "r>+ c #9698AF", "s>+ c #A7B2B1", "t>+ c #7C8E7E", "u>+ c #7F9386", "v>+ c #808A91", "w>+ c #B4C9D0", "x>+ c #8E959D", "y>+ c #B9CCD4", "z>+ c #8C999E", "A>+ c #9FB3BA", "B>+ c #B4CAD3", "C>+ c #B4C3C9", "D>+ c #AEBBBE", "E>+ c #A2ACAE", "F>+ c #B6CACC", "G>+ c #A4A1B1", "H>+ c #6C58A7", "I>+ c #2710AF", "J>+ c #1600B1", "K>+ c #15009D", "L>+ c #442F9B", "M>+ c #9896AF", "N>+ c #B5C2C5", "O>+ c #A1AFB4", "P>+ c #B8C4C9", "Q>+ c #AAB2B5", "R>+ c #7B8C86", "S>+ c #7C918C", "T>+ c #A6B8BD", "U>+ c #A6B7C0", "V>+ c #9FB0B7", "W>+ c #93A3AD", "X>+ c #9BB5BB", "Y>+ c #A5A6BA", "Z>+ c #6E5FB2", "`>+ c #2811B0", " ,+ c #B5C2C7", ".,+ c #8A979E", "+,+ c #BAC9CE", "@,+ c #9CABB4", "#,+ c #B6C2C6", "$,+ c #A8ABAE", "%,+ c #8B9497", "&,+ c #7A808A", "*,+ c #A9B0BC", "=,+ c #A2B5BB", "-,+ c #9CAFB7", ";,+ c #C0D1D6", ">,+ c #D6DDDF", ",,+ c #93A3AC", "',+ c #94A0AA", "),+ c #B0C8D0", "!,+ c #BCCBD6", "~,+ c #9AADB3", "{,+ c #B2C9CE", "],+ c #A8B4CA", "^,+ c #736CC1", "/,+ c #2C14B3", "(,+ c #43319C", "_,+ c #969DB3", ":,+ c #A3AFB8", "<,+ c #B1C7CF", "[,+ c #B6CAD3", "},+ c #BCD0D7", "|,+ c #7E838B", "1,+ c #A8B2B3", "2,+ c #949496", "3,+ c #979B9F", "4,+ c #7F8992", "5,+ c #A5B7BE", "6,+ c #8C9AA4", "7,+ c #A2B2BB", "8,+ c #9CACB7", "9,+ c #C5D4D6", "0,+ c #B5C9D3", "a,+ c #B2C7D1", "b,+ c #B8C5CA", "c,+ c #878B8A", "d,+ c #A88C94", "e,+ c #C1A7AF", "f,+ c #B8C2C2", "g,+ c #B5CFD2", "h,+ c #B9D4D9", "i,+ c #BAD4D7", "j,+ c #B8D0D5", "k,+ c #AAB7C3", "l,+ c #B5C6D2", "m,+ c #7776B9", "n,+ c #2D17B2", "o,+ c #16009C", "p,+ c #969DB4", "q,+ c #AAB4BE", "r,+ c #8C959F", "s,+ c #838891", "t,+ c #A9B4B6", "u,+ c #999EA1", "v,+ c #7F8E91", "w,+ c #758184", "x,+ c #A1B4BD", "y,+ c #8F9BA4", "z,+ c #BDCDD3", "A,+ c #9DACB6", "B,+ c #AEC4CA", "C,+ c #B4ADAD", "D,+ c #AB8484", "E,+ c #A15A62", "F,+ c #BE5063", "G,+ c #C76274", "H,+ c #B38188", "I,+ c #B79BA4", "J,+ c #BBA0AA", "K,+ c #B799A0", "L,+ c #BBA6AB", "M,+ c #BBB8BF", "N,+ c #AFC2C0", "O,+ c #7A7AB5", "P,+ c #2D17B1", "Q,+ c #B5C4C6", "R,+ c #ABB3BC", "S,+ c #B4C0C4", "T,+ c #9CA4A9", "U,+ c #829993", "V,+ c #6E847B", "W,+ c #8D9A9E", "X,+ c #8F9CA6", "Y,+ c #9FB5BF", "Z,+ c #94A5AA", "`,+ c #B5CCD4", " '+ c #AF8989", ".'+ c #B7434A", "+'+ c #CD1731", "@'+ c #D21233", "#'+ c #C41935", "$'+ c #B42239", "%'+ c #C23C51", "&'+ c #C33A51", "*'+ c #B52A40", "='+ c #C2515B", "-'+ c #C69093", ";'+ c #B8C1C6", ">'+ c #AFBFC8", ",'+ c #7A78BD", "''+ c #B4C4C5", ")'+ c #8B9AA1", "!'+ c #94A2A7", "~'+ c #98A6AF", "{'+ c #B0C4C9", "]'+ c #ACB6B9", "^'+ c #9C9D9C", "/'+ c #A5ADA7", "('+ c #B1C1BE", "_'+ c #B4C8CB", ":'+ c #91A2A2", "<'+ c #768683", "['+ c #9EAFB4", "}'+ c #A0B4BB", "|'+ c #B4CAD0", "1'+ c #909BA2", "2'+ c #BACBD4", "3'+ c #A7B5BF", "4'+ c #AEC5CA", "5'+ c #94A6AB", "6'+ c #94A2AA", "7'+ c #B7CDD7", "8'+ c #A56E72", "9'+ c #B31F2E", "0'+ c #D80223", "a'+ c #DF0026", "b'+ c #D70327", "c'+ c #D00428", "d'+ c #D30E2F", "e'+ c #D10A2D", "f'+ c #CA0425", "g'+ c #CE1F2D", "h'+ c #C86768", "i'+ c #AFBECB", "j'+ c #7976C1", "k'+ c #2B16B1", "l'+ c #9896B0", "m'+ c #B5C3C5", "n'+ c #7D8991", "o'+ c #BDCED2", "p'+ c #BDCED1", "q'+ c #98A2A7", "r'+ c #939FA3", "s'+ c #BCCBD4", "t'+ c #A7B3B3", "u'+ c #91938B", "v'+ c #A4AC9E", "w'+ c #B6C6BE", "x'+ c #B6C8CB", "y'+ c #868F93", "z'+ c #98ABAF", "A'+ c #9AAAB3", "B'+ c #94A4AA", "C'+ c #93A3AA", "D'+ c #B0BABD", "E'+ c #9A5964", "F'+ c #A51229", "G'+ c #CD0526", "H'+ c #E0022A", "I'+ c #E5022A", "J'+ c #E5042C", "K'+ c #DF0329", "L'+ c #DD0128", "M'+ c #DD0329", "N'+ c #D40720", "O'+ c #C84B53", "P'+ c #BEB0AF", "Q'+ c #9BA6B2", "R'+ c #7E7ABB", "S'+ c #3319AE", "T'+ c #B6C2C5", "U'+ c #9FA7B0", "V'+ c #9CAAAE", "W'+ c #96A6AB", "X'+ c #BAC4C5", "Y'+ c #97A2A6", "Z'+ c #919EA1", "`'+ c #6E747F", " )+ c #A8B6B3", ".)+ c #8D9180", "+)+ c #9AA298", "@)+ c #AEBCBE", "#)+ c #9BACB0", "$)+ c #A2B0BC", "%)+ c #96A3B0", "&)+ c #B4C1C5", "*)+ c #AE9C9E", "=)+ c #994351", "-)+ c #A00E29", ";)+ c #C50A2A", ">)+ c #DD052C", ",)+ c #E40029", "')+ c #E4012A", "))+ c #E20129", "!)+ c #E20028", "~)+ c #D4001F", "{)+ c #C8394F", "])+ c #C3A3A7", "^)+ c #BDC6CB", "/)+ c #818E96", "()+ c #9DAFB7", "_)+ c #B5C0C2", ":)+ c #8783B2", "<)+ c #3D23AB", "[)+ c #422F9B", "})+ c #C4D6DC", "|)+ c #6B757A", "1)+ c #626265", "2)+ c #606364", "3)+ c #6E767B", "4)+ c #8A969C", "5)+ c #B7C8CA", "6)+ c #BACBCE", "7)+ c #C4D3DA", "8)+ c #86A19C", "9)+ c #799A94", "0)+ c #A4C0C4", "a)+ c #B4CED5", "b)+ c #B3CDD6", "c)+ c #83828D", "d)+ c #B7CAD3", "e)+ c #A6B2AE", "f)+ c #8C917E", "g)+ c #9DA29F", "h)+ c #7D878B", "i)+ c #9CACB0", "j)+ c #A9B3BE", "k)+ c #98A0AC", "l)+ c #95A2A9", "m)+ c #B0D0D4", "n)+ c #B8ACB3", "o)+ c #C66271", "p)+ c #C02531", "q)+ c #C40A1C", "r)+ c #D60528", "s)+ c #E1032B", "t)+ c #E10129", "u)+ c #DB0429", "v)+ c #DF052B", "w)+ c #E3052B", "x)+ c #DD001F", "y)+ c #C92D4C", "z)+ c #B491A2", "A)+ c #BBBEC4", "B)+ c #BEC7CA", "C)+ c #7F8D94", "D)+ c #B9CBC6", "E)+ c #8A8AB5", "F)+ c #3920A8", "G)+ c #1B00AC", "H)+ c #B2C5C6", "I)+ c #99A4A9", "J)+ c #869195", "K)+ c #97A5A8", "L)+ c #838D92", "M)+ c #636568", "N)+ c #464748", "O)+ c #323536", "P)+ c #2B282E", "Q)+ c #252025", "R)+ c #221F23", "S)+ c #34333C", "T)+ c #A1B6BD", "U)+ c #A5BCC4", "V)+ c #A1B7BE", "W)+ c #ACB1B3", "X)+ c #B9A8A3", "Y)+ c #908479", "Z)+ c #857E73", "`)+ c #A39790", " !+ c #AB9C95", ".!+ c #B5A29E", "+!+ c #C2A9AA", "@!+ c #967D84", "#!+ c #8A8388", "$!+ c #ACBBBC", "%!+ c #A4B2AE", "&!+ c #A4A8A7", "*!+ c #9CACB1", "=!+ c #9BA6AF", "-!+ c #9DA5AE", ";!+ c #85919A", ">!+ c #B5D0D3", ",!+ c #B39BA3", "'!+ c #B83C51", ")!+ c #CD1223", "!!+ c #DE071C", "~!+ c #E10226", "{!+ c #E0012A", "]!+ c #DE032A", "^!+ c #D9052A", "/!+ c #D90529", "(!+ c #DD052B", "_!+ c #E0062C", ":!+ c #E3001E", "~+ c #5E453E", ",~+ c #9F6850", "'~+ c #C07857", ")~+ c #C26F60", "!~+ c #B85C4C", "~~+ c #AA4C2B", "{~+ c #915341", "]~+ c #7D574D", "^~+ c #72523F", "/~+ c #715E45", "(~+ c #7B6953", "_~+ c #886C59", ":~+ c #786554", "<~+ c #878371", "[~+ c #B0BBAA", "}~+ c #B8CBC7", "|~+ c #A7B6B2", "1~+ c #8C927E", "2~+ c #A7AFAB", "3~+ c #B0BFC3", "4~+ c #97A1A6", "5~+ c #A0B1B5", "6~+ c #BED0D6", "7~+ c #AAB5C2", "8~+ c #8B99A1", "9~+ c #9CACB4", "0~+ c #A0AEB9", "a~+ c #9FB1B7", "b~+ c #ABC6CF", "c~+ c #B2C1C4", "d~+ c #BDD3D8", "e~+ c #BCD2D5", "f~+ c #7D8489", "g~+ c #4C353B", "h~+ c #6C1E2D", "i~+ c #A91832", "j~+ c #D60A2E", "k~+ c #E3062C", "l~+ c #E2052B", "m~+ c #DF042A", "n~+ c #E10229", "o~+ c #E20024", "p~+ c #DC1834", "q~+ c #C75C62", "r~+ c #B8A7AC", "s~+ c #9DABB2", "t~+ c #C0D0D2", "u~+ c #8B8BC4", "v~+ c #341CA7", "w~+ c #839892", "x~+ c #48584F", "y~+ c #272726", "z~+ c #1F1C1A", "A~+ c #1E1F1D", "B~+ c #1C2023", "C~+ c #202221", "D~+ c #242422", "E~+ c #252226", "F~+ c #262029", "G~+ c #251E26", "H~+ c #221D22", "I~+ c #202022", "J~+ c #2A2125", "K~+ c #47252A", "L~+ c #813E2C", "M~+ c #B8582D", "N~+ c #D4632F", "O~+ c #C45A43", "P~+ c #AA5249", "Q~+ c #935540", "R~+ c #6D6350", "S~+ c #637063", "T~+ c #747C71", "U~+ c #7D8C80", "V~+ c #7A958A", "W~+ c #78968C", "X~+ c #869788", "Y~+ c #9EA899", "Z~+ c #B3C2B8", "`~+ c #B8C8C9", " {+ c #A7B6B4", ".{+ c #8E9484", "+{+ c #A7B0AF", "@{+ c #B6C4C7", "#{+ c #9DA6A8", "${+ c #7F858A", "%{+ c #B9C5CA", "&{+ c #B6C3C6", "*{+ c #ADBDC6", "={+ c #9AA8B5", "-{+ c #AFC6CE", ";{+ c #BCCECF", ">{+ c #B6B2B6", ",{+ c #A98896", "'{+ c #B48895", "){+ c #C4939F", "!{+ c #C1919C", "~{+ c #A4808D", "{{+ c #695963", "]{+ c #312E31", "^{+ c #3B262C", "/{+ c #6E2531", "({+ c #A41930", "_{+ c #CA0F2E", ":{+ c #DD072B", "<{+ c #E30229", "[{+ c #E30129", "}{+ c #DA042A", "|{+ c #DE0027", "1{+ c #DD0D2D", "2{+ c #D13E4B", "3{+ c #BC9AA2", "4{+ c #AFCFD5", "5{+ c #B0CFD4", "6{+ c #B1C9CE", "7{+ c #C0D2D5", "8{+ c #8D8EC7", "9{+ c #341DA9", "0{+ c #BFCBD1", "a{+ c #BAC4C6", "b{+ c #6D7373", "c{+ c #2F302F", "d{+ c #211E1A", "e{+ c #1E1E1E", "f{+ c #1B1F22", "g{+ c #1C2024", "h{+ c #252B2F", "i{+ c #292D2F", "j{+ c #27252A", "k{+ c #2C2441", "l{+ c #2F2845", "m{+ c #2A282F", "n{+ c #1B221D", "o{+ c #3D1F21", "p{+ c #85242F", "q{+ c #A24030", "r{+ c #AC532C", "s{+ c #AD542D", "t{+ c #77493C", "u{+ c #5C5055", "v{+ c #6A6A6B", "w{+ c #61786C", "x{+ c #788F81", "y{+ c #ABB1A8", "z{+ c #BABCB2", "A{+ c #B3BCB7", "B{+ c #AEC1C3", "C{+ c #B1C5C6", "D{+ c #A9B6B8", "E{+ c #939690", "F{+ c #AAB1B4", "G{+ c #B3C1C4", "H{+ c #99A0A2", "I{+ c #787779", "J{+ c #7B8085", "K{+ c #7E878F", "L{+ c #929599", "M{+ c #A9B2B3", "N{+ c #ADB6BB", "O{+ c #8B96A1", "P{+ c #9DA8AD", "Q{+ c #C1D6D7", "R{+ c #BD9BA3", "S{+ c #B1344A", "T{+ c #BE1B37", "U{+ c #CD2240", "V{+ c #CA223F", "W{+ c #B1213B", "X{+ c #732132", "Y{+ c #2F2429", "Z{+ c #28262A", "`{+ c #3B2B2E", " ]+ c #562C31", ".]+ c #911D2E", "+]+ c #C60C2A", "@]+ c #E20328", "#]+ c #E50129", "$]+ c #E0032A", "%]+ c #DB052A", "&]+ c #DA0128", "*]+ c #D90B2C", "=]+ c #CF2F46", "-]+ c #B88898", ";]+ c #ABC1CB", ">]+ c #ADC8CC", ",]+ c #B9C4D1", "']+ c #A0A9B4", ")]+ c #B7C1CC", "!]+ c #9EA9AF", "~]+ c #C6D7D4", "{]+ c #9293C5", "]]+ c #351EA8", "^]+ c #1B00AA", "/]+ c #BFCCD3", "(]+ c #57595C", "_]+ c #232022", ":]+ c #1D1D1D", "<]+ c #212225", "[]+ c #222125", "}]+ c #202024", "|]+ c #2A2C32", "1]+ c #39333D", "2]+ c #262654", "3]+ c #2D3264", "4]+ c #474D59", "5]+ c #223029", "6]+ c #4D2423", "7]+ c #B93C43", "8]+ c #C4533D", "9]+ c #A0492C", "0]+ c #853630", "a]+ c #735B57", "b]+ c #7D8C8A", "c]+ c #94A7AC", "d]+ c #8C9E97", "e]+ c #98A59A", "f]+ c #BBC3C1", "g]+ c #C3CACA", "h]+ c #BFC7CA", "i]+ c #A8B3B5", "j]+ c #949592", "k]+ c #A9B1B3", "l]+ c #7C8685", "m]+ c #5B615F", "n]+ c #474747", "o]+ c #434246", "p]+ c #3C3E44", "q]+ c #403D41", "r]+ c #464243", "s]+ c #514E4C", "t]+ c #656563", "u]+ c #7C797C", "v]+ c #8F8F95", "w]+ c #9FAAAB", "x]+ c #ACB8BB", "y]+ c #C1D5D7", "z]+ c #C49B9E", "A]+ c #C42E3A", "B]+ c #CC041F", "C]+ c #D80025", "D]+ c #DB0127", "E]+ c #CE0728", "F]+ c #9A142B", "G]+ c #542530", "H]+ c #232B33", "I]+ c #282D33", "J]+ c #6A1F2F", "K]+ c #B00F2B", "L]+ c #E40328", "M]+ c #E10329", "N]+ c #D51334", "O]+ c #C5465F", "P]+ c #BC7683", "Q]+ c #BD9597", "R]+ c #C0AEAF", "S]+ c #BEBFC3", "T]+ c #959EA8", "U]+ c #8D9398", "V]+ c #C4D4D0", "W]+ c #9290BD", "X]+ c #341EA0", "Y]+ c #1B00A7", "Z]+ c #9897B0", "`]+ c #BFCDD3", " ^+ c #7C8A8D", ".^+ c #545559", "+^+ c #262629", "@^+ c #1C1F22", "#^+ c #1F2125", "$^+ c #252428", "%^+ c #2C292F", "&^+ c #2E2C33", "*^+ c #3F3944", "=^+ c #32325A", "-^+ c #383F68", ";^+ c #4E5460", ">^+ c #2C3433", ",^+ c #49282A", "'^+ c #A04143", ")^+ c #A64E3C", "!^+ c #7F3C2D", "~^+ c #653139", "{^+ c #887D7F", "]^+ c #AEC1BB", "^^+ c #A3ADAC", "/^+ c #9FA9A6", "(^+ c #A7B3B4", "_^+ c #959592", ":^+ c #91999D", "<^+ c #444642", "[^+ c #2B2D28", "}^+ c #242325", "|^+ c #201F24", "1^+ c #1F1F23", "2^+ c #222024", "3^+ c #1F1C1D", "4^+ c #1B1613", "5^+ c #1D1913", "6^+ c #34302D", "7^+ c #4B4444", "8^+ c #5A5659", "9^+ c #777D7E", "0^+ c #9AA8A9", "a^+ c #B6C7C7", "b^+ c #ABBEC5", "c^+ c #9BA8AC", "d^+ c #A0AAAD", "e^+ c #B1C5CD", "f^+ c #BAD5D9", "g^+ c #C4A0A3", "h^+ c #CE3A45", "i^+ c #D90A27", "j^+ c #E1062B", "k^+ c #DF082C", "l^+ c #C2102F", "m^+ c #8E1F33", "n^+ c #572535", "o^+ c #342735", "p^+ c #342434", "q^+ c #6D1C2F", "r^+ c #AD102B", "s^+ c #D7052A", "t^+ c #E10228", "u^+ c #DD0429", "v^+ c #DA052A", "w^+ c #DA0428", "x^+ c #D61233", "y^+ c #D42C45", "z^+ c #D34C5A", "A^+ c #CF6372", "B^+ c #C98691", "C^+ c #C0AEB1", "D^+ c #B1BFC1", "E^+ c #AEC2C9", "F^+ c #B6B9BD", "G^+ c #A3A4A4", "H^+ c #8D9698", "I^+ c #A2B3B6", "J^+ c #C3D2CD", "K^+ c #908DB8", "L^+ c #331D99", "M^+ c #1B00A3", "N^+ c #BFCED5", "O^+ c #A1B4B3", "P^+ c #738B81", "Q^+ c #94ABAB", "R^+ c #5E6065", "S^+ c #36353A", "T^+ c #1F2226", "U^+ c #191D21", "V^+ c #25282C", "W^+ c #2D2C33", "X^+ c #35333B", "Y^+ c #454251", "Z^+ c #494855", "`^+ c #414045", " /+ c #312E36", "./+ c #3C2A33", "+/+ c #573236", "@/+ c #5B3432", "#/+ c #4D3031", "$/+ c #4A3F44", "%/+ c #B6CECF", "&/+ c #B7CDD2", "*/+ c #9FADB0", "=/+ c #797F82", "-/+ c #515154", ";/+ c #323033", ">/+ c #252220", ",/+ c #201E1B", "'/+ c #1D1C1F", ")/+ c #1A1C22", "!/+ c #1D1F23", "~/+ c #222124", "{/+ c #211E1C", "]/+ c #1D1A15", "^/+ c #1E1B15", "//+ c #2B2A25", "(/+ c #312E2E", "_/+ c #2D2B2E", ":/+ c #323434", "(+ c #A8BEBA", ",(+ c #A6B3BD", "'(+ c #B7C3CC", ")(+ c #97A7AE", "!(+ c #B8B8C2", "~(+ c #BA8790", "{(+ c #CC3F4C", "](+ c #DB1028", "^(+ c #DE0227", "/(+ c #E1032A", "((+ c #E4052B", "_(+ c #E0052B", ":(+ c #CC082A", "<(+ c #B70E2D", "[(+ c #AD1230", "}(+ c #BE0E2C", "|(+ c #D10929", "1(+ c #DC0429", "2(+ c #E1022A", "3(+ c #DD042A", "4(+ c #DE0329", "5(+ c #E10128", "6(+ c #D60024", "7(+ c #C93A4F", "8(+ c #C4999D", "9(+ c #B7BEC5", "0(+ c #B2C2CD", "a(+ c #B7C4CB", "b(+ c #B6BEC3", "c(+ c #A4A9AC", "d(+ c #8D979A", "e(+ c #A1B1B4", "f(+ c #8F8EC3", "g(+ c #3B22A8", "h(+ c #16009F", "i(+ c #412E9E", "j(+ c #8C95B1", "k(+ c #AAB5B4", "l(+ c #8C8F83", "m(+ c #A1ABAA", "n(+ c #A3B6B8", "o(+ c #778B81", "p(+ c #6C7A78", "q(+ c #525B5F", "r(+ c #282D2F", "s(+ c #191E20", "t(+ c #1B1D21", "u(+ c #212125", "v(+ c #35363A", "w(+ c #39393D", "x(+ c #2A2A2C", "y(+ c #201F22", "z(+ c #2C2C31", "A(+ c #3F4348", "B(+ c #35373E", "C(+ c #343539", "D(+ c #212224", "E(+ c #242427", "F(+ c #5B595C", "G(+ c #8E9094", "H(+ c #9EA9AD", "I(+ c #A9B6B6", "J(+ c #8F9485", "K(+ c #A5AFAB", "L(+ c #8B898C", "M(+ c #514649", "N(+ c #252125", "O(+ c #1E1D20", "P(+ c #222122", "Q(+ c #232023", "R(+ c #222025", "S(+ c #222123", "T(+ c #24211F", "U(+ c #262120", "V(+ c #251F20", "W(+ c #241C1E", "X(+ c #231B1F", "Y(+ c #211C20", "Z(+ c #231D20", "`(+ c #2A2225", " _+ c #2B2426", "._+ c #2A2728", "+_+ c #453E46", "@_+ c #5C6E65", "#_+ c #92A7A5", "$_+ c #9DA7B2", "%_+ c #B5B9B9", "&_+ c #C06C6A", "*_+ c #D22531", "=_+ c #E30428", "-_+ c #E6032B", ";_+ c #E4072A", ">_+ c #E20523", ",_+ c #E60224", "'_+ c #E0052A", ")_+ c #D40B2C", "!_+ c #D6082B", "~_+ c #DC0529", "{_+ c #DC042A", "]_+ c #DB042A", "^_+ c #DF0229", "/_+ c #DC042B", "(_+ c #DC0427", "__+ c #DE0A28", ":_+ c #D52C44", "<_+ c #C6717E", "[_+ c #B7BEC2", "}_+ c #8C9699", "|_+ c #BCD0D3", "1_+ c #9194C8", "2_+ c #4129B1", "3_+ c #1700A5", "4_+ c #422FA3", "5_+ c #9298B1", "6_+ c #ABB8BB", "7_+ c #90948F", "8_+ c #818889", "9_+ c #666F72", "0_+ c #3E4442", "a_+ c #242829", "b_+ c #1B1F24", "c_+ c #1C1F23", "d_+ c #212528", "e_+ c #212428", "f_+ c #252327", "g_+ c #2A292D", "h_+ c #34343B", "i_+ c #363635", "j_+ c #2C2A2C", "k_+ c #1D2024", "l_+ c #37373E", "m_+ c #65666B", "n_+ c #7C8181", "o_+ c #AEBBB1", "p_+ c #BCCDD6", "q_+ c #949590", "r_+ c #796C6F", "s_+ c #3E282A", "t_+ c #231C20", "u_+ c #201E1C", "v_+ c #221D1B", "w_+ c #221C1D", "x_+ c #1F1E22", "y_+ c #202228", "z_+ c #272630", "A_+ c #322E30", "B_+ c #30282A", "C_+ c #271F22", "D_+ c #221F1B", "E_+ c #241E20", "F_+ c #24211E", "G_+ c #302829", "H_+ c #383236", "I_+ c #9EB1B8", "J_+ c #B1C7CC", "K_+ c #A0AFB9", "L_+ c #BBC0C4", "M_+ c #B27E7D", "N_+ c #BB3640", "O_+ c #D6092A", "P_+ c #E3032C", "Q_+ c #E00926", "R_+ c #D90B1A", "S_+ c #DC0621", "T_+ c #DE052B", "U_+ c #DB062A", "V_+ c #DA0629", "W_+ c #DF022A", "X_+ c #E1012A", "Y_+ c #DB0229", "Z_+ c #D70826", "`_+ c #D12431", " :+ c #CC6F75", ".:+ c #C2ADB2", "+:+ c #9EA7A9", "@:+ c #C0D4D0", "#:+ c #949AC5", "$:+ c #432DB1", "%:+ c #1700A0", "&:+ c #432F9C", "*:+ c #9696AA", "=:+ c #BDCED5", "-:+ c #7D7F87", ";:+ c #9EA3AB", ">:+ c #A2A8A8", ",:+ c #7F8387", "':+ c #6C7174", "):+ c #696C6C", "!:+ c #4D5255", "~:+ c #31363B", "{:+ c #232429", "]:+ c #1C1E23", "^:+ c #1B1B21", "/:+ c #1F1C1F", "(:+ c #242122", "_:+ c #272728", "::+ c #2F3237", "<:+ c #31353A", "[:+ c #2E2E2E", "}:+ c #272421", "|:+ c #201E1F", "1:+ c #202029", "2:+ c #26252C", "3:+ c #56535A", "4:+ c #929199", "5:+ c #80827C", "6:+ c #777A69", "7:+ c #939A87", "8:+ c #AFBBAD", "9:+ c #B9C8C5", "0:+ c #C2CBCD", "a:+ c #B1B2AB", "b:+ c #909182", "c:+ c #A6ADA6", "d:+ c #BBC8CC", "e:+ c #676063", "f:+ c #302123", "g:+ c #221D1C", "h:+ c #211F19", "i:+ c #26221E", "j:+ c #2E2A2B", "k:+ c #2F3537", "l:+ c #2A3546", "m:+ c #283051", "n:+ c #2F3146", "o:+ c #424046", "p:+ c #4F4C4F", "q:+ c #332E32", "r:+ c #1F191C", "s:+ c #201B1D", "t:+ c #221D21", "u:+ c #211B20", "v:+ c #231F21", "w:+ c #332F33", "x:+ c #545058", "y:+ c #838990", "z:+ c #B6CAD5", "A:+ c #A9B6C1", "B:+ c #A4B4BC", "C:+ c #84939B", "D:+ c #859199", "E:+ c #AABFC6", "F:+ c #B3BBC2", "G:+ c #786C6D", "H:+ c #692A32", "I:+ c #97112B", "J:+ c #BE0C2E", "K:+ c #D40A28", "L:+ c #E00822", "M:+ c #E40225", "N:+ c #E40129", "O:+ c #D9062A", "P:+ c #DA0429", "Q:+ c #E20029", "R:+ c #E2022A", "S:+ c #E30029", "T:+ c #DB001E", "U:+ c #CC1C36", "V:+ c #BD6F73", "W:+ c #BBAEAD", "X:+ c #B9C6CA", "Y:+ c #8C979D", "Z:+ c #A4B2BB", "`:+ c #C2D6D0", " <+ c #969CC4", ".<+ c #432DB0", "+<+ c #2201AD", "@<+ c #432F99", "#<+ c #9694A5", "$<+ c #A1AEB3", "%<+ c #7A7F7F", "&<+ c #6C6D6E", "*<+ c #6C7177", "=<+ c #44474C", "-<+ c #29272B", ";<+ c #1F1D21", "><+ c #1F1B1F", ",<+ c #211B1C", "'<+ c #201819", ")<+ c #211C1D", "!<+ c #262427", "~<+ c #292C30", "{<+ c #272B2E", "]<+ c #232326", "^<+ c #201D1A", "/<+ c #201E1D", "(<+ c #2B2932", "_<+ c #3F4147", ":<+ c #CDCCD3", "<<+ c #C0C1B9", "[<+ c #949883", "}<+ c #838770", "|<+ c #A3AD99", "1<+ c #BBCAC0", "2<+ c #C3C8C8", "3<+ c #B1B2A6", "4<+ c #929682", "5<+ c #A6AFA7", "6<+ c #BAC8CB", "7<+ c #A6AFAF", "8<+ c #585758", "9<+ c #241E1F", "0<+ c #201B17", "a<+ c #201D17", "b<+ c #282521", "c<+ c #373838", "d<+ c #3C4851", "e<+ c #334666", "f<+ c #292C4C", "g<+ c #46454E", "h<+ c #67676B", "i<+ c #444043", "j<+ c #231B21", "k<+ c #221C21", "l<+ c #231E21", "m<+ c #211C1E", "n<+ c #211C1F", "o<+ c #252222", "p<+ c #373236", "q<+ c #8A9499", "r<+ c #B8CCD6", "s<+ c #8C9AA1", "t<+ c #301F25", "u<+ c #531D2C", "v<+ c #7F1E2F", "w<+ c #A3142C", "x<+ c #BF0A2B", "y<+ c #CF092C", "z<+ c #D9082C", "A<+ c #E0042A", "B<+ c #E10127", "C<+ c #DD052A", "D<+ c #E4032A", "E<+ c #E6022A", "F<+ c #E40027", "G<+ c #DC0328", "H<+ c #CF1433", "I<+ c #BF5565", "J<+ c #B2AAAC", "K<+ c #B2C9CA", "L<+ c #8D979D", "M<+ c #C0D6D0", "N<+ c #959BC4", "O<+ c #2201B0", "P<+ c #1F00B3", "Q<+ c #2101AF", "R<+ c #1700A6", "S<+ c #442EA0", "T<+ c #9694A6", "U<+ c #B4C0C2", "V<+ c #B7C7CB", "W<+ c #7E857D", "X<+ c #696D66", "Y<+ c #7E858A", "Z<+ c #48484B", "`<+ c #201C1F", " [+ c #221B1B", ".[+ c #231E22", "+[+ c #242226", "@[+ c #262529", "#[+ c #2A282B", "$[+ c #302F30", "%[+ c #393739", "&[+ c #7B8488", "*[+ c #B8C2C6", "=[+ c #ECEDEF", "-[+ c #F5F5F3", ";[+ c #C9CCC2", ">[+ c #90937F", ",[+ c #A1AB97", "'[+ c #BAC8BF", ")[+ c #B1B8B3", "![+ c #9DA499", "~[+ c #ABB8B4", "{[+ c #B7C5C6", "][+ c #A0A8A1", "^[+ c #515251", "/[+ c #201D1F", "([+ c #1E1B18", "_[+ c #292720", ":[+ c #383D39", "<[+ c #3A4B5B", "[[+ c #344772", "}[+ c #2E3870", "|[+ c #242544", "1[+ c #414049", "2[+ c #6C6D70", "3[+ c #4E484B", "4[+ c #2A2326", "5[+ c #242025", "6[+ c #232120", "7[+ c #221F1A", "8[+ c #2A2524", "9[+ c #32292F", "0[+ c #392E3B", "a[+ c #443B40", "b[+ c #A8B3B9", "c[+ c #8B989E", "d[+ c #838C95", "e[+ c #525155", "f[+ c #272427", "g[+ c #2C2B30", "h[+ c #443033", "i[+ c #602631", "j[+ c #7C1A31", "k[+ c #961E31", "l[+ c #B11C31", "m[+ c #D8072B", "n[+ c #E00229", "o[+ c #E2082C", "p[+ c #E3072C", "q[+ c #E6072D", "r[+ c #D70427", "s[+ c #BB0E2B", "t[+ c #B05260", "u[+ c #AF979B", "v[+ c #B0C0C2", "w[+ c #8C979B", "x[+ c #A2B2B7", "y[+ c #2101B3", "z[+ c #1E00B7", "A[+ c #1800A6", "B[+ c #422DA4", "C[+ c #8F93AE", "D[+ c #BCCCCF", "E[+ c #A9B2B2", "F[+ c #A1ADAF", "G[+ c #848B8A", "H[+ c #616262", "I[+ c #5E6064", "J[+ c #545857", "K[+ c #3E403F", "L[+ c #29282A", "M[+ c #221F22", "N[+ c #211E1F", "O[+ c #211E20", "P[+ c #2C292E", "Q[+ c #2C2A2F", "R[+ c #151215", "S[+ c #363336", "T[+ c #D3D7D8", "U[+ c #EAEFF0", "V[+ c #F4F9F9", "W[+ c #FFFFFF", "X[+ c #EFEAEA", "Y[+ c #C8BDB7", "Z[+ c #AEAEA4", "`[+ c #AAB8B1", " }+ c #B0BDBF", ".}+ c #A6ABAA", "+}+ c #AFBABD", "@}+ c #BDCBCE", "#}+ c #B0BBBB", "$}+ c #5A6262", "%}+ c #192122", "&}+ c #0E1615", "*}+ c #101514", "=}+ c #212522", "-}+ c #3A403B", ";}+ c #344147", ">}+ c #2A344A", ",}+ c #2A2D4A", "'}+ c #353546", ")}+ c #403D42", "!}+ c #272226", "~}+ c #292526", "{}+ c #2D2626", "]}+ c #2B2628", "^}+ c #262227", "/}+ c #282329", "(}+ c #474247", "_}+ c #AEB8BE", ":}+ c #C0CBD3", "<}+ c #A4B6BD", "[}+ c #A9B9BD", "}}+ c #72797D", "|}+ c #444241", "1}+ c #302D2E", "2}+ c #2F3136", "3}+ c #353337", "4}+ c #413438", "5}+ c #4F3538", "6}+ c #4D2F2F", "7}+ c #5F2529", "8}+ c #881A2C", "9}+ c #AF183D", "0}+ c #BD163F", "a}+ c #BD1330", "b}+ c #C60D29", "c}+ c #CF0828", "d}+ c #CF0A29", "e}+ c #CD133C", "f}+ c #A8133F", "g}+ c #73173B", "h}+ c #765663", "i}+ c #949A9B", "j}+ c #AFC3C5", "k}+ c #858F97", "l}+ c #9BA2A4", "m}+ c #8C9598", "n}+ c #A2B3B7", "o}+ c #C0D5D0", "p}+ c #959DC2", "q}+ c #4433AA", "r}+ c #2203AC", "s}+ c #1800A4", "t}+ c #422FA5", "u}+ c #8D94B2", "v}+ c #B0C1C5", "w}+ c #ADB5B3", "x}+ c #979692", "y}+ c #A6B0B1", "z}+ c #838C92", "A}+ c #3D3B40", "B}+ c #353837", "C}+ c #2D3230", "D}+ c #242528", "E}+ c #27262B", "F}+ c #28262B", "G}+ c #2B292E", "H}+ c #67676A", "I}+ c #525254", "J}+ c #777577", "K}+ c #F3F2F2", "L}+ c #FCFCFC", "M}+ c #FBFBFB", "N}+ c #FDFDFD", "O}+ c #FDFEFE", "P}+ c #F8FCFC", "Q}+ c #FCFEFE", "R}+ c #FDF8FA", "S}+ c #EDDFE1", "T}+ c #B1AEA3", "U}+ c #98A399", "V}+ c #AEC0C2", "W}+ c #A3A8AA", "X}+ c #AFB9BC", "Y}+ c #7F8882", "Z}+ c #584C3D", "`}+ c #533422", " |+ c #4B2C1D", ".|+ c #3C2E24", "+|+ c #303530", "@|+ c #303838", "#|+ c #303337", "$|+ c #2C2C33", "%|+ c #2D2D32", "&|+ c #222126", "*|+ c #252326", "=|+ c #2E272C", "-|+ c #33282B", ";|+ c #302728", ">|+ c #262225", ",|+ c #5F5F63", "'|+ c #6B6B70", ")|+ c #8F969D", "!|+ c #87939B", "~|+ c #A5B9BD", "{|+ c #BDD2DA", "]|+ c #9DACB0", "^|+ c #5D6061", "/|+ c #393936", "(|+ c #323130", "_|+ c #373036", ":|+ c #383138", "<|+ c #3E3B47", "[|+ c #48485D", "}|+ c #3F474D", "||+ c #463F3D", "1|+ c #60363F", "2|+ c #792E4C", "3|+ c #892E4C", "4|+ c #90323E", "5|+ c #932535", "6|+ c #941B31", "7|+ c #911B32", "8|+ c #8D2443", "9|+ c #762D55", "0|+ c #573961", "a|+ c #5C586B", "b|+ c #838D91", "c|+ c #9DA0A3", "d|+ c #8B9599", "e|+ c #A2B4B8", "f|+ c #BFD4D1", "g|+ c #989FC0", "h|+ c #4939A3", "i|+ c #2507A8", "j|+ c #432FA6", "k|+ c #9298B2", "l|+ c #ABB7B8", "m|+ c #969692", "n|+ c #78838A", "o|+ c #404348", "p|+ c #29262B", "q|+ c #212325", "r|+ c #1D2124", "s|+ c #1D2125", "t|+ c #2E2F36", "u|+ c #37363D", "v|+ c #C5C6C8", "w|+ c #D5D5D6", "x|+ c #C6C7C8", "y|+ c #EFEFEF", "z|+ c #FFFFFE", "A|+ c #FEFEFE", "B|+ c #F2F1F0", "C|+ c #AAAC9B", "D|+ c #8F9787", "E|+ c #ACBDBF", "F|+ c #ABB4B8", "G|+ c #B5AC97", "H|+ c #BE865B", "I|+ c #C86536", "J|+ c #B4562F", "K|+ c #753F28", "L|+ c #302720", "M|+ c #343737", "N|+ c #403F42", "O|+ c #343335", "P|+ c #302F31", "Q|+ c #262428", "R|+ c #2E282C", "S|+ c #2F2627", "T|+ c #27221F", "U|+ c #2B2526", "V|+ c #2F272A", "W|+ c #30282B", "X|+ c #373336", "Y|+ c #444445", "Z|+ c #545556", "`|+ c #62696C", " 1+ c #839196", ".1+ c #A8B7BB", "+1+ c #BED2D7", "@1+ c #5E6063", "#1+ c #3A3A37", "$1+ c #312E2D", "%1+ c #322C32", "&1+ c #3A3336", "*1+ c #47405D", "=1+ c #585190", "-1+ c #5D5F81", ";1+ c #5F6268", ">1+ c #5F5860", ",1+ c #4F4151", "'1+ c #543E48", ")1+ c #69484A", "!1+ c #5C3F46", "~1+ c #493542", "{1+ c #443342", "]1+ c #45333F", "^1+ c #52455B", "/1+ c #646386", "(1+ c #636C80", "_1+ c #9DA6B0", ":1+ c #B5BDC0", "<1+ c #A4A6AB", "[1+ c #A1B3B8", "}1+ c #BFD3D2", "|1+ c #9BA3BE", "11+ c #5542A0", "21+ c #2A0BAA", "31+ c #1E00BB", "41+ c #1300A8", "51+ c #3D2DAA", "61+ c #8E95B3", "71+ c #B1C2C4", "81+ c #ACB7B9", "91+ c #959691", "01+ c #A5AFB0", "a1+ c #636E75", "b1+ c #2C3032", "c1+ c #201F1D", "d1+ c #1C1E20", "e1+ c #1A1E22", "f1+ c #212227", "g1+ c #35333A", "h1+ c #4C4A51", "i1+ c #67676F", "j1+ c #9C999C", "k1+ c #D4D1D0", "l1+ c #F8F7F7", "m1+ c #FAFBFB", "n1+ c #F7F8F8", "o1+ c #FEFDFD", "p1+ c #FEFFFE", "q1+ c #F5F6F5", "r1+ c #B1B5A9", "s1+ c #949F95", "t1+ c #ABBEC4", "u1+ c #B5CCD1", "v1+ c #A6B6B8", "w1+ c #959796", "x1+ c #A9B1B4", "y1+ c #B2C7D4", "z1+ c #BBBCC6", "A1+ c #D89B7E", "B1+ c #DB7843", "C1+ c #C26030", "D1+ c #AF5631", "E1+ c #984D2D", "F1+ c #764026", "G1+ c #47342E", "H1+ c #2C2D32", "I1+ c #2B292D", "J1+ c #2A282A", "K1+ c #2B2B2E", "L1+ c #313036", "M1+ c #3E2E33", "N1+ c #39282B", "O1+ c #282327", "P1+ c #2D262A", "Q1+ c #252122", "R1+ c #292527", "S1+ c #2E2A2C", "T1+ c #2C2A2D", "U1+ c #3C3C3B", "V1+ c #4D4D4E", "W1+ c #767B80", "X1+ c #8C99A2", "Y1+ c #838F95", "Z1+ c #BECDD0", "`1+ c #A1ACAD", " 2+ c #626465", ".2+ c #3B3737", "+2+ c #454240", "@2+ c #58526E", "#2+ c #5B52A2", "$2+ c #425496", "%2+ c #435C7A", "&2+ c #5C5F6A", "*2+ c #383440", "=2+ c #3F323C", "-2+ c #31343A", ";2+ c #31353D", ">2+ c #33353E", ",2+ c #3E4454", "'2+ c #515B75", ")2+ c #536274", "!2+ c #75858E", "~2+ c #B8C0C2", "{2+ c #A6A8AD", "]2+ c #BCD1D3", "^2+ c #9FAAC1", "/2+ c #6255A4", "(2+ c #3014AF", "_2+ c #1E00B6", ":2+ c #1400A9", "<2+ c #3C2BA9", "[2+ c #8B91B1", "}2+ c #ADB8B9", "|2+ c #969895", "12+ c #A7B1B3", "22+ c #4B555B", "32+ c #242828", "42+ c #201E19", "52+ c #202020", "62+ c #1E2125", "72+ c #232227", "82+ c #353436", "92+ c #505155", "02+ c #919195", "a2+ c #F3F4F3", "b2+ c #FFFEFF", "c2+ c #F7F7F8", "d2+ c #C2C5BE", "e2+ c #A7AFA9", "f2+ c #939590", "g2+ c #A9B0B0", "h2+ c #ADD0D7", "i2+ c #B7C3C6", "j2+ c #CD9F96", "k2+ c #D5714C", "l2+ c #C75528", "m2+ c #B24E2F", "n2+ c #B45531", "o2+ c #BC5832", "p2+ c #AD5034", "q2+ c #59342D", "r2+ c #1E2024", "s2+ c #191C21", "t2+ c #26272C", "u2+ c #33343C", "v2+ c #413235", "w2+ c #3D2A2D", "x2+ c #2D282A", "y2+ c #2D282B", "z2+ c #2B2A2C", "A2+ c #2D2B2D", "B2+ c #292829", "C2+ c #2E2D2C", "D2+ c #393B3A", "E2+ c #616569", "F2+ c #B3BEC2", "G2+ c #ABB8BA", "H2+ c #97A1A7", "I2+ c #AABCC0", "J2+ c #8FA2A3", "K2+ c #86949B", "L2+ c #C1CDD0", "M2+ c #A1A9AB", "N2+ c #393237", "O2+ c #2E252A", "P2+ c #2F2B2F", "Q2+ c #454744", "R2+ c #605B6B", "S2+ c #6C5E93", "T2+ c #4B5E94", "U2+ c #435E7F", "V2+ c #585966", "W2+ c #383944", "X2+ c #37363F", "Y2+ c #33353B", "Z2+ c #34373B", "`2+ c #38383D", " 3+ c #352F38", ".3+ c #3E3C49", "+3+ c #4F5969", "@3+ c #4C5C68", "#3+ c #6F7D86", "$3+ c #BDC8CF", "%3+ c #B9BEC3", "&3+ c #A2B0C3", "*3+ c #6A64A9", "=3+ c #341AAF", "-3+ c #1800A8", ";3+ c #402CA3", ">3+ c #8B90AA", ",3+ c #AAB2B6", "'3+ c #9FA8AD", ")3+ c #66696C", "!3+ c #262A2B", "~3+ c #242222", "{3+ c #212226", "]3+ c #1F2126", "^3+ c #2E3230", "/3+ c #444746", "(3+ c #B7BFC0", "_3+ c #F1F3F3", ":3+ c #F8F7F8", "<3+ c #D2D3CE", "[3+ c #BDBCB4", "}3+ c #BEBFB8", "|3+ c #BBC5C7", "13+ c #B7CDD3", "23+ c #A8B7B9", "33+ c #A9AEAB", "43+ c #AFCFCF", "53+ c #C3B29D", "63+ c #D8794F", "73+ c #BC582D", "83+ c #B15338", "93+ c #C85B4B", "03+ c #D9663E", "a3+ c #D4633B", "b3+ c #B7554A", "c3+ c #734B4B", "d3+ c #3E3F40", "e3+ c #293134", "f3+ c #28282F", "g3+ c #303137", "h3+ c #3A3F45", "i3+ c #3A383C", "j3+ c #353133", "k3+ c #312F31", "l3+ c #2C2B2D", "m3+ c #302F32", "n3+ c #313130", "o3+ c #322F2D", "p3+ c #302A2C", "q3+ c #2C292B", "r3+ c #2A292A", "s3+ c #262B2D", "t3+ c #40454A", "u3+ c #727579", "v3+ c #979D98", "w3+ c #9AA39E", "x3+ c #97A7A5", "y3+ c #738C81", "z3+ c #889390", "A3+ c #A7ADB2", "B3+ c #87969E", "C3+ c #C2D1D6", "D3+ c #565761", "E3+ c #362F3B", "F3+ c #312730", "G3+ c #312F2E", "H3+ c #3B3D3E", "I3+ c #5B5357", "J3+ c #806B73", "K3+ c #7C7785", "L3+ c #666B7B", "M3+ c #55525E", "N3+ c #4E474C", "O3+ c #534E4C", "P3+ c #5A5B52", "Q3+ c #53504C", "R3+ c #4D4748", "S3+ c #4E4648", "T3+ c #473335", "U3+ c #534044", "V3+ c #69696E", "W3+ c #5A6269", "X3+ c #71797F", "Y3+ c #AEB8BA", "Z3+ c #B8BFC3", "`3+ c #A0B2BA", " 4+ c #BED1D1", ".4+ c #A2AFC2", "+4+ c #6962A8", "@4+ c #3419AB", "#4+ c #1600A5", "$4+ c #442DA1", "%4+ c #9292A7", "&4+ c #B3C0C0", "*4+ c #9A9CA0", "=4+ c #A9B2B8", "-4+ c #B9CDD6", ";4+ c #889294", ">4+ c #5A6060", ",4+ c #44484A", "'4+ c #2D3236", ")4+ c #1E2326", "!4+ c #1B1E1F", "~4+ c #232124", "{4+ c #232226", "]4+ c #252829", "^4+ c #2D2D2F", "/4+ c #B8BEC5", "(4+ c #F3F4F5", "_4+ c #D5D4CE", ":4+ c #B7B7AD", "<4+ c #ADB0A7", "[4+ c #B3BEB5", "}4+ c #B7C8C3", "|4+ c #A8B8BC", "14+ c #8F9899", "24+ c #A7AEAD", "34+ c #BBC6C9", "44+ c #B3CCD3", "54+ c #CDAA91", "64+ c #D17747", "74+ c #BD5224", "84+ c #AE795A", "94+ c #B4A295", "04+ c #C0A3A1", "a4+ c #A07663", "b4+ c #966B53", "c4+ c #B08B83", "d4+ c #BCABAB", "e4+ c #B6B8B8", "f4+ c #ACB3B4", "g4+ c #A4A6A8", "h4+ c #9F9EA2", "i4+ c #4E4F52", "j4+ c #313133", "k4+ c #2E2F31", "l4+ c #303033", "m4+ c #312C2E", "n4+ c #322F2E", "o4+ c #33322D", "p4+ c #2D2C2B", "q4+ c #29292B", "r4+ c #2A292B", "s4+ c #2C2B2C", "t4+ c #313334", "u4+ c #404548", "v4+ c #6A6E6D", "w4+ c #787D7C", "x4+ c #BECFD5", "y4+ c #BCC4CA", "z4+ c #9A9EA2", "A4+ c #6E7474", "B4+ c #545E59", "C4+ c #717473", "D4+ c #8B99A3", "E4+ c #ACBFC8", "F4+ c #3D3942", "G4+ c #342930", "H4+ c #3F2E2F", "I4+ c #3E3539", "J4+ c #463F44", "K4+ c #564C4B", "L4+ c #585253", "M4+ c #4D4F58", "N4+ c #714C42", "O4+ c #9A583B", "P4+ c #B16842", "Q4+ c #B1663F", "R4+ c #AB5B43", "S4+ c #A55851", "T4+ c #A06F5E", "U4+ c #8A715B", "V4+ c #6B5D52", "W4+ c #5E5A5D", "X4+ c #7D8388", "Y4+ c #AEBDC0", "Z4+ c #B9C4CF", "`4+ c #A1A9B3", " 5+ c #B2BEC0", ".5+ c #A0A8AB", "+5+ c #BED5D1", "@5+ c #9DA7BF", "#5+ c #5B4BA1", "$5+ c #1600A4", "%5+ c #442FA3", "&5+ c #9695AA", "*5+ c #B3C2C0", "=5+ c #989B9B", "-5+ c #92A0A4", ";5+ c #575E5E", ">5+ c #363B3B", ",5+ c #363A3F", "'5+ c #252A2F", ")5+ c #1D2023", "!5+ c #232629", "~5+ c #212328", "{5+ c #222227", "]5+ c #1F1C22", "^5+ c #292830", "/5+ c #797C85", "(5+ c #CCCFD5", "_5+ c #F7F8F9", ":5+ c #FEFEFD", "<5+ c #FDFDFE", "[5+ c #F7F7F7", "}5+ c #E1E0DD", "|5+ c #979F91", "15+ c #ACB4A5", "25+ c #BECAC1", "35+ c #8F989A", "45+ c #A6AFAE", "55+ c #B7C1C4", "65+ c #CB8168", "75+ c #C55931", "85+ c #AB6849", "95+ c #B0A893", "05+ c #BCD4CD", "a5+ c #B5CFD4", "b5+ c #7C8886", "c5+ c #7D8279", "d5+ c #C1C5BD", "e5+ c #EFF1EE", "f5+ c #F8FAF9", "g5+ c #F1F2F3", "h5+ c #E1E0E6", "i5+ c #C2C1C6", "j5+ c #7E7F82", "k5+ c #353435", "l5+ c #332C2C", "m5+ c #3D3437", "n5+ c #382E34", "o5+ c #342E30", "p5+ c #343230", "q5+ c #343332", "r5+ c #2F2C2E", "s5+ c #28282A", "t5+ c #2E2E2D", "u5+ c #2D302F", "v5+ c #2C3134", "w5+ c #46474C", "x5+ c #56585D", "y5+ c #A8B1B5", "z5+ c #A1A3A1", "A5+ c #78797B", "B5+ c #4E5054", "C5+ c #9CA3A8", "D5+ c #ADBFC7", "E5+ c #898E91", "F5+ c #36292D", "G5+ c #482B2F", "H5+ c #3F2D34", "I5+ c #312C34", "J5+ c #312F34", "K5+ c #342A2E", "L5+ c #3B3138", "M5+ c #4D464C", "N5+ c #734C3E", "O5+ c #AA5430", "P5+ c #DD652F", "Q5+ c #E96C30", "R5+ c #E46739", "S5+ c #DF644A", "T5+ c #E18A62", "U5+ c #B1815B", "V5+ c #685043", "W5+ c #655D5C", "X5+ c #8B9193", "Y5+ c #AFBFC2", "Z5+ c #9DA9AE", "`5+ c #BED4D1", " 6+ c #9DA6BE", ".6+ c #5A49A1", "+6+ c #2C0EAE", "@6+ c #1E00B9", "#6+ c #1700A4", "$6+ c #432FA5", "%6+ c #B3C3C3", "&6+ c #959793", "*6+ c #A8B0B2", "=6+ c #929EA1", "-6+ c #525A57", ";6+ c #424A4A", ">6+ c #42464C", ",6+ c #35363D", "'6+ c #222429", ")6+ c #222528", "!6+ c #323235", "~6+ c #2F2F30", "{6+ c #2A292C", "]6+ c #2A292F", "^6+ c #201F25", "/6+ c #33323D", "(6+ c #979BA0", "_6+ c #E7EBEB", ":6+ c #FCFCFD", "<6+ c #F8F8F7", "[6+ c #CED1C8", "}6+ c #939784", "|6+ c #A8A99A", "16+ c #939793", "26+ c #A9ADAB", "36+ c #BAC7C8", "46+ c #AD7370", "56+ c #AD6F67", "66+ c #B2AA9C", "76+ c #B6C7B6", "86+ c #BBCEC6", "96+ c #909999", "06+ c #9DA09B", "a6+ c #DDE1DE", "b6+ c #F9FBFA", "c6+ c #FAFEFE", "d6+ c #E9E8EA", "e6+ c #A0A1A1", "f6+ c #41403E", "g6+ c #3B2A28", "h6+ c #493337", "i6+ c #423741", "j6+ c #363038", "k6+ c #342E34", "l6+ c #342D30", "m6+ c #2F282B", "n6+ c #2B292B", "o6+ c #2A2E31", "p6+ c #2E3335", "q6+ c #343537", "r6+ c #343237", "s6+ c #3D3E45", "t6+ c #778389", "u6+ c #8E959C", "v6+ c #777979", "w6+ c #6C6E65", "x6+ c #595C5B", "y6+ c #454A51", "z6+ c #494D54", "A6+ c #A5B0B3", "B6+ c #585E60", "C6+ c #352B2D", "D6+ c #462B2D", "E6+ c #3D2A33", "F6+ c #342D39", "G6+ c #3C3641", "H6+ c #422F34", "I6+ c #503538", "J6+ c #634A4A", "K6+ c #5C4841", "L6+ c #854F35", "M6+ c #D46634", "N6+ c #E96C34", "O6+ c #E26A36", "P6+ c #E26939", "Q6+ c #EC733C", "R6+ c #C0673E", "S6+ c #755047", "T6+ c #776E6C", "U6+ c #979E9B", "V6+ c #ACC0C4", "W6+ c #B5CACF", "X6+ c #A1AAB0", "Y6+ c #9BA7B0", "Z6+ c #C1D3D0", "`6+ c #A4ADC0", " 7+ c #665CA6", ".7+ c #3217B0", "+7+ c #1200AA", "@7+ c #3F2DA6", "#7+ c #9595AB", "$7+ c #B4C2C1", "%7+ c #A9B0B1", "&7+ c #97A2A5", "*7+ c #666A6C", "=7+ c #42474B", "-7+ c #4F5357", ";7+ c #343339", ">7+ c #27262A", ",7+ c #252528", "'7+ c #282A2C", ")7+ c #37373C", "!7+ c #2F2D31", "~7+ c #282729", "{7+ c #2F2E33", "]7+ c #525259", "^7+ c #F7FAFA", "/7+ c #E4E0DE", "(7+ c #B0A7A1", "_7+ c #858E82", ":7+ c #90A39A", "<7+ c #BDCFD4", "[7+ c #A7B7B9", "}7+ c #929690", "|7+ c #A7AFAE", "17+ c #B6BCBB", "27+ c #B1A4A5", "37+ c #B1A9AB", "47+ c #B5C6C5", "57+ c #B6CAC8", "67+ c #B8C9C9", "77+ c #B9C7CB", "87+ c #9EA09F", "97+ c #A6A29F", "07+ c #D5D3D3", "a7+ c #EEF1F2", "b7+ c #F8FBFB", "c7+ c #FBFDFD", "d7+ c #F2F4F5", "e7+ c #DEDEDF", "f7+ c #B4B3B6", "g7+ c #818184", "h7+ c #423B3F", "i7+ c #3D3239", "j7+ c #393439", "k7+ c #3F2E30", "l7+ c #473334", "m7+ c #473E3F", "n7+ c #38383A", "o7+ c #303334", "p7+ c #363C41", "q7+ c #4F5559", "r7+ c #787F7F", "s7+ c #A3AFA9", "t7+ c #B8CACA", "u7+ c #BFCFD6", "v7+ c #C0CED2", "w7+ c #BBCBCD", "x7+ c #899095", "y7+ c #6A6C6F", "z7+ c #5E6060", "A7+ c #535856", "B7+ c #3E3E43", "C7+ c #505253", "D7+ c #869089", "E7+ c #AABABB", "F7+ c #AABBC4", "G7+ c #B6C9CC", "H7+ c #667377", "I7+ c #303235", "J7+ c #362D2E", "K7+ c #534B4A", "L7+ c #6C6B6F", "M7+ c #7B7E87", "N7+ c #7E7383", "O7+ c #7B6471", "P7+ c #785A5B", "Q7+ c #7B4937", "R7+ c #9B5D3D", "S7+ c #CA895C", "T7+ c #DC7B4A", "U7+ c #DF6733", "V7+ c #DF6833", "W7+ c #E66B33", "X7+ c #CD5D30", "Y7+ c #9D5238", "Z7+ c #957C73", "`7+ c #A3ACAC", " 8+ c #AFC5C8", ".8+ c #C7D6D5", "+8+ c #ABB4C7", "@8+ c #6B63A9", "#8+ c #331AA9", "$8+ c #1200AB", "%8+ c #3F2DA7", "&8+ c #9494AA", "*8+ c #B4C1C0", "=8+ c #ADB5B7", "-8+ c #969693", ";8+ c #A8B1B2", ">8+ c #666D71", ",8+ c #444647", "'8+ c #4E5354", ")8+ c #585B5E", "!8+ c #484A4E", "~8+ c #2F2E34", "{8+ c #2C2C2F", "]8+ c #26282A", "^8+ c #33343A", "/8+ c #3B393F", "(8+ c #2C2B2E", "_8+ c #2A2729", ":8+ c #484648", "<8+ c #D1D4D7", "[8+ c #FBFDFE", "}8+ c #F9F9F9", "|8+ c #F9FAFA", "18+ c #F3EEEF", "28+ c #DACED0", "38+ c #97A198", "48+ c #7E9184", "58+ c #96A19B", "68+ c #A8B4B4", "78+ c #B2C1C3", "88+ c #BDCBCF", "98+ c #BDCCD1", "08+ c #BDCBD1", "a8+ c #B2BAB9", "b8+ c #9D9795", "c8+ c #ACAFB1", "d8+ c #B7C6C7", "e8+ c #919C98", "f8+ c #EAECED", "g8+ c #FBFEFD", "h8+ c #FFFDFD", "i8+ c #EBEBEC", "j8+ c #717477", "k8+ c #6B6A6F", "l8+ c #696970", "m8+ c #515257", "n8+ c #37373A", "o8+ c #2D2C32", "p8+ c #2C2C32", "q8+ c #302F33", "r8+ c #3E2E31", "s8+ c #483638", "t8+ c #494244", "u8+ c #3B383A", "v8+ c #312E30", "w8+ c #32302F", "x8+ c #373532", "y8+ c #363D41", "z8+ c #464B50", "A8+ c #666A6A", "B8+ c #898E8B", "C8+ c #A4B4B8", "D8+ c #A6B9B9", "E8+ c #ABB5B4", "F8+ c #A3AAAC", "G8+ c #767A7F", "H8+ c #565658", "I8+ c #4C4D52", "J8+ c #4C4F55", "K8+ c #797F7F", "L8+ c #B2C0B8", "M8+ c #BBCDCF", "N8+ c #B3C7D1", "O8+ c #606166", "P8+ c #38353A", "Q8+ c #848481", "R8+ c #B8BBB8", "S8+ c #C5CCD0", "T8+ c #C5C3D1", "U8+ c #B9AFBC", "V8+ c #A69395", "W8+ c #9B6354", "X8+ c #A36244", "Y8+ c #BB845C", "Z8+ c #D57A48", "`8+ c #E16932", " 9+ c #E06834", ".9+ c #E56C36", "+9+ c #CB6031", "@9+ c #9D5838", "#9+ c #9B8880", "$9+ c #ABB7BC", "%9+ c #C6D6D6", "&9+ c #AAB2C7", "*9+ c #6860A7", "=9+ c #3219A8", "-9+ c #1700A7", ";9+ c #9398B0", ">9+ c #AEB4B3", ",9+ c #959591", "'9+ c #A6B1B1", ")9+ c #B1CBD4", "!9+ c #AAB5B6", "~9+ c #798488", "{9+ c #3D464B", "]9+ c #393D3C", "^9+ c #595C53", "/9+ c #515553", "(9+ c #383D42", "_9+ c #2D2C34", ":9+ c #2C3034", "<9+ c #262B30", "[9+ c #1E1F24", "}9+ c #28272B", "|9+ c #2B2A2D", "19+ c #272628", "29+ c #342F30", "39+ c #6A6568", "49+ c #E8E9EC", "59+ c #F9F7F8", "69+ c #F3F1F2", "79+ c #D2D4CE", "89+ c #9DA096", "99+ c #73766A", "09+ c #868D83", "a9+ c #A9B0A8", "b9+ c #BEC0BA", "c9+ c #BCC7C7", "d9+ c #BBC7CC", "e9+ c #C4C7C3", "f9+ c #BAB2AD", "g9+ c #AC9696", "h9+ c #B3AFAF", "i9+ c #BAC7C9", "j9+ c #7E978E", "k9+ c #7F9187", "l9+ c #F0EEF0", "m9+ c #FFFEFE", "n9+ c #E8EBEB", "o9+ c #B1BABC", "p9+ c #585D60", "q9+ c #464447", "r9+ c #777077", "s9+ c #949296", "t9+ c #787A7E", "u9+ c #313038", "v9+ c #323138", "w9+ c #333239", "x9+ c #373239", "y9+ c #353439", "z9+ c #313539", "A9+ c #312C31", "B9+ c #323132", "C9+ c #3C3A3C", "D9+ c #484A4D", "E9+ c #52595E", "F9+ c #5E676B", "G9+ c #676E73", "H9+ c #6D6D75", "I9+ c #6D7877", "J9+ c #71887D", "K9+ c #79817E", "L9+ c #747175", "M9+ c #595A5C", "N9+ c #525354", "O9+ c #434045", "P9+ c #46454B", "Q9+ c #B9CCCE", "R9+ c #91A1A8", "S9+ c #64626C", "T9+ c #4D393E", "U9+ c #49363A", "V9+ c #5D5C65", "W9+ c #B8BBBD", "X9+ c #F1F2F1", "Y9+ c #F6F8F9", "Z9+ c #F5F5F9", "`9+ c #F2F0F4", " 0+ c #E1DEDE", ".0+ c #AB9897", "+0+ c #906458", "@0+ c #A25A3C", "#0+ c #CB6435", "$0+ c #E16A35", "%0+ c #EA6A34", "&0+ c #BF6438", "*0+ c #7A644F", "=0+ c #8D9794", "-0+ c #B2BFCA", ";0+ c #A0AAB5", ">0+ c #A4AFC2", ",0+ c #6961A8", "'0+ c #4430A5", ")0+ c #9499B3", "!0+ c #BECCD2", "~0+ c #ABB5B1", "{0+ c #8F9183", "]0+ c #A4ACA6", "^0+ c #BDCAC8", "/0+ c #959B94", "(0+ c #4F514F", "_0+ c #353A3E", ":0+ c #454A4E", "<0+ c #575B5A", "[0+ c #373C3E", "}0+ c #282B30", "|0+ c #37333C", "10+ c #2B2E34", "20+ c #202529", "30+ c #272328", "40+ c #211F22", "50+ c #222022", "60+ c #4A484A", "70+ c #959395", "80+ c #DEDEE2", "90+ c #F9F9FA", "00+ c #FEFDFE", "a0+ c #FDFCFD", "b0+ c #ECF0ED", "c0+ c #D4DED5", "d0+ c #CFD8D2", "e0+ c #C9CCC8", "f0+ c #B8B8B3", "g0+ c #AFB5AB", "h0+ c #9FAD9E", "i0+ c #899C8E", "j0+ c #859696", "k0+ c #879194", "l0+ c #858780", "m0+ c #84756E", "n0+ c #88726B", "o0+ c #93897B", "p0+ c #ACB2AE", "q0+ c #BCC9C9", "r0+ c #BACDC6", "s0+ c #8EA194", "t0+ c #98A49A", "u0+ c #D9DAD9", "v0+ c #F6F7F7", "w0+ c #FAFCFC", "x0+ c #DBE2E3", "y0+ c #818384", "z0+ c #4C474B", "A0+ c #504B54", "B0+ c #66646C", "C0+ c #454448", "D0+ c #48494D", "E0+ c #43464C", "F0+ c #41434B", "G0+ c #3E3F47", "H0+ c #393C40", "I0+ c #36363C", "J0+ c #323135", "K0+ c #3A393F", "L0+ c #44474E", "M0+ c #535860", "N0+ c #50545C", "O0+ c #4F5558", "P0+ c #505B5A", "Q0+ c #5F5E64", "R0+ c #615C64", "S0+ c #58575A", "T0+ c #565859", "U0+ c #545456", "V0+ c #524E4F", "W0+ c #515049", "X0+ c #66645E", "Y0+ c #8C8A8A", "Z0+ c #92A2A9", "`0+ c #5A5D66", " a+ c #48444E", ".a+ c #453A42", "+a+ c #4B4345", "@a+ c #676864", "#a+ c #C6CAC8", "$a+ c #FDFFFF", "%a+ c #FEFFFF", "&a+ c #F6FAF9", "*a+ c #E0E0E2", "=a+ c #AAA19C", "-a+ c #765947", ";a+ c #A15040", ">a+ c #D26045", ",a+ c #E06935", "'a+ c #E86A2F", ")a+ c #C36740", "!a+ c #897068", "~a+ c #9FA8A2", "{a+ c #B9CAC5", "]a+ c #9FA9B3", "^a+ c #857AA8", "/a+ c #3F23AD", "(a+ c #9196B0", "_a+ c #AAB8B5", ":a+ c #919786", "b+ c #BACDD0", ",b+ c #ABB8CA", "'b+ c #857FBB", ")b+ c #452CB1", "!b+ c #2002AE", "~b+ c #412DA2", "{b+ c #8D91AA", "]b+ c #B0C0C3", "^b+ c #ADBBBC", "/b+ c #AEB7B5", "(b+ c #B8CCCE", "_b+ c #A4C2BC", ":b+ c #66776F", "c+ c #402FBA", ",c+ c #2A0AA9", "'c+ c #1E00A9", ")c+ c #1600A9", "!c+ c #442DA2", "~c+ c #ADBCBE", "{c+ c #A0AAA2", "]c+ c #B6C0BF", "^c+ c #7D9599", "/c+ c #394648", "(c+ c #333A3B", "_c+ c #5C6569", ":c+ c #586165", "d+ c #A3B3C5", ",d+ c #6B71B0", "'d+ c #3929AE", ")d+ c #2104AF", "!d+ c #442F9F", "~d+ c #B3C2C2", "{d+ c #AEB9BC", "]d+ c #9CA39C", "^d+ c #B1C2BD", "/d+ c #99AEB1", "(d+ c #54636C", "_d+ c #374047", ":d+ c #4C5559", "e+ c #9498AE", ",e+ c #AEB5BA", "'e+ c #969793", ")e+ c #A4BBB1", "!e+ c #819C97", "~e+ c #3A474A", "{e+ c #535C61", "]e+ c #6D777B", "^e+ c #2D3237", "/e+ c #1D2227", "(e+ c #272E32", "_e+ c #292B2F", ":e+ c #2A282E", "f+ c #2A2C31", ",f+ c #2B2A30", "'f+ c #272429", ")f+ c #1C1A1F", "!f+ c #25252A", "~f+ c #828488", "{f+ c #D7D8DB", "]f+ c #FAFAFB", "^f+ c #F9FBFB", "/f+ c #F4FFFE", "(f+ c #E7F8F7", "_f+ c #DCCFCC", ":f+ c #D28186", "g+ c #384043", ",g+ c #2F3539", "'g+ c #262A2E", ")g+ c #24252C", "!g+ c #2D2E32", "~g+ c #F8F8F8", "{g+ c #F8FFFF", "]g+ c #DAC6C5", "^g+ c #CE787D", "/g+ c #C93748", "(g+ c #C81F3C", "_g+ c #D14C63", ":g+ c #D45F71", "h+ c #3F464B", ",h+ c #B7B7BB", "'h+ c #E7CFCE", ")h+ c #D36E71", "!h+ c #CA2337", "~h+ c #C8203D", "{h+ c #CC5A70", "]h+ c #E3B9C2", "^h+ c #EEDDE0", "/h+ c #E4C3C7", "(h+ c #D4A2AB", "_h+ c #CF7984", ":h+ c #D14954", "i+ c #CD2239", ",i+ c #C62A40", "'i+ c #CD707D", ")i+ c #E1BDC5", "!i+ c #F6F4F6", "~i+ c #F1F7F6", "{i+ c #E7E8E8", "]i+ c #E3DBDB", "^i+ c #E1BBBA", "/i+ c #D6525D", "(i+ c #CA3B49", "_i+ c #C8888F", ":i+ c #E4D9D9", "j+ c #CA5E65", ",j+ c #CC727B", "'j+ c #E5C8CB", ")j+ c #EAEEEB", "!j+ c #D1D4D2", "~j+ c #A9B2B6", "{j+ c #9FB0B8", "]j+ c #A0AFB3", "^j+ c #8E9391", "/j+ c #777573", "(j+ c #6B7478", "_j+ c #818C90", ":j+ c #858B8F", "k+ c #CACDC6", ",k+ c #B1BEBE", "'k+ c #ACC1C7", ")k+ c #98A4A8", "!k+ c #676C6E", "~k+ c #5C5C5E", "{k+ c #5A595B", "]k+ c #80898E", "^k+ c #818A91", "/k+ c #858A8E", "(k+ c #8C8C89", "_k+ c #818B8E", ":k+ c #7F8388", "l+ c #E3EAE5", ",l+ c #C8CEC4", "'l+ c #B5C0BE", ")l+ c #A4AFB3", "!l+ c #73777A", "~l+ c #3B3A3C", "{l+ c #303135", "]l+ c #4B4C4D", "^l+ c #3E4347", "/l+ c #373E42", "(l+ c #3E4245", "_l+ c #8A8A8A", ":l+ c #5F6560", "m+ c #C3C7C1", ",m+ c #B3BCBB", "'m+ c #A4ACAF", ")m+ c #5B5B60", "!m+ c #545A5E", "~m+ c #626A6E", "{m+ c #6E7477", "]m+ c #4B4F53", "^m+ c #35373C", "/m+ c #3D3E42", "(m+ c #4A4B50", "_m+ c #494B4F", ":m+ c #3F4542", "n+ c #B35A7A", ",n+ c #DDB3C1", "'n+ c #D8B1B5", ")n+ c #C76875", "!n+ c #C7374D", "~n+ c #E0A4AF", "{n+ c #DCE0DF", "]n+ c #BABCB9", "^n+ c #AFB7B8", "/n+ c #B6C1C2", "(n+ c #AEB6B9", "_n+ c #949AA1", ":n+ c #888C93", "o+ c #CF8D9D", ",o+ c #CD9DAC", "'o+ c #DFCAD1", ")o+ c #D6A9B2", "!o+ c #CA6472", "~o+ c #CE4754", "{o+ c #E9B4B8", "]o+ c #E4E6E6", "^o+ c #C2BBBC", "/o+ c #B2B6B9", "(o+ c #B6C5C8", "_o+ c #ACBDBE", ":o+ c #9DB2B1", "p+ c #E9BCBB", ",p+ c #EBECEC", "'p+ c #CDC6C7", ")p+ c #B7BBBE", "!p+ c #B8BEC3", "~p+ c #9DA8A6", "{p+ c #80978D", "]p+ c #A1A8A5", "^p+ c #ADACA9", "/p+ c #9CA299", "(p+ c #CBCDC8", "_p+ c #D6D8D5", ":p+ c #AAB3C9", "q+ c #B8C2DA", ",q+ c #E4DCCA", "'q+ c #DFB961", ")q+ c #ECAB16", "!q+ c #F2AC0E", "~q+ c #F5AF0E", "{q+ c #F7BA2D", "]q+ c #F9D786", "^q+ c #FCF4E0", "/q+ c #C5C5C7", "(q+ c #6D6972", "_q+ c #595A5E", ":q+ c #3A3A42", "r+ c #42424D", ",r+ c #383941", "'r+ c #35343B", ")r+ c #2A2D33", "!r+ c #31363C", "~r+ c #4B5056", "{r+ c #8D9193", "]r+ c #B6C2C3", "^r+ c #BECCD0", "/r+ c #4D5153", "(r+ c #343136", "_r+ c #312A32", ":r+ c #312732", "s+ c #A0A9B1", ",s+ c #99A3A5", "'s+ c #676E6E", ")s+ c #363537", "!s+ c #2D272D", "~s+ c #332A34", "{s+ c #362B37", "]s+ c #3A323B", "^s+ c #322D33", "/s+ c #3C363D", "(s+ c #A09EA2", "_s+ c #EFF0F1", ":s+ c #F8F9F8", "t+ c #343433", ",t+ c #2F2731", "'t+ c #352C36", ")t+ c #39313A", "!t+ c #3A343B", "~t+ c #343036", "{t+ c #444246", "]t+ c #F9F9F8", "^t+ c #DFE0E2", "/t+ c #959497", "(t+ c #3F373A", "_t+ c #2B2324", ":t+ c #322B30", "u+ c #505453", ",u+ c #353534", "'u+ c #262426", ")u+ c #312D33", "!u+ c #332E33", "~u+ c #39343B", "{u+ c #635E60", "]u+ c #372E31", "^u+ c #2A2024", "/u+ c #241B23", "(u+ c #372C31", "_u+ c #4F484C", ":u+ c #686B71", "v+ c #413E45", ",v+ c #64646A", "'v+ c #C3C4C6", ")v+ c #E3E2E3", "!v+ c #959295", "~v+ c #4C4749", "{v+ c #282124", "]v+ c #201B1E", "^v+ c #272024", "/v+ c #2C272A", "(v+ c #6F6E71", "_v+ c #999D9F", ":v+ c #C2D2D7", "w+ c #313437", ",w+ c #2C2B32", "'w+ c #34333A", ")w+ c #4A4A53", "!w+ c #C9C9CD", "~w+ c #FCFCFB", "{w+ c #C4C4C6", "]w+ c #646265", "^w+ c #2A272A", "/w+ c #252426", "(w+ c #2A2629", "_w+ c #27282B", ":w+ c #292E33", "x+ c #363534", ",x+ c #403837", "'x+ c #433F42", ")x+ c #4A4C4E", "!x+ c #6D727A", "~x+ c #929BA3", "{x+ c #85939C", "]x+ c #BDD1D7", "^x+ c #B8C7C9", "/x+ c #A5A9A8", "(x+ c #8F8F91", "_x+ c #B9CDCD", ":x+ c #AEBFC9", "y+ c #9A9B93", ",y+ c #838580", "'y+ c #AEBFC8", ")y+ c #5145B4", "!y+ c #1400A8", "~y+ c #1301A8", "{y+ c #1B02AE", "]y+ c #1500AE", "^y+ c #391FAA", "/y+ c #7F6EAB", "(y+ c #AAAFC3", "_y+ c #C2D4DA", ":y+ c #96A3A9", "z+ c #FDFFFE", ",z+ c #D2DBDB", "'z+ c #BAC8CC", ")z+ c #BBCBCC", "!z+ c #BEC8C1", "~z+ c #9DA292", "{z+ c #8C8E7D", "]z+ c #9A998E", "^z+ c #C2C4B9", "/z+ c #F0F1EF", "(z+ c #F2EFEC", "_z+ c #E6CF9B", ":z+ c #EBD193", "A+ c #627871", ",A+ c #464D4F", "'A+ c #939CA2", ")A+ c #646870", "!A+ c #84878B", "~A+ c #ABB6B0", "{A+ c #BCCDC7", "]A+ c #9EB1B9", "^A+ c #6F787D", "/A+ c #38383B", "(A+ c #2B262B", "_A+ c #36363D", ":A+ c #3A3A43", "B+ c #353C41", ",B+ c #343740", "'B+ c #2D2C37", ")B+ c #292730", "!B+ c #1F1D27", "~B+ c #69696F", "{B+ c #E0E1E2", "]B+ c #FAFBFA", "^B+ c #DADCDD", "/B+ c #B3B5BA", "(B+ c #D8D8DA", "_B+ c #F4F4F3", ":B+ c #DCDEDF", "C+ c #9E9693", ",C+ c #B3B6AE", "'C+ c #CBD5C9", ")C+ c #D0D1CA", "!C+ c #DECCCC", "~C+ c #B6A2A6", "{C+ c #797277", "]C+ c #AAAEAE", "^C+ c #E9EDEC", "/C+ c #DCDCDD", "(C+ c #2E2D31", "_C+ c #423F48", ":C+ c #312E2B", "D+ c #949B93", ",D+ c #8D9489", "'D+ c #A8A7A0", ")D+ c #A5A7A5", "!D+ c #B7B8BB", "~D+ c #BCC5C2", "{D+ c #C2CDC6", "]D+ c #D1D6D1", "^D+ c #D7D9D8", "/D+ c #DADADB", "(D+ c #DEDDDC", "_D+ c #D6DBDC", ":D+ c #DCDEDE", "E+ c #BFCED2", ",E+ c #BCCACD", "'E+ c #B1C2C2", ")E+ c #6E777A", "!E+ c #696B6E", "~E+ c #CDCECF", "{E+ c #DDDDDD", "]E+ c #ADB0B5", "^E+ c #6864AF", "/E+ c #2B14A3", "(E+ c #311BA2", "_E+ c #A2ACBB", ":E+ c #41484E", "F+ c #575B62", ",F+ c #353538", "'F+ c #3A3F42", ")F+ c #393A3E", "!F+ c #353233", "~F+ c #373434", "{F+ c #343334", "]F+ c #201D1E", "^F+ c #676566", "/F+ c #DFDFDE", "(F+ c #F9F8F7", "_F+ c #FBFEFE", ":F+ c #F6F9F9", "G+ c #3F3C42", ",G+ c #31312F", "'G+ c #171618", ")G+ c #595859", "!G+ c #D3D3D3", "~G+ c #817E81", "{G+ c #3C3C3E", "]G+ c #28252A", "^G+ c #2F2631", "/G+ c #241B26", "(G+ c #5A555B", "_G+ c #989EA1", ":G+ c #A8B4B6", "H+ c #231D22", ",H+ c #231F22", "'H+ c #262429", ")H+ c #343337", "!H+ c #303234", "~H+ c #3B3F44", "{H+ c #B0B6B8", "]H+ c #F5F9F9", "^H+ c #DCDADB", "/H+ c #CFCECE", "(H+ c #807D7F", "_H+ c #C3C4C7", ":H+ c #FBFBFA", "I+ c #EFEFEE", ",I+ c #C6C7C9", "'I+ c #5C5E60", ")I+ c #444449", "!I+ c #302F2D", "~I+ c #33322E", "{I+ c #302F2E", "]I+ c #2B292C", "^I+ c #252023", "/I+ c #423C3D", "(I+ c #83827F", "_I+ c #D9D9D7", ":I+ c #CCCDCF", "J+ c #504B51", ",J+ c #E7EAEB", "'J+ c #C6CBC9", ")J+ c #D2D4D2", "!J+ c #F6F6F8", "~J+ c #E7E6E8", "{J+ c #A4AFB5", "]J+ c #8D98A2", "^J+ c #727DD2", "/J+ c #3730C6", "(J+ c #2006B0", "_J+ c #321BA3", ":J+ c #676596", "K+ c #80858A", ",K+ c #8184B7", "'K+ c #4537AE", ")K+ c #2008B6", "!K+ c #2D14A8", "~K+ c #5C52A3", "{K+ c #9BA3BC", "]K+ c #383940", "^K+ c #2C3035", "/K+ c #626B72", "(K+ c #636567", "_K+ c #33373B", ":K+ c #BABBC2", "L+ c #2409B6", ",L+ c #311995", "'L+ c #5E5B7E", ")L+ c #B8C3CE", "!L+ c #96A4A8", "~L+ c #768085", "{L+ c #2A2F33", "]L+ c #3B3F49", "^L+ c #34353F", "/L+ c #262A2F", "(L+ c #D1D2D4", "_L+ c #E0E0E0", ":L+ c #C3BFBF", "M+ c #ACAFAB", ",M+ c #B0B3B0", "'M+ c #CACED1", ")M+ c #9FA5A9", "!M+ c #808BC3", "~M+ c #493DB4", "{M+ c #2609AE", "]M+ c #1E01AF", "^M+ c #1D00A5", "/M+ c #2F1597", "(M+ c #5A4F97", "_M+ c #989FBA", ":M+ c #687176", "N+ c #B11F37", ",N+ c #C80628", "'N+ c #C4112F", ")N+ c #AA1F31", "!N+ c #A22332", "~N+ c #AF1A2F", "{N+ c #B6102B", "]N+ c #800C21", "^N+ c #83525D", "/N+ c #C7C4C7", "(N+ c #EEF5F5", "_N+ c #7A797A", ":N+ c #2C262A", "O+ c #A3ADAD", ",O+ c #BBC8C9", "'O+ c #C9CFD2", ")O+ c #CDD1D3", "!O+ c #93999D", "~O+ c #9898AB", "{O+ c #9C9CAF", "]O+ c #AAABA8", "^O+ c #CACAC6", "/O+ c #E9EAEA", "(O+ c #C7C7CE", "_O+ c #5C5B61", ":O+ c #212024", "P+ c #9FBCC9", ",P+ c #A4BECB", "'P+ c #8AA6B3", ")P+ c #648090", "!P+ c #647997", "~P+ c #626E8B", "{P+ c #535C66", "]P+ c #606060", "^P+ c #7E7877", "/P+ c #9F989A", "(P+ c #C1BEC1", "_P+ c #DCDDDF", ":P+ c #D2D1D5", "Q+ c #372F31", ",Q+ c #463031", "'Q+ c #3C2B2E", ")Q+ c #2C272B", "!Q+ c #2E272B", "~Q+ c #2D2325", "{Q+ c #517080", "]Q+ c #76ACC6", "^Q+ c #85C1DE", "/Q+ c #88C5E2", "(Q+ c #8BC7E4", "_Q+ c #8DC8E6", ":Q+ c #8EC9E6", "R+ c #6792A7", ",R+ c #6E9AB3", "'R+ c #77A8C3", ")R+ c #80B3CD", "!R+ c #6384A0", "~R+ c #4A667A", "{R+ c #4D767F", "]R+ c #71AABD", "^R+ c #87CCEE", "/R+ c #8AD2FB", "(R+ c #8AD1F9", "_R+ c #8FD5FB", ":R+ c #91D2F5", "S+ c #DB0529", ",S+ c #BE0425", "'S+ c #9A2237", ")S+ c #8E6367", "!S+ c #BFBCB8", "~S+ c #EAEFED", "{S+ c #E5E9E8", "]S+ c #B9AAA9", "^S+ c #B34656", "/S+ c #C90C2A", "(S+ c #E00329", "_S+ c #E9042C", ":S+ c #E2072C", "T+ c #312B2D", ",T+ c #757479", "'T+ c #F5F6F7", ")T+ c #FBFFFE", "!T+ c #EBF0F9", "~T+ c #CCC4CF", "{T+ c #B59DA0", "]T+ c #D5CACA", "^T+ c #F6F7F5", "/T+ c #A6A8B6", "(T+ c #6F5EAA", "_T+ c #2B11AF", ":T+ c #2B11A8", "U+ c #2F1F25", ",U+ c #761529", "'U+ c #D50528", ")U+ c #E50328", "!U+ c #D90227", "~U+ c #D10325", "{U+ c #B5132D", "]U+ c #AD1E36", "^U+ c #BF1E3A", "/U+ c #DF0F2B", "(U+ c #B6041C", "_U+ c #71202F", ":U+ c #BAAAAF", "V+ c #8BA9B8", ",V+ c #8DC1D8", "'V+ c #8DCEF0", ")V+ c #8CCEF4", "!V+ c #8DCDF3", "~V+ c #8BCCF4", "{V+ c #8BD0F6", "]V+ c #8CD0F0", "^V+ c #7BB7D2", "/V+ c #7CBAD8", "(V+ c #8BCBEE", "_V+ c #6690A8", ":V+ c #51505E", "W+ c #87C6E7", ",W+ c #74ACC7", "'W+ c #607D8B", ")W+ c #332C2F", "!W+ c #5B4E5A", "~W+ c #9D949E", "{W+ c #D9D7D7", "]W+ c #E1E1E0", "^W+ c #858386", "/W+ c #454347", "(W+ c #323232", "_W+ c #393838", ":W+ c #3A363A", "X+ c #484446", ",X+ c #9FA2A3", "'X+ c #E8E9EB", ")X+ c #B2ADB0", "!X+ c #897679", "~X+ c #764C4E", "{X+ c #7A2032", "]X+ c #77263B", "^X+ c #736069", "/X+ c #DDDEDE", "(X+ c #F0F3F3", "_X+ c #D6D5D3", ":X+ c #405371", "Y+ c #A9B5CD", ",Y+ c #736CC2", "'Y+ c #2C14B2", ")Y+ c #260AA5", "!Y+ c #4E368F", "~Y+ c #9695B2", "{Y+ c #D3D6D9", "]Y+ c #F4F7F5", "^Y+ c #D3D6D4", "/Y+ c #87727B", "(Y+ c #452D38", "_Y+ c #32272A", ":Y+ c #634549", "Z+ c #D0D4D1", ",Z+ c #726B67", "'Z+ c #4B3537", ")Z+ c #582431", "!Z+ c #7B3147", "~Z+ c #B58B95", "{Z+ c #CFCCD0", "]Z+ c #C9CFD9", "^Z+ c #C5AEB0", "/Z+ c #C08688", "(Z+ c #B95F6D", "_Z+ c #C1374D", ":Z+ c #CA1732", "`+ c #DC0723", ",`+ c #CF082A", "'`+ c #B3102C", ")`+ c #CD0929", "!`+ c #EA0127", "~`+ c #E70128", "{`+ c #B30425", "]`+ c #862E3C", "^`+ c #7E7773", "/`+ c #B2BCB9", "(`+ c #D4D7D7", "_`+ c #D3D4D1", ":`+ c #CECFCF", "<`+ c #D7D7D9", "[`+ c #DEDEE0", "}`+ c #E3E2E1", "|`+ c #E5E5E6", "1`+ c #E1E1E4", "2`+ c #DBDBDD", "3`+ c #D2D1D4", "4`+ c #C6CCCD", "5`+ c #938D90", "6`+ c #563137", "7`+ c #601C26", "8`+ c #8A1B34", "9`+ c #AB1E46", "0`+ c #C05D74", "a`+ c #BA8691", "b`+ c #A7788C", "c`+ c #AD515D", "d`+ c #B62735", "e`+ c #BC0A23", "f`+ c #D50326", "g`+ c #E50229", "h`+ c #E60129", "i`+ c #E70129", "j`+ c #BE0628", "k`+ c #982134", "l`+ c #8D5257", "m`+ c #AF9099", "n`+ c #CCB9C3", "o`+ c #D7CDCF", "p`+ c #DFDCDB", "q`+ c #E5E8E8", "r`+ c #B8B9BB", "s`+ c #AAB6B9", "t`+ c #756EAC", "u`+ c #2D15AD", "v`+ c #251099", "w`+ c #434678", "x`+ c #919DA8", "y`+ c #BCCAD0", "z`+ c #A2A6AA", "A`+ c #FAFDFC", "B`+ c #D9DAE0", "C`+ c #B1B3BB", "D`+ c #F4F7F8", "E`+ c #E8EDEF", "F`+ c #E0E5E6", "G`+ c #DEE4E4", "H`+ c #E2E8E9", "I`+ c #E8ECEC", "J`+ c #D0D2D2", "K`+ c #D0D2D3", "L`+ c #4C4D51", "M`+ c #3B4753", "N`+ c #6689A1", "O`+ c #84BEDD", "P`+ c #8ECFF0", "Q`+ c #88CEF7", "R`+ c #8DCDF2", "S`+ c #89CEF8", "T`+ c #89CAF4", "U`+ c #87C5EC", "V`+ c #88C4E7", "W`+ c #85C2E3", "X`+ c #80BCDD", "Y`+ c #82BCDB", "Z`+ c #7DB5D0", "``+ c #72A4BC", " @ c #6B90A6", ". @ c #6E96AD", "+ @ c #6E9EB5", "@ @ c #4D6468", "# @ c #333532", "$ @ c #363A3D", "% @ c #585F67", "& @ c #83939A", "* @ c #8A989D", "= @ c #5F6A6F", "- @ c #394651", "; @ c #282C33", "> @ c #292429", ", @ c #2F2A2F", "' @ c #32312F", ") @ c #3A404D", "! @ c #566E89", "~ @ c #7DB2D1", "{ @ c #90D3F5", "] @ c #8ED1F7", "^ @ c #8EC0E4", "/ @ c #84ACCB", "( @ c #739AB4", "_ @ c #7093AA", ": @ c #6DA4B6", "< @ c #6AC2D0", "[ @ c #82D0EE", "} @ c #88C9EE", "| @ c #79B3CF", "1 @ c #768D9D", "2 @ c #A3A2A8", "3 @ c #969E9F", "4 @ c #86494E", "5 @ c #C6111E", "6 @ c #DB0423", "7 @ c #DD0625", "8 @ c #E30718", "9 @ c #E90220", "0 @ c #D2062B", "a @ c #B4102C", "b @ c #E60227", "c @ c #BB0B2A", "d @ c #761C2C", "e @ c #3F3436", "f @ c #596063", "g @ c #797B7B", "h @ c #76786F", "i @ c #5A5A56", "j @ c #525153", "k @ c #636467", "l @ c #8E8F94", "m @ c #9C9B98", "n @ c #A1A19F", "o @ c #94959C", "p @ c #82828B", "q @ c #6F6E76", "r @ c #4D3C44", "s @ c #612632", "t @ c #832431", "u @ c #A91D32", "v @ c #C41233", "w @ c #BD1B37", "x @ c #AE223A", "y @ c #AC1F38", "z @ c #C3112F", "A @ c #D70426", "B @ c #DD0022", "C @ c #DC0226", "D @ c #E4022A", "E @ c #E2062C", "F @ c #D50A2D", "G @ c #BB162E", "H @ c #9D2735", "I @ c #842845", "J @ c #80425C", "K @ c #93777B", "L @ c #B0A8A6", "M @ c #D6D6D5", "N @ c #AAABB2", "O @ c #ADBFBD", "P @ c #7A7AAD", "Q @ c #3018A5", "R @ c #260CA2", "S @ c #45388A", "T @ c #9592AA", "U @ c #C0C7C8", "V @ c #CCD0D2", "W @ c #E6E6E9", "X @ c #E3E3E5", "Y @ c #EFF4F4", "Z @ c #767D82", "` @ c #5E717F", " .@ c #4D6B7E", "..@ c #50758D", "+.@ c #658FAC", "@.@ c #77A7C5", "#.@ c #84B8D9", "$.@ c #90C6EB", "%.@ c #96D4EF", "&.@ c #97DBF0", "*.@ c #95DCF2", "=.@ c #94DBF9", "-.@ c #92D8FB", ";.@ c #8CD1F8", ">.@ c #8BCEF8", ",.@ c #8BCCF6", "'.@ c #8CCBF4", ").@ c #87CDF7", "!.@ c #8ED0F3", "~.@ c #8FD0F4", "{.@ c #8FD0F5", "].@ c #90D2F6", "^.@ c #90D3FB", "/.@ c #84C4E8", "(.@ c #82BBDA", "_.@ c #7FB9D7", ":.@ c #72ACC8", "<.@ c #445F69", "[.@ c #303636", "}.@ c #475259", "|.@ c #7394A6", "1.@ c #93C4DB", "2.@ c #9DD2E9", "3.@ c #91C3DD", "4.@ c #80B0CB", "5.@ c #709EB7", "6.@ c #588392", "7.@ c #405E65", "8.@ c #2E3840", "9.@ c #2C2A2B", "0.@ c #353C4C", "a.@ c #62839B", "b.@ c #86BFDF", "c.@ c #92D5FC", "d.@ c #8FD1F5", "e.@ c #8ECBF0", "f.@ c #8FCCF4", "g.@ c #8ECBF3", "h.@ c #8FCFF6", "i.@ c #8DCFF6", "j.@ c #75B1DE", "k.@ c #66AACE", "l.@ c #6ABCCF", "m.@ c #7EB4CD", "n.@ c #81AECB", "o.@ c #70AFC5", "p.@ c #5E95B4", "q.@ c #5C82A2", "r.@ c #70899C", "s.@ c #A9B1B9", "t.@ c #DEDEE1", "u.@ c #D7E2E2", "v.@ c #A59694", "w.@ c #8A3738", "x.@ c #B50F27", "y.@ c #DD0829", "z.@ c #E70420", "A.@ c #E20325", "B.@ c #D6062B", "C.@ c #CB092B", "D.@ c #E60423", "E.@ c #DC081B", "F.@ c #B70E24", "G.@ c #781C2E", "H.@ c #3B3136", "I.@ c #3C474B", "J.@ c #484B48", "K.@ c #383533", "L.@ c #302B2F", "M.@ c #44464B", "N.@ c #505054", "O.@ c #59555D", "P.@ c #413C46", "Q.@ c #302C35", "R.@ c #30312E", "S.@ c #554F4B", "T.@ c #8B6F72", "U.@ c #9E585D", "V.@ c #9B2F3C", "W.@ c #99132E", "X.@ c #A20C28", "Y.@ c #B40A25", "Z.@ c #C70525", "`.@ c #DA0126", " +@ c #E50028", ".+@ c #E60228", "++@ c #DF0429", "@+@ c #D6072A", "#+@ c #D10A2C", "$+@ c #D00A2D", "%+@ c #D00C2D", "&+@ c #D10D2E", "*+@ c #D60D30", "=+@ c #C60F2C", "-+@ c #84182A", ";+@ c #92525F", ">+@ c #C1B0B1", ",+@ c #DCDAD9", "'+@ c #B2B0B3", ")+@ c #969CA0", "!+@ c #ADBFC3", "~+@ c #AEC1C1", "{+@ c #7A7CAB", "]+@ c #30199B", "^+@ c #2606A9", "/+@ c #472AA0", "(+@ c #978BB3", "_+@ c #C1C8C7", ":+@ c #BFC4C8", "<+@ c #C7C9CC", "[+@ c #969DA2", "}+@ c #4E5B68", "|+@ c #4A5E72", "1+@ c #4C667A", "2+@ c #5B748C", "3+@ c #708BA6", "4+@ c #77A2B4", "5+@ c #79AAB4", "6+@ c #79A7B2", "7+@ c #75A7C1", "8+@ c #7AB1D1", "9+@ c #86BEDB", "0+@ c #87C7E9", "a+@ c #88CEF3", "b+@ c #91D3F5", "c+@ c #92D4F8", "d+@ c #8FD2FB", "e+@ c #8BD2FC", "f+@ c #8FD1F4", "g+@ c #8FD1F6", "h+@ c #8DD1F9", "i+@ c #8DD0F9", "j+@ c #84D2F6", "k+@ c #84D2F5", "l+@ c #8DD0F7", "m+@ c #8FD2F9", "n+@ c #8BD0F1", "o+@ c #7CB9D0", "p+@ c #425B64", "q+@ c #2E3337", "r+@ c #505E68", "s+@ c #7CADC7", "t+@ c #8FD4F7", "u+@ c #8DD1F4", "v+@ c #88CFF7", "w+@ c #8AD4FD", "x+@ c #8ED3F7", "y+@ c #80C6DD", "z+@ c #689EB0", "A+@ c #4F697B", "B+@ c #383C46", "C+@ c #26262E", "D+@ c #455361", "E+@ c #678AA2", "F+@ c #7DB3D6", "G+@ c #8AC9EA", "H+@ c #8BCEEF", "I+@ c #85CFEF", "J+@ c #89D0F5", "K+@ c #8DCAF0", "L+@ c #74B1DE", "M+@ c #65B0D4", "N+@ c #6CC2D2", "O+@ c #73AAC1", "P+@ c #7390AE", "Q+@ c #6F8AA1", "R+@ c #6F869B", "S+@ c #7C8A9A", "T+@ c #D4D8D6", "U+@ c #918484", "V+@ c #9F3040", "W+@ c #C90626", "X+@ c #E00127", "Y+@ c #E00429", "Z+@ c #E2032A", "`+@ c #DA091B", " @@ c #B0081E", ".@@ c #8B2D40", "+@@ c #7C6C72", "@@@ c #7E868A", "#@@ c #7F8183", "$@@ c #7B7878", "%@@ c #7C7C7F", "&@@ c #7A7B7D", "*@@ c #808185", "=@@ c #858589", "-@@ c #7A767E", ";@@ c #676168", ">@@ c #5D595E", ",@@ c #646264", "'@@ c #787971", ")@@ c #9C9F97", "!@@ c #C4A7A6", "~@@ c #9E696E", "{@@ c #732C3C", "]@@ c #95142C", "^@@ c #C60B2B", "/@@ c #E30328", "(@@ c #E50227", "_@@ c #DF0328", ":@@ c #D7072B", "<@@ c #CE0C2E", "[@@ c #CF0C2D", "}@@ c #C50A2C", "|@@ c #B41933", "1@@ c #A53B49", "2@@ c #AB6568", "3@@ c #CDAAA9", "4@@ c #F4F0F0", "5@@ c #AEC1C0", "6@@ c #7A7CAA", "7@@ c #2606A6", "8@@ c #452B9D", "9@@ c #928FB8", "0@@ c #B2BCBF", "a@@ c #CFD6D5", "b@@ c #E8E9E9", "c@@ c #CCCCCD", "d@@ c #393E49", "e@@ c #323341", "f@@ c #3E414F", "g@@ c #41515E", "h@@ c #42525D", "i@@ c #424B55", "j@@ c #3B4D69", "k@@ c #4B6785", "l@@ c #6C8C9F", "m@@ c #74A5BC", "n@@ c #7BB8D1", "o@@ c #8CCADB", "p@@ c #8FCEE7", "q@@ c #8CCCF0", "r@@ c #87CEF7", "s@@ c #8CCDF6", "t@@ c #77D2E9", "u@@ c #78D3E7", "v@@ c #89CEF2", "w@@ c #8BCEFA", "x@@ c #8FD5F7", "y@@ c #8CCADA", "z@@ c #4B646A", "A@@ c #2F3337", "B@@ c #4F5D67", "C@@ c #7CADC9", "D@@ c #8FD3FB", "E@@ c #89CFF7", "F@@ c #89D1FB", "G@@ c #8BD2FA", "H@@ c #8BD1F3", "I@@ c #8BC7E6", "J@@ c #82AAC8", "K@@ c #515C70", "L@@ c #3A3A3E", "M@@ c #29292F", "N@@ c #282C30", "O@@ c #303136", "P@@ c #3F4855", "Q@@ c #57738D", "R@@ c #7EB0D0", "S@@ c #87D3ED", "T@@ c #77D6E7", "U@@ c #7ED3F1", "V@@ c #8AC7EF", "W@@ c #8CB6DA", "X@@ c #87B1D5", "Y@@ c #7FAAC8", "Z@@ c #7198A8", "`@@ c #567082", " #@ c #59677B", ".#@ c #7F8995", "+#@ c #EBE9EA", "@#@ c #FAF8F8", "##@ c #DBDBDB", "$#@ c #AE676E", "%#@ c #AD1328", "&#@ c #D30225", "*#@ c #E30228", "=#@ c #E40228", "-#@ c #E70227", ";#@ c #E20425", ">#@ c #AB001B", ",#@ c #A04052", "'#@ c #CBB1B5", ")#@ c #E2E3E3", "!#@ c #DFDFDD", "~#@ c #E1E1E2", "{#@ c #E2E3E2", "]#@ c #E2E2E3", "^#@ c #E1E0E1", "/#@ c #DCDBDC", "(#@ c #DBD9DA", "_#@ c #E2E2E0", ":#@ c #EEF0EF", "<#@ c #F1EFEF", "[#@ c #BDB7B7", "}#@ c #76595A", "|#@ c #9C1F33", "1#@ c #D3092A", "2#@ c #E30127", "3#@ c #DE042A", "4#@ c #B30324", "5#@ c #982C3F", "6#@ c #A7787D", "7#@ c #D5C6C5", "8#@ c #F5F1EF", "9#@ c #CACFD6", "0#@ c #AFC4BD", "a#@ c #7D7EAB", "b#@ c #3119A2", "c#@ c #20079E", "d#@ c #362E84", "e#@ c #8A91AE", "f#@ c #A4B1AE", "g#@ c #BAC1BA", "h#@ c #716F73", "i#@ c #525057", "j#@ c #383B44", "k#@ c #2E323B", "l#@ c #31323C", "m#@ c #323948", "n#@ c #343E4D", "o#@ c #35424B", "p#@ c #364654", "q#@ c #3C5160", "r#@ c #456068", "s#@ c #4E6E7D", "t#@ c #577A91", "u#@ c #6083A0", "v#@ c #6590B1", "w#@ c #6897B9", "x#@ c #6A96B8", "y#@ c #7895BB", "z#@ c #809CC0", "A#@ c #7CA8C2", "B#@ c #6EACBF", "C#@ c #6EB1C7", "D#@ c #79BAD9", "E#@ c #84BDE3", "F#@ c #91C4E9", "G#@ c #90BEDA", "H#@ c #526C7B", "I#@ c #343F47", "J#@ c #51616B", "K#@ c #7EB0CB", "L#@ c #95DAFF", "M#@ c #94D9FD", "N#@ c #92D8FC", "O#@ c #92D7FC", "P#@ c #91D6FA", "Q#@ c #90D9FF", "R#@ c #95DDFF", "S#@ c #97D4F7", "T#@ c #87A9BA", "U#@ c #69747C", "V#@ c #38363E", "W#@ c #313137", "X#@ c #323436", "Y#@ c #353135", "Z#@ c #37323B", "`#@ c #424859", " $@ c #7899B7", ".$@ c #97D7F8", "+$@ c #8FE2FD", "@$@ c #7EC4E0", "#$@ c #769FC1", "$$@ c #7485AA", "%$@ c #727FA7", "&$@ c #6D7998", "*$@ c #6A7382", "=$@ c #7F8390", "-$@ c #A2A5AF", ";$@ c #C9CCD0", ">$@ c #EEEEEE", ",$@ c #C9B4B6", "'$@ c #AE5764", ")$@ c #BC0F2D", "!$@ c #DB0024", "~$@ c #E90129", "{$@ c #E80223", "]$@ c #E6051A", "^$@ c #AD0015", "/$@ c #A14053", "($@ c #D0B4BB", "_$@ c #F3F1F1", ":$@ c #FEFCFC", "<$@ c #D6DEDD", "[$@ c #928D8E", "}$@ c #96303E", "|$@ c #AB031B", "1$@ c #B2031C", "2$@ c #C60020", "3$@ c #D60023", "4$@ c #DB0126", "5$@ c #E3012A", "6$@ c #E5002A", "7$@ c #BA0223", "8$@ c #962D3D", "9$@ c #967D7E", "0$@ c #D8E0DD", "a$@ c #D4DCE1", "b$@ c #B9CCC3", "c$@ c #8587B2", "d$@ c #331CA5", "e$@ c #1C00B5", "f$@ c #2000B7", "g$@ c #1B089A", "h$@ c #2A3072", "i$@ c #8792A4", "j$@ c #97A4A2", "k$@ c #A9AFAA", "l$@ c #E7E7E6", "m$@ c #E6E9E8", "n$@ c #9D9DA0", "o$@ c #72757B", "p$@ c #63696C", "q$@ c #4C5355", "r$@ c #374045", "s$@ c #39414D", "t$@ c #3D4555", "u$@ c #455164", "v$@ c #495B6E", "w$@ c #495C72", "x$@ c #555976", "y$@ c #5F627A", "z$@ c #647480", "A$@ c #6C8090", "B$@ c #708CA1", "C$@ c #6F9AB0", "D$@ c #7DA1BA", "E$@ c #8BADCA", "F$@ c #84ADCB", "G$@ c #506B7E", "H$@ c #35444F", "I$@ c #485C65", "J$@ c #6E99AC", "K$@ c #80B9D6", "L$@ c #7CB5D3", "M$@ c #77ACC9", "N$@ c #78B0CF", "O$@ c #74ADD1", "P$@ c #73ACD1", "Q$@ c #75ABCB", "R$@ c #80A7B7", "S$@ c #697B86", "T$@ c #3B3C49", "U$@ c #2B2934", "V$@ c #282528", "W$@ c #2B2730", "X$@ c #546176", "Y$@ c #7193AF", "Z$@ c #6F9DB9", "`$@ c #658BA1", " %@ c #687B91", ".%@ c #787993", "+%@ c #8683A1", "@%@ c #8C8BA2", "#%@ c #9696A0", "$%@ c #BFBEC5", "%%@ c #E7E6EA", "&%@ c #E6EEED", "*%@ c #C29EA3", "=%@ c #AB3042", "-%@ c #C20727", ";%@ c #DC0329", ">%@ c #E40128", ",%@ c #E90323", "'%@ c #E60519", ")%@ c #B10219", "!%@ c #953547", "~%@ c #AB9695", "{%@ c #DFE1DD", "]%@ c #B27C82", "^%@ c #AC535C", "/%@ c #A74E59", "(%@ c #B84053", "_%@ c #BE2F46", ":%@ c #B6233B", "<%@ c #BE0F2B", "[%@ c #CE0224", "}%@ c #DC0027", "|%@ c #E30128", "1%@ c #E70028", "2%@ c #CF0427", "3%@ c #A91B31", "4%@ c #8E4F58", "5%@ c #C6B7B9", "6%@ c #FAFBFC", "7%@ c #CBD4D6", "8%@ c #BBCEC3", "9%@ c #8789B2", "0%@ c #331CA4", "a%@ c #1C01B6", "b%@ c #1A089B", "c%@ c #2B2F74", "d%@ c #8D92A2", "e%@ c #91A0A6", "f%@ c #A0A6AB", "g%@ c #EAEBEC", "h%@ c #E5E4E5", "i%@ c #D8D9D9", "j%@ c #AAB2B2", "k%@ c #9B9FA0", "l%@ c #908E8F", "m%@ c #83817D", "n%@ c #6B6C6C", "o%@ c #55565C", "p%@ c #4C474D", "q%@ c #514D51", "r%@ c #4C4B58", "s%@ c #767077", "t%@ c #7C8B95", "u%@ c #86969D", "v%@ c #889EAD", "w%@ c #7396AE", "x%@ c #515C6D", "y%@ c #403A45", "z%@ c #464751", "A%@ c #55646F", "B%@ c #5D7788", "C%@ c #5B7A93", "D%@ c #526980", "E%@ c #53697F", "F%@ c #597690", "G%@ c #546C85", "H%@ c #4E6278", "I%@ c #506378", "J%@ c #54677A", "K%@ c #4C5869", "L%@ c #3B3B49", "M%@ c #2E2D39", "N%@ c #28252F", "O%@ c #241F24", "P%@ c #241E24", "Q%@ c #2E2C37", "R%@ c #323545", "S%@ c #343A49", "T%@ c #4E5461", "U%@ c #A3A0A3", "V%@ c #C9C6CA", "W%@ c #DACDCD", "X%@ c #AB686C", "Y%@ c #A72536", "Z%@ c #C30928", "`%@ c #DF0126", " &@ c #E50228", ".&@ c #E80227", "+&@ c #E50325", "@&@ c #B40322", "#&@ c #8A2F3B", "$&@ c #8B8273", "%&@ c #D4DAD0", "&&@ c #E9E4E3", "*&@ c #DFD5D6", "=&@ c #D0C6C7", "-&@ c #A99091", ";&@ c #946C6D", ">&@ c #983A44", ",&@ c #AE192E", "'&@ c #CA0D2C", ")&@ c #DD0629", "!&@ c #E20329", "~&@ c #C10626", "{&@ c #991B31", "]&@ c #AF757E", "^&@ c #DBCCCE", "/&@ c #B4BBBF", "(&@ c #B5C8BF", "_&@ c #8382AE", ":&@ c #321AA4", "<&@ c #1F07A3", "[&@ c #3C2D8D", "}&@ c #9190B1", "|&@ c #C2CBD0", "1&@ c #E9EBEC", "2&@ c #ECF0EF", "3&@ c #E7E9E9", "4&@ c #DFE1E0", "5&@ c #D4D7D5", "6&@ c #C7CCCC", "7&@ c #B8B8B9", "8&@ c #B7B7B6", "9&@ c #A7A7AB", "0&@ c #929191", "a&@ c #959093", "b&@ c #A7A4A8", "c&@ c #D0DCD9", "d&@ c #ACAFB9", "e&@ c #705674", "f&@ c #752942", "g&@ c #891F33", "h&@ c #862436", "i&@ c #572F37", "j&@ c #555A5F", "k&@ c #82909F", "l&@ c #9191A2", "m&@ c #908D9D", "n&@ c #9299A4", "o&@ c #888E97", "p&@ c #83868D", "q&@ c #7C808B", "r&@ c #6A6C74", "s&@ c #6F6F75", "t&@ c #757478", "u&@ c #7E7F81", "v&@ c #838285", "w&@ c #7E7B80", "x&@ c #65616D", "y&@ c #7B727E", "z&@ c #A3A0A6", "A&@ c #C4C5C6", "B&@ c #DBDAD8", "C&@ c #F1F0EE", "D&@ c #FEFEFC", "E&@ c #D5C4C3", "F&@ c #AA5059", "G&@ c #AF051F", "H&@ c #DD0023", "I&@ c #E50720", "J&@ c #E40819", "K&@ c #E3071A", "L&@ c #B8041E", "M&@ c #8F3140", "N&@ c #8D887D", "O&@ c #D1DAD3", "P&@ c #E4EBEA", "Q&@ c #D7DDDB", "R&@ c #CDCCCA", "S&@ c #CAABAE", "T&@ c #BE777E", "U&@ c #AD3D49", "V&@ c #AC182B", "W&@ c #C50622", "X&@ c #E60024", "Y&@ c #F00027", "Z&@ c #DF0829", "`&@ c #C01F2F", " *@ c #95333F", ".*@ c #A67E86", "+*@ c #E7E4E4", "@*@ c #A6ACB0", "#*@ c #839197", "$*@ c #AABDC1", "%*@ c #7D7AB9", "&*@ c #3118A7", "**@ c #2307AC", "=*@ c #482BA0", "-*@ c #9390BD", ";*@ c #9EAAAC", ">*@ c #D9DDDE", ",*@ c #EFEFF0", "'*@ c #C6C6C8", ")*@ c #F3F5F3", "!*@ c #E4F2EB", "~*@ c #B49DA5", "{*@ c #8C2747", "]*@ c #A70629", "^*@ c #C70B29", "/*@ c #C20C29", "(*@ c #790D1C", "_*@ c #704F56", ":*@ c #B0B4BE", "<*@ c #D0D0DC", "[*@ c #D6D1D7", "}*@ c #D8D6D7", "|*@ c #D3D1D0", "1*@ c #D2D0D1", "2*@ c #C5C6C9", "3*@ c #B8BAC0", "4*@ c #BABCC0", "5*@ c #D5D6D8", "6*@ c #D6D6D9", "7*@ c #BEC1C6", "8*@ c #BBBCC3", "9*@ c #D3CDD6", "0*@ c #EEECEE", "a*@ c #BE8F93", "b*@ c #A52D3F", "c*@ c #B70726", "d*@ c #C5091E", "e*@ c #C8101A", "f*@ c #BF101B", "g*@ c #950419", "h*@ c #833442", "i*@ c #9D9892", "j*@ c #DAE1DD", "k*@ c #FCFBFD", "l*@ c #F7F5F5", "m*@ c #DECECE", "n*@ c #BA9191", "o*@ c #9F5D61", "p*@ c #A63947", "q*@ c #C21E38", "r*@ c #CE0727", "s*@ c #D20722", "t*@ c #C81927", "u*@ c #750915", "v*@ c #7A5058", "w*@ c #DAD9D9", "x*@ c #A6AAAC", "y*@ c #807EBC", "z*@ c #321AA3", "A*@ c #1D00A8", "B*@ c #1A00B8", "C*@ c #2207AE", "D*@ c #462C9E", "E*@ c #9390BC", "F*@ c #A6B6BB", "G*@ c #CBCFD0", "H*@ c #B6B6B2", "I*@ c #9D5F66", "J*@ c #B91533", "K*@ c #D10327", "L*@ c #DE0428", "M*@ c #D90428", "N*@ c #A3001A", "O*@ c #944254", "P*@ c #BAB9C2", "Q*@ c #E3EFF2", "R*@ c #FAF9F8", "S*@ c #F9F7F7", "T*@ c #F5F5F6", "U*@ c #F4F4F6", "V*@ c #F9F8FA", "W*@ c #D9D2D2", "X*@ c #AB7D86", "Y*@ c #85253B", "Z*@ c #910F27", "`*@ c #97152A", " =@ c #83182C", ".=@ c #5D0B1E", "+=@ c #6D4148", "@=@ c #B1ACA6", "#=@ c #EAEDE9", "$=@ c #E6E5E4", "%=@ c #C3BCBB", "&=@ c #A49191", "*=@ c #966A6D", "==@ c #9D3944", "-=@ c #AF192D", ";=@ c #B4132A", ">=@ c #640F1A", ",=@ c #705D5F", "'=@ c #899094", ")=@ c #BBCECB", "!=@ c #888AB6", "~=@ c #331C9B", "{=@ c #1B00A5", "]=@ c #1C00B9", "^=@ c #1C08A2", "/=@ c #332F80", "(=@ c #8D8DA6", "_=@ c #C0C7CB", ":=@ c #D2D2D2", "<=@ c #E5EDE8", "[=@ c #B5B1AB", "}=@ c #985E63", "|=@ c #A82236", "1=@ c #D0092A", "2=@ c #E20229", "3=@ c #AE001F", "4=@ c #93384C", "5=@ c #A5A0A6", "6=@ c #E0EBEB", "7=@ c #F3F7F7", "8=@ c #CEC2C5", "9=@ c #966A73", "0=@ c #6B2131", "a=@ c #560316", "b=@ c #520A1E", "c=@ c #55232D", "d=@ c #886E6F", "e=@ c #D7D3D1", "f=@ c #E6ECEA", "g=@ c #D6DAD8", "h=@ c #CBCCC9", "i=@ c #D0B9BA", "j=@ c #CF9EA5", "k=@ c #C18591", "l=@ c #987B81", "m=@ c #A8A4A5", "n=@ c #A9BABF", "o=@ c #BCD0C5", "p=@ c #898DB6", "q=@ c #331DA1", "r=@ c #1900A8", "s=@ c #1D089F", "t=@ c #322F7F", "u=@ c #8C8DA4", "v=@ c #C0C6C9", "w=@ c #ADB0B2", "x=@ c #E7E7E8", "y=@ c #C8CFCF", "z=@ c #A6A1A5", "A=@ c #92626D", "B=@ c #CB0425", "C=@ c #DB0327", "D=@ c #E3032A", "E=@ c #B30524", "F=@ c #8C2B3C", "G=@ c #86787B", "H=@ c #CFD3D3", "I=@ c #EEEBEB", "J=@ c #C7B8B8", "K=@ c #8C6D74", "L=@ c #663D47", "M=@ c #633943", "N=@ c #876B6C", "O=@ c #C0B3B1", "P=@ c #E0E7E7", "Q=@ c #D4D7D8", "R=@ c #A0A4A9", "S=@ c #87949A", "T=@ c #AABEC4", "U=@ c #8B8CBA", "V=@ c #1A00AA", "W=@ c #2106A6", "X=@ c #412C96", "Y=@ c #9191B4", "Z=@ c #BECDCE", "`=@ c #EAEBEA", " -@ c #5E4152", ".-@ c #8D2A4E", "+-@ c #C20F36", "@-@ c #D90226", "#-@ c #E0072B", "$-@ c #E3062B", "%-@ c #C30827", "&-@ c #951C2F", "*-@ c #734D4F", "=-@ c #B9B5B3", "--@ c #F2F0F0", ";-@ c #D7D6D8", ">-@ c #B7B3B5", ",-@ c #A79FA0", "'-@ c #CDC8C8", ")-@ c #F1F0EF", "!-@ c #A6ACAE", "~-@ c #BFD2CE", "{-@ c #8F8DBD", "]-@ c #351DA7", "^-@ c #1D08A1", "/-@ c #363185", "(-@ c #8B95AF", "_-@ c #BDCFD1", ":-@ c #D9DBDC", "<-@ c #EFF0EE", "[-@ c #C0C7C0", "}-@ c #8A8D89", "|-@ c #5F5D61", "1-@ c #2B2C37", "2-@ c #391C2C", "3-@ c #5E0D26", "4-@ c #740A22", "5-@ c #940B24", "6-@ c #BF0B29", "7-@ c #E2092D", "8-@ c #EF052C", "9-@ c #E80328", "0-@ c #B30926", "a-@ c #872434", "b-@ c #AB8E94", "c-@ c #DAE1E2", "d-@ c #F2FBFA", "e-@ c #F9FCFD", "f-@ c #DDDCDD", "g-@ c #96979B", "h-@ c #9CA5A8", "i-@ c #BDD5CF", "j-@ c #8D91BE", "k-@ c #341EA7", "l-@ c #1D00B8", "m-@ c #1A059B", "n-@ c #2A2873", "o-@ c #8690A4", "p-@ c #BFCDCE", "q-@ c #BDC1C3", "r-@ c #E9EBE9", "s-@ c #AFB4AE", "t-@ c #686B68", "u-@ c #47474C", "v-@ c #4C4C55", "w-@ c #6D5F68", "x-@ c #6A4A55", "y-@ c #563C45", "z-@ c #652C37", "A-@ c #96182D", "B-@ c #B80928", "C-@ c #C80426", "D-@ c #D30227", "E-@ c #E3042A", "F-@ c #D20024", "G-@ c #A80F2A", "H-@ c #905F6A", "I-@ c #B0B8B9", "J-@ c #EBF3F2", "K-@ c #7D7D81", "L-@ c #949FA2", "M-@ c #BED8CF", "N-@ c #8C94BF", "O-@ c #1A009E", "P-@ c #2A177C", "Q-@ c #8786A4", "R-@ c #C0CCCA", "S-@ c #BDCACE", "T-@ c #999FA3", "U-@ c #D1D2D2", "V-@ c #ABABAD", "W-@ c #BEC3C4", "X-@ c #D0D2D5", "Y-@ c #848F94", "Z-@ c #69575D", "`-@ c #6F2A37", " ;@ c #7A1A30", ".;@ c #86172F", "+;@ c #9B122C", "@;@ c #C9092A", "#;@ c #B60E2A", "$;@ c #6D3541", "%;@ c #848C8E", "&;@ c #E4E9E9", "*;@ c #DFE5E4", "=;@ c #787B7F", "-;@ c #C1D9D0", ";;@ c #8F96C1", ">;@ c #351EA7", ",;@ c #1C00A7", "';@ c #1C02A3", ");@ c #321C98", "!;@ c #8A8AB4", "~;@ c #BECECB", "{;@ c #9AB1B8", "];@ c #78797F", "^;@ c #E4E3E4", "/;@ c #F2F2F4", "(;@ c #EAEAEC", "_;@ c #F1F7F5", ":;@ c #EBF1F3", "<;@ c #9CA4A7", "[;@ c #5E5960", "};@ c #543D48", "|;@ c #826B76", "1;@ c #8A7579", "2;@ c #6C4545", "3;@ c #751B28", "4;@ c #8C0A23", "5;@ c #92142D", "6;@ c #633545", "7;@ c #82888C", "8;@ c #E3E7E8", "9;@ c #A3A5A5", "0;@ c #878D94", "a;@ c #C0D4CC", "b;@ c #9298BE", "c;@ c #3D28A9", "d;@ c #1E00A6", "e;@ c #1C02A4", "f;@ c #321E9A", "g;@ c #898CB9", "h;@ c #BDCED0", "i;@ c #99B3B9", "j;@ c #B7B9BA", "k;@ c #818286", "l;@ c #7F7E85", "m;@ c #B6BDC1", "n;@ c #C1CEC9", "o;@ c #90978D", "p;@ c #5A4C4D", "q;@ c #461927", "r;@ c #55172A", "s;@ c #7A616F", "t;@ c #B3B9BE", "u;@ c #EFF2F3", "v;@ c #7A7A7D", "w;@ c #696B71", "x;@ c #C0D3CC", "y;@ c #9498BF", "z;@ c #432EAC", "A;@ c #2003A9", "B;@ c #1A009F", "C;@ c #2C1684", "D;@ c #8786B0", "E;@ c #ABAEB0", "F;@ c #ECEFEF", "G;@ c #E1E4E4", "H;@ c #CFD3D2", "I;@ c #D5D7D9", "J;@ c #EAEDEE", "K;@ c #F2F8F6", "L;@ c #E2E7E4", "M;@ c #8C9396", "N;@ c #3F4148", "O;@ c #F0F4F4", "P;@ c #D7D8D9", "Q;@ c #919199", "R;@ c #777781", "S;@ c #C3D4CF", "T;@ c #9899C3", "U;@ c #432BAF", "V;@ c #1A009A", "W;@ c #2B137C", "X;@ c #8786AB", "Y;@ c #6A6E74", "Z;@ c #9C9C9F", "`;@ c #E9EBEB", " >@ c #D3D7D7", ".>@ c #A1A7A9", "+>@ c #94999B", "@>@ c #8C9298", "#>@ c #C4D5D0", "$>@ c #999AC4", "%>@ c #4229B0", "&>@ c #2C147E", "*>@ c #8587AB", "=>@ c #BDCFD0", "->@ c #95989D", ";>@ c #C1C0C3", ">>@ c #F0F1F1", ",>@ c #C8C7CC", "'>@ c #A9ADB3", ")>@ c #A0ADB1", "!>@ c #B1BEC0", "~>@ c #BBC7CA", "{>@ c #989AC4", "]>@ c #422BAE", "^>@ c #1F01A8", "/>@ c #2B147F", "(>@ c #8486AB", "_>@ c #BBCED1", ":>@ c #868890", "<>@ c #BBBEC1", "[>@ c #E9EDED", "}>@ c #A3A7AE", "|>@ c #C3D5D0", "1>@ c #969CC3", "2>@ c #422EAC", "3>@ c #2202AB", "4>@ c #2C137F", "5>@ c #8385AD", "6>@ c #90979D", "7>@ c #D9D7D9", "8>@ c #F6F7F9", "9>@ c #F3F2F6", "0>@ c #CCCDD2", "a>@ c #C1D7D1", "b>@ c #959DC3", "c>@ c #432EAE", "d>@ c #7F878D", "e>@ c #8F9498", "f>@ c #ABAEB1", "g>@ c #BFC3C5", "h>@ c #DCDFDF", "i>@ c #EEF1F1", "j>@ c #CACAD0", "k>@ c #C0D8D0", "l>@ c #959DC4", "m>@ c #2B137E", "n>@ c #8385AB", "o>@ c #8D989D", "p>@ c #7F7D80", "q>@ c #D6D6D6", "r>@ c #959CC4", "s>@ c #2C157C", "t>@ c #8586A5", "u>@ c #BDCDCB", "v>@ c #90989D", "w>@ c #92949B", "x>@ c #9B9CA0", "y>@ c #EEECEC", "z>@ c #BFD5D0", "A>@ c #959CC3", "B>@ c #1E01AB", "C>@ c #1A009D", "D>@ c #2C1185", "E>@ c #8681A8", "F>@ c #BECACA", "G>@ c #7A7F86", "H>@ c #C8CBCD", "I>@ c #D8DADA", "J>@ c #E9E9E9", "K>@ c #D6D6D8", "L>@ c #C1C3C5", "M>@ c #A7ABAE", "N>@ c #969EA1", "O>@ c #B4C0C1", "P>@ c #C3D6D2", "Q>@ c #969CC5", "R>@ c #1A00A4", "S>@ c #2C0B91", "T>@ c #847AAF", "U>@ c #99A2A8", "V>@ c #858E93", "W>@ c #7E878B", "X>@ c #939A9D", "Y>@ c #93989E", "Z>@ c #A8B2B9", "`>@ c #C7D7D5", " ,@ c #9A9DC8", ".,@ c #442DB1", "+,@ c #1B00A1", "@,@ c #2C1085", "#,@ c #817CA8", "$,@ c #9DADB2", "%,@ c #9CA9AB", "&,@ c #98A0A2", "*,@ c #F6F6F5", "=,@ c #D3D0CE", "-,@ c #B0AEAE", ";,@ c #A1A3A6", ">,@ c #A2A7AE", ",,@ c #B4C6D1", "',@ c #C7D7D6", "),@ c #9B9FC7", "!,@ c #4635A9", "~,@ c #2205AA", "{,@ c #2B1183", "],@ c #807FA6", "^,@ c #8C979E", "/,@ c #747A81", "(,@ c #7D8185", "_,@ c #B0B2B6", ":,@ c #BEC0C3", "<,@ c #CED0D2", "[,@ c #D8DBDD", "},@ c #FDFEFF", "|,@ c #E6E8E8", "1,@ c #92999F", "2,@ c #C5D7D3", "3,@ c #999FC4", "4,@ c #2B0B90", "5,@ c #7E7BAD", "6,@ c #B5C9C9", "7,@ c #CDD4D4", "8,@ c #E2E4E4", "9,@ c #D5DBDA", "0,@ c #B0B4B4", "a,@ c #9EA0A3", "b,@ c #B9C4C5", "c,@ c #B5BBBD", "d,@ c #B5B8BC", "e,@ c #BAC3CA", "f,@ c #B8C5C7", "g,@ c #B8C4C7", "h,@ c #C1D8D0", "i,@ c #969DC5", "j,@ c #432FAF", "k,@ c #2202AD", "l,@ c #1902AC", "m,@ c #1700A1", "n,@ c #2B0A93", "o,@ c #7C76AC", "p,@ c #98A0A4", "q,@ c #989A9F", "r,@ c #9D9DA3", "s,@ c #AAAAB2", "t,@ c #C1C7C9", "u,@ c #DFE6E4", "v,@ c #C8C6C7", "w,@ c #9EA6AA", "x,@ c #BBBEC5", "y,@ c #C5ACB2", "z,@ c #C5A0A3", "A,@ c #BFA4A6", "B,@ c #B8B3B7", "C,@ c #B8B4BB", "D,@ c #C6949F", "E,@ c #C1B4BB", "F,@ c #BFBBC1", "G,@ c #C49AA4", "H,@ c #C7999F", "I,@ c #BFAFB4", "J,@ c #C3D8D1", "K,@ c #979FC3", "L,@ c #4230AA", "M,@ c #1A03AC", "N,@ c #2B0A92", "O,@ c #7B72A7", "P,@ c #9FAAAE", "Q,@ c #B6BFBF", "R,@ c #C9CECE", "S,@ c #D8D5D5", "T,@ c #E8E6E5", "U,@ c #F3F3F2", "V,@ c #E8E8E8", "W,@ c #D7D7DA", "X,@ c #CCCCCF", "Y,@ c #92999D", "Z,@ c #BABCC4", "`,@ c #C3A2A8", " '@ c #CD888F", ".'@ c #C88F97", "+'@ c #B8B2B4", "@'@ c #ADCBCC", "#'@ c #B7AEB7", "$'@ c #C98190", "%'@ c #C4ADB2", "&'@ c #C3B0B7", "*'@ c #CC7A8B", "='@ c #D0707A", "-'@ c #C59599", ";'@ c #C1D4CF", ">'@ c #4E43A5", ",'@ c #270CAA", "''@ c #1A00A5", ")'@ c #7A71A3", "!'@ c #A3B2B5", "~'@ c #828A90", "{'@ c #8D898A", "]'@ c #B3B0AF", "^'@ c #D8D8D6", "/'@ c #DBDCDC", "('@ c #9BA3A6", "_'@ c #898D94", ":'@ c #878991", "<'@ c #A1ABB1", "['@ c #B6C6D3", "}'@ c #B5ADAE", "|'@ c #C5828D", "1'@ c #CA8592", "2'@ c #BFB3B5", "3'@ c #B3CBCF", "4'@ c #B9B4BB", "5'@ c #C89198", "6'@ c #BCB1B5", "7'@ c #BAAFB7", "8'@ c #CA7D8E", "9'@ c #D0656F", "0'@ c #C88587", "a'@ c #BBCDCB", "b'@ c #9FA8BB", "c'@ c #645CA5", "d'@ c #3117AF", "e'@ c #786EA3", "f'@ c #A3B4B9", "g'@ c #949EA2", "h'@ c #959C9F", "i'@ c #9BA0A2", "j'@ c #9BA1A3", "k'@ c #9CA3A4", "l'@ c #A1A6A8", "m'@ c #A4A5AB", "n'@ c #A5A4AA", "o'@ c #AAAAAC", "p'@ c #FDFEFC", "q'@ c #BCC5C6", "r'@ c #A0A3A9", "s'@ c #A2A7AD", "t'@ c #B1C8D2", "u'@ c #BDC4C9", "v'@ c #B7BDC5", "w'@ c #BFA9B3", "x'@ c #C99CA3", "y'@ c #C9A0A4", "z'@ c #BDB7BA", "A'@ c #C8979B", "B'@ c #BAAEB3", "C'@ c #B2BDC0", "D'@ c #BCADA9", "E'@ c #C89396", "F'@ c #C7989D", "G'@ c #BAB4B7", "H'@ c #A1ACBE", "I'@ c #6A62A7", "J'@ c #341AAC", "K'@ c #776CA3", "L'@ c #AFB8BC", "M'@ c #818E92", "N'@ c #72757C", "O'@ c #A6A8AA", "P'@ c #A5A6A8", "Q'@ c #D3D4D5", "R'@ c #DBDCD7", "S'@ c #DEE0DA", "T'@ c #DBDEDD", "U'@ c #DBDDDF", "V'@ c #DEDEDE", "W'@ c #D7D9DA", "X'@ c #ABB3B6", "Y'@ c #A5ADB5", "Z'@ c #BFC8CC", "`'@ c #C0BABF", " )@ c #C69FA2", ".)@ c #C48E92", "+)@ c #BCB1B1", "@)@ c #C0B5B6", "#)@ c #CA989D", "$)@ c #BDACB2", "%)@ c #B7C8BE", "&)@ c #C7A1A1", "*)@ c #C6949B", "=)@ c #B6ACB1", "-)@ c #B7C4D1", ";)@ c #A3ACC1", ">)@ c #756DA2", ",)@ c #5A5F65", "')@ c #50565C", "))@ c #45494C", "!)@ c #3D3D3F", "~)@ c #707074", "{)@ c #8F9082", "])@ c #94998A", "^)@ c #919494", "/)@ c #B6B3B2", "()@ c #CECDCE", "_)@ c #E2E3E5", ":)@ c #F8F9FA", "<)@ c #F5F7F7", "[)@ c #A8A9AA", "})@ c #9FA0A2", "|)@ c #83858D", "1)@ c #828A8E", "2)@ c #8E9CA2", "3)@ c #B9C5C6", "4)@ c #C6A8AA", "5)@ c #C48F93", "6)@ c #B48E91", "7)@ c #B6B0B0", "8)@ c #C2B5B7", "9)@ c #C9A0A7", "0)@ c #C0B2B6", "a)@ c #B8C7C8", "b)@ c #C98B8E", "c)@ c #C68185", "d)@ c #B7AAAE", "e)@ c #BCBAC3", "f)@ c #BEBFC8", "g)@ c #BFCFD2", "h)@ c #A5ACC2", "i)@ c #6960A7", "j)@ c #331AA8", "k)@ c #2C0A93", "l)@ c #736CA2", "m)@ c #A8B9BC", "n)@ c #6C7176", "o)@ c #6B6E72", "p)@ c #6A716C", "q)@ c #5D5E62", "r)@ c #4F5256", "s)@ c #514E4F", "t)@ c #5C595A", "u)@ c #6B696B", "v)@ c #79777A", "w)@ c #848388", "x)@ c #91908C", "y)@ c #999A92", "z)@ c #9C9D9D", "A)@ c #A4A5A7", "B)@ c #AAABB0", "C)@ c #AEAEB5", "D)@ c #B4B8AF", "E)@ c #BBB8AA", "F)@ c #BDADA8", "G)@ c #AAAFA8", "H)@ c #ADC0B9", "I)@ c #CDD8D7", "J)@ c #E3E3E1", "K)@ c #888686", "L)@ c #737276", "M)@ c #70777D", "N)@ c #919CA2", "O)@ c #A6B1B6", "P)@ c #97A5AE", "Q)@ c #96ABB3", "R)@ c #A1B4BC", "S)@ c #BCB6B9", "T)@ c #C68E90", "U)@ c #CB9396", "V)@ c #C2A7AA", "W)@ c #B5B2B6", "X)@ c #B7BFC2", "Y)@ c #BDBAC0", "Z)@ c #B6BEC2", "`)@ c #BFABB1", " !@ c #BDA8AD", ".!@ c #BDD0D1", "+!@ c #A2AEC1", "@!@ c #6961A7", "#!@ c #341AA6", "$!@ c #1B00A6", "%!@ c #290995", "&!@ c #6F6A9F", "*!@ c #A6B7B9", "=!@ c #87969B", "-!@ c #7E8C91", ";!@ c #5D656A", ">!@ c #515458", ",!@ c #4D5154", "'!@ c #53575B", ")!@ c #5A5D61", "!!@ c #5B5E5F", "~!@ c #636762", "{!@ c #676A64", "]!@ c #616166", "^!@ c #646468", "/!@ c #67676D", "(!@ c #6D7269", "_!@ c #746E61", ":!@ c #715E5D", "~@ c #A4B4B1", ",~@ c #B5C7C9", "'~@ c #BCCECD", ")~@ c #B8CBCB", "!~@ c #909BA0", "~~@ c #868C90", "{~@ c #7E8689", "]~@ c #798186", "^~@ c #767C82", "/~@ c #7D7C7E", "(~@ c #7E7C7F", "_~@ c #777D84", ":~@ c #778883", "<~@ c #7A8982", "[~@ c #7A7F80", "}~@ c #737274", "|~@ c #808081", "1~@ c #848485", "2~@ c #828182", "3~@ c #7F8181", "4~@ c #7E8183", "5~@ c #7D8083", "6~@ c #7B7C7E", "7~@ c #7B797E", "8~@ c #838284", "9~@ c #8A8989", "0~@ c #8B8B8B", "a~@ c #94948B", "b~@ c #8E9392", "c~@ c #94958D", "d~@ c #94958A", "e~@ c #8E908A", "f~@ c #888A8A", "g~@ c #8A898A", "h~@ c #878584", "i~@ c #7F7C80", "j~@ c #818084", "k~@ c #8C8C8D", "l~@ c #8F9294", "m~@ c #8C8F93", "n~@ c #7C7B7C", "o~@ c #767475", "p~@ c #767879", "q~@ c #757879", "r~@ c #747478", "s~@ c #716D70", "t~@ c #676C6C", "u~@ c #989FA6", "v~@ c #A3A9B0", "w~@ c #B5CFD3", "x~@ c #B5CED3", "y~@ c #BDC7CB", "z~@ c #BDC8CB", "A~@ c #B3CAD0", "B~@ c #AFCAD4", "C~@ c #B7C6C9", "D~@ c #BED1D2", "E~@ c #A2AFC3", "F~@ c #6365AE", "G~@ c #2D1BB8", "H~@ c #1B00B8", "I~@ c #2101B2", "J~@ c #1E00B8", "K~@ c #1B00B7", "L~@ c #1901B4", "M~@ c #1901B7", "N~@ c #1F03AC", "O~@ c #2102A8", "P~@ c #1C01AA", "Q~@ c #230797", "R~@ c #6A649B", "S~@ c #A4B2B0", "T~@ c #BCCFD4", "U~@ c #7D8C93", "V~@ c #78908B", "W~@ c #779088", "X~@ c #768688", "Y~@ c #6F7B81", "Z~@ c #6A7479", "`~@ c #73787D", " {@ c #676C6F", ".{@ c #676A6E", "+{@ c #676A6C", "@{@ c #686C6D", "#{@ c #646B6E", "${@ c #60676F", "%{@ c #57595E", "&{@ c #5C6065", "*{@ c #63676A", "={@ c #6C706F", "-{@ c #71756E", ";{@ c #6E7678", ">{@ c #6C7478", ",{@ c #6F746E", "'{@ c #74796D", "){@ c #6B716D", "!{@ c #5F656A", "~{@ c #626568", "{{@ c #5F6366", "]{@ c #5D5D5F", "^{@ c #5A5658", "/{@ c #54575F", "({@ c #62666A", "_{@ c #677075", ":{@ c #666C6F", "<{@ c #5F6165", "[{@ c #5E6165", "}{@ c #696B6D", "|{@ c #686D6F", "1{@ c #6B6F72", "2{@ c #BBC2CA", "3{@ c #B2C6C9", "4{@ c #B2CACE", "5{@ c #BBB9C0", "6{@ c #BFB9C0", "7{@ c #BDC5C8", "8{@ c #B8C1C8", "9{@ c #BBBBC2", "0{@ c #B5BFC4", "a{@ c #B2C5C8", "b{@ c #B8C3C9", "c{@ c #BAC2C8", "d{@ c #BCC3C5", "e{@ c #BDD2D3", "f{@ c #A7AABA", "g{@ c #775694", "h{@ c #4014A1", "i{@ c #2300B0", "j{@ c #2105AB", "k{@ c #2904A7", "l{@ c #2801A6", "m{@ c #2002A6", "n{@ c #1C01AF", "o{@ c #2800AA", "p{@ c #2403AF", "q{@ c #2006B4", "r{@ c #2106B3", "s{@ c #2403B0", "t{@ c #2600AD", "u{@ c #2700A9", "v{@ c #2002A8", "w{@ c #1E02AC", "x{@ c #2302B0", "y{@ c #2004AA", "z{@ c #2602AB", "A{@ c #2801AB", "B{@ c #2305B1", "C{@ c #2102B1", "D{@ c #6A609B", "E{@ c #AABEC1", "F{@ c #A8BEC0", "G{@ c #A4BABE", "H{@ c #A0B7BC", "I{@ c #A3B6BB", "J{@ c #A8B2B8", "K{@ c #A4B2B4", "L{@ c #A7B6B8", "M{@ c #909C9F", "N{@ c #8A9297", "O{@ c #8A8C94", "P{@ c #9BA7AC", "Q{@ c #9FADB1", "R{@ c #A6B2B9", "S{@ c #A8B5B6", "T{@ c #AAB3B5", "U{@ c #A9B6BA", "V{@ c #B5B7BC", "W{@ c #BFAEB2", "X{@ c #C5AEB2", "Y{@ c #C3B4B8", "Z{@ c #C4B6B9", "`{@ c #BDB4B6", " ]@ c #BDB2B3", ".]@ c #BEB9BC", "+]@ c #C28B96", "@]@ c #C98A98", "#]@ c #C4AEB2", "$]@ c #C7B4B5", "%]@ c #BDA7B0", "&]@ c #AB9FB0", "*]@ c #ADAFB8", "=]@ c #BCAEB1", "-]@ c #C69A9F", ";]@ c #BBA5A7", ">]@ c #B1B2B1", ",]@ c #B1B1B1", "']@ c #B7B2B2", ")]@ c #C1B5B7", "!]@ c #B7B3B3", "~]@ c #B5AFB0", "{]@ c #C1ADB0", "]]@ c #C3B3B5", "^]@ c #C4B3B4", "/]@ c #C5ADB1", "(]@ c #B5B2BB", "_]@ c #ACB9C5", ":]@ c #B79BA6", "<]@ c #9B3A65", "[]@ c #690A71", "}]@ c #410696", "|]@ c #3211A8", "1]@ c #450B95", "2]@ c #44048F", "3]@ c #2A049E", "4]@ c #24079C", "5]@ c #360690", "6]@ c #49048B", "7]@ c #3D0D9F", "8]@ c #2E15AE", "9]@ c #3014AD", "0]@ c #420A97", "a]@ c #4F0389", "b]@ c #4D048A", "c]@ c #340791", "d]@ c #340790", "e]@ c #47058D", "f]@ c #3100A1", "g]@ c #2205B1", "h]@ c #2D11AE", "i]@ c #450994", "j]@ c #480791", "k]@ c #3510A7", "l]@ c #2407B5", "m]@ c #220796", "n]@ c #6D67A3", "o]@ c #B7CACD", "p]@ c #B6C6C8", "q]@ c #B4C6C9", "r]@ c #B7C7CA", "s]@ c #B9C7C8", "t]@ c #B5CBCE", "u]@ c #B5CBCC", "v]@ c #B6C7CA", "w]@ c #B6C6C7", "x]@ c #B7CCCF", "y]@ c #B9CDD0", "z]@ c #B6CDD0", "A]@ c #B8CDD0", "B]@ c #C0CFD3", "C]@ c #BBCBCF", "D]@ c #BBCDCE", "E]@ c #BCCFD3", "F]@ c #BFCED3", "G]@ c #BBCDD0", "H]@ c #B9CBD4", "I]@ c #BECDD1", "J]@ c #BDCFD3", "K]@ c #BCCFD2", "L]@ c #BCCFD1", "M]@ c #B6CBCD", "N]@ c #B6C9CB", "O]@ c #B6C8CA", "P]@ c #B8D0D2", "Q]@ c #BFAFAF", "R]@ c #C87476", "S]@ c #CF6162", "T]@ c #D06E6F", "U]@ c #CE7F7F", "V]@ c #D07476", "W]@ c #CE6769", "X]@ c #C96667", "Y]@ c #CD6568", "Z]@ c #CC7074", "`]@ c #C58385", " ^@ c #C48A8B", ".^@ c #C68081", "+^@ c #C76C6D", "@^@ c #BE5457", "#^@ c #BE5F65", "$^@ c #CA7F8A", "%^@ c #CF868A", "&^@ c #CB7577", "*^@ c #C56269", "=^@ c #C7666A", "-^@ c #CC6E6F", ";^@ c #CF7373", ">^@ c #C97D7F", ",^@ c #C57A7B", "'^@ c #C76B6D", ")^@ c #C86262", "!^@ c #C97777", "~^@ c #CB9595", "{^@ c #CB7C7E", "]^@ c #C26567", "^^@ c #BA6667", "/^@ c #C56869", "(^@ c #D06F70", "_^@ c #CE7C7C", ":^@ c #C78284", "<^@ c #C28286", "[^@ c #CBA8A9", "}^@ c #C18593", "|^@ c #A82C54", "1^@ c #97154D", "2^@ c #8C1F5F", "3^@ c #83226B", "4^@ c #730E6F", "5^@ c #70096D", "6^@ c #7A1868", "7^@ c #7E1E62", "8^@ c #851D5C", "9^@ c #8E1C5A", "0^@ c #8B2262", "a^@ c #771D72", "b^@ c #630F7D", "c^@ c #79156B", "d^@ c #911D59", "e^@ c #921C57", "f^@ c #6B0D70", "g^@ c #6D0867", "h^@ c #8E0C4B", "i^@ c #650774", "j^@ c #3F0499", "k^@ c #490A93", "l^@ c #7B186B", "m^@ c #8A195E", "n^@ c #690E77", "o^@ c #3404A3", "p^@ c #1F01AB", "q^@ c #230899", "r^@ c #6662A1", "s^@ c #9FAFB3", "t^@ c #B4C6C5", "u^@ c #B7C3C7", "v^@ c #BCABAE", "w^@ c #C77076", "x^@ c #CC5D66", "y^@ c #CB6B74", "z^@ c #CA7A82", "A^@ c #C96F75", "B^@ c #C9646B", "C^@ c #CA666C", "D^@ c #CB6567", "E^@ c #CB6D6E", "F^@ c #CA7A80", "G^@ c #C98188", "H^@ c #CC777B", "I^@ c #CC6769", "J^@ c #B96366", "K^@ c #B66F79", "L^@ c #C57F92", "M^@ c #CA8290", "N^@ c #CA787E", "O^@ c #CA6A6F", "P^@ c #C75D66", "Q^@ c #C66570", "R^@ c #C87B83", "S^@ c #C98285", "T^@ c #CB7776", "U^@ c #CD6667", "V^@ c #CD5D64", "W^@ c #CA737D", "X^@ c #C8929B", "Y^@ c #CE797D", "Z^@ c #C66262", "`^@ c #B56362", " /@ c #C06167", "./@ c #CC6A73", "+/@ c #CA7A83", "@/@ c #C97F87", "#/@ c #CA7B80", "$/@ c #CA7D7D", "%/@ c #CD9EA1", "&/@ c #BB8C9B", "*/@ c #9B496A", "=/@ c #87255F", "-/@ c #841D5F", ";/@ c #831D5D", ">/@ c #680A73", ",/@ c #650977", "'/@ c #7F1B65", ")/@ c #861F60", "!/@ c #831E63", "~/@ c #831D65", "{/@ c #862060", "]/@ c #781668", "^/@ c #630775", "//@ c #7E1365", "(/@ c #90205C", "_/@ c #841E65", ":/@ c #650D76", "(@ c #9E92B5", ",(@ c #7B6E93", "'(@ c #4A2A92", ")(@ c #320693", "!(@ c #33078D", "~(@ c #2D039C", "{(@ c #2D03A2", "](@ c #350899", "^(@ c #370996", "/(@ c #32079F", "((@ c #35089A", "_(@ c #320798", ":(@ c #30049A", "<(@ c #500784", "[(@ c #53088A", "}(@ c #3407A5", "|(@ c #2A089D", "1(@ c #4C087C", "2(@ c #720666", "3(@ c #4C0685", "4(@ c #2603A4", "5(@ c #2500AB", "6(@ c #31079D", "7(@ c #34079A", "8(@ c #2D01A5", "9(@ c #2400AE", "0(@ c #2F15AE", "a(@ c #3C2BAA", "b(@ c #4139AA", "c(@ c #4736AF", "d(@ c #4933B4", "e(@ c #4735B3", "f(@ c #4636B2", "g(@ c #4736B3", "h(@ c #4736B4", "i(@ c #4937B5", "j(@ c #4636B3", "k(@ c #4637B3", "l(@ c #4636B4", "m(@ c #4737B4", "n(@ c #4737B3", "o(@ c #4438B2", "p(@ c #4439B2", "q(@ c #4537B2", "r(@ c #4338B1", "s(@ c #4437B2", "t(@ c #4538B3", "u(@ c #4B38B0", "v(@ c #4A3AAF", "w(@ c #4439B1", "x(@ c #4836B4", "y(@ c #4537B3", "z(@ c #493AAF", "A(@ c #4C38AF", "B(@ c #4837B3", "C(@ c #4737B5", "D(@ c #4437B1", "E(@ c #4339B4", "F(@ c #453BBB", "G(@ c #453BB9", "H(@ c #443BB4", "I(@ c #453AB5", "J(@ c #443ABE", "K(@ c #443CC0", "L(@ c #463CBB", "M(@ c #4A3DB6", "N(@ c #4C3DB7", "O(@ c #4938BB", "P(@ c #4837BD", "Q(@ c #4937B9", "R(@ c #4C37B4", "S(@ c #4A37B6", "T(@ c #4B38B6", "U(@ c #4D39B2", "V(@ c #4839B3", "W(@ c #453AB7", "X(@ c #473BBC", "Y(@ c #4333BB", "Z(@ c #4531B8", "`(@ c #4A35B8", " _@ c #4D36B4", "._@ c #4D36B1", "+_@ c #4C37B1", "@_@ c #4E3AB2", "#_@ c #4C3BB4", "$_@ c #4639B3", "%_@ c #4439AF", "&_@ c #4F3AAA", "*_@ c #4B39B2", "=_@ c #4938B9", "-_@ c #4B37BA", ";_@ c #4A37B8", ">_@ c #4837B6", ",_@ c #4A37B7", "'_@ c #4B36BE", ")_@ c #4834B9", "!_@ c #250FA9", "~_@ c #1900AA", "{_@ c #1B00AB", "]_@ c #1F02A6", "^_@ c #1E02AB", "/_@ c #1D02AB", "(_@ c #2004A5", "__@ c #2D049B", ":_@ c #2B02A2", "<_@ c #1B01B4", "[_@ c #1803B3", "}_@ c #2604A9", "|_@ c #3501A3", "1_@ c #2902A7", "2_@ c #1F02AD", ". + @ # $ % & * = - ; ; - > - , ' ) ! ~ { ] ; ^ ; ' ] > - ' ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; - ; / ( _ - ; ; ; ; ; ; ; ; ; - : { < [ - ; ; ; ; ; ; ; ; ; ; ; ; ; ; - } | ) ! 1 { > - ' ; ; ; ; ; ; ; ; ; ; ; , 2 3 4 : - 5 ( _ - ; ; ; ; ; ; ; ; ; ; ; 6 7 8 4 { < [ 9 0 a - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ' , b c - | ; ; ; ; ; , 2 3 4 { [ - ; ; ; , > d e ] , ; ; , 2 3 4 { [ - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; , ' ) ! ~ { < [ - ; ; ; ; ; ; ; ; ; ; ; ; ; ' f g [ - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ' f h i j k l m n o p ", "q + r s t % & * = - ; ; - > ] | ' ) u ~ { > - ' ; | ] < - | ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; - ; a v = - ; - ' ' ' - ; ; ' , ] { ] [ - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; w w ) u 1 { f - ^ ; ; ; ; ; ; ; ; ; ; ; , 2 8 4 : - a 0 d - ; ; ; ; ; ; ; ; ; ' ' , 7 8 4 { ] : x / = - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ' , y b ] | ; ; ; ; - , 2 8 4 { [ - ; ; ' , ] e e f - ; ; , 2 8 4 { [ - ' ' ' ; ; ; ; ; ; ' ' ' ; ; ; , ' u u ~ { < [ - ; ; ; ; ; ; ; - ' ^ ' ; ' | - < { - ^ ' ; ; ; ; ; ; ; ; ; ; ; ; - ' ' ' ^ ' ; ; ; ; ^ ' ' ' | ^ - - _ ; ; ; ; ; ; ; ' f z 8 A B l C D E F ", "G H I J K L & * a - ; - ; ] f f , 2 7 ; f > - ' ; ^ d d _ ^ - - - ; ; ; ; ; - ; - ; ; ; ; - - - ; ; ; ; ; ; ; ' , , w ; ; ^ d d ; w ; ' - - - ' ; ; , 7 M N { ] - - - - ; ; ; ; ; ; ; ; ; ; ; | O P Q R / f ] / a , , , ' ; ; ; ; ; ; ; , ' N ~ : - = _ _ , ' ; ; ; ; ; ; ; - , ] S T U ' : [ < x | | - ; ; ; ; ; ; ; ; ; ; ; ; ; - - ; ; ; ; ; ; ; ; ; w ; V ; w ' ' ; ; ' , ; W X : > - ; ; , 7 M Y Z 9 - ; ; , ' W X : [ - - > - ; ; ; - - - , : , ; ; ; w , W 7 ; f > - - ; ; ; ; ; ; ; ' - ; - ^ , ] S M , f ; - ' ' ; - - ; ; ; ; ; ; ; ; , f f ; - ' ' ; ; ; ] ] ] ] d d _ - ; ; ; ; ; ; ' ' , ` . .. +. @. #. $. %. &. ", "*. *. =. -. ;. >. ,. '. = - ; ; - : ). X ' , , ' ; - ; ^ ; - d e ; , ; d _ - ; ; ; ' , !. ; ; ; ; - ; = _ ; ' ; - !. , ' , 7 7 ; , ; ' ~. x ; ' ; ^ _ 9 ; w ; ; , 7 {. ]. f ; ^ ; d _ - ; ; ; ; ; ; ; ; ; ; | O ^. /. Z 0 _ ; e d 7 7 ' f - ' ; ; ; ; ; ' _ f : - ' , X 7 ' 9 ; ^ ; ; ; ; ; ; !. ] M {. ' , - ] x ' - - ; ; ; ' , , ; ; ; ; - - ; - d d - , ; ; ; ; ; ; ; - e a ; ^ - - - ; ' - : , | - > - ; ; , 7 (. _. :. _ ^ ; ; ; w , , - ] ; ; 9 _ - ; - ; d _ ' ]. x _ ; ^ ; ; w , ' ; - ' - ; ; ; ; ; ; ^ _ f ] - ' !. ] M u 2 ] f - ; ; - = d - , ; ; ; ; ; , ' ). ] f ; - - ; ^ ; ] { { < d e ; , ; ; ; ; ' - - ; ^ = e <. [. }. |. 1. 2. 3. ", "4. *. =. -. 5. 6. 7. 8. w ; ; ; !. > S {. 9. , ; ' - ; - ' ; - _ ; _ - = a = - ; ; ' | ] ] f - ; ; - d a 0. ] - ] : > , ; ' {. {. ; , ^ ' - ; ; ' - ' e ( _ ^ ; ; w ; ' ' ; - ^ d / d - ; ; ; ; ; ; ; ; ; ; ; w ~. _ d = ; - f f 7 ) 4 : - ' ^ ' ; ; ; ; ; - - ' ' w 7 u 4 f - ' ; ; ; ; ; - ; f x ] , w ' ; ^ ; ; ; ; ; ' , ' , ' ; ; - ; - ' ^ = a. | ^ ; ; ; ; ; ; ; - _ ; _ ' ; ] , ^ ' - - - ' - ] - ; ; , ' ' P b. - | ; ; ; ; ; ; ' ; - d / d - ; - = a _ 7 u N f - ' ; ; ; ; ' - ' - ; ; ; ; ; ; ' , ; f > - ' ; f , 2 c. 4 : - ] ] - a ( _ ' ^ ' ; ; ; , 7 u 4 : - ] > - ' ' , ] ] f _ ; _ - - - - ; ' ] > - ' w ; d. e. f. g. h. i. j. ", "*. 4. k. l. m. n. o. p. w ; ; ; , , 2 7 ' , ; ; ' ' ' ; ; _ - , - - _ 0. _ - ; - , ] S S ] , - ; - _ = _ > ] { ). M 2 , , U q. ] f ; - ' ^ ' ; - - a = w - ; ; ; , , , ' ^ - _ d _ - ^ , , w ; ; ; ; ; ; - | | ^ ^ - | , : : ] 4 X , - - ; ; , , w ; ^ ' ' ; ] f ] 4 X : > - - ; ; ' ' , , , , , - ' ' ' ' ; ; - ' ^ | 7 {. U , | w = a. a w : _ _ f , ; ; ; ; ; ; ^ | - , - e e _ - ; - ' ' ' - d d d - ; ' , _ r. r. ; | ; ; ; ; ; ; ; ' ^ | = _ , w ; _ 0. _ ' 4 ~ : - ' ; ; - - ; ' ; ; ; ; ; ; ; ; , 7 M 4 : - ' ; ; f ] 4 X , w f > - a d | - ; - ^ ; - _ ' 2 X , - - - - ' , ' S S ' , _ - - d e d ^ ' - - - ' | - s. t. u. v. w. x. y. ", "*. z. A. B. C. D. E. F. w ; ; ; ; ' , , ' ; ; ; ; ; ; ; ; ; ; ; ; ' - : , ; ; ' : ] u u ). : - ' - - - - - > { q. T 7 , ' , , ] > ] - ' ; ; ; ; ; - - ; ; ; ; - ; = _ !. ; ; - - , ; d G. G. ; , ; ; ; ; ; ; ; ; ; ; ; , H. 7 x { : , ; ^ ; > , 7 7 ; , ; ; ' ; ] > : : , - > > - ; ^ ; , 7 7 ; , , ' ' ; ; ' ; _ - ~. x : ]. I. J. x 1 1 0. K. V < L. M. N. N ). w ; ; ; ; ' ; - - ; - a ( | ] ] - ' ; ; - d ( d - ; ; ; - | | - ; ; ; ; ; ; ; ; ; ; w - 7 7 ; , > > - _ f : - ; , , - = d - , ; ; ; ; ; ; ; ; , 7 {. q. : - ' ; ^ ; f : , H. 7 ] : - ^ - ' ] ] ; , !. - - f , w ; ; ; ; ; ' , ' u c. q. , ~. ; - d ( = - !. !. - ' , ' q. O. P. u. Q. R. S. q ", "4. z. + B. T. U. V. W. w ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; , - , ' ; ' !. ] u 8 X f > - ' ; ; ; ' - , ' ' ' ' ; ; ; - ] > - ' ' ' - ; ; ; ; ; ; ; ; - = a x > f ; , ; - d / X. u 9. , ; ; ; ; ; ; ; ; ; ; ; , 7 ) 4 : ] - ; ^ ; : ] M {. 9. - - - _ ; - - - - - ' - ] > - ' , ] M {. ' ' ' , ' - ] ; | | Y. Y. ] f ] x ] : ] ] f ] f : [ Z. `. c. W w w ; ; ; | - ] - ' ' | _ f { [ - ' ; ; ; - _ _ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; , ' {. {. ; : > - - ; - - ; f ] ] - = a. | - ; ; ; ; ; ; ; ; w ; ' ' - - ^ ; ' - - - , 7 u 4 : - ' ; ' ] > , ] ] : > ] ; ' ; ; ; ; - ' : ] u i 7 : > ] ; ' | | , ] : ] - , 7 ! + .+ ++ @+ R. S. q ", "*. *. j. #+ $+ %+ &+ p. w ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; - ; - , 7 {. U , ; ; !. : N 7 | f > - ' ; ; ; - ' ' w | _ ; ; ; , | f ] ; - , , _ ' ; ; ; ; ; w w w w , 2 S !. 6 w w w *+ v z =+ - w ' - - , ; ; ; ; ; ; ; , ' N ~ : - ' ; ' - : { N W ] d d _ - ^ ' ' ' ' ' - ' - - - ' !. : N ]. ' T {. ' w ] -+ ;+ >+ M ,+ '+ )+ !+ ~+ {+ ]+ ^+ /+ (+ _+ :+ <+ [+ }+ |+ 1+ 2+ G. 3+ ; w ' - ' = d d , , , 7 M N , ; ^ ; - ' _ - - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; w , U 7 ; f > - ' ^ ' ' , ] 4+ M ' d d _ ^ ; ; ; ; ; ; ; ; ; , , , = a d - ; ' ' ' , ' W X , - ' ; ' - : ] S M ^ !. ; - ' - - - ' ' - : { N 7 ' , > > f : , , 7 M N : - , H. 2 5+ 6+ u. 7+ 8+ 9+ q ", "0+ 0+ G a+ b+ c+ d+ p. w ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ' , !. ; , 7 {. 7 , ; ; - > : ' 7 ] : - ' ; ; ; ; ; ' ; - - ; ; , ' 7 ] f ; , - q. ' _ ; ^ , w w ; 3+ e+ f+ f+ g+ h+ i+ j+ d. d. k+ l+ m+ n+ o+ p+ 3+ 9 | *+ = ^ - ; ; ; ; ; ' _ f : - ' - ; ' - > < , , ] d e ; , ; ; ; ; ; ; ; ; ; ; ; - - ] : : , q+ r+ ]. V s+ t+ u+ v+ w+ x+ y+ z+ A+ B+ C+ D+ E+ F+ G+ H+ I+ J+ K+ L+ M+ N+ O+ {+ P+ ; x 9 | O x v Q+ > , , 7 {. G. , ; ; ' ' , , ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ' - - ' , , ' ; - ; ^ ; ; ; , ] M {. ' !. x ; ' ; ; ; ; ; ; ; ; ; ; ; - d ( d - ; ; ; ; ; w , , ; ; ; ; ; - , ] M {. 9. _ - ; - ; = _ ; ' ; ] [ , , ' - - : ]. q. ' , 7 {. ]. f ; ' , - R+ S+ T+ 7+ 8+ 9+ q ", "+ y. k. U+ V+ W+ V. 8. w ; ; ; ; ; ; ; ; ; ' | ^ - - _ ' | ] ] f , ' ; ; ' ' - ; ] f q. u 4 : - ' ; ; ; ; ; ' - ] - ; ; , 7 u 4 : - , q. u N f - ; w ' ; ; ; - _ / 5 `. 8 X+ Y+ < c b. Z+ `+ M. ] ] 9 / v e _ w ; - ' ' ^ ; ; - - ' - ; ; ' - - - ; - - _ ; _ - ; ; ; ; ; ; ; ; ; ; ; ; ' - - , f ^. @ .@ +@ @@ #@ $@ %@ &@ *@ =@ -@ ;@ >@ ,@ '@ )@ !@ ~@ ~@ {@ {@ ]@ ^@ /@ (@ _@ :@ <@ [@ ] ] , ^. }@ / 0. ] - w ; ' ' ^ ; - ; f ] ] f - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ' ] > - ' ; ' - ; - ' ; ; - ; f ' ' ' , ; ; ' ; ; ; ; ; ; ; ; ; ; ; ; - _ , ; - ' ' ' - ; ; ; ; ; ; ; ; ; ; _ ' 9. 5 d - ; - d a 0. ] - ; - - ; ; ; ; _ ; {. T ' , ; ' ' ; - ' ^ , |@ 1@ 2@ 3@ 4@ 5@ q ", "+ y. k. 6@ 7@ 8@ &+ p. w ; ; ; ; ; ; ; ; - - ] d d | ; , ] S M - f f : f ; - ' ; , - ' 4 X , - ' ; ; ; ; ; - d d d - ; , ' 2 X , - | ' N ~ : , 9@ 0@ a@ b@ c@ d@ e@ f@ g@ h@ i@ j@ k@ l@ m@ n@ o@ p@ q@ r@ s@ t@ u@ v@ w@ x@ d. ]. w w , , ; ' ^ ' ' - ; ; ; - ' - ] - ' | ^ , - ; ; ; ; ; ; ; ; ; ; ' ; ; - ] , V y@ z@ A@ B@ C@ D@ E@ F@ G@ H@ I@ J@ K@ L@ M@ N@ O@ P@ Q@ R@ Q@ S@ S@ P@ T@ U@ V@ W@ X@ Y@ Z@ `@ # 1 .# +# / X. M ' _ w , , ; ; ; !. ] 4+ M ' , ; ; ; ' ' ^ ^ | , , w ; - ; ; ; ' - - - ' - ; ' ' ' ; ; ; ; ; - , , , ' ^ ' ; ; ; ; ; ; ; ; ; ; ; ; ; , - - ; ' - - - ' ; ; - ' - ; ; ; ; ^ ' , _ d d ^ ; - _ | _ - - ' ' ' ^ ; ; ; , , U 7 ; , , , , ^ ' ; w - @# ## $# 7+ 8+ 9+ q ", "+ + H %# &# *# & p. w ; ; ; ; ; ; ; ; ; ~. f N. `. ; , : ] M {. =# f ] > > - ; ' ; ; ' 9 f , ; ; ; ; ; ; ; ; - d ( d - ; ; , , , ' , w _ f !. -# ;# '. ># ,# '# )# !# ~# {# ]# ^# /# (# _# :# <# [# }# |# 1# 2# 3# 4# 5# 6# 7# 8# 9# , n+ 0# n+ < , ' ; ; ; ; ; ; ; ; ' - > - ; ; ; ; ; ; ; ; ; ; ; ; ; ' - - ; ^ - > - *+ a# b# c# d# e# f# g# h# i# j# k# l# m# n# n# o# p# q# R@ Q@ r# q# p# s# s# t# u# n# v# w# x# y# z# A# B# C# 5 T {. ' !. - ; ^ ' , - _ x M {. ' , ; ; | - > ; d > X 7 ; !. - ; ' ; ; ; ' - ~. - ' - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; | w w w w w ; ; ; ; ; ; ; ; ; ; ' - ] ; ^ ; ' - ~. , _ ; ; ' ; , !. - ^ - - - = d - , ; ; ; ; ; ; ; ; ; ; ' , , ' ; ; - d d - , | ; D# E# ++ 7+ 8+ 9+ q ", "+ + H F# G# H# I# J# w ; ; ; ; ; ; ; ; ; !. ] M K# ; : ] , ' ' ' _ ; - - ; - ' ^ ' ; ' , - - - _ ; ; ; ; ; ; - _ _ ' ' ' ; ; ' , ' , | - - y@ / L# M# N# O# P# Q# R# S# T# U# V# W# X# Y# Z# `# $ .$ +$ @$ #$ $$ %$ &$ *$ =$ -$ ;$ >$ w < ] , w ; ; ; ; ; ; ; ; ; ; - - ' | ^ - - _ ; ; ; ; ; ; ; ' ] > - ' ' , ] ,$ '$ )$ !$ ~$ {$ ]$ ^$ Q@ Q@ j# /$ Q@ Q@ Q@ ($ R@ q# Q@ r# r# r# r# _$ /$ p# ^$ q# :$ <$ [$ }$ |$ 1$ 2$ 3$ ; | ' ' ' f > - ' , ' , B# e 9. ' ' , ; ; | O 4$ V 0. P 5$ u ; > ] ; | ; ; ; ; ] : > ; ^ ; ; ; ; ; ; ; ; ; ; ; ; ; - ' w - _ ; ; ' w ; ; ; ; ; ; ; ; ; ' - ; - ' ; ' ] : - , ' ; ' , ] : ] - ] > - a ( _ - ; ; ; ; ; ; ; ; ; ; ; ; ' ' ' ; - e ( _ - | ; D# 6$ ++ 3@ 4@ 5@ q ", "7$ 7$ G 8$ 9$ 0$ u@ k+ w ; ; ; ; ; ; ; ; ; , , 2 q. ] a$ x ' , , w - - - ' ^ ' - ; - ' - ] d d _ - ; ; ; ; ; ; w ^ ; !. : , ; ; , 7 {. b$ , c$ d$ e$ f$ g$ h$ i$ j$ k$ l$ m$ n$ o$ p$ q$ r$ s$ t$ u$ v$ w$ x$ y$ z$ A$ B$ C$ D$ E$ F$ G$ H$ I$ J$ K$ L$ M$ V w _ ; ; ; ; ; ; ; ^ ' - ] ] d d _ - ; ; ; - - - ^ ^ - - ^ - _ - N$ O$ P$ Q$ L@ :$ R$ S$ Q@ Q@ p# p# p# p# p# p# _$ Q@ _$ p# l# l# l# l# p# p# p# q# P@ /$ T$ U$ V$ W$ X$ Y$ Z$ 3$ ~ x w w - - - , 7 {. U _ 9 _ , , ; ' ; | > `$ [ 9 V . % ] 0. d _ w w w w w w !. } a. = w ; ; - ; ; , , , ' ; ; w w !. N$ .% +% @% #% $% %% w w ' ; - | | | ; , ' ^ ' ; ; ' , ]. {. U , ; , 7 M N : - - - - a d , , ' ; ; ; ; ; ; ; ; ; ; ; - ] - ; - d d , - | ; &% *% ++ Q. R. 5@ q ", "=% -% j. ;% K >% ,% p. w ; ; ; ; ; ; ; ; ; ; ' , , x x ' ; - ; = _ ] ; ^ ; f : ] - ' - ] d e ; , ; ; ; ; ; ^ ; - = 9. ). x _ ; , 7 '% )% 3+ !% ~% {% ]% ^% /% (% _% :% <% [% }% |% 1% 2% 3% 4% 5% 6% 7% 8% 9% 0% a% b% c% d% e% f% g% h% i% j% k% l% m% n% f+ ). ' w ; ; ; ; ; ; ^ _ f > < d e ; , ; ; - ; = _ ; d | - ' , , 9@ ># o% p% q% S@ Q@ Q@ Q@ _$ q# ($ R@ ($ Q@ :$ r% R@ p# R@ O@ s% t% s% s% O@ u% :$ Q@ p# r# v% T$ T$ w% x% y% /+ z% A% B% ` ' - ; ; , 7 {. G. !. > - ; ' - - ; - - - ] x / 0 d ] 0. d ; 1 C% C% D% D% D% E% F% G% H% ; ^ I% | w w ' 7 ' 9 ' w ; V )% J% K% L% M% N% O% P% '. f+ _ w = - > ] Q% _ ^ ; ; ; ; - , 7 {. 7 , ; , 7 {. R% 9 _ ^ ; - , 7 7 ' f - ' ; ; ; ; ; ; ; ; ' - > - ; ; - - ; ; | - k+ S% ++ Q. R. 5@ q ", "-% *. j. ;% T% U% V% W% w ; ; ; ; ; ; ; ; ; ; ; ; ; ; ' ; ; - d 5 e - - ' , ] { > - ' ; ; _ ; _ - ; ; ; ; ; ' - ] B# `. u N f - _ - x n+ X% Y% Z% `% & .& +& @& #& $& %& && *& =& -& ;& >& ,& '& )& !& ~& {& ]& ^& /& (& _& :& <& [& }& |& 1& 2& 3& 4& 5& 3$ 3+ ). w ; - ' ' ' ' , ; f [ - _ ; _ - ; ; - d a 9 x / = - w ; 6& 7& 8& 9& 0& a& s# /$ Q@ Q@ r# l# n# b& c& c& o# i# d& e& f& n# g& h& i& i& j& k& o# R@ p# R@ p# ^$ l& M@ M@ m& n& o& p& q& / ; ^ - - w ; ; ; - - - ; ' ] > - ' ' - V r& d _ _ ; 9 x ] [ ] _ f < < [ < _ ; ; ; - - ; ; 7 c. 4 a$ - w V 5 s& t& u& v& w& x& y& z& ># 3+ ^ ^ a. V b x a | - ; ; ; - ; w ; ; ; ' ' w ; X a ( _ ^ - ] : 7 ) 4 : - ' ^ ' ; ; ; ; ; ; ; ; - - ; ; ; ; ; ; w ; A& B& T+ @+ R. 5@ q ", "*. 4. j. =. C& D& E& F& w ' ; ; ; ; ; , , , ; ; ; ' ' ' ; ; - _ d | ^ ' , 7 M N : - ' ' | ^ w ' ; - ; ; ' ; ; - - _ 9. G& ~ : - 9@ C% f+ H& I& J& K& L& M& N& O& P& Q& R& S& T& U& V& W& X& Y& Z& `& * .* +* @* #* $* %* &* ** =* -* ;* >* ,* '* )* !* ~* {* ]* ^* /* (* w | , f , , 7 M 4 : , ' , - ; ; ; - _ = _ ; d = - w e+ _* :* <* [* i# S@ p# p# r# p# p# :$ }* |* c& 1* 2* 3* 4* 5* 6* 7* 8* 6* 9* 0* a* b* c* d* T@ Q@ p# u% e* f* g* h* i* j* k* l* C% x = d _ ; !. : f ; ; ' ; ' - , , , ' ^ d , I% m* n* o* p* q* r* m* s* t* u* v* w* x* y* z* A* H% B* C* D* E* F* G* J. ] { f : n+ H* I* J* K* L* M* N* O* P* Q* R* S* T* U* = P 4+ V* 9. , ; ; - d e e , : f ; - ' , , d = w - - - f ] 4 X , - - ; ; ^ , , , ' ; ; ' ' ^ , , , | | ^ ^ _ A& W* $# 7+ 8+ 9+ q ", "*. 4. G =. X* Y* Z* `* =# _ ; ^ ; ; , ' 7 ' _ ; ^ ; ; ; ; ; ; - - - ; ; , 7 {. ]. f ; ^ ; ; ' ; , !. - ' - - ; ^ ; ; | > > [ - _ y@ = .= += @= #= $= %= &= *= == -= ;= >= ,= '= )= != ~= {= ]= ^= /= ~= (= _= := <= [= }= |= 1= 2= 3= 4= 5= 6= 7= 8= 9= 0= a= b= c= d= e= f= V ]. X ' , 7 {. q. f ; ^ ; ; ; ; ; ; - - - - - - _ - g= h= i= j= r% k= S$ l= ($ ($ S@ :$ m= n= o= J@ p= q= r= s= t= u= v= w= <& u= :& x= E+ y= ]$ z= Q@ u% A= 6% B= C= D= p= E= R@ F= G= 3$ H= / | - - > > - ; ' ; ; , 9. 7 ' f w - f+ I= J= K= L= M= N= O= P= Q= R= S= T= U= V= W= X= Y= Z= `= - .- +- @- #- ] $- ] - %- &- *- =- -- ;- >- ,- '- )- !- ~- {- ]- ^- 0 /- (- M T ' , ; ; - d ( d - ] _- f - ' ; ; - - ' - - ' ; f : , ; ^ ; > - w ' 7 ' , - | - > ; 9. 7 H. - > Z. Z. > :- <- $# 7+ 8+ 9+ [- ", "4. 4. }- 8$ |- 1- 2- 3- q. f , ' ; ; , 7 c. 4 f , ' ; ; ; ; ; ; ; ; ; ; ; w ; ' ' ; - ' ; ; ' , ] : ] - ] > - ' ; ; | O 4$ 4- 9 y@ 5- 6- 7- 8- 9- 0- a- b- c- d- e- f- g- h- i- j- k- l- m- n- o- p- q- r- s- t- u- v- w- x- y- z- A- B- C- D- 6= E- F- G- H- I- J- K- L- M- N- O- X. {. ' , ; ' ' ; ; ' ; ; ; ; ; ; ; ; ; ; ; ; , f P- ,# Q- R- S- T- t# U- M@ c& V- o# W- X- Y- 9* Z- `- A= '@ m= m= m= ; ~$ m& .; +; m= {@ @; Q@ Q@ #; $; |& %; &; *; =; -; ;; >; ,; '; ); !; ; , ' - - ; - ' ; ; , 7 u N ] - ^ ~; {; ]; ^; /; (; _; :; <; [; }; |; 1; 2; 3; 4; 5; 6; 7; 8; 9; 0; a; b; c; d; 0. N- e; G* f; g; h; i; j; k; l; m; n; o; p; q; r; s; t; u; v; - ' ' , ; ; ; - _ _ - : [ ] , ' ; ; ; ; ' ] > - ; - - - ; ' - ; ] , 7 u N : - | O 4$ (- w; x; 2 y; z; A; B; z; F& <- $# 3@ 4@ 5@ [- ", "C; k. H D; E; F; Z* G; }@ y - | ; ; - a R +# P - | ; ; , ^ ' , , w ; ; ; ; , , , ^ ' ; ; ; , 7 M N { - - - - ' ' | | r. H; z; x y@ I; J; K; L; M; N; O; P; Q; R; E$ S; T; U; V; W; X; Y; Z; `; > .> +> @> #> $> %> &> *> => -> ;> >> ,> '> )> !> ~> {> ]> ^> /> (> _> :> <> [> ); }> % ' , , , , - ] - - ; ; ; ; ; ; ; ; - - - , f f+ |> 1> 2> 3> O@ 4> 5> o# d& 6> 7> 8> 9> 0> a> ;; Q@ u% u% u% u% u% u% s% s% u% k= u% P@ Q@ Q@ p# r% b> c> d> e> f> g> h> i> j> k> l> m> X. ]. w - ' ' ^ ' ; ; ; , ' 4 ; n> +% v+ o> p> q> r> s> t> u> v> w> x> y> f% z> A> B> C> `# D> E> F> G> H> I> J> K> L> M> N> O> P> Q> R> S> T> y% U> V> W> X> !> Y> Z> `> , ., +, @, p+ !. , ' ; ; ; w ^ ; #, a$ 4+ M ' , ; ; ; ; ' - - - ' ' ' , , w ' ; - , ' N 1 9 e d > $, , 9. 4 ). $, 4- %, &, m* n+ *, $# @+ R. =, -, ", "k. k. H F# |- ;, >, G* O y - | ; ; ^ ,, ', -+ r. - | ; - = B# , 7 7 ; , ; ; ; ; - d d - , ; ; , 2 ), 4 !. - ' ; ; ^ ; - = 9 P > O- _. !, ~, {, ], ^, /, (, _, :, <, [, }, |, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, F$ w, x, y, K. _ 7 7 ; w - ] > - ' , , ; ; ; ; - ; = _ ~ ] _+ z, A, B, C, O@ n# s% i# D, E, F, G, L@ s% i# i# R@ ($ p# p# p# p# _$ p# p# _$ p# ($ R@ l= l= p# l# n# H, I, l# J, K, L, M, N, O, P, Q, X. q. , ; ; ; ; ; ; ; ; w x $- R, S, T, U, V, W, X, Y, && Z, `, ' .' +' %; @' #' $' %' &' *' =' -' ;' >' ,' '' )' !' J> ~' {' L% ]' ^' /' (' _' :' <' [' t= }' |' 1' 2' 3' 4' 5' 6' 7' n+ : , ' ; ; ^ ; , 7 q. ] M {. ' , ; ; ; ; ; ; ; ; ^ ; , 7 7 ; , ; ; ' _ f : _ a. d ; ' ' : : : ] : S T 8' 9' *, ++ @+ R. 5@ q ", "0+ 0+ }- D; 0' a' b' c' G& - - | ; ; ^ _ B# , - - | ; - a ,, 9 M {. ' , ; ; ; ; - = a. | - ^ ' w 2 8 U , - ' ; ; ' - ] d v / d' e' f' g' h' i' j' k' l' m' n' o' p' q' r' s' t' u' v' w' x' y' z' A' B' C' D' E' F' G' H' I' J' K' L' M' N' O' P' Q' R' S' T' r> U' V' W' X' Y' Z' `' 3$ x < M {. ' , ; - ] > , ; ; , ' ; ; - d a d p+ > 8# ) .) p% i# i# n# i# c& +) @) #) $) Q@ u% n# n# b& ($ _$ r# _$ r# r# R@ Q@ r# b& n# V- %) &) M@ n# n# O@ *) O@ p# '@ =) -) ;) >) ,) ') )) | - ; ; ; ; ; - ' | ; ; , !) ~) {) ]) ^) /) () _) :) <) [) }) |) 1) 2) 3) 4) 5) 6) $ 7) 8) 9) 0) a) b) c) d) e) f) g) h) i) j) k) l) m) n) o) p) q) {> r) s) t) u) v) w) x) y) z) -# ] - w ' ' ' , ] M {. ' ' ' ' , ; ; ; ; ; ; ; - ' f ] M {. ' , ; ; ; ; - - ' | _ ' ; - - - - - ] ; =# ' d. <- ++ @+ R. 5@ q ", "k. k. }- F# 0' A) B) C) - _ _ ^ ; ; _ ^ ^ ' | w w | ^ d 9 a$ ). ). ' _ - ; ; ; ^ d d _ ^ ; ] f ] N X _ ^ ; - ; ; - - d Q+ 0. D) E) F) G) H) I) J) K) L) M) N) O) P) Q) R) S) T) U) V) p; W) X) Y) Z) `) ! .! +! @! #! $! %! &! *! =! -! ;! >! ,! '! )! !! ~! {! ]! ^! /! (! _! :! 0! p# b& o# o# o# l# i# a! b! c! d! e! f! g! h! s+ ; ; ; ; ; ; ; I% , i! j! k! l! m! n! o! p! q! r! s! t! u! v! w! x! y! z! A! 9) B! C! D! E! F! G! H! E+ d> I! J! K! L! M! N! O! P! Q! R! S! T! U! V! W! X! Y! Z! `! ~ .~ ]& +~ @~ #~ $~ %~ m* w : f - !. : N ]. ' , , , ' ; ; ; ; - ; - ' - : { N G& ' , ; ; ; ^ ' ' , - ^ - ; ; ' ' ^ d d 0. !. - &~ 6+ *~ Q. 4@ 5@ q ", "k. k. H 8$ T% =~ B) -~ : - - ; ^ , , ; ; - ; = ~ O w , > { ). ). ; !. - ' - - ' - > - ; ; ] > : : : , - - - ; ' ; ' , > ] ;~ &+ >~ ,~ '~ )~ K) K) !~ ~~ {~ ]~ ^~ /~ (~ _~ :~ <~ [~ }~ |~ 1~ 2~ 3~ 4~ 5~ 6~ 7~ 8~ 9~ 0~ a~ b~ c~ d~ e~ f~ g~ h~ i~ j~ k~ R> l~ m~ n~ o~ p~ q~ r~ s~ t~ u~ p+ g : - ' ; ' ] { ] M {. ' !. - ; ^ - - w m* B% v~ w~ x~ y~ z~ [$ A~ B~ :& C~ D~ z= Q@ R@ n# b& R@ o# u# E~ p# i# b& q# q# b& g& n# b& l# n# i# S@ n# n# n# n# g& l# p# F~ G~ H~ I~ J~ K~ L~ 6& ; ' ; ; ; ; w C% @# X% M~ N~ O~ P~ Q~ R~ S~ T~ U~ V~ W~ X~ Y~ Z~ `~ t> { .{ +{ @{ #{ ${ Q$ %{ ;! &{ }' :) *{ a% ={ -{ ;{ >{ ,{ '{ ){ !{ ~{ {{ ]{ ^{ /{ ({ _{ :{ :{ :& E+ _{ <{ [{ }{ |{ 1{ e= h G& ] , - ] : f ; ' ; ; ; ; ; ; ' ; !. , ' ; ] [ , B# , - ; ; ; ; ; ; ; - d d - , ; ; - d a. d : ] 2{ 3{ u. Q. R. =, q ", "0+ 0+ j. ;% T% 4{ 5{ :- w - ] - _ ' , ' ; , d a P ^. - w !. > S X. ; : > , ' ; ^ , - ] - ' - - - , ] ] : > ] ; ' ; ' - , - 6{ 7{ 8{ 9{ 0{ a{ b{ c{ #& d{ e{ f{ g{ h{ i{ j{ k{ l{ m{ n{ o{ p{ q{ r{ s{ t{ u{ v{ w{ x{ y{ z{ A{ B{ C{ D{ E{ F{ G{ H{ I{ J{ K{ L{ M{ ;* N{ O{ P{ Q{ R{ S{ %% N$ { > , ' ; | ] < f ' ' ' f > - ' ^ | - ` T{ U{ V{ W{ X{ Y{ <) Z{ Q$ `{ ] Q@ Q@ Q@ _$ R@ R@ ($ b& R$ p# p# R@ q# q# b& g& g& R@ q# R@ ($ Q@ l# n# o# b& b& n# R@ p# u% a& w= .] ]> K+ +] @] x ' ' , ' | ^ D% ] #] $] %] &] *] =] -] ;] >] ,] '] )] !] ~] {] ]] ^] u= /] (] :' _] :' :] <] I! [] q, }] |] 1] X! 2] 3] 4] 5] 6] 7] 8] 9] 0] a] b] c] d] e] f] g] }' :{ [] h] i] j] k] l] m] n] u ' , ' - - ; - ' ; ; ; ; ; - ; f ] ] , - - - e ( f - ; ; ; ; ; ; ; - e a. | ^ ; ; ; - | _ _ ] &~ o] T+ @+ R. 5@ q ", "7$ k. j. -, p] A) q] r] w ; - , 7 {. U , ; - d v 9 r. ^ | , , 2 7 ; f > - a e _ ' ; - - - ' ' | ' M M ' , ; - ' ; - ' w ; g= s] t] u] v] w] x] #= y] z] A] B] C] D] E] F] G] H] I] J] K] L] M] N] O] P] Q] R] S] T] U] V] W] X~ X] Y] Z] `] ^ .^ +^ @^ #^ $^ %^ &^ *^ =^ -^ ;^ >^ ,^ '^ F% S M ' , ; ^ d d _ , , | - - - - _ | - .@ 7& )^ !^ ~^ 0! {^ ]^ ^^ m= i# C, @; %) d& R@ Q@ r# q# ($ R@ i# b& ($ Q@ r# ($ ($ k# ($ Q@ r# Q@ /^ u# 4> n# n# n# h# q# p# F~ l# (^ _^ :^ <^ [^ [@ .# , - ; 6 > }^ |^ 1^ 2^ 3^ t$ 4^ 5^ ,* 6^ 7^ 8^ 9^ 0^ a^ b^ c^ d^ e^ f^ :) )& g^ h^ s! i^ j^ k^ l^ m^ n^ o^ |] p^ q^ r^ s^ t^ u^ v^ w^ x^ y^ z^ A^ B^ C^ D^ |] E^ F^ [] [] G^ H^ I^ J^ K^ L^ M^ N^ G& ^ , - ' ' ^ ' ; ; ; ; ^ ' ; , ] 4+ M ' w ^ ^ a d , - ; ; ; ; ; ; ; - e d f - ; ; ; , - ^ , ; O^ P^ *~ @+ Q^ R^ ;% ", "+ + j. =. T% =~ S^ r] w ; ; , 7 {. q. , ; w d e 9. | ; - ; ' , , ' ; - ; a e ; , ; ; ; ; ; ' , ; S M ' , ; ; ; ; ; ; w ; .% T^ U^ V^ W^ X^ Y^ Z^ `^ / ./ +/ @/ #/ $/ %/ &/ */ =/ -/ ;/ >/ ,/ }; '/ )/ !/ ~/ {/ ]/ ^/ // D> (/ _/ :/ O ~ ` 8& b/ c/ d/ e/ f/ g/ h/ F~ s% R@ /^ U- 5> n# Q@ q# Q@ Q@ Q@ R@ b& R@ r# R@ R@ p# i/ ($ Q@ Q@ Q@ S$ &) 0! n# n# i& b& R@ l# O@ j/ k/ l/ m/ n/ o/ p/ 6 ] _ H. q/ n+ )+ r/ s/ t/ u/ v/ w/ f] E- x/ y/ z/ A/ B/ ,' C/ D/ E/ Y& e! 5* _{ 6* [] F/ G/ H/ z+ <* Z! I/ J/ K/ p^ L/ E- M/ N/ O/ P/ Q/ R/ S/ T/ U/ V/ W/ X/ Y/ Z/ `/ s! ( K/ .( +( @( #( $( %( &( w _ ' ; ; ; ; ; ; ; ; ' ; , , : ] M {. ' , ; ; - - ; ; ; ; ; ; ; ; ; ' - ] > - ; ; ; ; ; ; , ' *( =( -( @+ Q^ ;( ;% ", "+ C; H 8$ 0' >( ,( F& w ; ; w ; ; ] ] - ' - ; _ - ; ; ; ; ; ; ' - ; - | ; _ ' ' ' - ; ; ^ - f ] x ; | ; ; ; ; ; ; w _ '( )( !( ~( {( ]( ^( /( (( _( :( <( [( }( |( 1( 2( 3( 4( 5( 6( 7( 8( !/ 9( 0( a( b( (> c( d( e( f( g( h( i( j( k( l( m( n( o( p( q( r( s( t( u( v( w( x( y( z( f+ =# ' ' , ; - _ ; _ - ; ; ' , ; f P b A( B( C( D( E( F( G( H( I( J( K( L( ($ p# M@ o# V- b& q# r# r# r# r# q# r# Q@ b& l# l# ($ _$ r# r# r# p# M( p# ($ b& g& g& n# V- n# k& N( O( x% P( Q( '$ 3$ x _ (. R( 9. 1^ S( T( U( V( W( X( Y( Z( F- `( _ ._ +_ @_ #_ $_ %_ &_ *_ I/ =_ {> g] q) -_ ;_ >_ ,_ f] =_ '_ )_ |] !_ ~_ {_ r^ ]_ ^_ /_ (_ __ :_ <_ [_ }_ |_ F^ 1_ 2_ h^ 3_ 4_ 5_ 6_ 7_ 8_ 9_ 0_ a_ w ; ; ; ; ; ; ; ; ; ; ' , ] : < { ' ' ' , ; ; ; ; ; ; ; ; ; ; ; ; ^ ; ] > - ; ; ; ; ; ; ; w ' b_ c_ 2@ @+ R. 9+ d_ ", "+ C; H F# 0' e_ f_ k+ w ; ; ; , , f > - ' - - - ; ; ; ; ; ; ; ; ' ' | - , ' - - - ' ; ; ; !. ] 4+ M x , ; ; ; ; ; ; w _ g_ h_ i_ j_ k_ l_ m_ n_ o_ p_ q_ r_ s_ t_ u_ v_ w_ x_ y_ z_ A_ B_ C_ D_ E_ F_ d( G_ H_ I_ J_ K_ 7/ L_ M_ N_ O_ P_ Q_ R_ S_ T_ U_ V_ W_ X_ Y_ Z_ `_ : .: +: @: P% 3+ w , ' ; _ - , - ; ; ; , 7 M 4 z; #: R+ $: %: &: *: =: 6* -: ;: ] P@ Q@ ($ b& n# o# o# o# ($ ($ l# l# l# l# b& b& l# b& >: b& l# b& R@ ($ T@ r# _$ p# l# h& n# R@ b& l# R$ ,: ': ): !: n/ ~: p/ ; - {: ]: ^: /: (: _: :: <: [: }: |: 1: 2: 3: 4: `; 5: 6: (^ 7: 8: 9: 0: a: L/ *@ @) [] 1_ >_ -_ J/ =_ G^ )_ *{ b: a: g^ c: d: e: f: g: h: i: j: k: l: m: n: -_ o: G^ '_ p: h^ q: r: ;{ s: m! t: u: w ; ; ; ; ; ; ; - ^ ' , 7 M ). v: f , , , ' ; ; ; ; ; ; , , , ' ; ; ; ] { { , ' ; ; ; ; ; ; w ; w: x: ++ @+ R. 5@ q ", "+ C; G 8$ T% 1- y: p. w ; ; ; ; ^ ; - ; ^ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ' ' , f ; ^ ; ; - , ] M {. x , ; ; ; ; ; ; w ; +% z: A: B: C: D: E: F: G: H: I: &= i' J: K: L: M: N: O: P: Q: R: S: T: U: 2( V: W: X: Y: Z: a^ `: < .< +< @< #< $< %< 3/ &< *< =< *< -< ;< >< ,< '< )< !< ~< {< 6{ w ; ; ; ; ; ; ; ; ; ; , 7 {. q. { P ]< ^< /< (< _< :< << [< }< :$ @; p# R@ b& l# n# s% s% M@ M@ N@ s% s% n# b! |< n# 1< 1< V- b! |< V- R$ ^$ ($ S@ L( N@ g& V- Q@ q# p# _$ 2< 3< 4< 5< 6< 7< 8< ). Z+ 9< 0< a< b< c< d< e< f< =_ g< h< i< j< k< l< m< '> n< o< p< q< r< s< t< u< L/ |] G^ s! ~_ F^ =_ Z( I/ f] )_ v< w< !> d: x< x< y< z< A< B< C< D< E< F< G< ( H< I< ~_ J< 3_ K< =! L< M< N< O< d. w ; ; ; ; ; ; - = d - , 7 I. 4+ ). ' , ; ; ; ; ; ; ; ' , ' 7 ' 9 ; ^ ; f ]. q. ' , ; ; ; ; ; ' _ - 2{ P< u. Q. 4@ 5@ q ", "C; + j. ;% T% Q< R< F& w ; ; ; ; ' - ; - ' ; ; ; ; ; ; ; ; ; ; ; ; ; ; - ; f - ' | - ; ; ; ; , ' ' - , ; ; ; ; ; ; w ; +% S< T< U< V< W< X< Y< Z< `< [ .[ +[ @[ k' // #[ $[ %[ &[ *[ =[ -[ ;[ >[ ,[ '[ )[ ![ M{ 3_ ~[ |' f] <] {[ ][ ^[ /[ ([ _[ :[ <[ [[ =< }[ |[ 1[ 2[ 3[ 4[ 5[ 6[ 7[ d. w ; ; ; ; ; ; ; ; ; ; w ; ' ' _ / 8[ 9[ 0[ a[ b[ c[ d[ e[ f[ 4/ $) ^$ R@ p# R@ ($ n# V- g[ &) o# n# o# h[ i[ k& h[ j[ k[ l[ k& k& h[ m[ n[ o[ p[ n# g& n# n# ($ Q@ _$ p# G~ q[ r[ s[ t[ u[ M- v[ w[ x[ y[ z[ A[ B[ C[ D[ D^ 8> 9) E[ F[ G[ H[ I[ J[ K[ L[ M[ N[ O[ P[ d] Q[ R[ G^ S[ I! |] T[ `/ q) )_ d> 3_ 8= U[ V[ s! E+ W[ X[ *{ ^] Y[ Z[ z{ `[ } .} +! +} q^ @} g] #} 1_ $} %} &} *} =} -} d. w ; ; ; ; ; - ; a ( f - _ x M u ' | ^ ^ ' ' ' - ; ' : ]. u 4 f - ' w ; {. T ' , ; ; ; ; ; - | - 2{ ;} u. Q. 4@ 5@ q ", "+ C; y. ;% T% F; >} F& w - ; ; - ; ' ' ' ; ; ; ; ' ' ; ; ; - ^ ' ; ; ; ; !. ] M {. ' , ; ; ; ' ' , , | ' ; ; ; ; ; ; w ; +% ,} '} G: )} !} ~} {} ]} ^} /} (} _} :} <} [} }} |} 1} 2} 3} 4} 5} 6} 7} 8} 9} 0} a} b} c} d} c} e} f} g} h} i} j} k} *< &< }[ [[ *< l} m} n} o} p} q} r} s} t} e+ w ; , , w ; ; ; ; ; ; ; w | w d J= u} v} w} 2~ x} y} z} A} B} i& 5> n# ($ Q@ R@ q% C} E, ({ D} >* E, X! E} H/ w< E} F} G} H} W> I} J} K} K} :' L} M} x% 4> 0! u# d& R@ R@ _$ R$ l= N} O} P} Q} z( R} S} T} U} V} W} X} Y} 4^ Z} `} | .| +| @| #| $| %| &| *| =| G< l/ [& -| ;| >| Y( t< |] `/ g] s! I! u= p: }' ~[ 8> @) u= u= u= !_ ,| '| )| !| ~| {| ]| ^| /| (| _| :| 8= <| [| }| || 1| 2| , 3+ w ; ; ; ; ; - - e d , ; , : N q. ' , ; ; - - - ' ; ' , ; 2 ). : - - _ w 4 q. ' , ; ; ; ' ; , 7 {. n* 3| 4| 5| 5@ 5@ q ", "+ + y. ;% T% F; 6| F& | 9. - !. - _ , ; ; ; ; ; ' ; - - ; - = d - , ; ; ^ f ] M M ' , ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; w ' +% 7| 8| 9| N! 0| a| b| c| d| e| f| g| h| i| j| k| l| m| n| o| p| q| r| s| t| u| v| v| }[ k} k} *< =< =< w| w| x| x| x| [[ w| [[ }[ k} [[ y| 5< 3= S( z| A| B| C| C% , , 7 7 ; , ; ; ; ; ; ' - O Y. W `+ D| E| F| G| H| I| J| K| h[ s% R$ 0! ^$ u% q# L| M| N| E} O| P| N| Q| R| ,| w< E} S| S| T| H} P| P| P| U| w/ E} V| H^ d& 0! &) 5> n# Q@ q# /$ P@ W| X| Y| Z| `| 1 .1 +1 @1 #1 $1 %1 ]_ &1 Z} *1 =1 -1 ;1 4, >1 ,1 '1 )1 !1 |& ~1 {1 ]1 ^1 o< D= /1 (1 F^ _1 Z/ -_ !_ G^ J< :1 <1 Q[ K/ [1 |] }1 G^ I! |1 11 21 31 41 51 61 71 81 91 01 a1 b1 c1 d1 e1 f1 g1 f+ w ; ; ; ; ; ; ; ; - - ; ; ~. ] { : : : ] ; - ] ; ^ ; ; ' , f f ~. : : ] ; , : - ' ; ' - - ; , 7 M z( h1 4| i1 1. =, j1 ", "+ + y. ;% T% k1 l1 m1 d e f > : ; , ' ; ; ; ; ' - ] - - ; a ( f - ; ; ; ; _ x x - | ; ; ; ' | ^ - - _ ; ; ; ; ; ; w | g_ n1 o1 p1 q1 r1 s1 t1 ]} u1 v1 w1 ' x1 y1 z1 o) A1 B1 C~ C1 D1 f} E1 f} F1 G1 F1 H1 }[ =< x| [[ V_ *< }[ }[ }[ I1 V_ V_ J1 }[ }[ V_ =< K1 L1 M1 N1 O1 P1 Q1 R1 0. > ] M {. ' , ; ; ; ; ; ' > c S1 u 9. T1 U1 V1 W1 X1 Y1 Z1 $) R@ T@ S$ T$ q[ Q@ Q@ @; v% m& `1 2 .2 +2 m& `1 @2 `- @2 @2 ~$ `1 `1 `1 `1 `1 #2 $2 L@ %2 d& ($ p# @; p# ($ Q@ p# Q@ Q@ &2 *2 P} =2 -2 ;2 >2 ,2 '2 )2 !2 b: ~2 {2 ]2 ^2 /2 (2 _2 :2 <2 [2 }2 |2 `; `; 12 22 32 -= 42 !2 52 62 H/ u< 72 }1 *{ =_ 1_ {> :& v) K/ }1 |] |] G^ [] d> 82 92 02 a2 b2 c2 d2 e2 f2 '& g2 h2 i2 j2 k2 l2 n> d. w ; ; ; ; ; ; ; ; ; ; ; ; - > - , ] { [ - - ; _ ^ - - | - ] - , ] { [ - - - - ' ; ' ] > - | - ] E% m2 ++ n2 S. S. q ", "+ + y. ;% p] o2 p2 q2 } = , f ]. {. U , ' , , w ; - - - - - e d , - ; ; ; , , ~. ~. - | ; ; ; - ] d d _ - ; ; ; ; ; ; w ; r2 s2 t2 u2 v2 w2 x2 y2 z2 A2 B2 C2 D2 E2 F2 G2 H1 H2 I2 J2 K2 r( [[ [[ =< =< =< =< =< =< }[ }[ }[ }[ }[ *< *< }[ V_ L2 M2 x| [[ V_ W_ V_ N2 O2 P2 Q2 R2 S2 T2 U2 V2 W2 X2 e= q. ' , ; ; ; ; ; ' ~. Y2 Z2 `2 3 .3 +3 @3 #3 $3 %3 &3 Q@ u% /$ ^$ q[ @; S@ i# a! 0& *3 7> ,| =3 -3 ;3 ;3 >3 _< ^^ ,3 w/ }] Q| L/ '3 )3 ;3 ;3 !3 ~3 {3 q[ Q@ Q@ /$ r# r# ($ S$ ]3 ^3 /3 (3 _3 .% :3 <3 [3 }3 |3 13 23 33 43 g/ 53 63 73 83 93 |_ 03 a3 b3 c3 d3 e3 J' f3 g3 h3 i3 j3 H~ k3 e] l3 m3 6= '_ q) G^ n3 <' ,| o3 G^ K/ K/ #< h^ p3 @< q3 r3 s3 t3 u3 v3 w3 x3 y3 z3 ^) m_ A3 B3 N^ S* w ; ; ; ; ; ; ; ; ; ; ; - - - , 7 M N , ; ' ^ ^ e e _ - - - , 7 M N , ; ' ' ^ - ; ' - - - ' , - C3 D3 ++ 7+ 8+ 9+ q ", "+ + y. ;% p] E3 F3 G3 ^ : ' f q. T 7 , , 7 7 ; !. ; = _ - ; - - ; ; ; ; , ' 7 a ,, _ ^ ; ; ' - ] d e ; , ; ; ; ; ; ; w ; T* L= H3 I3 J3 K3 L3 M3 N3 O3 P3 P| Q3 R3 S3 _[ w| T3 [[ =< =< =< }[ }[ }[ }[ }[ *< }[ }[ }[ }[ }[ }[ }[ V_ V_ V_ V_ U3 L2 r( V3 W3 W_ X3 Y3 Z3 `3 4 .4 ~' +4 @4 #4 $4 %4 : < ; | ; ; ; ; ; w ). Y. &4 s2 *4 =4 -4 ;4 >4 ,4 '4 )4 r% u% R$ Q@ /$ /$ R$ !4 :$ ~4 ;3 v) f] t< q= {4 ]4 ^4 v/ /4 J} (4 t< t< p) _4 :4 ^4 ^4 <4 [4 }4 q[ Q@ r# p# Q@ p# u% |4 14 24 34 A, 44 54 64 74 84 94 04 a4 b4 c4 d4 e4 f4 g4 h4 9= i4 j4 k4 l4 m4 n4 o4 p4 q4 r4 s4 t4 u4 v4 w4 x4 y4 (& z4 A4 B4 G^ !_ 7* C4 D4 q, E4 S[ F4 F^ s! l3 G4 H4 I4 J4 K4 L4 M4 N4 O4 ;* x= P4 Q4 R4 S4 T4 e+ w ; ; ; ; ; ; ; ; ; ; - d d - , 7 {. G. , ; ; ; - e e ; , ; ' : G& ), 2 , - ' ; d _ - ; ; ; ; ; ' , C3 6$ ++ 7+ 8+ 9+ q ", "C; C; y. ;% T% U4 V4 W4 q. f , , ' ' ; w ; {. X. ; : 9 / = - ; ; ; ; ; ; ; , 7 c. R ', B# ^ ; ; ; ; ; _ ; _ - ; ; ; ; ; - | ; X4 Y4 Z4 `4 5 .5 +5 @5 #5 $5 %5 &5 F1 *5 =5 _[ [[ }[ }[ }[ }[ }[ }[ }[ }[ }[ }[ *< }[ I1 }[ }[ }[ *< V_ }[ x| x| =< W_ j} -5 ;5 M2 I1 [[ >5 -5 ,5 '5 F$ G> )5 W1 !5 ~5 {5 7' ]5 x w ; ; ; ; ; w e+ ^ ^5 /5 (5 _5 :5 <5 [5 }5 V( |5 s% L( l# l# j# b! 0! e& 0! 15 25 m& A= m& +2 35 35 35 25 `1 `1 45 m& m& 0& 25 0& +2 35 55 H^ f& l# k# Q@ p# p# p# u% o[ 65 75 F, 85 95 05 a5 b5 c5 d5 e5 f5 g5 h5 i5 J< j5 k5 l5 G' r; m5 n5 o5 p5 q5 r5 s5 t5 u5 v5 w5 x5 y5 z5 g< 1: ,1 A5 B5 v= *{ |] s! u= )& .~ S[ S[ }1 S[ !_ C5 D5 E5 F5 G5 H5 I5 J5 K5 L5 C= -* M5 N5 O5 8& R1 3+ w ; ; ; ; ; ; ; ; ; ; - = a. | w ; ' ' ^ ; ; ; - _ ; _ - ; ' : N 8 W : , ^ ` e d - ; ; ; ; ' , _ &% D3 ++ P5 4@ 5@ q ", "0+ 0+ H =. 0' *# Q5 R5 &, M ' w , , _ , , 4 q. ; : 9 d = - ; ; ; ; ; ; ; , ' 4 +# -+ , ' | , , ' | ^ , - ; ; ; ; ; ; ; !. f S5 T5 U5 V5 W5 X5 Y5 Z5 `5 6 .6 H1 }[ *< *< *< =< =< =< x| }[ }[ }[ }[ }[ }[ }[ }[ x| x| [[ V_ V_ V_ <[ U3 +6 @6 }[ #6 =< J1 #6 $6 %6 &6 >5 J1 *6 =6 -6 ;6 >6 ,6 '6 )6 !6 ~6 {6 ]6 , ; ; ; ; ; w l+ f ^6 /6 (6 _6 :6 <6 [6 }6 |6 ;; s% 16 16 26 36 46 56 66 76 86 96 06 a6 b6 s% s% L( c6 c6 d6 s% s% *) e6 |< i# N@ s% K( h* f6 #; g6 h6 i6 j6 u% Q@ u% )@ k6 l6 m6 n6 O$ o6 p6 q6 r6 s6 t6 >' C= 9* u6 v6 w6 x6 y6 z6 A6 B6 C6 D6 E6 F6 G6 -6 H6 I6 J6 K6 L6 M6 N6 O6 v5 P6 q) K/ K/ 6= Q6 R6 S6 T6 U6 @) *{ V6 W6 j^ q) X6 Y6 Z6 `6 7 .7 +7 @7 #7 e] $7 %7 &7 *7 =7 m* ; w ; ; ; , , , ; ; ; ; ^ d d _ ^ , , , ' ^ ; - _ - , - ; ; ' , x N ~ : - = d d _ - ; ; ' ; , 7 {. -7 ;7 ++ 5| 1. 5@ q ", "7$ 7$ }- D; 0' >7 ,7 '7 )7 {. ' , ' ; !. , ' , f ; ; - - ^ ; ; ; ; ; ; ; ; ; _ f P r. - > O X ' , ; ; ; ; ; ; ; ; ; ; w ~ < !7 ~7 {7 ]7 ^7 /7 (7 _7 :7 <7 [7 }7 =< =< =< }[ H1 H1 }[ j} [[ =< =< =< =< =< =< =< }[ j} V3 |7 V3 x| |7 q: .( r[ 17 27 37 r| 47 47 57 67 77 r( V~ 87 97 07 a7 b7 v7 y~ 7> w7 x7 y7 5! *) E, d> z7 l# o# A7 A= ] d6 B7 C7 D7 E7 F7 G7 82 !: H7 h/ m= p# 3> I7 P' J7 K7 L7 M7 N7 O7 P7 Q7 R7 S7 G, |] T7 >| Z} U7 }] V7 7% B1 W7 X7 Y7 Z7 `7 8 .8 +8 @8 #8 $8 %8 &8 *8 =8 := -8 a: Y- ;8 >8 ,8 a1 '8 )8 !8 ~8 (1 W6 {8 =_ ]8 ^8 /8 (8 _8 :8 <8 [8 =- }8 9* i] |8 18 28 38 ; w ; ; ; , ' 7 ' , ; ; ; ' ~. x ; ' ; ; ' ; - ~. - _ , ; ; ; ; ; ; _ f : - ' d d ; , ; ^ ; ; ; , 7 u 48 58 ++ 5| 1. 5@ 68 ", "C; C; H D; 0' U% 78 J# H. ' ' , ; f ] ] _ - ; - ; ; ; ' ; ; ; ; ; ; ; ; ; ; , - - - `$ 88 ! U , ; ; ; ; ; ; ; ; ; ; w C% < 98 08 a8 I4 b8 c8 d8 e8 f8 g8 h8 u| =< *< W_ V_ }[ }[ I1 J1 V_ x| x| }[ }[ [[ }[ =< i8 -5 &< j8 k8 l8 %6 m8 n8 o8 p8 q8 r8 j} 14 14 }[ s8 t8 L1 u8 ;^ v8 w8 x8 y8 z8 A8 B8 C8 D8 E8 R% a$ , ' - | , f+ f F8 G8 H8 I8 i/ J8 K8 L8 M8 N8 i& T$ O8 f< o- P8 Q8 R8 S8 T8 U8 V8 W8 X8 Y8 e/ i& Z8 `8 U| i# #2 9 {2 I2 M@ 16 ^$ 5< .9 +9 o- @9 #9 y> W8 $9 ] %9 $; g8 &9 *9 =9 -9 ;9 >9 ,9 '9 )9 !9 !_ K/ #< {_ Z} J+ p^ u< h] $9 ~9 +} {9 ]9 s& ^9 18 /9 (9 _9 :9 <9 [9 }9 7! |9 %1 19 29 39 |] 49 *{ E^ 59 69 {> 4_ r) f] s! r) 79 Q| 89 99 09 a9 b9 c9 d9 e9 f9 g9 h9 k! 0# w ; ; ^ ' w 7 u 2 , ; ; ; ' - ; ; ' ; ; ' ; ] > : ; , ' ; ; ; ; ; ; - - ' - _ ; _ - ' ; ] ] - w ' X O. q& i9 Q. S. S. q ", "7$ 0+ }- D; 0' j9 k9 F& w , , ' !. ] 4+ M ' w ^ ' ^ ^ ' ; ; ; ; ; ; ; ; ; ; ^ ' | | | 4- >+ 2 7 , ; ; ; ; ; ; ; ; ; ; w <. u+ l9 m9 n9 o9 p9 K* q9 r9 (2 (& %< H1 H1 47 s9 J2 t9 u9 v9 w9 x9 y9 z9 A9 B9 C9 D9 E9 G1 r( *< <[ F9 G9 r# c& J~ H9 e^ I9 2= J9 K9 L9 M9 N9 O9 P9 Q9 R9 S9 T9 U9 V9 y- W9 X9 Y9 Z9 A 1 P - | ^ ^ P P 8< `9 y* 0 .0 +0 @0 #0 $0 %0 &0 :$ *0 =0 -0 ;0 v6 >0 ,0 '0 )0 !0 h3 ~0 {0 ]0 ^0 /0 (0 _0 C~ :0 <0 [0 ^^ }0 |0 E! 10 20 30 40 50 60 70 80 90 00 v% a! a0 b0 c0 d0 e0 f0 g0 h0 {9 i0 j0 k0 {> q) r) =_ -_ 7! p^ p^ }] J+ l3 e] ;* l0 m0 )3 n0 o0 p0 q0 r0 s0 t0 u0 v0 w0 x0 $* y0 ~> <] o^ K/ I! )_ z0 69 A0 B0 G^ G^ s! C0 X- D0 E0 F0 G0 H0 I0 J0 K0 L0 M0 N0 O0 0# w ; ; ; ] f ] 4 X , ; ; ; - ' ^ ' ; ; ; ; ' - f ]. {. U , ; ; ; ; ; ^ ' ' - _ - , ^ _ !. f { { , ' I% , P0 Q0 T+ 7+ 8+ 9+ q ", "7$ 7$ H 8$ T% R0 S0 A& w ; ; - , ] M {. ' , ; - d d - , ; ; ; ; ; ; ; ; ; ; ; ; ; - ' | , , ' ; ; ; ; ; ; ; ; ; w ~ ` n6 T0 U0 V0 W0 X0 Y0 Z0 `0 a .a K2 q( +a J8 @a #a $a %a y> &a *a =a -a ;a >a 5: _& 62 ,a [[ 'a =< 79 )a !a ~a {a ]a ^a /a ~/ (a _a :a b ,b 'b )b !b ~b l+ , ' ^ ; ] > : : , ; ; ; ; ; ; ; ; ; ; ; ; ; ' f q. T 7 , ; ; ; ; ; ; ; ; ; ; ; - , 7 q. ] ). q. ' , ' q. I= {b ]b ^b 8+ 9+ q ", "C; C; j. ;% T% ;, /b A& w ; ; ; ; , ' ' ' , ; - e ( _ - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; w f+ .= (b _b :b g[ n# f& Ob Pb Qb Rb Sb Tb Ub Vb Wb ;! Xb Yb Zb `b c .c +c @c #c $c %c &c *c =c >* -c ;c o[ >c u% r% 3> R@ T@ p# Z- ,c 'c )c !c ~c e* ~[ {c ]c ^c F4 K/ I< L/ y% 72 2_ 72 /c Z} l3 l3 Z} (c :] e# _c i^ 1] Qa <& :c d | ^ ' | | ^ 9 ,d ` 'd ' )d !d ~d i# ;; #< {d ]d 4c o< ^d /d J( (d _d :d b: S[ Qa r7 td l3 ud vd wd xd yd zd Ad Bd 8, Cd _1 Dd =_ m3 F4 Ed Fd !_ 1] Gd |] Hd &3 Id Jd Kd Ld Md |+ Nd Od Pd Qd Rd Sd | ~ , - ' ^ ' ' ; ] ] ; - ' ; ] - - ; ; - ] - , : , w w , ; ; ; ' ' ; - ] - ; ; ; _ f 4 q. , 2 7 ' , ' 4 5+ Td Ud Vd 1. 5@ q ", "=% -% j. -, p] =~ F3 r] w ; ; ; ; ; ; ; ; ; ; ; ^ - !. !. - ' ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; w ; A( Wd 2& Xd Yd Zd `d e .e +e @e #e $e %e 4, &e *e =e -e ;e >e ,e 'e )e !e ~e |; {e ]e ^e /e (e _e :e : 1 _ fe ^; ge j& *0 he ie je (] ke le me 3= ne oe pe qe re se te ue ve we xe ye ze Ae Be _] Ce [$ De Ee Fe Ge He Ie Je Ke Le Me Ne <3 w8 Oe V7 Pe Qe Re Se Rc Te Ue Ve Ga We Xe Ye U> Ze q^ <] S[ H/ ;_ V[ ,| Qa `e V[ >* f d/ .f i5 o^ +f y% Z} ,| H/ U7 @f #f $f %f &f *f x5 =f ^1 -f ;f >f ;! Z1 I! *{ Q| 1] Gd b: H9 ;* ,f 'f )f !f ~f {f ]f ^f /f (f _f N. S* w ; ; ; ; ; ; ; ] { f - ' - : : - ' ^ - > , ' ]. ; , - - ; - ^ ; - - - > - ; ; ; - > { 9 ; , , ' ; , > :f ( 5{ J# w ; ; ; ; ; ; ' ' ' ; ; ' , ] < ] , | - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; | - ;# (+ [f }f |f 1f 47 2f 3f 4f w! 5f 6f r( 7f 1] 8f 9f Qc 0f S~ /8 p= f _] b) af bf a cf df ef ff gf hf if jf kf K6 k6 lf mf nf `& of pf :^ qf rf Y- sf tf uf vf wf xf 8^ yf zf `2 w ; ; ; ; ; ^ - , 3+ | Af Bf Cf Df |4 75 Ef i< Ff !4 Gf p= I' Hf If ]0 Jf )> [2 Kf Lf Mf Nf #f Of Pf R] Qf Rf Sf Tf Uf Vf Wf Xf Yf Zf `f g .g ne +g @g #g E{ $g %g &g 5% 25 K} *g =g y= -g ;g >g ,g 75 e] +a +a o^ S[ !_ |] Qa rd /c H/ ,| p| 'g )g !g ~g p| y% p^ |] Z} 'g r7 K} {g ]g ^g _) o< #7 /g (g _g :g h ,h 'h )h !h ~h {h ]h ^h /h (h _h :h Q| jh )g 9> W> rd H/ H/ Z} Qa 7! _] kh lh 39 mh nh oh ph Ab qh rh 23 5c c4 '8 sh th uh vh wh xh yh zh Ah Bh Ch Dh Eh Fh Gh 3( Hh X4 D% w ; ; ; ' ; - , ] S M ' , 7 M N : - a a | - ' 4 ). f - - } a e - - - ^ ' ' ; ; ; ; - - ^ ' ; ; ; ; w - @# ## $# 7+ 8+ 9+ q ", "7$ 7$ }- D; E; F; Ih F& w ; ; ; ; ; ' - > - ; ; , 7 ) Y Jh Kh r. | ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; w d. ; Lh Mh Nh Oh -c }7 Ph Qh Rh d F1 |[ =< I1 *< B= Sh p< Th Uh Vh Wh Xh Yh Zh d `h i .i 55 +; u= +i @i f^ W- #i $i %i &i *i =i Ig -i ;i wb b% S[ =8 ~9 he >i ,i 'i )i !i ~i R% w ; ; ; ; , ' 7 a ,, , '% I. {i ]i u# o# ,& ^i x% L( l# /i (i _i :i j ,j 'j )j !j ~j {j ]j v- ^j ;_ >@ /j (j _j x3 qh |] J8 :j k ,k 'k Tg 0. )k !k ~k '] {k ]k D% e= w ; ' ] ] - ' - , ' ' ' , ; ' ' - ] _ ; ; e ( _ - : ] M u 9. , ' ' ' ; ; ; ' ' ' ; , ; ' ^ | ; ; - | ' D# .j ++ @+ 4@ 5@ q ", "7$ 7$ H ;% T% 1- y: ^k w ; ; ; ; ; ; ^ ' ' ; ; ; w _ | | | | ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; w ; ^ /k (k _k Ae D^ rf :k xc G7 rf x| L2 W_ I1 w| ef 3= r7 /@ Hk Oi Ik Jk Kk Lk Mk Nk %) Ok Pk Qk Rk Sk Tk Uk Vk Wk Xk Yk Zk `k l .l +l @l #l u< Z} Z} Z} mj Uj H< !_ N| Z} I< @) Z} ,3 `e $l %l &l P| *l =l -l ;l >l ,l 'l )l !l ~l {l ]l ^l /l )_ -] (l _l :l - ' ' ' , , , ' , , , ; , - , - d = | - : { N 7 ^ , - ] - ; ; ; - ] - - ; e e f - ^ ; ; !. f 7l h1 ]b @+ R. 5@ q ", "8l 4. G ;% T% 1- a_ ^k w ; ; ; ; ; ; ; ; ; ; ^ ; ; w O O w | ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; w - 9l 0l al bl cl 1] dl el fl gl @6 V_ [[ [[ I1 hl }7 W@ il jl q5 kl ll kl ml nl ol pl w| w| ql rl A1 `e 27 sl tl 13 !2 ul vl 6! wl xl V_ yl W3 E} zl Al Bl Cl Dl El Fl ]5 < , ; , 7 7 ; , , { P r. - w ` Gl Hl 64 Il (| Jl g[ Kl p# s# T@ Ll :+ i> e^ =3 +f d4 K< Ml Nl Ol Pl &; Ql ye Rl h& 2< Sl Tl Ul m- Vl Kl f* Wl Xl Yl 3> A+ Zl `l m 56 R$ .m )4 +m @m #m $m %m d5 &m B2 *m =m -m ;m >m ,m -@ Gd G^ 'm G7 Q$ G7 G7 $9 f rd H/ o^ `e o^ o^ Z} B~ Qa *{ )m !m m, ~m {m ]m ^m /m (m _m :m - ; ; ' - > - - ; e e ] : f ' , ' ). T2 cm ]b @+ R. =, q ", "C; k. y. -, T% dm a_ ^k w ; ; ; ; ; ; ; ; ; ; ' ] f , P ^. ~. | ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; w _ em fm L- gm hm im yl jm &< +6 km *< =< x| J1 og lm J2 =< 7f }1 mm b: E, sd nm om 14 [[ [[ ^[ pm Y- qm ^[ i} ql jm *< 4j rm sm F1 tm um vm wm xm ym zm Am Bm Cm Dm Em b - | f ] M {. ' _ ~. [ 0. d _ w 3+ , Fm Gm 1^ Hm Im 6> F~ Q@ /$ p# C, Jm [& k, 4: sf Km Lm Mm Nm Om Pm pe Qm Rm d& *) o# uk 9! Sm Tm }0 .m Um Vm Wm l& R$ e% Xm Ym Zm 26 2< `m n .n +n @n #n $n %n &n *n =n -n ;n >n ,n 'n <: -* ^c sd /c Z} /c sd p| 60 y% H/ %{ yi Gd H/ Z} Uj G/ !_ >i )n -* #i !n ~n {n gi ]n ^n /n (n _n :n B: Gn Hn t= C= In Jn Kn Ln Mn Nn N} On u# Mk ($ 00 Zm Pn Qn .g Rn Sn ,5 '& Tn Un ~> n= z= u% Vn Wn Xn Yn Zn `n o .o +o @o #o $o %o &o *o =o -o ;o ;! nk %! >o ,o 'o )o 6< !o ~o 6! {o ]o W_ n8 zb Qa Qa H/ S~ ^o /o _n (o _o :o A8 : f ; ' ; - - - ; ; ^ _ b. Ao Bo Co Do Eo Fo .0 a! s# p# p# u% vk F~ q# ig `- Go Ho 9f jo Io '2 Jo &2 vk W$ u# m& Ko Oj gj Lo Mo No o- Oo }i :& A~ u% K( q# q# F~ Po Qo Ro So To Uo .# Vo Wo Xo [d Yo Zo `o p .p +p W6 %; @p #p $p %p &p *p =p -p ;p >p ,p i< i] 'p )p r7 N| 79 -c !p ~p {p ]p }| ^p /p (p _p :p

    : ; , ' ; ; ; ; ; ; ; ; ; ; - | w | - _ - - ^ _ ip jp kp lp mp np op pp qp 4j F1 k} }[ }[ }[ }[ }[ }[ }[ }[ }[ =< =< x| V_ -5 r( W_ *< r( Qc Q| y4 1] i *< [[ }[ }[ V_ I1 [[ rp sp tp up vp wp xp ;# - yp zp 2 - - _ - - - ; - ' - ] - ; ; ; ; w x ~ V Ap Bp Cp Dp Ep ia s# j# p# G~ F~ 2< k= Q@ b& i& Fp -k Gp Hp Ip l/ S- F~ +c 8h Id -! Jp Kp .( Lp Mp Np F( J! 25 R@ F~ u% G~ b& Op Pp Qp Rp Sp Tp R% Up Vp Wp Xp oe Yp Zp `p q Q' .q Z1 +q @q q ,q Q$ w< 'q )q !q ~q {q ]q ^q ^1 b) d/ U7 /q (q _q :q 9 e 0. ] - , 7 u N f , ] ] f ; ' ' - ; - = a. | - d / d - ; ' , ; f > ] - ; ; ; ; , ' ' ^ y b ~. bp D3 ++ cp 1. 9+ d_ ", "+ + G 8$ T% 1- a_ J# 6q X. ' , ; ~ - | ; ; ; - ' , , ^ - y; z 2 w , ' - f ]. {. U , ; ; ; ; ; ; ; ; | | | 7q 8q dg _ - e e _ w Y. 9q 0q 6l aq bq cq dq eq fq G1 [[ }[ }[ }[ }[ }[ }[ }[ }[ =< I1 [[ gq hq =j X3 j} *< W_ }[ }a iq 1: jq 5< =< =< }[ V_ x| j} /[ V3 ah kq Le +4 @# lq y; ' U ~i , | ^ ' ' ' ^ ' ; - - - ; ; ; ; ; | w ^ mq nq Qp `' oq x7 pq j# /$ p# p# p# _$ p# b& qq .2 y0 rq sq tq uq b! u% ok vq wq Ef xq yq Kj Q@ zq Aq Bq d6 :$ S@ q# s# Cq Dq Eq Fq Gq Hq Iq 3+ 3+ 6l t. Jq y! Kq Lq Mq Nq Oq Pq a1 Qq Rq :c Sq y/ i] Tq Uq Vq Wq Xq Yq Zq `q +e r .r +r f] @r yi te #r $r %r &r *r W6 H/ Qa Pn '5 =r -r ;r >r ,r n1 C% 3+ w w 3+ o/ 'r )r !r ~i ~ , - ' ^ ' - _ d _ - - , ' N ~ { ] S M x f f , ' ; ^ d d _ ^ _ d d - ; , 7 M 4 { ] - ; ; ; ' ' , , | 4- z ;~ -7 ;7 ++ 5| S. 5@ q ", "k. k. H D; T% +j a_ ~r M {. ' , = {r = - ; ; ; ; ; ; ; ; ; | w , ' ; ; ' f q. T 7 , ; ; ; ; ; ; ; | - O ~. a$ ;+ < ^ ^ a a | e= ]r ^r k! /r (r _r :r 4$ r. Xr Yr R} > , _ ; | f= $~ Zr `r s .s +s @s #s Lm va $s H1 =< W_ W_ *< *< *< =< }[ L2 %s C} &s *s ~9 =s I1 V_ V_ f} -s {= ym ;s >s %< H1 w| I1 wl J1 ,s J@ 's )s !s [@ < 1 ; _ _ e e _ ' x ] , w | ] ] - ' ; ; ; ; w ; M. < ~s {s ]s ^s /s [$ k= p# /$ Q@ Q@ Q@ p# K( b& (s 9k o< _s b9 :s - ' ; ; ; w ; '. [l @t #t $t %t &t No n F~ _$ p# Q@ Q@ Q@ p# od O@ *t ,g _| =t -t *a ;t +< >t ,t 't )t )4 !t dr ~t Go i# R@ Q@ Q@ ($ p# Q@ {t ]t ^t /t (t `9 _t (+ e+ e= V w :t ,c + R} st tt ut vt 'd 1 | wt xt yt H5 zt At /= Bt Ct Dt Et Ft Gt Ht b: q( V_ It j} x| I1 wl j} Jt Kt Lt Mt Nt Ot Pt Qt Rt I~ X- :g St 22 q< Tt Ut Vt k} }[ }[ wl um xl <] Wt Xt Yt Zt `t %n u .u +u @u #u M~ $u %u &u *u =u N 1 f } _ | ' , ~ ). !; -u ;u >u ,u T{ 'u )u !u [s ($ b& l= S$ p# _$ q[ ~u {u ]u )4 26 o[ O8 O[ H' zj ^u Q_ 4_ i/ -j /u (u _u .2 :$ p# Q@ Q@ r# p# :u 5u 6u 7u 8u 6% 9u 0u au bu cu If du eu fu gu hu iu Q) ju ku ps W> lu jh mu nu r) ou .! pu qu 0f ru su 4< tu uu vu wu xu yu zu Au ;2 3+ w f : ( V ^. 4$ y - | ; ; ; ; ; ; ; ' , !. - - - ; ' ; ' - ] ; , , ' ; ; ; ; ; ; - , ] M {. x , ; ; ; ; ; ; ; ; ; ' ; !. , ; , =# 7 T2 3| T+ @+ R. =, d_ ", "+ + j. ;% T% 1- a_ p. w ; ; - _ | y ^. - | ; ; ; ; ; ; ; ; ; ; ; ; ' ' ' ; f ] f ] M X. ; : ] f > f d ' ' ' ; | Bu Cu Du Eu Fu Gu Hu _[ Iu Ju Ku Nl rp Lu Mu e^ W_ }[ r( V_ *< }[ [[ 'a Nu Ou Pu `) Qu Ru rd I} T9 >o z8 Su Ne x8 }] Tu Uu b} =< V_ x| I1 'a Vu [1 Wu Xu Yu Zu `u v .v +v @v #v $v %v &v *v |q =v -v ;v >v f / 9. - w : .# - ,v np 'v )v xp j+ -$ !v ~v 66 n# g& u# &) R$ {v 0> ]v ;g /c ^v i# L( M( 60 /v (v _v $9 :v K/ |] kv lv Y- |r p< mv ;i nv l3 jn $7 ov pv qv rv sv tv |> uv `+ < , - - _ - > [ [ - | ; ; ; ; ; ; ' | ] ] : > ] ; ' ; ' - ; - ' ; ; ; ; - ' ^ ' ; ; , ' ' - , - - ^ ' ' - ; ; - ' f ] ] , , 7 u vv wv Ud Q. R. 5@ q ", "+ C; y. -, T% 1- y: f= | ; ; - ` a 0. x ' w ; ; ; ' ' , , w ; ; ; ; - ] - !. ] S M ] 9. 7 Y. < xv yv D8 zv @4 Av Bv Cv Dv Ev Fv Gv Yh i3 Hv Iv Jv W- Kv Lv Mv Nv Ov Pv Qv f< #6 &< }[ =< }[ *< [[ pg &< Rv oi o} Sv Tv Uv Vv 6j Wv hs b4 Xv r^ Yv F9 V3 =< =< [[ j} -5 ([ Zv c) ~9 `v w .w +w Ku @w #w $w %w &w *w =w -w ;w >w ,w 'w )w !w ~w {w U d _ $- ]w ^w /w (w _w +t U* :w - , ] M M .# Iw Jw Kw Lw 6r Mw Nw Ow L7 Pw Qw Rw Sw Tw Uw Vw v< }a ln m= Ml Ww Xw Yw Zw `w f} x .x +x o^ l8 I1 =< }[ *< [[ q( U3 @x 23 Gd #x $x %x &x *x =x -x H/ ;x >x ,x G1 F1 F1 }[ x| 'x -5 )x !x ~x 8} -_ {x ]x ^x /x (x [b S_ kt _x pi :x hx ix }* C7 [s jx kx lx ($ Q@ p# .m mx nx ox px qx rx )+ ~ e+ ; >$ Av sx tx ux vx wx ~! xx yx zx S[ !_ Ax Gd :] Bx Cx Dx J( Ex Fx Gx Hx Ix p3 Jx Kx Lx Mx et X! Nx q^ Ox Px Qx w Rx Sx Tx Ux Q{ Vx Wx Xx Yx rr Q d - ; ; ; ; ^ f ] M {. ' , ; ' , !. ; ' : ] M {. ' , ; ; ^ ; , 7 7 ` _ ; ; ; ; ' f f ; ; ; ; ; ; ; - d a. d x ; ^ ; ; ; , ] M {. ' , , , Zx `x y ^b 8+ 9+ q ", "+ + H D; T% +j a_ m1 , ; ; - d / e ; , ; ; - ' f ] M {. ' , ; ; ; ; - - ; _ x x ] 4$ .y - +y @y #y $y %y Sm ,0 &y L/ ss q^ B~ %^ x| G1 v| c} V3 *y =y -y ;y ;x ,x ;i >y ,y f< F1 G1 =< }[ *< [[ }[ W_ +a }a [[ 'y )y yl !y ~y 5, {y ]y .c H2 *< =< =< *< *< w| w| V_ ^y /y @p +q l3 (y _y :y 3y 4y 5y 6y 7y ;# 3+ ' 7& 8y 9y 0y #@ [s ay p# /$ R@ M( p# b& n# n# b& h& b& o# s% Go $9 J! i# i# o# i& n# m# by V- p# Q@ p# cy `1 dy ey fy gy hy iy @] e+ 3+ , 3$ jy ky {s ly my ny !n oy py G/ ~_ qy ry sy G/ ty uy vy wy xy yy zy Ay By S[ i^ X> Cy et q^ Dy /c |f Ey Fy G< d> '> Gy Hy Iy Jy Ky Ly My 0# '. w ; ; ; ; ; ; ; , ' ' ' , ; ' ] ] f - - - ' ' ' , ; - ' f ] M T !; _ - ; ; ; | - < f - ; ; ; ' | ^ - | _ ; ; ' ; ; - ; f ' ' ' _ ^ - &% m2 ++ 3@ 4@ 5@ q ", "+ + H F# 0' +j a_ q2 | ; - - ; _ _ , ; ; ; ' - : { N ]. ' , ' ' ; ^ ' ' ' | 1 Ny Oy Py Qy Ry Sy Ty Uy Vy Wy l3 Xy T_ ,s y| 4b Yy 'a }[ }[ b} Zy I1 `y z .z +{ 3/ H1 H1 Jp +z @z #z Pi [[ x| }[ *< =< =< H1 l8 M2 $z D7 *0 %z &z *z =z -z ;z @a c) iq K' P[ >z jm I1 [[ .6 N[ ,z 'z Ax )z d3 !z ~z um l8 pg 5< 5< u9 }y u| v| %< F1 %e 'a [[ x| qg 82 4e ~o {z ]z ^z /z f+ w .@ (z _z :z { N yp 0. _ - ; ; , ; M S ] , ; ; ; - ] d ` ' , , w ; ; ; ; ; - , , , ^ = e &~ Gl u. Q. R. 5@ q ", "k. k. H D; T% +j y: ^k , - ; ; ; - d d - , ; ^ ; ] > : f ; ' ; - - ; ; - _ f Pz Qz Rz 4 Sz Tz Uz Vz Wz Xz Yz jm Zz og J1 w| w| [[ =< }[ =< W3 67 ;@ `z A .A gl =< *< D9 n< Q) +A @A #A Is r( x| =< }[ =< G1 7f |9 $A %A K! n) &A *A =A -A g% ;A >A Nb ,A 5: $s G1 u| ln g8 'A )A %| !A ~A y/ {A Qs V_ W3 to M2 ;5 Is V_ =< =< =< =< =< ]A <[ x| Yv ^A /A (A `v _A :A 3+ .# I% N- / S< K( ($ R@ bA }: cA O} Y& dA eA z, P% fA gA @] ^ hA iA jA kA lA K> mA nA oA pA qA rA sA ^= tA wi uA qm r7 vA Cy Bz wA ds xA yA zA .l AA 60 u6 b) ek BA 65 ;_ H9 *{ CA DA 8s h{ EA FA 7| d. N- w ; ; ; ; - - ; ; ; ; ; , ' 7 u {. ] , d ( d - ^ _ ] O ] 9 GA , , > - ; ; ; ; , M M - , ; ; ' - ] d a _ 7 7 ; , ; ; ; ; ; ; ; ; , = e s. q& u. @+ R. 5@ q ", "4. 0+ }- D; T% +j y: q2 : > ] - ; - = a. | - ; ' ; , - , ; - ' - ] - ; ; ; , ] %- HA Du IA JA KA LA MA I1 pg H1 I1 _[ O2 *< [[ }[ }[ *< k} x| vm 6! Wy Ym NA K/ H2 =< =< h8 v= &; OA Ng PA QA Is V_ W_ W_ =< v| %{ zc RA SA TA UA VA WA XA YA ]p ZA `A B .B 49 +B G1 pg .h @B #B $B .n %B &B *B U3 jn j} =< }[ *< W_ V_ =< }[ }[ }[ *< k} ]A J( W_ wl wl Vu >5 ( =B -B bj ] : 1 _ ;B >B ]v ,B 'B )B !B p# k# i/ k# c& J! qd ~B {B )[ ]B nz ^B en /B (B _B :B f |] O8 $9 z0 lB ,8 mB V& nB oB pB qB rB ]. ; w ; ; ; - ; - ; ; ; ; ; , 7 u U ' , - - _ , ; ' f P gp ~ J= 0 _ - - - ; ; ' , ; ' ' - , ; ; ; ; ; _ _ | {. {. ; , ^ ' ; ; ; ; ; ; ; ' ; &% D3 T+ @+ R. 5@ y. ", "k. k. }- D; T% 1- sB tB ]. { ] - ; ^ d d _ ^ ; ; , 7 {. U , ' ; - - - ; ; ; !. ] uB vB oe W, wB G/ xB %e J1 [[ =< [[ <[ <[ *< [[ }[ }[ k} [[ J1 ,s S_ yB zB `) yg G1 =< =< H1 ;@ '* AB BB CB DB 'x =< x| Is It G1 Js EB <2 40 FB GB HB IB O* JB KB LB MB NB OB PB Yy QB B~ g3 P_ RB SB TB UB VB WB F4 C ,C 'C (v )C H7 xa !C ~C {C *0 ]C p# p# ($ c& b> ^C /C (C T9 _C :C | ~[ ;& va fC / gC hC iC l+ w ' , ; - _ d e e - ; ; ; ; , ' 4 ' , w ' , - - ; ' , ] r. - a = | ' ' ' ; ; , 7 {. U , | ' ^ ' ; ' | ^ - , U q. ] f ; - ' ; ; ; ; ; ; I% , b_ jC ]b @+ kC dp G ", "+ + G 8$ T% lC mC nC q. f ; ^ ; ' ~. x ; ' ; ; , 7 {. q. , ; ^ ; ; ; ; ; ' !. ] oC pC _; qC rC sC dk w| tC V_ *< ]A *< V_ k} x| I1 V_ <[ |7 J1 t8 uC vC wC Pk rf H1 =< }[ =< 4b xC BB yC zC AC /[ ([ p8 'x XB j} r( BC N2 kn CC Kp DC EC FC GC HC IC JC K@ Yy YB KC {[ ^g LC MC NC OC Th ym PC QC RC SC Zz =< w| H1 H1 w| w| }[ W_ j} Is wl Is It }[ W3 W3 *< TC Xy 9* UC VC 3{ c$ N$ q. WC XC E7 !x YC ZC `C Aq D .D S@ S@ Q@ q# ($ k& {3 q7 ]$ @D *d #D $D %D &D *D b9 =D C% ^ - -D ;D >D ,D 'D b; )D mz W7 !D ~D {D ]D ^D /D (D Wj u< 9> _D :D 5% w< |] jB )q m3 90 :) V[ C} G7 }] Q[ C= - - ; ; ; ; ; ; ^ - , 9g Gw T+ @+ kC 3D k. ", "+ + j. ;% T% 1- y: 4D w ; - ' ; ' - ; ; ' ; ; w ; ; ] ] - ' ; ; ; ; ; | ] < 5D 6D 7D 8D K/ ^[ i} I1 x| V_ 8! J( 'a It V_ x| }[ J1 L2 U3 I1 9D X- 0D .z Ze Yv [[ }[ }[ =< F1 V3 6: aD bD cD >5 Y3 Is I1 V_ =< }[ dD u| H2 )4 gl b} =j o^ ro eD q7 n8 5< }[ jn It fD gD hD iD jD kD d^ lD mD nD oD pD u| =< [[ +6 +6 }[ w| I1 x| Is -5 }[ V_ V_ V_ W_ *< W_ J1 }[ 9> qD rD sD .C 6{ i tD uD ea vD wD h3 xD yD e6 a& c& o# ($ Q@ Q@ |4 |4 F~ 26 zD *) |< b! u% u% z= T@ i# V- R@ p# i# b& J! {3 Hk AD BD CD y) DD |l ED FD 3$ x w - j+ GD HD ID JD KD LD y$ |9 /c mj Xj MD ND OD PD V[ rd QD p| X> RD cC Z} jB SD G, TD K/ |] q, 2_ 3_ UD VD nv WD XD YD ZD `D d 3+ w ; ; ' | ] ] f , ; ; ; ' ' ' - ] [ ] ; ' ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; w ; ; ] > ] ; , ] , ; ; ; ; ; ; ; - - - ] - ; , - - - - | | E q& u. Q. S. 9+ y. ", "+ C; y. ;% T% 1- a_ &% w ' ' ; ; - ' ^ ' ; ; ; ; , , f > - ' ; ; ; ; ; w R% '% .E +E @E #E x| %< Is Is V_ W_ *< %6 Is It V_ W_ x| J1 V3 <[ Is $E .a &* ~1 a> q( =< }[ }[ =< }[ [[ %E &E *E =E -E ;E Bg >E Ov F1 [[ =< =< W_ U3 }[ H1 v| v| u| jm |7 =< 'x ,E 'E )E !E ~E {E p; ]E ^E i5 K' /E (E _E #x F1 }[ =< ;5 ;5 =< [[ V_ [[ &< &< }[ W_ W_ W_ V_ V_ V_ [[ :E km 0E ($ /$ Q@ r% i# L@ :v i* {t id =- aE bE cE b9 '; w ; _ w q. dE eE fE gE hE _o iE jE q^ #d Qc -< kE lE mE U[ 3a d/ q^ yA /8 nE oE pE .r p= <' qE 5k rE sE tE yz uE Jv vE wE xE yE zE AE ^ _ ; - , ] S M ] , ; ; ; - ] - ; - - ; - ; ' ; ; ; ; ; ; - ' ' ; - ; ; ; - ; | | , f [ [ : ]. M W w ; ; ; ; ; ^ ' ' ; - - ; ; e e _ , 7 {. F. BE ++ Q. Q^ R^ ;% ", "+ + y. ;% T% lC sB CE ' , ; ; ; ; ; ; ; ; ; ; ; ; ^ ; - ; ^ ; ; ; ; ; w DE T EE FE GE cD jn F1 j} HE }[ =< V_ w| og IE *< j} Is tC [[ V_ It JE KE LE ME N| }[ }[ =< }[ }[ =< }[ NE OE PE w- QE '> RE Y! Z1 ww ;5 gl pg J1 j} V_ [[ =< V_ V_ }[ H1 T_ SE TE UE VE v- WE ^= XE YE %3 &< ZE `E F .F +F w| wb *< }[ w| }[ V_ }[ <[ U3 W3 }[ V_ }[ *< }[ }[ *< [[ l8 )g @F #F $F A( N$ ] Zt %F &F *F ^$ h] =F =F QD a& ($ b& -F ;F 'a >F ,5 K[ e! 9E 2a ,F 'F wx )F -: m/ l= S@ R@ /^ m& !F ~F - ; , , - ' - - ; ^ ; ; ; - | > > ^ | ; ; ; ; w O O w _ ] x a$ q. T 7 , ; ; ; ; ; ; ' , , , , ~. ; e e ; , 7 x; + lF ++ Q. Q^ ;( ;% ", "+ C; y. ;% T% mF nF oF 2 , ; ; ; ; ; ; ; ; ; ; ; ; ' - ; - ' ; ; ; ; ; w e+ ' pF qF ;s oy u| H1 k} }[ V_ W_ V_ x| +6 +6 *< Is TC p8 x| k} V_ rF sF tF uF 4c +a H1 =< }[ x| k} }[ vF wF xF yF E+ Y_ 2j zF AF BF ^& CF DF um It Is I1 x| -5 -5 }[ EF FF J@ Fn GF HF e^ C- I' YC IF /& JF ~1 KF LF MF NF OF zb +B 3/ w| I1 V_ |7 U3 W3 }[ *< k} }[ *< }[ *< =< V_ |[ 9u PF QF _* e+ C% , RF pF SF TF :$ d& #9 UF a3 wm ($ T@ R@ q[ q| !t VF .( vq ~4 ~4 Go ~$ @2 b> .( WF -F n# n# Gf et &@ XF *) k& YF $a ZF `F G .G 54 ; ; w ; ; w ; ]. +G Pd @G #G $G F0 %G &G *G =G -G VA 4r u< Q$ /c X> /8 ;G 1y /8 )p +) qd a% >G ,G 'G )G !G uE ~G {G ]G ^G /G (G d. e= w ; ; - - , ' ' , , ' ; ; ; - - , ] : ] - ] > - ' ; ; ; ; w m] y - | ; ; - _ | y ^. - _ ; ; , ' ' ; ; , ' ; ; - ' | ' ' ] : > ] _ ; _ w 9. _G :G 3{ u. Q. R. 9+ d_ ", "+ + G 8$ T% 1- sB re *| 6G 7G 8G 9G D9 0G aG 0G F9 ZE s4 |9 bG X} |_ qm cG dG eG rp &x fG Mg gG hG iG XB tC 4a &< p8 w| }[ [[ r( &< r( [[ J1 V_ V_ k} V_ }[ x| j} jG VF kG lG _* e+ 3+ | mG nG oG f! O@ V- pG qG Mo rG sG %9 tG @; m& 4> n# s% *) *) dx s% s% u% F~ G~ l= !4 L( uG /1 Se vG 5> b6 k& e9 wG xG yG (b fm , ; ; w - ; ; w ; 5p zG AG 7D BG CG DG EG FG GG HG IG JG QD +f KG oE 'g ,a ~& >* wA Vv LG 4k #p MG O# NG *3 OG PG QG RG SG U1 TG '% ]. w ; ; ; ' ' , 7 {. 2 , ; ; ^ ' , 7 M N : - - - - ' ; ; ; , ; S1 q+ ' , - , - ` a 0. x ' w - ] - , ] M M ' , ; ; _ - ] M u u N { f - , - - a. fp 2{ UG u. Q. R. 5@ q ", "k. k. G 8$ T% 1- y: p. w ; ; ; ; ; ; ' ; , , - = B# ` ; ; ' , !. ; ; ; ; w d. | VG WG XG +a &< ;5 *< V_ }[ x| }[ YG k} [[ V_ W3 M2 }[ <[ W3 *< ZG `G r} H zc }a %< I1 H1 J2 .H }7 77 +H L' e^ b% pg @H #H 79 c) `) $H %H &H *H im xh =H -H ;H >H ,H (m 39 'H )H .~ tE !H ~H {H ]H jm v9 ^H /H (H Tm lv Xz rn T3 'x Is x| =< r( -5 j} x| l8 }[ *< <[ }[ J1 x| 2r YB V_ _H :H {+ e+ ; _ - , ] M {. ' , ; - d } ] 4+ ) 8 ]. f ; ^ ; ; , | e AH BH T+ Q. 4@ 5@ q ", "}- }- G ;% T% CH DH ^k w ; ; ; ; ; - ; f ] ] , a ') 5 _ - | ] ] f - ^ ' w d. ; EH FH ;i =< ;5 jd <[ [[ }[ x| YG L1 YG x| J1 }[ *< V_ ]A J( *< GH HH 4( IH |x ;G J2 }[ }[ +6 +6 *< F1 1] .* l I1 jm G1 ,x }[ JH KH LH MH NH OH PH Lb QH .x RH SH TH -| pm UH Wy .> ]1 ,& VH +B r( }[ #z w= WH XH 4t |] H2 wl w| YH XB V_ W_ x| V_ V_ <[ L2 W_ W_ U3 |7 V_ x| k} K1 [[ ZH `H I 6l , f G* .I +I @I ia ay :$ O@ 3w #I $I %I b> i# G~ Q@ i# n# u# u# M@ n# n# b& b& n# n# *) &I s= !$ 0! S@ *I =I o7 )z -I ;I >I ] e+ ; ~. ] d a. _ , w ; ,I 'I )I !I ~I {I ]I ^I /I .A (I _I :I =j LA Wz pE J ,J 'J )J jm Xy W- J+ W- ^C x| !J ~J {J ]J ^J /J (J 2) P7 _J :J d x | | | - ; ; , , , ; ; ; ; ; ; , , , ' ' ; ; ; ; ; ; ; ; ' , w , ^ ` = L. P , - w ; ; ^ ' ' - > , , , ' ; ^ d d , , , , , ' ' ; ' ^ ; w - @# B& $# @+ 4@ 5@ q ", "3J -. -, ;% p] F; ,( F& w ; ; ; ; ; - , ] M {. ' P P - w , ; M M - , ; ] !. j! ^ 4J %w 5J =s w| um V_ }[ *< }[ x| x| W_ }[ }[ }[ }[ W_ Is It }[ 6J 7f >H up $i 7J 8J 9J 0J aJ bJ cJ dJ eJ fJ gJ hJ iJ zl (c Qs ^[ J1 14 jJ R3 /] kJ lJ mJ nJ oJ pJ 'q qJ rJ o4 > V9 q% sJ y| #x x/ tJ ^A uJ ^& vJ wJ xJ u| W3 DF %6 x| <[ *< V_ }[ }[ }[ =< X3 It It 'x r( W3 W_ jm [[ yJ #s zJ AJ x ; BJ CJ DJ Lh EJ FJ p[ !4 c& GJ W- HJ IJ JJ G< KJ o) LJ `e >* G} -3 dt MJ NJ Mx OJ (v l; PJ QJ b! /$ Nv H, RJ SJ TJ UJ VJ (* WJ ]. ~; f+ R, XJ X4 N$ ># YJ zf ZJ `J K .K +K Eg @K #K $K %K i7 Z} &K *K uC =K f< -K ;K >K ,K 'K )K `3 !K gx ;_ }a [[ ~K 1G {K ]K ^K /K (K _K 95 ^ >+ O 7q ^ ; _ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ' - - ; ' - w y @ X ' _ ; ^ ; ; - - ] ; ; ; ; ; ' ~. x ; ' ; ; ; ; ; ' ; - ~. , , ]6 :K $# @+ R. =, d_ ", "G G y. -, T% +j @j p. w ; ; ; ; - ' ' _ ' ' ' e d _ ^ ; , ' ' - , ; - w D% ^ -L ;L >L x] ,L 'L )L !L ~L {L Y2 ]L - , | _ _ | | _ _ _ _ _ ' ' ; ; ; ; ; ; ; ; ; ; | ] ] ; | ; ^ , X u 4 f - ' ' | ^ - ; _ ; ; ; ; ' - ; - ' ' ' - ; ; ' ; ] > !. - 7l ^L $# @+ R. 5@ q ", "+ + y. ;% T% 1- y: ^k w ; ; ; ; ' - - - w , ^ d d , ^ ; ' , , | ' ^ ' , ]6 : /L (L =0 K1 =< V_ V_ x| k} wl H1 +6 ;5 [[ J1 V_ V_ W_ V3 67 x| _L :L Pg |i fL gL 4' sb hL iL jL kL !6 lL mL nL 8f F1 =< k} V_ x| W_ W_ V_ I1 [[ ;5 +6 pn =< W_ j} r( L2 x| l8 M2 wb oL pL qL rL C% w ys sL Sg tL uL {^ ^$ q# p# :$ e/ vL =: wL |t xL yL Af -B zL AL BL CL DL EL FL 9 l& IK f& n# Q@ sk lH (0 GL HL IL JL KL LL ML NL OL PL QL RL SL TL 0d UL VL WL XL YL ZL `L M .M +M @M #M $M %M &M *M =M -M ;M >M ,M nr 'M b} &3 O8 )M Gd :] !M ~M eJ {M ]M ^M /M (M _M |o :M + e; >+ Y. ]L 7q ~. !. , , _ ; ; ; ; ; ; ; ; ^ d d _ ^ - ; _ ' 4 ~ : - ' - ] d d | ^ ; ; ; ; - ' ^ ' - - - , , w ; ' - f ). M }M |M T+ 7+ 8+ 9+ q ", "+ + y. ;% T% 1- DH p. w ; ; ; ; ' - ] ; ^ ; ' - > ; ' ; ; ; ; ; ; ; ' , A( { 1M af S_ F1 =< x| x| }[ W_ J1 'a O2 ;5 x| V3 x| k} *< |7 m} i8 zF 2M 3M 4M 5M D9 6M xg 7M 8M 9M {J el ;F d} 0M D/ aM bM cM dM eM 4a l8 I1 l8 [[ W_ I1 fM gM hM =| iM jM kM lM mM nM oM pM qM rM PC sM 7D tM uM z8 vM Qc H1 =< W_ =< G1 67 H1 [[ w| w| &< _[ &< [[ }[ =< V_ V_ V_ W3 Yv v9 wM xM yM 0@ e+ 9@ ys b. P> W7 {u zM !B u% p# L( n# H, J} AM BM CM 8< DM ]6 N$ P% 8x EM FM GM HM f/ L( -F 4> n# /$ ok IM JM KM LM MM dE NM OM PM QM RM SM TM UM VM {0 WM XM YM =* ZM `M N .N +N @N #N $N %N &N *N =N -N ;N >N ,N 'N 0) )N KH iB !N !N Ez +l ~N {N ]N ^N /N (N _N :N v S 6N 7N 8N W - w ; ; ; ; ; ; ; - d e ; , ; ; ' _ f : - ' ' ~. f N. `. ; , ; ; ; ; ; ; ; ' - > , 7 7 ; , ; ' f X u 9N D3 ++ 7+ 8+ 9+ q ", "+ C; y. ;% T% CH 0N p. w ; ; ; ; ' - ; - ' ; ' - - ] ; ' ' - ; ; ; ; - w f+ f aN bN $l u| =< }[ *< k} =< 'x -5 }[ =< *< J@ W3 cN Is p8 u| L1 dN eN fN cz pg gN vI &x 3r /[ U_ 4b v| >5 hN Qs V_ iN jN kN l #d W_ }[ I1 p8 p8 yl +a J8 lN ^g [v mN nN oN pN i< @a g8 %3 qN rN sN tN uN X[ V7 he vN =< }[ =< }[ =< <[ U3 <[ V_ }[ I1 w| I1 w| I1 V_ W_ r( -5 j} [[ I1 gN rh wN xN yN ' , x - zN }& AN s) F~ u% p# &^ n# BN 85 CN DN EN [l FN .C .C $- GN HN IN JN >e :4 Bq :$ o# s% k& _| KN LN (; 'I ] MN NN ON PN U8 QN RN SN TN UN H~ () Iz VN 43 Ag WN XN YN Cg ZN `N O .O wc #1 +O @O #O $O =_ %O &O MF *O zi pD iB =O bs -O ;O >O a~ ,O 'O )O !O ~O {O ]O )G ^O /O (O _O -B 9# N :O f f , ' ; ; ; ; ; w D% , PI 5O G^ H1 =< W_ V_ }[ U3 &< J1 J1 [[ *< W3 }[ It 0L dD 6O 7O 8O 9O jL #g -| I1 4b J( L2 U3 |7 W_ =< =< V_ I1 xl ([ 0O hN jn H1 }[ =< aO =j 4b bO a: +q -e cO dO eO fO gO 2L ^c V3 hO ;G _j f^ T7 iO n8 d} e} HI H1 }[ =< V3 }[ +a jO kO lO -< F1 [[ [[ [[ [[ I1 J1 M2 L2 r( V_ =< w| &x K/ me Ke mO 95 N$ f ; i+ =p nO oO pO k= p# u% o# qO 9= rO sO tO uO vO S > 2 wO xO yO zO AO BO CO e6 l# DO EO FO GO HO IO <. e+ JO KO LO MO NO Bi C= lH Y{ G@ cF jN JH w< P ,P 'P )P !P ~P {P ]P ^P /P (P _P W7 mG :P

    + w | ; ; ; ; _ - w ^ , , w ; ^ ' ' - ' - : { N G. ' _ ; ] - ; ; ; ' ^ ' | , U G. ] ] ; ; ^ *+ d :G Td u. Q. R. 5@ q ", "k. G =. %# |- [P JL F& w ; ; ; ; ; ; ; ; ; ; ; - - : ]. q. ' , ; ; ; ; ; w D% ' }P |P 1P &6 Is V_ wl DF J@ W3 V_ I1 }[ V_ W_ j} 2P TC _[ +B @6 3P Ji ,M 4P 5P hq kn 6P K@ Ml L2 W_ =< }[ }[ W_ k} J1 HE 7P k} =< G1 =< <2 m< d ([ 8P 9P 0P aP bP cP p- ls el .i p8 TC Zz G1 u| ([ %e I1 W_ k} =< =< }[ W_ J1 V_ dP eP fP gP }[ %< [[ *< }[ }[ }[ J1 Yv M2 x| W3 <[ =< |[ hP hI iP aE jP @# , ; *J kP lP mP nP p# L( oP O@ pP qP wK rP sP tP uP T ; 2 vP wP xP yP zP AP BP o[ k= CP tj DP EP FP ZJ GP 0@ HP IP JP KP LP 7G H1 'a Vu Z- cF MP :] Z& NP I[ <2 y/ /= T~ OP PP QP KH )M RP SP Ez H< :] 'E !z =O !z 5F jB TP (c yA =j [1 T7 UP VP WP XP YP ZP `P Q .Q +Q *; !v @Q #Q $Q %Q pD uf &Q *Q =Q -Q #7 ;Q >Q ,Q 'Q )Q !Q ~Q {Q ]Q ~ x ^ ; ; ; ; ' - , 7 7 ; , ; ; ; ; ' - ] ] : f - - > > - ; ; ' ; - - ; ' , f Q+ g 4- - w = e ^Q /Q (Q Q. R. 5@ q ", "4. }- 3. _Q :Q 3Q 4Q 5Q mm q( V3 *< *< }[ =< }[ }[ x| YG 14 r( I1 x| =< v| }[ 1s 6Q ** 7Q 8Q 3f $K 9Q 0Q aQ :e pg HI H1 }[ V_ 'a H1 G1 %e 0L j} =< x| }[ }[ *< V_ V_ k} $) +( bQ cQ dQ p8 I1 =< }[ }[ }[ V_ *< *< V_ ]A J( x| uJ IK EF Q9 eQ fQ Hw w | * gQ hQ iQ jQ +2 s% e/ k& kQ lQ mQ nQ oQ pQ qQ 5 _ =# rQ d sQ *m tQ uQ vQ }0 N} ] wQ xQ yQ zQ O- AQ BQ CQ DQ EQ FQ #d 7f AC =< /A rf ]A ${ '| nt GQ HQ IQ JQ zl KQ LQ MQ NQ QP 'q .l V_ pm =3 p| &3 2y OQ ,a ul Q| PQ 5F (@ X! ,* D- 7z QQ ;^ RQ SQ 9) TQ r; Z_ >G 7f 7f eC UQ VQ WQ l} b} Qc /& b: l 3f XQ :) YQ ZQ `Q V! R .R +R I% ] w | ' ; ; ' !. ] M X. ; , ^ ' ; ; ' - ; , f a$ : > ] - ; ; ; ' - ] - ; ' ] f K. }@ b - | ^ ; @R 3{ u. Q. R. 5@ y. ", "k. k. #R %# |- $R F* F& w ; ; ; ; ; ; ; ; ; ; ; ; , , U 7 ' , ; ; ; ; ; w C% , :t %R &R s! v| *R Is %6 I1 w| J1 Is <[ W3 *< x| j} Is }[ <[ Is um I1 ww y/ =R *q -R ;R >R Kp l& ,R .H =< =< =< *< YG }[ x| }[ =< jm J1 'R )R !R ~R {R m3 yi ]R v| }7 %< [[ =< [[ Is V_ =< =< =< k} V_ V_ x| }[ }[ }[ V_ L2 U3 }[ |4 ^R /R (R _R %K F1 =< }[ }[ k} k} V_ V_ [[ &< H1 J1 [[ h8 yl :R S ,S 'S )S !S N$ 0j ~S {S ]S ^S /S (S _S :S dS eS fS ou gS hS iS lv ru Qc jS kS lS UQ l3 mS QP uy #6 $< rf he nS oS pS qS rS sS tS uS dz vS wS xS yS zS r( =< W3 U3 &< j} }[ W_ =< =< =< =< [[ w| I1 AS K2 BS fB Sm CS 0y !s M. $- _ 9. - , ; ' , , ] > - - = d - | : ] M {. ' , - ; ; ; ; ; ; ; ; ; ' , X {. G. _ ' , 9. _G wO <- $# 7+ GR DS + ", "+ C; y. ;% T% R0 S0 J# w - ; ' ' ' - ; ; ; ; ; ; ; ' ] > - ' ; ; ; ; ; ; , ; ES FS &e I| 4b GS yl um w| +6 O2 r( -5 -5 J1 M2 U3 *< V_ }[ V_ k} =< }[ ^[ ,x l3 Aj HS IS JS KS p; <7 LS l8 I1 V_ V_ =< *< W_ W_ =< }[ v| !N MS NS OS 4G Ph jm H1 =< }[ W_ Is It V_ W_ W_ k} so +B }[ [[ }[ }[ }[ }[ V_ *< }[ =< V3 &5 4F PS QS 9f I1 =< }[ V_ W3 U3 |7 V_ x| k} }[ p8 [[ G1 }[ @a ]z RS SS e+ 3+ w ;# C# (< TS US VS yM WS XS .# .# [R YS @3 ZS s+ F% `S T .T +T @T #T Ew $T %T &T *T =T -T ;T >T ,T '# 'T )T !T r5 ~T {T J+ ]T 5F (@ >z 2y E@ ^T QH /T 'l $C kl (T ^1 _T :T - ' ; ; ; ; ; ; w w kF 0T >G aT pg 5< |7 V_ [[ ;5 ;5 =< V_ j} V_ M2 W3 =< x| =< W_ W_ =< =< w| %< v| ^c ~1 bT /B cT dT >N eT fT gT S$ hT i} iT X3 J1 }[ [[ [[ F1 jT kT =R Ie XQ Zz hO V_ }[ W_ j} V_ W_ j} Is w| *5 *5 }[ =< V_ [[ [[ }[ *< V_ k} }[ =< }[ |7 lT p( i [[ }[ }[ [[ r( &< }[ =< k} x| [[ x| =< H1 W_ XQ mT nT rD n+ f+ w e+ V oT pT qT rT :* sT tT |E x <. uT vT wT xT , yT zT AT W9 BT CT DT ET FT GT :x HT !^ L~ IT JT 4q ha KT RB LT `a I1 b% (c |y .l MT @l NT kT OT PT qh QT RT ST TT I! UT VT #d 2y 5F I! )M bC VQ WT HE XT -] .h 5e YT wA ms ZT 0w `T U `K .U +U q5 @U +q hI b} 3/ ;5 =< [[ <[ ]A V3 X3 V_ W_ r( Is j} [[ }[ }[ w| w| -5 It V_ )4 0u /B #U $U - 0. d _ ^ ' ^ ; ^ ' ' ^ ^ d d , - ' ' , , - a e _ - ; ; - d e d - - ' , , , ' ; , ' G. %U *% ++ Q. R. 5@ q ", "+ + y. ;% E; &U *U p. w d ,, ` X ' , ; ; ; ; ; , =# 7 ; !. - ' ; ; ; ; ; ' ; , ] =U {_ >z 'a }[ =< }[ }[ [[ [[ }[ }[ x| W_ j} j} x| [[ V_ }[ V_ }[ <[ }[ [[ k} H1 h8 h8 :] Lm Fn -U &M eO ;U >U Hd I1 (j ,U ^[ [[ =< =< p8 p8 Gd d] (& 'U 'a TC j} =< =< =< =< W_ j} Is I1 YH 'a *< W_ *< <[ *< =< =< =< =< =< W_ =< k} I1 I1 [[ *< }[ }[ W_ r( -5 'x r( W3 x| V_ }[ }[ w| [[ H1 )U !U ~U g= d. w ; - T{ {U ]U ^U $U .# $- _ q. /U (U Y: _U ,} 0@ :U - a e ; , ; ; - d ( d - ; ; ; ; ; ; ; ; w , E% 6$ ++ n2 kC 5@ q ", "+ + y. ;% T% uU vU 4D w Z. Db wU xU ' , ; - ' ' w , 7 c. 4 : , ' ; ; ; ; ; ' - ] { yU zU AU J1 V_ W_ }[ }[ }[ }[ }[ }[ }[ W_ Is It J1 x| }[ V_ k} |7 U3 W3 =< k} 'a u| jn SE X3 jN -e 1j BU 4K CU DU EU 8% 8O *5 x| }[ W_ }[ I1 }[ FU SC GU W_ V_ }[ }[ }[ }[ }[ }[ V_ }[ }[ w| I1 J@ V3 &< HU ;5 [[ }[ }[ }[ }[ =< }[ k} }[ x| [[ =< *< *< }[ x| V_ 'x IE J@ |7 J1 }[ I1 T3 um IU JU KU LU X4 d. w ; ; qK MU NU OU sr f+ x 9. u PU QU gm RU ^5 '; rQ fe SU TU UU VU WU XU 3s YU ZU RQ `U d. f+ V .V +V VA @V #V B+ $V }[ [[ {2 (@ {2 k} %V &V *V y4 7f &! =V -V ;V b: >V lS 9S |y l3 Qc UQ (c py ,V 1y 'V !t +a o^ )V (j W_ !V ~V {V 5, ]V ^V /V (V _V :V - | ; ] > > - ' ' ' - ; ; ' , ; f > - | ; _ - ; ; ; - _ , ; ; ; ; ; ; ; ; ; | - A& B& ++ i1 HR 5@ q ", "+ + y. -, T% $R F* F& w (- 1V N G. ' , | | , - ; = 2V R -+ y - | ; ; ; ; ; ; _ f { 3V 4V 5V rn x| k} =< W_ x| }[ }[ }[ V_ =< j} j} }[ U3 U3 W_ [[ r( &< r( [[ x| =< =< =< j} ([ jn rf &{ g, 6V 7V =- 8V 9V 0V MP 5M u| =< =< =< V3 Is aV 'x }[ q( -< -< ,s h8 h8 (j 9M qf v| 17 67 FF bV cV dV eV fV gV rg 47 }r xl Vu =< }[ r( H1 I1 [[ V_ W_ =< W_ j} r( <[ |7 V_ }[ }[ w| um hV '& iV jV a@ d. w w | = kV 0n lV mV m* w H. 2 nV oV pV qV rV sV tV uV vV wV xV B% yV zV AV BV CV :B DV %% ~ V yL EV FV BU qh >i 1Q =< GV HV lT =< E9 IV HQ JV ;< KV ;& @x LV MV a: nf NV OV }a X$ |: /& ef w| PV lS 5j HV jB QV Y3 L1 3L RV SV qu TV UV 50 VV WV XV YV M/ x| }[ }[ }[ }[ V_ =< V_ }[ <[ x| w| w| H1 &< }[ =< x| to |7 =< =< u| ZV qh q5 5y `V W g+ ]. w ' - f { , - - - ' ; ; , 7 {. 4 : , ' w ^ - - ; ; , - - ; ; ; ; ; ; ; ; ; | - A& W* 2@ Vd S. 5@ 68 ", "C; + j. =. T% R0 IR :- | 7q ^. r. _ - | - O 4- a$ , x O- .W +W b. ] | w w w w w w Y. MK dg {i @W ,q DF }[ =< }[ j} V_ x| }[ V_ }[ <[ W_ [[ }[ U3 L2 j} V_ 'a -5 j} x| }[ }[ }[ }[ W_ =< =< }[ -< -< y4 z8 c9 #W Ly EQ i3 $W W_ v| SE &< Lg H1 FF h8 G1 }a fU |] *{ I! j^ l %W &W *W /] S_ |] =W -W LV ;W >W ,W 'W Wy H/ I1 -< |[ W_ rf }a #6 l8 x| j} j} x| [[ [[ V_ k} }[ }[ }[ [[ w| fV )W !W L7 }! 3+ w ^ | %~ =2 ~W {W H% 3+ w , , WU f@ ]W ^W /W (W _W :W w! x% Ko HI l0 Qa +r !z Lx .f Nx X$ -c ;G GV b% 5j bW cW dW iT iT eW fW gW hW px 0) iW jW kW lW mW 5: $l Uj wb }[ }[ }[ }[ }[ }[ V_ }[ W_ 'a 'a wl 'x IE }[ x| V_ Is V_ W_ W3 l8 W_ T7 nW oW pW qW rW =# x : w ]. q. ' , ] ; ^ ; ; , 7 M q. f ; ^ ; - d = - !. , ; ' ; ; ; ; ; ; ; ; ; | - A& W* T+ 3@ sW 1. y. ", "+ + H 8$ |- R0 /b A& w w - ^ ; ; | > z; Kh a$ f Kh @ 9 r& M. < , ; ; ; ; ; _ tW uW vW gz wW xW I1 V_ W_ j} -5 j} x| V_ =< W3 J@ <[ V_ V_ W_ r( -5 J1 wl V_ V_ }[ }[ }[ }[ }[ }[ }[ =< }[ F1 v| I1 O8 yW zW AW BW Z[ 73 CW &5 r( DW i8 V3 j8 V9 ;! Mg EW mv c1 7d FW GW >1 HW IW JW T& d9 KW LW MW NW OW PW QW ^N Im !x HI Ml H/ :g &{ U7 -s V3 'x It I1 w| I1 }[ *< *< *< *< [[ I1 RW '* SW F< O0 w ; - _ TW UW VW WW 3+ 3+ ^ x f XW YW ZU 8 ZW `W X X ,X [& 5< &< ,x 'X jj Z} b% kv uf |] fU )X qR *L 8W ~2 !X }1 lv %< [[ ~X gW {X ]X I[ CB ^X /X (X _X ST W6 u| #6 =< V_ }[ }[ }[ *< *< k} <[ U3 H1 TC V_ V_ }[ I1 x| j} -5 j} ]A J@ %6 =s Vu :X Y ,Y 'Y )Y !Y ~Y {Y ]Y ow JH nI CA =3 ^Y ^N /Y (Y _Y 3G W_ rF :Y Gt pY qY /E rY sY tY uY vY wY 3; xY Wa yY yY wY zY AY p_ Qx BY CY sM DY EY FY GY HY IY JY z0 KY LY O[ ;_ :k H1 =< ;5 +6 ;5 [[ }[ *< }[ I1 J1 %6 DF dl Z( ;p :* MY n> g= '. }M aX #j NY OY C% }M l+ R< PY &D QY $N RY WU aX SY TY UY sb VY WY XY YY ZY `Y Z .Z 0# <. e+ +Z @Z #Z $Z %Z rl &Z IE *Z ef =Z 'X XT -Z w| Rc ;Z >Z ^Y B~ F1 rF ,Z 'Z )Z !Z ~Z {Z ]Z o^ ef ^Z /Z (Z ~X _Z :Z ] x | ^ ]L %U OZ PZ QZ VJ Ny ^ RZ SZ TZ UZ VZ WZ XZ n* n> YZ ZZ `Z ei ` .` +` @` #` $` %` e+ _G _ &` *` _n =` -` I< pg b} nv ;` nu #6 OF >` [T ,` () xM '` )` rl ,s }a O' !` ~` vZ zZ Kv _2 {` c) ]` ^` /` |) $q Z' (` _` :` $s &d <` [` }` z! |` 1` 2` i }[ *< }[ }[ }[ }[ }[ }[ }[ V_ =< V_ }[ x| [[ =< }[ }[ }[ V_ *< *< }[ }[ }[ =< W_ HI ~> af 3` 4` 5` E% ] ] , ^ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; - , ' ' , , ' ' e ( _ ' ' ' - | - A& B& T+ i1 6` 5@ q ", "+ j. 7` DS T% 1- a_ ^k w ; ; - _ 9 a$ ] 4 cw 8` 9` 0` a` b` |T c` d` p_ e` f` g` yY )6 h` i` j` k` l` V& m` n` 6^ rm =< }[ }[ }[ }[ k} V3 V3 V3 =< k} x| [[ [[ U3 |[ Is j} [[ I1 M2 pn Is j} x| *< V_ %6 Yv HU _[ p8 w| T3 o` f} AR p` !& q` r` !1 s` G! zK t` u` v` f< w` Ar ]V d] a} x` y` z` A` B` C` dQ K/ ~> E/ D` E` o^ |] F` G` >z H` I` J` q( V_ V_ W_ =< [[ V_ V_ Is &< W3 *< x| [[ [[ ,x K` L` XX M` N` O` P` Q` R` S` T` U` V` W` 2! X` Y` Z` `` .b2 . .+ .@ .# .$ .% .& .* .= .- .; .> ., .' .) .! .~ .=4 { .f) ] .^ ./ .y> Th (y =e I~ 3= ( .~T Cd _ .: .)Q _; < .@K x6 [ .} .MI e, | .1 .2 .3 .4 .5 .6 .7 .8 .9 .Uq 0 .Qe &< a .v| b .c .d .e .f .g .h .i .ib }[ [[ [[ =< =< =< =< =< [[ W3 Yv *< `e ~& dD jm =< }[ }[ k} V_ V_ }[ }[ }[ [[ wl h} G1 Ra j .k .l . 1 , : : _ w w w w w ; ; ; ; ; ; ; ; ; ; ; ; , , , 7 {. 4 , - a d | - - - ' w , E% 58 ++ m .R^ kC q ", "C; y. n .o .T% +j a_ ^k w ; ; ' ; ] > f f p .q .r .s .t .u .v .w .wd x .y .z .A .B .C .D .E .F .G .H .y4 4G I .Wy F1 V_ V_ W_ }[ }[ V_ V3 U3 W3 V_ *< }[ I1 V_ U3 |[ -5 j} [[ I1 M2 pn -5 j} x| *< V_ |7 L2 C1 _[ I1 w| wl tC o` 17 VR J .7G k/ lD 9P G1 K .Yz T$ L .u| u| ([ ,x ,x v| J2 M .%Y U_ u| %< ,x G1 ^[ %< u| G1 H1 H1 v| 77 }[ ub ^` m; pn w| x| *< }[ =< }[ 'x -5 V3 L2 x| 2r r( |7 xl ][ N .E! !W PH O .P .Q .R .S .Yo T .)G U .V .W .X .Y .Z .` .!b ..ae ...+..@..(q 1G 9) @U #..$..%..&..*..=..-..;..>..,..'..hL )..;A 94 !..'O ~..{..[= ;Z ]..^../..(.._..:..<..[..}..|..1..2..sj 3..sE 4..3~ Nd 5..SQ 6..7..ke 8..9..0..a..b..5j n< &S c..d..e..f..g..hS =< 'a YG ;5 &< G1 >5 K1 _[ @6 |[ |[ *< t< h..b: {[ }[ }[ =< }[ }[ }[ }[ }[ }[ }[ Is 9W =s #H i..j..k..ba N$ $- $- $- .# .# C% 3+ 3+ w ' , ; ; ; ; ; ; ; ; , ' 7 ' 7 {. ). : - ^ - ' - ] ; w ' 7 %U 6$ ++ l..8+ 9+ [- ", "+ j. m..n..0' +j a_ ^k w ; ; ; ; - , ; ; $- o..p..q..cC l0 *Z r..s..t..!> u..W8 v..w..x..y..z..A...6 Jt f, B..Tn 7f 'a }[ }[ =< }[ }[ k} *< I1 J1 V_ [[ x| x| *< W_ V_ }[ }[ V_ }[ x| V_ V_ V_ V_ [[ W_ W_ *< }[ }[ }[ V3 to p8 'x 'a C..]> Fr %! D..eC hT H2 K@ E..g} *R G1 jm ^[ F1 3/ dD G1 G1 G1 jm H1 H1 jm G1 G1 H1 H1 H1 F1 (j }[ F..|z G..qg w| }[ *< }[ W_ Is It V_ }[ }[ W_ It IE J@ 'a G1 ^A @x Y1 H..I.. b J..K..<: L..:4 M..N..O..G4 b o) P.. ` Q.._v R..l/ Ej TT ^g df S..T..X/ U..V..hs |2 W..X..wu Y..DK Z..Q9 `..-m -` +..+.++.w8 f2 n~ @+.p; #+.$+.Xt %+.+N &+.*+.CY =+.-+.;+.>+.,+.EQ G' '+.T~ 9..8O Qe )+.!+.~+.{+.]+.^+./+.^X (+.;' _+.:+.V> P9 [[ p8 [[ <[ HU DW -5 It O2 <+.HU L2 'a }[ |] pt [+.;! H1 &< =< }[ }[ }[ }[ }[ }[ }[ Is XB hO H1 }+.|+.1+.2+.A( .C f { { { ] | | w , w ; ; ; ; ; ; ; ; , 7 u 2 , - > ] - ' ; ' - ; - , 7 8 9N 6$ T+ 3@ 4@ 5@ [- ", "+ + -, a+ 0' 3+.0N ^k w ; ; ; ^ ' | Up ^. IL 4J -d Z8 %) 4+.&x %s 5+.=: 6+.4b =< 7+.8+.>8 9+.0+.yA a+.b+._x c+.1& -H bO H1 b} =< =< W_ x| W_ [[ V3 W3 &< 2r V_ x| [[ wl M2 L2 *< V_ [[ wl [[ <[ ]A &< j} V_ =< EF -5 rU d+./@ y4 Tt c^ e+.f+.g+.h+.m) #B i+.X> &< I1 J1 Is og jm o` xl jm &< }[ W_ *< *< 'a 'a V_ [[ I1 }[ }[ }[ =< v| *< j+.k+.l+.PJ [[ }[ *< }[ W_ j} V_ }[ V_ =< =< V_ k} W_ x| xl |[ jm m+.n+.1H td o+.p+.Qs q+.7G 5< r+.6M DF H1 H1 C..s+.vm <[ W@ t+.@f 79 ef .l @r fU (c G/ i5 u+.(c cL )_ v+.w+.x+.x+.I( X- ,m ,m y+.z+.A+.B+.`& b4 C+.&! q` D+.E+.RC @a F+.G+.H+.Su I+.J+.yX K+.#W L+.M+.N+.O+.P+.S..Q+.O[ Tt <2 R+.S+.SD ^[ WT T+.7* H9 ZV 'U )M QP ty 79 HI j} c4 >R -0 X$ ^A U3 F9 dD !t }2 U+.V+.,s Qs [[ }[ }[ }[ }[ }[ x| [[ V_ j} V_ x| t| W+.X+.Y+.Z+.`+. @.zv OY iC fY $u aI .@., ; ; ; ; ; ; ; ; ; , ' 4 q. , , f ] - , , w ' ^ ' , +@.)7 5+ @@.u. Q. R. =, -, ", "C; + y. ep T% #@.a_ p. w ; ; ; ; ; w E% ^. E| $@.%@.&@.m} 17 J1 J1 w| [[ =< V_ og #A }y *@.IV ql =@.-@.;@.2r M{ 3T >@.G2 rU rU rm H1 V_ V_ 2r V_ W3 J( &< og }[ =< V_ I1 Yv L2 }[ k} }[ I1 J1 8! J( &< It V_ x| u| *R XQ @< ~1 `; i3 ,@.'@.)@.!@.~@.{@.m~ ]@.x6 og SE =< b% #d 7f {[ LA lf +a LA qR qR b% b% Qc i ^@.eD LA LA Qc b} u| V_ fT fS /@.]A J1 }[ x| }[ *< =< =< =< =< 'a G1 4b v| ,x i} J1 X3 _e aC H| lo ]c Hs YB TC Is J1 [[ J1 Is (@.(@.Is (@.xl Is W3 U3 J@ Yv ^[ i} ^[ ^[ H1 &< H1 H1 'a i} ^[ rp q| K@ K@ r[ n= rp %< Qs g} 27 jn jn f} 6e u9 rm }7 v| u| K1 67 S _@.:@.U3 () <@.[@.}@.=l FX |@.lM 1@.2@.3@.F..4@.nt lK EF %e b% lf Vu 5@.zx pm l} pm UQ 6@.>z 7@.8@.9@.0@.a@.3^ g b@.5i MR e] CC wx c@.d@.%z xl }[ *< }[ }[ }[ W_ j} r( W3 W_ =< }[ e@.:& )Q RX f@.g@.-B h@.i@.j@.k@.l@.m@.fQ [@ ; _ ; ; ; ; ; ; ; ' , : : - ' ; - _ 7 7 ; , ; ; ^ _ ( n@.o@.*~ Q. R. 5@ q ", "+ C; G 8$ |- R0 I# F& w ; ; ; ; ; w l+ - N~ p@.q@.X- Qs H1 'x XB V_ =< =< V_ }[ r( 'a H1 dD hl Nu r@.(@.-Y &{ s@.t@.u@.v@.p` U3 }[ }[ 'a -5 j} =< W_ }[ }[ }[ =< =< [[ x| x| W_ =< V_ J1 }[ k} W_ }[ V_ [[ x| V3 1] w@.x@.RH KW y@.z@.33 A@.B@.vh a} I[ wC Tn #d H1 Vu xA dQ ~> *{ o^ |] i5 C@.D@.9S E@.Vj o^ qc F@.G@.H@.mS 1] #d F1 J1 I@.,> C- J@.p8 p8 x| *< [[ }[ W_ }[ =< V_ =< *< }[ J1 Is Is V_ Qs K@.L@.XP M@.N@.14 'a TC V_ x| }[ }[ I1 I1 J1 I1 I1 }[ =< x| *< V3 I1 'a 'a 'a :k qg &< l8 -5 Zz q( Ml F1 4b GS HI q( H1 ^[ jm jm G1 q| @H 17 rp {C O@.]H F1 F1 F1 F1 v| }r P@.v| Q@.R@.S@.|= T@.U@.V@.Ac P_ W@.X@.Y@.Z@.`@.Wx e> 79 <] %{ <] 5e AU V_ V_ ][ Vu EF (j OR #..#.+#.@#.@/ ##.WB V~ Je l/ wm Rx 6G K0 $#.CB I1 =< V_ W_ W_ x| 'x og J@ W3 =< }[ %< 79 IM %#.hZ &#.*#.=#.-#.;#.Tn s4 >#.,#.]r ). | _ - ; ; ; ; ; ; - ] [ ] ; - _ ; {. {. ; , ' ' ; w _ :- '#.++ @+ R. 5@ q ", "7$ 7$ H =. |- )#.yv k+ w ; ; ; ; ' w X4 ; !#.~#.{#.z3 tC vy =< og H1 H1 jm H1 H1 F1 H1 }[ I1 yl r( *< wl %< W_ t= ]#.^#.cU /#.(#._#.^3 rg J2 *< =< w| [[ x| w| %6 l8 Is j} V_ Is &< W3 }[ V_ V_ =< =< l8 %< L1 :#.<#.[#.9k ou +* }1 >z H1 (j 57 47 U_ zx }#.Km pt /& &< nI (] ro 8f 7k iU #d %K MA 5@.J@.2x [b Xy EF $s jS LA 5j b} jm tC |#.=8 [I [[ p8 }[ [[ [[ J1 3r 1#.77 H2 q^ _) 'l bT Hi MQ #6 -s W3 jn #d 2#.2b 3#.4#.5#.BC 7P W_ W_ W_ W_ W_ }[ b% x/ b% }[ W_ j} j} V_ =< =< =< |7 %6 w| [[ k} V_ *< W3 w| tC |7 W3 r( j} V_ =< =< =< <[ <[ V_ x| l8 V3 }[ =< =< =< =< [[ l8 &< *< Hs ;< 6#.7#.5c e! 9E Lf 8#.t( Mg =e _R 9#.e! C= jT @A 0#.vN $V W_ I1 *< }[ }[ =< v| |y a#.b#.Ye c#.d#.x{ 5: e#.m- H/ Lg O2 f#.oR g#.w< |7 =< W_ j} Is J1 J1 'a l8 |7 V_ =< V3 vm !N h#.i#.ne /I qm j#.l3 Q| (1 0* Qk k#.S1 >+ - _ ; ; ; ^ ' ; ; - - ; - ' _ f 4 ]. ] : f , ' w - A& W* ++ @+ R. 5@ q ", "8l 4. G -, T% &U *U p. w ; ; ; ; ; 9@ '. P% l#.6a m#.n#.$< o#.l0 Qc +a 79 79 p#.0f /& 'E LA AC eD lT s8 q#.lf |7 J( I' r#.s#.nQ t#.Me u#.I/ v#.rp ([ p8 [[ [[ wl q( q( -5 J1 J1 -5 &< J( *< V_ =< }[ F1 jm /& w#.x#.pd Ea y#.Zy F1 'a H1 }[ =< V_ =< u| jm z#.OT A#.ry rm @H &< 'a TC B#.(@.I1 }[ ;5 km &< r( 14 r( tC p8 I1 *< }[ I1 T3 tC C#.Yv D#.u| [[ =< Lg 3/ q( E#.F#.oy |9 gj {E wu |L =f 8, SI KV W3 (j F1 G#.H#.I#.J#.jn M .i8 x| }[ }[ }[ }[ }[ b% 8W rf }[ W_ j} -5 }[ j} j} W_ [[ J1 um V3 <[ =< W_ V_ 'x J1 |7 U3 &< It V_ W3 <[ V_ V_ V_ *< }[ J1 T3 [[ *< W3 r( Is w| V3 ]A W_ 'a H1 F1 u| v| K@ K@ K@ K#.t| m} f} U_ U_ u| -s |[ og 0L %e r( }[ W_ }[ }[ W_ }[ =< V_ L#.17 rg rc M#.N#.>5 *j 4< x| PB Q3 55 I[ 4: 3t Uu r( }[ j} -5 I1 w| T3 um V_ }[ k} |7 O#.P#.>| 'o u` dQ Qs ,x 'a H1 vG W- Q#.R#.OK ~. , _ ; ; ' ; , !. - ^ ; ; ; ; - > { : : ]. q. ' , | - k+ S#.++ @+ R. =, d_ ", "C; k. y. -, T% uU vU 4D w ; ; ; ; | - j+ '$ T#.U#.Zw ;5 l} QP (c o^ i5 gS 11 )& VI V#.X- eU UO 2` W#.l} D@.(e $l <] )& !H X#.Y#.Z#.`#.2G ^1 |_ $V um I1 *< *< x| +6 O2 }[ J1 I1 }[ }[ *< *< [[ *< }[ u| ro Tt $..$.+$.bh @$..H H1 r( }[ }[ W_ W_ =< 'a xl qm #$.$$.%$.-< jn }[ j} 0L Is V_ }[ }[ x| }[ *< V_ r( }[ [[ I1 }[ W_ }[ V_ }[ I1 I1 V3 &< }[ [[ [[ +6 /j Ze 2= &$.r` l< dr <2 *$.yb qy 5: I~ JH }[ 47 }[ =$.-$.;$.-E -< v| =< }[ }[ }[ }[ }[ V_ W_ #6 =< k} W_ V_ }[ [[ 'x It V_ x| }[ V_ W3 J( W_ =< j} -5 j} =< W_ }[ V_ V_ ]A J( *< k} W_ W_ x| }[ }[ V_ <[ U3 &< It V_ W_ *< =< }[ H1 H1 F1 F1 F1 HI F1 4b Qs y| Qs yc YB ,x V3 }[ p8 'a Is -5 j} W_ *< W_ V_ x| [[ [[ G1 p+.,s s| >$.2f K1 q( 'a }[ k} J2 -j |2 ,$.f< '$.DW }[ V_ }[ }[ I1 p8 [[ }[ W_ W_ }[ {A )$.!$.e! 7d ~$.p+.ql o` |7 ${ h5 s) {$.># ] - , ' - ' , ] < ] - | ; ; ; - ] ] , ^ {. T ' , | - &% 6$ T+ Q. R. 5@ q ", "+ + y. ;% T% $R ]$.J# w - ^ , , w - ^$./$.~] gL rh ,s =< GV :e $s [b /] =j 6^ /& l3 yi ($.py 8f 9f [[ qR {[ l0 >z dP S~ e^ {1 _$.:$.<$.3F [$.}$.qh 0> >x %< }[ YG ;5 W_ [[ x| =< [[ w| [[ +6 |$.=< 1$.2$.pd 3$.4$.#6 H2 r( =< [[ [[ [[ =< }[ }[ W_ qR XT e} 5$.6$.7$.V[ M2 |7 V_ V_ U3 U3 W_ [[ [[ [[ [[ x| [[ =< *< =< =< V_ =< W_ -5 8$.9$.&! Yd -| u| %< 7M F4 0$. _ M[ Ir a$.;E b: &5 W3 #d Hd 62 9f G1 [[ _& gv b$.c~ Rv M .dD =< }[ }[ x| W_ }[ W_ }[ *< }[ x| V_ =< W3 ]A 'a Is V_ W_ *< =< &< H1 I1 [[ }[ H1 l8 [[ x| W_ W_ =< &< H1 wl [[ j} 'x j} W_ *< V_ }[ |7 r( j} V_ [[ V_ }[ =< =< [[ U3 U3 W_ =< X3 Is l8 M2 U3 V_ V_ V_ }[ b% x/ b% r( j} V_ x| I1 I1 'J ;X }a uy iT w| w| [[ J1 V_ [[ =< ;5 +B ;5 pg W_ :c 2[ f< 7+.r( }[ W_ ;5 +6 HU _[ }[ =< j} Is &< $6 c$.d$.Rq Nb Gn rm #x mu td Cy e$.f$.g$.h$.~ {. U , ' , ). M bg i$._ ' - ; ; ; - - | w 4 q. ' , w , E% lF T+ 7+ 8+ 9+ q ", "+ + y. ;% T% R0 j$.k$.- d d 7 7 ' .# l$.m$.n$.o$.4#.bV i8 YG l8 xl DW r( }[ }[ I1 p8 p8 xl xl p8 I1 *< <[ l8 p8 }[ <[ vm p$. S n= q^ 23 =f %w v- q$.r$./I Zv }[ I1 =< W_ j} j} }[ jm h} p8 +6 -k }[ M[ zZ Fi s$.t$.jn [[ [[ *< I1 I1 }[ *< }[ W_ r( su u$.v$.E+ w$.x$.&g Z- ln [[ V_ L2 Yv }[ V_ V_ }[ }[ }[ }[ }[ }[ V_ <[ <[ V_ W_ XB ;@.y$.-e z$.A$.jn 17 h8 hI R@.O' *< B$..H jm l8 r( V_ }[ &< &< *< e} lK ^N hW P& 1H p( C$.r( =< }[ W_ j} j} x| =< }[ *< }[ I1 }[ k} <[ 2Q |7 w| }[ *< }[ W_ j} It um x| M2 m8 %6 V_ 2r V_ x| W_ j} 'x um x| r( IE r( [[ *< }[ J1 V_ W3 W3 V_ V_ }[ }[ }[ }[ [[ U3 L2 }[ =< j} -5 &< CF q7 <[ V_ }[ }[ b% 8W b% }[ x| W_ }[ I1 I1 'J M} ;G uy iT I1 }[ *< J1 J1 }[ [[ ;5 +6 ;5 jm =< iq ^Y [& /& xl -5 X3 ;5 +B +B +6 j} [[ 2r -5 pn L2 w| D$.B` E$.UV 2Q 5_ 1Q ls Bz F$.G$.g$.P+ N I. 7 , ' f X u Y Z 9 ~. - _ , ; ; ; ; ' , : - | ' q. ho H$.T+ ^b 8+ 9+ q ", "+ + y. ;% T% R0 j$.I$.- v / ER T ' f+ |^ J$.K$.L$.M$.8M N$.HU q( um }[ }[ }[ }[ }[ }[ }[ Is TC I1 x| W_ U3 V3 V_ }[ W_ I1 ql u| HI q( Qc 43 SO O$.<= P$.Q$.wF #d H1 =< =< Is -5 V_ wl tC J1 [[ bV }[ R$.S$.T$.U$.bV V$.V_ W_ *< I1 p8 }[ *< }[ W_ Is W$.X$./[ v0 Y$.Z$.`$.75 rm w| }[ I1 I1 I1 }[ W_ =< W_ }[ }[ }[ *< k} ]A J( x| W_ X3 XB zS B= '* $l H1 H1 LS %.23 T[ %< J2 3/ H1 I1 }[ V_ }[ l8 I1 }[ U- .%.&q b( +%.9} y| 'a }[ [[ V_ W_ Is It V_ W_ }[ *< }[ }[ }[ *< V_ }[ }[ }[ }[ *< }[ W_ V_ V_ V_ ]A k8 %6 x| j} -5 j} x| *< [[ V_ TC V_ W3 J@ <[ V_ *< }[ }[ V_ W3 J( }[ =< W_ W_ }[ [[ V_ x| wl }[ k} x| }[ *< *< *< *< }[ }[ =< =< wb x| }[ [[ }[ }[ }[ x| *< i EF [[ [[ }[ *< k} x| tC T3 }[ [[ I1 [[ r( V_ K/ pt Lm n^ TC @%.#%.J1 }[ *< r( -5 V_ [[ J1 Yv j8 I1 $%.%%.NZ &%.Qa sp V3 AU 5e ds G$.*%.=%.e; ~ - ; | , ' ' d 0. f > : ; , ' ; ; ; ' - - - , 7 :O -%.S% T+ @+ 4@ 5@ q ", "+ + y. ;% T% ;, IR 5X > > d W q. ' fI ;%.>%.,%.'%.y< eX j} YG }[ [[ [[ =< j} 'x j} =< =< j} j} V_ =< r( r( }[ V_ Is &< |7 x| =< =< =< I1 J2 e} jm %{ d^ Lm |r )%.eC }[ }[ 7M v$.Q3 !%.~%.jm {%.Vn x| ]%.^%.mw uJ 0O /%.k} x| *< }[ [[ x| W_ *< [[ W3 +6 BC IE Yz 5e (%.m` W> c} w| }[ V_ V_ }[ U3 |[ Is j} x| }[ x| [[ w| 'a &< }[ W_ =< V_ @6 5#.K1 'a 3/ x| 6: _%.F4 w| I1 [[ =< =< =< [[ x| w| [[ [[ =< gl u6 #I I] Fu :%.$< hl I1 U3 L2 W_ j} j} V_ W_ }[ }[ *< *< *< }[ V_ k} V_ x| x| =< V_ k} x| x| [[ &< &< }[ [[ V3 &< V3 [[ V_ W_ x| V_ V_ W_ |7 |7 V_ *< }[ }[ [[ r( &< W3 &< 2r V_ =< ;5 so dD 'x [[ k} =< =< [[ V_ V_ *< =< =< H1 H1 }[ pn pn *< =< =< =< =< [[ }[ }[ x| [[ [[ [[ x| pn |[ }[ =< =< [[ 'J q( jn pn <%.[%.}%.|%.1%.P@.Yy k} =< |7 V3 V3 =< x| V3 wl w| 2%.3%.4%.5%.M$.|[ jm [[ b% U7 72 _4 ]: O z; S1 {. ' w , , ^ ^ - f ]. {. U , ' , , w ' ' ' , +@.6%.7%.{< u. 8%.9%.5@ d_ ", "+ + y. ;% T% 4{ 0%.a%.r. m] - !. : - E. b%.c%.d%.YP e%.Y3 w| [[ V_ }[ }[ W_ j} It j} x| }[ x| x| k} |7 H1 -5 j} V_ -5 pn U3 *< <[ <[ V_ =< V_ J1 J1 4j f%.xc X[ 4M Zv H1 }[ g%.A5 o; h%.i%.re [| Sm j%.k%.l%.m%.Ou -O EF }[ =< }[ W_ }[ j} V_ x| V_ |7 J@ C1 Lg jn *5 dS n%.5* rn I1 V_ =< V_ }[ U3 |[ -5 j} x| W_ j} 'a |7 'a It V_ W_ }[ x| [[ V_ -5 o%.p%.G` q%.r%.Zv u| =< [[ V_ }[ }[ *< }[ I1 }[ }[ k} x| jm $l s%.j] t%.;| Qs F1 Yv Yv *< [[ x| }[ }[ }[ }[ }[ }[ }[ }[ }[ *< [[ I1 j} V3 W3 <[ }[ I1 x| 2r og }[ =< |7 U3 W3 V_ W_ j} j} x| W_ V_ J1 V_ }[ *< }[ I1 x| j} r( L2 H1 og }[ =< ;5 +B *5 2r V_ V3 <[ <[ }[ J1 x| EF I1 q( cs lv G1 #H u%.lm u| u| F1 q( <[ =< =< 'a ,x ql um x| +6 AS 'a %< jn ,s v%.fl e] e0 w%.x%.y%. L w4 B@.z%.}7 jm |7 U3 W3 V_ Xy l} i} r| A%.B%.C%.D%.E%.=< I1 *< <[ gT }] F%.G%.> b q+ {. ' , - ; ; ; ' f q. {. G. , , 7 7 ; , ; ; ' , V H%.q& u. 3@ 4@ 5@ q ", "C; C; y. ;% T% I%.J%.K%.> - - , - ] t 7| _U L%.M%.N%.27 [[ wl }[ }[ }[ *< W_ V_ V_ }[ }[ }[ }[ k} DF to }[ V_ V_ V_ J( J( *< ]A J( x| W_ cN 'x Is H1 pg J@ Ko +a Qc v| }[ O%.P%.5b Ig BU Q%.R%.&q fN S%.T%.U%.V%.W%.5F jm =< }[ W_ j} -5 j} x| J1 }[ W_ *< =< ]H X%.Y%.Z%.[+.$l ^[ I1 =< }[ V_ *< W_ V_ V_ }[ W_ 'x og L2 <[ V_ V_ W_ W_ W_ W_ [[ J1 `%. &..&.+&.@&.Gd v| k} }[ [[ }[ }[ }[ }[ }[ }[ }[ }[ =< G1 H1 6G #&.tV ]..S_ H1 wl I1 }[ k} }[ }[ }[ }[ }[ }[ }[ V_ W_ W_ W_ x| j} -5 &< CF j8 x| V_ x| V_ }[ }[ W_ V_ *< *< *< W_ Is -5 }[ =< k} V_ }[ W_ W_ [[ [[ x| V_ *< *< I1 p8 }[ W_ [[ }[ }[ j} -5 V3 CF j8 W3 [[ x| k} q( CF gj w4 7f Zz $&.%&.i8 =< W_ L2 j8 W_ =< V_ -5 (@.w| [[ HE -5 p8 T3 w| }[ el y% c@.&&.*&.=&.-&.;&.dT k+.+* b} 'a x| W_ wl Is Is V_ X3 TC >&.oi ,&.'&.)&.}a H1 W3 J@ @{ F} !&.8x ; ] ' ' ' , | w | - ' , ' ' ' f ] M {. ' , ; ; | > z; k$.'#.$# ~&.{&.9+ q ", "0+ 0+ H =. 0' ]&.^&.W% , | | ^ = e /&.(&._&.:&.<&.)M w| }[ x| x| }[ *< }[ [[ x| W_ =< W_ x| }[ k} V3 |7 [[ W_ [[ w| H1 &< [[ &< &< }[ [[ J1 j} V_ MP J( &< Yy jm }[ H1 =< [&.}&.|&.1&.o; af 2&.3&.SM 4&.5&.6&.w& 7&.KH xB V_ =< [[ V3 &< V3 [[ }[ V_ [[ w| w| %< &< 1f 8&.OA 9&.u| ([ V_ =< W_ [[ [[ wl x| =< W_ V3 &< *5 }[ W_ W_ [[ j} Is j} wl I1 0&.a&.b&.c&.d&.fM hO IE +6 L2 =< W_ x| *< *< *< }[ }[ =< }[ }[ C$.1r e&.f&.g&.h&.u| T3 w| }[ [[ [[ [[ *< }[ }[ }[ W_ j} j} V_ x| V_ j} V3 ;5 &< r( =< k} W_ =< =< [[ k} k} V_ }[ [[ &< &< *< |7 V3 }[ =< j} -5 V3 <[ Is V_ [[ =< [[ x| x| *< [[ [[ =< |7 V3 <[ |7 }[ w| ,x /[ i&.@$.yk j&.k&.*& Y- ;< l&.m&.v5 `& I/ gl tg t$.Hs e^ J8 79 W_ -5 EF $l .B ub n&.uF o&.a` p&.q&.r&.s&.ST ~e t&.u&.v&.{8 l8 H1 [[ &< O2 c} w&.x&.y&._^ z&.MW Km xA %< }[ Yv ${ A&.k^ 9& .@ _ w , , | O P O | - ' , | , : { N ]. ' , ; ; ^ Q+ B&.C&.lF T+ D&.E&.5@ q ", "7$ 7$ H 8$ 0' F&.XZ g= = - - w d ,, G&.H&.pV 2@.VI p3 I&.p8 j} V_ x| *< }[ I1 }[ [[ }[ j} V_ x| }[ V_ k} }[ }[ }[ wl 'x 'a }[ j} It V_ |7 |7 =< =< <[ J( r( 'x um x| i k} ([ E1 ,s J&.K&.(j &5 _| L&.b^ E[ M&.K& N&.D/ ^[ yl x| =< |7 U3 W3 V_ }[ *< }[ I1 w| O&.wl y4 P&.Q&.vb >5 YB V_ }[ j} V_ x| I1 [[ }[ r( L2 pn -5 j} x| }[ W_ j} It j} l8 p8 lY R&.S&.=> ]o %< 'x IE +6 ;5 V_ 2r V_ x| }[ }[ }[ }[ }[ W_ V_ QA %E _+.T&.U&.V&.6^ ^[ o` [[ }[ &< }[ [[ }[ *< }[ W_ j} -5 }[ [[ x| W_ [[ Is It j} x| }[ [[ }[ ;5 *< [[ *< }[ I1 V_ W3 U3 *< V3 DF }[ =< j} -5 V3 Yv *5 r( [[ }[ V_ V_ }[ }[ }[ =< =< W3 -s F9 xB W&.>$.J1 X&.Y&.Z&.`&. *..*.+*.zc ^Y @*.#*.$*.cT n%.fc 'o |r %*.Q_ ^T Zm i 4b CB 4M n%.&*.**.hF =*.rM -*.:l ;*.gn t@.>*.,*.'*.)*.H| Y- =< }[ ;5 O2 !*.&R ~*.{*.k+.]*.^*./*.(c &x [[ J@.(*.'V _*.:*.V x ^ ; ; | O ^. O | ; ; ; ^ ; ] > : f ; ' ; ; w .@ <*.[*.W* T+ i1 6` =, j1 ", "j. C; d_ ;% T% ;, >, /* = - > , x x ,$ }*.|*.1*.LS |[ wl um TC j} x| *< }[ }[ J1 x| r( -5 j} x| }[ *< *< I1 }[ *< x| V_ }[ }[ V_ V_ V_ W3 U3 W_ k} [[ W_ *< V_ V_ x| W_ k} hO Y3 jn jn ,s &x Qs 4j wb -* 2j `y 2*.CN 3*.uf Xz H1 =< k} *< *< *< *< }[ }[ }[ }[ [[ x| p` 4*.5*.nL 2f KC V_ V_ -5 j} x| I1 x| j} -5 }[ W_ V_ V_ }[ }[ }[ x| V_ =< F1 w| ;H 6*.;+.7*.E1 17 V_ *< *< *< V_ -5 j} x| }[ *< *< *< }[ [[ V_ Is 8*.9*.w8 0*.a*.We 7E %< =< ;5 HU &< w| }[ *< }[ W_ V_ }[ V_ [[ W_ =< I1 wl V_ V_ }[ I1 [[ ;5 O2 ;5 =< *< }[ x| x| W_ }[ k} }[ }[ }[ k} W_ }[ x| <[ J@ <[ k} k} }[ }[ [[ }[ =< }[ *< *< *< wl b*.c*.d*.e*.+A .w 2@.f*.g*.h*.i*.j*.k*.l*.hc |@.J^ m*.n*.o*.$*.D[ p*.u/ ,l q*.FF nm r*.s*.eA =9 t*.u*.3T v*.0, a} w*.x*.y*.z*.A*.B*.C*.D*..l F1 =< *< S$ Kf j] E*.#N F*.G*.Nd Y/ }r wb 5e K< Ko 9u H*.< [ - ; ; ; w - ^ - ; ; ; ' - - - - ; - ' ; ; , q. x; &+ W* $# |. S. S. q ", "7$ H n .DS T% e_ I*.* = - - w 0j q+ J*.K*.L*.H| wb v| J1 V3 &< V3 =< W_ =< V_ }[ U3 L2 }[ V_ [[ *< }[ x| x| [[ V_ *< W_ =< =< W_ x| w| &< H1 I1 M2 pn Is V_ W_ W_ W_ }[ [[ <[ V3 *< [[ [[ [[ I1 'a H1 wl Qc M*.'A N*.O*.D/ f} G1 [[ V_ V_ V_ x| x| =< k} *< *< =< =< tg 3L P*.Y1 E9 }7 =< |7 V3 V3 =< }[ x| V_ j} V_ [[ W_ W_ }[ }[ }[ =< W_ =< v| }[ ,$.3..Q*.R*.&x G1 =< =< =< =< *< V3 V3 =< *< }[ }[ }[ k} <[ ]A j} YB SE pt s@.HF ;| S*.F1 =< *< @6 }[ [[ }[ *< }[ V_ =< W3 ]A &< 2r V_ M2 M2 x| =< }[ V_ U3 L2 *5 I1 [[ }[ x| Is Is j} =< }[ k} k} k} x| j} Is j} W_ W3 |7 V_ }[ U3 J( W_ b} }[ jn a .X_ }[ eM T*.U*.V*.W*.v& X*.Y*.Z*.x*.+e pN `*.11 m; 0V =..=.Gz +=.@=.#=.:: $=.%=.&=.EF q( Uu *=.P6 ==.Cd x+.Jo e^ -=.;=.$; xc QO >=.,=.jL '=.)=.!=.aQ &x w| V_ t8 a: ~=.{=.]=.iD Sr ^=.e^ E9 [[ &5 cF /=.B= (=.y@ , - , ; - | | | ; ; ; ; ; ' ' ' ' ^ w - , ; , H. 2 5+ q& u. Q. R. 5@ q ", "7$ H _=.:=.T% 1- @j <=.= - ; w [=.c. }=.|=.1=.UE %x pg #6 V3 U3 W3 V_ j} V3 |7 x| pn pn x| &< &< =< [[ I1 j} V3 |7 V_ k} }[ W_ j} Is wl Is It p8 M2 pn -5 j} }[ j} V_ x| V_ <[ Yv }[ V_ }[ }[ *< =< =< =< bV M .2=.3=.4=.aU KC K1 x| J1 }[ [[ I1 j} V3 |7 V_ k} =< W_ 5=.6=.7=.8=.e} v| X3 &< U3 W3 V_ }[ *< x| x| x| }[ }[ }[ }[ }[ }[ }[ W_ =< v| k} ;s 9=.Qh G/ jm I1 =< 'a G1 F1 :k j8 W3 V_ *< }[ I1 }[ k} <[ J( r( 'x um ,s 5c 0=.]y k8 q( j} r( [[ =< }[ }[ }[ }[ }[ V_ 8! J( &< It V_ pn pn x| [[ }[ [[ pn |[ wl %6 V3 k} [[ Is XB r( |7 V_ k} }[ *< x| Is It j} [[ k} V_ [[ W_ |[ ln dD FF 3/ [1 a=.J' b=.c=.| .d=.e=.@N f=.g=.`G h=.i=.2@.j=.X/ v$.k=.l=.m=.n=.bV 9M @d o=.kn >5 M .C$.j} [[ }[ l8 17 f} K1 SE u| u| ,x q( -s fl p#.p=.fc -z q=.r=.s=.TP f} w| V_ *R t=._ ,x ^[ 'E y4 X[ $-.Em K. {r a | | - ; ; ; ; ; ; ; ; ; ; - ` / J= ( _ - ^ , 7l %-.2@ ^b {&.9+ q ", "&-.*-.ep F# =-.+j a_ ^k w - - w ys }@ --.;-.&q 92 q% )J [[ Is V_ x| J1 j} V3 W3 W_ j} J1 T3 &< ;5 k} W_ V_ V_ }[ W3 *< V_ [[ x| V3 &< }[ W_ W_ W_ V_ [[ wl [[ V3 &< V3 [[ }[ V_ =< W_ x| }[ }[ }[ }[ V_ =< v| [[ >-.,-.'-.)-.!-.}y }[ k} *< W_ V_ Is V3 W3 *< V_ }[ *< eX Cg ~-.%* K&.-< V_ j} V_ [[ V3 W3 &< j} [[ k} V_ =< }[ G1 u| %< 4b E9 u9 n=.}[ XV {-.g%.17 =< *< J2 [1 :c Pn Oj b} um l8 W3 }[ Is 'a V3 }[ =< [[ J1 TC ]-.^-./-.(-._-.b% G1 Is k} [[ k} k} V_ k} *< }[ J1 J1 [[ W_ W_ V_ r( uJ 'a w| x| j} j} [[ &< &< }[ =< [[ [[ |7 W3 W_ V_ V_ V_ |7 W3 W_ [[ }[ }[ b} F1 c} :-.9* ]J cO <-.[-.q3 bk ._ m< }-.|-.]R 67 bO rm K1 SE &^ 6k 1-.2-.Fs DF xl s8 [[ =< =< =< =< k} V_ k} =< V_ V_ [[ x| =< =< W_ j} j} k} =< =< k} *5 *5 H1 F1 u| jn =< Qc =< *< x| x| i 6e H1 3-.4-.5-.6-.7-.8-.oy [y yc ZV XQ D5 9-.[ V ') y@ P r. | ; ; ; ; ; ; ; ; ; ; - ; d ') v _ - w - @# ## ++ 7Y Q^ 5@ q ", "0-.0-.;% F# =-.+j a_ ^k w ; d | [M ^. a-.|t b-.&g fl c-.H1 j} }[ w| x| W_ =< V_ 2r V_ wl I1 [[ [[ W_ j} r( W3 W_ V_ *< x| J1 r( L2 j8 *< V_ }[ *< }[ I1 I1 V_ |7 U3 W3 V_ }[ =< }[ j} V_ x| }[ }[ }[ W_ EF jn W3 d-.e-.9@.f-.< G-.H-.9W }[ V_ V_ }[ }[ }[ }[ }[ *< *< *< w| um um I-.6i J-.K-.qm jm =< W_ W_ W_ k} }[ x| X3 -5 <[ -s I1 [1 V+.L-.M-.&| N-.j3 O-.Wn E' P-.E#.rm =< I1 ff ;! }s Q-.R-.XQ -< x| *< #H 5I V6 dC ,V um I1 CB 2` :k b3 S-.T-.U-.0f H1 W_ J@ q7 CF CF CF L2 I1 x| x| x| x| }[ *< I1 w| *< ]A U3 x| V_ }[ wl V_ }[ }[ =< [[ [[ *< V_ Is g-.og J@ W3 }[ *< V_ [[ I1 hT E` &* V-.W-.e=.k-.X-.Y-.Z-.I1 /[ bO `-.n8 jd _[ I1 x| [[ J1 Qs pD wF {@.Vk 52 ;.+6 }[ =< <[ U3 &< -5 V_ W_ }[ J1 x| r( -5 j} x| W_ V_ }[ J1 [[ }[ W_ HE -5 V_ W_ YG Jt r( }[ }[ W_ j} -5 V_ V_ J1 m} .;.+;.@;.#;.$;.=f (@.37 lf jj Z} x+ u ' | ' - ^ - ; ; ; ; ; ; ; ; ; ; - = a }@ ^. - | | ' D# D3 ++ Q. R. 5@ q ", "-% *. H ;% T% 3+.0N ^k w _ 0. _ D% f %;.|t &;.*;.c-.f} [[ x| x| }[ *< *< [[ V3 &< V3 [[ }[ *< }[ W_ j} r( <[ |7 [[ x| =< V_ j} }[ W3 I1 [[ ;5 uJ DF J1 'x j} =< V_ V_ }[ J1 M2 L2 r( V_ x| k} Yv Yv x| Xy F1 HI `k +* 9f 3/ W_ W_ W_ }[ }[ }[ *< *< }[ }[ [[ _[ _[ r( =;.M{ -;.;;.a=.b} H1 V_ 'x j} [[ V_ *< V_ V_ *< v| xl >;.,;.%#.Be 1L Eg ';.);.!;.m` ~;.{;.K#.a .D$.];.'a $=.T; ^;.DA &< (@.'a rU VI /;.zl i8 _@.(;.;| aJ _;.:;.<;.[;.};.rf p+.wl %6 j8 2Q &< V3 |7 [[ V_ Is Is V_ V_ k} V_ w| w| H1 &< }[ =< [[ x| x| [[ w| _[ +6 *< [[ V3 V3 r( }[ <[ x| [[ x| W_ [[ wl 6P 3%.|;.1;.2;.u/ M1 )N 9W dk %< }[ wl %6 |7 PJ pn wl [[ x| [[ w| &x eC 3;.4;.50 n=.DW k} [[ }[ |7 r( j} V_ =< V_ }[ U3 Yv r( V_ x| }[ =< x| M2 |7 =< W_ J1 J1 V_ W_ *< YG k} =< =< x| V_ j} V_ [[ I1 5;.es u( 9| 6;.7;.8;.9;.)Y C#.KG V7 0;.R% ; , , , | ; ; - ' - ; ; ; ; ; ; | 1 }@ a;./. _ ' !. f 7l h1 ]b @+ R. 5@ q ", "4. 0+ G -, T% e_ %- k+ w ; ] , f+ f v} b;.-A y@.sJ q( #6 }[ }[ }[ }[ }[ V_ |7 U3 W3 V_ }[ }[ }[ }[ x| [[ k} [[ I1 j} V3 |7 [[ W_ V_ I1 w| ;5 +B &< I1 og r( [[ W_ }[ I1 J1 Yv U3 W_ [[ }[ k} Yv DF x| V3 9f c;.*L 4b d;.;5 [[ }[ }[ }[ }[ }[ }[ *< }[ I1 [[ +6 +6 }[ 77 .] e;.f;.g;.7f q( r( og 'a [[ }[ *< *< x| =< u| Is <2 #&.h;.i;.J' 9P +x j;.nr k;.:Z -= y> L@.Or I/ t< L@.l;.m;.n;.O8 ([ i} _e ,m => 04 o;.6* -j p;.Cc q;.r;.'&.s;.t;.S[ T3 wl l8 7G r[ U_ hl xl SE hl %e og }[ }[ <[ *< V_ wl 'x IE }[ [[ }[ j} V_ x| w| _[ +B *< [[ V3 U3 W3 V_ k} [[ I1 j} =< %< ql Mm cQ u;.v;.Rt oE IK _[ p3 4a DF x| x| 9W (@.Yv U3 I1 V_ }[ *< l} w;.xl tF x;.I' y;.%e 'a [[ J1 V_ =< }[ V_ V3 |7 }[ Yv M2 W_ [[ }[ k} }[ Yv j8 ;5 j} =< &< &< =< [[ x| x| x| *< }[ }[ [[ [[ W_ [[ I1 z;.A;.#g B;.l~ vc C;.D;.E;.(A 7= >| .E [@ $, 4- f - ; ; ' , : - ' ; ; ; ; ; | O ^. /. Z d ^ ' ). T2 cm ]b n2 S. =, d_ ", "C; C; y. ;% T% R0 I# :- w ; - w e+ , F;.G;.H;.I;.]$ 4a $V }[ }[ *< *< J1 }[ W_ W_ W_ W_ W_ =< V_ k} *< }[ *< x| j} -5 &< U3 *< k} *< I1 p8 w| }[ V_ V3 J@ <[ k} V_ w| w| [[ I1 I1 }[ k} *< k} x| x| x| F1 *W &V H9 J;.}[ =< }[ V_ W_ W_ W_ V_ W_ W_ [[ [[ [[ *< }[ }[ jn F4 l O;.P;.N4 ,< 32 QN K;.Q;.R;.S;.T;.62 .i H1 f} !_ o- GB U;.f5 V;.W;.X;.xM Y;.Z;.`A `;.d^ >.^8 .h v#.q: %x I1 V_ -5 pg o8 J@ *< W_ U3 W3 V_ x| V_ }[ J1 x| r( -5 j} x| w| }[ *< *< =< k} *< *< *< *< x| r( -5 V_ 17 dW .>.x( +>.@>.MP 7E u| jm #6 &6 }[ }[ W_ 2r TC r( x| }[ V_ V_ W_ X3 #>.0L Y;.$>.1& &{ F1 H1 [[ }[ }[ W_ j} -5 &< U3 }[ wl wl [[ *< }[ k} DF vm W_ -5 It V_ pn +6 *< [[ }[ }[ }[ }[ I1 w| I1 }[ =< [[ J1 ^3 %>.&>.*>.=>.->.Yw Ks LA Qs {[ |] ;>.&- >>.Kh f w ] ] , ] ] , ' ; ; ; ; ; ; w ~. _ d | , 7 i F. an T+ cp 8Y 5@ q ", "+ + y. ;% T% A) S^ ,>.w w ' w e= ; }R '>.)>.!>.~>.p` i V_ *< }[ J1 V_ U3 |[ Is V_ V_ 'x V3 W3 I1 V_ }[ *< x| V_ V_ }[ W_ *< V_ w| [[ w| w| =< l} |7 -j }7 >5 F1 jm xl }[ w| I1 L2 |7 [[ =< k} V_ [[ W&.{>.,$.]>.'a H1 =< }[ W_ j} j} V_ W_ V_ 'x Zz q( }[ =< [[ k} u| }a 1x ^>.e-./>.v| =< MP W_ =< ]A [[ l} [[ $< GS vl ,F mL (>.tf _>.:>.K&._T <>.[>.}>.|>.1>.n~ 8D 2>.3>.=A {l 4>.XV /{ {C pg xl MP g5 CZ ^B 5>.6>.7>.,e 8>.9>.0>.a>.b>.c>.d>.e>.f>.[| s4 T..g>.Z! h>.i>.j>.L2 x| 'a H1 r( [[ k} W_ [[ [[ U3 Yv j} V_ x| }[ [[ w| w| }[ V_ J1 J1 V_ }[ =< }[ I1 h8 aQ k>.AW l>.C/ L2 h8 hO J1 w| }[ V_ =< k} x| V_ j} V_ =< x| U3 U3 W_ *L m>.PB S& n>.o>.p>.J2 sm ]A =< }[ }[ V_ Is V3 W3 w| dD *5 *< [[ }[ k} V3 V3 [[ j} V_ [[ ;5 ;5 k} [[ }[ }[ }[ }[ w| H1 _[ +6 *< &< +6 >5 9$.Ng q>.r>.s>.f&.I..%K t>.2y [1 u>.v>.w>.x>.M ' : { ] S M ' , ; ; ; ; ; - | | ^ ^ - , ' G. eo *% ++ l..GR 9+ q ", "k. k. G ;% p] y>.F3 ho *+ d - w C% - z>.A>.B>.p! C>.@d V3 V3 k} J1 }[ <[ J( |[ -5 j} }[ og &< |[ wl [[ }[ *< [[ J1 V_ V3 V3 k} [[ }[ ;5 K2 v| u| p+.v| PJ vN H@.gf >z rf W_ <[ U3 A~ %x Qs Yz Y3 /[ 17 D>.E>.F>.wF /[ ([ =< }[ W_ j} -5 }[ W_ Is -5 ;G Hs =< V3 W3 }[ v| v= z8 G>.H>.n3 {%.-< 17 u| H2 fl K#.J2 H2 NR e} I>.J>.K>.L>.M>.{= N>.=* @' O>.P>.Q>.R>.S>.*..RB Ju T>.U>.V>.W>.3 .gj K#.%< [[ D1 X>.+=.Y>.Z>.`>.-z ,..,.+,.@,.#,.$,.%,.&,.*,.=,.92 4, 5$.-,.;,.>,.,,.',.=< p8 Is It Is x| W_ j} r( W3 J( U3 W3 x| [[ =< w| w| tC I1 wl w| %6 |7 k} x| 9W YH ),.o} p} xx d9 8f E9 (@.'x J1 *< }[ }[ }[ }[ }[ x| x| =< }[ r( Yv |[ K1 jn !,.~,.{,.Z_ wo ],.t$.&) IV TC Vu #6 J1 T3 w| w| T3 *5 _[ }[ [[ [[ [[ [[ [[ }[ x| }[ }[ [[ [[ }[ }[ *< x| x| I1 w| &< :[ :[ *< <[ +6 jG QA Hd ^,./,.(,.s{ _,.(c vI 2y Qa :,.l> <,.[,.T 9. _ f ] M {. ' , ; ; ; ; ; ; ; ; ; ; ; ' , f Ao D3 ++ l..GR 9+ q ", "4. 0+ }- 8$ T% F; 5{ g= ') e ; w 3+ - ew },.@E >a dl -< l8 DF I1 V_ W3 J( W3 x| V_ V_ <[ L2 &< -5 V_ x| *< k} x| r( -5 V3 U3 *< [[ YG km |,.O2 *< I1 r! 2` aA F` o} e^ ;8 `e Fz qd C} J@.%6 DF G1 0L um I&.1,.2,.3,.(j U_ V_ W_ W_ V_ }[ }[ =< I1 I1 4,.5,.y$.ln -s wl bs 6,.7,.8,.JP 9,.J! -s I1 T3 l8 j8 |: |: J( U3 Nu -@.0,.B5 9P a,.b,.c,.d,.e,.f,.g,.h,.i,.j,.fv b$.k,.N>.l,.m,.n,.o,.-| v| F1 -s 82 e] A+.p,.q,.r,.D5 s,.x} cd CR h3 sN 3s t,.u,.v,.w,.J/ 1[ ]4 QY x,.T< =* :e ,x [[ V_ J1 I1 x| 'x og L2 W3 W3 J@ M2 um J1 p8 I1 J1 T3 J1 }[ Yv L2 x| wl +F ;@.2f dK y,.XV m3 jJ z,.It V_ k} }[ V_ W_ W_ W_ V_ }[ }[ W_ j} -5 I1 *< Jt 14 A,.B,.C,.&> D,.E,.&x f} oo F,.8W xC I1 p8 w| p8 p8 I1 I1 p8 I1 I1 J1 }[ *< [[ }[ }[ }[ =< =< =< }[ [[ J1 w| I1 [[ *< *< *< *< [[ }[ BC G,.w5 H,.I,.J,.K,.L,.`k M,.][ +r N,.O,.[@ x H. 5 e - , ' ' ' , ; ; ; ; ; ; ; ; ; ; ; ' , f &% D3 ++ i1 HR 5@ q ", "k. k. H F# 0' e_ P,.Q,.'% X. | w 3+ ; ~b P= R,.p! S,.=s wl l8 }[ [[ YG &< r( [[ wl [[ W_ W3 r( j} V_ x| }[ w| |[ +6 r( }[ W3 W_ [[ q( -s vh e! T,.U,.^d V,.i< 3-.9, 8, Mg 2a W,.X,.F` vb Mg Y,.Z,.`,.K' '..'.]#.33 6+.5M +'.@'.}[ =< x| w| jm -< l8 #'.$'.y$.dD DF wl ;! T;.%'.&'.Aw *'.=z ='.jr dK t4 @g e;.Q*.-'.B' ;'.gK q( V6 -E >'.:> t> Zp ,'.''.)'.!'.~'.{'.'} ]'.>' ^'./'.('._'.:'.eM F1 G1 <'.aT ['.Lo B1 w-.}'.|'.%K 1'.2'. > F-.]c Bs 3'.4'.5'.6'.7'.8'.9'.nQ 0'.a'.K>.+l H2 J( W_ [[ }[ x| j} r( W3 j} r( W3 V3 f} +'.r| ,s f} b'.c'.}y }7 v| F1 4j m>.d'.3= Wk e'.f'.eX g'.v| pg }[ =< }[ W_ j} j} V_ W_ }[ }[ x| k} J1 Qs JH M1 1L h'.i'.7,.j'.!| DZ #i 6#.k'.l'.vm m'.n'.,R rF $%.o'.p'.ff _@.q'.gV ,s rm |$.*< =< [[ =< }[ H1 }[ =< 'a yc ,x wl }[ Vu l8 47 s( vF s9 r'.s'.e'.t'.u'.v'.w'.x'.y'.|[ pn F$.:{ :,.}! ] | d | ^ ' , , , ' ; ; ; ; ; ; ; ; ; ; ; , 7 M z( z'.2@ n2 S. 5@ q ", "k. k. H D; T% A'.B'.K%.q+ u 2 ' .# _ &D Qy f8 C'.Ho -< w| V_ *< x| 'a -5 j} x| I1 }[ V_ k} [[ x| *< }[ I1 T3 |[ pn }[ [[ =< k} ,x *L LX D'.E'.6n F'.^q G'.E{ H'.I'.J'.K'.L'.M'.u{ ;*.2@.'b Q&.6V QW N'.O'.aW 9P 9$.P'.aT %%.Q'.{[ dD Is l} eC zx eD R'.PT VQ dD F1 wl S'..>.T>.JS Ae T'.8-.!b U'.*g !{ ,+.]%.o-.$] V'.W'.X'.Y'.Z'.xK `'. )..).7u +).@).#).'e G .$).%).&).*).=).4y -).D$ ;).MQ *R G1 hT >).,).').)).~= !).`k ~).{).p8 bs ]).I} 1x c^ ^)./).().,[ ,N _).:).^P <).[).Xj I2 U3 *< V_ }[ }[ x| [[ =< j} %e G1 r( /& dQ Rj |y jN Hs {[ iU }).|).ZV :] $V eC 1). 4 a, 2).QA fU rI 3).'U H1 =< W_ j} -5 }[ =< }[ }[ =< H1 }[ K` 4).5).6)._n m_ 7).7).[; 8).$B #7 9).>] CR 0} RE Re 3= 0).a).b).c).d).e).!X eC eD nI }[ V_ V_ [[ }a +a W_ F9 *< f).g).{Y ~Y T_ p( -8 sF cD g8 :: *g h).i).li j).k).zk Ww +6 uJ 9> Oj l).qK ] : w ' ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; , 7 xU 8g 3| T+ @+ 4@ 5@ q ", "0+ 0+ }- D; T% 3+.y: u: d 2 ) 4 < , T{ Qy m).C'.Ho }7 [[ *< *< I1 wl V_ k} [[ [[ [[ }[ *< I1 I1 }[ I1 p8 T3 }[ }[ I1 [[ W_ V_ /[ n).{x o).p).q).=l v (n r).s). .t).u).v).w).x).y).N1 z).A).#w L;.B).C). #.-_ D).E).F).G).H).fU M .6O }[ >F n< A4 I).J)._T n8 %s p8 G` p*.4K K).L).#=.;).xI P$.WH /G s;.2U M).N).#q O).P).Q).R).S).99 v T).U).V).V).KO W).X).Y).Z).`). !..!.8| ]W < .Sm +!.@!.Is eC Km U&.#!.$!.Z' %!.&!.`,./>.*!.Wz =!.q^ 62 -!.ck ;!.^= 3j > >!.,!.fe '!.)!.^Z v| W_ =< W_ }[ }[ }[ }[ W_ =< 'a }[ l yB ym D*.!!.~!.=e f< {!.]!.^!..* [& 3t $7 m~ /!.fS iU (!.5, _!.:!.V6 h8 W_ }[ V_ }[ V_ W_ W_ W_ =< F1 }[ > WB lb du |!.1!.]) 2!.>K 3!.4!.5!.6!.5*.7!.8!.9!.0!.d-.a!.b!.l< 12 Ks c!.9f 'a 'a }[ K/ T7 V[ i7 @} d!.e!.f!.)Y g!.)H GZ h!.y,.S;.i!.j!.k!.l!.m!.n!.o!.p!.z0 kn rf o^ l q!.qK ] ] - | ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; , ' X H%.q& u. Q. 4@ 5@ q ", "k. k. }- D; T% 1- i! * B# x 4 x $- >+ &4 r!.s!. =.E= 67 V_ }[ k} [[ w| wl w| r( +6 ;5 [[ *< }[ }[ }[ }[ }[ }[ [[ [[ [[ }[ W_ V_ E9 aO /;.E[ t!.u!..X v!.jo w!.#).x!.y!.z!.A!.'c B!.C!.D!.L9 6).Uk &p E!.o4 F!.][ z= G!.H!.I!.ou CB J!.K!.L!.M!.N!.O!.P!.Q!.R!.CC D, H1 V#.bf K+./!.WM S!.3i T!.c] U!.6T V!.W!.X!.{0 Y!.Z!.`!. ~.1c .~.+~.%D @~.#~.$~.%~.&~.ae *~.=~.-~.;~.>~.,~.'~.)~.!~.=| l'.~~.'a ^x {~.Q2 ]~.^~./~.(~._~.:~.4m <~.[).34 [~.o+.*< }~.y= ;* {A ^8 XV |~.1~.2~.3~.^Z Yz L2 j} j} [[ }[ *< =< }[ F1 /& 4c Z..xw 4~.Y;.<#.5~.6~.7~.8~.5u Pg }i il 1' Hd 9~.2M 0~.23 4, 6~ a~.b~.S_ pJ _@.c~.-< }[ }[ Is 2r V_ =< jn }[ d~.N1 Cl e~.f~.Wa g~.h~.i~.j~.k~.l~.e1 p).m~.n~.o~.p~.q~.r~.s~.R=.oz tf JQ 6Q t~.u~.H' ~& v~.w~.x~.rf !A y~.z~.A~.:= Xj B~.7M C~.D~.ou E~.F~.G~.H~.I~.J~.K~.L~.M~.N~.O~.&5 HI lf E^ kt Wj P~.yU S ). w ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ' ' , , - :G Q~.++ @+ R. =, -, ", "R~.+ G 8$ T% 1- y: f= d : : !. ~ Y. S~._B T~.Qn c} &x AU J@.x| }[ J1 (@.I1 |[ km ;5 [[ }[ *< }[ }[ }[ }[ }[ }[ }[ }[ *< k} x| ,s o^ t4 U~.V~.W~.X~.Y~.Z~.`~. {..{.+{.@{.#{.${.%{.&{.*{.={.g$ sS ^T #i H/ xB ^[ {C RN -{.{a 9f rm |: ;{.>{.,{.'{.){.!{.9) ~{.&3 ln }[ Qa Su {{.]{.^{.@&.zw /{.({._{.=> :{.bN <{.6i c [{.}{.|{.DP C+ 1{.2{.3{.4{.5{.6{.7{.8{.9{.0{.a{.b{.@V c{.d{.e{.f{.s@.y+.hT gl Q_ JY $a g{.g{.h{.`!.i{.j{.k{.l{.gy m{.n{.o{.>m p{.q{.,a )J G7 r{.s{.Lj t{.u{.v{.I2 2Q -5 r( W3 k} V_ [[ }[ (j I/ c .%c w{.x{.y{.z{.A{.B{.C{.4C D{.U8 +w E{.F{.G{.H{.I{.J{.K{.2~ L{.M{.N{.*5 Qc aC ;H H9 wb 9f R3 6e &< Vu h8 *5 O{.P{.Q{.R{.S{.x,.T{.U{.V{.W{.X{.Y{.Z{.`{. ]..].+]./W @].#].$].%].&].=f ^x *].=].e2 f8 -].Sn Tt {1 Tn ;].>].,].'].zc `c {1 C' ]a )].P$.!].~].m( m~ {].R9 4t X,.U9 c} -< Is 'a %^ s! )_ LJ ]].< Z..8D m]./] G1 r( to Sw n].~0 ]8 q) o].p].q].r].u..s].t].u].UQ i5 v].f8 w].T-.x].y].z].A].B].C].;6 U!.D].E].F].G]./G H].I].'E J].K].e< _j c} ${ #B `E c^ 5I L].M].=*.N].O].P].:..Q].R].b] S].xF T].M[ T7 ls uq tq U].V].^#.W].X].H2 *< }[ U3 J( W_ J1 w| }[ #z ,` Y].Z].v'.`]. ^.%...^.%J +^.@^.#^.$^.nM %^.&^.*^.hm S-.K'.=^. Y L'.u@.-^.;^.>^.,^.MW '^.7* ]_ Wn )^.W_ I1 3/ 2` !^.~^.{^.]^.^^./^.(^._^.:^.<^.[^.}^.]! |^.1^.2^.m$ 3^.4^.(>.5^.6^.7^.8^.dQ :1 9^.0^.~*.O).a^.b^.c^.s/ *> d^.e^.f^.g^.3U h^.~e i^.j^.qM z! k^.Jl q- l^.b) F4 b} u| IK m^.'a (@.JH _1 72 G$.*%.t+ ]. ] ; ; _ ^ ; ; ; ; ; ; ; ; ; ; ; ' , ] M {. ). Z2 n^.-( @+ R. 5@ d_ ", "0+ 7$ j. -, T% 3+.0N ^k w ' ' w C% < o^.p^.;Q -| q^.r^.=< K< %6 p8 J1 j} <[ W3 wl V_ x| x| [[ &< _[ &< [[ [[ _[ _[ }[ =< j} -5 E1 Zv 'l 3[ s^.t^.u^.v^.w^.x^.y^.z^.A^.A^.B^.C^.D^.E^.F^.G^.H^.I^.J^.K^.5k h8 F1 L^.,< u4 |] YG fh M^.9{.N^.O^.P^.un fX A#.q< E+ HI H1 Q^.Cj =d R^.K' S^.6k T^.U^.V^.W^.[| P8 rv f< W& X^.Y^.Z^.`^. /../.+/.@/.#/.$/.DY Q2 %/.c5 A).~x Lm f w-.E1 &/.T'.s4 lf QV */.3h >M =/.-/.;/.>/.,/.'/.)/.x5 %5 !/.D0 o).~/.{/.]/.^/.//.(/._/.:o :/..[/.pD h} w| [[ &< &< }[ [[ [[ V_ 47 yb }/.|/.if 1/.7} 2T 2/.3/.4/.5O ;P 5/.6/.8=.sU !0 Rm {= 7/.@ z/.cd fn Su V8 N'.A/.LC B/.C/.N&.bS D/.8/.E/.F/.G/.H/.I/.>o Y_ =j $; CF :k F1 G1 =< ;5 &< w| p8 rf u< o3 [ .g$.3$ ] ] M M ' , ; ; ; ; ; ; ; ; ; ; ; ; !. : 4 z < J/.K/.$# 7+ 8+ 9+ q ", "L/.;% -, ;% T% #@.a_ p. w ; ; w C% ] M/.N/.e&.O/.hb P/.IE Yv }[ w| x| W_ [[ }[ wl I1 j} X3 [[ &< +6 ;5 [[ [[ +6 +6 j} [[ j} -5 7M i^ =f ZF Q/.R/.S/.T/.U/.Ew V/.S#.W/.X/.W* 7& 7& Y/.''.Z/.`/. (..(.+(.7G u| Hs @(.#(.$'.6J zx I( $(.%(.&(.*(.=(.-(.;(.>(.t{.9E el 4b D).#K ,(.i!.'(.B/ )(.!(.~(.3o {(.mZ ](.e{.3` D$ d< @p ^(._X /(.*+ xp ((.<]._(.:(.<(.[(.T~.XV =H 0L IV Zy 'a D' cQ }(._e |(.F).V@.8] 1(.Q%.2(.>/.>] w< =s 3(.f} wb Y- 9@.4(.5(.6(.>k K5 .k 7(.8(.9(.0(.a(.b(.p8 p8 }[ W_ 2r og }[ j} r( <[ 47 c(.r{.d(.D/.O8 e(.d$.f(.g(.g(.h(.i(.j(.r+.FF F9 'X k8 k(.l(.m(.n(.33 rU jT o(.p(.q(.^ .r(.s(.t(.u(.v(.{Z >x @=.~- ~e (/.xe j;.w(.x(.y(.vo 8=.3~.z(.A(.B(.r%.C(.D(.E(.)A F(.G(.H(.I(.J(.K(.l^.L(.Ho 9M 7E M2 Nx I/ 7: O[ %Z XM wG wG M(.wc N(.O(.5i ;E [1 [[ jn 3/ |[ |[ }[ =< =< }[ [[ x| x| &< lT `e @} F%.P(.8T x ] S S ' , ; ; ; ; ; ; ; ; ; ; ; ; - > { : a$ Q(.R(.2@ ^b 8+ 9+ [- ", "S(.T(.ep D; T% R0 I# :- w ' ' w e= | lJ U(.V(.V+.%< hl }[ x| [[ x| *< }[ k} <[ U3 &< It -5 J1 w| *< =< }[ [[ *< j} -5 V_ W_ }[ -< 3e W(.X(.Y(.m*.Z(.hm `(.$] _.._.+_.@_.#_.$_.$_.%_.&_.*_.fX nD =_.-_.sJ 0U -H ;_.>_.~2 c~.he *_ ,_.'_.)_.!_.~_.{_.]_.^_.Z>.<= 67 NR gN >f >9 Ec {! /_.{} (_.__.:_.:_.:m <_.8V P>.n$ [_.}_.jI b^.|_.1_.2_.3_.4_.5_.6_.7_.}5 8_.>! 9_.0_.a_.eX *< xM %} O=.b_.c_.D^ d_.g>.e_.!= f_.g_.aA o=.bO p$.Qs u| V3 5j h_.d! i_.&>.Xw j_.lb k_.l_.m_. > 'a G1 [[ W_ W_ V_ }[ x| 'x og J@ rU dQ r{.n_.o_.p_.r| vy O&.q_.qR zb x/ :e 'U u= r_.s_.b .I~ t_.u_.v_. l l& w_.{*.x_.dA y_.z_.A_.4,.B_.C_.e3 D_.E_.#!.G#.7h F_._| >.Ai o3 C0 +l u+.@} Ai G_.H_.E4 {> C5 *$.I_.J_._V ^,.K_.` .x8 Zy Zy K1 v| y| E..%x wb 7f 1] b: Y/ K/ ]_ =3 ih 'E q*.It G1 %< K2 L_.|[ }[ }[ =< }[ I1 V_ W3 J@ CA M_.m3 Qa Wb g$.6- r& a$ ] x - | ; ; ; ; ; ; ; ; ; ; ; - ; ] f - - &% N_.++ @+ 4@ 5@ [- ", "7` 68 -, -. ;. O_.f_ p. w - ] , D% , Zr P_.Sq %{ i} yl U3 pn Is V_ [[ *< V_ }[ W3 }[ 'a V3 V3 [[ [[ =< V_ *< [[ [[ V_ V_ =< =< F1 Hs 1f ^{.Q_.R_.S_.T_.2^ !~.U_.V_.W_.8] 7!.X_.Y_.U~.Z_.`_. :.1c 0m s,..:.+l +:.@:.#:.$:.d> Jp %:.&:.*:.)_.=:.-:.;:.>:.]J ,:.fs $V BS Pc mI q$.':.):.5).!:.~:.{:.]:.^:.U../:.2j =* Sn > E^ g8 -` (:._:.(2 ::.)/ <:.[:.}:.|:.1:.^[ ~Y g).2:.3:.w0 ^` .w v< i5 Ks M[ r-._[ _[ p#.4:.5:.e*.6:.u| w| [[ x| r( %< pJ 4b ;@ aQ gS 7:.8:.o*.9:.0:.%^ 3/ :k &< j} V_ W_ =< W_ j} r( V3 hT y+.a:.b:.c:.z-.d:.e,.e:.f:.g:.h:.i:.j:.k:.RB l:.m:.n:.o:.p:.5S -R >f Oj q:.r:.s:.P_ ,z &e t:.u:.uc v:.Lo cz ]f w:.5>.x:.uZ gn !!.y:.z:.#V bt 92 #=.E,.XQ |7 A:.B:.C:.D:.E:.F:.^=.G:.H:.I:..> E= gl =< X3 It %e pg H1 F1 v| v| v| }7 m^.}7 J2 gl %< hl I1 =< *< }[ }[ =< =< }[ }[ }[ V_ W3 k8 d;.t9 R| (1 Wb O$ 0. J:.9 4+ M ' , ; ; ; ; ; ; ; ; ; ; ; ; ; - - = e &~ Gl u. Q. R. =, -, ", "C; C; H -. K:.L:.y: p. w - f !. S* q. M:.N:.iq b% o` I1 M2 |[ -5 r( O:.=< w| J1 V_ k} W3 U3 <[ V_ V_ <[ <[ k} V_ I1 [[ ;5 ;5 W_ V_ wb 7f F4 Oo W'.P:.Q:.rI R:.S:._$.~a I^ T:.U:.V:.W].T-.En 5Z W:.X:.V#.p'.2y 5c H>.c{.-,.Y:.y> Z:.`:. <..<.+<.@<.#<.$<.x= %<.=9 X,.hP &<.VQ dr *<.QC Xb =<.-<.;<.><.'y vI _@.bO h8 -< f} ^[ yl J/ @a {!.Qn W= 0*.,<.#].'<.)<.p8 y| 5V !<.*5 ~<.f< ^E %} m< {<.]<.:c <] 3/ /j w-.dQ k, ^<.u9 /<.V_ x| *< x| w| w| J1 'a %< (<._<.[O xo d{.p) F1 *< U3 &< 'x V_ W_ }[ }[ [[ W_ }[ 6+.:<.<<.6t [<.}<.2p |<.1<.#].2<.~- Va 3<.Ly 4<.o).5<.2;.,&.Wa 6<.7<.N,.8<.9<.0<.a<.84 S;.b<.<= c<.JS d<.aS e<.f<.g<.':.h<.DZ i<./).j<.k<.l<.HS m<.~#.n<.V~ $y o<.p<.q<._y r<.s<.t<.u<.v<.w<.x<.C= *< }[ j} 'x J1 [[ =< [[ [[ [[ =< =< k} =< W_ U3 |7 J1 V_ V_ x| wl x| V_ }[ }[ }[ *< V_ l8 DF :E eW Fz y<.z<.A<.`+ v[ x M {. ' , ; ; ; ^ , , ; ; ; ; ; ; ; ; , = e &~ -} u. @+ R. 5@ q ", "0+ 0+ C-.D; 0' 3+.DH ^k w ; - !. i+ ) B<.C<.x= %6 um J1 x| W_ }[ uJ +B *< w| um V_ *< V_ *< *< *< V_ ]A J( x| V_ }[ [[ +B +B }[ W_ x| x| h].D<.E<.*r km F<.Hs rl 0f #) G<.pm fU KH |y b0 =| H<.I<.J<.K<.n=.c'.ih 84 L<.id 6_ M<.N<.O<.P<.&(.Q<.R<.dZ S<.-E T<.M@.Y*.U<.V<.Zv eP W<.X<.;! ^u Y<.Z<.`<.p$.p+.I2 L .,U Pi Qs ^[ dk l8 jT V3 Oj [.#&..[.(= +[.@[.4b )J m8 #[.7M $[.+A h{.UL %[.&[.*[.90 HI V3 55 57 ;< t4 B5 SE *R j} x| *< I1 p8 wl um p8 ^[ h} =[.td vp -[.K/ jn x| I1 x| }[ V_ W_ *< *< k} W3 J@ >5 ;[.( .>[.,[.]#.ME 1s '[.>< ';.LR 'e )[.,H ![.FW (l `R 22 MC X<.;).>| ~[.{[.][.^[./[.Z[ ([._[.:[.<[.6!.[[.}[.;^ y! aF a*.T!.|[.1[.al ^^.&b q).2[.d7 T! 3[.W-.4[.w).5[.6[.s<.7[.h{ 8[.9[.dr a, yB Hs dD =< V_ [[ *< *< I1 I1 }[ *< }[ x| x| V_ *< x| j} -5 j} |7 DF V3 k} *< *< *< *< I1 J1 }[ }[ lT Fz 0[.a[.b[.xp ,. 3+ ' ' ' w ' | ^ , ' , ^ ' ; ; ; ; ; , ; ' ; C3 .j ++ Q. 4@ 5@ y. ", "*. *. H ;% T% +j a_ ^k w ^ ; ]r }M ws 3s c[.d[.4j Is }[ =< [[ w| H1 &< V_ M2 M2 }[ V_ k} k} V_ }[ [[ &< &< }[ =< }[ w| H1 &< x| j} j} V_ e[.VI JQ Ki f[.g[.K2 jm ^[ K1 J2 p+.Y3 t8 p+.@| lN t< h[.i[.j[.(] |] ]o ,l ,H pd e5 k[.l[.m[.n[.o[.-i p[.q[.E[ r[.s[.zX {k .a n=.!& t[.<_.Q_.'W sj ~0 u[.Pi w| [[ W3 <[ V_ V_ [[ x| M2 -s 5< h8 'U 5i v[.w[.T[ KC ([ F9 x[.y[.W&.z[.A[.B[.C[.kK D[.E[.F[._] AR W_ <[ (j Ph q< -H SE *R j} x| *< }[ I1 p8 wl w| wl iT H2 Ko G[.H[.Hd v| [[ w| |[ pn *< [[ }[ }[ V_ x| M2 G1 i u6 I[.}8 y+.G/ )_ [1 }1 H/ W> m, Y- ;< J[.Z&.yB Vt K[.L[.(l ,| q^ zm M[.B' qh v- -+.N[.O[.P[.Q[.A: R[.E .S[.T[.U[.V[.W[.S^.X[.%5 Y[.Z[.`[.nX }.,p .}.l` xM #7 :&.+}.j:.4P @}.#}.i7 2_ PT $}.UQ jm *< uJ ;5 [[ W_ [[ V_ }[ *< }[ }[ }[ V_ V_ W_ V_ j} L2 U3 |7 }[ V_ I1 w| [[ }[ x| [[ V_ V_ b} 5j %}.&}.zf *+ *}.x , , f - , , = =}.(. 2 9 _ | ' ' ; ; - e a _ C3 6$ ++ @+ kC 8Y y. ", "4. 0+ G -, T% 1- a_ ^k w ; _ w fI -}./P #g *$.BS w| x| *< }[ I1 w| w| [[ pn pn x| [[ }[ k} V_ }[ W_ 2r og }[ [[ V_ I1 w| w| x| j} -5 x| (j MQ .P ;}.J2 sm @6 Is (@.x| x| wl 'x U_ l8 >}.+q Q[ $w 3..,}.7} ^Y )V `k '}.AY )}.!}.b,.~}.{}.6L ]}.Ql Z< ^}.w]./}.a^.(}.x3 _}.:}.<}.[}.}}.aT |}.~x I} t| wl V_ V_ V_ }[ *< V_ x| pn pn W_ F1 UT F` 1}.2}.3}.,s %6 4}.5}.6}.7}.8}.9}.0}.a}.b}.c}.6~ v&.+r v| V_ X3 (j Ph ]x d!.K1 hO V_ }[ }[ }[ }[ I1 }[ }[ J1 w| ,s L2 mL d}.e}.v| [[ w| |[ +6 }[ w| }[ *< }[ J1 [[ }[ wb u6 >< 1s Oc xg J@.H1 G1 q( 7G 5< 67 %< 6F f}.pi T~ g}.h}.d< 92 i}.j}.k}.T[ l}.'> GX m}.{P n}.o}.)K p}.q}.7U .>.r}.s}.eX yc t}.jn ME mL L-.o} 9L p3 )J %6 b} 79 ;< 1f dK _ 3%.%{ u}.v}.M;.tp gf jm YG +6 &< V_ j} <[ W3 V_ k} }[ }[ }[ }[ }[ }[ x| [[ L2 pn V_ k} }[ w| H1 &< W_ j} r( W3 V3 *L dW w}.u= <* x}.M. a$ - - > _ x Em y}.z}.A}.X B}.C}.Y. _ - - - ; e a ; C3 6$ ++ @+ S. i. C; ", "C; C; y. -, T% 1- a_ ^k w - f -# G. D}.-9 X .7@.E1 J1 [[ *< *< }[ }[ }[ x| Is -5 V_ wl J1 x| [[ W_ W_ V_ }[ J1 x| x| [[ x| }[ x| V_ }[ x| (j Ph .P @0 GS pg Is XB -5 <[ 2Q W_ J1 y| k8 y@.gs Y- e< /*.o4 E}.F}.$b `..G}.H}.I}.J}.K}.q} L}.DQ 'h M}.N}.O}.P}.Q}.^>.kD R}.S}.;: >B T}.U}.:<.K>.DU I} V}.to wl w| J1 V_ *< }[ =< Is -5 V_ H1 >z I| W}.X}.M/ 7E Y}.)$.Z}.`}. |..|.+|.@|.#|.$|..M 8D -H [[ hO It V_ (j Ph ]x d!.F1 ,x V_ =< W_ W_ =< x| x| k} V_ [[ =s }[ n%. a Z1 v| [[ [[ }[ }[ I1 [[ =< W_ x| }[ [[ }[ #6 |] vC ,$.nv o+.p8 Zz dD H1 &< F9 E..^[ `e ~D 91 l, %} FX %|.&|.}S *|.=|.-|.;|.F` PH >|.,|.'|.%=.)|.3!.*/ !|.~|.{|.,U jn hO &<.u| LR }8 K/ H1 [[ Qs ]|.f} v| K1 I1 *L :e 5j jS T3 b'.q: {= &! ^|.SE V_ I1 I1 9W -5 ;5 J( *< V_ }[ }[ }[ }[ }[ }[ [[ V_ j} -5 -5 V_ }[ [[ +6 +6 *< 'x IE J@ |7 um l} eC y4 1_ /|.< a$ - - - *+ e < (|._|.:|.<|.[|.}|.||._ ] - | | | ' ; C3 6$ ++ Q. S. 5@ y. ", "+ + y. ;% T% 1- y: p. w , | 1 1|.2|.3|.4|.w< J&._[ }[ x| [[ I1 }[ *< W_ j} j} V_ x| |7 J@ &< j} V_ W_ [[ x| U3 pn Is j} W_ k} W_ =< }[ bO C- Mv 5|.%s jm [[ j} V_ *< *< *< [[ 17 'a 6|.7|.8|.9|.rN 0|.a|.b|.@l E_.c|.d|.e|.f|.g|.h|.i|.j|.k|.]{.l|.m|.n|.L%.o|.p|.q|.>H V6 r|.s|.E$.t|.u|.v|.Y( 4b %e TC l8 l8 I1 V_ }[ W_ j} j} =< }[ W_ B4 w|.S!..q Xz x|.m8 y|.z|.A|.B|.C|.D|.E|.F|.G|.l- H|.jm )Y It V_ (j Ph ]x a=.F1 ^[ x| }[ -5 V_ }[ Is j} $< W_ I|.J|.j} y- K|.({ m^.=< W_ =< l} [[ U3 |[ -5 j} x| I1 Zz EF n^ +A X/ 'U %< V_ V_ k} =< =< }[ ,x YH [1 [& M{ Z& ym z! L|.M|.l%.N|.O|.P|.Q|.R|.{@.S|.T|.U|.V|.W|.6t X|.Y|.L{ +q ,s v| 2r 2f =< |L Z|.[1 h8 l8 um T3 J1 }[ Yv rn ^[ Qs p$.ql o` :E 4e 9#.Jp W- 3/ [[ [[ x| V_ j} V3 W3 *< V_ }[ }[ }[ x| x| =< YG so -5 It j} V_ *< =< ;5 ;5 =< j} r( L2 x| H1 14 UT j^ I< ~S [ [ d = _ -# ); `|. 1..1..1.+1.@1.#1.MK _ - | O 8q $, | - C3 6$ ++ 7+ 8+ 9+ q ", "+ + y. ;% T% $1.%1.7%.X 7 >+ &1.*1.:S =1.-1.L} ;1.:[ }[ 2r Is wl wl }[ }[ W_ x| W_ j} V_ MP j} (@.V_ x| V_ }[ U3 |[ -5 j} x| }[ }[ *< [[ _@.C- >1.e9 .i q( =< x| =< V3 V3 k} [[ g} -5 yB s4 3e ,1.'1.)1.>K n<.;}.!1.~1.{1.8<.]1.t) jY ^1.q[.hX /1.(1._1.*g :1.<1.[1.}1.|1.11.&> 21.31.1] 41.2h mH K1 Nu TC V3 L2 I1 V_ }[ *< x| x| }[ [[ q( oE 51. #.61.w| 71.81.91.01.a1.b1.c1.d1.e1.f1. ( HE K2 I1 Is j} }[ (j g1.T:.;}.%< G1 j} It YH J1 I1 H1 V3 W3 }[ h1.i1.V3 j1.XK k1.v| V_ j} <[ W3 V3 M2 |[ -5 V_ x| J1 hO 24 E+ l1.nk 0f 3/ =< x| x| }[ W_ V_ Zz TC aQ 5c K' hI 2.,2.'2.)2.!2.b1.~2.{2.]2.{A hb xl }[ [[ }[ I1 _@.^2./2.(2.I2 _2.HE XB um wl J1 J1 x| 2r ;@.:2.p+.wl <2..}. ( rn (@.TC ;5 j8 m8 V3 W_ V_ [[ }[ [[ 'a }a Y- s4 ~1 i7 F9 =< }[ k} k} *< [[ r( V_ [1 5c .B [2.V_ M| 'E :e yb }2.EY |2.12.-[ 22.32.42.KV d* 52.}D 62.72.82. r m8 92.wl &x J1 02.&* j^ v| =< x| }[ W_ =< x| }[ x| 'x IE J@ L2 x| K` qp gn /& Ml U3 I1 V_ }[ }[ *< =< [[ [[ }[ *< wl Is -5 L2 <[ IE a2.+6 *< w| J1 J1 I1 I1 }[ *< *< k} W_ r( YG ZV p) !&.p/ < ] _ ' ; I$.b2.c2.d2.e2.f2.g2.h2.i2.f7 e ; ^ ,, Yr wU ;~ X j2.n^.f. k2.{&.9+ q ", "+ C; y. -, T% dm l2.m2.^$. % .@ 5p |> n2.[$.o2.p2.q2.IE }[ l8 H1 }[ [[ V_ V_ k} }[ =< &< V3 [[ 'y %x 'y p8 L#.um yl %6 x| =< }[ }[ [[ &< +6 7G 39 Rh )%.HI H1 =< }[ V_ <[ <[ k} U3 .i W_ T..r2.xJ v5 T'.s2.t2.u2.v2.'}.w2.x2.w4 y2.G, !W z2.w( A2.B2.Q;.#2.C2.D2.E2.W[ e+.F2.G2.H2.I2.J2.fU K2.LW Wy 5< ;5 k} [[ j} -5 j} x| x| x| Is 'x (@.BS L2.M2.N2.7@.g} O2.P2.Q2.R2.S2.T2.U2.V2.W2.X2.U3 +F x| =< *< [[ p8 _@.aC =x Y2.Z2.{3 `2. 3..3.+3.og @3.#3.$3.%3.&3.*3.=3.-3.:Z ;3.>3.,3.H1 :2.W$.I1 x| j} Is j} =< W_ rn &5 '3.)3.RC #d H1 =< k} Yv DF I1 [[ H1 I1 fh {|.T..X- wl j(.p+.9D I7 !3.~3.@;.{3.]3.^3.H].@f {3 sJ I< t! 7s /3.(3._3.y| E9 J1 E1 (@.s@.i<.|_ }[ V_ V_ W_ }[ Is V_ k} W_ j} r( L2 x| yl b% T..r2.^X .( j8 }[ V_ }[ *< [[ &< +6 ;5 =< *< x| V_ j} V3 wl um og *5 *< U3 Yv p8 um J1 x| =< x| wl to Yv x| 79 :3.F%./|.] ; ^ w , <3.[3.}3.|3.13.13.23.33.43.G; / ; ^ 9 ,d m* ]. - 4D 53.*~ 63.73.9+ q ", "y. + j. =. T% e_ f_ '. a. e V +t aq 83.93.-e '$.}y 2r k} %6 %6 }[ k} *< |7 }[ V_ V_ W3 -s vm *j *j %x rn p8 tC 'y l8 }[ V_ *< V_ [[ &< AS Xz K..Rh )%.F1 H1 =< }[ }[ V_ V_ V_ J( .i x| 03.g#.mI b .ah a3.b3.`f &Q c3.d3.e3.V, f3.4t D=.g3.-M h3.g< `) i3.|-.U:..%.j3.=f F..r5 k3.r#.l3.*Z wJ m3.mH pg =< x| W_ j} It V_ *< fq k} 'a %e Is &x 8W n3.e-.Z( ,s o3.p3.q3.r3.s3.t3.u3.v3.w3.x3.$6 -5 =< *< V_ T3 p8 +'.1:.y3.;d z3.i} A3.B3.C3.D3.E3.F3.G3.H3.I3.I3.J3.K3.L3.M3.N3.O3.P3.Yv dD It k} wb V_ -5 r( [[ W_ pg ^A |1 m].g8 >z H1 =< =< to DF p8 J1 :E tC Q3.R3.[v =8 4< tC w| pg J@ VI .P E~.S3.R9 9^.Z! fl Xz xl :E T3.U3.V3.~E f< p+.U_ J1 p+.-5 W3.X3.Y3.!& H1 'a =< j} It j} x| }[ x| [[ k} [[ Qs }[ Z3.%B `3..( j8 *< V_ }[ *< w| &< _[ &< [[ }[ *< x| W_ [[ I1 Is IE HE }[ U3 Yv I1 :E %6 }[ j} 'x p8 H1 q( W_ W- c% F%. 4.; , ^ 9. q. .4.+4.@4.#4.$4.%4.&4.*4.=4.G; e d ' - x f f ; !S -4.T+ ;4.E&.5@ 68 ", "C; y. -, 8$ 0' R0 >4.:- | > z; E* ,4.'4.)4.!4.]o ,x V_ [[ I1 I1 x| *< V3 to H1 It V_ wl I1 tC uy sC to )J to I1 I1 p8 um [[ k} I1 I1 wl I1 pJ c).4: ;| .i q( =< *< *< }[ V_ V_ W_ F1 wl .B p! I].E, &! a, e#.!g {A ~4.{4.]4.gt ^4./4.(4._4.:4.<4.[4.EW />.^2.=> }4.|4.6|.14.G2.C*.3..F-.V9 a!.Mu 3f v| =< W_ W_ W_ V_ [[ YG L1 HE :E rn wl E1 l} >[.e-._j h} 24.SC 34.44.54.64.74.84.94.+@.x| V_ x| J1 p8 wl p8 _e #'.5Z 04.a4.b4.c4.d4.e4.f4.g4.h4.i4.h4.j4.h4.i4.j4.k4.l4.m4.n4.o4.p4.(@.J1 =< =< V3 L2 <[ [[ k} Zz hP 01 ^V ZE !z jm [[ I1 wl p8 p8 w| yl tC LS q4.T..d> o8 yl V_ }[ *< hP }a h_.q< >o ;o r4.Xz yl [[ V3 q: p= n^ i^ }a l8 DF wl ^[ um E/ +x {E ',.=5 H1 [[ j} -5 j} W_ =< *< *< *< =< HI J@ s4.I' 1[ j>.J( *< w| w| w| }[ [[ I1 w| I1 }[ *< *< =< x| j} L1 %&.Jt *< x| I1 I1 rn M2 x| j} TC TC TC %e *< t4.dt u4.8x ; ; , 7 x; v4.w4.x4.y4.$4.%4.z4.A4.B4.f7 / / d _ e d , ; !S -4.++ n2 kC S. q ", "q q C4.*-.D4.Y* E4.:- w - ~ F4.C( t> G4.7} :e TC X3 [[ I&.*L w| X3 [[ wl og HE k} [[ J1 I1 H4.qR wl uo l8 8$.wl I4.U3 |7 M2 #[.m8 jm Is h} '* O[ 03 .i q( [[ V_ }[ k} <[ <[ W_ SE i8 9P +A l kv Gd E` Nx J4.De K4.L4./` M4.N4.O4.hL H#.-A 5.,5.'5.)5.!5.)5.)5.~5.{5.]5.^5./5.(5._5.:5.<5.*5 [5.}5.L2 *< =< k} lm WT <& 9P -| )V yl V3 _[ q( 'y %x DF ~Y (@.1$.{!.|5.15.25.TC ][ $< &6 J( 35.pJ &g $C @} 'y %6 T3 J1 |7 -j K@ y| :E ]A ;5 'a wl 'a Is m3 pi 45.55.65.H1 wb ^@.75.85.cN V_ V_ V_ w| w| HI j8 95.}#.43 J2 W3 W_ |[ |[ }[ [[ [[ [[ [[ }[ }[ *< x| I1 w| }[ Z3 05.r8 Xy l} X3 V_ l8 #x /A bs F1 AS L1 IE k} mB t< a5.b5.]. '% c5.d5._G e5.f5.g5.h5.z4.i5.j5.k5.l5.m5.') ') n5.o5.Z. | w !. p5.q5.T+ Q. R. =, d_ ", "r5.r5.s5.t5.u5.$R v5.w5.x5.d v E. y5.z5.A5.B5.dW C5.D5.E5.F5.G5.4j I4.m8 V3 7P 14 V_ [[ V_ I1 I1 xl i} c'.H5.I5.J5.K5.L5.M5.N5.O5.%< q( og C..`Q +i e> rp H1 x| V3 k} V_ <[ 2Q W3 K1 P5.Q5.ZH R5.S5.T5.U5.V5.W5.X5.Y5.Z5.`5. 6..6.+6.@6. ! hg ro .d k, #6.$6.mv %6.I( k} 5#.&6.*6.=6.-6.L_.sf ;6.RE Yv v| QA hO j} >6.j} :E %6 W3 V3 'a 'x [y ,6.5~.'6.s! )6.P#.55 H1 G1 !6.~6.{6.]6.-5 J1 x| j} Is tC jm pg m8 kn ^6./6.(6._6.:6.<6.[6.}6.|6.16.26.36.46.56.66.76.86.96.06.a6.b6.c6.d6.e6.f6.g6.h6.9M Yv $6 }[ <[ D1 &3 ,` 7} }-.i6.bL )Y Nu ln m8 *j (A ,x j6.2).k6.l6.m6.n6.o6.E5.p6.q6./%.T_ xl f3 r6.-_ O&.w| p8 um V3 U3 }[ Vu {T m0 {3 K1 3/ F1 H1 ja |r s6.;!.!F NR t6.u6.vI v6.w6.x6.y6.z6.O&.'a F1 J( A6._%.jN }[ [[ }[ +6 |[ }[ [[ }[ *< *< }[ }[ }[ =< =< wl Yz {J /<.B6.C6.D6.E6.E6.F6.y6.G6.H6..i HU I6.J6.V_ 1$.Z1 #< K6.e= X. L6.M6.Xr N6.O6.P6.Q6.&4.R6.j5.A4.S6.`2 y}.v; T6.U6.V6.}@ Up GN W6.X6.T+ 3@ Q^ 5@ q ", "Y6.Z6.`6. 7..7.+7.o* @7.#7.9 _ XJ .o $7.$@.%7.&7.*7.=7./j d} -7.;7.>7.,7.jd 14 V_ wl }[ x| [[ HE DW %x :E yl pg '7.TC )7.V4 !7.~7.)Y )J o8 +; <& {7.RE Yz ^[ |7 U3 *< V_ V_ W_ U3 r[ B,..> 0A +r 4b )Y 27 F1 m8 )J fl B$.HU !$.]7.vy iB xA xc -< _j t4 ^7./7.hf r6.l^.q*.yc 9f /& CB 0O L1 D[.S@.vb 4e %s kn rp (A OF ][ o8 -j W_ V3 DF l8 y| 8W (7._7.Or :7.<7.[7.C#.rf Z3 N2 }7.|7.!Y p8 wl -5 YH p8 17.XB um 27.37.47.57.67.77.87.97.07.a7.b7.07.97.c7.c7.d7.e7.d7.f7.g7.b6.h7.i7.j7.k7.l7.m7.n7.o7.9W wl l8 vm GS tJ p7.q7.s` r7.bL iT OF x| to uy H4.([ s7.t7.3,.u7.v7.4b 7G p` #H w7.PB 2f TC x7.JQ T[ Qs w| p8 p8 J1 wl Is Is m8 [~.7G |$.y7.C1 qg z7.yJ A7.B7.C7.o%.D7.E7.E7.F7.G7.um H7./A %E Jt Yy *< D` RC 39 'U r( og 'a I1 I1 w| wl x| [[ V_ J1 I1 lT .h q7 U$ =5 I7.J7.X3 (@.TC TC r@.J6.K7.2P L1 L1 L7.'7.V_ M7.on a: N7.< ; , : < O7.P7.Q7.R7.S7.T7.13.U7.V7.W7.X7.Y7.Z7.f' `7.f $- a@ 8..8.$# ^b {&.9+ y. ", "+8.@8.#8.D; $8.%8.&8.*8.=8.-8.{ T* ;8.>8.,8.'8.)8.!8.~8.{8.]8.^8./8.(8._8.:8.<8.YG W3 j8 y=.sC [8.}8.|8.18.28.38.48.58.68.78.88.98.08.a8.Tv r'.>f b8.c8.E..^[ I1 V3 W_ =< =< V_ KV t$.d8.e8.f8.g8.h8.i8.j8.k8.l8.l8.m8.n8.o8.p8.q8.r8.s8.Ll t8.u8.v8.9@.w8.yg x8.f% `; f).YB xl ,x dD y8.z8.A8.B8.C8.D8.E8.F8.L2 PJ ^A L#.G8.v6.H8.I8.J8.K8.L8.M8.N8.O8.P8.Q8.to ~7.v}.Vb R8.R8.S8.T8.5_ ~z um J1 j} ;5 F( U8.V8.W8.X8.Y8.^5.Z8.`8. 9..9.+9.@9.#9.$9.%9.&9.*9.=9.-9.;9.>9.,9.'9.)9.!9.~9.{9.]9.^9./9.(9._9.K7.TC yl 4b Dy pz u7.:9.<9.[9.}9.|9.19.29.q#.39.49.7E 59.69.79.89.99.09.a9.b9.c9.d9.e9.f9.g9.h9.(4 H1 w| [[ [[ qn T3 PB 6O sm i9.j9.k9.l9.m9.xy n9.o9.p9.q9.r9.s9.t9.u9.v9.w9.x9.y9.z9.A9.B9.Vv C9.C$.%z D9.03.Zd H1 3/ I1 :E 'y 'y w| V_ W3 |7 x| 9_.E9.F9.G9.H9.I9.J9.K9.L9.M9.N9.O9.P9.Q9.R9.S9.T9.J4.U9.!J Xy fh k1.,| V9.-} 5Y W9.X9.Y9.Z9.`9. 0..0.+0.S7.$4.@0.#0.$0.%0.&0.*0.=0.-0.;0.>0.,0.'0.)0.i9 3@ sW 8Y y. ", "!0.~0.{0.]0.^0./0.(0._0.:0.<0.[0.}0.|0.10.20.30.40.50.60.70.80.90.00.a0.b0.c0.*< o%.K2 .H q( d0.e0.f0.g0.h0.i0.j0.k0.l0.m0.n0.o0.p0.q0.r0.s0.sJ t0.u0._T v0.b'.hO #A H1 3/ 3/ I1 6e w0.x0.y0.z0.A0.B0.C0.D0.E0.F0.G0.H0.I0.70.J0.K0.L0.M0.N0.O0.xp J8 P0.Q0.ow u= dr 5, ^|.R0.hO H1 #A _2.S0.T0.U0.V0.W0.X0.Y0.D@ Z0.`0.K1 a..a.+a.@a.#a.$a.%a.&a.*a.=a.!&.u}.-a.~z ;a.>a.,a.'a.)a.!a.~a.%x c'.~Y q( CA g-.{a.]a.^a./a.'5.`8.(a._a.:a.b.,b.'b.)b.!b.~b.{b.]b.^b./b.(b._b.:b.c.,c.'c.)c.!c.~c.Gb.{c.]c.Zb.^c./c.(c._c.:c.d.,d.'d.)d.!d.~d.{d.]d.^d./d.(d._d.:d.4_ |$.AS 'a M2 qg @6 | Kd.Ld.Md.Nd.Od.Pd.Qd.Rd.Sd.Td.Ud.Vd.Wd.Xd.Yd.Zd.`d. e..e.+e.@e.#e.$e.%e.&e.*e.=e.-e.i. *-.+ ", ";e.>e.,e.'e.)e.c1.U2.!e.~e.{e.]e.^e./e.(e._e.:e.f.,f.'f.)f.!f.~f.T2.g.,g.'g.$4.Bf.)g.!g.~g.+0.9b.S7.9b.S7.z4.23.Zf.j5.z4.Bf.{g.]g.^g./g.68 -, k. ", "(g.pb._g.:g.h.,h.'h.)h.!h.[e.qe.~h.{h.]h.^h./h.(h..h.he.xe._h.:h.Ng.i.,i.'i.)i.!i.9b.~i.{i.]i.^i./i.(i._i.:i. Hu bi.ci.di.ei.fi.gi.hi.ii.ji.'g.z4.ki.li.mi.ni.oi.pi.qi.ri.si.ti.ui.vi.&4.13.wi.xi.yi.zi.Ai.Bi.Ci.Di.Ei.Fi.Gi.Hi.Ii._i.Ji.Ki.Li.Bf.Mi.Mi.Ni.Ni.Oi.ed.Pi.Qi.Ri.Bd.Si.Ti.Ui.Vi.Wi.y. Xi.k. ", "Yi.Zi.`i. j..j.+j.@j.#j.$j.%j.Zh.Mc.&j.*j.=j.-j.;j.>j.,j.'j.)j.!j.~j.{j.mh. h.]j.^j./j.(j._j.!h.:j.mh.k.,k.'k.)k.!k.~k.{k.]k.^k./k.(k._k.:k.l.,l.z4.'l.)l.!l.~l.{l.]l.^l./l.(l._l.:l.m.,m.'m.)m.!m.~m.{m.]m.^m./m.(m.|g._m.:m.n.,n.'n.)n.!n.~n.{n.re.T2.]n.^n./n.(n._n.:n.o.,o.'o.)o.!o.23.~o.{o.]o.^o./o.(o._o.:o.p.te.,p.'p.)p.!p.~p.{p.]p.^p./p.(p._p.:p.q.,q.'q.)q.!q.~q.{q.]q.^q.qe./q.`e.(q._q.:q.l.23.Bf.ki.$r.%r.&r.*r.=r.-r..r.;r.>r.,r.'r.)r.!r.~r.{r.]r.^r.S7./r.(r._r.:r.s.,s.'s.)s.!s.~s.{s.]s.^s.(p./s.(s.@s._s.sp.:s.rm.up.t.,t.'t.)t.!t.~t.{t.tg.]t.^t.[o.vq.xq./t.(t._t.:t.Bq.Zf.Zf.~i.}i.u.,u.pg.te.'u.)u.!u.ot.=u.~u.{u.dt.]u.^u./u.(u._u.:u.v.,v.'v.)v.!v.~v..i.og.~2.{v.]v.^v./v.(v.nu.%s._v.:v.w.,w.'w.)w.!w.~w.{w.]w.^w./w.(w.{u.&n.1t._w.mp.Jq.:w.x.,x.'x.}w.2w.&n.pt.vq.)x.!x.~x.%s.^p.:w.{x.]x.^x./x.(x.og.pg.eg._x.:x.r.$y.%y.&y.nw.vq.et.*y.=y.-y.(u.;y.pp.Br.^p.op.>y.,y.>r.'y.)y.!y.~y.{y.]y.^y./y.An.(y._y.:y.z.,z.'z.Bq.Zf.Zf.rf.1x.2x.)z.xq.!z.pt./u.~u.1t.~u.1t.~z.!p.et.{z.]z.7x.^z./z.(z.+0._z.:z.A.,A.'A.-y.>y.;r.:w.*u.6y.)A.sp.!A.Eb.Fm.te.~A.{A.]A.^A.mv.(s./A.Mp.;y.(A.(u.~u.ev.uv._A.:A.B.=r.Zq.Yq.=t.PA.,B.'B.)B.13.Tq.!B.~B.{B.]B.^B./B.(B._B.:B.:B.:B.:B.C.,C.'C.%p.@r.)C.!C.Nz.CB.~C.{C.]C.^C./C.(C._C.;v.:C.D.. C; y. ,D.'D.)D.=l. o.Tq.Td.pz.!D.T(.68 y. + + + + + + + + + + + + + ", "~D.+ jB.fr.{D.!w.!w.`j.]D.^D./D.iB.C; + + + + C; (D._D.:D.C.AD.BD.np.CD.DD.oD.ED.[e.FD.GD.HD.ID.JD.qs.KD.LD.MD.ND.OD.Yj.:e.E.,E.~u.'E.7y.F.,F.'F./A.)F.!F.~F.ED.vr.FD.{F.]F.^F./F.(F.KD._F.:F.z._t.:t.Bq.Zf.Zf.rf.1x.$B.FC.}E.>C.BF.1E.Zq.CF./s.1t.(u.Tr.(u.pt.DF.EF.FF.Bf.Zf.+0.GF.HF.IF.JF.#t.(u.#t.KF.LF.MF.NF.rf.9b. o.OF.PF.QF.RF.Mi.9b.Zf.Zf.+0.SF.`f.+0.9b.Mi.+0.S7.z4.Cf.yf.$4.z4.&4.Af.TF.UF.VF.0+ y. + C; WF.XF.wE.Al.Li.;l.Ni.YF.ZF.Jt.68 y. + + + + + + + + + + + + + ", "`F. G..G.Mt.EE.,u.!w.`j.]D.wz.xo. 7.C; + + + + C; q _=.+G.@G.#G.$G.%G.&G.b1.[h.2D.wB.xB.yB.5x.1t.Tr.Tr.-w.^p.(A.*G.1u.(A.=G.+z.-G.;G.>G.nj.,G.EB.'G.)G.!G.gt.5D.(s.$y./s.~G.{G.]G.^G.)t./G.+n.>p.(G.{j.4j._G.:G.H.JF.%F.(u.#t.Sr.,H.'H.)H.Bf.!H.9x.~H.{H.vi. g.Bf.Bf.]H.^H. g.Ad.Ad.Ad.Ad.:i.23./H.(H._H.:H.I.,I.'I.)I.!I.~I.{I.]I.^I./I.(I._I.ln.Kk.:I.J.,J.'J.Sz.)J.!J.~J.{J.[h.vr.te.]J.^J./J.$z.(J.!p.Mp.;y._J.:J.iw.:s.rm.Qj.K.,K.'K.)K.!K.68 br.C; j. -% ~K.{K.]K.^K.OF.Si./K.qz.a+ i. Pv.68 + + + + + + + + + + + + ", "(K._K.0H.tz.Nt.:K.L.,L.rs._C.'L.)L.!L.~L.{L.;E.z.cL.Lq.6t.cL.dL.eL.yq.7t.*t.fL.gL.hL.iL.jL.kL.x6.lL.mL.nL.oL.pL.*-.0r.C; j. |r.qL.rL.sL.tL. o.Si./K.uL.ep S(.*-.d_ + + + + + + + + + + + + ", "B.FL.Yx.{d.GL.HL.IL.JL.KL.pH.rC.Zq.:w.LL.ML.NL.OL.=k.rm.!w.PL.QL.RL.vC.ay.SL.et.~p.$z.NJ.'E.DF.TL.=w.UL.VL.WL.XL._I.:h.Mr.YL.:y.9G.zK.ZL.`L./A.Yq.}v.|u. M.|y.>p.Qj.;A..M.wD.+M.@M.,r.Tr.Tr.Tr.dt./u./u.dt.Tr.dt.=t.#M.PH.$M.%M./t.&M.LK.Nz.ED.c1.*M.=M.-M.;M.>M.qs.eF.,M.'M.)M.!M.~M.{M.E.iM.jM.=t.Yq.N.Nz.,N.'N.)N.Dr.NA./A.Mp.!N.~N.{N.]N.8j.^N.;A./N.(N./s._N.Iq.Yq.[o.&n.7v.!E.*u.-w.^u.0y.:N.O.wq.,O./t.'O.)O.{o y| w| V_ Xy !O.{[ ~O.{O.#R cr.C; j. ]O.^O.)D. l.Qi.9b.~o./O.(O.S(.[r.j. + + + + + + + + + + + + + ", "j1 }- YM.fr.Nt._O.:O.tg.+N.wz.8l Ut.*-.j. + k. 7$ 4. k. 0+ @N.#N.r.Tr.5D.,r.dt.(u.{u.&n.{u.-N.az.;N.(e.Ng.>N.|O.1O.eK.2O.3O.{u./A.op.4O.5O.6O.7O.xg.Wb..F.8O.9O.-N.=t.OA.@s.Yq.(u.1t.1t.4D.dt.9v.sM.0O.aO.bO.{J.[h.vr.Mr.YL.:y.]u. r.nv.cO.5x.op.@C._s.sp.dO.eO.Fm. F.fO.gO.hO.iO.jO.ev.-w.*u.~u./u./u.(u.1t.ev.=H.8z.kO.lO.mO.=r.nO.cN.dN.gp.wr.;p.oO.pO.qO.rO.sO.ly.tO.uO.vO.wO.xO.!h.yO.zO.AO.BO.CO.uJ.DO.EO.FO.GO.HO.IO.JO.KO.LO.MO.NO.OO.PO.QO.RO.SO.vB.TO.3A.UO.VO.WO.XO.aJ.ps.YO.ZO.`O. P.mC.ln.!w.Kk.QG..P.+P.@P.CF.et.2t.#P.$P.TG.NA.uC.4D.P._t.:t.Bq.Zf.Zf.rf.IJ.,P.'P.uv.xq.)P.&w.[I.Rr.-y.1t.(u./u.dt.!P.7y.~P.@O.Bf.Zf.rf.{P.]P.^P.@z.1t.Tr.dt.(u.!z./P.(P._P.z4.Tq.:P.r.(u.Tr.,r.et.[o.1u.1u./A.lP.kM.mP.nP. i.xe.oP.pP.JL.qP.rP.~u.!p.op.sP.tP.6O.7O.@i.dg.uP.vP.wP.xP.Ux.@z.Ux.&u.^u.Tr.$y.qF.dt.lx.yP.zP.xD.AP.BP.up.Fm.te.CP.DP.9G.Q.,Q.'Q.)Q.!Q.~Q.{Q.Zw.XB.]Q.^Q./Q.(Q.ly.ly._Q.:Q.z._t.:t.Bq.Zf.Zf.rf.$H.8l.7Q.Rr.xq.7z.7z.AF.^u.^u.1t.(u.(u.*u.3t.uC.-H.@O.Bf.Zf.rf.8Q.9Q.0Q.aQ.ev.Tr.(u./u.>z.bQ.cQ.dQ.S7.Li.Cq.eQ.fQ.@s.!z. C. B.Br.^p.op.&u.wq.xq.gQ.]u.hQ.iQ.o#.f} T3 tC DF |$ jQ.kQ.lQ.mQ.d_ C; y. nQ.oQ.pQ. l.aP.9b.~o.qQ.rQ.q n .d_ + C; + j. j. + j. + + + + + + ", "AE.BE.CE.DE.Nt.!w.!w.`j.]D.wz.sQ.tQ.#R G + + C; y. uQ.vQ.wQ.xQ.yQ.zQ.AQ.&G.b1.[h.ge.PI.BQ.@p.(s.>r.&n.ev.5D.;y.1I.5D.pt.-w.CQ.@H.DQ.2A.PG.>N.Nz.,N.'N.)G.!G.~u.!p.R.,R.'R.)R.!R.~R.{R.xk. h.#m.]R.^R./R.(R._R.:R.l.Oi.Oi.FR.GR.HR.IR.{p.np.#y._A.tM.JR.CF.]p.,O.Iz.KR.LR.($.Qs AU _].MR.NR.DF OR.PR.QR.68 C; y. RR.Jv.SR.^K.S7.+0.Ni.TR.UR.VR.d_ j. + + C; ep ep y. + + C; + + + + ", "`F.WR..G.Mt.Nt.kB.!w.`j.]D.^D.xx.E&.#R G + + C; cr.XR.YR.ZR.`R. S..S.+S.&G.b1.[h.ge.@S.%w.*N./A.:w.Zq.pp.!p.{u._u.-w./p.,r.#S.@H.$S.%S.Qj.>N.cK.1O.&S.*S.|J.:w._p.S.Ze.,S.'S.jO.)S.NJ.!S.}u._p.,r..s.T.($.,T.'T.)T.!T.~T.{T.]T.^T./T.68 + y. 0+ (T._T.tL.Mi.xl.S7.=l.:T.U.,U.'U.)U.ED.[h.Fb.OS.!U.4D.z._t.:t.IJ.Zf.Zf.rf.$H.$B.Jq.it.-y.:U.*w.%B.]u.^u.1t.~u.ev.gt.vq.bI.H.JF.#t.Tr.(u.*u.1U.]S.2U.3U.4U.Zf.-l.aP.5U.6U.7U.8U.~x.op.CF.%B.-y.^p.NA.9U.lp.0U.aU.bU.m^.J2 cU.dU.eU.fU.gU.hU.Jt.68 + + ;% iU.jU.kU.rE.lU.mU.nU.oU.pU.-% -% *. L/.n .wo.qU.*. }- 0+ j. + + + + ", "rU.br.vL.tz.Nt.Mr.!w.`j.vz.wz.sU.N.oD.BU.CU.DU.bp.6x.Mp.Mp.EU.FU.GU.HU.IU.JU.KU.LU.3G.MU.NU.OU.PU.QU.dT.RU.SU.TU.UU.VU.WU.XU.YU.Wb.hs.Pt.-A.te.ZU.`U. V.@H.PC..V.+V.TL.bI.[S.sp.!A.gr.Fm.te.@V.#V.$V.ds.gt.~u.-w.-w.Zq.1t.~u.-w.-w.1t.*y.1U.=T.%V.&V.-y.*V.=V.-V.uw.;V.>V.,V.'V.)V.!V.~V.{V.]V.aJ.0M.uS.^V./V.(V.he.ak._V.:V.y.8z.ds.GV.HV.!H.Zf.Ni.Mi.IV.JV.KV.LV.MV.[z.NV.OV.PV.QV.RV.SV.TV.UV.VV.WV.XV.YV.ZV.`V. W..W.+W.@W.iB.Xt.+ j1 #W.$W.xE.Si.%W.~o.Ji.&W.*W.=W.k. |r.-W.1T.;W.>W.,W.'W.q C; y. + + + ", "or.br.vL.Mt.Nt.:K.:K.`j.)W.!W.~W.{W.C; C; + + + C; R~.C; tU.]W.^W./W.6K.LE.Se.N.|W. y.1W.2W.3W.uv.1I.HB.7T.4W.5W.6W.!c.7W.VA.rm.8W.9W.0W.aW.bW.cW.dW.eW.fW.gW.hW.iW.jW.kW.X.,X.'X.)X.(u.>r.!X.~X.&P.pR.{X.vF.up.TO.]X.^X./X.8z.yM.Gr.!z.zq.:t.AV.S7.Zf.rf.$H.8l.:o.uv.)S.(X.zF.Ur.^u._X.~z.Tx.-w.gt.CF.bI.4L.:X.Bf.+0.rf.cE.B.LX.HB.HB.[u.QI.MX.NX.)t.!t.-A.Vo.rD.OX.PX.6O.QX.RX.SX.TX.UX.VX.WX.vB.tG.uV.lB.lB.uV.-A.hs.Y.$t.,Y.'Y.)Y.!Y.~Y.ss.{Y.]Y.^Y./Y.(Y.XB.^N.Cj.tk._Y.:Y.x.7Y.8Y.9Y.0Y.4R.aY.bY.cY.dY.eY.fY.gY.hY.iY.jY.Qj.[h.vB.]L.!U.1t.CF.(u.nM.kY.lY.,X.4S.hx.mY.Tr.2w.2w.nY.oY.pY.qY.Zx.8q.rY.5I.sY.tY.&w. B.uM.uY.:t.vY.+0.~i.rf.$H.wY.,z.jO.7z.&Y.xY..r.]u.-y.~z.*u.~z.~z.Rr.bI.4L.xR.23.&4.Zf.yY.zY.AY.BY. C./s.dt.CF.*u.*u.gt.>z.CY.DY.EY.jI.13.FY.GY.HY.=l.IY.cE.JY.KY.LY.MY.NY.OY.PY.QY./i.RY.SY.&4.S7.TY.}3.UY.VY.WY.XY.H C; y. 0+ 7$ YY.ZY.~o.S7.Mi.~o.`Y. Z..Z.+Z.@Z.@Z.#Z.$Z.%Z.&Z.*Z.=Z.C; + + + ", "mr.0r.vL.-Z.;Z.Wb.:K.>Z.,Z.!W.'Z.{W.C; C; + + + + d_ -. )Z.!Z.~Z.{Z.]Z.^Z./Z.(Z._Z.:Z.`.,`.'`.)`.!`.~`.[e.{`.Jk.]`.^`./`.(`._`.:`.<`.[`.df.(W.TO.[e.}`.|`.1`.2`.3`.}q.4`.5`.6`.7`.8`.9`.0`.a`.b`.c`.d`.TI.UA.d1.e`.f`.g`.h`.TZ.i`.j`.k`.l`.m`.n`.o`.1Z.p`.q`.r`.s`.t`.u`.Zx.|e.v`.w`.x`.GZ.y`.SZ.z`.A`.B`.C`.rf.rf.rf.D`.E`.F`.G`.H`.I`.J`.K`.L`.SZ.lZ.1Z.mZ.lZ.M`.N`.O`.P`.aP.Q`.Mi.R`.S`.T`.U`.V`.1Z.lZ.W`.X`.X`.3Z.Y`.Z`.``. +. ++ +il.$4.z4.9b.9b.}i.#T.@ +# +$ +% +& +* +'g.Cf.il.,g.&4.$4.= +- +; +> +, +D; 4. C; q H G ' +) +! +~ ++0.9b.Ud.%W.7o.{ +-l.io.] +PF.%W.^ +/ +=Z.C; + + + ", "iB.C; ( +_ +: +< +6G.[ +} +| +RR..+,.+'.+).+!.+~.+{.+].+b1.U2.8W.^.+/.+(.+_.+:.+<.+[.+}.+|.+ik.1.+i7.2.+3.+4.+5.+6.+7.+8.+#m.[h.[h.[h.++,++G.+'++)++!++=.+~++W +{++]++^++/++(++_++:++Bf.Bf.z4.Bf.~i.~i.<++^r.13.'g.'g.'g.9E.[++}++|++1++2++3++4++5++-, 7$ C; q d_ j. 6++7++8++9++DI.0++Mi.~i.~i.~i.Zf.Mi.23.9b.~o.a++/ +b++k. + + + ", "iB.C; c++d++e++f++g++h++i++j++k++&-.C; + C; + + y. C; C-.l++m++n++o++p++q++r++s++t++u++v++w++x++y++z++A++B++C++D++E++F++G++H++I++J++K++L++M++N++O++P++Q++R++S++T++U++V++W++X++Y++Z++`++ @+.@++@+@@+!c.Kk.|g.d1.Wb.ug.Zh.#@+$@+%@+&@+*@+=@+-@+;@+mg.>@+,@+'@+)@+!@+~@+{@+]@+^@+/@+(@+_@+:@+<@+[@+}@+|@+1@+2@+3@+4@+5@+6@+7@+8@+9@+0@+a@+b@+c@+d@+e@+f@+g@+x*.h@+{!.i@+j@+k@+l@+m@+n@+o@+p@+q@+VV.r@+s@+t@+u@+v@+w@+!5.}6.x@+y@+z@+A@+B@+C@+D@+ug./m.5j.E@+E@+F@+~2.G@+H@+I@+J@+K@+L@+M@+N@+O@+N@+P@+Q@+R@+S@+T@+U@+V@+W@+X@+Y@+Z@+`@+zO. #+.#++#+@#+r@+##+$#+%#+&#+*#+45.=#+-#+;#+>#+,#+'#+)#+!#+~#+{#+]#+^#+/#+(#+_#+:#+<#+[#+}#+|#+1#+2#+Za.3#+4#+5#+6#+7#+8#+KE 9#+0#+a#+b#+c#+d#+e#+e#+f#+g#+h#+i#+j#+k#+l#+m#+n#+o#+p#+q#+r#+s#+t#+7Q u#+a@+v#+7@+w#+x#+y#+z#+A#+B#+C#+D#+E#+F#+G#+H#+I#+J#+I#+wl.wl.K#+L#+M#+N#+O#+P#+Q#+R#+S#+T#+U#+V#+=. C; C; y. j. H 7P.W#+X#+Y#+Z#+`#+!i.9b.9b.+0.%W. $+Ki.9b.Li..$++$+b++C; + + + ", ";% }- @$+#$+$$+%$+&$+*$+=$+-$+[T.q + + + + + C; d_ D; @N.;$+>$+,$+'$+)$+!$+~$+{$+]$+Rb ^$+/$+($+(j _$+Q3 Yv M7.mB h} :$+<$+GS [$+}$+|$+1$+2$+3$+4$+5$+N#.6$+ S el 65.u9 o+.X5.DB $(.7$+8$+9$+0$+a$+b$+c$+d$+e$+f$+g$+h$+i$+j$+b].k$+l$+m$+n$+o$+p$+q$+r$+s$+t$+V@+u$+Mm t# t$.t$.-< v$+w$+x$+y$+z$+A$+B$+C$+D$+E$+F$+eX 6+.:>.G$++'.H$+(j I$+J$+=j Al [).K$+L$+M$+N$+O$+P$+Q$+R$+S$+T$+9M D#.E~ @d %Y U$+V$+W$+w@+X$+Y$+Z$+`$+ %+.%++%+@%+#%+$%+%%+&%+*%+=%+-%+;%+>%+,%+'%+)%+!%+~%+{%+]%+^%+/%+(%+_%+F1 92.c-.^$+lf :%+<%+[%+}%+|%+1%+2%+3%+4%+77 jg Kt 5%+5_ 6%+7%+8%+9%+9%+0%+D5.}8.Go a%+b%+c%+d%+e%+f%+g%+Zg E9 3(.rg h%+i%+j%+k%+l%+m%+n%+o%+p%+q2.,@ q%+r%+D*.QP s%+t%+vI q2.65.E9 ]3 u%+v%+w%+x%+y%+z%+A%+B%+RO !a C%+D%+E%+F%+G%+H%+bO eX 0O g[.C>.E~ KC I%+J%+K%+L%+M%+N%+O%+P%+Q%+R%+P%+S%+T%+U%+V%+W%+X%+Y%+Z%+`%+S*. &+.&++&+-, R~.y. k. 7$ *. 0+ ,D.+ @&+#&+$&+%&+%&+%&+&&+*&+=&+%&+-&+;&+>&+,&+q C; C; + + ", "4. 4. q S(.'&+)&+)&+!&+Pv.cP.y. C; y. + + + + + -, 3. ~&+{&+]&+^&+/&+(&+_&+Np :&+<&+%x o8 *L [&+=< x| w| x| ^[ ^[ p8 w| J1 J1 }&+|&+1&+2&+3&+4&+5&+6&+BS V_ [[ tC wl [[ J1 Is d'.b*.7&+8&+9&+0&+a&+b&+c&+d&+e&+f&+g&+C# h&+i&+j&+I1 O#.k&+l&+m&+$f.n&+#E e] B~.o&+p&+q&+%< pg k} $6 r&+s&+t&+u&+v&+w&+x&+c#+Ob.ln %6 wl }[ wl J1 /%./%.X3 p3 %< kt 2[ y&+_R pD J! z&+A&++G +G +G v0 B&+P5.HU :[ zS C&+&b.@%.D&+E&+F&+G&+H&+I&+J&+K&+L&+M&+N&+O&+P&+Q&+R&+S&+T&+U&+V&+W&+X&+Y&+Z&+/a.`&+ *+.*++*+@*+%6 #[.M2 x| ,x H} #*+$*+qJ %*+O#.&*+**+=*+J;.'x X3 DF k8 X6 ;}.-*+;*+H1 O&.17.r8 7P %&.u9 Rf.>*+,*+'*+Dz c'.5< to TC r@.Qc 'X C..6O )*+N$.a2.zS _[ (x F$+5< QE (m l3 &x J1 x| x| }[ 14 75.%E Yy U9.:$+dD L1 !*+~*+{*+]*+Xk ^*+^[ pg p8 J1 V_ w| J1 DW |%.u| '7./*+(*+_*+Az :*+<*+[*+}*+|*+1*+2*+3*+4*+5*+6*+7*+8*+n} d;.v%.HU 9*+0*+a*+d_ + + k. 7$ 7$ k. y. j. SM.9r.b*+c*+d*+d*+d*+d*+e*+f*+g*+h*+y. j1 j. + + + + ", "C; C; y. 68 6` i*+j*+k*+~0.. y. C; + + + + + + -, l*+~&+m*+.q*+r*+%6 j8 x| w| [[ J1 T3 }[ H1 H1 }[ [[ x| [[ (@.gK wc.s*+t*+u*+v*+E..%< [[ k} V_ V_ x| }[ =< ,x (@.w*+6=.v< ,q d0.x*+y*+z*+A*+W! %6 hl @'.B*+~Y V_ }[ G1 25.C*+B6.D*+E*+fU F*+R*.f, G*+F1 H1 =< x| |7 hl H*+I*+J*+K*+gn L*+^[ H1 x| [[ W_ [[ }[ :[ pn =< #6 =s kt %3 y&+J#.pD Pi hO gK gK gK hO AS *5 I1 +6 C1 *< V_ It M*+D7.N*+O*+P*+Q*+R*+S*+T*+U*+V*+W*+X*+Y*+Z*+Z*+`*+ =+.=+77.+=+@=+#=+$=+k7.%=+&=+*=+==+n8 M2 x| W_ =< ([ ro ,& 29 -=+-2.H5.;=+B6.xl V_ V_ [[ jm I1 B4 7: >=+3e H1 l8 V_ V_ *< ;5 }7 aL ,=+'=+)=+l'.([ H1 wl um -5 Xy x| !=+6M 6M _<.2&+_<.yl }[ K1 }[ zc QE o^ F1 =< =< }[ x| *< k} k} I1 ~=+C6.{=+2&+q+.A~ ^^ W,.Jp uC q( -s 'a XB V_ x| V_ }[ <[ }[ um yl ]=+^=+/=+(=+_=+:=+<=+[=+}=+|=+1=+pm 2=+3=+4=+MM.6M J@ 5=+V3 6=+7=+a*+d_ C; C; C; C; C; + + j. k. G =Z.=Z.b++=Z.=Z.b++=Z.[- Xi.k. C; j. j. + + + + ", "+ y. C; C; k. C; + + C; C; C; y. + C; + + + + -, 8=+~&+9=+0=+a=+It &I Ml (@.V_ w| x| W3 V3 V_ }[ [[ }[ =< [[ [[ [[ *< *< W_ =< 7P L1 V@ I9 F*.:c rm HI =< =< W_ W_ *< W_ =< F1 T3 tp b=+c=+~Y 25./<.Ob.d=+e=+f=+YH V_ w| w| x| U3 pn 7P ib F1 =< g=+2$.fU h=+R*.4: i=+5#.H1 [[ =< k} k} 'a I1 J+ Sx 5: Or jm jm w| J1 Is ;5 L2 V3 }[ =< x| =s j=+T=.Km k=+WQ h} L#.J1 V_ V_ V_ +6 &< w| }[ ;5 =< W_ V_ l=+TC hl m=+n=+o=+p=+q=+r=+s=+t=+u=+v=+w=+x=+y=+z=+A=+B=+C=+D=+E=+F=+G=+H=+I=+J=+K=+L=+DF x| k} V_ =< u| w0 z@.RC <& Uu |[ [[ k} k} *< W_ W_ jm w| zl M=+J` JH r( }[ x| wl wl j8 5< Is Q| @z J2._x yc hO J1 |7 V3 V3 V_ wl Is j} V_ [[ w| [[ U3 .i i @K k*.4M $s }[ }[ =< =< [[ x| [[ =< =< =< k} =< 'a V_ o^ /= V^.u= F9 q( }[ j} V_ *< W_ =< [[ w| x| U3 2Q W_ V_ Yv N=+|'.{=+q+.|'.O=+P=+Q=+R=+wl l8 V3 x| i S=+I1 T=+U=+V=+68 + C; + + + + C; + y. + C; k. C; C; C; C; C; 7$ 7$ j. y. + + j. + + + ", "+ + + + + + + + + + + + + + k. G d_ . d_ RM.W=+X=+Y=+Z=+-+,-+'-+)-+!-+~-+{-+]-+^-+/-+(-+_-+:-+<-+$f.$f.DF }[ W3 W_ }[ =< v| [1 ~1 Ww I/ KV V3 V_ W_ j} j} W_ Xy u| w| [-+() v< V3 =< W_ }[ J1 I1 M2 DF p8 V9 {= }-+^H YB 27 V_ <[ 2Q <[ V_ wl Is j} *< x| }[ [[ L2 ln W_ 03 ^V yB 3f 'a H1 =< }[ }[ }[ }[ }[ }[ }[ }[ =< H1 }[ }1 > :: =_ F9 H1 =< x| }[ }[ }[ k} V3 V3 *< Yv Yv *< V_ }[ L2 <[ *< L2 W_ HI ;; n} DF p8 %6 Yv W_ EF h=+lT |-+1-+2-+68 + + + + + + + + + C; + + C; + + C; + + + + C; + + + + + + ", "+ + + + + + + + + + + + + + 7$ L/.n .*-.*-.3-+4-+X=+5-+6-+%e r( J1 p8 x| j} XB XB V_ }[ }[ }[ }[ *< }[ x| x| W_ }[ }[ *< [[ I1 47 :g b<.^> %s }y V_ V_ -5 j} x| }[ =< F1 [[ 7-+8-+9-+;5 -5 V_ wl J1 wl +6 +B *< [[ }[ w| Is og L2 8$.P/.X3 |2 [/.=j {@ I( Q+.Vy 67 F1 +6 +B }[ =< H1 x| 9> S^.Sq 'W H1 l8 +6 O2 }[ I1 p8 p8 x| j} -5 6J E- !!.Km $=.:e 7G L2 -5 &< U3 *< k} *< }[ }[ }[ *< I1 tC tC w| ^[ %6 0-+a-+1:.b-+c-+d-+e-+f-+g-+h-+i-+j-+k-+l-+m-+n-+o-+p-+q-+r-+g..gl to UH |[ km q7 W_ V_ =< v| [1 8, 6c XQ wb }[ V_ W_ -5 -5 }[ 2r yc J1 s-+fT l3 F1 =< *< }[ }[ V_ *< I1 I1 U3 /u ;s o} 4b G1 V_ k} *< *< k} V_ [[ *< *< [[ }[ x| j} 0L V_ 7% ={ {7.6#.G1 H1 =< }[ }[ }[ }[ }[ }[ }[ }[ =< H1 }[ |] 5c J' ;< q( H1 =< *< *< *< }[ V_ L2 L2 *< I1 I1 }[ J1 J1 I1 V_ V_ W_ *< }[ H1 V3 wl J1 }[ W_ }[ [[ %x Ze t-+u-+v-+68 C; + + + + + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + k. [- Rv.w-+x-+l. W=+y-+z-+A-+jm }[ [[ x| [[ <[ V3 }[ V_ }[ }[ x| [[ V_ =< j} Is j} x| }[ x| j} HE 4j K..f, ;i rp K2 }[ V_ V_ V_ x| }[ =< F1 =< T..!3.^c l8 (@.J1 x| w| w| |[ ;5 =< =< V_ wl pg $6 i7 B-+C-+r@.M[ >@.d4 8h r,.D-+oL 67 sm zS IE }[ =< H1 }[ 79 _) Gi 33 F1 H1 pn ;5 W_ [[ V_ V_ [[ V3 q( ^3 )_ dr %Z o- Hs 4b }[ V_ }[ W3 *< V_ [[ x| W_ }[ *< x| Is Is J1 ,x (@.BR ^-.E-+KG )J ;@.F-+G-+H-+I-+J-+K-+L-+M-+N-+O-+P-+Q-+R-+S-+0S >5 'x V_ *< <[ }[ x| V_ =< v| }1 >G g8 ;8 b} }[ }[ W_ j} V_ W_ J1 mf uy 'z -> /] 4j w| I1 }[ }[ J1 V3 |7 wl -j T-+.L U-+F1 H1 =< V_ k} V_ V3 W3 &< 2r V_ W_ *< W_ j} j} }[ AR ]V 41.x8.F1 G1 =< }[ }[ }[ }[ }[ }[ }[ }[ =< H1 V_ |] A+.&g XQ 'a H1 =< }[ I1 }[ }[ k} M2 |7 k} V_ V_ V_ }[ V_ V_ V_ k} k} V_ [[ [[ =< k} }[ [[ ;5 +B 14 q+.LP V-+W-+X-+[r.+ + + + + + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + C; k. C; . Yv.Y-+#R 8=+tU.Z-+`-+ ;+^[ H1 =< V_ x| pn qg x| [[ }[ W_ j} r( W3 W_ j} It j} x| }[ x| r( Jt pg .;+=f w5 F1 7G W3 V_ x| x| }[ }[ =< F1 =< -e B' ~_ UH J1 x| =< }[ Is V_ [[ }[ }[ V_ wl pg {A {T +;+@;+Jt #;+T=.d4 {@ V6 .P lO HI =5 IE 'x V_ W_ V_ V_ &6 23 N[ oL g} hO X3 }[ j} V_ x| }[ V_ |7 to =[.$l G! p*.J].[1 f} wl [[ x| V_ *< [[ I1 j} V_ x| }[ x| j} It J1 i} -5 d> $;+%;+&;+*;+=;+uo P#.$f.H8 H8 ,3.Lp }[ h1.#A ]Y -;+;;+r2.ww ([ r( V_ ;5 ;5 H1 I1 [[ *< -< r) dK pi a: i }[ }[ }[ x| }[ *< [[ xl dW >;+g;./] %< J1 tC [[ V_ I1 U3 Yv I1 -j ke _ ry G1 %e [[ }[ <[ }[ V3 U3 &< IE *< W_ V_ }[ x| =< }[ rg 33 M=.o} v| HI W_ V_ }[ }[ }[ }[ }[ }[ }[ =< H1 }[ |] > :: I/ H1 H1 =< }[ I1 }[ }[ W_ Is Is x| =< }[ *< }[ }[ }[ *< }[ *< }[ I1 }[ *< }[ }[ [[ ;5 O2 9f q+.sm ,;+';+);+[r.+ + + + + + + + + + + + + + + + + + + + + y. q y. + + + ", "+ + + + + + + + + + + + k. 0+ G + y. j. j. j. !;+~;+{;+^D O&.l8 =< V_ x| +6 km }[ w| I1 x| 'x og J@ W3 =< V_ V_ }[ }[ }[ W_ k} 7M (& cz $7 F1 q( W_ }[ }[ }[ }[ }[ =< F1 =< 9P B' _1 |7 V_ }[ W_ j} -5 j} x| }[ }[ W_ x| Is og to 'a V$.i8 g=+12 UQ t$.MQ ];+w*.F1 3/ }[ V_ V_ W_ }[ J1 xg O~.(l ^;+d'./;+l=+I1 -5 j} x| }[ }[ V_ wl i} #6 Zm ~h F2.(;+M5.DF wl J1 I1 }[ x| j} -5 j} [[ V_ k} W_ V_ J1 ^[ r( _;+=e :;+i^ 4j rn |7 |7 *j l8 d;.cx sp <[ }[ }[ 8! <;+yB gn gf dD V_ [[ ;5 :[ HU I1 w| }[ [;+{8 sf M=+Ra *< }[ }[ }[ }[ *< *< =< G1 EF mK hK =j ([ -5 um x| V_ }[ j8 |[ -5 yl 9} fn a} %e *R J1 %6 J@ <[ [[ W_ *< <[ U3 W3 V_ I1 }[ =< }[ 47 oy y- vb H2 n= W3 V_ }[ }[ }[ }[ }[ }[ V_ =< l8 V_ |] 5c J' u6 7G jm [[ V_ V_ V_ k} =< 'x It V_ W_ }[ k} J1 J1 V_ *< }[ k} x| x| x| k} }[ }[ x| }[ *< JH 4}.km };+|;+1;+*-.C; + + + + + + + + + + + + + + + + C; + + + d_ *-.q + + + ", "+ + + + + + + + + + + + C; k. C; C; C; C; R~.+ 2;+3;+4;+5;+^[ o` [[ }[ [[ YG ;5 x| [[ }[ [[ V3 ;5 <[ x| [[ x| =< V_ }[ x| j} -5 bO 4#.|}.>F G1 H1 =< }[ }[ }[ }[ }[ =< K1 i8 -! B' _1 W3 =< *< x| V_ V_ V_ W_ *< k} j} 2r 2r 'a rn I1 Qs x| g=+T=.fU :@._;+Wh (^ F1 jm =< W_ W_ V_ [[ wl 6M $A au (Z g} B6.9W I1 V_ V_ =< }[ }[ V_ w| T3 BS .f 6;+7;+|#.L5.og um T3 I1 *< =< V_ j} V_ W3 2Q |7 [[ x| [[ jm &6 (& =e P[ TP hl q( W3 k} =< j} j} *< }[ [[ [[ V_ W_ h5 |2 gn gf H1 =< [[ *< ;5 H1 I1 w| }[ 6J V#.8;+v` 9;+H1 [[ *< }[ }[ }[ I1 [[ F1 k} `; b=+=j ,x It (@.j} =< *< k8 DF 'a f} >! %3 rh F1 Q3 IE wl V3 |7 j} 'x V_ }[ &< r( [[ }[ }[ =< V_ h8 V6 j%.5: [1 W_ V3 V_ }[ }[ }[ }[ }[ }[ W_ j} og }[ }1 o} ,5 90 mr H1 [[ <[ 8! }[ V3 W3 'a Is V_ W_ =< W_ M2 Yv }[ k} }[ W_ j} j} V_ W_ *< }[ }[ W_ k} b% }&+${ 0;+a;+b;+[r.+ + + + + + + + + + + + + + + + + + k. 7$ k. y. q y. + + + ", "+ + + + + + + + + + + + + + + + + C; cr.d_ 4-+c;+d;+e;+jm H1 x| }[ }[ x| [[ }[ }[ }[ [[ <[ L2 *< [[ I1 j} V3 |7 V_ =< j} -5 47 MQ ];+Ki F1 5< W_ V_ }[ }[ }[ }[ =< K1 7P l, =* {_ |7 J1 W_ =< }[ }[ }[ }[ [[ J;.W! lH ^A V_ w| w| 17 V_ g=+T=.fU V<.r,.f;+Sx HI G1 =< }[ }[ W_ Is XB &x ck K{.5c pJ Qs wl J1 [[ |7 V3 V_ k} }[ %6 w| E1 Wz g;+1T h;+/[ Is p8 wl *< k} V3 |7 =< [[ <[ J( H1 Is x| =< 'a j} i;+F` z@.aO SE :k W3 V_ V_ W3 W3 k} V_ I1 x| }[ =< m3 `; gn KH jm =< }[ *< [[ w| w| [[ }[ bO V#.(m $7 F1 HI x| }[ }[ *< }[ I1 w| F1 V_ 7*.[/./] 4j J1 XB j} [[ *< Yv to wl (j W6 T:.-H J2 sm O:.[[ J1 [[ r( IE r( V_ It j} x| }[ }[ x| k} ,x S_ j;+,> o} lv H1 =< }[ }[ }[ }[ }[ }[ W_ j} og V_ *@ k;+K' Hd K1 H1 [[ 8! 2Q }[ V3 L2 |7 [[ V_ [[ }[ r( L2 M2 }[ V_ }[ W_ j} -5 }[ [[ }[ }[ W_ }[ r( 2r l;+m;+n;+o;+p;+[r.+ + + + + + + + + + + + + + + + + + k. 8l k. + + + + + + ", "+ + + + + + + + + + + + + + + + + C; . n .4-+q;+r;+s;+l8 -s W_ V_ }[ }[ *< *< *< }[ W_ Is -5 V_ x| j} -5 &< U3 *< V_ x| }[ h8 t;+.P 4M n= n8 W3 V_ }[ }[ }[ }[ =< F1 V_ K' =* >| $< um V_ W_ j} -5 V_ [[ w| u;+v;+)7 w;+J1 }[ J1 V$.It g=+T=.=j x;+y;+z;+pf .i q( =< }[ }[ W_ 'x c*.H$+A;+}Q kJ d$.%< T3 T3 w| DF DF }[ k} <[ j8 r( >$.wl B;+C;+ b F1 p8 J1 W_ [[ =< to DF }[ k} V_ W_ Is TC V_ W_ 0L ;@.D;+`& @< he 'a }[ =< *< V_ W3 J( x| V_ }[ x| V_ W_ /c E;+F;+ZV jm =< }[ }[ }[ }[ }[ =< }[ (j ]V (m G` gl .i x| J1 }[ *< }[ }[ [[ Qs w| }&.12 =j %< wl J1 k} *< k} }[ x| x| Uv -* G;+;H K1 3/ W_ }[ }[ V_ W3 J@ <[ k} V_ V_ }[ }[ *< *< =< I1 9f H;+I;+R'.=j H1 =< }[ }[ }[ }[ }[ }[ x| k} r( k} J;+u[ K;+L;+M;+i} x| k} *< }[ k} }[ }[ V_ I1 [[ j} -5 r( W_ }[ V_ }[ W_ V_ }[ V_ wl I1 }[ W_ j} Nu h1.=s k8 N;+O;+P;+*-.C; + + + + + + + + + + + + + + + + C; + C; + C; + + + + + ", "+ + + + + + + + + + + + + + + + + C; cr.d_ 4-+X=+Q;+R;+H1 *5 YG [[ }[ }[ }[ I1 }[ [[ W_ j} j} V_ W_ V_ J1 V3 W3 *< V_ =< =< pg _T 4: 6G D, ~c U3 V_ }[ }[ [[ [[ =< pg (A &! nt 3t fM yl I1 =< V_ j} V_ |7 DF S;+T;+U;+ow (@.}[ l} f} *5 Hi T=.fU V<.11 %* ;i HI H1 =< }[ W_ }[ V;+W;+N5.X;+Y;+Z;+`;+nu ;5 *5 p8 :E l8 V_ [[ |7 CF x| 7M _[ w' >+We %6 xl J1 [[ ;5 uJ DF l8 V_ k} V_ =< j} j} V_ W_ Is tl .>++>+@>+/+.p8 H1 [[ x| =< &< &< }[ =< =< =< k} W3 7F ,> #>+eC F1 =< }[ }[ =< =< =< =< }[ (j hI JQ $>+GS 5< x| V_ }[ *< *< [[ O:.6e jm %>+&>+=j F1 [[ W_ x| }[ V_ V3 |7 *< ig .{ b!.>;.F1 F1 =< *< *< k} W_ W3 |7 [[ x| W_ [[ W_ x| w| }[ +6 =5 eD x7.]x 1] F1 =< }[ }[ [[ [[ [[ }[ k} x| Is J1 *>+kV =>+->+;>+'7.l=+x| J1 V_ V_ V_ k} V3 Yv M2 V_ j} V_ [[ V_ }[ }[ V_ W_ =< W_ }[ }[ }[ [[ ;5 C$.Jt %Y C$.>>+,>+'>+&-.C; y. + + + + + + + + + + + + + + + + + + + + + + + + + ", "+ + + C; + + + C; + + + + + + + + + C; R~.C; 2;+9=+)>+R;+(@.)Y J1 }[ *< }[ I1 I1 wl }[ j} V_ x| W_ j} Is tC [[ V_ }[ }[ }[ =< q( K..Rh D/ D, Ml W3 V_ }[ [[ }[ &< YG G1 *< 1: [+.K[ fU xl 'a =< W_ ]A YG H1 'y C..*j 2x K@.I1 [[ w| y| L2 I[ T=.fU :@.hI ,$.oL F1 H1 [[ }[ W_ -5 !>+~>+{=+{>+]>+^>+/>+T3.|[ _[ I1 w| V_ W_ Is 'a L2 $< 7M y7.Y*.c=.~D q( %6 |7 x| &< AS &< x| }[ }[ V_ }[ x| x| *< }[ wl W_ (>+_>+:>+<>+rn H1 Is Is x| 'x og }[ j} r( W3 W_ l8 /A 2j 7^ e] F1 =< }[ [[ }[ ;5 *< =< }[ c} C- %* s].Yz jm =< }[ }[ }[ }[ [[ ;5 |$.b% |2 [>+/& F1 =< *< }[ J1 }[ Yv to }[ AR }>+|>+x8.%< F1 [[ I1 }[ =< }[ j} V_ wl }[ W_ }[ j} V_ w| p8 _[ B$.V3 ]x KW [1 F1 =< }[ [[ }[ ;5 *< [[ *< x| Is w| 1>+2>+K;+TE 2y r8 It x| I1 }[ }[ }[ V_ <[ 2Q <[ [[ x| x| }[ }[ }[ }[ }[ }[ }[ }[ }[ }[ *< [[ &< +6 so *@.Jt 3>+4>+5>+8Y y. + + + + + + + + + + + + + + + + + + + + + + + + + + ", "+ + C; + C; C; C; + C; + + + + + + + + C; R~.C; 6>+7>+8>+9>+xl xl um I1 }[ I1 I1 }[ wl Is -5 j} x| W_ Is TC um x| }[ V_ *< =< }[ -< ,W 4: o) n= q( =< }[ }[ [[ ;5 O2 IE 0>+O2 >* a>+b>+c>+IV H1 =< <[ J( r( TC I1 p8 l8 +B &< T3 J1 w| Qs x| Hi T=.fU v$.X- 3~.L@.Qs jm w| I1 x| J1 d>+e>+I$+f>+g>+h>+i>+_#.([ I1 }[ [[ *< W_ Is TC }[ ][ h8 HU }$.b/.j>+q( l8 J@ |7 J1 -5 j} |7 DF V3 V_ V_ W_ W_ W_ w| p8 x| CB )%.O%.C` F1 H1 'x XB um V_ }[ x| 'x og J@ W_ HI U3 =* k>+rd HI =< }[ [[ &< O2 ;5 =< }[ Uv X[ E!.1: F1 jm =< W_ *< V_ }[ =< }[ W_ <] l>+m>+ZV H1 =< *< }[ V_ }[ J@ Yv x| F9 @0 f, G*+%< ^[ wl wl x| x| j} -5 j} [[ V_ W_ j} -5 j} x| T3 }[ kn J@ f% n>+[1 u| =< }[ =< ;5 HU ;5 [[ *< [[ 'a }[ [O L` pj g^ L1 'a =< V_ }[ *< k} V_ =< W_ W_ =< }[ }[ }[ }[ }[ }[ }[ }[ }[ }[ }[ }[ }[ *< I1 w| I1 I1 ,x V_ o>+p>+q>+8Z 68 y. + + + + + + + + + + + + + + + + + + + + + + + + + ", "+ + + k. 7$ 0+ 7$ C; + + + + + + + + + C; R~.C; 6>+X=+r>+9>+jm ln V3 V_ }[ }[ }[ }[ [[ l8 &< V3 [[ =< &< &< }[ L2 U3 W_ V_ =< }[ (j $_ dr /{ rp hO V_ =< W_ x| *< ;5 -5 0L &< gx [2 kM w5 f} G1 [[ }[ W3 r( Is J1 %6 l8 _[ L2 M2 p8 w| y| %6 mK T=.fU ;|.X- (m 1: @H dD [[ }[ }[ V_ (A J;.%x 4P.s>+t>+u>+F/ u| [[ =< =< W_ W_ j} j} k} [[ ,s *< v>+d}.m; w>+17.V3 W3 }[ V3 }[ }[ }[ x| =< W_ j} j} V_ x| }[ [[ jm X- 22 .] F1 H1 V_ j} V_ [[ =< W_ j} r( <[ x| 17 V3 ]c x>+y% HI =< }[ [[ r( *5 H1 |7 }[ y>+Zd j%.3j dD %E cN j} [[ *< V_ *< M2 'y C@.F;+r2.eC q( W_ [[ k} V_ I1 J@ J( W_ 4b -!.z>+A>+B>+_2.C>+H7.=< 14 HE j} <[ |7 I1 [[ V3 &< V3 [[ }[ =< u| W3 2[ / .o^ F1 =< *< [[ I1 H1 }[ [[ }[ =< H1 }[ D>+E>+pj $e dD l8 =< *< *< V_ V3 W3 V3 Is Is V_ *< *< V_ V_ }[ }[ }[ }[ }[ }[ }[ }[ }[ *< }[ [[ [[ w| F>+Wz G>+H>+I>+J>+S(.y. + + + + + + + + C; + + C; + + + + + + + + + + + + + ", "+ + + k. 7$ *. 0+ C; + + + + + + + + + C; cr.d_ K>+L>+M>+N>+dD HU ;5 [[ }[ V_ V_ }[ V_ W3 U3 W3 V_ V_ W3 U3 x| L2 |[ V_ V_ [[ }[ 67 hI Iu /{ .i }y V_ }[ j} V_ [[ =< r( 'a V_ a> T-+G;+O>+92.F1 [[ J1 V_ =< x| J1 l8 |7 x| pn |[ w| 9_.17 vm 7*.EW fU D9 h;+>< ]N q2.5#.=< }[ }[ x| V_ um y| P>+Q>+R>+S>+c_.v| W_ |7 r( j} =< |7 |7 V_ [[ &x =< ,H Yq m; j6.r8 j} x| V3 L2 <[ k} W_ r( r( W_ j} -5 }[ =< *< [[ E1 T>+Y1 a} F1 jm MP W3 V_ <[ <[ V_ [[ [[ k} [[ Qs =< B' k*.rd HI =< }[ x| j} It H1 M2 }[ y>+U>+.P V>+c} +S..ZV hl 2r k} W_ V_ I1 Yv L2 r( n=.$_ vo X>+!-._$+nw i7 W_ 14 7P V_ W3 Yv I1 V_ |7 U3 W3 V_ }[ =< u| =< 7^ bT m3 F1 [[ *< }[ w| T3 [[ }[ }[ =< H1 x| @} >P pj SI dD dD k} }[ *< V_ V3 U3 V3 It XB V_ }[ V_ V3 V3 V_ k} }[ }[ }[ }[ }[ }[ }[ }[ }[ *< *< J1 F>+_].Y>+Z>+`>+5@ j1 y. + + + + + + + + + k. k. + + + + + + + + + + + + + + ", "+ + C; + C; 8l 4. C; + + + + + + + + + C; . n .K>+L>+,+Aq AS k} x| V_ w| Is )Y dW ,,+',+KH ;=+),+V_ W_ }[ J1 tC I1 14 !,+[B e< ~,+{,+Xz sp CF J@ <[ V_ I1 x| W_ x| x| V_ *< k} k} k} W_ u| [[ x7.Ht [1 F1 w| I1 }[ }[ V_ W_ W_ W_ =< H1 }[ }1 8} 91 !X 3:.6O k} =< V_ [[ W_ W_ *< }[ V_ }[ x| w| |7 L2 *< V_ }[ }[ }[ *< *< *< *< *< *< *< I1 J1 F>+w| ],+^,+/,+8Y y. + y. + + + + + + + + 7$ 8l C; + + + + + + + + + + + + + ", "+ + + + + C; k. C; + + + + + + + + + C; cr.d_ 4-+(,+_,+#x a2.r( [[ V_ I1 M2 pn -5 j} [[ k} V_ I1 I1 V_ k} W_ V_ 'a V3 V3 V_ x| v| d] ,$.:,+%s ^[ |7 <[ r( V_ [[ k} M2 |7 x| I2 ,` .P a} HI ([ V_ }[ I1 J1 w| I1 [[ k} }[ j} V_ x| <,+[,+J@ `; EW fU },+;i |,+RC hN q| <[ V_ I1 [[ x| w| Qs Wz 1,+2,+3,+:] dD W_ W3 'a Is V_ M2 H1 Is V_ &x =< 4,+v- /@.F1 &< qg Yv T3 V_ V_ }[ |7 r( j} V_ W_ [[ wl }[ k} [[ &x 5,+6,+7,+%< ,x V3 W3 =< &< H1 I1 [[ }[ }[ =< F1 W_ g=+12 +r V@ +B *< [[ }[ V_ V_ =< }[ >E ot }x 8,+g'.9,+v%.og k} [[ V3 %6 'a +F Cx V1.-E KH 0,+a,+J1 M2 Yv }[ DF ^A p3 b,+Y$.c,+d,+e,+f,+g,+h,+i,+j,+aL XB J1 J1 Is j} =< k} |7 %6 x| pn ]H *< ]` D*.Zv F1 =< }[ }[ *< W_ j} j} V_ =< H1 }[ |] A+.91 k,+l,+Yy J1 x| W3 ;5 2r J1 M2 U3 W_ [[ j} It r( W3 *< V_ }[ }[ }[ }[ I1 }[ }[ I1 w| [[ x| wl h} o` (c m,+n,+8Y + y. + + + + + + + + + k. k. + + + + + + + + + + + + + + ", "+ + + + + C; + C; + + + + + + + + + C; R~.C; o,+(,+p,+C#.Yy r( |7 V3 I1 M2 pn -5 V_ *< <[ }[ J1 p8 }[ }[ }[ V_ W3 U3 <[ =< }[ h8 aT .P ;| n= C..|7 |7 W_ [[ }[ *< J1 w| }[ +; q,+r,+3j K1 *R j} #6 #x UH yl T3 I1 #6 b% #6 }[ x| V_ U_ r( Hi T=.fU D9 39 s,++} H1 @H &< [[ wl Is 'x w| ql {T t,+u,+te 79 G1 w| k} [[ x| *< [[ Is XB X3 ,s &< v,+w,+8} J@.yl vm M2 V_ *< }[ J1 V_ =< W_ }[ }[ }[ I1 I1 x| l8 pJ e}.9k x,+w>+[[ #6 J1 W_ 2r og p8 x| }[ }[ =< F1 W_ g=+y,+H} {C +6 *< [[ }[ }[ *< =< }[ z,+-* {<.A,+lm xl 'x 'a }[ =< |7 DF *5 Zz B,+$| +q KH 5#.HE I1 M2 2Q ]A L2 q( p3 C,+D,+E,+F,+G,+H,+I,+J,+K,+L,+M,+V_ ~Y 'a TC j} [[ W_ |[ q( tC *5 e V3 i] y> 1] u| V_ W_ x| }[ W_ j} -5 }[ =< H1 }[ |] A+.91 )& 6O jm tC Yv j8 &< XB um M2 L2 }[ =< j} It }[ V3 V_ V_ }[ }[ }[ }[ I1 }[ }[ w| H1 &< j} Vu (A T3 N,+O,+P,+8Y C; + + + + + + + + + C; + + C; + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; R~.C; o,+9=+XN Q,+%e Zz <[ U3 *< }[ x| V_ V_ W3 U3 W3 V_ }[ }[ }[ }[ }[ V_ *< *< =< }[ bO |-.]x |0 D, Ml W3 }[ }[ V_ [[ =< w| wl }[ d} R,+E!.;i Qs ql I1 b% C} 4a rn p8 p8 I&.nu J@.I1 um wl 27 ;@.CI T=.=j p'.g%.Cg m].aQ It og W_ x| 'x XB J1 y| S,+Y| T,+d!.jS o` w| }[ }[ *< *< I1 T3 J1 l} o=.D1 U,+V,+W,+)_ 4j Xz |7 k} k} x| x| }[ k} *< I1 }[ *< }[ w| wl m8 c} ;< X,+Y,+'7.kv C#.I1 }[ V_ }[ }[ x| }[ }[ =< F1 W_ mK 7^ 9-+L2 I1 V_ wl I1 }[ *< =< }[ K&._' z8 '+,'+n,+8Y + + + + + + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; R~.C; 6>+9=+$N.''+i} 'a *< W_ I1 x| 2r Is V_ }[ &< r( =< *< *< }[ }[ }[ k} V_ V_ =< }[ (j |-.)'+6G D, 5< W_ V_ V_ [[ ;5 +B &< ,6.J1 d} _v w{ L@.Qs G1 [[ l} AC [[ [[ l} iT [[ dP x| p8 p8 w| 17 %e !'+n&+Xj gV 1$.~'+*#+m+.{'+Qs k8 U3 j} 'a to %x ]'+^'+/'+('+_'+xl }[ =< W_ x| *< V_ %6 W3 =< .H |$.:'+<'+*2.['+um pg W_ =< W_ j} j} [[ x| }[ }[ }[ *< =< *5 _[ Yv rn V#.!1 }'+|'+to x| Is V_ x| [[ x| *< }[ }[ =< F1 =< (].1'+d% &5 p8 }[ [[ }[ }[ }[ [[ I1 2'+3'+bT 3j F1 H1 =< =< W_ }[ [[ w| *5 Zz 4'+5'+6'+ZV H1 =< }[ V_ *< W3 uJ 7'+IE 8'+9'+0'+a'+b'+c'+d'+e'+f'+g'+h'+Bo B*+x| W_ W_ }[ [[ YG ;5 x| l} v| C1 95.b>+}1 ^[ (@.}[ W_ }[ V_ W_ =< W_ =< H1 V_ %{ XG [+.Y( l8 xl wl %6 I1 [[ j} 'x j} [[ J1 wl J1 'x &< |7 V_ V_ <[ ]A &< Is w| V_ k} =< <[ |[ l8 J@.#x [[ i'+j'+k'+dp + + y. + + + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; cr.d_ K>+L>+l'+m'+^[ 'a W3 V3 J1 [[ r( og 'a J1 It j} x| }[ }[ }[ }[ }[ }[ }[ }[ [[ *< -< 9&.qa 0u %s pg =< }[ *< [[ ;5 +B &< w| I1 6P b n'+k=+Qs 17 Qs xB Tv ^3 o'+p'+.:.,s @H dD w| w| w| y| m8 q'+r'++l s'+dP 39 ** G;+1] NR k8 L2 W3 J1 jm Qs t'+u'+v'+w'+x'+Vu b% x| j} j} W_ [[ <[ L2 W_ K1 X%.Sx y'+S!.z'+um pg r( r( W_ j} j} YG I1 w| }[ }[ }[ [[ @6 +6 *< vm 3t t4 e^ Qs Xz H1 2r k} x| I1 }[ *< }[ }[ =< F1 *< A'+!Z 1: pm xl I1 =< }[ }[ *< [[ I1 -< (& Q;.U-+F1 dD [[ }[ }[ *< x| w| dD -5 )X B'+C'+ZV G1 =< }[ x| k} V_ d;.>5 D'+E'+F'+G'+H'+I'+J'+K'+L'+M'+N'+O'+P'+BS *< k} x| }[ }[ x| [[ }[ =< K1 +6 Q'+)1 ( .Lx xl I1 =< }[ }[ }[ }[ }[ =< H1 *< m3 p>.fn ;E %< %< xl (@.T3 x| r( IE r( [[ w| H1 'a TC V_ V_ }[ V_ <[ J( &< 'x um V3 V3 V_ =< V3 DF l8 jm k} O8 R'+S'+#+ q y. + + + + + + + + + + + + + + + + + + + + + + C; k. C; ", "+ + + + + + + + + + + + + + + + + C; . n .K>+L>++]<.,l F1 G1 w| I1 }[ *< [[ }[ AS +B m3 V1.gn .l G1 =< W_ W_ cN Nu i&+&)+*)+=)+-)+;)+>)+,)+')+))+!)+))+~)+{)+])+^)+L2 V_ W_ }[ }[ }[ }[ V_ W_ &< *< ,F 3G EW g1.H1 H1 =< }[ }[ *< *< *< =< H1 U3 d4 &! /)+()+Y3 E..xl XB V_ [[ W3 J@ <[ V_ [[ +6 O2 }[ V_ *< *< }[ V_ }[ W_ X3 TC V3 U3 *< x| j} Is um dD L1 _)+:)+<)+L/.*-.j. + + + + + + + + + + + + + + + + + + + + + + k. 0+ k. ", "+ + + + + + + + + + + + + + + + + C; cr.d_ K>+[)+0=+%*+Zz -5 }[ W3 *< V_ x| U3 x| x| x| W_ =< W_ x| }[ }[ }[ *< *< x| j} k} xg _g u .U'+Vl HI =< <[ ]A l8 J1 [[ =< H1 vm J;.0:.^` |9 })+I1 Xk SW |)+6K 1)+2)+3)+4)+o: 5)+6)+s| ><.7)+_$ 8)+9)+0)+@!.a)+b)+%! c)+49 6e =< =< x| Is aV d)+e)+f)+g)+<;+I1 I&.AU tC yl H1 Is j} [[ J1 :E pg Yv 5k p- h)+i)+y| D, <[ j} V_ W_ *< YG }[ [[ V_ J1 I1 V_ W3 pn pn *0 MR Xw A5 L .G1 [[ |7 W3 &< 2r V_ W_ }[ }[ =< H1 x| j)+k)+y,+lK rp ^[ [[ }[ }[ }[ =< }[ rg qy 7v |r `-.F1 [[ }[ }[ *< =< =< ;5 <[ /& $| l)+U7 5< j} It J1 'x XB m)+n)+o)+p)+q)+r)+s)+t)+M'+u)+v)+w)+x)+y)+z)+A)+B)+V3 =< =< W_ x| }[ k} M2 5< x| <] @| p&+3= .i 3/ =< }[ *< }[ }[ }[ =< H1 l8 nw t( C)+^H dD 4a bs Is V_ =< x| |7 |7 k} =< ;5 ;5 =< [[ x| x| =< V_ k} }[ V_ V_ V3 W3 *< x| 2r 2P J1 'a Nu D)+E)+F)+G)+*-.y. C; + + + + + + + + + + + + + + + + + + + + + C; k. C; ", "+ + + + + + + + + + + + + + + + + C; R~.C; 2;+7>+Y=+H)+Zz *5 *< V_ *< }[ J1 V_ V_ V_ }[ =< }[ j} V_ x| V_ k} }[ }[ V_ x| W3 GS qy ]<.2a %s F1 =< <[ J( 'a It V_ =< H1 rn )y I)+3)+J)+K)+L)+M)+N)+O)+P)+Q)+R)+S)+uX E_.}&.T)+U)+V)+W)+X)+Y)+Z)+`)+ !+.!++!+@!+#!+$!+u6.V_ }[ }[ wl wl U_ %!+f)+&!+D2 %< um I1 I1 %6 H1 og r( x| J1 |7 4j tC KH >}.Zl *!+y| %s W3 [[ [[ J1 }[ W_ W_ *< <[ I1 J1 V_ |7 qg vl Mk 1: ^E =!+B$.#H J1 l8 U3 &< og }[ =< }[ }[ W_ V_ V_ _D -!+;!+_& %s %< [[ }[ }[ }[ =< }[ 6+.f< mX B+.`-.HI W_ V_ }[ V_ }[ W3 l8 [[ G/ x1.A$.79 'a EF U3 l8 %e Zz >!+,!+'!+)!+!!+~!+{!+]!+^!+/!+(!+_!+:!++7>+5-+6-+Yy |,.V3 w| I1 }[ }[ J1 }[ W_ =< W_ j} -5 j} [[ x| =< }[ I1 V_ W3 j8 c} 33 a!.I| F1 G1 =< V_ x| r( TC um x| I1 I1 Xz 4!+5!+6!+7!+8!+9!+0!+a!+b!+c!+d!+e!+f!+g!+h!+** /2.i!+j!+k!+l!+m!+n!+o!+p!+q!+r!+s!+t!+y6.J1 I1 w| T3 wl t8 u!+v!+w!+@d u| w| }[ V_ }[ |7 J@ W_ =< [[ x| H1 wl qm 9P xI ^;+E..92.Yv V_ I1 T3 %6 L2 W_ *< vm l8 J1 V_ *< |7 J@ w% x!+y!+1: z7 S3 I1 w| x| *< }[ x| W_ }[ }[ }[ V_ V_ fl 03 z!+I| J2 G1 W_ W_ W_ =< }[ *< W_ O' }-+o} rp n= W3 V_ }[ V_ <[ j8 pg {[ {8 A!+B!+C!+D!+nu A)+E!+#H @H Q8.F!+G!+H!+I!+J!+u)+K!+L!+]!+M!+N!+O!+P!+Q!+R!+*@.hl x| j} -5 j} W_ k} W_ j} -5 rU x6 sj < Vy h} p8 wl I1 [[ Is TC um x| }[ }[ V_ |7 U3 W3 j} -5 &< J( *< V_ W_ W_ W_ V_ k} w| %6 J@ *< wl %x S!+T!+U!+V!+H 0+ G + + C; + + + + C; + + + C; + + + + + + k. 0+ k. + + + ", "+ + + + + + + + + + + + + + + + + C; R~.+ W!+7>+5-+9>+H1 AS }[ [[ }[ V_ V_ }[ U3 |[ Is V_ V_ V_ V_ ;5 uJ L2 k} }[ V_ W_ Yv v%.]V a!.X!+G1 G1 =< k} [[ <[ V3 }[ EF .H .H Y!+Z!+`!+ ~+.~++~+@~+#~+$~+%~+&~+*~+=~+-~+;~+>~+,~+'~+)~+!~+~~+{~+]~+^~+/~+(~+_~+:~+<~+[~+}~+um J1 'y to p8 H$+|~+1~+2~+`d U_ [[ =< *< k} W_ W3 j} r( L2 W3 'a w| 3~+4~+$d 5~+6~+lr 47 =s y| vy xC W_ }[ l8 rn yl J1 }[ k} W3 q7 w% 7~+8~+a} HI K2 *< w| J1 [[ j} 'x j} x| }[ }[ =< }[ e[.(& 0D 9~+F1 F1 j} j} V_ =< H1 wl )V Ww x w8.4b n8 U3 =< W_ [[ x| %6 C..ww 0~+Tt a~+b~+,6.c~+qm ,x d~+e~+Bx f~+g~+h~+i~+j~+k~+l~+m~+n~+M!+u)+o~+p~+q~+r~+B>+@'.W_ k} V_ V_ [[ I1 [[ k} V_ 57 I( >A s~+([ G1 U3 L2 x| Is j} V_ =< &< J@ 'J s~+E<.['+Qs ql to to x| &< &< }[ [[ [[ x| x| r( &< }[ V_ Is V3 W3 I1 [[ j} 'x j} W3 ]A 'a 'a Yv W_ %6 vm t~+u~+v~+_Q 7$ }- 0+ 7$ C; + + + + + + 7$ 7$ C; + + + + + + + C; k. C; + + + ", "+ + + + + + + + + + + + + + + + + C; y. -, o,+7>+]&+1$ H1 r( =< }[ V_ <[ <[ }[ U3 |[ -5 j} }[ V_ [[ ;5 O2 &< [[ }[ *< [[ um rk Zm a!.x8.4b F1 =< }[ V_ V3 L2 }[ wb ;F )4 w~+x~+y~+z~+A~+B~+C~+D~+E~+F~+G~+H~+I~+J~+K~+L~+M~+N~+O~+P~+Q~+R~+S~+T~+U~+V~+W~+X~+Y~+Z~+`~+I1 I1 'y to p8 &<. {+.{++{+J&.H1 #6 l8 k} V_ V_ =< Is IE L2 W3 xl f} @{+#{+${+-x |] m, ( Uj %{+&{+zb &< 'a q#.qR iT wl }[ k} W3 2Q &) VI 4: w5 F1 jm =< }[ I1 [[ r( og r( [[ }[ }[ =< }[ rg 9&.a!.X!+F1 F1 j} -5 }[ =< H1 wl j^ 5: d~.f^ rp 7G W3 V_ j} <[ V3 (@.y| *{+={+>m ;E -{+;{+>{+,{+'{+){+!{+~{+{{+]{+^{+/{+({+_{+:{+<{+[{+K'+}{+|{+1{+2{+3{+4{+5{+6{+Q1.YG uJ r( w| [[ =< }[ 47 e^ ]#.7: J2 G1 U3 Yv wl 'a IE }[ r( |[ L2 J@.vb &e ['+Qs ql to Yv }[ W3 U3 }[ W3 <[ j} V_ 'a -5 j} x| wl [[ V_ I1 [[ r( og r( W3 J( &< It V_ =< %6 m8 7{+8{+9{+6@ + k. 8l 7$ C; + + + + + + 7$ 7$ C; + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + y. + d_ 3. ~&+L>+E Ar ah Y_ d$.%< [[ }[ J1 }[ }[ [[ *< 0{+a{+b{+c{+d{+e{+f{+g{+h{+i{+j{+k{+l{+m{+n{+o{+p{+q{+r{+s{+t{+u{+v{+w{+x{+y{+z{+A{+-@ B{+C{+iT V3 L2 I1 tC tC um Tv D{+E{+F{+q| 4< Dy DF }[ J1 I1 wl J1 I1 wl wl ^[ F9 G{+H{+I{+J{+K{+iR qA L{+-) M{+N{+QD vN 9S 9S E;.I1 }[ *< [[ }[ e} Ph ]x a=.F1 ^[ [[ *< }[ V_ W3 J@ <[ k} *< }[ =< }[ Uv Ar a!.X!+F1 G1 k} }[ V_ =< H1 *< a} >@.O{+/I h&+q( W_ 2r -5 <[ L2 -5 =s Gd 8, P{+{> *j Q{+R{+S{+T{+U{+V{+W{+X{+Y{+Z{+`{+ ]+.]++]+@]+#]+$]+%]+&]+*]+=]+-]+;]+>]+9S jt +6 ,]++6 I1 [[ =< }[ (j 4#.JQ ']+)]+&< W_ }[ wl J@ Yv I1 *5 X%.*< 8W !]+Xq 3j Qs G1 x| }[ J1 }[ *< V_ ]A uJ HE J1 wl V_ V_ *< }[ }[ x| x| [[ W3 J@ L2 k} x| }[ V_ V_ =< |7 %x ~]+{]+]]+^]++ + C; C; C; + + + + + + C; C; j. + + + y. + + + y. + + + + + ", "+ + + + + + + + + + + + + + + + + d_ *-.:=.W=+c;+ y,+E` K1 ^[ [[ V_ Is V3 ;5 Nu 2f |y b3 w]+x]+bs y]+z]+A]+B]+C]+D]+E]+F]+G]+L) H]+I]+J]+K]+L!+L]+M]+K!+/!+/!+N]+O]+P]+Q]+R]+S]+lc.9W k} +6 |[ =< [[ =s j=+J[ T]+m; rf 'a [[ J1 %6 l8 p8 'a Yy +6 _s ED U]+>s p+.,x [[ V_ }[ [[ [[ =< }[ &< &< }[ x| x| W_ V_ k} [[ j} Is &< U3 W3 x| V_ V_ =< W_ W_ k} wl :E V]+W]+X]+Y]++ R~.+ + + C; + + + + C; + + + j1 68 y. + q 68 q + + + + + + ", "+ + + + + + + + + + + + + + + + + d_ 7` n .K>+c;+Z]+ ,+C$.r( [[ I1 x| 2r og }[ W_ }[ I1 V_ W3 J( W3 V_ W_ j} r( W3 x| |7 L2 `]+.;+ ^+LI Pi Qs [[ }[ }[ V_ x| l8 Pi f).Sq .^++^+@^+#^+$^+%^+&^+/2 *^+=^+-^+;^+>^+,^+'^+)^+!^+~^+{^+]^+]|.^^+/^+5e 67 q( }[ [[ [[ x| x| J1 um V3 Yv wl ql (^+_^+k]+-< Qs p8 |7 L2 V3 iT J1 NR 6J V_ o: :^+$] <^+[^+}^+|^+1^+2^+3^+4^+5^+6^+7^+8^+9^+0^+a^+T$+w| [[ *< =< }[ (j Ph 4: ry %< jm =< }[ [[ ;5 O:.W3 x| I1 }[ }[ =< }[ Uv I( a!._) %s F1 =< }[ Is J1 ql }[ K[ 2[ Jp aQ hO )Y w| wl wl [[ j} TC 2f b^+c^+d^+4_ e^+f^+g^+h^+i^+H'+j^+k^+l^+m^+n^+o^+p^+q^+r^+s^+<{+t^+u^+v^+w^+w^+x^+y^+z^+A^+B^+C^+D^+E^+14 ;5 [[ =< ^[ pm ( .O[ |2 43 3/ [[ I1 J1 ][ #x (A ,x AS F^+G^+H^+I^+yl ^[ [[ *< W_ j} r( W3 Is /%.L2 W3 V_ }[ V_ }[ V3 x| 'x -5 &< W3 }[ V_ I1 }[ }[ }[ }[ *< wl yl J^+K^+L^+M^+R~.R~.C; + + + + + + + + + + + 68 68 y. + q Yv.q + + + + + + ", "+ + + + + + + + + + + + + + + + + j. y. H tU.9=++'a r( [[ }[ x| V_ }[ }[ W_ }[ }[ }[ k} *< *< }[ W_ 'x og J@ |7 =< *< N^+O^+P^+Q^+/[ 17 [[ }[ }[ V_ |7 vm (j Gd /2.R^+S^+T^+U^+V^+<_ }j W^+X^+Y^+Z^+`^+ /+./++/+@/+#/+$/+o<.%/+G8.Fo YC +l ql I1 J1 wl J1 J1 J1 p8 um I1 wl w| &/+D{+_^+F{+6+.g} %6 DF V3 W_ V_ V_ GS 4e */+=/+-/+;/+>/+,/+'/+)/+!/+~/+{/+]/+^/+//+(/+_/+:/+)+7/+8/+9/+0/+a/+b/+M'+[{+t)+n~+N!+/!+w^+c/+d/+e/+f/+g/+h/+>{+i/+X3 }[ x| =< }[ H1 CB #$.j/+^& .H =< }[ }[ b% C} Dy %< %e 'P k/+l/+iK vy yl w| k} =< It IE L2 'a XB }[ W_ }[ I1 V_ <[ J@ V3 w| V_ }[ }[ *< V_ }[ }[ I1 I1 V_ =< I1 %x m/+n/+o/+p/+R~.R~.j. + + + + + + + + + + + y. y. y. + + y. + y. + + + + + ", "+ + + + + + + + + + + + + + + + y. C; q -, tU.q/+r/+79 dD l8 =< W_ =< W_ =< W_ }[ *< *< *< V_ J1 V_ }[ W_ j} r( <[ |7 w| w| w-.s/+t/+u/+QA 27 V_ =< W_ x| x| V3 gV v/+w/+x/+y/+z/+A/+z/+B/+C/+D/+E/+F/+G/+H/+I/+sY J/+K/+L/+M/+N/+O/+P/+R_ 4, gf ql w| T3 um yl rn yl w| wl :E %6 p8 Q/+R/+S/+T/+e} g} wl l8 wl [[ 4b vm U/+V/+W/+X/+Y/+Z/+`/+ (+.(++(+@(+#(+$(+%(+%(+&(+*(+=(+q} -(+;(+>(+17 jm [[ =< }[ bO g1.4: Ki F1 H1 =< }[ w| V3 &< &< r( [[ }[ V_ W3 <[ h].,(+a!.|G '(+q( [[ V_ Is w| 17 Nu )(+Z; 3j )V jm xl l8 :E I1 [[ j} TC =s 3e 3%.^= 1] }7.W&.!(+~(+{(+](+^(+/(+((+_(+:(+<(+[(+}(+|(+1(+2(+2(+3(+/!+%]+]!+4(+5(+,)+6(+7(+8(+9(+0(+<[ U3 V_ *< =< v| H1 9@.mT _*.J2 =< *< *< #6 #x a(+7G DF b(+c(+d(+e(+:E Xz %6 }[ W3 r( }[ <[ }[ V_ [[ [[ [[ x| [[ W_ U3 x| x| x| [[ =< V_ *< W_ W_ [[ V_ x| +6 _[ rn B:.f(+g(+F# y. y. C; + + + + + + + + + + y. + + + y. + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; . 68 h(+i(+j(+.l 6O H1 =< }[ YG *< x| }[ }[ }[ }[ V_ }[ V3 }[ V_ }[ x| [[ k} [[ J1 (@.0G k(+l(+m(+jG QA V_ }[ j} V_ =< V_ g'.n(+o(+p(+q(+r(+s(+t(+u(+v(+w(+x(+y(+z(+A(+B(+I/+u).C(+D(+E(+F(+G(+H(+>< / .xi 7E l8 yl :E yl vm %6 9W xl l8 to tC DB I(+J(+K(+Ov f} wl um p8 s8 r| C..L(+M(+N(+O(+P(+Q(+R(+S(+T(+U(+V(+W(+X(+Y(+Z(+`(+ _+._++_+#-.@_+#_+Qs Qs [[ k} x| s| aC HW lO xl H1 =< }[ I1 T3 (@.XB j} x| }[ k} W3 J@ %) e).}x $_+ja |[ [[ x| wl w| g} -5 =e @i 5c uf x| H1 DF %6 p8 [[ j} -5 h8 ;< EW .* ;G I1 AS dD %_+&_+*_+=_+-_+;_+>_+,_+'_+)_+!_+~_+{_+M!+M!+{_+]_+{_+^_+/_+(_+__+:_+<_+wv ([ zS 2Q W3 V_ V_ MP v| W_ w@.32 }] v| =< }[ W_ I1 um V3 :k to [_+-) }_+wM f} Yz :E }[ L2 W3 V_ V_ =< }[ j} V3 V3 j} V3 V3 j} V_ x| W_ j} j} x| =< }[ j} V3 |7 x| +6 km DF |_+1_+2_+,D.q y. + + + + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + j. R~.y. 3_+4_+5_+8W 6O r( =< YG L1 YG x| }[ }[ }[ }[ V_ W3 U3 W3 V_ }[ }[ }[ *< x| j} TC v9 K6 z5.%A %s SE V_ V_ -5 j} W_ V_ hN 6_+7_+8_+9_+0_+a_+b_+c_+d_+e_+|^+R)+f_+g_+h_+R].i_+j_+}]+k_+l_+oQ pe m_+n_+o_+t&+o8 vm )y DF }[ x| 2r -5 xl wl T3 p_+}#+q_++{+t| Yz wl p8 %x $< ~J p8 r_+s_+t_+u_+v_+w_+x_+y_+z_+U/ A_+B_+C_+&~+D_+E_+E_+F_+G_+H_+}:.Bj /A Qs w| W_ x| =s b(.2$.I_+J_+I1 =< *< }[ I1 T3 V_ V_ }[ }[ V_ |7 -s Uv Ph j/+( .q( H1 =< }[ J1 w| Qs V_ qh _ E,.r) J~ |$.dD tC p8 V_ W_ }[ (j Ph .P K_+6O dD V_ v| L_+M_+N_+O_+P_+Q_+R_+S_+T_+U_+V_+3(+$]+{_+{_+W_+X_+K'+{_+Y_+Z_+`_+ :+.:+M2 og *< *< =< }[ V_ J( K#.*< y&+(l I! v| =< }[ }[ }[ J1 wl jm wl nL.+:+}_+.a @H %< w| um I1 }[ }[ }[ W_ j} -5 Yv <[ -5 V3 L2 -5 j} x| W_ Is It V_ W_ j} -5 &< U3 W_ *< <[ J@ @:+#:+$:+XR.q j. + + + + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; R~.+ %:+&:+*:+&)+6O r( =< k} YG *< x| }[ }[ }[ }[ [[ r( &< r( =< W_ x| }[ }[ =< V3 <[ =:+%I -:+;:+K@ HI =< V_ j} V_ =< =< u| c~+>:+,:+':+):+!:+~:+{:+]:+^:+/:+#(+(:+_:+::+<:+[:+}:+|:+1:+2:+3:+4:+5:+6:+7:+8:+9:+O#.o8 DF }[ =< V_ Is yl l8 DF 0:+a:+b:+c:+d:+C..wl p8 yl M2 kn $b e:+f:+g:+h:+i:+j:+k:+l:+m:+n:+o:+p:+q:+r:+s:+t:+u:+#(+v:+w:+x:+y:+9&.iT h} YH 8$.z:+A:+z- lO Is H1 =< }[ *< }[ x| x| W_ }[ }[ V_ W_ |7 bO B:+C:+ D:+RC E:+l=+G1 I1 w| V_ }[ =< [[ (j Ph 4: _x >5 G1 l} HI F:+G:+H:+I:+J:+K:+L:+M:+N:+X_+$]+]!+N!+O:+P:+t)+Q:+R:+S:+T:+U:+V:+W:+X:+og k} [[ x| x| }[ V_ W_ v| }[ /;.e< %{ %< =< }[ }[ V_ J1 w| ^[ rn 7F oO Y:+Z:+N2 ,x w| J1 V_ V_ V_ }[ x| V_ Is V3 *< V_ }[ <[ V_ V_ W_ W_ j} j} V_ =< V_ j} V3 W3 *< [[ x| %6 `:+ <+.<++<+d_ y. + + C; + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; R~.y. %:+@<+#<+,P 3:.r( W3 W3 [[ [[ }[ }[ }[ }[ }[ W_ r( -5 j} }[ j} V_ x| }[ k} |7 Yv 0G $<+hy T,+kn F1 [[ x| [[ W3 <[ x| Is pg D>+%<+&<+t .*<+=<+-<+;<+><+,<+'<+)<+!<+~<+{<+]<+^<+/<+(<+_<+`r :<+<<+[<+}<+|<+1<+I$+vm DF }[ k} x| %6 %6 F9 )J 2<+3<+4<+5<+6<+4j w| um tC ln %{+7<+8<+9<+0<+a<+b<+c<+d<+e<+fj.f<+g<+h<+i<+j<+k<+l<+m<+n<+o<+p<+:; ,%.q<+l0 4j su 17.r<+'H 7^ .] F1 H1 =< }[ *< }[ }[ }[ *< }[ }[ [[ }[ &< rg f^ ah %| v| F1 =< *< YG 2r 37 V_ s<+&e $k +!.'7.um w| }[ *< V_ }[ YG (j aT _ ;}.Qs jm I1 H1 h..KK t<+u<+v<+w<+x<+y<+z<+A<+[{+B<+K'+C<+_(+D<+E<+F<+G<+H<+I<+J<+K<+)Y V_ x| }[ j} V_ x| }[ =< u| V_ %3 f% 1] %< =< }[ V_ }[ l8 tC H1 DF /A $A L<+D` g} ,x w| }[ k} <[ <[ V_ V_ wl |7 x| V_ x| x| V_ W_ j} j} x| W_ x| V_ <[ W3 [[ [[ V_ W_ j} 'x T3 M<+N<+$:+O<+P<+j. Q<+k. + + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; R~.y. R<+S<+T<+U<+3:.IE ]A J( x| V_ }[ }[ }[ }[ }[ }[ x| V_ V_ V_ -5 Is wl }[ *< [[ I1 g(.O>+6u ]y &x Qs wl wl w| L2 L2 I1 [[ (j V<+W<+X<+Y<+L~.Z<+-<+`<+,<+ [+,<+m<+.[++[+@[+#[+$[+%[+nc &[+*[+=[+-[+;[+>[+,[+'[+'y DF m8 |7 =< <[ L2 V3 yl %x :7.)[+![+~[++,+Xz %6 T3 J1 H2 {[+][+^[+/[+([+#~+_[+:[+<[+[[+}[+|[+1[+2[+3[+4[+5[+6[+7[+D_+8[+9[+0[+a[+`Y b[+y=.H7.yl _@.Or R'.-8 G1 H1 =< }[ *< I1 I1 }[ *< *< *< [[ &< sm ig 5* 9A Y_ F1 H1 [[ fq %E V_ p+.um c[+d[+(s 9f Is }[ x| *< }[ [[ <[ HU 47 aC t4 >s Qs ^[ %< $s ^Y e[+f[+g[+h[+i[+j[+k[+l[+_{+m[+u^+n[+j^+o[+p[+q[+r[+s[+t[+u[+v[+-Z um }[ wl Is -5 j} x| }[ =< u| [[ QE ^1 [1 v| =< }[ V_ V3 vm 'y 'a }[ 5e _g w[+x[+,x ^[ [[ *< V_ ]A J( W_ J1 %6 U3 W3 V_ I1 }[ }[ W_ Is -5 }[ W_ *< V_ ]A U3 wl V_ }[ W_ Is -5 V_ M<+N<+.<+y[+z[+H *. 8l C; + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + C; + + G A[+B[+C[+!g dD xl H1 &< }[ =< =< W_ x| [[ [[ [[ =< =< =< <[ <[ V3 [[ }[ *< k} }[ D[+E[+UJ F[+17 27 (@.(@.um %6 V3 V_ i ,s yl G[+H[+I[+J[+K[+L[+M[+N[+O[+P[+Q[+R)+R[+S[+P1 M~ 4R 7{ T[+U[+V[+W[+X[+Y[+Z[+`[+fM pg l8 Is j} W_ <[ }[ w| %6 Qs }+.}++}++,++,+to T3 w| pg @}+#}+$}+%}+&}+*}+=}+-}+;}+>}+,}+'}+fg Y< )}+!}+E~+~}+{}+{}+]}+^}+/}+(}+oW h> _}+v%.jn m} E- tp a} }a *< k} }[ *< }[ [[ [[ [[ }[ }[ =< V3 a> :}+h..&e F` rf 'a k} *< Is w| &x w| LR 9~.<}+l8 DF Is j} x| }[ [[ O:.jd Og [}+q< 3j F1 IV aG Rq }}+|}+1}+2}+3}+4}+5}+6}+7}+8}+9}+0}+a}+b}+c}+d}+e}+f}+g}+h}+i}+j}+HI M2 x| [[ l8 &< V3 [[ }[ =< v| W_ 1s k}+1] v| =< }[ V_ }[ l8 wl xl x| 4Z l}+m}+n}+%< jm =< }[ =< &< &< }[ [[ 'a &< r( [[ }[ V_ V_ =< &< &< *< [[ V_ [[ &< &< }[ [[ *< =< &< &< x| o}+p}+q}+r}+(D.(D.G 4. C; + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + C; + k. k. C-.s}+t}+u}+v}+H1 yl 'x IE }[ x| }[ j} V_ }[ &< r( r( W3 x| V3 L2 <[ V_ }[ }[ V_ *< Ps w}+x}+y}+gK *R PB Is I1 wl J1 }[ =< ,s o` z}+#].A}+B}+C}+D}+E}+F}+G}+1<.jk H}+I}+J}+JL K}+L}+M}+N}+O}+P}+Q}+R}+S}+T}+U}+V}+G1 j} -5 j} [[ V_ V_ x| J1 hb $b W}+X}++,+C..%6 p8 p8 {A G9 f} Y}+Z}+`}+ |+.|++|+@|+#|+$|+`{.b] 'i %|+&|+*|+=|+-|+;|+]}+>|+v] yr ,|+'|+)|+*{ %e c} U[ qh $7 :] W_ I1 }[ }[ [[ *< ;5 I1 w| }[ W_ *< L2 m= E+ !|+@| qm *< r( 'a wl [[ f} V_ Be 4T ~|+dk DF TC j} W_ }[ [[ dD HU w< E+.y/ c4 Yy BC {|+]|+^|+/|+(|+_|+:|+<|+[|+}|+||+1|+2|+3|+4|+5|+6|+7|+8|+9|+0|+a|+b|+hB K@ CF *< V_ W3 U3 W3 V_ }[ =< v| ;5 !1 b=.H9 'a V_ V_ W_ V_ J1 wl (@.*L iw c|+d|+e|+Qs jm =< }[ W_ 2r It V_ W_ r( -5 j} x| V_ <[ <[ V_ W3 U3 }[ V3 V3 W_ 2r It V_ W_ }[ V_ W3 W3 }[ f|+g|+h|+i|+BE. G.cr.7$ C; + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + C; + + + C; + + + + + + C; 7$ 4. C-.3_+j|+k|+Sf.H1 I1 V_ }[ I1 x| j} -5 V_ <[ O2 DW og J@ |7 Is -5 V_ x| I1 }[ =< W_ }r l|+m|+y}+%e %e V_ }[ DF :E um J1 w| 7M p8 n|+o|+p|+q|+r|+s|+t|+u|+k~.z..v|+w|+x|+XY y|+z|+W[+W[+A|+A|+O}+A|+A|+B|+C|+D|+E|+([ V_ J1 }[ x| =< W_ x| J1 &/+_1 G0 F|+E..4j w| yl %x m8 U_ ,x G|+H|+I|+J|+K|+L|+M|+N|+O|+P|+Y/+G] Q|+f_+f_+R|+S|+T|+U|+V|+W|+X|+Y|+Z|+`|+ 1+eC 3< 7! [+.A+.qm I1 p8 w| [[ [[ ;5 HU H1 T3 }[ W_ j} HE e} 9* ^g @a H9 #6 og -5 V_ =< v| }[ &] Wk .1+yl x| V_ k} *< I1 w| rm HU 3G |L g8 /& H1 xl +1+==.@1+#1+$1+%1+&1+*1+=1+-1+;1+>1+,1+'1+)1+!1+~1+{1+]1+^1+/1+(1+** rd )4 U3 W_ W_ V_ *< *< *< *< =< F1 C1 _1+C' Q@.>z 'a }[ =< }[ I1 tC 9_.dW :1+<1+&; [1+%< jm =< *< =< V_ V_ [[ W_ x| V_ V_ *< k} 2Q U3 W_ W_ }[ }[ L2 L2 W_ V_ V_ V_ W_ }[ J1 }[ x| }[ }1+|1+11+21+AE.31+}r.C; C; y. + + + + + + + + C; + + + C; + + + + + + + + ", "+ + + + + + k. 7$ k. + + + + + + + C; 0+ *. C-.41+51+61+71+l8 I1 =< [[ x| [[ V3 &< }[ *< ;5 'a I1 V3 W3 V_ j} V_ x| }[ }[ =< }[ #z 81+91+01+%e dD =< x| wl p8 um wl yl Ov S_ a1+b1+c1+d1+e1+f1+g1+h1+i1+j1+k1+l1+m1+n1+L}+A|+A|+A|+A|+N}+o1+A|+p1+q1+r1+s1+t1+#A =< [[ U3 pn Is j} [[ wl u1+v1+w1+x1+7E y| J1 x'+uo 25.y1+z1+A1+B1+C1+D1+E1+F1+G1+H1+I1+J1+K1+L1+M1+N1+O1+P1+5] Q1+R1+S1+H{ T1+P|+U1+V1+W1+d> fV `e [+.A+.:] V_ J1 'a +6 ;5 *< ;5 V3 [[ }[ x| V_ Is pJ 'U |G X1+v*+zx G1 Is k} =< v| =< b=.u/ f] F1 [[ wl w| wl J1 w| -< HU d~.Y1+Rq [[ ][ H7.Z1+`1+ 2+.2+L/+U{.+2+@2+#2+$2+%2+&2+p~.*2+=2+l!.-2+;2+>2+,2+'2+)2+!2+W> lj J@ j} j} =< W_ x| }[ }[ =< dD ;5 |_ V^.{1 o^ H1 V3 =< }[ I1 wl um R1.~2+{2+&; ry %< jm [[ J1 I1 M2 L2 Is V_ V_ W_ x| }[ J1 |7 ;5 Is j} =< [[ U3 V3 J1 M2 U3 W_ [[ x| }[ V_ =< *< ]2+^2+/2+(2+AE._2+h*+h*+cr.C; + + + + + + + + + k. 7$ k. + + + + + + + + + ", "+ + + + + + k. 8l k. + + + + + + + C; H 7$ H :2+<2+[2+hB H1 H1 =< }[ *< V_ |7 U3 W3 [[ =< [[ V_ V_ V_ x| x| x| }[ *< }[ [[ }[ L5.}2+|2+12+F1 G1 [[ I1 }[ x| w| p8 RW J, =| 22+32+42+52+62+72+82+92+en 02+f= a2+W[+W[+A|+N}+A|+A|+A|+A|+A|+N}+b2+c2+d2+e2+O/+pg V3 V3 U3 |[ -5 Is %6 wl wc. $3+Yv -5 j} }[ j} V_ wl }[ =< H1 =< I! KJ s4 V6 G1 og k} }[ I1 wl ~Y p8 %3+{2+&; _x Qs jm [[ J1 p8 U3 pn -5 'a W3 V_ k} }[ I1 [[ j} It j} *< i8 V_ w| um L2 L2 x| j} j} W_ [[ x| <[ ]2+&3+*3+=3+rU.68 }r.h*+R~.j. + + + + + + + + + k. 8l k. + + + + + + + + + ", "+ + + + + C; + C; + C; + + + + + C; + C; y. j. -3+;3+>3+3~+0>+r( =< V_ k} I1 J1 *< *< W_ W_ [[ V_ J1 }[ V_ V_ =< W_ W_ J1 w| }[ }r 8= ^: ,3+4b ^[ w| V3 j8 <[ V_ }[ sJ '3+)3+K}.!3+a!+~3+{3+]3+^3+/3+Y< f~+(3+_3+W[+A|+A|+N}+A|+A|+A|+A|+A|+N}+A|+:3+<3+[3+}3+|3+%x DF %6 wl J1 DF )y wl 13+23++= 33+~o WF o8 %e ;@.43+53+63+73+83+93+03+a3+b3+c3+d3+e3+f3+g3+h3+i3+j3+k3+l3+l3+m3+n3+o3+p3+q3+J1+r3+s3+t3+u3+v3+w3+[D p4 /& I1 'y vm l8 [[ }[ W_ Is -5 J1 I1 xl p8 xW x3+y3+z3+A3+xC ^[ w| }[ =< H2 j8 f% n>+[1 v| =< x| Is -5 V_ =< u| J1 )'+B3+b^+37 Is [[ C3+2F D3+E3+F3+G3+H3+I3+J3+K3+L3+M3+N3+O3+P3+Q3+R3+S3+T3+U3+V3+W3+X3+Y3+Ps I1 j} V_ V_ -5 j} x| }[ =< 'a V_ +a x8.4: a} K1 *R V_ W_ }[ w| um p8 Z3+jK ME `3+yc ,x x| }[ V_ W_ V_ It V3 U3 *< k} *< }[ }[ [[ V_ [[ k} -5 j} [[ V_ *< }[ =< 'x It V_ =< |7 vm 4+.4++4+@4+n .a+ j. R~.y. C; + + + + + + + + C; + C; + C; + + + + + + + + ", "+ + + + + + + + + + + + + + + + C; + d_ 8$ #4+$4+%4+&4+/%.0L V3 <[ *< V_ [[ [[ [[ Is Is &< W3 }[ V_ <[ ]A &< 2r V_ x| [[ }[ 7M N .*4+=4+,x ^[ T3 x| <[ j} -4+Zy ;4+>4+,4+'4+)4+!4+~4+{4+g{+]4+^4+R].kq /4+(4+W[+N}+N}+A|+A|+A|+A|+A|+A|+N}+A|+c2+_4+:4+<4+[4+}4+:E p8 yl 'y 'y H1 TC +'.|4+14+24+34+HI |7 44+V$.54+64+74+84+94+04+a4+b4+c4+d4+e4+f4+g4+h4+xe 5 .i4+j4+k4+l4+m4+n4+o4+o3+p4+q4+r4+s4+t4+u4+v4+w4+*w ,n l 'x %< %6 T3 [[ W_ =< W3 V3 p8 xB x4+y4+z4+A4+B4+C4+z4+V9 17 J1 [[ =< v| W3 )z Q$.[1 u| =< [[ ;5 |[ M2 r( yc }[ hK D4+E4+T_ q( I1 =;.H<.:> F4+G4+H4+I4+J4+K4+L4+M4+[~ N4+O4+P4+Q4+R4+S4+T4+U4+V4+W4+X4+Y4+H5.8$.V_ =< V3 &< V3 =< W_ W_ j} YG Z4+`4+S<.,l K1 K1 k} x| [[ +6 5#.I1 5+.5+j5 D` v| Xz x| V_ *< V_ V_ V_ V3 <[ *< V_ x| x| =< W_ J( &< It j} V_ W_ 8! }[ V3 U3 H1 Is V_ [[ wl p8 +5+@5+#5+$+ ~D.;% 7$ y. C; + + + + + + + + + + + + + + C; + + + + + + + ", "q q y. y. + + + + + + + + + + + + + + -, 8=+$5+%5+&5+*5+xl 0L &< U3 *< [[ *< ;5 I1 'x TC ;5 J( *< V_ <[ J( H1 og }[ =< [[ }[ 6J 7j =5+;f %< ,x w| w| V_ 3r 5j -5+;5+>5+,5+'5+)5+!5++^+E(+~5+{5+]5+^5+/5+(5+_5+W[+A|+N}+A|+A|+A|+A|+A|+A|+:5+<5+[5+}5+z{+|5+15+25+|'.Q1.][ %x :E Is TC Tv |4+35+45+s&+O&.um B6.55+65+75+85+95+05+a5+b5+c5+d5+e5+N}+Q}+f5+g5+h5+i5+j5+k5+l5+m5+n5+o5+p5+q5+r5+L[+s5+t5+u5+v5+w5+x5+*E ub ;E 0L ,x w| T3 w| J1 'a ]H {J xg sy y5+z5+A5+B5+j~.3^.C5+2t DF K@.=< =< u| V_ &; g |] u| =< V_ W3 M2 to 'a yc V_ I[ hK D5+`-.M2 *< }r o3 E5+Qg F5+G5+H5+I5+J5+K5+L5+M5+N5+O5+P5+Q5+R5+S5+T5+U5+V5+W5+X5+ty 44+h1.J1 =< |7 U3 W3 V_ }[ &6 j} J6.V@ r- $f ~1 U_ F1 =< }[ [[ +6 |$.wl Y5+Z5+6i e^ HI Xz |7 8! k} k} }[ }[ V_ V_ *< [[ I1 j} }[ J( CF &< 'x V_ x| 2Q q7 }[ V3 L2 |7 [[ W_ Is YH I1 `5+ 6+.6++6+@6+d_ k. + + + + + + + + + + + + + + k. k. + + + + + + + + ", "S(.*-.y. + + + + + + + + + + + + + + + j. 8$ #6+$6+]&+%6+H1 r( I1 wl [[ [[ ;5 +6 l8 T3 J1 *< W_ W_ W_ V_ W_ I1 I1 }[ =< [[ I1 +'.mE &6+*6+o+.,x p8 p8 p8 f} =6+-6+;6+>6+,6+'6+)6+!6+~6+{6+]6+@[+^6+/6+(6+_6+O}+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+:6+[5+<6+[6+}6+|6+G3 d:+ru sC to rn J1 um Tv +p 16+26+36+^[ )Y I&.#- 46+56+66+76+86+p$.96+06+a6+b6+:6+A|+Q}+c6+c2+d6+e6+f6+g6+h6+i6+j6+k6+]} l6+m6+n6+o6+p6+q6+r6+s6+/}.t6+$;+py ^[ J1 um tC I1 um /%.Is E- u6+v6+w6+x6+y6+z6+U(.U7 F1 fB 8W #6 =< >5 -5 =! FE }1 u| =< k} I1 I1 I1 w| g} -5 lI 12 @r F1 x| k} G1 *j A6+B6+C6+D6+E6+F6+G6+H6+I6+J6+K6+L6+M6+N6+O6+P6+Q6+R6+S6+T6+U6+V6+W6+rn I1 [[ =< W_ W_ *< k} W_ 'x c*.Pi X6+QY Y6+/[ g} [[ }[ [[ *< 'a T3 %^ /= +i .] G1 pg ]A J( W_ [[ V_ J1 }[ }[ *< x| j} -5 &< CF W3 }[ V_ J1 M2 CF W_ [[ k} }[ V_ *< W_ 2r -5 %x Z6+`6+ 7+.7+co.cP.C; C; + + + + + + + + + + + + + 7$ 8l C; + + y. + + + y. ", "68 q y. + + + + + + + + + + + + + + j. + G +7+@7+#7+$7+H1 r( w| H1 +6 ;5 *< *< }[ [[ =< [[ Is 'x j} [[ k} [[ wl w| Yv U3 J1 t8 mE 91+%7+`-.%< qR Tv w;.&7+*7+=7+-7+YU ;7+>7+,7+'7+)7+gC !7+~7+{7+]7+ 4.^7+W[+o1+A|+A|+A|+A|+A|+A|+A|+A|+A|+M}+[5+Q}+/7+(7+_7+:7+1&+<7+)Y (@.l8 UH ,6.C*+[7+}7+|7++,+,x TC d>+17+27+37+47+57+67+77+87+97+07+a7+b7+A|+c7+d7+e7+f7+g7+$M h7+i7+j7+&/ &^+r{ k7+l7+m7+n7+o7+q5+(/+~6+p7+q7+r7+s7+t7+x~.u7+v7+w7+(c 5i x7+0R y7+z7+A7+B7+C7+D7+E7+}y hO bs v}.to j} hN ln ;Z 11.F7+>5 =< *< V_ l8 :E I1 i&+c*.CI T=.S_ %< w| V_ -5 1#.G7+H7+I7+J7+K7+L7+M7+N7+O7+P7+Q7+R7+S7+T7+U7+V7+W7+X7+Y7+Z7+`7+ 8+i} |7 [[ W3 &< Is j} [[ w| Is -5 og ;F ^] (l O' u| F1 =< }[ *< [[ 'a }[ 8W O~.+i e> J2 hO V_ l8 j} ;5 |7 }[ V_ }[ }[ W_ V_ Is V3 W3 *< =< x| [[ Yv <[ Is V_ [[ V_ k} *< [[ ;5 Yv )J .8++8+@8+#8+*-.68 C; + + + + + + + + + + + + + + k. k. + + + + 68 68 y. + ", "+ + + + + + + + + + + + + + + + + j. + y. $8+%8+&8+*8+H1 r( w| H1 +6 ;5 x| }[ }[ x| <[ x| 'a og r( [[ }[ }[ }[ J1 L2 U3 yl h(.=8+-8+;8+f} w>+4j xg T>+>8+,8+'8+)8+!8+~8+{8+]8+k_+^8+/8+(8+_8+:8+)4.<8+[8+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+L}+}8+|8+18+28+38+48+58+68+78+6<+88+98+08+w9 a8+b8+c8+Xz 4j um *j d8+cz.<&+p8 'x U_ pg e8+}7+n> f8+g8+A|+h8+i8+x>.j8+#-.k8+l8+m8+n8+o8+p8+q8+r8+s8+t8+u8+v8+w8+x8+c<+y8+z8+A8+B8+a-+C8+D8+E8+F8+L<+G8+1)+H8+/n I8+t'.J8+K8+L8+M8+N8+-5 H1 vm m8 'a }y U9 ^1 &e jN v| =< }[ V_ V3 to V3 YB oo CI T=.S_ %< i} ,x 17 iU +} O8+P8+v).Q8+R8+S8+T8+U8+V8+W8+X8+Y8+Z8+`8+ 9+.9++9+@9+#9+$9+Is ^[ J1 j} L2 |[ -5 j} x| %6 'a r( U3 m= ]V 0D ;H v| F1 =< }[ *< x| Is k} ,a /u +i |_ gl *R J1 J1 TC &< J( *< V_ }[ }[ }[ x| wl w| V_ }[ *< }[ W_ V_ Is og 'a r( x| =< }[ V_ W3 U3 o8 %9+&9+*9+=9+&-.cP.R~.C; + C; + + + + + + + + + + C; + + C; + + + 68 68 y. + ", "+ + C; + + + C; + + + + + + C; + + + C; y. y. -9+$6+;9+%6+H1 r( w| T3 }[ =< <[ O2 r( wl U3 W_ x| J@ <[ V_ }[ *< V_ V_ =< V3 %x @}+>9+,9+'9+i&+)9+i(.!9+~9+{9+]9+^9+/9+(9+_9+:9+<9+[9+}9+|9+19+29+39+VS 49+M}+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+}8+59+69+79+89+99+09+a9+b9+c9+d9+)7.e9+f9+g9+h9+i9+I$+wl w| tC h} ql p8 J1 =s p8 j9+k9+}M l9+A|+A|+m9+n9+o9+p9+q9+r9+s9+t9+l_.u9+v9+w9+x9+y9+z9+[^.A9+B9+C9+D9+E9+F9+G9+2^ H9+I9+J9+K9+L9+mA M9+H8+N9+5^.O9+P9+c3.@l Q9+>5 Jt i8 }[ }[ x| H1 b% T7 .,+Gi d4 J2 =< k} W_ W_ x| U3 gl p8 R9+T=.fU ^[ i} um 7f me S9+T9+U9+V9+W9+X9+Y9+Z9+`9+ 0+.0++0+@0+#0+$0+$0+%0+&0+*0+=0+qm *R xl L#.-5 L2 J( *< V_ <[ j8 Yv k} W_ c} d] Lu I| HI H1 =< *< *< [[ r( }[ -0+;0+!= .] F1 dD V_ V_ um }[ W_ =< W_ W_ W_ =< V_ V_ I1 I1 }[ *< }[ W_ 'x IE qg &< -5 V_ W_ }[ J1 }[ W_ x| 4+>0+,0+S'+co.@6+br.C; C; + + + + + + + + + + + + + + + + + + y. y. y. + ", "+ + + k. 7$ k. + + + + + + + + 7$ 7$ C; + -, 8$ $5+'0+)0+H)+Zz }[ [[ [[ [[ [[ *< ;5 I1 xl H1 r( x| |7 |7 V_ *< V_ V3 W3 j} 'a :k !0+~0+{0+]0++,+Zy ^0+/0+(0+_0+:0+<0+[0+}0+|0+10+20+&|+30+40+50+60+70+80+90+L}+A|+A|+N}+N}+o1+o1+N}+o1+00+N}+A|+W[+A|+a0+b0+c0+d0+e0+f0+g0+h0+i0+j0+k0+l0+m0+n0+o0+p0+O#.pg Is 'a yl I1 'x J1 @{+q0+r0+s0+t0+u0+v0+w0+O}+m9+b7+x0+y0+z0+A0+B0+h) &7 C0+D0+E0+F0+G0+H0+I0+}j ~8+J0+K0+L0+X(.1=.M0+N0+O0+P0+Q0+R0+S0+T0+U0+V0+W0+X0+Y0+s= E1 ql Is r( W_ =< =< =< u| 1] ZE dr 8, 79 jm [[ x| j} j} V_ W3 v| Is Z0+12 =j Ov DF ~> 4T `0+ a+.a++a+@a+#a+$a+O}+%a+W[+&a+*a+=a+-a+;a+>a+,a+'a+)a+!a+~a+{a+I&.EF J1 (@.}[ W3 wl [[ *< <[ x| w| wl Uv -* }x O' W_ l8 [[ }[ }[ [[ H1 to S~ ]a+,n oy F1 H1 =< [[ x| U3 |[ Is V_ V_ Is &< W3 *< V_ I1 I1 }[ }[ W_ j} }[ W3 r( j} V_ W_ }[ }[ V_ W3 L2 B~.[g ^a+/a+t5.b+,b+'b+)b+!b+#+ d_ q + q q + + + + + + + + + + + + + + + + + + + + ", "+ + C; + C; + C; + + + + + + + C; C; C; j. + j. A[+~b+{b+]b+s7.r( 'x og J@ W3 k} *< I1 tC J1 V_ }[ }[ }[ W_ W_ [[ k} x| }[ *< *< ,U ^b+g>+/b+(b+_b+:b+c+,c+'c+:=.68 y. d_ Yv.y. + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + C; + + + C; . q )c+!c+%4+&4+dD r( V_ r( <[ |7 V_ }[ }[ [[ x| x| *< *< x| j} Is &< W3 *< [[ [[ V_ N2 ~c+{c+]c+KH ^c+/c+(c+_c+:c+d+,d+'d+)d+:=.Ov.-, C; q q y. + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; . n .$5+!d+*:+~d+og 'a ]A W3 k} V_ I1 }[ *< }[ *< }[ }[ *< x| Is -5 &< U3 }[ J1 [[ }[ 6e {d+]d+^d+/d+(d+_d+:d+ qd+rd+67 *R Is to DF sd+;@.ty td+ud+vd+wd+[5+%a+N}+A|+O}+A|+o1+A|+Vb+w0+|8+i8+Ws [G xd+yd+zd+92+Ad+Bd+Dc+ub+ub+J_.Cd+Dd+Ed+Fd+Gd+Hd+Id+Jd+Kd+L* Ld+Md+Nd+Od+Pd+Qd+d>+I&.I1 }[ W_ }[ *< }[ V_ W_ v| J+ Rd+J' Sd+{[ H1 W_ U3 W3 j} It J1 ,x ,6.%>+e#.nv H' Td+g<.Ud+Vd+:^.Wd+Xd+w(+O0 M}+A|+N}+A|+A|+o1+A|+o1+Yd+Zd+`d+ e+.e++e+@e+#e+$e+%e+&e+Is W_ j} -5 &< U3 }[ =< J1 YH mf k} Oa Cg 2$.VT v| [[ }[ =< jm tC 1Q *e+Q;. b GS G1 J1 I1 [[ ;5 ;5 w| [[ }[ j} V_ &< _[ ;5 [[ }[ }[ }[ }[ }[ }[ }[ V_ <[ J( &< og }[ =< =< }[ _@.E4 =e+-e+9%.;e+L/.0+ j. + + y. + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; cr.y. W!+X=+>e+Wz 6O r( ]A J( x| V_ }[ }[ *< }[ *< I1 I1 }[ I1 wl }[ }[ }[ I1 V_ [[ I1 rU ,e+'e+)e+!e+~e+{e+]e+7L ^e+/e+(e+_e+E(+V/ :e+i je+ke+:m ;7+le+me+ne+c7+A|+A|+O}+A|+o1+O}+A|+W[+N}+oe+pe+qe+re+_X se+te+0*.ue+ub+ve+we+xe+ye+ze+Ae+Be+Ce+De+Ee+Fe+Ae+I}+Ge+He+Ie+Je+m} `-.|7 [[ x| W_ }[ *< I1 J1 wl c-..f @a .B +* Qc 'a =< *< *< =< J1 wl i} QP 7|.e#.o3 eN Ke+Le+Me+Ne+:^.Oe+Pe+**.Qe+Re+M}+M}+A|+A|+A|+N}+A|+W[+Se+b/.Te+Ue+Ve+R].We+Xe+R*.c'.G1 =< x| }[ }[ }[ *< W_ 'x ;@.@!.5@.Ye+T& 12 /] 5#.[[ J1 w| jm )y jQ.1F Im 5|.gl }y J1 w| [[ uJ +B }[ [[ j} -5 V_ [[ I1 [[ }[ }[ }[ }[ }[ }[ }[ }[ }[ V_ x| }[ }[ }[ W_ =< }[ 17 Uj Ze+`e+ f+5@ xo.0+ C; + + + + + + + + + + + + + + + + + C; + + + C; ", "+ + + + + + + + + + + + + + + + + j. R~.y. .f++f+#7+@f+dD p8 H1 &< }[ =< =< =< [[ x| W_ [[ V_ }[ }[ x| x| =< V_ V_ }[ =< }[ rg #f+,9++)+$f+.} (P %f+&f+*f+=f+-f+;f+>f+,f+'f+)f+!f+~f+{f+]f+W[+ b+ob+^f+/f+(f+_f+:f+<.dQ .P Gf+Hf+J1 HE =< k} [[ 'a _[ HI {[ E).v*+If+Jf+=$ _8 i~.Kf+Lf+Mf+Nf+0(.mQ Of+A|+N}+L}+A|+O}+O}+h8+A|+Q}+Pf+Qf+Rf+Sf+Tf+Uf+Vf+Wf+yw UH %< V_ W_ W_ =< V_ V_ W_ V_ og %e =< 49 Xf+T=.:] ln x| DF :E ^[ l8 YT Yf+AM b 4b SE l8 %6 wl V3 &< V_ =< V3 &< V3 =< [[ [[ }[ }[ }[ }[ }[ }[ x| x| x| V_ V_ =< W_ W_ }[ *< [[ ql ,a Zf+`f+GR S. d_ k. C; + + + + + + + + + + + + + + + + + + 7$ 7$ C; + ", "+ + + + + + + + + + + + + + + + + j. R~.y. g+.g++g+@g+yl xl 'x IE }[ [[ }[ &< }[ V_ j} <[ W3 V_ k} }[ *< }[ }[ *< }[ [[ }[ L5.#g+m|+$g+%g+&g+*g+[J =g+-g+;g+>g+,g+'g+)g+!g+Rb+[<.1+ ~g+W[+W[+ b+ob+{g+Yd+]g+^g+/g+(g+_g+:g+h+s{ R9 ,h+q1+W[+A|+A|+ b+bc+'h+)h+!h+~h+{h+]h+^h+/h+(h+_h+:h+.Uh+Vh+Wh+Xh+Yh+Zh+`h+ i+.i++i+N8.*E @i+#i+E[ $i+%i+&i+*i+W[+c7+=i+c2+-i+;i+>i+,i+'i+)i+!i+6c+~i+{i+]i+^i+/i+(i+_i+:i++i} w| J1 x| j} r( L2 |7 V_ V_ x| |7 W3 &< j} V_ W_ }[ }[ x| }[ r( I1 x| }[ *< V_ }[ }[ =< [[ f} >i Gi+Hi+8=+_=.+ + + + + + + + + 68 [r.H k. + + + + + + + C; + + + C; ", "+ + + k. 8l k. + + + + + + + + + + + d_ &-.n .Ii+Ji+Ki+Th+'a 'a =< }[ *< V_ x| W_ x| V_ x| =< ;5 +B YG W3 2Q V3 V_ x| j} Is wl DB Li+Mi+Ni+Oi+H[.Pi+ji Qi+Ri+Si+cP Ti+5!.Ui+Vi+Wi+Xi+Yi+Zi+W[+Wb+`i+ j+.j++j+@j+#j+$j+%j+cc+g8+&j+*j+=j+-j+;j+>j+,j+'j+)j+!j+~j+{j+WQ jm wl to C..ef ]j+^j+/j+9s O>.(j+&f U8 $J _j+:j+Bl .mj+Mv {'.nj+oj+pj+qj+rj+sj+tj+uj+%a+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+W[+5- vj+~] wj+vN xj++6 }[ =< }[ }[ V_ x| l8 7P eX p8 ME yj+=0 }7 [[ *< [[ rn *j zj+Aj+Bj+E4 ^[ ^[ w| I1 }[ x| V_ k} J1 x| W_ 2r ;5 CF &< It V_ W_ }[ }[ *< x| wl I1 [[ 2y EF }[ }[ }[ *< [[ g} oE Cj+Dj+dp n .+ + + + + + + + + 68 [r.xo.k. + + + + + + + + + + + + ", "+ + C; + C; + C; + + + + + + + + + + j. cr.q qr.Ej+Fj+Gj+H1 r( =< V_ k} J1 %6 U3 W3 V_ I1 }[ [[ }[ x| V_ }[ [[ [[ w| 'x It V_ v$.Hj+Ij+Jj+Kj+Lj+Si+LW Mj+Nj+.'.Oj+Pj+Qj+rS Rj+Sj+Tj+Uj+Lg+m9+Vj+Wj+Xj+Yj+Zj+`j+ k+.k++k+@k+#k+$k+%k+w0+^7+&k+*k+=k+-k+;k+>k+,k+'k+EF x| }[ tC %6 )k+!k+~k+{k+#-.6!.(%.]k+Zl ^k+5O /k+*P (k+_k+g^.:k+G9+(#..Ok+Pk+Qk+Rk+Sk+Tk+Uk+%a+A|+Vk+Wk+Xk+Yk+Zk+`k+ l+.l+&a++l+@l+#l+$l+%l+&l+*l+=l+-l+;l+>l+,l+'l+%K EF =< 4b DF )l+!l+~l+{l+6b ]l+^l+/l+(l+z A5 x- ZU ;7+pl+m+,m+nu =< =< v| uo 'm+%T )m+!m+~m+{m+]m+^m+/m+(m+_m+:m+.!1..>.[m+}m+|m+1m+b2+W[+W[+W[+Vb+2m+3m+4m+5m+6m+7m+8m+9m+0m+am+bm+cm+dm+A|+N}+mf+em+fm+gm+hm+1^.Cd+im+jm+(_.km+lm+mm+nm+om+pm+w| yl vm to J1 2r V_ W_ }[ *< [[ J1 L5.qm+0i+@Q rm+W_ }[ }[ I1 V_ =< *< jn Qa HX sm+tm+um+t).vm+wm+2:+xm+ym+zm+ea+:5+<5+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+Am+Bm+Cm+Dm+Em+eD 'a }[ =< }[ }[ V_ J1 V_ =< F1 }[ +A k>+7! pg x| U3 wl BS Fm+F< Gm+Hm+lu ^[ O&.*5 @6 *< [[ W3 U3 W3 *< W3 }[ J1 J1 x| }[ }[ }[ }[ }[ }[ }[ }[ V_ }[ }[ }[ V_ }[ }[ W_ V_ 17 rl Im+Jm+6@ #+ C; + + + + + + + + + + + + q Yv.q + + + + + + + + k. ", "+ + + + + + + + + + + + + + + + y. + C; y. Km+Lm+Mm+OV hO 'a I1 wl x| [[ x| V_ V_ *< k} k} [[ x| x| k} W_ I1 p8 I1 tC q( Ze Nm+Om+Pm+Qm+Rm+Sm+Tm+1-.Um+7U Vm+E/+Wm+Xm+Ym+v( Zm+`m+ n+5c+ea+b7+.n++n+@n+#n+$n+%n+18+&n+*n+=n+-n+;n+>n+,n+'n+)n+!n+~n+{n+]n+^n+_].[[ =< &< m8 /n+(n+Sf Zm C5 @} _n+:n+o a: H1 'a =< }[ J1 }[ x| [[ =< F1 =< I[ Y1 Y- ][ p8 }[ [[ o+.77+Dn+~# x&+lu 4j C..yl I1 }[ =< V_ *< *< *< U3 &< It V_ x| }[ }[ }[ }[ }[ }[ }[ *< x| x| x| *< }[ }[ }[ W_ V_ Pi 7f Cj+En+Fn+3. k. + + C; + + + + + + + + y. + y. + y. + + + + + + + C; ", "+ + + + + + + + + + + + + + + + + d_ 7` 68 Gn+Hn+In+Jn+lm r( w| H1 +6 ;5 =< W_ W_ [[ wl |7 ;5 -5 j} =< k} [[ wl T3 Kn+]A Ln+Mn+Nn+On+Pn+m) Qn+Rn+ki ~1.Sn+Tn+Un+Vn+Wn+Xn+Yn+Zn+`n+Re+~g+L}+ o+.o++o+@o+#o+$o+%o+&o+*o+=o+-o+;o+>o+,o+'o+)o+!o+~o+{o+]o+^o+/o+]o =< x| wl %6 |'.I$+I2 rU 9D $z nJ 'g 4< (o+_o+:o+p+,p+'p+)p+[T l} 'a 'a T3 w| J1 J1 J1 I1 to C..Xz pg &5 J~ J2 L .d} 35.!p+~p+{p+]p+^p+/p+(p+_p+W[+W[+c2+:p+ d4 -j q: x| F1 J@ pp+qp+ZE v{.^[ H1 I1 Is X3 V_ }[ *< }[ J1 V_ [[ x| *< }[ }[ }[ }[ }[ *< }[ }[ x| 14 14 }[ W_ }[ }[ }[ }[ =< F1 )g rp+sp+o .pr.cr.7$ C; + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + y. + C; + y. + C; + + y. [r.l*+tp+up+vp+wp+sm *5 w| T3 p8 [[ V_ V_ W_ 2r -5 Yv }4 J@ W_ V_ I1 V_ W3 j8 ,U v< xp+yp+zp+Ap+Bp+Cp+Dp+Ep+Fp+Gp+Hp+Ip+Jp+Kp+Lp+e1 q+z|+90+,q+'q+)q+!q+~q+{q+]q+^q+o1+dm+A|+A|+A|+N}+Re+/q+(q+&&._q+vc :q+.3q+t1 k6+V{.4q+:^.5q+6q+7q+W[+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+5g+,. sm+8q+9q+0q+aq+b'.}[ }[ }[ W_ r( -5 J1 jm T3 y+.5: J' y4 pg jm w| %< j8 bq+cq+ZE v{.4j %x l8 XB -5 J1 I1 }[ }[ V_ V_ w| wl x| k} W_ W_ =< V_ k} I1 I1 x| *< }[ *< W_ }[ I1 }[ }[ =< H1 H7.dq+eq+fq+E&.. C; C; + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + q 68 ;% 7$ C; + + y. + ;% 6@ gq+hq+iq+kr q( H1 x| [[ [[ U3 U3 *< [[ V_ J1 }[ ;5 &< r( [[ V_ V_ W_ W3 rk jq+kq+lq+mq+nq+oq+pq+qq+rq+sq+tq+uq+vq+wq+xq+I/+yq+oT zq+W[+z|+ b+P}+%o+Aq+Bq+Cq+Dq+Eq+cc+Fq+Gq+Hq+Iq+^f+Jq+Kq+Lq+Mq+Nq+Oq+Pq+r+,r+'r+rY )r+!r+~r+8j {r+]r+6)+Is j} V_ W3 8! }[ |7 <[ h].T~ )|.DC Yz 17 }[ |7 w| ][ HI c} ^r+@Q /r+(r+_r+:r+:~ +dD =< &< H1 kv 4e U3 8W (Z JQ 8r+]H 4b w| C..*2 9r+0r+ZE v{.^[ ^[ J1 'a V3 V3 V_ }[ =< W_ ]A H1 'x V_ W_ j} Is &< W3 *< V_ }[ }[ x| }[ }[ }[ x| }[ }[ }[ =< l8 hP ar+br+cr+dp 7` + + C; + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + q 68 L/.7$ C; + + + + ;% 6@ dr+er+fr+(1 H1 H1 2r r( W3 pn pn |7 r( 'a wl x| 2r It j} W_ |7 W_ %e ql gr+hr+ir+jr+z9+kr+IH Xw lr+mr+nr+)<+or+,<+pr++]<.>s+Vl 4b V_ og 17 7M o+.~3 ,s+'s+)s+!s+~s+{s+]s+^s+/s+(s+_s+W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+:s+ 1s+r%.Z&.m[ el I1 H6.2s+3s+4s+F-.QV ^[ ^[ wl %6 j8 <[ V_ [[ YG uJ CF &< IE }[ x| 2r -5 &< U3 }[ k} }[ }[ }[ #6 b% #6 }[ }[ }[ }[ =< I1 V_ 5s+6s+7s+dp 68 k. + + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + y. + y. C; j. C; + + + + -, 6@ +7+8s+9s+Y/ 5#.H1 'x IE J@ IE og L2 &< -5 V_ x| [[ V_ V_ V3 to I1 *R um 0s+as+bs+cs+k~.ds+es+Hs LA fs+gs+vq+hs+is+js+J,.ks+ls+o/ ms+A|+N}+A|+ns+$a+os+ps+qs+rs+q1+%o+ss+ts+us+vs+ws+xs+ys+zs+As+Bs+Cs+Wj+Ds+Es+Xz um It j} x| I1 }[ V_ x| }[ }[ I1 x| *< }[ x| j} -5 Is wl }[ }[ V_ w| wl 67 o=.I< Fs+Gs+Hs+Yc+Is+Js+Ks+Ls+Ms+Ns+Os+Ps+Qs+Rs+Ss+Ts+Us+Vs+Ws+Xs+Ys+%r+A|+N}+A|+7q+Zs+`s+ t+fl+.t++t+W^+@t+,Q #t+$t+%t+_j ql jm x| }[ *< I1 :E vm v%.&t+*t+/u n= pg 7P 14 r( MP =t+-t+;t+>t+J1+,t+'t+)t+!t+~t+{t+o& ]f+W[+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+]t+^t+/t+(t+_t+:t+E Ar a!.x8.ln 3/ 9/.jT =u+-u+;u+>u+,u+'u+g_+)u+!u+]{+!u+~u++^.= L}+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+M}+W[+E* {u+]u+^u+/u+(u+_u+:u+b3 .:.5;.op+^[ =< d} V#. q( [u+}u+|u+1u+2u+'W h} 4j to l8 J1 V_ }[ w| I1 }[ }[ =< [[ x| U3 M2 x| <[ V3 J1 V_ }[ }[ }[ #6 AU #6 }[ }[ }[ }[ W_ j} 3u+4u+5u+6u+i*+j1 0+ j. + k. 7$ k. + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + y. C; j. R. 7u+8u+9u+m^.K2 *< V_ V_ [[ }[ V_ [[ x| }[ =< }[ j} k} 'a 'a py 5c i<.0u+au+bu+cu+du+:e m>.,x $>+eu+fu+gu+hu+iu+@;.ju+ku+` .lu+W[+A|+N}+O}+o1+$a+mu+nu+ou+pu+tt+Lg+qu+ru+su+tu+uu+vu+wu+xu+yu+zu+Au+Bu+Cu+Go hP V3 U3 W3 V_ }[ }[ }[ }[ }[ }[ V_ <[ <[ V_ V_ |7 U3 W3 J1 J1 V_ V3 DF %6 X3 um L5.Du+Eu+[|.Fu+Gu+Hu+Iu+Ju+Ku+Lu+Mu+Nu+Ou+Pu+Qu+Ru+Su+Tu+Uu+Vu+Wu+Xu+dm+N}+W[+Vb+Yu+Zu+:..(,.li Mf+`u+q9+ v+.v+xn+` .+v+'X O&.M2 L2 x| &< &< V3 m= @v+ah o} (j Ov G^ #v+$v+%v+[:.&v+*v+(8+=v+!7+-v+g_+;v+>v+,v+'v+L}+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+)v+!v+~v+{v+]v+^v+/v+l_+(v+_v+;o Tj w| 7M :v+mH Q+.$k D, Yz m8 L| w+O|+_/+[^.L1+,w+'w+)w+w, !w+~w+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+kn+{w+]w+^w+/w+(w+_w+:w+,.Ba+=x+k5+-x+;x+>x+,x+'x+)x+ha !x+~x+J' {x+UR -F ]x+)Y tm ^x+/x+(x+=z 33 %< F9 wl V_ }[ *< *< =< ;5 ;5 [[ [[ }[ x| j} j} V_ [[ *< <[ V3 [[ }[ }[ }[ }[ V_ V3 Yv V3 V_ }[ i _x+:x+y+,y+|v+C- %< ^[ [[ }[ }[ }[ }[ }[ [[ [[ }[ *< }[ }[ x| }[ V_ V_ [[ [[ [[ *< }[ }[ }[ }[ V_ V3 L2 <[ V_ x| i8 !O.'y+)y+!y+~y+{y+. y. C; + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; q n .]y+^y+/y+(y+>5 ^[ [[ V_ V_ [[ x| x| V_ W3 J@ <[ k} k} I1 wl V_ %e It y$.H1 17 ([ %e I1 vm _y+:y+D9+v8+_/+!<++[+k) L[+.[y+m1+A|+o1+A|+ea+90+}y+|y+1y+2y+3y+4y+lf+Vb+b7+5y+6y+7y+kx+&j+8y+.b+9y+0y+ay+w7 x| wl }[ V_ W3 L2 *< W_ U3 |7 V_ x| V_ }[ J@ U3 j} -5 &< CF <[ V_ }[ x| j} TC um 9W ]> by+cy+dy+ey+fy+v0+~g+ j+ j+Ar+M}+~g+gy+hy+iy+jy+A|+N}+N}+N}+A|+N}+A|+A|+A|+W[+ky+ly+my+)s+ny+oy+py+qy+ry+sy+ty+uy+vy+P' C..pn wy+H1 T3 um ff |-.Lu xy+yy+zy+Ay+By+/5 Cy+d^+Dy+8} Ey+Fy+2} Gy+Hy+Iy+ve+Jy+Ky+%a+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+%a+jg+Ly+4|.H;.A: S]..t+My+Ny+_8+Oy+Py+5x+Qy+Ry+Sy+O4.gZ Ty+Uy+Vy+Wy+Xy+Yy+vo Q| Xz ^[ [[ W_ W_ =< V_ k} *< W_ W_ =< V_ J1 x| j} -5 j} x| I1 }[ }[ I1 }[ }[ }[ }[ V_ *< J1 I1 x| j} B~.cU.Zy+`y+ z+68 y. + + + + C; + + + + + + + + + + + C; + + + C; + + ", "+ + + + + + + + + + + + + + + + + + G H 4@ .z++z+@z+67 G1 =< <[ ]A &< 2r V_ W_ W_ W3 |7 V_ }[ V_ V_ x| =< Is %e i} w| V_ -5 -5 'a #z+I..cs+Qy+$[+$z+%z+:e+,f+&z+.} &1.oe+N}+A|+N}+A|+N}+}8++k+*z+=z+-z+;z+%o+^7+ b+ns+6c+6c+$a+>z+c7+ob+.b+.k+,z+'z+W3 }[ V_ V_ V_ x| x| W_ r( &< r( =< *< =< x| |7 W3 V_ j} <[ W3 =< [[ [[ =< <[ Yv to l8 )z+!z+~z+{z+]z+jc+^z+/z+Yc+}8+L}+N}+L}+(z+_z+:z+.2z+3z+4z+5z+6z+|w+jn -5 og I1 w| p8 7z+_x ,< Y: 5^.Z|+8z+9z+0z+nL.J@.e=+az+bz+cz+qo+du dz+ez+fz+id+A|+W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+w0+gz+hz+Ba+iz+jz+X^+kz+lz+Q[+mz+nz+[]+oz+pz+qz+rz+rP sz+O8+tz+uz+vz+wz+8=.;_ n8 H1 [[ j} Is &< W3 I1 V_ V_ Is V3 V3 }[ [[ V3 V3 V3 [[ }[ }[ }[ }[ x| }[ }[ }[ =< k} [[ [[ [[ W_ xz+yz+zz+Az+Ut.n .a+ [r.G G C; + + + + + + + + + + + + + k. 7$ k. + + + ", "+ + + C; k. C; y. q y. + + + + + + + + y. G ;% 4@ Bz+Cz+Uf o+.G1 =< <[ J( &< og }[ =< V_ k} V_ I1 }[ *< }[ *< }[ x| =< [[ }[ =< r( 0L 2P f} Dz+Ez+Fz+Gz+_w+o8+Hz+Iz+Jz+Kz+Lz+W[+W[+A|+N}+A|+N}+~g+Mz+jx+Nz+## Oz+Pz+^f+A|+m9+A|+m9+A|+N}+L}+Wb+Qz+Rz+Sz+[[ <,+j} W3 }[ V3 l8 yl wl Is TC H1 |7 [[ |7 %6 T3 w| x| |7 J1 Is H1 Qs Qs 17 K#.Vl Xz H2 Tz+Uz+Vz+Wz+Xz+Yz+Zz+`z+M}+}8+L}+A|+N}+ A+.A++A+@A+N}+A|+A|+A|+A|+A|+A|+N}+A|+W[+#A+$A+%A+&A+J4+*A+=A+-A+;A+>A+,A+,f+$^.'A+CB hO yl wl wl I1 x~.;H )A+]7+F[ !A+~A+{A+M,.C#.w| ;@.]A+^A+/A+(A+pk+_A+:A+B+,B+'B+)B+!B+~B+{B+W[+N}+N}+A|+A|+A|+M}+Cx+M}+]B+^B+/B+(B+Cx+A|+N}+O}+O}+A|+N}+M}+A|+_B+:B+B xB+mo+yB+zB+AB+BB+g#+CB+DB+u.._3..2.EB+=! K' x8.X- Jx ^[ }r dD }[ [[ [[ }[ W_ W_ =< [[ J1 |7 U3 L2 }[ k} k} x| J1 j} V_ x| }[ }[ }[ }[ }[ #6 b% ][ }[ x| j} r( L2 x| C6.ls FB+GB+o .HB+#+ y. + + + C; + + + + + + + + + + + + + + + + + + ", "+ + + + + + k. 7$ k. + + + + + + + + + -, RM.Q^ IB+JB+KB+17 ,x _[ +6 }[ [[ J1 }[ W_ V_ 2r V_ Is TC &< U3 }[ k} }[ }[ }[ }[ }[ =< jn xl ]l +^.LB+:e+I0+MB+NB+OB+PB+QB+RB+SB+W[+N}+A|+A|+A|+N}+A|+A|+A|+W[+qu+TB+UB+VB+Re+A|+ea+A|+A|+A|+A|+W[+Am+WB+v0.9W m8 yl *L kv 6M c-.J2 }7 f} ][ XB+YB+*/+!! ZB+iM |/+`B+ C+.C++C+@C+#C+$C+%C+&C+*C+=C+-C+;C+>C+,C+'C+)C+!C+~C+{C+]C+^C+O}+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+~g+/C+^: `s+/4.'i &y+(C+/2 _C+yn+:C+.17.DF :E w| [[ 'y o8 J@ 7G *j Ai kC+lC+mC+RU nC+,< wG oC+pC+qC+rC+sC+tC+uC+mc @4 vC+ED wC+xC+yC+zC+AC+BC+CC+DC+c; dX *r+Yc+W[+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+c2+XY +I EC+FC+GC+[5 HC+|0+-q IC+JC+KC+om+)w +,+%x DF I1 wl xl ql 0U Wz ][ 17.oo L#.s8 47 jd LC+MC+Wd+LB+NC+%j OC+PC+W[+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+QC+UG RC+jt J1 l0 )V k} Is G1 GS _@.WQ 23 7^ F-..c sJ jm 'a }[ x| J1 }[ W_ =< W_ *< =< uJ +B *< Is -5 *< wl J1 V_ [[ W_ W_ V_ }[ }[ }[ }[ }[ }[ }[ *< }[ }[ V_ W3 J( x| EF SC+i-.TC+UC+=. y. j. y. + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; . i. 3!+VC+WC+XC+jJ K1 =< [[ x| L2 V3 Is V3 L2 L2 }[ [[ x| L2 L2 Is V_ V_ }[ W_ }[ }[ hP bO LA YC+3d+ZC+`C+ D+.D++D+@D+#D+R%.$D+7q+W[+N}+A|+A|+A|+A|+A|+N}+N}+A|+L}+%D+&D+*D+Vb+A|+N}+A|+A|+N}+<5+z|+|y+=D+rn j&+E9 4+.vm Q..-D+;D+t- >D+,D+}z+$` 'D+)D+Mw O< !D+o/ 3$ j+ ~D+{D+]D+^D+/D+(D+^B+_D+:D+E+_8.,E+M8+'E+)E+/m+W{.%1+J{ !E+~E+W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+N}+6c+Ai+{E+]E+2F W- >5 'a I1 [[ Is -5 17 J, Bi =* e3 xA jm [[ =< r( Is V_ M2 |[ -5 j} x| wl J1 J1 }[ W_ [[ }[ V_ V3 U3 &< og }[ =< }[ V_ =< }[ j} V_ x| }[ *< }[ W_ 'x og }[ Xy >b+W3 ^E+/E+=. FE.br.+ j. + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + q *-.9+ (E+mD+_E+d} 4b =< }[ W_ Is og pn &< -5 *< W_ }[ V_ W_ V_ It V3 U3 *< }[ AU C} DF Hs Z; :E++,5 Hs ^[ w| }[ [[ V_ -5 }[ W_ V_ V_ *< x| 'x og J@ W3 V_ J1 }[ }[ x| }[ }[ x| W_ [[ x| =< j} -5 j} x| }[ *< }[ wl V_ }[ x| 2r PE+J@ QE+UC+=. RE+RE+cr.C; + + + + + + + + C; + + + C; + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + SE+i. 8Z TE+mD+XC+u}.b'.[[ [[ [[ j} }[ W3 r( j} V_ =< x| W_ x| V_ V_ V3 <[ *< I1 ][ b% Zy gS q%.UE+VE+=(+f[+WE+tD+XE+2c+YE+5U ZE+ b+W[+N}+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+A|+A|+N}+A|+A|+A|+N}+A|+A|+W[+Uq+`E+ F+.F++F+@F+#F+$F+%F+N}+W[+W[+W[+W[+W[+W[+W[+m9+A|+A|+A|+A|+A|+N}+N}+N}+N}+N}+N}+o1+N}+A|+W[+&F+*F+=F+M}+W[+W[+A|+<6+-F+;F+,. 4D+m9+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+o1+O}+^f+da+lp >F+,F+Qw+'F+)F+!F+n4+~F+{F+l3+]F+^F+/F+m9+Vj+6j+(F+%D+aj+Vb+_F+.b+:F+[5+G+l6+oE+,G+Ny+'G+)G+!G+Lg+ne+O}+A|+O}+ b+N}+N}+ b+N}+A|+A|+W[+CF+~G+{G+]G+^G+/G+(G+4%+sx+A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+M}+.= _G+1] bs _].][ |$.+B *< .i Ay :G+|+7G+8G+9G+0G+oz+B/+eY 6j+W[+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+ms+Vk+7q+y|+Eq+Wb+ b+A|+A|+N}+N}+N}+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+[i+aG+bk+W[+A|+N}+N}+c7+W[+bG+cG+dG+Cx+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+A|+eG+,$ fG+ks+gG+hG+y9+iG+jG+$1+kG+lG+mG+nG+6l ws+ b+A|+N}+o1+A|+A|+A|+A|+A|+N}+A|+W[+oG+hC J0+pG+qG+rG+sG+tG+A|+m9+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+M}+uG+vG+L2 gV W6+tm }[ *< =< 3/ ,a b .4: D^ Lx 4b =< *< V_ V_ [[ ;5 &< w| [[ }[ =< &< &< }[ =< =< =< j} j} V_ [[ x| W3 YG V_ V_ x| }[ }[ x| W_ }[ }[ }[ =< &< H1 I1 =< wG+C>+xG+yG+zG+AG+7$ j. + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + j. br.RE+3G+BG+mD+CG+Pi %< [[ w| T3 [[ }[ }[ }[ }[ [[ ;5 pn J( W3 }[ ;5 *< [[ [[ &< &< I1 _$ CR DG+EG+FG+GG+HG+8G+Q|+IG+JG+^8+d; b+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+o1+ b+n1+{i+KG+Eq+M}+A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+LG+MG++t A|+A|+N}+N}+A|+W[+NG+OG+PG+Cx+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+M}+QG+RG+SG+TG+UG+Iz+3x+-v+x(+VG+WG+XG+YG+=x+ZG+`G+m9+A|+N}+A|+A|+A|+A|+A|+A|+o1+m9+W[+ H+7) :e+bC+N] .H+Z% Of+W[+o1+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+L}++H+@H+#H+z4 P4.=< F1 _[ *< J2 6^ 23 D-+[/.M| HI =< k} V3 V3 k} =< [[ I1 I1 }[ W_ 'x og }[ j} r( W3 x| [[ }[ *< V_ k} [[ V_ }[ *< }[ W_ j} j} x| W_ }[ W_ 2r og p8 =< $H+YH %H+&H+*H+ep xo.C; + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; y. &-.=H+-H+mD+B- p$.%< =< x| x| [[ V_ J1 }[ }[ W_ Is -5 *< W_ YG HU ;5 [[ wl pn AS /%.el >y &s+;H+rl+>H+,H+'H+]6+)H+!H+~H+{H+[8+m9+o1+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+o1+O}+]H+ME+^H+oe+A|+A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+/H+(H+K. L}+W[+A|+N}+A|+W[+tG+!d _H+:H+W[+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+}8+z+W[+-I+;I+bk+>I+&r+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+m1+,I+-..'I+)I+vm+C6 Hx+r4+!I+~I+{I+]I+^I+/I+(I+_I+A|+A|+N}+A|+A|+A|+A|+A|+O}+o1+A|+W[+:I+}{. m} M*+EI+FI+GI+:=.y. + y. + C; + + + C; + + + + C; + + + C; + + + + + + ", "+ + + + + + + + + + + + + + + + + + + y. =, QF+aF+HI+u| F1 W3 &< Is j} [[ =< &< H1 I1 [[ }[ }[ V_ k} *< }[ }[ I1 [[ H1 }[ OB kT j'.II+JI+KI+LI+MI+NI+OI+:S PI+W[+m9+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+O}+m1+QI+5D+e7+RI+SI+~g+W[+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+}8+TI+UI+VI+WI+XI+YI+p1+6j+o1+W[+ZI+Cf `I+oe+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+|8+ J+.J+sf+-6 +J+Y(.@J+#J+$z+$J+%J+&J+*J+C0+8# PH+A|+A|+N}+A|+A|+A|+A|+A|+A|+Vb+Lg+W[+=J+02 Q[+-J+;J+>J+IO ,J+W[+h8+A|+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+L}+M}+[5+*D+'J+sv )J+N}+W[+!J+~J+1I+5w @-+{J+<2.]J+1[ ln =< =< W_ W_ W3 x| I1 r( r( [[ =< r( 'a I1 [[ }[ *< V_ V_ [[ &< V3 x| j} j} V_ |7 <[ V_ V_ V_ V_ }[ }[ }[ V_ 8! sp LP 08+6O ^J+/J+(J+;% + y. + + + 7$ 7$ C; + + + + + + 7$ 7$ C; + + + + + + + ", "+ + + + + + + + + + + + + + + + + + y. q =, _J+:J+K+BR yl um I1 w| I1 [[ +6 AS I1 V_ *< k} W3 L2 }[ [[ }[ V_ W3 U3 x| *< }[ *< k} *< k} W_ W_ W_ V_ }[ }[ }[ }[ }[ }[ V_ W_ *< E..*< ,K+'K+)K+Kt.j1 j. + + + C; C; C; + + + + + + C; C; C; + + + + + + + ", "+ + + + + + + + + + + + + + + + + + y. q 1. !K+~K+{K+o+.C..*< W_ wl [[ }[ V_ W_ x| J1 M2 U3 W_ &< &< }[ x| w| w| :E ^3 Qc e'.]K+^K+/K+.w (K+_K+k{.do ,p+%a+A|+o1+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+O}+A|+A|+W[+49+:K+rQ L+cP.k. y. + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; R~.+ #R ,L+'L+{u )L+>5 V3 U3 *< V_ *< W_ -5 -5 V_ Is -5 V_ V_ }[ V_ W_ v| p8 !L+~L+KF XD |q+{L+]L+^L+/L+lz Ws Eq+:5+z|+A|+N}+A|+O}+O}+A|+A|+A|+O}+O}+N}+N}+A|+A|+A|+A|+W[+A|+[5+(L+zf L+ _L+N}+da+:L+&` FK+W[+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+o1+A|+~g+M+,M+&D+ci+'M+)M+)l+_].um V_ W3 U3 }[ j} V_ W_ [[ [[ V_ *< [[ |[ |[ }[ =< k} *< *< *< k} W_ =< W_ }[ }[ }[ x| V_ j} V3 V3 Is +6 -< 5C+!M+~M+{M+_=.]M+G k. + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + C; + y. ^M+/M+(M+_M+#H K1 k} [[ *< }[ I1 V_ W3 L2 }[ [[ }[ V3 }[ I1 }[ Qc A$.:M+W-.N+,N+'N+)N+!N+~N+{N+]N+^N+/N+(N+em+O}+o1+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+|I+_N+s4+Oy+p3+m6+$z+:N+u_ n6+# WN+XN+YN+ZN+`N+ O+.O++O+@O+#O+$O+%O+)0.Xk+O}+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+[K+[M &O+*O+=O+-O+tM+-<+W|+u_ j_+pr+;O+&J >O+,O+'O+)O+o% !O+~O+{O+/p ]O+^O+/O+W[+W[+W[+W[+zm+(O+_O+:O+$^+P+,P+'P+)P+!P+~P+{P+]P+^P+/P+(P+yH+_P+%D+:H+:P+Cp x(+Q+,Q+'Q+)Q+@[+!Q+~Q+EH+{Q+]Q+^Q+/Q+(Q+_Q+:Q+7+9Q+0Q+aQ+bQ+cQ+dQ+eQ+Ai+v0+Am+fQ+qb+[A+p1+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+~g+gQ+hQ+iQ+jQ+kQ+lQ+mQ+ob+Vb+O}+A|+A|+W[+st+nQ+oQ+pQ+iF+z|+p1+O}+A|+qQ+Fm rQ+Md.V3 k} *< *< W_ j} -5 j} W_ W_ =< V_ J1 }[ }[ *< x| j} -5 &< U3 *< V_ }[ }[ }[ }[ }[ }[ }[ *< Xy sQ+tQ+uQ+vQ+wQ+:=.7` y. C; + + C; C; C; + + + + + + + q *-.q + C; + + + C; ", "+ + + + + + + + + + + + + + + + + k. [- 68 xQ+yQ+zQ+Y:.d)+M .k} }[ }[ }[ V_ I1 M2 |[ -5 IE ;5 =< H1 ZV B4 AQ+wr+W[+c2+BQ+CQ+DQ+EQ+FQ+GQ+HQ+IQ+JQ+KQ+LQ+MQ+W[+W[+A|+&r+~g+NQ+VB+OQ+PQ+QQ+69+L}+W[+W[+RQ+SQ+TQ+UQ+VQ+WQ+XQ+YQ+ZQ+`Q+ R+.R++R+@R+W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+dm+#R+$R+%R+&*.&R+*R+=R+-R+;R+>R+,R+'R+)R+!R+~R+{R+]R+^R+/R+(R+_R+:R+H qR+rR+sR+tR+uR+vR+wR+xR+yR+zR+AR+BR+CR+DR+ER+FR+GR+HR+N}+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+W[+]t+IR+JR+KR+LR+MR+NR+$a+ b+O}+^f+b7+O}+W[+OR+PR+QR+RR+SR+b7+^f+<5+W[+_B+TR+UR+VR+:e 'a =< J1 [[ <[ ;5 V3 j} -5 &< |7 }[ V_ *< }[ W_ V_ J1 }[ W_ *< V_ *< *< *< }[ }[ }[ }[ }[ Xy ^=+R=+WR+XR+YR+DS y. C; + + C; + + + C; + + + + + + y. q y. + + 7$ 7$ C; + ", "+ + + + + + + + + + + + + + + + C; + SE+j1 ZR+`R+zQ+ S+ -.jJ k} }[ }[ *< V_ I1 M2 |[ -5 j} [[ }[ v| f] .S++S+@S+#S+&D $S+%S+&S+*S+=S+-S+;S+>S+,S+'S+)S+!S+~S+:s+Vk+Yc+90+}8+~w+A|+A|+A|+m9+W[+%a+%a+W[+{S+]S+^S+/S+(S+_S+:S+T+P1+,T+Gs+'T+W[+W[+W[+Q}+Q}+)T+!T+~T+{T+]T+%j+.l+]H+b7+N}+A|+W[+^T+JR &@.7f G1 I1 |7 x| W3 U3 W3 j} -5 V3 2Q *< V_ }[ W_ V_ 'x um %6 <[ k} [[ }[ }[ }[ }[ V_ V_ }[ V_ =< ^[ T3 /T+(T+_T+x. j. + + + + + + + + + + + + + + + + + + + 7$ 7$ C; + ", "+ + + + + + + + + + + + + + + + + y. Q<+}- x. :T+U+,U+'U+)U+!U+~U+{U+]U+^U+/U+(U+_U+:U+L}+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+A|+W[+V+,V+'V+)V+NU+!V+NU+NU+OU+~V+GS+{V+]V+^V+/V+(V+_V+:V+W+,W+'W+kr+)W+!W+~W+{W+@k+O}+W[+A|+A|+%a+A|+oe+]W+V ^W+/W+@V+Q|+r4+(W+_W+:W+X+,X+'X+N}+A|+N}+A|+A|+A|+A|+A|+A|+N}+W[+jg+4C+)X+!X+~X+{X+]X+^X+c8+/X+kp+(X+sV+ b+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+W[+L}+_X+.+.:X+z+KW+8y+b7+ b+o1+O}+N}+~w+-Y+;Y+=8 Y}.i} I1 I1 [[ k} W3 J@ L2 V_ -5 &< U3 W_ W_ }[ J1 }[ }[ W_ Is -5 =< =< V_ -5 V_ V_ Is V_ :E tC >Y+,Y+'Y+DS y. + y. + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + k. 7$ k. + + + + + + k. G k*+)Y+!Y+~Y+)6.E..=< <[ L2 <[ =< W_ x| }[ W_ j} Is J1 FF s) %A {Y+Vb+%a+A|+]Y+^Y+/Y+(Y+_Y+:Y+_+3(+@Z+#Z+$Z+%Z+&Z+#]+*Z+=Z+-Z+;Z+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+>Z+,Z+'Z+)Z+!Z+~Z+{Z+]Z+^Z+/Z+(Z+_Z+:Z+p fZ+pK ^$.wB+}8+W[+N}+A|+A|+A|+A|+A|+A|+O}+A|+L}+Lg+cc+7b+gZ+hZ+iZ+jZ+N}+m1+A|+m9+A|+A|+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+o1+O}+ob+kZ+lZ+mZ+nZ+oZ+pZ+qZ+rZ+sZ+tZ+uZ+8W+rX+vZ+6W+sX+6W+NU+wZ+xZ+yZ+zZ+)V+AZ+BZ+CZ+DZ+EZ+FZ+GZ+HZ+=g+f+.IZ+v*.<-.fk+JZ+82+iz+KZ+LZ+MZ+NZ+OZ+m' PZ+QZ+r{ w+RZ+SZ+TZ+UZ+VZ+WZ+XZ+6W+NU+FS+NU+YT+DT+YZ+IT+ZZ+`Z+ `+.`++`+@`+#`+$`+MG+%`+&`+*`+=`+-`+;`+>`+NX+,`+'`+)`+!`+~`+{`+]`+^`+/`+(`+_`+}^ x@ :`+<`+[`+}`+rk+KG+|`+1`+2`+3`+4`+5`+6`+7`+8`+9`+0`+a`+b`+c`+d`+e`+f`+g`+h`+S:+i`+L]+j`+k`+l`+m`+n`+o`+p`+qu+M}+A|+N}+ea+W[+q`+r`+Kr+h_.*L 3/ +B *< j} r( W_ x| w| x| =< j} -5 L2 J@ *< V_ }[ }[ x| x| }[ }[ W_ x| V_ 'x -5 PB g} wl s`+t`+u`+DS + C; + + + + + + + + + + + + + + + + + + + + + k. ", "+ + + + + + + + C; + C; + C; + + + + + Q<+}- iB.v`+w`+x`+y`+o+.[[ [[ W_ W_ j} -5 j} x| W_ V_ V_ x| q| &K z`+T[+A`+m9+N}+A|+A|+B`+C`+Ma bG+#k+D`+E`+F`+G`+H`+I`+ @U{., @YJ+' @>4 ) @! @~ @{ @] @FT+DT+FS+DT+qX+!V+^ @/ @( @_ @: @< @[ @} @| @1 @2 @_X+3 @4 @5 @6 @7 @8 @9 @0 @a @)`+!`+b @c @d @e @f @g @h @i @j @k @5..l @m @n @uC++G+o @p @q @w=.r @s @t @u @v @w @x @y @z @A @B @C @4(+))+S:+D @E @F @G @H @I @J @K @L @M @n1+W[+N}+ea+W[+Am+RI+N @2F pm pg *< W_ 'x og J@ W3 V_ }[ *< =< V_ J( q7 *< V_ }[ }[ }[ }[ }[ }[ }[ wl Is -5 j} V_ jm x| O @P @Q @3. R~.+ j. + + + + + + + + + + + + + + + + + + + + k. ", "+ + + + + + + + + + + + + + + + + + Xi.0+ cP.R @S @T @U @h=+<[ &< Is V_ V3 &< V3 [[ k} [[ Is -5 AR uq ks V @~g+W[+m9+Q}+b7+PQ+W @X @uc+%a+%a+W[+W[+cc+%a+W[+W[+W[+W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+O}+A|+o1+m9+L}+sV+Y @tc+Yc+N}+A|+A|+N}+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+m9+~g+{B+iy Z @` @ .@..@+.@@.@#.@$.@%.@&.@*.@=.@-.@=W+;.@>.@,.@'.@iY+~V+).@JS+!.@~.@{.@].@^.@lS+/.@(.@_.@:.@<.@[.@}.@|.@1.@2.@3.@4.@5.@6.@7.@8.@!g+YJ+{6+9.@}q+0.@a.@b.@c.@d.@e.@f.@g.@h.@i.@j.@k.@l.@m.@n.@o.@p.@q.@r.@s.@t.@Hr+u.@v.@w.@x.@y.@z.@A.@B.@C.@v^+D.@E.@F.@G.@H.@I.@`A+J.@K.@L.@'r+M.@vT N.@T0 9R O.@P.@Q.@}q+R.@S.@T.@U.@V.@W.@X.@Y.@Z.@`.@ +@.+@++@@+@#+@$+@%+@&+@*+@=+@JQ.-+@;+@>+@,+@qu+M}+A|+N}+N}+A|+A|+Wo+'+@)+@!+@HI J( W_ j} r( <[ |7 [[ x| x| Is Is 'a |7 }[ k} }[ }[ }[ }[ }[ }[ }[ [[ &< V3 }[ =< H1 x| ~+@{+@]+@l*+h*+cr.C; + + + + + + + + + + + + + + + + + + + + k. ", "+ + + + + + + + + + + + + + + + + + k. H n .^+@/+@(+@_+@2&+8! |[ -5 j} |7 U3 W3 }[ <[ x| 'x -5 -< 9* Rd+:+@/O+~w+W[+ b+ob+|8+Xc+~w+N}+h8+h8+h8+ b+b7+c7+m9+o1+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+A|+L}+b7+ob+w0+o1+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+:5+<5+W[+L}+`G+<+@[+@4m }+@|+@1+@2+@3+@4+@5+@6+@7+@8+@9+@0+@a+@b+@c+@rZ+d+@e+@gR+f+@g+@h+@i+@j+@k+@l+@m+@n+@o+@p+@q+@r+@s+@t+@u+@v+@w+@x+@y+@z+@A+@B+@fD+Hx+m3+Q|+C+@D+@E+@F+@G+@H+@I+@J+@tZ+K+@L+@M+@N+@O+@P+@Q+@R+@S+@ m 5D+m9+Yc+A|+T+@U+@V+@W+@X+@Y+@>S+9T+Z+@nW+`+@ @@.@@+@@@@@'k #@@$@@yY+,T+%@@&@@b; *@@=@@-@@;@@>@@,@@'@@)@@1 !@@~@@{@@]@@^@@++@<{+/@@(@@_@@:@@%+@<@@%+@[@@}@@|@@1@@2@@3@@4@@W[+A|+A|+N}+A|+A|+N}+W[+Vb+l* Q:.Oc HI J( *< [[ [[ k} [[ I1 j} V_ Is It Is w| }[ *< }[ }[ }[ }[ }[ }[ }[ [[ <[ L2 }[ =< H1 x| 5@@6@@]+@l*+RE+br.C; + + + + + + + + + + + + + + + + + + + C; + ", "+ + + + + + + + + + + + + + + + + C; + j. n .7@@8@@9@@@}+h=+W_ W_ V_ }[ }[ *< W_ W3 U3 W3 [[ V_ jm +a N| 0@@a@@PC+W[+N}+ b+ea+A|+A|+A|+o1+A|+A|+N}+ b+N}+o1+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+O}+N}+O}+O}+o1+o1+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+:5+<5+A|+W[+A|+v0+b@@c@@yo+AK+d@@e@@f@@g@@h@@i@@j@@k@@l@@m@@n@@o@@p@@q@@HS+r@@IS+DT+!V+s@@HS+t@@u@@v@@w@@x@@y@@z@@A@@B@@C@@D@@i+@E@@F@@G@@H@@I@@J@@K@@e1 =x+L@@M@@N@@O@@P@@Q@@R@@S@@T@@U@@V@@W@@X@@Y@@Z@@`@@ #@.#@!p+2O++#@@#@%a+A|+W[+&l+##@$#@%#@&#@@]+*#@=#@/@@-#@;#@>#@,#@'#@4o+ul+)#@!#@/F+~#@[A+{#@SI+]#@[A+^#@/#@(#@rF+_#@*p+:#@<#@[#@}#@|#@1#@2#@4(+u^+@]+J!+v^+3#@]!+/(+]!+4#@5#@6#@7#@8#@o1+A|+A|+A|+N}+A|+A|+N}+%a+b7+9#@d# Qc I1 W_ *< k} }[ *< x| j} -5 V_ x| V_ V_ x| x| W_ }[ }[ }[ }[ }[ }[ }[ W_ Is -5 }[ =< H1 I1 0#@a#@b#@B. &-.y. C; + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + j. + (D.c#@d#@e#@35.67 =< [[ wl M2 L2 W_ V_ Is 'a }[ W_ W_ w| xl =< f#@g#@|y+W[+A|+A|+00+N}+N}+N}+O}+O}+O}+A|+A|+A|+O}+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+A|+A|+A|+o1+O}+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+:5+N}+N}+A|+W[+W[+Vk+]o+tQ+*7 h#@i#@j#@k#@l#@m#@n#@o#@p#@q#@r#@s#@t#@u#@v#@w#@x#@y#@z#@A#@B#@C#@D#@E#@F#@G#@H#@I#@J#@K#@L#@M#@N#@O#@P#@Q#@R#@S#@T#@U#@ZU V#@W#@X#@Y#@Z#@`#@ $@.$@+$@@$@#$@$$@%$@&$@*$@=$@-$@;$@>$@&r+g8+_F+o1+A|+A|+W[+Xc+,$@'$@)$@!$@~$@.+@@]+{$@]$@^$@/$@($@_$@%a+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+A|+:$@o1+W[+<$@[$@}$@|$@1$@2$@3$@4$@u^+/(+')+5$@6$@[{+7$@8$@9$@0$@%a+c7+kx+m9+A|+N}+A|+A|+N}+W[+m1+a$@5< [[ [[ }[ DF V3 V_ }[ =< }[ &< V3 =< W_ W_ j} Is j} x| }[ }[ =< W_ x| }[ W_ j} r( L2 W_ jm rn b$@c$@d$@sW e$@cr.C; + + + + + + + + + + C; + + C; + + + + + + + ", "+ + + + + + C; k. C; + + + + + + + + + j. + f$@g$@h$@i$@Y8 m} k} V_ I1 Yv 2Q W_ J1 It XB V_ *< *< [[ g} TC j$@k$@l$@o1+m9+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+m9+W[+_F+m$@5p n$@gI UA+o$@!l+p$@q$@07 j_ H3+r$@s$@t$@u$@v$@w$@x$@y$@z$@A$@B$@C$@D$@E$@F$@G$@H$@I$@J$@K$@L$@M$@M$@N$@O$@P$@Q$@R$@S$@T$@U$@AM+V$@/K J: W$@X$@Y$@Z$@`$@ %@.%@+%@@%@#%@$%@%%@Yc+m9+Q}+b7+Vb+A|+O}+N}+z|+<5+&%@*%@=%@-%@;%@>%@')+,%@'%@)%@!%@~%@{%@L}+W[+W[+W[+A|+N}+N}+N}+N}+N}+N}+A|+W[+A|+Wp+jg+Vb+W[+U[+Xs ]%@^%@/%@(%@_%@:%@<%@[%@}%@|%@1%@[{+2%@3%@4%@5%@#k+ne+6%@L}+N}+A|+A|+A|+N}+W[+L}+7%@E- %K I1 |7 vm V3 V_ V_ *< J( CF W3 V_ V_ =< j} It j} x| }[ W_ }[ j} V_ x| }[ =< W3 2Q x| ^[ rn 8%@9%@0%@sW a%@cr.C; + + + + + + + + + + + k. k. + + + + + + + + ", "+ + + + + + k. 0+ k. + + + + + + + + + C; y. z[+b%@c%@d%@4`+M5.X3 x| J1 }[ *< W_ J1 um V_ V_ x| wl w| ql um e%@f%@9E+Vk+A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+N}+mf+.b+tc+g%@h%@_L+i%@#S+8N j%@k%@l%@m%@n%@o%@lb p%@q%@H#.r%@vY s~.s%@v> t%@u%@v%@w%@x%@y%@z%@A%@B%@C%@D%@E%@F%@G%@H%@I%@J%@K%@L%@M%@N%@O%@30+!}+P%@Q%@R%@S%@T%@#w U%@V%@2{.SB+y|+90+b2+A|+O}+ b+N}+o1+A|+O}+o1+A|+cc+W%@X%@Y%@Z%@`%@ &@.&@+&@@&@#&@$&@%&@A|+A|+A|+A|+A|+N}+A|+A|+A|+A|+N}+A|+m9+A|+ob+V[+sV+ b+M}+4g+&&@*&@=&@C^+-&@;&@>&@,&@'&@)&@(@@>%@!&@~&@{&@]&@^&@~g+m1+Wp+L}+A|+A|+A|+N}+W[+M}+/&@V1.^Z h&+j8 W_ [[ *< k} ]A CF W3 *< k} *< k} x| V_ V_ }[ }[ W_ j} -5 Is wl }[ *< k} *< wl ^[ p8 (&@_&@:&@;( &-.y. C; + + + + + + + + + + + 7$ 8l C; + + + + + + + ", "+ + + + + + C; k. C; + + + + + + + + + C; j. 7.<&@[&@}&@|&@y`+k} W_ }[ V_ V_ *< M2 M2 x| [[ j} Is J1 ^[ tC >! 6j Tl+1&@A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+o1+ b+w0+c7+$a+W[+W[+W[+N}+~g+Ai+2&@3&@4&@5&@6&@X+ 7&@8&@8< %4 9&@fe 0&@a&@b&@jc c&@d&@e&@f&@g&@h&@i&@j&@k&@l&@m&@n&@o&@p&@M` CS q&@z).r&@s&@t&@u&@v&@w&@,%.x&@y&@z&@A&@B&@C&@D&@W[+:5+N}+A|+A|+o1+A|+A|+O}+A|+A|+O}+N}+N}+/z+E&@F&@G&@H&@I&@J&@K&@L&@M&@N&@O&@L}+M}+M}+A|+N}+A|+A|+A|+A|+A|+A|+N}+o1+A|+c7+w0+w0+N}+N}+Lg+%o+%o+Dv+P&@Q&@R&@S&@T&@U&@V&@W&@X&@Y&@Z&@`&@ *@.*@+*@cc+Vb+N}+A|+A|+A|+N}+W[+M}+@*@#*@$*@v| <[ Is V_ [[ w| H1 &< }[ =< |7 to |7 =< W_ W_ *< *< [[ V3 Yv V3 [[ }[ *< V_ k} =< rn to !N %*@&*@8=+q y. C; + + + + + + + + + + + k. k. + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + C; j. j*+**@=*@-*@57 ]> W_ }[ }[ *< V_ x| pn pn x| [[ Is It Is w| w| xg o: ;*@>*@W[+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+A|+A|+A|+o1+N}+N}+A|+W[+A|+A|+A|+W[+p1+c7+c7+Vb+~w+c7+c7+M}+,*@`m+sk+'*@uj+)*@!*@~*@{*@]*@^*@/*@(*@_*@:*@<*@[*@}*@#S+bX+|*@1*@2*@3*@4*@sF+:I+5*@1k+6*@7*@8*@9*@0*@]B+|8+N}+W[+W[+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+Yc+c6+*z+a*@b*@c*@d*@e*@f*@g*@h*@i*@j*@k*@M}+M}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+o1+A|+A|+A|+Vb+ob+kx+W[+m9+L}+L}+w0+l*@m*@n*@o*@p*@q*@r*@s*@t*@u*@v*@w*@W[+W[+A|+N}+A|+A|+N}+W[+|8+x*@E:.c_.u| V_ It r( &< wl 'x IE }[ [[ V3 q( V3 k} j} V_ x| }[ [[ V3 <[ *< }[ }[ }[ }[ }[ =< rn rn nI y*@z*@A*@+ + j. + + + + + + + + + + C; + + C; + + + + + + + ", "+ + + + + + + + + + + C; + y. + C; + y. C; y. B*@C*@D*@E*@dl E..x| J1 V_ =< W_ W_ Is -5 V_ wl w| V_ V_ [[ }[ bO F*@n4 G*@Vj+Yc+M}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+A|+A|+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+m9+m9+A|+A|+A|+W[+W[+M}+8n+8n+6J+PC+nA+H*@I*@J*@K*@L*@M*@N*@O*@P*@Q*@aj+R*@[5+hL+(F+S*@T*@5y+ j+da+~g+Yc+Ub+Xc+T*@U*@V*@m9+W[+dm+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+N}+dm+KW+W*@X*@Y*@Z*@`*@ =@.=@+=@@=@#=@A|+00+ea+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+A|+A|+o1+O}+ b+N}+A|+A|+W[+O}+ne+*j+7b+$=@%=@&=@*=@==@-=@;=@>=@,=@rF+W[+W[+A|+N}+A|+A|+N}+A|+aj+:A '=@lu u| V_ J1 |[ +6 *< V_ }[ I1 x| j} -5 V_ V_ -5 j} x| I1 x| j} -5 V_ x| }[ }[ }[ }[ =< V3 I1 )=@!=@~=@{=@cr.+ j. + + + + + + + + + + + + + + y. + + + y. + + ", "+ + + + + + + + + + + + k. 7$ [r.68 y. + C; y. ]=@^=@/=@(=@_=@E..X3 |7 W3 &< j} V_ V_ j} V_ [[ |7 U3 |7 [[ [[ Qs $l !]+nK+:=@Am+O}+o1+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+O}+A|+A|+A|+N}+N}+N}+N}+N}+N}+N}+o1+o1+N}+N}+N}+A|+A|+N}+A|+W[+W[+<=@[=@}=@|=@1=@M!+2=@1(+3=@4=@5=@6=@W[+W[+W[+%a+mf+O}+W[+W[+W[+W[+W[+W[+O}+Lg+>z+W[+W[+%a+A|+A|+N}+N}+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+%a+c7+7=@8=@9=@0=@a=@b=@c=@d=@e=@]B+W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+O}+O}+A|+A|+A|+N}+N}+A|+N}+w0+ob+lw+Ev+f=@g=@h=@i=@j=@k=@l=@m=@gK+W[+A|+A|+N}+A|+A|+N}+W[+^f+QI V8 n=@v| [[ w| &< ;5 k} W_ [[ x| [[ V3 &< V3 [[ V_ V_ x| }[ [[ }[ &< }[ x| }[ }[ }[ x| V_ *j Fm+o=@p=@q=@r=@7` y. C; + + + + + + + + + + + + + + + q 68 q + + + ", "+ + + + + + + + + + + + k. 7$ ]M+68 y. + C; y. rU.s=@t=@u=@v=@r+.2r ;5 CF &< It V_ W_ *< V_ V_ W3 2Q V3 J1 [[ xl =< Qa ks w=@/F+}8+A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+%a+W[+M}+x=@y=@z=@A=@+Y+B=@C=@/(+D=@v^+E=@F=@G=@H=@A|+O}+N}+ b+ob+Vb+A|+A|+N}+N}+N}+A|+c7+ob+c7+A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+W[+I=@J=@K=@L=@M=@N=@O=@_$@W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+w0+^7+.b+f5+Yc+kg+o1+1U+P=@Q=@wB+Am+N}+A|+A|+A|+<5+:5+W[+L}+RA+R=@S=@T=@u| =< I1 [[ [[ V_ V_ }[ }[ V_ |7 U3 ;5 r( W3 W_ V_ V_ *< U3 j8 W3 V_ }[ }[ }[ x| k} *j c$.df+U=@U!+V=@68 j. C; + + + + + + + + + + + + + + + q Yv.q + + + ", "+ + + + + + + + + + + C; + C; y. j. y. + + j. k*+W=@X=@Y=@Z=@F*+2r og J@ L2 V_ V_ W_ i8 -5 Is w| }[ V_ }[ x| Is ([ =< }-.Mx+OK `=@A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+ b+jg+#k+CF+dX e,. -@.-@+-@@-@fM+#-@$-@U_+%-@&-@*-@=-@ws+ne+c7+N}+ b+ b+o1+N}+A|+A|+A|+N}+N}+ b+ b+o1+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+ms+--@;-@>-@,-@'-@)-@ms+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+ b+N}+A|+%a+%a+A|+$a+RQ+jx+v0+L}+A|+A|+A|+A|+N}+A|+W[+zI+'v+!-@|w+HV /%.=< }[ }[ [[ x| [[ *< *< *< k} W_ Is og J@ W3 =< =< J( J@ l8 }[ }[ }[ }[ }[ }[ W_ Is 17.~-@{-@]-@^]+j. H k. + + + + + + + + + + + + + + y. + y. + y. + + ", "+ + + + + + + + + + + + + y. + + + y. C; y. mr.^-@/-@(-@_-@7E k} 'a }[ x| =< =< x| V_ j} Yv M2 }[ k} *< W_ V_ 'a r( 0f A+.=u+:-@W[+W[+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+<-@[-@}-@|-@@;.1-@2-@3-@4-@5-@6-@7-@8-@9-@J!+0-@a-@b-@c-@d-@g8+A|+A|+A|+O}+A|+A|+A|+A|+O}+A|+A|+A|+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+%a+e-@=N+zD+q1+W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+N}+A|+A|+:5+A|+O}+O}+N}+o1+m9+A|+N}+A|+A|+A|+A|+A|+N}+A|+W[+f-@g-@h-@4V 'a j} W_ *< =< ;5 pn L2 V_ I1 V_ V_ =< V_ 'a V3 |7 2r 'x &< |7 V_ V_ }[ }[ }[ }[ }[ W_ Is aV i-@j-@k-@6@ + k. j. + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + C; j. l-@m-@n-@o-@p-@92.*< J1 J1 [[ *< ;5 I1 w| [[ U3 L2 }[ V_ }[ }[ }[ =< }[ dl (1 -e q-@QI+ms+W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+W[+r-@s-@t-@u-@v-@h9 w-@x-@y-@z-@A-@B-@C-@D-@E-@F-@G-@H-@I-@J-@W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+%a+A|+W[+m9+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+N}+N}+A|+A|+A|+A|+N}+A|+A|+W[+$a+a].K-@L-@%6 HI W_ }[ }[ [[ ;5 (x ;5 [[ J1 V3 <[ W3 }[ J1 J1 [[ j} It j} [[ }[ }[ }[ }[ }[ }[ }[ }[ [[ wl M-@N-@k-@U+ + + y. + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + k. H ar.O-@P-@Q-@R-@S-@r( It V_ [[ ;5 +B H1 T3 V_ *< x| W_ =< V_ k} *< [[ I1 Qs b} V6 T-@_+ i8+A|+A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+o1+A|+y|+U-@V-@EJ W-@fE+X-@/4+Y-@Z-@`-@ ;@.;@+;@@;@r[+#;@$;@%;@&;@W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+A|+A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+N}+W[+ b+*;@!-@=;@Fo &x rp W_ V_ }[ x| V_ HE j} x| V_ W3 CF j8 &< It V_ x| W_ V_ k} =< [[ [[ }[ }[ }[ }[ }[ }[ [[ tC -;@;;@>;@,;@H j. + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + C; G 3-+';@);@!;@~;@_*+YG j} V_ =< *< *< }[ [[ }[ x| 2r Is &< W3 I1 V_ V_ T3 ^[ B,+{;@Xw ];@`J ^;@W[+m9+o1+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+}8+/;@(;@kB+_;@Vb+O}+:;@<;@[;@};@|;@1;@2;@3;@4;@5;@6;@7;@8;@W[+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+N}+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+Yc+W[+1r+9;@g|.0;@Wy 17 K1 *< [[ V_ V_ V3 l8 }[ *< =< &< &< <[ }[ j} V_ W_ [[ wl w| r( +6 ;5 [[ }[ }[ }[ }[ }[ V_ w| a;@b;@c;@d;@#R j. + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + + y. 3-+e;@f;@g;@h;@F*+=< x| }[ [[ }[ }[ }[ [[ *< [[ Is -5 &< M2 I1 V_ }[ %6 Xz [&+i;@~R G*.8j wn xx+m1+%a+O}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+W[+m9+O}+Lg+ b+W[+Vk+j;@k;@l;@m;@n;@o;@p;@q;@r;@s;@t;@u;@W[+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+N}+5g+cL+v;@w;@+} #6 (@.Nu 'x r( W3 x| l8 DF V3 k} W_ Is It V_ x| x| }[ [[ }[ Is I1 |[ km ;5 [[ }[ }[ }[ }[ }[ k} =< x;@y;@z;@A;@3D d_ + + + + + + + + + + + + + C; k. C; + + + + + + ", "+ + + + + + + + + + + + + + + + + y. C; y. b+[[ }[ }[ [[ ;5 HU &< w| V_ w| wl }[ I1 I1 V_ =< W3 j8 q: y| p%.29 p*.GO yy+E;@F;@W[+%a+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+A|+A|+O}+O}+W[+N}+G;@H;@I;@J;@K;@L;@M;@N;@s1 d[ O;@ b+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+A|+W[+P;@Q;@R;@Nj <] F1 [[ V_ 'x IE J@ |7 J1 }[ }[ }[ wl V_ V_ J1 x| }[ }[ x| j} -5 V3 j8 <[ =< }[ }[ }[ }[ }[ }[ =< W_ S;@T;@U;@wx.n .q C; + + + + + + + + + + + + k. 0+ k. + + + + + + ", "+ + + + + + + + + + + + + + + + + + d_ j1 ~0.V;@W;@X;@>E+j(.=< k} }[ [[ *< ;5 I1 %6 W3 H1 'x V_ M2 U3 W_ j} 'a V3 4e bs jm {[ 8, F*.Y;@Z;@`;@W[+b2+A|+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+N}+N}+:5+N}+m9+o1+7=@_;@Yc+]t+&r+dm+ >@.>@+>@3J+O}+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+N}+N}+W[+W[+fi+!; @>@9d #f+CF pg [[ W_ j} r( <[ |7 [[ [[ =< V_ }[ x| x| x| V_ V_ }[ x| V_ Is V3 W3 wl [[ }[ }[ }[ }[ }[ }[ k} x| #>@$>@%>@3J m..j. + + + + + + + + + + + + + C; k. C; + + + + + + ", "+ + + + + + + + + + + + + + + + + + q Rv.~0.V;@&>@*>@=>@S=+MP <[ V_ V_ [[ =< [[ V3 U3 &< It V_ pn pn W_ j} -5 I1 x/ x/ s8 r| )M ou $y ->@;>@kp+O}+W[+W[+A|+N}+o1+A|+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+w0+A`+A|+Yc+Yc+<5+}8+@S+eU+>>@:H+A|+00+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+o1+m9+W[+m1+4D+,>@'>@)>@!>@~>@A~ %6 J1 }[ x| [[ V_ =< }[ j} V3 W3 k} V_ }[ V_ <[ <[ V_ V_ x| wl [[ V_ I1 }[ }[ }[ }[ }[ }[ }[ *< |7 #>@{>@]>@^>@#R j. + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + d_ T(.or.O-@/>@(>@_>@M,.]A J( x| k} *< *< }[ k} W_ }[ V_ [[ Is -5 V_ V_ }[ [[ #6 #6 wl ^[ ^[ }a 9&.k*.:>@<>@[>@@k+M}+A|+A|+o1+o1+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+:5+<5+O}+A|+N}+N}+:5+W[+O}+P}+w0+N}+o1+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+A|+N}+o1+A|+%a+I`+Wg }>@@< /& yl DF V3 J1 T3 w| w| I1 }[ W_ j} -5 &< J( *< k} *< V_ ]A J( x| k} *< }[ }[ x| x| [[ V_ V_ *< }[ }[ V_ W_ j8 |>@1>@2>@3>@-, j. + + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + d_ Pv.or.B;@4>@5>@^3 o+.r( &< }[ [[ V_ V_ [[ [[ V_ =< W3 ]A r( 'x J1 M2 U3 W_ }[ }[ x| Is hl %< #6 w6 >R 6>@u,+O< 7>@8>@W[+W[+$a+A|+A|+N}+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+<5+A|+o1+N}+A|+A|+N}+A|+O}+c7+O}+A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+A|+o1+o1+N}+N}+Yc+o1+W[+9>@0>@BP *u+1] I1 'a =< k} [[ &< +6 &< [[ }[ W_ V_ Is V3 W3 I1 w| [[ [[ &< &< }[ [[ V_ }[ W_ j} Is &< W3 *< V_ }[ }[ [[ r( *5 a>@b>@c>@3>@-, j. + + + + + + + + + + + + + + + + + + + + + + ", "+ + + C; k. C; + + + + + + + + + + + + d_ 68 mr.O-@4>@5>@hT 7E 2r og }[ w| I1 |7 'a 'a x| =< <[ L2 W3 w| I1 M2 L2 j} V_ W_ W_ j} YH um xg `-.J~ zc d>@e>@f>@g>@#S+h>@i>@N}+W[+W[+W[+W[+O}+o1+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+m9+o1+O}+%a+W[+W[+&r+ce+5D+j>@Eq $A sy %< p8 [[ }[ }[ [[ ;5 _[ &< [[ }[ *< x| wl [[ V_ w| H1 &< W_ j} It V_ |7 V3 k} =< j} -5 &< U3 *< V_ }[ }[ x| j} TC k>@l>@.<+3>@;% j. + + + + + + + + + + + + + + + + + + + + + + ", "+ + + k. 0+ k. + + + + + + + + + + + j. + y. rU.B;@m>@n>@_>@o+.k} }[ }[ w| l8 U3 H1 TC V_ W_ V_ *< I1 I1 V_ x| r( -5 j} x| wl V_ V_ T3 o` %< H1 i5 J` A+.o>@jb p>@~6 :I+fo+Hh+~g+ b+A|+O}+o1+A|+N}+N}+O}+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+N}+A|+o1+O}+O}+o1+L}+[5+q>@do i..@x xA V_ &< }[ [[ }[ I1 }[ [[ I1 w| I1 }[ *< }[ I1 }[ *< [[ +6 +6 *< V_ V_ V_ W3 U3 W_ =< x| V_ I1 I1 V_ *< }[ }[ *< [[ V_ M<+r>@.<+mQ.=. j. + + + + + + + + + + + y. + + + y. + + + + + + ", "+ + + C; k. C; + + + + + + + + + + + + -, a+ i. V;@s>@t>@u>@6)+=< =< W_ [[ }[ W_ r( j} V_ x| k} k} [[ [[ V_ =< V3 &< V3 =< V_ [[ &< _[ &< [[ [[ H1 M2 td |9 >h Za v>@5u w>@x>@.3 x=@m9+W[+%a+O}+A|+A|+o1+A|+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+o1+o1+ne+_F+W[+W[+y>@w@ xt uC+M= s`+/& -5 'a =< =< *< }[ }[ [[ &< &< &< [[ }[ *< }[ }[ V_ k} [[ ;5 ;5 =< W_ x| w| V3 'a Is V_ =< W_ Yv M2 x| =< }[ }[ x| 5@.7P z>@A>@.<++<+-, y. + + + + + + + + + + + + 68 68 y. + + + + + + + ", "+ + + + + + + + + + + + + + + + + + -, B>@DS C>@D>@E>@F>@d$.*< V3 j} <[ W3 V_ [[ x| *< V_ V_ W_ j} r( W3 W_ |7 U3 W3 V_ }[ =< &< +6 ;5 [[ }[ =< }[ -s n= el *j U-+}x %} G>@4s+wW H>@I>@J>@M}+W[+A|+A|+N}+A|+A|+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+o1+m9+W[+_F+Ai+9x+K>@L>@M>@Y+.N>@O>@Q8.C..TC V_ }[ }[ }[ }[ }[ [[ &< +6 ;5 [[ }[ }[ }[ V_ W3 W3 V_ [[ [[ W_ j} Is wl 9W -5 -5 }[ V_ x| Yv |[ YG k} }[ }[ =< r( 6O P>@Q>@.<+XR.q j. + + + + + + + + + + + + 68 68 y. + + + + + + + ", "+ + + + + + + + + + + + + + + + + y. k. C-.7` R>@S>@T>@d9+=[.<[ <[ -5 ;5 U3 I1 V_ }[ k} I1 I1 x| 'x IE J@ W3 k} *< I1 J1 V_ =< W_ *< =< *< k} *< }[ p8 3/ HI G1 {[ T[ ;< Zm U>@V>@W>@X>@' KG+hO+~g+:F+b7+O}+A|+A|+A|+N}+N}+N}+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+o1+N}+A|+O}+m9+&r+~g+ws+ME+s* Y>@Pg Z>@!_ hB %6 dk yl V_ V_ }[ }[ *< *< =< *< }[ *< *< *< *< *< }[ [[ <[ L2 W_ k} x| *< -5 -5 }[ [[ }[ J@ <[ [[ J1 Is -5 Jt *< x| }[ [[ &< WF `>@ ,@.,@+<+q j. + + + + + + + + + + + + y. y. y. + + + + + + + ", "+ + + + + + + + + + + + + + + + + + C; C; _2++,@@,@#,@r4.]|.}[ <[ V_ V3 W3 }[ V_ V_ *< M2 M2 x| j} r( L2 |7 V_ V_ x| |7 W3 &< j} V_ W_ V_ I1 M2 U3 x| [[ =< =< xl 17 E1 F9 %{ $,@%,@&,@FK AI yL | 8N+ws+W[+W[+W[+W[+W[+A|+A|+o1+N}+o1+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+o1+O}+A|+N}+N}+W[+*,@=,@-,@;,@>,@Rc J..JH 4j K1 ,,@j} [[ x| W_ }[ *< }[ I1 w| _[ +6 *< [[ [[ wl x| W_ k} Yy SE um [[ EF k} |[ Yv k} k} W_ W3 x| H1 *5 IE Is j} }[ =< W_ [[ V3 rp ',@),@!,@~,@q y. C; + + + + + + + + + + y. + + + y. + + + + + + ", "+ + + + + + + + + + + + + + + + + + j. -, ar.+,@{,@],@5)+(b+[[ V_ W_ j} j} [[ W_ V_ x| pn pn x| [[ V_ k} J1 x| W_ 2r ;5 CF &< It V_ W_ V_ wl |[ pn W_ [[ }[ }[ =< [[ w| J1 i} p+.cf+[O ^,@/,@(,@Ja _,@:,@<,@[,@XW+Ai+M}+A|+m9+A|+%a+},@b2+A|+N}+A|+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+<5+N}+A|+A|+O}+A|+L}+5g+|,@PP+k! ^U 1,@5* M2 E..og k} i8 %E YG x| }[ }[ *< *< }[ I1 T3 _[ +B *< [[ I1 (@.V_ x| wl 2y #6 +5.U3 |7 %6 V3 'a p8 O&.wl k} V_ &< HU ;5 [[ wl [[ }[ j} V_ |7 )y 2,@3,@!,@~,@q y. C; + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + + + + + + + + ;% 3. bO+{=@4,@5,@6,@~=+=< }[ W_ Is -5 V_ W_ }[ =< Is -5 V_ wl Is -5 j} W_ W_ Is og J@ L2 V_ V_ W_ }[ [[ Is -5 V_ wl I1 }[ *< }[ wl J1 'a Qs =s j} S_ u6 Q[ MR u4 lo aS k>+Of 7,@8,@>$@da+aj+b7+ea+z|+A|+A|+N}+N}+A|+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+A|+N}+A|+W[+L}+~g+~g+:#@9,@0,@a,@.S+wQ d4 b} H1 G1 Nu V_ W_ *< W_ }[ I1 }[ }[ I1 }[ V_ [[ }[ *< *< wl (@.TC Is $6 b,@c,@d,@x*+e,@c! R% &6 aV f,@e>+g,@%E YG ;5 HU ;5 [[ x| x| j} -5 j} [[ wl h,@i,@j,@k,@q y. C; + + + + + + + + + + + + + + + + C; + + + C; ", "+ + + + + + + + + + + + + + + + + + G #R l,@m,@n,@o,@1$ _<.}[ *< =< &< &< I1 [[ V_ W_ j} j} V_ [[ l8 &< V3 [[ =< V_ r( *< x| w| wl [[ V_ W_ j} j} V_ x| }[ }[ W_ x| }[ x| =< [[ V_ 'a K1 (j H2 zx 1: :: >G 7: R p,@q,@r,@s,@t,@u,@tw+W[+W[+W[+L}+M}+N}+A|+N}+N}+N}+N}+N}+N}+N}+N}+N}+A|+A|+A|+A|+O}+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+O}+N}+N}+N}+A|+A|+N}+W[+W[+W[+:5+QG+v,@n6 w,@uN q4 H/ W_ HI H1 [[ V_ V_ V_ x| W_ [[ V_ }[ }[ }[ }[ V_ <[ ]A &< 'x w| wl um (@.hO x,@y,@z,@A,@B,@ru C,@D,@E,@F,@G,@H,@I,@>6.h1.}[ IE r( =< *< W_ V_ j} V_ [[ p8 J,@K,@L,@mQ.d_ y. C; + + + + + + + + + + + + + + + + + 7$ 7$ C; + ", "k. k. C; C; + + + + + + + + + + + + + y. k. 0+ M,@%:+N,@O,@o, _<.r( x| V_ W3 Yv I1 l8 W3 k} [[ x| }[ V_ W3 U3 W3 }[ |7 }[ V_ V_ x| I1 (@.l8 W3 k} [[ x| }[ *< }[ W_ j} j} x| =< }[ }[ }[ =< =< wl w| I1 HI sJ c-.h&+w6 1'+K;.e].Mv P,@Q,@R,@:`+S,@T,@U,@5c+m9+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+A|+N}+N}+N}+o1+o1+N}+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+o1+m9+W[+W[+W[+W[+A|+_B+V,@vw+W,@X,@5 S< Y,@+A $e -< %< V_ k} ;5 I1 w| x| =< }[ j} V3 W3 V_ V_ }[ }[ V_ <[ J( &< 'x L#.J1 wl V_ /<.Z,@`,@ '@.'@+'@@'@#'@$'@%'@&'@*'@='@-'@i7 j&+;5 -5 V_ }[ }[ }[ x| x| x| [[ I1 ;'@|1+>'@,'@P<+. C; + + + + + + + + + + + + + + + + + 7$ 7$ C; + ", "4. 0+ C; + + + + + + + y. + + + y. + + y. k. -% *-.''@n,@)'@%8 t6.j} x| J1 x| j} -5 &< J( *< J1 w| [[ =< V_ *< *< *< U3 &< It V_ W_ j} TC &< J( *< J1 w| [[ =< }[ W_ Is It V_ W_ W_ W_ V_ }[ }[ k} [[ p8 F1 HI y| %< py @r mm b: QV !'@3/.~'@;-.{'@]'@^'@tE+sx+}8+:H+Yc+Yc+M}+L}+N}+N}+N}+A|+W[+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+N}+N}+N}+A|+A|+A|+A|+00+o1+N}+]B+NR+/'@<>@('@_'@:'@)|+<'@8> w0 X3 }y 'a wl }[ +6 &< w| }[ W_ j} -5 ;5 M2 I1 [[ [[ [[ *< V_ }[ W_ V_ -5 um J1 Jt ['@V9 }'@|'@1'@2'@3'@4'@5'@6'@7'@8'@9'@0'@,$ J2 O2 r( V_ }[ }[ }[ }[ }[ x| V_ }[ a'@b'@c'@d'@l-@cP.C; + + + + + + + + + + + + + + + + + C; C; C; + ", "7$ k. C; + + + + + + + + 68 68 y. + + + + L/.B>@i. Y]+n,@e'@D'+)J &< [[ }[ [[ V_ V_ V3 W3 *< w| H1 pn <[ =< k} V_ }[ W3 r( j} V_ W_ V_ j} V3 W3 *< w| H1 pn <[ [[ =< j} j} =< j} j} V_ W_ }[ }[ }[ }[ [[ =< =< [[ Is hl c'.m} m} p+.^D f'@E,.g'@h'@i'@j'@k'@l'@m'@n'@bw o'@+G SI+7q+#k+Ar+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+A|+A|+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+o1+A|+A|+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+N}+N}+N}+o1+A|+W[+W[+W[+W[+W[+W[+p'@gw+>*@q'@L` r'@s'@O~.1,.^Y >F <] V3 F1 0L It V_ x| }[ *< }[ [[ V_ W_ V_ Is V3 |7 w| _[ +6 *< [[ [[ k} V_ l8 l8 yl aV t'@)B u'@v'@w'@x'@y'@d' z'@A'@B'@C'@D'@E'@F'@G'@&5 og }[ W_ }[ }[ }[ x| }[ [[ &< +6 ,T.H'@I'@J'@.Gm+Gm O'@P'@L% ]r #S+Q'@R'@S'@T'@U'@)v+y>@da+A|+A|+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+O}+ b+O}+m9+o1+N}+N}+N}+N}+N}+N}+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+<5+N}+N}+N}+N}+N}+N}+N}+A|+W[+W[+W[+W[+W[+W[+[5+^;@qQ+V'@W'@bG+w@ 8' X'@-x n( y:.Y'@&6 to $< jm 'a [[ [[ j} j} }[ =< }[ }[ }[ x| <[ *< [[ wl [[ V_ w| _[ +6 }[ ;5 ;5 [[ [[ l8 to to #%.;@.~>@Z'@kn `'@ )@.)@+)@@)@#)@$)@2=+%)@&)@*)@=)@pk '(+}[ J1 #6 b% #6 }[ }[ [[ ;5 -)@B:.;)@*9+#8+_=.j1 C; C; + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + + y. y. y. + + + y. k. }- Yv.Y]+n,@>)@pz [b.}[ =< }[ W_ j} -5 V_ W_ *< }[ =< *< Is og J@ W3 V_ }[ W_ j} -5 j} x| W_ 'x og J@ |7 =< *< Is og J@ W3 k} W_ V_ }[ V_ W_ W_ W_ =< V_ J1 }[ }[ W_ V_ V_ V_ wl I1 [[ }[ jm G1 yc %e U9 Qa mm j^ h;+M;. g =V w- ,)@')@))@!)@Kc+~)@p>@{)@])@^)@CK+2q /)@()@_)@4g+[5+1r+}8+Yc+6j+Yc+]B+]f+]f+:H+:H+:H+Yc+m1+Vb+dx+b7+O}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+O}+O}+A|+A|+A|+A|+A|+N}+N}+A|+A|+:5+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+M}+:)@<)@#k+aN+[)@})@VC -S 7u |)@1)@2)@n< 9* p= Tu H1 jm H1 H1 }[ [[ w| V_ }[ V_ =< ;5 O2 r( wl U3 W3 V_ I1 }[ *< [[ }[ }[ [[ +B +6 I1 [[ V_ }[ wl um um wl G7+3)@4)@5)@6)@7)@8)@9)@0)@a)@x; b)@c)@d)@e)@f)@|7 um AU nu b% }[ }[ x| i8 w7.g)@h)@i)@j)@m..a+ C; + + + + + + + + + + + + + + + + + + + + + ", "+ + + + + + + + + + y. + + + y. + + + k. 7$ 9r.,;@k)@l)@m)@o` og W_ }[ x| V_ j} V_ x| I1 V_ [[ W_ j} r( <[ |7 V_ V_ W_ V_ j} V_ x| W_ j} r( <[ |7 [[ [[ j} r( <[ |7 [[ [[ W_ =< W_ x| j} Is &< |7 }[ V_ }[ V_ =< ;5 +B &< T3 I1 [[ =< =< V_ r( H1 ln v| 17 yl Lx ^2.G*+&! [D 6/.0i+{0 ^a n)@o)@p)@Fk+q)@2p r)@s)@t)@u)@v)@p>@/f w)@x)@y)@z)@A)@B)@C)@D)@E)@F)@G)@H)@I)@Y @W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+A|+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+N}+o1+o1+N}+N}+N}+N}+N}+A|+A|+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+W[+]B+J)@&D aN K)@0[ L)@M)@N)@O)@Zw+'o P)@Q)@R)@ww J2 gl q( =< =< =< =< =< [[ }[ U3 U3 W_ [[ *< ;5 I1 xl H1 r( [[ }[ }[ }[ w| &< ;5 *< ;5 &< w| [[ =< k} J1 %6 Yv i1.S)@T)@U)@V)@W)@X)@vc.Y)@Z)@0U !: `)@ !@N, y} #C V3 J1 #6 kv wb }[ x| x| k} YG .!@+!@@!@#!@RM.[r.C; + C; + + y. C; C; C; j. + + + + y. + C; y. + + C; + ", "+ + + + + + + + + + + + + + + + + + G C-.Yv.$!@%!@&!@*!@qn %e W_ }[ V_ x| W3 W_ V_ J1 V3 V3 V_ W3 W3 k} V_ I1 V3 }[ [[ x| x| }[ V_ W3 W3 k} V_ I1 }[ W_ [[ k} [[ }[ ;5 *< [[ *< x| Is -5 &< J( *< V_ }[ *< [[ ;5 +B H1 T3 p8 }[ }[ *< V_ x| W3 }[ I1 l8 l8 jm 4j Qs ,s op+Q^.35.0M 3= Qh =!@-!@T<.#B (E ;!@>!@,!@'!@)!@!!@Dc+sy+~!@{!@]!@^!@/!@-A (!@_!@:!@>@Eq+Am+da+}8+jx+<)@}8+aj+0X+}8+%k+jx+Wp+1N+0X+~g+[5+#k+ci+#k+da+}8+[5+oe+oe+O!@TD+}*@P!@Q!@R!@I= vo+S!@T!@U!@V!@W!@|@.n$ X!@Y!@Z!@`!@ ~@i5 wb G1 F1 Qs yl C#.wl xl um [[ }[ }[ }[ *< =< +B +B *< Is -5 J1 wl I1 }[ I1 tC V_ V_ }[ }[ }[ V_ wl Yv pn -5 V_ =< x| -5 It J1 w| H1 HU .~@b% +~@@~@rn y| pg p8 ~Y L#.w| V_ (@.dD -s l8 T3 [[ =< i8 Jt i8 V_ Jt *< V_ TC #~@$~@%~@&~@rU.[r.G cr.y. H 7$ + 8r.*~@cr.y. j. H j. j. H j1 j1 H 7P.H C; C; ", "+ + + + + + + + + + + + + + + + + + ;% 8=+QR.=~@-~@;~@>~@,~@H1 [[ I1 V_ }[ V3 |7 2r 'x r( W3 =< &< &< V_ =< x| V3 }[ V_ *< }[ I1 w| H1 &< V_ =< *< W_ j} j} V_ =< }[ r( I1 }[ }[ }[ x| W_ [[ J1 w| _[ +6 *< [[ [[ [[ U3 U3 W_ [[ YG so r( wl |7 r( r( *< x| x| U3 W_ [[ [[ =< =< =< l8 G1 wc.^[ 4j f} E9 L5.[;+<7+<7+><.'~@)~@{Y 1y r) P6 F-.tn+Zc !~@#Q 9@.+k ~~@{~@]~@zm ^~@/~@(~@_~@:~@<~@[~@QO+Ak }~@)^ ]- E5+@S Na S2 |~@l9 1~@2~@3~@4~@FH FH 5~@6~@Jg+7~@8~@9~@0~@Cg+UJ a~@b~@cG+c~@d~@e~@t] _S f~@0~@Cv g~@h~@i~@j~@k~@l~@m~@-4 n~@o~@J}+p~@q~@r~@s~@v{+t~@1T |t $J y:+9A 0, u~@v~@X[ /A I$+NR jm [[ =< [[ W_ KV x| O&.rn l8 =< }[ }[ }[ w| H1 &< =< V_ j} I1 um w| x| x| [[ V_ V_ }[ *< [[ V_ [[ r( H1 3/ Yy og g-.h1.0L hl ~Y (@.pg dD G1 *B+w~@x~@Qs ^[ !J ql y~@z~@*R A~@xl jm F9 5< *5 H1 e=+B~@iT C~@dD ln qg |$.D~@E~@F~@G~@H~@Rh+ep 7` mQ.I~@J~@e$@dr.7` d_ K~@yE.L~@i. yz.M~@N~@O~@m..Xv.7` q H ", "+ + + C; + + + C; + + + + + + + + + + ;% P~@dI s}+Q~@R~@S~@,~@&< [[ wl x| V_ J1 [[ j} It j} [[ x| 2r 'a V3 r( j} [[ [[ V_ =< J1 I1 wl 'x IE V3 x| J1 W_ j} It V_ |7 l8 :E xl l} b% #6 V_ [[ V_ J1 T3 +6 +6 }[ k} V_ V_ U3 L2 r( }[ |[ |$.H1 w| V_ =< x| J1 V3 V3 V_ V_ }[ *< =< V_ j} Lg W_ wl w| x| |7 wl w| *< 6! {A &< 'a It ),++F h} Pi bV H2 'y u| bV L5.T~@op+BS [[ wb 0S ]j+no U~@V~@W~@X~@Y~@Z~@':+u3+`~@W1.H>.m:.O . {@.{@+{@@{@#{@${@n>.`l j:.u~.%{@w=.&{@*{@sq Y#.={@-{@;{@>{@,{@'{@){@GO !{@sq ~{@{{@]{@^{@(W /{@({@F=._{@:{@<{@[{@O .'Q }{@|{@1{@7;+Y .J].*;.jh ]> d} Zy kn n= Ml n8 %x x| w| I1 }[ =< &< _[ H1 (A +5.$6 <[ [[ [[ w| um w| [[ V_ }[ #6 b% $< l8 j} V_ }[ |7 y=.b% [[ V3 <[ =< r( r( |7 2{@e,@M2 k8 *j 3{@J;.:E 4{@'x j} K@.5{@6{@CO 7{@8{@VT *2 A}.9{@0{@a{@]R C#.b{@c{@,q ]Y }[ | T7 ot ;o BR ot J{@1,+p7.ot 3t x= x= Zm Sx _= .) 1,.Ww ;!.ct :& fk :{ 'p K{@L{@x5 `R 3,.Rc 91 M{@N{@O{@q$.y,+TT P{@Q{@'* x= R{@b).S{@T{@U{@{> 2_ -_ l3 fM dk ,s 7E f} }7 l8 'X {A %x p8 T3 um V_ x| }[ p8 (@.I&.1Q K< L2 I1 I1 p8 wl V_ }[ I1 um AU nu Dy rn %e Is :E to 4e 8W s8 Yv U3 wl H1 2t V{@W{@X{@Y{@Z{@`{@tP ]@.]@!g 7f Yj o& +]@@]@#]@$]@%]@&]@*]@=]@-]@;]@>]@,]@gQ ']@)]@!]@~]@{]@]]@^]@/]@(]@_]@1[ O=+:]@<]@[]@}]@|]@1]@2]@3]@4]@5]@6]@7]@8]@9]@0]@a]@b]@c]@d]@e]@f]@g]@h]@i]@j]@k]@l]@", "+ + + -, a+ =. 7$ C; + + + + + + + + + + j. ;% a+ =~@m]@n]@TE xg Qs p8 dD og )y I$+|'.Rq+tC wl |'.I$+4j ^[ _<.5V bs :E o` o]@2&+p]@q]@xl xl rn _<.Jd.q]@i} C..I$+2&+u;+d>+^[ *B+G7+r]@$f.Xz ql C..l;+O&.Rq+i} yl s]@=*+G7+o` t]@W6+ql H6.Jd.s!@t]@W6+hl (A {o X:+I$+o]@u]@o` O&.|'.C..,x xg $x O&.o` xg 6M $x xg 6M v]@s!@4j 4j G7+MA+/=+6M ^[ hl .H gl ([ tC w]@{A C..I$+_<.t6.t6.x]@&d+y]@y]@y]@Av.z]@A]@^$+K .op+.:.Nf.B]@g)@C]@q+.D]@H%+E]@<'.F]@F]@z,+>E od+5)+G7+BS b'.G]@z,+ig 92.=;+h=+H]@T_ x| 'y h=+[b.mu Y5+X6 Rx lT $6 5V 6M I]@}'.J]@^$+,T.;{+K .E]@K]@L]@y]@&d+M]@Tz+Tz+G7+p8 wl s!@N]@~=+t6.u]@o` O&.6M |'.F>+u]@G7+r]@af+6M t6.4b 4b O&.Rq+6M 2&+~=+G7+r]@xg p$.h=+o]@F>+o]@O]@(=+Y}.C..6M t6.P]@Q]@R]@S]@T]@U]@V]@W]@X]@Y]@Z]@`]@ ^@.^@+^@@^@#^@$^@%^@&^@*^@=^@-^@;^@>^@,^@'^@)^@!^@~^@{^@]^@^^@/^@(^@_^@:^@<^@q8.[^@}^@|^@1^@2^@3^@4^@5^@6^@7^@8^@9^@0^@a^@b^@c^@d^@e^@f^@g^@h^@i^@j^@k^@l^@m^@n^@o^@", "+ + + -, B>@p^@7$ C; + + + + + + + C; k. j. R~.}r.d_ R>@q^@r^@s^@t^@J( [w om ib =< M2 |7 [[ W_ W_ W3 W3 r( 2r l} JH td eW [[ l8 -s ^8 JH k} YG k} =< Nx JH k} H1 -s -s zb cs i8 j} x| M2 CF ]A cN V3 M2 x| [[ l} i i2+u^@#6 l} [[ }[ I1 b} 5e rf r( IE IE 9f M| .c ]A }[ x| x| [[ M2 M2 x| [[ [[ x| x| [[ [[ [[ [[ [[ }[ r( V_ [[ |7 -s k8 |7 x| Is IE +B |[ Vu 5e .c W@ J@ |7 l} V_ w| w| w| w| J1 I1 I1 J1 V_ w| =< i 2Q J@ -s zb %^ =< V_ V_ I1 DF L2 k} Yv DF H1 l8 I1 V_ w| V3 +B jT JH i 75.%E ;5 <[ k} J1 'a jm F9 p` HU YG YG <[ 2Q <[ I1 x| J1 J1 V_ V_ V_ V_ w| J1 V_ u^@u^@x| *< W_ }[ [[ [[ x| x| x| [[ M2 M2 x| [[ |7 |7 [[ l} V_ +B +B *< [[ |7 |7 x| |7 Yv IE r( Yv |7 [[ [[ }[ r( HE 2r l} [[ G8.v^@w^@x^@y^@z^@A^@B^@C^@D^@E^@F^@G^@H^@I^@J^@K^@L^@M^@N^@O^@P^@Q^@R^@S^@T^@U^@V^@W^@X^@Y^@Z^@`^@ /@./@+/@@/@#/@$/@%/@&/@*/@=/@-/@;/@>/@,/@'/@)/@!/@~/@{/@]/@^/@//@(/@_/@:/@(@,(@'(@)(@!(@~(@{(@](@^(@](@/(@((@_(@:(@<(@[(@}(@|(@1(@2(@3(@4(@5(@6(@7(@8(@9(@", "+ + + C; C; C; + C; + + + + + + + C; k. 7$ G y. C; d_ I~@0(@a(@b(@c(@d(@e(@f(@f(@f(@g(@h(@g(@i(@i(@j(@f(@f(@f(@j(@k(@h(@h(@h(@h(@l(@j(@g(@m(@n(@f(@j(@k(@g(@h(@h(@n(@o(@p(@n(@h(@g(@f(@f(@f(@f(@f(@j(@h(@j(@f(@f(@j(@q(@r(@s(@g(@h(@h(@g(@f(@g(@h(@h(@h(@g(@j(@f(@f(@g(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@k(@p(@t(@m(@h(@h(@h(@h(@h(@l(@g(@u(@v(@w(@s(@g(@h(@h(@h(@h(@x(@y(@w(@z(@A(@B(@h(@h(@h(@m(@m(@h(@C(@C(@n(@o(@o(@n(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@C(@m(@h(@m(@m(@h(@m(@n(@f(@g(@h(@h(@m(@m(@h(@h(@m(@m(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@l(@j(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@g(@f(@f(@f(@g(@m(@m(@h(@h(@j(@f(@j(@h(@h(@h(@h(@h(@h(@h(@h(@h(@h(@g(@f(@f(@j(@D(@E(@F(@G(@H(@I(@J(@K(@L(@M(@N(@O(@P(@Q(@R(@S(@T(@U(@V(@W(@X(@Y(@Z(@`(@ _@._@+_@@_@#_@$_@%_@|;+&_@*_@=_@-_@;_@>_@,_@'_@)_@a(@!_@~_@V!+{_@o .rz.]_@^_@pr.k*+/_@(_@__@:_@<_@[_@}_@|_@1_@2_@_=.#+ #+ n .q "}; marionnet-0.90.6+bzr434.orig/share/images/ico.switch.on.xxl.png0000600000175000017500000000364012167200764023141 0ustar lucaslucasPNG  IHDRgr^bKGD pHYs  tIME  WE-IDAThKlT߹3~0&A`£Ki`@DE\ݴ ric.ʢBۈ6E4mTh Q 6lbqnL->®}]ޜ˿ni:a]^^{WSAι. er }xy8oqqZ[e31}3em`d4&h @Jdvr@00F00eǏ -v%UuMRNVR<)ǤL̈́9`g/4e 0q '\%^ gYa 'Cp+Q/X ?#9:91u PUH @K<( ReqˉAeFvOZN&&42|Aq ev9'QV^v:[WU]3#Qܖ[&P8beČj$-yh s456VUל'3w3+Ks2 = BGqŋE !ypK[h\|]^&mߝsoOr} M sԽdٴ>-ϞtR:U =+gzT=9:ڭ=u@״>n[{sˡsVᣏ^vkMOKUd 32/bd4U_|u}yO"w\= ~ 4 ?^t=HnVŔ{p`|ߐDF;n/@-ر桺+ho k,]Uu3,{|~J@D(n򭂶vy@5@Eὴ|q;w8eVj4lVj h$i$I$IB$|A.\r _ |x|A;o]%NGϗv!/Ɉ"qeh<&`I,X8KH2HS 9kTIÇYLY:0|ӧhlm5r2\DFh#Dۺ=씤!O6S4>VOKŠXPT!D{Gϻ98(LNA)ˋ۶ƦM7=\;.h[8#XCaz'6`1(Lc)!2$#I&@EQ_;9vxx*~Lg$EB:>Db rF&EU IBHg, R{#1ne7SߎْmB x{@e[uEid/>{4Ne)&B!Y u,#IQ'ܒ kL/1[0[),]cIJ'P$D`e(+5[y;3/*(P1+屚YYe`XtT-_f, 7&c?|~?v/54_JNLJ|?;Ctgk"W`ޢqPQ:{oHC'1UN f_Bҧ’^8hW%j9̨|z'2)>x~+XOG^o+Y|RYf7?>`goY͚ &%~BQFGN~P;7TcN,`3Yl:|u(FԪqdc';'.B*ekklyӦK8<ƇN8ߎӭi}^5x\n8K˱?)wDT6=.^sОӖ+3S@e߁32MsRW'"JÙ\m1ɠlЫ*l AnpRҚTS0s3R`;8uf|7f0e`EȰ2[Ekm SMnIt ׯ #Ϥ8%k YV3 Tjcx9+ϺED5=wܘ,AǗ.&L] rcex!-MJȰē_P(͢<#ξAmn[t B%e6ף_ \!r3zc5q-c1c !جj : yPDP&P"Unyf.BMns+l}esozqQCRmif,}HE@bP`}+c'/WTMK;pzoRIENDB`marionnet-0.90.6+bzr434.orig/share/images/logo.paris13.96x96.png0000600000175000017500000000250112167200764022662 0ustar lucaslucasPNG  IHDR``w8sRGBbKGD pHYs  tIME  tEXtCommentCreated with GIMPWIDATx-xJ}Ա.\H$8rW%\d%5.]d*$Ȯ؞y&m'3?%7ӡx.M6-=7u5ӱ}@'< @n^= jE1^4xWHPWCP@ d{~ +k|qB4+qŨVNu+F4L""G_S{F~fO{Iao;z- lyH4#vJ:.jFOtiC[NvȫLlzg-"2dTo;-Uah勒,ݩTXUs矷>+Fҭ1?_B?+_g]:8ĤiV[.qҨ|PgO3NT@3[ԷBi%j0L)L[2 IN@4#W)<^݇h=f{dIiQ?ɳT8IA}X5ٓUtlC.i3?4Lm}.!X>jc ["Tv/1|}UZ(bHi5s%~egVCm6C8)mܟx`-W9% z23u:sՒOYJlRoQR=SytR8dl2ӌ)ju4{΋R"9^V(([{84y·S<[lqS-XS㻺Vs+^v$3$ĐzF6.M'wl 4 XK|Q{C [*NX*!6ž-B)B ) uuC>swR?*c)kad+^CxCZ:f{c^ XU[ Aϥ1mϨ0.yc.Zy H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxoLǿSד<.EY!UB AZ)ӭM[7އN)͔tMfжF]Ҏk&ͦ5M2 ,9C1 &g^`#ꀍ=as==ݝe .rH@@$ $  $H $H A H H@@$ $  $ $H QJ17.~@OV5՟D"samsjjrjWE{OZq/V=6& 9^d@Qx=M EQa-b6"U b61BB~Cb,fYfw-Fq|?` ݶVŷv_$2fO=x]0lj#RLc1{رa{l$u9??6gGtuo;+W.4n~s?Ӵkg^BpݸGO_>(Ɋ7ݻy@ؘٳBKyF`1^90G""T9ϭu-b61CWϭ#Q>JLnV*_'I VT @W4͉ /b6qY)T{V`Ig:,=R551柝MM`dUBeѣi/dʲz oܼ f&,vDxL+1ò&N1%v C^aܼq#V=\JL'흝0LYNr255w ?1>ޛ]r@tGq+_Qt,ù?z<K@lFw9Z-p'&&Z2éX\$NR=/RkjXI.5dkjjD_lfVG) ΟGVj1Y'hI-j}d橺:R5ER2 HB#g\BWG4Tj޽Kŭ[ٔZq-H&L$\XBr{!J" r9J%JeNa娥klzKN`z#$$Wj4drq+U*T.ʕř9V*8<^WH&n92d2( (ϋݠT*J޻4d2Yշba|\-Z~g.f woKi/M&Cmwryj;%[J˜'#DZ}/R%}$^-:G_~/,-yxOиn3 .]͛VtYr^M:ݶӐ)j\_&!|>}CF#WSS+秧~2y)ײDC `ZmluW81 Q33Am+ANe`bܿq#jmm9%T{x1+-U?|>\.7J1u{P; [Wmcc -ju2Ki.T󁓁@{7oſlswvtUͧTX̦>#݂X' OMN,+U%&DnӦM{sSS|h( vC/þs'qfB2=۲EmrH(zQpHd==Z6>ng0T eC ,Pv3ݎ΂7μGS@6Rz$0O6x!v xo;^o$0Dֶ/lIfΝP<=vO_D!4b'XV`ZB@b, H H@@$ $  $H $H A H H@@$$  $pUIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.med.png0000600000175000017500000000557012167200764023626 0ustar lucaslucasPNG  IHDR**[bKGD pHYs  tIME IyZ IDATXõ{l?=9cc&{[qY՗\笣<Qd0(ReZWоxǓgzl&'^=ƒU6yciP˪Dfn`;س)űxx86b $ \F|.]aVW5 mzV [ut !^BB r#F(̼兤"M"?ݲeppV48>-?wv[52/jVY`@3v{Ei^:"d`(Iܥ 5CIb o2DN>tKE3qdX?X2Ŧe877!*ش.3)wpwÜ!4EiZyΦ_EA3^Pf! 7/2>N#кMlv.7J+v6WU=`h:ٱLž7p\2  LOkܘИry+,h*U4"4y22ͤnM&OƐRCbic\6XɹEA8qc2M8s) j@>` ;gSۨOPrɄDl*A 4MC"K|ԘofPt2;3C հk ܢ`^*\{]4WR:ol箚RC#~yN/xVdNCew"A8QMK B7pT6G|7=]O}e"~|E+S4PS?ޜztKWw*۲ Qxi+8U |GjQ@)%N|;^xA>*6XHY}VJUJ._υs͝EgK6 op*u{t1fuwK:)YTUH ~ה1aև7r:d\x#\?7bzOݷaYMo~nh*/5 5Oj2lޤ۪0zd YLfb8]nhoy?7o_.:@VՋQTcS&V?4zdGMUU;)#IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.switch.pause.med.png0000600000175000017500000000344712167200764023601 0ustar lucaslucasPNG  IHDR:0NbKGD pHYs  tIME #u2xIDATXݘmlS^׎ phpJ&xkX;i4/Ӿih51躎v/]E0u0(ҴBRBM$I;ueZHG9ssh{v/YMO2-[g>Ҿ< 0׆;f˿ F⦍2螺ݖmw4 )1箸.'3h G%e^SYm8ƩOž}' Q/"d*V2_d~Bb15Y:?S'NbL<&''2Kx}B^d}o-+ٲ֐p,-&WYXFtC<kj4ԿEAQ97n7ʭ@43\:bԞ|Ԣ4x!vtuYXƍ7C* x%c῞m®-iڍX?4s }c5UL!zo>n{Cyʴel4Į$ze*J||=)DϟȭKckwbP5fdi`0 'xtb?FjwP`2'}Vcp"vIM@#q6RaCYP#HB],O=ՖNxoleEU1H&TˬvGRTESs&Ύ  Ȩdب㜸"0_.Aj((?#gr=ٙK. KQ! sG#[y{ZE*: &3AZEd& (h]x6HNLTdل⡼ElM BD<>C4w?c4<8!M1b;* ]ThUh]r)>ܯi;hHAh2`[˷@iEńWUҜyoOlGk1d1B\1߾𻣕۾ 6Y q1T@hLĸh:2;-R<o)Wy hgpߡ@_+#X]`osmW8rOW[Z-EUUU]B!| LAAcU $.X702=%?;>eesc 9( <ɽM^ gVRLP*9 /g)JIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.on.large.png0000600000175000017500000001054712167200764024773 0ustar lucaslucasPNG  IHDR::J(sRGBbKGD pHYs  tIME 62zIDATh͛{pTU?v;IwΣI1F^bx8ʊwGf-f]wfkqqjk!UT9n(8 Q!@`D@B>ز/͋vU+Spdf%8=?޹-oMSw\ҧ/o}ڿ Гvџ"=d@[/x[n\Eiz2z9_Df9y~/ ]X `A>@x }MK^x9/?{x9[zmVG>paQ?8Wf)mO(9P.BT !n>w [&MƱ(> Whc@9'q[r{Yfcey1SfZ\mS^Z"͇ZHJ*R8[]KW jɴR"%4\nnt!Sp}޲m? a 2y}|Ts=txF<-ß!guZh<}|Ojcqas7j"˝o[; 8V9P|؃~FZKW49jj)0u&7s-}#.@ WX[ǑSU jٯW?)mʃvB;<ʦ׶ixҕl&z}eeKjW 3 2 (uI^>mȉ3nmAU_2{*g 3+ k HEãoؾ^uxs$QyBNwBeFD^wKZ/$Q }S 8sXSt;"A2or>N\UQTu/宕אaEQt /z ?)&n5ŅtPq/:Lr,bR&F꫈)r0ܪ|G"wz#S,f=EqS 9jWjjOpRh~a/jG;6d*s}Oʞƃw&%=Щ당se6aaKc OFMMkя+_)1V[X5{RJSK#VU/VEm Mg8c l MCjh-o,ebdzO6vl2)~^/6W&$m5edk3u}hPSk~c1+# Q>p9peXW\֍ZˋU Stأ=n8/+pi^8p. ,xxٴiXOk0&gP/N-l s$ Ըq'g[Eɰ'EckX8tt . rQT߹CڳҊqX$%D-ffU>z@(P}-w"9l9{O_7}vHn$XJ0#'Ɛt+ZsoB.Q jJ#Y*%Lj5*%a9chkIF_٦4?hH- _x<[ecvQ7>Rvo׭=u{黴y3-nOLF I USK2FLd($ QT(Q+a}L7^yi%sϰX!}}5gfqGɟ`ұ@ 8›7 00Ǭ@]BP؄*4'iNxiV"5  22d: X.quTNYWp֭ꪌ%GqpZVkq/Wb̽v7!}.-[[H6|3Ll:> 3+,?WsHnݽǞx5.PDW"#1exh:bq`]-' hϠm:[pd쯟3!'O3HkYop`[/(.ٳ{ -ݔ䤂D\8V>|UGN^aM$$Y[Xqhd~<-7ͭ}C m l0{YYJǴ"ZC\;<:t-Ab9.kϟ0o4*O>%^ꋔ0e+~:AWeX.пki%0ꂅX?t񓟿YEggZ\R4-Uo7 lhqS ?ʛw_&h `1']γY~=l]*b銿*b 5i+)kIWN}_(=a V%8hhqO8:2 ̙-z^V,% LxE`4.!j#«WZzJ/+~N%p+ 5spyeQ2 ,iYE͞07OQѠbNP1} `4(^4Q~XU N ##d[V`uku%Uw=|TA\>LF afFF6!ć'j?Y om-_8ׄdY9z249x8bI)i#ߕЊưE|.J*Tok@Bm=ۥ3B r4s6f}JQҀ5̀#ZM!eNA ̾e| **g G!nӉm*ZM[h!9]my./8Oe~E9uJ|'b@c/ ]H<j ]^G{6' }SSƫ?*}=QA {AsnA[ Rg$u:^u>֥၈Ԯ =\TAUAH9R0 I )L9|>0(LKw0H"N~t-֩3bmcmmzܤLW":8rˌ?x>LA ^Tc:BL#>GG֤n!hj\='_hB"E0SlxD<11[v2%Bz$#T?ܼ*!+rM\2iow[@ QFU݆D+S %$; x%:,TT ]!k,c y6Vt+خJq\3Bb@p=[V́>@-i5Ge&2,?#p,)ˤ #u <{$"y _~llG]N (@EqXԎc%Ɯ˖z²nf2~Qm^jQ6qLf;=8ũeRiݫs[*HԢydO2sj ?7-zb" 'O՞ǟ습I/bYު':_>t@'&Mf; _`n; a@'ܻ绢%ͲU[cntEĿf;j'K_tpCwD>foE>D/qA69|]ZI:UNup* wR ʭ+Vw^^XKi篺*< p2NMq@2JuŁF'.W6 #r@Y]mTIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.router.off.large.png0000600000175000017500000000353412167200764023577 0ustar lucaslucasPNG  IHDRU@obMbKGD pHYs  tIME  PrIDAThKlƿYrI")J#"k5F$rMPrh>C(ڃaڢ!ԇ u"b\;8eeJ2ISܙa$Ňi X4ݙp?!x`eiCB %RPFA PJA% ̶I\8_<aED^ *r\U=A(Eq` >X3Ei7ϕm1s0(`pyp9G'8X]M'ed>O>i%@BciEqEF.7<AQWWP5Ry*`%S%B nX+ 7k^Ѷ}k++w$L4 J0sg5TcNSʰ11f3e)J4BH!LȜ nX5Lap%N/f(6.r<ącUPxၡ?OUϮhKeH/e8VS3ƪB1@2+RfĂiJI)"„+8syU nXcvy2ƭkW:ozoDHgJC/@Q p`- Lp60*VhB@P/OP*dRJH!,Vp+,d@ a434M.\K(<;әRn}|U,NS/W Q#+ƕBio0J(M Xv P-NWNVNkSv܂,` 0FlMZOSȥSX:0Cd z?3/ٙiܸ:UZ)%$0)ʀwp_rrrn/áoamiӄZ127 b֗7PaUv}-kݽ8Գk;J.numaKR!N!NzGcÈ5Lk>|!փR\0N ]V#:Yo'{^nSGXsRuh=} .9}0|}g z[Gc8FQB wqgSKm&Z!?=};ΕUbgu nQ}wċuҦ>/ΙT\za\,7逶t 2ڲO>6>iHFo([8488mA돷 j#'Gc '>acM==n">xۂ{vG/\K{{{ӕ;1q~7td3TZġF|butd~jRʧDDJ9Rw㕐z?Q<4jI$)%$[3ˌ-QSTսu UTUCbA,zTlO-ʃ4 @;IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.hub.dialog.png0000600000175000017500000000263612167200764022433 0ustar lucaslucasPNG  IHDRppKbKGD pHYs  tIME  4)]t9+IDATx]H[ggSOh>9]mDj`ځfXakanBbtv :ƶ28-:cQZ;lMXajF33BM&1lM"M|y=p" <P @BH(P @ $H(P  $H(  $H  @B)P @BH(P @ $H(.Amop2Ti!'^ #$zOLv+%6[MIL2MNwu sK{EEMyd0b C? ^ho+8#S%Onn.-@$EOVpJ1_{e=AZZZh$=4 ¿p)u68REY~wFGn7,7@E _]F$V#GbnΏ~@˅^p՘}44d}P(,w;^_17PfH?G71yd"G%lG"Ĭ{U8'B1Iy 38(ěAXUFT ; PPdϔl'/pvE;M;w(ʮ}&Z'moKϧf_ IOY ZU4!9n"69?:[ /tڒ/]&TRh"dwLbx!@ L̫BI,f3^}p$Ak*bQrŤ-f+kܨsCEV nWrE]C㱘vx Eh2(;KBU$M 'O{?D}+㗑>P{e=:3Z7>38 LmQU"x^VĈ̸e {k ,Peزy"/1:Y@"ѣahHDF,@nʊsEυUNWY))P @ $H(P  $H(  $H  @B R @B)P @ $H(P  $H(I/ IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.hub.on.small.png0000600000175000017500000000123412167200764022710 0ustar lucaslucasPNG  IHDR, (_7bKGD pHYs  tIME &y)IDATHՕKTQ?ޝ;ܙD #) iUhnզm Ѧuh#m+]D#3B!H滸>{~/if87oݶ񁁑j-TlHg1 XqlJeԵ&ղm8F-¬"ubL`0R} CO\i.5>tɩ)RjRF)֚4Y&YA.b8/_)D=\7uU)%i+ɗVCbIf2?{X4Z~'p~V3D"F Jf2'V\-a6NbxC{+%18Acwm`b2P|&~]<|l7NACpT @Z{R=bg>ƵCzଳ[_bW. 5띶tp!DZktT6aFȼw-π}{jh,Mh4Ơ|B_6c \.,!\@Űw΍&=lD୍x)0H A hB-07],5 .%cCCkB˲0ĻpnӶ鳧F091j,,krr[[5zVUZof9/ Ƈ0PTmZW_ȃg[aFr'vC({n[ھ!zy!w7z'?|+s^<}uaGi,ӂt,s8!B!B!B/3"8IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.on.xxl.png0000600000175000017500000001360112167200764024301 0ustar lucaslucasPNG  IHDRHHUGsRGBbKGD2 pHYs  tIME +.B7IDATx՜{tם?wfHo!EIö('VlǶӮO~t7v7N?m%͞S;{={zumƑlXeR,Q$R")>$R 03` !Zv{ΐw0{}w Q;4oG4ILԎ+@G/:,kU,iodKka.OF{4FBz:@"A"{Ґ~K:*r^])r{U.X۴t?YXHJ!~6p g/=Rq6һljz(ri %[Nnu."d$,BiF}Hs=?ǠáxCӏ'_wfC'Q8pNԿyQvZEݿ #F@gSs!W XѺyRµ$ ~~=ta$<;7>of|<Z"J)wہ/ _5]KJ_·6|+,<7zeo9DPN#pd!p1*=4ߛGvӟ+@3@orn|&Mx9skRPXWQP3aʏw 9MoRߝzcFQ.ΉSScNa8͸Ο>{x,s򝷹<Ω\Gg ͱou{B$Co32x]_{ah,g|:.\D_%,v }pcBzg=LG Bd0:Y=615^Wu>9 P\?N%{1n c|_ Lrwwjڶg{>;pETӠIYKv '46`?cN$2>@D^9>]Zȕcov&iN%_Lm׬dSe&NPx$62F8BA[m,ڮ,g! L FQFɵe7Ç81jf^/lϻyx>1B_ё^Wɝo"rM/R_Ur= n$>™+`:4ITXyrIbpWR Cgox[4y G"|<B s 6w7X'D 88Bdx3 I)R286 rc,# + xj[ ]`,(;}|IF&uHH6Z3I R c}=Tĭzci)fe!{ MHdE;қ${RIO1@ӡ}@Ӂ?N`^/_fZISEunjN^yaZT5{\6(EeԔVqR?s|]}z) ]Hzw*Y(|\Iei\6(Q$r޵J+'6Eʬ %@ZR;z |}gox/?~@;ǩ~s $cQ ecPWD2gjNwYݳۑŠ"Ib^1n=y mf=_^ @p֐"Dj o7++:晰7/ کR`)/m*[s7ej 0wf&gw18[I1܍q8E!J6qΦE}?}Zm }7g، Z׼a!uY>R.S14>k{v[HQ3Pi ?)cjj4cѳghqRZZbOz+ Cl)k>zp.Wcv{bsjN%TkAJD*~MLOfjj`(Ě_{BpGy'8؎iO̪A{LH31Uvc FzTDuQ4mHc '"OмҘ;f2Nxtw{Y&# qJQTL 3vmzR_z1 }dAIRܦO0:=!646A [q1(ճ&mP4i2ePj|  vR0=ɜPJ 0<4Hpz !6dxhA*ֵ$2(Jl&)%TQEխM$U8qשDnHz1>u$b!eUĄJeƯRTR51ε'|Z2Hy&Rb6@T0LSJL3]Z8uoG@JYTL1%:29평wi'ݣ?CÑ*dӈ$ >O=p8'լ&g./:bs! 3627p0=1:)"&+Qά񒈳ϗ$\.\BJJ4c#y4beꆞu ! 6Dqhsi8 H#Ǹ/0?ZicE:PJhkؙ^[OcQZvP$?3Xv359ŅsgUni5@Mՙ\;t̢)p 1KPEȨӴ&d[*?_`ly4k҄v2y̆&gF߾͛6z7^=@~?:EŔf D?e}k2Fu)N3e:Ū2g M8e4H)B"/[`Ԁ;@6ݜhY[>8DGsE"[TF(*Uh_}lg^ !_SUu`=9(pDioOqck>hv8BTŅ"4@A )HU铵YWg.rt`Qv$(i4-kUPrt!֯c*Ǩq5fLg9MkB5J =Ss +ȩOֆݵ7OBUMӸc&sssBTM%h40KaQ N ALn2,u&IfRG-) ol(fV_?:*3QȒ cy' Kt#mv4KEAQռ6(DU=zK*%(VJ(BXP@q,͡O;}^O2sN!9'# ܒ}X[ۗ#)UQI\B@VEZHQFR["Du7dhWS!#^i$g^kգydIDg\?dߕyb;VRrb E⎬f+Hiy A"Z([G,04E@03V;zxΖƳ.ZXkLEJ۹JEe5^^:協SSRA'N |b%6 phzB9[ײo;3W(siOqQ(o=+8!E("͢aT%O+FQETwP?XR3 *0s-^੼5(}km'rgR;4/OO-2 'D"fJ&4[lH旅ab}|7S+W-]s!|ME/uF3fAg wnܾ.qFUv`J)c3(aNtSAJeRԇk+'tԭXn|O/D7N sֿܳ5#3 /;Y CӲ|%Pok)Sgb^&{7,zL-ȷvȩٖ,m2If#4$^e)N]dr˓aLUCJ>vl{)ax:Ko&a׮x+3=gUgAN.·656/opfd4,tQ$gG(|hx'>x+X V؜/8m9g]0cs/z)׋vb(*#a\56j7uZxh|Gk]]3'[*d~ˢ#~}8u+u m ;wVۛ}H)B\cEGZcI|ܰV7?nގ2on u%<%ZhuKw,teR@^6mɶlkp  [<4kgcU|uE9VY@q^Re o5E4/_=siZ*KmPsgCSxZ[W{sEֶʎyQn~Q͜JMσe.M{Ǣ/?lbRJޖaޛ9%Եoy;'NGu\xp^.5 .K_H+6w(e{hDžnll)#lR>p=jÿzQZ>|?('{&:6)e{6X@ tK)}NJ/'΍'0N J5ݿv_npIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.crossed.invert.png0000600000175000017500000000210212167200764024420 0ustar lucaslucasPNG  IHDR0  pHYsaa?itIME AhwtEXtCommentCreated with The GIMPd%nIDATHŒKoUsfI|ɥnl4Y "B X@, `FA@ݰĂ`QP@(\ui39lZ](,jn=;{t|yr237bS-EXU 9:Gj)%Q_6z6k;DXKr_/pnռ}l +WF&rn`Ӳ{!v;tK |\nt/=J QAf̗dR#%`%h L =19;)NMsk{R))%FRvr~l̎2+Ӳg|~? g`sͳO[#HNli~ɤYYK.Y׶{^MMMma^rx%CЏ2*4v]B"C(B^0Y,]_Yw'#1{jڙ*{@ @QVJ%94J?Y!̽w&WV>4Ymq^ >cYKMӼa/JJR3*Dɴ ?o%+8wnjHM^\{ݯ/Z[=[ S)L5qڵl. B=8x^;Mp{:B8uZfa{{MO֎np򫯼B K\i:Qb;.Ǘmm39@8B'zX"FƑ/ٷn^c~~1*zHl]c'NKpP5~ ?&iHqANj˜ؾK6qjo !4˲# йspZ}qX,Q4c*bvgv:Gd.Njie,ltZ==_t]R^O}TfR*'j7sBDB>*w2̅0i?}$ՌA|IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.off.large.png0000600000175000017500000001025212167200764025122 0ustar lucaslucasPNG  IHDR::J(sRGBbKGD pHYs  tIME Л4W*IDATh͛ytTU?RY*T"U !Db@le ˴G=6NOQ>}z9G{Q!ad l &d!J $=UwzՖDg9}z舘@0{^LCᖇU h@姿xGʀ@A5?v5U?̥+On`XOWnp@v7o SLdzH`kmIqܒ';S5=mhp)[^~hMk34$pv~VDZV Cc,5Gv+@,w%ĖWim+/hO]s-qk.:0\ ظgڶ>`Y-z*5 !llxB3ށu$UIT&I}3&tL$Q-8=qz]vj˿_Sֵ?ŵ zf3Faօ|95w2 =5/"~ ͡fn>DJ[Um}u.9a|z/94Lb` @^%w!c_}.ߺ'"Ў2{;@ntU+gZ'cpu6Qw"E.BF=N=]\Xo+mk'p7RV[|aZof^GU37|־x,I0~-)L&$a\iwGg DDMT}=#H@䖮|a n]{P IT{FVE/YNIOϐ&RMQܚL{wR'4uu].q F2rfxL\ȾȯRd7LHKg9K,p-3W%N ׬qt8Ah4ǂpѓ~UQ0&ӗ|[/*\Oeq LɘV@p<:J/&oG6b܁XBD+*E+HH)V;)V;K?55kLU!cMe\v(R[ƻ*Ph5("(<u\Q4}N>}[Z@xj%wo:2:}9e]s4ctXBh;g;53yQ,mjnȱSU{U~a'n!~1t2}@sks,102K?ep;H_7.'Lۺy:#wZ#k85>,@QOeۻڦ.r$$Z^ř}"yM__7mʂ$ON`4G} ӿ%MUj;+^hEcihXa}grkEe_\ƛW޿yݽew=O]p[_T^:ty^R[ҩP?`M?ew),~?0-dc4%c2&`nSu7@5`Ctl4;qDX'rA #|zq5ʢOYE=i9uA %.}RflxfTH)yCXavug/slbNU=>7pk=@ RjDsu"mj6( f(c-z7c~~(DP@x!4R=!(R mCJ 4$ *4d7Max!!x饗pETUlnn2u!TU4EՂ0 0 PJa*$a`X,1Ha!AXԙmhh1mPJQ.4 GGG!sa}ME'n۶Q>En @)Ee}6$O?1RTj4Ʃ!RJH)"YiHB!zZM{qLNNB#ĵknQ*P.es^ \tjpBh "dYqP*077w(A)ee>lFQ$ܓRt#k.)^T3 ckk|:MSdYi )$%ˆHBĶQeZlqCTg0`<U4E$`3(fYadddHJiloo@EubVB>UNLL CQTVRJH?3!8i$ItK|G$r 84FFFPVcyy<*eqi0 "9`jhj^5 <Ν;Z /L?hN+ʸ\c 1iڧV{U|@J)^ٲ>*j/1* TD)ETښN/"fgg5&6771R##pl"?z|jA#   Lj3g055R!T 1U?W; SZ pGGW_\=G(8akN CB)SJa& п)C0y*ũ`~ۅ8 ~]M,ˈ̏ڟg8sˏcGMJ]r&CJ^{  -ltEbRjxضMм>* * LFG~{iFsnus0 y晾>?~R5.0\DNiOROUf}?sΧ2eD`deZ`U^^\\G)=ی(n_~ R>,?M!LӄeY:{paf>4MRXzh> @Xh4ZAz?^o_G}DcRi|kk w=UUTjaΝCQ0cyygϞC(}i^;w8ݻ8kf1"f`v@`"*=zVyoR SSSwBnRʴjIN^IX4˲4MS8Y${ttPr!ppp=J%0;W^A0ߠoM2I~ eQ!֭[K),\^ L6x D|g@UD4A(FS-LEKsg'ƒ ,%GV :I(pPE\^̏i[>1/džhO.2-Mc.qT lNёq)" Ȑ끶j~j 2b-K $LOK{>W Q\$553i\Ns@5J'&k v?88j_GL(Ȩy+P~U%Uy;w'!F_\jRmzq J6Z1ˈںV>]_B z*Vm }G 1h*cbVwtK X{,QEjJ_i = vq|ӥsnD@ic,dg,[l5㚌uh LS@pl`d*U0Ws}TU{%c͔?5~n!`e06J R/] t)% RX,d!$S)< VDt pVpSWmP1  t-$B6d ͦ"إq}˜~wRa.g Ո;#pah Z0Eg{= +YgFĻY"pv~8uZ\/=<`a ٍjIl6%='¼2~񺦣iG+Jnxś$`S#8q_*|E=_?_,7v-TT):+$آx≪0!zu*}Ǒ7mE&fP59uw4M`-ьI8S`YLOsТ~<~yqp;SF4WC>o\??ƿ~vG˿zo]2 ~a!(*MpV #F!pQh?"-vIJe2-Gюx-d6+fٜyMhX%K8=qu2("WG˚~O0]Q)EQqmexRȚ[/{EV- Gtz ?Gǎ\Q O@EQ`\45a4܃BQDD:  ڻpO`^ 0ÏUj>wJB nNQ>?;3E)|DA@D䈶.+WmǨlLw*fsEQ}S:``Z݄F) SF)h??jgcVHCGXHؽ'=q=,(&p׷FM%\8s:p5oK:ڊbʓ[U~. %}o^~ ,YΠ)+4EOV &bvF1h1 SY TQ22Nz*AOɀТoAE3hRfv5 Ekƈ1`:H2}'ڶy /Jլ5g N^2XF*l0y8'pU^{g&Y<~1ssp8ײcĒ/+mxnxz.Vd2nX`͟}Lf"tMȖL\ȸ;Ҏv}f6>2[D[%('K4 N&W.O\\jgazo1OS4T$`jK᫗pou\@ \s.@;}lK8wvR}?7͟;p6oֿC;2vE}l{vrx_MK(_T7m;;{N9g~0ck.?ѱ/ P3#װr겅"!ȹ[?䖾n%'IwÕaš>1ސw}_ktd*n댡G^ڸa]_y6ou]3Z.]"^* 9ZGQ1u?" 5nA1j:ǽe)Pf?S@k:G'0VQFGR|iƍ=D ;Q~DPmnlUa}斏 cjmGy=K@g#&Zy Vag#&m _EY#6JyÅ"uB^B<) Qh~pV| (9Bup n[ =GYCC!4ߢQFG5|Gŭ>)S斱ٝ˂R Cg{IhigVr}xP@C5?`:/o,?;IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.machine.pause.large.png0000600000175000017500000001062212167200764024222 0ustar lucaslucasPNG  IHDRUSKGbKGD pHYs  tIME /pIDATx\{pE~g_ZɣW%? d^wEH (*Q)bRQIwu)R)lʹ$Badl2XeI#3?fg=;#-N?fZߔܴ%77%QDu} ॖֶ170&RVV\װUxg]GzOm7)y}E/nW48gxBS=M;U?s=_Ȧ6]^;yUk׭Ǔ+.M6x]Ăcõಬo_ DZ+hnE H5N?)2֬V qP22_'^Ώ.Ro K$Nc>vo$Ꮪ!yE_~=ɾz/+PQY^os'%-ڋUR#=yp219 ϏעT›{_FerC)%ܴS륯+9Rd~&Ad'{:{\;Ad4p={q0.MQ 6m5KX)?-^kLhx ^xɶۭunC_yeU}A ط>u7O= k4|7u}-m--?X;sphwNk ^{i0.ǣͿ<=%~<ЗG[Z.Z}ޏv\{hj+)WX$)8KrL =--mM;pݻꖭː<pI%xf)=IAcQ^ ga*8Ot ɸC9M5)msf,UUq˭~inn<16k%_QIfOtkW"dܟ! !P5'cWW9;t6oP778sgG?z JViy,zO`g%$;ɠip@Y2-A5DHA*4N+2|mkmE;!s]vZ rKk[g\QͳP-YRڍ1=ݻQ^@pBx𡇶؞Z1,X)׵o.$9]Үݸa ٓ9{wu'^Q팃C<ϵX2%]UK$jfLv/8;d-=l^zCUUD"DQ(X,vAl;g* yQt S`1\4 Hppd,pQq~,}=֒j&J)<\.9(ÈD"P~l>Dш|@\smcO.sQ!|>4MC4Mlf !*ļ|5SJv!"TUE4E$s砸ќ*\H8jHi?L=?AQC,(Y~&CXbմ7DO,r5~ UURLlP-×(q#cμ@?QTeeocǝ-!1PJŒl;Ա Qy^_<| T!5 "#CӴ;c`m 9a4CMXA|&}: g9+`9mK`x`u 4Byn抦*ҢS}k#R eI`nM7O*6mOVWH @!سemj/m߽=X;*BLcz&?  2R!uJ%eJ&nN X0:jb*[Fqn5T.p`RVu|:ƖSϪ:#?ΖP.#Zƍ+w6KEFxesOz)&:UvwC@P_S5 I m1ɕO  Nd^;$p8@ )7Br$R /gKPGG~\o./eͺo>(ly>Hh"B.Y6%6v#kkQ؃Kޑf{7߿~sFp,ݾfqmm;FdQ7=tjekY 0DQ^[rA)u|`4*E)T T#C;p IvЎVesjIJf9m(Kg"Vu9G?Ncid?#7׿S1 (F'rcdYdL+9mӀ/O=4wOdD}.<0!F )g6h Dp8DOPJ06CPRBX@"t!)3> p\?n~֐>v!xcA6՗jx< 7޲YJ?|.%Q0B(!a(իrEEM# *)Ԏv>f_{ߪiTs-mOw榝Rqqul1E"D&1&L@' q E*v_õ1U1[M~ƼXCz@qyM @2XaTCU 2c.gNt7ʌ::fz+ v @u{& WUP!)P[ZonB;+ڙTw.hC 'Et'L9M㈫qU0yܴSd ˙`_A@bc8kTA@2NF,GMK@4 3#'DŸ,c$* a$5n7 }яw0NR"^Jتe;jim{ &q iH :yWH6s\R1WS!/NZZ;Ed>rwׅҫ%0I#rc3{XqtGٟ{_cxPJ7` rٽ?~?g\LI)x3p] Bomm+Ʊg HU𚼼<:#sY,%ب!dLfx?C<66K`6{=P(au8:k|m>{ϷvI>:v5[13!Ь ;͊z 2ٌ cCvRkH/~+KgG|RqRO |uL길bb΄7L$hpyffi `qiƖ =Aʮ½{ L~ߏ4x)~Mē #cG? J-r a]Rj8]|kD.a.xH4f(Yc]\n$"q:(h4 \,R0aiiE|ŒM+ 2.$`zM#e$:&*[(-+Ki5BizWBdAss47#WUl\S&S4Mɓ_9#j(7hsJ;svk~kSSA[oj4ܛ LoelL4ܱ^)  2)DI Gi^/%Z}av^#' ʰʖ-AQ{<Z& B.sVo ׯOib:\ęcbR!4CI)RlXV ]1dnJYsG¤fmב6w<teJ񎜝@"FFF`oY<腖𠷷{W५srv&`:ICW*!nE7ې7SU`롳ְ5@XL!r!JWg{Hu|7A`_K}]Ymhϒr|W<doUeeo]ϟ4y߷`o6UgN} l,;S,tkm+٭ WrG] ϻ_m344hŽwr |Es0cD.*q/A#!Z@Ngˇ޴L^x 'rre{y0''&cg'ˀFR=̙:;Lo;AZqވQQ0M[o\w>h|[a&O,)ߛ7=کƣZ"! 1)Y /Mp!uNӧO_'FRϓftfK0;xbH.Jz{?+$sL^C ڶ5B[[k6i;σ^)/z}ɨ"$&%R!6V9wr{f|>?dTj&zKVDDD,K?-Wꢯp˟Dm7<2b6L:6gʢ7tuUL#.)ip["U~E$''3@>;u__#e`% ůzΞv]BC}YnVF_Oh{y!ϟG^M^ ڮmw+YY4(>.^@, ' !KGJeT%$W_Fhinٌ6ж4,h'ɕ(5naa0{R6`^,<]IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.hub.pause.xxl.png0000600000175000017500000000531612167200764023121 0ustar lucaslucasPNG  IHDRe1cg.bKGD pHYs  tIME ء$G [IDATx{PT?w幰<A1@EqbN*1QӚ(qD6ѤvM &դkSML&QScj-1Q0F < ,. Jҹߙ{~7s~sh$lܰXKJ*/֦u$dw$&&>1}h4&ednZhmm;QS ;4RNFadTc;r5iqjP_lFeHOƘrf1s6m+]%%e6#ĚX'$/Mͮakok[RZV2NB&$T,~SXXeٽu۹P#ii[mE*azTx|ELoN`:X3Gd'+Rd墆(5N>cJ#p:zp8ztptB7F695} J#euG,wvileY0:G ead\Yw>IaLʚE`MIqɸ>dNnJ˹^N~Mɓꉧybvww0YRFJԞSd{{ J #}+8\DZOK0|>jk8zK.{H|>9e8)ZUUDIK=6>@[$C1!)q4u/o/=CDd4 $gAtFʅQiE/;}ߞ6ʳkyٵ8ꪩ?QŔV?FuuzЯ?\}uaTvL59A |7 KV"zF4Sz|b z|:2%e?ySѱ$ 2$ϙ&?Yϗ> Oi#soֆz[}tܙd M iN4dzΌ 6ǛJJviqZL 3, as ֆk=JJ˞qщ1E+4OB՝nkkz`H9)YOeMF1*[Cݑ-GH8r޽b]HN`l覫֦]sBV/"O.0ߴm|n9h֘JF!neh#<x.".>];pl63o~Qy*!zQׅ$vN׋ |/Y1^-q[[kY{ɳXinn8R]͑/$.>ds>ovgp84{W ؅DчgщA_O2q7,*z5\;\IΎ$0D㮯8b2ØN\U CVQ O&jq줘}G#EFs qRi?'iL@vPqJt ΍ #j/Fe'IRܿ|0<H:c7T65l=!CCvd/}tw&5A/uwe(5-!ZL[̴w`xM(c uo^Q텒f;Pc0>rБĸHdiQ0Uj> ,?q . D=:u^o'JG_1RpňرDf?L|LzaeKFUN()(j8*L'd3f9slTRZe&)?ra+%ǠҷnۀW5W [cbbC>RT}8iN&˲hض%ڦ$1abaR0X(s'A<?S!MQJ$((rpjR ƶlea&Zk°>5\T,Q.Y^VӥRy5'xT=c^7qHB6J9F ۶vҲ-,iJL0DcqLDaHvA{>5Fv Zթ^Q019S0 #Յe{T[/$"Y.߫`i"IJl( &B(B)i ^VgqLQDaXQ`&g`* ط)! }nR]M==ob>{߫1AP_>6|FЌw`_í+ %_>Hl%O;\e6E|kёtPpa-o)Bqv~l-}kCeƪ5$o7dRe “#\.osBTKpEG38UkV6r$4ld0;u-xwĉl}@DžcpL O:BH 3)5 >G  E{y%%'Jg-3S^9^qCz-K@C>t$ɮ~njsihw._!KiFїËV | #)Wp42}N * TXC t!vEwc'>g݉:hNJBW3b}y}^H$]OgGƛXuzlj`pCJ! \.x 9TV$>@<& i3DwYgd& tuc^FnjB5o,likKX,Ew屢z/@=!na-?7|}_՞=Z G ,+)tt:Mcs3zb!Lb >Ȁ*Rcu ^x3&c $RSi aV%%%H)p~0ɊʲŤݡx~%.jD02ț<<\0pgu7-xxLH)t_p) ,& l"+g9;=XOgO yO IIT_{ڢ\ahXqE/j[&ҜuO:.FS "u9w4Y^趵]ELo΋%)"kLEΝ`'ݣ֖ עO7vII[ sg܄i/+ipk~{/tf;NCP'CQj}N~U-4)e8uM?_t|RP~ͦUkkq[9I)_޺fL`uR,B->ZT,IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.on.small.png0000600000175000017500000000423012167200764025001 0ustar lucaslucasPNG  IHDR szzsRGBbKGD pHYs  tIME+X xIDATXíklNb;vM8)iiIK!i[zSV  l m_A 4i6J)[1DBvi.%qvb~>~ctZ^s<|@}ÒG;@t!H?}zSסupp~x>#gEX4BDz%.^W2` b"<ΒLjQiifq,'"ʁ7MkY4ubll%/ EozچBJ]sYX\Ps84-[Şh SIh?Tpl1kl,D&UFXeT TDPڊ>$<0 ^p/si?063'Ӽ|kFhh-AD,@ؑƞ 0D ZKHȌcꩨ徇;?eʚo,4d ';!ۢ1;Pg~vn_y7y즷 9;DqAIj˥n:֝3XX5:yhm\Z Xawټbv"1J CFhk]O>2d+w3}4S@+"2 7zgӺ[R=})wiVK$S0Ugޏ ljlVZ@Pa~a]tVⲳk8XR/~LIx\HRspCca&E !rlEnu%cou->Ւ1M*>qZ3 !8A'QU'jb2>X욵#Q啉Sdz(IL Ax]vA^<6!GEF{9=Ėcz2Oʯ59ĭȝB{/r ?U8J)a޶Z^xff'U``REח8czrN^' ]D"Nc6vz]% C@tƱ|oۃ"ZD"0'8 de(NUGhj^K\C4XǦby߯*u=(&R :E#YлfOT=`^IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.palette.png0000600000175000017500000000574112167200764024517 0ustar lucaslucasPNG  IHDR@@iqbKGD pHYs  tIME  '.rtEXtCommentCreated with The GIMPd%n EIDATx[l*^t"-QȖ;Yٱ؉[i-h$(v}ٗ}܇`Ѣn^@۽5-MS'q6k;Yu'%YxHj8g do<3oss Ԥ&5IMjRԤ&n!c7F$r®΃;7yeH.ԙb$ #̧uD^@Vuh4*?L3?N箝9ի`tGdN,EC@s7/t;ٵg_{h!F,.9qpFc0e7HW~ (JOϱ,阤ć {y6͹6"ݛ%`26#iqT Q3w{o Oz;OtéesV9AZg9<NA,3iНXTԣ4s J?;Mxz1K'S<iW6P Gfyb+4-$z3;BXZД ?pa+~? }) *   `|:߾y.s5IgӇ9u~?'YL^$>Jw6>,S̴˳iеL+A󌎎@>vehu l2q3hfQ_@MӬ;_f/"ڵ+>36rb// ޯgCI4K[¡"տ~HX~±~A8Fחq:w17M}+|an>bleE @C{,/_1 s?,7\ҙ3ui#opbW4z7innP}ԞHwC;6h"!5@V xf]$:s Xx:-+NL$RY:^^v(UWp#ק`f%BEB~ kPEfs44E2 yum"BgP2{ JgqѬ"FPJ 1aB.,`h"1XB"u0*c%K Ӷf/]^z>@8&SYf֗Ur—7K  "4[:5>lEbnPof\B;>F:6gW;m;1 3ֶ ^Qn q4M-(|02 in[EC֍o\2dS G fB6%  3ټ)'by9_YB:{~wI Y#㴪l.s}=Ý\x.w^=/<|E\6?redX\fG[P`s(سɪgÁ~Tu {v߃yXU5NL_[`4hՆ?'_sOS[Bom qVR O2Ħ֪c;\uEi. (w?q .ʗgngs}YHY$y=y_H$ORkv)~#9:BP߽ ?﵀D>+~JԚ]TFO-"z2xo}#?ظ |/OOw߮֌J 5#;bo)Ԯ<(wުo~:Y|Ngxvëu7}@0ءEA-[VG CL,ɇ-M9D|"3xƁ!zH2W~Lj:G/Kˣ}'ώ뮯}#MB^Av"nU Y9wVuK6ʲg ŇiG4M:3O3%211@8qGIMjRԤ&5IMhֆLfuIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.splines.png0000600000175000017500000000332512167200764022070 0ustar lucaslucasPNG  IHDRw=sRGBbKGD pHYs  tIME#{UIDATHǥUmPT~{%ȇE l(̰ b϶N;c#Ujc 8!ک#4XM2dlj DKVh$qfSbKKd:ygy~ҁA%Z]s÷a?wwGL_n!GhZqF~;ܹ-m0cOM mԖ),+HnyN$ ` ÀeYaI`,Er5Ͼ((c6?ٞYNs~BBv|~UN=,C$@i3,?HilhV@2ﯰ,?yNBZcvߏHDFI;D8g[DYנۗf^xSٞo&\ƍe^ϝ ӰjeM5Lݞbyi[W;Zl6D4tsU3=uhi_fhf~NtaWjg>44l4Lj==7GHFFLiDXCsKw7}&U]k~)ZUf-U|.!,M!*Gb8p>eW lA.)x󉮐a~};{60R]_V`|5/D) "a/ 43+;v2lSоF])ݧ=hmE< 4X&yЦ ,T *agaXl\ݹoPŨ0],a偁 $Ŀ3LIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.off.large.png0000600000175000017500000001062112167200764024715 0ustar lucaslucasPNG  IHDR::J(sRGBbKGD pHYs  tIME gIDATh͛ypy  $HQ$%6%*"%YJ丮R4ƞNiJif:Mi&֙e)G욊uGiIK$'8w]\p{=J|LǣI' luoG;7BM `T ~G{ <8f{}Ô|*81|9B{@(os_};?qϬrYoJ^c*;?{uc{w ׅvxys_?\vb7$w ? =vNN+Vm 4p帢 O5%."c}ZO#?- U;/{?cZv{%S_;EʥB~mW84$OI>?{K P!$kVVK@~Mw~a(,i-hY;-UےJ~MQ];_ve6 wWΕCLvZMB kϽ $ ~<{mן,a^12)u+.Ř %xxpcզQas}9'Zr"#},Pێin??a/z7w))q2~=Ƥ>V/߶g΢V6Si쇚T Nr0cYD8rT՜&!@h~CߐMδ$r &+ix=wY Ԉ>Q_T})-Hk@06,.]fd| dMmx|zwSg/Ϥ!MRe &s|"q5[ƶ۶:[fKtxwяPM&6z+

    gMtQ6dz\/L|p ˄*&UeϽ]XLI&? -%^nrz45Fl8&Q̴UʫZ0JD &_SۭRp،0&AԽ^HUva?}ojq[|Ѽt HBf^ ?5|Qne 3d g/cq7ꆼTax.zix7ۏtMAb`HԽSʹt][oT̰$Gsy\ߩA?vWk]u>rkCaw$},d-m\j@}hD U2pKC}5-eoǷ~;kzvpgK'FXHf ls֠l+- f]&$IƸ3SQ ǁ"$,FZm*gBpYt7t1OkW~"Wr$¿HHT/jf:QX)6k9ݕձu %g Fz,S ]2}B1p\71#Q!Dw"ͅ3ޅ tk |:spPd9jj똙΋$I7QY1Fx=x<],,,T*Ԕд3=ǹ1.=O3mZn D~tϋ̚?%iBXYgH$ФB4b%8 ._TEW w9. B}c. wEީ˓ m'teM]8-`:-tIURqe) B9k<Ƃ=lFQ0me4xI I[C}cS7sPqf:`s4T8m9rzWq@QCG! 32&o8jKʰXJ48YNUuUvfe.TY3i6%g`Tæj}QcG7f 2V ӅBe"IE1L8.lLL}WLB_?ȒTBI lعa]Lʲp1\wl*3\[6t#6lpOϓ#˯"DC`E[]p|HI ?co Z4\UTˤT|)`qYZPYXƗNڦ_286F*w@07?FkT^(b]{h/dMg1H‚2H pUTP o {ON:՗L}wI2+cn^o###LOMqEAW^M6*++XR^QJƖXX {%IV.4ǦɫoFozF=nmH$Sar~Qt}z̖ee477_$|>o@<;Kx[tE3Awǚ;3R)?˯$ム/k\3zONsul9>9 &sYyZZKW/N `qʮ7A}*!āf복л͍u OޕI"uK׊h,F,+(M`8AH.Ċd+_gGwl0{'Et|֠CQjeYJ{e! !/-MVML"57 T53URG]bPy}sҝ~@oX}L25U.cVxJɏ(朅_Z &fsJ[#_a;IjcxV(WU[F/fDU4@ZPxm͍KP`]훹4@Q3JҞ}oF?īj?o"J:br':OIכ_@i -UjZ1;|,E(j4 mxvaŹPQTpWK!&j>USË-kcrCW9K3_D[z` jNtnfs }խ|n[ Gli3F`?엾Nyu `/2g19v_%a@JWH3AZelw?ײw_y Uh|?ҿ2ckUP,i2kznq9qꜶb-?sFooslO*Jw ! ;`wv:ڎ$3A- cB\rE[Z+NoW,!Z~λeF95] r{Z+];UD#e% BRf >W2bYC(5|iB)ó7_b^m<ɷHLb9•þ|jB/}FmL>=^(@zɘ9n꿃Bp/НN`Lfp.Ⱥj6&uS p`{uAS~` գW;k IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.crossed.med.png0000600000175000017500000000315012167200764023662 0ustar lucaslucasPNG  IHDR.XbKGD pHYs  tIME 1IDATHǽ[lg}׻kvBFM!MG< *l(D! 喋-5Jmj7I[_zw㡮(޵iFsos#C;p`p$J45W8qB%$B.pvnt$Dvɝ:b^Q,:R18hB8*}ʶvxD"%b?V\ I̾p+FG"R\ ڰk+\.jsG$WTEk,@{ z!H]ti͙bO0'c7\Կ[tr顅,fu"A$x(~*yXY2{ ">BQu7A_;-67K?Kw/~μy<{S:7RsDA-rx` 0 ;|>/~2-iGմj& URNO 9?xvv|c[n p97iˍw#(p+_qr!"SRʝ@+2&;SSSwoj_c=sokoonmhhP08DK` @kwG*{ݱ/ E<qv7j`=~x1,iR,,?:~.,s♧w+KUq~ia!ę݊hQt=B!!M>! @CH1Ļ}U !?Nyh/vѢIENDB`marionnet-0.90.6+bzr434.orig/share/images/README0000600000175000017500000000542212167200764020014 0ustar lucaslucasThis file is part of Marionnet, a virtual network laboratory. Copyright (C) 2008 Luca Saiu Copyright (C) 2008 2013 Jean-Vincent Loddo Copyright (C) 2008 2013 Université Paris 13 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Images in this directory are mostly: 0) GTK+ stock icons. 1) original, in which case they are released by Jean-Vincent Loddo and Luca Saiu under the GPL version 2 or later, Exceptions: 2) ico.info.orig.png, ico.warning.orig.png and ico.error.orig.png are taken from the GNOME Amaranth theme (released under the Artistic license, a copy of which is included in this directory, by their authors). 3) ico.question-2.orig.png is taken from the Gnome icons, released by its authors under the GNU GPL version 2; converted by Luca Saiu in 2008. 4) ico.splines.png is derived from the icon named "Actions-format-stroke-color-icon" taken from the Oxygen Icons and released by its authors, the "Oxygen Team", under the GNU LGPL v3 (a copy of which is included in this directory); the icon was modified by Jean-Vincent Loddo in 2013. http://www.oxygen-icons.org/ Original file (24x24) downloaded from: http://www.iconarchive.com/show/oxygen-icons-by-oxygen-icons.org/Actions-format-stroke-color-icon.html 5) ico.invert-arcs.png is derived from the icon named "Actions-transform-rotate-icon" taken from the Oxygen Icons and released by its authors, the "Oxygen Team", under the GNU LGPL v3; the icon was modified by Jean-Vincent Loddo in 2013 (simply desatured). http://www.oxygen-icons.org/ Original file (24x24) downloaded from: http://www.iconarchive.com/show/oxygen-icons-by-oxygen-icons.org/Actions-transform-rotate-icon.html 6) ico.action.zoom.in.png is the icon named "Actions-zoom-in-icon" taken from the "Snowish Icons" and released by its author "Saki" under the GNU LGPL v3. http://www.oxygen-icons.org/ Original file (24x24) downloaded from: http://www.iconarchive.com/show/snowish-icons-by-saki/Actions-zoom-in-icon.html 7) ico.action.zoom.out.png is the icon named "Actions-zoom-out-icon" taken from the "Snowish Icons" and released by its author "Saki" under the GNU LGPL v3. http://www.oxygen-icons.org/ Original file (24x24) downloaded from: http://www.iconarchive.com/show/snowish-icons-by-saki/Actions-zoom-out-icon.html marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.xxl.png0000600000175000017500000001207512167200764024077 0ustar lucaslucasPNG  IHDRHHUGsRGBbKGD pHYs  tIME33IDATx՜ypי=$4#1 . $@1! w6qboR8@M%[ rb+ X Plb FH\ ]c$t̼cfu{uH|ȏ^+ _ݸ0/U dz !:q}{[} &X0M4FMfpC$tXl#"@ k.*ʷ>U#?zxdҘsTWnXdb".ejʰ!H-}?hs7f"IIBkVBE&رa۞nӠ[>pX5IRC}k'a8i*zKG|Z~'|{Ŗ ȷ yq477Ԋܢ%7NmE {+BV\G?2S~i' ! tҚҠmmx4Z ߵQ1 IҘDw-l `ʅ5oŦ Bkpʕ腔sfdlԫdyYD5̚0V023c(w\p*rSXh#uLOghOH2p j7p>.- @%oyژc~ҳ-]۟θc#IΛ*Iޥw}X 7cYG}G?ĥr%/1)xm]>t|$IowȎM3V-[Y3imnk`D6No,K֘m@.| _$_&/K9 Z7>9Y3xr\sp"Zu\l{pf,Mtw]0qM¥uY0d͕=ebZ>ǥ%eMs yR [jY?di&x^1$)_YRb9OarRHKOZ;ݶA™+45_áyt)Hzn_z'%V K-O)v5G7յۨFn qbCB!1gv,qj$9HR@ FI=WG{sv3Rr]?;8k3K;H$3Ⱦc1`l^>Hn@>ک6B#6\g4-MY!y\vN*-I3@TG {ys8vYH*~M"צp&}u6ٞ;ーNc,>~wxgNl LɝP)liv19Ug&3Fxjm)׬ciw|tTPYԵO'HN0(v.\|^^:NbN k4nZNrH=sK_-dੵ9^00dJp9|-vim_~}#U~@佹%0MQ=&+>VA9K8hgTypR].?=> g?)2,'!0Sڧ(xehuf5-k8d!74ce5ެ9q9~UUA-qj%67 yx>jaDc@LYX¢jv1pl!"" >̪J_s\j<ɟ{-ofZDN6^>[Bicbgyԙ>"O VRUY1&%`)Zv 8N9 \Z:l()i?Rb&H-3Xl~rQlygdd)1Jͮ>㌊I6qdۯ: RaSn5uOdڣ&G?W[ʷ*\ƣOƹsL|tDQz8W6zok:֤B|ءp w)SgFwFbrfAo|Ef}htACtC&m~oLFzKcqШ@J1F:{ 5՘mHMPOTr{2^鍵9ٽ/L9&P{F7]:K⭫,}2 C g\m]4/A>Uf<15 E(` b^κtIX}URxai+ /oz[0 qSUJzVOUy=g`N !qhT5H9k}m4pj~R] mNP,[$^6>"ߔ?'w^1.>z͜B(DѮçZ?oWGcB=!lygLLv zbUqJ®>קZ:m$bTWi Kb"}$Ε;K.E(^ <ߨ9m&&g,*8*8r)9!S0Z+\M5\͟B- 8#w> fξv b]ou桑G"n*qtߒT;5Zo;/EIqR1q}1%BO`ތ_y*oC??q-]s'qb[`z?j'Vuϒ1csQiɻ+@EٿpG*om=ǞW) S{?d#D~Zj`V&{4TwZ:1Ƈ=~*曭۫@̬t]\7_po;9<{%%*=Ed&0"Erl 7;{IO4Kg?V7R}$̝gq_L J~Gaۿ,7W*4:a/K Xdo}60ęK-&ͨ ;y\Ét\r-ZB槙XdB@K-ެ|D7iɒj;1/)挥Î9:DT nX M AFy!S>KWaQsyV<97'\8Rw֬$!7_}wؤI]rk˭Ju9y%&yѯM Օ1oXuȟ:e` Z!Nk>HMN&BlFЄ j߯2S Z *3oSp!xLj!|G6|xC#t̩U(3[X}g ?aZ"(P4ZVQ}7@Rs #  u j4 [.IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.crossed.palette.png0000600000175000017500000000314412167200764024556 0ustar lucaslucasPNG  IHDR@@iq pHYs  tIME  %?]jtEXtCommentCreated with The GIMPd%nIDATxo;%R%1zXGD.nR@nȟE@tu E$6I[Gq*#RdRփRy.T+6,Rch~+bxιxAP( BP( BP(|G`i.!`e%KKm::SDcQvֹ] @(OOܭOdVoL&:v5*|:}< kug+э/rϧǞ至H$LNo-x7b!4FHJ.|Z|ܼ]Փ kf\,`:N&9N:FvKö=;bb[а!H| Mcow++8(=w)t uPx5?[W~kv pRF>>U6$'DJ$tB_eǣ"[R])a{hт 0=1P cWֹv稶NQ,wr1xܝ_d *I6z#ZJKD:vb#]m8QG/]dTӚ3ez*4,^LC $@;`ފt]7P7%sX;k!2LxqJ%y8ep^(!*Z 78dt5L&Z D"&hu%,yǃ@C@RS Z)Y%&>X ܚD5+5V>,lcHOó1Ba)jL GEdIwOO ]5y!D:0? 4aY [܅oû78Q?yھPd$aB( ,/-#43/8_@VNA 8|7}u݇YE uT*T+繵-uaĚ  6w ja$u@~+? BP( BP( BP71Q_IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.crossed.dialog.png0000600000175000017500000000641312167200764024361 0ustar lucaslucasPNG  IHDRppKbKGD pHYs  tIME  + IDATx[l\y}EQ\t$˖MT8,PuhzeSQ(ЊV@MI[pj}+ ph]V b"Vmє("-.\U{;{\R.#R,7THݻReHR(JIR(JIR(JIR(JIR(JIR(JIR(%JIR(%JIR(%J i(oEG8=zZ진h_;vT?vUUW]tb<][ T4MRui*9`ۂcc8xp{ \WS{>M?l];hl0\Mq0M4۶m_xX2*B.%Ͱwmc =2p8z;M4|m^=?q?WS覟UM?Jn򉙅+)\M*Au`$s+r]}I~$P8ߜBT恇_ {oPIrd0ǎ C56\K3M?zn&9C#c fs&AA0 MZnBv/?x'QxU]UPUUl6C.%ҵ9?R1icˀ"Fq_+ǎ/M{BVF-O4u`Uynx[Pl4d>\.ƘB$S4>F$g ~_+wSkROPtnsll[ lAf7Uv֪d&ͩ9P`(Lg$(ll&8Kqcw>laҁ禦( P q\$jq]WM J2f * @S&&g3~::::!,F?4M{mI?̾86f|}tG:"*S71W#$׍~˪B8*2-mQjd;EW['Xp:<##ijisoX2( -L5Jٹxvm,)/e,ĴPkE>f?&dXpQ=WfffŧE-jnFMaN#RħN_ })or^y?j U&kَ7]~Hąp4ɐ:v2bjzzЩ?u8Xh.Ry YT[[P(Yb|x5T*%R4bL:M.3GQ)o+ wc b*][+0>ox;Rj,Sƪ ::M"ǩXeʖE6*quĸMsMo3E kqK_X6 =5SZ\@8kb>O\&ӷB>] ,L NQOM몙/ =sZT=x"#?O8&J%͐N8Kbā}偗*niR.7f*^~l3WL&/^@oUmvEbgWlib*b.śl&7  Koxdu AN8^ͭ%_ t{w0CPA7d2i{s?];j],9?/8DgkC@86ѾBIٶM,v]"E UQhkG?JK7PWJTudD~矑F@ۤ3>\.W=O}jDnm\a1E3׳Uȇi\Cui${k?\i}PkwC~ W,?"#y˦ʰ*L\~ 7~q*=1 hZ*@/G_SlB]%1_ⳳ~c6\:QdO{};PC?~O97L*FԪXVP8L>> jI`/Uo~ko?($ycSo\=$Jզf(rjM 9zNgm+2Ift l[pGn.]Dgf E!LٴP8ȹ6m'5N,,0vPhokz<_(N|4>Qͣe6!*iA&61t6]1@dhʙ5UaWV~C?p>>G\rMBL& K+l6kR6QamDB,@0c|^i+ف=҃a蚋>ĥjI??LBK* ,z**,nC@u.ONl ?P6b9͗Wka a`HST{DT2>RòyHu%MFsqoL}+М4EP?&4-~.9B69Ⱦa0LbjXMӋ.AݍЩTjR}688f= UW>Epb)4H{zz_|Jޠ]`nݼAe$P, bTDaFSre)p/ub%'O@jPi8~̧wM5##ԫ6iVUzLxAS*$r/5]޷ 4i2Bn4H5!Sr̙I4?FY#ɩ z;hmMvw]$"لڦ\hd{/8~ [Y/!<*}Ѻ3^ozCDb#][V^>S5gv)BԒ_,x V4uThzj4Jil &{ZR.hA͘2{ȝh@be0]{-֛L ho\سEh洛' 8,tw3D3MFRWժ C>z.;;cMC;wrrc"q 4ͦYMXICUmصϵfFLfYQVMY^mÌEE8@T\FzBXWRZ\NHӖ-[h4js}ݖeYYY#efhTsZ-$ۜ' /S<43TQQI?:4nȱl6[E"˜kg94ːkV|k]l8ΐo@bpp"4oN@(,0n j(f#\&F3j1: z\ꜛG4A^H9&IKs7fa  ]>f*5T6Y~J}b“'O9Kƹa~oX ^ "ŅSmwK3i4#֏vˡ_\-YDyV(,} ؝ 0=-\o ixd;sHKY8o~m6''YNCv i4 `Fo/M@(\V QqP_/]:^8պ%KSf2MA ̟x&vB`3LP# l H5|2>> ]]Q3<@ّ**)Ơzd?q# CVϷٌA5 lE3𞣨 ; t=-f4%v@IuI#H+ ˆe"XL5=d3:xb!2^C9&pK @`ԼT>68d`ao4KCbNR-p9jYC{G ~}2M"p$Ȅ2/ObpX.AP$"u+@Lp8s!C NOP!b$zj~F .mdZA,tF~idŞ &b \ؙO^GLX@,[p6 Ӓ9t""-Y `3^C;B1l݁s"ѢJ{\AGGŒ pA%|) %Ij_\'#D6UUV,/,1 [!8w6<+=.װ,[P(Sr! fy[j{B))) 4 QB؍%ł۷R iɍV~|88hq׶^N!czbl]~~>KG4,,ں}07 o0y?;;KwNHoH$*+ؒR((Pul9s<9 i εZ= k++bc?z>1j(= Z ! ld{У!0 .;C$LN)Q q4 >Ǯ=0@1;NլFtn8؈lZHOMGxY"}z=\ni1y}RTWRZ"AjRcF mR &twT[`8I;IENDB`marionnet-0.90.6+bzr434.orig/share/images/logo.iutv.96x96.png0000600000175000017500000001256612167200764022403 0ustar lucaslucasPNG  IHDR``w8sRGBbKGD pHYs.#.#x?vtIME  IDATxy|Tս$C@VlhYdQ@ZkPU[}]\_ " *Y {wf&`O{svn~?~ ҏ? ~ ?mMK9^JUU7rظX4p$ܑ to:B/οDG~\"B{\ƍB .tD^~)8 Mطo?1|p@"E1T$hX,H 4/6o! ctu#/~$$ii}͐@ZIj5[+_$*j,%%%(Jv8L}GYN'gZ,^QJ&./>/HA]c33?b##cOGtc1b8])((ιN"~MO:۬M!['+ Mеk/Rrgh֪JqƗ,( [͜oܒq`]4'NKHNE@JlJV2Ԍn5х@( 6"0aBtj|duuu>SZVP\\lHvw%# RS7b>Yʿ>bpk5pܤ{Q !iSojSᅓO]h,~v RJ&?%p :1#oMBpERWёX&,,^^K[g9["j5lj6%UUU4[nNxDG ̡г NMWijvYGYobSC;f o91|[NYF8:ujH~yLb?݁.UrrUu2) QąS@u4) qnqq<ӟУGw÷4t]7탮8N, iiiNc*p8Qa֥_,H^9fHՃtfo"Y䒾+''1hv8ެf\OoU8qDEFD=Z\y.."._H?ʟ6݂P,Z#x~r.5kR򐾮.zו'4ٜp^66SHWnzÇu]A(.aGٞq !76<XWo@*w}.{|8?|YO=9?#9\R2Xs]jDbT{DŽ2煍X69"8Uw v[7ekGԚA͎wDuMuf!AFRJ*k9xxKxq$vΩzxmWe}⹇Fu<Ą`GTQgUx1ڼtŋ$ɺNdAҽ8W_Iu3:dPPZ"L0v?LA"UJPnyW׷mD! :!.mrv 7{ aү.-E !X=Ӂof0ton7]V:6ٍsЧWi{Fpxὼ,p**Jk|zj.*4,X$NK2xoUّOwwMB߇i.jJkɕ49u#'$oj!6~fvJ'0< EQF][;(<]ŒGyz.N|m #$o`F{kh1!>Sږgyv!Pu;o,]KRATɐt.ADu¡j JEJSM>sW$Wg 5'AuhFj#&leؼ7O[tݢCqNF'Ъy+ա14 yl* 켵<]GZ:SǤȚ97;x1*jUf<;"eHIA|L(͕X%p>u#wp;%PPcƪI7Xz]uV%H)#w3d^w՚17t{&0xt5{̀Rq|5Ǫͼ#JxP|0t3Ƙ{Kzi󊗞vQ{kSBor<Ѧ"p3o! X-yqwM%!(6߽5vy߷ 9'[ v5/;2fr NwiVd}e?k|${F Y#>h -<w,+> `l9φؼe+K,N0xc.R7x5tzJ]e]]s.5Mk1-k_豮ךTUC.5M{6_뎯w߳RȜVqtܕ o`fWnjcY23rQN<Ŋp8||v*+j]vjVUUNrrseԕ+B/Xveee٪fE<ɱcYlPZZj AAJJ2U =]U Δ} 6RE!00cDz4=z2vӿ_?@ԋ7'04M#&&plܹ30rK''' QEElb3[}ԛ&sT>ݺu#!!=.$%&A.ITTwڍjFEEKbGp7n,ԩ%%TTTPZZJQa?Wn/~T.[8bJKK9+RS0vhFNPPDGuHtMs͕uOʲR]moիr{tOQ#YfC]R__"BCCpp6nl*-Jӧ7}fe bp-9u*sNb^oJJZ/{qaSdg`Z]R[gL't~ϭiyyFUUU}EZp774HJc,"r@rR"IIH)IJŶ;8{ &OR!u+>[oNYy9`lr   冉9YlP}H@@}RbZ]laQXjjv4%7jr*[n%$$iS!wف/]k{[@,m58;@LߙH~ ?~O?'~?~.*09*^IENDB`marionnet-0.90.6+bzr434.orig/share/images/logo.lipn.96x96.png0000600000175000017500000001417012167200764022347 0ustar lucaslucasPNG  IHDR``w8sRGB pHYs B(xtIME $_ǁX IDATx|yt\ՙjվX,Kɒ7/x& ɤdsNgi̤Ӝ>$@:4$tB 6m}JR{nG Œm9uHUu}w$H"$H"$H"$H"$H" %E0f䪞|9=o͐)˓-TNHHB]<6#QB&0>is/2/Kry3Ԭ4-(]ʗ%}cv l]}"nEtT@ * E7%E2)0;Fxg-: u 9&RAWUojMɔ\LٟdOp?bW]QJZNJ"~li (Y^5#7U d@^cD5FQOwS\!ksf'<(5|ZXfh3x͗wJmpi*/_#ALALUz<]vyFi8W-AR ^8?M˙!CVMxvUϟmZ!Pb?bi5Z~ !Ц*BNr x+L:kion۵@tNi5 V gK͔݁ dمڴT5#%Ul/ik硾H:e 20Ch% ^KСJ'>|=R='Q%'USJ{_BZ/Ў`ܑTYURs}zQYk*@mroSWFA3]y%漕ia0" 4_Y5'dRJ}/(R R՟#{RSYZtMn2Hg im(_ ť] nCech ]:hoIؾGI˙h.pTv{f5#OVA@kŠR1xDwG˞.ˆVً?gI.o djyjNWMLv2!Xk zN.EnZ ܸ %vW)mh x]Lt;ձ~Y̓|vGȁ/ԩbWRr]=[Z #.d@z JF,-0U֣V!7=r+ l 6V, Ǘ%" dAOKc102>sRoGaµp_1o;i۲L]'BYqT ߧ\SSVLQ='j$*Wsgj>5cV7%M MwFy>H #.=Z_.PA9a+ #XAږG.}dD囀/ ЋIdEg-J#S}\]%h?[!— h#{ͺho;H{]m$$4kM;^ ^=Ɵ>r`Im!}s(pPD*D.H }lBv'lB6p-,pz@17r ` Wq LPWDE3ܙ~=,_>cW݋WP<g1 FW]wNK5w$AIɄ` ԼO "h_­5:.즋UrxW^6߼ߚ13+ @1"́^0gX?[HY!Nȁ % Cݗbjh菁0ʧX "n; !ɦM_Iq KzHP$ \ʆՖ>R~b@9,"8785i߭ #o$#L smUȟ뚂ׄ,>,kc`۶ AܷWP5l +rHCBDfɜBR2Ά @=/CZ1wȀH熪"1! =; `Zn̥',(M@(U`$( Qm%@!Ď 9-PҲG1C&| 7pr'jA$xY@~1,B@_ ߦG&d>`іlܪ2lm}P~96(R0`ܸ ov[B}~4]:f]ixުQx<Ϊ:{ZǜIxV9V+|şx9sfcVi)kPg/2XuMuePu]v" 'i *a]_DNF:|؄ mw4t.x]pk9ҥޏ3 F=AɓN'7r 3|i8Wɓݾ[A/]d^ynv_KX`ŒŐΣALHﳿjȜIv,H骃c;mGՃE(]ih:}]MuH΅끮%='"j[{}CIkOIͩ㵧TZ#UG"wW_P^JA2iV 'ʦGq9}g jI,k.:`LȝU`M:EYXKPPX i¥p{=p!; 1D7{hl _8C^*XONsՋNs c( ,.;py'֨Ex֊M\`>Hʛoҿ_dfⱇƃ8~k8})H]9! 4Bʰl?H4ehiP ih˰)M[d&k3z2.]g"B=wˣ:&*I0|k?y.?x@?B(4Uok >{ ƻoi ]T?| I73 `SzGN]?ٙ}۝kXSݏߩλѽ_^f|i2.8GOOtUׇ0pםoʼQV૸{d=HycǜZp?"%MZ5 Ztt,;1kw}<1WҍlEy{)ן6~w>8dC_zVTb4uQCT$ܐc)4WYѣ/`.?' n{ֽNԽ-~n^\a9/~NlOQhiB} 28tBL0 侮ţHEOo jN>D\߽OV\Ѩav߀˷?s6l͗긑v:\`^=FZS=BMcmEjop}aBJͱ\7On{_Zns2 de|豷9uoa|ϫa};i$iΟ&>!,_;+OrG"g J#˃ѣʩ>=>{¤Ѵ=ٲg˷݁I9m5UgtWت}Հ)n8_D~nW˕QYY"p< `>)1zc]\xuLO~D#MU񮺧9lI2ޮW3/}}ShL՟E{7iEֹMbƼOy6?R|#Ovc{'`mV5\Ci\k33}ʉt4ؑ]H[vgtvWD c #0D56FA", ", c #0650F8", "' c #024EFB", ") c #034EF8", "! c #054CF0", " ", " ", " ", " ....+++.....", " .+....+.+...@", " .++++++++++.@@", " ..+..+...+.#@@", " .....+++....@@$", "......+.%&..@@@ ", "@@@@*=-;>,=*$@$ ", "@@@@@@@@@@@@$@ ", "@@@@@@@@@')!$$ ", "$$$$$$$$$$$$$ ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/switch.xpm0000600000175000017500000000116412167200764024125 0ustar lucaslucas/* XPM */ static char * switch_xpm[] = { "16 16 17 1", " c None", ". c #5B8BF6", "+ c #FFFFFF", "@ c #014EFE", "# c #5589FF", "$ c #0942CE", "% c #5589FA", "& c #5288FD", "* c #024EFC", "= c #044FFA", "- c #0650F9", "; c #0C55FA", "> c #0D56FA", ", c #0650F8", "' c #024EFB", ") c #034EF8", "! c #054CF0", " ", " ", " ", " ............", " ........+...@", " ...++++++++.@@", " .+.......+.#@@", " .++++++++...@@$", "...+....%&..@@@ ", "@@@@*=-;>,=*$@$ ", "@@@@@@@@@@@@$@ ", "@@@@@@@@@')!$$ ", "$$$$$$$$$$$$$ ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/cloud.xpm0000600000175000017500000000065712167200764023740 0ustar lucaslucas/* XPM */ static char * cloud_xpm[] = { "16 16 4 1", " c None", ". c #DBDBDB", "+ c #B5B5B5", "@ c #828282", " ... ", " ......... ", " ........... ", " ............. ", " .............+ ", " .............++", " +@............+", " @@...@......@..", "+@....@......@..", "+@.....@@.@.@...", "++@.....++....@ ", "+++@@..+++@...+ ", "@@++@+++@@+@+@ ", " @@@ +@@ +@@ ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/right-to-left.xpm0000600000175000017500000000063112167200764025307 0ustar lucaslucas/* XPM */ static char * right_to_left_xpm[] = { "16 16 2 1", " c None", ". c #FF0000", " ", " ", " ", " ", " . ", " .. ", " ...............", "................", "................", " ...............", " .. ", " . ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/in-to-out.xpm0000600000175000017500000000070212167200764024454 0ustar lucaslucas/* XPM */ static char * in_to_out_xpm[] = { "16 16 5 1", " c None", ". c #969696", "+ c #5E5E5E", "@ c #000000", "# c #FF0000", ".......+@.......", ".....+++@@@.....", ".....++@@@@.....", ".....+@@@@@.....", ".....+@@@@@.....", "....+@@@@@@@....", "................", " #### ", " #### ", " #### ", " #### ", " #### ", " ######## ", " ###### ", " #### ", " ## "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/cable-blue.xpm0000600000175000017500000000105012167200764024611 0ustar lucaslucas/* XPM */ static char * cable_xpm[] = { "16 16 12 1", " c None", ". c #808099", "+ c #B9AE54", "@ c #A8A16B", "# c #8E8E8E", "$ c #0006FF", "% c #D2C136", "& c #CEBF3A", "* c #949285", "= c #9A977D", "- c #8C8C8F", "; c #8A8A90", " .+@# ", " $$$$.+@# ", " $$ ", " $$ ", " $$ $$$$$$ ", " $$ $ $$ ", " $$ $$ ", " $$$$$$$$ ", " $ $$$$$ ", " $ %&", " $ *=", " $$ ###", " $ -; ", " $$$$$$$$$$$ ", " $$$$$$$ ", " "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/machine.xpm0000600000175000017500000000066112167200764024231 0ustar lucaslucas/* XPM */ static char * machine_xpm[] = { "16 16 4 1", " c None", ". c #B8B8B8", "+ c #76D4EC", "@ c #7B7C7C", " ", " .......... ", " .++++++++++. ", " .++++++++++. ", " .++++++++++. ", " .++++++++++. ", " .++++++++++. ", " .++++++++++. ", " .++++++++++. ", " .......... ", " ...@..@..@... ", " ...@.@..@@.@.. ", ".@@@.@@@@@.@.@..", "................", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/world.xpm0000600000175000017500000000070012167200764023746 0ustar lucaslucas/* XPM */ static char * gateway_xpm[] = { "16 16 5 1", " c None", ". c #FFFFFF", "+ c #4743EC", "@ c #ECA643", "# c #5AC802", " ", " ..... ", " ++++.@.@@ ", " +++@+@#@#@@ ", " ++++@@@#@@#@@ ", " @++++++@@#@@+ ", " @+++++@@+++@#@@", " @++++@@@@@+@#@@", " ##++@@##@@@@@@@", " ##+++@@@#@@+@@@", " @#+++++@#@@+@@+", " @+++++@@@++@@ ", " ++++++@@+++++ ", " +++++@+++++ ", " +++++++++ ", " ..... "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/cable-grey.xpm0000600000175000017500000000077712167200764024647 0ustar lucaslucas/* XPM */ static char * cable_grey_xpm[] = { "16 16 9 1", " c None", ". c #809982", "+ c #B9AE54", "@ c #A8A16B", "# c #8E8E8E", "$ c #7E7E7E", "% c #D2C136", "& c #CEBF3A", "* c #81817D", " .+@# ", " $$$$.+@# ", " $$ ", " $$ ", " $$ $$$$$$ ", " $$ $ $$ ", " $$ $$ ", " $$$$$$$$ ", " $ $$$$$ ", " $ %&", " $ $*", " $$ $$$", " $ $$ ", " $$$$$$$$$$$ ", " $$$$$$$ ", " "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/text.xpm0000600000175000017500000000067512167200764023616 0ustar lucaslucas/* XPM */ static char * text_xpm[] = { "16 16 5 1", " c None", ". c #FFFFFF", "+ c #E0E0E0", "@ c #C1C1C1", "# c #444444", " ..++++++@ ", " ..+++++++@ ", " ...+#+###+@ ", " ....+++++++@ ", " .++####+#+#@ ", " +++++++++++@ ", " +###+#+#+##@ ", " +++++++++++@ ", " +###+#####+@ ", " +++++++++++@ ", " +##+#####+#@ ", " +++++++++++@ ", " +#+#+#####+@ ", " +++++++++++@ ", " +###+#+####@ ", " @@@@@@@@@@@@ "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/router.xpm0000600000175000017500000000440612167200764024146 0ustar lucaslucas/* XPM */ static char * router_xpm[] = { "16 16 105 2", " c None", ". c #799BDD", "+ c #6793EF", "@ c #6793F2", "# c #618FF5", "$ c #628FF4", "% c #7BA2E8", "& c #8AAAE1", "* c #94AFD9", "= c #5F8EF4", "- c #7DA5F3", "; c #CBDFF7", "> c #B8CFF4", ", c #83A7F2", "' c #76A0F5", ") c #5A8BF8", "! c #8DAEED", "~ c #D2E3F6", "{ c #C1D6F2", "] c #7EA6F3", "^ c #5D8DF6", "/ c #6E96EA", "( c #5789FC", "_ c #5589FF", ": c #5B8BF6", "< c #9BB9F0", "[ c #B4CCF3", "} c #83A9F0", "| c #87ADF1", "1 c #9BBBF4", "2 c #6190F5", "3 c #5689FD", "4 c #5589FD", "5 c #6990E4", "6 c #5787EA", "7 c #5589FE", "8 c #5B8CF7", "9 c #92B4F4", "0 c #81A9F5", "a c #6896F6", "b c #7EA6F2", "c c #7DA5F2", "d c #6A98F5", "e c #4466B9", "f c #2A67E7", "g c #3775FB", "h c #5389FF", "i c #7CA5F5", "j c #AAC4F3", "k c #CEDFF4", "l c #A7C2F2", "m c #6492F6", "n c #A0BFF2", "o c #CDDCF5", "p c #E2EEF9", "q c #A8C3EE", "r c #6B98F7", "s c #5489FF", "t c #3F7AFB", "u c #1844B2", "v c #2766EC", "w c #014EFC", "x c #1058F9", "y c #3572F5", "z c #6493F1", "A c #6896F4", "B c #5389FD", "C c #5589FA", "D c #5288FD", "E c #5186F4", "F c #6090F2", "G c #407AF5", "H c #145AF9", "I c #024EFB", "J c #0F3FB7", "K c #2A65E8", "L c #014EFE", "M c #024EFC", "N c #044FFA", "O c #0650F9", "P c #0C55FA", "Q c #0D56FA", "R c #0650F8", "S c #103FB3", "T c #0A49DC", "U c #014EFD", "V c #0748E2", "W c #11245F", "X c #143694", "Y c #0940C8", "Z c #064BED", "` c #044EF8", " . c #034EF8", ".. c #054CF0", "+. c #0942CE", "@. c #0A2C88", "#. c #0D1740", "$. c #1B254E", "%. c #1C2E6C", "&. c #162E71", "*. c #152D70", "=. c #183072", "-. c #1A3173", ";. c #213169", ">. c #232B51", " ", " ", " ", " . + @ # $ % & * ", " = - ; > , ' ) ! ~ { ] ^ / ", " ( _ _ : < [ } | 1 2 3 4 _ 3 5 ", "6 _ _ 7 7 8 9 0 a b c d _ _ _ e ", "f g h i j k l m n o p q r s t u ", "v w x y z A B h C D E F G H I J ", "K L L L M N O P Q R N M L L L S ", " T U L L L L L L L L L L U V W ", " X Y Z ` I I I I ...+.@.#. ", " $.%.&.*.=.-.;.>. ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/treeview-icons/left-to-right.xpm0000600000175000017500000000063112167200764025307 0ustar lucaslucas/* XPM */ static char * left_to_right_xpm[] = { "16 16 2 1", " c None", ". c #FF0000", " ", " ", " ", " ", " . ", " .. ", "............... ", "................", "................", "............... ", " .. ", " . ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/ico.action.zoom.out.png0000600000175000017500000000210312167200764023452 0ustar lucaslucasPNG  IHDRw= IDATxڵL[U}ד|aed6dFh0 8#@Ȗ\2H1'ue!nk[w=oRdpӓ|{;{b?h{;Y.+2n E!ѰxπS=C(+QFz9."QgPGo/|Ճʿ￲#k?1[Ӆ;v:.EB7: 8~_Iwǜ"1QFriZqyv4;>B8x,.]X\~&@V6!L4A WP_o70x<¦;f!{a+؊FW/\ YIt%̐ϞE(J TTBZ[[ǻ+**^)..9є hzz:P(ī(B&''M@ښJho6%I-?`h4H2{bbB@˪J!d2={H$`Q@ q՜Ng @XݢW!P @ PWs!{٢RxjǭmW$R&@iҭ*ԪɕᘦvssI8q_LdȐ>Ƭ~#R iU"pC_~kZfgg(Zzҫ_Pe0dVI&o(LIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.script-start-2.med.png0000600000175000017500000001521612167200764023757 0ustar lucaslucasPNG  IHDR@0K|UIDAT8͚ytյ5XݭGE>A!FZ3@`kOOFtj޽{ߴK/_1 8e^ _*}ܹ A@ol7A wΝ;w=zI&?c_i_{V>]`S(;v#Ԥ|>ۊiDt׫w>f93//#\_G70wj_+ NNNl6F7E]ihC4̴>v+ҥKv<ے7m NTT.Vpkf( 8F_[o\, &%]|G$^oC$A@UU|>,# cz#!u|>~?IIIőj4-̙3]Y__G x^gslV[]'Z=leO$E fvz$qqqtuua0ˣZ{=f3/PU~$ D"aL&'NdժqpӦMot Buuk;N^;Hp&qG_yb"P1X@@zz^{ 8 rssDhfMFrr2 ,k%>>͆jna0 RYYyTWWSVV9y$,|2UW]uQ8.=җGnv`3\u{,Z`19szL NҐcʯkTUEuF#Egg'pM7n裏bZ1 `yc^f6lL:5m]EV6oތEUU"@NN^wif /XfpSYy)ϝ .]˕,$&N~W'֮`dĿ|炙AB OH[[k׮bxXV$I"11p8L?ۍdl6ۋhQQx-ZDZZ݃x5M~)^3t7>S:@g݋ϱf]u16ʣMMMh4Y0;wd7"NnJjj*eee԰fVXdM6]p\^-[ˇ~H\ŋb IJJ$ ǹsZZhhhiH?O͕=.P9~7$%'#K}v#.ESs}-7ߢ}mj)~֯_ٳQ Iɓ')//p( */d2_b%wdDIB(xMtyٔ8 C~[Z$;eٌdbhȃOZZ0| ]p$^#x<~#t*x:@+k/ ( L&3l-ϣxFiinKwlf+Nq dy#eJfJb 3x뭷X|9ɴr!01n7===\yȲfAˇ $IۮD$QE]Ōh/8(!%k+}=@[Gw?HIrez+h~7ӿddd( H*8q"ˇ~Gdhh(6ljIb7e4Mg21CMF(ãn7>Iϛ̉/YL<gM[6˯PT4x\y|vs//螿]7w}c%9(9щ}ߦ9| ˙7w~%%%9>Ji庿XGtn$1i$PϹs\.;\0Ŋ(*j۶mtuu( C$y摐htL&,?09s=gc0\w5;>Tc=ƺ;Pk~±#'?aSUxIMJZZ0 G',IbgZy+hlldhh7ՍB4 |}@# %xcrbbʛg| -ŞO5k#IeIuֽ2oА\8g`Qw_bѥNf~򓟰e\.&Lg=adddRWWGCC+Wj(qt]'%%*~?@<:::0L^1`dnEqx"[,>þ}?OxUyoo@}f"a_N`i䔔OL&h"݃hh r]w<#--t]C q8?RY9Xd gΜܹsdeezc`8q̛73K? f|>08ppXf$=PK}񩍛۹~ݽ}{̟;zOv|&B@' }fP]]̙E8l6#nJ-Zb Q.0dggIgg'$$$MFF&k;vPZZʵ^äIeʩkkFhzE~mފklٸu(Ӝ;n`!B#7 B|={cǎʖ-[`۷6HMMe(.]A ))3g*Frjkkw2kV ƍb1磲yY~=C!ݼNUTȃȡώv_{u79?ؼ9 IUf炙Dy./? }gۖϫN/g%uOյ5^2V#q9&nF\q( 999/_ƴid2Ozz((`6Bף5+W0Ll6θ|r z0j=L2Y9g֟g-_['Oί; {Ce3f0kVq /j~1NgG$6l6z&J߻n8=8 `xvl`,Yr6- \{ٵ@ףnw`0<㏷pؙ>}:eeeHoo/99L8{`X(**b߾O̘1GFff۷o' ɢE dff2g\?y/V.^,__6|zz:-PPbcfL/ "$1uF,3L&3996JAtdYnQPe}x(* 21=EQyTWWۋ@Qlw_kFi_}}bKD GAEE3(((`u1}T>aNm7>Iii)Q7o]י8q"SLy#q?''Ͷc5r}KI()M @U5;dEX,,VY%B1m X SLr_6vK1ؾ;.{tDO<\vQ+XAtzAd29#+ k#o,(={(((λPK/… y \u͵>Z,IO' Ecez;yC]547XӢGd$ LYz xzRZ[gjwij:KrrpDQCC#F{{;(Ew J;3 R{t/g-8oΨIP# ij,C0ǎ3g6lxrr˨UWbpG"`(Ox޾wNWW)))U(裏4/Gچj%!!ThR6$"d`j=8kbb ϋ:HY I!䒅6ϋ҈H[B1 3"Mߙi# ˖-% #I2gϡ0H|3Z$:=QZ-ڰk1_r @l/MvnA0 z:!BȉQ, ƋVapϏ#XIFrC(btttM^/7twB.Ew#MĚ7߫B?׃ "'#Z0 y|>RMDN#XEl"MFEJ0ZwB\<?hM0z>d2 LXN8!!!wUP+V";4 HI"\{Ё騝ȓu#(vt:@Hm%buPBjGM黋a̞={PUUVr T5$I\._0A@GるQ$|H)̫GlGBTd 9/btw:Ԣ1AnGv!'}HL2!I(RU"V@t/dprd* ioW6TjSe |@F6*UUU c43g6Gv;s%='A$Yt""Hst|'|ci3nghH>"x0۷og iii1X8 (!V3rP4k76ϯ34E-|-dF%lF">>p8L0Jp8rO֑%ɓ'?'#;0 hjd@0/7Qʌni U盧 =7:74 pP,ˑo7'IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cloud.off.small.png0000600000175000017500000000302212167200764023373 0ustar lucaslucasPNG  IHDR.#'8bKGD pHYsaa?itIME  3}G,4~?HQt EjjNO6+ݽO|>~'[aCu:]U/ľL?,xgsPcccutdjHZ 0Οy2!8I_/mk@LI35,- '[AT3)pǝCCmqh{>@\@ h^6U:w!]AVΫc9? H/Eݽm3-7̱^]}M ȷi}&X^;;[Ï W@7u}׺k}ß٣;kV+gmyϾy| 4o ;QV,mnֲH2e$!Ydw׿"v|NZ I?/ǏYqXUɱ~?!z#8),=d&ѩL-v37ThVO* .~KE(d4 L-z~fvsуx4?hv,JzB!=}jui_BeNumx&,ʼlݳYSIf Nu55lﺀC[w<' PX#A<Л3G/! F0yO%ͮ5?`YSSy7ipS3F$/=s(Knh~5叹$T^+*+POJYF7Rhh_d{{Z-Ɏ?Բ ?CxFq48-5sLi=HPP^D8JĪkvc]u&$exdg !B; XcНgQQO L8gף(;]HIF?Ɂљҁ|IzJ߶$ H:8IOH$AJD{Gޤrafmݯf P̴Lf!)_VT(O+[Lb58S~?xQj{uߔ^,)?gZ)S)9/DX&qװM8(Eٖnʋ8}IA>9_/ޡ$II\wQ5?o\B{k{xdmWQk1(ΞƗ>M`OI`4MYw~XN> yDz,DW艳li"< 2NofT'Uӱ%9#hѼEcHhΒl M)!1:ꧧAQh,z>nv")I'dF wo:1u $//dY!77Ĥ.sˋ,,PrmK 8Mg)M]Ө8l3+I" @6} By8ȓ`bb.yLN |~sK i?:$ID"k"!܆tB$Ҍۏ`b#`cc!ܺb(uU\auyas3kUw<|OKs &Y2 ^4A !sTo9 Gd"cf}oԎ1.r9{$cl9-۾L08իWS}+h0ΏЧ?ah9R% ihFe B;LOaHv CVrpĦ[ZfL&(\3JSE!@9@$,<OJW2'>E\gX@2(f tVՆFMQQ%üO"PKYMISd)f^Sq6-\>ǙѦľ"˚-99DhL0eEBfÞa"D%_BA8< _, R_l%K4TOⅺo)c @4 FMƢQZ3$ J4"`/ҙceJRVv92gV77Њ#0"֘fbf(QJu="KDd)nh1M'U_bJh(&V=jI*ϕ.&6)>0OgU&#H'N.5uK#/J0((OsQ ԙW_fҀz7,'e$[i"m2U.IL];WX/,+  g[4T (-SSI2K0GLYmA_/}xX(мtpQq@hsn/k)#IILTN=~gHjMb,&Y\ZJqiL/tg,^s1_;3:,BVfV !8byWB$hCY\ǻĻcVj~tW`H՚*N \.xjcll<`(qz)J?i |JlJ&R`)MR}H1\AnǞGaQ AoVMNLRXTbEEŚʊly!=~--z_"=zHsK[Êt19-=i,JJcJ4?̩R9:9@UTH|gUm ϾC,[7Hpi3脔S3#n5k|\/ 9[}21G'Y:+qNaMx~eβ^U/:0ddRکd>l#g=*IyK- _w8dĞҼj.F?opUr=J2kW*id`,̯tscbʊSGxFՠo7,pxP_ݦWg(}4Vd0G)LZ{+=tN~dWK*hL/E8\UBh/&[!#e!s `ٙ1ߞ{_V,x#ŠZWެ~zg_Y,y~G+s^8ޑ1HGN<-ig!'{;籬Pwt֛d{wa-1eo $]s\?Qfh K~޻8h'G'-!Ŧ w &xvl%fִ҃1uO~mM529 `*9- Z*q$t Qɔip׹9Eli6opuڌg2B~nuCp @^:pxW7I~wr 7)`lXsRHѸD)֛oĩ8SUve?1 2*B !#FL/GfZr'faC7N+Pn{3(8=,5e }#u7|29|{-w>>|-Qw4'Lze hB$ALJ/N '~a/emE;y2«CIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.off.xxl.png0000600000175000017500000001240212167200764024642 0ustar lucaslucasPNG  IHDRHHUGsRGBbKGD pHYs  tIME2 EIDATx՜ytSיOF^do`Vm0a -`h44IN&3=Itz9C9ML4$1d$l`8b0ƛlY^dIw$=ɲwwė,wB˺Fx@ wеN@\j畾 F 2&4̙Ω*{m5Y큀|"@ 7xR%iaFEi@q 2{FQj-TA$$!%Cd;vQ9 jh4;p_m=RM%cq5}wYta;#SѶ5x5_MLͣE? +t͚ ʷ ;xg\hiإ%M 0*i>lNw *&~mh|Z䍄Bv lܵ1q@qÉՆ¥!nt8q[n(qw7oF^imbV$b*f'G5:ŠDK=󆘘%#玶08m6ZG0DiȘI|TEZq#A]"!r0쯤w{iB ybf~u׎FnxHJoWI[m#ۜ4lZ{;+@B Μ?OSynDJfn$Q5ַc9bj5ʆUk)=&zrqyse)^X_g5r;8(']\%Kh?Kges9\WnݼsP;Hp~Xܵr&$JpH\fߑԟ8I0w= /$ ;+B%5ۺ'G eZ`Cko#`jn'd =r8y?_k?é\ 3'F1wiLT*WqN/Sb6YE>h(R)5Bf@CR&MZ$)jGڻ$,wy%RyhJ& =쐀ڳEn|S{撷qf36)V]+m!}-4车nUVzNH≻!!aDU>LMC+SS?OܑkK$N+=C+xtVdj*K#!Gis-J52"Ao·y`b ;v_Rݳb*4Dػݱ^+]Ps[֣Na^Đw'rmx]T5v~<#;x82f.&?QOZ\4gyg%6{f=_Z̼ CۧNc^%8530 }7Tޔ@jz|c׈ dWJܴ APm2y`}Nuz5L/93gH%Pk>>qC6 ?W;6S؆# -19/99 5 ְY@t2?™'3U_w_ԧ8y*˩,gM,.LBb]!-E !)-.oݒ5,JN9g=8~D |Ɨ6 CV;/&yH^dpiHMi˼kKVn¼ \'%x^qF=s4@HEzoiCxiO(9~E1۶ s >hwdX@^4^R3%`H\$BCjO-(H7/)c̅$}uOXm!o>̔dDk )Di v,}H5+HYd2# r]em滟`I4; Yi>o2i8B@J7ȘjL$EH:j*9Lzp{cHjw JNfn=rN&:{gE=m]2 C Nų\l=4sI'Wa1MfݦGG# 0[GHa^nV>ʢ+鷃eHGݩ AAJWGVWw¥MJ7DQ~=v ɝ% O$fN<suOrVoVLjtO*hQuTGn.&=.t,_%QX::@%)XT`ACsJ wH Pc &~+L).\!.w<6DQA+̛1 Zy g PJm>(w0 Hv*ȿc:qZ&!1Ϩjnx̬]HuHzZNhԑ6l)92>ݯdnoKO}‘>Egkb(0Q̽-|s9|H^gʐ4=sҥv l=QFN#!v fgH=TLUǭnx{C|"hרCHHLgQT^hgLΥ CF/w3b0/OLَXh% v7}GO=Er@vC+e^MN(t'pC.JV7x*:OCb F.GwIn5sWu,vI~ ;O8Y8;7`\-:d`$EyƮnbbceH7 /xvV=4ctJdH35{"o}Hru1 Ž$(f>8tq Hέ=~3:(o!dôh t6umN%zcYdZˀWY\4b>];DŽ=r4d feћ{rPlZg/nV/gV)u8&5o')6}M QltI!9HUm+&\P?8BT ̟m|2+%>n3kڻ9'GcFt5Iإ(>>n R {z -6xb鞰`FJ~T҄{MSxptR 3`q|+W-d&WsW8zֳ4TkB0?ȪekZ-CZ8ᾲD7iɒ=^lRg,༬*{mN(R j2{` [A~*wBkPshw<+c|)Z`'kVQ7_%T&yHJMې!;p>js9JO2oeѯψٝ1oDu_>zV<(.B0Z8fg]~*~IEq0ϸUQ>rq(Ic]x%bQ=Źc7?T.$GR8 f @I.t<;B&λp HfW\P2jɷIV…+}fzuC0#%MMG38,}{I&oE6NjJȝA;hCՒ?[Y.vShy\a>; x)˰`#F=oݛ !-9&žfq.ė#GK 5ypwT*T i_#T !< \w@2P|0ѦݻµGcYt%IuHB AdB!V͈7@>8_2گ3%Q5!9 g^/8]峆R!B~>mn'5VSpmt̩v/e2߈6yH}w)0-B* U{I-P+P@Rs #yگ9/a>3IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.router.pause.large.png0000600000175000017500000000605112167200764024137 0ustar lucaslucasPNG  IHDRU*NbKGD pHYs  tIME +(0Ӗ IDATh{P\}?ܻ/؅E@ K#c8f8mSMfR4R8)&#O=IǪ86ؙIĒ]"ɖ*,WHxhY]Ò+O;8w]6iA0z3׋ewOCxw}:MѺ#ddd$t8{e ì[UWVל9ʹgB/u^Xᝑ}eӖm޹#3iƦ6})-X=ws 2̏tXWƁ% ڹ!zÜ>OнszDƦK= ܾ㑠Ԝz@*ڄaX7|l>Mwe^hlj-9)b]q9M!1I=rg2^~e&*7p[FZOK = uW 3 dCe-?ڟXE}cWxf]?SNs  o ؤ/dd2npmdx *AJAOr=aX|mwSX`VrSr)A&Ma /ɉ(%ՔU%T/EIyR|[}PoG>2gp% L5dl*y/^7x.q+Ns|;'XMx~/LĢ~z'm3>a0>auuIN/]P{1p}/6=CG{+FVed?oMQ /mGjh}ے̩FGBh!9/鰁o_[ WϹwxjI/S_`ϟ Ph8#ueib¾*tƦK~g{ VA!n4sěЖ"Cq{qpoחѤZu{Ii$~Gklj>Je3@pen_ I)R D@ؿD)8ۖV |Ǵ^_MxzN~D"jW; \~7 V1PxnۯzKMzD4233zn#:~k%4M Ho) Ӡ 41MXlj42]+X_Ձ]|u?Oy}˃JĔIӅ%h*i&H.] 3Q%}tw^^O? C"0]bUXs/o*~}A幬ҍ'ϲݔE:'FGv9x弄)O\t/[~_ɓ\ KV /e5GBR%g3q ]ֶJ{X)U7oU^Q,[ !!)BU!q想@3-Fw@ozr-Ŷ v7fv L7Gn<)IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.router.off.small.png0000600000175000017500000000202612167200764023610 0ustar lucaslucasPNG  IHDR. ց\bKGD pHYs  tIME 3_0IDATHՕoU?g̜vKc- 5x5&h /y7/F $>>7?c# >TBJqMnIj){)ݹۅ%&P7̙sN>37}=@O"mGKYMx=Ss]J#0LQeK!ABtR50$B ||߯!hx04- P.aeqfgxjd x >Fҏ,dn:0<2I]G }YNOiWJE~8ΦU_u]n͏7M|T6-[~wp%ȡ|ϡ˷V"$'ttJ=4Y|yͩrar:gb_&)T\ kGNZCB\xj?MVjM9׋~r=3>lhlNfwOĵ7a(EQFL AQa4r9!)!GҶcǀ#[ISsR66?7x@QSIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.pause.med.png0000600000175000017500000000750412167200764024741 0ustar lucaslucasPNG  IHDR*7zsRGBbKGD pHYs  tIME 7`IDATh޽yp}?﷗vW+ZB%[p ؙ¤BKNLk;Mб[$e(1e06ؖNCvM87ڟ~}z]ڵsg-KWVږtJjqtE)44 ^tuc矿eޒsv{^٢SEI4M=><6zPs߿ڵK)Wj_9lϷ 3 J{Wž={74/UST pOPt:]B8N7BGKw,9ӟ|ڕɏT (l޲oi).)Q|mLrmذi;ŕL"U"\n:EYr"n YXY?r3@!45^'o(TÙ',>\5TTϚ>fb|ǎ0|m/DMhQunFNko>gbEY:\`ƭ֭iڹcCrs}#DYf Vuzj:v97ZobbUN{f io-'غkX~P7:ۛ˯{r6[ t:.y$&K.t:RJގ ?}W\-5|r8d?a\,,ZXX\_`d1ܖRNUH3K߻}e庅<ϘK^O, r.-4d0 q>B>o{=vzjuv^>K/%u2֡@ vٌ*'?JEU-l#iAV5q$% DT`60~mZӢ?1ާHKOO޽{$6p{G{_8I;J=WD3Umev\ZKAa)^$LS{^9v#ݍ:LB-X)@A81 200'&0Mݼ1D@AB|vVCɷ޻n`Wg_]wV}LW!XXRJW<@Gx.f)7wU֬ƙE: 2?Ml#޵ {@];AMxQ&B,x< , 6EzLmZlHj(̶qLSi;)^Mc U+f$'$*D*Y0B$L8ǛN#''WB)%_t1˜ ђ xBh{AڄdjgB(H)Z-DJo"Yxx7O7(++CU1 q55H-ŔdT+s_}I%.Է=eO ؕb(3t~54MRpGE5ڃ*z.E5΁)ܱ.gO2u[ m<d`e vyJ9)0PxH7LCpihLVB63eF;j3)<+ ?p,[_o5qo$גt(,~䤖6`HjFP]f{ȝYec}܏%%n6Uqp֩n p$&QjKk4 X"5mF<2d2!B,Y D|iH$H8)ѠBFpjll+`HI2(|+v+H)!le}INJ#ylu;?HRƏ_X _JZj·& c3LKnOpe,$9fԱ8=4xyKRQTfcmFQE%@jH-گlQ;]R&oX& &WI8tt:᪨(kC F6nڔ!w:NQ<;Jf=wBWi>|'8u21ִBxnFiuevpbԓmϱ'==v%c OF|~|ttoL, pw4Ȕ{/3M|`S Olܖ_%J)6op'uY]bj}cw:|.eeU)f)'y=J`;︗ln,z=V5dY_xb>~!ּF)Y%%MJ(eQyk@ENV2 R㰱urqHα.^߉W.=_Doɨ^n򥻷aK ˳{_\'=7zqMU>ER{&=46qT=b[6$α@~j2#^h\ @BUa66>"QJy8a烻)?~eaN&/:jgDZIENDB`marionnet-0.90.6+bzr434.orig/share/images/marionnet-launcher.png0000600000175000017500000001244612167200764023441 0ustar lucaslucasPNG  IHDR@3'IDAT8wt]u $AHJ)H-kKJf<8rY3'Q$j$Eb'HXЈ+6@%"o-s9{ݍ},FXbIzx0uù S!P%Rg=S+g,Sv᳌2RI~ ^Ohm?K7$_ge Hv~M:>+_7$ fϯbM 2<8Cؾc p:"wR[rtRY;pΏ+x<GF<[SuKί ΁tZAڻJudf SZdq&UfB(1 JY[Nf ImhZbC3/|-^S*0 9e]v-v!*=hI]8ON8@B_H CüN{94j$H8o}Wǔ(\:s:ï0:^uΌ v_)7+ iOu)m({zHQadMlgpNm iu +W$k2^6놛"Js\< 2X",A8lߔ2`ر_(`E_8n& ۨwVip]޹'UUYYeÝknܭ}JL~+ͭȼxoc\$1 O޷EfiE/r Q?r-~J~*/7TA^n]Q`XKn+}n2H0gε&SC _J ?>|ݮTQabvOn?yy ) gN[Pa/(N\/)u:Z3rL^ ?9S_0+)O9A\SrWlv״:_l쎍}+9TE;.|v/~~ WJ9q%Tԟ~ޞ%&D.\6ϱv"w{}_N*/ ,$g:vz1jtٿi/H˰,6O 6Ueb1;:|ߦM`+q{^^gMWׅ Z\Aj);~}USM--UCc8tqCd]G>8cte"3bb2\vK1utؼifXt)ɩ3>ݺC'bByùg>eX|>R\UU=j$  SUMVv`VF<\&RI sY|9eS38~u,|Jge3O_1"0Mf.ŔELi89, OyU 00- Ӵ2>:JWW'j2E_wu#)2e3xԔPxnY&J242aH#d2Ӎ!MhQjV>=>^'[IR5 EV006>Nee%V"??OF&044ĩӧdΝ s,]Y, ׇjM QC1M0iz{9A=ށM&PPP&O"y0sf04 g?`^\p&3k_'sSoz 6l`ѢE0e8vZŋ366F80 zz{Ew'h" QQu Ad , Ů.pf)swwB$ErQ[[C^~P9H60-v_MU~䩯_hP'Kkqx}^%??d2IOw7ǎ>ٰasfFE~?e1>>N"qt\i%lsƋ,bf#KiL"²@E,B+d^%˗8 q ]d Lݠp0wcnLs>ʯUKqI ] G<'b&{ѱ(<}˅t!oN:b\+*;GA1^,j,! JhaYX%p|aw:id-PUQDcٵbzA{mskc38vQ ww(eǓA,6{dI0 à-[Bdfff,k/o:l %}t7q#Yd1f!yEDID;i"i"H"i"2vQ$ .(N$roW%g%ÛIx>x?^ft$ʒ%KXf-$keqQ^ < DY0v~u.$Ih݈(N":Fw<@ky%3Qgb2,#&&c  " 2n!" N XJw%ʢb.$!4l۶a.)/ͩ-jPpǼywny-[*aI,⭺\dyujblןю$G ?|J,[ L"(hX)eQL#+ ^A4`i-v$T*\.dvqJJgv]w?[ϳMY곹S#m<rr΋jկʀæabYTrnZd疷8y攓 >Lnδ4L4Dǚl.XJVV*+,Jp8HX躎fC$R$ΝBK#>cO|9V]]: vTFtKmu U0Of@@-D̄6oF[Tb|M(;ٹ9/'+O:%#ÌpI@ @jJJK #9\i`Ͼb1g<>1AZlRA@ӴOeY(CEQ zvم;$V]٥dIaŒx/ D݌lk<|xi~!f84%`b!(2_鲚 YtؾW2kږÁie(D~~nٌ⁚ϭ}F@ E55.--]F]6Ac=J{.U=7w}?֞F~uˮ޾@ߛ'f1bNouՂuO?1Z>c86z[{0`(:|]2>6WF?p>S W6WLLL|vn13 $둏U*R67&1 I]%yY*CwL=;wVͫ_|kdg8}?{%le*T/_z7u`6"$JsE{QV-_8N*z ͯ@(Yt\n0ab-ƇO&sN'I .($RP?_mi{Yt7dfx|jfǯI@^^^<''m ͯqd3[>W(P;/{ 80[W{?BAArr;N!U 4-I(YysU0$L$'⏹kR>yykWp-$[ZZxcg]/eɴeW2̀##CEtV/M?#s^IEpt(q X~`(^*Y\_OV^_yzkɜό^Q$叺IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.switch.pause.small.png0000600000175000017500000000240412167200764024134 0ustar lucaslucasPNG  IHDR,e~bKGD pHYs  tIME 23#IDATH͖mlSUmmkolFD5B"cL``}>Qg$ Jh D^坡ҽtm׭ka]a%9yy9G0jj?SRd ;{^LС#ZZCC_ Tn s/]=ZZ M.a0I&UII+cuxxPul+s.8Y_OC1֭h??oa6[(*^dᢥY) GSn XV~+Xㇿe+.ƖZ&p$Aw~I*,(A Ur^'Vg)w|9 CnΟ`/>"u?)w򍕨@<*}WwS\X!p(Hlܼa Wu<nw }.#}g}m; wllB]yb6 ~޳/j>WluՖ5X+X-vT8 : ibD'j waj[2wt <[R4فR0!r6"It@'SSA'0[mVYBG/"$ZɑGg:|Ü8PەK37Zi:w F4 ف^Iey4;ԏ.{s#$m spk1HK2&k_a/ZTB&zـ ']:cr{Чp*ciN%c$k5T'8IԃPさYܽ9K.F)'lD:;w!?ڌO)U%OBgEk##TGA$ffDRs+)NۓIoE;tda\I<^.sˆ'*@"B;0Jk..$)$%l ?@|s0&V*G4o\='!ivєit26V?aSɄ]cg޽K47.G4}$G,KB 6E!L$vjt28Ŵj?謸|6P?NOzx{}F>iL6-9Wk2&O҉i> Qou#0,IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.router.pause.med.png0000600000175000017500000000373012167200764023613 0ustar lucaslucasPNG  IHDR=dbKGD pHYs  tIME F eIDATX{llc[6c 6 mQR U&iK4(UK iAXA VTJZQ'@1 ~P2s؜w{?a_bB#JW>oovi*b벲E͝,|zeBcsCay#9?+~1D:_/r?Su}вK0q w5ί]Ou>UT5x~WcAϭB bG'b)z{vdDL)t+kKKhM4,ؿ6|y/=@͂_7z,DK Koټ7 ._bWK8CAOWqgTcd3:`?U@$mo>c 8w?{7)..AQUuTTs"4dS?c,e,%iO;@˘tyzCS=Iۑ1O#oh|d˛C^aE(.M]L fg} ]܅DENJIRTp/_:E`o,K> ,L#]!zHމfNoCc{ŗwGLNC T-Q!"AD:A40$9y䢨(-+=iS_WZe<7;7!\v44#''"o*`&uqSYUXrHYi^z5(|,>oddP]QG011@pĤp8\p6 (! ˲vhqDamڵkjn/F'~ް9]Vl|!UG[[; 2k;\L G,k, H ņ,99Hj*hްI_a#{^rwcc|?So x сӝEeE=bF`TUUxvr$<(8,LNV5ecmeDwwLN<ٱm7"EMpX,XL%`&@ ,Q$KXǟv ݶrf191 q{k9p;]~O=!wui=Y^]]k=۶m'??_]zV|nWZ,tUUUUU#ëj$bDAB*r^,*͝С_mzfr';D #yk׮_Gԕ]w/lw,ٹ ȥVWWdbծޞkYRZ+۝yoN8dFd=ݲe-=/7y_c${f>48p_mv gU]7vw7,.&/zs^*((|wdRoZfrjRNj8AY:V_3,ҟWo914܇X,R\dlK&CșM64( S;);1<?T*ŭZZٹ?c]5s,[V/ozSVJve!J"Lo`x==f2QwWNMMjIIsOj8DU3|v|oafgɓ'] 8!b(,(n #ã2AA)qeee'azX0 &dLbf& CY]ײ CG*(`Y(-Y l鹹eW\x(/9˲0M(A4q{YQ (0&p8H466,&D.kh{_!셱X;Ӟ(/HMAQULOϮb n`@$ζ̾[5Y@S=?tv֭l֝iƢ 0 0X CiĢl"B-``1yǞ~WVPC ?pg^N$"3 ѨRbti B@(A:ceI6t]XT*Uݧ=y}%c:TMaP2*חr_3şk|Fرq<*TMC8l6<B D2v*/d"( HB 0ZcWZ\LXȲS7[`~W^}|u@t900OźVI'eA p< 0$ |n nwi"[B@zttCFU.@xb<DṊqW7orr;qBP+׃jBLȲL&Y@ePӄnwn)EYjcxӳ $B7L M3K&a:G^Xkg3/xү&@) ߎX/ EvV ݀Bt]ENNN;{UWwYd0TdeeCd)?UOA,,m "(  E T ĄPU0 !9^kiAaS#C$afz /~#cr;QWu5u冯yH%޾s &Ah~,Âe f 5!H6Da& ,J0 ;ofƔLiBa: 4ð0MLd4ajajfF{.6%x6%%(,(.`QV\bd uuoVVVN.U+y:D$ YtyLD@0"[ver̆$-1n0Mu.z=ih D^EdVHIjN7 NA_vOJ@pނNPJa &1a(]*ŒT=Գ[4凜 fjAeȲ 4AN1JODҲ??5 utt7=;(r>dgR4j z8˲X0MPJi+1 J X]c tiF ,e NG(utݺe==pM7>:7;wl"Z הeF0h( $,6'$aa ˲H$4#0 &%y Ia`X$Axlpo6l⻃CUv2 ˵hAz1 0+8pxκhzts MЌr'0,C}{^/aW]?~.\vY*_<|0Ȝl?lq9tբJ[L&҅,wvo6o{.O8hXޱ}S[(BRIh*ҙ yӦ+++.g=~3ϖK١񵪪yV!'+Kڵ}W؛eo=waJUլ/J[_-n@uKvo('$|w}7=S86QTXXjJ& Qơ( JJ2=Y^VutC#~|bba"Nţs<77 ]MC7MUWCea* X& z}Cá;vx_Ç"xn9t@__O }}LphfxA!KA97% 6 ||緖_^o|B3f&gr- ٹd*UJy5af5Z+)-+{]^7%yk?0pZkjIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.machine.on.large.png0000600000175000017500000000704312167200764023524 0ustar lucaslucasPNG  IHDRUJubKGD pHYs  tIME 8&\s IDATx\[levk6N Ɓ!JH/E&Q&o ^@}IRڇJJQCFQ#PHBPJ!1@|5X߇ݝ]Hf9g9; ݳz|{Ǐӷi:zۻgތHlݶ[kX =@b>A|/t"0,'qi8 %5 ,d?Qrg;&[ Kב倊26[DK˝1t1K#I,)@8ac[cd+NQ\2V[Ξ}]pݭ* g_رqW y {VazIᙿ{EwgX) M'{eP?&mmQh:!աuds:r9}^ö724ʥn#>pK]  xLp9!LԮD V=W|} ǿRQEh iAUѐhfQt[j㣘Ef/BD"RrdT5lVG>׍?eNMg ꭩ &gS DӚ@ yjf4dTQGd< BOL@͖Zײ ]9gF svS>N{Ȗԟ(P<#<UV)  yrk7oBĖݏ~ԐT8r""+p{)88f:=\4 EzrXbֺ]]2fPS}ЉCs"o j(9,9xc `|5A"f@Yg򊾼R=7=8X2\A?M%Yy2) 9a b3n܃ ON@UU ӂFz/{ۋi{۱C.OSMp)$#"`yN@@d1Ƙw*‡<@sjrh jFŊG4Hx)lE~O> {\zWwu+؄%qjqqJJ@_J-N9ܭdWHN%?DH1+QGns M=KA]\JxMxSU~_ H|" W*\]݂B35BV-jԟ 'rT<2N9Do_q[|C_ "ٕ59LZ_/0r[8]UF9*[x0K|l,E˱Ha#_]l=\>!f.bXW1)U1ka>cV|4icPv\ )c*OD2] Ro tqq?XE>fΥ{l u]O.ygKV}8t=YϩkFpBRBjlS$۠fCn rm"cڱg~g=VB) 4B JfchŹnb=?xu"3'>_nzb/[NatoP$7 8'vn+fiE H4pф%@xȇ({ kcaS[DcP$RppJEU^GY[tV׽T^]ll*;7{kԲ EH5?vLo^E1JR ȹC0u"l>C eOϾ8\t3*~o*. Br_> 7VSΐbLМHT%f~b:==v5sd3LRSSJ30+fft"hǹ΁涥LBs"LA?qZYy}cID5c!?,7ѻ,jj_ԂwXBffFDr 3xY@-qfuPC~KDKC\#6lK"33ZXԌ@.>8a\@k ׯN)\ kH^MI/7*ʖi|zE/X_yW]88W_==w|w|v+"u++&W3?nLgܜDZ ݙ|d<rv)Hع+5r}]dUɧ8h`B$2(Ra{[Xyhyg:w;!ku83yhY;QS vMAM)12&RBhjs3O5#q5JlMTaJCuMmPZ <)#V2C*U5L#B )?@ 2b(( D! _#u;-}{K+_`C2 MMxili*}556K<Ü ?>ncMQȒb,fTJ .ɒYVHȅ>/ v7~ZDl8čHp{56qwYg戄1Xw}cQtp;#AcˤWq׬F:Q(X4/rZ8m* AӨJ $w dfPP1խ8m*Vɕ7}u+VE_ي,^ F:Neɒ 9DֶN ,=׿PCEz!^$8HZZli|KHzńvRʶֿm(0 ϶i>wKs~(_?{4hxĹJO/I;g&IDATxyPǿ{p 74 A4"Mh։ؙ:m;jGSMkIӎ&N+\$Ų,˲,{?z݃]@< /|?y[ݨxsGr7e >~b&w@)pp6+ bVܹ\fU$IVlhyN kxp}t|~B$~_4~+!QkvQv&z.kG=K%"IJfUܹ{ķ77 ;E3cvqV++as`9K]zd/,F+3SM= \WYsBjs ks %f?WI\@`n6fg9\E6Š Tsd!07xBxv 07xpBS(Sbp 0s%^hmpY}9+^ucljsBPȑ kx1sX_2|2h"'~lHv `m(IbD^󘴲8{u@ Xw2T1') (D)P4➍DNbc#bmR^޶D8Bpm5ZZ~`6↰0IgY&bh)By|X_g`mp@#K[`|vԫ6B&vw Xg], t ;s%pϖ* ^A6ܭp/#&XB*d9eQ(O<3Eq>I;P l\EYgUԱ)p6zG\\SZi[[8ߊ42nAE ӰlGsm=#F1mݔ !] W~=[7-h jЦ3][b f08fv< Ӧt/oD\I]3-!? ~Jj㽹WZEbXM7*!J d z8Wc:?)lOCXKaͅ}ʕzoOHszvܯ Ll7a纜ć\O{<.l웖%cr8Yᶹ [uuSiK =ݺQ( K`qPk a[{} dݝ@HCش&)> = j#{3reX4?[nQL>嚃 f&>d|_UMo@^QE೛csA:v=4ć B7'2mSl6ͱ Giֶ+'wkG̢9Ό8Xl,}Ohf;:uwtƀ6g>*ޥut87"V0UJ_iW ag%;[dDTL^Q SmV5{ҌxXl,Z> YC^anY_US4'I$szqKOwP۵Ór@Xw,dkN[7 ^9rJ(_~z`r.a~ޱ]n{"FǮ7Bt}Hun@uo!+V^}HJ 376=RNI$< X0% !XlRum&*?ݰNo(>V; KJ;cjx`:>@iajc]wVbb# [\mu~!d' cxUp~qBo<3D'8 l7O,oi|A!Hsau.65L!1!(1DX#~\sqw  $pa|rC-gI^]7άKb &+^?T}awR}n#k_Ib"#`-H2~|OR޺䒘¥JdY=H&?:Q#IS$7.DwR1@@ &*136{%EKɱK]Շ>7cLA*FN2KMMrx_n#I6f"j_v͓#inEʟ~O[k3,\r%^;1O{gDY&\@0ebw8_he$$v+N\ IgXN.DsS 6VY[hR{DQs6[/1z.'u#(²+e;nAT(*INba9UhBpVkPk4THME0d7T),XtjI?`S F'־'hPtۻ%sԘP)־H˩zE=( ,3( 6MgYBF%WƲ"J5`~N ޓ˯7lц)Z9,!)IE3ٽ_GqlDQʿǥW|M6Plgɺ/SOם_%dcS !)\J%ىLْ$ 1feQK$yph=wu߈4m͚nOH{h*@RF>A"`56V(cgV+|(fڒZh?0\ (1>%#?Z&*Jhoa?|`S Gnzv _[W*rBUY^U$,i@E(Hl{3bPT.SQ~{jPw葪;7|YW$:4К3vp_c$ɐ}ص˰ecN.Z DJDij5H:VE剓~׶Y:zO}wB6{*`}Cs6z̺p1q`*$7o2Vk8zipЯX\],a`E轵X2qQf ˳c9RL( Vk te@$u+ʁֵ;Ju9Ҙ?쪡勪/ Ӣ#I(D7! (պ[׭{X-#k;6B _.6#)rB- [z|+hHC5bU} ɪm\0|`szgXqTl}mU{6Ep5-aͺw:b?f7TX]2۷nT6'&̸'(L@Vdl./&ħM=J7v Pt + Ƿ}ֵ;nu^'Ij?gKXe}in v8d&!%<ҦzS 4[X;@8 U\]áze$]q%u*H4a[x%dksԴ&dG1=3PL*>>FN4T ҫ6YXΙǼ&W BP+-gXc(*ӌ:fk @ZFݺvGB(H^,vl.ܸd٩z/ IBR zd1>Ep0V,.1sgU}ɽtPFH8i"K2ƣDo啊4돑lpu4s_ТiZÎO?儼LՇK]2Ks#QyP!P0}\5cG5Lj*@ez1](2W"1pn*i֮fSQsl,,d$2!(!)zӔ Me6yX &3j́4+w'7]-l8LC}6k3I̽ey7F02YfT)0EOC@_nL&Td:!SErHYo #ݾAׇ6{Y{m6=q\(LvpV2q 1!"ЇJjed[WO0DKGs==#VDŽܩjG">۔ǑnI ՐgNnV`x`_$ݧ+R2ㆉHPM$%x'(d@X̤,\r#QQR ^ =8C1u3X,{ 1jsp&y1q˰, #h "xV_,(TҐqic[139y\rŽ=P!6=ț#eW-*^!נ1TSִ؜d#m7̈́Ax,Ɇl[L5fE\ǟ26? ] 5lr{[nYpX^hdnSeToaoQ3-aj1DEEc_ԴltzÈNG7>V)a>x:+i9eY^k82hKIi᷷!X J귎L1 ';HIXC}e hjy@=_bNhb>͖:O4e󣟾n OR#ϟ>>)]X>KVEJ}J3 A^S$JHE4ABA7xͬ|z~a3Yxw0e eϧ\<"B^F0n ?ժ<枣C: @;ru hV3c~ӗ)*pEC\P1^A݃.F!ZzA7ț`2fAVpPsFIV[H#5%h֌p4[][L̃Iѩa^Pv)YJj{H ǹp-}˲ӭrM ;_AƘ™2Rtc r6GS&퐎>f≗z ,2bpI{tSNMT⢵aP` ni9 Q|MCb's Ά#åu"L789O9k<8dk &`퉘xzZ.+~gVwzDC Ղʺ ca+ Y7,#,ׁb?ҷ*{j{;aT!׿?h ݟQ iF9+ *VkсEg.H 8!g|VcМ=j&d7q;-;m#n x |`L= ~O(/7Edn f/?P`Y 3 F19ˀ$Gk|k/M\u];:hh"~41o/gϛ]rFJrCtڬ6H 3!hM>GmpK dvPwhY9\;wh u/Amcw_R"Js$)/@\Nu4g~3HT%Hi}< Ki>|2-BmuuzldคQ*dbrTԜI)3\41+s#]]ĘEBWfN  p_?k^DBrT3 ,"`h~0UL(> bEKj\RLⵚ 䘀,HZ$+OpW@($"#>[lmFȂi |H  Ϙz?ڶ6vcpb+nھz3R(4Dj4}a`m]xeJVٸ#6,NۋQb]O3n/k{JQn5uObX[ X9ظ|%ی՝ ߦUhkG{_Ks.Yp=ڼbƯϏwWe@I:=vZdˠuWl|Ut}_2lp .8/L>IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.direct.large.png0000600000175000017500000000366012167200764024025 0ustar lucaslucasPNG  IHDRA>lbKGD pHYs  tIME -_=IDATX͘s?gwZٲl,욛)n}IlLI2< }j:3䱝2iZDp6/%uvAV;s~}WI?\{GG{R6l "E(BA(P8x02ׯ_>s5m< w̄p___.~Ds].\. Ms1Ny -[iڲEd =}* / x~49"Ç#CF> N8eiNL6hjd$IJ F&$!xN 䩟\:yԆ2055 T2 fx?T*n_^F|>&}%?ڳ;BɶY^Zd6e|t fIqpӴm\h/˶mt]g!' v{K?jC XYYcXiZLd2E6Ny)qz4Nss |{9:r1 #WGG6&uRH*fbbX$XAu<4_B<[*mmmXV5sVuVz{wL&QU&P6]wNWp3CwRʻ#L&|bq2? Kۻgtpe>| 4q=vFzD,6[w>CUUr.M @TZ5M۷o]~%LZ _"T*?P[:e>RTIMz;չmP3 kKAY-f')[#RXbj 1 \O7n @B n|>wuΝ;\aUUHQEUPEQd8pm]]gZSW4S_~y`xt݅/~ǗCCCCStxrbnRrz4-4m=+V|`($d2? {>;IӸ܏ 5(XVn7.F0ntN<JU(x< 膧abo3c5^oU@yPGhnيPr,ltŅ~ \.cJmv ۶B!/PmrIL 7C_#|@k0DP[۳jl|l$d0)NI&n7M^o'QlcY&|\6KT2' wb6ajj)%-$cO@[{sq,/'*Ri^cltxxؽ{7mdph4a:;; Ctvm5B$iZx<@j~l4J65Wqz{{c}n$VV0 #G؈mی`zzzڱm]][mr6ald O7:=\uΫJ*_ʧԪ4h$m۔jRTL Oξ\.+Е>}YXŢ|N\{5Ar:@bzs};0}PsK{)+WYU0ԋ x8?҄^knvT恔_JyNJRޕUk`CJ"+; TIIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cloud.pause.med.png0000600000175000017500000000365412167200764023406 0ustar lucaslucasPNG  IHDR0$E tEXtSoftwareAdobe ImageReadyqe<NIDATxX}Pu3D"&@؝: 3KSE;ʀMK,S2Scڙ0\wG ={hc8۳}~'w$UI,W&gV90rS7M]S_YڜqcTĤoc;;Zr"$۸w=+DNH$+ c&hjGNa3S/>ߙ )fۋS(5뻡EYGPB>Ƚ:mz6k&>ܼؔT;0zYS|i={r}}s*& B :{ gfxx^0nuu(گB TLMf H>>@ġVy;F]SRSWJ$8?pWѬ\:܂Ņ-MK55E/3>4~"+ۯx#A]CC&#M)OiΟ;iw'4gNǗnb6vն;  ca~Ngg?J *c\\t}6w+C ̕]dEGGEMҸ=؊НX,T[ݟA$vΖi"$$RDMFYXŌ?r"'ǏKaT4ʣPi2 5@3..`e-V5!XF‚vٹ۟g$nܠcFAD.GV&Zwfvuth< 0߯llB fF4uM=v9Jn(_W&ho"l+pmJ})h]>׻̙?آ(:Y^8-D"Ho@  57 .:dHLPhUjUYJYHRˊ`W]DxN˘ᙘ<Jrc:!--o'Qݡ^6NʁM -ᕠUA6 q z[:^2t!x;8^OgdN^)4 %j>Ϫխ4m3LXيw}?Yͨ/bƪjrExRI|?ʸfIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.crossed.xxl.png0000600000175000017500000000615512167200764023740 0ustar lucaslucasPNG  IHDRP#bKGD pHYs  tIME +"j IDATh[lgvp.DRHr ѤYmb9]x7yYl(עN-}07bZ$i4{זMȖ%ZE(^ېCSQBZ=53?gH ^c9:Y~qh6HCQ *p84ު05ueCk,ɑ۷G} ]YX eSx ofxrN{t+i80 Ӂa8p9UgvG?XG(E|.G>~; 컟>r4s ӊGXY^f5^ icN52WR(B (6mP8ӻN}DzqpIa7J£O<;4|0CUgj-T>8?|;7kXM ǡh]86djD}%y^G׭mA'N{_/<;(H܊(rYѮ-?ٽEjtU!k1?I[q>@(NbC }(r;Բ+]Xo>=b2IRAre*5=\ჯUwuշ)yT,7lou ˒HKR[;g֛e p?~?Fy\.G.tX^b0tN{[I]Q <;{@1L3V e8i \/JgxB.E\Z[juczuKGUSrY|>/p>D,si+ à ɐ $1?0zFBE*%4K)_I.ZecR*VV,ew+U4 W"<ԦhLo.vL3>[ =+fBZ@0 B˕3:ueMج$Q%*f>'?;|_?悉gwEY/[3tPM'ə3w_iҘx/7͹v^15KXU綷9D}]w8͒d#^ffv6~=`r1B$^I5v/+|k tGo[L>ZGvds#32KY|fUST]W OsjeHt%S`%aFPfTbzYb+\#G06ۃ?}ٹ_RR1(ķH^Fnj>H$ΉJV9N (&0,M[}ܟ HyڨGZu$`mj1 = @ }Ӻ'}>3rdZLڧ8lzZWM1U=4Dk2h쭷Tc`WӣMŲ,ѯPlAQT gp򃪹В/PVJy\ [HJNmC}*[7b5)~9ifjl5ꪯui8wJ6Ta&/MZL6( 9?*lYŒB&^TGϱ} bfG4[RhXfaɆS<=",$=I8Ep:]f٫qUK uOZPLs3mK ֞˜/'FREK'W}jy[լU9kfa]\=m>Ϗ0+e*>]zdiVrTheN|-XSub~cst+YoR Z[u*:3m9ف[xb.;.p`DWWBYc) >H4Uw:<6ɑaNW=qq K2#yU^R4Tx݉\yyuMƭRQbai|өq k-#Kq;o]Üswrx _s#iz$R%OÓ2y t7QkdZB*TYRa(%IbxlvYmy[S¨T iuARn|J]+G75D}jd{H?;4F[zGvU>oT*N~ߣW&d=#o&Fy49c6F}9?iP3_{q74}P5'e7ym{b!57+j|v4ԟk%Ȍxj창K[zd*pPjhDt+q4 SwAOtئ g?C# 0UcwVa~¼L^ZjqZ`a?bVw+m!k6Nr$QL+APe[*dZ񞺅`oқ|`dȞ6zOk+\h;I[km_ +MoW䥐(?w9x~^bNI@VC1U }S'1 85= QXRT)Rw˺G3o < ˩'t3ϧ<+K=ݒϝ&+w.jg T_Ӌa8bj% I.T3)fyy+֒b@7dXs?cToPXö\ɉJ[;*Pfɱ"L(_Fox.*^@PՒ;7 Z F}#S9eMcL}\X^s|gsU) Y9p@q?3,(~Ҕh6-ܡ)Нw䦍,B5g4NLϢO\h;Ɂ=52JW/ɉ*'׶M7a_}1Ѯa*2`2Z*=4w R @B ky].7eu{z[όq8C6+ՏNAO#Gq~$I뛽&3;UFÒ;k^PE˫xyS=Ū6ևƒz|tܥ 7E(0*B/K=EnIB9#UVݦ\-Hم垈%!Yi嗭 ;lYrO:WSdP"g|FV,|V.|t)\IU6:'kJ3K@琳QO\>`,#ZkOHQť+**fbtBy­nTtv +}RW;ⵡ-rpjOWWl{hk?$I9ts9+Gvi1Ig }Xe摓]&[;N]jI8~=]z PYr23f(>_5Z&>JCPerT6ߵ [Zb?#\CAA 5ED(BHhp!G ;d{?{_ `͜Ř*._Eov?+N>krPh͎ ٦v/>wDR 2KgiP,Ykde(/7O^>6x_!G}p`ڦK/>HZSLlW՜12:J!nZL ;ŞGgfY^gY9.~u 1ilSuK{yK~|A߄\>q~fd$)qN=̙QC켂[)]XIy㝃̜(JSG߼Z*s*%?/b_Gw|դ[1hg= Ϙ@y>|qO(  2m`Cu]O.zPeH3&pǚ۩#ܚYnf\v\D=n˝RK\8*q1g}_]I ˈQA mJ. e5YӖ +oVÇ 'ze yl{Cz) Mr,xOy̝ă flvxN{-A{uO՝OZ$t |o: kؒܺtWmL>2h^6Gd)\C9zi ZV߬\Ka>BWumYZbn֞̓E^1͡>>#xV-´@bS_k_ǚxTK}wٖ*d=w^[ X TuxM/gJ4&is]^~Ul^]Rl]v]sr̕Jb5>"/MB #IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.router.on.large.png0000600000175000017500000000406312167200764023437 0ustar lucaslucasPNG  IHDRU@obMbKGD pHYs  tIME $IDATh_lG?3w{ىZqmSP$*(jU@F H<(!VjB&U↖XiI/ww;3<] yw?fnO?_:t׆)%RI)R D@}ٿN~X,ruc)$FQRTUUH$p'HxHvR Zk< [XChZ333Zkm+&o޼18555jB*pHrTo4%0q" DUQ)R*VNƠ=Ok^<겾;B?ϟu8u?"W~R:ԇSL}ʙ8 q?R) KBPb1Ƈ5hZ0}螧w<$33ӯrwSG?/}SQ7v_4f8_QQ7>WTEZJ9(S2*U DֆaZ5 h6hi/m*_|ρο#GB}g?<wl/?㮫Y=˃ T+S!!rrAR}~ R.Z5&pн&B<`?1W#l0XXXɹzcM-%l( o!ygpO8{ "DA:X)}0R=t¥n-е`K%a1`@6`=ϣ{^~ a t.wŠ*`=Rן|Kir!Ʈ]`bt3ɺfZd =wµZ4W *< !%^u!T woS=WlZ̽9ܘ* -)1qsv*%Z[zoljϒXз6Rq`m+I,>e "#"ekl[nZw3p._<_w션x387]*BPWUãdndR 1IkGÂRA('lKEOֽ]]#Las(e;ɱqf1m̳;xf!Dbe$ 3tNaJ)KdBd#8;ޗX%Zõ+KNc;?sjt=;v/FiFi7|>\kMj0jFVN{/o8rE}4Wm}@?BALrKh(Yȷ+%~{B>>|E0˼o/J*CkdBs%f3*(ʑ뫥 m}2WS'~ FX8cy}D>."%VW9U$.rkKiDp-]Ζ2;)$@em=/>J#\ tR\yl>=%+L* IC'鐤D„(B( rg0d$]Q7|AA qEԳ#t7"'SkVSNC$ C&T!@ BQBtc@'8TXO5 R(u(Z]ȸZTW9c;Ϻ,xbLvHA?ĢxfFy%d3;@$l Q懏l- _<9y@@d!M?G>؇/ay *3dBLSt`4e$e83f8a$Rĸ .Qf(3L+S749=}§&k ?x+C*,<ƕׄ9B,Yxr"1T:r[e+c4 vo- )`'7<HL͘lJ9i &f_>>=d!xzA7}lp[Y2ᚁOߪ*o:0ƧG"&BgOuaGXe* խxC [7l_W,[H)Zr Sܙ8z ΜP`/偝{XR*pƟZn5D4Q^(jzN`xjVnlQ\AXmۓf|㡸Zd=V!vHsUD0W\IqWi58~H{)VLr~v2 R [; (qܱI2b֐m23:J)rV6 y;/mv3O;st\gՔP@ר+O*oӖaoaoXgA%AetPhwJsJ@]dH,S.ޱ?G+[#Ib CK?cF]O{4 mԕ5ls"/ࡹKن O)L B9ski>sX_}J,..Jw/EfɉmB ogCs0)Kϸ!f&YkT02ɷU}xY*"P'c4b–g VcdF5#J]n>~SA&Zȉc!P4dL*'B!a#d嵫o1(8mVmsyd1 T.q6TQP+):]Src0f΁)Þ$ wȹk'ٺ[!))!^N6XdJ`QxA3yq=1zߖcya\EwO7 _LtMe_ym[:Ak9zLmݰZ{^6s¯W~;BZȘ$ -l:6L]ms;R*gTB@P*0!k^}M}Rw~ Ntz0ܵrCUe}`IvN @ْ$ %jtSƒQ8U{!Y@bn>@&CB Exm{ '+<ߎE^k}1ʲYW?y#}B9S;'@UArFV|"ZTtv$p+^f"t:)S`\yP2nԾȓFiFiF@h NPIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cloud.on.large.png0000600000175000017500000000413012167200764023220 0ustar lucaslucasPNG  IHDR@0K|tEXtSoftwareAdobe ImageReadyqe<IDATxZ{l[?v87N&~$Mct IH4ZHI $Ԗ@HCcZ䟥4d- [ qg v8/7q4~97ۮر~|߹AW_1dtz~c73p9˲~{Y~uuoDjMP,>r2BmOM e5hv={sssyKmɇ{(0JKw`*F7,iHuvV԰ppwZnl%Ζ]};[Zsj ~ίOM-ԑ͛7<>>F'_~/{zbd3C~$r2v4&)7@*[FcLF&ƍ)Kȷ='gSXXHfoz'&`~ӆ@yO[gUՀWh2%za;͔`\Jh5r>DH$r2u8 rkj|܄^oy4Uq5Bx1A4Z/ɎVTn6WTQ@qc j\n+i`}{k# 9,::z O O=φJ%?f#AP2FYDkc ☭ DLAYY<=&%⅖]FI,fg8U7L8YEs+E, !~ fZJNN‘a_Kǒ<Z4 z}p2Zz\ R&}'] 7bEEu p`s3La|)arʜc & BtN>c~ 1, 0]4wpXq$b8$@f$`o"gȂ Nbx^p8vz\,ARD W3ȋW._j|\y kw3\2gf8uo 4>won{`sET*yw5|BR!/ !sG̅& sx3r'gXvS/ M&TRɊtWoXo|0UaP]L1=]]Ξy=W(R[k܀рD)`=uKx ~;:] Ly ~{_\iNLC[FvzMw2+UaA3=^:1SHx@" (uuO$p?wQJ5-#,3A/}Y `W\+kX/Ly=&Oz;B5vr- WjF` fcF9,ȓ"< n=pC ]y`NV1'] PB* _ݻwa5;ȏO5=H$xP6NllS1*#`XR{صgupv* ZE'p=TF6žᾫ-3>ZR\2x~Uԋe- {gw~jX5_P^<_~NCFuԤ'ȉ"g^7D6X'αdz|AR A5rh5 ( /d9zdrtζ:_N*pa if 4 ̖N|bO?rUJS݆R#>2DtonhGaB)ւҚG&y_I̍"'zGJ*ŷ WJ|%v<Ϛ00_J7]ueI&v wREU546/V <ߵ (/`?UZo-ֺ8ARPwm{Zi8@)-xϼ):V:l.G"*7TFt p&"mk?>~p{diCOJQ0ڦ paD"Act:B<>vGHÈ/pt8d .rgdvxZS(Xh; ]X]]lsH)Ej .]Fa`iLz$w1=c3-g,|>)*BjQ\&, 2Lƽr5鿏* ]>n"hK0Md;L- !S\&V!O/SYЊehtsJ6M}TN6nH4!V?<(Zeq~yo#͛k7e{]Len׃dz04'yw9aW |g37[bɮT1R1b|6]%X#{\N8z Z?3zB I:ǝ=PV+C?ޱju_Ks[k(4ᐟDF,E( |''zp|6"gIߝZ鈌*|nɣo;,J-Ba?*?SI^>OR,]1|ATqp<^7UOU=;D$.RfٴԈm ֮Ґ+(2YW"_YE0׼X}\6`aXqk-Q?["ltΞJ\ ~tvna'*,CӼAZ~OePDsVD觳Jd>yD~k AaEg@&%޽X IENDB`marionnet-0.90.6+bzr434.orig/share/images/Artistic0000600000175000017500000001373712167200764020651 0ustar lucaslucas The "Artistic License" Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End marionnet-0.90.6+bzr434.orig/share/images/ico.machine.on.small.png0000600000175000017500000000371012167200764023537 0ustar lucaslucasPNG  IHDR.(*bKGD pHYs  tIME 7UIDATXřMl\W}͌kvIKRЈ "U*J H`ꢰKEaQ5K@TGAK8I7NF3|wX̛޼yc^̽w9{Ν=czimmmN^5WN33{~@5:nS %alK/h:%RG @Dp] (m5't|?ۜRRvl9mmQfgv!1vc{tϿ|ΫR*NO/hHg3Q9;R[|L}S8PT.ŢCRÕuCV,D-捛V"v>;¸ۘQVDu]:ɤNqršTQ.;N ,vvYћ|*f~nU^坑%"2,P*ըSb @ŠH( q`lQ0vF=kNPTkQQ^ v\X&ir0+B՚KDCbYc`p,䌚P">Csӑ@Ɣtj58^:E{ɃHT+e?2NTlm)ӑ`4^5)wrה;!rv3jF:$B8XiJRQ$J5PtZ|;Wp%dSW&dPZ(8ve&_z SC&Nӹq;𣅉h@?cs?jG8P_GH6E+}L|R&67Ķq_VZ:`"lI0_UriezپW퀃Jcڊ|> <hNC+Ϯ]+:2:ˉ*GGOs(ZP\D(΋GԢmn(d6=ZҹN\]/J$M,OU)VUQ,ZP^vq5Ji}3OvELGYxBO1:mTSbue9ۥLŕwTߐUoW~b/w>g<dU.;$sVd [[dV0UI}iqNvm"cL$,s*UpW!;rW>1SOzaQxxN۟ɝ;{f*ַ`{4^߀¡Vxh r|vtji˷g a%.^{k.cF *bM7ngdgs8Ύ M&< #(q0v?=665 :́vL=թgr;]p"5Lӌ,~s7u0 ^;j8.$0$^\Zǵ^_iZfյGf݄%4MtIJ؉%b^25ώvӴ:$z iE[Ҷ[J[`:&SKW|I(YlL 0vE7su"gXۮvӢښsi,i ͍hWR2IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.pause.large.png0000600000175000017500000001343012167200764025261 0ustar lucaslucasPNG  IHDR:L<sRGBbKGD pHYs  tIME n[O=IDATx͛ytՙ]j"jlYF^ q0C0HBNན73$p^B$GHȄ!26 f6%/KlٖdjT՝?zQw[ 9SoU{ܒo?ܦ͵XV!$g;5U{ =GY^S^iXS[װav#.i @UUzϞĉcc4ytwk'j]jG'Mͫw74QUMާep8̱}ؑC?}G?ޓ^OI;v7oуK/_e8PjyUӈ) 9+%7͙zw#Я}%]:w AF2F 4ME`4,wYeK?ܹ @|KW=_]3{6^;1jɧb}Z,*P]7ۼf݆T5KںG_zN;1ɨi˯gy%zVѢ|i%]ҲhyÜ[JܳP}D˜Lu7ȽlHzQBhX6 LM|?4y@P*;x_G<ͯ16:=/*BzƂ8YR⪊@ԯ~FOILB()p1JU_*P}{$P is{5ko3T sW_O¡`|$*F6zz o%>zb a"Xp@U{IUh_ B$"`ߞw]jHcdN_/;~B+hw47}; f6}.$I @$Id;8~-(!3iA"!1i1.N,F?pl`T7^D EO| B IRQUdvG &0 #2s%D1,$r* [h [wyEKIJo; ԀOe$^|Yz,6ZVrWDUb9ARpW$}{{ w t:=cѐ%u>?XjCٓh 3P[ WA& 'es{BE'܌.1dB {|/Qu҆ 7-[eܙNa^RƜ%'CD!JJh``̜TKx("BDfբ -IVKH(J H32ᱽ?xrM56㝍[ݟ/af dJ<ݜc11u+& 2`%IขahBC$CƢiP~v|Ƞv~oD;$^d㋩4g,&hR$ QA#}hCi*Pp|t3iGR΁Fව=y͞qzv5`Uk|nOLneh^/};SQ!1`s1m.Оܘۋ"*sh\\ j ?)Z4-۷]1VqN5G-/mc /|u~>PXUnf"4IhWNy)[_|33y" ߝ%EU-NDa{ߥfPzfiU[\3Nwv(dbtr[oLw֎!{w:0暍<'!uiu7^c{&Հ?2g!+._ʹ.HH> Wy)B$z4@kB07qRBi>HpҺTniqeH.yhAe CW8.'$q]GIq/ap9p8(eb;eWZ.Җ&7G{9udWj{d9pOqDYin[1 BknDkB!@G1EϫCF|1 py El6zzlV+KQm1VN]o\UN:I &o$ЄCVW֘c~Cޏ;ȊPh/{ώ\MԜ[mĊ(ԥS!'$APh3^`*D6ȩbS`nȽV,H]QY4iƑTBMPT#R3R D㛣b9U6c!ش :IE#[uTlUYdfryqRUQQlFQ$1 ! n6S6.QezH!K7Xٌ2v fdPNG&'iеve"r(Xt9LpԈ׋(-3jɌw"i(J Mhy!㒟̮eecY-}[_n݄& 3ʄboY:VX4Cf[UuZȔ9In[ضכѝMީYq4Lgx3i+tu rL/׮z|]:lgϢΌY(Xjb* BӐ$ݴUQtX6 LDALt/Kٴ>_tKAB(ɇ~ =kIukEtp:8o/b,Ves _e:{=4T:H3C_}!PV$Ӣ @|~G~0ӂ&T'C^_|=͂B0PpJ3 7hZRmB0@C^jS`T3 3y>{RTRʜ5::MybrX.vݾ۲(ڭo)4r:kg>n8v5uu4i '*;A]eY޵?gBg{[v}}n#ErFEir='a6w3_P0;w+IbY 7bKa=pVA>jiGژ|k< ܕe.9vscS2]&5&-+}ʿ|シbl#p-К _Dsǜ2kjLU$f ]78ښH6#@ϕzZoL8϶}]IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.info.orig.png0000600000175000017500000001347112167200764022310 0ustar lucaslucasPNG  IHDR@@iqbKGD pHYs  d_tIME  ZIDATx{su޾=o 0 D$!& ͨD+Tޒr\\ZkwTJ湛Tj+[I%mIĎ-Z 5~~Ac!QvNթi4;{﹧ >!Dio8OTaz=!p.k!R*MNt@(JuY(OѤPJ}H)!@TJB))Wr\4ͅU!~2>Ճ? ډ'BB?U,JRqyZjvvv.&Diڛa><8]),>;;;|o(,ǭi:u èT*f0`6\ׅ*1??5p݌10ޡoY?5BO$iJ\}\. /)=z|RJH)aO |[[[X^^~3,,,@1h)?rWHHRWJM?W*rJNC=QBe=/_CCCï }000}AT{sssjYRd2Νۦ !"wP0D~ainv~Tݟ?xX}ueϦc6co<:"#䅇@Bc=O)ɓ'|;8<'΃ ØB 0P *`RTa~_|p>z^^uypZjJORumD!x  o0~p~sss={VdٻHٳK_+w !]B$*$ cBRHHB|Lep1?0=266>wGw6n$((s4J@wS=T# aƫsss6N: w;|رSj/^R$ cŹ@'OR+T5C|Ql{}uEkZP#B18{JѥvІ~RWssso~8~8}B[Jٲm}_G]4O>cu9GMx&)Trӧ?/n+J~(,rKJ"333sɯdzzx)eGӴR;~օ >u}3 T[<zR)p) g ecǏW"_^ZrΥORRJryq5H \+/qy0ƒzߝnf7 ^T]2.9JB _vn8`pt9_;AJ{<hiy饗.]i}ambbM˲UҠ KK sȃgʰ6ne``0 ~ pp\.]ԁG~'v}!D{jjjkvvzJ]k~9RUagL[7 \*UbΝ|1|>s =^Oy޷2̷_xkfftmZ3.\anK7el4q@ hcZ5:2[YZk9J)16{s>'N+^ygtEXWջK.}fӖew2&'A-WӵRP!- :@hBu={V2SjGO7=ܳzr[GWk_ŕw6ԉ*EJKR>WX};|ό'Fc GXJ/{'#GSR<b```~fft%ck'9$l~q8H)q=K͋<??T2[{객M1Ms @@G֧R3ea\c u](ڮVNW D)#Ri"<=vI$u\>3:y2Džci^ 0m4a<511ћ8&'*NMNĪ xkx:맆J/| 0r袊[٭BeP\6s|O`Sr1DJ|X1 C3 ud=oMY%}V^&oɫC=sϝ^LƧ_ktQ y7 #Y, 091 e˲@q:v|z|l7e$c︞Jv?O}И2FizbT^Rj8`e2iq:NVJAK~Ry ;\}VcRqSOWHfs;?z;0ٹc0 BiCO <Pu X0 {O; Jr?/(H NIuܳh"CJ<" " CTGFO>~&{}v5hEC#l0*IhB0DC K@Rs۶a09G,ˊ1](y*pHR F&=O)a7ۘC@؀aPJR-w),Y %JDQJIz1yvAVCZEr!L~ Jr|-vJC Q$OmJ)ll[YP)8'-PB =C@c }AR(=_QJ^[k/[*s)8<ܮ*'EyQ:!R1y, +]׃J).oT!UrDn~DGDʇWBu]WTPpsJotvU*U8|-SU%]PPBM2M1!Dh" c`zO=TOk@8?J)Հh>nY/ao\RjFqϔ28) %=OF`~a2z} v6rXoLj"v\.g+7i0ez3>BԢJp'sǦ<>60RoRq31)ҵu)%ܤ?Zf|G}qݻ>xB#{c{hn`dL3L()MC#D#R [?>n^6(ױ ιu[Jm;:H<|X( NH)Cm~4Md$^7`)[Dcc.ܾe_]_[=&߿fW[;Ju[a䤔ϤGpvnu.Ǝ" #qGFw3}<ɡRQ)ĿƘw6JӴ.\'O2"C @ktMӴ,syKw+KKMrP`UzI ބB^/}KokxGo wm>jn9Wn !PJĠ7YD@\S)X 7^ n΋ܠF0F5(c"a7ܛݘ75` ?#|;[?aǯu 8޽Z۶!PnJ)PJ-c77~:k%19:2!(cJoq2&S嗾yKeiZ3Wcv&_hRJ;# bRBraJQJUO@yIb j7I(Ro83C|AJV4SJmQJwcW\]Rvcp+"O4&!IV"ici^{r !R(_E)匱v\t-&L3.lZ(Dk'q+ys뤛X0"`e:~?꟪=Rc<9N<$}i,EnIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.machine.off.xxl.png0000600000175000017500000001035312167200764023401 0ustar lucaslucasPNG  IHDRj\ 'bKGD pHYs  tIME 6txIDATx][lyΙ!wW%E\2jK,SvN,ї&vp2$@am!Ar - mc-ĵ"qlKQcˊRbKmR%iqP;s9s۝%wi`Ar83wᅵ3T*'H`M9x3 ?` |#  J҇8:dښ$M\X@*j1,B,ǿ2.zh.cAf 1M+fQ Lm5Vh&el$d0 YKeĕ> U\Az~wPΈ9*e.d=-z\')O`smhh 2 TV1Au FNMrr!x2@Ȍ],tLv".҆' 0amX Nx R>m÷`0_(JSI @fE;A}<ɹ 4&''-5H'ynfvA1g?c+t5m]ִuX,Q/GF,٨YSi\[=ߴ@"ҌD&n?3*54y,\ ;yL'9>8!5(}ៜ٫#lDc޻;' -Y34H E}??"klNG "qv%(Hh3XlOkKxK P>x ; ['X6B+0W#F2sca|RW/ܤ'3d#OZ_n|7iq1Hcƍ29q<{r'(nr)?aJOZN3۪/44x<>dQӦ824*,a i"zk!/'(R7ei,ىdg#K\g1D/A^@y1h0`gF6̀:p})$q}c`ҁ q1[[iX3|0.Vret{˶mܰF7D"ߘ'r&sj7,*V 4sGU4+"%V YcS}A ;Xv J/PKn^/ 1_@2X|L's;Zl|:''GEMQ`;y rP@PZ;!B<_x6<5H(7o7Gb:q_uFlyнjuxn|ocqf"Gw=//`ꎼꮳ}y+QW{N\e%I$I~O"~ҫ=wB( nb @! B $ƳπzP11_$IxyL5~,vܪ!%|z7?'C!ƑW^w^s (T>q:~u?gi0nh-" UƔwshee?Y $.gq!{-(e}"k@[3}_ IظywjHzc U pjv|2, wO*ŤQ)HmZ,1y]/9n#mnf`0( +:Qƻ?~⛁$) zb%g]xiL]bJ8s[vYcA3cunQi De [nFE@W* (AW)?{3Y٥%>3CK(QEdv2g P@-!q :gDXmЂKǂV&$/&F Ky+"]C2ZDj &dQcdB3HR161E$g-?Q_B,f&/(S׭ʼnKA-'yŊ,/aAd^  n;j0J@?lGK^FbmUT+ 0%mX$ܱ(k;F;vYinHXfr9J)EV ,(B6$T* TfhTCܲu2١1v~g׬徱,]VoX( DD"P|YeUEfT &LL TTCQxn9ԩ B4T*U` jS*PS9/ 2B* (1`BK}{G`a[[4ɕ|w5 W`pͲtn}"{nAE%'i -dtJ nPJejQx_ztgOufj2 -˗տx1S.֫ؿoﱃsV6sJ`tX+dM]Og}Ԝ=&جuZg;Y;M÷a?Ё:r~%|\Nw:4 '-@/~,mƵ,^wu#R +ulw׉_躡m(L_B^{AaJҧ' v :rc,ǟxR*˘${k?lSfXvgfcX3XӶ M$H$BrD7۫@Kw߻؇B\w#5ʛ$6bx=IU !Rݿq:2#hIƘK&Fq_k4m[j2WmQH^ aTH}40M})Xu0=զU˽*Q_ 9}j.Q 0Q\oFuB;!cC6/htֳ>*Q5MxkQQ;%1nR*,ɀda,dN0#K54K_CkK_ :PXr/˖G 5\qǪ˖?!dxQ͖,50p0uQ8U ˑw6׊$Ku/b5E[Y)\D4%f `DIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.on.med.png0000600000175000017500000000604412167200764024236 0ustar lucaslucasPNG  IHDR**[sRGBbKGD2 pHYs  tIME  >C IDATXõkl[}!R"QVNqj9nc0 A[mÀ ha{aw ò [Nj94mթe˴%YӖD%#\oI#ֳ(mToq+X:=OLD_8mt4Up؊o"o KʴTQׄFɃ z}2^zNt JG۷_NM/>B,z?#xK%@A4! /r7n HܼJҔD2H*`_=cY|c/\zRWMRRM1-׀8 ?>ShN|R۾Wac{;@hO>j!58"qHsK;ZVB@S87]JPӵon4n e\$&%m߼l8w",HPuj8%ˏ7Q-u%8730ϳ .^TRkcAqsli7u>RoUAS `HhxҐ&N^W?mRdeGi#4 Mh1R) gn _ d L/D6dz?3/Pdؽe OARzu+!PJBVN~?R'e DcTJlX@ˁ<18Kg(j<16Ɍ !4-n }Jbn;45288R"WGu[NX![|gڽcJI.}|+ $i{_MK^n<5n9Jy8QhDe~R@﹝6vz+=fNsK-ZkT&3PyWPRwm|{ƴ?ბM,KN( #mH$ %0sa6*P ر8?#n?|"LHc~+Ȅ[G?Ɵ)--Z;̪e *te`L\Sd2ထHEnAB%"2X\`%|"@ɕXD62W#ir-`t.ʥdQjϙ8l,t 4/ܝL?bMF^\ah"uI>3R -%&;^K;kAA4KJԢiv I$d3,djL %M@gK,_8ʟnE$ !Jm@^RPbьDenI(8,.,P.j5~) T㢹|TL)2J) Hj5z`RӾ5 /K>9e t$)-E%GR&xy+PJRQYfltm.@4**LHL4:*W~W9{ E$HJ<^_K̮$ PDQ^/^ё. Myygrjc Dvj)Eɫyr/ EEN);"StWYE?d^ P9DBYA8mk-see X- 65dqBg}8w潼X&HrEu'u!@&tN,FB[U cwOWg(뙝TMaw^vڲH&<}Z$7d*n 6Cs4ū@9#Y-=~ݔ./xe`Mkf\N'js HwpWLp_LVA ' ײӑMu_4[2f4,|VVXNFVO2j3nPvӬwUh[/f`(jHxRVJ+'U* Jy_†Ң΃U'$2|_JzhƔg7FIYo^4A,B)y,ḓb7 iaiy&ZTۉEXk+9$V\@\Uomdž2uE`5*J= ߍrNBUL~"%aOOvvGj1j-xZjD'QKBŅBDr/Լs-#|5JsWlgPf{TI*I%IĒgdff6#2rCT92#{{bB.cAE Q Bl3,Ky{,r~ +H>{u@E! |NJ' +0 ,ƨs7F9r+ů}uC2G^Ў]9}kG>@X &?Íd?, 6ҘuBX#749tמZdQHm1#=:ǯn+hG| nŹgbiaX(M@O icT-/3q^מ:!=S&ylGA;ovk$Fy'+cwF.E3kmIbHVр3B iO]=v.VF~^#2GE{2<ǸF%68K7#[29}" cOkhZ">`8nOOrb_ɷ1ё7}~# w|9/Q> F"H|uÿ툋9w#q0X Bȉo={:*XWB`cGIpn^NHoΆ°rBDHa( >@$lp>Q`1BbD$ޓxQr7/f0m"Asa @};i 8?Ȧ*")۔\a}יgc mED&Nyq┹[0rX!AĀ=O$Ltʹ A-Voh MsFoOx@`RkMb7I8m_#]7P ͎6(V WKӞMfylkH6M3#4tor$8 y B% i8 A"qz5S'= 4u^ؠQ?@ZI(@Gk *3.R\@ur24RJt_s9OrzXHzL ):oIt6dҸ,ߢkFdBpBIly9ce %ml?u6Qhu+SW`p@La_D'7dΏ@BfɞKʼnUn'SGӎ`r~ aB%BcG tb0ըשnjXK,.-[lO+M@d4r)Q$螞D?mryTa hMY#VG9"2YQL{'x.uަVJ0|GO@A5k\* +V!t8#(r>:*[|~9xc,ss t&:~t{4 ܿ&Ϸy9ov"NJl!B?J!&VJDB HKD(Ha.MHE|* ' AiQ1;0E¬ vO׮H!&& X٩IQ Y=ڄ֕"\TNSkk'spgȳשeI3}ŎPI @Y0W=ϟ,,)0ڠ=t&rI"dzzHs~K^} Z9'Fy{{alm!t{alj/E[/m5N( b,( B2.BJ<堄$e=x?d.VxiY:RCZA𛇠$)Wt}Tdjn)ſIK7IRDb\8Zѿt8Lr0G^zX FX @1()1:B*76[MQ4JDtͧkzOeVѮӨ9ةhuwFqF(<%) TUr2-+1^Rov˝7$[Q?ō++u ^m,)#WȓJSɲ (>sKKB\5NyG9(/vX{N!|ISp$va lK׮afNu}׿-^oŕ˄QRz'~'}Jy&SJSI[&yϩE!1/IZkhCzjAI 9;G:"%*q?Fɏ:9HD84-~odSY¨cxB;&(LL _T{BZWdr$ nHhlomj-Z}3,~Q%txRN<PB"hGZᔍ#KDnYkVR.QT  ww4TcDڿx5(!gDF3??QЧ{@ݦծ>B[Ҟ$nw[<>ӟo>!_|tZCheS4?*w߼raD0d. OFiۇu OQaIjGU#w݂M*CzQq hq*Ji d?.ntqF9ZVUk#El4tVVA`_%O-e`LSV 2DA(RVQʲ)lg5>!k<-YYY`yy! Ieq~^]d&vvdyrR l=1A0Ò*Om4JJf痩TަPfaP1K5W"+^Xay1?dDsyce&X(A.-s-R=ߧm+;_?b|r~a|6$ -E0zT؂bDT{Z2 0[~ *!N' OP*"9Q{NAP~ƌPhOE $QkS^HB4tww9l6)MN@> r"Tlo٧159B9w|\o#)v!,ǂs4MvDN8h+zMƪau!Ie_0I!a9<։yR=G(~@Ny$N7&ЖGOXKsM/0B\qFFH`,]WCېKWz_D}ڇ <,/qc7:xeO 2OV1B(> h;̯,s0-I24>P#špF83$€ZR(9iRt z0 wGzdczA@sbk^Jƅ6Q->Fkn037MqTt~i%]#I%P%%2 1`D(>ˋ,,nh~?gdrbqZ#G'V0>Y%^}ЄPi?b&Bc7#I| R[>F|]P66t ~xJɦq2Y\ϣj% .R-U{v[8*E^-$#2NQP0^ʭ\}52Q`+?}9LF>?,$>H$nnߧR DJ#KXsqʮvY82?#'J|xzj( PNMܔ;?>A@R*QĚ6dlW#$',,cA?8Ju4̷!52',(Ɯ xy}ܾԌ(3X5j qDb6/a/JN[QYerf|D: :֚x>oʕE߹.$Fhm=rpDN1Tt/3m6Ct hebK~tCǟ?kOO=vIrJ.C4xl\!U3S I0S(x ۛ[lno,\N2F)NM&f||KKxv:?_"9J1c` &f(W$yݝ!-uc(I1G | ZG}0]GGv@[U.6X,8.)K$I.QBy=$夙[Q!rxp>~Dij B;H))dhiP$X=\%#)A ɭ;pO=n{)TJh4Fݝ]gXY?EsЈ0+qL`9PCoPqEh׽Fռ'-h_Σ_C\GRH*C;O&[䵷/f>٬#c퐶0 b9A$Ad)&*%`MHd,y.CXJzawW1#GV[zJBh(}AH*G'XTLHu͊ń}~c|5\".1>=E?c )Ӹ Q'KaX}j=B!먄D8"J_^opyiտj{SHa"'ГwqqKdi FC.zTMy;60#EeJ(i [[nulEຊHDê׶_a1 S&ɒv]?[co{)lՐt>;DakhiSBb 8֡&*DdĹGDC1TtKաI/^pPo21=R(TC)nɃ?}4suT8A>Gݡ-\DX )E&3DiAӿP)ll? /ַY__wi47;=,^-2 NVD ĥ8\Jcq$='ɞ>,a&j\ebj't+7Z^F =:k7G1tLjڄ:qpOg|GsU}DxKLͣ@:I DfQ|H\iaKM2bF(8١+|٧|WI,z64j4?}-,WoݤR.x.Q"Ig3I=K52_B%)bfmbj456S(WYUJ3f(J&E&HQggsk!S,]4V! ǒ#dύ>DR ШP"0p7grHΧ|.qjp"0Ę>}zq\*#KmgnX"8렱t[ Z:T)A^M`^0 3t~G eTD\:='}H n?Z-n}46BE!QcCQVyr>[8 /w: ,:^A=~|['h"a*g4H+!K5X0lP'B(m\i0ɗ+c!(GaAs*Bh8S*WT>N8?W {Jm{ױx*)5LɅEU0"Ssu{ 6pHh5;+W0;?Oe~q56w%{{>B88A*@8 V kHJC&xKBO>grrytdp1=Qۡ\32a/TQ,V+-Gk ':Nڐմ=Q N$^1LI"O|TO`l=ҕ+8i%tda:Nu:\'lnА/!2\#z}kl~ʕ\{rB΍k47! ρLX"i"ʐ1011A2cJcܼuOh"C1Cn} aJyt6 ]-VWxi>S=|L>ჿ*kϼ2`dLLAk-!2bJ-A7J`h2qF-a㉌iٹ)J,?HdsyY V ^O@ZC R* L2=?_o˓PRrkhiTcq]567)-NY{6R64-e*^0@ o~۴N& TlSdܢ215Vj6ȕQI,N0H~#*~\6fkm\ĔVm Pp$`Z6_xuK+r}v4c`rF{sx*`^I-8w*7yim`eyϿ|BmE2fQv6z!NNߢ˓db P.q:>D+Wt2W^EXQV{67yQ*VcckE22~}0" "C*~Xgzv~W\|ڵkӧ&|&=Qx~㇌/Xq$Kۢyx@c c!gUR&H&K6aKq\z- KP4Q?PY(g)Oi [6u;(v+69ղ2u|.V+9WC ,\^kk,"IZT|K/lÃC.,-Ģ8 J)T.^cyy dYHX )Pnv;ܹsׯ`>ˆS,it~GQoj/<0'xR\6w|77)crKWiNBB֢ESC</TfYt)T<Wx[b(F'JMcҢMD&NCv}v6kysˋLV<LN)G8i_ SryJtrI H}yjlrtRQ`Y_&/7ytBeՉIEo$Ә Eۣ q`G)T>wYӞ `goՇ_Q̥C)WF5ql<".i/K:^||VMٌ5V:nr{nm0aJtY]}R0`e&g2;ku8]'tY@qHzߧR)kYtanM6%S" ft=0#RCLG>w^K|~|^c 1FX(R.0&XONtd da60%}~R]'ΠAXK˽{P9:&q޻t~Z6y=|.,\]R9.ݸ"WiZu'wרsۯ;b%[̰8?5k7R?ku+8S,Y{K|Q}O O9 Ҟ( M2v!gq( +!^y2) G&Q\HʱbͥX^DmF!ACzJMwx,sK!CR`qe s ̬, "|TN~BOLNE!emԙ$JTBSѩ 5J^D9lb]1q&ʂCm2a.9Y;CIUr*ȤH nfFER&nɕrg?EZڤp7Yq]L+I2QVP,djC,7!C'OH:/QZ)}'[vcu<^x嫄'ږ|AKvEb$~ر(³u^\6" EIR2Uַr]V.-hK&yDtXhR( *c(GE!{5TڣP.!Ѥz5: z.RsU*)c]cPu3Ib,DSJP۫mֻb/x1ﳱɥ˗A:ڠ{{j7,\aA{c%vffg DGZ4,2zߧnc2??G< U1ָ (OzvkH Bl.NKg  Y=F"5oܦisptN&&q9&/ews !%Չ*S>z]f БHW7=+r9T7_cw}1! BTbH}w2Yʅf8\| ͰJ}BJKgMp ˗.g?%JQz(/6nEYPAnoM(KL/Ǜj4Gv(.{>|D^6v)|2s2n !„qbg-;5m.--SjM,@bڈ5'_(R(ё&,-..UN [$w1Qtly6kT &㸞~m] ,M|@G8o|my^<{?}E)gzjfKTDR:DiPڐM(ư寨X* АGwE‰[v}Snj( 4'y k8Ctw:3z1T+ BXj4;hm\E d\ȔJXJr666Bx2K6Q!S'/)' Jf_^TЏd~U< p]: MOs뭷O;]~C$:[q( `oý}f'Lhharv)V BO9x{SRɩ &] "6)&l̜_#S)'hI*DZ8L]•k +Q)$p =Imo?~1oJȗ}3x Hr#8 𑞣cPS}$v}W cI5 Guą>x),A[ANi|"$8\6&vM"WI&Gֲ_GÆ [cD#Cƌs9ҹxzA% B?zLufĸbh!糵A5$S)#$r,LLGjX-1z(ca~~Z{m7URH~mOtG@dB*AD im2GY%(p\y~|2cUvwwqnlt" '}p]Md`Y+ (}n=?e$#8){du|ϬHs,Ž d2BIK%jt]Rt2ȝVM&}6'T'')T* 9fgAj۩QڭGk K$^>#,,)* {/(X-ApPgX J115I:!/P&W,& h)G! 斖_?@)NB"xR} z~E[/]^f AkQ\s T;", ~?`~y7_C@G\r:>-jW{WT2414l+6*aSn|tE϶y|HZJ_z$\yPΥ7]\Bkܼ@Wn41T,2:5Iy3~ (ϤnܤqPc:E!]flld hG-tG& BҠ1[E)BNCաT#hQNncg$)1F",f͓qrzB4zt.`aumZH4#@ȋ;T$39znNC13(|2.'XZZÏl R0 RhFcC±T* ۖ3I\۲H21M|GIHqrxLXd{d BlA \\DٱAJ͎[ah c_g|H2*u4`ic͍<ďf_Qr~vGة$ZX3SOq(KD@ |W@Qeh+h*hBhZt[.%%u(H9Y%R t=f }hnHg'4BBeaOCome]d*@X%$X6GV7q$Zs>~C6W7Ө7M(! eݤZm5E(K KG.8앂V2cjD;ZFQB; ҹOZH¬]XM"!a_ksKlk;6<~rޢjL&[\QL:Roӯ y-B#xA벰@J7ᢔ& BCphX:2plOjL+&><8 nM6>ҵI&S_+&$h}/~/Qը.cIɫWd >}CyGʑXZ lVGl{ob{qT:H%pv& ҚƼ&5ed?yQ +b?}j~[ؖMu~~lF~6!Zl@MRa@6ֽ,Ѩ7z{u/UJhm`fF\]bK7{VK>k: '9nx2;)bȊL"3% v"I0i[3yַ6{=oomhMPf2?N`NF ]b),ڭA'sVH9;$k,C^Otˇm6Dkv7Ҫ?={7Fiթ8_fÙRHW{ֱ󡺱5lSSn: ﴴL!bP E#dtPE.$荍 5LJ= &goBy-8O 0չy2,NeqL:tO9~T>Ђj4VJl3DA{ryJᦒ=غ{ЖfZ9_[ös 2 IDAT52$i4jMdyWV{gYuDZQBh3ZOEIA"ҧ?dHl y D:9ޤ Y&,Ne llienL i%_y{|m KZq٬yB)>ڲwm n@i֣`bgyWLԘ4BOtLzPmoD>461fJpk]= *8L)L Nà UH#ϣ-ȗ//y.NgdE$S,Pi=$RT.CBut 12nOF;Fyv2 7Fr\q\~MQTx^ߣT/e2he=st;ZL\.H!h/w)xA8EI=z>Dz-B/M,c;(d(i#4?g]aWw\7v[C؄|EQDeaA}X*XUP3t*[Lנ1|3;YL,#vS8$?9f?a y}mT#BMuz8)nfb0(|i} LFB)"R%CI%ˑ*_]@M#Wbc) ҩ4zzE&= C5 V:@17?"Fw45q4У? B`}!`c'g2_X1n6:[ 50 Phj+*肋srtDR%v ]h64/K|?'?@aϤnoqK|ST>t./_ l w]ewzM+DljF3i3)p"BGC:E4up}.oPoY. ^C뀓#w;[0$P_)j&Z+" |!vm^_|p@.L\޻JM6Z+$SIY!lB\(8 }L/MȦ$,ۡlz*mD JeCi}-&m!i*Aֱ"k*YoV6ZwEԘ$OWHDnkNo}MdCNI~n$g' ZŨF+K<W* denix`Y6/vGQYH&q%^-KZO3æ=b*Kb<~D"A*n0 : RfrvCvr9?~Y'5ͽR;Gm<{oR78:9f}ejFI Ig`@a! KL&CE ;a!YVA%"4֢'xbͷy_J$sel\5g'Lc4W)*([^+0_DC$&-j,1Ydkf&Z)de3etb7#֛|m6=_."ɈB{>{|/E>VaVNu=usW)xDjZ`҂uH*B˳KkE6W -0]^}WX_% }{Yv\O?GԎ8ٺ$L҆ֈM(\"acKi) g8$J~ s ^ (TZkSa> MX$qtpWGESHՏ&D4a(lwiR R򝍁1BM.vp Ja'4lEL ^DD"׼>g_opl,k T![o aSph?ܜW*EZJaդ)L駔"_,Zǧ* ,x}^=2賹@6fu}9vw^mCokodP;="Zz Ydocs#@ا~Q#U(#.f2b t`JHl5t?4Izw~ǽo."wZ6 b:B1LB\!W.SouxU-ENS&ױ¦wZh,c롥 ,7nw#Wm@|1KNF&n3q&3\m|2<O'|7|9?:bs{[rP#%z>[ T,}+IEd'{dl00Ύ`ci]f&$RؑHcNE}9Uf.)7̱ʥL 6m/I&SBOgM.m8?BoOے"i3P6-Z-h5;tMxt{2B $,DH5tz?jH0HDK$zݎ $Cgw?ťeڍ&vT6ƭۈ(JIvdbeHC,tgOH9,qM\+ČpzoqQ8I*8aj" %XZ%\\Р-sb=Àd9 :L8uCDFNݏ>bmK^>}NX"[*s~qΫj6{: "ΩuFPu89>MS kJ\6]J]+nacgcyj byek*e;A6IICA8*QGJ Bˎ&uZR 4F |SnZ2 兜G< w۟~HMqvxDUgm{t2C+qY5;:?ϣ/>WSdVq5Y*%?i$y#wwMFXÃ#~x plR1C6M$%LV@;J GiWSNcDd#Oklȇ%wpS.[NO?P'HKJ0 :@!HXdIX˝r]}Z㸔 Erٴa c`9. A+lƶ~! K A\)sqHXP>HR^,Ў$ }^>{;U|Ϟ>l)O>㩀%KN*=l͓/<>ReJ9C($vՅ>v,B~,HLr:&=T0^KP2DZy5~48҄tRn2P1q6oo;8as)c2 }F+7!cvǏsvp@``ҔI󸎋%AveG aA2@h؎K& 77(rdYFD5$I|-xs@F0 S0i4/wO[37V89:hqrrR2\f ::?Nűmc)4jH%r>fp/Vp,EPB!xܺ}w.n6Cv&wIXG̮[=m:3?i|)TnϋЩfFFDTsԈ%箌%ϟ=R(vz4z>vŢ\-q45j VuQJ6FFܧu:ҋ#\ϫg/¡o"ǃh4E 9iEieY<~љ5f t~@ei )L԰j|$st:v>CJB*UA !^:Is,..PS.WXq](!AbBʧX`qm+A C1B}Vzr~NNo)I$,p~iBVz0^?Rm'Nm!Q"6 e48J~s. ;.&%8Qxv>iymi998`usW)䧎)z*"b4ýXX> vnto #B 2aO܅fN؎&  /KĤr_[{{ 9kق-G9hz± {5\;VtZ^7m}`[ o3zM G*)/,)99=^di7ٍ[wx< \ ]XHh]с"_tĶzNmA.J#v^O~h @:Bگ܊^^Ԛ`C22lQh@[!t4 RpqYln-+pCuf'y.,f! nlD$DZe#3<:]_SA+TzHkb*hчkS KeH% Vl6MBZÅb'_5w}d#)c/ Mqdfb 7UtEeJD]E^n_?8`_9c:B*>=4pDz(V` ~ټ z4 '/*2?O"WPYZ:_E(V"Hg! #1&sHRD08DMLZR?026r4a@Nu 0CBE.֨~O:#Hz!Cg8g!g,,L#1G0  ;]R4X(6V~0KaJQ,kj~zPIeQJR) / !Lp%gxIK|yk `usr%:n) -$}^KW #e,"_*'JƛBhP%@Z(6Sjlmw ?Lf( -C"~Y^#؄p0 P!8?;Ջg/ΣTp=4|Xxrb،=n"ʊU"u䈺c#JR1Qc<hh.%nxf"6OU-XZ]X)J! a`FWp*}m6 U&_B]@/Pv!7LRF'TƲR>/8>Z~|1v\U !*r^ A2.}gs^}wn&? 8NCnB:6Z& c!*k89G)Ah/t%\Ǧ^IJ>'2q_udִLHhKu$͓s13[^ӭc&(B4Q”t74-EdZ&2:1l7M$m4Hצi#|P~ 4>"sM/Tȃ뭀B+ء)biEo0d$Yƶ%*F98bc{ _?yd4a U>)M&SRHGjTS.>dcs{wghq@ 5=GeQ1Lj飛C1J~У4N_yHS{0r3$T,n˸XZKc3vy4WR IDAT,*ᄜHJU JS][wn1"(JG옼F[PѪ7Aʊ1gJX;`6 Q.Q̕*bRI+=c3.fe4 CՍJ1I*Y4t-&NvDFbdh_\j\ĢXBPd>#M(C I $ qiERQ|}f&Q"˞X(+®E8Ma̗ BE$ w*Ɏ0a7/ 旗df4/hl !$O{H!G`mwHgbQ}0Kf8.taAt+,WEmThO~MPbq}e*ewd uʭm>oy<G_:"^D+@Qcn,RjE*5dmJQj26*&epx/<=wX}e_eh/@=zQCfSH$R:xx{&eBlI4B6W`Yh]ش{=<ɗ ):1M/L4IR(}:6Jy -n^i?Xs7?xאj0'`(M&vy9Kk%1/:a%ﲿOt-eLxPi}pi6l1p` ㊖Lq'vhB`[`on4xˠik "XnHHFEsސ |{.Mֶ<}w|7P,FrRHL!O2ժS]LnU2yAM22r;oX"zFB=;6/uH%FKHev:=6/?larV's$,e 381Ĉk4+m'T*mld7 R(cswi.BXXAi5)G1WFTHv]PaMnËrr+R,pZI"dqit>KJ[*e΀g/yk5qsy>z6fK.oRQ-wwd$iڍ’0@uE_{ș7Q=5 p"ˋ=7K5H"LŮ-~/h$MIS2MPu,j'&ni|M F /{'(/p~r(TeTO?; 1fA*c*J0RG:=1 ZdmQf^L=SugW5s=2dDz.WlS?; `ܑς^1JGYEf q~O2ei}m%dlHx,j5i66"B ^#bjpMxF,RЫ!{\S;?jaII1gccu%B~6o @,RIۛ4Ǘ+w?+t5. ىs+kl?x>yq Z LxWm9#e_z-FNwcؕ{XJBH24RD^ B\uطКS5ƍur^XJ$pb Em!ԡx>:l駌^TL>B|'b*^ ͠K%_7eu\4z4sT=䪄@JIx.fW\RdKE6eymBd;n}:n2muMTs ԕjĚMRD-B7 GK+Rwy򔋳S\쌕EB<ecޠbdyD/I$]֞YB*<l!ꋋF)1qSWgC#qE2R(bB< 7]Fjv3Ԇk6jQ, >cK #h|WmoqwQAh|cv۱|M١P34=?F:f6cDJ위vrqxdjT;ob  Ȍ^,a~}>{=Cud04Lݨ1J&qܩyHl~6&Ggܹkn?[ BñHIhtbq "gKBLcOO_ď9,wND-Į @kJ lR81k:&Ym#IgS-r|lV'+3hwmvvPB[6a0o0 Eb\)zDGte^*pf0TؖPѣDZ&(qj,o!meD1W"O_?0W,q.bB \(mekKo<%x2_wȇ->W-WȳJ&Wopz|Dw0 %Gq'B꼊-eeYt܃1+A޴@>l?)J7jꭹBF1AH*L۶ }l6$0gȌ&g2tLp:_M?]>',a"?[L8?=V [(D3Q)(fզ<5zb^>U1h%tt-ZNŌ%MґAƕWLXd*׳KjT3#Nn>@@Ī *s ,llwO0v;ȅ*qCTm'r61Z%ZtJ(4Jwl1H4hV¤'I(XѩSά DDhnaa[5Ėal lIlNΰrn~l5y9d296k^y -s݊h+xI2Cj:AaLJoMR˯ͭ-޼u3:9Q&J2H!ΐJ$-Rh6j =lN'h[Ui|Ncb.ZՋW&].~{ mL0NC.Ƕ]ب@eMд/nM\01 AVl6Gq,G''no8BQàbOhGщǃqm"BZa&"Bm[8* -knoxf_?iÁGAIA6q (AN E%]BT*~˗Jy1R(p]t7; |t5?gh0 ѷt;m~ou9:9k,)9;)Gզ}vI^cj:$^m se+8#.GǠp#9ۦlҺdm{mS2NpJئD\^h4<:+"dv'jϱSd'E&XImBw^ ^?F "!zF5ʳIua@"mjPȘ2e`0vm+PrL'ڧ!9FRD|oE ?ML7DzHfSI,z|F#< K( YG\!4MR4T}^i].* I/T8zuċ/H&ܿIA"-9;oג^)^_pIum|LZaayŹ*nSZ5Z6)mD[iPiZxM 9Д$Ͼѷ4 a\wx}m̗u`6RvnH&TBX^> e2 Bӧ/89??_OI3>|H}۸ɤlЫI9y˝RJCGJ,Ni=oQ(FI%"*af꾹'#D2'z݁uޠC!$^=B\)Ouy^KrB)n*QԐ\&`蓴mLt.K\-e(k$,nl)}w# x/C>xr[,FѤjR)yy|BWwacs9Ͱu6rbJu(R4lrADh>"U+[~ ^ԐgʤHrfOr],枵/(dٜޤHcif;a0rL~#vLǒ--MGk%խflhb_  U=fV5DPy-˵I.sxI KwR03; )$mz;;ԛuIe [[8뉢 j4@Y#3K7#czm}9v;wkqNAae ,&M?D1s&f9ĩ@rkM=uߋˮ!BPp~h>T҈J S@?aq= C"x'\;|L TDa<baq/D<,]"t8O)J8^;mʵ2JzA^evn5+96OyT q% %_tx 67%9̥KH-j[ܸr. RW^l[+|:Gc3K 29uw|<^0LblYJqEJ I6*XNj_y^2r5(gG܅{Z;N ϱoZkdqL.=RogCr2Asf0c+j" Kq9@|!)| EpEGow%]F5I"&Tvs,s>2YK>~w(=KiN$*s)g_?3JFAџ B +쇨DTekkwnrԓz9#`3C\*QeeiRБ,eemNWJT+Óg^ n+޻͛,ݸ{U7QjAj,90}.Bl!ɳ ﷒Uk/O?١t|'׾mF&Iqa4Z?$ř$Iz3Ҥ)Gݭ-ijOs'YMp ْqSFTcFǨ֪DQTyZ[I-H!(Py(;4*\&TWv98,)ϸojh0=,:9k_|_[4U)cZ[>q7 z.vJBMb(qm~wZNR;cPqD}d(\[Î @V)4JIfn^ϓfwؔ#<ȸ I$!d37xc9SLMO$=oS.)*"\rg8ӴwZltkg1>5ŋN\)b!f'cnkWuJJCc%M#B#I Er !: KC!/GxD^SBQW.1s(ꅗEjT\]" 6&s1_+9},]eZy Mn]ʁ#GB؜%)c*P:q&ebdtljL/Pi8~!b&RXFvG!ͳlr݄GKr(C/^@jR;(N#=q8qQrCn2T\"t)W[aqN`"rC,\&$bm}۷483G+sN֣uCVF Ij0iΊGKh4<3<+,/c}sHh/-_$,\:Uc-$aet%l1Q<`{X09kvA*YԁC2~#*@=!^*H%p6Rނ dFF%f[QRQiY^YZ<ʙ3t3L F;i02:&+hTdҚ8%<{J\8)f >h%&Cmo6QZXYa{>-1h0>3񶘯3,e,eƔ%泾DTf1rcBA_%[֑& wn|&3Xclv5֜C s'ڼG/ə94sqP#ט1tin&7MM2-M1 IDAT2:c}2Bsa,ؓL&p&Bː0&(!p"AH~ a-OvG%ԫltLȌC!ޕUIWZDS]!A׫5.~}STvܺrkY[{LcljiX;8tp?PZ0EdAaWSU\"W23mq ~@CrKpx"Xπ "5o> Rآ" H%um"マӂOy>6Zr4-^\Zagc`E 0Ơə)1'UZi- Q/n]1@ NT+$KRp6-HL# *z3X #= S?)赻q8/1 ͹ea E=F3?^%$N67X[^EF1!կqO~1G'W4SW".۷i;rtt0 Ի8(WK;RkACb'6#>xY~ >,G#pB"'.Er?WQ W> p֡ *B]?:@pXQx{.}9.\l^O$sfh֫DB!f$k>tHqCI l!1F[] &ՂJcBC M)ǽw2 {͛_j1EO]G]!YH+z DbW<:\rV_=@Xkm D1;Xg)D 2*w:<4C)7Y7*@*4hYchSdz(^`tr%Cs=|ϋ+na:2A$qvuq3Ta`CQb!t&@D;"1?sμs* /ǎE;qWvr:, lo%TA }x_+D3t

    o~ca +&VC "sTje҇ kxt "1fr o^egsړO0=;KZZ]C=8fe %,{\DJt.|eO_7.]x)7jd2{ _wX\SkuVvλA|^_a?TAm͠dDT^ ,GEuE@Gwń+c}a_ڇXHZsa}H^!}IAiЙ" yQMKpH{I+XbqD"/%u .!VS,egȅ:XL:7e !GQ0h yjmahH: sNpFí9xR<ƃ c!ǣ+\F8N,˃yhJ{H0)|BոvA$RDJ0kއ"E)((֪Sk7` r`KW@Vͽ(|8Յ)D^x((R#vWjB{Ȋk3!S2BGZ:)͋_0FI[Ë؁^]5VJ֒qz 'NTe|&! z}0mt;킐L"7O͒>J^)^X9G\FN$g ! nsV#T){Iun@0,qt!WDW)t$hR|X vvyKk+%fX:8d#,"^s 'u(omj-}&Wx#LDoyVxB#EAxLk{ 6-2k?7).0[xKݢ+K&a*bGB CHG5n.C-)>8kpjD ،pV021pH8rNDaRN ?$:rt#W?s-MHHR88pp>3 ϼWUVIJ#eΝ*+ )Q2#ŝm{̴.DXUuׯzyҩQJ wяi^Fԣvw;Gw~71Z3Y?ggVBVpg4?[=Ib ZhaCzD;l3z&y&iux"u/-2˘v&gPF;ŝ'Bg Y$9y?OJ#So<Q:^2af6m-.0s n<4: ?\FL/dk$w9{c..&hmQὈE Aاgeڔh8iؘd5x﹵Pw ܎vb(!A)r/|) Mo5FOA-\ۦ> Oc{i7<χe{[8ZAV2CZ͒I7j޿o,s+k,=*emR1i M8/N 2$&X< ADg{_弁b ȥjIey Xqt $ 1N &2߲8Q^]ȿ>]mʥJ˥9FS 6{&ߠ87$m2|Ltx:R[$͸²o3iauJ.Q&a Sc>n<l|'iI|,/3G̑t&nTaIɄ+l>Z/ ^Ko6Hś+hNf稉M0e[^O~@tjU<<_ŧOq{fAsggW?n߰w'6f26Zg_ɫmxh^D/$W%.'䢞d[֨yǴXsjq3_I,&9H{ +KJ:xX%V[r/,'%0ME65Qim .tv^9U0 GQ]CB`u0}9Rs+$f AsJЌT.Sxv{%Nu,rXW bk4nHEDbJT|D,I~,G>sOm5 }1Yg_8 B'HԧxzZ`+!R .忾l&)"cA7C@ЇOjtOU/M^2/3~^_wwncy1u')y x<cPBp8HRk|Z:Ӥh IbUhUEIE`K!$h}5O=C_/rwd5 8x. K{T.^eEyB"@Ʉc6'7)mމ,rt V %v5"(C+%[dStJw`b1Vv]9$StۿXʕk4']]D@byQp֧%>*3oSsw ʽuv F> wb Gx[d[H0_ɷXDJ esg9n\$u.O<]#$8SxM"jLs6l cy٬Íh:d=xQdzxל3|Ң"!ً<xa^E<[лϤi13(]TXi񮄓a?`PUc\U"Yk.ʌCZ9rzuV!E]3X \|E;d{D}j?^{n^~}μl"m?Ağ|}sOiqQIɵ>T ,~RZgYeΤ̚Zh6.N}]OxW{:v L~{۝:I'=KtNztψZP "/xṄ ?\$1W.M3o!2WtKMK:G&0 WZ!HWXaH]!uL66I^oR8W9aHȉbYNܤ'#0<.CkxaBbPdRHM&$S$^hXKP"]’JԻQ{5 ~DA yG-e-#dCRjg 2T;HA"rNzϡ9~R*泗^ >֟ޡt_oe| y"3;x[oģvU]%-AfD%G$Oz*oӥU#PΫqߑb`ZCDT4<^hQc{!S_y#\˜&˜g;&r@tsyy]({‡hrdW-tE77x~{($T Dl }bZR:"bC1BS9%)X,I'HIGìM{D:hڜ2[!y"$#q(oKPᝥd XX(r_Dd (24ʋ p)" ,!< 2"RiQp%v0FCC@mP8WS--E=Xji|{vK $Y拃R|4JX(o5od.#)^rF*\d;ir {|5ś{Ye:of} R"l*Բq@ERTѿ8i^x= r(L04HhБ?cTgt AZr p~k'}NM2lL B2\Jkn?@T18v+O~p;4I^ve '_"Kw|!J_dU<a1L<!ϯ:(S^t]4r|4X5>C=w g{m9 %RGǍAGdtR9Iٚ eI2; ~{<dY-U'˴EV4tdD[iZ[NR7+4>8+˖>0S3EzUPB# _xX:!CF`Gۆm=BT8F1VF#i|ߦFbB$KgRDz]o?ُ2K=QRSzE!+ÿhA/hB8<}Cy*vazTH r#FBU h*yPeV&jM٤iZʑ!dc G0u',N [ahN<;sVpZD9r)FHk}Wcx82(xeTۅKޥ|i!"EAw,w„W7ڡ^;69};<+-FEMBV']N3i7re5MG;]| qL(„ȉ#S9}O:RB V[LH{v$;L钑-Ʒ>DW^">4A!գhx7$vt҉n&Fxg9]PFAqJ/b+[LJDcG3?U!vŭ_$>x}U^/A8VBB 95\6v> 7QA*kt fIy0, ;'E 7ĵ=/<â?&(nt ~(Y!vyN"NHˤbvOj:ws]@z=[ 'b:8 MHswAp'R8p(/@1`}&E~Id |h!,!>\"lCсB8h8^dqCtZ`3lI=w2*n ӫ+!Zތ=%Vx#~!}?>h\=!Nw+#>m b"ڇo|DrwEѸ58_E T!mҽ~ cEqZ:ҫe+P:k%>CI`G)!^_C܇8˵c9 ̟=óヘN;! f&Rf-.G)'Ͼ|~4Nvc'4R q>_ty \FVwuzQM_ӥ`ݠE \Ϧy )v{(/jh֛7]B^hօhqtB+(ǂeŇ?rf^Zda"EH<1JpW-Ȇi k҉.| fa&@yi6eU1΋|OS$LƉe*Bw7:wFY'mo^!>a 0P O$RPnw1OE@:s 7G+UXVԻ<{{+`}_6[sQΡ]_%jHh"8c b+NEQPLx+n\ !_ĦX:_zRs1dCN9HL*o`eZ Z 7شCe WckKqpt6twP>: Q"CYRd"F|Au8=2iТs .--i+/}ruU2=N6xᬅb$hKRQvav2>K:$9r7@~];jtsٰRhՅ԰s~y:krso~?uxk,9}_ >9޲SO0[|~%&(Ȼ`{'UGȍ b+95V׉L_N9U2Ov3 K-+$9 ={(')ҨxTqI\Ź48V%` sDdT?6lx4 zDMfsSssW uKmvGZ;AF#8i۔ Gɐh,dRŸBeGDZ~OKM)LHvv@;Mr4/d?U8a}ewHaq,dT/]',ˉ{V'98WO~e_3C=L󛯿R;Ccdt%c^ly:ţUA6Ulo0ȷ,͍o_D FԧoDRqʓ?q{ϩ^G{T*viVOď5z:A3%-xzt8nwU?~mb#6wVATY?=sBE02{ͳ Fq8_/18uRX Y+L/—hn2JR.=86aБyŏ~ySѝ*)O@Ļ' z[?r%{}Eteh0rG8Pa3FTBUc E KQRKmzPi:7|˸:J?>X%?gD >ILZdA16 YJ:$O=7Μ]>Њ͍6"{=U]'%<-TJܹp0Ky&(KO@vظF>'ic_.)[ܽu9u$*IpڗE"o; av7[l_kA1{{7l 03q|͓K0PIf☋>O'yIh&Յ6 )8- FUd0rdkk33`RP8VR~Yj7ܾy`ǮbRS;'! ;z 6{3JG(fdٌ nW2O8g.(_ol"JyʐXų?mL`e<xڹlr*?;9)M&9)Ÿ*1R]ƜD6əĈB铈|yַIs͵BH@HAHSB`T&J)pfL\s ҔT8bKu;+B׫uvl;͠ҽt+=8sT!MBeJ '] "nj*JB1'JNV4[!9ekJaУKkz&SYoE+u @I\Қjlompl~drewuY$bג88QmCnON>`T"7gO??89ă7;N8T-$,bAܾ QHK&\> ;J03$A mtWJ>"N3V76Kb&״pH4̐7쇧9w8ιt=!qȀbTv@mdi;4e8QX 2tR* ęSt&hAٍQZ.՛M=z.G-~(sCTbHOR{@΁la17+(J"X0vr?hJFqVE{pf2?#> *;2 Q/[qoE(e.шMN;K^H_dvrRPjRZI?1M."_,4LO=Qg-ϧh^RR"_áCdshIR4AJ0D4}EaD(D 6zd‰9,Q^+e_4bI* GL7ݻڷh)=F lIQYٌ&%LC1}JN!IXAd${5NSqaVJqrg$ XJxsXWz2QZB{1*Т#__h``QD&ߩM 6=p4p[!F@kIqқsRP?eJz*qc7۷(Op5@kg@\J N`c8cƌvA 1Eft7jܕepY||3 PC=)(RQ"\)<=5>G,VCpRpEIH!Qo !desPHPedpBNq4ذΠ> ߱9rlT뽳^X܁.u}x1è(1Tz)1X/Z LGZg TdTwP sV"HC sKU#C8cWX3 y a?COT~7{9 c:-B\)gLgU`V3&>.hU]5V2NLf|oTL9]/~~bWnr*b"* 4AD6~ȪKJR"q9Qc'KJ kmS-WBBTX/*I8F{67EqJD^pȝn!+L3YdJ2d97jb!}/ %B}e"PIISTI442nqIQ]_k5dL>?X=ˁ͍Y'd3x` 40SY/F[[;6l!K$r63}KMΜ ӳQ R!kCΓT tm*kT3hږ OY0>FdRJ0J7K}Yz2#7hvHgP 4f.wV  !Ǯ2:r[nVJ[ ƒ v 7~IABYkM"uX| ~ &FjxQ3 d鿁<Yp0(TJ[4-!;;#Sh2rE.B4f+jFX3vLtcEf֤>(Hd̬9̄JfFq!*lP&&g ).h.ķ2ZPoT:i#HQ8) `eَgTQ9[sr⍳L#Gd9"sdDmuŸLl!*T+PQ : XK%Qshg(H`%v"o :tuVآ?9J 0elf6E R ?]Ѹ,,} Mo@$r&L6T{tﭲӉ:%wcfzd,-*Rcu> FqLyl_`y10;#D-0ݵeqk hkVYs.S;}ARRQ1N:$1UR +w;CSf3.18" ׳%-^yJa"H v=uFĉC*K^nvhۓYZI1fxƟNĽ$-TtzP 7H1^>2 IDATM~k?7IRdX)B/Wdg<|un7vh06x٧9}S+wQF׮3Sm5~s +GY%fJTL"\@eߏtXr(fy:\j3KԲSZvǎ!uEg!0Ro\)J 7n~&gCX!Rސ`Dkjj\̴!dYZ*"\ t8 8LBQ4CiuIsqٿlЛG,k)Ä/1.o3QCX]`QUHHCDŽx~;4N,bi8FP*bS=4(1!j COPktwws66Mh֪4@+7+Qc|d炷&J m3 Zjz[%4MIcJ+JL[ z>~7W^BAkos^v2ssl q`A*AΑc]d!TK|1*e>V'">ɿc݁ݍ{NAÜ3 ]D!!w߻{01Uf4fyGF|ѳffacS"ۤbQ[<Ղ@ZQȰ#l6&9_2UӔ%X] 5Ȭ\Yd[ҠdZt|D}D*S q1C3:,9vPaxQVT[ :Q~"xkK12t$M5c|:eT8gYw^yW_˷/aS4'/qY>_WH9D?r!T~v#Ĥ-zO Ť_o!64YjHiTPg) 25Y"&cNC =qڗ;|˦-!khY)[LݠPpp>B'NBiƇE]M#SUXd]f{wQSk4w >^6205DK7-[W !RQ jP؟S)Vnk?s_,G$I),dP+G'T)* MR@(&=ݯ=OMnGp*J8IAzbsQhI&gI,(%fd8$'rDO~J潆T(`leA-AT z@WkJ|),HpƑ~LIxXeO\Ӛj؞gpl@UnݸCc cRjȰ{+\]Μ W춨O,R imJ`GwVjklGkj "4-˨5m,[[!9CӣޚZ&,䦢pz, xQf>nBaRFk !)C^( Qvg~T<@L?tlE'Oz'k"s9Cra}hߪ3#b}ypi) Yԥ(Qڜs4sjz%ǟca~mW1&MHnG%TÀ_~ΰz:B?_fH@)cD0Pɠ&4Va9,=Vœ[H[wsv!}dn)ڭr'Ԥ8kTj׌O[iB% o.p, 7+StkvU'Rg7~>G%*`W(%Z't6J 'n eIqr+d Ónf{dVW%E-M7u:.C5ZiRooUPu;$IGa@*͠c9ȹKxXA ko=Z`O捅B5h)d:ՁBU+R&dG$MQFfBjwv5--r)gЁ$D?I2sjc_ äG]xpM6S&qy.wo3jTxrbԙK%aڧjNx[j޻rSO\d^(AcƲ݃B_#d{Xq8O~-g@).}&laA6X礏k eO+BՌV>g#81b7!*WFF%p"> .^Wjg.;k+?wdK* VXzl/Z^>Dt Bа3%u"\Xϣ/|#G VIRjX \M:0\WaKoCszKkCkkw D[A4zh=Ŭ1TMH5fNџ[p\*ӈC5B"8sY"ݧP}c'Ĝmb ,Y"*Ѡ8D?䃦3̿CŻn]*Nė95!Қ9kHVu;\^ZQdB)-#=Ct:t;=TVP(Owmgk`sg(kQIC'Ԛ5f[p0.jwykc-C4,m%YԃLe*sSSшAT}KTXfXbr{Ǽw3epPfK {8j'AD17Qy}ht9]CnY}U}u.JX+f #;ZFLGgMcHHf{$ 5׬B|n~gv:t#uFjBtlq>n=ʲ2K@8zq`ęK5NrtpJjJ7acC:'hڭԀ*I1b(*& w_9t8,A5D(EO ǗTd7&(ef2'pLT[o~~]41IO bK2tl[S6Pa2vo݄JAc}fmok!4B |b#ǴWԤ!#YؠRH 1 2`e^CVw_f3O>\nlo2D ʤ)Hov=JܱB`+>3QP $l͗HDY<{qA?sl)PC;J*aFE*(bg G GSf-dfr=%0f 61F#O/>%H9d.>_r$Ôfrʇ'V4S.(2PZHaL@䈈ek?}^CPIIG>yu4$ΰqS F%N8Rlv~Wz+ѣo&39 wL RI#W&g8?BH!mvWpk[?qGEQa| l_IVGYGb,GO,t4#ܸ;+ ׸n:v1]њn8Y*WPBz$&"(Y7Ƕ9qPM2yBPnZ߰bMbf?Bo}f}4G!jL> 9!N]ɯ I6,46ř1Q\Vlئ5zaa0Sme?򁷇sVk 'YyM掞!J͸`kI oD1#3$)9T%<`7-ɇﭱu.F%~7~JآƲ | 7:=E95ngKZV=`3˪גcʙ,aCB!37֑8/<]|2K?4zU<TǷؗ53`K̞?ì1\ɏx?^:IL:3qQ~>ϣW~6 Kϑ1++lob%VJdg1:ysp[P1՘*ffŠŦ)64R)qMMEujT}ͭ뫯`zژŅ6}+Y8Kbő .IjaU|& 7Ir-Od9O>O=ȫX877j4><%uM-+S ko8(pzҲi<r;L ܄p֔¢QSI|Ɛ鄳"-Ԡ )Snz~=֧y㺧OXg _*_n-zJMq?)%,/\}~ڏ_$6h7kHi7(V h {zk\!eۻӷa~~ĉAXK$DqsR$t7a CZl/Z 'H<ԓ @ M J!63fKXyٟs$:밽peۿ_u#^:_< R66]Zg4wu*:`k7_k{>w7IY$c\əӧ0&v1ut^CeewQ•Sg*`q*6`a 9>JJhLʙ#$㜌3ϸ+phD^˦!M$:pHq$@()HSM0wdq' xi(lP{]I?su{6u(-Ks +vWV_#X8/#bPۻўVUs|HXJܲCVdVn ;FPY }pw#&K9 S%1}8}VWVV*vk;MxS/p򅉗Kݻ:/I:h]>M?C'GVa^hsaq6{Xc< E1۷ypE:8Б5UN07lj'^e}k@T*FTCMd-q*QaR  ,qa 6!IU][8]!N-ҥ4[mY5* !xO{|?È{v׮sj's @H5Hc8563 pq$= 4j;o L9Mj?ӊ.5tv7ؾi~hpaF<_*뼾9V/AIhbzO1[/h ?ÌM֐{yc2 h%HGzwn {es!?TO<]}_{o}Ez]!ժ.&MHd%|/*5.^̣O?\j2'ɉB $ƸjMfy "ԠawmI̕#sTÐ/|Kw:;{wx:O~v'+YXhRݘaӎZKZݜR?rc6 A؉xq>uv1(hw@E(כ,]>GsNj|t鑉{:Ԟyo"}M^sO7U aiǐA>a0ﲲz5xDpI3-F!c6Cd QϿgx7[G5MV61#EXri>Y?F/@x-8% #xH5~Sģ$ݽmnq=|"?=0v@ jH+lwzp&EI0RbDydx|ixnDKi\83$ڳTk "D[tſ!7C±b[w1z= яLp46HiIF=vW[ yT'(f4~a\YQ~zPk7QhD:3t4+,> JSk1BpqW~>s,sK'جyITsVo7VX~MVo`Da 9Z$"J Zxrw/(JFd@"* 6Ŋ*_rޚOmh5Tg-Raec{o/fLh6waܘTXp^5aF*,'n}w;v{k-~sؒr 9GE8)ho9{/5>Me64bb2hqrE ӄ.ۻ #$ҏ{!%lnrm5.>~sTEWNO1Sĝ.ioRB!ڎ3(hCJJ=^j kX vvvUB̶OϢ[k_ |Lv;C:C Sb7$Pt(e/37?o?1B) qf*͊&m`ee]j<$9WE>.g=NiLw~s)gchHb r)BPY`Ig_=76wn-SnY0,$Lijdq7 SQoBDkH:O+hxG07?Ϡ? )Aw>Af2y-F"-LPHa{$QL=Ib4e"Gh臄?s={WzԛPZ#w])XJ lo3Nb(^g92f5IW`V)cv7ai2$McVjnש5N8Zz2C0,x}:ֳ};|rI|$.@ULL"{o/-(4=6G~a*Unb2z" ._U㢍 zZQ| `ֻK%q;~<[hШ7\C2"O0^ Ʋ0{#gP L4-Mu  G1bE EP5\:bxoaMD T|s֭a@gײE]_gIju_xĤ(NȝØOog^ghqq8ßRJ.]pCt(qx %%0VA^j"B&8zP0u8YOt-&Y"$N0+?ĖٵRG;Y* mo#AYQcW8BuaJb{!V51Eї/ÐJkcqzfc\F&a'8tW 1$lmmaEIQlQb =3{;Zϼ{anvg}'N"D$8Q ߾+Du*![֣H%'~gZ_\O406㜿&-<ͥO/[׽BQ'0ZNSrۚʘB,J=xSt*»9\PAj+ FȏCrt0ĉplQLm΍X_˵k z'N/?G/Ak &zHQ 4kJQ &<J]5`m&'V,BFl5DR#Z`ucnK,Ijℝulť=s}1leYWcO Ou2$D*T&*?ﰷB!:9}gN9j*Ͽ4gϝ6G̏v7R %TZjZIa*nv ]n24@ʸJijaFE7H~RqB827o.G!kI2yoʋ#q+|O=Owwq8S-tYhfK0-Z!92MZ}jhl|O| 5q zti' ?KfqBC1N[ozUbLJ0;z]TLd@2 &${[-._9iU*$9LVxSk$xW_w^rR8@^I./g '*q5谂%U娛KBƊB1[1>D(tTyj8(2Y>%iBƬA ż;=/cKKr R G#8vl~ߜQG՛ԟHD:?EU&_e?ٴQ._4#jNZ: +^po3"42t%Q9/_gBN,䑋zo%Si:hvٳ| DqpɬSfs>~E~X# Q]׹w5MFFz[YXKH 4EJOR~--z'=YzЃ^ozVKKhD $E eқ q9=7\fU(; Qi"#=gg8;H&H4A<}1~+Eξ|"Oe`0O4 UMU[4d haθ~|]OD õUB)&B:: 87 3ОfM*h4 ceQKK-1-u٩mpv6Mu~$? [/mo2_a`xD)/{oTzD'iWTn?6Ef2U@F1sOB|iDFǕ6*Dvt^J4vޏm5xWyP7D"qzX<4m rCÌ{VLNOp5\E\֭kT6Wcjv'0 a(FhIkhH&Z.23kӢݝ(H=~Ava{:.BY&{#7 P$mv67(nI$M^;-Vxץ|2gBoZ- S1*uT4L< v6D;sr\ߺ(Gf ^f| D vaH"IcHo1{lc Bቀ*,A}[ξD2ge$in^B`@^rA<<ÔvJ +lT>{s 3LM`k;"Q^R!gSȧރi 5oiS5 A7@-@Q-Q]=rOiz- jb Ӗر84)Ie Q#kzu:cC)4Zi)uS˅IBeYp4wpy«ʳ0d0PȣrUVqnn/~ r*T3-tOٹ^YD%ST+ !|$=G'`kS J+c&U. }BRB2cql+Sc db2C{ˤK=P4NB ,#k qMJF<ұ(tJi߁Q(([osDMi0; CC|_Too=l*Eh*"m_%7 pд3443>ijy6$^Y-cHp'}uW ;g08q8_׈'\<~Sqj[EVY]^g07@~|a"qTE?F+{UX葏F,`mhZ%1:s +OTD%@'u]ZAug*a7#4 *<vvSXLS.Qo6I(DК@'hÐJ񩔶)lШ4-,|jbZsW'$pw< =92Dq_[[`qieR$cLOg4吶RFk:8,.屹[oJN VÁ0#)IFӃDH+Ʋ֖>*un]E3w;uZhaʏۢt5Omci*-')GP]DRo(k %LCdiq"l0|PZbKO:ʇ ZwO8\2(F`Юmң/6(-EvX] 0l*0l,/.]*M[ F162D2pWzj5jSvjՉbd2|Oad|d*C"я`fA F(ܡYn|GNML:`&U1 \Z`s}ra=f #XiR5q=[g{{f)MGF:4SS2cacx!nQ@i)TG}r;qj1@Iqkt{mձ-I6}_"ݝÐ$m'#35>ߋ:$ {UkFF7*llz߹Cl"(4 \D`6[l L0<0l-F&9-Z;.2",f$?@2$PUTO+4]lۆp{VxOgn>{7 viңq 'B{ANOd7ZiװU+h#7gXP;J&2" l}ie}m73TGN)l>EBX* Tlnnb ȦD"o26h4ZOlaZ(?l'9<2%,?}tܢMe{60MC/7[{|zn7L, z%|+鋽r?jWP;Z2T.(͗_ ,US LC]JV`I-5 ShpĒsCyb E!"֞5R8e><'>:<pr0  #TPDSgHZY'!{g#H[a m)~ϑ'-ւR%U?=nm5<ѧf;{P ZnqIqdo:CC7]ӲXY`vzfi6BSopɿ{'K-˼_:g{fbRiviBaF@(e0::ű宅Q@&&)kv"5&aɥ𽍎4Es"<B d'ݮ?p [#EVb?ɺ7pӪےciSCԪe9ꫬ./1pk6tǣg>rW-_TU,dbr/ۢUvX??ZO&Dc2(׆V-FFs*i IDATwha^]Pm.++*eZ~+ #gp[o19B"HΚi/S{sQäUXcbzji"!(0<4$=m[rU>KCJQ3-̋ok.}6 Q4>X{= sa~ ^%";Cם/.)g “RMԮp"~R]d+T+J",XStV$|OL1cR|_~%F<܃ǹ%JB 8MǣUk`E N*"%>L[4_>p*Zcx~Kwy:un-ʭ[,\aM;XoQ$ —=Ve>[oη͋/DLJ,)( s=&fxʒŅ feu+4aj0ɇЉc9|t2F~0K<8e/'gX '`T#;C;EΝ ̍O@kMPbmiP')mo1F6{#;wR0K+H"M<_=%hD(hZ콠, hPW93dm1w_ }FA|D*F2麼9|#o0v_yk.]grcu"mD&An)ҎKI8¡+d̰gy6'O<ʴyS:GBX$aj" yqN}#eh<R~&Ky-bx(os;Qxng+9v?"5{/~ٻR:Zsu.cÃMJ"Hvn T'pǘXRV$ҝ !{ȭV{ ;2iIM֮. m^ Ry:!lU+`K669{Gf wq_%sxG M7pv Kle3I OyMQ.F5d.&H"`yq?oq"G|z%>8J, As23xmEv \91bjb /0 ڪW/qkxfrso/qZ_<3QnTX^Q 0hyb@Q +5G߅ ϔPX.y5 WEi]-ǵThE2gy}~{X. 5N{6P`ķx& o4׿M,!:sц6b&R K5)f*ƴa4v@(7~ч /Fx&Q,<0Cueu;ǟ>J$9G+ls2C~tK`J-= f+rl>_CY _)67y7yq[nPi6m1F>z?nq1]'.4V 3ݳ<D|RJe۸ZrQ$TG,:NY!ۥmξc[o/T:MlYW.S[\%t~!^0.yI)Dտ4ۺd;靟j[o [SF*R0yeKx:4X5`S4LR)S$'?ؙ(C,ZܼT-^9 gzDbp2o~OʟX_gΜJWDl>1If&& Ĭaȃ?rAoq;ɯ:T[(vDӎ1DR֗\*o- ׹֏Vc' 1>[4+ Eb0sbӇ`:O)=[ܢܢX&Os&_䕿|_X)II֯SqfϔoS|vp\M.'IHiz>RBW]_:k rw~ܛ,4T&BH)2mCV>QO0}(\~g2iQzB* 4Doyx_)aUBYBl`w Mi(#}hDi`C ?H(_|j^=Ib|S(a^e#|㟤YkO_MtpɁ!$""PD+ *1s(CG;B#I^ﹴu\G?20|W.~-kx XzM3}3B{s-BR6)loahW_f&R_*bpmpOljTOzh66y/ͫ/ R)ql;++T;{o5&/ Fp)Jl›Tv<6}aeqK!׽nmmb=stha нfH(Iht `5#iT.;; hţM-.?!hH,Sr9~ʃϾ¹sJd22!(4XACڍ 塣6S'p2 !#d=Hcc =qVkk/!`gg/h,̓$PNem&3)9sc>]m#FSALhȯ>xԫxaGPhئpnC&&9qF#I^߰FndKʧ8#u}lEĎD mtA,]w͝~I}񽑪{%5BHG;R%|46 "wtω=gzr%q#'Yh`mn\_!-2B Pq>/BCCѢМt;xAʗRsfR2=6Gsگ0c|֚h2M&?^E?rz~tضGp߅Ҏ7*uQD NA266 iY} xy\tw/_eT}6i\Ybbc`1"IM2Բ<͚0#oa?KІ8~IR* Q۩rM^AKŠˏ00e#<)d+B0l/r}8VtH֐ sfpS<UD4yăX>* +7_fdok|h2!^ӤRdZwӁjלfߙӳl^P^LVTX*N\}uNgTVؑ5cck~/5Jkb8?8O>8Z+zRLik+U )7}Jdl"7f"?(CҬ1 XSy(XIҠze8{O`|r!>l;֚d4>ś/8W,jNbo܉}ܮ\*׾KoQ}RzU<ɉ2{?2GŎvU,lBv`_)TG\tLD/w螵}i Aj~ h1t 'tջz4VLM6akck94Onam$$HuFPۗr(noS.W dP/Qxkqٯ}l<) J&GH$XE\kLOʥ}{R cn$hwexpPڌ\ջNiMf o]x_Hilxg)0 Mn]xSAjsb׉F~ZNx }^3_UXgs ? g.3[[lC=Tujt#>ŝ msO&j;Lbw!4me! ҺepѐI"ccs7n#a_xы?^'~m8$m1-Ia%Xal< P8~ sZ386}0o ~b"!1>gsύ7XY]e{t@?Wd{%Lt\rb}˻. Tշ*J&m0P{\H'$RYXY^@ƒ?kW\ ,-ϞcüQ>JCEƏsEL!aZ,&&P\nmGC)L_Qtk>Ph}{B4ltMo7jdo-#%36evvg=0a_G MQ3&z?^]ԡXaj|_cvf|KA ǦySca#)?bR?/W÷jm )&'u'l J}I؜Le@-լ*^ χXs`&cQ7h'nY9r^?ٙ O j#(fqbm[ IJ<?x8bs!hZ\tGI:} F{y7A"E, Db|[ՍDHPX=u:)|x"ƱS'I&lvx8y"09(Զll,Ҕ9?Ю n0T\|rؙS$I<ꤪV[]Rg~/G6*l<} _+3;TԡeBîh6"Lr1Vy7Y SXs}j!PLhM$\dRJ7|s`h"0b{[v8,t%$JS߇`(BU=;B$}?w tرLfϱʅ+YY[geF9v\h/T1Gp*T2'v֊EڵwQwFdO >wAC.<ōWosmn^!?azzC 3rb\hMXm(;(x"iSv[Du7M_Cyj")d : \hvxSDߩ!tJz"4 Fgmn-.3՛sdto#ӯ5l ,^dPdcH$g|vO |_K?Mzu@`Dt@0w>;Wbvd:ͩ3X["z*cL022B,4,^JWN;b1WGXp?wKDhG'02041Y -5J*/dt`/Wr4-v,`cMS,pwX\/Fat(O, mM4?QXY]c< ˈh9Lb?ы^;V(#]!p0CBƾE#Ű蠨Q_CAJjYh(}26WQ{{v)}1Z)!H ya|cuye"[dVIG-ұCLMO0t jI Z&K+̯,YWDc1Hdrf*Ԃ- jVKDA.`,`@Q%鼽;iM=zhZu m ;2F0CC9|_uFYbñIF[Cf4J}lTj1:Ρuj@ o&lTl-PA߹ݯ %&J9+|S6i٢zJEWp2guQd) B A^cuiuQL`0?(ib6q]u.YZ[cmeRBLOLȇגiM6lO7#1x(jd[8X4qAc8 MrS(b $J̻ƈ5(@{ i[=ieuCHE]=?ԝ [v#G9t(Z͵5n_ϣ]R)Efxnt* t;jC&0-QhƲV[;< 3# S6ODBo4f~~r.kuJ0>>I2S>}i܏%,C~Yf&* H#aQOĞ QX5nM:7Ew Qu1]a7qGP}Bf 0w(Oi{"jFLkENulSyRhߣQ 4ucy5JuTS3qx!LM$bJ:ERx/?+qZ-ޤ(Q.Y]ZcM`aaH4'N?$hh)@(բZ^2IDAT<\D;n)-ײŴlZ&3AΡlF:΀0`,2}ңv]~OD㣴S*: Y[ iG-EZPS,va _>I !{vp&Z,AZ ̵®i/.qXK d2%?:B6f @Mv¶lZHLC# qA(aD1|ϧ^P)UpUrTj%j-fBsîxpC%Q["TtpǮ 10+ڃQ|hMLLM A@I(dO] 1,x"FDJRV0H1C+F(kh݅jmCuEwn;ZOh2*VAE߉Q z C/#Kn<d)*_UC"c2`+L)/qAV"@`wFP>6iZQ$Tdy1ay) Ĕ"N ZEC)j2 "W h{BXЀ 1!U xo1De){-BRoP0 d/R`,S_ a^;X5Gl\/&ɄZA!P:W !@iO5ERsܾhC0;DP_i\aa(fVb6<(b_+M&ZKمaj~%0xvBvl[@yX "J90Mgh2<$>7E 0 ꖁV1sH;Bsm0E"4b #2tj2:|ë;xIM # #X:5ZI뀊rSK,%^=A^[}@_C8Zo6ў/-X=U[srXasW Suއ T+T0 pV0 ))j߁24D4iΜdyG'S(<JaJ{_m pR S( mufv⁃S % ( Oh L"up}P pg waν *=^`*lunB +W!T Cxݴ0UҢˑhebTԜ8V>A\@[xUPX15d8j\eW\4zQ1g !0Zs]IF qwz%h0;sw9"N"ٛ9u G Pi4ǣ}݁A۔tow ؅94<J ¡|6vxjY/`Kݏ;?ՙ1 X)/T 1eCiVI3x]'[XQ< OR,k6tF) i ڏ)2LLK:C1Y!IIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.switch.pause.xxl.png0000600000175000017500000000614112167200764023641 0ustar lucaslucasPNG  IHDRf3e}&bKGD pHYs  tIME ,8x IDATx}t՝?y%3w4DDlmW`Vl G4tweѳۮ@=т(` J 3I$3If2c&C&Ʉ{s:nv^,ZQlp@UyEerN )O,Za RILL(N˥5}~f?o"tbAHFf7-[_0e^''?JNIZm{}Ն[o+xk{{-vI3w{Xt q荗]#L9 }𱂟\h<QncfU]S'3ۇ^mh+,t%Vkw?XfS[S=N&-}.E+KWU3+.>xOtb,sn.l%kdd e`.vOk1ILN!D 5!OSg̺{|TO^5/KyI;wl/щi KT  /s!o?bSCIFVy*.6SazSD8k!C>5\8;8~0ː 4\EUqfsgP~IMyg䭃?'omu?>5bNL` հF»|';ׅWT \o7$ΜK'厱0=ԉwz(F;97ēēDmkeܦjn]HA*We[ȀgWXz{Pѯ=lѓgcݧܶrcҜ9s'7?64*OMw޵e4:?(HLN=vFrBh矾36_'f$̖y֔,̋j#4#ή-&1%Jg=[$5}u&C[K#_^Od:17{ VR2if Ջ[l 6? Xg/YA}^ͧ Dq=Ѯ |/>16#!I_xpo1sv*" kih<Ә-v]!bvؾ!9%{'9%M_Nz9Zs/s-bS=ΰ8dD7&UAUEA&5 =Ԟ:QU^QY*vճqSI&sQMg[B" ~BŨ<@COA\MKrCu٤2;gGLrJu#`6*!= =Ĉf 8#nOcI T?d˜>x _Tljɚ9 E@P~tP‚ h l&4*aID-OF||;IݽQrOSg42S8}(W:wyf,4hm+$W{NYcaT_zr47)r~L;W  &B 3Fub}~FJ,JQH;v%څQl({W;n0╒kn7N_ц] }4 ${È᫳n⭘gO|O׶hUTm06\Leڢ5D<\b`{Ѓ!NwH@ E$f$ٻ]]uॷI33-T=/+Z#_GdhǛHvE:TQBx$$0) @<0 R/F$MկOq{рgfB- cE)LaT_2N03 4!FF$JH?"1gk8·]i*[31~ )ARX G|ѴBM"D?11kt|| TdlyqC>uyq rhij'Xܳ)idƶl4՝ cFldGe; GP[Vzo &Q|!$Xx_"e_"%xwK>6Ўl`-Bظ}|M&< ^t#G@X"MI\^{*ʼРewG,Ӆ1lņP͠  ),Hano. B|$e :b}I4SVa`)e(w}#c6eMz:988\9aJGt%**.ԃ^7{g=tJ3|I 42IWR ;U"r_ ׾f`ok+DEGh$$$,ѱj`&pW"kܽ%'{ aDd=Վ5M{x%RKdKŮTҒɎԘiW2+=Xd,žPuNbH{}C%J)kGoJ#Ei M)vvL+Ӧ´)LeuTM- ]p C]tU#! @b!*W9{3nF*䐧kq$̜O4MC)R ]DtºyO;PLmD4QZNonbJ).r ':y*p4 -]?wOqu=px;[ДBnpe=[^ګ~oZbPqchY@_ @?iV뷂o3J&xo ݤ?@N~!Dsչs`W=;~6{V9zymqb@1z_'AS977uQԝfh+ u;_vQΙ$AϬԝ@pmrC)B2W*DDC߁KO\icRVv;ys%YHzZrKܖhT4Nt?K?+_]e%n'mFOwYv,`.[ Qw Q6Y84Qhè(ua8D)Dj~-@=  Y.ںC+(bk{wͱE3+(oD@#m unne""&eXi"Tgx \g|Ԣjv~֨ȱu'YJ8颭>S i9B]Q0Ig$7@O_Ծ~Π{NvY&fhi{`o~B=0BVv62ލAZ&!T"=OWYFx㢩aǧƵJEE\Os$2X5dgxfsk*)64W'dOsa=O ٚͮ^L4{(WgK֒UÊ+݊z\INIf̅^:9l"pjG 8 WÉ6{Qᖖ̔:e? uA[U;Ed$. %cKi7rCX@;}>(B1!R&=3e<'}UKVG2ұӷoT"܂9/<m.X9lI f4H7U?N H+ Ƣ}}-[ s|ȣp.y%H@# T @a=e<3ݼyu[B*3?/D9bѢE0`(}+ oPni,^<ka4ѹf1{p4&%Yy(z۶m=S7o_1agSXH$BkD"`j;J>QW):$xܮoooo|4㝝7m~M$1{%D"@6dNȥKpF.3L|ٲe|߼qO&- RUbpV$+D0GFȜ7O& `i <@CjT*e\r}C P.W(w%KgiX h,54HeDXN`%I0캺:ԴJUգP.(_zcjŬY>U>2rNUUdLG/>EV9s<0<<|ȑ#b9_hDDee >0.DxϪU2,5M

    X]O|[[}\`gg-#X,.3`R<I A6dcYj4!82N@p_|"AZN(!|xaHmBJEQZ9xP,ٶMIz_%f̘1C:"1) &"gp'kA5677 ߿0^3*JUnEQτCDH)O1Ruu8p{ ~*6mB D HD9B1ΤɅ&p-궊 W\.WpoBQI4/qrV./Z/:[l8gϟ_fiD1tQ39\Q&ۮoiVW%_|/;?2Ɩk=rǹBD&2N x3 {t@*)GFFRa"RI2cRJI] x;ߩwf!>@Q1:u}.\4?mFE)`H@Vʣ& K8B_Y|4o}n}}}m2,2⌱$NDK)߹3^Ha\mn:nYye%tBڻw)_χ|JӴiι|B+19ׄV_/}}|2px lSxgc!)elm_K{{{C241w\岢lܘK/epD RAO&ӟL?FN$b˶~ι˸;19s_KOOf[.ƀ(ohii ۶]}o<8UT:u**ڴy 0㮖JM_wtw71Z `ݥiZa4{0>q${~/u$[&3(/Q.V! 'ͦ9U-k5*^|aM!6MӚ0#B Rw*ߊ|p֩rDt` 34qM_7 r4Xc_ t3.`n= \p%)RB (ˉȳv1bqo$fs;(qF.>;wdGwo^/p_jh\xŎWW|DS}>Hv\OiPQP(TeucBJ)RJ)ȟBRJswlFFFNXX@|4yݍ8t={]Y,0qc`Fbœ!}U! )=::}Ob ve{Ak!)]Х]G<`~'ZQ8MpX(T*M\EQ# PUUR2"Ν;lذ![ Q2M~+V,fZ5ryڑL{5NbBJhL' LsCRJ˶mq9 > >o;aÆ[ Q|0P< >3F뚚ĝ?x16!< 8Q)>{7F棷 7K ]s֭sOIRr)AD*ŋY'@4ly?x lGcfqmՆZ^iON൵jm1u},<7%E\\ jŢ2X$K7O|/jo9yr}K hݺxY--Bxlˆ>?1a6p8]Vw~1tԩ M4#p י'gҽt˂k0s ̙;wfq^ q_[]Zc^MM h*( "Kp7)%(o4MBl˲]v,ky3`3 d\/Q. n+--F0P(@9lj>p'㾎ׯ_/ƒɇH|m GÞ=V5 B8 y_Qmϝp9k߾}ǎ;6|U$Bhi)jP0&.v-[vҒ%uuur4f/JT*u[8^8X1f_uNnQ-'T(9|y0mm;dWcciΜ9e)%E;SvsqjqOҞ={,n yp9nwt=j)̞=`| Bi`i'u]τᔪaNGz*! Tm%hܾ}ʶ<1!c"H8W!}u*wqƁ{W_[/kkk`~[s--Ǽ8q޺uh4zn:SX \|UxHP4`.\x*̞-ZBD_^uy+ן1lYH4=+^Ef^vc,Lεmm%9e˖wGGG;SHo>7bҥCmmmUXbX8R" L={c>;ais'N8{eR T.20#jZ)嚚UUU]9gd18۱cGm۶۷6[|[t($d2YɾD~k-a0i  1C$OsOoCC9'UUyEEE\wp6mMooo ݻw-\0 @qkC:44tD!<Y*e={2tb9,<<2hUVj:^(J<u@D8yym}}}7H 2P(jYSSVU5C$Lry4M'pL>h-{h@۷wL@"˖}\foVOO[ou(.;FeU.14-dZ4Mc###Y|8"H= ~YT,&|]!ᴹvNra\2̙3-[:}7|zp]7--:NrLR2e,VԴ* ¨1Fu cW6cB0N$R)%;vX䷿>}w'"'aǎ,XrJFUՁ(OƔD"Q[[[;3Eme> $utd?_ P@:L4Gn끁۶mI|b|ٵk;'ݞf/% D"X@BL&\SSӚH$*#HHu8i00HP8WTUUt飏RDFh4-}߿g7pSb#O曔jwn/`srP}E(_Ś˵OQo}}:l#|xO Le UBϝTl)  D _t}2(%yRp=$w(JU.^ĩݚzQZ?itpj$>p=whg8"X]~oEX:+saN!F`i}YlRR¹!\q * 䗻:[n)A=cvP' 8y?fQk`Gw!E(1)%x/WOc6SWi[HL,$Ǘ.e%]ǽ)%RJe6^0K}=iQJ2Дݞ1P@I<3LGkPز~-36!h@:`%Vd3Pu%===Fu4E_kWptnMX!w¦(hPcLV='kKtV -d) pu K5ye=} ɽ7}M/ong:mK8d8tAjl:6Ld)zT{Ťb420tH{+c Em FB;>dС$Hj|i?q@_YN|$+eUHUU]PZ}MH6,(ENh}{^Ly=_,iϝ N j1R YۺVS]Yk?PzؓsDpif}z5>n ~ uYl= 46oYfWB+p)@c``S8OVڹ]{޷UTUSOiKolD=`?>}QQO9F}8}#7qs&B'c؆Q7wFS!O2;>P1Sk3͇  z)'1RIˆ:'c=jޣ=y5_BM ̭W#%5.<),rڳZ}e4/ۀՖՖOMRΜ>-+fN%P"Co]_Йބ %RƁ%XMd 6rX`,hR6s~=7p ӫ439!*CQ'uf\\%j9|~0.q6| ~m6(GjΤnv$ی#l/PSWqUbֽqf:`݊YNDa?Aϥ~u!l0G#Rǵj q qB^FQt~T5(yDkˋ_o 3 '^NWo z%Ik8 4GUt=%tVr6%b.NB&"f3 !َϝLɫdCJ-}w[_WЅۥ*+*ۥ*}RMUAnN| Q&I-󊟽/ '+!ՋC ȊͨOpK)Kܗ^>>53عwɕpU IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.router.off.xxl.png0000600000175000017500000000450712167200764023321 0ustar lucaslucasPNG  IHDRj bKGD pHYs  tIME  1IDATh_LTǿ{ggG⨵-Vlu7>٘/MBlMMsݾl7$>6R+:̅Ӈg WXf~93w~\NwwYzzF ZZl6[%@/fPJZS޶QPJ(p(%spc!ӲssDc1wvQGH7B:ծEq(%1(JAe10 XZXu( @%,H2֏BQq ()x4` OoÃN9D)1| @D @0As&, VO3mBcTUDP(Z!Z6SVvѠjc#¡"ѨFU pg| krC09߀EYֱPM,K):BQSJ@'@s spE( "@YkT(BͅgP+dPpHD",?Xw~=}%]z՝M{f/Z7[W/!0=uRjBJ0o4 Q@tj8eP3,Ca\WJS,T :L{aܖ LOau)brxv2g , Er(nu0ZRO3P*'[A:$}$uRYBрq]i9TimY׺ 5P=]+38gd"O. ΝD^ .C;!ڝ3x?66{:NuLI0j3JM/LO]w2 &%(8Y. ͰEVTdi9, J+<#%vgbU;JHeOpSChYcYjaٍTX`n]d}Oӆ330L 1'@m#p>n@]asp){n8\lR\fM+vȫ(* Pc,"p݉-FpZ?bK6qśhCU}5p2Z3,5 8ʷDq()T$u4qA2*N9l6dB'a޳aQQrkHHq-m0G|MZjgƇJDJD1=6),M!l6ïzc+ɱz żTh cNBdA=Y >n$WQG(5Yj(l VZ}.8Ԥa-*(O^Lv&.w bٟJ}cAv'j}u 4݉ʦ6槌5˶ HXS}v8hymRShˍ7֖;\h}Kmo.G,4aqm/zz}e+Ӱ2ߊ={"ą,E]|sկ׬aߚ.zIghJ*Ϯ\Q{68h\TWhƮK) ՇN?) Saj\ۛ:M.˓ӈ=9áx|uo}*ڭ2S8\twWֶo<{'XWzokыö{#n"0cʑ~˝ 1|sp;W !ko !߷jt|!OyOmp mn+a[ b ρ@=/#hTo;6&#GS&IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.script-finish.med.png0000600000175000017500000001277112167200764023746 0ustar lucaslucasPNG  IHDR@0K|IDAT8͚ypuLϾap%J"%kqHdGeK.'~y~"岝g)E~)WK%SJ,(} H,61{Dɼw~ssDQ ?%QjC{+}/ Ej:=VE&IncLp[L{ U\;"Ņg bmzb  ̱^S^zXrC5Xgld"'kK(DvN[䓌,=V,aXL0DHD\8D U(޽{'??~]1 ~g:҇N!}UQVxڞsl6Adk3ڵHNeEQt:f|0PjN;a P\\j>4 X,F&!iF3aih4 $I2 h"ϾY6/27ofl޼k֭[qݼlٲ@ @OO*_x J^ld04 >m>ͅ`7j((!kgCCp̛p$ukffph穮f޽={"z{{y뭷x9tt3gp~zbPYYI?WfOiZV@n7tt@{;SOO/-q‰pp=?+<\(20xzwcc裦_K~۴no۴&L};f5@ QecRUo2o<SWWG(>Gry|I6mڄjettb8@0gΝTTT{n^.\2d2Kf3;r*u0RGd:YK<2 L c1Ӊz4epg0 dYd2ICCׯ0 HR,\i222B&ła$ z{{/.罦<\U/ Xl1]xMj=<|zff[;~r]Μe;>e˖}v6nH~~>}}}9rNl6[H$?0,crGk&J_>0  K:6Y(..tdhmmEt:e>|xM(H$a>}K}}=$!*2nd߳Zd0@4A$-(q!;v`ǎ{x<Ra:b1Need2` IKW2o!ފ"\eT_, Hi~},[v_ڶukXmOXԺ. ;}F:t] F“?? $QUUEQQND"T`0fN'^ߏ#iP'O&ڳgCCC8NG$IF&R,zi)Niim10 M` 8ŧ`?67sd4/VE\ExߢNgo]7理Y0 ,4\xիW&ٳg\xBt]V, F[9xM p:/Ӄ(\.&1@$!aX>Z[蠜QYs˓{F߼q*+Nr줧`0ȥKuX jAJKK^PP@UUb1091$_Yg&j"T tx6z;w Y`Ϸ?abbUU?Agg'7oᰓL:AAA$ $ bZYh$<fMtGP%$(IV30tA3uoŋQZZJ,^ .yDҦ ''F<'(VnqL Jw>vx<\.xDhn>D}}=g϶pmYLFcbbCQBB!AUUTs5cÆ lTUU!~o&>f0Lk.9uEEܹI~:D__?hl\f0 A //˗ipI}Xya[ah2IKK77|]nZBuc۱Xhf:g϶p!.\@wwݬYQOWW76cڐ$JN  ٰ͂aDU+20Gc{Mq)T?3bvF.gȈXWB08JN'LLLi6nڥ,^ŋ Eq@FYY)a&Y7oD2jrf0$([>)lgp8*u3F7]7Ţ(%KdYbٲeXј U5sÜg3j$e^f߲0oRydݙ_Kw?nMG"n~=x`J b`:c٥ ̄!auuu|.**,]ZÇ~8 >6l#GC֬Yw0 -ZDu->|@ @<4crJN>M":3Aw=;^㶍l 8gR$V\E2Dt<7Noݎdi'A@ 7׏(I}aÝl65 }뾋G_k:[٫skm?Ͻ|xAZϟ#[b~1鬐|Wa;|pD;$Ѹt1ɴzjz;<`|t( UyHHW(mB{x~by}=Kۿ?͉ҥK&??Lbمnr100(2<FhD8jnSw,'OºiSNzjym.]ꤼxS'eqm$PHä}L :]Xע_&s!'fGɴiŕV`%+ XV݆oML|HA2-'L@ǺǒÑ\ |e0Vp8{ CNQzCB" 1$ KU-Ĝ}KMzHAR''"RL%Ŋ SÃ^?sC?3'hZ 7nDU3IMq:lڴQp)%EG(k0J*HiIBm-O!B}UCN7F"Fj'te; TҍO`aΞ@SSq}9u A$ . HePϷv9"oOiA /\[r,!W.F²#2\04hHeA dy@u-DS%M"id2;V VǑvr2ipeÄ.7rbeU47CoLl BEOdχ(d2G'|躎(D""SѨ$I$DsK${Rf Lp&5^&!]5q[]׉LMqc٧qTUE%vΝJ jmYlM{kHߏn)U|*W7,rK՜W&MfV X,ZfR8+at,a---ö9&{3e`xx8MYY _*#aA,gu7 |IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.switch.off.med.png0000600000175000017500000000201412167200764023223 0ustar lucaslucasPNG  IHDR:GlxbKGD pHYs  tIME %JIDATHݖk[U?Gܴɒ63M,7IgHlS#jgcj0CĖ{! :_8D9Q6Kvt?XM MM\_,6ISE {y>9לeS} səpQ 9yz pQ?cn_%6G ujg"ܾcǑ]}z?3Ⓗd9|.|c/0>:KNeN-VNKjn_"ep?f[e!uB>GwX/ v]M*[+Ye^9 #+D,Z۴liUۮ٣> -427H'0jK*NCw/glo5_9eOMZ0;3F7sh@[nΜ?d<+OstPzöjY3Pr`-6v5-m, Py.ev{1T=eKP'IzkZZ>FqIVFT%f,FɄjQ'I%ZКx_hν>ZfV77_"NكQXH%i =B*FqP/FɤozAa&~FHV(Xhr4pbw8y2؉e:>@_:{ԏ#8vJj|N:pAOO 4bhp 큮~+,/^-X,=֎˹ԅB~MλDè~KPU5 !4jB{kUF.4mX-#-HuL/ݓZ0HԺ E؃c$i߲$awƟVelIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.switch.off.large.png0000600000175000017500000000264312167200764023560 0ustar lucaslucasPNG  IHDRRSbKGD pHYs  tIME 0<70IDATX]LSggbk[`u)DTQ0vJ, į}Dwbqѻ-Yv9Ɩ-eY26DŽjŶ݅I>ܲ(i9sy9Q?v hb S;Ĩmll9RUk[fpNN`x|55ٜso'4ZE&`HJf .a_FJP|( FfK? 0x}2]ȍ6Lh`4[ F)^iaosrVGZ7Q\^VVMuTRUkK[ Ty:zs 5{c?huWr}CFqq9C7~Rd0PREuBK%F8~ϛ}Ew=v}=g.H{ юC!¡`tb^Qb::Xؤá nSҋ8rdf!RVG}nFuM.î7RrP&P*Gsj`tzjd3a:Fmf݄Ym'?_fd٪bLQkw4мXR\`BJ'4Q#O{駫-~lyg.{?y@Z;QE>/W.Il992Nέc4[OtJ[#[RA.SbK;M7ˌwLrupaEk _#Nؐ[J˭h:|TVѶg+u6ldMm+(fF+; R[VZBձUjm.WbWUk~v†-8''$=R\DھW3-4ގBYVYױG9]ƸpѦF0>8#IQ\X:᧞}"0}slGzSM$oY~(E!Z}e͒3@h}i2}F[dT, {WeU}`67vD1Iymo     7puH_XZ(zx0lW.}8N u(Ӳ^xb t%d7rԴYܽ1F~I0ާ$&FW:Piu9-W^a zb7v)uΰ$>%F:XNIL>>L#ecrl.I˯aYn gi5i p ݏ?Zo8]լJf5Cnl )c~&/a~&b!hD0Jճo).w X( &tCiYp{}x}8F{9-hL>_+^<._Lww`;P؞WaΏSs:ϟ"*xe}rdx|`Y2z~z \]m920 أl߱r|؎ض Y[C0YԳڪiSan]g(nlX; c``cĕelnn1`TB\wnJXs-3huh}UIU~7 % !ZU߹^Q`c6Tc5;Y<#|IEвU=SI=`1!AAAAAA<={@H#GIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.router.pause.xxl.png0000600000175000017500000000764212167200764023667 0ustar lucaslucasPNG  IHDRj4bbKGD pHYs  tIME  9L/IDATxtTU~?77$ D P (hEW9jWt=V={S]tO[϶m."˯+A"0 I`L2nd {{=/~2rMoTs̽ӝc_; Z&a+26prs󞭘Y̥Z䉦K=uP_,%8'=6/?i;x2+oyn5d3-C\bfܻ7?xUt~?|BѰ' )۽{ǪtC\oղߝ=~;@mUJNn+u*,Ʊyᙧ[k,^{W Msrk^ۺmeFxsE%i}o\eE鬊gSfLLֿ^[BKvxıC6Ւw֎r!O;'Ͼ٥Sklf\$dμVrrӒ?<6=mm|>s{Í&<6&PE|ܐ5 W< ð ,E0dpt]`U̓ R -;2VM<«0?xͫm-5=iC_~rl=)πlݶ~ADM"{oGR@5Kѵ_vvés6$2HNd@MPƒ]Vp,\6W♁KN7S1>Ɂvjͽc oZ-M=k2Ik;W?Ο-omI9or߼=4q{IπdpʌV_;c;Phk~~SBʀJXYYVW5uZU(&(}mɤ&)# {qެ)b(*,*v:]vHkR )1ęS9vp{n4!~@UK2g.^zǖo-eugg#k[m^M^g-* ++kNAAADq\5YYNH!cG)S3g"5MjH) H)^_TX޾^i^,Ra.tv&/tDTq-VZ_<紷e}p(친_8rq(4*uۍ$. ˍihIu Miki蚆L7y)%BL]M(7M4b00MN,"p ݴ,,{ǾiL(?!ĝR*MӪt]Gdgg#5hz\VɩiˑAd̺8$&˲4G# eDhnnfF/yREAA@P b5\P6_N_M&+7I6BmXRK9z[b) 0BJ(@w#ъR eYX²ix= p7Ys},wm~K(觴,a6!`?88Xof8ə 1 ҏi2~=EIXKN2,”-m~|x_ )5 q8q8V;F꽗.q[Z|gV9N9FjH-+aڈH-cL-e-G%f9xi1P R(E D@aŁ3f~5wױhbP(?~Fnݶo6$_@ӝ#SrfSУ41G܈"nm1v(R"ؼ3Bq4ZR)H84KnQ%RjufeZeZnnZ\f7!h(B,bNY+kz"U U҅#o/3o͍,Upz4r}i ð9# H%< L Vg5)&,L)"vc\]7,δ綂)p/J8(ض "X2ҙwڠMވ=t3l!6Zlj.%.YYh/ҺtFrabTbxz+rqP444DA+10"ݡ @s*4~>V:+-Ze$~իzGXՇ҅Àe9e $HQNb-yuTGs#'nc-nndjBVnw{3'Op}'4%^tLjaÏ>u8/ɥa iqĶ!;|?vP1w!%3 ~Bʤ9+ H8Z*̊w)P !hn#Bг_b lȞ3oOp_%ޟ;{ՔW0;'E7SfΜ.kow݀fJOlyHJ,T.TҾO\T?RWL8sLX׋°2,K HYtE)aP%P2%s'[mo}=. ^0+8d;)K1UL37@P"7 ^=)۱[۽/p8ų']eVE{B"XCvOײsi(Wf4%18@Ƀ`t[',@g͌JJϭܢ䧽j'||Лv0 ֫W#}۱5~d[ԑǪRԖq JwziŻ|Yؒu)^!`wF׵NgVF ׿#d@}U@e;-|DBD]eq}2_u[ħIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable-serial-left-right.small.png0000600000175000017500000000172312167200764026110 0ustar lucaslucasPNG  IHDR0 twIDATke7s)5]i]H 7](njTA+17uIi7uSB-F TIzIb&7ou1O0gs^[Op6RX&}l*6f=;>V?y+ '{׮]d-*|gL R,ja^p۝B1Ní7 'nF~ 쇧t:h^ c('yߔ SN$0 i}c݄WG<^8zjTx\.}^*Kۥ{]*dӏ>UON'UIl *JS(ZUWsAЊm7C(s(6Z8F!%Q~?t33 Jdף# _3T*5`ZX~Dfa4xQ $áJbbCX{@=%q1Xknd 09Hu9,"$ɰl!B+ZEC&Tp#1RH%d{aAF$ÍMj[5^s9}L>rJt?COERJkHSt;]$a8`ry!B<XDFnٗ"O#2/0pߜX@YL<ː9,| jo 94d[ؓϔmpXyЖ,r18^{"!%ab[d({K5V0f0 5)LItZaJ%BycwltgoZ_G./Q{G{;Y4-4ј֛0[5ضk< |޽wnM^+ߋ|oV]Opצ^]o9oZgIuA1Xj2^MeuF^# sjwQ YXNMAIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.direct.dialog.png0000600000175000017500000000502012167200764024162 0ustar lucaslucasPNG  IHDRppKbKGD pHYs  tIME ,Hh IDATx[l[?s>-&$iheth6iVMUHmL4!m/ik2zKiiiiI4c'/ssKQ28s|||\EwѤD ((@A@A "P"PDD ((@A@A "P "PD E /R@)(n`h惿H&a,ƴ,^mA $qj+cXB?޹&>o$IvMӈF"dsbY1~;555ض=*rׯ_ömַlH_,Mb3%uBgϟ;T;N7 2 .>?9.?y-FGFf-[׀ifu+L*5 lܸGv鈴l(D 9B"S'{qx.~|(LjnӦŅ=^6o\e*O]tUt_v0رk D)hjjں:[Z,Զ-&(M194}-FG]*e!ݯM ݾtUIJp]C8KjzٖM46EO/tlEZquf gNC)T(}e<-M+-jٺfqvbeca'_iuU-UFwf{<| >[iW&ZIoX}wAGGgEWfQ<ᡡ'O8ag'ON'R؈a躎D#cжmS)fffx`(4@?39 yteV=ݓ~?F׬ |>nt&y),˦)֕+xTR;]QyoGh[ZlStm-偽GI(>jN/&L$ok2Mj8ix>WݦGU:ϟ;=Ћ=uuuD#Q,&;C) Nߜ?V@M1̼ө׬axhd2ICc#׮_#2Ja&x63YYKߙ\Xif- ۶ɘּ<op5ymLNN011d]ok@˲F03&pl.TrO=dXa<}l&NM.\J2`}\Bmm-g?C ߥi<ޒ@}4'>9[Fb]t*[f U>ҼuZXNlgP|ܾ}laRb''Jn}A@a]v\<9'NYVs2syfr:>k9K΍Z en,L"kuUe1)}Y V@[ƙzerÅtP`z˔ D E (@(@A "P "PD E (@(@A@A "P"PDD ?#DrgIENDB`marionnet-0.90.6+bzr434.orig/share/images/splash.xpm0000600000175000017500000463525212167200764021172 0ustar lucaslucas/* XPM */ static char * splash_xpm[] = { "400 464 41264 3", " c None", ". c #2000B2", "+ c #2404B0", "@ c #3116AB", "# c #3117A6", "$ c #3017A5", "% c #4630AB", "& c #9890BB", "* c #C2C1C3", "= c #C7C7C4", "- c #BEBDC2", "; c #BEBEBF", "> c #BEBEBE", ", c #BFBEBD", "' c #C0BEBD", ") c #BDBFBF", "! c #BAC3C3", "~ c #BBC4C3", "{ c #BEC1C0", "] c #C1BEBD", "^ c #BFBEBE", "/ c #BEBDC1", "( c #BEBDBF", "_ c #BEBEBD", ": c #BEBDBE", "< c #C1BEBC", "[ c #BDC0C0", "} c #BAC4C4", "| c #BEC0BF", "1 c #BEBDBD", "2 c #BBC2C2", "3 c #C0BDBE", "4 c #BFBDC1", "5 c #BEBEC0", "6 c #C2C1BA", "7 c #C1C1B9", "8 c #BFC0BC", "9 c #BEBDC0", "0 c #BFBEBF", "a c #BEC0BE", "b c #BBC3C1", "c c #BBC4C5", "d c #C4C0C8", "e c #BFB7C3", "f c #A9A5B8", "g c #847FA8", "h c #492E96", "i c #2C058C", "j c #28008A", "k c #300B92", "l c #3414A4", "m c #3017A6", "n c #BBC3C3", "o c #C0BEBE", "p c #C1C0BA", "q c #C1C1BA", "r c #C0BFBC", "s c #BFB8C3", "t c #492E97", "u c #2C058D", "v c #28008B", "w c #2F0B92", "x c #3314A5", "y c #2000B1", "z c #2303B0", "A c #2E13AB", "B c #2D13A7", "C c #2E14A6", "D c #452FAC", "E c #BCC2C2", "F c #BEC0C0", "G c #BFBFBE", "H c #BEBFBE", "I c #BBC2C3", "J c #BCC2C3", "K c #BFBEC0", "L c #C0C0BA", "M c #C1C0BB", "N c #C0BFBD", "O c #BFBFBF", "P c #BFBDC2", "Q c #BFBDBF", "R c #BEBFBF", "S c #C0BFBE", "T c #BCC2C1", "U c #BCC3C5", "V c #C4C0C7", "W c #BEB8C3", "X c #A8A4B8", "Y c #827DAA", "Z c #472D9A", "` c #2A0591", " . c #260090", ".. c #2C0996", "+. c #2F10A5", "@. c #2101AF", "#. c #2101AE", "$. c #2406AD", "%. c #2304AB", "&. c #290BAA", "*. c #452DAD", "=. c #988FBB", "-. c #BCC1C1", ";. c #BFC0BF", ">. c #BFBFBD", ",. c #C0C0BB", "'. c #C1C0BC", "). c #C1BEC3", "!. c #C0BDC6", "~. c #BFBDC4", "{. c #BBC1C1", "]. c #C0BDC5", "^. c #C1BBC4", "/. c #C0BCC1", "(. c #BFBDBD", "_. c #BEBFC1", ":. c #BEBFC4", "<. c #C2C1C4", "[. c #BBB9C1", "}. c #A4A3B9", "|. c #7D78B0", "1. c #4128A7", "2. c #2203A3", "3. c #1C00A2", "4. c #2204A3", "5. c #2206A8", "6. c #2101AD", "7. c #2000AD", "8. c #1E00AC", "9. c #2607AC", "0. c #452CAF", "a. c #968FBD", "b. c #C0C0C4", "c. c #C6C7C4", "d. c #BEBEC1", "e. c #C2C0BB", "f. c #C2BCC2", "g. c #BFBCC3", "h. c #BCC0C0", "i. c #C1BDC4", "j. c #C2BCC3", "k. c #C0BDC0", "l. c #BFBEC2", "m. c #C1C1C3", "n. c #B9B9C0", "o. c #A2A1BB", "p. c #7C75B5", "q. c #3D25B2", "r. c #1D02AF", "s. c #1800AD", "t. c #1E01AC", "u. c #1D01AB", "v. c #1F00AD", "w. c #2607AB", "x. c #452CB0", "y. c #928EC0", "z. c #BCC0C6", "A. c #C4C7C3", "B. c #BDC1C0", "C. c #BFBDC0", "D. c #BFBFBC", "E. c #C0BDBF", "F. c #C1BFBE", "G. c #C2BFBE", "H. c #C1C1C2", "I. c #B9B8C1", "J. c #A2A0BC", "K. c #7C74B8", "L. c #3C24B8", "M. c #1D02B6", "N. c #1800B2", "O. c #1F00B0", "P. c #1F00AF", "Q. c #2000AE", "R. c #2505AA", "S. c #4229AE", "T. c #908DC0", "U. c #BAC1C6", "V. c #C3C8C2", "W. c #C0BEBF", "X. c #BAC2C2", "Y. c #C0C0BC", "Z. c #C2C2C1", "`. c #BAB9C0", " + c #A4A0BD", ".+ c #7E73BA", "++ c #3D24BA", "@+ c #1D02B8", "#+ c #1900B4", "$+ c #2100B1", "%+ c #2100B0", "&+ c #1C00AD", "*+ c #1F03A8", "=+ c #3B20A9", "-+ c #928ABB", ";+ c #BFC1C3", ">+ c #C6C9C1", ",+ c #BDC1C1", "'+ c #C4C4BB", ")+ c #BCBBBB", "!+ c #A5A1BA", "~+ c #7D73B9", "{+ c #3B24B6", "]+ c #1B02B3", "^+ c #1700B2", "/+ c #1F01B1", "(+ c #2200B2", "_+ c #1B00AD", ":+ c #1C02A6", "<+ c #361AA5", "[+ c #9188BA", "}+ c #C0C1C3", "|+ c #C7C9C2", "1+ c #BCC1C2", "2+ c #BDBFC0", "3+ c #BDBEBF", "4+ c #BDC2C2", "5+ c #BCC3C3", "6+ c #BFBEC1", "7+ c #C0BFBF", "8+ c #BFBFC0", "9+ c #C4C5BC", "0+ c #BCBCBB", "a+ c #3B24B4", "b+ c #1A02B1", "c+ c #1500B0", "d+ c #1D01B1", "e+ c #3519A5", "f+ c #8D87BC", "g+ c #BDC1C5", "h+ c #C5C9C3", "i+ c #BEBFBD", "j+ c #BFC0C0", "k+ c #BFC1C0", "l+ c #C0C0BF", "m+ c #C1BFBD", "n+ c #C0BEC0", "o+ c #BEC0C2", "p+ c #BDC2C3", "q+ c #BCC3C2", "r+ c #BFBDBE", "s+ c #C2C4C0", "t+ c #BBBABE", "u+ c #A4A0BC", "v+ c #3B24B3", "w+ c #1A02B0", "x+ c #1E03A8", "y+ c #381DA8", "z+ c #8D88BE", "A+ c #BBC0C7", "B+ c #C4C8C3", "C+ c #BEBEC3", "D+ c #BBC3C2", "E+ c #BDC1BE", "F+ c #BDC0BE", "G+ c #BFBDBC", "H+ c #BEBDBC", "I+ c #BEBCBC", "J+ c #BCBCBC", "K+ c #BDBDBD", "L+ c #BDBDBC", "M+ c #BEBDBB", "N+ c #BEBBBB", "O+ c #BCBABD", "P+ c #BABCC0", "Q+ c #B9BFC2", "R+ c #BBC4C4", "S+ c #C1C3C3", "T+ c #7E73B8", "U+ c #3B24B2", "V+ c #1600B0", "W+ c #2101AC", "X+ c #1E00AF", "Y+ c #2405AC", "Z+ c #4228AD", "`+ c #958DBD", " @ c #C6C8C2", ".@ c #BEBCC1", "+@ c #BFC1BD", "@@ c #BFC1BC", "#@ c #C2BEBD", "$@ c #C2BEBC", "%@ c #BCC5C4", "&@ c #BCC2C0", "*@ c #BABCBC", "=@ c #B7B6B8", "-@ c #B1B8BA", ";@ c #B4B7B9", ">@ c #B5B4B6", ",@ c #ABAFB4", "'@ c #A8AFB5", ")@ c #ABB2B8", "!@ c #B0B5BA", "~@ c #B5B6B8", "{@ c #B5B5B7", "]@ c #B1B5B8", "^@ c #AEB5BA", "/@ c #AEB8BB", "(@ c #B0B7B8", "_@ c #B3B3B2", ":@ c #B3AEAD", "<@ c #ACAAAB", "[@ c #ACACAF", "}@ c #B1B3B6", "|@ c #B8BCBD", "1@ c #BDC2C1", "2@ c #BDC0BF", "3@ c #BEC1BF", "4@ c #7D73B8", "5@ c #3B24AF", "6@ c #1A02AC", "7@ c #1600AE", "8@ c #2100AD", "9@ c #2100AE", "0@ c #2000B0", "a@ c #1E00AE", "b@ c #2505AB", "c@ c #C6C8C1", "d@ c #C0C0C0", "e@ c #C1C0C0", "f@ c #C1C1C1", "g@ c #BFC5C5", "h@ c #BEC5C6", "i@ c #BEC4C4", "j@ c #C0C2C2", "k@ c #C0C1C2", "l@ c #C2C2BF", "m@ c #C2C1C1", "n@ c #C1C1C4", "o@ c #C3C2BF", "p@ c #C4C2BD", "q@ c #C2C1BE", "r@ c #BDC3C2", "s@ c #BCBCBD", "t@ c #BBBBBC", "u@ c #BDBCBD", "v@ c #BCBEBF", "w@ c #BAC0C3", "x@ c #B8C2C5", "y@ c #B7C2C3", "z@ c #B5BFC0", "A@ c #B3BABC", "B@ c #B1B6BA", "C@ c #ADBABE", "D@ c #AFBBC0", "E@ c #B4BABF", "F@ c #B6B8BD", "G@ c #ACB4BA", "H@ c #A8B3BB", "I@ c #ABB5BE", "J@ c #B0B8C0", "K@ c #B5B9BE", "L@ c #B1B9BF", "M@ c #AEB9C1", "N@ c #AEBCC3", "O@ c #B0BCC0", "P@ c #B3B8B9", "Q@ c #B4B2B2", "R@ c #ABADB0", "S@ c #A9ADB1", "T@ c #ADB0B5", "U@ c #B2B5B8", "V@ c #B8B8B9", "W@ c #BDC0C1", "X@ c #C6C4BC", "Y@ c #BEBBBC", "Z@ c #A6A0BB", "`@ c #2100AF", " # c #1D00AB", ".# c #2004A7", "+# c #3C21AA", "@# c #908ABE", "## c #BDC0C5", "$# c #C5C8C2", "%# c #C1C0C1", "&# c #C1C0C2", "*# c #C0C2C5", "=# c #BFC4C6", "-# c #BEC6C6", ";# c #C1C3C4", "># c #C3C1C2", ",# c #C4C3BE", "'# c #C4C3BF", ")# c #C3C2C2", "!# c #C2C1C5", "~# c #C3C2C0", "{# c #C2C1C0", "]# c #C1BFBF", "^# c #C0C2BD", "/# c #C0C2BE", "(# c #C0BEC1", "_# c #BCBCBF", ":# c #B5B8BD", "<# c #B1B7BC", "[# c #B6BAC0", "}# c #B8BDC4", "|# c #B8BEC6", "1# c #B5BEC6", "2# c #B1BDC1", "3# c #AEBCBE", "4# c #ADBBBE", "5# c #AFBCC1", "6# c #B1C0C7", "7# c #B6C3CB", "8# c #BBC4CC", "9# c #BEC4CC", "0# c #B8C3CA", "a# c #B6C3CA", "b# c #B7C3CB", "c# c #B9C4CC", "d# c #BCC4CB", "e# c #BBC5CD", "f# c #B9C6CE", "g# c #B9C7CF", "h# c #BAC7CD", "i# c #BCC6CA", "j# c #BCC2C6", "k# c #B6BEC4", "l# c #B0B9C1", "m# c #ACB4BC", "n# c #ADB2B7", "o# c #B2B1B2", "p# c #B7B4B4", "q# c #BCBBBA", "r# c #BDBFC1", "s# c #C6C1C1", "t# c #BFB8C1", "u# c #A69FBE", "v# c #3B24B1", "w# c #1A02AE", "x# c #1600AF", "y# c #2100B2", "z# c #1C00AA", "A# c #1D02A5", "B# c #371CA8", "C# c #8C88BE", "D# c #BDBEBE", "E# c #BBBCBC", "F# c #B9BAB9", "G# c #B8B7BA", "H# c #B8B6BC", "I# c #B6B5BB", "J# c #B5B6BB", "K# c #B5B9BB", "L# c #B5BBBB", "M# c #B8B8BB", "N# c #BAB6B9", "O# c #BBB6B6", "P# c #BAB6B3", "Q# c #B9B8B1", "R# c #B9B8B2", "S# c #BAB6B5", "T# c #BBB5B9", "U# c #B9B6BB", "V# c #BAB7BB", "W# c #BBBABA", "X# c #BDBDBA", "Y# c #BFBDBB", "Z# c #BFBFC4", "`# c #BFBEC3", " $ c #C1BFB9", ".$ c #C0BEB9", "+$ c #BBBCC2", "@$ c #BEBDC3", "#$ c #B9BBC2", "$$ c #ABB6C0", "%$ c #B3BBC7", "&$ c #B7BFCB", "*$ c #B8BFCC", "=$ c #B5BDC9", "-$ c #AFBBC2", ";$ c #ADBCC0", ">$ c #AEBFC4", ",$ c #B2C4CA", "'$ c #B9C7D0", ")$ c #BFCBD5", "!$ c #C3CED9", "~$ c #C5D0DA", "{$ c #C5D2D9", "]$ c #C5D2D8", "^$ c #C4D1D7", "/$ c #C3CFD7", "($ c #C4D0D8", "_$ c #C5D2DA", ":$ c #C4D1D9", "<$ c #C3D1D8", "[$ c #C0CED7", "}$ c #B9C6D1", "|$ c #B1BDC7", "1$ c #ADB5BC", "2$ c #B1B0B3", "3$ c #B6B2B2", "4$ c #B9B8B8", "5$ c #BCBDBD", "6$ c #BEBFBC", "7$ c #C2C1BB", "8$ c #C5C0C5", "9$ c #BEB6C4", "0$ c #A69EBF", "a$ c #2304A9", "b$ c #4026AD", "c$ c #938DBD", "d$ c #C2C3C3", "e$ c #C5C6C5", "f$ c #C9CAC9", "g$ c #C6C7C7", "h$ c #AFB1B3", "i$ c #A0A3A5", "j$ c #9A9A9D", "k$ c #9A969B", "l$ c #9B959C", "m$ c #91929B", "n$ c #918F95", "o$ c #988D8E", "p$ c #9E8D8B", "q$ c #9D9398", "r$ c #9E9398", "s$ c #A08F90", "t$ c #9E8B89", "u$ c #928E8D", "v$ c #928F8E", "w$ c #9B8E8D", "x$ c #A28D8E", "y$ c #9C8F96", "z$ c #9E9A9E", "A$ c #A6ABA6", "B$ c #B1B9AE", "C$ c #BCBBB7", "D$ c #C3C0C0", "E$ c #C7C6C7", "F$ c #CACACB", "G$ c #C9C9CA", "H$ c #C6C6C7", "I$ c #C3C3C3", "J$ c #BCBAB9", "K$ c #B6B7B7", "L$ c #B0B5B9", "M$ c #AEB5BD", "N$ c #B4B9C3", "O$ c #B6BCC6", "P$ c #B6BFC9", "Q$ c #B6C2CC", "R$ c #BDC7D2", "S$ c #C0C9D4", "T$ c #C0CAD4", "U$ c #BEC9D2", "V$ c #BCC8CE", "W$ c #BBC7CF", "X$ c #BCC9D1", "Y$ c #BFCBD4", "Z$ c #C1CCD6", "`$ c #C3CDD7", " % c #C4CED9", ".% c #C5CFD9", "+% c #C5D0D9", "@% c #C4D1D8", "#% c #C3D0D8", "$% c #C4D2D8", "%% c #C2D0D7", "&% c #BDCBD4", "*% c #BBC8D3", "=% c #BBC7D2", "-% c #BDC6CF", ";% c #C5C4CC", ">% c #C0BEC4", ",% c #B4B7BB", "'% c #ACB4B4", ")% c #B5BFB5", "!% c #BBC3B9", "~% c #BFC2BC", "{% c #C1BEBF", "]% c #C0BDC1", "^% c #BDBEC3", "/% c #BBB8C0", "(% c #A49FBE", "_% c #1E00AB", ":% c #2608AB", "<% c #462DAF", "[% c #998EBD", "}% c #C7C8C2", "|% c #BDBFC2", "1% c #C2C2C2", "2% c #B8B7B8", "3% c #B0B0B0", "4% c #ACABAC", "5% c #A6A4A5", "6% c #9C9B9C", "7% c #909092", "8% c #7E8084", "9% c #75757A", "0% c #746F76", "a% c #756D76", "b% c #70707A", "c% c #736E76", "d% c #796A6E", "e% c #7D6869", "f% c #776C73", "g% c #776B72", "h% c #7A686C", "i% c #7A6466", "j% c #6D676C", "k% c #6C666B", "l% c #726365", "m% c #796264", "n% c #77676F", "o% c #7A7279", "p% c #827E82", "q% c #8B8888", "r% c #999696", "s% c #A09D9E", "t% c #A5A3A5", "u% c #A7A5A7", "v% c #ACABAD", "w% c #B5B5B5", "x% c #C3C3C2", "y% c #BDBCC0", "z% c #BBBBC0", "A% c #B6B7BB", "B% c #AFB7BE", "C% c #AFB9C3", "D% c #B3BCC7", "E% c #B6C0CC", "F% c #BAC5D0", "G% c #BECBD4", "H% c #C2CED8", "I% c #C4CFD8", "J% c #C4D0D7", "K% c #C3D0D6", "L% c #C3CFD6", "M% c #C3CED7", "N% c #C4CED8", "O% c #C5CFD8", "P% c #C3CED8", "Q% c #C3D0D7", "R% c #C2CFD6", "S% c #BDCBD3", "T% c #BECAD4", "U% c #C1CDD7", "V% c #C6CFD9", "W% c #CACDD8", "X% c #C4C7CF", "Y% c #B8BEC3", "Z% c #AFBAB9", "`% c #B3C3BA", " & c #B8C5BB", ".& c #BBC0BC", "+& c #BEBCBD", "@& c #BDBEC2", "#& c #C1C2BE", "$& c #B9B9BE", "%& c #1F00AB", "&& c #270BAA", "*& c #4730AD", "=& c #9B8EBD", "-& c #C4BFC4", ";& c #C8C7C2", ">& c #C0BFC0", ",& c #C1BFC0", "'& c #B5B2B2", ")& c #878588", "!& c #767277", "~& c #6E696D", "{& c #6C6769", "]& c #696667", "^& c #5E5E63", "/& c #55545D", "(& c #534D57", "_& c #554C57", ":& c #5D5964", "<& c #635E67", "[& c #645C63", "}& c #60575E", "|& c #58535C", "1& c #57505A", "2& c #5A4F57", "3& c #5E4F57", "4& c #58515A", "5& c #544E56", "6& c #53474F", "7& c #55454B", "8& c #594F57", "9& c #5D515F", "0& c #604D61", "a& c #604A5F", "b& c #5D545B", "c& c #5F5C5D", "d& c #646164", "e& c #6B656C", "f& c #6F6971", "g& c #7F7C82", "h& c #979699", "i& c #ADAEAE", "j& c #B7B5B5", "k& c #BEBCBB", "l& c #C4C4C4", "m& c #C3C1C0", "n& c #BDBDBE", "o& c #BAB9BD", "p& c #B6B7BC", "q& c #B1B7BD", "r& c #B2BBC2", "s& c #B6C1C9", "t& c #BAC5CF", "u& c #B8C3CE", "v& c #B9C5D0", "w& c #C2CFD8", "x& c #C4D0D9", "y& c #C3CFD8", "z& c #C2CFD7", "A& c #C0CDD6", "B& c #C1CED7", "C& c #C4CFD9", "D& c #C3CDD8", "E& c #C2CAD3", "F& c #C1C9CC", "G& c #BEC9C7", "H& c #B8CAC6", "I& c #B5C5C3", "J& c #B6BDBD", "K& c #B9B8BA", "L& c #BDBCBE", "M& c #C0BFBB", "N& c #C1BFBB", "O& c #BDC2C0", "P& c #BAB9BE", "Q& c #2000AF", "R& c #270CA9", "S& c #4731AB", "T& c #9C8EBD", "U& c #C5BEC5", "V& c #C8C7C3", "W& c #BBB9BE", "X& c #B4B3B9", "Y& c #ADAAAB", "Z& c #999595", "`& c #7E7879", " * c #60585D", ".* c #433B48", "+* c #3C3441", "@* c #453E44", "#* c #504A4C", "$* c #4D4C54", "%* c #484752", "&* c #46414D", "** c #4B424D", "=* c #5F5963", "-* c #686570", ";* c #656772", ">* c #5D626D", ",* c #555863", "'* c #53535F", ")* c #565561", "!* c #5B5863", "~* c #5D5965", "{* c #59535F", "]* c #524C58", "^* c #4E4954", "/* c #57555E", "(* c #5B5062", "_* c #573E5D", ":* c #503053", "<* c #443A47", "[* c #403F43", "}* c #424046", "|* c #47404C", "1* c #46404D", "2* c #57535D", "3* c #727177", "4* c #8E8D8F", "5* c #9B9798", "6* c #A4A1A0", "7* c #ABAAAA", "8* c #B2B2B2", "9* c #B9B9B7", "0* c #BDBDBB", "a* c #B6B8B9", "b* c #B1B5B9", "c* c #B1BAC1", "d* c #C0CBD5", "e* c #C0CED6", "f* c #BBC9D3", "g* c #BECBD2", "h* c #C7D1D3", "i* c #CBD5D4", "j* c #BDCED3", "k* c #B4C4CB", "l* c #B2BABF", "m* c #B3B4B7", "n* c #B9BABB", "o* c #BDBEBD", "p* c #C2C0BA", "q* c #C1C1BB", "r* c #BCC4C1", "s* c #C2C2BE", "t* c #7E73B9", "u* c #1600B1", "v* c #1F00AE", "w* c #270BA9", "x* c #4731AA", "y* c #998FBB", "z* c #C2BFC3", "A* c #C7C7C2", "B* c #BCBFBF", "C* c #C5C1C0", "D* c #CEC4C3", "E* c #C4BBBD", "F* c #AAA6AD", "G* c #888B93", "H* c #66686E", "I* c #575154", "J* c #554545", "K* c #523B41", "L* c #392A46", "M* c #37304E", "N* c #484558", "O* c #5C5D63", "P* c #61676E", "Q* c #646770", "R* c #6A656E", "S* c #746973", "T* c #87848E", "U* c #9496A1", "V* c #999EA9", "W* c #99A0AC", "X* c #999EAA", "Y* c #979CA8", "Z* c #959CA6", "`* c #959CA5", " = c #989BA7", ".= c #979AA6", "+= c #9597A4", "@= c #9396A2", "#= c #979BA6", "$= c #9799A6", "%= c #9292A3", "&= c #8C8B9C", "*= c #868793", "== c #83868E", "-= c #7F838C", ";= c #777A84", ">= c #63646E", ",= c #54525C", "'= c #4B474F", ")= c #494348", "!= c #4E464C", "~= c #544D53", "{= c #5E5A5E", "]= c #717173", "^= c #999E97", "/= c #B3B8B0", "(= c #BEC1BD", "_= c #C1C0BF", ":= c #BBBCBD", "<= c #ACB8BC", "[= c #B7C4CB", "}= c #C0CCD5", "|= c #C1CFD7", "1= c #BCC9D3", "2= c #BBC8D2", "3= c #BECAD2", "4= c #C0CDD3", "5= c #BCCBD4", "6= c #B5C3CD", "7= c #ABB1B7", "8= c #B9B9BA", "9= c #C0BEBC", "0= c #C1BEBB", "a= c #BDBFC3", "b= c #C6C6C5", "c= c #C7C7C6", "d= c #C7C9C8", "e= c #C5CBCA", "f= c #C2CBCA", "g= c #C1C5C4", "h= c #C0C1C0", "i= c #270AAB", "j= c #4731AC", "k= c #9992BC", "l= c #C2C2C3", "m= c #BFC1C2", "n= c #BCB8B8", "o= c #B9AEAF", "p= c #A69A9F", "q= c #857F88", "r= c #605F6A", "s= c #3C3C47", "t= c #332B31", "u= c #3A272B", "v= c #422830", "w= c #31213E", "x= c #3D3656", "y= c #5C5C71", "z= c #797D86", "A= c #777F87", "B= c #7A7E86", "C= c #848189", "D= c #918B94", "E= c #A0A1AB", "F= c #ACB2BD", "G= c #B6BECA", "H= c #B2B9C5", "I= c #B0B9C4", "J= c #B1BCC5", "K= c #B4BFC8", "L= c #B6BFCA", "M= c #B6BECB", "N= c #B6BDCA", "O= c #B5BFCA", "P= c #B3C1C9", "Q= c #AFBFC5", "R= c #ABB4BD", "S= c #A8AFB9", "T= c #A4ADB5", "U= c #9AA4AC", "V= c #848B94", "W= c #6C6F78", "X= c #58575E", "Y= c #4A464B", "Z= c #49464D", "`= c #45424A", " - c #4C4C4E", ".- c #727872", "+- c #969C95", "@- c #B1B4B1", "#- c #BDBCBC", "$- c #B8BBBC", "%- c #B3BBBF", "&- c #B1C0C5", "*- c #BDCAD1", "=- c #C4D1DA", "-- c #C5D1D9", ";- c #C2D0D8", ">- c #BDC9D3", ",- c #BECAD5", "'- c #BAC6D0", ")- c #B3BFC8", "!- c #AEB7BE", "~- c #B0B4B8", "{- c #BAB7B7", "]- c #BEBAB9", "^- c #C1C1C0", "/- c #C2C1BF", "(- c #C2C0C0", "_- c #C1BFC2", ":- c #C0BFC3", "<- c #BFBFC1", "[- c #BCBDBF", "}- c #AEAFB1", "|- c #ABABAC", "1- c #A9AAAC", "2- c #A8AEB0", "3- c #ACB3B4", "4- c #B5B8B8", "5- c #C2C3C2", "6- c #2709AD", "7- c #4731AF", "8- c #9B94BF", "9- c #C4C6C5", "0- c #C8CAC2", "a- c #B4B4B4", "b- c #A3A2A4", "c- c #8B848A", "d- c #726871", "e- c #584F5B", "f- c #413A48", "g- c #302A37", "h- c #2C222D", "i- c #31212B", "j- c #37242F", "k- c #302337", "l- c #4A4459", "m- c #757586", "n- c #979CA6", "o- c #898E98", "p- c #858A92", "q- c #8F9199", "r- c #9C9FA7", "s- c #A8AEB6", "t- c #B0B9C3", "u- c #B4BECA", "v- c #B4BDCA", "w- c #A8B1BB", "x- c #A6B1BA", "y- c #ADB9C3", "z- c #B5C2CD", "A- c #B6C4CC", "B- c #B7C3CC", "C- c #B6C2CD", "D- c #B6C0CE", "E- c #B5BFCD", "F- c #B6C6CD", "G- c #B3C5CA", "H- c #ACB9C1", "I- c #A9B5BE", "J- c #AAB5BE", "K- c #A9B5BB", "L- c #9EAAB2", "M- c #919BA2", "N- c #848B90", "O- c #7A7E83", "P- c #787E86", "Q- c #696E76", "R- c #54565C", "S- c #474749", "T- c #525453", "U- c #717372", "V- c #989A9A", "W- c #B9BBBB", "X- c #B8B9BB", "Y- c #B6B6B8", "Z- c #B7BABD", "`- c #B9C1C7", " ; c #C1CDD5", ".; c #C6D0D9", "+; c #C6D1DA", "@; c #C1CDD6", "#; c #C0CCD6", "$; c #C6D0DA", "%; c #C5CFDA", "&; c #C6CFDA", "*; c #C5D0D8", "=; c #BFCCD6", "-; c #C0CBD6", ";; c #C1CCD7", ">; c #BDC8D1", ",; c #B8C2CA", "'; c #B4B8BD", "); c #B3B2B4", "!; c #B4B1B0", "~; c #B7B3B2", "{; c #C3C1BF", "]; c #C2C0C1", "^; c #C0C0C2", "/; c #BEBEC2", "(; c #BBBDC3", "_; c #ACAFB6", ":; c #9699A0", "<; c #82848B", "[; c #797A80", "}; c #76767D", "|; c #7A7A81", "1; c #85868B", "2; c #9B9C9E", "3; c #AFAFB0", "4; c #BBB9BF", "5; c #A5A0BC", "6; c #2708AD", "7; c #4730B0", "8; c #9D95C1", "9; c #C9CBC2", "0; c #B4B3B2", "a; c #9C9C9D", "b; c #7D7D81", "c; c #5B5861", "d; c #423C47", "e; c #342A37", "f; c #2F2430", "g; c #342935", "h; c #372D39", "i; c #392F3C", "j; c #413945", "k; c #5F5A66", "l; c #888893", "m; c #A4AAB4", "n; c #9398A3", "o; c #8C929C", "p; c #9199A2", "q; c #9BA5AD", "r; c #A5AFB6", "s; c #AAB5C0", "t; c #A5B0BC", "u; c #97A2AB", "v; c #96A1A9", "w; c #9EA9B4", "x; c #A9B4C1", "y; c #AAB8C1", "z; c #AAB8C0", "A; c #A9B6C0", "B; c #A9B5C2", "C; c #A9B5C1", "D; c #A7B4BE", "E; c #A3B1B8", "F; c #98A7AE", "G; c #97A5AD", "H; c #9FAAB2", "I; c #A9B4BB", "J; c #AEBCC4", "K; c #B1BFC6", "L; c #B1BEC2", "M; c #AEBABE", "N; c #ACBBC3", "O; c #99A6AD", "P; c #7B8286", "Q; c #5B5C5E", "R; c #434145", "S; c #4F4E53", "T; c #747579", "U; c #9FA1A3", "V; c #B4B3B6", "W; c #BEBCBF", "X; c #BCBBBC", "Y; c #B0B1B4", "Z; c #B8BCC1", "`; c #C0C8D0", " > c #C6D1DB", ".> c #C4CFD7", "+> c #C2CED6", "@> c #C5CED9", "#> c #C2CDD6", "$> c #C0CBD4", "%> c #C0CAD3", "&> c #C0C9D3", "*> c #C1CBD4", "=> c #BAC6CF", "-> c #B8C4CE", ";> c #BDC8D2", ">> c #BFC9D3", ",> c #BEC8D0", "'> c #BEC8D1", ")> c #C1CBD6", "!> c #C2CCD4", "~> c #BAC0C5", "{> c #B5B7B9", "]> c #B3B2B2", "^> c #BBBABD", "/> c #BABABB", "(> c #BAB8B7", "_> c #BBBBBB", ":> c #C0BFC1", "<> c #B8B8BE", "[> c #A7A9B3", "}> c #8C8F9B", "|> c #6F717D", "1> c #575863", "2> c #4F5059", "3> c #4E4D55", "4> c #544F59", "5> c #605B65", "6> c #77767B", "7> c #8F8F92", "8> c #A5A4A6", "9> c #B5B4B5", "0> c #BABBBB", "a> c #BDBEC0", "b> c #C4C2C1", "c> c #BCB9C0", "d> c #A5A0BD", "e> c #4731AD", "f> c #9D90BF", "g> c #C6C1C6", "h> c #C9C7C3", "i> c #B7B6B1", "j> c #979593", "k> c #6C676C", "l> c #47404A", "m> c #403B44", "n> c #3A343B", "o> c #34292F", "p> c #41373A", "q> c #4E474A", "r> c #5B565D", "s> c #686572", "t> c #79758B", "u> c #7E7E94", "v> c #7C8391", "w> c #7D8991", "x> c #8F9BA6", "y> c #929DA9", "z> c #8C95A0", "A> c #8A939A", "B> c #9DA7AE", "C> c #A4AEB7", "D> c #A0ACB5", "E> c #9CA8B1", "F> c #9EACB3", "G> c #9DAAB1", "H> c #99A5AE", "I> c #97A3AD", "J> c #9EACB4", "K> c #A1B0B8", "L> c #A1AFB9", "M> c #A6B4BE", "N> c #9FACB6", "O> c #8F9AA3", "P> c #7F8991", "Q> c #76838B", "R> c #7A868E", "S> c #869199", "T> c #97A2A9", "U> c #A8B6BD", "V> c #B0BFC5", "W> c #B1BDC6", "X> c #AEB9C4", "Y> c #AEBCC5", "Z> c #AAB9BE", "`> c #9EAAAD", " , c #878D90", "., c #58555C", "+, c #403B43", "@, c #434047", "#, c #5D5D63", "$, c #97909D", "%, c #B9B0BD", "&, c #C3BFC5", "*, c #BFC0BE", "=, c #B7B7B7", "-, c #A9A9AA", ";, c #A2A3A5", ">, c #B3BABE", ",, c #BFC9CF", "', c #C5D1DA", "), c #C7D2DC", "!, c #C7D1DC", "~, c #C1CCD5", "{, c #B9C3CC", "], c #B0B8C2", "^, c #ABB1BB", "/, c #ADB6BB", "(, c #ACB7BB", "_, c #A8B3BA", ":, c #AAB6BF", "<, c #A9B6BF", "[, c #A6B3BC", "}, c #A4B2BA", "|, c #A9B6BE", "1, c #ABB7BF", "2, c #A7B1B9", "3, c #A9B2BC", "4, c #ACB6C2", "5, c #B3BECA", "6, c #C4D2D9", "7, c #C7D4DC", "8, c #C9D5DE", "9, c #CAD4DE", "0, c #C9D3DD", "a, c #C5D2DC", "b, c #C2D0DA", "c, c #C1CBD2", "d, c #BFC6CD", "e, c #BDC2C8", "f, c #BFC0C3", "g, c #C0C0C1", "h, c #C4C2C2", "i, c #C6C3C3", "j, c #C6C5C4", "k, c #C4CAC9", "l, c #C3CACA", "m, c #C2C6C7", "n, c #B2B4B6", "o, c #A6A9AE", "p, c #9C9FA6", "q, c #9D979D", "r, c #9C9399", "s, c #9C9398", "t, c #9B959A", "u, c #9B999B", "v, c #9A9C9F", "w, c #9C9EA3", "x, c #A1A3AA", "y, c #AEB1B2", "z, c #BBBCBE", "A, c #C7C4C9", "B, c #CFC8D1", "C, c #CDC5CF", "D, c #C9C4CB", "E, c #C7C4C7", "F, c #C5C5C4", "G, c #C0C2C1", "H, c #A9AAAE", "I, c #72737D", "J, c #4E4D5A", "K, c #413C49", "L, c #413C46", "M, c #57565C", "N, c #59545D", "O, c #544E58", "P, c #464249", "Q, c #48474C", "R, c #5B5A60", "S, c #7A7A7F", "T, c #A4A5A7", "U, c #BCBDBE", "V, c #C4C5C4", "W, c #BFBFC2", "X, c #BBC2C4", "Y, c #A5A0BE", "Z, c #C4BFC5", "`, c #C7C7C3", " ' c #959691", ".' c #6D6B6A", "+' c #473F47", "@' c #2E2331", "#' c #352C37", "$' c #352E35", "%' c #31292D", "&' c #31292B", "*' c #423B3D", "=' c #595558", "-' c #707077", ";' c #828693", ">' c #8D8EA5", ",' c #898AA1", "'' c #7E8192", ")' c #79808C", "!' c #8F98A9", "~' c #959EB0", "{' c #8F99A5", "]' c #8C959C", "^' c #9BA4AC", "/' c #9EA8B0", "(' c #99A4AC", "_' c #95A1A8", ":' c #A0ADB4", "<' c #A1AEB5", "[' c #9CA6AE", "}' c #969FA7", "|' c #99A3AA", "1' c #9CA7AE", "2' c #9CA9B0", "3' c #9BA8B0", "4' c #97A3AC", "5' c #8B959E", "6' c #7B838C", "7' c #6E767F", "8' c #6E7981", "9' c #75818A", "0' c #828D96", "a' c #929DA7", "b' c #A4B2B9", "c' c #ADBBC3", "d' c #AEBAC5", "e' c #ABB7C4", "f' c #ACBAC4", "g' c #AFBFC4", "h' c #AEBDC0", "i' c #A2ACB0", "j' c #7D7D86", "k' c #56535D", "l' c #3C3A43", "m' c #3E3C44", "n' c #776D7E", "o' c #9F95A5", "p' c #B3AFB6", "q' c #BCBDBC", "r' c #B5B4B4", "s' c #A0A0A2", "t' c #96989C", "u' c #B3BBC2", "v' c #C6D3DB", "w' c #BFCCD4", "x' c #BDCAD2", "y' c #B4BFC7", "z' c #AEB6C0", "A' c #AAB0BA", "B' c #ACB5BA", "C' c #ABB6BA", "D' c #A9B4BA", "E' c #A7B3BB", "F' c #AAB7BE", "G' c #A8B6BE", "H' c #A5B3BB", "I' c #A3B0B9", "J' c #A8B5BD", "K' c #A9B4BC", "L' c #A6B1B8", "M' c #ABB6C1", "N' c #B2BEC9", "O' c #BDCAD4", "P' c #C3D1D9", "Q' c #C1CED5", "R' c #B6C1CA", "S' c #B6C1CB", "T' c #B0BBC4", "U' c #BECAD3", "V' c #C3CDD5", "W' c #BCC1C3", "X' c #BABABA", "Y' c #BCBCBE", "Z' c #C3C1C3", "`' c #C3C0C4", " ) c #BAB8BC", ".) c #B5B3B4", "+) c #B0B0AF", "@) c #ACB2B2", "#) c #A6ADAE", "$) c #9FA2A5", "%) c #98979C", "&) c #919195", "*) c #87888E", "=) c #7C7D86", "-) c #74747E", ";) c #756F78", ">) c #766D76", ",) c #776E76", "') c #787078", ")) c #76757B", "!) c #75777E", "~) c #767881", "{) c #7B7C86", "]) c #87878C", "^) c #939197", "/) c #9E99A2", "() c #A89FAC", "_) c #AEA4B1", ":) c #AFA8B2", "<) c #AFACB1", "[) c #B0B1B2", "}) c #B6B6B6", "|) c #C5C3C2", "1) c #A8A9A9", "2) c #85878A", "3) c #4D4D56", "4) c #3A3743", "5) c #5C5862", "6) c #6C6C73", "7) c #74767C", "8) c #74747C", "9) c #6B6972", "0) c #52525B", "a) c #474851", "b) c #4B4C54", "c) c #5B5C63", "d) c #76797E", "e) c #929396", "f) c #AAA9AB", "g) c #BBB8BA", "h) c #C0BEC3", "i) c #C2BFC4", "j) c #C1BEC1", "k) c #C4C2C0", "l) c #A4A0BE", "m) c #2001B0", "n) c #4730AE", "o) c #998FBD", "p) c #C5CAC4", "q) c #C1BFBA", "r) c #C2C0C3", "s) c #9C9D9D", "t) c #676866", "u) c #434142", "v) c #312A33", "w) c #2D2130", "x) c #332936", "y) c #312831", "z) c #2B2328", "A) c #2A2427", "B) c #3C383D", "C) c #595A61", "D) c #777D87", "E) c #8B94A0", "F) c #818696", "G) c #808091", "H) c #878495", "I) c #918C9E", "J) c #9494AC", "K) c #969BB1", "L) c #98A1AF", "M) c #99A5AC", "N) c #9AA4AB", "O) c #949FA6", "P) c #929DA4", "Q) c #9BA7AE", "R) c #A0AAB3", "S) c #A0A8B1", "T) c #9EA3AC", "U) c #9A9EA3", "V) c #999FA3", "W) c #98A2A7", "X) c #939EA6", "Y) c #818992", "Z) c #747B84", "`) c #6E757E", " ! c #707880", ".! c #7A848C", "+! c #848F98", "@! c #8C98A4", "#! c #96A2AF", "$! c #A2B0B9", "%! c #A9B7BF", "&! c #ABB8C3", "*! c #AEBEC4", "=! c #AFBFC3", "-! c #ACB9BD", ";! c #A3A9B3", ">! c #81828E", ",! c #565560", "'! c #58515F", ")! c #79727E", "!! c #959399", "~! c #ADAEAF", "{! c #C2C1C2", "]! c #BDC1C2", "^! c #C5C3C1", "/! c #B4B3B3", "(! c #9A9B9F", "_! c #8E9299", ":! c #B1BAC2", "~ c #777D88", ",~ c #686D77", "'~ c #5A5E66", ")~ c #4A4C55", "!~ c #595960", "~~ c #7E7A80", "{~ c #A6A0A5", "]~ c #BCB6BE", "^~ c #C5BFC7", "/~ c #C4C0C4", "(~ c #BCC0C2", "_~ c #C1BFBC", ":~ c #C1BCC2", "<~ c #C2BEBE", "[~ c #C3C3C0", "}~ c #BAB9C1", "|~ c #2001AF", "1~ c #1F00AC", "2~ c #2709AC", "3~ c #472FB0", "4~ c #988FBC", "5~ c #C1C2C4", "6~ c #C4CCC5", "7~ c #BBC3C4", "8~ c #C2C1B9", "9~ c #C4C1C4", "0~ c #BAB8BB", "a~ c #7A7A7C", "b~ c #3F3E40", "c~ c #262227", "d~ c #29212A", "e~ c #352937", "f~ c #362A37", "g~ c #302430", "h~ c #281F27", "i~ c #272128", "j~ c #38343E", "k~ c #575A66", "l~ c #79818D", "m~ c #8A95A0", "n~ c #686E77", "o~ c #6C6B76", "p~ c #8D8595", "q~ c #AB9FB4", "r~ c #9C97B1", "s~ c #989BB2", "t~ c #9EA8B6", "u~ c #A3B2B8", "v~ c #9BA8AE", "w~ c #96A1A8", "x~ c #959FA7", "y~ c #9AA3AC", "z~ c #A1A7B1", "A~ c #A3A6B1", "B~ c #9B9BA2", "C~ c #95979D", "D~ c #90969D", "E~ c #879098", "F~ c #70757E", "G~ c #676C75", "H~ c #6D747C", "I~ c #7B848C", "J~ c #8C969F", "K~ c #96A1AB", "L~ c #99A5B2", "M~ c #9AA7B5", "N~ c #9EACB5", "O~ c #A4B1B9", "P~ c #A9B4BF", "Q~ c #ACB7C4", "R~ c #ACB9C3", "S~ c #ABBAC0", "T~ c #ABBABE", "U~ c #AEBCC1", "V~ c #A8AEB9", "W~ c #757881", "X~ c #47464E", "Y~ c #413C47", "Z~ c #544F58", "`~ c #737278", " { c #959799", ".{ c #AAABAC", "+{ c #B7B7B9", "@{ c #BFBCC0", "#{ c #BCC2C4", "${ c #B2B1B3", "%{ c #9999A0", "&{ c #8D919A", "*{ c #C7D3DA", "={ c #BDCAD3", "-{ c #BDC9D4", ";{ c #C2CCD6", ">{ c #C2CCD5", ",{ c #BCC7D0", "'{ c #ADBAC1", "){ c #A5B3BA", "!{ c #AEBAC2", "~{ c #C8D5DC", "{{ c #BAC6CD", "]{ c #A1ABB2", "^{ c #8A949C", "/{ c #89959E", "({ c #87929A", "_{ c #868C91", ":{ c #86888C", "<{ c #8A8C93", "[{ c #9B9FA8", "}{ c #BDC9D0", "|{ c #B1BCC1", "1{ c #ACB4B8", "2{ c #AFB3B6", "3{ c #B5B5B9", "4{ c #BBBBBF", "5{ c #BEBFC0", "6{ c #B9B4BC", "7{ c #B1AAB6", "8{ c #9B9AA5", "9{ c #7A7D83", "0{ c #707176", "a{ c #6B6D71", "b{ c #616066", "c{ c #524E57", "d{ c #46404C", "e{ c #42404E", "f{ c #444250", "g{ c #494550", "h{ c #4E4953", "i{ c #4F4F5A", "j{ c #54535F", "k{ c #585460", "l{ c #52505B", "m{ c #4B4A54", "n{ c #46414C", "o{ c #403642", "p{ c #342834", "q{ c #302834", "r{ c #36323F", "s{ c #43434F", "t{ c #57545E", "u{ c #615E68", "v{ c #62636D", "w{ c #62656F", "x{ c #626369", "y{ c #929397", "z{ c #B0B0B4", "A{ c #BDBBBF", "B{ c #BDC0BD", "C{ c #B8BABB", "D{ c #939498", "E{ c #605F66", "F{ c #3B3942", "G{ c #4A4A53", "H{ c #71747D", "I{ c #9EA4AE", "J{ c #BEC7D3", "K{ c #B0BCC8", "L{ c #B2BFC8", "M{ c #B7C3CE", "N{ c #ABB6C2", "O{ c #919CA6", "P{ c #3C3F4A", "Q{ c #383541", "R{ c #58505B", "S{ c #867C85", "T{ c #ACA1AD", "U{ c #BFB7C0", "V{ c #C3BFC2", "W{ c #BCC1C4", "X{ c #C2BCC4", "Y{ c #270AAC", "Z{ c #9B8EBF", "`{ c #C8C8C5", " ] c #C0BDC4", ".] c #C1BDC5", "+] c #C2BFBD", "@] c #C7C3C3", "#] c #ABA7A8", "$] c #7A767A", "%] c #4A454B", "&] c #342E30", "*] c #2D252A", "=] c #2F252F", "-] c #352B33", ";] c #32272E", ">] c #2F252E", ",] c #312834", "'] c #3C3642", ")] c #5B5964", "!] c #7C7F89", "~] c #888E97", "{] c #51535E", "]] c #80818C", "^] c #ADB1BD", "/] c #ABB3C0", "(] c #A2ADBA", "_] c #99A7AF", ":] c #91A0A5", "<] c #8D9AA2", "[] c #939FA7", "}] c #9DA9B1", "|] c #A1AFB6", "1] c #94A0AA", "2] c #8E99A3", "3] c #9099A3", "4] c #959BA6", "5] c #9999AD", "6] c #8F8FA3", "7] c #7E808F", "8] c #6F757E", "9] c #6F7780", "0] c #757F88", "a] c #808A92", "b] c #8C969E", "c] c #95A1AD", "d] c #98A4B1", "e] c #97A2AD", "f] c #939EA7", "g] c #909DA4", "h] c #96A3AB", "i] c #A2AEB9", "j] c #ADB7C5", "k] c #ABB8C1", "l] c #A9B7BE", "m] c #AAB8BC", "n] c #ACBBBF", "o] c #BAC9CE", "p] c #A7B2B8", "q] c #7D8289", "r] c #515059", "s] c #3C343F", "t] c #423A45", "u] c #58555E", "v] c #70747A", "w] c #797C83", "x] c #8F9198", "y] c #ADADB2", "z] c #C4C2C7", "A] c #C0C1C6", "B] c #B0B0B3", "C] c #9D9DA0", "D] c #95979C", "E] c #B4BCC2", "F] c #C2CCD7", "G] c #C0CCD4", "H] c #AFBAC2", "I] c #A9B3BB", "J] c #AEBAC1", "K] c #B8C3CC", "L] c #BBC6D0", "M] c #BFCBD3", "N] c #C4D2DA", "O] c #B0BCC2", "P] c #B1BDC5", "Q] c #ADB9C1", "R] c #A4AFB5", "S] c #98A1A4", "T] c #87898D", "U] c #878A8F", "V] c #959EA3", "W] c #A9B6BA", "X] c #BDC2C9", "Y] c #C1C1C8", "Z] c #BABABF", "`] c #B3B5B7", " ^ c #B8BEBF", ".^ c #BEC1C1", "+^ c #C3C2C1", "@^ c #C7C6C5", "#^ c #C5C5C6", "$^ c #B6B9BD", "%^ c #9FA0A8", "&^ c #85848D", "*^ c #6F6B75", "=^ c #65636C", "-^ c #686871", ";^ c #73747D", ">^ c #7E8089", ",^ c #83848C", "'^ c #86878F", ")^ c #8A8A94", "!^ c #8C8D9A", "~^ c #8E95A3", "{^ c #929CA8", "]^ c #96A0AA", "^^ c #97A1A8", "/^ c #949EA6", "(^ c #9499A4", "_^ c #9691A1", ":^ c #938798", "<^ c #847C87", "[^ c #736D76", "}^ c #514A55", "|^ c #3B363D", "1^ c #48454C", "2^ c #686972", "3^ c #858793", "4^ c #7F808A", "5^ c #73747F", "6^ c #676974", "7^ c #595B65", "8^ c #48444D", "9^ c #4B464E", "0^ c #625F66", "a^ c #85858C", "b^ c #B3B2B7", "c^ c #CDCCD0", "d^ c #D1D1D2", "e^ c #909292", "f^ c #656468", "g^ c #49444D", "h^ c #48434E", "i^ c #7C808C", "j^ c #9FA8B4", "k^ c #AEB9C2", "l^ c #B2BCC5", "m^ c #AFBAC7", "n^ c #AEB9C6", "o^ c #B0BAC3", "p^ c #ACB8C2", "q^ c #A4B0BB", "r^ c #96A1AC", "s^ c #818691", "t^ c #676670", "u^ c #524C56", "v^ c #524751", "w^ c #80747E", "x^ c #A39AA2", "y^ c #B8B4B7", "z^ c #C0BDBD", "A^ c #BFBEBC", "B^ c #C0BEBB", "C^ c #BDC1C3", "D^ c #9C8DBF", "E^ c #C6BEC6", "F^ c #C8C7C6", "G^ c #C1BBC3", "H^ c #C2BBC4", "I^ c #C1BFC3", "J^ c #BFBCC1", "K^ c #B8B6B7", "L^ c #908E90", "M^ c #595559", "N^ c #2C252C", "O^ c #2E262B", "P^ c #33292F", "Q^ c #342932", "R^ c #332833", "S^ c #30272C", "T^ c #2E2529", "U^ c #30262D", "V^ c #392E38", "W^ c #4F454F", "X^ c #67616C", "Y^ c #777884", "Z^ c #767B87", "`^ c #494B57", " / c #4A4A55", "./ c #9299A0", "+/ c #98A5AD", "@/ c #93A2A9", "#/ c #8E9BA4", "$/ c #8B95A4", "%/ c #909AA8", "&/ c #98A4AE", "*/ c #9CAAB1", "=/ c #8D99A2", "-/ c #89949D", ";/ c #88929C", ">/ c #8C91A7", ",/ c #83849C", "'/ c #737484", ")/ c #696D75", "!/ c #78828A", "~/ c #85929A", "{/ c #8F9BA2", "]/ c #95A0A8", "^/ c #99A6B2", "// c #99A6B3", "(/ c #97A2AE", "_/ c #929DA6", ":/ c #8C99A1", "( c #A7B2BD", ",( c #AEB9C0", "'( c #ACB7C2", ")( c #AAB5BC", "!( c #AAB6BC", "~( c #ACB7BF", "{( c #AEB8C2", "]( c #ADB6C1", "^( c #A9AFB8", "/( c #8E919A", "(( c #6B6974", "_( c #544F5A", ":( c #69616B", "<( c #89838A", "[( c #AAA7AB", "}( c #C5BFC6", "|( c #C7C9C6", "1( c #C0BCC0", "2( c #C4BEC6", "3( c #BCB6BF", "4( c #9D9DA3", "5( c #6F6F75", "6( c #403D43", "7( c #211A20", "8( c #2C232B", "9( c #342933", "0( c #352A32", "a( c #31282D", "b( c #2A2326", "c( c #271F23", "d( c #2C2327", "e( c #3D3238", "f( c #665A61", "g( c #746E79", "h( c #6C6F7E", "i( c #5A6474", "j( c #4B4F5B", "k( c #56545D", "l( c #67666F", "m( c #757981", "n( c #828C94", "o( c #94A1AF", "p( c #9298AE", "q( c #8E93A8", "r( c #8B95A3", "s( c #8C9AA1", "t( c #949FA7", "u( c #929DA5", "v( c #88949C", "w( c #7E8A93", "x( c #7A8494", "y( c #757B8B", "z( c #707380", "A( c #72747D", "B( c #848D94", "C( c #909CA3", "D( c #95A2A9", "E( c #97A4AC", "F( c #98A6AF", "G( c #98A6B1", "H( c #96A3AF", "I( c #92A0A9", "J( c #98A6AE", "K( c #B0BEC2", "L( c #B6C4BF", "M( c #B8C7C0", "N( c #B6C3C3", "O( c #ADB9C0", "P( c #9DA6AE", "Q( c #7F848B", "R( c #5A5B63", "S( c #39373F", "T( c #2A2633", "U( c #2F2732", "V( c #403138", "W( c #4F3D42", "X( c #433A44", "Y( c #5C5964", "Z( c #8C8D93", "`( c #B9BABC", " _ c #C1C0BE", "._ c #BCBABA", "+_ c #A9A9AC", "@_ c #9C9FA2", "#_ c #989EA1", "$_ c #B7C2C7", "%_ c #C2CDD5", "&_ c #B5C2C7", "*_ c #ADBAC0", "=_ c #ACB8C1", "-_ c #B1BCC7", ";_ c #BBC8D0", ">_ c #BFCCD5", ",_ c #C7D1DA", "'_ c #C8D3DB", ")_ c #BBC8CE", "!_ c #B1BBC2", "~_ c #A7AEB3", "{_ c #9FA5A8", "]_ c #9FA5A7", "^_ c #B0B6BD", "/_ c #BABEC5", "(_ c #BCBDC3", "__ c #BCBEC2", ":_ c #BDC0C2", "<_ c #C3C0BE", "[_ c #AFACAC", "}_ c #8E8C8F", "|_ c #676972", "1_ c #676B76", "2_ c #6D737E", "3_ c #757E88", "4_ c #7F8990", "5_ c #8E979F", "6_ c #9EA7AF", "7_ c #AAB4BC", "8_ c #AEB8BE", "9_ c #A5AEB4", "0_ c #949AA2", "a_ c #80848F", "b_ c #74747F", "c_ c #696A75", "d_ c #5E626D", "e_ c #565B65", "f_ c #4F5157", "g_ c #515057", "h_ c #5E5867", "i_ c #5A515D", "j_ c #59515A", "k_ c #5A555D", "l_ c #53535A", "m_ c #6B6E76", "n_ c #939AA5", "o_ c #B4BDC9", "p_ c #AAB2BC", "q_ c #959FA6", "r_ c #8D979E", "s_ c #8B8D98", "t_ c #6E6D79", "u_ c #4A4952", "v_ c #393840", "w_ c #64646B", "x_ c #7C7C82", "y_ c #7C7C80", "z_ c #69686B", "A_ c #414143", "B_ c #2C2A2D", "C_ c #2E2B2F", "D_ c #434046", "E_ c #6E717B", "F_ c #9097A2", "G_ c #A5AFB8", "H_ c #ACB9C0", "I_ c #AAB8BE", "J_ c #AAB7BC", "K_ c #B2B9C0", "L_ c #B4B9C0", "M_ c #B2B8BF", "N_ c #A5ACB5", "O_ c #9197A3", "P_ c #7C808D", "Q_ c #696974", "R_ c #78777F", "S_ c #9D9CA0", "T_ c #2709AB", "U_ c #9C8EBF", "V_ c #C4C1C6", "W_ c #C6CBC6", "X_ c #C3C1C6", "Y_ c #C6BFC8", "Z_ c #B8AFBB", "`_ c #7F7E89", " : c #302D34", ".: c #221B21", "+: c #2D242F", "@: c #30282B", "#: c #262025", "$: c #211B22", "%: c #271F26", "&: c #3D343B", "*: c #746B72", "=: c #7C7A84", "-: c #626878", ";: c #455063", ">: c #4F535F", ",: c #4D4A52", "': c #423B44", "): c #3E3642", "!: c #52515B", "~: c #6E747E", "{: c #88939F", "]: c #9AA6B6", "^: c #9699B2", "/: c #8C8EA6", "(: c #828999", "_: c #7F8C94", ":: c #929CA4", "<: c #939DA4", "[: c #869299", "}: c #75828A", "|: c #6D7A81", "1: c #6E777F", "2: c #757984", "3: c #80818D", "4: c #899099", "5: c #919AA3", "6: c #95A1A9", "7: c #939FA6", "8: c #939FA8", "9: c #96A2AE", "0: c #9DABB5", "a: c #A0AFB6", "b: c #A4B2B7", "c: c #A7B5B6", "d: c #ACBAAF", "e: c #B1BFB5", "f: c #B1BFBE", "g: c #858792", "h: c #62616B", "i: c #45434C", "j: c #303038", "k: c #2B2D39", "l: c #322C36", "m: c #3F2C31", "n: c #482D2F", "o: c #3C2C35", "p: c #504953", "q: c #797980", "r: c #A4A6A8", "s: c #C2C0BE", "t: c #BBB9B8", "u: c #A0A0A0", "v: c #919495", "w: c #90979A", "x: c #9AA6AA", "y: c #B5C0C7", "z: c #BBC6CE", "A: c #AFBDC1", "B: c #B4C1CB", "C: c #BDCAD5", "D: c #C5CED8", "E: c #C8D5DD", "F: c #B4B9BD", "G: c #A7AAAD", "H: c #A3ADB3", "I: c #B5BAC1", "J: c #B0ADAD", "K: c #949193", "L: c #6F6E73", "M: c #52535B", "N: c #555760", "O: c #666C77", "P: c #7F8A95", "Q: c #A5B4BD", "R: c #A4AEB1", "S: c #90989C", "T: c #72787F", "U: c #565661", "V: c #48414B", "W: c #3B343F", "X: c #312D38", "Y: c #2B2935", "Z: c #2A252D", "`: c #302C33", " < c #393842", ".< c #444451", "+< c #484450", "@< c #514C57", "#< c #5D5B64", "$< c #676A71", "%< c #7B818C", "&< c #97A0AC", "*< c #AEBAC6", "=< c #AEB8C1", "-< c #ABB7BE", ";< c #ABB9C1", ">< c #B7C0CB", ",< c #9599A3", "'< c #595A62", ")< c #2A2930", "!< c #3E3D45", "~< c #48474E", "{< c #444348", "]< c #3A383C", "^< c #2B282D", "/< c #2A282C", "(< c #343436", "_< c #434447", ":< c #4E5057", "<< c #686C75", "[< c #8A919A", "}< c #A6B0B8", "|< c #ACB9BE", "1< c #ADBBBF", "2< c #ABB9BE", "3< c #ABBBC2", "4< c #B3B4B8", "5< c #ADB4BA", "6< c #AFBAC3", "7< c #B2BECA", "8< c #A8B4C1", "9< c #7A818D", "0< c #767983", "a< c #92949A", "b< c #B4B5B7", "c< c #2809AB", "d< c #4630B0", "e< c #9694BF", "f< c #BFC6C4", "g< c #C6CBC2", "h< c #BAC2C3", "i< c #C3C6C8", "j< c #C9C2C5", "k< c #B8A9AF", "l< c #685F6A", "m< c #3A3240", "n< c #2C2430", "o< c #2E242F", "p< c #31282E", "q< c #342931", "r< c #312933", "s< c #2A272F", "t< c #231F2E", "u< c #241C35", "v< c #342C49", "w< c #676A79", "x< c #636772", "y< c #4D4C5A", "z< c #4D4954", "A< c #423C48", "B< c #342F3B", "C< c #322F3B", "D< c #51515D", "E< c #6D737C", "F< c #818D94", "G< c #8C9BA2", "H< c #8B92A0", "I< c #8C92A1", "J< c #8E97A5", "K< c #8E9CA7", "L< c #8B98A0", "M< c #828D95", "N< c #768088", "O< c #6D767E", "P< c #6F757C", "Q< c #797B87", "R< c #858499", "S< c #8B8AA2", "T< c #7C7F8E", "U< c #818790", "V< c #909AA2", "W< c #9AA7AE", "X< c #868C95", "Y< c #8E97A0", "Z< c #9BA8B2", "`< c #AAB9BF", " [ c #A9B8BC", ".[ c #9BA9AD", "+[ c #899598", "@[ c #7B8686", "#[ c #839090", "$[ c #93A0A4", "%[ c #5F5C67", "&[ c #433C48", "*[ c #3F3B46", "=[ c #44454F", "-[ c #433F46", ";[ c #3D3236", ">[ c #382A2C", ",[ c #3B3038", "'[ c #48404B", ")[ c #5D5963", "![ c #7B7980", "~[ c #A3A3A7", "{[ c #BCB9B8", "][ c #A3A29E", "^[ c #8C8C89", "/[ c #7F8181", "([ c #84898D", "_[ c #ADB7BD", ":[ c #CAD4DF", "<[ c #C1CFD6", "[[ c #B8C6CC", "}[ c #B0BCC4", "|[ c #B7C5CE", "1[ c #C1CED6", "2[ c #C2CDD7", "3[ c #C0CBD2", "4[ c #B6C0C6", "5[ c #A0ABB3", "6[ c #ADB7BF", "7[ c #BCC3C9", "8[ c #B9BBC0", "9[ c #B9B9BC", "0[ c #B5B6B6", "a[ c #9C9C9E", "b[ c #6C6B71", "c[ c #626067", "d[ c #747479", "e[ c #8D8F92", "f[ c #92999F", "g[ c #99A2AC", "h[ c #A2ADB9", "i[ c #B4C4CD", "j[ c #ABBABF", "k[ c #949EA2", "l[ c #787A7F", "m[ c #605C64", "n[ c #4C4852", "o[ c #3F3D49", "p[ c #3C3B48", "q[ c #46404B", "r[ c #514B55", "s[ c #5D5A64", "t[ c #6A6B76", "u[ c #787C87", "v[ c #838994", "w[ c #8B919C", "x[ c #9095A1", "y[ c #9295A1", "z[ c #9598A3", "A[ c #989DA7", "B[ c #99A2A8", "C[ c #97A3AB", "D[ c #A7B5BE", "E[ c #A9B5BD", "F[ c #AAB6BE", "G[ c #AEBDC4", "H[ c #BDC5D0", "I[ c #A2A6B1", "J[ c #6D6F78", "K[ c #3D3C44", "L[ c #38323D", "M[ c #372E38", "N[ c #342D33", "O[ c #342E32", "P[ c #372F37", "Q[ c #46414A", "R[ c #575961", "S[ c #5E646A", "T[ c #3E4147", "U[ c #3E3E45", "V[ c #5A5B62", "W[ c #81868D", "X[ c #A7B3B8", "Y[ c #B6C4CA", "Z[ c #B3C0C9", "`[ c #ABB5BC", " } c #ACB4BB", ".} c #ABB4BB", "+} c #ACB7C1", "@} c #ACB6C4", "#} c #9BA1AD", "$} c #91949E", "%} c #919399", "&} c #9B9CA0", "*} c #B5B5B8", "=} c #C4C4BC", "-} c #A5A1BB", ";} c #2809AC", ">} c #C7CAC1", ",} c #C1C6C5", "'} c #AC9FA1", ")} c #5A4D56", "!} c #302530", "~} c #2B202C", "{} c #332836", "]} c #2B2631", "^} c #2E2A3D", "/} c #3A3454", "(} c #4B456B", "_} c #5D6375", ":} c #5F676F", "<} c #56565E", "[} c #4A414C", "}} c #453C45", "|} c #39313B", "1} c #2C2834", "2} c #2D2D39", "3} c #51525C", "4} c #6F727D", "5} c #818896", "6} c #8A92A2", "7} c #858B95", "8} c #7E858C", "9} c #79818A", "0} c #77808A", "a} c #79868E", "b} c #707B83", "c} c #6E767D", "d} c #767A81", "e} c #848693", "f} c #9091A6", "g} c #8F90A8", "h} c #686A79", "i} c #61646E", "j} c #787A83", "k} c #737981", "l} c #7D868F", "m} c #9AA5AB", "n} c #98A4A8", "o} c #808A8D", "p} c #636A6E", "q} c #52585C", "r} c #5C6167", "s} c #6E757C", "t} c #737880", "u} c #423B46", "v} c #39313C", "w} c #4F4E59", "x} c #6B717A", "y} c #443E44", "z} c #2F262C", "A} c #3A313A", "B} c #473F4B", "C} c #58525C", "D} c #A09FA3", "E} c #B8B6B6", "F} c #9C9B97", "G} c #848481", "H} c #79797B", "I} c #818389", "J} c #ADB6BD", "K} c #BEC9D1", "L} c #BAC8CE", "M} c #B2C0C6", "N} c #ABB6BD", "O} c #BECBD5", "P} c #C2D0D9", "Q} c #9DAAB2", "R} c #B4BBBF", "S} c #B3B6B8", "T} c #BABAB9", "U} c #ABABAB", "V} c #969698", "W} c #7E7E83", "X} c #5E5F69", "Y} c #676872", "Z} c #898C93", "`} c #ADB2B6", " | c #B3BDC3", ".| c #B2BEC6", "+| c #ACB8C3", "@| c #A3AEBA", "#| c #848E95", "$| c #6A6F75", "%| c #514F55", "&| c #3D343E", "*| c #372F3B", "=| c #3E3A47", "-| c #62606B", ";| c #75747D", ">| c #868891", ",| c #A6B1BC", "'| c #B0BCC7", ")| c #B6BDC8", "!| c #B5BDC8", "~| c #B4BEC7", "{| c #B1BEC4", "]| c #AAB9C0", "^| c #A7B6BD", "/| c #A6B4BB", "(| c #B8C3CD", "_| c #A9B0BB", ":| c #868A93", "<| c #5E5D66", "[| c #3F3743", "}| c #2F232E", "|| c #2A1E25", "1| c #2D2326", "2| c #31272D", "3| c #49434C", "4| c #676871", "5| c #777D86", "6| c #5A5A63", "7| c #48444E", "8| c #48464E", "9| c #5B5C64", "0| c #8C939A", "a| c #A7B2BA", "b| c #AEBAC4", "c| c #ACB8C4", "d| c #ABB6BF", "e| c #ADB4C0", "f| c #9DA1AB", "g| c #878A91", "h| c #808186", "i| c #A7A7AD", "j| c #BCBCC1", "k| c #C5C5BA", "l| c #BDBCB9", "m| c #9991BF", "n| c #C3C2C5", "o| c #C8C8C2", "p| c #BEC2C1", "q| c #B4B3B4", "r| c #989193", "s| c #51474C", "t| c #2E232A", "u| c #2C2027", "v| c #352A31", "w| c #2B222E", "x| c #3E374A", "y| c #5D5876", "z| c #726F91", "A| c #585A6A", "B| c #47474F", "C| c #413B43", "D| c #3E323E", "E| c #3B3037", "F| c #312930", "G| c #29252F", "H| c #2D2D38", "I| c #505258", "J| c #6F707C", "K| c #84819A", "L| c #8A87A7", "M| c #7E7F8C", "N| c #676A6E", "O| c #515357", "P| c #494B52", "Q| c #636D75", "R| c #707D86", "S| c #727D85", "T| c #727A81", "U| c #7B8189", "V| c #898F9A", "W| c #9298A6", "X| c #898E9E", "Y| c #525562", "Z| c #3D3D48", "`| c #45424E", " 1 c #57535E", ".1 c #605E68", "+1 c #4F525B", "@1 c #4F535D", "#1 c #757B81", "$1 c #767C80", "%1 c #5C6063", "&1 c #3E4042", "*1 c #38363A", "=1 c #403D42", "-1 c #4B4A50", ";1 c #4F4E56", ">1 c #362D38", ",1 c #453F49", "'1 c #6F727C", ")1 c #97A3AA", "!1 c #80838B", "~1 c #524D56", "{1 c #2D232D", "]1 c #372E39", "^1 c #4A424D", "/1 c #635A64", "(1 c #817A82", "_1 c #A8A6A9", ":1 c #C1BDBC", "<1 c #B1B1B2", "[1 c #8E8F8E", "}1 c #7D7D7E", "|1 c #7E7F84", "11 c #90929A", "21 c #B3BCC4", "31 c #C0CCD3", "41 c #BBC7CC", "51 c #B2BEC4", "61 c #B2BFC5", "71 c #B3BFC6", "81 c #B7C1C9", "91 c #A1AEB7", "01 c #A0ADB6", "a1 c #B0BEC6", "b1 c #BFCCD2", "c1 c #B0BBBE", "d1 c #AEB4B6", "e1 c #B7B9B9", "f1 c #A2A1A2", "g1 c #858688", "h1 c #717176", "i1 c #6A6B72", "j1 c #7B7F8A", "k1 c #9095A2", "l1 c #A3A9B5", "m1 c #B1BAC3", "n1 c #87909A", "o1 c #646A75", "p1 c #4D505B", "q1 c #42424C", "r1 c #3F3D46", "s1 c #3E3942", "t1 c #4B4650", "u1 c #62606A", "v1 c #7A7C86", "w1 c #8A8E97", "x1 c #979DA5", "y1 c #A1AAB1", "z1 c #A9B4BD", "A1 c #B1BFC8", "B1 c #B5C3CC", "C1 c #B5BFC8", "D1 c #B5BEC8", "E1 c #B5BFC9", "F1 c #B4C1C9", "G1 c #B2C2C8", "H1 c #AFBFC6", "I1 c #ACBBC2", "J1 c #A9B8BE", "K1 c #A9B7BC", "L1 c #ADB9BF", "M1 c #ADBBC2", "N1 c #ADBCC4", "O1 c #B1C0C8", "P1 c #ADB9C2", "Q1 c #82828D", "R1 c #504855", "S1 c #332832", "T1 c #2A1F24", "U1 c #2A2022", "V1 c #251B1F", "W1 c #62636B", "X1 c #848792", "Y1 c #898291", "Z1 c #706776", "`1 c #4D4853", " 2 c #3B3B42", ".2 c #62646B", "+2 c #868C94", "@2 c #A0ABB4", "#2 c #AFBEC7", "$2 c #AEBBC3", "%2 c #ABB8BF", "&2 c #AAB8BD", "*2 c #AAB5BD", "=2 c #ACB9BF", "-2 c #B3BDC6", ";2 c #9BA2AB", ">2 c #787B83", ",2 c #67666D", "'2 c #91929A", ")2 c #AFB0B5", "!2 c #C1C2BC", "~2 c #BDC3C1", "{2 c #BDBABB", "]2 c #A5A0BA", "^2 c #2709AE", "/2 c #C5BFC5", "(2 c #C8C6C3", "_2 c #A4A6A7", ":2 c #818285", "<2 c #4A4547", "[2 c #2F2629", "}2 c #2B2225", "|2 c #31292E", "12 c #342934", "22 c #342937", "32 c #332935", "42 c #2D212D", "52 c #4B4253", "62 c #77748A", "72 c #8D8DA5", "82 c #544F5C", "92 c #342B34", "02 c #2E242E", "a2 c #322733", "b2 c #32282D", "c2 c #2C262A", "d2 c #29262E", "e2 c #31313C", "f2 c #515356", "g2 c #6E6A76", "h2 c #7F7391", "i2 c #827199", "j2 c #6E697A", "k2 c #4D4C50", "l2 c #2F2B2D", "m2 c #262026", "n2 c #535860", "o2 c #6C767F", "p2 c #737C85", "q2 c #747A82", "r2 c #7B828A", "s2 c #838C94", "t2 c #858E96", "u2 c #757D85", "v2 c #3F424C", "w2 c #25202D", "x2 c #261C29", "y2 c #49444E", "z2 c #44424C", "A2 c #32313B", "B2 c #292732", "C2 c #4F4D54", "D2 c #525255", "E2 c #3C3B3E", "F2 c #252124", "G2 c #2A2225", "H2 c #2F252A", "I2 c #32292F", "J2 c #383038", "K2 c #403742", "L2 c #63606B", "M2 c #929BA3", "N2 c #B9CAD0", "O2 c #BECDD5", "P2 c #99A0A9", "Q2 c #5F5B67", "R2 c #2F2331", "S2 c #342A36", "T2 c #6B636C", "U2 c #8F8890", "V2 c #B1AEB1", "W2 c #BABBBD", "X2 c #ABACAF", "Y2 c #818185", "Z2 c #78787E", "`2 c #898C94", " 3 c #A5AAB4", ".3 c #BCC5CF", "+3 c #BEC9D0", "@3 c #B2BDC1", "#3 c #A6B0B3", "$3 c #ADB8BE", "%3 c #B6C2C9", "&3 c #BFCAD3", "*3 c #BDC8D0", "=3 c #A2AFB8", "-3 c #A2B1B8", ";3 c #B4C1C8", ">3 c #C1CED4", ",3 c #AFBBBF", "'3 c #ADB4B6", ")3 c #B6B9B8", "!3 c #BBBBBA", "~3 c #67696F", "{3 c #5F5F67", "]3 c #6D6E78", "^3 c #A2A9B3", "/3 c #B9C3CF", "(3 c #B6C1CE", "_3 c #ABB8C4", ":3 c #889198", "<3 c #636870", "[3 c #373641", "}3 c #282532", "|3 c #302F3C", "13 c #454551", "23 c #6F717A", "33 c #8C9098", "43 c #A4AAB2", "53 c #ACBCC4", "63 c #AAB5BB", "73 c #AAB6BD", "83 c #ABB9C0", "93 c #AFBCC2", "03 c #B0BDC4", "a3 c #ACBCC2", "b3 c #B0BEC5", "c3 c #A0A4AF", "d3 c #4C464F", "e3 c #413A3F", "f3 c #3B3438", "g3 c #29232A", "h3 c #343039", "i3 c #54535D", "j3 c #7B7A86", "k3 c #A298AA", "l3 c #8D8292", "m3 c #554E59", "n3 c #25242A", "o3 c #36353C", "p3 c #5F6169", "q3 c #B0C0C6", "r3 c #AFBEC5", "s3 c #ABB9BD", "t3 c #ABB8BD", "u3 c #ACBABF", "v3 c #B4C0C7", "w3 c #97A0A8", "x3 c #6A6E77", "y3 c #4F4E57", "z3 c #73757F", "A3 c #989A9F", "B3 c #B4B4B3", "C3 c #C4C4BE", "D3 c #BEC5C3", "E3 c #C3C3BE", "F3 c #1D01B0", "G3 c #2809AE", "H3 c #9793BE", "I3 c #C0C4C4", "J3 c #C6CAC2", "K3 c #B6B6B7", "L3 c #98999C", "M3 c #707276", "N3 c #414041", "O3 c #2A272A", "P3 c #26232A", "Q3 c #2C2832", "R3 c #342D37", "S3 c #343037", "T3 c #342A35", "U3 c #4A4350", "V3 c #696775", "W3 c #767786", "X3 c #4A4451", "Y3 c #332734", "Z3 c #302330", "`3 c #2E292C", " 4 c #2C2B34", ".4 c #373743", "+4 c #57565F", "@4 c #675E67", "#4 c #67535F", "$4 c #5C4351", "%4 c #443D48", "&4 c #34333C", "*4 c #302C35", "=4 c #3A323B", "-4 c #57555F", ";4 c #686872", ">4 c #6B6B74", ",4 c #696972", "'4 c #636973", ")4 c #595E69", "!4 c #4A4D58", "~4 c #37323F", "{4 c #2F2632", "]4 c #302731", "^4 c #362E36", "/4 c #3B333E", "(4 c #39303D", "_4 c #322A37", ":4 c #2F2733", "<4 c #3B3439", "[4 c #3C3538", "}4 c #352D33", "|4 c #2C222C", "14 c #2B1F29", "24 c #291C26", "34 c #2C212B", "44 c #3E353F", "54 c #6D6974", "64 c #9397A1", "74 c #ACB8C0", "84 c #B9CBD1", "94 c #9FA4AF", "04 c #67636F", "a4 c #302531", "b4 c #3E3641", "c4 c #595560", "d4 c #7E7D87", "e4 c #ADA8B2", "f4 c #C4BDC5", "g4 c #C6C1C4", "h4 c #7E7B7D", "i4 c #7A787C", "j4 c #959AA0", "k4 c #BFC8D1", "l4 c #B1B7C0", "m4 c #A7ACB5", "n4 c #BEC8D2", "o4 c #9DAAB3", "p4 c #9AA8B2", "q4 c #ABB9C3", "r4 c #BCC8D2", "s4 c #B3BABF", "t4 c #B9BABA", "u4 c #C9C9C8", "v4 c #98999D", "w4 c #777980", "x4 c #676B73", "y4 c #6F747D", "z4 c #878C97", "A4 c #A1A7B3", "B4 c #B2C0C9", "C4 c #B0BFC8", "D4 c #ACBAC3", "E4 c #94A0A8", "F4 c #666C73", "G4 c #3D3C43", "H4 c #37313C", "I4 c #443F4B", "J4 c #5C5A65", "K4 c #747680", "L4 c #80858D", "M4 c #8E969D", "N4 c #A6B3B9", "O4 c #A3B1B9", "P4 c #A8B4BC", "Q4 c #ACB8BF", "R4 c #ABB7C3", "S4 c #ABB7C2", "T4 c #ACBBC0", "U4 c #ACBDC3", "V4 c #ABBCC3", "W4 c #B1B8BD", "X4 c #ADB5BA", "Y4 c #ADBCC3", "Z4 c #98A1A8", "`4 c #8E959A", " 5 c #898B91", ".5 c #63627B", "+5 c #4C4B65", "@5 c #404053", "#5 c #44434F", "$5 c #696371", "%5 c #655E6A", "&5 c #433E46", "*5 c #1E1D21", "=5 c #15171B", "-5 c #383E44", ";5 c #737E85", ">5 c #A8B7BE", ",5 c #ACBBC1", "'5 c #AEBDC3", ")5 c #9CA3AE", "!5 c #666873", "~5 c #3B3A45", "{5 c #74737B", "]5 c #A49FA7", "^5 c #C8C1C8", "/5 c #C2C2C4", "(5 c #BDBFBE", "_5 c #BFC7C1", ":5 c #B7BEC1", "<5 c #A3A2BD", "[5 c #7E72B8", "}5 c #1A02AF", "|5 c #1600AD", "15 c #1D01AC", "25 c #2809AD", "35 c #C0C5C4", "45 c #C5C5C3", "55 c #909192", "65 c #65666A", "75 c #3E3C40", "85 c #2A272D", "95 c #27242E", "05 c #2C2835", "a5 c #312A37", "b5 c #332C38", "c5 c #34303A", "d5 c #38363E", "e5 c #514D56", "f5 c #5B5B65", "g5 c #5A5C66", "h5 c #403945", "i5 c #332834", "j5 c #322532", "k5 c #332934", "l5 c #2C272C", "m5 c #2E2C31", "n5 c #383740", "o5 c #464551", "p5 c #575560", "q5 c #5A5058", "r5 c #513D42", "s5 c #412A2D", "t5 c #2D252E", "u5 c #2E2B37", "v5 c #3C3843", "w5 c #4F4751", "x5 c #5C5761", "y5 c #5D5762", "z5 c #5B5660", "A5 c #4E4F59", "B5 c #403F4B", "C5 c #34303D", "D5 c #322937", "E5 c #352B36", "F5 c #39313A", "G5 c #3A343C", "H5 c #322533", "I5 c #302432", "J5 c #2B2229", "K5 c #2B2329", "L5 c #2F262F", "M5 c #352C39", "N5 c #3C3341", "O5 c #423B48", "P5 c #4D4854", "Q5 c #63616C", "R5 c #9396A1", "S5 c #B7C6CE", "T5 c #B8C8D0", "U5 c #A2A8B3", "V5 c #6D6B76", "W5 c #3C343E", "X5 c #302632", "Y5 c #38323E", "Z5 c #51505B", "`5 c #ADA9B4", " 6 c #C6C0C7", ".6 c #C7C3C5", "+6 c #BBC2C1", "@6 c #A9AAAD", "#6 c #807D80", "$6 c #818085", "%6 c #A0A6AD", "&6 c #BCC4CF", "*6 c #AEB4BF", "=6 c #A6ADB7", "-6 c #B9C5CD", ";6 c #BFC9D2", ">6 c #A6B0B7", ",6 c #A2ADB5", "'6 c #BBC6D1", ")6 c #B8BBC1", "!6 c #BAB9BA", "~6 c #C2C2C0", "{6 c #A2A3A6", "]6 c #7F8289", "^6 c #656A74", "/6 c #686F77", "(6 c #7F868E", "_6 c #9EA5AE", ":6 c #B6BDC7", "<6 c #B0BBC3", "[6 c #ADBDC3", "}6 c #96A3AA", "|6 c #6A7178", "16 c #474850", "26 c #514E58", "36 c #66646E", "46 c #7D7F89", "56 c #9298A2", "66 c #9CA5AD", "76 c #A1ADB5", "86 c #A3B2BA", "96 c #9FACB4", "06 c #A0ACB4", "a6 c #A6B1B9", "b6 c #ABB6BE", "c6 c #ABB7C1", "d6 c #ABB8BE", "e6 c #ABBABD", "f6 c #ACBEC1", "g6 c #ADBFC4", "h6 c #ADBDC4", "i6 c #B2B7BB", "j6 c #AEB5BB", "k6 c #ABBBC1", "l6 c #B0BDC3", "m6 c #ACBCC1", "n6 c #AEBBBF", "o6 c #A5AAB8", "p6 c #9195B2", "q6 c #6B6D8B", "r6 c #424156", "s6 c #282530", "t6 c #3F3944", "u6 c #363339", "v6 c #27262A", "w6 c #212125", "x6 c #41454B", "y6 c #778188", "z6 c #A6B6BD", "A6 c #ACBABE", "B6 c #BCC6D0", "C6 c #9CA2AE", "D6 c #626471", "E6 c #31303D", "F6 c #5E5B63", "G6 c #9A939C", "H6 c #CAC3CA", "I6 c #C3C1C4", "J6 c #C0C6C4", "K6 c #B8BDC3", "L6 c #A3A2BE", "M6 c #1600AC", "N6 c #C8C6C2", "O6 c #B3B3AF", "P6 c #8A8C8B", "Q6 c #5E5D62", "R6 c #3E3841", "S6 c #2F2731", "T6 c #2C2431", "U6 c #342F3C", "V6 c #35313E", "W6 c #363440", "X6 c #3C3C45", "Y6 c #545259", "Z6 c #5A5960", "`6 c #51525B", " 7 c #43434D", ".7 c #373038", "+7 c #322830", "@7 c #322831", "#7 c #322A34", "$7 c #363039", "%7 c #534F5A", "&7 c #4B414B", "*7 c #35242B", "=7 c #2A202B", "-7 c #342E3B", ";7 c #4A4550", ">7 c #5C555F", ",7 c #534B55", "'7 c #4D4550", ")7 c #4C454F", "!7 c #4C4650", "~7 c #4B4751", "{7 c #433E49", "]7 c #38313E", "^7 c #2F2634", "/7 c #312533", "(7 c #3E3741", "_7 c #352A37", ":7 c #302331", "<7 c #2F2330", "[7 c #261F28", "}7 c #27212B", "|7 c #312C37", "17 c #433F4C", "27 c #595A65", "37 c #6D727D", "47 c #818894", "57 c #959EA9", "67 c #B7C5CD", "77 c #B7C8CF", "87 c #BFCED7", "97 c #73757E", "07 c #443F49", "a7 c #342E3A", "b7 c #393643", "c7 c #50515D", "d7 c #767A83", "e7 c #ACAAB2", "f7 c #C6C4C5", "g7 c #BCC0BF", "h7 c #BDBDBF", "i7 c #A4A5A8", "j7 c #85858B", "k7 c #8B8D95", "l7 c #A8B1B9", "m7 c #C2CBD6", "n7 c #AAB3BD", "o7 c #BAC7CF", "p7 c #B7BCC1", "q7 c #B4BAC0", "r7 c #B7C0CA", "s7 c #BCBEC5", "t7 c #B8B8BA", "u7 c #B8B9BA", "v7 c #BFC5C4", "w7 c #C3C5C4", "x7 c #80838A", "y7 c #727780", "z7 c #707781", "A7 c #7D878E", "B7 c #90999E", "C7 c #A4AAAF", "D7 c #B1B6BB", "E7 c #ACB6BD", "F7 c #ADBCC1", "G7 c #B1C0C4", "H7 c #A0AEB3", "I7 c #859097", "J7 c #707780", "K7 c #777B84", "L7 c #838791", "M7 c #8F96A2", "N7 c #9CA7B3", "O7 c #A8B4BD", "P7 c #A4B3BD", "Q7 c #9EACB8", "R7 c #A0A8B4", "S7 c #A4ACB5", "T7 c #ABB8C0", "U7 c #ABBBBF", "V7 c #AFB8BC", "W7 c #AEB7BB", "X7 c #ADB7BE", "Y7 c #ABB9BF", "Z7 c #ACBCBF", "`7 c #AFBDC2", " 8 c #B1BDC4", ".8 c #B2BCC6", "+8 c #AFB8C7", "@8 c #ACB5CB", "#8 c #878CA2", "$8 c #514F60", "%8 c #251C28", "&8 c #29222A", "*8 c #2D292F", "=8 c #302E34", "-8 c #38373D", ";8 c #4A464C", ">8 c #6B6971", ",8 c #8F969E", "'8 c #AABAC1", ")8 c #ABB7BD", "!8 c #B8C4CB", "~8 c #989FAA", "{8 c #60636F", "]8 c #2E2A35", "^8 c #58525A", "/8 c #969194", "(8 c #CAC6C5", "_8 c #BBB9C5", ":8 c #A5A0BF", "<8 c #1D01AE", "[8 c #C5BEC4", "}8 c #C9C8C2", "|8 c #B2B2AD", "18 c #868787", "28 c #57575E", "38 c #312532", "48 c #352C38", "58 c #3A3A47", "68 c #393946", "78 c #3F3E4A", "88 c #5C5B61", "98 c #5C5C62", "08 c #484750", "a8 c #322F3A", "b8 c #30292E", "c8 c #302A2D", "d8 c #322C33", "e8 c #413744", "f8 c #544C58", "g8 c #5E5962", "h8 c #4B444E", "i8 c #3D343F", "j8 c #352B38", "k8 c #322735", "l8 c #332531", "m8 c #403440", "n8 c #514957", "o8 c #5B5664", "p8 c #49414D", "q8 c #3E3640", "r8 c #3F3641", "s8 c #322734", "t8 c #372E3A", "u8 c #3E3742", "v8 c #3B323E", "w8 c #392E3C", "x8 c #3B313E", "y8 c #3D3441", "z8 c #36333F", "A8 c #393A45", "B8 c #484954", "C8 c #5E626C", "D8 c #7C888F", "E8 c #99A9B1", "F8 c #B0C1CC", "G8 c #BDCFDA", "H8 c #B9CBD3", "I8 c #B6C7CE", "J8 c #B5C6CD", "K8 c #BDD0D7", "L8 c #A4B4BA", "M8 c #787F87", "N8 c #3E3D48", "O8 c #3F3F4B", "P8 c #4F4F5C", "Q8 c #6E6E78", "R8 c #A19FA5", "S8 c #C3C1BA", "T8 c #BCBBBD", "U8 c #9DA0A3", "V8 c #8B8E96", "W8 c #959BA5", "X8 c #B8C1CC", "Y8 c #ABBAC1", "Z8 c #BBC9D1", "`8 c #C3CDD4", " 9 c #C7CACD", ".9 c #C4C8CC", "+9 c #BEC8CF", "@9 c #B7B7BB", "#9 c #B4B5B8", "$9 c #BDC5C5", "%9 c #BBBFC0", "&9 c #AAAAAC", "*9 c #73757D", "=9 c #5F636E", "-9 c #6A707A", ";9 c #828A92", ">9 c #94A1A6", ",9 c #9FAAAC", "'9 c #A4ABAC", ")9 c #A6A9AC", "!9 c #ABB2B9", "~9 c #ACB6BE", "{9 c #AAB7BD", "]9 c #A8B5B9", "^9 c #A5B3B6", "/9 c #A1AFB3", "(9 c #9BA9B0", "_9 c #96A2A9", ":9 c #9DABB8", "<9 c #A8B7BF", "[9 c #A7B6BE", "}9 c #9EADB8", "|9 c #97A3B2", "19 c #A0A5B3", "29 c #A6ADB8", "39 c #AFBBC1", "49 c #B0BCC3", "59 c #ACBAC0", "69 c #AAB4BE", "79 c #ADB9C6", "89 c #B7C4D0", "99 c #969EAB", "09 c #5D5A68", "a9 c #281D29", "b9 c #1F161C", "c9 c #211C22", "d9 c #2E2C33", "e9 c #99949C", "f9 c #A9AFB7", "g9 c #B5C2C8", "h9 c #959EA7", "i9 c #60616D", "j9 c #322E3B", "k9 c #322B38", "l9 c #5B555C", "m9 c #979392", "n9 c #C8C8C0", "o9 c #C3C3C1", "p9 c #C6C0C3", "q9 c #BFB6C3", "r9 c #A69EBE", "s9 c #C7C7C5", "t9 c #AEAFAF", "u9 c #7F8186", "v9 c #50525B", "w9 c #3B3A40", "x9 c #312D32", "y9 c #30292F", "z9 c #362F38", "A9 c #474751", "B9 c #403F4C", "C9 c #3B3946", "D9 c #4A4751", "E9 c #4B464D", "F9 c #3F383F", "G9 c #302A2F", "H9 c #292629", "I9 c #292527", "J9 c #2D2629", "K9 c #352E32", "L9 c #453E47", "M9 c #4E4753", "N9 c #4B444D", "O9 c #3F3540", "P9 c #362C39", "Q9 c #332937", "R9 c #362A36", "S9 c #422C30", "T9 c #46303B", "U9 c #43344D", "V9 c #3C3456", "W9 c #362C40", "X9 c #332634", "Y9 c #322632", "Z9 c #30252F", "`9 c #2E252D", " 0 c #322731", ".0 c #3A3440", "+0 c #3E3B46", "@0 c #423D48", "#0 c #4E4A54", "$0 c #605C67", "%0 c #6F6E79", "&0 c #737680", "*0 c #7C838B", "=0 c #98A4AA", "-0 c #A4B3B9", ";0 c #AEBEC6", ">0 c #B5C7CF", ",0 c #B6C9D0", "'0 c #B5C7CE", ")0 c #BDCFD5", "!0 c #A6B5BC", "~0 c #585B64", "{0 c #52545C", "]0 c #494751", "^0 c #4D4450", "/0 c #7D747E", "(0 c #A19BA1", "_0 c #B6B4B6", ":0 c #C2C0B9", "<0 c #C3C2B9", "[0 c #C5C4BC", "}0 c #BBBAB6", "|0 c #AAABAA", "10 c #989B9E", "20 c #8F9097", "30 c #9BA0AA", "40 c #B3BCC6", "50 c #A5B1BA", "60 c #A0AAB4", "70 c #ADB8C1", "80 c #C6D0D6", "90 c #C2CCD2", "00 c #BAC6CC", "a0 c #B3C2C7", "b0 c #B9BFC6", "c0 c #B7B9BF", "d0 c #C2C5C6", "e0 c #B8BCBE", "f0 c #A2A5A7", "g0 c #828487", "h0 c #55565D", "i0 c #4D4E58", "j0 c #63656F", "k0 c #858991", "l0 c #9DA8AF", "m0 c #AAB6B9", "n0 c #ABB5B9", "o0 c #B8C0CB", "p0 c #7F8B8F", "q0 c #7A868A", "r0 c #818E95", "s0 c #99A7B0", "t0 c #9CA9B3", "u0 c #A1ACB5", "v0 c #9EA9B1", "w0 c #95A2AA", "x0 c #8F9DA7", "y0 c #96A1AF", "z0 c #9FAAB8", "A0 c #A7B5BF", "B0 c #AEBBC1", "C0 c #ABB9BC", "D0 c #ABBAC2", "E0 c #ABB8C2", "F0 c #ABB5C2", "G0 c #ABB7C5", "H0 c #ADBBC9", "I0 c #8891A0", "J0 c #4D4F5D", "K0 c #1C1621", "L0 c #1B1319", "M0 c #201A20", "N0 c #2D2A34", "O0 c #4B4B56", "P0 c #8C8990", "Q0 c #AEAFB4", "R0 c #B6BCC2", "S0 c #AAB9BD", "T0 c #BAC7CE", "U0 c #9AA2AA", "V0 c #605E69", "W0 c #312734", "X0 c #36313D", "Y0 c #605E65", "Z0 c #989898", "`0 c #C6C6C2", " a c #C6C3BD", ".a c #BEBABD", "+a c #9890BC", "@a c #C7C8C1", "#a c #ACADB0", "$a c #7C7E85", "%a c #4C4F59", "&a c #39393F", "*a c #2F2C30", "=a c #2D282E", "-a c #353139", ";a c #504F55", ">a c #54545C", ",a c #464752", "'a c #383745", ")a c #3E3845", "!a c #352B31", "~a c #2C2527", "{a c #282429", "]a c #282329", "^a c #352B32", "/a c #463E47", "(a c #4B4351", "_a c #453E4E", ":a c #3C3445", "b c #ACB9C2", ",b c #ACB6C3", "'b c #AAB5C2", ")b c #A9B7C4", "!b c #8B96A3", "~b c #33313A", "{b c #262128", "]b c #221C24", "^b c #403F49", "/b c #75777B", "(b c #95999C", "_b c #A0A7AD", ":b c #A3AEB6", "c c #B8C5CD", ",c c #BFCDD6", "'c c #B2B7BC", ")c c #ACACAE", "!c c #B8B8B7", "~c c #C1BAC4", "{c c #C0B6C4", "]c c #9E94A2", "^c c #6E6772", "/c c #6A687C", "(c c #757489", "_c c #707080", ":c c #6D7079", "d c #9DABB3", ",d c #B9C9D0", "'d c #BFCDD4", ")d c #BECCD4", "!d c #BCCCD3", "~d c #BACCD3", "{d c #B8CCD2", "]d c #B7CBD0", "^d c #B7CACF", "/d c #B6CACF", "(d c #B5C9D0", "_d c #B4C8D0", ":d c #B6C5CE", "e c #B4B0B3", ",e c #A5A0BB", "'e c #C5BFC4", ")e c #4F515A", "!e c #3D3D4A", "~e c #33303E", "{e c #2F2937", "]e c #342C39", "^e c #48414C", "/e c #49444C", "(e c #3E383F", "_e c #322B2F", ":e c #322A2E", "f c #98A6AD", ",f c #8B9AA2", "'f c #839098", ")f c #97A6AC", "!f c #9FADB5", "~f c #9AA7B2", "{f c #929EA9", "]f c #8D98A1", "^f c #99A2AA", "/f c #A2ABB3", "(f c #A2AEB5", "_f c #9BA8AF", ":f c #A4B0B8", "g c #B0BAC2", ",g c #B2BDC9", "'g c #B7C3CD", ")g c #C7D4DD", "!g c #AEB5B8", "~g c #A7A8AA", "{g c #C4C2C6", "]g c #C7C5C6", "^g c #B3B2B1", "/g c #6E6E75", "(g c #51505A", "_g c #58555F", ":g c #6D6971", "h c #B7C9D0", ",h c #B8C9D1", "'h c #B2C0CA", ")h c #9DA7B1", "!h c #72777F", "~h c #47464C", "{h c #393639", "]h c #7F7D7F", "^h c #ACABAE", "/h c #C0BFC2", "(h c #C0C1BB", "_h c #BEC1C2", ":h c #C0C1C4", "i c #C8C9BF", ",i c #B0AFAF", "'i c #848187", ")i c #5B535C", "!i c #523C40", "~i c #482F35", "{i c #3E2935", "]i c #362939", "^i c #372F3A", "/i c #39333A", "(i c #39343A", "_i c #39323A", ":i c #322833", "j c #B1BDCD", ",j c #B4C1D6", "'j c #A0ACC2", ")j c #696D79", "!j c #474750", "~j c #43424B", "{j c #5B5B64", "]j c #9F9FA2", "^j c #A4A0BB", "/j c #9595BD", "(j c #BFC6C2", "_j c #C6CAC0", ":j c #C6C6C4", "k c #A5AEB6", ",k c #A5B1B9", "'k c #9DA9AF", ")k c #99A8AB", "!k c #9BA8AB", "~k c #9BA8AC", "{k c #98A7AD", "]k c #96A0A9", "^k c #8F97A0", "/k c #899098", "(k c #899199", "_k c #8D979D", ":k c #95A1A7", "l c #AEB5BF", ",l c #ACB6BA", "'l c #ABB2BA", ")l c #A9B3B7", "!l c #ADB9BD", "~l c #B5C1C7", "{l c #B3C4CD", "]l c #B3C4CB", "^l c #9EA4A8", "/l c #B7B7B1", "(l c #BBBBB8", "_l c #AAABAF", ":l c #90929E", "m c #888587", ",m c #868181", "'m c #969391", ")m c #898886", "!m c #686868", "~m c #454447", "{m c #49494B", "]m c #7D8386", "^m c #BDC4CF", "/m c #B7BFCA", "(m c #B7C2CB", "_m c #B8C2CC", ":m c #B8BFCA", "n c #413C61", ",n c #747A8D", "'n c #9AA6AE", ")n c #B7C9CF", "!n c #B4C6CE", "~n c #B4C7CF", "{n c #B5C8D0", "]n c #B7C7CD", "^n c #B7C9D1", "/n c #ADC0C7", "(n c #8B99A0", "_n c #6D727A", ":n c #595761", "o c #B8B9BC", ",o c #3C24B3", "'o c #1B02B1", ")o c #998EBC", "!o c #C3BFC4", "~o c #C9C6C7", "{o c #C6C0C8", "]o c #C3BEC7", "^o c #B5B4B9", "/o c #9B9D9F", "(o c #716E76", "_o c #504A55", ":o c #3B3540", "p c #41434A", ",p c #4B474B", "'p c #878583", ")p c #A6A7A4", "!p c #AAAFAF", "~p c #A5ACB1", "{p c #A8B2B7", "]p c #A8B4BA", "^p c #A8B3B9", "/p c #A4B0B6", "(p c #A9BCBF", "_p c #A3BDBB", ":p c #A1BDB9", "

    q c #B4C0C8", ",q c #C7D2DA", "'q c #C8D2DB", ")q c #C8D2DC", "!q c #AFBCC4", "~q c #C4CDD8", "{q c #C5D2DB", "]q c #BAC5CC", "^q c #BBC7CE", "/q c #BBC6CD", "(q c #B8C2CB", "_q c #BBC6CF", ":q c #BECBD1", "r c #BBCCD4", ",r c #B8CBD0", "'r c #BBCFD5", ")r c #BBCDD6", "!r c #656872", "~r c #46424B", "{r c #47424A", "]r c #58555D", "^r c #64676F", "/r c #7C8288", "(r c #939AA0", "_r c #9AA0A6", ":r c #53555E", "s c #AEC0C3", ",s c #A5B2B9", "'s c #A1AFBA", ")s c #A8B7BD", "!s c #ABBCC1", "~s c #A7BCBC", "{s c #A5BCB9", "]s c #A9BABB", "^s c #A9B8BF", "/s c #B4C2CB", "(s c #A3AEB8", "_s c #5D5E6A", ":s c #433E4B", "t c #81848D", ",t c #9DA5AE", "'t c #C1C9D4", ")t c #B0B7C2", "!t c #B2C0C8", "~t c #BDC7D1", "{t c #BCC4CE", "]t c #B3C0C8", "^t c #A9B7BD", "/t c #9A9EA2", "(t c #909397", "_t c #8D949C", ":t c #919CA8", "u c #64656E", ",u c #6D737A", "'u c #7B868D", ")u c #93A3AB", "!u c #ADBCC5", "~u c #757E87", "{u c #A7B3B9", "]u c #B4C2C8", "^u c #A9B5BC", "/u c #767F88", "(u c #565963", "_u c #666163", ":u c #A19E98", "v c #5A545E", ",v c #A3A8AA", "'v c #AAB1B1", ")v c #84898B", "!v c #63666C", "~v c #8B94A1", "{v c #9AA7B4", "]v c #8E9AA5", "^v c #747E86", "/v c #515661", "(v c #63656D", "_v c #959699", ":v c #C6C0C1", "w c #78777B", ",w c #8B8F97", "'w c #89939B", ")w c #B1BEC7", "!w c #CBD6E0", "~w c #BAC1C9", "{w c #8A8A8C", "]w c #8F959A", "^w c #9099A1", "/w c #8C959E", "(w c #868E95", "_w c #83878C", ":w c #82868B", "x c #B6C9CF", ",x c #B6CAD0", "'x c #A3AEB5", ")x c #8A9195", "!x c #787B81", "~x c #6B6D75", "{x c #60626D", "]x c #53565F", "^x c #4A4E54", "/x c #46494E", "(x c #45464A", "_x c #434248", ":x c #423F48", "y c #4F4750", ",y c #4E474F", "'y c #505056", ")y c #686C70", "!y c #8A8F93", "~y c #A4ABAF", "{y c #9CA5AB", "]y c #9DA9B0", "^y c #A0AEB6", "/y c #A6B4BC", "(y c #A4BEBB", "_y c #A3BEBA", ":y c #A7BCBE", "z c #BFC3C2", ",z c #989692", "'z c #979896", ")z c #ADB4B7", "!z c #778287", "~z c #707A7E", "{z c #7C868D", "]z c #C4CCD4", "^z c #C5C7CF", "/z c #C2C1CA", "(z c #BAC0C9", "_z c #B5BFC5", ":z c #B3BCBE", "A c #BACBD3", ",A c #ADC1C8", "'A c #727A82", ")A c #6C737B", "!A c #656970", "~A c #605F68", "{A c #595357", "]A c #565055", "^A c #514D55", "/A c #4C4955", "(A c #4A454E", "_A c #3F3A41", ":A c #2F2B31", "B c #90969C", ",B c #A2A6A9", "'B c #B3BAC2", ")B c #808A91", "!B c #646D74", "~B c #929CA6", "{B c #B2BDC4", "]B c #B0BEC4", "^B c #A6B0B6", "/B c #9FA5AC", "(B c #94969F", "_B c #7C7B87", ":B c #484753", "C c #8C9295", ",C c #C1C4C4", "'C c #B7B7B8", ")C c #939497", "!C c #909398", "~C c #A5ACB3", "{C c #C4CED6", "]C c #B6C5CC", "^C c #A3AFB7", "/C c #7C8187", "(C c #81868B", "_C c #9FAAB0", ":C c #B8C7D0", "D c #767D8A", ",D c #A1AFBB", "'D c #B3C5CC", ")D c #A3B2B9", "!D c #A2B2B9", "~D c #A9BAC2", "{D c #A5B0B8", "]D c #A1AAB3", "^D c #A1A8B1", "/D c #9BA2AA", "(D c #90979F", "_D c #818890", ":D c #62626C", "E c #9FA8B0", ",E c #81848B", "'E c #858790", ")E c #BEC9D5", "!E c #CBD7E1", "~E c #80858B", "{E c #63676D", "]E c #929AA6", "^E c #ADB8C5", "/E c #B3BFCA", "(E c #B1C1C8", "_E c #B4BDC6", ":E c #B4BFC5", "F c #B8C4D0", ",F c #A5AFBC", "'F c #7E8791", ")F c #838C95", "!F c #A6AFB9", "~F c #B5C0C9", "{F c #909AA3", "]F c #687076", "^F c #4E5256", "/F c #525557", "(F c #98A0A4", "_F c #B5C0CC", ":F c #A5B0BD", "G c #AEBFC8", ",G c #ACBBC6", "'G c #B0BDC5", ")G c #9AA6AF", "!G c #858F98", "~G c #7B848B", "{G c #889298", "]G c #B8C5CB", "^G c #96A4AB", "/G c #7F8B91", "(G c #687077", "_G c #5A5F67", ":G c #555861", "H c #A4BFBD", ",H c #A8BCC0", "'H c #B2C8CD", ")H c #A3B6BB", "!H c #606069", "~H c #3D3B41", "{H c #535053", "]H c #8B8989", "^H c #B6B0BC", "/H c #948FA0", "(H c #686775", "_H c #40424D", ":H c #31303C", "I c #63646C", ",I c #9297A1", "'I c #B4BCC6", ")I c #C7D3DC", "!I c #C8D3DD", "~I c #CFDAE5", "{I c #ABB3BD", "]I c #787B84", "^I c #5C5D65", "/I c #9BA0AB", "(I c #A5B5BA", "_I c #A7B9BD", ":I c #A9BBC0", "J c #B5B6B4", ",J c #BFC4C2", "'J c #C1BBC2", ")J c #BFC2C2", "!J c #BCBFBE", "~J c #B5B7B7", "{J c #AEB1B4", "]J c #C1CAD4", "^J c #9DA8B1", "/J c #C6D1D9", "(J c #CEDAE1", "_J c #B6C5C9", ":J c #92A2A4", "K c #939194", ",K c #5A525B", "'K c #372E3B", ")K c #636972", "!K c #8E9CA2", "~K c #BBCACF", "{K c #B1C2C9", "]K c #B2C3CA", "^K c #8A959E", "/K c #676C76", "(K c #4A4854", "_K c #423944", ":K c #3B333C", "L c #969FAA", ",L c #9CA6AC", "'L c #9EAAAE", ")L c #A1ACAF", "!L c #A7B1B1", "~L c #B3C1B6", "{L c #B5C3BB", "]L c #939EA4", "^L c #535C60", "/L c #282F33", "(L c #515961", "_L c #AAABAD", ":L c #B0B2B6", "M c #848D90", ",M c #5E6167", "'M c #A7A6AF", ")M c #CACED7", "!M c #C8D1DB", "~M c #BAC8D2", "{M c #C1CFD8", "]M c #C0C6CB", "^M c #C6C8CC", "/M c #A7A3AB", "(M c #89858F", "_M c #74737D", ":M c #696C74", "N c #5B575C", ",N c #7F7D80", "'N c #A8A9AA", ")N c #BAB9B7", "!N c #BBBBBD", "~N c #9697A0", "{N c #ABABB4", "]N c #B8B8C0", "^N c #BEC7CF", "/N c #B4B9BE", "(N c #A9ADB0", "_N c #A3AFB4", ":N c #BFC6D1", "O c #96A2AA", ",O c #A0AAB2", "'O c #AFBCC7", ")O c #B4C3CF", "!O c #B5C5CE", "~O c #B5CCD1", "{O c #B4CAD0", "]O c #B6C7CF", "^O c #B3C2CB", "/O c #BAC9D0", "(O c #BCCBD3", "_O c #B8C8CE", ":O c #A8B2BC", "P c #252432", ",P c #3B3A44", "'P c #727275", ")P c #A9AAA8", "!P c #B9B9B9", "~P c #C4C3C1", "{P c #BDB8C0", "]P c #A59FBD", "^P c #AFAEB1", "/P c #929395", "(P c #5A595F", "_P c #7C838A", ":P c #A7B4B9", "

    Q c #BEB9BA", ",Q c #CAC2CA", "'Q c #BAB3BE", ")Q c #8E8C92", "!Q c #65646A", "~Q c #44434C", "{Q c #2E2C39", "]Q c #21202D", "^Q c #42414C", "/Q c #7D7D83", "(Q c #B3B5B6", "_Q c #C2C4BF", ":Q c #BBB9BC", "R c #52555D", ",R c #808286", "'R c #9D9D9F", ")R c #A4A3A6", "!R c #9C9A9F", "~R c #88888D", "{R c #616268", "]R c #3C3B44", "^R c #35343D", "/R c #AFB4B7", "(R c #4F525A", "_R c #313139", ":R c #42424A", "S c #929B9F", ",S c #8C9496", "'S c #8A9299", ")S c #8D969E", "!S c #A0A9B0", "~S c #AAB3BE", "{S c #777C88", "]S c #52525F", "^S c #423D49", "/S c #443D49", "(S c #625F6A", "_S c #696B75", ":S c #656973", "T c #ADBAB4", ",T c #ADBABA", "'T c #767C85", ")T c #5A5B66", "!T c #595962", "~T c #5F5A65", "{T c #7E838A", "]T c #7E8289", "^T c #6F7278", "/T c #5F6265", "(T c #535557", "_T c #525059", ":T c #56545E", "U c #A0AEA4", ",U c #B7C6BC", "'U c #B2C0BF", ")U c #A5B3BC", "!U c #6A6E78", "~U c #61636C", "{U c #5B5661", "]U c #58515C", "^U c #5E5D68", "/U c #6A707B", "(U c #717C86", "_U c #696E77", ":U c #5A5A61", "V c #595E61", ",V c #98A4A3", "'V c #B5C3C4", ")V c #A2B0B6", "!V c #999DA8", "~V c #9C9FAB", "{V c #9FA6B2", "]V c #A1AAB6", "^V c #9EA4AF", "/V c #969BA5", "(V c #8B929C", "_V c #838993", ":V c #84838F", "W c #B1B7C1", ",W c #B1B8C2", "'W c #B1BAC7", ")W c #A3AAB4", "!W c #8A969F", "~W c #A0ADB7", "{W c #8B8C91", "]W c #676368", "^W c #504653", "/W c #8B8193", "(W c #AAA6B6", "_W c #AEB3BF", ":W c #A7B7BD", "X c #868A92", ",X c #7E858D", "'X c #717881", ")X c #6F7179", "!X c #9FA0A6", "~X c #BABBBE", "{X c #C5C2C6", "]X c #C4C1C1", "^X c #C6C8C0", "/X c #C1BCC4", "(X c #93969D", "_X c #777A81", ":X c #797C80", "Y c #BAC9D4", ",Y c #B2C1CB", "'Y c #89959B", ")Y c #6B7178", "!Y c #888C96", "~Y c #B8CCD1", "{Y c #BCD0D4", "]Y c #BDCED2", "^Y c #7D8890", "/Y c #8B969F", "(Y c #B4C5CD", "_Y c #6C6C70", ":Y c #868687", "Z c #BDC7C6", ",Z c #BEC6C5", "'Z c #AEACAE", ")Z c #A7A6A8", "!Z c #85888D", "~Z c #6F727B", "{Z c #6C727D", "]Z c #A4B1B7", "^Z c #73828C", "/Z c #525F69", "(Z c #80848B", "_Z c #A4A8AC", ":Z c #B2BCC0", "` c #B3C3C7", ",` c #555864", "'` c #8F97A3", ")` c #AFC5C9", "!` c #B2C5CB", "~` c #B6C6CB", "{` c #9AA1A3", "]` c #515154", "^` c #48494D", "/` c #6F767C", "(` c #9EAAB0", "_` c #A3AEAF", ":` c #A1A8AA", "<` c #9EA3A9", "[` c #A1A2AB", "}` c #B4B4BB", "|` c #C1BEC2", "1` c #BFC3C3", "2` c #BFC4C3", "3` c #A4A6AC", "4` c #94959B", "5` c #86848A", "6` c #7A767C", "7` c #6D6D74", "8` c #7D838E", "9` c #929CA7", "0` c #B3C2CA", "a` c #656E79", "b` c #454A57", "c` c #888B95", "d` c #B3B9C1", "e` c #818F97", "f` c #7D8A92", "g` c #B5C7D0", "h` c #B4C6D1", "i` c #A7B3BF", "j` c #939FA9", "k` c #85939B", "l` c #90A4AD", "m` c #9AACB5", "n` c #939EA5", "o` c #909AA1", "p` c #8B9198", "q` c #B0BDC7", "r` c #B2C1CA", "s` c #8A9098", "t` c #88888C", "u` c #6A6971", "v` c #5B5963", "w` c #585358", "x` c #5A5457", "y` c #60595F", "z` c #67616A", "A` c #716B70", "B` c #767275", "C` c #787778", "D` c #7C7C7D", "E` c #858485", "F` c #8D8A8D", "G` c #949095", "H` c #9D969E", "I` c #A99EAC", "J` c #B3ACB7", "K` c #C0C1BE", "L` c #B0B4B9", "M` c #9F9DA1", "N` c #908484", "O` c #8B7977", "P` c #9C9699", "Q` c #8C9092", "R` c #A7B2B7", "S` c #BBC7D0", "T` c #ACB1BB", "U` c #A2A9B2", "V` c #B7C2CA", "W` c #9AA0AB", "X` c #9CA2AC", "Y` c #A0A7B0", "Z` c #A0ABB2", "`` c #939EA8", " . c #99A5AF", ". . c #A4AFB3", "+ . c #808989", "@ . c #707772", "# . c #A1A4A3", "$ . c #ABABAD", "% . c #989A9C", "& . c #A7A8A9", "* . c #AEB7C3", "= . c #7D858D", "- . c #6F7479", "; . c #9A9CA0", "> . c #ABB3B9", ", . c #82868A", "' . c #727376", ") . c #58555B", "! . c #3E3944", "~ . c #2F2C38", "{ . c #383642", "] . c #4E4B57", "^ . c #605D68", "/ . c #54515C", "( . c #53525C", "_ . c #9DA2AD", ": . c #B3B7C4", "< . c #B8BDCA", "[ . c #B4C5C9", "} . c #B2C4C9", "| . c #ACBDC2", "1 . c #89949C", "2 . c #B1C3C8", "3 . c #AFC1C8", "4 . c #494950", "5 . c #53575E", "6 . c #7E878D", "7 . c #A6B3B6", "8 . c #9DA3A1", "9 . c #9B9D9C", "0 . c #AEAFB5", "a . c #B9B9BF", "b . c #C5C4BF", "c . c #B8B9B8", "d . c #B9B8B7", "e . c #B6B4B5", "f . c #B7B8B9", "g . c #B3B4B5", "h . c #AAABAE", "i . c #969AA1", "j . c #6F6E78", "k . c #585963", "l . c #6E737E", "m . c #959EAA", "n . c #B7C3CF", "o . c #5B5F68", "p . c #C2D1D9", "q . c #79868F", "r . c #748088", "s . c #8F9DA4", "t . c #B3C6CE", "u . c #ADBAC6", "v . c #93A3AA", "w . c #A8C1C8", "x . c #B7CFD7", "y . c #BCCFD7", "z . c #7E818B", "A . c #848690", "B . c #A4AEB5", "C . c #959AA4", "D . c #82858F", "E . c #707379", "F . c #5D5F66", "G . c #4C4C57", "H . c #3E3C49", "I . c #514C58", "J . c #55525C", "K . c #57575D", "L . c #5B5D5F", "M . c #686568", "N . c #726C70", "O . c #7B7379", "P . c #857C86", "Q . c #95899B", "R . c #A49DAE", "S . c #B0B3BB", "T . c #B8C2C2", "U . c #8E8C94", "V . c #8D7D80", "W . c #988080", "X . c #B4ACAF", "Y . c #C5C4C8", "Z . c #C6C6C8", "` . c #908F92", " .. c #8E9196", "... c #A8B1B7", "+.. c #ACB4BF", "@.. c #A7ACB7", "#.. c #BFCBD2", "$.. c #BEC6D2", "%.. c #B6BDC9", "&.. c #AFB8C2", "*.. c #97A0A7", "=.. c #969CA4", "-.. c #7E7E84", ";.. c #7A7579", ">.. c #C7C7C7", ",.. c #A5A5A7", "'.. c #97989A", ").. c #949597", "!.. c #9B9B9C", "~.. c #BBBBB9", "{.. c #B2BBC5", "].. c #ABB2BD", "^.. c #6D757D", "/.. c #60666C", "(.. c #7B7F82", "_.. c #ADB5BB", ":.. c #B5C1C9", "<.. c #B8C4CA", "[.. c #B6BEC0", "}.. c #9FA3A5", "|.. c #7B7C81", "1.. c #575962", "2.. c #464653", "3.. c #535360", "4.. c #6F707B", "5.. c #868890", "6.. c #7C7E87", "7.. c #70727C", "8.. c #6C6F79", "9.. c #A1A9B3", "0.. c #BAC2CE", "a.. c #949DA5", "b.. c #494A54", "c.. c #51535D", "d.. c #ACB8BB", "e.. c #9A9D9A", "f.. c #999895", "g.. c #A9A8A8", "h.. c #BABABE", "i.. c #BDBDC1", "j.. c #C4C6BD", "k.. c #A6A0BA", "l.. c #C6C7C3", "m.. c #BEC0BD", "n.. c #C6C4C3", "o.. c #ADADAE", "p.. c #A5A5A6", "q.. c #9F9F9E", "r.. c #9E9C98", "s.. c #959390", "t.. c #8A8989", "u.. c #858588", "v.. c #8F9598", "w.. c #959A9B", "x.. c #989794", "y.. c #9CA0A2", "z.. c #9AA2A8", "A.. c #959EA8", "B.. c #A1ABB4", "C.. c #61676F", "D.. c #99A1AB", "E.. c #C2D3DA", "F.. c #77828A", "G.. c #717A83", "H.. c #99A4AE", "I.. c #B0C4CB", "J.. c #B7CCD2", "K.. c #BBCDD3", "L.. c #BCC9CF", "M.. c #BAC8CC", "N.. c #AAB6BA", "O.. c #869194", "P.. c #98A5AA", "Q.. c #A2AEB7", "R.. c #A7B0BB", "S.. c #848C95", "T.. c #878D97", "U.. c #8E909D", "V.. c #878B96", "W.. c #838892", "X.. c #838A94", "Y.. c #7F8690", "Z.. c #747A80", "`.. c #787278", " +. c #786F76", ".+. c #776F78", "++. c #76747E", "@+. c #7C7E8A", "#+. c #878D98", "$+. c #969EA6", "%+. c #A5ADB3", "&+. c #B7BEC4", "*+. c #BAC2C8", "=+. c #B2B0B0", "-+. c #888991", ";+. c #82828A", ">+. c #999498", ",+. c #B5ADAD", "'+. c #BEBABB", ")+. c #C3C3C4", "!+. c #C3C3C6", "~+. c #918B91", "{+. c #8E8B92", "]+. c #B5BFCB", "^+. c #BCC8D3", "/+. c #B7C1CD", "(+. c #C4CDD7", "_+. c #B5BABE", ":+. c #B5B9BD", "<+. c #BDC4CB", "[+. c #C6D2D8", "}+. c #C8CED3", "|+. c #BEC1C4", "1+. c #9A9DA4", "2+. c #ADADAF", "3+. c #C4C3C4", "4+. c #C6C5C5", "5+. c #B6B7B8", "6+. c #B0B0B1", "7+. c #A5A2A1", "8+. c #9B9A95", "9+. c #BEBFC2", "0+. c #ADB5B9", "a+. c #ADB4BF", "b+. c #6A6D76", "c+. c #60636B", "d+. c #828790", "e+. c #B1C0C6", "f+. c #B3C4C8", "g+. c #ABBCBF", "h+. c #A0ADB2", "i+. c #A4A5AC", "j+. c #AFADB1", "k+. c #ABAAAE", "l+. c #A5A7AD", "m+. c #60656F", "n+. c #656972", "o+. c #737984", "p+. c #4E505B", "q+. c #3D3A41", "r+. c #6F7079", "s+. c #91969F", "t+. c #A6A9AB", "u+. c #ACACAD", "v+. c #BDBDC2", "w+. c #BEC0C1", "x+. c #C6C1C3", "y+. c #BFB7C2", "z+. c #C4C1BF", "A+. c #C4C2BF", "B+. c #BAB9B8", "C+. c #A3A6A8", "D+. c #9C9FA3", "E+. c #97999B", "F+. c #999A99", "G+. c #929492", "H+. c #81868A", "I+. c #959A99", "J+. c #999C9A", "K+. c #A5AEAF", "L+. c #B0C1C8", "M+. c #6A737A", "N+. c #6B747C", "O+. c #A1ACB6", "P+. c #BFCDD7", "Q+. c #C0D1D8", "R+. c #818C93", "S+. c #788088", "T+. c #A1AEB6", "U+. c #B7C9CD", "V+. c #B9CACE", "W+. c #AABABF", "X+. c #96A4A7", "Y+. c #8A9699", "Z+. c #9BA9AE", "`+. c #BAC9D2", " @. c #BCCED6", ".@. c #9CA9AF", "+@. c #8A989F", "@@. c #AAB6C0", "#@. c #B8C2CF", "$@. c #B3BFCB", "%@. c #AEBCC7", "&@. c #ABBAC3", "*@. c #9FAEB6", "=@. c #929AA4", "-@. c #918F97", ";@. c #878790", ">@. c #828992", ",@. c #828F97", "'@. c #B9C5C8", ")@. c #BAC3C6", "!@. c #BCC1C5", "~@. c #89878F", "{@. c #908F98", "]@. c #AAA9AE", "^@. c #928990", "/@. c #89838B", "(@. c #979BA1", "_@. c #C4D0DB", ":@. c #C9D3DC", "<@. c #C7CACF", "[@. c #C6CCD3", "}@. c #C5CBD0", "|@. c #B7B9BD", "1@. c #8B8B93", "2@. c #747C82", "3@. c #A1A3A6", "4@. c #B0ADAB", "5@. c #9D9C98", "6@. c #979795", "7@. c #9B9C9D", "8@. c #A6AEAE", "9@. c #AEB8B9", "0@. c #A3A8B5", "a@. c #666670", "b@. c #B1BFCA", "c@. c #ABBDC3", "d@. c #AEC2C8", "e@. c #AEC4C9", "f@. c #B1C5C9", "g@. c #B4C4C8", "h@. c #BBBEC8", "i@. c #BDBEC6", "j@. c #BEBEC4", "k@. c #BEC0C6", "l@. c #BBC3CA", "m@. c #AEC2C6", "n@. c #B4BCC8", "o@. c #778087", "p@. c #545A62", "q@. c #4A4C56", "r@. c #5B5C66", "s@. c #959DA6", "t@. c #525561", "u@. c #373440", "v@. c #59525C", "w@. c #82818B", "x@. c #90949D", "y@. c #8D919B", "z@. c #8D8E97", "A@. c #BDB6C4", "B@. c #C7C7C1", "C@. c #C5C2BD", "D@. c #C6C4BE", "E@. c #C3C3BF", "F@. c #A8AAAB", "G@. c #989D9E", "H@. c #8D9396", "I@. c #8D949A", "J@. c #91989E", "K@. c #969DA4", "L@. c #A6ADB0", "M@. c #A7AEB1", "N@. c #A2ABAE", "O@. c #9DA8AD", "P@. c #A5B1B7", "Q@. c #A6B1B5", "R@. c #A8B3B6", "S@. c #AFBDC0", "T@. c #8A979F", "U@. c #758088", "V@. c #737E86", "W@. c #838E97", "X@. c #BDCBD5", "Y@. c #BDCED5", "Z@. c #AFC1C6", "`@. c #868E96", " #. c #848D95", ".#. c #AFC0C7", "+#. c #B7C8CC", "@#. c #B8C9CC", "##. c #B8C9CD", "$#. c #B6CDD4", "%#. c #AABFC6", "&#. c #98A8AF", "*#. c #8A969C", "=#. c #909DA1", "-#. c #A0AEB2", ";#. c #C0D0DA", ">#. c #A7B3BD", ",#. c #808791", "'#. c #A0ACB3", ")#. c #9FAEB4", "!#. c #A3B4BB", "~#. c #B1C3CD", "{#. c #BACFD9", "]#. c #BACDD6", "^#. c #B8CBD3", "/#. c #B6C9D1", "(#. c #B2C6CC", "_#. c #ABB5C1", ":#. c #A8B0B9", "<#. c #A1ACB3", "[#. c #9EAEB5", "}#. c #A0B1B8", "|#. c #AABBC3", "1#. c #B0C2C8", "2#. c #BAC4CB", "3#. c #BBC3CB", "4#. c #BCC2C9", "5#. c #C2C3C8", "6#. c #B3B2B5", "7#. c #9A999A", "8#. c #89888A", "9#. c #9A96A0", "0#. c #ADA9B2", "a#. c #C2C4C3", "b#. c #B1AFB4", "c#. c #928A91", "d#. c #847D84", "e#. c #88888E", "f#. c #99A0A5", "g#. c #CAD3DE", "h#. c #CAD5DF", "i#. c #C9D4DF", "j#. c #C2CED9", "k#. c #C6D1DC", "l#. c #CAD1D8", "m#. c #C9D0D7", "n#. c #C7CFD7", "o#. c #BCC5CC", "p#. c #878891", "q#. c #6A6B75", "r#. c #61686E", "s#. c #8C8F92", "t#. c #B9B7B7", "u#. c #AFAEAE", "v#. c #86888A", "w#. c #7D8183", "x#. c #979F99", "y#. c #A5AEAA", "z#. c #A2AAAD", "A#. c #8F949F", "B#. c #60606B", "C#. c #646771", "D#. c #A5B5BB", "E#. c #ADC0C6", "F#. c #B2C7CC", "G#. c #B6CBCE", "H#. c #B9C8CE", "I#. c #B8C1D0", "J#. c #B8BFD0", "K#. c #BCC0CC", "L#. c #B7C5CC", "M#. c #ABBEC3", "N#. c #B6BCC9", "O#. c #B5C3C8", "P#. c #60696F", "Q#. c #454B51", "R#. c #51555D", "S#. c #9CA4AD", "T#. c #525761", "U#. c #665D6B", "V#. c #857B8A", "W#. c #84848F", "X#. c #666974", "Y#. c #6A6A74", "Z#. c #A1A2A6", "`#. c #BFC0C1", " $. c #C4C4C5", ".$. c #B8B7B2", "+$. c #B8B8B6", "@$. c #ABADAF", "#$. c #999EA1", "$$. c #879093", "%$. c #7C878C", "&$. c #869198", "*$. c #BCCAD2", "=$. c #BCCAD0", "-$. c #79878E", ";$. c #6C7680", ">$. c #7D8893", ",$. c #9AA6B1", "'$. c #7B838B", ")$. c #B2CAD3", "!$. c #A8BFC8", "~$. c #99ABB4", "{$. c #8B989F", "]$. c #838E92", "^$. c #8E979C", "/$. c #B2C1C9", "($. c #B0C0C8", "_$. c #9EA8B4", ":$. c #717681", "<$. c #5B5F69", "[$. c #9EADB4", "}$. c #9DAAB0", "|$. c #AEC5CD", "1$. c #B1CCD3", "2$. c #B4CACF", "3$. c #BBC8D4", "4$. c #B9CCD1", "5$. c #B5CAD1", "6$. c #B9C5CC", "7$. c #C2C6CC", "8$. c #ACACB2", "9$. c #898A8F", "0$. c #ADA7B1", "a$. c #C7C0C8", "b$. c #C7C3C6", "c$. c #BABBBC", "d$. c #AFAFB2", "e$. c #968F95", "f$. c #837C83", "g$. c #888B8F", "h$. c #AFB7BF", "i$. c #C6D4DC", "j$. c #B2BBC4", "k$. c #A9B3BA", "l$. c #B3BCC5", "m$. c #8F939D", "n$. c #575B63", "o$. c #4F545A", "p$. c #9D9E9F", "q$. c #C0C2C3", "r$. c #A7A8AB", "s$. c #848387", "t$. c #6D6C6E", "u$. c #878D85", "v$. c #929993", "w$. c #5C5E68", "x$. c #686E76", "y$. c #B4C7CB", "z$. c #B4C6CA", "A$. c #B1C2C5", "B$. c #ADBDC0", "C$. c #A7B5B9", "D$. c #9CA8AE", "E$. c #ADC2C6", "F$. c #AFBBCE", "G$. c #AEBAD2", "H$. c #B3BCCC", "I$. c #B4BCC9", "J$. c #B5BCC9", "K$. c #5E666C", "L$. c #50565D", "M$. c #6C747B", "N$. c #6C747D", "O$. c #72727E", "P$. c #8F8797", "Q$. c #A096A8", "R$. c #777682", "S$. c #444650", "T$. c #53535C", "U$. c #9C9C9F", "V$. c #BCC0C3", "W$. c #C2C3BD", "X$. c #BDBFBC", "Y$. c #B7B9B7", "Z$. c #8E8F92", "`$. c #85878B", " %. c #8B9194", ".%. c #969EA0", "+%. c #98A0A2", "@%. c #9AA4A6", "#%. c #6D757E", "$%. c #666B76", "%%. c #888E99", "&%. c #B6C3CD", "*%. c #7C838C", "=%. c #BBCED5", "-%. c #BECED3", ";%. c #ADBDC6", ">%. c #A3B6BE", ",%. c #9EAFB7", "'%. c #888E95", ")%. c #848890", "!%. c #919EA5", "~%. c #96A4AC", "{%. c #A9B8C1", "]%. c #5E666D", "^%. c #9CADB5", "/%. c #ABBDC4", "(%. c #828B92", "_%. c #B0C1C6", ":%. c #B5C8CF", "<%. c #BAC6C9", "[%. c #8F949D", "}%. c #85878F", "|%. c #AEACB2", "1%. c #C4C3C3", "2%. c #B6B5BA", "3%. c #9F9EA2", "4%. c #8B898C", "5%. c #807F82", "6%. c #84878B", "7%. c #BAC9D1", "8%. c #919EA7", "9%. c #76808A", "0%. c #61626D", "a%. c #646671", "b%. c #6A6C77", "c%. c #70737C", "d%. c #6B6D72", "e%. c #72767A", "f%. c #7A7F83", "g%. c #7D8187", "h%. c #95A1AC", "i%. c #9FABB6", "j%. c #BCC4CD", "k%. c #999DA0", "l%. c #ABB3BB", "m%. c #687078", "n%. c #797A7E", "o%. c #BBB8B9", "p%. c #B1A8AA", "q%. c #9F9396", "r%. c #7D7C7C", "s%. c #6C6E71", "t%. c #6A6771", "u%. c #73787C", "v%. c #98A2A5", "w%. c #BBCACC", "x%. c #C4D2D3", "y%. c #BFCECE", "z%. c #B2C2C2", "A%. c #A3B1B4", "B%. c #959DA1", "C%. c #B3C1BA", "D%. c #B4C4BC", "E%. c #B1C3C2", "F%. c #B2BBC9", "G%. c #B2BBCC", "H%. c #B4BCCA", "I%. c #B1BCC2", "J%. c #AEC3C8", "K%. c #AFC4C9", "L%. c #B3BEC9", "M%. c #8F98A3", "N%. c #9CA4B0", "O%. c #ACB3BE", "P%. c #A2ABB6", "Q%. c #9A9EA9", "R%. c #8B8B95", "S%. c #75727B", "T%. c #534F57", "U%. c #413F46", "V%. c #46454C", "W%. c #A1A1A2", "X%. c #BCBCBA", "Y%. c #C0C2BF", "Z%. c #BABDBA", "`%. c #ABADAE", " &. c #93959B", ".&. c #676B74", "+&. c #7B8389", "@&. c #99A7AA", "#&. c #6A717B", "$&. c #686C77", "%&. c #9096A1", "&&. c #828A93", "*&. c #B1C3CA", "=&. c #A6B2B9", "-&. c #A6B3B8", ";&. c #A3A9B2", ">&. c #9A9FAA", ",&. c #878F99", "'&. c #808B93", ")&. c #808B94", "!&. c #808992", "~&. c #71747E", "{&. c #6B6C76", "]&. c #6E7179", "^&. c #8A969D", "/&. c #87949B", "(&. c #93A0A8", "_&. c #7C878E", ":&. c #687177", "<&. c #6B747A", "[&. c #A6B6BF", "}&. c #84919B", "|&. c #6C767E", "1&. c #9BA7AD", "2&. c #B5C3C9", "3&. c #B2C3C7", "4&. c #B6C7CB", "5&. c #959CA4", "6&. c #8E9097", "7&. c #BAB8BD", "8&. c #929496", "9&. c #8C8E92", "0&. c #8E9398", "a&. c #B5C1CB", "b&. c #8F9CA6", "c&. c #737D86", "d&. c #616570", "e&. c #555561", "f&. c #4C4D58", "g&. c #4C4C56", "h&. c #524F56", "i&. c #47464B", "j&. c #4B4A4F", "k&. c #58595E", "l&. c #65676B", "m&. c #67686D", "n&. c #686B70", "o&. c #6B7176", "p&. c #8F9BA5", "q&. c #9BA7B1", "r&. c #B9C2CB", "s&. c #9C9FA4", "t&. c #A5B1BB", "u&. c #717B83", "v&. c #4D5358", "w&. c #797C81", "x&. c #B7B7B6", "y&. c #C7BDBE", "z&. c #BBAEB2", "A&. c #8B878A", "B&. c #5A555F", "C&. c #555258", "D&. c #646468", "E&. c #7D8385", "F&. c #969FA0", "G&. c #A0A7A9", "H&. c #9CA3A6", "I&. c #8F969A", "J&. c #7E8489", "K&. c #919AA0", "L&. c #B5C3BC", "M&. c #B2C0C4", "N&. c #ADC4C7", "O&. c #AFC2C8", "P&. c #B2BEC8", "Q&. c #B0BAC7", "R&. c #7E8188", "S&. c #3A353D", "T&. c #3D3940", "U&. c #58565B", "V&. c #808082", "W&. c #BDBCBA", "X&. c #C7C7C0", "Y&. c #7D7F88", "Z&. c #5B5C67", "`&. c #616670", " *. c #828D93", ".*. c #A6B5B9", "+*. c #A9BAC0", "@*. c #B7C7D1", "#*. c #6F7981", "$*. c #707982", "%*. c #AEBFC9", "&*. c #B6C8D3", "**. c #B5C8D1", "=*. c #7C8085", "-*. c #6B6874", ";*. c #5A5A66", ">*. c #535661", ",*. c #545863", "'*. c #565965", ")*. c #4D4E5A", "!*. c #4E4E59", "~*. c #595862", "{*. c #676770", "]*. c #74757E", "^*. c #7A7E88", "/*. c #828E96", "(*. c #B9C7D1", "_*. c #BAC8D0", ":*. c #8D979F", "<*. c #ACB5BF", "[*. c #6F7C88", "}*. c #505E69", "|*. c #9BA2A7", "1*. c #ACADAF", "2*. c #A1A2A3", "3*. c #999C9F", "4*. c #9DA1A8", "5*. c #A1A7B0", "6*. c #91979D", "7*. c #99A1A6", "8*. c #9CA6B0", "9*. c #80838F", "0*. c #656974", "a*. c #595C64", "b*. c #59585D", "c*. c #5B575B", "d*. c #5F6068", "e*. c #6C6E75", "f*. c #72767D", "g*. c #777C82", "h*. c #7C8084", "i*. c #818488", "j*. c #868990", "k*. c #8E949D", "l*. c #4D5359", "m*. c #7A7E85", "n*. c #A1A3A9", "o*. c #B7B8BA", "p*. c #A7A6A4", "q*. c #A6A4A2", "r*. c #B3B2B0", "s*. c #C6C0C4", "t*. c #C1BABE", "u*. c #A7A4A5", "v*. c #878487", "w*. c #67626A", "x*. c #49464B", "y*. c #5B5D60", "z*. c #59545E", "A*. c #4F4A53", "B*. c #423A3E", "C*. c #868D92", "D*. c #B4C3C4", "E*. c #B2C3C1", "F*. c #AFC2C3", "G*. c #B0C3C7", "H*. c #ADC1C6", "I*. c #ACBFC4", "J*. c #9BA5AE", "K*. c #6D6F77", "L*. c #413D45", "M*. c #2F2B35", "N*. c #44414A", "O*. c #737074", "P*. c #A3A1A1", "Q*. c #C3C3BD", "R*. c #BBBABC", "S*. c #B4B2B3", "T*. c #908F95", "U*. c #6C6D78", "V*. c #585A64", "W*. c #6A7179", "X*. c #94A0A5", "Y*. c #BACBCF", "Z*. c #B9CDD3", "`*. c #B6C5CF", " =. c #78848D", ".=. c #7D8A93", "+=. c #9AAAB2", "@=. c #838F95", "#=. c #8E9BA3", "$=. c #A5B3BE", "%=. c #B9C9D5", "&=. c #B7CAD3", "*=. c #72787D", "==. c #5E5A62", "-=. c #544F5B", ";=. c #474552", ">=. c #3E3D4A", ",=. c #3A3946", "'=. c #383643", ")=. c #373542", "!=. c #423F4B", "~=. c #6B6572", "{=. c #797783", "]=. c #7E828C", "^=. c #88969D", "/=. c #B8C6D1", "(=. c #B9C6D2", "_=. c #A4A9B5", ":=. c #6E737C", "<=. c #6E7079", "[=. c #7F7F89", "}=. c #97A0AB", "|=. c #5D6976", "1=. c #3B4955", "2=. c #B4C9D1", "3=. c #B8CAD2", "4=. c #A2A9AD", "5=. c #9A9B9D", "6=. c #B3B4B6", "7=. c #C2BFBF", "8=. c #9E9E9E", "9=. c #9EA0A4", "0=. c #B4BBC7", "a=. c #8D9197", "b=. c #8D9195", "c=. c #A9B2B7", "d=. c #C6D4DB", "e=. c #7E848B", "f=. c #7C7A7E", "g=. c #757780", "h=. c #868993", "i=. c #8E97A1", "j=. c #969FA6", "k=. c #9CA0A5", "l=. c #9E9FA7", "m=. c #C1CDD4", "n=. c #B1BDCA", "o=. c #B0BCC9", "p=. c #71797F", "q=. c #7B7F87", "r=. c #A2A5AC", "s=. c #979692", "t=. c #ADAAA8", "u=. c #C3BFBE", "v=. c #A7A1A2", "w=. c #777178", "x=. c #4C4751", "y=. c #443E48", "z=. c #3D393F", "A=. c #353335", "B=. c #2F2C2F", "C=. c #342836", "D=. c #372C37", "E=. c #2F232A", "F=. c #4E4A4F", "G=. c #858C92", "H=. c #AFC3C8", "I=. c #ADC3C7", "J=. c #AEB7C4", "K=. c #AAB6C2", "L=. c #A5B3BD", "M=. c #879099", "N=. c #5C5C66", "O=. c #312D3A", "P=. c #8D8B8E", "Q=. c #C0BCBA", "R=. c #1E01B1", "S=. c #C4CBC4", "T=. c #C9C5C4", "U=. c #B2AFAF", "V=. c #89898B", "W=. c #80888F", "X=. c #9FAEB3", "Y=. c #AFC0C8", "Z=. c #8B979F", "`=. c #A3B3BA", " -. c #9FADB1", ".-. c #778386", "+-. c #7C888C", "@-. c #9EADB3", "#-. c #BFD1DA", "$-. c #B8CDD5", "%-. c #A4B2BE", "&-. c #9395A2", "*-. c #8A8F99", "=-. c #767B85", "--. c #5F616C", ";-. c #4E4D58", ">-. c #534E54", ",-. c #605A64", "'-. c #726D7F", ")-. c #87839D", "!-. c #9A9CAC", "~-. c #A4ABB5", "{-. c #A8B1BA", "]-. c #AFC1C9", "^-. c #B3C6CF", "/-. c #C2D3D9", "(-. c #70777F", "_-. c #5D5B65", ":-. c #64606B", "<-. c #979EA8", "[-. c #585F68", "}-. c #3A3E46", "|-. c #B2C7D0", "1-. c #B1CBD4", "2-. c #B6CAD2", "3-. c #B2C3CB", "4-. c #A2A8AD", "5-. c #B9B8B9", "6-. c #9D9D9E", "7-. c #9FA3A6", "8-. c #9098A0", "9-. c #8D959A", "0-. c #A8B2B5", "a-. c #C6D1D4", "b-. c #C7D0DA", "c-. c #ADB4BD", "d-. c #ADB3BB", "e-. c #AAB2BB", "f-. c #ACB4BD", "g-. c #B8C0C8", "h-. c #B9C0C7", "i-. c #B6C2CE", "j-. c #B8C3D0", "k-. c #C8D4DF", "l-. c #767C81", "m-. c #545658", "n-. c #7C7D80", "o-. c #9C9C9C", "p-. c #999999", "q-. c #ADACAB", "r-. c #CABEBF", "s-. c #B1A4A6", "t-. c #847C80", "u-. c #605F65", "v-. c #686870", "w-. c #545559", "x-. c #413F41", "y-. c #3C353E", "z-. c #463D49", "A-. c #58525B", "B-. c #6A666D", "C-. c #6E6A71", "D-. c #B1C7CC", "E-. c #ADBFC6", "F-. c #AEC1C7", "G-. c #525159", "H-. c #39333B", "I-. c #414046", "J-. c #9A9A9C", "K-. c #C5C0C4", "L-. c #BDB7C4", "M-. c #1B02B0", "N-. c #1800AE", "O-. c #2001AE", "P-. c #C4CCC4", "Q-. c #C8C6C5", "R-. c #7D7D80", "S-. c #5D5E64", "T-. c #767C84", "U-. c #A9BABF", "V-. c #B9CDD4", "W-. c #8F98A1", "X-. c #9FA9B2", "Y-. c #7B868B", "Z-. c #758085", "`-. c #8E9CA1", " ;. c #B6C6D2", ".;. c #868E97", "+;. c #747982", "@;. c #83838B", "#;. c #9090A2", "$;. c #9EA1BA", "%;. c #AFB5C5", "&;. c #646872", "*;. c #666B74", "=;. c #5F5D67", "-;. c #595D65", ";;. c #393740", ">;. c #71757D", ",;. c #ABC0C8", "';. c #B3CCD4", ");. c #989CA0", "!;. c #B8BABA", "~;. c #B3BBC1", "{;. c #9FA9AC", "];. c #B1BABC", "^;. c #C0CACF", "/;. c #CCD8E2", "(;. c #575759", "_;. c #9FA0A1", ":;. c #C9BEBF", "<;. c #B6A8AA", "[;. c #95888B", "};. c #7B7377", "|;. c #89888F", "1;. c #868991", "2;. c #777A7F", "3;. c #5C5962", "4;. c #7C7D84", "5;. c #92989C", "6;. c #9A9EA6", "7;. c #A3AAB2", "8;. c #AFC6CA", "9;. c #AFC2C6", "0;. c #B1C3C5", "a;. c #B1C2C3", "b;. c #ADBCBF", "c;. c #B3BDC5", "d;. c #3A333B", "e;. c #58545C", "f;. c #807F85", "g;. c #A7A7AA", "h;. c #C5CAC2", "i;. c #A2A2A4", "j;. c #706F75", "k;. c #52535C", "l;. c #808890", "m;. c #A2AFB6", "n;. c #B1C3C9", "o;. c #BBCED4", "p;. c #AABBC1", "q;. c #8F9EA5", "r;. c #AEB7C1", "s;. c #8B97A0", "t;. c #79848C", "u;. c #7B878D", "v;. c #8B999E", "w;. c #BACDD5", "x;. c #B8C9D2", "y;. c #9EA9AE", "z;. c #A3ADB4", "A;. c #A8B2BE", "B;. c #AFB9C9", "C;. c #B8C2CD", "D;. c #BCC9D0", "E;. c #B9CDD5", "F;. c #B1C6CD", "G;. c #96A6AE", "H;. c #737B83", "I;. c #6C727B", "J;. c #717880", "K;. c #6B727B", "L;. c #5E626B", "M;. c #383641", "N;. c #646871", "O;. c #8C989F", "P;. c #A7B9BF", "Q;. c #B6CCD2", "R;. c #BEC3C3", "S;. c #B5BDBD", "T;. c #9C9E9F", "U;. c #9EA1A4", "V;. c #B2BAC0", "W;. c #A2AEB6", "X;. c #949DA4", "Y;. c #B6BCBF", "Z;. c #C8CED2", "`;. c #C9D1D8", " >. c #C4D2DB", ".>. c #CBD6DF", "+>. c #C9D3DB", "@>. c #C7D5DD", "#>. c #CEDBE3", "$>. c #797D83", "%>. c #56565B", "&>. c #7E7F85", "*>. c #AAADB0", "=>. c #A2A4A6", "->. c #A5A6A8", ";>. c #B3B3B4", ">>. c #C4C0C1", ",>. c #BAB0B1", "'>. c #A89698", ")>. c #978486", "!>. c #979295", "~>. c #94979C", "{>. c #8E9298", "]>. c #7A7A84", "^>. c #81838D", "/>. c #B0BBC2", "(>. c #ADC3C9", "_>. c #B0C5C6", ":>. c #B4C6C1", "<>. c #B6C5BE", "[>. c #B1BEC0", "}>. c #B2BBC6", "|>. c #A9B7BA", "1>. c #7C8389", "2>. c #52525A", "3>. c #3A333D", "4>. c #3C323E", "5>. c #716876", "6>. c #9B95A0", "7>. c #B5B2B7", "8>. c #C6C3BE", "9>. c #1700AF", "0>. c #1F01AF", "a>. c #4F525D", "b>. c #BDCDD3", "c>. c #8D9BA1", "d>. c #A4ACB7", "e>. c #A1AEBA", "f>. c #85909B", "g>. c #6C767D", "h>. c #677175", "i>. c #B2C5CD", "j>. c #B2C4CC", "k>. c #A2B4BD", "l>. c #79858F", "m>. c #707980", "n>. c #3C3C48", "o>. c #88939A", "p>. c #A6B6BB", "q>. c #9B9B9D", "r>. c #AFADAD", "s>. c #C3C0BF", "t>. c #BEC4C3", "u>. c #B5BEBE", "v>. c #9C9FA0", "w>. c #9E9FA3", "x>. c #B1B6BC", "y>. c #919BA5", "z>. c #A6A7AB", "A>. c #BEBFC3", "B>. c #C6CBD2", "C>. c #BFC8D2", "D>. c #CDDBE1", "E>. c #AAB4BA", "F>. c #74787F", "G>. c #82838C", "H>. c #9DA0A6", "I>. c #BEC2C2", "J>. c #BDB8B8", "K>. c #B8A6A6", "L>. c #AF9698", "M>. c #9F9799", "N>. c #95989B", "O>. c #91959B", "P>. c #8E9099", "Q>. c #858590", "R>. c #8C909A", "S>. c #AFC4CB", "T>. c #B0C6C6", "U>. c #B3C4BC", "V>. c #B4C1B6", "W>. c #B2BEBF", "X>. c #A1ADB2", "Y>. c #B5C3CB", "Z>. c #6D7279", "`>. c #423F49", " ,. c #322B36", ".,. c #433846", "+,. c #8A7C8F", "@,. c #B3A8B8", "#,. c #C0BBC3", "$,. c #C5C5BB", "%,. c #BEC3C2", "&,. c #B9C0C1", "*,. c #AFB2B8", "=,. c #90939A", "-,. c #6E7379", ";,. c #626B71", ">,. c #97A5AB", ",,. c #BECDD7", "',. c #88949D", "),. c #76848B", "!,. c #B6C6D1", "~,. c #98A4B0", "{,. c #52585D", "],. c #9BA9B1", "^,. c #BED0D5", "/,. c #95A4AB", "(,. c #78858E", "_,. c #6C717B", ":,. c #787D87", "<,. c #6A7079", "[,. c #5C6069", "},. c #8B969D", "|,. c #484D54", "1,. c #747D85", "2,. c #B5C6CA", "3,. c #909699", "4,. c #AAA9A9", "5,. c #9D9F9F", "6,. c #AFB0B4", "7,. c #C3C7CD", "8,. c #C7D1D9", "9,. c #898A92", "0,. c #9698A0", "a,. c #B2B8C1", "b,. c #BFCAD5", "c,. c #9EAEB4", "d,. c #ACB3BC", "e,. c #656871", "f,. c #46454D", "g,. c #8C8A8E", "h,. c #A1A19F", "i,. c #959592", "j,. c #BFB8B8", "k,. c #B9AFB0", "l,. c #A6A5AA", "m,. c #888A91", "n,. c #68676F", "o,. c #534E56", "p,. c #58545E", "q,. c #716F7A", "r,. c #91949D", "s,. c #B5C5C9", "t,. c #A9B9BA", "u,. c #A1B0AF", "v,. c #B4BDC8", "w,. c #B4BEC6", "x,. c #B2C2C6", "y,. c #B2BFC9", "z,. c #777983", "A,. c #72747E", "B,. c #B9C1CD", "C,. c #393742", "D,. c #362F3B", "E,. c #534A57", "F,. c #9C90A0", "G,. c #C1B7C4", "H,. c #C6C1C7", "I,. c #C2C4C1", "J,. c #C6C9C2", "K,. c #BFC1C1", "L,. c #A3A7AF", "M,. c #767D83", "N,. c #737F84", "O,. c #A0AFB5", "P,. c #B4C7D0", "Q,. c #B5C9D1", "R,. c #BECED8", "S,. c #A6B3BE", "T,. c #818C96", "U,. c #6B767F", "V,. c #BFD1DB", "W,. c #6E787F", "X,. c #4D5258", "Y,. c #6F757D", "Z,. c #B3C5CD", "`,. c #6D7881", " '. c #7A7F89", ".'. c #747B82", "+'. c #6B7079", "@'. c #7E868E", "#'. c #52585E", "$'. c #848E97", "%'. c #8B9196", "&'. c #A8A7A8", "*'. c #BAB9B9", "='. c #ADACB0", "-'. c #A7B0B8", ";'. c #838690", ">'. c #9CABB2", ",'. c #A9B2BB", "''. c #9FA9B3", ")'. c #ADB8C3", "!'. c #BCC9D4", "~'. c #C0C8D3", "{'. c #969BA7", "]'. c #5F626B", "^'. c #44454C", "/'. c #8C8A8C", "('. c #AAA7A5", "_'. c #A4A19D", ":'. c #989793", "<'. c #B0B2B7", "['. c #8A8A93", "}'. c #5A565F", "|'. c #3F3742", "1'. c #57505B", "2'. c #726F7A", "3'. c #7B878F", "4'. c #9AA7AD", "5'. c #AFBBC6", "6'. c #605D65", "7'. c #63606A", "8'. c #8A9099", "9'. c #B6BFCB", "0'. c #BBC1CE", "a'. c #BBBFCC", "b'. c #A4A6B4", "c'. c #585765", "d'. c #373341", "e'. c #423E4A", "f'. c #696570", "g'. c #A7A0AB", "h'. c #C5BEC6", "i'. c #BCC3C4", "j'. c #BBB9C0", "k'. c #C4CBC3", "l'. c #B6BBBC", "m'. c #868B95", "n'. c #828F96", "o'. c #B7C7D0", "p'. c #BED0D7", "q'. c #79838D", "r'. c #5F656F", "s'. c #818A92", "t'. c #C0D2DA", "u'. c #727C83", "v'. c #555B61", "w'. c #838B92", "x'. c #95A3AC", "y'. c #9BA9B3", "z'. c #71787F", "A'. c #717981", "B'. c #7E8991", "C'. c #93A0A6", "D'. c #909AA0", "E'. c #BDCDD5", "F'. c #595C65", "G'. c #8D95A0", "H'. c #B3C9D2", "I'. c #B1CAD1", "J'. c #B2C5CA", "K'. c #B6C4CD", "L'. c #B6C3CC", "M'. c #8B8F95", "N'. c #8D8E91", "O'. c #A7A7A7", "P'. c #9FA0A5", "Q'. c #AAAAAF", "R'. c #BCBDC1", "S'. c #C1C9D0", "T'. c #B5BEC7", "U'. c #9296A0", "V'. c #8C8F99", "W'. c #9DA3AD", "X'. c #A8B6BF", "Y'. c #B7C1CA", "Z'. c #B5C1CC", "`'. c #BAC2CD", " ). c #B4B9C4", ".). c #4A4D54", "+). c #848486", "@). c #A3A1A0", "#). c #A8A5A3", "$). c #A7A5A2", "%). c #97969E", "&). c #65616A", "*). c #473E49", "=). c #605D67", "-). c #6B6E77", ";). c #797E84", ">). c #84888C", ",). c #86898D", "'). c #525661", ")). c #575C68", "!). c #8E989F", "~). c #B1C1C9", "{). c #6F7275", "]). c #5D585D", "^). c #6E6B72", "/). c #9498A1", "(). c #B7C1CC", "_). c #BABECB", ":). c #B6B4C4", "<). c #9D95A7", "[). c #514858", "}). c #3B3442", "|). c #54515D", "1). c #AFACB2", "2). c #BEC0C3", "3). c #C3C4BF", "4). c #C3CCC4", "5). c #94969D", "6). c #828791", "7). c #BED1D6", "8). c #A2B1B7", "9). c #555761", "0). c #717781", "a). c #A2B2B8", "b). c #7A868C", "c). c #676F76", "d). c #87949D", "e). c #88959E", "f). c #909BA7", "g). c #9EA9B6", "h). c #B4C4CA", "i). c #6F747F", "j). c #60646F", "k). c #777E87", "l). c #8B949E", "m). c #757C86", "n). c #5B606B", "o). c #8E96A2", "p). c #ACBBC7", "q). c #B3C8D4", "r). c #B0CAD2", "s). c #AFB5C0", "t). c #8D9097", "u). c #A7A7A8", "v). c #A2A6AC", "w). c #9DA0A7", "x). c #A6A7AD", "y). c #B3B6B9", "z). c #9BA1A9", "A). c #B1B9C4", "B). c #B3BAC6", "C). c #BDC7CF", "D). c #A8ADB6", "E). c #84878F", "F). c #60646B", "G). c #7B7E82", "H). c #B8B5B4", "I). c #BDBCBB", "J). c #C1C2C3", "K). c #A6A6AA", "L). c #79767D", "M). c #48424C", "N). c #453D48", "O). c #443B46", "P). c #48404A", "Q). c #5C5B62", "R). c #646166", "S). c #635E63", "T). c #4E4D56", "U). c #3E3C48", "V). c #3B3845", "W). c #4E4C59", "X). c #8D929C", "Y). c #AFC3C9", "Z). c #B4C2C6", "`). c #4E4C4F", " !. c #635F61", ".!. c #828186", "+!. c #A2A5AF", "@!. c #B9C1CE", "#!. c #B6BAC7", "$!. c #ADA7B8", "%!. c #928396", "&!. c #4A3C4A", "*!. c #403743", "=!. c #67656F", "-!. c #9B9FA6", ";!. c #B4B7B8", ">!. c #BEBCB8", ",!. c #A5A1B9", "'!. c #C5C9C2", ")!. c #B6B5B6", "!!. c #7E8288", "~!. c #8B959C", "{!. c #C0D0D9", "]!. c #757B84", "^!. c #55555E", "/!. c #8D9AA3", "(!. c #7F8A93", "_!. c #A8B4BF", ":!. c #A3B1BA", "~. c #93A2AA", ",~. c #858F96", "'~. c #A3B2BD", ")~. c #98A2AE", "!~. c #979BB0", "~~. c #9D9FB8", "{~. c #B0B9CA", "]~. c #A2B3BB", "^~. c #788790", "/~. c #5B6873", "(~. c #78828C", "_~. c #B4C8CD", ":~. c #B4BBBC", "<~. c #A5ACAD", "[~. c #989B9D", "}~. c #B6BDC6", "|~. c #8E959D", "1~. c #9FA1A6", "2~. c #AFB2B7", "3~. c #BBC2C9", "4~. c #747B81", "5~. c #5F5E60", "6~. c #868688", "7~. c #919193", "8~. c #6E727A", "9~. c #767782", "0~. c #827E8A", "a~. c #89828F", "b~. c #7E7F8B", "c~. c #6B707B", "d~. c #595C68", "e~. c #51525E", "f~. c #615F6A", "g~. c #7C7682", "h~. c #9990A0", "i~. c #AFA7BA", "j~. c #B4B6C4", "k~. c #B2C2C4", "l~. c #A4B0B7", "m~. c #626670", "n~. c #979DA8", "o~. c #ACB3BF", "p~. c #BAC3D0", "q~. c #AFB4C0", "r~. c #95939D", "s~. c #6F6870", "t~. c #393138", "u~. c #453D40", "v~. c #7E7575", "w~. c #B9B1B0", "x~. c #BCC5C5", "y~. c #C5C3BD", "z~. c #BEBABC", "A~. c #837F81", "B~. c #7B7B7E", "C~. c #929BA0", "D~. c #C0D1DD", "E~. c #6A6A75", "F~. c #454049", "G~. c #89969D", "H~. c #A6B7BE", "I~. c #B9C8D2", "J~. c #BAC8D3", "K~. c #B9C9D2", "L~. c #9BAAB3", "M~. c #9CAEB5", "N~. c #96A9AE", "O~. c #8D9B9F", "P~. c #80878D", "Q~. c #7A858A", "R~. c #818F94", "S~. c #839096", "T~. c #838E96", "U~. c #818D96", "V~. c #76858E", "W~. c #70808A", "X~. c #7C8890", "Y~. c #9BA6B0", "Z~. c #9BA4AF", "`~. c #A4ABBC", " {. c #AFB6C9", ".{. c #B5C1CE", "+{. c #A6B6BE", "@{. c #848F97", "#{. c #676D77", "${. c #8E959B", "%{. c #A7A9AE", "&{. c #ACAFAF", "*{. c #8C8F93", "={. c #A4ACB4", "-{. c #898E95", ";{. c #C9D3D6", ">{. c #CDD6D8", ",{. c #C9D4D9", "'{. c #6B7378", "){. c #626467", "!{. c #6F6C6E", "~{. c #9B999A", "{{. c #969699", "]{. c #7C7E83", "^{. c #858794", "/{. c #8D8C9F", "({. c #9591A7", "_{. c #969AAA", ":{. c #929BA7", "<{. c #8C96A0", "[{. c #8A919D", "}{. c #9296A1", "|{. c #A0A0AD", "1{. c #AEADBB", "2{. c #B7B8C7", "3{. c #B3BBC5", "4{. c #B0C4C6", "5{. c #B3BEC8", "6{. c #757D87", "7{. c #585A66", "8{. c #3F404C", "9{. c #383843", "0{. c #5D5F69", "a{. c #8A909C", "b{. c #A4AEBA", "c{. c #B0BCC6", "d{. c #B7C2CE", "e{. c #A6AEBA", "f{. c #302E38", "g{. c #3F363D", "h{. c #736365", "i{. c #AA9997", "j{. c #B7BAB9", "k{. c #BCC6C6", "l{. c #BFC4C4", "m{. c #C5C1C1", "n{. c #BEB8C1", "o{. c #2001AC", "p{. c #2001AD", "q{. c #C2C0C2", "r{. c #817D7F", "s{. c #7A797E", "t{. c #939CA2", "u{. c #BED1DC", "v{. c #9EAAB6", "w{. c #6B6C78", "x{. c #48434D", "y{. c #666D76", "z{. c #A3B5BC", "A{. c #ACC1C6", "B{. c #909FA4", "C{. c #5F666B", "D{. c #6A7276", "E{. c #6E757A", "F{. c #6F767D", "G{. c #64727D", "H{. c #63757F", "I{. c #86959E", "J{. c #9FAFB6", "K{. c #A7B5BA", "L{. c #8D98A3", "M{. c #BCCAD4", "N{. c #737882", "O{. c #90A0A7", "P{. c #A7ABB2", "Q{. c #B1B2B3", "R{. c #96979A", "S{. c #888C90", "T{. c #C2CED4", "U{. c #848E96", "V{. c #767F87", "W{. c #AFB9BE", "X{. c #CAD4D4", "Y{. c #CFD8D7", "Z{. c #CBD4D8", "`{. c #7D888D", " ]. c #626A6D", ".]. c #67686B", "+]. c #817D7E", "@]. c #AEABAA", "#]. c #C4C3C2", "$]. c #85878C", "%]. c #808289", "&]. c #828492", "*]. c #8A8BA1", "=]. c #9698B3", "-]. c #A6AEC0", ";]. c #B1C4C7", ">]. c #B0C6C9", ",]. c #B0C6CB", "']. c #6E7581", ")]. c #4A4C59", "!]. c #32303D", "~]. c #3A3947", "{]. c #646B74", "]]. c #808A93", "^]. c #AEBCC6", "/]. c #98A2AD", "(]. c #707681", "_]. c #474954", ":]. c #2B2D3A", "<]. c #362F39", "[]. c #5C4A4E", "}]. c #8B7673", "|]. c #ABABAA", "1]. c #C0C5C5", "2]. c #1D01A9", "3]. c #1D01AA", "4]. c #7A7980", "5]. c #747880", "6]. c #BCCDD6", "7]. c #656C75", "8]. c #78838C", "9]. c #8E9DA5", "0]. c #A0B1B9", "a]. c #B4C2CD", "b]. c #8A9298", "c]. c #8A9094", "d]. c #9CA4A8", "e]. c #9DA4A6", "f]. c #929FA4", "g]. c #98A7B0", "h]. c #A9B8C2", "i]. c #BACDD4", "j]. c #B3C5CF", "k]. c #AABAC4", "l]. c #9DAAB4", "m]. c #838C92", "n]. c #828689", "o]. c #94969A", "p]. c #9FA6AD", "q]. c #9CACB4", "r]. c #9AAEB4", "s]. c #A8BDC3", "t]. c #A8BDC2", "u]. c #9EB0B6", "v]. c #94A2A8", "w]. c #969CA9", "x]. c #6F7681", "y]. c #737E87", "z]. c #99A9AD", "A]. c #BBBBBE", "B]. c #C0C7C6", "C]. c #B1B8B9", "D]. c #9BA0A1", "E]. c #A4A6A9", "F]. c #BEC9CF", "G]. c #969CA6", "H]. c #CAD7E0", "I]. c #CAD5E0", "J]. c #CBD5E0", "K]. c #CAD6E0", "L]. c #C5D1D7", "M]. c #CBD5D9", "N]. c #CBD1D4", "O]. c #B8BBBE", "P]. c #71777D", "Q]. c #595E62", "R]. c #6B6D6D", "S]. c #908D8A", "T]. c #B3B0AE", "U]. c #AFB1B2", "V]. c #606067", "W]. c #585964", "X]. c #727683", "Y]. c #959EAC", "Z]. c #B7C6CA", "`]. c #B3C6CD", " ^. c #B5CBCF", ".^. c #A9B2BA", "+^. c #8E949C", "@^. c #524F5B", "#^. c #3F3B48", "$^. c #4B4D58", "%^. c #797C89", "&^. c #969AA7", "*^. c #A4ADB7", "=^. c #B0BEC7", "-^. c #9DADB5", ";^. c #5D606B", ">^. c #332C3A", ",^. c #312832", "'^. c #3C3335", ")^. c #59534F", "!^. c #969896", "~^. c #B8BDBD", "{^. c #C2C5C5", "]^. c #1E01AA", "^^. c #1E01AB", "/^. c #7B7B83", "(^. c #BCCDD3", "_^. c #9BAAB1", ":^. c #7A858D", "<^. c #939BA7", "[^. c #9199A5", "}^. c #888F9A", "|^. c #6E6F75", "1^. c #828388", "2^. c #838286", "3^. c #747D87", "4^. c #868F9B", "5^. c #9BA4B1", "6^. c #A6B4BD", "7^. c #9EA6AA", "8^. c #9CA2A4", "9^. c #ABB2B6", "0^. c #B6C2C8", "a^. c #ACC0C6", "b^. c #A1B5BA", "c^. c #97A8AE", "d^. c #909EA5", "e^. c #BBCAD1", "f^. c #A6B2BE", "g^. c #7D8993", "h^. c #9AA9B1", "i^. c #9EADB2", "j^. c #9DA7AA", "k^. c #A8ACAF", "l^. c #BEC5C5", "m^. c #B5BCBC", "n^. c #A6AAAC", "o^. c #A6A8AB", "p^. c #B7BEC2", "q^. c #C6D0D7", "r^. c #C4D1DB", "s^. c #9499A2", "t^. c #A4AFB8", "u^. c #B6C1C7", "v^. c #B6BEC7", "w^. c #BAC4CC", "x^. c #B6BFC8", "y^. c #B0BBC5", "z^. c #C7CDD1", "A^. c #B1B4B6", "B^. c #62676D", "C^. c #50565A", "D^. c #727474", "E^. c #A1A09D", "F^. c #B8B6B4", "G^. c #929195", "H^. c #525157", "I^. c #414249", "J^. c #7B8188", "K^. c #A3B0B5", "L^. c #B1C5CA", "M^. c #B4C4C9", "N^. c #B4C0C6", "O^. c #63656E", "P^. c #48454F", "Q^. c #3E333F", "R^. c #433945", "S^. c #56525E", "T^. c #747984", "U^. c #BBC4D0", "V^. c #504B54", "W^. c #3E303A", "X^. c #342633", "Y^. c #2A202A", "Z^. c #292328", "`^. c #3B3939", " /. c #737375", "./. c #BBB8BF", "+/. c #818188", "@/. c #9BA5B0", "#/. c #B3C8D0", "$/. c #9DACB4", "%/. c #5D5F68", "&/. c #5B5A65", "*/. c #636470", "=/. c #636571", "-/. c #5E606C", ";/. c #5B5D67", ">/. c #65696E", ",/. c #65686E", "'/. c #64646D", ")/. c #65646E", "!/. c #66616A", "~/. c #625D66", "{/. c #545762", "]/. c #5D606C", "^/. c #6D717D", "//. c #828A94", "(/. c #B8C8D2", "_/. c #B4C4CE", ":/. c #ACBDC5", "(. c #858993", ",(. c #BCC9D5", "'(. c #777D84", ")(. c #4B4651", "!(. c #4D4C57", "~(. c #4E4F5A", "{(. c #4F515C", "](. c #65676D", "^(. c #70737D", "/(. c #6D6C76", "((. c #67636D", "_(. c #605B66", ":(. c #585560", "<(. c #53525D", "[(. c #474854", "}(. c #61666E", "|(. c #B5C8CC", "1(. c #B5C7D3", "2(. c #B3CBD5", "3(. c #B1CDD6", "4(. c #B0CDD6", "5(. c #9EA9AF", "6(. c #9BA5AA", "7(. c #8F9A9D", "8(. c #8C9497", "9(. c #919497", "0(. c #9898A1", "a(. c #9A9EA8", "b(. c #94A3AA", "c(. c #B5CACE", "d(. c #A3A5A7", "e(. c #8B8D90", "f(. c #8C8D91", "g(. c #A8A9AB", "h(. c #C4C6C9", "i(. c #C0CDD7", "j(. c #C9D5DF", "k(. c #C4CDD5", "l(. c #999B9E", "m(. c #666870", "n(. c #5C5E66", "o(. c #717278", "p(. c #8A8C8F", "q(. c #888E94", "r(. c #878D93", "s(. c #888B90", "t(. c #86878B", "u(. c #7F8087", "v(. c #7B7C85", "w(. c #7A7B85", "x(. c #7B7D85", "y(. c #9EA2AB", "z(. c #BCC9D2", "A(. c #4E555A", "B(. c #54585D", "C(. c #888B8E", "D(. c #BEC1BE", "E(. c #BBC5BB", "F(. c #B8C5B9", "G(. c #BABDBD", "H(. c #B6B3B3", "I(. c #B3B1B1", "J(. c #ABA8A7", "K(. c #A3A1A2", "L(. c #98989E", "M(. c #848994", "N(. c #83848F", "O(. c #837F89", "P(. c #807980", "Q(. c #727073", "R(. c #524E55", "S(. c #49434E", "T(. c #4E4C55", "U(. c #6C7179", "V(. c #8D959E", "W(. c #97A0A2", "X(. c #80828B", "Y(. c #797D87", "Z(. c #6B737C", "`(. c #5C5F68", " _. c #4B4952", "._. c #363541", "+_. c #77717A", "@_. c #99959E", "#_. c #B0B3BD", "$_. c #B3C6CC", "%_. c #4E3D42", "&_. c #4B3235", "*_. c #463841", "=_. c #403745", "-_. c #3B3240", ";_. c #382D3B", ">_. c #342737", ",_. c #4F4552", "'_. c #7C7A81", ")_. c #A9ACAD", "!_. c #B8BCBA", "~_. c #C3C3BC", "{_. c #8D9198", "]_. c #89919B", "^_. c #BACBD0", "/_. c #8999A0", "(_. c #829199", "__. c #919AA2", ":_. c #9AA6B0", "<_. c #9EAAB4", "[_. c #A1ABB5", "}_. c #A1A8B0", "|_. c #A0A5AE", "1_. c #8D939D", "2_. c #7F858F", "3_. c #616A72", "4_. c #596167", "5_. c #5D656C", "6_. c #6C777E", "7_. c #839199", "8_. c #B5CBD2", "9_. c #B5CCD3", "0_. c #B3C8CE", "a_. c #A9BABD", "b_. c #9DAAAE", "c_. c #A0B3B8", "d_. c #ACC0C5", "e_. c #6C7178", "f_. c #5A6066", "g_. c #51575E", "h_. c #5A5661", "i_. c #4D4E54", "j_. c #494B51", "k_. c #4B4B54", "l_. c #4F4D58", "m_. c #514F59", "n_. c #595860", "o_. c #66676D", "p_. c #73787D", "q_. c #919EA8", "r_. c #A7B7C0", "s_. c #B7C5CF", "t_. c #A4B5BB", "u_. c #919DA2", "v_. c #8C9196", "w_. c #B7B7B2", "x_. c #8E8E8F", "y_. c #87888D", "z_. c #9B9DA5", "A_. c #B5B9C2", "B_. c #C3D0DB", "C_. c #72757B", "D_. c #737378", "E_. c #909093", "F_. c #9EA1A6", "G_. c #999FA5", "H_. c #959CA2", "I_. c #8E9294", "J_. c #919296", "K_. c #9A9CA4", "L_. c #BECCD6", "M_. c #CCDAE1", "N_. c #979FA8", "O_. c #5B5B60", "P_. c #6E6D70", "Q_. c #9A999B", "R_. c #C6C4C4", "S_. c #C3C6C4", "T_. c #BDC1BF", "U_. c #A5A5A9", "V_. c #9D9EA4", "W_. c #93949B", "X_. c #817E84", "Y_. c #726D74", "Z_. c #69646C", "`_. c #67626B", " :. c #6F6D6F", ".:. c #727274", "+:. c #727279", "@:. c #70757F", "#:. c #727881", "$:. c #787C84", "%:. c #84858C", "&:. c #9E9D9F", "*:. c #A2A2A2", "=:. c #929498", "-:. c #52565D", ";:. c #4D5058", ">:. c #4E5059", ",:. c #4F565C", "':. c #4F565A", "):. c #4D5153", "!:. c #4B4C4D", "~:. c #4C4B50", "{:. c #494953", "]:. c #464855", "^:. c #454754", "/:. c #3E404C", "(:. c #36343F", "_:. c #56565D", "::. c #70747B", "<:. c #A8B2B9", "[:. c #B4C0CA", "}:. c #9FAAB4", "|:. c #82878E", "1:. c #646167", "2:. c #7D7F8A", "3:. c #818592", "4:. c #696874", "5:. c #4C4150", "6:. c #412645", "7:. c #503754", "8:. c #706675", "9:. c #979B9B", "0:. c #C1C1BE", "a:. c #BDBFBD", "b:. c #BCB8C0", "c:. c #909499", "d:. c #BBCBD0", "e:. c #ACBCC5", "f:. c #838F98", "g:. c #6F7982", "h:. c #727C85", "i:. c #86929A", "j:. c #B7C8D2", "k:. c #829098", "l:. c #717C82", "m:. c #6A757A", "n:. c #6F7A81", "o:. c #949FA3", "p:. c #9EAFB5", "q:. c #9FB1B7", "r:. c #5A5C64", "s:. c #50555B", "t:. c #49454E", "u:. c #413F47", "v:. c #3F3F47", "w:. c #44434D", "x:. c #4C4A56", "y:. c #696A70", "z:. c #88919A", "A:. c #ABBBC4", "B:. c #BCCFD4", "C:. c #A7B9BE", "D:. c #A8AAAC", "E:. c #C3C2BE", "F:. c #BBBAB5", "G:. c #8B8F94", "H:. c #9499A1", "I:. c #777A80", "J:. c #A6A6A7", "K:. c #B2B8B8", "L:. c #AAB2B2", "M:. c #9B9F9F", "N:. c #A8ACB7", "O:. c #BDC5CF", "P:. c #585A63", "Q:. c #69676C", "R:. c #888688", "S:. c #AAA8A9", "T:. c #BFBCBC", "U:. c #98989D", "V:. c #888A8D", "W:. c #86898F", "X:. c #81848E", "Y:. c #73717C", "Z:. c #69646F", "`:. c #655F69", " <. c #66626B", ".<. c #6F7076", "+<. c #6F747E", "@<. c #787F88", "#<. c #808891", "$<. c #959EA5", "%<. c #B7BABF", "&<. c #ABAFB8", "*<. c #9299A6", "=<. c #727B84", "-<. c #616870", ";<. c #5A5A65", "><. c #4A4B52", ",<. c #424143", "'<. c #434244", ")<. c #444247", "!<. c #43404A", "~<. c #44404D", "{<. c #464451", "]<. c #484754", "^<. c #4B4B58", "/<. c #66696F", "(<. c #AFC3C7", "_<. c #B0C4C9", ":<. c #A5B0BE", "<<. c #A2ADB7", "[<. c #868D95", "}<. c #565862", "|<. c #969FAB", "1<. c #898B95", "2<. c #635763", "3<. c #4E2C49", "4<. c #553551", "5<. c #6F6171", "6<. c #8E9296", "7<. c #B3B2B3", "8<. c #C0BDBC", "9<. c #BCC1BF", "0<. c #BCC1BE", "a<. c #BFC2C0", "b<. c #C0C3C4", "c<. c #C0C4C0", "d<. c #8C9398", "e<. c #AFBEC9", "f<. c #C1D5DA", "g<. c #BCD1D6", "h<. c #BBCED2", "i<. c #BBCFD7", "j<. c #BACED6", "k<. c #A2B1BC", "l<. c #93A2A7", "m<. c #93A3A9", "n<. c #77838B", "o<. c #626F7A", "p<. c #56636E", "q<. c #70757D", "r<. c #798288", "s<. c #7F8A90", "t<. c #6F7279", "u<. c #5F626A", "v<. c #6E6F76", "w<. c #7B7C82", "x<. c #8D949B", "y<. c #949BA2", "z<. c #9BA2A9", "A<. c #A9B9C2", "B<. c #BCD0D5", "C<. c #A8B8BE", "D<. c #89929A", "E<. c #A6ACAD", "F<. c #969EA2", "G<. c #CCD2D8", "H<. c #83878E", "I<. c #62656D", "J<. c #72747A", "K<. c #C6C3C2", "L<. c #B8BBB6", "M<. c #A2A4A3", "N<. c #919297", "O<. c #999DA5", "P<. c #60676F", "Q<. c #474B51", "R<. c #A0A0A1", "S<. c #B8B7B6", "T<. c #AEA8AB", "U<. c #918B92", "V<. c #736F79", "W<. c #68686D", "X<. c #737478", "Y<. c #838792", "Z<. c #858693", "`<. c #8A8994", " [. c #939BA5", ".[. c #9FA8B2", "+[. c #AAB1BE", "@[. c #A2A6B9", "#[. c #9599AF", "$[. c #818A97", "%[. c #7D8791", "&[. c #848C96", "*[. c #8C8E9A", "=[. c #827C8B", "-[. c #78717E", ";[. c #716D77", ">[. c #665E69", ",[. c #6D6A74", "'[. c #767682", ")[. c #808390", "![. c #8C919D", "~[. c #95A1A6", "{[. c #ABB7C6", "][. c #B1BDD1", "^[. c #B0C0CB", "/[. c #B0C3C6", "([. c #B1C2C7", "_[. c #B1C3C7", ":[. c #B0BFC9", "<[. c #A6B4C1", "[[. c #99A5B4", "}[. c #6F737D", "|[. c #51525D", "1[. c #4C4F5B", "2[. c #756871", "3[. c #543544", "4[. c #573A4A", "5[. c #706470", "6[. c #8A8E95", "7[. c #8A898C", "8[. c #939192", "9[. c #A4A3A4", "0[. c #A9ABB0", "a[. c #B8C1C3", "b[. c #B5BFC1", "c[. c #B3BCBD", "d[. c #B3BBBA", "e[. c #B8BCBC", "f[. c #BABDBE", "g[. c #B6BFC0", "h[. c #B5C1C3", "i[. c #B8C4C6", "j[. c #BBC5C8", "k[. c #C1C4BE", "l[. c #B3C2CE", "m[. c #B3C6CB", "n[. c #B4C8CC", "o[. c #94A2AB", "p[. c #595F69", "q[. c #45505D", "r[. c #465662", "s[. c #727C86", "t[. c #909CA0", "u[. c #A1A6AA", "v[. c #B1B6B8", "w[. c #BCC6CC", "x[. c #A9B9BF", "y[. c #8F969F", "z[. c #A7AFB1", "A[. c #B7BABB", "B[. c #B5BDBE", "C[. c #A2ACAE", "D[. c #8F999B", "E[. c #8A9498", "F[. c #CACDD1", "G[. c #A5A6AA", "H[. c #6E6E74", "I[. c #484850", "J[. c #8C8C8F", "K[. c #C5C3BE", "L[. c #BFBCB7", "M[. c #A7A6A5", "N[. c #7F7F83", "O[. c #AAB2B8", "P[. c #C1CCD3", "Q[. c #BDC6CE", "R[. c #747E85", "S[. c #51585E", "T[. c #4A4F53", "U[. c #888C8E", "V[. c #B4B6B6", "W[. c #968E93", "X[. c #6B646D", "Y[. c #9398A2", "Z[. c #B2B8C0", "`[. c #C1C5CA", " }. c #CACED1", ".}. c #B6C3CE", "+}. c #AFB8C3", "@}. c #A0B0BC", "#}. c #97A1B3", "$}. c #9396AF", "%}. c #9191AC", "&}. c #8E96A6", "*}. c #B9BFCC", "=}. c #B3ACBF", "-}. c #ACA4B5", ";}. c #A5A3B0", ">}. c #90939C", ",}. c #918C93", "'}. c #999AA2", ")}. c #A6ABB4", "!}. c #B7C9D3", "~}. c #B1C1D3", "{}. c #AEBBD2", "]}. c #B0C1C4", "^}. c #B1C2C6", "/}. c #AFC4C8", "(}. c #AEC4C7", "_}. c #B3C2C6", ":}. c #A5B4C0", "<}. c #929EAC", "[}. c #797E89", "}}. c #595963", "|}. c #403E49", "1}. c #9EA6AE", "2}. c #95969E", "3}. c #797077", "4}. c #543E40", "5}. c #544143", "6}. c #6C646A", "7}. c #777377", "8}. c #9498A0", "9}. c #989CA1", "0}. c #A2A5A8", "a}. c #B4B6B7", "b}. c #B7C2C4", "c}. c #A6AAAE", "d}. c #ABABAE", "e}. c #A8AAAD", "f}. c #9FADB2", "g}. c #A1B0B5", "h}. c #B0BCBE", "i}. c #B7C0C0", "j}. c #BBC1C0", "k}. c #9B8DBF", "l}. c #C4BEC4", "m}. c #8A8F91", "n}. c #848E92", "o}. c #B7C6D1", "p}. c #B7C5D2", "q}. c #B6C5D1", "r}. c #9AA3AE", "s}. c #4F4D56", "t}. c #B9C9CF", "u}. c #B8C9D4", "v}. c #8D9BA4", "w}. c #75858F", "x}. c #61707A", "y}. c #666E77", "z}. c #83939C", "A}. c #7A8A95", "B}. c #8C949C", "C}. c #8E9193", "D}. c #7C8185", "E}. c #A3B0B4", "F}. c #ACB1B9", "G}. c #8C8F98", "H}. c #6A6D77", "I}. c #555155", "J}. c #746F6F", "K}. c #A09C9B", "L}. c #BFC3C4", "M}. c #C0B8BF", "N}. c #ACAAAE", "O}. c #89898C", "P}. c #67676B", "Q}. c #5D5E62", "R}. c #949799", "S}. c #B7BDC1", "T}. c #C4CDD4", "U}. c #CED3DB", "V}. c #5C6369", "W}. c #5C6166", "X}. c #74777B", "Y}. c #767375", "Z}. c #524F55", "`}. c #5D5F6B", " |. c #888B96", ".|. c #A2A7B1", "+|. c #ABB3BC", "@|. c #BCC5D0", "#|. c #A0ACB7", "$|. c #99A1AF", "%|. c #949AA8", "&|. c #A3B0BB", "*|. c #A6B3C0", "=|. c #A7B8BE", "-|. c #A6B8BD", ";|. c #A6B4B8", ">|. c #AEC5C8", ",|. c #AFC5C8", "'|. c #8E8D95", ")|. c #6B656E", "!|. c #3B3C44", "~|. c #757E86", "{|. c #78868F", "]|. c #5B646E", "^|. c #454249", "/|. c #443F43", "(|. c #656569", "_|. c #67666B", ":|. c #7F7E81", "<|. c #858D92", "[|. c #879197", "}|. c #A5B0B5", "||. c #B3C0C3", "1|. c #B3C0C4", "2|. c #A5B1B5", "3|. c #95A1A4", "4|. c #818C8F", "5|. c #727B7E", "6|. c #787D82", "7|. c #76787C", "8|. c #65696F", "9|. c #64686C", "0|. c #6D7275", "a|. c #A6ACB1", "b|. c #B6BEBF", "c|. c #BFC7C5", "d|. c #BFC4C1", "e|. c #C4C4BD", "f|. c #9A8FBF", "g|. c #C4C0C5", "h|. c #888D90", "i|. c #828B8F", "j|. c #9AA6A9", "k|. c #B6C7D1", "l|. c #A7B5C0", "m|. c #61636A", "n|. c #5D6069", "o|. c #94A1A9", "p|. c #AEC0C8", "q|. c #94A5AD", "r|. c #7A8C95", "s|. c #677781", "t|. c #697681", "u|. c #576570", "v|. c #93A2AB", "w|. c #A1A0A2", "x|. c #AFAFAF", "y|. c #7A7C7E", "z|. c #9BA3A7", "A|. c #82838E", "B|. c #6A6D74", "C|. c #4C484C", "D|. c #615B5C", "E|. c #989393", "F|. c #C8C8C8", "G|. c #C1C7C8", "H|. c #BEC3C6", "I|. c #C2C1C7", "J|. c #BEB6C0", "K|. c #56575A", "L|. c #49494E", "M|. c #7A7C7F", "N|. c #A2A7AB", "O|. c #BAC3CA", "P|. c #C9D4DB", "Q|. c #CBD0D8", "R|. c #B6B7C0", "S|. c #63686F", "T|. c #6A6E73", "U|. c #C7C7C8", "V|. c #AFB0B0", "W|. c #636265", "X|. c #B5C0CA", "Y|. c #A5B2BC", "Z|. c #9AA9B8", "`|. c #A9BDC4", " 1. c #AEC2C7", ".1. c #AFC5CA", "+1. c #B0C7CB", "@1. c #B0C6CA", "#1. c #A4AFB6", "$1. c #949299", "%1. c #70686F", "&1. c #49434A", "*1. c #6D747B", "=1. c #808C95", "-1. c #72818B", ";1. c #586470", ">1. c #40434D", ",1. c #3C3B43", "'1. c #5E6063", ")1. c #75787C", "!1. c #84878C", "~1. c #8B8F93", "{1. c #919B9E", "]1. c #8D999E", "^1. c #87959C", "/1. c #A3B5BB", "(1. c #96A3A6", "_1. c #838F92", ":1. c #747E83", "<1. c #717479", "[1. c #636669", "}1. c #6A6D70", "|1. c #888C93", "11. c #ADB6BA", "21. c #B5BFBF", "31. c #B8C0BE", "41. c #BCC0BD", "51. c #BEBCB9", "61. c #A6A1B9", "71. c #1D00AA", "81. c #2609AB", "91. c #9793BF", "01. c #858A8E", "a1. c #5A5D68", "b1. c #7C848F", "c1. c #98A9B0", "d1. c #ADC3CB", "e1. c #A7B9C1", "f1. c #A3B7BD", "g1. c #98ABB2", "h1. c #91A2AA", "i1. c #9AAAB1", "j1. c #979FAA", "k1. c #646B76", "l1. c #4A515C", "m1. c #77777E", "n1. c #9D9C9F", "o1. c #979694", "p1. c #848483", "q1. c #94989C", "r1. c #A8B0B8", "s1. c #93929C", "t1. c #86838C", "u1. c #8B8A91", "v1. c #86888D", "w1. c #555257", "x1. c #908D91", "y1. c #C9C8CB", "z1. c #B9B5BB", "A1. c #6A6B6F", "B1. c #4D4E53", "C1. c #46474D", "D1. c #899196", "E1. c #BFC8CF", "F1. c #53595F", "G1. c #4A5055", "H1. c #BEBCBE", "I1. c #C6C5C6", "J1. c #404047", "K1. c #80838D", "L1. c #A5ADB8", "M1. c #B3C3C9", "N1. c #B4C5CA", "O1. c #8C99A3", "P1. c #8F9DA5", "Q1. c #8D9AA1", "R1. c #A8B3C0", "S1. c #9FACBB", "T1. c #99A8B6", "U1. c #A9BBC2", "V1. c #B1C6C8", "W1. c #B1C6C9", "X1. c #B3C7CD", "Y1. c #B1C5C8", "Z1. c #898A91", "`1. c #484149", " 2. c #403B45", ".2. c #6E717A", "+2. c #838A93", "@2. c #7B848F", "#2. c #656C77", "$2. c #464550", "%2. c #4F5058", "&2. c #6C7378", "*2. c #A2AFB5", "=2. c #A3B3B8", "-2. c #9FB0B7", ";2. c #ACBFC5", ">2. c #9DACB2", ",2. c #949FA5", "'2. c #8D969A", ")2. c #8E979A", "!2. c #A2ACB2", "~2. c #A5AFB3", "{2. c #ABB6B7", "]2. c #B4BBBB", "^2. c #1C00AB", "/2. c #1C00A9", "(2. c #9695BE", "_2. c #B7B8B8", ":2. c #8C9094", "<2. c #969EA1", "[2. c #A8B4B6", "}2. c #636671", "|2. c #565964", "12. c #6C727E", "22. c #8C98A3", "32. c #9FADB6", "42. c #B5C5CF", "52. c #6A737B", "62. c #9AB1BA", "72. c #ACC4CD", "82. c #B0C3CC", "92. c #B2C7CB", "02. c #A0A4B1", "a2. c #6E6E7A", "b2. c #7B858D", "c2. c #767E88", "d2. c #75777F", "e2. c #A5A4A0", "f2. c #939390", "g2. c #8E8F95", "h2. c #9CA0AA", "i2. c #B4BCC4", "j2. c #928E96", "k2. c #918B90", "l2. c #A19EA1", "m2. c #4F4F58", "n2. c #84848B", "o2. c #C1C0C4", "p2. c #797B7D", "q2. c #595F64", "r2. c #757F84", "s2. c #4F555B", "t2. c #555A5D", "u2. c #8A8C8E", "v2. c #C2C0C4", "w2. c #B9B9BD", "x2. c #9D9EA3", "y2. c #41414A", "z2. c #929BA2", "A2. c #8D99A3", "B2. c #A5AFBE", "C2. c #9FABB9", "D2. c #9AA8B5", "E2. c #B2C1C6", "F2. c #B2C5C9", "G2. c #ADC4C8", "H2. c #B0C4CA", "I2. c #B4BBC6", "J2. c #AEBBC5", "K2. c #A0A8B7", "L2. c #747980", "M2. c #56555A", "N2. c #4A454D", "O2. c #6C6B75", "P2. c #524A55", "Q2. c #504B56", "R2. c #656771", "S2. c #869099", "T2. c #BCCFD6", "U2. c #B3B6B6", "V2. c #A7ADAF", "W2. c #788089", "X2. c #626771", "Y2. c #A2AAB3", "Z2. c #C1CED9", "`2. c #BDCCD6", " 3. c #A6B2BD", ".3. c #858C98", "+3. c #515560", "@3. c #7D8B94", "#3. c #9CADB6", "$3. c #AFC0C4", "%3. c #B2C4C8", "&3. c #81828D", "*3. c #64646F", "=3. c #909FA6", "-3. c #A7BABF", ";3. c #79797E", ">3. c #878B91", ",3. c #8B939C", "'3. c #8B8C92", ")3. c #4E4B56", "!3. c #6D6B77", "~3. c #9B9CA4", "{3. c #B7B7B5", "]3. c #C3C1BD", "^3. c #BABCC1", "/3. c #4B4E53", "(3. c #5C5860", "_3. c #736B74", ":3. c #767A7D", "<3. c #969B9E", "[3. c #959DA7", "}3. c #727476", "|3. c #9E9E9B", "13. c #C7C4C0", "23. c #C9C3C8", "33. c #BCB6C1", "43. c #A3A1AC", "53. c #464651", "63. c #40414D", "73. c #616771", "83. c #AFC6C9", "93. c #AFC4C7", "03. c #777C81", "a3. c #97A4AE", "b3. c #A5B4BA", "c3. c #AEC6CA", "d3. c #B3C7CC", "e3. c #AAB2BA", "f3. c #A9AFBD", "g3. c #A5A9BF", "h3. c #9294AE", "i3. c #575767", "j3. c #46454F", "k3. c #7E7E89", "l3. c #5F5D62", "m3. c #78787F", "n3. c #A1ACB9", "o3. c #B1C0CC", "p3. c #90949B", "q3. c #BBBAC0", "r3. c #1B02AC", "s3. c #1E00AD", "t3. c #B5BCBD", "u3. c #A3ACB0", "v3. c #9397A2", "w3. c #A0A6B3", "x3. c #A8B1BD", "y3. c #B5C4CD", "z3. c #9DA6B2", "A3. c #747683", "B3. c #666C76", "C3. c #81868E", "D3. c #A7B8BF", "E3. c #7D7E83", "F3. c #8E8D91", "G3. c #A7A6A9", "H3. c #868B92", "I3. c #878E98", "J3. c #939699", "K3. c #79757B", "L3. c #797A81", "M3. c #AAAAA8", "N3. c #BCBFC1", "O3. c #B0B2B9", "P3. c #93949F", "Q3. c #4F545B", "R3. c #484B51", "S3. c #928B92", "T3. c #858388", "U3. c #8F9193", "V3. c #C5CCD3", "W3. c #B4BBC5", "X3. c #6A6B71", "Y3. c #88898A", "Z3. c #AAACA7", "`3. c #C6C6C1", " 4. c #CBC6CA", ".4. c #B6B0BA", "+4. c #908D97", "@4. c #656770", "#4. c #474A55", "$4. c #656E78", "%4. c #8C9CA3", "&4. c #AEC5C9", "*4. c #868D94", "=4. c #6D7278", "-4. c #6C6F74", ";4. c #96A1AA", ">4. c #78838B", ",4. c #7F8A94", "'4. c #89949E", ")4. c #B2BDC8", "!4. c #B1C6CA", "~4. c #AEB6BE", "{4. c #A6AAB8", "]4. c #9696AB", "^4. c #7B7892", "/4. c #4A4858", "(4. c #484853", "_4. c #6B727A", ":4. c #454B50", "<4. c #6E7275", "[4. c #A5AEB8", "}4. c #B1BECA", "|4. c #B5C4D1", "14. c #898D96", "24. c #87888F", "34. c #919295", "44. c #BDBEC1", "54. c #ABB0B5", "64. c #808D96", "74. c #5A5964", "84. c #54535E", "94. c #62626E", "04. c #6D707C", "a4. c #8D97A1", "b4. c #797984", "c4. c #5C5D68", "d4. c #5E636C", "e4. c #768188", "f4. c #9FA9AF", "g4. c #9BA5AF", "h4. c #A0ADB8", "i4. c #ACBBC4", "j4. c #82868D", "k4. c #87848B", "l4. c #989197", "m4. c #B2B0B2", "n4. c #8C9097", "o4. c #AAAAB6", "p4. c #C5C4CF", "q4. c #BABDC4", "r4. c #A6ACB0", "s4. c #959A9E", "t4. c #B8B8B8", "u4. c #959497", "v4. c #716F75", "w4. c #B7BCBE", "x4. c #A4A3AA", "y4. c #847F8A", "z4. c #4E4F56", "A4. c #7D7C82", "B4. c #ACAAAF", "C4. c #A7A6AA", "D4. c #8A8A8D", "E4. c #B3B6BF", "F4. c #4F505A", "G4. c #969899", "H4. c #B1B5B3", "I4. c #C1C7C4", "J4. c #CAC9CB", "K4. c #B0ADB1", "L4. c #55575C", "M4. c #4A4A54", "N4. c #6A737D", "O4. c #88979E", "P4. c #B1C0CB", "Q4. c #818190", "R4. c #605B6C", "S4. c #4E4C56", "T4. c #7C8388", "U4. c #788189", "V4. c #5D646B", "W4. c #7D868B", "X4. c #B8C6D2", "Y4. c #B7C5D1", "Z4. c #B2C3C8", "`4. c #9096A0", " 5. c #7C7F88", ".5. c #797B82", "+5. c #C0C3C2", "@5. c #1B02AE", "#5. c #C5C3C5", "$5. c #B1B3B7", "%5. c #939BA2", "&5. c #A3B4BC", "*5. c #797C85", "=5. c #4A4955", "-5. c #595E66", ";5. c #6D747D", ">5. c #A0ABB7", ",5. c #A1A5B0", "'5. c #646570", ")5. c #545761", "!5. c #AFBCC8", "~5. c #888F98", "{5. c #7F7D86", "]5. c #867E85", "^5. c #ACA9AB", "/5. c #9799A1", "(5. c #94949F", "_5. c #A8A3AE", ":5. c #BAB1BC", "<5. c #A0A1A3", "[5. c #898A8B", "}5. c #5C5C5F", "|5. c #C2C9C8", "15. c #B2B8B9", "25. c #969399", "35. c #746B74", "45. c #5C5C63", "55. c #8E9093", "65. c #C3C4C7", "75. c #86878C", "85. c #797A7F", "95. c #B8B7BE", "05. c #ADACB5", "a5. c #73727D", "b5. c #484751", "c5. c #7C7B80", "d5. c #C6CAC9", "e5. c #A9AAA9", "f5. c #777778", "g5. c #4C4E51", "h5. c #50525A", "i5. c #707881", "j5. c #87939A", "k5. c #A6B4B9", "l5. c #ACC2C6", "m5. c #ABB1BD", "n5. c #717D85", "o5. c #8C939B", "p5. c #737780", "q5. c #9EACB2", "r5. c #B5C4D0", "s5. c #AFBFC8", "t5. c #B0C5CA", "u5. c #B2C1C4", "v5. c #ADB7C4", "w5. c #49434D", "x5. c #5E5C62", "y5. c #787B7F", "z5. c #8E9699", "A5. c #9FACB2", "B5. c #7A828B", "C5. c #9EA6AF", "D5. c #7C818C", "E5. c #A49FBB", "F5. c #B6B8BB", "G5. c #A4ACB2", "H5. c #99A8B0", "I5. c #777C85", "J5. c #5A5E6A", "K5. c #77828B", "L5. c #8C97A0", "M5. c #9CA7AF", "N5. c #B4C3CC", "O5. c #8E99A2", "P5. c #737A82", "Q5. c #A7A9AD", "R5. c #8D8C92", "S5. c #8C8A8F", "T5. c #A6A6A8", "U5. c #C8C9C7", "V5. c #868489", "W5. c #605E67", "X5. c #9DA09F", "Y5. c #C6C6C0", "Z5. c #CAC8C8", "`5. c #ADADB1", " 6. c #858990", ".6. c #70777E", "+6. c #A4A7AF", "@6. c #47454D", "#6. c #B1B3B5", "$6. c #707477", "%6. c #474C51", "&6. c #4E525B", "*6. c #B2C5C8", "=6. c #98A1AB", "-6. c #8E9CA3", ";6. c #7E858E", ">6. c #575A64", ",6. c #444450", "'6. c #757A82", ")6. c #A8B5BC", "!6. c #B4C3CE", "~6. c #B0B7C3", "{6. c #A9AFB9", "]6. c #787782", "^6. c #999CA6", "/6. c #9FA4AC", "(6. c #787D84", "_6. c #70747C", ":6. c #7A7E87", "<6. c #8B919B", "[6. c #8C949D", "}6. c #999CA0", "|6. c #C1C3BF", "16. c #4630AF", "26. c #9791BC", "36. c #BABCBD", "46. c #AFB9BD", "56. c #4E4E5A", "66. c #4A4C57", "76. c #5C636C", "86. c #78828B", "96. c #A2A9B4", "06. c #6E787E", "a6. c #60666A", "b6. c #838588", "c6. c #787A7D", "d6. c #97999C", "e6. c #AFB0B1", "f6. c #CACBC9", "g6. c #48474F", "h6. c #7A7A7E", "i6. c #CECCCB", "j6. c #AFADAE", "k6. c #54555D", "l6. c #5F626C", "m6. c #808388", "n6. c #A8A9A5", "o6. c #C8C7BE", "p6. c #CCC9C8", "q6. c #878B92", "r6. c #81858E", "s6. c #5C5C65", "t6. c #A0A2A4", "u6. c #707479", "v6. c #484D55", "w6. c #494D57", "x6. c #5F616A", "y6. c #808187", "z6. c #A0A4A7", "A6. c #B3C5C9", "B6. c #97A5AE", "C6. c #919FA8", "D6. c #828B94", "E6. c #595D68", "F6. c #7C828D", "G6. c #B2C3CD", "H6. c #B1C4CC", "I6. c #6D6F79", "J6. c #4D4D59", "K6. c #484A56", "L6. c #8A8F9A", "M6. c #AAAFBA", "N6. c #6B6B72", "O6. c #626269", "P6. c #878D96", "Q6. c #A7A8AC", "R6. c #9594BD", "S6. c #C5CAC1", "T6. c #BBBEBE", "U6. c #BCCED4", "V6. c #666B75", "W6. c #5D626C", "X6. c #5C616B", "Y6. c #62636F", "Z6. c #72757F", "`6. c #878F98", " 7. c #B0C2CA", ".7. c #AEC1C9", "+7. c #ADC2CA", "@7. c #9BABB0", "#7. c #A3A4A7", "$7. c #BDC4C3", "%7. c #CCCEC8", "&7. c #A9A8A5", "*7. c #4B4A52", "=7. c #7A7B7E", "-7. c #737379", ";7. c #4D4E56", ">7. c #8C898E", ",7. c #AEACA9", "'7. c #B2B2B6", ")7. c #8C8E94", "!7. c #686C72", "~7. c #5B5D65", "{7. c #55575F", "]7. c #5A5B64", "^7. c #6F6F78", "/7. c #A09FA1", "(7. c #73757B", "_7. c #4B5059", ":7. c #444651", "<7. c #82858D", "[7. c #ADBCC6", "}7. c #9AA9B5", "|7. c #9CABB6", "17. c #727A83", "27. c #868E9C", "37. c #ACC0C4", "47. c #ADC0C5", "57. c #B1C5CC", "67. c #B1C1CA", "77. c #B4C1CA", "87. c #B2C2C7", "97. c #7D818A", "07. c #606872", "a7. c #8C929A", "b7. c #717075", "c7. c #696C71", "d7. c #99A6AB", "e7. c #ADBEC6", "f7. c #898E97", "g7. c #9B9DA3", "h7. c #B1B1B3", "i7. c #1D02B0", "j7. c #9594BE", "k7. c #BCC2C5", "l7. c #B6C1C3", "m7. c #B7CCD3", "n7. c #595D67", "o7. c #646870", "p7. c #80868E", "q7. c #9AA0AA", "r7. c #B3BBC8", "s7. c #B2CBD3", "t7. c #B3C8CF", "u7. c #BFD3D9", "v7. c #A0B0B5", "w7. c #5E5D5F", "x7. c #9E9D9E", "y7. c #8B8D91", "z7. c #AEADB3", "A7. c #C0BFC4", "B7. c #CACCC5", "C7. c #AAA9A4", "D7. c #727173", "E7. c #4C4C55", "F7. c #909196", "G7. c #64646C", "H7. c #4A4851", "I7. c #958D92", "J7. c #B3AEAC", "K7. c #C5C5BF", "L7. c #B5B4B8", "M7. c #6C6D70", "N7. c #404046", "O7. c #62626B", "P7. c #8F9098", "Q7. c #A2A0A1", "R7. c #77787D", "S7. c #50525C", "T7. c #41404C", "U7. c #818892", "V7. c #B7C8D1", "W7. c #B2C2CE", "X7. c #9AA8B6", "Y7. c #97A3B0", "Z7. c #A2B0BA", "`7. c #869098", " 8. c #929EAB", ".8. c #A8B6C0", "+8. c #AEC6C9", "@8. c #AFC7CA", "#8. c #65676F", "$8. c #60666F", "%8. c #7E8C95", "&8. c #97A6AE", "*8. c #7A787E", "=8. c #6C696D", "-8. c #686D71", ";8. c #748084", ">8. c #99A6A9", ",8. c #ACC0C7", "'8. c #97A8B0", ")8. c #7D838D", "!8. c #8D8F96", "~8. c #3F23B3", "{8. c #BFBDC5", "]8. c #BBBFBF", "^8. c #B5C1C4", "/8. c #7E8790", "(8. c #6D6E7A", "_8. c #888C97", ":8. c #B9CAD4", "<8. c #B9CCD4", "[8. c #BECDD8", "}8. c #C2CEDA", "|8. c #C0CED8", "18. c #BFD0D9", "28. c #A4B0BA", "38. c #7B8089", "48. c #9E9FA2", "58. c #B1B0B5", "68. c #CACAC6", "78. c #ACABA8", "88. c #757478", "98. c #4F4F56", "08. c #55555B", "a8. c #53535D", "b8. c #3E3E4A", "c8. c #45434E", "d8. c #757379", "e8. c #9C9A9D", "f8. c #B5B3B5", "g8. c #C6C5C2", "h8. c #BBBBB5", "i8. c #A3A29D", "j8. c #7F7D7B", "k8. c #474248", "l8. c #797780", "m8. c #ADAFB3", "n8. c #797A7D", "o8. c #515358", "p8. c #B1C6CB", "q8. c #B0C5CB", "r8. c #B9CBD4", "s8. c #7D8891", "t8. c #7A858C", "u8. c #97A5AC", "v8. c #B0C2C6", "w8. c #B6C0CA", "x8. c #B2C6CB", "y8. c #B9CCD5", "z8. c #4D4750", "A8. c #4F4A55", "B8. c #767986", "C8. c #93A0AB", "D8. c #97A5AF", "E8. c #A1AEB9", "F8. c #9FA8B3", "G8. c #6D6B75", "H8. c #615E67", "I8. c #747981", "J8. c #909FA5", "K8. c #9199A1", "L8. c #9F9D9D", "M8. c #C9C6C2", "N8. c #C3BCC4", "O8. c #C3C0BD", "P8. c #B7BFC2", "Q8. c #B4C1C5", "R8. c #494852", "S8. c #51515C", "T8. c #AEBEC9", "U8. c #AFBFCA", "V8. c #B0C1C9", "W8. c #ADC0C8", "X8. c #ACBDC6", "Y8. c #A6B2BF", "Z8. c #BFCED8", "`8. c #828993", " 9. c #9FA1A4", ".9. c #B6B5B8", "+9. c #A3A3A6", "@9. c #C9C8C7", "#9. c #A9A8A9", "$9. c #46464E", "%9. c #4D4C53", "&9. c #4E4D54", "*9. c #7A7B7F", "=9. c #B6B6BA", "-9. c #BABAB4", ";9. c #A0A19C", ">9. c #7E7D7D", ",9. c #4F4A51", "'9. c #5B555E", ")9. c #8C8A91", "!9. c #848D96", "~9. c #B9C8D1", "{9. c #677076", "]9. c #646E73", "^9. c #8F9CA2", "/9. c #B9C3CE", "(9. c #ACC2C7", "_9. c #B5C4CE", ":9. c #818591", "<9. c #8D939F", "[9. c #B0BDC9", "}9. c #9AA7B3", "|9. c #9DA4B0", "19. c #63606C", "29. c #5E5C66", "39. c #6F7379", "49. c #6B6B6E", "59. c #878485", "69. c #A8A6A6", "79. c #B0B6B6", "89. c #B6BDBE", "99. c #1B02AF", "09. c #1E00B1", "a9. c #C1BDC2", "b9. c #BCC2BB", "c9. c #BBC3BA", "d9. c #B5BCC0", "e9. c #969EA8", "f9. c #828590", "g9. c #575B64", "h9. c #54555F", "i9. c #848A93", "j9. c #B6C8D1", "k9. c #B6C6D0", "l9. c #A1B0B9", "m9. c #9BABB2", "n9. c #9BA3AC", "o9. c #96A5AE", "p9. c #99A8B1", "q9. c #9DABB6", "r9. c #9EACB7", "s9. c #9CAAB3", "t9. c #95A4AC", "u9. c #79848D", "v9. c #717D8D", "w9. c #758293", "x9. c #828E9A", "y9. c #8D9AA0", "z9. c #89939A", "A9. c #767C82", "B9. c #B7B6B7", "C9. c #A1A1A5", "D9. c #68686E", "E9. c #3D3D46", "F9. c #55555D", "G9. c #6B6B70", "H9. c #7A787B", "I9. c #838183", "J9. c #88868C", "K9. c #585862", "L9. c #4E4E57", "M9. c #A1A2A4", "N9. c #6F7075", "O9. c #56545B", "P9. c #6A676E", "Q9. c #99979D", "R9. c #C4C4C7", "S9. c #A2A4A8", "T9. c #737479", "U9. c #49494F", "V9. c #879198", "W9. c #8A949B", "X9. c #B2BFC4", "Y9. c #AEBDC6", "Z9. c #ADC1C5", "`9. c #A2ACB6", " 0. c #818490", ".0. c #5D5C68", "+0. c #474652", "@0. c #8D919D", "#0. c #63646D", "$0. c #757A7F", "%0. c #696769", "&0. c #7E7E7F", "*0. c #95999A", "=0. c #A8ADAE", "-0. c #BFBFBB", ";0. c #BAC6BA", ">0. c #BEC2BE", ",0. c #B6B4B7", "'0. c #737B84", ")0. c #B4C4D0", "!0. c #7E8992", "~0. c #7B838D", "{0. c #7B7F89", "]0. c #7C7D87", "^0. c #7B868F", "/0. c #7E8892", "(0. c #7F8994", "_0. c #7D8792", ":0. c #7A818B", "<0. c #777D85", "[0. c #6D777E", "}0. c #4D535B", "|0. c #404A5B", "10. c #475163", "20. c #59616F", "30. c #81848F", "40. c #9BA7B0", "50. c #8F9B9F", "60. c #7D8689", "70. c #95999B", "80. c #A3A3A3", "90. c #98999B", "00. c #B1B2B2", "a0. c #5E5F67", "b0. c #3E3E46", "c0. c #6F7176", "d0. c #B1AFAE", "e0. c #BEBBB9", "f0. c #76777D", "g0. c #57565E", "h0. c #9C9CA0", "i0. c #C2C0C5", "j0. c #C8C6CB", "k0. c #ADADB4", "l0. c #82848C", "m0. c #5E6166", "n0. c #A2A2A6", "o0. c #C3C2C6", "p0. c #A0A0A4", "q0. c #42414A", "r0. c #B6C7D2", "s0. c #656C73", "t0. c #868F95", "u0. c #464854", "v0. c #79838C", "w0. c #B4C1CD", "x0. c #82888D", "y0. c #616265", "z0. c #7C7D7E", "A0. c #BCB9C1", "B0. c #1900AE", "C0. c #280AAB", "D0. c #9693BF", "E0. c #C2BCC1", "F0. c #C3BCC3", "G0. c #CACAC8", "H0. c #C8C8C6", "I0. c #C3C4C2", "J0. c #C5C6C2", "K0. c #C8C7C4", "L0. c #ADACAD", "M0. c #9DABB2", "N0. c #747D86", "O0. c #646C75", "P0. c #5C626B", "Q0. c #5D6168", "R0. c #828890", "S0. c #B8D0D9", "T0. c #A5BBC4", "U0. c #5D6369", "V0. c #595D64", "W0. c #575760", "X0. c #56545F", "Y0. c #555762", "Z0. c #53545F", "`0. c #524D58", " a. c #504954", ".a. c #50515B", "+a. c #4E4C57", "@a. c #4C4954", "#a. c #53505C", "$a. c #504D58", "%a. c #4D5159", "&a. c #46444D", "*a. c #3D3942", "=a. c #353543", "-a. c #373847", ";a. c #4B454E", ">a. c #45414D", ",a. c #4A4B57", "'a. c #5E636D", ")a. c #81909B", "!a. c #718089", "~a. c #BECDD2", "{a. c #94A2A5", "]a. c #858F91", "^a. c #B0AEAD", "/a. c #B6B5B5", "(a. c #A2A2A3", "_a. c #98999A", ":a. c #B1B3B3", "b. c #46464F", ",b. c #504E58", "'b. c #474550", ")b. c #45434F", "!b. c #47444F", "~b. c #494753", "{b. c #444751", "]b. c #6F808A", "^b. c #5D6D78", "/b. c #99A5A9", "(b. c #8E9599", "_b. c #C5C4C1", ":b. c #C7C6BF", "c. c #666770", ",c. c #5F686E", "'c. c #5F676E", ")c. c #636770", "!c. c #676E77", "~c. c #6D737D", "{c. c #73747E", "]c. c #6B6D77", "^c. c #626770", "/c. c #71757F", "(c. c #4E535A", "_c. c #666D74", ":c. c #6A7C87", "d. c #949FA8", ",d. c #67767F", "'d. c #61717C", ")d. c #95A1AA", "!d. c #808690", "~d. c #5D5F6A", "{d. c #524E58", "]d. c #7F8A92", "^d. c #849299", "/d. c #8C969D", "(d. c #858F97", "_d. c #86959D", ":d. c #87969D", "e. c #4C4B54", ",e. c #4A474F", "'e. c #48454E", ")e. c #48464F", "!e. c #4B4A55", "~e. c #4A4651", "{e. c #4D444F", "]e. c #3F3A48", "^e. c #414350", "/e. c #636B74", "(e. c #929CA5", "_e. c #949DA3", ":e. c #959CA3", "f. c #ACB5C3", ",f. c #B1C1CB", "'f. c #A9B3BF", ")f. c #A3A2A6", "!f. c #3D24AF", "~f. c #1C02AC", "{f. c #1D00B1", "]f. c #1B00AE", "^f. c #2609AD", "/f. c #C8C6C6", "(f. c #ABA8AB", "_f. c #7B777F", ":f. c #58535E", "g. c #9B93A3", ",g. c #ACA6B7", "'g. c #B5B9C7", ")g. c #8E9195", "!g. c #9A9DA0", "~g. c #AEB1B3", "{g. c #3C24AF", "]g. c #1D00AE", "^g. c #1B00AB", "/g. c #A19D9F", "(g. c #6C6970", "_g. c #4E4C58", ":g. c #84858F", "h. c #92999C", ",h. c #B2B3B3", "'h. c #1D00AC", ")h. c #959294", "!h. c #65646B", "~h. c #969BA8", "{h. c #C0D1D9", "]h. c #BFC8D0", "^h. c #C3C3CD", "/h. c #C6C1CD", "(h. c #C2C8D4", "_h. c #9DA3A7", ":h. c #9EA1A2", "i. c #7E878F", ",i. c #738089", "'i. c #687884", ")i. c #61707F", "!i. c #5C6577", "~i. c #545662", "{i. c #829198", "]i. c #818C95", "^i. c #9CA3AF", "/i. c #B9C0CD", "(i. c #A2B3B9", "_i. c #879399", ":i. c #B8CCD0", "j. c #6E7177", ",j. c #72777D", "'j. c #878F94", ")j. c #B4C9D2", "!j. c #B3C8D2", "~j. c #B3C8D1", "{j. c #B3C9CF", "]j. c #B3C2CC", "^j. c #7D8790", "/j. c #919BA3", "(j. c #8F9EA6", "_j. c #8E9EA8", ":j. c #8D9DA9", "k. c #878D92", ",k. c #B7C7CA", "'k. c #6C757C", ")k. c #9DABB4", "!k. c #B2C2CD", "~k. c #B3C6CA", "{k. c #94A3AB", "]k. c #6C7076", "^k. c #686F79", "/k. c #8896A0", "(k. c #B1C4CD", "_k. c #B5C4CA", ":k. c #A2B5BA", "l. c #AAB4C1", ",l. c #959FA9", "'l. c #61707B", ")l. c #6E7F88", "!l. c #96A6AD", "~l. c #BDCCD1", "{l. c #6D7C86", "]l. c #5B6C76", "^l. c #95A5AD", "/l. c #828E97", "(l. c #85919A", "_l. c #4D4B54", ":l. c #8A969E", "m. c #A2ADB8", ",m. c #B3C9D0", "'m. c #B2C8D1", ")m. c #A9B4BE", "!m. c #98A3AA", "~m. c #95A4AA", "{m. c #A7AFB9", "]m. c #7E838C", "^m. c #46404A", "/m. c #5E5A64", "(m. c #B4CAD2", "_m. c #B1C9D1", ":m. c #A3B7BC", "n. c #9AA5AC", ",n. c #838D95", "'n. c #464853", ")n. c #808691", "!n. c #B5CBD3", "~n. c #B2C7CE", "{n. c #7B878E", "]n. c #6B7077", "^n. c #888993", "/n. c #69696F", "(n. c #81808A", "_n. c #9497A1", ":n. c #B5C4CF", "o. c #6E777E", ",o. c #B3B7BE", "'o. c #C3C1BB", ")o. c #C5C3C0", "!o. c #3C24AE", "~o. c #9893BC", "{o. c #C9C8CC", "]o. c #ABA9AE", "^o. c #7A797F", "/o. c #595B63", "(o. c #9CACB1", "_o. c #9AA4AF", ":o. c #98A3AC", "p. c #BDCED6", ",p. c #7C848D", "'p. c #5A5E68", ")p. c #4B4A53", "!p. c #7F8590", "~p. c #9EAEB6", "{p. c #B8CED5", "]p. c #848D97", "^p. c #60626C", "/p. c #BACBD5", "(p. c #A5ADB7", "_p. c #6C6D77", ":p. c #9397A3", "q. c #919CA2", ",q. c #BCBEC0", "'q. c #A59FBC", ")q. c #BEC4C2", "!q. c #AAAEAF", "~q. c #5D6065", "{q. c #AFBFC9", "]q. c #747E84", "^q. c #64696F", "/q. c #878B95", "(q. c #595F66", "_q. c #818A93", ":q. c #BDD0D6", "r. c #7F868F", ",r. c #A0B4BE", "'r. c #B3CAD3", ")r. c #BBD1D6", "!r. c #99ACB1", "~r. c #687479", "{r. c #7A868F", "]r. c #738087", "^r. c #8C9DA3", "/r. c #7C858A", "(r. c #676C70", "_r. c #969FA3", ":r. c #B2BEC3", "s. c #A9BFC7", ",s. c #7C828A", "'s. c #BED2D8", ")s. c #A3B2B7", "!s. c #787F85", "~s. c #5A5C63", "{s. c #747A7F", "]s. c #919CA0", "^s. c #878E95", "/s. c #878A93", "(s. c #82868F", "_s. c #67747E", ":s. c #5E6E78", "t. c #8BA2A8", ",t. c #8FA6AC", "'t. c #787884", ")t. c #62717C", "!t. c #384753", "~t. c #444D55", "{t. c #5F656C", "]t. c #51545F", "^t. c #4E4F5B", "/t. c #C1D2D6", "(t. c #777C83", "_t. c #403A44", ":t. c #7D9197", "u. c #757982", ",u. c #72747F", "'u. c #7B828B", ")u. c #5E6269", "!u. c #737C83", "~u. c #7C7E88", "{u. c #75747F", "]u. c #797A85", "^u. c #8E909A", "/u. c #8F919A", "(u. c #888C95", "_u. c #9EA4AD", ":u. c #B2B8C4", "v. c #5E656C", ",v. c #5A5A62", "'v. c #6E6B73", ")v. c #8E8B90", "!v. c #A4A4A8", "~v. c #94969E", "{v. c #4F515D", "]v. c #6E6F7A", "^v. c #8D8C96", "/v. c #908E97", "(v. c #87878F", "_v. c #7D8189", ":v. c #7D818B", "w. c #BDCED9", ",w. c #BDCEDA", "'w. c #8C959F", ")w. c #676E75", "!w. c #737D84", "~w. c #BECFD6", "{w. c #B2C9D1", "]w. c #596368", "^w. c #3B4045", "/w. c #45454E", "(w. c #424B56", "_w. c #606F78", ":w. c #91A1A7", "x. c #888D93", ",x. c #737982", "'x. c #7F848A", ")x. c #8A9095", "!x. c #767780", "~x. c #8C8E95", "{x. c #8D9093", "]x. c #B3B0B7", "^x. c #C5BFCC", "/x. c #C4C2CF", "(x. c #B2B3C0", "_x. c #979AA5", ":x. c #65676E", "y. c #9E9DA7", ",y. c #6B737A", "'y. c #A0A6B0", ")y. c #BDC5D1", "!y. c #C9C8D5", "~y. c #C8C4CE", "{y. c #808188", "]y. c #9EB0B7", "^y. c #71818A", "/y. c #535F69", "(y. c #ABBFC3", "_y. c #B1C9CD", ":y. c #939DA6", "z. c #9EAFB4", ",z. c #9CACB2", "'z. c #A6B7BF", ")z. c #A4B5C1", "!z. c #A3B4C0", "~z. c #A4B4BE", "{z. c #5C5D67", "]z. c #9CABB4", "^z. c #B2C4CD", "/z. c #A6B7C0", "(z. c #889197", "_z. c #676A72", ":z. c #4B4953", "A. c #887F90", ",A. c #65616D", "'A. c #4D4D55", ")A. c #4F4E55", "!A. c #696A71", "~A. c #8E949B", "{A. c #AFC6CF", "]A. c #B4CBD2", "^A. c #6C7078", "/A. c #514F57", "(A. c #4A444D", "_A. c #4C444F", ":A. c #5B616A", "B. c #4E4E55", ",B. c #42464B", "'B. c #7B7A7F", ")B. c #A09CA2", "!B. c #AFB0B3", "~B. c #AFAEB3", "{B. c #B2B0B8", "]B. c #8F8D97", "^B. c #5D5A66", "/B. c #3E3D49", "(B. c #ACAFB7", "_B. c #C2C5CD", ":B. c #DCDEE2", "C. c #DAD8E1", ",C. c #D5D3DD", "'C. c #D0CFD8", ")C. c #D2D1DB", "!C. c #CDCBD2", "~C. c #B9B6B7", "{C. c #B3B5BD", "]C. c #B2B1BF", "^C. c #B1ABBC", "/C. c #AEA3B5", "(C. c #A2A0AC", "_C. c #8C8F96", ":C. c #76787E", "D. c #6E8693", ",D. c #68787F", "'D. c #757F86", ")D. c #697178", "!D. c #5B6169", "~D. c #5D626B", "{D. c #5C5F69", "]D. c #575963", "^D. c #B8BFC0", "/D. c #BABAC1", "(D. c #C6C7C1", "_D. c #BCBDBB", ":D. c #95979B", "E. c #596166", ",E. c #585D61", "'E. c #525158", ")E. c #514E55", "!E. c #5B5F65", "~E. c #60676E", "{E. c #656570", "]E. c #696873", "^E. c #667077", "/E. c #697279", "(E. c #676D73", "_E. c #6D767F", ":E. c #B5C4D2", "F. c #DAD9E2", ",F. c #ABAAB3", "'F. c #63626A", ")F. c #AAABB5", "!F. c #B8B4BF", "~F. c #AEA7B2", "{F. c #878691", "]F. c #ABB1BC", "^F. c #C1D2D9", "/F. c #707981", "(F. c #555A60", "_F. c #7F8B94", ":F. c #534F59", "G. c #EBE7F2", ",G. c #E6E2ED", "'G. c #E5E1EC", ")G. c #E4E1EA", "!G. c #E1E1E4", "~G. c #E0E1E4", "{G. c #E2E1E8", "]G. c #E4E1EC", "^G. c #E4E0EB", "/G. c #E4E1EB", "(G. c #E5E3EC", "_G. c #E4E3E9", ":G. c #E4E3E8", "H. c #5C6268", ",H. c #5A6164", "'H. c #5F686C", ")H. c #5D666B", "!H. c #575D62", "~H. c #4E5157", "{H. c #414246", "]H. c #3A3C41", "^H. c #4A4D53", "/H. c #ACB6C0", "(H. c #858D95", "_H. c #666871", ":H. c #65686F", "I. c #C4D4DC", ",I. c #BECFD3", "'I. c #A4ACB6", ")I. c #686E79", "!I. c #646D77", "~I. c #65747E", "{I. c #5B6870", "]I. c #6F787F", "^I. c #7B8892", "/I. c #919FAC", "(I. c #555A67", "_I. c #545B65", ":I. c #6B6F77", "J. c #55565E", ",J. c #2B3036", "'J. c #38383B", ")J. c #B6CED7", "!J. c #BBD0D5", "~J. c #90979E", "{J. c #898F95", "]J. c #757B85", "^J. c #646D76", "/J. c #727D84", "(J. c #B9CED2", "_J. c #8D9BA0", ":J. c #858C93", "K. c #706E71", ",K. c #72757A", "'K. c #71727B", ")K. c #71717B", "!K. c #7E767F", "~K. c #6A646C", "{K. c #45464B", "]K. c #272E30", "^K. c #2E2F31", "/K. c #505254", "(K. c #7E8789", "_K. c #B6CCD1", ":K. c #B3CBD3", "L. c #303133", ",L. c #535758", "'L. c #959FA4", ")L. c #6A6B73", "!L. c #5F6970", "~L. c #3B3D44", "{L. c #383941", "]L. c #616871", "^L. c #5F6165", "/L. c #5F6367", "(L. c #5E6366", "_L. c #5C5F65", ":L. c #5B5E68", "M. c #44444C", ",M. c #434148", "'M. c #454446", ")M. c #4A4E51", "!M. c #556067", "~M. c #6B7A86", "{M. c #96A0AC", "]M. c #AFBCBF", "^M. c #B0BCBB", "/M. c #B7BCBC", "(M. c #2708AB", "_M. c #462EAF", ":M. c #978FBC", "N. c #BCCED8", ",N. c #5E6C7C", "'N. c #5C687B", ")N. c #8C98A8", "!N. c #696F78", "~N. c #9798A0", "{N. c #DBDBDD", "]N. c #D8D5DD", "^N. c #D9D5E0", "/N. c #D8D4E0", "(N. c #52515A", "_N. c #96A0AB", ":N. c #B9CAD5", "O. c #686F75", ",O. c #727681", "'O. c #554F58", ")O. c #4E4952", "!O. c #78818C", "~O. c #929BAF", "{O. c #A0AABE", "]O. c #6D757C", "^O. c #7D838A", "/O. c #6F787E", "(O. c #838B91", "_O. c #8C979D", ":O. c #61656E", "P. c #AAB0B7", ",P. c #8E9094", "'P. c #5C656D", ")P. c #65747D", "!P. c #91A3AB", "~P. c #A4B3BC", "{P. c #6D7D7B", "]P. c #758683", "^P. c #9AABAC", "/P. c #B7C8CB", "(P. c #BBBFC1", "_P. c #BEA0A4", ":P. c #C29096", "Q. c #B4B2BD", ",Q. c #B1B6B9", "'Q. c #B4BFB8", ")Q. c #BCC1BC", "!Q. c #737173", "~Q. c #A1B3B9", "{Q. c #7F8D91", "]Q. c #7D808A", "^Q. c #98A7AC", "/Q. c #6C7279", "(Q. c #45454B", "_Q. c #424144", ":Q. c #545457", "R. c #A5B9BF", ",R. c #849396", "'R. c #697276", ")R. c #828C92", "!R. c #6C737C", "~R. c #656F78", "{R. c #7E8A94", "]R. c #788286", "^R. c #94A1A5", "/R. c #B3CFD2", "(R. c #B5D0D2", "_R. c #BEB6B7", ":R. c #D95B60", "S. c #969DA7", ",S. c #B0B8BD", "'S. c #B5B8BC", ")S. c #B3B4C0", "!S. c #8E92CB", "~S. c #636AD6", "{S. c #3F44E1", "]S. c #3033E6", "^S. c #2F31E7", "/S. c #2B2CE9", "(S. c #4F50E1", "_S. c #8B8DD1", ":S. c #C0C5C1", "T. c #B9C8D4", ",T. c #616E78", "'T. c #4E5C66", ")T. c #434753", "!T. c #899198", "~T. c #6E797F", "{T. c #585D62", "]T. c #72777C", "^T. c #393944", "/T. c #474754", "(T. c #80828E", "_T. c #A5B7BF", ":T. c #88959B", "U. c #AAB1BD", ",U. c #7D8B92", "'U. c #808E95", ")U. c #6F7B83", "!U. c #68727B", "~U. c #8B959B", "{U. c #929FA5", "]U. c #B3CCD0", "^U. c #B6CACB", "/U. c #BFB2B2", "(U. c #D6676B", "_U. c #E3373C", ":U. c #E72225", "V. c #DA5A5E", ",V. c #D95A5D", "'V. c #D4686B", ")V. c #CA9596", "!V. c #C0B4B6", "~V. c #B9C2C8", "{V. c #949C9F", "]V. c #ACB2B4", "^V. c #AFCCD3", "/V. c #9ECBD4", "(V. c #93CED7", "_V. c #86D2DA", ":V. c #7AD7DD", "W. c #8FD0DB", ",W. c #A7CCD6", "'W. c #ABCAD1", ")W. c #B3C5CE", "!W. c #A4B0BC", "~W. c #BAC9CD", "{W. c #ADB7C3", "]W. c #B6C5D2", "^W. c #B4C6D2", "/W. c #ADBBC7", "(W. c #AFB4BB", "_W. c #BCC4C4", ":W. c #C5C8BE", "X. c #AAABC5", ",X. c #7175D3", "'X. c #343AE4", ")X. c #0F12F3", "!X. c #0001F7", "~X. c #0000F1", "{X. c #0303EC", "]X. c #2628EA", "^X. c #7378D4", "/X. c #B9C3C0", "(X. c #C0BCC4", "_X. c #C1BCC0", ":X. c #C4C2BC", "Y. c #A5CED6", ",Y. c #B6CDD6", "'Y. c #A2B0B5", ")Y. c #A8BAC2", "!Y. c #B5CBD1", "~Y. c #B2C6CF", "{Y. c #A9B9C3", "]Y. c #9DAFB8", "^Y. c #92ACB2", "/Y. c #90B2B6", "(Y. c #A4C7CE", "_Y. c #B0D1D9", ":Y. c #B4D1DA", "Z. c #A8BEC5", ",Z. c #A9C0C8", "'Z. c #98A8B1", ")Z. c #A1A9B2", "!Z. c #AFBDC9", "~Z. c #B8C8D6", "{Z. c #BACAD7", "]Z. c #7C8B94", "^Z. c #75848C", "/Z. c #B0C5CC", "(Z. c #6C7A81", "_Z. c #6A777F", ":Z. c #BDCDD2", "`. c #B2C7D3", ",`. c #BFBBBC", "'`. c #C1BBBB", ")`. c #C2BDBD", "!`. c #CCC8BC", "~`. c #B0B0C2", "{`. c #7A7FCF", "]`. c #3F45E1", "^`. c #1114F4", "/`. c #0001FA", "(`. c #0503EF", "_`. c #2729ED", ":`. c #737BDB", "<`. c #C4BFBF", "[`. c #C4BCC4", "}`. c #C3BEC2", "|`. c #C8C9C5", "1`. c #A5A1BE", "2`. c #7D72B8", "3`. c #1705A6", "4`. c #1804AA", "5`. c #1801B6", "6`. c #1B00B3", "7`. c #2A0AA9", "8`. c #4D2DA5", "9`. c #9F8ABA", "0`. c #C5BCC0", "a`. c #C6C8BB", "b`. c #BAC2B5", "c`. c #BEBFB9", "d`. c #9A9C9E", "e`. c #808387", "f`. c #79737B", "g`. c #898087", "h`. c #A69EA2", "i`. c #C3BABB", "j`. c #CEBAC0", "k`. c #CDB7C0", "l`. c #C5B4C0", "m`. c #BEB4BF", "n`. c #C2BAC4", "o`. c #C4B9C5", "p`. c #C4B5C2", "q`. c #C5BFC3", "r`. c #BBC4C9", "s`. c #B8C1C5", "t`. c #B8BEC2", "u`. c #BBBABF", "v`. c #B6B9C1", "w`. c #B8B6BE", "x`. c #C1B4B9", "y`. c #CAB3B5", "z`. c #C9B5B7", "A`. c #C1B9BC", "B`. c #A8ABB3", "C`. c #BCBEC3", "D`. c #B8BAC1", "E`. c #BCB7BD", "F`. c #BEB5BB", "G`. c #BFB5BA", "H`. c #BEB6BB", "I`. c #C0B6BE", "J`. c #C1B6C0", "K`. c #C1B6C1", "L`. c #C0B7BA", "M`. c #BBBEC1", "N`. c #B9C3C8", "O`. c #BBC8CD", "P`. c #AAC2CB", "Q`. c #9CAEB8", "R`. c #9BA1AA", "S`. c #8D969D", "T`. c #B7BFC4", "U`. c #BCC4CA", "V`. c #BCC7CE", "W`. c #BBC6CC", "X`. c #B9C4C9", "Y`. c #6A7A83", "Z`. c #677A83", "``. c #8EA2A9", " + c #BDC9C9", ". + c #BAC6C7", "+ + c #B9C7CA", "@ + c #B5C0C6", "# + c #BBC2CE", "$ + c #B3C7CB", "% + c #A8CAD3", "& + c #92CCE7", "* + c #77D4F0", "= + c #5DDFF1", "- + c #48E8EF", "; + c #45E7F4", "> + c #45E6F8", ", + c #48E5F5", "' + c #4DE5EE", ") + c #4EE5EE", "! + c #4CE5F2", "~ + c #4BE4F5", "{ + c #4DE0EF", "] + c #50DCEA", "^ + c #52D6E6", "/ + c #54D3E1", "( + c #58D3DC", "_ + c #5BD2D8", ": + c #5ECFD5", "< + c #5FCDD5", "[ + c #5ECED7", "} + c #5ECFD7", "| + c #5CD1D8", "1 + c #58D4DC", "2 + c #4ED9E9", "3 + c #4BDFEE", "4 + c #4BE3EE", "5 + c #4DE6EE", "6 + c #48E6F5", "7 + c #46E6F8", "8 + c #47E5F6", "9 + c #43E7F7", "0 + c #44E6F2", "a + c #71D6E1", "b + c #8FCED9", "c + c #A6CAD2", "d + c #B7C6C9", "e + c #AFBCBE", "f + c #A5AFB2", "g + c #9CA2AA", "h + c #ABB5B8", "i + c #9F9B9F", "j + c #A39AA0", "k + c #B6ADB2", "l + c #BFB6BB", "m + c #C0B6BC", "n + c #BFB3BB", "o + c #C1B4BE", "p + c #BFB6C0", "q + c #BCB8C2", "r + c #B8BBC4", "s + c #ACC1C8", "t + c #87979E", "u + c #B6C1D0", "v + c #B6C1CF", "w + c #C1CCD9", "x + c #809890", "y + c #6E8977", "z + c #AAB3AB", "A + c #C1C9CB", "B + c #B6CCD4", "C + c #A4C6D4", "D + c #A4C1D4", "E + c #A5BED4", "F + c #A3BBD4", "G + c #A1BAD5", "H + c #9FB8D5", "I + c #A1B8D4", "J + c #A4B8D1", "K + c #A8B8CE", "L + c #A7B6C8", "M + c #AAB8C8", "N + c #AFBDCC", "O + c #B3C2D1", "P + c #B7BEC8", "Q + c #B3BED0", "R + c #A9B3D3", "S + c #A5B1D2", "T + c #A5B4D0", "U + c #A7B9CF", "V + c #A5B7D1", "W + c #A4B6D2", "X + c #A6B5D3", "Y + c #A7B7D4", "Z + c #A6BCD4", "` + c #A7C0D4", " .+ c #AEC0D1", "..+ c #B3C1D0", "+.+ c #B1CBD2", "@.+ c #C5C3BB", "#.+ c #AEAEC1", "$.+ c #474EDE", "%.+ c #1518F2", "&.+ c #0100F9", "*.+ c #0603F4", "=.+ c #2629ED", "-.+ c #7179DE", ";.+ c #B7C2CF", ">.+ c #C0BDC9", ",.+ c #C0B8C4", "'.+ c #BEB9C0", ").+ c #C0B9C4", "!.+ c #C0B8C6", "~.+ c #BDB9C4", "{.+ c #BABAC2", "].+ c #BFC0C4", "^.+ c #C1C3C8", "/.+ c #C7C9C7", "(.+ c #A6A2BF", "_.+ c #1B03AC", ":.+ c #1B03AD", "<.+ c #1501B8", "[.+ c #3A0496", "}.+ c #661F89", "|.+ c #A97BA3", "1.+ c #C8ACAF", "2.+ c #CBB4AE", "3.+ c #C2AEAD", "4.+ c #C2B6B6", "5.+ c #C2BBBB", "6.+ c #B4BFBD", "7.+ c #99AAA8", "8.+ c #848F8C", "9.+ c #8E6E6F", "0.+ c #A16569", "a.+ c #B76D71", "b.+ c #CC7478", "c.+ c #D9656B", "d.+ c #DE5C62", "e.+ c #DD5A60", "f.+ c #D65C65", "g.+ c #CB5E70", "h.+ c #C66A80", "i.+ c #C68095", "j.+ c #C79BAB", "k.+ c #C4B9BF", "l.+ c #C0C9CD", "m.+ c #B7CCD5", "n.+ c #B4C8D2", "o.+ c #B4D0D7", "p.+ c #BEC2CB", "q.+ c #C3B1B9", "r.+ c #C29EA2", "s.+ c #C28D91", "t.+ c #C48084", "u.+ c #C87378", "v.+ c #D0646B", "w.+ c #D75B62", "x.+ c #DB595F", "y.+ c #DA5E63", "z.+ c #CF6C71", "A.+ c #C7797E", "B.+ c #C3888D", "C.+ c #BF9CA0", "D.+ c #BAD0D2", "E.+ c #B9D0D5", "F.+ c #BED3D9", "G.+ c #8E9B9B", "H.+ c #8E878C", "I.+ c #AA8C98", "J.+ c #C895A3", "K.+ c #CB8C8A", "L.+ c #C8847E", "M.+ c #C57C7C", "N.+ c #C6737A", "O.+ c #D2646A", "P.+ c #D85C61", "Q.+ c #D85C62", "R.+ c #D85D63", "S.+ c #D95C63", "T.+ c #DA5B63", "U.+ c #D85F66", "V.+ c #CD6D72", "W.+ c #C77B7E", "X.+ c #C4898C", "Y.+ c #C4999D", "Z.+ c #C6ADB4", "`.+ c #C0BFC7", " ++ c #ADD6DA", ".++ c #B5D4D8", "+++ c #A9BFC4", "@++ c #A4B5BD", "#++ c #B6C8D4", "$++ c #B5C6D3", "%++ c #AEB6C2", "&++ c #968187", "*++ c #90777A", "=++ c #998E91", "-++ c #AAAAAE", ";++ c #BCABB0", ">++ c #C0B0B5", ",++ c #B7CDD0", "'++ c #B9D0D1", ")++ c #BBD5D8", "!++ c #BDD2D5", "~++ c #BFC8CC", "{++ c #C0B8C0", "]++ c #C4B8C1", "^++ c #C4B7C0", "/++ c #B3ABB3", "(++ c #6D8388", "_++ c #90A9AE", ":++ c #BCCBCE", "<++ c #BAC4C8", "[++ c #C2B9BF", "}++ c #C3B5BF", "|++ c #C2B6BF", "1++ c #C1B6BD", "2++ c #C1B5BC", "3++ c #BFB7BE", "4++ c #B4CACE", "5++ c #9ACCD5", "6++ c #7ED2DD", "7++ c #66DAEE", "8++ c #55E0F5", "9++ c #4CE5F6", "0++ c #47E7F4", "a++ c #46E5F7", "b++ c #46E6F7", "c++ c #47E7F8", "d++ c #46EDF7", "e++ c #4AF1FA", "f++ c #52EFFB", "g++ c #5DE5F1", "h++ c #6BC8CC", "i++ c #79AAAB", "j++ c #859093", "k++ c #8D7F84", "l++ c #8C8285", "m++ c #937B7E", "n++ c #9E6D73", "o++ c #A8626C", "p++ c #A86579", "q++ c #A36C7D", "r++ c #997780", "s++ c #67A2B5", "t++ c #51C3D8", "u++ c #46E3F1", "v++ c #40F8FF", "w++ c #40F2FF", "x++ c #43EBFF", "y++ c #46E8FB", "z++ c #48E6F7", "A++ c #47E5F7", "B++ c #45E5F6", "C++ c #45E6F5", "D++ c #53E1EB", "E++ c #6CD9E2", "F++ c #8BCFD9", "G++ c #A6C9D3", "H++ c #B0C9D2", "I++ c #A7B3B7", "J++ c #9CA0A4", "K++ c #B0A6AB", "L++ c #C3AFB6", "M++ c #C3B4BC", "N++ c #C2B6BD", "O++ c #BFB8BE", "P++ c #B7C8C9", "Q++ c #B5C9CB", "R++ c #AECFD7", "S++ c #B1D0DA", "T++ c #BDC5C4", "U++ c #BABDA3", "V++ c #B89E88", "W++ c #B87475", "X++ c #BE5369", "Y++ c #CF5864", "Z++ c #D95C61", "`++ c #D85B62", " @+ c #DA5961", ".@+ c #D66266", "+@+ c #D07472", "@@+ c #C88D87", "#@+ c #C5A8AC", "$@+ c #C0BFC6", "%@+ c #A9C6CC", "&@+ c #8A9FA7", "*@+ c #8A99A2", "=@+ c #A0ABB6", "-@+ c #A9C6CF", ";@+ c #A3C8CE", ">@+ c #A2C7CE", ",@+ c #A5C3CE", "'@+ c #A7B5CA", ")@+ c #ABB2CB", "!@+ c #AFB8CF", "~@+ c #B4C1D4", "{@+ c #BCCAD9", "]@+ c #A4B8B8", "^@+ c #819B89", "/@+ c #728F70", "(@+ c #B2C2AA", "_@+ c #BCD6CC", ":@+ c #9BCDD3", "<@+ c #76B4D0", "[@+ c #7896D3", "}@+ c #7582D6", "|@+ c #6A74D9", "1@+ c #5F6BDC", "2@+ c #5761DC", "3@+ c #5660DC", "4@+ c #5D66DB", "5@+ c #6771D9", "6@+ c #6F7AD3", "7@+ c #818BCF", "8@+ c #98A1CB", "9@+ c #AEB7CA", "0@+ c #BECFD0", "a@+ c #C8BDC7", "b@+ c #C2C7CF", "c@+ c #B2BCCB", "d@+ c #A3A9C9", "e@+ c #878FD0", "f@+ c #747DD5", "g@+ c #6972D8", "h@+ c #626BD9", "i@+ c #5962DB", "j@+ c #555CDC", "k@+ c #555CDB", "l@+ c #585FDA", "m@+ c #5F67DA", "n@+ c #6770D9", "o@+ c #707DD7", "p@+ c #808DD3", "q@+ c #9AA2CB", "r@+ c #ADB6CA", "s@+ c #B8CED0", "t@+ c #B6CCCF", "u@+ c #B4B9BC", "v@+ c #B6BBC0", "w@+ c #B1B7C2", "x@+ c #B5B8C2", "y@+ c #9DA0C7", "z@+ c #3D43E1", "A@+ c #1115F3", "B@+ c #0001FC", "C@+ c #0000FD", "D@+ c #0100F8", "E@+ c #2527E5", "F@+ c #6E73D5", "G@+ c #AFB7C8", "H@+ c #B0B2C7", "I@+ c #ACADC6", "J@+ c #ACAEC4", "K@+ c #AEAFC3", "L@+ c #B7B0C2", "M@+ c #B8AFC3", "N@+ c #B1AEC3", "O@+ c #ABB0C4", "P@+ c #B0B6C1", "Q@+ c #B1B6C2", "R@+ c #AFB3C5", "S@+ c #B0B3C6", "T@+ c #A6A2BA", "U@+ c #7D72BA", "V@+ c #1B01B4", "W@+ c #1C01B3", "X@+ c #2402AB", "Y@+ c #3E0092", "Z@+ c #660171", "`@+ c #94135C", " #+ c #BE5770", ".#+ c #D37678", "+#+ c #D77A78", "@#+ c #D27C80", "##+ c #CA9DA1", "$#+ c #C3B5B8", "%#+ c #C3BEBE", "&#+ c #BAACAA", "*#+ c #AB8F8C", "=#+ c #A26F6C", "-#+ c #B15050", ";#+ c #C14143", ">#+ c #CF3D40", ",#+ c #DC3A3E", "'#+ c #E6292E", ")#+ c #EC2124", "!#+ c #E62329", "~#+ c #D92232", "{#+ c #D43044", "]#+ c #D34A5C", "^#+ c #D36976", "/#+ c #CF868B", "(#+ c #C89EA1", "_#+ c #B9BDC5", ":#+ c #B7B5BF", "<#+ c #C0A5B0", "[#+ c #CB9099", "}#+ c #D4787E", "|#+ c #D66568", "1#+ c #D65457", "2#+ c #D74649", "3#+ c #DB383D", "4#+ c #E6282D", "5#+ c #EC2024", "6#+ c #EC1F23", "7#+ c #E7262A", "8#+ c #DD3338", "9#+ c #D84044", "0#+ c #D74D51", "a#+ c #D46264", "b#+ c #CC8988", "c#+ c #C5A7A8", "d#+ c #BFB9BE", "e#+ c #92A4AB", "f#+ c #8898A0", "g#+ c #C1C2C9", "h#+ c #C8B3B7", "i#+ c #C59A9C", "j#+ c #A57171", "k#+ c #A55E62", "l#+ c #BD5B66", "m#+ c #D95D69", "n#+ c #DD534F", "o#+ c #DC4A42", "p#+ c #DA4240", "q#+ c #DA383E", "r#+ c #EB2125", "s#+ c #EA2327", "t#+ c #EB2226", "u#+ c #EB2024", "v#+ c #EB2025", "w#+ c #E7252A", "x#+ c #DC3439", "y#+ c #D64246", "z#+ c #D55052", "A#+ c #D45F62", "B#+ c #D57379", "C#+ c #CD888F", "D#+ c #C09DA3", "E#+ c #B7B1B6", "F#+ c #BCC5C9", "G#+ c #8798A0", "H#+ c #A2B4BC", "I#+ c #B9A8B3", "J#+ c #B3696D", "K#+ c #B25455", "L#+ c #B66263", "M#+ c #BE787B", "N#+ c #CF7276", "O#+ c #CF7D80", "P#+ c #C39598", "Q#+ c #B7AEB3", "R#+ c #B7CBD5", "S#+ c #B8C3C8", "T#+ c #BEAFB0", "U#+ c #C6AAAB", "V#+ c #CCA0A2", "W#+ c #CE9396", "X#+ c #D0878B", "Y#+ c #D28187", "Z#+ c #D78087", "`#+ c #D88087", " $+ c #CA7A81", ".$+ c #995E62", "+$+ c #8F7073", "@$+ c #A39FA2", "#$+ c #B3CCD2", "$$+ c #BFB0B3", "%$+ c #C99A9D", "&$+ c #D0898E", "*$+ c #D47E85", "=$+ c #D37F85", "-$+ c #D47D84", ";$+ c #D37F86", ">$+ c #CE8C92", ",$+ c #C0B2B7", "'$+ c #9ECCD5", ")$+ c #7ED3DE", "!$+ c #5EDBE8", "~$+ c #4CE2F2", "{$+ c #46E7F7", "]$+ c #43E9F9", "^$+ c #42E9F9", "/$+ c #52D5DE", "($+ c #64C9D0", "_$+ c #79BCC5", ":$+ c #8CAAB2", "<$+ c #9A8A89", "[$+ c #A96A66", "}$+ c #B74F4D", "|$+ c #BF3D3E", "1$+ c #BC4142", "2$+ c #C23A3B", "3$+ c #CF2B2F", "4$+ c #DA2027", "5$+ c #DA2334", "6$+ c #D42A39", "7$+ c #C9353C", "8$+ c #B64749", "9$+ c #97626F", "0$+ c #818394", "a$+ c #72A6B3", "b$+ c #66C5CB", "c$+ c #56D3DB", "d$+ c #4BDDE8", "e$+ c #45E3F2", "f$+ c #46E5F6", "g$+ c #46E6F2", "h$+ c #55E1EA", "i$+ c #6FD8E2", "j$+ c #8CCFDA", "k$+ c #A1CCD6", "l$+ c #BBC9CB", "m$+ c #A8B2B6", "n$+ c #A48587", "o$+ c #BD797C", "p$+ c #D4767A", "q$+ c #D37D83", "r$+ c #D27E85", "s$+ c #CF888E", "t$+ c #C4ACAF", "u$+ c #BBC3C6", "v$+ c #B5CDD0", "w$+ c #B2CCD2", "x$+ c #B7B7C0", "y$+ c #C2A4AA", "z$+ c #CC938F", "A$+ c #CD8F71", "B$+ c #CE7158", "C$+ c #D24646", "D$+ c #D92238", "E$+ c #E5202B", "F$+ c #EC2125", "G$+ c #EC1E23", "H$+ c #E92728", "I$+ c #E23C35", "J$+ c #DA564C", "K$+ c #D67071", "L$+ c #C1A4A9", "M$+ c #B4C2D2", "N$+ c #A8B4D3", "O$+ c #97A5D5", "P$+ c #7D97D7", "Q$+ c #7091D9", "R$+ c #6D8FDA", "S$+ c #708CD9", "T$+ c #6F7AD4", "U$+ c #7F83D1", "V$+ c #99A0D0", "W$+ c #B2BFD0", "X$+ c #C2D1D4", "Y$+ c #AABDBD", "Z$+ c #80969C", "`$+ c #647B8D", " %+ c #8B9ABA", ".%+ c #8AA3D4", "+%+ c #6895DA", "@%+ c #457CD9", "#%+ c #485DDB", "$%+ c #4548DE", "%%+ c #393BE0", "&%+ c #2C31E3", "*%+ c #2325E6", "=%+ c #2224E7", "-%+ c #292CE4", ";%+ c #3338E1", ">%+ c #3E43E0", ",%+ c #5054DB", "'%+ c #676AD6", ")%+ c #8083D2", "!%+ c #95A0D3", "~%+ c #A7B6D2", "{%+ c #B4C5D0", "]%+ c #BBCECF", "^%+ c #BDD0D3", "/%+ c #97A6AF", "(%+ c #8D99A4", "_%+ c #B9CCCD", ":%+ c #BACACA", "<%+ c #B1B8C9", "[%+ c #A2ACD1", "}%+ c #929CD5", "|%+ c #8288D4", "1%+ c #6E72D4", "2%+ c #5559DA", "3%+ c #4247DE", "4%+ c #353BE2", "5%+ c #2C31E4", "6%+ c #2426E6", "7%+ c #2021E6", "8%+ c #1F21E7", "9%+ c #292CE7", "0%+ c #3136E4", "a%+ c #3C43E0", "b%+ c #4E53DB", "c%+ c #696BD4", "d%+ c #7C7FD3", "e%+ c #8990D4", "f%+ c #96A1D5", "g%+ c #ABB9CD", "h%+ c #BACCCE", "i%+ c #B5BBBC", "j%+ c #BABCBB", "k%+ c #C2C8C3", "l%+ c #C5CDC1", "m%+ c #959CC5", "n%+ c #7A80CA", "o%+ c #7C80CD", "p%+ c #6C70D3", "q%+ c #4B50DC", "r%+ c #272CE8", "s%+ c #0B0EF5", "t%+ c #0101F9", "u%+ c #0000F3", "v%+ c #1B1BE8", "w%+ c #5051DB", "x%+ c #7F82D0", "y%+ c #7C7ED1", "z%+ c #777AD2", "A%+ c #767AD2", "B%+ c #787AD2", "C%+ c #817CCF", "D%+ c #817CD0", "E%+ c #7B7AD2", "F%+ c #767BD4", "G%+ c #7C82CE", "H%+ c #7A81CE", "I%+ c #777CD0", "J%+ c #7C7FD1", "K%+ c #9A9DC6", "L%+ c #A8A9BF", "M%+ c #A19DBA", "N%+ c #8277B7", "O%+ c #3E26B3", "P%+ c #1900B1", "Q%+ c #1901BA", "R%+ c #1A01B9", "S%+ c #2201B1", "T%+ c #3C0398", "U%+ c #690271", "V%+ c #9E0347", "W%+ c #CA0C2A", "X%+ c #DA2831", "Y%+ c #E33232", "Z%+ c #E83332", "`%+ c #E43E41", " &+ c #C5AAAE", ".&+ c #C4A7A8", "+&+ c #C78182", "@&+ c #C95959", "#&+ c #CD3636", "$&+ c #D92426", "%&+ c #E21B1E", "&&+ c #E91719", "*&+ c #EF1316", "=&+ c #F40B0C", "-&+ c #F50809", ";&+ c #F3080A", ">&+ c #F00A0E", ",&+ c #E90910", "'&+ c #E71018", ")&+ c #E71D25", "!&+ c #E62D34", "~&+ c #E13B3F", "{&+ c #D75658", "]&+ c #CC787C", "^&+ c #C19DA2", "/&+ c #B6CDD5", "(&+ c #BEBCC3", "_&+ c #C1A6AF", ":&+ c #C08091", "<&+ c #CA5F6F", "[&+ c #DB454E", "}&+ c #EA3335", "|&+ c #EC292A", "1&+ c #EC2122", "2&+ c #ED191B", "3&+ c #EF1315", "4&+ c #F50A0C", "5&+ c #F70608", "6&+ c #F40709", "7&+ c #F00B0C", "8&+ c #ED1113", "9&+ c #ED1618", "0&+ c #EE1D1F", "a&+ c #EB2829", "b&+ c #E13B3B", "c&+ c #D75F61", "d&+ c #CB8B90", "e&+ c #C1B2B8", "f&+ c #A5BBC3", "g&+ c #88A5B2", "h&+ c #7C98A8", "i&+ c #A6B9C1", "j&+ c #BCCED1", "k&+ c #BBCCD6", "l&+ c #C7ADB6", "m&+ c #D4797E", "n&+ c #DB4648", "o&+ c #CB3236", "p&+ c #CC2A30", "q&+ c #DA272D", "r&+ c #EA262B", "s&+ c #EF201E", "t&+ c #F01C18", "u&+ c #EF1817", "v&+ c #EE1316", "w&+ c #F40B0D", "x&+ c #F6080A", "y&+ c #F4080B", "z&+ c #F20A0C", "A&+ c #F5080A", "B&+ c #F60709", "C&+ c #F4080A", "D&+ c #F10C0E", "E&+ c #EC1216", "F&+ c #E9191C", "G&+ c #E82021", "H&+ c #E72728", "I&+ c #E43033", "J&+ c #DE3E41", "K&+ c #D75256", "L&+ c #CF7075", "M&+ c #CCA1A7", "N&+ c #B5AEB5", "O&+ c #8D9CA4", "P&+ c #B5C9D2", "Q&+ c #BFB9C2", "R&+ c #C7969E", "S&+ c #D1484A", "T&+ c #D62626", "U&+ c #DA2929", "V&+ c #DD3536", "W&+ c #E72E2F", "X&+ c #E23F40", "Y&+ c #D26567", "Z&+ c #C09397", "`&+ c #B7B9C2", " *+ c #B3CCD7", ".*+ c #B3D0DA", "+*+ c #BEBEC6", "@*+ c #C2AAB0", "#*+ c #C58F93", "$*+ c #C97275", "%*+ c #D65C5F", "&*+ c #DE4C4E", "**+ c #E34243", "=*+ c #E63B3D", "-*+ c #E9383B", ";*+ c #ED373A", ">*+ c #EE363A", ",*+ c #E63539", "'*+ c #CD282B", ")*+ c #C04B4D", "!*+ c #BE8C8E", "~*+ c #C0C6C8", "{*+ c #B6CED2", "]*+ c #B5CED0", "^*+ c #C48E91", "/*+ c #D26468", "(*+ c #DF464A", "_*+ c #E9363A", ":*+ c #E83639", "<*+ c #E73438", "[*+ c #E4383C", "}*+ c #DC5054", "|*+ c #CA989B", "1*+ c #BEC1C5", "2*+ c #9DCCD6", "3*+ c #61DBE9", "4*+ c #44E6F6", "5*+ c #43E6F7", "6*+ c #44E6F7", "7*+ c #46E8F9", "8*+ c #42EAFA", "9*+ c #41E4F4", "0*+ c #4DD1DF", "a*+ c #71A3A9", "b*+ c #957E82", "c*+ c #B26368", "d*+ c #C64F53", "e*+ c #CD3D3C", "f*+ c #D52C29", "g*+ c #DD1E1C", "h*+ c #E41516", "i*+ c #E11718", "j*+ c #E41315", "k*+ c #EB0C0D", "l*+ c #F00608", "m*+ c #F0080F", "n*+ c #ED0B12", "o*+ c #E71113", "p*+ c #DE1A1A", "q*+ c #D0272C", "r*+ c #C6373F", "s*+ c #BC4B52", "t*+ c #AA676A", "u*+ c #83968E", "v*+ c #63BAB5", "w*+ c #4ED0D7", "x*+ c #43DDEF", "y*+ c #45E4F5", "z*+ c #44E6F5", "A*+ c #49E5F1", "B*+ c #56E0EA", "C*+ c #6CD9E3", "D*+ c #8CD0DB", "E*+ c #A4C9D3", "F*+ c #BCC5C6", "G*+ c #BEC7C7", "H*+ c #B9C7C7", "I*+ c #B0C0C1", "J*+ c #A8ADB0", "K*+ c #A28384", "L*+ c #B15D5E", "M*+ c #CD4142", "N*+ c #E43233", "O*+ c #E2373A", "P*+ c #E23639", "Q*+ c #E33639", "R*+ c #DF474A", "S*+ c #CF898E", "T*+ c #C0B7BC", "U*+ c #B9AAB0", "V*+ c #C5858B", "W*+ c #D36065", "X*+ c #DF4443", "Y*+ c #DF4132", "Z*+ c #E23226", "`*+ c #E91C1B", " =+ c #F00914", ".=+ c #F5070D", "+=+ c #F7070A", "@=+ c #F70709", "#=+ c #F60508", "$=+ c #F40B0A", "%=+ c #F01511", "&=+ c #EA231C", "*=+ c #E62E2D", "==+ c #DE4649", "-=+ c #D06468", ";=+ c #BA7D81", ">=+ c #937C7E", ",=+ c #BDCFD0", "'=+ c #AEBED1", ")=+ c #909BD4", "!=+ c #6A73D9", "~=+ c #434FE3", "{=+ c #313FE9", "]=+ c #2D3DED", "^=+ c #2E3DED", "/=+ c #292EE9", "(=+ c #4749DF", "_=+ c #7B80D2", ":=+ c #C5D3CF", "<=+ c #ACBBCA", "[=+ c #7786C0", "}=+ c #4754BE", "|=+ c #4951D2", "1=+ c #404CE0", "2=+ c #2D42E6", "3=+ c #1D35E8", "4=+ c #1F26EA", "5=+ c #1C1CE9", "6=+ c #1615E8", "7=+ c #0F10E9", "8=+ c #0909F1", "9=+ c #0808F1", "0=+ c #0C0DEC", "a=+ c #1314E7", "b=+ c #191AEA", "c=+ c #2121EA", "d=+ c #2C2CE7", "e=+ c #3C3CE3", "f=+ c #545ADE", "g=+ c #7885D7", "h=+ c #9FB1CF", "i=+ c #BCD2CB", "j=+ c #BFD3D4", "k=+ c #BECDCD", "l=+ c #B3CBCB", "m=+ c #9ABFCB", "n=+ c #7CA7CE", "o=+ c #687AD6", "p=+ c #5256DF", "q=+ c #3E3EE6", "r=+ c #2E2FEA", "s=+ c #2224EA", "t=+ c #181BEA", "u=+ c #1215EC", "v=+ c #0D0FEE", "w=+ c #0909EE", "x=+ c #0707F0", "y=+ c #0607F2", "z=+ c #0808F4", "A=+ c #0B0CF5", "B=+ c #0F12F1", "C=+ c #1F20E9", "D=+ c #2E2DE6", "E=+ c #3636E4", "F=+ c #3E40E2", "G=+ c #5156DC", "H=+ c #898FCF", "I=+ c #ACB7CA", "J=+ c #BACBCC", "K=+ c #BCD0CE", "L=+ c #B9C9CB", "M=+ c #B2BEC2", "N=+ c #B1BBBF", "O=+ c #B5B9BA", "P=+ c #BABEBC", "Q=+ c #BEC6C4", "R=+ c #C1CFCB", "S=+ c #C6D8C8", "T=+ c #A0B0C8", "U=+ c #656DCD", "V=+ c #3335D3", "W=+ c #3436DB", "X=+ c #2E30E2", "Y=+ c #2022E8", "Z=+ c #1012EF", "`=+ c #0506F8", " -+ c #0001FB", ".-+ c #0201F9", "+-+ c #0403F6", "@-+ c #0C0CF2", "#-+ c #2424EA", "$-+ c #3A39E3", "%-+ c #3838E4", "&-+ c #3535E5", "*-+ c #3335E6", "=-+ c #3335E5", "--+ c #3736E3", ";-+ c #3735E5", ">-+ c #3434E9", ",-+ c #3235EA", "'-+ c #3639E1", ")-+ c #3337E0", "!-+ c #3134E3", "~-+ c #393BE3", "{-+ c #6369D8", "]-+ c #8588C9", "^-+ c #938FBA", "/-+ c #8476AF", "(-+ c #4026B0", "_-+ c #1E02B1", ":-+ c #1A00B1", "<-+ c #1602BF", "[-+ c #1902BD", "}-+ c #2502B1", "|-+ c #4D048B", "1-+ c #89065A", "2-+ c #C9072A", "3-+ c #F70704", "4-+ c #F30200", "5-+ c #F50000", "6-+ c #F20D0C", "7-+ c #D95D60", "8-+ c #CA9698", "9-+ c #C4AEAE", "0-+ c #C5A7A7", "a-+ c #CC7D7F", "b-+ c #D84D51", "c-+ c #E62226", "d-+ c #F20307", "e-+ c #F60006", "f-+ c #F90004", "g-+ c #F70203", "h-+ c #F60304", "i-+ c #F60302", "j-+ c #F70200", "k-+ c #F70000", "l-+ c #F50001", "m-+ c #F10000", "n-+ c #E91316", "o-+ c #DD3C3E", "p-+ c #CF6E71", "q-+ c #C2A3A9", "r-+ c #B9C1C9", "s-+ c #B2C6CE", "t-+ c #D17C86", "u-+ c #CE4459", "v-+ c #D81C2E", "w-+ c #E9060E", "x-+ c #FB0000", "y-+ c #FA0000", "z-+ c #F70101", "A-+ c #F60201", "B-+ c #E91A1D", "C-+ c #DB5155", "D-+ c #CB8C90", "E-+ c #C0B3B5", "F-+ c #A1B4BB", "G-+ c #7EA1B2", "H-+ c #7194AA", "I-+ c #9FB4BF", "J-+ c #B2C4D0", "K-+ c #B6C3CF", "L-+ c #CA959E", "M-+ c #DF4348", "N-+ c #EF0000", "O-+ c #EE0005", "P-+ c #F00007", "Q-+ c #F40002", "R-+ c #FB0101", "S-+ c #F80203", "T-+ c #F70304", "U-+ c #FB0002", "V-+ c #FB0102", "W-+ c #F80304", "X-+ c #F60405", "Y-+ c #F70305", "Z-+ c #F70102", "`-+ c #F60000", " ;+ c #F00000", ".;+ c #EE0202", "+;+ c #ED0F11", "@;+ c #E82E33", "#;+ c #DD6C73", "$;+ c #C18A92", "%;+ c #A09199", "&;+ c #A6B7BD", "*;+ c #C0B0B7", "=;+ c #D0868C", "-;+ c #E52C2D", ";;+ c #F30303", ">;+ c #F01312", ",;+ c #DE4141", "';+ c #C97E81", ");+ c #B5B3B9", "!;+ c #ADCAD1", "~;+ c #B1C7CE", "{;+ c #BCB5BA", "];+ c #C99DA3", "^;+ c #D17C83", "/;+ c #D4585D", "(;+ c #D93338", "_;+ c #E51418", ":;+ c #EF0406", "<;+ c #FE0000", "[;+ c #E9292C", "};+ c #D3787B", "|;+ c #B2CBCF", "1;+ c #BBB3B7", "2;+ c #C77277", "3;+ c #D8383D", "4;+ c #EB1114", "5;+ c #F10304", "6;+ c #E51E21", "7;+ c #CF8183", "8;+ c #B0C7CE", "9;+ c #AECAD5", "0;+ c #80D2DE", "a;+ c #4BE2F2", "b;+ c #48E5F6", "c;+ c #49E5F6", "d;+ c #4ADDEF", "e;+ c #52CADA", "f;+ c #69A7B2", "g;+ c #9E6468", "h;+ c #C93232", "i;+ c #E51213", "j;+ c #F30204", "k;+ c #F50002", "l;+ c #F90103", "m;+ c #FA0002", "n;+ c #F90002", "o;+ c #F60200", "p;+ c #F60100", "q;+ c #F70100", "r;+ c #FB0202", "s;+ c #E91211", "t;+ c #B7513F", "u;+ c #8D8474", "v;+ c #6DA8A8", "w;+ c #57C4D4", "x;+ c #4BDCEE", "y;+ c #45E6F6", "z;+ c #46E6F1", "A;+ c #51E2EB", "B;+ c #72D7E2", "C;+ c #91CDD7", "D;+ c #A9C7CD", "E;+ c #B9C4C7", "F;+ c #B3C4C7", "G;+ c #A87072", "H;+ c #BC3C3E", "I;+ c #DA1516", "J;+ c #EF0101", "K;+ c #E91112", "L;+ c #D7696F", "M;+ c #C6A2A9", "N;+ c #BBB4BA", "O;+ c #BAA8AC", "P;+ c #C87C80", "Q;+ c #D84C4E", "R;+ c #E62123", "S;+ c #EE0104", "T;+ c #EE0002", "U;+ c #F20001", "V;+ c #EC0B0D", "W;+ c #E12629", "X;+ c #CD464A", "Y;+ c #A45758", "Z;+ c #977979", "`;+ c #A1A3A5", " >+ c #BACECA", ".>+ c #A4B7CB", "+>+ c #7985D2", "@>+ c #464ADD", "#>+ c #1512ED", "$>+ c #0100F7", "%>+ c #0000FC", "&>+ c #0000FE", "*>+ c #1C1EED", "=>+ c #5B60D6", "->+ c #9FA8C6", ";>+ c #B3BFCD", ">>+ c #98A3D8", ",>+ c #6169E1", "'>+ c #282BE8", ")>+ c #0C0DE9", "!>+ c #0101EC", "~>+ c #0300F6", "{>+ c #0200F7", "]>+ c #0100EF", "^>+ c #0001EE", "/>+ c #0200F1", "(>+ c #0100F6", "_>+ c #0402F3", ":>+ c #1919EB", "<>+ c #454CDE", "[>+ c #7A8AD2", "}>+ c #A8BDCB", "|>+ c #B1C8CF", "1>+ c #AFC7D1", "2>+ c #B2C5D0", "3>+ c #B3BECF", "4>+ c #98B4D0", "5>+ c #6CA0D2", "6>+ c #407FD7", "7>+ c #2C42DF", "8>+ c #1616EA", "9>+ c #0401F7", "0>+ c #0000FF", "a>+ c #0000F4", "b>+ c #0000FA", "c>+ c #0000FB", "d>+ c #0201F0", "e>+ c #1211E7", "f>+ c #5959D7", "g>+ c #898ECD", "h>+ c #A0ABC9", "i>+ c #A9B8C5", "j>+ c #A1A6B8", "k>+ c #A5A4B3", "l>+ c #A9A9B7", "m>+ c #ACB1C0", "n>+ c #ADBAC8", "o>+ c #B3C5C4", "p>+ c #8492C7", "q>+ c #3A41D2", "r>+ c #0000DE", "s>+ c #0000E8", "t>+ c #0000EF", "u>+ c #0201FA", "v>+ c #0504F6", "w>+ c #0705F3", "x>+ c #0203F9", "y>+ c #0000F0", "z>+ c #0203F3", "A>+ c #2F36E1", "B>+ c #5B5EC9", "C>+ c #7770B2", "D>+ c #7763A5", "E>+ c #3D20AC", "F>+ c #1F02B1", "G>+ c #1B00B1", "H>+ c #1702BD", "I>+ c #1902BC", "J>+ c #2202B3", "K>+ c #3C049A", "L>+ c #790569", "M>+ c #C3052E", "N>+ c #FF0400", "O>+ c #F10E0C", "P>+ c #DA564E", "Q>+ c #D1756E", "R>+ c #D46D6C", "S>+ c #DC5256", "T>+ c #E53237", "U>+ c #EB1A1F", "V>+ c #F00A10", "W>+ c #F40207", "X>+ c #F60206", "Y>+ c #FA0103", "Z>+ c #FF0000", "`>+ c #FB0103", " ,+ c #FD0102", ".,+ c #F50306", "+,+ c #F50206", "@,+ c #F50205", "#,+ c #F30104", "$,+ c #F20507", "%,+ c #EF1214", "&,+ c #E52F32", "*,+ c #D16D71", "=,+ c #BD9EA3", "-,+ c #AFB9C0", ";,+ c #ABBEC6", ">,+ c #BAA7AC", ",,+ c #CA8186", "',+ c #D8565B", "),+ c #E12F35", "!,+ c #E01A21", "~,+ c #E50B11", "{,+ c #EE0305", "],+ c #FA0100", "^,+ c #F90100", "/,+ c #F50401", "(,+ c #F70302", "_,+ c #F90201", ":,+ c #FB0100", "<,+ c #F60202", "[,+ c #F50305", "},+ c #EC1719", "|,+ c #DB3F40", "1,+ c #C28B8B", "2,+ c #9FA4A6", "3,+ c #80989F", "4,+ c #748B96", "5,+ c #9AABB2", "6,+ c #B0BCD0", "7,+ c #ACB8D1", "8,+ c #ACB8C8", "9,+ c #ACBAC5", "0,+ c #C88788", "a,+ c #E13C3C", "b,+ c #F90104", "c,+ c #FE0100", "d,+ c #FF0100", "e,+ c #FF0200", "f,+ c #FF0201", "g,+ c #FF0202", "h,+ c #FE0303", "i,+ c #FC0403", "j,+ c #FB0403", "k,+ c #FA0302", "l,+ c #F80200", "m,+ c #F30000", "n,+ c #F20201", "o,+ c #F30606", "p,+ c #F10F12", "q,+ c #EB2129", "r,+ c #D23B44", "s,+ c #AF5D63", "t,+ c #978286", "u,+ c #A3AAB1", "v,+ c #ACBEC8", "w,+ c #ACBEC9", "x,+ c #828F95", "y,+ c #818E94", "z,+ c #AEBDC7", "A,+ c #B6AEB1", "B,+ c #C68888", "C,+ c #E62D2C", "D,+ c #F80302", "E,+ c #EB1616", "F,+ c #DE4A4A", "G,+ c #CC8486", "H,+ c #ADB3B6", "I,+ c #B9A19E", "J,+ c #CE7871", "K,+ c #DC4949", "L,+ c #E42A2D", "M,+ c #E91B1C", "N,+ c #EC1212", "O,+ c #EF0808", "P,+ c #F30202", "Q,+ c #EB252A", "R,+ c #CE707B", "S,+ c #B4B6C1", "T,+ c #AEBEC2", "U,+ c #ACC2C9", "V,+ c #ADC0D0", "W,+ c #B5ABC1", "X,+ c #C8747E", "Y,+ c #DC3F41", "Z,+ c #ED1616", "`,+ c #F00102", " '+ c #E21B23", ".'+ c #C88384", "+'+ c #B2BAB9", "@'+ c #A5C5C5", "#'+ c #A3C0C1", "$'+ c #B3C3C5", "%'+ c #98CDDA", "&'+ c #68DBE9", "*'+ c #4DE3F3", "='+ c #46E7F8", "-'+ c #47E6F8", ";'+ c #48E7F6", ">'+ c #4BE7F3", ",'+ c #4FE3EE", "''+ c #54D9EE", ")'+ c #69B5CD", "!'+ c #8C8293", "~'+ c #B34C55", "{'+ c #D82528", "]'+ c #EB0E0F", "^'+ c #EF0505", "/'+ c #ED0404", "('+ c #EC0404", "_'+ c #EF0303", ":'+ c #F40001", "<'+ c #FC0102", "['+ c #F90203", "}'+ c #F30607", "|'+ c #E41710", "1'+ c #D4322C", "2'+ c #BD5859", "3'+ c #998994", "4'+ c #58CBDF", "5'+ c #3CEAFF", "6'+ c #3DEDFF", "7'+ c #49E5F7", "8'+ c #55E1EB", "9'+ c #6FDAE2", "0'+ c #8FD3D9", "a'+ c #A7CAD3", "b'+ c #A4C3D7", "c'+ c #A1C0D3", "d'+ c #A3B9C4", "e'+ c #AB7474", "f'+ c #C14242", "g'+ c #DE181A", "h'+ c #F70001", "i'+ c #E61314", "j'+ c #D26367", "k'+ c #CA8287", "l'+ c #CF7479", "m'+ c #D95156", "n'+ c #E43135", "o'+ c #EC1A1D", "p'+ c #F10B0D", "q'+ c #F40104", "r'+ c #F60102", "s'+ c #FA0200", "t'+ c #FC0200", "u'+ c #FC0100", "v'+ c #FB0200", "w'+ c #F90200", "x'+ c #F80201", "y'+ c #FA0001", "z'+ c #F40201", "A'+ c #F30101", "B'+ c #F30404", "C'+ c #F10C0D", "D'+ c #E61A1C", "E'+ c #C92B30", "F'+ c #B3585D", "G'+ c #A59196", "H'+ c #A0BEC4", "I'+ c #A8BDC6", "J'+ c #ABC4BD", "K'+ c #99B1C3", "L'+ c #7887D1", "M'+ c #4E52E1", "N'+ c #1B18ED", "O'+ c #0200F6", "P'+ c #171AF2", "Q'+ c #494FDF", "R'+ c #767FD0", "S'+ c #6970D7", "T'+ c #4E52DE", "U'+ c #2F32E4", "V'+ c #1414EA", "W'+ c #0405EE", "X'+ c #0200F3", "Y'+ c #0501F6", "Z'+ c #0100FB", "`'+ c #0100F3", " )+ c #0502F4", ".)+ c #0A07F1", "+)+ c #1C1CEB", "@)+ c #3B3FE2", "#)+ c #646DD5", "$)+ c #99A7C9", "%)+ c #A6B3B3", "&)+ c #97A29D", "*)+ c #8B9398", "=)+ c #C2D3D8", "-)+ c #C1D3D6", ";)+ c #BECCCF", ">)+ c #C1CFCF", ",)+ c #C4D1CD", "')+ c #BDCDCB", "))+ c #B9C7C9", "!)+ c #B0C0BF", "~)+ c #A5B3C1", "{)+ c #7F89D1", "])+ c #5563DB", "^)+ c #2F43E0", "/)+ c #1328E4", "()+ c #0C14EA", "_)+ c #0506F2", ":)+ c #0201FF", "<)+ c #0201F7", "[)+ c #0303F6", "})+ c #191BED", "|)+ c #3533D7", "1)+ c #4F48BA", "2)+ c #645FA1", "3)+ c #697897", "4)+ c #6D7F9A", "5)+ c #7177A3", "6)+ c #7269AA", "7)+ c #705EA0", "8)+ c #6E5B9D", "9)+ c #6E5EA1", "0)+ c #6E63A6", "a)+ c #7468A0", "b)+ c #5850B0", "c)+ c #2A27CD", "d)+ c #0303E8", "e)+ c #0101FA", "f)+ c #0203F6", "g)+ c #0303F3", "h)+ c #0102F8", "i)+ c #161AC1", "j)+ c #2F2BA1", "k)+ c #422E96", "l)+ c #462599", "m)+ c #2D0CAA", "n)+ c #2001B1", "o)+ c #1802BD", "p)+ c #1902BB", "q)+ c #2202B4", "r)+ c #3A049B", "s)+ c #76066B", "t)+ c #C00732", "u)+ c #FB0804", "v)+ c #FB0402", "w)+ c #F80101", "x)+ c #E13D35", "y)+ c #DD4942", "z)+ c #E33736", "A)+ c #EC1C21", "B)+ c #F40A0E", "C)+ c #F90205", "D)+ c #FB0203", "E)+ c #FB0505", "F)+ c #F90509", "G)+ c #F6050A", "H)+ c #F40507", "I)+ c #F30505", "J)+ c #F4070A", "K)+ c #F40608", "L)+ c #F40505", "M)+ c #F60506", "N)+ c #F50408", "O)+ c #F40508", "P)+ c #F60203", "Q)+ c #F60001", "R)+ c #F10D0E", "S)+ c #E03D3D", "T)+ c #C7686D", "U)+ c #B0848F", "V)+ c #A88C9A", "W)+ c #C27177", "X)+ c #D94B4D", "Y)+ c #E72426", "Z)+ c #EF0709", "`)+ c #F00505", " !+ c #F40504", ".!+ c #F80402", "+!+ c #FB0302", "@!+ c #F70506", "#!+ c #F0060A", "$!+ c #EA080C", "%!+ c #E8080B", "&!+ c #F10606", "*!+ c #F80404", "=!+ c #FA0303", "-!+ c #FB0304", ";!+ c #FB0405", ">!+ c #FA0405", ",!+ c #F70303", "'!+ c #E61313", ")!+ c #C45A5E", "!!+ c #9A7780", "~!+ c #747480", "{!+ c #606D7D", "]!+ c #768397", "^!+ c #838EAA", "/!+ c #858EB3", "(!+ c #828CB3", "_!+ c #828DAA", ":!+ c #818FA5", "~+ c #7AD3E2", ",~+ c #54DFF0", "'~+ c #42E4F6", ")~+ c #41E4F6", "!~+ c #46E3F4", "~~+ c #44E3F3", "{~+ c #43E7F5", "]~+ c #46E8F3", "^~+ c #51DCE7", "/~+ c #6CB5CA", "(~+ c #927F94", "_~+ c #BC4652", ":~+ c #E1161A", "<~+ c #F50607", "[~+ c #F10303", "}~+ c #F10101", "|~+ c #F20304", "1~+ c #F30F11", "2~+ c #EE1817", "3~+ c #E71C1B", "4~+ c #DF1D1E", "5~+ c #D81C1E", "6~+ c #D81D1E", "7~+ c #DE191A", "8~+ c #E61212", "9~+ c #EF0A0A", "0~+ c #F20305", "a~+ c #F50103", "b~+ c #F40909", "c~+ c #E82425", "d~+ c #C85056", "e~+ c #8393A3", "f~+ c #57C3D7", "g~+ c #44DFF0", "h~+ c #40EAFA", "i~+ c #43E6F6", "j~+ c #45E4F4", "k~+ c #44E5F1", "l~+ c #54DFE9", "m~+ c #6DD2DE", "n~+ c #81C0D2", "o~+ c #7BA8CA", "p~+ c #779BBD", "q~+ c #7992AB", "r~+ c #82838F", "s~+ c #935F66", "t~+ c #B4393E", "u~+ c #DB171B", "v~+ c #F20302", "w~+ c #E91212", "x~+ c #D94849", "y~+ c #D75356", "z~+ c #E03C40", "A~+ c #EC1B1F", "B~+ c #F5090B", "C~+ c #F80506", "D~+ c #F50608", "E~+ c #ED060A", "F~+ c #ED0609", "G~+ c #EF0608", "H~+ c #F80504", "I~+ c #FD0203", "J~+ c #FD0202", "K~+ c #F70402", "L~+ c #F50507", "M~+ c #F50405", "N~+ c #F50303", "O~+ c #F00606", "P~+ c #E31215", "Q~+ c #C6373E", "R~+ c #A36871", "S~+ c #85909C", "T~+ c #8191A4", "U~+ c #828EA7", "V~+ c #838EA6", "W~+ c #828EA6", "X~+ c #8190A5", "Y~+ c #7E969E", "Z~+ c #728AA8", "`~+ c #5D6CBD", " {+ c #4145D7", ".{+ c #1918EB", "+{+ c #0403F7", "@{+ c #1113F5", "#{+ c #3035E7", "${+ c #484DDB", "%{+ c #3134E0", "&{+ c #1D1EE4", "*{+ c #1011E7", "={+ c #0808EB", "-{+ c #0202F4", ";{+ c #0603F7", ">{+ c #0101F8", ",{+ c #0201F4", "'{+ c #0301EF", "){+ c #0201F2", "!{+ c #0101F4", "~{+ c #0101F5", "{{+ c #0101F6", "]{+ c #0403F5", "^{+ c #0604F3", "/{+ c #0401F4", "({+ c #1312ED", "_{+ c #2F31DF", ":{+ c #6871C3", "<{+ c #7C88A4", "[{+ c #75808D", "}{+ c #6C7687", "|{+ c #848EA0", "1{+ c #939FB2", "2{+ c #9AA8BA", "3{+ c #9CADBA", "4{+ c #A0A9B3", "5{+ c #8F96A7", "6{+ c #8D91A2", "7{+ c #88929D", "8{+ c #88959F", "9{+ c #8693A6", "0{+ c #7782B6", "a{+ c #4A51D5", "b{+ c #2528E6", "c{+ c #0D0EEC", "d{+ c #0102ED", "e{+ c #0001F2", "f{+ c #0001F6", "g{+ c #0303ED", "h{+ c #0405E7", "i{+ c #0407E3", "j{+ c #0508DF", "k{+ c #0609DB", "l{+ c #060AD9", "m{+ c #050ADA", "n{+ c #0509DD", "o{+ c #0908E0", "p{+ c #0805E7", "q{+ c #0502F0", "r{+ c #0300F3", "s{+ c #0001F4", "t{+ c #0905E1", "u{+ c #1B10C4", "v{+ c #342AA8", "w{+ c #4F6697", "x{+ c #5E7B94", "y{+ c #636D99", "z{+ c #5C4FA2", "A{+ c #4735A8", "B{+ c #3D27A8", "C{+ c #3D24A3", "D{+ c #41259E", "E{+ c #452799", "F{+ c #3822AD", "G{+ c #1F17CF", "H{+ c #080CEE", "I{+ c #0306F3", "J{+ c #0204F3", "K{+ c #0202F3", "L{+ c #0202F8", "M{+ c #0202F9", "N{+ c #0102F6", "O{+ c #0001FD", "P{+ c #0001F9", "Q{+ c #0404F5", "R{+ c #0202F7", "S{+ c #0403FA", "T{+ c #0102FD", "U{+ c #0103EF", "V{+ c #0C0BB3", "W{+ c #190D91", "X{+ c #240A89", "Y{+ c #2A0593", "Z{+ c #2401A7", "`{+ c #1702BE", " ]+ c #2302B2", ".]+ c #440393", "+]+ c #7F0763", "@]+ c #C20B31", "#]+ c #F50E0A", "$]+ c #F40906", "%]+ c #F40303", "&]+ c #F30808", "*]+ c #ED1B1A", "=]+ c #EB1E1D", "-]+ c #EE1414", ";]+ c #F70003", ">]+ c #FB0001", ",]+ c #FB0506", "']+ c #F30514", ")]+ c #E6071A", "!]+ c #D90B1A", "~]+ c #D20D18", "{]+ c #DD0D1B", "]]+ c #DD0D1C", "^]+ c #D60D1A", "/]+ c #D40C16", "(]+ c #E7090E", "_]+ c #F3060A", ":]+ c #F60509", "<]+ c #F60408", "[]+ c #ED1816", "}]+ c #D42F34", "|]+ c #B83F4F", "1]+ c #AD4459", "2]+ c #CE333B", "3]+ c #F30B0A", "4]+ c #F90302", "5]+ c #FA0506", "6]+ c #EB0916", "7]+ c #DB0C1F", "8]+ c #CF0D20", "9]+ c #CD0D1B", "0]+ c #E00B11", "a]+ c #E9090C", "b]+ c #EB080C", "c]+ c #ED070C", "d]+ c #F70509", "e]+ c #FC0406", "f]+ c #F90303", "g]+ c #EC0506", "h]+ c #C92936", "i]+ c #973D52", "j]+ c #64445E", "k]+ c #404565", "l]+ c #454D78", "m]+ c #495183", "n]+ c #485286", "o]+ c #475285", "p]+ c #465380", "q]+ c #46547E", "r]+ c #46547F", "s]+ c #465480", "t]+ c #465381", "u]+ c #48527E", "v]+ c #485375", "w]+ c #783E54", "x]+ c #C21D26", "y]+ c #FC0302", "z]+ c #FA0306", "A]+ c #F5050B", "B]+ c #EE080C", "C]+ c #E50A11", "D]+ c #D90C17", "E]+ c #C80E1C", "F]+ c #B0111E", "G]+ c #A41322", "H]+ c #A11327", "I]+ c #A3132A", "J]+ c #A21325", "K]+ c #A81220", "L]+ c #B3101E", "M]+ c #BF0F1E", "N]+ c #C80E1E", "O]+ c #D40C1A", "P]+ c #E00A13", "Q]+ c #EC080A", "R]+ c #F40101", "S]+ c #E90608", "T]+ c #D7171B", "U]+ c #B52F38", "V]+ c #704860", "W]+ c #4D547A", "X]+ c #465583", "Y]+ c #48507E", "Z]+ c #3F466C", "`]+ c #3D466A", " ^+ c #414D74", ".^+ c #465580", "+^+ c #47547F", "@^+ c #47547E", "#^+ c #435481", "$^+ c #48557E", "%^+ c #595172", "&^+ c #7E4258", "*^+ c #CA1A20", "=^+ c #FA0102", "-^+ c #E10F14", ";^+ c #BD2532", ">^+ c #A3394B", ",^+ c #B4424D", "'^+ c #CB3C3F", ")^+ c #E02C29", "!^+ c #EF1812", "~^+ c #F20401", "{^+ c #FD0100", "]^+ c #FC0304", "^^+ c #FB0307", "/^+ c #FC0306", "(^+ c #FD0205", "_^+ c #FD0103", ":^+ c #FE0101", "<^+ c #DA121B", "[^+ c #91344C", "}^+ c #4D5379", "|^+ c #4B547D", "1^+ c #475484", "2^+ c #44548A", "3^+ c #524E81", "4^+ c #863756", "5^+ c #B9212E", "6^+ c #E00F11", "7^+ c #F90300", "8^+ c #F70401", "9^+ c #F80202", "0^+ c #F20308", "a^+ c #D5111E", "b^+ c #823F54", "c^+ c #505372", "d^+ c #42557C", "e^+ c #475783", "f^+ c #537195", "g^+ c #5D95B2", "h^+ c #60BAD1", "i^+ c #5BD9EB", "j^+ c #46E0F3", "k^+ c #3EE0F4", "l^+ c #40DFF1", "m^+ c #44DDEE", "n^+ c #40DFED", "o^+ c #3CE4F0", "p^+ c #41E2EE", "q^+ c #56CAD7", "r^+ c #8D8291", "s^+ c #BD4652", "t^+ c #DF1C22", "u^+ c #F40102", "v^+ c #F00C0E", "w^+ c #E91E22", "x^+ c #DE3639", "y^+ c #C7504D", "z^+ c #B55B59", "A^+ c #A95C5E", "B^+ c #A4595E", "C^+ c #A65A5E", "D^+ c #B05153", "E^+ c #C03F3F", "F^+ c #D12829", "G^+ c #DE0F14", "H^+ c #E90308", "I^+ c #F30102", "J^+ c #F50202", "K^+ c #F10C0C", "L^+ c #E22224", "M^+ c #BC4751", "N^+ c #8B808D", "O^+ c #59BECB", "P^+ c #37EBF7", "Q^+ c #3CE5F1", "R^+ c #40E0EE", "S^+ c #40E0F0", "T^+ c #3FE0F4", "U^+ c #3DE3F3", "V^+ c #43DDEC", "W^+ c #4DCCDE", "X^+ c #54AFC9", "Y^+ c #4B82AC", "Z^+ c #436694", "`^+ c #415881", " /+ c #4B4E6C", "./+ c #6D3B50", "+/+ c #9F2532", "@/+ c #D41016", "#/+ c #FA0203", "$/+ c #F40403", "%/+ c #EF0B0A", "&/+ c #E92020", "*/+ c #E82223", "=/+ c #ED1617", "-/+ c #F40607", ";/+ c #EF080A", ">/+ c #D80C19", ",/+ c #CD0D1E", "'/+ c #CC0D1D", ")/+ c #D30C19", "!/+ c #DF0B12", "~/+ c #EC090B", "{/+ c #F3050B", "]/+ c #F70408", "^/+ c #F90404", "//+ c #F80403", "(/+ c #F40408", "_/+ c #EF0403", ":/+ c #F00708", "(+ c #3028C0", ",(+ c #1D0FC8", "'(+ c #1F07BB", ")(+ c #2908A9", "!(+ c #2B08A6", "~(+ c #240AB8", "{(+ c #170DD5", "](+ c #0B0FEE", "^(+ c #090DEF", "/(+ c #0809EF", "((+ c #0606F1", "_(+ c #0604F4", ":(+ c #0604F5", "<(+ c #0503F6", "[(+ c #0102FC", "}(+ c #0203FA", "|(+ c #0404F9", "1(+ c #0204F5", "2(+ c #0104F3", "3(+ c #0104F2", "4(+ c #0204F2", "5(+ c #0405F0", "6(+ c #0505F0", "7(+ c #0304F1", "8(+ c #0605F5", "9(+ c #0605F9", "0(+ c #0304F8", "a(+ c #0304E8", "b(+ c #0C05B5", "c(+ c #160496", "d(+ c #1E028E", "e(+ c #220094", "f(+ c #2100A6", "g(+ c #2101B1", "h(+ c #2402B1", "i(+ c #4B038D", "j(+ c #85085E", "k(+ c #C30E30", "l(+ c #F1110E", "m(+ c #EE0B08", "n(+ c #ED0706", "o(+ c #F10505", "p(+ c #F50404", "q(+ c #F60105", "r(+ c #F60004", "s(+ c #F40402", "t(+ c #EC060D", "u(+ c #E70613", "v(+ c #DD051D", "w(+ c #CF0431", "x(+ c #BA083C", "y(+ c #A60E3F", "z(+ c #9C113F", "A(+ c #AE0F41", "B(+ c #AD0F43", "C(+ c #A11041", "D(+ c #A01039", "E(+ c #C40B27", "F(+ c #DE071A", "G(+ c #EB0611", "H(+ c #F1050C", "I(+ c #F4060A", "J(+ c #F50605", "K(+ c #F50100", "L(+ c #E30308", "M(+ c #CA0616", "N(+ c #BD071D", "O(+ c #DB040B", "P(+ c #F10201", "Q(+ c #F90204", "R(+ c #F0050A", "S(+ c #EA070C", "T(+ c #E5090E", "U(+ c #DB0B15", "V(+ c #C3102D", "W(+ c #AD1339", "X(+ c #A01539", "Y(+ c #9E1532", "Z(+ c #B31326", "`(+ c #BD1120", " _+ c #C0111F", "._+ c #C4101D", "+_+ c #D50C16", "@_+ c #E6070F", "#_+ c #F30408", "$_+ c #FA0204", "%_+ c #F60404", "&_+ c #F60503", "*_+ c #F60502", "=_+ c #EF0507", "-_+ c #D60515", ";_+ c #A00E2A", ">_+ c #5E1B40", ",_+ c #272554", "'_+ c #1E215F", ")_+ c #1B2163", "!_+ c #172361", "~_+ c #15245E", "{_+ c #16245F", "]_+ c #162460", "^_+ c #162461", "/_+ c #172362", "(_+ c #192260", "__+ c #152559", ":_+ c #501E42", "<_+ c #AC1123", "[_+ c #F80509", "}_+ c #F00607", "|_+ c #E2080C", "1_+ c #D70B14", "2_+ c #CD0D1C", "3_+ c #C60F1E", "4_+ c #BA1124", "5_+ c #A9142E", "6_+ c #921737", "7_+ c #721C39", "8_+ c #611E3F", "9_+ c #5C1E47", "0_+ c #5F1E4B", "a_+ c #601E40", "b_+ c #681D39", "c_+ c #761A36", "d_+ c #861836", "e_+ c #921638", "f_+ c #A11532", "g_+ c #B31327", "h_+ c #C90F1A", "i_+ c #E6070D", "j_+ c #F40306", "k_+ c #F00705", "l_+ c #EA060A", "m_+ c #C80A16", "n_+ c #681836", "o_+ c #2F204F", "p_+ c #1B215D", "q_+ c #1A2162", "r_+ c #1E245B", "s_+ c #1D2559", "t_+ c #19255C", "u_+ c #152460", "v_+ c #122461", "w_+ c #18245E", "x_+ c #2E2254", "y_+ c #5D1D40", "z_+ c #BC0F1A", "A_+ c #F10605", "B_+ c #FE0404", "C_+ c #E1080E", "D_+ c #B70C1C", "E_+ c #9E0D23", "F_+ c #C40715", "G_+ c #E10309", "H_+ c #F00002", "I_+ c #ED0608", "J_+ c #F00407", "K_+ c #EF0409", "L_+ c #EC050C", "M_+ c #E9070F", "N_+ c #E5080F", "O_+ c #E7070D", "P_+ c #EC050A", "Q_+ c #F10407", "R_+ c #FC0407", "S_+ c #C70C19", "T_+ c #6D1936", "U_+ c #1E2453", "V_+ c #1A215F", "W_+ c #142168", "X_+ c #102269", "Y_+ c #23215E", "Z_+ c #68173E", "`_+ c #AA0F22", " :+ c #DC080E", ".:+ c #FA0402", "+:+ c #F80502", "@:+ c #FA0504", "#:+ c #D00B1A", "$:+ c #621B3B", "%:+ c #241F50", "&:+ c #161F5C", "*:+ c #1F2A6B", "=:+ c #245487", "-:+ c #2F87AE", ";:+ c #3BB9D6", ">:+ c #43DDF3", ",:+ c #3FDDF3", "':+ c #3FDAEF", "):+ c #41D9EC", "!:+ c #42D9E9", "~:+ c #3DDFE9", "{:+ c #3CE0E8", "]:+ c #48D0DB", "^:+ c #69A7B3", "/:+ c #B34D55", "(:+ c #E1171A", "_:+ c #F50304", "::+ c #F80100", "<:+ c #F60301", "[:+ c #F50403", "}:+ c #F00D0F", "|:+ c #E01C1F", "1:+ c #D33237", "2:+ c #C64E54", "3:+ c #B46F73", "4:+ c #939391", "5:+ c #7CA3A0", "6:+ c #70A2A5", "7:+ c #6E9BA4", "8:+ c #709CA3", "9:+ c #7C9296", "0:+ c #8F7A7E", "a:+ c #A45B5E", "b:+ c #B9333C", "c:+ c #D01921", "d:+ c #E50C0F", "e:+ c #F20706", "f:+ c #EE0807", "g:+ c #ED0606", "h:+ c #EC0505", "i:+ c #EC060A", "j:+ c #BE3E44", "k:+ c #77949A", "l:+ c #3BDCE3", "m:+ c #39E0E7", "n:+ c #3BDEE9", "o:+ c #3BDEEE", "p:+ c #3BDCF2", "q:+ c #3BDFF4", "r:+ c #3ADAEF", "s:+ c #38C9E0", "t:+ c #32A7C5", "u:+ c #286995", "v:+ c #1A3F74", "w:+ c #132960", "x:+ c #1E2051", "y:+ c #4B1D3E", "z:+ c #8B1527", "A:+ c #CD0B11", "B:+ c #FC0301", "C:+ c #F20406", "D:+ c #EC0708", "E:+ c #E30A0B", "F:+ c #D80D0F", "G:+ c #C90F18", "H:+ c #B71223", "I:+ c #A6152D", "J:+ c #991634", "K:+ c #971637", "L:+ c #B11327", "M:+ c #C2101D", "N:+ c #CA0E1D", "O:+ c #D50B17", "P:+ c #E2080E", "Q:+ c #F30509", "R:+ c #F00609", "S:+ c #ED0707", "T:+ c #F70503", "U:+ c #DF0709", "V:+ c #AA0C19", "W:+ c #6B1530", "X:+ c #2E2050", "Y:+ c #142461", "Z:+ c #132265", "`:+ c #1B2063", " <+ c #182261", ".<+ c #15245F", "+<+ c #17255A", "@<+ c #162169", "#<+ c #111989", "$<+ c #0B10B4", "%<+ c #0306E6", "&<+ c #0000EA", "*<+ c #0101EB", "=<+ c #0203EA", "-<+ c #0404E8", ";<+ c #0505E7", "><+ c #0305E7", ",<+ c #0306E5", "'<+ c #0508E0", ")<+ c #070AD9", "!<+ c #0B0BCE", "~<+ c #0F0CC5", "{<+ c #120CBE", "]<+ c #130DBC", "^<+ c #0F0CC2", "/<+ c #0B0BCC", "(<+ c #080AD7", "_<+ c #0508E2", ":<+ c #0305ED", "<<+ c #0103F3", "[<+ c #0002F3", "}<+ c #0102F3", "|<+ c #0001ED", "1<+ c #0508CA", "2<+ c #0C13A0", "3<+ c #131F78", "4<+ c #18275A", "5<+ c #152356", "6<+ c #142257", "7<+ c #232E61", "8<+ c #384463", "9<+ c #3B4666", "0<+ c #303968", "a<+ c #232A68", "b<+ c #202A65", "c<+ c #1D285F", "d<+ c #1C2559", "e<+ c #1B2255", "f<+ c #1C2354", "g<+ c #171D6A", "h<+ c #0E1491", "i<+ c #0509BD", "j<+ c #0102E4", "k<+ c #0403EB", "l<+ c #0707DB", "m<+ c #0C0DC5", "n<+ c #1115AB", "o<+ c #141D95", "p<+ c #172285", "q<+ c #19257C", "r<+ c #18247F", "s<+ c #192679", "t<+ c #1A296F", "u<+ c #1B286C", "v<+ c #191D7B", "w<+ c #171491", "x<+ c #160FAB", "y<+ c #1710C4", "z<+ c #1D1EDA", "A<+ c #181DE6", "B<+ c #0D10EA", "C<+ c #0303E9", "D<+ c #0405E9", "E<+ c #0101F0", "F<+ c #1116F5", "G<+ c #4E77E0", "H<+ c #74A0BE", "I<+ c #7B92A0", "J<+ c #66649A", "K<+ c #2827D0", "L<+ c #0E07E0", "M<+ c #1200CE", "N<+ c #1F00B7", "O<+ c #2000B5", "P<+ c #1B02C1", "Q<+ c #1507D4", "R<+ c #100DE4", "S<+ c #110EE0", "T<+ c #0F0CE3", "U<+ c #0B08EC", "V<+ c #0805F2", "W<+ c #0302F8", "X<+ c #0302F7", "Y<+ c #0804F1", "Z<+ c #0B05EA", "`<+ c #0905E4", " [+ c #0705E2", ".[+ c #0705E3", "+[+ c #0705E4", "@[+ c #0805E3", "#[+ c #0B04EA", "$[+ c #0A04EE", "%[+ c #0805EA", "&[+ c #0905DC", "*[+ c #1304BB", "=[+ c #1B04A4", "-[+ c #20059B", ";[+ c #23059B", ">[+ c #2203A7", ",[+ c #2102B4", "'[+ c #3D0499", ")[+ c #790668", "![+ c #C10831", "~[+ c #F90906", "{[+ c #F50704", "][+ c #F10604", "^[+ c #F20503", "/[+ c #F80303", "([+ c #F90400", "_[+ c #F40800", ":[+ c #E20E09", "<[+ c #C30E24", "[[+ c #9F0A47", "}[+ c #7C0567", "|[+ c #640578", "1[+ c #530683", "2[+ c #4A068A", "3[+ c #47058E", "4[+ c #4C0593", "5[+ c #460794", "6[+ c #40098D", "7[+ c #48097E", "8[+ c #780864", "9[+ c #A40547", "0[+ c #C6022C", "a[+ c #E00117", "b[+ c #EF040C", "c[+ c #F50604", "d[+ c #F20103", "e[+ c #E80207", "f[+ c #E1040A", "g[+ c #E70406", "h[+ c #FA0305", "i[+ c #F4050B", "j[+ c #D20B16", "k[+ c #B01222", "l[+ c #92192E", "m[+ c #771E3C", "n[+ c #5E1F50", "o[+ c #4D2159", "p[+ c #452359", "q[+ c #452454", "r[+ c #4B2451", "s[+ c #52234C", "t[+ c #5A2245", "u[+ c #64213F", "v[+ c #6D203E", "w[+ c #971830", "x[+ c #CF0C1A", "y[+ c #FD0308", "z[+ c #F90405", "A[+ c #F50504", "B[+ c #F50503", "C[+ c #C50A17", "D[+ c #781A38", "E[+ c #322756", "F[+ c #232461", "G[+ c #1C2464", "H[+ c #192663", "I[+ c #182761", "J[+ c #192762", "K[+ c #192664", "L[+ c #182664", "M[+ c #182762", "N[+ c #1B2564", "O[+ c #1F2362", "P[+ c #1D2758", "Q[+ c #502045", "R[+ c #9C152D", "S[+ c #D50C1A", "T[+ c #B90F1C", "U[+ c #961626", "V[+ c #781C34", "W[+ c #612143", "X[+ c #59204C", "Y[+ c #522152", "Z[+ c #492357", "`[+ c #412559", " }+ c #372659", ".}+ c #30265E", "+}+ c #2D2665", "@}+ c #2C2567", "#}+ c #2F275C", "$}+ c #332757", "%}+ c #382658", "&}+ c #3D2559", "*}+ c #422359", "=}+ c #472354", "-}+ c #53234A", ";}+ c #701F3B", ">}+ c #AF1229", ",}+ c #DA0917", "'}+ c #F90401", ")}+ c #DF060B", "!}+ c #9B1024", "~}+ c #5D1A3F", "{}+ c #302256", "]}+ c #162763", "^}+ c #1D275C", "/}+ c #1F285A", "(}+ c #1B285D", "_}+ c #182764", ":}+ c #182665", "<}+ c #152764", "[}+ c #1B275F", "}}+ c #302555", "|}+ c #5F1F42", "1}+ c #BD101B", "2}+ c #F90406", "3}+ c #ED070A", "4}+ c #DB090E", "5}+ c #D00910", "6}+ c #DD060B", "7}+ c #E90406", "8}+ c #F20303", "9}+ c #F60507", "0}+ c #E20913", "a}+ c #CC0D1E", "b}+ c #C00D1D", "c}+ c #BC0E1D", "d}+ c #BB0F1D", "e}+ c #B6101F", "f}+ c #A51322", "g}+ c #A51321", "h}+ c #B1101F", "i}+ c #BF0D1C", "j}+ c #C60C1C", "k}+ c #A01229", "l}+ c #5F1E3D", "m}+ c #252753", "n}+ c #192566", "o}+ c #0F2472", "p}+ c #0D2574", "q}+ c #252267", "r}+ c #781741", "s}+ c #BA0E22", "t}+ c #E4080D", "u}+ c #F80401", "v}+ c #F4050A", "w}+ c #D00A1A", "x}+ c #631C3C", "y}+ c #292251", "z}+ c #1F255F", "A}+ c #2A3873", "B}+ c #2E76A0", "C}+ c #33A9C7", "D}+ c #39CBE4", "E}+ c #3EDDF3", "F}+ c #43D9F0", "G}+ c #45D6EC", "H}+ c #44D7EA", "I}+ c #43DBEA", "J}+ c #40EDF6", "K}+ c #4FD9DF", "L}+ c #71A6AB", "M}+ c #9E656A", "N}+ c #D72528", "O}+ c #F60305", "P}+ c #F30604", "Q}+ c #E01B19", "R}+ c #C23F40", "S}+ c #927780", "T}+ c #759DA8", "U}+ c #67B1BB", "V}+ c #60BDC3", "W}+ c #56CBCE", "X}+ c #4FD0D4", "Y}+ c #4BCFD5", "Z}+ c #4CCBD4", "`}+ c #50CAD7", " |+ c #52C8D4", ".|+ c #55C1CA", "+|+ c #5FB0B7", "@|+ c #738E9A", "#|+ c #98616C", "$|+ c #C4323A", "%|+ c #E80E10", "&|+ c #F10707", "*|+ c #F10504", "=|+ c #EB0605", "-|+ c #D22325", ";|+ c #996566", ">|+ c #60A9AB", ",|+ c #45D0D6", "'|+ c #39E1EB", ")|+ c #38E1F2", "!|+ c #3CDCF2", "~|+ c #3CDCF3", "{|+ c #3CDEF4", "]|+ c #3AD9EF", "^|+ c #36C1DB", "/|+ c #2E7FA7", "(|+ c #204E83", "_|+ c #17306C", ":|+ c #1F225A", "<|+ c #482444", "[|+ c #891C29", "}|+ c #CE0D10", "||+ c #F30504", "1|+ c #F00404", "2|+ c #F50200", "3|+ c #FB0301", "4|+ c #E40714", "5|+ c #C8101E", "6|+ c #AB1922", "7|+ c #8C2029", "8|+ c #67213D", "9|+ c #502246", "0|+ c #452347", "a|+ c #422447", "b|+ c #422455", "c|+ c #452357", "d|+ c #4B234F", "e|+ c #522245", "f|+ c #5A2243", "g|+ c #741D39", "h|+ c #9B152A", "i|+ c #C50C1A", "j|+ c #E8070A", "k|+ c #FC0201", "l|+ c #F30305", "m|+ c #D60810", "n|+ c #A01024", "o|+ c #3F2049", "p|+ c #11275F", "q|+ c #0E2766", "r|+ c #1A2566", "s|+ c #1A2663", "t|+ c #192761", "u|+ c #192760", "v|+ c #1A295C", "w|+ c #18246A", "x|+ c #131B8A", "y|+ c #0D11B4", "z|+ c #0406E6", "A|+ c #0001F1", "B|+ c #0102EC", "C|+ c #0102F0", "D|+ c #0302EE", "E|+ c #0803E6", "F|+ c #0D07D5", "G|+ c #0E13B8", "H|+ c #0F1AA5", "I|+ c #111D9A", "J|+ c #131E93", "K|+ c #1A1E8A", "L|+ c #1C1F84", "M|+ c #1C2080", "N|+ c #19227F", "O|+ c #162089", "P|+ c #131C99", "Q|+ c #1017AC", "R|+ c #0E13B9", "S|+ c #090DCE", "T|+ c #0405E5", "U|+ c #0001F5", "V|+ c #0102F1", "W|+ c #0707E8", "X|+ c #0E12BD", "Y|+ c #151F82", "Z|+ c #1A2953", "`|+ c #18275B", " 1+ c #182561", ".1+ c #1B2562", "+1+ c #1F2863", "@1+ c #263063", "#1+ c #263064", "$1+ c #232C65", "%1+ c #1F2765", "&1+ c #1D2765", "*1+ c #1C2861", "=1+ c #1B275E", "-1+ c #1A2561", ";1+ c #171F75", ">1+ c #101599", ",1+ c #060AC2", "'1+ c #0001E4", ")1+ c #0000EE", "!1+ c #0700EC", "~1+ c #0D07D4", "{1+ c #1012B6", "]1+ c #131D98", "^1+ c #182383", "/1+ c #1B2675", "(1+ c #1D286E", "_1+ c #1E296B", ":1+ c #1E286C", "<1+ c #1F286B", "[1+ c #202868", "}1+ c #212867", "|1+ c #1C256D", "11+ c #1B2173", "21+ c #21247D", "31+ c #313791", "41+ c #5C74BF", "51+ c #546BDC", "61+ c #2A32E8", "71+ c #0000EB", "81+ c #0400EE", "91+ c #0401F5", "01+ c #080BF9", "a1+ c #2D3CEC", "b1+ c #5364CA", "c1+ c #6D76A4", "d1+ c #6D6A91", "e1+ c #3424B8", "f1+ c #1803C7", "g1+ c #1700BE", "h1+ c #1F00B6", "i1+ c #1C02C0", "j1+ c #1B04C7", "k1+ c #1D05BF", "l1+ c #1805C8", "m1+ c #0E05DC", "n1+ c #0304F3", "o1+ c #0202F6", "p1+ c #0003F5", "q1+ c #0704E7", "r1+ c #1004D6", "s1+ c #1703C2", "t1+ c #1603C2", "u1+ c #1603C4", "v1+ c #1504C8", "w1+ c #1503C6", "x1+ c #1502C2", "y1+ c #1602C1", "z1+ c #1902C8", "A1+ c #1802CC", "B1+ c #1603CA", "C1+ c #1503C4", "D1+ c #1B02B6", "E1+ c #1F01AD", "F1+ c #2101AA", "G1+ c #2102AA", "H1+ c #1B01BA", "I1+ c #35049F", "J1+ c #71056F", "K1+ c #BF0532", "L1+ c #FE0502", "M1+ c #F90503", "N1+ c #F90604", "O1+ c #CE091E", "P1+ c #AD0E32", "Q1+ c #860D52", "R1+ c #5F0977", "S1+ c #3D0497", "T1+ c #2804A5", "U1+ c #1E03AD", "V1+ c #1C01B2", "W1+ c #1D00B5", "X1+ c #1B00BA", "Y1+ c #1502BA", "Z1+ c #1303B4", "`1+ c #1C04A4", " 2+ c #41028A", ".2+ c #710D6F", "+2+ c #A41C53", "@2+ c #D02437", "#2+ c #EB0F15", "$2+ c #F90202", "%2+ c #F60402", "&2+ c #F30605", "*2+ c #EB080B", "=2+ c #DB0B14", "-2+ c #C20F20", ";2+ c #98142F", ">2+ c #721C3E", ",2+ c #52234B", "'2+ c #382958", ")2+ c #262864", "!2+ c #1D2968", "~2+ c #192A67", "{2+ c #192C65", "]2+ c #172C68", "^2+ c #1B2C64", "/2+ c #232B5D", "(2+ c #2C2956", "_2+ c #2E2B58", ":2+ c #5A2348", "<2+ c #A0152C", "[2+ c #E00811", "}2+ c #D90A0F", "|2+ c #8E192F", "12+ c #442650", "22+ c #2B2761", "32+ c #202867", "42+ c #1C2967", "52+ c #1C2B63", "62+ c #1D2B65", "72+ c #1D2A68", "82+ c #1C2A68", "92+ c #1C2B65", "02+ c #1D2A65", "a2+ c #1F2866", "b2+ c #232765", "c2+ c #212A5C", "d2+ c #43264F", "e2+ c #751D41", "f2+ c #961636", "g2+ c #781A36", "h2+ c #57213E", "i2+ c #3B274C", "j2+ c #252B5B", "k2+ c #202865", "l2+ c #1E286A", "m2+ c #1B296B", "n2+ c #1A2A6A", "o2+ c #1A2A69", "p2+ c #1A2A6C", "q2+ c #192970", "r2+ c #182971", "s2+ c #192B68", "t2+ c #1A2B66", "u2+ c #1B2B68", "v2+ c #1B2A6A", "w2+ c #1B2969", "x2+ c #1A2B65", "y2+ c #202B5E", "z2+ c #382852", "A2+ c #731D40", "B2+ c #AB132A", "C2+ c #D80B14", "D2+ c #EA0708", "E2+ c #C40D19", "F2+ c #871735", "G2+ c #462353", "H2+ c #162B67", "I2+ c #1D2A5F", "J2+ c #222A5C", "K2+ c #202A60", "L2+ c #1C2A67", "M2+ c #1D2969", "N2+ c #1E2968", "O2+ c #1A2B67", "P2+ c #1F2B63", "Q2+ c #342958", "R2+ c #622243", "S2+ c #BE111B", "T2+ c #F20605", "U2+ c #F60407", "V2+ c #F30608", "W2+ c #F20604", "X2+ c #EF0705", "Y2+ c #E80809", "Z2+ c #DD0B0D", "`2+ c #D50F0E", " 3+ c #C11218", ".3+ c #A71529", "+3+ c #8F1737", "@3+ c #821839", "#3+ c #7E1839", "$3+ c #7E1939", "%3+ c #7A1A39", "&3+ c #681D3B", "*3+ c #671D3C", "=3+ c #721B3A", "-3+ c #801A36", ";3+ c #891A2E", ">3+ c #741E35", ",3+ c #4D2447", "'3+ c #28295B", ")3+ c #1D286A", "!3+ c #122974", "~3+ c #102975", "{3+ c #292669", "]3+ c #7C1A42", "^3+ c #BD1023", "/3+ c #E5080E", "(3+ c #FA0404", "_3+ c #F5070B", ":3+ c #D00E1B", "<3+ c #651F3E", "[3+ c #2C2754", "}3+ c #222E64", "|3+ c #2E487D", "13+ c #3893B6", "23+ c #3CC4DC", "33+ c #3CD9EE", "43+ c #3DDDF3", "53+ c #43D8EF", "63+ c #44D7EC", "73+ c #42D9EC", "83+ c #42DCEC", "93+ c #44E5F3", "03+ c #63BEC8", "a3+ c #95777C", "b3+ c #C93130", "c3+ c #ED0D0E", "d3+ c #F50508", "e3+ c #F90006", "f3+ c #E5161B", "g3+ c #BD4346", "h3+ c #8E7B7F", "i3+ c #5DB7C1", "j3+ c #43DAE7", "k3+ c #3BE6F3", "l3+ c #3BE5F0", "m3+ c #3ADFEA", "n3+ c #3ADCE7", "o3+ c #3ADBE6", "p3+ c #3CDBE6", "q3+ c #3FD8E9", "r3+ c #3EDDED", "s3+ c #3BE3EF", "t3+ c #3CE1E9", "u3+ c #49CAD5", "v3+ c #6C9FAB", "w3+ c #9C6975", "x3+ c #CC343D", "y3+ c #EB1013", "z3+ c #E51010", "A3+ c #BF3939", "B3+ c #8E7374", "C3+ c #56BDC3", "D3+ c #3AE0ED", "E3+ c #36E4F6", "F3+ c #3CDCF1", "G3+ c #3CDCEF", "H3+ c #3CE0F3", "I3+ c #3CE1F5", "J3+ c #3BD2EA", "K3+ c #3AA2C1", "L3+ c #2F6F9B", "M3+ c #23427B", "N3+ c #26245F", "O3+ c #4A2846", "P3+ c #89202A", "Q3+ c #CD0F11", "R3+ c #EF0707", "S3+ c #EC0808", "T3+ c #E6080A", "U3+ c #D60A13", "V3+ c #AE1129", "W3+ c #8B1B37", "X3+ c #6D233D", "Y3+ c #512A44", "Z3+ c #2E2A57", "`3+ c #1B2B5A", " 4+ c #162B53", ".4+ c #182A50", "+4+ c #1A2A63", "@4+ c #192B64", "#4+ c #192C5C", "$4+ c #1E2C5B", "%4+ c #362852", "&4+ c #5F2041", "*4+ c #94162C", "=4+ c #D40C12", "-4+ c #F60504", ";4+ c #FE0201", ">4+ c #FC0103", ",4+ c #EF070B", "'4+ c #C40F1C", ")4+ c #572143", "!4+ c #1E2A5C", "~4+ c #142B67", "{4+ c #1D296A", "]4+ c #1D2A66", "^4+ c #1D2B64", "/4+ c #1D2B63", "(4+ c #1E2C5E", "_4+ c #1B286D", ":4+ c #161E8C", "<4+ c #0E13B6", "[4+ c #0302F0", "}4+ c #0807DC", "|4+ c #0F0BC8", "14+ c #1511AE", "24+ c #171E8F", "34+ c #18267B", "44+ c #1A2971", "54+ c #1B296C", "64+ c #222963", "74+ c #202B62", "84+ c #1D2C61", "94+ c #1D2D5E", "04+ c #1C2B66", "a4+ c #1A2774", "b4+ c #172284", "c4+ c #151F8E", "d4+ c #1017AD", "e4+ c #080BD7", "f4+ c #0706F8", "g4+ c #0F11CE", "h4+ c #16208C", "i4+ c #1C2C56", "j4+ c #1D2B60", "k4+ c #1F2968", "l4+ c #1F2966", "m4+ c #1E2866", "n4+ c #202964", "o4+ c #1E2B60", "p4+ c #1A286E", "q4+ c #131B98", "r4+ c #0B0FC3", "s4+ c #0406E5", "t4+ c #0100FA", "u4+ c #0302F1", "v4+ c #0E09CF", "w4+ c #1512AD", "x4+ c #181D90", "y4+ c #1D296D", "z4+ c #1F2A66", "A4+ c #202A64", "B4+ c #202965", "C4+ c #212965", "D4+ c #222865", "E4+ c #222866", "F4+ c #1E2A68", "G4+ c #1B2764", "H4+ c #222C65", "I4+ c #3C4776", "J4+ c #84A0B3", "K4+ c #82A2D7", "L4+ c #4C65E3", "M4+ c #101EE6", "N4+ c #0709ED", "O4+ c #0301F5", "P4+ c #0304FA", "Q4+ c #1213F0", "R4+ c #3436D7", "S4+ c #565AB8", "T4+ c #6462A3", "U4+ c #3720B1", "V4+ c #1F01B7", "W4+ c #2000B4", "X4+ c #2100B6", "Y4+ c #2400AD", "Z4+ c #1C01BA", "`4+ c #0E03D5", " 5+ c #0205EE", ".5+ c #0104F1", "+5+ c #0002F9", "@5+ c #0004F4", "#5+ c #1403C8", "$5+ c #1D01B4", "%5+ c #1D02B7", "&5+ c #1E02B5", "*5+ c #2001B7", "=5+ c #1D01B6", "-5+ c #2001B3", ";5+ c #1C01B7", ">5+ c #2401B0", ",5+ c #70056F", "'5+ c #BF0533", ")5+ c #FE0402", "!5+ c #F60406", "~5+ c #F70405", "{5+ c #F90403", "]5+ c #FA0603", "^5+ c #E50813", "/5+ c #BE0730", "(5+ c #8F0652", "_5+ c #650771", ":5+ c #46078A", "<5+ c #32049D", "[5+ c #1A02B6", "}5+ c #1601BB", "|5+ c #1700BA", "15+ c #1800BA", "25+ c #1600BC", "35+ c #1300BD", "45+ c #1201B8", "55+ c #1701AE", "65+ c #22009A", "75+ c #4B1B8D", "85+ c #88477E", "95+ c #C45D63", "05+ c #D50D15", "a5+ c #A61629", "b5+ c #761E3E", "c5+ c #56204E", "d5+ c #3D2359", "e5+ c #2B2860", "f5+ c #1F2B66", "g5+ c #192B69", "h5+ c #162A69", "i5+ c #142C68", "j5+ c #132D68", "k5+ c #112D6C", "l5+ c #132C6B", "m5+ c #172B67", "n5+ c #1C2B62", "o5+ c #172D65", "p5+ c #362857", "q5+ c #6F1D3C", "r5+ c #AE111F", "s5+ c #E0080C", "t5+ c #F60403", "u5+ c #F90402", "v5+ c #E0090B", "w5+ c #9D1525", "x5+ c #562144", "y5+ c #32255D", "z5+ c #1B2A68", "A5+ c #1D2B68", "B5+ c #1D2A69", "C5+ c #1D2B66", "D5+ c #1E2A65", "E5+ c #202966", "F5+ c #202B61", "G5+ c #2D295C", "H5+ c #422458", "I5+ c #4F2053", "J5+ c #3E244E", "K5+ c #2D2851", "L5+ c #202B5A", "M5+ c #172C64", "N5+ c #172A6A", "O5+ c #18296C", "P5+ c #18296D", "Q5+ c #182A6C", "R5+ c #172B6C", "S5+ c #182A6D", "T5+ c #19296E", "U5+ c #1A296D", "V5+ c #182B69", "W5+ c #182C68", "X5+ c #192A6A", "Y5+ c #192A6C", "Z5+ c #162B6A", "`5+ c #132C68", " 6+ c #152D65", ".6+ c #3D2753", "+6+ c #741D3C", "@6+ c #B61221", "#6+ c #DF0A10", "$6+ c #A6132B", "%6+ c #56204F", "&6+ c #172B69", "*6+ c #1D2B5F", "=6+ c #22295C", "-6+ c #222961", ";6+ c #1E2A67", ">6+ c #202968", ",6+ c #212868", "'6+ c #1B2A69", ")6+ c #1F2B65", "!6+ c #352959", "~6+ c #BF111B", "{6+ c #F60605", "]6+ c #F90601", "^6+ c #EB0808", "/6+ c #CF0C14", "(6+ c #AD1321", "_6+ c #8B2229", ":6+ c #6E2834", "<6+ c #572642", "[6+ c #48224E", "}6+ c #452254", "|6+ c #452256", "16+ c #442256", "26+ c #412355", "36+ c #382556", "46+ c #372557", "56+ c #3B2556", "66+ c #50293B", "76+ c #4A2A3D", "86+ c #38294F", "96+ c #252864", "06+ c #20286A", "a6+ c #162A6E", "b6+ c #142A6E", "c6+ c #2A2863", "d6+ c #731C41", "e6+ c #B21125", "f6+ c #DF0911", "g6+ c #FD0404", "h6+ c #F70A0B", "i6+ c #D1121C", "j6+ c #66203E", "k6+ c #2B2956", "l6+ c #20376B", "m6+ c #2C5889", "n6+ c #3DA7C6", "o6+ c #43D4E9", "p6+ c #40E0F4", "q6+ c #3CDDF2", "r6+ c #3FDAEE", "s6+ c #3FDBEF", "t6+ c #3DDDF0", "u6+ c #4CCBE0", "v6+ c #7795A6", "w6+ c #B24D54", "x6+ c #E60F0D", "y6+ c #F50302", "z6+ c #F3070A", "A6+ c #EF0B18", "B6+ c #CB3544", "C6+ c #947581", "D6+ c #5FB4BD", "E6+ c #43D6DF", "F6+ c #39E8F3", "G6+ c #39EBFA", "H6+ c #3BE4F6", "I6+ c #38D3E6", "J6+ c #36CBDE", "K6+ c #37CADC", "L6+ c #38CBDE", "M6+ c #39C8DE", "N6+ c #39D1E5", "O6+ c #37E1ED", "P6+ c #36EBF2", "Q6+ c #3AE2E9", "R6+ c #4FC9D5", "S6+ c #74A1B3", "T6+ c #A36C7F", "U6+ c #DA272E", "V6+ c #F40506", "W6+ c #F20508", "X6+ c #F80001", "Y6+ c #E31717", "Z6+ c #BB4446", "`6+ c #6BA7AF", " 7+ c #40DAE9", ".7+ c #37E4F7", "+7+ c #3CDDEB", "@7+ c #3CE0EE", "#7+ c #3CE1F2", "$7+ c #3EDAEF", "%7+ c #45C6DA", "&7+ c #3D95B6", "*7+ c #30588A", "=7+ c #2D2860", "-7+ c #4C2945", ";7+ c #88212A", ">7+ c #CB1012", ",7+ c #ED0809", "'7+ c #D90C13", ")7+ c #BB1021", "!7+ c #941530", "~7+ c #641E42", "{7+ c #46254F", "]7+ c #362957", "^7+ c #2C2B5C", "/7+ c #1B2C65", "(7+ c #122C60", "_7+ c #102C56", ":7+ c #122A51", "<7+ c #172963", "[7+ c #172A6B", "}7+ c #142B69", "|7+ c #112D64", "17+ c #122D64", "27+ c #1D2C5F", "37+ c #64203E", "47+ c #B9121E", "57+ c #EC080B", "67+ c #FC0203", "77+ c #F90206", "87+ c #F60607", "97+ c #D40D14", "07+ c #6E203B", "a7+ c #322957", "b7+ c #1F2A65", "c7+ c #1F296A", "d7+ c #1E2D5E", "e7+ c #1C286D", "f7+ c #161F8D", "g7+ c #0706DD", "h7+ c #090CCF", "i7+ c #0F12B8", "j7+ c #16199B", "k7+ c #1E2672", "l7+ c #1E2969", "m7+ c #1F2B62", "n7+ c #222A60", "o7+ c #222B5F", "p7+ c #202C5E", "q7+ c #1E2D5D", "r7+ c #1E2E5B", "s7+ c #1E2D5F", "t7+ c #1D2B67", "u7+ c #1B296F", "v7+ c #192773", "w7+ c #141F95", "x7+ c #0E12C9", "y7+ c #0807F5", "z7+ c #0303F5", "A7+ c #0B0ED4", "B7+ c #141E96", "C7+ c #1C2C61", "D7+ c #1E2B63", "E7+ c #1F2967", "F7+ c #1E2766", "G7+ c #1D2667", "H7+ c #1D2867", "I7+ c #1E2966", "J7+ c #212960", "K7+ c #212B5C", "L7+ c #1E2B61", "M7+ c #172679", "N7+ c #0D14B6", "O7+ c #0508E1", "P7+ c #0102F7", "Q7+ c #0301F3", "R7+ c #1416A5", "S7+ c #1B2182", "T7+ c #1D2671", "U7+ c #1E296A", "V7+ c #202A63", "W7+ c #212964", "X7+ c #1E2B66", "Y7+ c #192661", "Z7+ c #394470", "`7+ c #92A5B1", " 8+ c #9FC0D4", ".8+ c #709CDC", "+8+ c #305CDC", "@8+ c #101EE7", "#8+ c #0202F2", "$8+ c #0401F1", "%8+ c #1C1DE3", "&8+ c #3C41D3", "*8+ c #4F50C3", "=8+ c #311AB7", "-8+ c #2200B1", ";8+ c #2500AA", ">8+ c #1D01B9", ",8+ c #0205ED", "'8+ c #0203EF", ")8+ c #0002F6", "!8+ c #0003F6", "~8+ c #0703E3", "{8+ c #1402C5", "]8+ c #1F01AC", "^8+ c #1E01AE", "/8+ c #2200AF", "(8+ c #2200B0", "_8+ c #2100B3", ":8+ c #1E00B3", "<8+ c #2501AD", "[8+ c #37039D", "}8+ c #72056E", "|8+ c #C00532", "18+ c #FD0503", "28+ c #F80507", "38+ c #F70407", "48+ c #FA0304", "58+ c #F80205", "68+ c #EC060E", "78+ c #C4082D", "88+ c #4F0388", "98+ c #2701A8", "08+ c #1800B5", "a8+ c #1800B6", "b8+ c #2000B8", "c8+ c #2100B8", "d8+ c #2100B5", "e8+ c #2000AB", "f8+ c #15009E", "g8+ c #36299F", "h8+ c #766FA1", "i8+ c #BB938C", "j8+ c #E23839", "k8+ c #F6070A", "l8+ c #F30406", "m8+ c #DC0B12", "n8+ c #A91528", "o8+ c #692041", "p8+ c #322959", "q8+ c #222965", "r8+ c #1B296A", "s8+ c #19296B", "t8+ c #1E2967", "u8+ c #162C69", "v8+ c #232A5F", "w8+ c #472449", "x8+ c #7F1A2E", "y8+ c #D00C10", "z8+ c #FD0301", "A8+ c #FF0300", "B8+ c #E20809", "C8+ c #A9111E", "D8+ c #691C39", "E8+ c #392359", "F8+ c #1E2B64", "G8+ c #1E2B65", "H8+ c #1C296A", "I8+ c #1A2869", "J8+ c #182A61", "K8+ c #192B5F", "L8+ c #1B2B62", "M8+ c #1E2A66", "N8+ c #232767", "O8+ c #242767", "P8+ c #232766", "Q8+ c #1F2965", "R8+ c #212966", "S8+ c #1E2A64", "T8+ c #1B2B66", "U8+ c #1B2B65", "V8+ c #162D60", "W8+ c #45264C", "X8+ c #94182E", "Y8+ c #DE0B14", "Z8+ c #EF0708", "`8+ c #F10909", " 9+ c #BB1123", ".9+ c #641E49", "+9+ c #1A2968", "@9+ c #1C2A5E", "#9+ c #232862", "$9+ c #212866", "%9+ c #222768", "&9+ c #1E2B68", "*9+ c #34295A", "=9+ c #F50506", "-9+ c #E8080A", ";9+ c #CD0C16", ">9+ c #A31328", ",9+ c #731D39", "'9+ c #443145", ")9+ c #253750", "!9+ c #163259", "~9+ c #132A61", "{9+ c #192968", "]9+ c #192A69", "^9+ c #1A2A6B", "/9+ c #182A6A", "(9+ c #192D62", "_9+ c #263245", ":9+ c #2A3144", "<9+ c #272C57", "[9+ c #21266B", "}9+ c #1A2B68", "|9+ c #182C67", "19+ c #2A295D", "29+ c #691D40", "39+ c #A71225", "49+ c #D90A11", "59+ c #FF0403", "69+ c #F80B0A", "79+ c #D2151B", "89+ c #661F3C", "99+ c #2B2D59", "09+ c #1F4676", "a9+ c #2C6E9A", "b9+ c #3FB6D3", "c9+ c #46DCF1", "d9+ c #42E3F6", "e9+ c #3BDCF1", "f9+ c #3BDCED", "g9+ c #39DFF1", "h9+ c #3AE0F4", "i9+ c #43D3E9", "j9+ c #5BAAC2", "k9+ c #8D6C7E", "l9+ c #C92C34", "m9+ c #EE0B0D", "n9+ c #D72537", "o9+ c #A75F76", "p9+ c #6CA6BA", "q9+ c #3DDEEB", "r9+ c #39DFE8", "s9+ c #3ED7E5", "t9+ c #42CDE3", "u9+ c #44C0DC", "v9+ c #3BAECB", "w9+ c #36A4C2", "x9+ c #36A2C0", "y9+ c #37ADC7", "z9+ c #3AC1D3", "A9+ c #3BD4DF", "B9+ c #37DCE5", "C9+ c #3DDCEA", "D9+ c #52CEE3", "E9+ c #78A6BE", "F9+ c #BC4E57", "G9+ c #E5191B", "H9+ c #F70308", "I9+ c #DD2126", "J9+ c #828C96", "K9+ c #4CCADA", "L9+ c #3ADEF2", "M9+ c #3CDEEA", "N9+ c #3BDEEA", "O9+ c #3EDCF1", "P9+ c #4AE2ED", "Q9+ c #45B8CD", "R9+ c #38729A", "S9+ c #343266", "T9+ c #4E2B47", "U9+ c #87202A", "V9+ c #C91011", "W9+ c #F40406", "X9+ c #B81124", "Y9+ c #85183A", "Z9+ c #51204F", "`9+ c #262859", " 0+ c #132B61", ".0+ c #122B68", "+0+ c #1C2B69", "@0+ c #1C2B60", "#0+ c #1C2A55", "$0+ c #1C2950", "%0+ c #21275F", "&0+ c #1F2A67", "*0+ c #182C66", "=0+ c #1D2C60", "-0+ c #3D2750", ";0+ c #9B172D", ">0+ c #D90B14", ",0+ c #F50407", "'0+ c #F90506", ")0+ c #F70605", "!0+ c #DB0B0F", "~0+ c #811D37", "{0+ c #452653", "]0+ c #292862", "^0+ c #202866", "/0+ c #0202F5", "(0+ c #0707DF", "_0+ c #1015AE", ":0+ c #161E8F", "<0+ c #1D2771", "[0+ c #222C5C", "}0+ c #212B61", "|0+ c #1B2C63", "10+ c #182582", "20+ c #1319B8", "30+ c #0D0DE8", "40+ c #0506F1", "50+ c #0101F7", "60+ c #070AD7", "70+ c #101AA1", "80+ c #1A2870", "90+ c #202A66", "00+ c #222A5D", "a0+ c #222A5B", "b0+ c #14228A", "c0+ c #080ECE", "d0+ c #0001FE", "e0+ c #0606E1", "f0+ c #0E0FBD", "g0+ c #182380", "h0+ c #1E2C61", "i0+ c #202D5D", "j0+ c #1E2B69", "k0+ c #172364", "l0+ c #172162", "m0+ c #323C72", "n0+ c #929AB2", "o0+ c #B0CCD1", "p0+ c #92C8D6", "q0+ c #5998D4", "r0+ c #2238E0", "s0+ c #0607ED", "t0+ c #0C0FEC", "u0+ c #2329E7", "v0+ c #3536DA", "w0+ c #2812BB", "x0+ c #2400AC", "y0+ c #1C01BB", "z0+ c #0F04D4", "A0+ c #0306EB", "B0+ c #0405EB", "C0+ c #0304EC", "D0+ c #0203F0", "E0+ c #0602E7", "F0+ c #1301C8", "G0+ c #1A01B4", "H0+ c #2301AD", "I0+ c #36049D", "J0+ c #FD0201", "K0+ c #F0020B", "L0+ c #B70536", "M0+ c #7E0563", "N0+ c #4E038B", "O0+ c #2B00A7", "P0+ c #1B01B3", "Q0+ c #1A01B6", "R0+ c #1C02B7", "S0+ c #1F01B3", "T0+ c #2000AA", "U0+ c #16009B", "V0+ c #372CA1", "W0+ c #7676AC", "X0+ c #B7A1A0", "Y0+ c #DA5051", "Z0+ c #EF1A1E", "`0+ c #F90507", " a+ c #DD0A0D", ".a+ c #8C192E", "+a+ c #522349", "@a+ c #32285A", "#a+ c #242964", "$a+ c #202A61", "%a+ c #1F2A61", "&a+ c #202967", "*a+ c #212A63", "=a+ c #3B2754", "-a+ c #6D203C", ";a+ c #CC0D14", ">a+ c #FA0401", ",a+ c #E90508", "'a+ c #B60F1C", ")a+ c #781A37", "!a+ c #3E235A", "~a+ c #182B6C", "{a+ c #1D2A67", "]a+ c #222867", "^a+ c #212967", "/a+ c #202767", "(a+ c #202768", "_a+ c #1F2768", ":a+ c #1E2867", "b+ c #55CBDC", ",b+ c #BE5350", "'b+ c #E42020", ")b+ c #FA0104", "!b+ c #F80106", "~b+ c #FC0002", "{b+ c #E5181A", "]b+ c #9A6A71", "^b+ c #63A8B5", "/b+ c #45CDE0", "(b+ c #38DFF4", "_b+ c #3ADEEE", ":b+ c #3CDDEC", "c+ c #0203F1", ",c+ c #0601E7", "'c+ c #1901B5", ")c+ c #1A01B3", "!c+ c #2102AD", "~c+ c #35049D", "{c+ c #FB0404", "]c+ c #FE0301", "^c+ c #E90310", "/c+ c #9B054B", "(c+ c #5A047F", "_c+ c #3002A4", ":c+ c #1900B7", "d+ c #39E1F4", ",d+ c #3EDEF2", "'d+ c #55C3D6", ")d+ c #927279", "!d+ c #C43535", "~d+ c #E61110", "{d+ c #F60101", "]d+ c #F20405", "^d+ c #D72022", "/d+ c #877D88", "(d+ c #54BCC9", "_d+ c #3FD5E1", ":d+ c #3AD3E0", "e+ c #2E3D6C", ",e+ c #8595A7", "'e+ c #B8C9C8", ")e+ c #BFCFD3", "!e+ c #A2AED5", "~e+ c #575DDC", "{e+ c #2325E7", "]e+ c #0909F3", "^e+ c #0A06DE", "/e+ c #1409C6", "(e+ c #2209A5", "_e+ c #26079D", ":e+ c #2203A6", "f+ c #2D2861", ",f+ c #B91025", "'f+ c #E20911", ")f+ c #DA0912", "!f+ c #641941", "~f+ c #314B78", "{f+ c #358FAE", "]f+ c #48CBDA", "^f+ c #40D9EA", "/f+ c #3BDDF1", "(f+ c #3BDDF2", "_f+ c #39E1F5", ":f+ c #3FDCEE", "g+ c #181F82", ",g+ c #1D276C", "'g+ c #18247E", ")g+ c #1016A9", "!g+ c #0908D5", "~g+ c #100DC1", "{g+ c #171D90", "]g+ c #1D2C64", "^g+ c #1D2B5E", "/g+ c #1E2C66", "(g+ c #17255F", "_g+ c #16245A", ":g+ c #2E3C68", "h+ c #242865", ",h+ c #372759", "'h+ c #612243", ")h+ c #BF111C", "!h+ c #FF0301", "~h+ c #9E142E", "{h+ c #591F4C", "]h+ c #2B285E", "^h+ c #192B66", "/h+ c #242A5A", "(h+ c #242A59", "_h+ c #222A5A", ":h+ c #202B60", "i+ c #192B5E", ",i+ c #1C2A60", "'i+ c #1C286C", ")i+ c #161F8A", "!i+ c #0F13B3", "~i+ c #0506E5", "{i+ c #0E16B1", "]i+ c #18257E", "^i+ c #1B296E", "/i+ c #1E2C64", "(i+ c #1C2771", "_i+ c #161E8D", ":i+ c #0F13B2", "j+ c #6B1C41", ",j+ c #6D1C40", "'j+ c #7A1B3D", ")j+ c #861A3E", "!j+ c #911841", "~j+ c #9B1640", "{j+ c #A21631", "]j+ c #A91426", "^j+ c #AE1320", "/j+ c #B01320", "(j+ c #A51628", "_j+ c #B01425", ":j+ c #CB0E19", "k+ c #C30D1B", ",k+ c #E9060C", "'k+ c #601E48", ")k+ c #352657", "!k+ c #1C2A66", "~k+ c #1C2769", "{k+ c #191D81", "]k+ c #1211A6", "^k+ c #0E16B2", "/k+ c #18257D", "(k+ c #212A5E", "_k+ c #202B63", ":k+ c #1E266D", "l+ c #AC1124", ",l+ c #AC1126", "'l+ c #B80F24", ")l+ c #C50E25", "!l+ c #D00D26", "~l+ c #D80C24", "{l+ c #DC0B18", "]l+ c #E4090E", "^l+ c #EC0707", "/l+ c #E40A0F", "(l+ c #E50A0E", "_l+ c #EE0708", ":l+ c #CC0E14", "m+ c #0606DE", ",m+ c #0C0EC2", "'m+ c #151A97", ")m+ c #1A256D", "!m+ c #1A2A68", "~m+ c #16228C", "{m+ c #1016C3", "]m+ c #0A09F2", "^m+ c #0A04DF", "/m+ c #110DC1", "(m+ c #151A9E", "_m+ c #172583", ":m+ c #162386", "n+ c #751D36", ",n+ c #242B59", "'n+ c #C1101B", ")n+ c #E1080F", "!n+ c #A3132C", "~n+ c #30275F", "{n+ c #1F2A5B", "]n+ c #172B61", "^n+ c #2A2861", "/n+ c #691C41", "(n+ c #A71126", "_n+ c #D90913", ":n+ c #F50207", "o+ c #0202F0", ",o+ c #0603E7", "'o+ c #0B0AD8", ")o+ c #0F12C8", "!o+ c #1117BD", "~o+ c #0D13BF", "{o+ c #0B11C1", "]o+ c #0B11C2", "^o+ c #0B11C0", "/o+ c #0D11C6", "(o+ c #0C11C3", "_o+ c #0B12C1", ":o+ c #0910C0", "p+ c #B6605E", ",p+ c #809F9E", "'p+ c #4FB5C5", ")p+ c #339EBF", "!p+ c #276F9C", "~p+ c #254578", "{p+ c #26487A", "]p+ c #275182", "^p+ c #264B7F", "/p+ c #254A7E", "(p+ c #28628F", "_p+ c #2EBED3", ":p+ c #4CCDD4", "q+ c #F01919", ",q+ c #1D2869", "'q+ c #132B62", ")q+ c #33264F", "!q+ c #A81327", "~q+ c #E90810", "{q+ c #F9050A", "]q+ c #F60409", "^q+ c #9B1634", "/q+ c #45244E", "(q+ c #132C64", "_q+ c #112A6E", ":q+ c #2A2664", "r+ c #222A5F", ",r+ c #1A2778", "'r+ c #131E96", ")r+ c #0405E6", "!r+ c #0C0EC1", "~r+ c #1B2673", "{r+ c #1A2974", "]r+ c #121D9C", "^r+ c #080DD0", "/r+ c #0103F5", "(r+ c #0203FD", "_r+ c #0002FE", ":r+ c #0101FF", "s+ c #D82329", ",s+ c #E21F23", "'s+ c #AB6069", ")s+ c #72A0AD", "!s+ c #4EBBCD", "~s+ c #37A5C1", "{s+ c #2A749D", "]s+ c #254679", "^s+ c #275C8A", "/s+ c #2DBDD4", "(s+ c #4DCDD4", "_s+ c #7E999B", ":s+ c #B44E4F", "t+ c #F00509", ",t+ c #9B1633", "'t+ c #432446", ")t+ c #182A55", "!t+ c #152A61", "~t+ c #25295C", "{t+ c #4A214F", "]t+ c #80183A", "^t+ c #BA1022", "/t+ c #EB090C", "(t+ c #F2060A", "_t+ c #E20A12", ":t+ c #C90D19", "u+ c #1D286D", ",u+ c #1F2A5A", "'u+ c #1F2B5D", ")u+ c #131E97", "!u+ c #0404EA", "~u+ c #0C0DBF", "{u+ c #161891", "]u+ c #1B2671", "^u+ c #1E2869", "/u+ c #1A1E7B", "(u+ c #1213A4", "_u+ c #0808D4", ":u+ c #0204F1", "v+ c #601D46", ",v+ c #E1070D", "'v+ c #FC0101", ")v+ c #CB0E15", "!v+ c #1C2B61", "~v+ c #1B2B5E", "{v+ c #1D295C", "]v+ c #1E286B", "^v+ c #36275A", "/v+ c #E2060E", "(v+ c #32265E", "_v+ c #2A2A57", ":v+ c #302A53", "w+ c #0C0BC9", ",w+ c #0A09C8", "'w+ c #0B0AC7", ")w+ c #1313CA", "!w+ c #2E31D5", "~w+ c #3C41DC", "{w+ c #4046DF", "]w+ c #3E44E0", "^w+ c #3E43DF", "/w+ c #3F43DF", "(w+ c #3F43DE", "_w+ c #3E42DE", ":w+ c #3F44DF", "x+ c #9D5C69", ",x+ c #61A0B3", "'x+ c #53CFE1", ")x+ c #42BAD5", "!x+ c #307DA7", "~x+ c #244278", "{x+ c #264C7D", "]x+ c #25477A", "^x+ c #295281", "/x+ c #2F6C94", "(x+ c #3594B2", "_x+ c #32D0E6", ":x+ c #4CCBD9", "y+ c #1E00BB", ",y+ c #2401B4", "'y+ c #FD0302", ")y+ c #F70602", "!y+ c #99064C", "~y+ c #5E047D", "{y+ c #3402A0", "]y+ c #2000A9", "^y+ c #1D0095", "/y+ c #432D9C", "(y+ c #827CAD", "_y+ c #BDB4AE", ":y+ c #CC8378", "z+ c #575765", ",z+ c #871E28", "'z+ c #C8070E", ")z+ c #FE0205", "!z+ c #E5060C", "~z+ c #831B36", "{z+ c #422755", "]z+ c #242A64", "^z+ c #1B2A57", "/z+ c #1D2A59", "(z+ c #202863", "_z+ c #E5070B", ":z+ c #9D132E", "A+ c #E40711", ",A+ c #CD0D16", "'A+ c #741E38", ")A+ c #212862", "!A+ c #222861", "~A+ c #232860", "{A+ c #34275B", "]A+ c #A2132E", "^A+ c #362C5D", "/A+ c #213066", "(A+ c #1C2D68", "_A+ c #252A57", ":A+ c #292950", "B+ c #BDD2CD", ",B+ c #BED1CB", "'B+ c #BDD0CA", ")B+ c #C1D4C9", "!B+ c #BDCEC5", "~B+ c #A3AAB9", "{B+ c #553C97", "]B+ c #290693", "^B+ c #1D00A4", "/B+ c #2000B7", "(B+ c #2300AD", "_B+ c #1004CF", ":B+ c #0506E4", "C+ c #274F83", ",C+ c #274E80", "'C+ c #274F80", ")C+ c #275283", "!C+ c #32759C", "~C+ c #42AAC1", "{C+ c #4BD9E5", "]C+ c #38E8FA", "^C+ c #4CC9D9", "/C+ c #B8484A", "(C+ c #E2191D", "_C+ c #F90001", ":C+ c #CE2F31", "D+ c #6F1C42", ",D+ c #B01025", "'D+ c #E3070F", ")D+ c #C80F15", "!D+ c #C30F1C", "~D+ c #9F1926", "{D+ c #5D2840", "]D+ c #312C59", "^D+ c #1E2857", "/D+ c #212850", "(D+ c #262F5C", "_D+ c #213167", ":D+ c #1D2E6A", "E+ c #182662", ",E+ c #283669", "'E+ c #5F6C83", ")E+ c #BBCCD0", "!E+ c #B9CDCF", "~E+ c #594EA8", "{E+ c #2D149F", "]E+ c #1F01A7", "^E+ c #0803E8", "/E+ c #1302CD", "(E+ c #3102A1", "_E+ c #7775AD", ":E+ c #B3ACAC", "F+ c #3EDFF4", ",F+ c #3BD8EE", "'F+ c #37C0DA", ")F+ c #3C94B3", "!F+ c #554368", "~F+ c #8D1331", "{F+ c #CE020F", "]F+ c #4D2358", "^F+ c #292963", "/F+ c #202A58", "(F+ c #1D2A50", "_F+ c #1F276B", ":F+ c #1C286E", "G+ c #35597E", ",G+ c #3295B3", "'G+ c #41C8DC", ")G+ c #3ED7E8", "!G+ c #3BDEF2", "~G+ c #3ADCF1", "{G+ c #3BE0F6", "]G+ c #47D8F0", "^G+ c #6BB0C7", "/G+ c #C5404A", "(G+ c #F40809", "_G+ c #E71F21", ":G+ c #C24E53", "H+ c #1501CD", ",H+ c #2001B4", "'H+ c #5D057E", ")H+ c #3004A5", "!H+ c #1702BC", "~H+ c #2000A8", "{H+ c #B2ACAC", "]H+ c #C98178", "^H+ c #DE4B43", "/H+ c #F01E19", "(H+ c #E0070F", "_H+ c #152A6C", ":H+ c #152B6A", "I+ c #3ADDF2", ",I+ c #3EDDF1", "'I+ c #48E0F5", ")I+ c #41C4E0", "!I+ c #3591B7", "~I+ c #345985", "{I+ c #542F50", "]I+ c #8F1428", "^I+ c #D0060E", "/I+ c #8A193C", "(I+ c #4A2457", "_I+ c #282963", ":I+ c #1E2A6C", "J+ c #192965", ",J+ c #2E255E", "'J+ c #6C1B40", ")J+ c #F80308", "!J+ c #D00C19", "~J+ c #631B3F", "{J+ c #2C3968", "]J+ c #266491", "^J+ c #3494B7", "/J+ c #3DC5DC", "(J+ c #40DDEF", "_J+ c #3FE1F3", ":J+ c #3DDDEA", "K+ c #2106A7", ",K+ c #1C00B1", "'K+ c #2400B0", ")K+ c #1105CB", "!K+ c #0607DF", "~K+ c #0E04D5", "{K+ c #1805C1", "]K+ c #1900B3", "^K+ c #2201AF", "/K+ c #2302A9", "(K+ c #2303A2", "_K+ c #3929A1", ":K+ c #7474B0", "L+ c #49CCDD", ",L+ c #3BDEF5", "'L+ c #3BDEF3", ")L+ c #3DDCF1", "!L+ c #40DBF1", "~L+ c #48DDF2", "{L+ c #3EB7D3", "]L+ c #2B396C", "^L+ c #4F2451", "/L+ c #8C1533", "(L+ c #CE0816", "_L+ c #811C35", ":L+ c #402753", "M+ c #2C2955", ",M+ c #4C224D", "'M+ c #7F193B", ")M+ c #B90F24", "!M+ c #CC0D13", "~M+ c #731E36", "{M+ c #BC111E", "]M+ c #E3050D", "^M+ c #1D2A57", "/M+ c #182A5E", "(M+ c #1A2A65", "_M+ c #2F2662", ":M+ c #FC0209", "N+ c #6F7BDB", ",N+ c #6F74D2", "'N+ c #493BB7", ")N+ c #2E15AB", "!N+ c #2005AC", "~N+ c #1C03B5", "{N+ c #1406C3", "]N+ c #0A08D7", "^N+ c #0A07DB", "/N+ c #1408C3", "(N+ c #1D03B3", "_N+ c #2300AC", ":N+ c #2103A7", "O+ c #6A9EB2", ",O+ c #46D5E6", "'O+ c #41DFF2", ")O+ c #46D7EE", "!O+ c #3FDBF0", "~O+ c #3FDEF2", "{O+ c #45DBEF", "]O+ c #48CDE3", "^O+ c #40ADC5", "/O+ c #327FA1", "(O+ c #284F7D", "_O+ c #2D285B", ":O+ c #532041", "P+ c #7B1A3D", ",P+ c #C20E1B", "'P+ c #E90709", ")P+ c #F0060D", "!P+ c #EB0709", "~P+ c #CE0D19", "{P+ c #A01631", "]P+ c #5E214E", "^P+ c #33285C", "/P+ c #202C60", "(P+ c #192C61", "_P+ c #152A69", ":P+ c #13296E", "Q+ c #19257D", ",Q+ c #1D2B5B", "'Q+ c #080BD3", ")Q+ c #0407E9", "!Q+ c #0D15B8", "~Q+ c #162485", "{Q+ c #1E2A63", "]Q+ c #202960", "^Q+ c #15208D", "/Q+ c #0D14B8", "(Q+ c #0300F5", "_Q+ c #0704E2", ":Q+ c #0C0BC8", "R+ c #601E46", ",R+ c #32265C", "'R+ c #152B5F", ")R+ c #142C64", "!R+ c #2D285E", "~R+ c #7D1A3F", "{R+ c #BC0F25", "]R+ c #E30812", "^R+ c #791C39", "/R+ c #2A2E64", "(R+ c #2A3972", "_R+ c #2A5284", ":R+ c #337CA5", "S+ c #5D61D0", ",S+ c #544AB5", "'S+ c #412CA9", ")S+ c #2C11A9", "!S+ c #1C00AE", "~S+ c #0A02E1", "{S+ c #0303F9", "]S+ c #0C08DD", "^S+ c #1207CF", "/S+ c #1804C7", "(S+ c #1D01C2", "_S+ c #1C01BD", ":S+ c #1903BD", "T+ c #8B7B82", ",T+ c #99616B", "'T+ c #AC4952", ")T+ c #C23D3E", "!T+ c #D92926", "~T+ c #ED110E", "{T+ c #EC0807", "]T+ c #D81F1E", "^T+ c #AC5758", "/T+ c #779DA1", "(T+ c #4BD5DE", "_T+ c #44DAE9", ":T+ c #3EDBEB", "U+ c #C57478", ",U+ c #DA0A14", "'U+ c #5F1D49", ")U+ c #112A69", "!U+ c #202764", "~U+ c #19296A", "{U+ c #152A6B", "]U+ c #F80501", "^U+ c #9C1533", "/U+ c #49234E", "(U+ c #192B5C", "_U+ c #222762", ":U+ c #222666", "V+ c #283F76", ",V+ c #1D2464", "'V+ c #192361", ")V+ c #252A5E", "!V+ c #4F2344", "~V+ c #8E1728", "{V+ c #CF0A10", "]V+ c #E5060B", "^V+ c #811A35", "/V+ c #3F2652", "(V+ c #212666", "_V+ c #212564", ":V+ c #1D275D", "W+ c #18215E", ",W+ c #1A235E", "'W+ c #1A245D", ")W+ c #19245D", "!W+ c #19255D", "~W+ c #18235D", "{W+ c #161E5E", "]W+ c #151C5D", "^W+ c #171F59", "/W+ c #182258", "(W+ c #18235B", "_W+ c #18245F", ":W+ c #1B235D", "X+ c #5DBAC8", ",X+ c #818993", "'X+ c #AE5257", ")X+ c #D82121", "!X+ c #F30405", "~X+ c #EF0503", "{X+ c #F00709", "]X+ c #F10A0C", "^X+ c #EC1011", "/X+ c #E81415", "(X+ c #E61717", "_X+ c #E61819", ":X+ c #E4181B", "Y+ c #191E7C", ",Y+ c #090DA0", "'Y+ c #0000BF", ")Y+ c #0000D5", "!Y+ c #0000E4", "~Y+ c #0402EF", "{Y+ c #0706EC", "]Y+ c #0705F0", "^Y+ c #1111EA", "/Y+ c #363AE1", "(Y+ c #5459D2", "_Y+ c #5047B6", ":Y+ c #2F12A9", "Z+ c #943955", ",Z+ c #7D3A5A", "'Z+ c #8D3449", ")Z+ c #B4262C", "!Z+ c #E30A0D", "~Z+ c #F70002", "{Z+ c #D0101C", "]Z+ c #912C44", "^Z+ c #56456A", "/Z+ c #414578", "(Z+ c #374177", "_Z+ c #343F6E", ":Z+ c #373F67", "`+ c #3F4A7B", ",`+ c #3D457B", "'`+ c #3C4179", ")`+ c #3B4270", "!`+ c #3A416A", "~`+ c #393F67", "{`+ c #394069", "]`+ c #3D4875", "^`+ c #404C7B", "/`+ c #3F4F7B", "(`+ c #3E507B", "_`+ c #444D78", ":`+ c #584270", "<`+ c #882C4F", "[`+ c #C41322", "}`+ c #EC0406", "|`+ c #A72025", "1`+ c #73374A", "2`+ c #53476D", "3`+ c #414F84", "4`+ c #3F4E7D", "5`+ c #455073", "6`+ c #3B457F", "7`+ c #29309A", "8`+ c #151ABD", "9`+ c #090AE5", "0`+ c #060BE2", "a`+ c #1928AD", "b`+ c #32467D", "c`+ c #424D7C", "d`+ c #474F7D", "e`+ c #454D79", "f`+ c #3E4A75", "g`+ c #384470", "h`+ c #384570", "i`+ c #3C4A75", "j`+ c #40507B", "k`+ c #424F7A", "l`+ c #3F4E78", "m`+ c #3F4D78", "n`+ c #48527C", "o`+ c #454E80", "p`+ c #384289", "q`+ c #242DA0", "r`+ c #080BD8", "s`+ c #0107EE", "t`+ c #0D1CCD", "u`+ c #2136A6", "v`+ c #394689", "w`+ c #414A77", "x`+ c #3E4870", "y`+ c #394771", "z`+ c #3D4C78", "A`+ c #404F7A", "B`+ c #405079", "C`+ c #3C4878", "D`+ c #3C4779", "E`+ c #3F4B7A", "F`+ c #424D79", "G`+ c #46507B", "H`+ c #464E84", "I`+ c #363E9D", "J`+ c #2D32B6", "K`+ c #292CCA", "L`+ c #2526DC", "M`+ c #1718E9", "N`+ c #0D0EF1", "O`+ c #0607F5", "P`+ c #0201F8", "Q`+ c #0707EB", "R`+ c #0E0DEC", "S`+ c #1515ED", "T`+ c #191FE7", "U`+ c #323CE2", "V`+ c #555EDC", "W`+ c #6B70D0", "X`+ c #584EB5", "Y`+ c #402AA9", "Z`+ c #2C0FAB", "``+ c #2001B2", " @ c #1805BB", ". @ c #0F06DD", "+ @ c #0A04ED", "@ @ c #0204FA", "# @ c #0A07DC", "$ @ c #1D03B7", "% @ c #73086E", "& @ c #BE0D34", "* @ c #FB0E06", "= @ c #FB0903", "- @ c #F8040D", "; @ c #E40422", "> @ c #9E054E", ", @ c #61047A", "' @ c #35029E", ") @ c #1F00A8", "! @ c #3928A1", "~ @ c #7472B2", "{ @ c #B0A7B1", "] @ c #CB7F75", "^ @ c #DD4C40", "/ @ c #EA201B", "( @ c #F00406", "_ @ c #F20204", ": @ c #E4151B", "< @ c #AE6271", "[ @ c #8C8BA1", "} @ c #7E94AC", "| @ c #7C90A7", "1 @ c #7E92A6", "2 @ c #8193A8", "3 @ c #8393AB", "4 @ c #8492AD", "5 @ c #818EAE", "6 @ c #7F8BAC", "7 @ c #7D87A7", "8 @ c #7A7F9F", "9 @ c #6D6E92", "0 @ c #6E7192", "a @ c #77839D", "b @ c #8195A8", "c @ c #8094A6", "d @ c #7C97AC", "e @ c #7E94AD", "f @ c #907F96", "g @ c #C63D4A", "h @ c #E5151A", "i @ c #EE0203", "j @ c #D9232A", "k @ c #BF4453", "l @ c #97768C", "m @ c #818EAB", "n @ c #7C91B2", "o @ c #7F8CAF", "p @ c #8391AD", "q @ c #8592AB", "r @ c #8590A8", "s @ c #848CA6", "t @ c #808BAC", "u @ c #7E8CAC", "v @ c #808FA8", "w @ c #8491A4", "x @ c #8C90A6", "y @ c #A2889D", "z @ c #C07786", "A @ c #D95C65", "B @ c #DD3036", "C @ c #E41117", "D @ c #EE0308", "E @ c #F30304", "F @ c #EC0A0C", "G @ c #E21E20", "H @ c #DD3C3D", "I @ c #D85E60", "J @ c #CA7C82", "K @ c #A38DA1", "L @ c #998396", "M @ c #A9656C", "N @ c #C73D39", "O @ c #E41515", "P @ c #EA0001", "Q @ c #D31F28", "R @ c #B25B69", "S @ c #9290A3", "T @ c #858EB0", "U @ c #7682A5", "V @ c #697592", "W @ c #667086", "X @ c #7A829B", "Y @ c #858EA8", "Z @ c #8692AC", "` @ c #8494AD", " .@ c #8496AF", "..@ c #8091AC", "+.@ c #81809C", "@.@ c #936079", "#.@ c #D1222C", "$.@ c #EF0508", "%.@ c #E31217", "&.@ c #C6343F", "*.@ c #A75C6E", "=.@ c #8E8499", "-.@ c #8397AD", ";.@ c #8199AE", ">.@ c #8492AA", ",.@ c #808DAD", "'.@ c #8290AC", ").@ c #8492AC", "!.@ c #808DAE", "~.@ c #7F8DAD", "{.@ c #8290AB", "].@ c #8594A9", "^.@ c #8594AB", "/.@ c #8493AB", "(.@ c #8494AB", "_.@ c #8595AB", ":.@ c #8797B0", "<.@ c #7E8BA4", "[.@ c #6D778E", "}.@ c #60687D", "|.@ c #686C7F", "1.@ c #707C8F", "2.@ c #798B9E", "3.@ c #8A899B", "4.@ c #AB5A65", "5.@ c #CA2F34", "6.@ c #E31012", "7.@ c #F40202", "8.@ c #E80305", "9.@ c #D4171F", "0.@ c #AD646F", "a.@ c #948D9C", "b.@ c #8A94AA", "c.@ c #878FAA", "d.@ c #878FAB", "e.@ c #8694AF", "f.@ c #869DB6", "g.@ c #88AAC0", "h.@ c #90BECC", "i.@ c #86CDD8", "j.@ c #6ED5E1", "k.@ c #55DAEA", "l.@ c #46E0F1", "m.@ c #42E4F5", "n.@ c #3FEAFC", "o.@ c #45E1EF", "p.@ c #59CBD4", "q.@ c #77A9AC", "r.@ c #9F7A78", "s.@ c #BE4E4D", "t.@ c #D42A2C", "u.@ c #E31014", "v.@ c #F00405", "w.@ c #D92228", "x.@ c #B5515F", "y.@ c #937E8F", "z.@ c #75A6B4", "A.@ c #5BC6D3", "B.@ c #47DFEF", "C.@ c #40E8FA", "D.@ c #41E6F8", "E.@ c #45E1F2", "F.@ c #48E1F3", "G.@ c #60D8E9", "H.@ c #79CEDC", "I.@ c #83C8D6", "J.@ c #86B8C9", "K.@ c #85A4B9", "L.@ c #8293AB", "M.@ c #8294A9", "N.@ c #7992A7", "O.@ c #6F8B9F", "P.@ c #6C7B8E", "Q.@ c #7D5F69", "R.@ c #A23C41", "S.@ c #CE1A1D", "T.@ c #E61216", "U.@ c #BD4E60", "V.@ c #9E7991", "W.@ c #8C8EA7", "X.@ c #8294AF", "Y.@ c #7F8FAE", "Z.@ c #7E8BAE", "`.@ c #7E88AE", " +@ c #7C86AB", ".+@ c #7B85A0", "++@ c #758094", "@+@ c #70788C", "#+@ c #6E768E", "$+@ c #7984A4", "%+@ c #7F8BAF", "&+@ c #808CB0", "*+@ c #808CAD", "=+@ c #8390AC", "-+@ c #8295AD", ";+@ c #8097AF", ">+@ c #8493AA", ",+@ c #95849D", "'+@ c #B35C6F", ")+@ c #D62933", "!+@ c #F10305", "~+@ c #F40405", "{+@ c #EA0E11", "]+@ c #C43839", "^+@ c #A45F6A", "/+@ c #8C7D97", "(+@ c #7E90B5", "_+@ c #7E92AD", ":+@ c #8093A8", "<+@ c #8294A8", "[+@ c #8693A8", "}+@ c #7980AB", "|+@ c #575DBA", "1+@ c #3439CD", "2+@ c #2023E2", "3+@ c #1112ED", "4+@ c #151CE4", "5+@ c #3E53C6", "6+@ c #6B8AAC", "7+@ c #818FA9", "8+@ c #888FA8", "9+@ c #858EA5", "0+@ c #7A879D", "a+@ c #647188", "b+@ c #64738A", "c+@ c #73869D", "d+@ c #8399AF", "e+@ c #8597AD", "f+@ c #8495A9", "g+@ c #8194A7", "h+@ c #7F92A7", "i+@ c #7F8DAC", "j+@ c #7F90A9", "k+@ c #8195A7", "l+@ c #8897AC", "m+@ c #8691AE", "n+@ c #767FB0", "o+@ c #585DBB", "p+@ c #1C1DDC", "q+@ c #0D19E9", "r+@ c #2549D6", "s+@ c #4779BE", "t+@ c #6881A9", "u+@ c #737D97", "v+@ c #70798E", "w+@ c #6B7A8F", "x+@ c #798DA4", "y+@ c #8097AD", "z+@ c #8197AA", "A+@ c #8093A6", "B+@ c #8090A8", "C+@ c #8290AA", "D+@ c #8492AB", "E+@ c #7F8CAE", "F+@ c #818EAD", "G+@ c #8692AB", "H+@ c #8793AD", "I+@ c #7D88B8", "J+@ c #7983C3", "K+@ c #777FCD", "L+@ c #6D73D6", "M+@ c #4A4FDE", "N+@ c #3033E4", "O+@ c #1E20E9", "P+@ c #1011EE", "Q+@ c #0505F5", "R+@ c #0202FB", "S+@ c #0201FC", "T+@ c #0201FB", "U+@ c #0401F8", "V+@ c #0401F6", "W+@ c #0201F5", "X+@ c #0102EF", "Y+@ c #0303EE", "Z+@ c #0E0EE9", "`+@ c #1D1DE5", " @@ c #2E2FE2", ".@@ c #3F45E0", "+@@ c #4F64DB", "@@@ c #6D85D8", "#@@ c #8A9CD5", "$@@ c #9199D2", "%@@ c #5F60CC", "&@@ c #3A2FC2", "*@@ c #2710B7", "=@@ c #1E03B1", "-@@ c #1A03C4", ";@@ c #1603D3", ">@@ c #0D08E7", ",@@ c #0809F3", "'@@ c #0506F7", ")@@ c #0403F9", "!@@ c #0303FB", "~@@ c #1D04B7", "{@@ c #2500AD", "]@@ c #35029F", "^@@ c #660778", "/@@ c #A60E46", "(@@ c #D91120", "_@@ c #D40C20", ":@@ c #D30725", "<@@ c #D2042E", "[@@ c #C00340", "}@@ c #890461", "|@@ c #570482", "1@@ c #32039D", "2@@ c #392A9E", "3@@ c #7477AB", "4@@ c #AFB0AB", "5@@ c #C88A7E", "6@@ c #D85E55", "7@@ c #E13A39", "8@@ c #E52328", "9@@ c #E4252A", "0@@ c #E52023", "a@@ c #E51F22", "b@@ c #E13A3D", "c@@ c #D3979F", "d@@ c #C6CAD2", "e@@ c #BCD5D9", "f@@ c #B6CFCF", "g@@ c #B5CECE", "h@@ c #B7CED0", "i@@ c #B8C7D9", "j@@ c #B6C4D6", "k@@ c #B5C2CF", "l@@ c #A1A3B9", "m@@ c #A1A6BB", "n@@ c #B8D1D1", "o@@ c #B8D0D0", "p@@ c #B7D2D5", "q@@ c #B9CFD5", "r@@ c #C2B5BE", "s@@ c #D8686D", "t@@ c #E4393C", "u@@ c #E6272A", "v@@ c #E42528", "w@@ c #E52225", "x@@ c #DE2A2D", "y@@ c #D14043", "z@@ c #C4666A", "A@@ c #C0A7AD", "B@@ c #BCC6D2", "C@@ c #B8CADC", "D@@ c #B6C5D9", "E@@ c #BBCBD9", "F@@ c #B7C3D7", "G@@ c #BACCCD", "H@@ c #B8D1D8", "I@@ c #BBCDD8", "J@@ c #C25C63", "K@@ c #CD3239", "L@@ c #E11D23", "M@@ c #F31419", "N@@ c #F51013", "O@@ c #F40E0F", "P@@ c #F20E0D", "Q@@ c #F00F0C", "R@@ c #F00E0C", "S@@ c #F40C0E", "T@@ c #F50F10", "U@@ c #F21212", "V@@ c #EE1616", "W@@ c #E91D1F", "X@@ c #E12D31", "Y@@ c #D3494E", "Z@@ c #CA7075", "`@@ c #C59BA0", " #@ c #C1BFC4", ".#@ c #BAD3DD", "+#@ c #BEC2C7", "@#@ c #CC9691", "##@ c #DA6156", "$#@ c #E13837", "%#@ c #E42629", "&#@ c #E52427", "*#@ c #E02428", "=#@ c #D21017", "-#@ c #CA3B42", ";#@ c #C68B90", ">#@ c #C2D1D6", ",#@ c #BDCFE0", "'#@ c #AABACC", ")#@ c #95A4AF", "!#@ c #BDCFD8", "~#@ c #B0B9C8", "{#@ c #B393A3", "]#@ c #D44950", "^#@ c #E52526", "/#@ c #E72021", "(#@ c #E22728", "_#@ c #E21F20", ":#@ c #DC3031", "<#@ c #D35657", "[#@ c #C98889", "}#@ c #BFBBC0", "|#@ c #B7C5D7", "1#@ c #B7C5D8", "2#@ c #BACAD8", "3#@ c #BDCDD7", "4#@ c #B7C6D9", "5#@ c #B7C6D8", "6#@ c #9BA6AC", "7#@ c #879095", "8#@ c #89979C", "9#@ c #98ADB1", "0#@ c #ACC2C4", "a#@ c #CB8488", "b#@ c #D64F54", "c#@ c #E02C2E", "d#@ c #E71919", "e#@ c #E81B1A", "f#@ c #E31618", "g#@ c #DA171D", "h#@ c #D0353D", "i#@ c #C7999A", "j#@ c #C2CBCB", "k#@ c #ABCBD4", "l#@ c #8FD0D9", "m#@ c #71D6E2", "n#@ c #57E0EF", "o#@ c #4AE4F6", "p#@ c #46E5F8", "q#@ c #45EEFA", "r#@ c #4FE4EB", "s#@ c #6EBFBD", "t#@ c #8D918F", "u#@ c #AA6265", "v#@ c #C53941", "w#@ c #E81618", "x#@ c #EB0F13", "y#@ c #EB0E13", "z#@ c #EB0F14", "A#@ c #E91216", "B#@ c #E91416", "C#@ c #E91415", "D#@ c #E61615", "E#@ c #D62123", "F#@ c #C93237", "G#@ c #B1545E", "H#@ c #8198AD", "I#@ c #5EC8E2", "J#@ c #49E3FA", "K#@ c #40EFFF", "L#@ c #44E9FA", "M#@ c #5CDEEE", "N#@ c #7FD3E0", "O#@ c #A1CAD4", "P#@ c #BBD0D2", "Q#@ c #B0CACD", "R#@ c #A0BCC1", "S#@ c #95A6AB", "T#@ c #9A8386", "U#@ c #B15D5F", "V#@ c #D03B3D", "W#@ c #E72326", "X#@ c #E52529", "Y#@ c #E42125", "Z#@ c #E42124", "`#@ c #E13739", " $@ c #D78184", ".$@ c #CCB3B8", "+$@ c #C3CAD1", "@$@ c #BBCFDA", "#$@ c #B7C7DA", "$$@ c #B6C3DA", "%$@ c #B6C3D6", "&$@ c #A8B6B9", "*$@ c #9DABAD", "=$@ c #ADBACB", "-$@ c #B6C4DA", ";$@ c #B7C5DC", ">$@ c #BBCBD8", ",$@ c #BBD1DA", "'$@ c #B9D3DB", ")$@ c #BACFD6", "!$@ c #D39196", "~$@ c #DE5256", "{$@ c #E12123", "]$@ c #E02022", "^$@ c #E02023", "/$@ c #DE2F32", "($@ c #D65F60", "_$@ c #CB8C93", ":$@ c #BEB0BF", "<$@ c #B4C8DC", "[$@ c #BBCFD2", "}$@ c #BFCED3", "|$@ c #C5CFCE", "1$@ c #AFB7CF", "2$@ c #888FD5", "3$@ c #5F66DB", "4$@ c #4A4FDD", "5$@ c #383BE0", "6$@ c #292AE2", "7$@ c #1F20E4", "8$@ c #1715E4", "9$@ c #363FE2", "0$@ c #6C86DC", "a$@ c #A2C5D6", "b$@ c #BDC8CC", "c$@ c #8B979C", "d$@ c #A2B7BE", "e$@ c #BCD6DC", "f$@ c #BFD4D8", "g$@ c #BCD1D2", "h$@ c #B6C5D7", "i$@ c #B6CAD3", "j$@ c #B8CFD0", "k$@ c #BDD1D5", "l$@ c #AEB7D1", "m$@ c #8D91D2", "n$@ c #4549DD", "o$@ c #1E21E7", "p$@ c #1616EE", "q$@ c #1B19EF", "r$@ c #1A14E9", "s$@ c #2D3DE1", "t$@ c #507ED9", "u$@ c #77B5CF", "v$@ c #96B3C2", "w$@ c #99A3A8", "x$@ c #97A7AA", "y$@ c #ADC5CA", "z$@ c #B8D3D8", "A$@ c #B9D2D6", "B$@ c #B7CECF", "C$@ c #BCCFD1", "D$@ c #B7C5D9", "E$@ c #BAC9D8", "F$@ c #BAC7D6", "G$@ c #BBC8D5", "H$@ c #AEBDD3", "I$@ c #838ED3", "J$@ c #6269D6", "K$@ c #4B50DB", "L$@ c #373BE1", "M$@ c #1F21EA", "N$@ c #1214EE", "O$@ c #0D13EE", "P$@ c #0E15EE", "Q$@ c #1011EF", "R$@ c #110FEF", "S$@ c #110FF0", "T$@ c #110EF0", "U$@ c #1110EF", "V$@ c #0E15EA", "W$@ c #0D17E7", "X$@ c #1219E6", "Y$@ c #1D21E5", "Z$@ c #3135E1", "`$@ c #4649DD", " %@ c #5B60D9", ".%@ c #717DD5", "+%@ c #88A7D2", "@%@ c #A5C7D0", "#%@ c #BAD1D0", "$%@ c #B2BCD3", "%%@ c #666FDD", "&%@ c #3533D3", "*%@ c #2310BE", "=%@ c #2201AB", "-%@ c #2300B0", ";%@ c #2001BB", ">%@ c #170AD3", ",%@ c #100CE3", "'%@ c #0C09EB", ")%@ c #0805F0", "!%@ c #0402F4", "~%@ c #0905EF", "{%@ c #0403F4", "]%@ c #0201F6", "^%@ c #0D06D3", "/%@ c #1606C2", "(%@ c #2700AB", "_%@ c #38039D", ":%@ c #4E0789", "<%@ c #5F0978", "[%@ c #5E0877", "}%@ c #5D0779", "|%@ c #5D067C", "1%@ c #570483", "2%@ c #430294", "3%@ c #3201A2", "4%@ c #1E00A7", "5%@ c #170099", "6%@ c #39279C", "7%@ c #7574A9", "8%@ c #ADB6B3", "9%@ c #C0AEA7", "0%@ c #C89E9D", "a%@ c #CD9297", "b%@ c #CE8894", "c%@ c #CE8994", "d%@ c #CE888F", "e%@ c #CD898C", "f%@ c #CB9494", "g%@ c #C4B8BC", "h%@ c #C0CBD1", "i%@ c #B9CCCF", "j%@ c #B4CBCC", "k%@ c #B3CACD", "l%@ c #B8CDD0", "m%@ c #B8CED2", "n%@ c #BCC2C8", "o%@ c #C7A4A6", "p%@ c #CD9393", "q%@ c #CD8D8D", "r%@ c #CA8C8D", "s%@ c #CA8A8D", "t%@ c #B87D80", "u%@ c #A07074", "v%@ c #947679", "w%@ c #B0ACAD", "x%@ c #BEC8CB", "y%@ c #B8CED6", "z%@ c #B8B8BD", "A%@ c #A78E92", "B%@ c #AE787C", "C%@ c #C57076", "D%@ c #DD6971", "E%@ c #DD5459", "F%@ c #DD4645", "G%@ c #DF3F38", "H%@ c #E13B31", "I%@ c #DE3030", "J%@ c #DD3135", "K%@ c #DC3D40", "L%@ c #DC4D4E", "M%@ c #DA5A5D", "N%@ c #D8696C", "O%@ c #D3797C", "P%@ c #CD8A8D", "Q%@ c #C39BA1", "R%@ c #BDACB3", "S%@ c #BABBC3", "T%@ c #BEC8CC", "U%@ c #C6B9B8", "V%@ c #CDA5A1", "W%@ c #CD9494", "X%@ c #CE8E91", "Y%@ c #CE8D90", "Z%@ c #C5878A", "`%@ c #A5666A", " &@ c #A17479", ".&@ c #B0A2A8", "+&@ c #8F9FA6", "@&@ c #859298", "#&@ c #B8C3C9", "$&@ c #C7999B", "%&@ c #CC8E8B", "&&@ c #CA8F88", "*&@ c #C39086", "=&@ c #B78076", "-&@ c #AE7A73", ";&@ c #AA827F", ">&@ c #AA9698", ",&@ c #B7D0D7", "'&@ c #BBD0D7", ")&@ c #B9C8CB", "!&@ c #89959C", "~&@ c #96A8AD", "{&@ c #C5ADB6", "]&@ c #CB969F", "^&@ c #CF888D", "/&@ c #D18080", "(&@ c #D18181", "_&@ c #D07F80", ":&@ c #CC7F82", "<&@ c #C78C8F", "[&@ c #BBB5B6", "}&@ c #B6C9CC", "|&@ c #A8CBD4", "1&@ c #96CFD8", "2&@ c #72D6E2", "3&@ c #57DDEC", "4&@ c #46E4F4", "5&@ c #40E7FA", "6&@ c #46E9F9", "7&@ c #49E7F4", "8&@ c #57DAE0", "9&@ c #61CCD0", "0&@ c #6BBDC1", "a&@ c #78A8B1", "b&@ c #8F899A", "c&@ c #9F7384", "d&@ c #A96470", "e&@ c #B2575C", "f&@ c #C2393A", "g&@ c #C23839", "h&@ c #C73C40", "i&@ c #DC4550", "j&@ c #DA4F5A", "k&@ c #C35B60", "l&@ c #A46B6C", "m&@ c #87838A", "n&@ c #79979F", "o&@ c #73A7AE", "p&@ c #6EB7C0", "q&@ c #5BCFDF", "r&@ c #4DDEF3", "s&@ c #46E7FA", "t&@ c #43EAFB", "u&@ c #43E8FA", "v&@ c #44E7F2", "w&@ c #4DE4EC", "x&@ c #66DAE7", "y&@ c #82D2DF", "z&@ c #9DCCD5", "A&@ c #ABB0BC", "B&@ c #A19DAB", "C&@ c #98949D", "D&@ c #A49094", "E&@ c #BA8E8F", "F&@ c #CC8C90", "G&@ c #CB8A8E", "H&@ c #CB8A8C", "I&@ c #CA9392", "J&@ c #C6AEAE", "K&@ c #A8B8BB", "L&@ c #99AFB2", "M&@ c #94ADB2", "N&@ c #ABBEC8", "O&@ c #B5CDD6", "P&@ c #B7CED7", "Q&@ c #C3B5BE", "R&@ c #C99EA1", "S&@ c #CA8886", "T&@ c #B97E77", "U&@ c #B27872", "V&@ c #B47977", "W&@ c #B98386", "X&@ c #BEA1A4", "Y&@ c #BFB6BC", "Z&@ c #BDC2CC", "`&@ c #A7B4D0", " *@ c #9AA6D6", ".*@ c #8F9AD7", "+*@ c #8791D7", "@*@ c #828BD8", "#*@ c #7F87D9", "$*@ c #7B83D9", "%*@ c #8793D8", "&*@ c #9DAFD6", "**@ c #B2C8D4", "=*@ c #BFCCD1", "-*@ c #A0B1B6", ";*@ c #BBD2D6", ">*@ c #BACED0", ",*@ c #B5C2D3", "'*@ c #A9B6D3", ")*@ c #8EA1D6", "!*@ c #8092DA", "~*@ c #7C89DC", "{*@ c #7D85DC", "]*@ c #7B83DB", "^*@ c #8891D7", "/*@ c #9BA8D0", "(*@ c #A2A8B2", "_*@ c #9CA5AA", ":*@ c #9DAAAC", "<*@ c #AFC3C6", "[*@ c #B9CFD3", "}*@ c #BACDD0", "|*@ c #BBCDD0", "1*@ c #A5B8CF", "2*@ c #9CACD0", "3*@ c #95A2D3", "4*@ c #8B96D6", "5*@ c #7A7DD5", "6*@ c #6875D2", "7*@ c #5777D1", "8*@ c #4872D4", "9*@ c #3E4FDC", "0*@ c #3A3CE1", "a*@ c #393AE1", "b*@ c #3A3DE0", "c*@ c #3A3DE1", "d*@ c #3A3BE1", "e*@ c #3A3AE1", "f*@ c #3943E0", "g*@ c #3461DC", "h*@ c #4578D8", "i*@ c #6587D4", "j*@ c #8392D1", "k*@ c #8B99D2", "l*@ c #93A0D3", "m*@ c #9BA7D3", "n*@ c #A3AFD2", "o*@ c #A8BDD1", "p*@ c #B5CCD2", "q*@ c #B0B8CE", "r*@ c #6C65BA", "s*@ c #3D2AAF", "t*@ c #270CAC", "u*@ c #1F03BA", "v*@ c #1905C4", "w*@ c #1207D0", "x*@ c #0C08D9", "y*@ c #0B07DA", "z*@ c #0A07DA", "A*@ c #0B07D9", "B*@ c #0D08D9", "C*@ c #0D08D8", "D*@ c #0D05D8", "E*@ c #1303D1", "F*@ c #1801C8", "G*@ c #1803BE", "H*@ c #1B03B7", "I*@ c #2003AC", "J*@ c #2004A8", "K*@ c #2005A8", "L*@ c #2003A9", "M*@ c #3A269B", "N*@ c #7671A8", "O*@ c #ADB8B7", "P*@ c #BEC1C3", "Q*@ c #C2C1C8", "R*@ c #C3BFCB", "S*@ c #C2C0CC", "T*@ c #C0C1C9", "U*@ c #BEC2C6", "V*@ c #BBC4C6", "W*@ c #BDC3C4", "X*@ c #BAC3C5", "Y*@ c #A2ACAF", "Z*@ c #838B8F", "`*@ c #767D81", " =@ c #BAC7C8", ".=@ c #BBCCCF", "+=@ c #98A6A9", "@=@ c #9B9DA1", "#=@ c #B2A2A7", "$=@ c #C9A3AB", "%=@ c #C88E94", "&=@ c #CA7F80", "*=@ c #CE7772", "==@ c #D0726A", "-=@ c #CC6769", ";=@ c #CA696F", ">=@ c #C8767B", ",=@ c #C7878A", "'=@ c #C79599", ")=@ c #C5A3A7", "!=@ c #C3B2B5", "~=@ c #C1C7CA", "{=@ c #BEC5C8", "]=@ c #C0C6C9", "^=@ c #BFC5C9", "/=@ c #8E969A", "(=@ c #8C949A", "_=@ c #B8CDD1", ":=@ c #8B9CA2", "<=@ c #BBC5C5", "[=@ c #BDC6C4", "}=@ c #BAC9C2", "|=@ c #B3C7BC", "1=@ c #A4B5AC", "2=@ c #98A49F", "3=@ c #949B9B", "4=@ c #989FA3", "5=@ c #A7BCC4", "6=@ c #B3CAD2", "7=@ c #BEC3CE", "8=@ c #C1BEC8", "9=@ c #C1BBBD", "0=@ c #B1C6CC", "a=@ c #B2C6D0", "b=@ c #B1C8D2", "c=@ c #AACBD4", "d=@ c #8DCFD9", "e=@ c #73D5E1", "f=@ c #5EDCEB", "g=@ c #4FE3F3", "h=@ c #49E6F6", "i=@ c #45E7F7", "j=@ c #49E6F2", "k=@ c #4AE8F2", "l=@ c #4AE9F2", "m=@ c #4DE3EF", "n=@ c #5ECADF", "o=@ c #6BB6CD", "p=@ c #74A7B8", "q=@ c #7E99A3", "r=@ c #90797D", "s=@ c #91777B", "t=@ c #967C83", "u=@ c #AF8494", "v=@ c #AC8F9F", "w=@ c #71ADB3", "x=@ c #55C6D2", "y=@ c #48D9E6", "z=@ c #47E4F0", "A=@ c #4AE9F4", "B=@ c #46E9F7", "C=@ c #44E7F9", "D=@ c #43E7F9", "E=@ c #48E4F5", "F=@ c #4BE3F3", "G=@ c #52E1F0", "H=@ c #61DCEA", "I=@ c #85D1DE", "J=@ c #A0CAD5", "K=@ c #B0C8CF", "L=@ c #ACABB9", "M=@ c #A29BAC", "N=@ c #969EAA", "O=@ c #ADBABC", "P=@ c #BDC5C6", "Q=@ c #BCC4C9", "R=@ c #BCC3C8", "S=@ c #BCC3C6", "T=@ c #BAC5C5", "U=@ c #A4B4B9", "V=@ c #96ADB2", "W=@ c #A9BEC4", "X=@ c #B3C7D1", "Y=@ c #BCC6CB", "Z=@ c #B8C0BF", "`=@ c #A3AFAA", " -@ c #9AA6A1", ".-@ c #9CA7A5", "+-@ c #A5AEB2", "@-@ c #B3C2D2", "#-@ c #B1BFD1", "$-@ c #B2BFD1", "%-@ c #B2C0D2", "&-@ c #B3C1D1", "*-@ c #B3C5D1", "=-@ c #B2C0D1", "--@ c #B1C0D2", ";-@ c #B6C0D1", ">-@ c #BEBFCC", ",-@ c #C1BBC5", "'-@ c #B1B2BC", ")-@ c #B5CBCE", "!-@ c #B8CBCD", "~-@ c #ADB4CB", "{-@ c #9FB1C7", "]-@ c #8EB4C5", "^-@ c #7DAEC8", "/-@ c #7188D1", "(-@ c #6B74D6", "_-@ c #6A71D7", ":-@ c #6B75D6", "<-@ c #6C75D6", "[-@ c #6C72D6", "}-@ c #6C72D5", "|-@ c #6B7BD4", "1-@ c #6799D1", "2-@ c #7BB2CD", "3-@ c #9BC3CA", "4-@ c #B8CCC9", "5-@ c #B9CBCD", "6-@ c #ACB4CA", "7-@ c #6D5FA6", "8-@ c #40259B", "9-@ c #2909A2", "0-@ c #1904BD", "a-@ c #1307C6", "b-@ c #1407C6", "c-@ c #1407C4", "d-@ c #1406C5", "e-@ c #1307C5", "f-@ c #1706C1", "g-@ c #1C02BB", "h-@ c #2200B6", "i-@ c #1801B3", "j-@ c #1501B3", "k-@ c #1601B5", "l-@ c #1602B5", "m-@ c #1602B4", "n-@ c #1701B4", "o-@ c #1A00B5", "p-@ c #3B259B", "q-@ c #7870A8", "r-@ c #AEB7B8", "s-@ c #B3C3C3", "t-@ c #BFCBCF", "u-@ c #B7CFD3", "v-@ c #B7CDD1", "w-@ c #B5CED2", "x-@ c #B5D3D6", "y-@ c #9CB8BC", "z-@ c #7C9197", "A-@ c #6F7E85", "B-@ c #B8C8CB", "C-@ c #AEC5CA", "D-@ c #94A9AE", "E-@ c #93A5AA", "F-@ c #BBB6BB", "G-@ c #BCAEB2", "H-@ c #C0AAAB", "I-@ c #C2A6A7", "J-@ c #BEA1A6", "K-@ c #BCA3AA", "L-@ c #BAAAB1", "M-@ c #B9B3B9", "N-@ c #B9C6CB", "O-@ c #B4CCD2", "P-@ c #B6CDD3", "Q-@ c #AFC6CC", "R-@ c #8AA2A7", "S-@ c #889DA4", "T-@ c #B8CBCE", "U-@ c #A5B7BB", "V-@ c #8F9EA4", "W-@ c #B6D0D3", "X-@ c #B5D3D2", "Y-@ c #B0D0CD", "Z-@ c #A4C1BF", "`-@ c #99B0B2", " ;@ c #93A5A9", ".;@ c #A6B8BE", "+;@ c #A4CBD4", "@;@ c #95CDD8", "#;@ c #83D2DF", "$;@ c #6ED8E6", "%;@ c #55E2EE", "&;@ c #47E7F3", "*;@ c #42E7F7", "=;@ c #45E8F8", "-;@ c #44ECFA", ";;@ c #42EFFD", ">;@ c #42EEFD", ",;@ c #4AE3F7", "';@ c #4FDAEF", ");@ c #54D2E5", "!;@ c #58CCDA", "~;@ c #5FC2CE", "{;@ c #62BCC7", "];@ c #62BBC6", "^;@ c #65BDCA", "/;@ c #71C1D3", "(;@ c #70C6D8", "_;@ c #63CDDC", ":;@ c #52D5E2", "<;@ c #45E2F2", "[;@ c #3FEAFB", "};@ c #3FEFFE", "|;@ c #42F0FE", "1;@ c #42ECFB", "2;@ c #42E9FA", "3;@ c #42E7F9", "4;@ c #55DFED", "5;@ c #61DAEB", "6;@ c #6DD7EC", "7;@ c #7ED3EA", "8;@ c #A0CCDB", "9;@ c #9FA1AF", "0;@ c #97A4AF", "a;@ c #9DB2B9", "b;@ c #AAC3C8", "c;@ c #B7D0D4", "d;@ c #B6CDD1", "e;@ c #98AAB1", "f;@ c #98ACB4", "g;@ c #B1CCD0", "h;@ c #9FBABC", "i;@ c #95AEB0", "j;@ c #96ACB0", "k;@ c #9EB2B9", "l;@ c #ADC4CB", "m;@ c #B8CACC", "n;@ c #BBCECE", "o;@ c #BBCCCE", "p;@ c #BCD1CE", "q;@ c #BDD2CE", "r;@ c #BDD0CD", "s;@ c #BCCDCD", "t;@ c #BECBCE", "u;@ c #C0C7CC", "v;@ c #BEC1C8", "w;@ c #B2B7BF", "x;@ c #B8CCCD", "y;@ c #BDCFCD", "z;@ c #BDCECD", "A;@ c #B3C6C8", "B;@ c #ABC8C7", "C;@ c #A3C6C9", "D;@ c #9DB3CC", "E;@ c #9AA9CF", "F;@ c #99A8D1", "G;@ c #99AAD1", "H;@ c #9AA9D0", "I;@ c #9BA8CF", "J;@ c #9CA8CF", "K;@ c #9CACCD", "L;@ c #9BB9C9", "M;@ c #A4C6C7", "N;@ c #B3CFC8", "O;@ c #BFD4CA", "P;@ c #BFD3CB", "Q;@ c #BDD1CC", "R;@ c #A9B4C7", "S;@ c #6D5EA4", "T;@ c #412498", "U;@ c #2908A1", "V;@ c #1C04B8", "W;@ c #1C03B6", "X;@ c #1C04B5", "Y;@ c #1E03B3", "Z;@ c #3C269B", "`;@ c #7970A8", " >@ c #AEB6B9", ".>@ c #B1C1C3", "+>@ c #C3C6C9", "@>@ c #BCC8CC", "#>@ c #9FB3BA", "$>@ c #7F8F97", "%>@ c #A1B2B6", "&>@ c #B3C7CA", "*>@ c #B7CBD4", "=>@ c #B3CDD4", "->@ c #B3CDD5", ";>@ c #8D9BA3", ">>@ c #A5CAD4", ",>@ c #8FCDD8", "'>@ c #69D7DF", ")>@ c #55DEE7", "!>@ c #4FE1EE", "~>@ c #4EE3F4", "{>@ c #44E7F8", "]>@ c #43E9FA", "^>@ c #43EAFA", "/>@ c #42EBFC", "(>@ c #41EDFE", "_>@ c #41EDFF", ":>@ c #3FECFD", "<>@ c #3FECFC", "[>@ c #41EBFC", "}>@ c #45E8FA", "|>@ c #4AE4F4", "1>@ c #4CE3F4", "2>@ c #54E0F0", "3>@ c #6BD8E2", "4>@ c #7ED1E0", "5>@ c #8DCDE5", "6>@ c #9CCAE7", "7>@ c #B3C8D8", "8>@ c #B1C5CE", "9>@ c #A5B5BE", "0>@ c #BACACD", "a>@ c #BACECE", "b>@ c #BACDCF", "c>@ c #BECECD", "d>@ c #C0CECC", "e>@ c #C0C8C6", "f>@ c #BCCCCF", "g>@ c #A9B6C7", "h>@ c #6E64A8", "i>@ c #432A9D", "j>@ c #2A0BA4", "k>@ c #1C00A6", "l>@ c #3B259A", "m>@ c #7771A7", "n>@ c #ACB8B9", "o>@ c #B2C8D0", "p>@ c #BCC5CE", "q>@ c #B3C6C9", "r>@ c #89969F", "s>@ c #A6B5C0", "t>@ c #B2C9CF", "u>@ c #A7C6CD", "v>@ c #88BCC2", "w>@ c #7BBEC6", "x>@ c #79CAD6", "y>@ c #72D9E7", "z>@ c #52E2EF", "A>@ c #43E6F1", "B>@ c #43E7F1", "C>@ c #42E8F7", "D>@ c #3FE9FA", "E>@ c #3FE9F9", "F>@ c #40EAF9", "G>@ c #40EAFC", "H>@ c #41EBFD", "I>@ c #41EAFD", "J>@ c #3EEAFC", "K>@ c #3FE9FB", "L>@ c #40E8FB", "M>@ c #40E7F8", "N>@ c #42E7F4", "O>@ c #47E5F0", "P>@ c #57E1EF", "Q>@ c #64DDEC", "R>@ c #6FD8E7", "S>@ c #7ED3E0", "T>@ c #96CED6", "U>@ c #A5CAD3", "V>@ c #ADC9D4", "W>@ c #B1C8D6", "X>@ c #9AA7B1", "Y>@ c #B9CACD", "Z>@ c #C0CED1", "`>@ c #C0CACD", " ,@ c #ABB9C8", ".,@ c #7874AC", "+,@ c #4D3AA2", "@,@ c #2F13A7", "#,@ c #1C00A8", "$,@ c #17009A", "%,@ c #3B269A", "&,@ c #7671A7", "*,@ c #ABB9B9", "=,@ c #A7AFBA", "-,@ c #A6B5BF", ";,@ c #9AAEB2", ">,@ c #93ACB2", ",,@ c #95BBC3", "',@ c #92CDD8", "),@ c #72D9E2", "!,@ c #5FDFE6", "~,@ c #59E0E7", "{,@ c #54E0EE", "],@ c #52E1F3", "^,@ c #51E1F7", "/,@ c #50E1F8", "(,@ c #4CE2F5", "_,@ c #4AE3F3", ":,@ c #4BE3F4", "<,@ c #4AE3F4", "[,@ c #4CE2F3", "},@ c #50E1F2", "|,@ c #53E1F2", "1,@ c #52E1F2", "2,@ c #55E1F0", "3,@ c #5CE0EA", "4,@ c #64DBE2", "5,@ c #6DCFD9", "6,@ c #7BCAD6", "7,@ c #8DC9D6", "8,@ c #9FCAD6", "9,@ c #7F8D95", "0,@ c #BCCACF", "a,@ c #7D7BAB", "b,@ c #5242A3", "c,@ c #3117A8", "d,@ c #1D00B2", "e,@ c #1C00AC", "f,@ c #7672A7", "g,@ c #B2C6C9", "h,@ c #919BA6", "i,@ c #A0ABAE", "j,@ c #9BA7AA", "k,@ c #A1B3B7", "l,@ c #A6C3C9", "m,@ c #9BCCD2", "n,@ c #8DD2D8", "o,@ c #80D5DD", "p,@ c #76D5E0", "q,@ c #75D5E1", "r,@ c #74D5E8", "s,@ c #71D5F2", "t,@ c #6CD7F8", "u,@ c #62D9EE", "v,@ c #5DDBE9", "w,@ c #5CDBE8", "x,@ c #5BDCEA", "y,@ c #62DAE8", "z,@ c #6DD7E5", "A,@ c #76D5E3", "B,@ c #73D6E4", "C,@ c #7AD6E2", "D,@ c #86D4DB", "E,@ c #8ECBD0", "F,@ c #84B5BC", "G,@ c #8CB1BA", "H,@ c #A0BBC6", "I,@ c #B4C7D3", "J,@ c #BAC8CB", "K,@ c #8E9DA6", "L,@ c #7E8C94", "M,@ c #ABB3C4", "N,@ c #5343A3", "O,@ c #3218A9", "P,@ c #1C01B1", "Q,@ c #17009B", "R,@ c #3A269A", "S,@ c #ABB9B8", "T,@ c #B4C5C7", "U,@ c #93A1AB", "V,@ c #A1AEB2", "W,@ c #9CA7AA", "X,@ c #B9C2C6", "Y,@ c #A6CBD4", "Z,@ c #97CBD7", "`,@ c #98CBD4", " '@ c #99CBDC", ".'@ c #95CBE9", "+'@ c #8ECDF1", "@'@ c #81D1E4", "#'@ c #7AD3DD", "$'@ c #79D3DC", "%'@ c #77D3DE", "&'@ c #7FD1DC", "*'@ c #8DCED9", "='@ c #99CBD6", "-'@ c #9ECBD5", ";'@ c #AAC8CD", ">'@ c #BDC8D3", ",'@ c #818E96", "''@ c #939CA7", ")'@ c #ACB1C5", "!'@ c #7C7AB2", "~'@ c #5143AB", "{'@ c #3118AD", "]'@ c #1C01B0", "^'@ c #1D01AD", "/'@ c #1C01AC", "('@ c #39269A", "_'@ c #7371A6", ":'@ c #A8B8B7", "<'@ c #B3C5C6", "['@ c #B2CBD6", "}'@ c #B5CAD4", "|'@ c #8E9AA3", "1'@ c #85939A", "2'@ c #96A9AF", "3'@ c #99B1B6", "4'@ c #B0C8D1", "5'@ c #AFC9D6", "6'@ c #ADCAD9", "7'@ c #A8CAD4", "8'@ c #A6CBD1", "9'@ c #A5CCD1", "0'@ c #A5CCD2", "a'@ c #A3CBD2", "b'@ c #A4CBD3", "c'@ c #A9CAD4", "d'@ c #ACC9D5", "e'@ c #ACC9CE", "f'@ c #A7C5C2", "g'@ c #9FBAB3", "h'@ c #8E9DA2", "i'@ c #A7B2BC", "j'@ c #AABFC4", "k'@ c #909FA8", "l'@ c #919DA8", "m'@ c #A4B2BB", "n'@ c #BACACE", "o'@ c #BDCACF", "p'@ c #AFB9CF", "q'@ c #7A83D1", "r'@ c #4D4AC8", "s'@ c #2F1BBB", "t'@ c #1D00A8", "u'@ c #39259A", "v'@ c #706FA6", "w'@ c #B2C5C6", "x'@ c #A8B7BB", "y'@ c #B5C9D4", "z'@ c #A5B7BD", "A'@ c #A5B6BC", "B'@ c #92A7AE", "C'@ c #93ADB3", "D'@ c #BBC7CD", "E'@ c #AAC3C2", "F'@ c #9EB9B4", "G'@ c #8D9EA4", "H'@ c #BDCCD0", "I'@ c #B0BCD3", "J'@ c #7B84D1", "K'@ c #4D49C8", "L'@ c #2E1BBA", "M'@ c #1D00AF", "N'@ c #19009A", "O'@ c #39249A", "P'@ c #6F6EA7", "Q'@ c #A3B5B8", "R'@ c #95A7AE", "S'@ c #98ADB3", "T'@ c #B9C7CB", "U'@ c #BDC6CD", "V'@ c #BEC5CC", "W'@ c #A7B8BC", "X'@ c #B8C8CA", "Y'@ c #B0BBD0", "Z'@ c #7D7FBF", "`'@ c #4F45B5", " )@ c #2E19B1", ".)@ c #19009B", "+)@ c #706DA7", "@)@ c #696F75", "#)@ c #8F9FA4", "$)@ c #9BA7B3", "%)@ c #AFB7CB", "&)@ c #7E7CB2", "*)@ c #5043A8", "=)@ c #2E18AB", "-)@ c #1A00B2", ";)@ c #3A259A", ">)@ c #766EA7", ",)@ c #A4B0B5", "')@ c #686D6F", "))@ c #909DA0", "!)@ c #ACB2CA", "~)@ c #797ECE", "{)@ c #4D48C8", "])@ c #2E1BBB", "^)@ c #7972A8", "/)@ c #B6C5C7", "()@ c #93A1AA", "_)@ c #A7B5B8", ":)@ c #6A6F72", "<)@ c #686C6F", "[)@ c #A2B2BA", "})@ c #B9C9CC", "|)@ c #ACB4C8", "1)@ c #7A85CD", "2)@ c #4F4EC7", "3)@ c #301EBB", "4)@ c #1D00AD", "5)@ c #3C279B", "6)@ c #7975AA", "7)@ c #B0BDBD", "8)@ c #B5C6C9", "9)@ c #B9C3C6", "0)@ c #BBC1C7", "a)@ c #848990", "b)@ c #A9B9BC", "c)@ c #6C7478", "d)@ c #686E73", "e)@ c #8E989E", "f)@ c #AEC5CE", "g)@ c #A1B2BB", "h)@ c #9FA9B5", "i)@ c #B3BBC0", "j)@ c #A9AFB3", "k)@ c #9EA7AB", "l)@ c #99A8AD", "m)@ c #AABEC6", "n)@ c #B3CAD1", "o)@ c #BBC9CD", "p)@ c #838DB6", "q)@ c #5855AF", "r)@ c #3421AF", "s)@ c #3B279B", "t)@ c #7876AB", "u)@ c #AEBFBE", "v)@ c #B4C7C9", "w)@ c #969DA8", "x)@ c #B1C8D0", "y)@ c #959B9C", "z)@ c #ADC6CF", "A)@ c #A3B4BD", "B)@ c #919DA7", "C)@ c #AFB0B2", "D)@ c #A2A8AA", "E)@ c #9AA9AC", "F)@ c #A8BFC6", "G)@ c #645C98", "H)@ c #3A24A4", "I)@ c #7872A9", "J)@ c #B5C4C7", "K)@ c #B7C1C4", "L)@ c #B5C0C3", "M)@ c #B5C8CA", "N)@ c #B5C7C4", "O)@ c #B6C8C1", "P)@ c #ACBBBC", "Q)@ c #959D94", "R)@ c #878979", "S)@ c #9AA198", "T)@ c #A9B4B1", "U)@ c #A1B0BB", "V)@ c #97ACB5", "W)@ c #97AFB5", "X)@ c #ABBFC5", "Y)@ c #87959D", "Z)@ c #A2A8AB", "`)@ c #9AA8AA", " !@ c #A9BABE", ".!@ c #B1C5CB", "+!@ c #B1BECB", "@!@ c #9B9BAD", "#!@ c #7161A3", "$!@ c #4127A9", "%!@ c #1B00B2", "&!@ c #7870A7", "*!@ c #B6C7C8", "=!@ c #ACBDBD", "-!@ c #99A397", ";!@ c #8A8E78", ">!@ c #929684", ",!@ c #9EA59C", "'!@ c #ABB6B5", ")!@ c #AFB9C6", "!!@ c #B1BCC8", "~!@ c #94AAB3", "{!@ c #8FAAB0", "]!@ c #A8BEC3", "^!@ c #919CA5", "/!@ c #AAB7C1", "(!@ c #86949B", "_!@ c #B5BBBF", ":!@ c #ACB0B3", "~@ c #3C259A", ",~@ c #796FA7", "'~@ c #B8C5CA", ")~@ c #7F8887", "!~@ c #828F8F", "~~@ c #9DADB1", "{~@ c #B5C7D2", "]~@ c #B4C7D2", "^~@ c #B6CBCF", "/~@ c #A7BAC0", "(~@ c #92A1A9", "_~@ c #A3B5BD", ":~@ c #CCD7DB", "<~@ c #D1D8DC", "[~@ c #B3C9CE", "}~@ c #B3CBD1", "|~@ c #9EB8BE", "1~@ c #B0CCD2", "2~@ c #A3A9C4", "3~@ c #7A72BE", "4~@ c #442FB6", "5~@ c #1A00B0", "6~@ c #AFCAD2", "7~@ c #A1B2BA", "8~@ c #8B8A8E", "9~@ c #8F9398", "0~@ c #B9C2CE", "a~@ c #A1B4BD", "b~@ c #D1DDDE", "c~@ c #D8DFDF", "d~@ c #C5D0D7", "e~@ c #A9BFC3", "f~@ c #A2ABB0", "g~@ c #B6C6D3", "h~@ c #B7CBCD", "i~@ c #A7B4CD", "j~@ c #7E7CC5", "k~@ c #4734B9", "l~@ c #1B00B0", "m~@ c #7875AA", "n~@ c #AEBEBE", "o~@ c #7C8088", "p~@ c #A3ABAC", "q~@ c #949496", "r~@ c #95A4AD", "s~@ c #A7B8C0", "t~@ c #A2B2BD", "u~@ c #C1D1D6", "v~@ c #C1D1D3", "w~@ c #B1C8CD", "x~@ c #A9BEC3", "y~@ c #B5C8D3", "z~@ c #B3C7D2", "A~@ c #B8C3C7", "B~@ c #A8B1B2", "C~@ c #919594", "D~@ c #888080", "E~@ c #B18993", "F~@ c #C39DA7", "G~@ c #BEB4B7", "H~@ c #B4C8C6", "I~@ c #B6CFD3", "J~@ c #B9D3D8", "K~@ c #BAD4D7", "L~@ c #BAD3D4", "M~@ c #B8CFD5", "N~@ c #8183B9", "O~@ c #4838B4", "P~@ c #7875AB", "Q~@ c #A5ADAF", "R~@ c #989C9F", "S~@ c #9BA1A6", "T~@ c #79878B", "U~@ c #747F83", "V~@ c #A6B9C2", "W~@ c #B5AEAE", "X~@ c #AC9190", "Y~@ c #A07174", "Z~@ c #9F5962", "`~@ c #C05A6C", " {@ c #C8697A", ".{@ c #BC8089", "+{@ c #AF989B", "@{@ c #B8A7B0", "#{@ c #BBABB4", "${@ c #B9A7AE", "%{@ c #B7A6AA", "&{@ c #BCB1B6", "*{@ c #BBBBC2", "={@ c #ACBEBE", "-{@ c #8386B6", ";{@ c #4939B3", ">{@ c #AFBBBC", ",{@ c #B6C6C9", "'{@ c #AFB8C1", "){@ c #ACC2CA", "!{@ c #868E98", "~{@ c #AEB7BA", "{{@ c #A5AAAC", "]{@ c #9AA2A7", "^{@ c #7A8F8A", "/{@ c #6F837D", "({@ c #859495", "_{@ c #8E9BA6", ":{@ c #A4BAC4", "<{@ c #91A1A6", "[{@ c #B6BBC2", "}{@ c #B1908F", "|{@ c #B26365", "1{@ c #B93D4B", "2{@ c #C2263F", "3{@ c #CC2945", "4{@ c #C7314A", "5{@ c #B93D51", "6{@ c #B04D5C", "7{@ c #BF6273", "8{@ c #C16274", "9{@ c #B95769", "0{@ c #B45664", "a{@ c #C1787F", "b{@ c #C49BA0", "c{@ c #BCB9BE", "d{@ c #B3CCD1", "e{@ c #8385BC", "f{@ c #4939B5", "g{@ c #786FA7", "h{@ c #AFB7B9", "i{@ c #AAC3CC", "j{@ c #8D9EA6", "k{@ c #ABB0B1", "l{@ c #A1A3A4", "m{@ c #7F988F", "n{@ c #6E867B", "o{@ c #7B8B89", "p{@ c #8D9AA5", "q{@ c #A3BBC4", "r{@ c #B0CAD1", "s{@ c #B7CDD7", "t{@ c #B7B7C1", "u{@ c #AC7172", "v{@ c #B6363F", "w{@ c #CE112A", "x{@ c #E00024", "y{@ c #D70428", "z{@ c #C90627", "A{@ c #BD0725", "B{@ c #B90C28", "C{@ c #CA213C", "D{@ c #C91D39", "E{@ c #BE0E2B", "F{@ c #B70E28", "G{@ c #C83E48", "H{@ c #CA777A", "I{@ c #C0AAAD", "J{@ c #ACBACB", "K{@ c #8383C2", "L{@ c #4938B8", "M{@ c #1A00AF", "N{@ c #AFB7BA", "O{@ c #B5C6C7", "P{@ c #919EA3", "Q{@ c #8F9CA0", "R{@ c #A8BAC0", "S{@ c #ADB9BC", "T{@ c #A0A4A4", "U{@ c #999996", "V{@ c #A9B2AA", "W{@ c #B3C2BC", "X{@ c #B5C8C8", "Y{@ c #8F9F9F", "Z{@ c #7A8987", "`{@ c #788486", " ]@ c #859095", ".]@ c #A1B4B8", "+]@ c #A5B9C0", "@]@ c #A9C0C4", "#]@ c #A35E64", "$]@ c #AE2432", "%]@ c #C90924", "&]@ c #E20026", "*]@ c #DF0127", "=]@ c #DB0328", "-]@ c #D70429", ";]@ c #D4072A", ">]@ c #D60D2F", ",]@ c #D40A2D", "']@ c #D00528", ")]@ c #CD0827", "!]@ c #D0222E", "~]@ c #CA595B", "{]@ c #C09B9B", "]]@ c #B6CED0", "^]@ c #939DA9", "/]@ c #8F9AA4", "(]@ c #8282C3", "_]@ c #4837B7", ":]@ c #B0B7BA", "<]@ c #949EA3", "[]@ c #919DA1", "}]@ c #AAB7B9", "|]@ c #999E9A", "1]@ c #919288", "2]@ c #A9B2A5", "3]@ c #B6C5BC", "4]@ c #9DA8AE", "5]@ c #7B8488", "6]@ c #7D898D", "7]@ c #9EB2B6", "8]@ c #A9BDC2", "9]@ c #92A2A8", "0]@ c #ACA9AC", "a]@ c #9A4F5A", "b]@ c #A3192D", "c]@ c #BF0724", "d]@ c #DC052A", "e]@ c #E1022A", "f]@ c #E4022A", "g]@ c #E5042C", "h]@ c #E3062C", "i]@ c #DE042A", "j]@ c #DD0229", "k]@ c #DC0229", "l]@ c #DB0629", "m]@ c #D30E23", "n]@ c #CA434B", "o]@ c #C28E8F", "p]@ c #8685BE", "q]@ c #4D3BB3", "r]@ c #B6C4C7", "s]@ c #737F85", "t]@ c #BDCBCE", "u]@ c #BFCDCE", "v]@ c #C0CDCE", "w]@ c #BFCDCF", "x]@ c #BCCDD1", "y]@ c #A3B4B8", "z]@ c #979D94", "A]@ c #8C8E7E", "B]@ c #A2ABA0", "C]@ c #B1BEBB", "D]@ c #B6C1CD", "E]@ c #7F888D", "F]@ c #9CABB7", "G]@ c #A8B9BF", "H]@ c #B2B8BB", "I]@ c #A99396", "J]@ c #96404F", "K]@ c #9D132C", "L]@ c #B80826", "M]@ c #D50A2D", "N]@ c #E0042B", "O]@ c #E5012A", "P]@ c #E6022B", "Q]@ c #E5032B", "R]@ c #E20129", "S]@ c #E10028", "T]@ c #E20028", "U]@ c #DF0329", "V]@ c #D30220", "W]@ c #CA3446", "X]@ c #C58289", "Y]@ c #C0C6C5", "Z]@ c #A4B6BE", "`]@ c #8D8BB7", " ^@ c #5543AF", ".^@ c #2504AC", "+^@ c #898E96", "@^@ c #A5ADB6", "#^@ c #6F797E", "$^@ c #A8B1B3", "%^@ c #A9B2B3", "&^@ c #909D9F", "*^@ c #8B9B9C", "=^@ c #9FB2B5", "-^@ c #B7CDD6", ";^@ c #ABBBB9", ">^@ c #969E8F", ",^@ c #898D77", "'^@ c #9CA49F", ")^@ c #7E898D", "!^@ c #A2B4B8", "~^@ c #A3B0BD", "{^@ c #98A5B3", "]^@ c #96A3AE", "^^@ c #B4CED2", "/^@ c #B3A0A4", "(^@ c #AE7278", "_^@ c #9E3141", ":^@ c #A41029", "<^@ c #BA0928", "[^@ c #D20C2E", "}^@ c #DE052C", "|^@ c #E2012A", "1^@ c #E3012A", "2^@ c #E2022A", "3^@ c #E3022A", "4^@ c #E00229", "5^@ c #D40021", "6^@ c #CA2A46", "7^@ c #C47785", "8^@ c #C0BCBF", "9^@ c #BDC4CA", "0^@ c #A2B5BD", "a^@ c #B6C0BF", "b^@ c #9291B3", "c^@ c #5B49AC", "d^@ c #290AAB", "e^@ c #1F02AF", "f^@ c #ADB9B9", "g^@ c #C3D4DA", "h^@ c #7A8287", "i^@ c #687176", "j^@ c #5D656A", "k^@ c #5B5C61", "l^@ c #575559", "m^@ c #545456", "n^@ c #575B5C", "o^@ c #676E74", "p^@ c #B0BFC1", "q^@ c #BCCFD3", "r^@ c #7E9B93", "s^@ c #75968E", "t^@ c #91AFAE", "u^@ c #ADC3CC", "v^@ c #858891", "w^@ c #84828C", "x^@ c #A9B6B4", "y^@ c #959C8D", "z^@ c #8A8E7A", "A^@ c #A3A8A8", "B^@ c #7E898C", "C^@ c #A2B3B7", "D^@ c #9BA2AE", "E^@ c #B0D0D3", "F^@ c #B7B1B8", "G^@ c #C37A87", "H^@ c #CB4052", "I^@ c #C51D29", "J^@ c #C80C1B", "K^@ c #D30521", "L^@ c #DE052D", "M^@ c #E2032B", "N^@ c #DF032A", "O^@ c #DB052A", "P^@ c #DE062B", "Q^@ c #E2062C", "R^@ c #E3052B", "S^@ c #DD0020", "T^@ c #CD2343", "U^@ c #BA6A81", "V^@ c #AFAEBC", "W^@ c #C0C7CA", "X^@ c #9397B8", "Y^@ c #5646AC", "Z^@ c #2102A6", "`^@ c #6D767B", " /@ c #939FA3", "./@ c #67696C", "+/@ c #505153", "@/@ c #3E4143", "#/@ c #323538", "$/@ c #2F2C32", "%/@ c #2A252A", "&/@ c #262226", "*/@ c #565A63", "=/@ c #8A959A", "-/@ c #A9BFC6", ";/@ c #A9C0C7", ">/@ c #A6BBC2", ",/@ c #BAB4B4", "'/@ c #B7A8A2", ")/@ c #88857A", "!/@ c #808176", "~/@ c #95938C", "{/@ c #AFA7A4", "]/@ c #ACA4A0", "^/@ c #B3A9A7", "//@ c #BEB0B1", "(/@ c #BCAAAF", "_/@ c #907D85", ":/@ c #898187", "(@ c #9B5967", ",(@ c #991A2F", "'(@ c #C20F25", ")(@ c #DA0A24", "!(@ c #E10526", "~(@ c #DD032A", "{(@ c #DD042A", "](@ c #DE052A", "^(@ c #E40020", "/(@ c #D51E3D", "((@ c #BA5F74", "_(@ c #A6A4AB", ":(@ c #C0D1CB", "<(@ c #999BBF", "[(@ c #5645AE", "}(@ c #1B00A2", "|(@ c #B2C4C7", "1(@ c #8F9D9D", "2(@ c #5B6360", "3(@ c #2F332E", "4(@ c #30352F", "5(@ c #2D302D", "6(@ c #242426", "7(@ c #1D1A1E", "8(@ c #1E1A18", "9(@ c #201C16", "0(@ c #201D18", "a(@ c #221F1C", "b(@ c #242223", "c(@ c #242124", "d(@ c #231E23", "e(@ c #231D23", "f(@ c #26232C", "g(@ c #22212D", "h(@ c #201F2B", "i(@ c #2B2A34", "j(@ c #77787A", "k(@ c #8B8987", "l(@ c #908A86", "m(@ c #7F7578", "n(@ c #82625A", "o(@ c #93533A", "p(@ c #A64A29", "q(@ c #AB4E46", "r(@ c #A84F4B", "s(@ c #A04F3C", "t(@ c #994E2B", "u(@ c #964F2C", "v(@ c #A75436", "w(@ c #BE5A45", "x(@ c #C05C50", "y(@ c #824D47", "z(@ c #796861", "A(@ c #989E91", "B(@ c #BCCDBF", "C(@ c #B8CBCA", "D(@ c #959E90", "E(@ c #8C907C", "F(@ c #ACB6B6", "G(@ c #A3B4B9", "H(@ c #829097", "I(@ c #9EADB1", "J(@ c #A7BEC4", "K(@ c #AFCCD5", "L(@ c #AEC8CD", "M(@ c #BAC2CC", "N(@ c #9C989C", "O(@ c #76555E", "P(@ c #671C2B", "Q(@ c #A0142D", "R(@ c #C60F30", "S(@ c #D6092D", "T(@ c #DB062A", "U(@ c #E1032A", "V(@ c #DB0429", "W(@ c #E40022", "X(@ c #DA1B38", "Y(@ c #C35665", "Z(@ c #AF9898", "`(@ c #B1B8C1", " _@ c #B4C8D3", "._@ c #C2D0CE", "+_@ c #9A9AC2", "@_@ c #5745B0", "#_@ c #1D00A9", "$_@ c #7572A7", "%_@ c #97B1AA", "&_@ c #6E857B", "*_@ c #444F4B", "=_@ c #252425", "-_@ c #25231F", ";_@ c #23231F", ">_@ c #1F1F20", ",_@ c #1C1C20", "'_@ c #1E1B18", ")_@ c #211D18", "!_@ c #23201E", "~_@ c #221F1D", "{_@ c #211C1C", "]_@ c #211B1E", "^_@ c #252229", "/_@ c #20222A", "(_@ c #1F232A", "__@ c #6D493D", ":_@ c #9F6248", "<_@ c #BE714D", "[_@ c #CD7653", "}_@ c #CA6C5C", "|_@ c #C15E4F", "1_@ c #B35237", "2_@ c #A24C29", "3_@ c #885747", "4_@ c #785A50", "5_@ c #6F5749", "6_@ c #6D5742", "7_@ c #6E664F", "8_@ c #746E59", "9_@ c #7C705D", "0_@ c #81715F", "a_@ c #776C5A", "b_@ c #868370", "c_@ c #A3A997", "d_@ c #BCCBBC", "e_@ c #B8CBC9", "f_@ c #959E8F", "g_@ c #8B907A", "h_@ c #ACB5B5", "i_@ c #9CA6AA", "j_@ c #7F8B90", "k_@ c #C2D1D8", "l_@ c #95A2AC", "m_@ c #8D9CA3", "n_@ c #A5B4BF", "o_@ c #9BA8B4", "p_@ c #9EAFB6", "q_@ c #A7BFC8", "r_@ c #B5C8CB", "s_@ c #B3C2C4", "t_@ c #BFD2D6", "u_@ c #B8CCCF", "v_@ c #575055", "w_@ c #442128", "x_@ c #6D202F", "y_@ c #9B1C33", "z_@ c #C31131", "A_@ c #E0082D", "B_@ c #E4072D", "C_@ c #E4062C", "D_@ c #E2052B", "E_@ c #E0032A", "F_@ c #DB0529", "G_@ c #E30025", "H_@ c #DF1130", "I_@ c #D23C4B", "J_@ c #C37575", "K_@ c #B9ADB3", "L_@ c #9598C8", "M_@ c #5444B2", "N_@ c #1D00A2", "O_@ c #B4C4C7", "P_@ c #7E958D", "Q_@ c #52655B", "R_@ c #333A36", "S_@ c #211D1F", "T_@ c #201D1B", "U_@ c #1F1F1D", "V_@ c #1D2021", "W_@ c #1D2124", "X_@ c #212220", "Y_@ c #242321", "Z_@ c #252324", "`_@ c #252227", " :@ c #262027", ".:@ c #251E24", "+:@ c #231D22", "@:@ c #221E22", "#:@ c #222124", "$:@ c #272226", "%:@ c #352429", "&:@ c #512B2C", "*:@ c #86432E", "=:@ c #B2572F", "-:@ c #CE6330", ";:@ c #D86636", ">:@ c #C75C48", ",:@ c #B5554A", "':@ c #A35341", "):@ c #8D573C", "!:@ c #6D6351", "~:@ c #636C5F", "{:@ c #6A7367", "]:@ c #767A6E", "^:@ c #78897B", "/:@ c #769083", "(:@ c #759185", "_:@ c #789185", "::@ c #859282", "<:@ c #98A190", "[:@ c #ABB7A9", "}:@ c #B9C9C1", "|:@ c #B8C9CA", "1:@ c #ABBBBA", "2:@ c #969F93", "3:@ c #8D9180", "4:@ c #ACB6B7", "5:@ c #A1ABAD", "6:@ c #899094", "7:@ c #7E868B", "8:@ c #BBC8CC", "9:@ c #96A4B1", "0:@ c #AAC0C8", "a:@ c #B7B9BC", "b:@ c #AD9FA8", "c:@ c #A88B9A", "d:@ c #B797A2", "e:@ c #C39FA9", "f:@ c #C4A0A9", "g:@ c #BA99A3", "h:@ c #9F8793", "i:@ c #726670", "j:@ c #2C2426", "k:@ c #46272E", "l:@ c #6F2532", "m:@ c #991C31", "n:@ c #BE132F", "o:@ c #D30D2E", "p:@ c #DE082C", "q:@ c #E3042A", "r:@ c #DA052A", "s:@ c #E00027", "t:@ c #DF0B2C", "u:@ c #D72A3E", "v:@ c #CB5D63", "w:@ c #BAA7AE", "x:@ c #B0D3D8", "y:@ c #B2CBD0", "z:@ c #B2C9CE", "A:@ c #969ACA", "B:@ c #5545B4", "C:@ c #1D00A3", "D:@ c #7770A7", "E:@ c #C1CCD2", "F:@ c #6B7673", "G:@ c #3D4440", "H:@ c #282925", "I:@ c #211C1B", "J:@ c #1E1D1D", "K:@ c #1C1F20", "L:@ c #1C2023", "M:@ c #1D2226", "N:@ c #25292B", "O:@ c #272A2B", "P:@ c #272629", "Q:@ c #26222A", "R:@ c #2B233A", "S:@ c #2C243A", "T:@ c #29242F", "U:@ c #242224", "V:@ c #1D211E", "W:@ c #312022", "X:@ c #582229", "Y:@ c #822A30", "Z:@ c #9A432D", "`:@ c #B0532B", " <@ c #BE5A2B", ".<@ c #B9592F", "+<@ c #8F4D3F", "@<@ c #7A4D4C", "#<@ c #775955", "$<@ c #76685D", "%<@ c #617162", "&<@ c #6A8172", "*<@ c #869589", "=<@ c #A2A69D", "-<@ c #A3ACA2", ";<@ c #9EAFA7", "><@ c #99B1AD", ",<@ c #98B1B1", "'<@ c #A1B4AF", ")<@ c #AABBB5", "!<@ c #B1C2C0", "~<@ c #B6C8CA", "{<@ c #B8CED4", "]<@ c #ACBBBD", "^<@ c #99A09A", "/<@ c #919389", "(<@ c #ADB7BA", "_<@ c #B6C4C6", ":<@ c #A2ABAD", "<<@ c #ABB2B5", "[<@ c #B3BBBE", "}<@ c #B1BCBE", "|<@ c #A0AEB8", "1<@ c #C1D2D3", "2<@ c #BCADB2", "3<@ c #B2707E", "4<@ c #AC3D55", "5<@ c #BD455B", "6<@ c #C94C62", "7<@ c #CA4C63", "8<@ c #C0495F", "9<@ c #A54257", "0<@ c #753747", "a<@ c #422C34", "b<@ c #202527", "c<@ c #30282C", "d<@ c #482A30", "e<@ c #642831", "f<@ c #852331", "g<@ c #AE162E", "h<@ c #CC0C2B", "i<@ c #DE0529", "j<@ c #E60129", "k<@ c #DC0128", "l<@ c #DC092B", "m<@ c #D5213A", "n<@ c #CA4E5D", "o<@ c #B69DA9", "p<@ c #ADC7CF", "q<@ c #ACD0D6", "r<@ c #AFCBCE", "s<@ c #AEC9CD", "t<@ c #B0C7CD", "u<@ c #A6AFBA", "v<@ c #C3D4D5", "w<@ c #9B9FCA", "x<@ c #5747B4", "y<@ c #3C269A", "z<@ c #BDC8CB", "A<@ c #5B5B5E", "B<@ c #2E2B2D", "C<@ c #211F1B", "D<@ c #1F2122", "E<@ c #1D2025", "F<@ c #202327", "G<@ c #292F34", "H<@ c #2C3134", "I<@ c #2C2C2F", "J<@ c #2A2631", "K<@ c #2E274E", "L<@ c #312C53", "M<@ c #323044", "N<@ c #2E302F", "O<@ c #1B241E", "P<@ c #3C1F1F", "Q<@ c #7C232D", "R<@ c #B33039", "S<@ c #AC4834", "T<@ c #A7522F", "U<@ c #A1502E", "V<@ c #904B34", "W<@ c #5C4A45", "X<@ c #4E585E", "Y<@ c #5D6F76", "Z<@ c #708386", "`<@ c #68847A", " [@ c #7F9688", ".[@ c #A8B2A8", "+[@ c #CCCAC5", "@[@ c #CAC8C0", "#[@ c #C5C6C3", "$[@ c #9BA09F", "%[@ c #959491", "&[@ c #AFB7BD", "*[@ c #A6B3B5", "=[@ c #91999A", "-[@ c #78797B", ";[@ c #676366", ">[@ c #6C6F75", ",[@ c #6A7078", "'[@ c #636A72", ")[@ c #979999", "![@ c #9BA2A2", "~[@ c #A1A8AC", "{[@ c #A9AEB7", "][@ c #AFB6C1", "^[@ c #8B96A1", "/[@ c #A1ACAE", "([@ c #ABB8BA", "_[@ c #C3D7D7", ":[@ c #C1A3A9", "<[@ c #BA4D5C", "[[@ c #B7011B", "}[@ c #C50020", "|[@ c #D00326", "1[@ c #D30326", "2[@ c #CA0526", "3[@ c #B50927", "4[@ c #871227", "5[@ c #501D28", "6[@ c #26262A", "7[@ c #29272B", "8[@ c #2D2C2E", "9[@ c #343031", "0[@ c #4D2E32", "a[@ c #871E2E", "b[@ c #B7102B", "c[@ c #D60729", "d[@ c #E60228", "e[@ c #E50229", "f[@ c #DD052A", "g[@ c #DA0328", "h[@ c #D8082B", "i[@ c #D31A38", "j[@ c #C93E56", "k[@ c #B78496", "l[@ c #AEADB9", "m[@ c #B2C0C3", "n[@ c #A3ADB1", "o[@ c #92979E", "p[@ c #8C919A", "q[@ c #C6D6D3", "r[@ c #9EA1C7", "s[@ c #5849B1", "t[@ c #1C00A1", "u[@ c #8F979C", "v[@ c #262426", "w[@ c #1C1B1D", "x[@ c #222326", "y[@ c #232226", "z[@ c #222125", "A[@ c #232327", "B[@ c #2D2E34", "C[@ c #36353A", "D[@ c #393344", "E[@ c #242659", "F[@ c #2B3166", "G[@ c #414864", "H[@ c #4C5353", "I[@ c #212D26", "J[@ c #432422", "K[@ c #933438", "L[@ c #D84A4D", "M[@ c #C0563B", "N[@ c #A34B2D", "O[@ c #8B392C", "P[@ c #7B373B", "Q[@ c #786864", "R[@ c #84908D", "S[@ c #95A9AA", "T[@ c #91A198", "U[@ c #98A59A", "V[@ c #AEB9B4", "W[@ c #C3CBCE", "X[@ c #C1CACB", "Y[@ c #ABB7B9", "Z[@ c #9B9F9D", "`[@ c #949490", " }@ c #A9B3B8", ".}@ c #92989B", "+}@ c #6F7876", "@}@ c #565C59", "#}@ c #464847", "$}@ c #3E3C3E", "%}@ c #3D3C40", "&}@ c #3B3C41", "*}@ c #38393F", "=}@ c #37373C", "-}@ c #3A363A", ";}@ c #3D3839", ">}@ c #423F3D", ",}@ c #4C4A47", "'}@ c #605E5D", ")}@ c #726E70", "!}@ c #817E83", "~}@ c #929499", "{}@ c #B2C7CD", "]}@ c #98A4A7", "^}@ c #A1ACAD", "/}@ c #C2D4D6", "(}@ c #C5A8AA", "_}@ c #C65A60", ":}@ c #C81221", "<}@ c #D00522", "[}@ c #D90126", "}}@ c #DD0128", "|}@ c #CE092A", "1}@ c #A8132C", "2}@ c #742030", "3}@ c #462A32", "4}@ c #332A33", "5}@ c #252B34", "6}@ c #222D34", "7}@ c #342A33", "8}@ c #731D2F", "9}@ c #A8112C", "0}@ c #CC092A", "a}@ c #E10529", "b}@ c #E40328", "c}@ c #E20329", "d}@ c #DD0529", "e}@ c #DA0529", "f}@ c #D80A2D", "g}@ c #D31B3B", "h}@ c #C6445D", "i}@ c #C06676", "j}@ c #C08187", "k}@ c #C29797", "l}@ c #C3ABAD", "m}@ c #BCC4C8", "n}@ c #94989B", "o}@ c #8C979C", "p}@ c #C3D2CF", "q}@ c #9C9CC0", "r}@ c #5747A9", "s}@ c #1B009A", "t}@ c #8A989C", "u}@ c #7A878C", "v}@ c #848B92", "w}@ c #4B4C4F", "x}@ c #29292B", "y}@ c #1D1E21", "z}@ c #1D2125", "A}@ c #212226", "B}@ c #252428", "C}@ c #2C2A30", "D}@ c #2F2D34", "E}@ c #3D3840", "F}@ c #3F394A", "G}@ c #2E305D", "H}@ c #343B69", "I}@ c #474F68", "J}@ c #505658", "K}@ c #28302E", "L}@ c #422728", "M}@ c #85373A", "N}@ c #BE4C4B", "O}@ c #A9503A", "P}@ c #8A412E", "Q}@ c #713230", "R}@ c #6A3A48", "S}@ c #8D8685", "T}@ c #A8B8B2", "U}@ c #B5CAC9", "V}@ c #A1AAA7", "W}@ c #9FA8A4", "X}@ c #9B9E9D", "Y}@ c #68686B", "Z}@ c #454844", "`}@ c #31342F", " |@ c #282928", ".|@ c #262428", "+|@ c #222226", "@|@ c #232227", "#|@ c #242225", "$|@ c #211D1E", "%|@ c #1E1917", "&|@ c #1E1A15", "*|@ c #25221C", "=|@ c #3C3735", "-|@ c #4E4747", ";|@ c #5A5557", ">|@ c #848C8E", ",|@ c #9DABAC", "'|@ c #B0C1C2", ")|@ c #BACDCE", "!|@ c #A1B1B5", "~|@ c #99A4A8", "{|@ c #BDD4D7", "]|@ c #C4AAAD", "^|@ c #CB6167", "/|@ c #D21A2A", "(|@ c #D90927", "_|@ c #E2042B", ":|@ c #E1082C", "<|@ c #DC092D", "[|@ c #C4102F", "}|@ c #9D1B32", "||@ c #722535", "1|@ c #4C2736", "2|@ c #2C2735", "3|@ c #3D2433", "4|@ c #751B2F", "5|@ c #A6122C", "6|@ c #CA092B", "7|@ c #E0042A", "8|@ c #E40329", "9|@ c #E20328", "0|@ c #DF0429", "a|@ c #DA0428", "b|@ c #D9092C", "c|@ c #D41A39", "d|@ c #D23048", "e|@ c #D14958", "f|@ c #D1616A", "g|@ c #CE727F", "h|@ c #CA8B96", "i|@ c #C3A7AC", "j|@ c #B6B7BA", "k|@ c #949A9A", "l|@ c #8C999C", "m|@ c #C2D0CD", "n|@ c #9B9ABC", "o|@ c #5645A4", "p|@ c #1A0095", "q|@ c #A8B9BA", "r|@ c #849894", "s|@ c #718782", "t|@ c #9DB2B5", "u|@ c #535458", "v|@ c #343337", "w|@ c #222428", "x|@ c #1C2024", "y|@ c #1D1F23", "z|@ c #25262A", "A|@ c #2F2E34", "B|@ c #36343B", "C|@ c #302E35", "D|@ c #36333B", "E|@ c #3D3A46", "F|@ c #403F59", "G|@ c #44455E", "H|@ c #474957", "I|@ c #444548", "J|@ c #2E2E33", "K|@ c #3D2930", "L|@ c #613237", "M|@ c #803D3E", "N|@ c #763E35", "O|@ c #633630", "P|@ c #563437", "Q|@ c #5B4A54", "R|@ c #939A9C", "S|@ c #B4C9C8", "T|@ c #BBD3D4", "U|@ c #9BA5A8", "V|@ c #99A3A6", "W|@ c #A7B6BA", "X|@ c #9C9F9E", "Y|@ c #899295", "Z|@ c #545458", "`|@ c #3D3B3D", " 1@ c #2C2B27", ".1@ c #23221E", "+1@ c #1F1E1E", "@1@ c #1D1C22", "#1@ c #1B1C21", "$1@ c #1C1D21", "%1@ c #201F23", "&1@ c #221F22", "*1@ c #1E1B19", "=1@ c #1B1712", "-1@ c #1A1610", ";1@ c #1E1C16", ">1@ c #2F2C28", ",1@ c #383433", "'1@ c #3B3739", ")1@ c #3F3D40", "!1@ c #4E5252", "~1@ c #717C78", "{1@ c #9EACA5", "]1@ c #BFD0C9", "^1@ c #97A4A9", "/1@ c #AEC3CB", "(1@ c #B8D6D9", "_1@ c #C0ADB2", ":1@ c #C96570", "<1@ c #D31F35", "[1@ c #DE0B2C", "}1@ c #E1042A", "|1@ c #E1042B", "11@ c #D8082D", "21@ c #C21130", "31@ c #A11A33", "41@ c #701F34", "51@ c #532235", "61@ c #4D2134", "71@ c #5D1E32", "81@ c #88182F", "91@ c #B0102C", "01@ c #CF082A", "a1@ c #E40229", "b1@ c #E20229", "c1@ c #E10329", "d1@ c #DF042A", "e1@ c #DB0428", "f1@ c #DC072B", "g1@ c #DE1031", "h1@ c #DE1C39", "i1@ c #DB2942", "j1@ c #D22E48", "k1@ c #CC4D62", "l1@ c #C97D87", "m1@ c #C2A9AB", "n1@ c #B2B8BC", "o1@ c #A3A9A9", "p1@ c #939B9C", "q1@ c #A6B5B8", "r1@ c #C3D0CD", "s1@ c #9A9ABC", "t1@ c #1A0094", "u1@ c #776FA7", "v1@ c #AEB6BA", "w1@ c #A8B9B9", "x1@ c #839A8F", "y1@ c #6F897A", "z1@ c #9CB3B3", "A1@ c #98A7AA", "B1@ c #7B8687", "C1@ c #292B2F", "D1@ c #1A1E22", "E1@ c #181D21", "F1@ c #22262B", "G1@ c #303238", "H1@ c #3A3A41", "I1@ c #33323A", "J1@ c #2E2E34", "K1@ c #2F2F35", "L1@ c #36353B", "M1@ c #4C484E", "N1@ c #444145", "O1@ c #332D37", "P1@ c #372B36", "Q1@ c #3F2E36", "R1@ c #453134", "S1@ c #442E30", "T1@ c #3E2C30", "U1@ c #3C3639", "V1@ c #4E5558", "W1@ c #8E9FA3", "X1@ c #B1C8CC", "Y1@ c #ACBCBD", "Z1@ c #9BA09D", "`1@ c #93938D", " 2@ c #AEB6BB", ".2@ c #9AA6A8", "+2@ c #80898B", "@2@ c #5F6163", "#2@ c #2B292C", "$2@ c #1E1C1F", "%2@ c #211D1B", "&2@ c #211E1B", "*2@ c #1F1D1E", "=2@ c #1D1D22", "-2@ c #1C1E23", ";2@ c #1E2125", ">2@ c #262325", ",2@ c #24211F", "'2@ c #221F1B", ")2@ c #221F1A", "!2@ c #25221E", "~2@ c #2E2D29", "{2@ c #2E2C2C", "]2@ c #272528", "^2@ c #232225", "/2@ c #282A2A", "(2@ c #4F564F", "_2@ c #879487", ":2@ c #B6C7BA", "<2@ c #B8CAC9", "[2@ c #AEC2CA", "}2@ c #AFC4CD", "|2@ c #B1CDD5", "12@ c #B4D5DA", "22@ c #BAB2BA", "32@ c #C37483", "42@ c #CD354D", "52@ c #DC1736", "62@ c #E0092C", "72@ c #DE0429", "82@ c #DB042A", "92@ c #E4032B", "02@ c #DD082D", "a2@ c #C90E2F", "b2@ c #9C1430", "c2@ c #821831", "d2@ c #7D1932", "e2@ c #891831", "f2@ c #A5142E", "g2@ c #C10E2B", "h2@ c #D6072A", "i2@ c #E4012A", "j2@ c #E00128", "k2@ c #E40028", "l2@ c #E50028", "m2@ c #E20128", "n2@ c #D20021", "o2@ c #CC213C", "p2@ c #CB626F", "q2@ c #C79FA3", "r2@ c #B5B4BA", "s2@ c #86959C", "t2@ c #AFBCC0", "u2@ c #929C9E", "v2@ c #8C989B", "w2@ c #C2CFCF", "x2@ c #9A9ABF", "y2@ c #5746A8", "z2@ c #1D0099", "A2@ c #392499", "B2@ c #726DA7", "C2@ c #ACBAB9", "D2@ c #919D8E", "E2@ c #838F79", "F2@ c #A3B3B1", "G2@ c #A9BDC0", "H2@ c #879F9A", "I2@ c #677E75", "J2@ c #5E6969", "K2@ c #2D3036", "L2@ c #181C20", "M2@ c #191E22", "N2@ c #1E2227", "O2@ c #27272C", "P2@ c #312F34", "Q2@ c #3F3E42", "R2@ c #363539", "S2@ c #2E2D2F", "T2@ c #302C30", "U2@ c #39373B", "V2@ c #464A50", "W2@ c #34323A", "X2@ c #332F38", "Y2@ c #474349", "Z2@ c #393337", "`2@ c #2D2729", " 3@ c #2C292B", ".3@ c #404345", "+3@ c #828789", "@3@ c #BECED1", "#3@ c #979E93", "$3@ c #8D9080", "%3@ c #ABB5B4", "&3@ c #3F4144", "*3@ c #353539", "=3@ c #2D2C30", "-3@ c #262529", ";3@ c #232125", ">3@ c #252225", ",3@ c #252122", "'3@ c #221F1E", ")3@ c #1F1C1C", "!3@ c #1F1C1E", "~3@ c #211C1F", "{3@ c #231D1F", "]3@ c #231E20", "^3@ c #221E20", "/3@ c #252022", "(3@ c #2F292A", "_3@ c #2A2729", ":3@ c #2C2B2F", "<3@ c #5D6162", "[3@ c #73847A", "}3@ c #8BA696", "|3@ c #A9BFBD", "13@ c #A2ACB7", "23@ c #B8CCD5", "33@ c #B7A4AC", "43@ c #BC7A81", "53@ c #CD3D49", "63@ c #D9172B", "73@ c #DE0525", "83@ c #E0022A", "93@ c #E4052B", "03@ c #DE052B", "a3@ c #D1072A", "b3@ c #C20C2C", "c3@ c #B8102F", "d3@ c #B61230", "e3@ c #C60D2C", "f3@ c #D2092A", "g3@ c #E30129", "h3@ c #E3032B", "i3@ c #D40729", "j3@ c #CA364C", "k3@ c #C57C85", "l3@ c #C0B9BA", "m3@ c #959C9F", "n3@ c #A6B7BA", "o3@ c #989BC8", "p3@ c #5B4BB4", "q3@ c #2606A5", "r3@ c #18009D", "s3@ c #39249C", "t3@ c #706EA9", "u3@ c #AEBABA", "v3@ c #969C92", "w3@ c #898D7E", "x3@ c #A6B2B2", "y3@ c #A8BBBE", "z3@ c #879C95", "A3@ c #697E72", "B3@ c #697676", "C3@ c #555E62", "D3@ c #363B3F", "E3@ c #1B2021", "F3@ c #191E21", "G3@ c #1B1E22", "H3@ c #1F2024", "I3@ c #28272B", "J3@ c #3A3A3E", "K3@ c #3C3C40", "L3@ c #323235", "M3@ c #262628", "N3@ c #222024", "O3@ c #2C2B30", "P3@ c #3B3E42", "Q3@ c #44484E", "R3@ c #34353C", "S3@ c #333337", "T3@ c #69676A", "U3@ c #A2ABAF", "V3@ c #A2B1B6", "W3@ c #979F94", "X3@ c #AAB5B3", "Y3@ c #5C5356", "Z3@ c #373134", "`3@ c #1F1E22", " 4@ c #212023", ".4@ c #232224", "+4@ c #232126", "@4@ c #242120", "#4@ c #24211D", "$4@ c #25201F", "%4@ c #241F20", "&4@ c #241D1E", "*4@ c #231B1E", "=4@ c #231C20", "-4@ c #221C21", ";4@ c #221D21", ">4@ c #251F22", ",4@ c #2C2427", "'4@ c #2A2627", ")4@ c #2F2D2F", "!4@ c #5C6964", "~4@ c #6A8276", "{4@ c #9CB1B0", "]4@ c #B7A4A3", "^4@ c #C45D5D", "/4@ c #D22934", "(4@ c #DF0C28", "_4@ c #E6002A", ":4@ c #E6042C", "<4@ c #E5072B", "[4@ c #E30627", "}4@ c #E30424", "|4@ c #E60326", "14@ c #E0052A", "24@ c #D60A2C", "34@ c #D00D2E", "44@ c #D6082B", "54@ c #DC052B", "64@ c #DD0428", "74@ c #DF0526", "84@ c #DF0F2E", "94@ c #D42C45", "04@ c #C96070", "a4@ c #C09BA1", "b4@ c #BAC8C9", "c4@ c #B7BDC0", "d4@ c #A8ACAE", "e4@ c #949B9E", "f4@ c #999FCB", "g4@ c #5F51B9", "h4@ c #2A0AAB", "i4@ c #1900A2", "j4@ c #3A25A1", "k4@ c #7370AB", "l4@ c #A7B7BA", "m4@ c #929697", "n4@ c #848585", "o4@ c #A6B0B4", "p4@ c #939F9A", "q4@ c #7C857C", "r4@ c #798384", "s4@ c #646E71", "t4@ c #454C4D", "u4@ c #272C2A", "v4@ c #1E2224", "w4@ c #1C1E22", "x4@ c #212326", "y4@ c #2A2D31", "z4@ c #2B2E31", "A4@ c #27272B", "B4@ c #212024", "C4@ c #211F23", "D4@ c #2E2F33", "E4@ c #35363D", "F4@ c #38383F", "G4@ c #3B3B3F", "H4@ c #393A3B", "I4@ c #2D2D30", "J4@ c #1D1F22", "K4@ c #27282C", "L4@ c #4A494E", "M4@ c #67666C", "N4@ c #9FABA8", "O4@ c #BDCEC8", "P4@ c #BBCBCD", "Q4@ c #9AA09B", "R4@ c #909288", "S4@ c #776A6D", "T4@ c #4A3739", "U4@ c #2C2023", "V4@ c #1C1A1E", "W4@ c #1E1D1C", "X4@ c #211E1D", "Y4@ c #221E1E", "Z4@ c #221D20", "`4@ c #1F1F23", " 5@ c #202125", ".5@ c #242327", "+5@ c #282629", "@5@ c #2D292A", "#5@ c #2C2526", "$5@ c #292023", "%5@ c #241D20", "&5@ c #221C1F", "*5@ c #241F1E", "=5@ c #262221", "-5@ c #2A2725", ";5@ c #3C3438", ">5@ c #433E42", ",5@ c #474A4A", "'5@ c #596561", ")5@ c #93A2A4", "!5@ c #8B99A2", "~5@ c #A3B6BD", "{5@ c #BAB2B3", "]5@ c #BA706E", "^5@ c #D6142D", "/5@ c #E50029", "(5@ c #E7042D", "_5@ c #E40829", ":5@ c #DF0921", "<5@ c #DD081C", "[5@ c #E20424", "}5@ c #E2052A", "|5@ c #DE072B", "15@ c #D9092B", "25@ c #DB072A", "35@ c #DA0526", "45@ c #D80E26", "55@ c #D52737", "65@ c #CF5F6B", "75@ c #C69199", "85@ c #BDB5BB", "95@ c #B3BCBF", "05@ c #A4ABAD", "a5@ c #929B9D", "b5@ c #8C989C", "c5@ c #A9B7C0", "d5@ c #BED1D2", "e5@ c #9CA4C9", "f5@ c #6155BA", "g5@ c #2B0CAC", "h5@ c #1900A5", "i5@ c #3B25A3", "j5@ c #7771AA", "k5@ c #ACB8B7", "l5@ c #A2A7A7", "m5@ c #91908D", "n5@ c #84898C", "o5@ c #6F787B", "p5@ c #575E5D", "q5@ c #3E4440", "r5@ c #2B3031", "s5@ c #21252A", "t5@ c #1D2126", "u5@ c #1B2023", "v5@ c #1F1D22", "w5@ c #242125", "x5@ c #252226", "y5@ c #272529", "z5@ c #35353C", "A5@ c #393A3F", "B5@ c #353636", "C5@ c #2F2D2A", "D5@ c #292627", "E5@ c #1D1F24", "F5@ c #202429", "G5@ c #747773", "H5@ c #97A094", "I5@ c #B8C5B6", "J5@ c #BAC9C5", "K5@ c #9EA09E", "L5@ c #69585A", "M5@ c #3F2729", "N5@ c #2B1D20", "O5@ c #232324", "P5@ c #23211D", "Q5@ c #241F1B", "R5@ c #241F1D", "S5@ c #241F21", "T5@ c #21262E", "U5@ c #252837", "V5@ c #2B2B3C", "W5@ c #373538", "X5@ c #393436", "Y5@ c #362E31", "Z5@ c #292124", "`5@ c #221C1C", " 6@ c #211E1A", ".6@ c #23201C", "+6@ c #221E1D", "@6@ c #24201C", "#6@ c #292222", "$6@ c #2F272B", "%6@ c #3B363B", "&6@ c #8C9499", "*6@ c #A2B6BC", "=6@ c #B9B0B5", "-6@ c #A37473", ";6@ c #A53F46", ">6@ c #BB1930", ",6@ c #D30429", "'6@ c #DC062D", ")6@ c #DD0A28", "!6@ c #DA0C1E", "~6@ c #D70C18", "{6@ c #DA0724", "]6@ c #DE032A", "^6@ c #DB0128", "/6@ c #D60A29", "(6@ c #CF2434", "_6@ c #C84F51", ":6@ c #C79394", "<6@ c #818B93", "[6@ c #AEBDBF", "}6@ c #A0ABAD", "|6@ c #8D989D", "16@ c #C1D5D0", "26@ c #9EA8C7", "36@ c #6257B8", "46@ c #2B0DAC", "56@ c #18009E", "66@ c #786FA2", "76@ c #AEB6B2", "86@ c #7A7B82", "96@ c #A5ABB3", "06@ c #9A9F9F", "a6@ c #6D7175", "b6@ c #6E7172", "c6@ c #6B6E6F", "d6@ c #4E5458", "e6@ c #383D42", "f6@ c #292C31", "g6@ c #1C1E24", "h6@ c #1C1C22", "i6@ c #1F1C20", "j6@ c #211C1E", "k6@ c #221D1F", "l6@ c #242021", "m6@ c #272526", "n6@ c #2A2B2D", "o6@ c #2F3338", "p6@ c #30353A", "q6@ c #2F3133", "r6@ c #2B2A29", "s6@ c #26231F", "t6@ c #211F1E", "u6@ c #201F25", "v6@ c #24242F", "w6@ c #2A292F", "x6@ c #86848C", "y6@ c #A7A6AC", "z6@ c #83857C", "A6@ c #787B69", "B6@ c #858A75", "C6@ c #9CA491", "D6@ c #B0BCAE", "E6@ c #B9C8C2", "F6@ c #BBCACB", "G6@ c #B5B6AF", "H6@ c #9B9B8D", "I6@ c #8C8F7F", "J6@ c #ABB3AD", "K6@ c #BAC7C9", "L6@ c #5B5356", "M6@ c #332527", "N6@ c #241B1B", "O6@ c #22211D", "P6@ c #221F19", "Q6@ c #26221E", "R6@ c #2D2928", "S6@ c #333134", "T6@ c #323A3D", "U6@ c #2D3949", "V6@ c #293453", "W6@ c #293056", "X6@ c #313347", "Y6@ c #414048", "Z6@ c #504E51", "`6@ c #514E52", " 7@ c #312C30", ".7@ c #211A1E", "+7@ c #1F191C", "@7@ c #231D20", "#7@ c #221C20", "$7@ c #231E21", "%7@ c #242123", "&7@ c #312E31", "*7@ c #49444B", "=7@ c #66646C", "-7@ c #B7CAD5", ";7@ c #819098", ">7@ c #A6A9AF", ",7@ c #695E5F", "'7@ c #5D2D33", ")7@ c #79172A", "!7@ c #A2102E", "~7@ c #BB0E2E", "{7@ c #CE0B2A", "]7@ c #DB0926", "^7@ c #E30623", "/7@ c #E50227", "(7@ c #E50129", "_7@ c #D9001E", ":7@ c #CD1934", "<7@ c #C05763", "[7@ c #B89896", "}7@ c #BAB8B8", "|7@ c #A2AEB2", "17@ c #A8B7C1", "27@ c #9FA8C7", "37@ c #2201AE", "47@ c #3B2599", "57@ c #786E9F", "67@ c #AFB4AE", "77@ c #B6C2C7", "87@ c #787A7E", "97@ c #A2ADAE", "07@ c #757979", "a7@ c #6C6D6E", "b7@ c #84878D", "c7@ c #656A70", "d7@ c #474B50", "e7@ c #313236", "f7@ c #232024", "g7@ c #221B1C", "h7@ c #20191A", "i7@ c #221C1D", "j7@ c #252224", "k7@ c #29292C", "l7@ c #2A2E32", "m7@ c #292D31", "n7@ c #26282B", "o7@ c #232223", "p7@ c #201D19", "q7@ c #1F1D1B", "r7@ c #242228", "s7@ c #2F2E39", "t7@ c #707278", "u7@ c #AEAEB5", "v7@ c #D5D4D9", "w7@ c #B2B4A9", "x7@ c #939782", "y7@ c #858971", "z7@ c #888E78", "A7@ c #A9B4A1", "B7@ c #BAC9BE", "C7@ c #BCCBCB", "D7@ c #C4C8C6", "E7@ c #B5B6AB", "F7@ c #9C9E8C", "G7@ c #8E9480", "H7@ c #ABB4AE", "I7@ c #B2BCBF", "J7@ c #959D9C", "K7@ c #504D4F", "L7@ c #292224", "M7@ c #201A18", "N7@ c #211E18", "O7@ c #27241F", "P7@ c #32302E", "Q7@ c #3B4852", "R7@ c #344661", "S7@ c #2D3D6A", "T7@ c #293266", "U7@ c #2C2E49", "V7@ c #5C5C61", "W7@ c #66666A", "X7@ c #3C373B", "Y7@ c #251D23", "Z7@ c #211A1F", "`7@ c #262324", " 8@ c #343034", ".8@ c #71727A", "+8@ c #B8CBD6", "@8@ c #ABBAC5", "#8@ c #342429", "$8@ c #481A27", "%8@ c #6E1E32", "&8@ c #8C1B2F", "*8@ c #A7142C", "=8@ c #BD0D2B", "-8@ c #CE072B", ";8@ c #D6082C", ">8@ c #DC072C", ",8@ c #E0052B", "'8@ c #E3032A", ")8@ c #E40129", "!8@ c #E00329", "~8@ c #DD062A", "{8@ c #DF062B", "]8@ c #E5022A", "^8@ c #E6022A", "/8@ c #E50128", "(8@ c #E10127", "_8@ c #DB062B", ":8@ c #D01332", "<8@ c #C34357", "[8@ c #B7858D", "}8@ c #B1BFBD", "|8@ c #B3C8CA", "18@ c #939EA3", "28@ c #C0D5D0", "38@ c #9EA7C7", "48@ c #2B0CAD", "58@ c #2000B3", "68@ c #1900A3", "78@ c #3C249E", "88@ c #786EA1", "98@ c #AFB4AD", "08@ c #868E92", "a8@ c #77797E", "b8@ c #767B74", "c8@ c #6A6D67", "d8@ c #7A7E80", "e8@ c #6B6F75", "f8@ c #201C20", "g8@ c #221B1B", "h8@ c #201A1C", "i8@ c #242428", "j8@ c #252423", "k8@ c #2A2828", "l8@ c #343336", "m8@ c #47494F", "n8@ c #687075", "o8@ c #CED2D6", "p8@ c #EFEEF0", "q8@ c #E0E2DC", "r8@ c #BCBFB1", "s8@ c #969A86", "t8@ c #838971", "u8@ c #A7B29E", "v8@ c #BAC9BD", "w8@ c #BBCBCB", "x8@ c #C0C8C8", "y8@ c #B5B9B2", "z8@ c #A1A699", "A8@ c #ADB9B5", "B8@ c #ADB7B5", "C8@ c #8E948F", "D8@ c #484849", "E8@ c #242023", "F8@ c #1D1918", "G8@ c #27251F", "H8@ c #33342F", "I8@ c #3D4345", "J8@ c #3B4D5E", "K8@ c #364A6F", "L8@ c #303F74", "M8@ c #2B336A", "N8@ c #262744", "O8@ c #707174", "P8@ c #453F42", "Q8@ c #2B2327", "R8@ c #241E23", "S8@ c #231F1F", "T8@ c #221E1C", "U8@ c #23201F", "V8@ c #2A2525", "W8@ c #332C30", "X8@ c #3E343E", "Y8@ c #49404D", "Z8@ c #544E54", "`8@ c #727478", " 9@ c #292428", ".9@ c #2E2228", "+9@ c #442B35", "@9@ c #5C2931", "#9@ c #75222F", "$9@ c #8C182F", "%9@ c #A0112F", "&9@ c #B11630", "*9@ c #C11530", "=9@ c #CF0F2E", "-9@ c #DB072C", ";9@ c #E10228", ">9@ c #E2032A", ",9@ c #E2062B", "'9@ c #E3072C", ")9@ c #E5062C", "!9@ c #E6052B", "~9@ c #E8052B", "{9@ c #E10227", "]9@ c #D30426", "^9@ c #C41532", "/9@ c #BD4457", "(9@ c #B77882", "_9@ c #B2A8AB", ":9@ c #B0C9CA", "<9@ c #B2CBCE", "[9@ c #6256B8", "}9@ c #2101B4", "|9@ c #1900A7", "19@ c #3B24A3", "29@ c #776DA5", "39@ c #ADB4AF", "49@ c #8B9094", "59@ c #7A7F76", "69@ c #686B63", "79@ c #707676", "89@ c #4A4B4C", "99@ c #333235", "09@ c #231D1E", "a9@ c #251F21", "b9@ c #241F22", "c9@ c #231F24", "d9@ c #29272A", "e9@ c #343235", "f9@ c #403F40", "g9@ c #4A494B", "h9@ c #5F5F60", "i9@ c #757879", "j9@ c #A0AAAE", "k9@ c #C8D2D6", "l9@ c #E7ECEE", "m9@ c #FBFBFB", "n9@ c #FFFFFF", "o9@ c #E3E4E0", "p9@ c #B4B4A7", "q9@ c #919480", "r9@ c #A8B1A0", "s9@ c #B6C3BA", "t9@ c #BBC9CC", "u9@ c #B3BEBC", "v9@ c #A6AFA9", "w9@ c #A0A8A1", "x9@ c #B0BEBE", "y9@ c #BAC8CA", "z9@ c #8F968E", "A9@ c #484A4A", "B9@ c #1B1A19", "C9@ c #201E19", "D9@ c #1F1C18", "E9@ c #33362F", "F9@ c #3C4544", "G9@ c #37495D", "H9@ c #33456C", "I9@ c #303C6D", "J9@ c #2D3161", "K9@ c #27263F", "L9@ c #6E6E71", "M9@ c #474144", "N9@ c #2E272A", "O9@ c #262125", "P9@ c #252427", "Q9@ c #252320", "R9@ c #24211C", "S9@ c #24211B", "T9@ c #26221F", "U9@ c #2D2727", "V9@ c #2F272C", "W9@ c #40373A", "X9@ c #625E5F", "Y9@ c #99A9AF", "Z9@ c #869197", "`9@ c #4A4548", " 0@ c #2D292C", ".0@ c #252A2D", "+0@ c #2B3437", "@0@ c #393435", "#0@ c #4A2E34", "$0@ c #5C2734", "%0@ c #6F2134", "&0@ c #802733", "*0@ c #962432", "=0@ c #AE1B30", "-0@ c #CF0C2F", ";0@ c #D5092E", ">0@ c #D9062C", ",0@ c #DC062B", "'0@ c #DF092D", ")0@ c #E10B31", "!0@ c #D0082D", "~0@ c #B50B2B", "{0@ c #9E243B", "]0@ c #A16D74", "^0@ c #A7A0A1", "/0@ c #ADBBBD", "(0@ c #A7B7BC", "_0@ c #9EA8C6", ":0@ c #6257B6", "<0@ c #2B0EAB", "[0@ c #2101B5", "}0@ c #1A00A5", "|0@ c #716DAB", "10@ c #AEB7B7", "20@ c #979B98", "30@ c #8C8D8B", "40@ c #ADBDC1", "50@ c #7E8483", "60@ c #636464", "70@ c #4E5250", "80@ c #3F4240", "90@ c #303031", "00@ c #232023", "a0@ c #221F21", "b0@ c #211E21", "c0@ c #323036", "d0@ c #181518", "e0@ c #343134", "f0@ c #686667", "g0@ c #9D9C9B", "h0@ c #CCCECE", "i0@ c #E0E3E4", "j0@ c #EDF1F2", "k0@ c #F3F8F8", "l0@ c #F7FBFB", "m0@ c #F5F1F1", "n0@ c #DED3D1", "o0@ c #C2B6B0", "p0@ c #ADAFA5", "q0@ c #A8B4AC", "r0@ c #A6AAAA", "s0@ c #BECCD0", "t0@ c #BBC7CA", "u0@ c #A1ACAC", "v0@ c #515A5A", "w0@ c #212929", "x0@ c #111818", "y0@ c #111816", "z0@ c #121615", "A0@ c #1F2320", "B0@ c #323732", "C0@ c #3E4642", "D0@ c #323E45", "E0@ c #2A3445", "F0@ c #282D45", "G0@ c #2D2D46", "H0@ c #3A3A48", "I0@ c #39363B", "J0@ c #282428", "K0@ c #2B2627", "L0@ c #2F2728", "M0@ c #2F2828", "N0@ c #2E2729", "O0@ c #2B2629", "P0@ c #252126", "Q0@ c #2E2A30", "R0@ c #4E4B4F", "S0@ c #68676A", "T0@ c #91979C", "U0@ c #95A5AC", "V0@ c #3F3C3B", "W0@ c #322F2F", "X0@ c #302F33", "Y0@ c #34353A", "Z0@ c #373338", "`0@ c #3F3539", " a@ c #48383B", ".a@ c #4F383A", "+a@ c #47302F", "@a@ c #53282A", "#a@ c #6F202B", "$a@ c #911B32", "%a@ c #AC1B42", "&a@ c #B71A43", "*a@ c #B81939", "=a@ c #B8152C", "-a@ c #C30E2A", ";a@ c #CA0A29", ">a@ c #CC0A28", ",a@ c #C90E2E", "'a@ c #C61741", ")a@ c #A81744", "!a@ c #7E163F", "~a@ c #612544", "{a@ c #745E69", "]a@ c #8D9193", "^a@ c #9EA4A6", "/a@ c #90989A", "(a@ c #8D999C", "_a@ c #C0D4D0", ":a@ c #9EA9C5", "b@ c #9C182F", ",b@ c #991B35", "'b@ c #952446", ")b@ c #802952", "!b@ c #642F59", "~b@ c #523D60", "{b@ c #615D6C", "]b@ c #7F878C", "^b@ c #A1B0B3", "/b@ c #89939C", "(b@ c #AEB3B7", "_b@ c #BFD4D1", ":b@ c #A0AAC4", "c@ c #5E3B56", ",c@ c #5E4C6F", "'c@ c #605E82", ")c@ c #626879", "!c@ c #7A868D", "~c@ c #949DA7", "{c@ c #B3B8BB", "]c@ c #A5A7AA", "^c@ c #92989E", "/c@ c #89989E", "(c@ c #A6B9BD", "_c@ c #BFD3D2", ":c@ c #A2ACC3", "d@ c #454655", ",d@ c #5C5F7A", "'d@ c #6E7495", ")d@ c #647082", "!d@ c #AAACB1", "~d@ c #939AA1", "{d@ c #88969F", "]d@ c #BED3D2", "^d@ c #A4AFC2", "/d@ c #756BAB", "(d@ c #43289C", "_d@ c #290AB0", ":d@ c #1400A9", "e@ c #323439", ",e@ c #32343B", "'e@ c #34353E", ")e@ c #353640", "!e@ c #3C4150", "~e@ c #485167", "{e@ c #536079", "]e@ c #526272", "^e@ c #6E7E88", "/e@ c #B8BEC1", "(e@ c #AAACB0", "_e@ c #BCD1D3", ":e@ c #A6B4C5", "f@ c #36373C", ",f@ c #35303A", "'f@ c #3C3A48", ")f@ c #474D5E", "!f@ c #526071", "~f@ c #4D5D69", "{f@ c #697881", "]f@ c #BFCAD1", "^f@ c #B9BDC1", "/f@ c #A8B7C6", "(f@ c #8082B2", "_f@ c #5445A4", ":f@ c #2F14B2", "g@ c #554E58", ",g@ c #46464B", "'g@ c #484A4B", ")g@ c #494D4C", "!g@ c #424446", "~g@ c #404144", "{g@ c #3D2E34", "]g@ c #463941", "^g@ c #545F68", "/g@ c #6A747B", "(g@ c #BFCACD", "_g@ c #AAACAF", ":g@ c #BDD1D2", "h@ c #373431", ",h@ c #3B3A3D", "'h@ c #514A4D", ")h@ c #705F5D", "!h@ c #87706C", "~h@ c #80777A", "{h@ c #6E6D76", "]h@ c #4F4852", "^h@ c #574949", "/h@ c #64534A", "(h@ c #6F6151", "_h@ c #756956", ":h@ c #6A594D", "i@ c #6E7274", ",i@ c #575D5B", "'i@ c #535A57", ")i@ c #747677", "!i@ c #94979B", "~i@ c #ACB5BB", "{i@ c #8A98A1", "]i@ c #A0B1BA", "^i@ c #83888E", "/i@ c #3C2A2E", "(i@ c #453233", "_i@ c #3F363A", ":i@ c #423C41", "j@ c #B4B4B9", ",j@ c #828386", "'j@ c #4C4B4D", ")j@ c #262425", "!j@ c #352F30", "~j@ c #3C3437", "{j@ c #3A3135", "]j@ c #352C31", "^j@ c #342F30", "/j@ c #343230", "(j@ c #343231", "_j@ c #2E2C2E", ":j@ c #29282B", "k@ c #B17C68", ",k@ c #AEA692", "'k@ c #B6C2B0", ")k@ c #BCD2C9", "!k@ c #BAD4D5", "~k@ c #ADC4CA", "{k@ c #828E8D", "]k@ c #8A918C", "^k@ c #B9BFB9", "/k@ c #ECF2EE", "(k@ c #FBFDFC", "_k@ c #FCFFFF", ":k@ c #F8F9FB", "l@ c #2F2E38", ",l@ c #B2B7BA", "'l@ c #EBF0EE", ")l@ c #FAFAFA", "!l@ c #F7F7F7", "~l@ c #DEE0DA", "{l@ c #AEB0A1", "]l@ c #8D8E7A", "^l@ c #A7A89B", "/l@ c #B8BCB7", "(l@ c #9BA19F", "_l@ c #AEB3B1", ":l@ c #BAC6C8", "m@ c #756CA8", ",m@ c #AFB6B0", "'m@ c #9CA19E", ")m@ c #BCD1D7", "!m@ c #8B9396", "~m@ c #666A6C", "{m@ c #4C5054", "]m@ c #41474C", "^m@ c #54575B", "/m@ c #2B2A30", "(m@ c #252629", "_m@ c #292C2F", ":m@ c #3A3A40", "n@ c #7C5954", ",n@ c #844A35", "'n@ c #9B5B3B", ")n@ c #BA7D54", "!n@ c #D59566", "~n@ c #DC7947", "{n@ c #DF6935", "]n@ c #E06732", "^n@ c #E06A35", "/n@ c #E66B34", "(n@ c #D36030", "_n@ c #B25431", ":n@ c #965843", "o@ c #555658", ",o@ c #555558", "'o@ c #494C51", ")o@ c #464A51", "!o@ c #6C7071", "~o@ c #9AA49D", "{o@ c #BECFC6", "]o@ c #AAC3CB", "^o@ c #5A5C61", "/o@ c #878682", "(o@ c #ACAEAB", "_o@ c #BBC1C3", ":o@ c #BDC4CC", "p@ c #4F5055", ",p@ c #323238", "'p@ c #2F2E35", ")p@ c #303036", "!p@ c #343136", "~p@ c #3B3036", "{p@ c #3D3438", "]p@ c #3B393C", "^p@ c #393B3D", "/p@ c #312F30", "(p@ c #343333", "_p@ c #3D3B3B", ":p@ c #424344", "q@ c #8A897F", ",q@ c #6F7265", "'q@ c #8B9286", ")q@ c #A3AA9E", "!q@ c #B2B5AB", "~q@ c #B8BBB3", "{q@ c #B5BBBE", "]q@ c #BAB6B0", "^q@ c #B5A9A2", "/q@ c #AE9995", "(q@ c #AB9594", "_q@ c #ABC0C0", ":q@ c #779387", "r@ c #3C3741", ",r@ c #292C32", "'r@ c #202529", ")r@ c #202226", "!r@ c #222023", "~r@ c #201E21", "{r@ c #585658", "]r@ c #929092", "^r@ c #CACACC", "/r@ c #F5F5F8", "(r@ c #FDFCFD", "_r@ c #EEF1EF", ":r@ c #D9E1DA", "s@ c #AAB7B7", ",s@ c #AEBCBB", "'s@ c #99A194", ")s@ c #8E9380", "!s@ c #BCC9CA", "~s@ c #BDCFD1", "{s@ c #B3C5C5", "]s@ c #9FABA3", "^s@ c #777D74", "/s@ c #4B4D47", "(s@ c #303030", "_s@ c #535A60", ":s@ c #3D4348", "t@ c #F9FDFD", ",t@ c #F6FBFB", "'t@ c #DBE1DD", ")t@ c #A2AAA2", "!t@ c #766F66", "~t@ c #875151", "{t@ c #A94E45", "]t@ c #CD5C3E", "^t@ c #E86D3B", "/t@ c #ED6C34", "(t@ c #CE673C", "_t@ c #A26753", ":t@ c #847573", "u@ c #5A5C5D", ",u@ c #5A595B", "'u@ c #585656", ")u@ c #585755", "!u@ c #747675", "~u@ c #9FA6A7", "{u@ c #C2CDD1", "]u@ c #A0AEB9", "^u@ c #9FB0B6", "/u@ c #A3AEB2", "(u@ c #49393E", "_u@ c #413033", ":u@ c #36373B", "v@ c #57585B", ",v@ c #575859", "'v@ c #575858", ")v@ c #585959", "!v@ c #5A5B5B", "~v@ c #595A5C", "{v@ c #565758", "]v@ c #565659", "^v@ c #58595D", "/v@ c #606166", "(v@ c #A3B1BD", "_v@ c #98A4B2", ":v@ c #B0BEC1", "w@ c #E7EAEA", ",w@ c #D9D9D9", "'w@ c #6B6D70", ")w@ c #434349", "!w@ c #4E4F52", "~w@ c #5D5F5D", "{w@ c #5E5F5D", "]w@ c #5D5E5F", "^w@ c #5C5C60", "/w@ c #5A5A5E", "(w@ c #5B5D5C", "_w@ c #60625B", ":w@ c #63645B", "x@ c #76767B", ",x@ c #615F67", "'x@ c #525258", ")x@ c #58595C", "!x@ c #545657", "~x@ c #535455", "{x@ c #565558", "]x@ c #5A5958", "^x@ c #5D5D56", "/x@ c #5E5E55", "(x@ c #565857", "_x@ c #4C4A50", ":x@ c #49484F", "y@ c #86818B", ",y@ c #4E4F55", "'y@ c #56555C", ")y@ c #515455", "!y@ c #494D4B", "~y@ c #454946", "{y@ c #504D4D", "]y@ c #555050", "^y@ c #545150", "/y@ c #50504D", "(y@ c #474B4D", "_y@ c #4A4C52", ":y@ c #504B4F", "z@ c #3E433E", ",z@ c #4C4947", "'z@ c #514C4D", ")z@ c #4D4A4E", "!z@ c #3F4349", "~z@ c #524C4C", "{z@ c #525151", "]z@ c #535556", "^z@ c #5A6160", "/z@ c #697A71", "(z@ c #7F9A8D", "_z@ c #A4BBBA", ":z@ c #A4B2B8", "A@ c #F7F6F8", ",A@ c #EDEBEE", "'A@ c #DAD8DC", ")A@ c #969B96", "!A@ c #707572", "~A@ c #525559", "{A@ c #595B5C", "]A@ c #525454", "^A@ c #505252", "/A@ c #555354", "(A@ c #575C61", "_A@ c #545D64", ":A@ c #414442", "B@ c #9BA59C", ",B@ c #919A8F", "'B@ c #8B9182", ")B@ c #898D7D", "!B@ c #92938B", "~B@ c #828483", "{B@ c #636D73", "]B@ c #97A6A8", "^B@ c #C8D5D5", "/B@ c #ECF1F1", "(B@ c #F0F2F0", "_B@ c #CAD0C8", ":B@ c #A0A5A0", "C@ c #F2F3F2", ",C@ c #E3E5E5", "'C@ c #C9CACC", ")C@ c #B0BBB8", "!C@ c #9BA093", "~C@ c #909383", "{C@ c #C0D0D5", "]C@ c #BBC7C8", "^C@ c #9DA2A4", "/C@ c #8C908F", "(C@ c #7F8481", "_C@ c #818987", ":C@ c #848D8A", "D@ c #D79FAC", ",D@ c #EEE5E9", "'D@ c #F7FFFE", ")D@ c #F1F5F4", "!D@ c #E4DADB", "~D@ c #D5C4C8", "{D@ c #CFA6AA", "]D@ c #D08183", "^D@ c #D2555B", "/D@ c #CF1A32", "(D@ c #C9233D", "_D@ c #C75F71", ":D@ c #CFABB1", "E@ c #F8FEFE", ",E@ c #F3EDEF", "'E@ c #E4C5CA", ")E@ c #D8808D", "!E@ c #D0384F", "~E@ c #CA112B", "{E@ c #C63B4E", "]E@ c #CD7480", "^E@ c #DCAEB5", "/E@ c #EDE0E4", "(E@ c #F7FEFC", "_E@ c #EFF3F3", ":E@ c #EAECEC", "F@ c #F7FEFE", ",F@ c #EEE4E7", "'F@ c #CF92A3", ")F@ c #C14D68", "!F@ c #C32845", "~F@ c #CA2C45", "{F@ c #CE7681", "]F@ c #D9B7B9", "^F@ c #EAE3E3", "/F@ c #FCFFFE", "(F@ c #F9FEFD", "_F@ c #F6FDFD", ":F@ c #F7FDFD", "G@ c #657075", ",G@ c #4E4D57", "'G@ c #31323A", ")G@ c #2A2D34", "!G@ c #3D4449", "~G@ c #6B7477", "{G@ c #C1C9C9", "]G@ c #F9FCFD", "^G@ c #ECDEE3", "/G@ c #BD6A87", "(G@ c #AC3458", "_G@ c #B83D58", ":G@ c #CE6C78", "H@ c #778488", ",H@ c #768284", "'H@ c #788386", ")H@ c #757E82", "!H@ c #6D767A", "~H@ c #5D666A", "{H@ c #4A4D56", "]H@ c #3C3C46", "^H@ c #212329", "/H@ c #2D3236", "(H@ c #5A6366", "_H@ c #DBE1E2", ":H@ c #F9F8F8", "I@ c #706AA3", ",I@ c #A4B0AF", "'I@ c #BEC4C9", ")I@ c #797B79", "!I@ c #555855", "~I@ c #595E5E", "{I@ c #70848D", "]I@ c #788F9A", "^I@ c #6E7D7E", "/I@ c #6C817A", "(I@ c #6C857A", "_I@ c #70807E", ":I@ c #5C6169", "J@ c #8C999F", ",J@ c #28252C", "'J@ c #49474E", ")J@ c #8A8991", "!J@ c #CECDD4", "~J@ c #F1F1F4", "{J@ c #ECEDEE", "]J@ c #C1C2C5", "^J@ c #656668", "/J@ c #6B6E73", "(J@ c #B5BDBC", "_J@ c #989D9F", ":J@ c #8C9195", "K@ c #EBDBB4", ",K@ c #EAC775", "'K@ c #F0BC44", ")K@ c #F8CE6D", "!K@ c #FCE7B7", "~K@ c #FEFCF8", "{K@ c #CED1D2", "]K@ c #5C565F", "^K@ c #4F5052", "/K@ c #525253", "(K@ c #606159", "_K@ c #5E5F57", ":K@ c #535351", "L@ c #5A5B5F", ",L@ c #606369", "'L@ c #666B70", ")L@ c #7F867E", "!L@ c #9B9F95", "~L@ c #CCCEC9", "{L@ c #FBF9FB", "]L@ c #E0E3E9", "^L@ c #9CA7C5", "/L@ c #9AA6C5", "(L@ c #B6C0D9", "_L@ c #F7F8F9", ":L@ c #EEEBE2", "M@ c #BBC8C9", ",M@ c #BCC7CA", "'M@ c #BCC6CD", ")M@ c #BDC6D2", "!M@ c #BECDD4", "~M@ c #C0D2D6", "{M@ c #C0D1D6", "]M@ c #AAB1B9", "^M@ c #AAB3B8", "/M@ c #B2BFC1", "(M@ c #B6C1C4", "_M@ c #A5B5B4", ":M@ c #89A198", "N@ c #CD9C9D", ",N@ c #B96A71", "'N@ c #C3788B", ")N@ c #D392A7", "!N@ c #E1ABB9", "~N@ c #E5B7BE", "{N@ c #D49DAA", "]N@ c #D2A7B4", "^N@ c #DCC4CC", "/N@ c #E3D2D7", "(N@ c #D49FAA", "_N@ c #CB6A78", ":N@ c #CC4B58", "O@ c #C87E80", ",O@ c #B74F54", "'O@ c #D69BA4", ")O@ c #ECD6DE", "!O@ c #F5F2F5", "~O@ c #F5F6F6", "{O@ c #EEE3E4", "]O@ c #EBE3E2", "^O@ c #EAE9E8", "/O@ c #E7DFE0", "(O@ c #D59DAB", "_O@ c #CB6777", ":O@ c #CB4F5A", "P@ c #E5E3E4", ",P@ c #F9FEFE", "'P@ c #E8CACD", ")P@ c #D0717A", "!P@ c #C44350", "~P@ c #E2B0B5", "{P@ c #F5F2F4", "]P@ c #F7F8F7", "^P@ c #F5F9F7", "/P@ c #F2F8F5", "(P@ c #EAE4E3", "_P@ c #D69CAA", ":P@ c #CB6A7A", "Q@ c #E6B9C1", ",Q@ c #F6F9F8", "'Q@ c #F8FEFC", ")Q@ c #F3F9F8", "!Q@ c #E8DFE1", "~Q@ c #D5909F", "{Q@ c #CB6778", "]Q@ c #CB6973", "^Q@ c #D48C8D", "/Q@ c #E9D3D2", "(Q@ c #ECEFED", "_Q@ c #E0E5E4", ":Q@ c #BAC5C8", "R@ c #F8F7F7", ",R@ c #FBF9F8", "'R@ c #F5FDFD", ")R@ c #EAF4F7", "!R@ c #DDD0D9", "~R@ c #CF667B", "{R@ c #CD5064", "]R@ c #D47E89", "^R@ c #E1C1C2", "/R@ c #EFE7E7", "(R@ c #EFF0F0", "_R@ c #E3E5E6", ":R@ c #D1D2D4", "S@ c #F5F4F6", ",S@ c #F9FDFC", "'S@ c #F9FFFE", ")S@ c #F0F8F9", "!S@ c #D3B2C0", "~S@ c #CC5367", "{S@ c #D05465", "]S@ c #DE99A2", "^S@ c #ECE7E8", "/S@ c #E1E3E5", "(S@ c #CED3D6", "_S@ c #A5ACB0", ":S@ c #B0B4B6", "T@ c #E7C7CF", ",T@ c #CB677E", "'T@ c #BB3151", ")T@ c #D99BAB", "!T@ c #EEE1E6", "~T@ c #F6FAFA", "{T@ c #F7FDFC", "]T@ c #F4FFFE", "^T@ c #E9E7EA", "/T@ c #DABCC6", "(T@ c #CD8A9A", "_T@ c #C95664", ":T@ c #D36F78", "U@ c #EEE2E3", ",U@ c #D9B1B5", "'U@ c #CB9499", ")U@ c #D9BABE", "!U@ c #E8DBDD", "~U@ c #F2EFEF", "{U@ c #EDCED3", "]U@ c #DA7987", "^U@ c #CE4258", "/U@ c #D98092", "(U@ c #E4B7C3", "_U@ c #EBD8DE", ":U@ c #EFE8E9", "V@ c #1E1717", ",V@ c #3A383F", "'V@ c #45454F", ")V@ c #312F3A", "!V@ c #D0D0D2", "~V@ c #EEE2E4", "{V@ c #D8B5BA", "]V@ c #C99AA1", "^V@ c #D2BFC7", "/V@ c #E1DEE4", "(V@ c #EFF0F3", "_V@ c #ECDEE0", ":V@ c #D8A4AC", "W@ c #1C01AE", ",W@ c #311CA5", "'W@ c #605899", ")W@ c #919A99", "!W@ c #75767F", "~W@ c #464144", "{W@ c #40434A", "]W@ c #849195", "^W@ c #939FA2", "/W@ c #464846", "(W@ c #201B17", "_W@ c #1A1412", ":W@ c #211C1D", "X@ c #5947AB", ",X@ c #2C11AA", "'X@ c #1B00B8", ")X@ c #2E1BA3", "!X@ c #5B5797", "~X@ c #8B9997", "{X@ c #AABBBC", "]X@ c #B0C6CD", "^X@ c #B8CFD6", "/X@ c #3E3F3F", "(X@ c #1F1917", "_X@ c #1B1413", ":X@ c #221D1E", "Y@ c #282326", ",Y@ c #35363C", "'Y@ c #584B4E", ")Y@ c #716568", "!Y@ c #808285", "~Y@ c #9EADB0", "{Y@ c #C2D2D7", "]Y@ c #A3A9A8", "^Y@ c #939897", "/Y@ c #8B9195", "(Y@ c #A0A2C6", "_Y@ c #523FAF", ":Y@ c #260AA8", "Z@ c #F6F7F6", ",Z@ c #2B2A2D", "'Z@ c #313133", ")Z@ c #282B2D", "!Z@ c #272E31", "~Z@ c #2C3034", "{Z@ c #3B2829", "]Z@ c #483335", "^Z@ c #544F51", "/Z@ c #646E72", "(Z@ c #909B9F", "_Z@ c #8A8F94", ":Z@ c #B6C7D3", "`@ c #B1B2B7", ",`@ c #E6E6E7", "'`@ c #4B4C52", ")`@ c #242627", "!`@ c #242A2D", "~`@ c #2C3436", "{`@ c #383836", "]`@ c #3F3937", "^`@ c #403A3B", "/`@ c #403D40", "(`@ c #444547", "_`@ c #BACFD4", ":`@ c #B6C1C2", "<`@ c #A2A4A2", "[`@ c #919191", "}`@ c #8A8E93", "|`@ c #B9CDCD", "1`@ c #B7CBCB", "2`@ c #9CA7C4", "3`@ c #4736B1", "4`@ c #1A03A7", "5`@ c #1100A6", "6`@ c #1904AA", "7`@ c #1B03AF", "8`@ c #3018A9", "9`@ c #644EAA", "0`@ c #978CB1", "a`@ c #ADB4C7", "b`@ c #ACB5C0", "c`@ c #46474E", "d`@ c #2E2B2E", "e`@ c #201B1C", "f`@ c #28262A", "g`@ c #14161B", "h`@ c #37383C", "i`@ c #7C7B7C", "j`@ c #E7E9E9", "k`@ c #E3C7CB", "l`@ c #D18190", "m`@ c #D58998", "n`@ c #E6C4CC", "o`@ c #EEDEE6", "p`@ c #E3BBC3", "q`@ c #D99B9F", "r`@ c #D58E90", "s`@ c #E1B3BB", "t`@ c #EDD6DE", "u`@ c #F4EFF2", "v`@ c #F7F8F8", "w`@ c #EFEFEE", "x`@ c #DCDFDF", "y`@ c #C7CFD3", "z`@ c #B3BAC1", "A`@ c #7B7879", "B`@ c #8F8F8D", "C`@ c #B6B8B5", "D`@ c #E9EBEE", "E`@ c #D6DAE3", "F`@ c #C2C8D8", "G`@ c #B8C0D4", "H`@ c #BAC2D6", "I`@ c #C6CCDD", "J`@ c #D5DAE6", "K`@ c #DFE1E5", "L`@ c #DFD6C2", "M`@ c #DFC27C", "N`@ c #E4B139", "O`@ c #F2C660", "P`@ c #F9E1AB", "Q`@ c #FCFBFA", "R`@ c #363439", "S`@ c #343339", "T`@ c #383C40", "U`@ c #42494E", "V`@ c #61676C", "W`@ c #717175", "X`@ c #93989A", "Y`@ c #413D42", "Z`@ c #433B45", "``@ c #514B54", " # c #5C5F60", ". # c #686A6D", "+ # c #52535A", "@ # c #444148", "# # c #6D6C75", "$ # c #6B6A75", "% # c #27262E", "& # c #8B8C90", "* # c #CACBCE", "= # c #63646B", "- # c #353639", "; # c #2D3235", "> # c #343B38", ", # c #363936", "' # c #332F2F", ") # c #2D2628", "! # c #282527", "~ # c #64676E", "{ # c #B5C9CC", "] # c #B6BCBB", "^ # c #989991", "/ # c #878883", "( # c #9BA7C3", "_ # c #4535B2", ": # c #1802A9", "< # c #1000A7", "[ # c #3218AB", "} # c #654EAB", "| # c #988BB2", "1 # c #C0D3D9", "2 # c #2B282A", "3 # c #262427", "4 # c #282729", "5 # c #17171B", "6 # c #3B3B3E", "7 # c #828182", "8 # c #F0F2F1", "9 # c #E7D6D7", "0 # c #D28492", "a # c #D48695", "b # c #E5C2CA", "c # c #FAFBFC", "d # c #F5F4F7", "e # c #EEE6E8", "f # c #E8D7D8", "g # c #E7D1D1", "h # c #F7F4F8", "i # c #F5F9F9", "j # c #E4E7E6", "k # c #D1D7D7", "l # c #C2CBCF", "m # c #C0C9CF", "n # c #BABDC1", "o # c #949394", "p # c #807F7A", "q # c #84857A", "r # c #9FA295", "s # c #DADCD8", "t # c #EDEDF0", "u # c #EAEBEF", "v # c #F0F2F5", "w # c #EAE7E0", "x # c #E2CEA0", "y # c #E2B856", "z # c #EEC669", "A # c #F8E0AB", "B # c #D7D7D9", "C # c #46494D", "D # c #3A3B3D", "E # c #363438", "F # c #3C3A40", "G # c #60656A", "H # c #5F6167", "I # c #515258", "J # c #757B7F", "K # c #676C6C", "L # c #474A47", "M # c #5E5A60", "N # c #7E7B81", "O # c #7E8185", "P # c #848B8D", "Q # c #67656E", "R # c #49424E", "S # c #2C242F", "T # c #242127", "U # c #969799", "V # c #DBDCDE", "W # c #F5F6F7", "X # c #E9ECEC", "Y # c #5B5E65", "Z # c #2D2B31", "` # c #2E3132", " .# c #2C2A2A", "..# c #282325", "+.# c #242325", "@.# c #3E3D41", "#.# c #484A4F", "$.# c #52565B", "%.# c #7F7F86", "&.# c #8B8B90", "*.# c #B2C1C3", "=.# c #B6BFC1", "-.# c #AAAEAD", ";.# c #84847A", ">.# c #777971", ",.# c #81898A", "'.# c #B9CED0", ").# c #9BA4C9", "!.# c #4534B4", "~.# c #1802AA", "{.# c #1100A9", "].# c #3319AA", "^.# c #6450A7", "/.# c #958FAC", "(.# c #ADB5C5", "_.# c #61676B", ":.# c #323031", "<.# c #252328", "[.# c #1A181C", "}.# c #8A898B", "|.# c #D3D3D3", "1.# c #F7FCFA", "2.# c #F4FAF8", "3.# c #CF909E", "4.# c #CF8E9D", "5.# c #E3C5CD", "6.# c #F6FEFD", "7.# c #D7DFDD", "8.# c #C5CFD0", "9.# c #A1A19C", "0.# c #8B8C81", "a.# c #858876", "b.# c #949784", "c.# c #C7CAC0", "d.# c #E8EAE6", "e.# c #F2F2F0", "f.# c #E2C277", "g.# c #EACA7D", "h.# c #F7E0AC", "i.# c #E0E0E1", "j.# c #A0A1A2", "k.# c #5E6062", "l.# c #414244", "m.# c #363637", "n.# c #3C3B3F", "o.# c #444249", "p.# c #3E4148", "q.# c #41464B", "r.# c #5E6265", "s.# c #5C5F62", "t.# c #46474C", "u.# c #313239", "v.# c #35383F", "w.# c #596066", "x.# c #65666C", "y.# c #4D5050", "z.# c #3A403B", "A.# c #575959", "B.# c #818384", "C.# c #8B9598", "D.# c #616568", "E.# c #555058", "F.# c #544D58", "G.# c #433A47", "H.# c #312833", "I.# c #242026", "J.# c #515052", "K.# c #9FA1A2", "L.# c #E9EAEC", "M.# c #909193", "N.# c #45414A", "O.# c #2F2930", "P.# c #464448", "Q.# c #5C595C", "R.# c #666164", "S.# c #696568", "T.# c #9CA4A7", "U.# c #8E8F8F", "V.# c #686960", "W.# c #656961", "X.# c #7D8687", "Y.# c #9CA4CF", "Z.# c #4837B5", "`.# c #1C04AA", " +# c #311BA6", ".+# c #60569C", "++# c #C2D4D9", "@+# c #9EAAAF", "#+# c #313031", "$+# c #27252B", "%+# c #131419", "&+# c #404245", "*+# c #EAE9E9", "=+# c #F8FDFB", "-+# c #EAEAEC", ";+# c #B99EAF", ">+# c #BA9BAD", ",+# c #DCCDD5", "'+# c #F7FBFC", ")+# c #ECEFEE", "!+# c #CDD7D8", "~+# c #BFCBC7", "{+# c #B8C1B5", "]+# c #979C8A", "^+# c #8D8F7E", "/+# c #97968A", "(+# c #A3A29A", "_+# c #9EA091", ":+# c #B5B8AA", "<+# c #DCDED8", "[+# c #EDE8DD", "}+# c #E7CF99", "|+# c #EAD196", "1+# c #F6E1B2", "2+# c #E8EAE8", "3+# c #B4B8B3", "4+# c #747B74", "5+# c #424741", "6+# c #2F3331", "7+# c #34373A", "8+# c #42434B", "9+# c #3D3D45", "0+# c #5E7068", "a+# c #5F7269", "b+# c #4B5655", "c+# c #34373E", "d+# c #4E4C53", "e+# c #646666", "f+# c #838A81", "g+# c #9BA69D", "h+# c #AAB7B5", "i+# c #B0C7D0", "j+# c #575B5E", "k+# c #3A353B", "l+# c #38353E", "m+# c #2A282F", "n+# c #AEADB0", "o+# c #DFE1E2", "p+# c #A8A8AB", "q+# c #626267", "r+# c #313136", "s+# c #36363B", "t+# c #35333B", "u+# c #323037", "v+# c #2B292E", "w+# c #242429", "x+# c #22252A", "y+# c #24272A", "z+# c #3A373C", "A+# c #48464B", "B+# c #56545A", "C+# c #5F5E64", "D+# c #595A60", "E+# c #505053", "F+# c #434444", "G+# c #54595B", "H+# c #A2ACCE", "I+# c #5546B4", "J+# c #280DAC", "K+# c #311BA7", "L+# c #60569D", "M+# c #91989D", "N+# c #25232A", "O+# c #2F2F32", "P+# c #2A2A2D", "Q+# c #302E36", "R+# c #0F1116", "S+# c #A2A4A5", "T+# c #ECEFF1", "U+# c #BDB9C5", "V+# c #B6AFBD", "W+# c #CDCAD2", "X+# c #EAEBED", "Y+# c #F5F9F8", "Z+# c #F1F4F2", "`+# c #E5E9E8", " @# c #C7D2D5", ".@# c #B7C6BF", "+@# c #ADBAAA", "@@# c #919984", "#@# c #949687", "$@# c #A7A5A0", "%@# c #B1AFAD", "&@# c #898C7A", "*@# c #979C88", "=@# c #CACDC4", "-@# c #FCFCFE", ";@# c #F4F2F0", ">@# c #EDE0C4", ",@# c #EDDFBD", "'@# c #F6E8C9", ")@# c #F1F3F1", "!@# c #CED3CD", "~@# c #9EA59D", "{@# c #6C736D", "]@# c #4F5150", "^@# c #454245", "/@# c #463F46", "(@# c #49474B", "_@# c #3D3D43", ":@# c #61756D", "<@# c #647B72", "[@# c #515F5D", "}@# c #3A3C42", "|@# c #ACB7AF", "1@# c #BACAC2", "2@# c #BBCDCC", "3@# c #ACC5CE", "4@# c #9CAEB6", "5@# c #788388", "6@# c #4D5054", "7@# c #2D282D", "8@# c #312C33", "9@# c #6C6C72", "0@# c #2A2A31", "a@# c #3F3E43", "b@# c #35353A", "c@# c #383940", "d@# c #373B41", "e@# c #34383C", "f@# c #303235", "g@# c #3A3942", "h@# c #424347", "i@# c #4A4B4D", "j@# c #69727A", "k@# c #A6B2CC", "l@# c #5D50B1", "m@# c #2F15AA", "n@# c #1C01AD", "o@# c #3219A9", "p@# c #6251A4", "q@# c #9492A6", "r@# c #25242B", "s@# c #2A2C31", "t@# c #2A2F32", "u@# c #2E2D33", "v@# c #100F14", "w@# c #47484B", "x@# c #A8ABAC", "y@# c #D4D8DC", "z@# c #C1C6CC", "A@# c #BCC0C7", "B@# c #C6C8CF", "C@# c #FCFBFB", "D@# c #EBEEED", "E@# c #C4CFD2", "F@# c #ADBAB3", "G@# c #A1AC9E", "H@# c #939C8B", "I@# c #9EA298", "J@# c #898E7B", "K@# c #8F9580", "L@# c #BDC1B7", "M@# c #F5EEDF", "N@# c #F8F2E3", "O@# c #FAFAF9", "P@# c #EAECE9", "Q@# c #CFD3CF", "R@# c #ADB2B0", "S@# c #858384", "T@# c #605255", "U@# c #463439", "V@# c #4A474B", "W@# c #45484D", "X@# c #3D3F43", "Y@# c #616E6E", "Z@# c #677676", "`@# c #565F60", " ## c #3E3F43", ".## c #2E2C30", "+## c #403F44", "@## c #6A6C73", "### c #5F646D", "$## c #B7C5C3", "%## c #BCCCCA", "&## c #ADC3CA", "*## c #46494C", "=## c #282528", "-## c #2C282E", ";## c #888A92", ">## c #CACBCF", ",## c #D0D1D3", "'## c #83848B", ")## c #4F5155", "!## c #3C3E3E", "~## c #3A3E3F", "{## c #484C51", "]## c #5B5F67", "^## c #6B7175", "/## c #6D7477", "(## c #5C5F64", "_## c #53565A", ":## c #393D41", "<## c #35363E", "[## c #404049", "}## c #757D7F", "|## c #94A3AC", "1## c #A7B3C9", "2## c #5F55AE", "3## c #311AA6", "4## c #1E04AC", "5## c #644FA8", "6## c #958EAD", "7## c #B8CDCF", "8## c #2A3135", "9## c #2C3438", "0## c #383A42", "a## c #171419", "b## c #504F53", "c## c #EFF3F1", "d## c #AAADB7", "e## c #DDDDE0", "f## c #E6E9E9", "g## c #D5DCDC", "h## c #B5C2C5", "i## c #B2C0C2", "j## c #A3ADA9", "k## c #979E94", "l## c #9AA297", "m## c #A9B1AA", "n## c #BBBFBD", "o## c #9B9A8C", "p## c #979687", "q## c #AEAFA9", "r## c #D0D1D4", "s## c #E9E9EB", "t## c #E4E7E9", "u## c #B4AEB0", "v## c #756366", "w## c #442C2F", "x## c #3D4044", "y## c #3D3C3F", "z## c #58565C", "A## c #686F72", "B## c #414446", "C## c #2D272F", "D## c #37353D", "E## c #A6A9B1", "F## c #D8DADD", "G## c #FBFBFA", "H## c #DEDEE0", "I## c #A0A1A8", "J## c #85898F", "K## c #7E8085", "L## c #494D4A", "M## c #484E4C", "N## c #5F666A", "O## c #93A0A5", "P## c #525960", "Q## c #50535E", "R## c #99A4A9", "S## c #A6B2C6", "T## c #5E57AB", "U## c #311CA3", "V## c #1F04A8", "W## c #301AA8", "X## c #5D549F", "Y## c #6C6E73", "Z## c #2C2F35", "`## c #343A3F", " $# c #383F45", ".$# c #2D2C37", "+$# c #292731", "@$# c #25232E", "#$# c #5F5F66", "$$# c #FAFBFA", "%$# c #E2E3E4", "&$# c #C2C4C7", "*$# c #E6E7E7", "=$# c #D2D6D7", "-$# c #B9CFD4", ";$# c #BED2D6", ">$# c #BAD0D5", ",$# c #BECFD1", "'$# c #C2CDCE", ")$# c #C5CACC", "!$# c #C1C3C6", "~$# c #A8AEB2", "{$# c #9BA6AA", "]$# c #909EA2", "^$# c #88969B", "/$# c #879397", "($# c #939998", "_$# c #9EA19F", ":$# c #AEB5B7", "<$# c #B7C4C6", "[$# c #AEBBBA", "}$# c #9DA5A0", "|$# c #91968E", "1$# c #A1ADA0", "2$# c #B0BDB0", "3$# c #BBC1B8", "4$# c #BFBAB6", "5$# c #B9A6A3", "6$# c #A69290", "7$# c #948889", "8$# c #959396", "9$# c #C8CCCC", "0$# c #EBEFEE", "a$# c #E4E6E6", "b$# c #726B70", "c$# c #40373E", "d$# c #464751", "e$# c #3C3D45", "f$# c #3E3E43", "g$# c #353434", "h$# c #373433", "i$# c #4B4546", "j$# c #6C696C", "k$# c #696C6E", "l$# c #454645", "m$# c #2D2B2A", "n$# c #322A32", "o$# c #2C212E", "p$# c #E6E7E8", "q$# c #E7E7E8", "r$# c #91969B", "s$# c #67696A", "t$# c #A0ACB8", "u$# c #AABEC8", "v$# c #A1B1B7", "w$# c #B9C9CA", "x$# c #A4ACC0", "y$# c #5D54A9", "z$# c #301CA3", "A$# c #1F05A9", "B$# c #1B01B0", "C$# c #311BA3", "D$# c #5C5695", "E$# c #8A9793", "F$# c #898F94", "G$# c #5F5F63", "H$# c #232025", "I$# c #34343A", "J$# c #393B41", "K$# c #393C41", "L$# c #2E2F37", "M$# c #26252F", "N$# c #23222D", "O$# c #292933", "P$# c #34343F", "Q$# c #717179", "R$# c #C2C2C6", "S$# c #D6D6D6", "T$# c #E0E2E1", "U$# c #CED3D4", "V$# c #AABEC1", "W$# c #A6B8BB", "X$# c #A5B5B8", "Y$# c #A7AEAE", "Z$# c #A9AFAC", "`$# c #A4A7A5", " %# c #91989A", ".%# c #818788", "+%# c #8A8B88", "@%# c #92918F", "#%# c #9B9B9B", "$%# c #A6A9AA", "%%# c #A5A19F", "&%# c #99948F", "*%# c #B4BBB1", "=%# c #C5D0C4", "-%# c #CCD1C8", ";%# c #CEC9C4", ">%# c #D9C5C5", ",%# c #BAA5A8", "'%# c #8C7F84", ")%# c #B7BBBB", "!%# c #E5EAE9", "~%# c #D8D9DA", "{%# c #3C3C44", "]%# c #3A3940", "^%# c #3F3C44", "/%# c #585455", "(%# c #434242", "_%# c #2F2C2D", ":%# c #302930", "<%# c #2C222E", "[%# c #2D222F", "}%# c #483E49", "|%# c #9E9CA1", "1%# c #EBEBEB", "2%# c #898E94", "3%# c #8F9AA5", "4%# c #B9C8CA", "5%# c #A3ACC1", "6%# c #5C54AA", "7%# c #1A00AB", "8%# c #331A9D", "9%# c #5F548E", "0%# c #8E928E", "a%# c #AAB7BA", "b%# c #4E4D52", "c%# c #36333A", "d%# c #222128", "e%# c #1E1E26", "f%# c #27282F", "g%# c #EAEAE8", "h%# c #DEDFDD", "i%# c #DFE2E1", "j%# c #E8ECEB", "k%# c #E2E4E4", "l%# c #C9D2D2", "m%# c #A0ABAA", "n%# c #949B9A", "o%# c #8B8F90", "p%# c #83868A", "q%# c #798187", "r%# c #848686", "s%# c #7E8D85", "t%# c #85958A", "u%# c #919C93", "v%# c #9AA09A", "w%# c #979C9B", "x%# c #979897", "y%# c #979796", "z%# c #9A9C9D", "A%# c #CBC4C6", "B%# c #CABCBE", "C%# c #B5A1A3", "D%# c #A79595", "E%# c #CBC9C5", "F%# c #E0E6E0", "G%# c #E6EAE5", "H%# c #E7E5E2", "I%# c #F4E9EA", "J%# c #D0C5C8", "K%# c #979296", "L%# c #77797C", "M%# c #EFEFF0", "N%# c #CCCDCE", "O%# c #383D43", "P%# c #3B3D42", "Q%# c #37363A", "R%# c #2F2D32", "S%# c #3E3943", "T%# c #433E47", "U%# c #393637", "V%# c #2E2C29", "W%# c #2E2C2A", "X%# c #454244", "Y%# c #8B8E91", "Z%# c #B1BBBE", "`%# c #58575A", " &# c #3E3B3E", ".&# c #2F2A2F", "+&# c #29232B", "@&# c #524854", "#&# c #B2B0B3", "$&# c #EAECEB", "%&# c #FCFEFD", "&&# c #EEECEC", "*&# c #A4AFC7", "=&# c #5D55AC", "-&# c #2104A8", ";&# c #35199A", ">&# c #614F8C", ",&# c #8F8B8E", "'&# c #AAB4BB", ")&# c #262527", "!&# c #201F24", "~&# c #292D32", "{&# c #97989B", "]&# c #D5D6D7", "^&# c #EFF2F0", "/&# c #E0E6E5", "(&# c #E3E8E7", "_&# c #F2F4F3", ":&# c #C5D0CF", "<&# c #B3BDC4", "[&# c #ABB9BA", "}&# c #A4AEAF", "|&# c #9B9D99", "1&# c #8F8C87", "2&# c #827D7C", "3&# c #717073", "4&# c #807E81", "5&# c #7C7C7C", "6&# c #72867C", "7&# c #7C9487", "8&# c #94A498", "9&# c #AAB0A8", "0&# c #AEB1B0", "a&# c #BDB9B8", "b&# c #ACB0B2", "c&# c #B8B7B9", "d&# c #E0D3D4", "e&# c #DEC8C9", "f&# c #C2A9AA", "g&# c #B19B9B", "h&# c #DCD5D5", "i&# c #F5F7F6", "j&# c #E4E5E6", "k&# c #D0CFD0", "l&# c #EEEEEF", "m&# c #363B40", "n&# c #38353D", "o&# c #3E3842", "p&# c #403942", "q&# c #383636", "r&# c #2B2B29", "s&# c #252525", "t&# c #353537", "u&# c #BAC3C7", "v&# c #757A80", "w&# c #4D4D51", "x&# c #363138", "y&# c #5E5761", "z&# c #CFCCCB", "A&# c #B1AFAF", "B&# c #A6B3CC", "C&# c #5D56AE", "D&# c #2204A8", "E&# c #32179C", "F&# c #584A92", "G&# c #838597", "H&# c #50575D", "I&# c #25262B", "J&# c #1E1D20", "K&# c #28252A", "L&# c #303138", "M&# c #27292F", "N&# c #1E2124", "O&# c #1F1E25", "P&# c #272730", "Q&# c #DFE0E0", "R&# c #F4F5F4", "S&# c #EFF0EF", "T&# c #F1F2F2", "U&# c #F1F1F0", "V&# c #D8DADB", "W&# c #C1C8C9", "X&# c #A1A8AB", "Y&# c #8D9196", "Z&# c #989C9D", "`&# c #90968B", " *# c #8B9183", ".*# c #8B9087", "+*# c #929491", "@*# c #A5A49D", "#*# c #AEADA6", "$*# c #AFB1AC", "%*# c #AFB3B3", "&*# c #C5C6C8", "**# c #CDD1D1", "=*# c #CAD2CF", "-*# c #CED6D1", ";*# c #D6DBD7", ">*# c #DEE0DD", ",*# c #E3E3E3", "'*# c #E1E5E5", ")*# c #E9E8E9", "!*# c #FBF6F8", "~*# c #E5DFDE", "{*# c #BDB8B3", "]*# c #A6A49D", "^*# c #D9D9D7", "/*# c #DDDEDF", "(*# c #A1A1A6", "_*# c #D2D3D4", ":*# c #F2F1F1", "<*# c #DDDCDD", "[*# c #393941", "}*# c #38353B", "|*# c #38363B", "1*# c #373439", "2*# c #363533", "3*# c #2C2B29", "4*# c #636467", "5*# c #CDD3D7", "6*# c #BFCBD0", "7*# c #C1CDCD", "8*# c #717B81", "9*# c #302E31", "0*# c #322E32", "a*# c #353237", "b*# c #EEF1F1", "c*# c #D7D7D7", "d*# c #ACB5BE", "e*# c #A6B3C9", "f*# c #5D56AC", "g*# c #2204A9", "h*# c #2F169F", "i*# c #534797", "j*# c #7C819C", "k*# c #A5B1C1", "l*# c #40484D", "m*# c #191C1F", "n*# c #19181C", "o*# c #28282E", "p*# c #23252A", "q*# c #1E2024", "r*# c #1C1C21", "s*# c #1D1C24", "t*# c #272630", "u*# c #83858A", "v*# c #E8E9E9", "w*# c #ADBEC0", "x*# c #B0BBBD", "y*# c #ADB2B2", "z*# c #8D8E90", "A*# c #9B9B9E", "B*# c #A7A8A7", "C*# c #A0A395", "D*# c #9C9F8E", "E*# c #A0A095", "F*# c #AAA8A4", "G*# c #D0D1CB", "H*# c #D6DAD7", "I*# c #DCE2E0", "J*# c #E8EAEA", "K*# c #E7E9E7", "L*# c #BBC1BB", "M*# c #A3A9A2", "N*# c #D8DBD8", "O*# c #DCDCDC", "P*# c #8A8C8A", "Q*# c #F6F5F4", "R*# c #E8E7E7", "S*# c #737177", "T*# c #35343A", "U*# c #343330", "V*# c #272627", "W*# c #868588", "X*# c #E0E1E3", "Y*# c #CCD5D8", "Z*# c #C0CDD1", "`*# c #BECDD1", " =# c #C0CFD3", ".=# c #C7D3D8", "+=# c #CCD7DE", "@=# c #CFD9DE", "#=# c #D3DBDC", "$=# c #D3DAD9", "%=# c #C4D1D4", "&=# c #A5B5B7", "*=# c #677074", "==# c #424549", "-=# c #818486", ";=# c #F3F6F6", ">=# c #E5E5E5", ",=# c #CECECF", "'=# c #A9AEB3", ")=# c #BCCDCF", "!=# c #A7B2C7", "~=# c #301BA3", "{=# c #2104A9", "]=# c #2E15A3", "^=# c #51469A", "/=# c #A7B2C1", "(=# c #394045", "_=# c #171B1F", ":=# c #19191D", "<=# c #1E1D23", "[=# c #1A1920", "}=# c #212027", "|=# c #CBCDCD", "1=# c #EBEBEA", "2=# c #D3D2CE", "3=# c #BDBDB9", "4=# c #AEB7B9", "5=# c #A5B1AF", "6=# c #9FABA6", "7=# c #A5AEA8", "8=# c #AEB0AB", "9=# c #B6B4B0", "0=# c #CBCBCC", "a=# c #D4D4D3", "b=# c #D2D3CB", "c=# c #D1D1C8", "d=# c #D3D2CC", "e=# c #D9D7D5", "f=# c #E5E4E1", "g=# c #F1F3F2", "h=# c #F5F8F7", "i=# c #E7E9E8", "j=# c #A6ABA9", "k=# c #DADCDB", "l=# c #F9F9F8", "m=# c #E8E8E5", "n=# c #929589", "o=# c #8C8F83", "p=# c #EBE9E9", "q=# c #B8B6B9", "r=# c #37363C", "s=# c #312C2D", "t=# c #33312E", "u=# c #2F2E2C", "v=# c #413D3F", "w=# c #797576", "x=# c #F2F1F2", "y=# c #E1E5E6", "z=# c #D7DDDE", "A=# c #D8DFE0", "B=# c #DAE1E2", "C=# c #D6DDDE", "D=# c #D8DEE0", "E=# c #DEE3E5", "F=# c #E5E9EB", "G=# c #E4EBEE", "H=# c #E6EDF0", "I=# c #E8EEEF", "J=# c #E6ECEB", "K=# c #D4DBDD", "L=# c #D0D8DA", "M=# c #CDD6D7", "N=# c #C8D3D4", "O=# c #C2CECD", "P=# c #B5C2BD", "Q=# c #98A39D", "R=# c #595E5C", "S=# c #333034", "T=# c #3E3A40", "U=# c #636266", "V=# c #999B9B", "W=# c #DDDDDD", "X=# c #A3A5A8", "Y=# c #BACED1", "Z=# c #A9B2C7", "`=# c #5E56AC", " -# c #2C15A6", ".-# c #51459A", "+-# c #7E829B", "@-# c #717C84", "#-# c #3A4046", "$-# c #1F1F22", "%-# c #19171C", "&-# c #1B191D", "*-# c #D5D7D8", "=-# c #ECECEA", "--# c #D4D4CE", ";-# c #BFBEB7", ">-# c #BCB9B9", ",-# c #ACAEAA", "'-# c #A3AAA0", ")-# c #AAB0A6", "!-# c #BBBDB5", "~-# c #D1CFC9", "{-# c #E6E6E4", "]-# c #DCDDDD", "^-# c #A6A898", "/-# c #9B9E8C", "(-# c #BDBEB6", "_-# c #F9F8FA", ":-# c #ECEAEB", "<-# c #75747A", "[-# c #323236", "}-# c #3A3A3C", "|-# c #34312F", "1-# c #31312F", "2-# c #2D2D2D", "3-# c #332D2E", "4-# c #6B6666", "5-# c #F5F4F4", "6-# c #F4F4F2", "7-# c #EFEEEE", "8-# c #E6E9E8", "9-# c #E0E6E4", "0-# c #DCE2E2", "a-# c #CCD3D0", "b-# c #AFB6AF", "c-# c #868C83", "d-# c #302D2C", "e-# c #2C252D", "f-# c #423D43", "g-# c #747276", "h-# c #BDCED0", "i-# c #AAB3C7", "j-# c #6058AB", "k-# c #331DA1", "l-# c #7D829A", "m-# c #A8B3BD", "n-# c #BBCED1", "o-# c #8B999F", "p-# c #212327", "q-# c #201C1F", "r-# c #1B171A", "s-# c #1F1C21", "t-# c #DADAD8", "u-# c #C8C4C3", "v-# c #D0C2C4", "w-# c #D6C9CA", "x-# c #D9D3D3", "y-# c #D9DCD9", "z-# c #DADDDA", "A-# c #DDDFDC", "B-# c #EBEBE9", "C-# c #E6E8E6", "D-# c #BCC0BC", "E-# c #A5ABA4", "F-# c #DADCDA", "G-# c #EEEEEC", "H-# c #ACADA8", "I-# c #B4B6B5", "J-# c #CDCED1", "K-# c #F6F9F9", "L-# c #3D4248", "M-# c #363638", "N-# c #393D40", "O-# c #363435", "P-# c #201E1F", "Q-# c #585657", "R-# c #F5F8F6", "S-# c #DAE0DF", "T-# c #A7ACAB", "U-# c #6F7170", "V-# c #3C3C3C", "W-# c #2A252B", "X-# c #2D272E", "Y-# c #4D464E", "Z-# c #88818A", "`-# c #C6C0C9", " ;# c #EFEDEF", ".;# c #A3A8AB", "+;# c #9CADB4", "@;# c #A9B5C7", "#;# c #6A5DA3", "$;# c #3D219A", "%;# c #2706A5", "&;# c #1900B0", "*;# c #849096", "=;# c #403F46", "-;# c #1F2124", ";;# c #211E1F", ">;# c #1C171A", ",;# c #201C21", "';# c #D8D4D5", ");# c #E2D4D5", "!;# c #ECDEDF", "~;# c #E5E7E5", "{;# c #A2A8A0", "];# c #CDCFD0", "^;# c #42474C", "/;# c #3A3B3E", "(;# c #393C40", "_;# c #3A393B", ":;# c #363333", "<;# c #373636", "[;# c #19171A", "};# c #4F4E50", "|;# c #E2E4E5", "1;# c #A6A8AA", "2;# c #646367", "3;# c #38373A", "4;# c #2A242B", "5;# c #938C95", "6;# c #D5CFD8", "7;# c #F3F1F4", "8;# c #A8B6C8", "9;# c #6A64B3", "0;# c #3F29AA", "a;# c #280BAA", "b;# c #7E8A90", "c;# c #585F64", "d;# c #35333A", "e;# c #1D191C", "f;# c #1E1B1F", "g;# c #EBECEC", "h;# c #EEEDEE", "i;# c #E9E7E8", "j;# c #F6EFF0", "k;# c #FCF9FA", "l;# c #E4E6E5", "m;# c #B7BAB8", "n;# c #9FA3A0", "o;# c #F3F5F6", "p;# c #A2A2A0", "q;# c #424348", "r;# c #3D3D42", "s;# c #393437", "t;# c #322C2C", "u;# c #353231", "v;# c #333332", "w;# c #2F2F30", "x;# c #181719", "y;# c #615E63", "z;# c #2A242C", "A;# c #271F28", "B;# c #99949B", "C;# c #DFDDE2", "D;# c #ADAFB0", "E;# c #959CA0", "F;# c #9FABAF", "G;# c #B9CBCC", "H;# c #B9CBC9", "I;# c #A5B4C8", "J;# c #6569CD", "K;# c #3B31C4", "L;# c #2710B3", "M;# c #2200A7", "N;# c #3D3B43", "O;# c #262326", "P;# c #1E1C21", "Q;# c #99999C", "R;# c #DCDCDE", "S;# c #CCCBCC", "T;# c #888889", "U;# c #45444C", "V;# c #383237", "W;# c #30282A", "X;# c #31312E", "Y;# c #2C2C2B", "Z;# c #272628", "`;# c #19181A", " ># c #E2E1E2", ".># c #373738", "+># c #2C252E", "@># c #251C27", "#># c #514C52", "$># c #E9EBEC", "%># c #B7C2C9", "&># c #AFBABE", "*># c #B9CBCA", "=># c #B9C9C7", "-># c #A4B2C8", ";># c #616BDA", ">># c #3634D1", ",># c #2613B8", "'># c #2C15A8", ")># c #51459B", "!># c #7D829B", "~># c #3B3B46", "{># c #292529", "]># c #231F20", "^># c #252223", "/># c #22262A", "(># c #F7F6F6", "_># c #86888B", ":># c #DCDDDE", "<># c #A3A8A9", "[># c #858C8D", "}># c #D0D2D3", "|># c #EFEDED", "1># c #3B3B43", "2># c #373539", "3># c #2D292B", "4># c #312F2B", "5># c #2A2823", "6># c #161416", "7># c #DADCDD", "8># c #47474D", "9># c #2E2D31", "0># c #29212C", "a># c #5B565E", "b># c #B8BEBE", "c># c #A7B3C7", "d># c #6864B8", "e># c #3E2BAF", "f># c #280CAA", "g># c #2100AC", "h># c #2C14A9", "i># c #A3B4BE", "j># c #2B2B36", "k># c #292831", "l># c #241F23", "m># c #231F1C", "n># c #292B31", "o># c #4B4B51", "p># c #D2D2D3", "q># c #DDDFE0", "r># c #80888C", "s># c #E5E3E3", "t># c #83888C", "u># c #4F575E", "v># c #34383E", "w># c #2A2A30", "x># c #29272E", "y># c #312F32", "z># c #323130", "A># c #2A2724", "B># c #22201C", "C># c #1A1819", "D># c #CFD0D2", "E># c #D6D7D9", "F># c #85868C", "G># c #332C36", "H># c #332A36", "I># c #68646C", "J># c #C4CBCD", "K># c #ABB4B9", "L># c #A7B1B7", "M># c #6B5FA6", "N># c #40249B", "O># c #2808A3", "P># c #24272E", "Q># c #26262E", "R># c #27242B", "S># c #221B1E", "T># c #242020", "U># c #2E3134", "V># c #2E3136", "W># c #C0C4C6", "X># c #DDDEDE", "Y># c #CECDCF", "Z># c #DEDFE1", "`># c #A5A9AC", " ,# c #CED0D2", ".,# c #DCDADA", "+,# c #7F8589", "@,# c #4F585F", "#,# c #2C2A29", "$,# c #262524", "%,# c #211F21", "&,# c #7F8082", "*,# c #ECEDED", "=,# c #D5D4D7", "-,# c #827F86", ";,# c #36313A", ">,# c #2C262E", ",,# c #362D39", "',# c #75717A", "),# c #D5D8DD", "!,# c #B3B7BD", "~,# c #989DA3", "{,# c #B9CDD0", "],# c #B7D0D2", "^,# c #A5B8CA", "/,# c #6B5FA4", "(,# c #402399", "_,# c #2707A3", ":,# c #2E2F35", "<,# c #272329", "[,# c #221D22", "},# c #2B2B31", "|,# c #302F36", "1,# c #383B3E", "2,# c #C3C9CB", "3,# c #F7FAFB", "4,# c #EEF2F2", "5,# c #D5D4D5", "6,# c #D8D5D6", "7,# c #D8D7D8", "8,# c #989597", "9,# c #797578", "0,# c #E0E1E2", "a,# c #ACADB1", "b,# c #7B7F83", "c,# c #363D43", "d,# c #2E3337", "e,# c #2D2C2D", "f,# c #444344", "g,# c #777879", "h,# c #B2B4B5", "i,# c #D5D3D6", "j,# c #2D262D", "k,# c #392E3A", "l,# c #4B424E", "m,# c #807E85", "n,# c #C6C8CA", "o,# c #E5E4EA", "p,# c #BDBCC3", "q,# c #909095", "r,# c #83898F", "s,# c #B3B9C4", "t,# c #A5B9CD", "u,# c #6E65AA", "v,# c #42299E", "w,# c #280AA6", "x,# c #1A00B3", "y,# c #2D15A6", "z,# c #52469A", "A,# c #ABBAC6", "B,# c #8E98A5", "C,# c #666D77", "D,# c #454951", "E,# c #484C52", "F,# c #3E4247", "G,# c #2C2E33", "H,# c #CED4D6", "I,# c #D1D0D1", "J,# c #D6D4D4", "K,# c #EBEAEA", "L,# c #929295", "M,# c #E2E6E8", "N,# c #B7BBC2", "O,# c #9EA0A1", "P,# c #3C3F45", "Q,# c #3F3E41", "R,# c #333231", "S,# c #2E2D2E", "T,# c #292325", "U,# c #6F6C6A", "V,# c #A7A8A5", "W,# c #D7D6D8", "X,# c #858288", "Y,# c #2A2327", "Z,# c #393034", "`,# c #8A878B", " '# c #CECDCE", ".'# c #A4A3A7", "+'# c #8C8B8F", "@'# c #AEB0B4", "#'# c #A6A9AD", "$'# c #95989E", "%'# c #AEBACC", "&'# c #7A75AE", "*'# c #4C3AA3", "='# c #2C13A9", "-'# c #A4B3BF", ";'# c #8C97A4", ">'# c #6D737F", ",'# c #535660", "''# c #4D535A", ")'# c #3E454A", "!'# c #2A2F34", "~'# c #32333A", "{'# c #19181F", "]'# c #DFE3E4", "^'# c #D7D6D7", "/'# c #D4D5D5", "('# c #E6E9EB", "_'# c #C0C4CA", ":'# c #ACAEB6", "<'# c #6C6E70", "['# c #2E2D2C", "}'# c #33322F", "|'# c #31302F", "1'# c #272124", "2'# c #3D3738", "3'# c #696664", "4'# c #A2A29E", "5'# c #E2E2E1", "6'# c #D8D8DA", "7'# c #87878D", "8'# c #28272D", "9'# c #2A2227", "0'# c #393035", "a'# c #544E52", "b'# c #CFCFD0", "c'# c #D7D7D8", "d'# c #AFBCCC", "e'# c #807EAD", "f'# c #5243A2", "g'# c #2F18A7", "h'# c #A4B1C0", "i'# c #32393E", "j'# c #242A2E", "k'# c #1D2024", "l'# c #26282D", "m'# c #14131A", "n'# c #3D3C42", "o'# c #D9D9DA", "p'# c #DADADC", "q'# c #EBECEB", "r'# c #D0D1D2", "s'# c #65666D", "t'# c #D6D5D4", "u'# c #B3B1B4", "v'# c #D3D2D3", "w'# c #EDEDED", "x'# c #B2B3B6", "y'# c #646668", "z'# c #515254", "A'# c #46464A", "B'# c #2B2A2B", "C'# c #302F2E", "D'# c #231F23", "E'# c #696868", "F'# c #A3A4A3", "G'# c #E3E3E2", "H'# c #D8D9DB", "I'# c #888990", "J'# c #393942", "K'# c #2A2A2F", "L'# c #272328", "M'# c #2B232A", "N'# c #3A3039", "O'# c #554F53", "P'# c #F5F4F5", "Q'# c #D8D9D7", "R'# c #B2B7B2", "S'# c #A2A8A3", "T'# c #DDDEDC", "U'# c #CECFCF", "V'# c #BFC0C7", "W'# c #AFB2BA", "X'# c #A2A7AD", "Y'# c #9EA6A9", "Z'# c #AABDCD", "`'# c #7F7FAE", " )# c #5344A1", ".)# c #2F19A5", "+)# c #1900AD", "@)# c #A5B1BF", "#)# c #34393F", "$)# c #252B2E", "%)# c #1E2326", "&)# c #1C2125", "*)# c #1A1F23", "=)# c #212228", "-)# c #5C5B60", ";)# c #F6F5F5", ">)# c #EAE9EA", ",)# c #E4E5E5", "')# c #EFF1F0", "))# c #F4F3F5", "!)# c #897F89", "~)# c #625461", "{)# c #877E81", "])# c #B4B0AE", "^)# c #DCDBD9", "/)# c #ECEBEB", "()# c #CAC8C7", "_)# c #A6A7AA", ":)# c #76777B", "<)# c #2B2929", "[)# c #3A3A3D", "})# c #707173", "|)# c #D9D8DB", "1)# c #898890", "2)# c #2C2D30", "3)# c #29262A", "4)# c #3B303C", "5)# c #554F55", "6)# c #D4D6D4", "7)# c #B0B5AF", "8)# c #A3AAA1", "9)# c #E1E4E0", "0)# c #E4E4EA", "a)# c #C9C7CE", "b)# c #AEADB1", "c)# c #A9B3B6", "d)# c #A5BCCE", "e)# c #777BB7", "f)# c #4D40AA", "g)# c #2D16A8", "h)# c #212324", "i)# c #1A1D1F", "j)# c #171C20", "k)# c #13191C", "l)# c #212528", "m)# c #949598", "n)# c #D0D3D4", "o)# c #DEDDDE", "p)# c #D3D4D5", "q)# c #D6D4DF", "r)# c #AC98AD", "s)# c #7F5572", "t)# c #602C48", "u)# c #644A51", "v)# c #8F8985", "w)# c #CDCECA", "x)# c #EBEBED", "y)# c #C7C8CD", "z)# c #EDEDEE", "A)# c #6E6C70", "B)# c #55545A", "C)# c #4A494F", "D)# c #31302B", "E)# c #151517", "F)# c #D8D6D9", "G)# c #87828B", "H)# c #2A2629", "I)# c #3B3138", "J)# c #CBCFD0", "K)# c #ECEFEF", "L)# c #CCD1CF", "M)# c #A8ADAB", "N)# c #9DA19F", "O)# c #DBDCDB", "P)# c #F7F7F9", "Q)# c #B0B5BC", "R)# c #A9B8D2", "S)# c #6771D6", "T)# c #3A37CD", "U)# c #2511BB", "V)# c #52479A", "W)# c #7E8399", "X)# c #3E3C46", "Y)# c #2C2E30", "Z)# c #25292C", "`)# c #1E2226", " !# c #161A1E", ".!# c #191D21", "+!# c #363A3D", "@!# c #C5C8C9", "#!# c #EAEDEE", "$!# c #CFCDCD", "%!# c #DEDDDD", "&!# c #C8C9CB", "*!# c #CBCCCE", "=!# c #B5B5BF", "-!# c #927288", ";!# c #833658", ">!# c #7D1437", ",!# c #6F2533", "'!# c #865F60", ")!# c #B5AAA6", "!!# c #E4E8E6", "~!# c #E6E7EA", "{!# c #BBBEC6", "]!# c #D8D9DD", "^!# c #989697", "/!# c #646165", "(!# c #3C3B3D", "_!# c #353436", ":!# c #2E2E2F", "~# c #A7B0BD", ",~# c #404148", "'~# c #292D30", ")~# c #2B2E32", "!~# c #D9DDDE", "~~# c #D6D6D7", "{~# c #E3E1E0", "]~# c #DFDFE0", "^~# c #D8D7D7", "/~# c #877976", "(~# c #7E383E", "_~# c #A8162B", ":~# c #D5092B", "<~# c #C90526", "[~# c #AF1830", "}~# c #963E49", "|~# c #8F7071", "1~# c #B3A7AD", "2~# c #E5EAEE", "3~# c #F2F9F9", "4~# c #9B9DA4", "5~# c #DADDDB", "6~# c #7E8081", "7~# c #403F42", "8~# c #413F43", "9~# c #38363C", "0~# c #32312E", "a~# c #3D3739", "b~# c #777272", "c~# c #39393D", "d~# c #201B1F", "e~# c #2B252A", "f~# c #4A454A", "g~# c #888588", "h~# c #CECCCE", "i~# c #949495", "j~# c #818587", "k~# c #7E7CAA", "l~# c #5243A3", "m~# c #2E18AE", "n~# c #290FAA", "o~# c #4836A5", "p~# c #716DA7", "q~# c #A1ABC1", "r~# c #363C41", "s~# c #6A757C", "t~# c #545557", "u~# c #33383C", "v~# c #8D9092", "w~# c #D4D3D4", "x~# c #EBECEE", "y~# c #C5C6CC", "z~# c #ABAEB5", "A~# c #C8CACA", "B~# c #E5E6E4", "C~# c #F5F5F3", "D~# c #F3FAFB", "E~# c #D4E1E2", "F~# c #AFB1B4", "G~# c #8E5C60", "H~# c #972532", "I~# c #BB0D27", "J~# c #DC062A", "K~# c #D90428", "L~# c #C80B2A", "M~# c #B11B32", "N~# c #983443", "O~# c #835B60", "P~# c #8F8D8D", "Q~# c #B1BFBF", "R~# c #D8E6EA", "S~# c #F3F9FF", "T~# c #D1D2DA", "U~# c #97979E", "V~# c #312F36", "W~# c #2C2C30", "X~# c #2F2A30", "Y~# c #6E6D71", "Z~# c #D4D5D8", "`~# c #D1CECE", " {# c #DEDEDD", ".{# c #A6ABA4", "+{# c #989D97", "@{# c #A6AAA9", "#{# c #B4C5D2", "${# c #A5B1CB", "%{# c #7C79A9", "&{# c #5342A1", "*{# c #3117AD", "={# c #2A0FA6", "-{# c #47359D", ";{# c #6E6B9D", ">{# c #9FA8BC", ",{# c #22242A", "'{# c #333B40", "){# c #5D6870", "!{# c #677078", "~{# c #595D62", "{{# c #B0B2B8", "]{# c #D5D8D9", "^{# c #BFBBBA", "/{# c #BFBBBB", "({# c #DFDDDD", "_{# c #82767A", ":{# c #973B47", "<{# c #B3172D", "[{# c #CE0726", "}{# c #CA0728", "|{# c #AF122C", "1{# c #802B34", "2{# c #7E5256", "3{# c #9B7F85", "4{# c #BDA6AF", "5{# c #ACA9B0", "6{# c #8D8F94", "7{# c #878B8E", "8{# c #29292A", "9{# c #302F2D", "0{# c #26252A", "a{# c #A9ABAE", "b{# c #312B33", "c{# c #27252D", "d{# c #C0C2C0", "e{# c #AFB2B0", "f{# c #D6D4D6", "g{# c #DDDEDD", "h{# c #ACB2AB", "i{# c #A5AAA3", "j{# c #B7B8B7", "k{# c #9C9BA3", "l{# c #92969F", "m{# c #B5C4D3", "n{# c #A5B0CF", "o{# c #7A7BB9", "p{# c #5144B0", "q{# c #3119B3", "r{# c #2C129E", "s{# c #4A3D8C", "t{# c #9DABAF", "u{# c #2C2930", "v{# c #26292E", "w{# c #2E363A", "x{# c #464C56", "y{# c #454852", "z{# c #6C6F72", "A{# c #A9ACAF", "B{# c #DEE0E2", "C{# c #ADAFB2", "D{# c #E6E6E5", "E{# c #B5B9B7", "F{# c #7C7A7A", "G{# c #613E44", "H{# c #9E2033", "I{# c #C90E2B", "J{# c #DC0027", "K{# c #CA0426", "L{# c #9F1328", "M{# c #962637", "N{# c #A33B4D", "O{# c #AA4F61", "P{# c #885D66", "Q{# c #796E72", "R{# c #83878A", "S{# c #DFE2E3", "T{# c #DEDEDE", "U{# c #7A7A7D", "V{# c #3D3C41", "W{# c #282829", "X{# c #302F2C", "Y{# c #404043", "Z{# c #919597", "`{# c #CDD2D3", " ]# c #F0F2F3", ".]# c #29252A", "+]# c #221F29", "@]# c #48494F", "#]# c #AFB2A6", "$]# c #9B9F94", "%]# c #AEB1AC", "&]# c #D2D1D5", "*]# c #A9ACAA", "=]# c #A8ABA9", "-]# c #C8C8C7", ";]# c #DFDCDE", ">]# c #B4B2B7", ",]# c #9EA1A8", "']# c #A8B5D2", ")]# c #7881CD", "!]# c #4E49C5", "~]# c #301BBB", "{]# c #2E1595", "]]# c #4C4281", "^]# c #859195", "/]# c #697277", "(]# c #565B63", "_]# c #484953", ":]# c #3E3941", "<]# c #2D2F33", "[]# c #2C3237", "}]# c #3B3C47", "|]# c #23252D", "1]# c #2F3337", "2]# c #898B8E", "3]# c #BCBDC0", "4]# c #CECECD", "5]# c #BFBCBA", "6]# c #736968", "7]# c #5D2E34", "8]# c #A21831", "9]# c #CF0B30", "0]# c #DF042D", "a]# c #E7012A", "b]# c #C80A2A", "c]# c #BF0A28", "d]# c #BB0725", "e]# c #A80821", "f]# c #5E101A", "g]# c #553F40", "h]# c #818686", "i]# c #BFCBCD", "j]# c #DFDFDF", "k]# c #2C2B2B", "l]# c #4E4E4D", "m]# c #B2B6B5", "n]# c #EDF1F1", "o]# c #919196", "p]# c #2E2C32", "q]# c #2D252F", "r]# c #322935", "s]# c #231F28", "t]# c #403E45", "u]# c #7C7D81", "v]# c #E4E4E1", "w]# c #999988", "x]# c #878776", "y]# c #A4A59E", "z]# c #D2D3D6", "A]# c #F1F1F3", "B]# c #D6D5D7", "C]# c #B6B9BC", "D]# c #A2AAB0", "E]# c #AABBD2", "F]# c #4E4BCE", "G]# c #2F1CBD", "H]# c #1F009F", "I]# c #2C1195", "J]# c #483894", "K]# c #6E6B9F", "L]# c #9FA8C0", "M]# c #879498", "N]# c #50585E", "O]# c #3A4047", "P]# c #2A2829", "Q]# c #222223", "R]# c #2D2F32", "S]# c #5A5B67", "T]# c #474953", "U]# c #464951", "V]# c #96999E", "W]# c #B9BBBD", "X]# c #BABBB8", "Y]# c #BBBBB6", "Z]# c #E9E9E7", "`]# c #CED0D0", " ^# c #9C9DA0", ".^# c #ECEEEE", "+^# c #DFDEDD", "@^# c #F3F7F7", "#^# c #D7DAD9", "$^# c #987F86", "%^# c #9F3456", "&^# c #B10E3A", "*^# c #C6062F", "=^# c #D8092D", "-^# c #E6012A", ";^# c #EA022B", ">^# c #E9042C", ",^# c #E0032B", "'^# c #E10128", ")^# c #DF0025", "!^# c #C90223", "~^# c #780B1D", "{^# c #6C4249", "]^# c #969293", "^^# c #D1DDDB", "/^# c #6E6E6C", "(^# c #32302F", "_^# c #272223", ":^# c #2E2E2E", "<^# c #3B3C36", "[^# c #65675D", "}^# c #C4C6C3", "|^# c #E0E0E2", "1^# c #9E9EA3", "2^# c #2B2830", "3^# c #2E2A33", "4^# c #3D3B3F", "5^# c #737376", "6^# c #EEF5F4", "7^# c #CED0CE", "8^# c #776863", "9^# c #715F5B", "0^# c #A79E9D", "a^# c #E8E9EB", "b^# c #DCDDDC", "c^# c #A7ABA6", "d^# c #ACB0AB", "e^# c #D6D9D6", "f^# c #D5D9DB", "g^# c #A7BDCF", "h^# c #7980BD", "i^# c #5045B2", "j^# c #3218AE", "k^# c #1E00A2", "l^# c #2C1098", "m^# c #483796", "n^# c #6E6AA0", "o^# c #9FA8C1", "p^# c #5E676B", "q^# c #4A4F55", "r^# c #3B4146", "s^# c #353D40", "t^# c #454846", "u^# c #4D4D4B", "v^# c #545353", "w^# c #646466", "x^# c #A2A1A1", "y^# c #91908E", "z^# c #8F8E8B", "A^# c #DCDCDB", "B^# c #E8EDED", "C^# c #E0E9E8", "D^# c #D6DAD9", "E^# c #A6A8A8", "F^# c #DDDCDC", "G^# c #E4EAE8", "H^# c #CBC2C7", "I^# c #AD6F8A", "J^# c #A9365A", "K^# c #B9183B", "L^# c #CE0A2B", "M^# c #E2042A", "N^# c #DE072A", "O^# c #D80A2A", "P^# c #D80729", "Q^# c #E00327", "R^# c #E40226", "S^# c #880C22", "T^# c #7D4550", "U^# c #A69A9D", "V^# c #DBE6E4", "W^# c #6B6B69", "X^# c #262021", "Y^# c #332F2E", "Z^# c #56574F", "`^# c #8B8B81", " /# c #D9D8D4", "./# c #313036", "+/# c #666769", "@/# c #D7DFDE", "#/# c #ABAEAD", "$/# c #574447", "%/# c #5F4A4D", "&/# c #A89E9F", "*/# c #A9AFA6", "=/# c #ADB4AB", "-/# c #D7DAD6", ";/# c #EBEEEF", ">/# c #CBCECF", ",/# c #AEB0B3", "'/# c #A6BDCC", ")/# c #7B7DAE", "!/# c #5142A5", "~/# c #2F18AD", "{/# c #2B129D", "]/# c #4A3C8D", "^/# c #72738B", "//# c #A1A7B6", "(/# c #373A3E", "_/# c #464C50", ":/# c #828988", "(# c #694244", ",(# c #7E5758", "'(# c #7D5F62", ")(# c #6F5F66", "!(# c #74717A", "~(# c #DBDDDB", "{(# c #DBDBDB", "](# c #D2D1D3", "^(# c #E3E4E5", "/(# c #E1E4E6", "((# c #E0E2E3", "_(# c #E7E6E7", ":(# c #E2E5E6", "<(# c #DBDEDC", "[(# c #CFD0CF", "}(# c #A6A6AB", "|(# c #8D8589", "1(# c #8A767A", "2(# c #5F3339", "3(# c #572F34", "4(# c #705E62", "5(# c #D3D7D9", "6(# c #EFF1F3", "7(# c #F4F9F9", "8(# c #DBDFDD", "9(# c #B8C7C2", "0(# c #A58D8F", "a(# c #A34553", "b(# c #AB0B26", "c(# c #B80A2B", "d(# c #B31634", "e(# c #A2253A", "f(# c #91313F", "g(# c #8F323F", "h(# c #962A3A", "i(# c #9C1E33", "j(# c #97162D", "k(# c #6D1426", "l(# c #784652", "m(# c #A9989E", "n(# c #EFF6F6", "o(# c #F8FDFC", "p(# c #676667", "q(# c #252526", "r(# c #30292C", "s(# c #2F282B", "t(# c #2A262A", "u(# c #2F272A", "v(# c #2F2A2C", "w(# c #413F40", "x(# c #7E7B7B", "y(# c #DBDCDC", "z(# c #EAEDED", "A(# c #EFF2F2", "B(# c #E2E4E6", "C(# c #E3E7EB", "D(# c #E4E8EC", "E(# c #E4E6E9", "F(# c #EAEBEA", "G(# c #EFF1F1", "H(# c #F4F8F8", "I(# c #F2F3F4", "J(# c #28272E", "K(# c #232229", "L(# c #2D2D2F", "M(# c #DDDDDE", "N(# c #2D2931", "O(# c #535056", "P(# c #FDFFFD", "Q(# c #A7ADA6", "R(# c #D6D9D5", "S(# c #ACB2B8", "T(# c #7E7BAB", "U(# c #4E44A9", "V(# c #261BBA", "W(# c #0F02C8", "X(# c #1A00BA", "Y(# c #47369C", "Z(# c #6F6D98", "`(# c #9FA8BA", " _# c #97A39F", "._# c #909B91", "+_# c #A6A9A6", "@_# c #DADDDD", "#_# c #EAEDEA", "$_# c #C0B2B3", "%_# c #8E616B", "&_# c #692132", "*_# c #712133", "=_# c #814451", "-_# c #8F7279", ";_# c #86858A", ">_# c #77727A", ",_# c #69636C", "'_# c #5F5961", ")_# c #6B6870", "!_# c #797982", "~_# c #79777F", "{_# c #78747C", "]_# c #797B80", "^_# c #757779", "/_# c #6B6C71", "(_# c #4A5153", "__# c #524446", ":_# c #784247", "<_# c #9F3B46", "[_# c #A8182D", "}_# c #921C31", "|_# c #72424F", "1_# c #62767C", "2_# c #8FA7AD", "3_# c #CDD5DD", "4_# c #DADBE1", "5_# c #D5DCE0", "6_# c #D0D9DB", "7_# c #CAD0D1", "8_# c #BCBEC1", "9_# c #EFF1F2", "0_# c #A6A6A6", "a_# c #929293", "b_# c #6D5A5F", "c_# c #793642", "d_# c #83192F", "e_# c #720F31", "f_# c #6F2045", "g_# c #743E5F", "h_# c #775874", "i_# c #6A5971", "j_# c #5F4C61", "k_# c #55394A", "l_# c #4C2937", "m_# c #3D202F", "n_# c #5B4954", "o_# c #D5D9D6", "p_# c #F6F6F5", "q_# c #D3D3D0", "r_# c #515050", "s_# c #262727", "t_# c #2E302D", "u_# c #2B282C", "v_# c #31292C", "w_# c #282324", "x_# c #3C3737", "y_# c #878B8B", "z_# c #9EACAD", "A_# c #B0C0C2", "B_# c #BEC9CC", "C_# c #C6CCCE", "D_# c #B2B8BA", "E_# c #949B9F", "F_# c #8E8EA5", "G_# c #9190A7", "H_# c #8B8E9B", "I_# c #8B9192", "J_# c #A3A4A0", "K_# c #DFDFE5", "L_# c #ACACB4", "M_# c #262828", "N_# c #2B3130", "O_# c #4D5955", "P_# c #B7C3C1", "Q_# c #F1F9F8", "R_# c #C7C7CA", "S_# c #7D7C7F", "T_# c #2B2A33", "U_# c #5E5E66", "V_# c #B4B4B8", "W_# c #FDFEFF", "X_# c #EEF4F2", "Y_# c #D9DEDB", "Z_# c #A4A8A6", "`_# c #D5D6D5", " :# c #CFD2D4", ".:# c #B7BBBF", "+:# c #ADB1B5", "@:# c #ABBBC8", "#:# c #7D7BA9", "$:# c #5142A2", "%:# c #2E18AD", "&:# c #1D00BA", "*:# c #290DAD", "=:# c #4531A8", "-:# c #6D66AB", ";:# c #9EA9C2", ">:# c #C4CED2", ",:# c #C5D1CB", "':# c #CBD6CB", "):# c #E2E7E2", "!:# c #F8F6F7", "~:# c #E6EAEA", "{:# c #8E7C80", "]:# c #813E4D", "^:# c #7B1029", "/:# c #6F0621", "(:# c #83394C", "_:# c #A6868E", "::# c #746F78", "<:# c #665F69", "[:# c #5D5760", "}:# c #57555C", "|:# c #615D65", "1:# c #6B666F", "2:# c #65636E", "3:# c #625D68", "4:# c #656667", "5:# c #4E4E4F", "6:# c #555556", "7:# c #6C6D6F", "8:# c #566262", "9:# c #5A4549", "0:# c #7D2C3A", "a:# c #A91831", "b:# c #CC0C2C", "c:# c #B91431", "d:# c #872B3F", "e:# c #5D4A56", "f:# c #756B78", "g:# c #8F8592", "h:# c #A495A3", "i:# c #B39EAB", "j:# c #B89FAA", "k:# c #AB99A0", "l:# c #989094", "m:# c #8E9092", "n:# c #E4E9E6", "o:# c #DAE0DD", "p:# c #D2D9D8", "q:# c #CACFD2", "r:# c #89898A", "s:# c #7F7E80", "t:# c #838387", "u:# c #525D67", "v:# c #4F4752", "w:# c #58333E", "x:# c #602837", "y:# c #52304E", "z:# c #564B71", "A:# c #676D94", "B:# c #7388AD", "C:# c #6788A7", "D:# c #587E98", "E:# c #4B6D83", "F:# c #40596A", "G:# c #333C4C", "H:# c #898A8C", "I:# c #C6C8C6", "J:# c #A4A4A1", "K:# c #6F6E6A", "L:# c #3F3F3F", "M:# c #2D2A2B", "N:# c #302A2A", "O:# c #38312F", "P:# c #302D2D", "Q:# c #2C2C2E", "R:# c #4A555D", "S:# c #5F6F78", "T:# c #748B94", "U:# c #82A3AD", "V:# c #90B3BD", "W:# c #9EBBC6", "X:# c #A6BEC9", "Y:# c #A7BEC9", "Z:# c #92AAB5", "`:# c #738C99", " <# c #5C7485", ".<# c #687897", "+<# c #67718F", "@<# c #5C6476", "#<# c #575E61", "$<# c #6B6A69", "%<# c #847F7D", "&<# c #9E9898", "*<# c #B8B2B5", "=<# c #D0CED0", "-<# c #E1E2E3", ";<# c #E9E9EA", "><# c #E6E6E9", ",<# c #322325", "'<# c #523F40", ")<# c #A59C9B", "!<# c #DAD8D6", "~<# c #FAFDFE", "{<# c #E8ECEA", "]<# c #AFB2B1", "^<# c #39393B", "/<# c #F1F5F6", "(<# c #E0E4E6", "_<# c #C7CACE", ":<# c #9A9CA1", "<<# c #A1A4A6", "[<# c #BCCCCE", "}<# c #AEBAC9", "|<# c #7B7DB7", "1<# c #4F43AE", "2<# c #3017AD", "3<# c #290DAE", "4<# c #4530AA", "5<# c #6C65AD", "6<# c #9EA9C3", "7<# c #C6CDD2", "8<# c #D5DADD", "9<# c #E1E8E5", "0<# c #ECF4EE", "a<# c #F7FAF8", "b<# c #C7CCCC", "c<# c #727F7E", "d<# c #60444A", "e<# c #7C2032", "f<# c #990D28", "g<# c #78021E", "h<# c #84394D", "i<# c #AF929B", "j<# c #D5DAD9", "k<# c #C5C7CA", "l<# c #B0ADB2", "m<# c #ACA9AD", "n<# c #A8A6AA", "o<# c #A9A6AB", "p<# c #A6AAAD", "q<# c #A0A4A9", "r<# c #9999A1", "s<# c #93909B", "t<# c #94929C", "u<# c #96959D", "v<# c #9AA6A5", "w<# c #8C777F", "x<# c #923E57", "y<# c #A61037", "z<# c #CB0A30", "A<# c #C70F2F", "B<# c #A61932", "C<# c #85263A", "D<# c #853448", "E<# c #864154", "F<# c #874B5E", "G<# c #8C5063", "H<# c #9F4E61", "I<# c #8C4856", "J<# c #694850", "K<# c #949596", "L<# c #C9C9C9", "M<# c #D5D7D6", "N<# c #AEBDB3", "O<# c #92A59D", "P<# c #7F8F90", "Q<# c #525355", "R<# c #5F6773", "S<# c #66737F", "T<# c #667883", "U<# c #54697C", "V<# c #485163", "W<# c #453D49", "X<# c #493B44", "Y<# c #53637A", "Z<# c #6389AA", "`<# c #73A5CC", " [# c #7EB6DE", ".[# c #79B5D6", "+[# c #74B2D1", "@[# c #6DABC9", "#[# c #6297B2", "$[# c #496476", "%[# c #555F68", "&[# c #6F6F6F", "*[# c #484847", "=[# c #343536", "-[# c #332E2F", ";[# c #3C2E2F", ">[# c #433030", ",[# c #372C2E", "'[# c #2E2427", ")[# c #2A2425", "![# c #2F3336", "~[# c #4D6674", "{[# c #658B9F", "][# c #74A1B8", "^[# c #7FAFC5", "/[# c #83B8CE", "([# c #8ABED5", "_[# c #90C2D9", ":[# c #94C4DB", "<[# c #8BBBD2", "[[# c #7CACC5", "}[# c #6E9DB7", "|[# c #6C97B6", "1[# c #63849F", "2[# c #566A7B", "3[# c #4B535A", "4[# c #4A4A50", "5[# c #50494F", "6[# c #5A5057", "7[# c #6A6169", "8[# c #959A9D", "9[# c #A6ACAF", "0[# c #BCC0C5", "a[# c #F8F9F6", "b[# c #6C6C6D", "c[# c #3E3E40", "d[# c #252528", "e[# c #212729", "f[# c #311F25", "g[# c #511A25", "h[# c #782935", "i[# c #9D676B", "j[# c #BFA1A0", "k[# c #DDCDCD", "l[# c #F1ECED", "m[# c #F8FBFC", "n[# c #EAEEEF", "o[# c #D9DCDD", "p[# c #F3F4F3", "q[# c #D2D8D2", "r[# c #959995", "s[# c #515047", "t[# c #8C8F85", "u[# c #CDD0CA", "v[# c #FBFEFF", "w[# c #ECECEF", "x[# c #CECBD5", "y[# c #AEAAB8", "z[# c #92929D", "A[# c #A4A6AD", "B[# c #E0E0E0", "C[# c #9FA2A4", "D[# c #B0BABB", "E[# c #BCCBCC", "F[# c #C1CBCA", "G[# c #B4BAC9", "H[# c #7B81CB", "I[# c #4C47C3", "J[# c #2E1AB6", "K[# c #290EAB", "L[# c #4632A0", "M[# c #6D68A0", "N[# c #9FA9BE", "O[# c #CCD0D2", "P[# c #F3F4F5", "Q[# c #F4F7F6", "R[# c #F0F6F5", "S[# c #E4E9E8", "T[# c #CCCBCD", "U[# c #A29A9E", "V[# c #50464B", "W[# c #511823", "X[# c #890C20", "Y[# c #B80E2B", "Z[# c #870722", "`[# c #853A4D", " }# c #AB919A", ".}# c #DBE2E2", "+}# c #EBEFED", "@}# c #E4E9E9", "#}# c #DDDFE3", "$}# c #D7D6DF", "%}# c #D8D7DF", "&}# c #D8D6DD", "*}# c #E1E0E0", "=}# c #F3F5F3", "-}# c #E4EEEC", ";}# c #C6B6BF", ">}# c #AC6984", ",}# c #A2244E", "'}# c #BF1337", ")}# c #CB0D2D", "!}# c #C60C29", "~}# c #B90D29", "{}# c #AA0C26", "]}# c #960D27", "^}# c #840F28", "/}# c #7E1029", "(}# c #970B26", "_}# c #7F091F", ":}# c #501520", "<}# c #3E3B3B", "[}# c #949493", "}}# c #D4D3D2", "|}# c #F4F3F2", "1}# c #F8FAFC", "2}# c #EFF3F5", "3}# c #A3A9AA", "4}# c #788E82", "5}# c #567068", "6}# c #3E555A", "7}# c #2E4050", "8}# c #2A3742", "9}# c #2E3A41", "0}# c #38454B", "a}# c #43515B", "b}# c #46586B", "c}# c #556C82", "d}# c #688699", "e}# c #7294A6", "f}# c #60809A", "g}# c #4C647C", "h}# c #40525F", "i}# c #43595F", "j}# c #6596A8", "k}# c #7CBFDD", "l}# c #87D0F6", "m}# c #8BD5FE", "n}# c #8ED3F6", "o}# c #93D7FB", "p}# c #94D9FE", "q}# c #8BC9ED", "r}# c #668CA0", "s}# c #5E717A", "t}# c #757A7E", "u}# c #9F9E9F", "v}# c #DBDADA", "w}# c #E7E7E7", "x}# c #9D9FA1", "y}# c #414145", "z}# c #2E3133", "A}# c #373234", "B}# c #443234", "C}# c #4A3032", "D}# c #3B2B2E", "E}# c #302627", "F}# c #2D2828", "G}# c #638EA1", "H}# c #80C0DB", "I}# c #8DD2F2", "J}# c #90D4F6", "K}# c #8ED1F4", "L}# c #8CCFF2", "M}# c #8CCEF1", "N}# c #8BCEF0", "O}# c #8DD1F4", "P}# c #8FD3F6", "Q}# c #8DD0F2", "R}# c #7FC2E0", "S}# c #72A9C2", "T}# c #668B9D", "U}# c #586B79", "V}# c #475262", "W}# c #3A3E4E", "X}# c #353142", "Y}# c #383342", "Z}# c #454A54", "`}# c #56626B", " |# c #6D7B84", ".|# c #C9D0D3", "+|# c #E1E3E0", "@|# c #D7D6CF", "#|# c #B4B3AB", "$|# c #81827F", "%|# c #202023", "&|# c #1A2425", "*|# c #3E1E27", "=|# c #781529", "-|# c #AA1730", ";|# c #A43440", ">|# c #AF6267", ",|# c #C8979A", "'|# c #DFC6C8", ")|# c #E2DDDC", "!|# c #E6EAE9", "~|# c #EAF0EF", "{|# c #E8E2DE", "]|# c #CEC8C5", "^|# c #797C75", "/|# c #484342", "(|# c #362D2E", "_|# c #686858", ":|# c #A3A896", "<|# c #D8DDD4", "[|# c #F8FDFE", "}|# c #E9E5E8", "||# c #C1B5C2", "1|# c #9D8FA2", "2|# c #9895A2", "3|# c #B0B3BA", "4|# c #D8DBDE", "5|# c #C7C8C9", "6|# c #AAADAF", "7|# c #BCCACB", "8|# c #C3CBC8", "9|# c #B9BBC9", "0|# c #8188D5", "a|# c #514FCE", "b|# c #301EBC", "c|# c #1800B7", "d|# c #260FA1", "e|# c #463683", "f|# c #6F6C79", "g|# c #EEF5F5", "h|# c #E7F2F0", "i|# c #C4D4CE", "j|# c #A3A7A4", "k|# c #8A7679", "l|# c #7B4652", "m|# c #7C2434", "n|# c #981026", "o|# c #BB0825", "p|# c #CB0929", "q|# c #9B0723", "r|# c #873142", "s|# c #92797C", "t|# c #B2C3BC", "u|# c #E9F0EE", "v|# c #F4F4F6", "w|# c #F4F3F6", "x|# c #F8F6F6", "y|# c #DFDADD", "z|# c #BD9FA8", "A|# c #A95C6E", "B|# c #C12542", "C|# c #D20A2C", "D|# c #D3082A", "E|# c #C8092A", "F|# c #BB0B2B", "G|# c #B10C2A", "H|# c #B80827", "I|# c #722832", "J|# c #675958", "K|# c #B8B7B4", "L|# c #ECEEEB", "M|# c #F7F6FB", "N|# c #DBDBE2", "O|# c #9A99A0", "P|# c #6D6F76", "Q|# c #555E65", "R|# c #5F6A6A", "S|# c #607073", "T|# c #5A717E", "U|# c #537389", "V|# c #537A8E", "W|# c #5C889B", "X|# c #6998AD", "Y|# c #75A5BE", "Z|# c #76A7C2", "`|# c #7CB1CD", " 1# c #83BAD5", ".1# c #7FB2CD", "+1# c #5F7E9A", "@1# c #4D697F", "#1# c #4D727F", "$1# c #5A8E97", "%1# c #79B5CB", "&1# c #88CBEC", "*1# c #8BD2F9", "=1# c #89D1FB", "-1# c #8AD1F9", ";1# c #8ED4FB", ">1# c #91D4F9", ",1# c #8BCAE9", "'1# c #6BA6B8", ")1# c #5E868E", "!1# c #6A7779", "~1# c #8D8686", "{1# c #D5D1D2", "]1# c #303436", "^1# c #3A3638", "/1# c #403537", "(1# c #32282B", "_1# c #302729", ":1# c #353130", "<1# c #363331", "[1# c #3A3A3A", "}1# c #4A5559", "|1# c #77A7B2", "11# c #8FD2E5", "21# c #93DAF5", "31# c #8ED3F5", "41# c #8BD1F7", "51# c #8ACFF7", "61# c #8ACEF5", "71# c #8BCEF4", "81# c #89CEF5", "91# c #89D0F7", "01# c #8BD1F8", "a1# c #85CCF1", "b1# c #82C3E7", "c1# c #7FB9DA", "d1# c #7CAECB", "e1# c #76A6C2", "f1# c #739BB7", "g1# c #708DA9", "h1# c #697C97", "i1# c #54667E", "j1# c #51667C", "k1# c #5F788C", "l1# c #7690A1", "m1# c #A9AEB0", "n1# c #B9B8B6", "o1# c #9B9B97", "p1# c #6E6F6B", "q1# c #3F3E3B", "r1# c #1D1C19", "s1# c #182624", "t1# c #49222A", "u1# c #94142B", "v1# c #D00A2C", "w1# c #C71633", "x1# c #BA283D", "y1# c #B2424F", "z1# c #AB656B", "A1# c #A89B98", "B1# c #ACC0BB", "C1# c #B3CDCA", "D1# c #BAC4BF", "E1# c #BB9C83", "F1# c #9A735D", "G1# c #725E58", "H1# c #CACCCF", "I1# c #989593", "J1# c #575250", "K1# c #362E2E", "L1# c #3A3133", "M1# c #74736F", "N1# c #B0B3AE", "O1# c #E1E3E1", "P1# c #EDE7E6", "Q1# c #C4B3B7", "R1# c #A68F97", "S1# c #D8D9DC", "T1# c #EBF0F0", "U1# c #E8E9E8", "V1# c #D0D3D3", "W1# c #B8CACD", "X1# c #BBCBCC", "Y1# c #6B5CB6", "Z1# c #3D25B1", "`1# c #270FA1", " 2# c #463684", ".2# c #706D7A", "+2# c #BFB8BA", "@2# c #9F9393", "#2# c #856669", "$2# c #793A44", "%2# c #7F192B", "&2# c #C40D2C", "*2# c #D7082A", "=2# c #D70529", "-2# c #B50625", ";2# c #9A2035", ">2# c #8E5059", ",2# c #998C89", "'2# c #CDCDCA", ")2# c #ECF0EE", "!2# c #C8C2C1", "~2# c #AE8589", "{2# c #B8384C", "]2# c #C90F2D", "^2# c #DA0327", "/2# c #E8052C", "(2# c #E2072C", "_2# c #D60B2D", ":2# c #C50F2D", "<2# c #B30D2A", "[2# c #8E1528", "}2# c #6C2D33", "|2# c #6B5D5A", "12# c #BFBEBB", "22# c #E1DDE2", "32# c #B4B0B9", "42# c #65626E", "52# c #3C4250", "62# c #384959", "72# c #496373", "82# c #657B88", "92# c #738B9A", "02# c #7697AC", "a2# c #74A2BC", "b2# c #75ACC8", "c2# c #7DBAD8", "d2# c #88C8E8", "e2# c #90D1F3", "f2# c #8FD0F2", "g2# c #90D3F4", "h2# c #88C4E6", "i2# c #6A93B2", "j2# c #5F859F", "k2# c #6496AB", "l2# c #72B2C6", "m2# c #86C6E2", "n2# c #8ECFF2", "o2# c #8DD0F8", "p2# c #89CEF7", "q2# c #88CDF8", "r2# c #8BD0F9", "s2# c #8DD0F6", "t2# c #8ACBEB", "u2# c #78BAD1", "v2# c #6898A8", "w2# c #657B86", "x2# c #7E7D84", "y2# c #585758", "z2# c #2F3237", "A2# c #343539", "B2# c #373437", "C2# c #332D30", "D2# c #312A2E", "E2# c #322C35", "F2# c #38333E", "G2# c #46444F", "H2# c #5B636F", "I2# c #7BA3AC", "J2# c #8CC4D3", "K2# c #8FCCE6", "L2# c #8CCAED", "M2# c #8ACDF3", "N2# c #8ACEF6", "O2# c #8BCEF5", "P2# c #8DCDF5", "Q2# c #8ACDF6", "R2# c #88CEF7", "S2# c #89CFF7", "T2# c #8ACFF8", "U2# c #8BD0F8", "V2# c #8DD0F7", "W2# c #8ED2F5", "X2# c #91CEF0", "Y2# c #90C4E5", "Z2# c #87AFD0", "`2# c #6588A5", " 3# c #5D809C", ".3# c #668EA8", "+3# c #739BB3", "@3# c #6F8899", "#3# c #939797", "$3# c #A5A5A0", "%3# c #A7A6A1", "&3# c #81817C", "*3# c #484A45", "=3# c #1B1D19", "-3# c #1D2524", ";3# c #55202B", ">3# c #A6112B", ",3# c #E7032A", "'3# c #DE062C", ")3# c #CA0A2A", "!3# c #B5122A", "~3# c #A22736", "{3# c #955C60", "]3# c #968082", "^3# c #A08C92", "/3# c #AD8187", "(3# c #B85749", "_3# c #953326", ":3# c #642929", "<3# c #584955", "[3# c #C2BEC3", "}3# c #F6F8F9", "|3# c #D5D6D8", "13# c #787576", "23# c #3B3536", "33# c #3D363B", "43# c #7F7E82", "53# c #BBBDBF", "63# c #EEF2FA", "73# c #D6D0D9", "83# c #BDABB0", "93# c #B49B9C", "03# c #D8D0D0", "a3# c #A1A0B4", "b3# c #7767AB", "c3# c #432AAD", "d3# c #280EA7", "e3# c #463496", "f3# c #6F6A93", "g3# c #A2A9BD", "h3# c #A2A4A7", "i3# c #B4B5B5", "j3# c #808081", "k3# c #7A7B7B", "l3# c #7F7779", "m3# c #896F74", "n3# c #90616A", "o3# c #8C4955", "p3# c #8A303F", "q3# c #8E1B2E", "r3# c #9D0D25", "s3# c #BB0E2B", "t3# c #D10C2E", "u3# c #DC082C", "v3# c #DC0429", "w3# c #D10528", "x3# c #B70E2B", "y3# c #9D2439", "z3# c #904E58", "A3# c #AA9C98", "B3# c #C9D1CB", "C3# c #E6EDEA", "D3# c #ECF3F2", "E3# c #CCD1D0", "F3# c #AF9A9C", "G3# c #A94753", "H3# c #B7172D", "I3# c #CF0526", "J3# c #E5042B", "K3# c #EB022B", "L3# c #E5052B", "M3# c #D30B2C", "N3# c #B8112C", "O3# c #8F132A", "P3# c #651624", "Q3# c #4B262A", "R3# c #56504C", "S3# c #B1B2B0", "T3# c #EBE9EA", "U3# c #BDB9BC", "V3# c #858087", "W3# c #4E4C5A", "X3# c #3F4D61", "Y3# c #50738B", "Z3# c #6C9FB9", "`3# c #7CAAC3", " 4# c #84B2CB", ".4# c #86B9D5", "+4# c #86C0DE", "@4# c #87C5E7", "#4# c #8BCCF0", "$4# c #8FD2F8", "%4# c #93D7FD", "&4# c #92D5FB", "*4# c #92D6FA", "=4# c #8CCCF2", "-4# c #7EB4D9", ";4# c #79AFD1", ">4# c #7DB9D8", ",4# c #84C6E6", "'4# c #8CCDF0", ")4# c #8FCFF5", "!4# c #8DCEF6", "~4# c #8BCDF5", "{4# c #8BCDF6", "]4# c #8BCEF7", "^4# c #8BD0F7", "/4# c #8ACDF1", "(4# c #87C2E1", "_4# c #74A0BB", ":4# c #627E95", "<4# c #6F7C8D", "[4# c #CCD0D4", "}4# c #EDEFF0", "|4# c #C4C6C7", "14# c #322F34", "24# c #2F2B2E", "34# c #2E2932", "44# c #2C253C", "54# c #3A3250", "64# c #524D6A", "74# c #6A6F87", "84# c #75919F", "94# c #7FA8B7", "04# c #87B6CF", "a4# c #8CBEE2", "b4# c #8BCEF2", "c4# c #8DCEF4", "d4# c #8CCDF5", "e4# c #8BCEF6", "f4# c #8CCEF7", "g4# c #8DD0F9", "h4# c #8CD3FC", "i4# c #8DD5FF", "j4# c #91D7FE", "k4# c #94D7FC", "l4# c #94D2F5", "m4# c #8DC4E5", "n4# c #71A3C0", "o4# c #6DA0BC", "p4# c #77ADCA", "q4# c #7DB1CF", "r4# c #6386A1", "s4# c #5E7281", "t4# c #6D7676", "u4# c #86877B", "v4# c #A79E99", "w4# c #8F8683", "x4# c #55514F", "y4# c #22201F", "z4# c #2A2125", "A4# c #631B2A", "B4# c #B00D2A", "C4# c #EE0129", "D4# c #E5032A", "E4# c #D60226", "F4# c #C90323", "G4# c #BA0C27", "H4# c #A42A3B", "I4# c #A13C4D", "J4# c #AC4156", "K4# c #BD3A50", "L4# c #D1212F", "M4# c #AF0E1A", "N4# c #79121F", "O4# c #643E4A", "P4# c #C5BBBF", "Q4# c #FAFCFD", "R4# c #E0E6E9", "S4# c #AEB4BA", "T4# c #2B262A", "U4# c #272027", "V4# c #474149", "W4# c #8F8E93", "X4# c #EBF0F3", "Y4# c #C3C3DB", "Z4# c #AFA6BF", "`4# c #B09EAC", " 5# c #C2AEAE", ".5# c #E5E1E0", "+5# c #F7FAF9", "@5# c #A0A7AB", "#5# c #A3A5B6", "$5# c #796DAE", "%5# c #432DAF", "&5# c #4331A4", "*5# c #6B66A5", "=5# c #A1A7C3", "-5# c #D9DADB", ";5# c #939596", ">5# c #4B4D4F", ",5# c #464645", "'5# c #4F3A3C", ")5# c #5E2830", "!5# c #741728", "~5# c #910E27", "{5# c #A40D28", "]5# c #AE0F2A", "^5# c #B6112C", "/5# c #C3112F", "(5# c #CD0E2E", "_5# c #D40126", ":5# c #B20424", "<5# c #921D32", "[5# c #856463", "}5# c #CDD8D2", "|5# c #E9F4F3", "15# c #C8D3D5", "25# c #A99FA4", "35# c #994C56", "45# c #A51A2C", "55# c #C20824", "65# c #C10C2B", "75# c #9A142B", "85# c #641929", "95# c #3C1C24", "05# c #4A4D4B", "a5# c #E1E2E4", "b5# c #DCDBDB", "c5# c #4D5665", "d5# c #5D7990", "e5# c #7BAECC", "f5# c #95DBFE", "g5# c #92D7FA", "h5# c #8FD2F4", "i5# c #8FD1F2", "j5# c #8FCEF6", "k5# c #8ECEF6", "l5# c #8DCDF4", "m5# c #8DCEF5", "n5# c #8FD1F9", "o5# c #90D2FA", "p5# c #90D1F9", "q5# c #8FCFF7", "r5# c #8DCDF3", "s5# c #8ECDF3", "t5# c #8CCDF4", "u5# c #88CCF4", "v5# c #86C7EE", "w5# c #8CB9DB", "x5# c #7697B6", "y5# c #5B7693", "z5# c #5E738A", "A5# c #BCC1CA", "B5# c #F3F0F2", "C5# c #57575B", "D5# c #282728", "E5# c #262526", "F5# c #312B32", "G5# c #302B4A", "H5# c #45426A", "I5# c #62658E", "J5# c #7984A7", "K5# c #72889E", "L5# c #7692A5", "M5# c #82A2B9", "N5# c #8DB4D2", "O5# c #8DC6E4", "P5# c #8DCEEF", "Q5# c #8DCFF3", "R5# c #8ECDF4", "S5# c #8ECFF5", "T5# c #8FD0F3", "U5# c #8ACBEA", "V5# c #79B5D0", "W5# c #7BB9D5", "X5# c #87C8E7", "Y5# c #89C6E8", "Z5# c #638BAB", "`5# c #506477", " 6# c #555759", ".6# c #6D5E54", "+6# c #A37E7E", "@6# c #9A7378", "#6# c #684A50", "$6# c #392128", "%6# c #431D28", "&6# c #751528", "*6# c #B70B27", "=6# c #E90326", "-6# c #DE0628", ";6# c #C20727", ">6# c #C40825", ",6# c #D40524", "'6# c #EC0024", ")6# c #CB0020", "!6# c #921328", "~6# c #774850", "{6# c #CCC0C2", "]6# c #EAECEE", "^6# c #B9C0C6", "/6# c #3F4245", "(6# c #362E35", "_6# c #615761", ":6# c #A8A4A9", "<6# c #D7D9DA", "[6# c #EEF3F3", "}6# c #EDECEE", "|6# c #F3EEEF", "16# c #F3EBEA", "26# c #E9DEDD", "36# c #D0C1C8", "46# c #957FA4", "56# c #8C749A", "66# c #AA97AA", "76# c #D3C9C8", "86# c #ECEDEB", "96# c #ADB5BD", "06# c #A1A7BD", "a6# c #766EB5", "b6# c #402EB1", "c6# c #250EA4", "d6# c #39328C", "e6# c #5D6784", "f6# c #9AA8B8", "g6# c #BEC5CB", "h6# c #E5E8E9", "i6# c #B4BCBE", "j6# c #798285", "k6# c #5A5353", "l6# c #5A3334", "m6# c #731E27", "n6# c #9A1226", "o6# c #C90928", "p6# c #CE082A", "q6# c #BA0D2C", "r6# c #A6122D", "s6# c #B6122D", "t6# c #C7102E", "u6# c #D60E2F", "v6# c #E30B2F", "w6# c #ED072E", "x6# c #E1052A", "y6# c #C30828", "z6# c #9B152B", "A6# c #643035", "B6# c #736D69", "C6# c #B0B9B5", "D6# c #F0F7F5", "E6# c #E4F1F0", "F6# c #938E93", "G6# c #8E3848", "H6# c #A20A24", "I6# c #C10121", "J6# c #DD072C", "K6# c #E1092D", "L6# c #CD0B2D", "M6# c #A70E2C", "N6# c #761329", "O6# c #401821", "P6# c #444749", "Q6# c #737678", "R6# c #E9E9E9", "S6# c #D3D2D5", "T6# c #4F5B69", "U6# c #6A8C97", "V6# c #81B4C5", "W6# c #8DCAE7", "X6# c #92D3FB", "Y6# c #90D2F8", "Z6# c #8ED0F6", "`6# c #8ECFF4", " 7# c #8ECEF5", ".7# c #8FD0F8", "+7# c #8FCFF8", "@7# c #8DCDF0", "#7# c #8DCDF2", "$7# c #8FCFF2", "%7# c #8ACBEC", "&7# c #81C0E0", "*7# c #76AFCC", "=7# c #7094A9", "-7# c #596C7D", ";7# c #424B5A", ">7# c #484957", ",7# c #9890A1", "'7# c #D4CBD9", ")7# c #F5F0F6", "!7# c #F1F2F4", "~7# c #727375", "{7# c #3B373C", "]7# c #3A3841", "^7# c #4F5869", "/7# c #687F98", "(7# c #7EA4C4", "_7# c #8CBADE", ":7# c #86A7C0", "<7# c #8AA7B7", "[7# c #8DAFBB", "}7# c #8DC4DC", "|7# c #8DCFF5", "17# c #8CD1F4", "27# c #8ACCEA", "37# c #79B5CF", "47# c #7BB8D5", "57# c #87C7E9", "67# c #89C5E7", "77# c #61879C", "87# c #525664", "97# c #5E3945", "07# c #7A2C3A", "a7# c #A23546", "b7# c #A23245", "c7# c #88263A", "d7# c #6E1B2F", "e7# c #6E1930", "f7# c #8E1529", "g7# c #BB0F20", "h7# c #DA0A1A", "i7# c #C50E26", "j7# c #C40D2B", "k7# c #D5072B", "l7# c #E50228", "m7# c #DC0227", "n7# c #D60423", "o7# c #D4071C", "p7# c #D60916", "q7# c #E80315", "r7# c #C30D1A", "s7# c #892E30", "t7# c #6F6860", "u7# c #C9CAC7", "v7# c #F6F5F6", "w7# c #C8C8CC", "x7# c #222626", "y7# c #302B29", "z7# c #5E4D4F", "A7# c #9B8489", "B7# c #D5CDCF", "C7# c #EFF7F8", "D7# c #D2D9E1", "E7# c #B9B7C4", "F7# c #BAA2A5", "G7# c #BA8B8A", "H7# c #B37073", "I7# c #A3545F", "J7# c #7D2F4A", "K7# c #894F69", "L7# c #B89DA9", "M7# c #E8E9E7", "N7# c #F5FBFB", "O7# c #B4B8BB", "P7# c #A2A4BF", "Q7# c #786BB5", "R7# c #412CAE", "S7# c #1600AB", "T7# c #250E9F", "U7# c #3A357B", "V7# c #5D6B6F", "W7# c #CDD4DB", "X7# c #EEF0F2", "Y7# c #EFF3F4", "Z7# c #D5DFE1", "`7# c #8F8988", " 8# c #836161", ".8# c #8B4349", "+8# c #A12B39", "@8# c #C9112F", "#8# c #C40B2C", "$8# c #A4112C", "%8# c #86192D", "&8# c #931329", "*8# c #9B0E26", "=8# c #A10C25", "-8# c #AD0A26", ";8# c #CC0829", ">8# c #C90B2A", ",8# c #A71129", "'8# c #641621", ")8# c #5C4043", "!8# c #848281", "~8# c #BCC4C2", "{8# c #E9F3F2", "]8# c #C3D0D1", "^8# c #9F9CA0", "/8# c #914E5D", "(8# c #972238", "_8# c #A7152D", ":8# c #B9142F", "<8# c #C20F2E", "[8# c #AF112F", "}8# c #8B1C35", "|8# c #662D3E", "18# c #56464B", "28# c #7E8385", "38# c #A7A9AC", "48# c #D4D6D6", "58# c #F2F0EF", "68# c #BABBC0", "78# c #727A8B", "88# c #465C75", "98# c #77ACBE", "08# c #92D5EB", "a8# c #93D8F7", "b8# c #8CCDF6", "c8# c #8CCDF3", "d8# c #8FD0F4", "e8# c #89C9EA", "f8# c #7DB9D6", "g8# c #6DA0B7", "h8# c #5F7987", "i8# c #495159", "j8# c #3A3036", "k8# c #6B5E6C", "l8# c #9F95A1", "m8# c #CDC8CD", "n8# c #5E5C60", "o8# c #323034", "p8# c #3B383B", "q8# c #63737D", "r8# c #789EAE", "s8# c #82BBD2", "t8# c #86C6E3", "u8# c #85B3D1", "v8# c #87A6BF", "w8# c #8AA5B5", "x8# c #8DAEBA", "y8# c #8DC3DD", "z8# c #8DCEF1", "A8# c #89CEF8", "B8# c #8BCFF7", "C8# c #8ECEF2", "D8# c #8CC7E5", "E8# c #78B0CA", "F8# c #78B4D1", "G8# c #83C4E7", "H8# c #88C6EC", "I8# c #6E99B0", "J8# c #5F6474", "K8# c #633346", "L8# c #781028", "M8# c #AA0B27", "N8# c #BC0C28", "O8# c #B60F26", "P8# c #A81226", "Q8# c #A21328", "R8# c #B11123", "S8# c #C90E1D", "T8# c #D60C1A", "U8# c #B71227", "V8# c #B7102C", "W8# c #CF092B", "X8# c #E80228", "Y8# c #E80129", "Z8# c #E40425", "`8# c #DE071E", " 9# c #D80A17", ".9# c #DC0513", "+9# c #B81A21", "@9# c #884844", "#9# c #78867B", "$9# c #CCD4D0", "%9# c #F2F4F2", "&9# c #DFE3E1", "*9# c #919595", "=9# c #5B5D5B", "-9# c #353430", ";9# c #3A3A36", ">9# c #5F5856", ",9# c #968584", "'9# c #CFBABA", ")9# c #E9EAE6", "!9# c #D3CBCC", "~9# c #B79FAC", "{9# c #A17589", "]9# c #A55D68", "^9# c #AB434D", "/9# c #AB2937", "(9# c #A11528", "_9# c #78051D", ":9# c #873E51", "<9# c #BCA1A9", "[9# c #F8FEFD", "}9# c #C5C8CA", "|9# c #B1B9BC", "19# c #A4A7C4", "29# c #796EBA", "39# c #432EB1", "49# c #1A00AE", "59# c #1C00B8", "69# c #270F9D", "79# c #413778", "89# c #676E6A", "99# c #9FAAAD", "09# c #C1C9CE", "a9# c #CFD3D7", "b9# c #F4F9FA", "c9# c #ECF4F5", "d9# c #DDE4E5", "e9# c #CFCDCC", "f9# c #B9ACAA", "g9# c #A28383", "h9# c #93575C", "i9# c #A1243C", "j9# c #95132D", "k9# c #7A1A2C", "l9# c #63252F", "m9# c #6C1A28", "n9# c #651322", "o9# c #59101E", "p9# c #5F101E", "q9# c #970E26", "r9# c #BA0D2A", "s9# c #C00D2B", "t9# c #AC1029", "u9# c #761525", "v9# c #572830", "w9# c #574A4D", "x9# c #767C7B", "y9# c #DDE3E4", "z9# c #A0858D", "A9# c #8D5B64", "B9# c #864049", "C9# c #882D39", "D9# c #93172F", "E9# c #8A1B34", "F9# c #773648", "G9# c #705F67", "H9# c #B1B4B4", "I9# c #C6C9CA", "J9# c #E8EBEC", "K9# c #F8F8F7", "L9# c #D9D7D6", "M9# c #9D9FA6", "N9# c #5E697F", "O9# c #3D597B", "P9# c #75B0CF", "Q9# c #91DBFB", "R9# c #91DBFF", "S9# c #89CDF6", "T9# c #8CCDF2", "U9# c #8ACDF4", "V9# c #8ED0F7", "W9# c #89C9ED", "X9# c #7CB8D6", "Y9# c #6B9CB3", "Z9# c #5C707D", "`9# c #3A3537", " 0# c #342D2F", ".0# c #41393E", "+0# c #655E63", "@0# c #969395", "#0# c #EEF1F0", "$0# c #CBCAC8", "%0# c #ABAAA8", "&0# c #848284", "*0# c #68666B", "=0# c #56535A", "-0# c #272728", ";0# c #313130", ">0# c #373635", ",0# c #3A3839", "'0# c #2E3135", ")0# c #2A2C30", "!0# c #667882", "~0# c #779FAC", "{0# c #77B2C2", "]0# c #73B4C7", "^0# c #76A0B4", "/0# c #7D9AAE", "(0# c #86A2B7", "_0# c #8DB2C9", ":0# c #8DC5E5", "<0# c #8DCEF3", "[0# c #8DCFF6", "}0# c #8DCBF3", "|0# c #8FC4E8", "10# c #8BBAD9", "20# c #78ACC6", "30# c #76B3CF", "40# c #80C3E7", "50# c #89CAF3", "60# c #82B5D4", "70# c #6F8198", "80# c #614054", "90# c #6C0A1F", "00# c #B30021", "a0# c #DA001F", "b0# c #E10419", "c0# c #D90B15", "d0# c #D10C18", "e0# c #D40B1B", "f0# c #DB091E", "g0# c #D90923", "h0# c #B7112A", "i0# c #B5112C", "j0# c #CB0A2B", "k0# c #E70326", "l0# c #E40423", "m0# c #DB0620", "n0# c #CC031A", "o0# c #AE2230", "p0# c #915B5E", "q0# c #8F9D98", "r0# c #D4DCDA", "s0# c #D7DBD7", "t0# c #AFB7B1", "u0# c #7F8884", "v0# c #5A5E59", "w0# c #47433B", "x0# c #4D4137", "y0# c #746A66", "z0# c #A29797", "A0# c #CCC2C1", "B0# c #EFE6E5", "C0# c #FDFBFB", "D0# c #F1F6F6", "E0# c #DCE1E1", "F0# c #C7B5B2", "G0# c #B58488", "H0# c #A95767", "I0# c #A7344E", "J0# c #B0293F", "K0# c #BE1B32", "L0# c #C70B26", "M0# c #BD011E", "N0# c #810016", "O0# c #843B4C", "P0# c #B59DA5", "Q0# c #ECF4F4", "R0# c #A5ADCB", "S0# c #7B74C2", "T0# c #4431B6", "U0# c #280EA0", "V0# c #453480", "W0# c #6E6974", "X0# c #E9EFEC", "Y0# c #BEC6C1", "Z0# c #918D8B", "`0# c #794251", " a# c #612234", ".a# c #4E242D", "+a# c #453132", "@a# c #552C34", "#a# c #4B2B33", "$a# c #362E30", "%a# c #322D2E", "&a# c #692231", "*a# c #921A31", "=a# c #A21630", "-a# c #9F1930", ";a# c #832739", ">a# c #5C2A36", ",a# c #402E34", "'a# c #474A4B", ")a# c #DDDEE0", "!a# c #979E9D", "~a# c #7C7875", "{a# c #6B5252", "]a# c #682635", "^a# c #6A2D3E", "/a# c #755C66", "(a# c #929D9E", "_a# c #D4D9D9", ":a# c #8B8F96", "b# c #C8AFB4", ",b# c #B07276", "'b# c #A83E48", ")b# c #AE192E", "!b# c #BB0422", "~b# c #C70728", "{b# c #DB0226", "]b# c #910421", "^b# c #A68D95", "/b# c #D7DBDB", "(b# c #B8B9BE", "_b# c #7C79C4", ":b# c #4633B9", "c# c #96DBF1", ",c# c #88BED3", "'c# c #7193AC", ")c# c #637B99", "!c# c #79A9C7", "~c# c #88C9E9", "{c# c #8ECBED", "]c# c #8EB2C8", "^c# c #7B8792", "/c# c #635459", "(c# c #5F282D", "_c# c #911127", ":c# c #BC0624", "d# c #84AED0", ",d# c #6F93B3", "'d# c #5D7F9C", ")d# c #60839E", "!d# c #597B99", "~d# c #4B6B8D", "{d# c #446080", "]d# c #546675", "^d# c #636F77", "/d# c #6E7982", "(d# c #76818D", "_d# c #6D767D", ":d# c #474241", "e# c #DDD3D7", ",e# c #E1DCDC", "'e# c #E6E4E4", ")e# c #C6C8C9", "!e# c #A8ABAE", "~e# c #7E78AE", "{e# c #4733AD", "]e# c #220AA1", "^e# c #342989", "/e# c #585C83", "(e# c #9BA4B5", "_e# c #A2A6AA", ":e# c #DADEDF", "f# c #DD0427", ",f# c #DC0628", "'f# c #DF0720", ")f# c #E3071A", "!f# c #E70324", "~f# c #D6062B", "{f# c #BC0E2D", "]f# c #B0122C", "^f# c #D20829", "/f# c #B10B29", "(f# c #821E30", "_f# c #5F3C40", ":f# c #555F5B", "g# c #709DB7", ",g# c #72A2BD", "'g# c #74ABC7", ")g# c #6CA2BA", "!g# c #485F63", "~g# c #353A37", "{g# c #363939", "]g# c #475158", "^g# c #6C7B85", "/g# c #8FA6B1", "(g# c #A7C5D1", "_g# c #AECEDA", ":g# c #748891", "h# c #722543", ",h# c #815361", "'h# c #9A8885", ")h# c #B2ACAA", "!h# c #D0CFCE", "~h# c #ECEEED", "{h# c #D3D4D6", "]h# c #A7A6AD", "^h# c #9A9FA7", "/h# c #ABBEBE", "(h# c #8489B0", "_h# c #4C3DA5", ":h# c #1E00A1", "i# c #79ABC5", ",i# c #68A4BA", "'i# c #598AA9", ")i# c #587D9C", "!i# c #667F97", "~i# c #8493A0", "{i# c #BABFC5", "]i# c #DAE3E3", "^i# c #8F6261", "/i# c #852227", "(i# c #B8102B", "_i# c #E60525", ":i# c #E60421", "j# c #8ED1F9", ",j# c #8ED0F9", "'j# c #8CD1F8", ")j# c #85D2F7", "!j# c #85D2F6", "~j# c #8CD0F1", "{j# c #83C4DF", "]j# c #6DA1B5", "^j# c #3C5058", "/j# c #40484F", "(j# c #617887", "_j# c #80B4D0", ":j# c #8FD1F3", "k# c #ABBDBE", ",k# c #8388AD", "'k# c #1D009B", ")k# c #2404AA", "!k# c #3818A2", "~k# c #5C44A3", "{k# c #9E9ABB", "]k# c #BDC7CA", "^k# c #BECECE", "/k# c #D5DADA", "(k# c #D7D9DB", "_k# c #A0A2A5", ":k# c #606A74", "l# c #B31028", ",l# c #CC0123", "'l# c #E10429", ")l# c #E30429", "!l# c #E60327", "~l# c #E40523", "{l# c #D50721", "]l# c #A7041E", "^l# c #993044", "/l# c #A67780", "(l# c #BAB6B7", "_l# c #C0C2C4", ":l# c #C0C3C6", "m# c #91D4FD", ",m# c #8BCFF6", "'m# c #93D2F5", ")m# c #94C9EC", "!m# c #88ACCC", "~m# c #59667A", "{m# c #505154", "]m# c #414C5E", "^m# c #57738E", "/m# c #7FAFCF", "(m# c #8AD0EC", "_m# c #7FDAED", ":m# c #73D6E5", "n# c #6DA6BA", ",n# c #6DABC1", "'n# c #73B3CE", ")n# c #7DBADB", "!n# c #85BBE0", "~n# c #90C1E6", "{n# c #93C2E2", "]n# c #85ADC6", "^n# c #4B6271", "/n# c #35424B", "(n# c #435058", "_n# c #627A87", ":n# c #83B9D6", "o# c #38393E", ",o# c #364148", "'o# c #394450", ")o# c #3D4757", "!o# c #424D5F", "~o# c #49596E", "{o# c #4B6075", "]o# c #4C6278", "^o# c #4E617A", "/o# c #5B5F7E", "(o# c #636682", "_o# c #667385", ":o# c #69808B", "p# c #9196B5", ",p# c #5343A9", "'p# c #1F01B5", ")p# c #1B06A0", "!p# c #201D7E", "~p# c #3F4B71", "{p# c #C2C9CC", "]p# c #C2CFD3", "^p# c #8F9C9F", "/p# c #9DA4A5", "(p# c #D7D9D9", "_p# c #9FA3A4", ":p# c #8E9495", "q# c #A62133", ",q# c #B60E28", "'q# c #C90727", ")q# c #BD0B29", "!q# c #9E1D33", "~q# c #934653", "{q# c #C09DA2", "]q# c #B5BEC2", "^q# c #B6C8BF", "/q# c #8E91B2", "(q# c #5141A8", "_q# c #1A06A2", ":q# c #231C85", "r# c #AA6772", ",r# c #C7ABAF", "'r# c #E7E0E1", ")r# c #A3A9AF", "!r# c #9CAEB3", "~r# c #B1C1BE", "{r# c #8A8BB1", "]r# c #4F3EA7", "^r# c #1F05A7", "/r# c #301B96", "(r# c #544893", "_r# c #9C9DBA", ":r# c #C1CED2", "s# c #1E00A4", ",s# c #2105AD", "'s# c #371AA2", ")s# c #5D46A2", "!s# c #9C9DC2", "~s# c #BFCED2", "{s# c #A2AFB1", "]s# c #AAB3B5", "^s# c #DBDCDD", "/s# c #CDCED0", "(s# c #F4F9F6", "_s# c #E2F0EA", ":s# c #BCB0B6", "t# c #F1EFEF", ",t# c #F0EFEE", "'t# c #EEEDEB", ")t# c #F0EEED", "!t# c #E2E3E6", "~t# c #E4E5E8", "{t# c #E3E3E7", "]t# c #EAE8ED", "^t# c #F6F2F6", "/t# c #C9AFB0", "(t# c #AB6973", "_t# c #9A2E43", ":t# c #970825", "u# c #A1A9AF", ",u# c #C8C8C9", "'u# c #E5EDE9", ")u# c #A08A86", "!u# c #994B54", "~u# c #A92236", "{u# c #D30629", "]u# c #A80321", "^u# c #932D42", "/u# c #98757F", "(u# c #E7EFEF", "_u# c #D9D2D4", ":u# c #B2969B", "v# c #834B60", ",v# c #9E2E4E", "'v# c #C30F32", ")v# c #D70226", "!v# c #DD0126", "~v# c #E4062B", "{v# c #E0062B", "]v# c #D3072A", "^v# c #B80927", "/v# c #7C444B", "(v# c #827C7A", "_v# c #CDCDCC", ":v# c #EEEAE9", "w# c #C9CCCE", ",w# c #EFF0EE", "'w# c #C7CBC6", ")w# c #939992", "!w# c #5F615F", "~w# c #444448", "{w# c #585760", "]w# c #62555E", "^w# c #654752", "/w# c #623844", "(w# c #54323C", "_w# c #632935", ":w# c #871C2F", "x# c #8DA4AB", ",x# c #71737A", "'x# c #EEF0F0", ")x# c #F0F5F4", "!x# c #DCE2E4", "~x# c #93999C", "{x# c #636167", "]x# c #53464F", "^x# c #5E4955", "/x# c #8E7F88", "(x# c #938689", "_x# c #7A6563", ":x# c #613836", "y# c #402D7F", ",y# c #9396B4", "'y# c #C0D2D3", ")y# c #949498", "!y# c #D4D8D8", "~y# c #B4B9BA", "{y# c #A4A9AB", "]y# c #E6E4E6", "^y# c #C1C1C5", "/y# c #9DA2A6", "(y# c #8A9297", "_y# c #6353B8", ":y# c #2809AA", "z# c #ABACAD", ",z# c #220885", "'z# c #402E7D", ")z# c #9295AD", "!z# c #BFD0D0", "~z# c #9EA8AD", "{z# c #878B93", "]z# c #8A8A91", "^z# c #F1F0F2", "/z# c #EEEDED", "(z# c #A1A1A4", "_z# c #A5A9A9", ":z# c #BFD5D0", "A# c #D7DCDB", ",A# c #B0B3B4", "'A# c #A1A6AB", ")A# c #9FA6AC", "!A# c #B4BEC3", "~A# c #B8C0C4", "{A# c #BBC2C8", "]A# c #BBC5C6", "^A# c #B8C8C9", "/A# c #C2D7D2", "(A# c #A0AAC8", "_A# c #645AB6", ":A# c #2C10A8", "B# c #C3909D", ",B# c #CD7E8D", "'B# c #C4B4B8", ")B# c #C3B5BB", "!B# c #C9919E", "~B# c #CF6D80", "{B# c #CF7780", "]B# c #C79398", "^B# c #BAB4B9", "/B# c #B0CDD4", "(B# c #C1D4CF", "_B# c #A3ADC2", ":B# c #6A66AF", "C# c #B8BBC5", ",C# c #C1ACB5", "'C# c #C8A1A7", ")C# c #CB9DA1", "!C# c #C8A2A6", "~C# c #BDBABD", "{C# c #C5A3A6", "]C# c #C99397", "^C# c #B8B2B8", "/C# c #B7BAB6", "(C# c #C0ABA5", "_C# c #C9979B", ":C# c #BFAAAE", "D# c #3D4347", ",D# c #343739", "'D# c #333336", ")D# c #484A4D", "!D# c #656368", "~D# c #6E6C6C", "{D# c #797B6B", "]D# c #7C8170", "^D# c #7A7E78", "/D# c #7B7C7F", "(D# c #8E8C8C", "_D# c #A39F9E", ":D# c #EAEAE9", "E# c #3A1C93", ",E# c #7A79A3", "'E# c #B2C7C7", ")E# c #87949A", "!E# c #808E92", "~E# c #79868A", "{E# c #4F5457", "]E# c #494B4E", "^E# c #4E5154", "/E# c #585A5B", "(E# c #646861", "_E# c #656766", ":E# c #63636A", "F# c #75757B", ",F# c #74747B", "'F# c #656267", ")F# c #615F62", "!F# c #6C7173", "~F# c #757D80", "{F# c #B3CCD5", "]F# c #BDAEB1", "^F# c #C2A3A3", "/F# c #BCB8BB", "(F# c #BED0D2", "_F# c #2F14AF", ":F# c #1E01B5", "G# c #777678", ",G# c #7E7D7E", "'G# c #7B7D7F", ")G# c #7F807E", "!G# c #85857E", "~G# c #88897F", "{G# c #818687", "]G# c #808688", "^G# c #848883", "/G# c #8A897E", "(G# c #88897D", "_G# c #83857D", ":G# c #7C7E7E", "H# c #666E73", ",H# c #5B5C60", "'H# c #64696B", ")H# c #65686A", "!H# c #65696B", "~H# c #B2CACF", "{H# c #BBBDC4", "]H# c #BEBDC4", "^H# c #B9C4CA", "/H# c #BFC5C7", "(H# c #BCC1C6", "_H# c #B8BEC5", ":H# c #BAC4CA", "I# c #B1BCBD", ",I# c #B2BCBD", "'I# c #B2BBBC", ")I# c #B4BBBD", "!I# c #C0BABF", "~I# c #C1BCBE", "{I# c #C2B8BC", "]I# c #B0C2CD", "^I# c #B4ABB5", "/I# c #9D688A", "(I# c #7C266D", "_I# c #530A89", ":I# c #2B08AA", "J# c #C9A2A4", ",J# c #C6A1A5", "'J# c #B6A8B1", ")J# c #AFADB8", "!J# c #B0B1B9", "~J# c #B7B6BB", "{J# c #C0C5C7", "]J# c #BE9EA7", "^J# c #B05771", "/J# c #99164A", "(J# c #750A66", "_J# c #590C84", ":J# c #481398", "K# c #C87778", ",K# c #C96B6D", "'K# c #CB5F61", ")K# c #CB5B5C", "!K# c #CB6D6E", "~K# c #CC8888", "{K# c #CC9596", "]K# c #CD7274", "^K# c #C66062", "/K# c #BC5E5F", "(K# c #B96262", "_K# c #C86162", ":K# c #D16768", "L# c #CA7178", ",L# c #CB7F83", "'L# c #CB7F81", ")L# c #CD7776", "!L# c #CE6A69", "~L# c #CF5E60", "{L# c #CF5A60", "]L# c #CD6C74", "^L# c #CB878E", "/L# c #CB949A", "(L# c #D07274", "_L# c #C96060", ":L# c #BC5E5D", "M# c #ABB8CD", ",M# c #ADB8CB", "'M# c #ADB6CC", ")M# c #ABB5CA", "!M# c #AEB7CC", "~M# c #ACB6CB", "{M# c #ADB7CC", "]M# c #AAB5C8", "^M# c #ADB9CC", "/M# c #ACB9CD", "(M# c #ACB9CC", "_M# c #ABB6CD", ":M# c #ACB7CD", "N# c #48058A", ",N# c #680E75", "'N# c #6E1276", ")N# c #5E1285", "!N# c #4A0F92", "~N# c #430A8B", "{N# c #5A0874", "]N# c #7B095B", "^N# c #890A54", "/N# c #54087F", "(N# c #34049A", "_N# c #2E01A2", ":N# c #38039C", "O# c #938AB8", ",O# c #9489B4", "'O# c #968AC4", ")O# c #8C86BF", "!O# c #7778AC", "~O# c #595A9B", "{O# c #301EA4", "]O# c #1B02A5", "^O# c #1800A1", "/O# c #1C039F", "(O# c #1C01AB", "_O# c #1E03A7", ":O# c #1D02AA", "P# c #442BB1", ",P# c #432CB1", "'P# c #442DB0", ")P# c #462FB0", "!P# c #4430B1", "~P# c #3F2FB1", "{P# c #3B2FAD", "]P# c #3F30AA", "^P# c #4430A9", "/P# c #472FAA", "(P# c #422EB1", "_P# c #402DB6", ":P# c #412CB8", " > > > > , ' > > > ) ! ~ { ] ' ^ ^ > > > > > ' ' , > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ; - / ( > > > > > > > > > > > > > > _ , ' ' ' ' ' > > > > > > > > > > > > > > > > > > > > > : : ) ! ~ { < ' , , > > > > > > > > > > > > > > > > > > [ ! } | , , ; - / ( > > > > > > > > > > > > > > > > > 1 ) 2 } | ' ' ' ' 3 4 - 5 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , 6 7 8 > > > > > > > > > > [ ! } | ' < ' > > > > > _ , ' 9 / 0 ' > > > > > [ ! } | ' < ' > > > > > > > > > > > > > > > > > > > > > > > ) ! ~ { ' ' ' ' ' > > > > > > > > > > > > > > > > > > > > ' ] ] ' > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ' a b c d e f g h i j k l ", ". . + @ m m % & * = - ; > > > > _ , ' ^ > > ) ! n { ] ' ' ^ > > > > > ' ' , > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ; / / 9 > > > > > > > > > > > > > > > , ' ' ' ' ' > > > > > > > > > > > > > > > > > > > > > : : ) ! n { < ' ' , > > > > > > > > > > > > > > > > > > [ n } | , , ; / / 9 > > > > > > > > > > > > > > > > > 1 ) 2 } | ' ' ' ' o 4 - 5 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , p q r > > > > > > > > > > [ n } | ' < ' > > > > > > , ' 9 / 0 ' > > > > > [ n } | ' < ' > > > > > > > > > > > > > > > > > > > > > > > ) n n { ' ' ' ' ' > > > > > > > > > > > > > > > > > > > > , ] ] ' > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ' a b c d s f g t u v w x ", "y y z A B C D & * = - ; > > > > > , ' ^ > > ) 2 E F ' ' ' , > > > > > o o ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 9 / 5 > > > > > > > > > > > > > > > ^ G ' ' ' ' > > > > > > > > > > > > > > > > > > > > > _ _ H I J F ' ' ' ^ ; > > > > > > > > > > > > > > > > > ) E n | , , ; / / 9 > > > > > > > > > > > > > > > > > > ) E n | ' ' ' ' o K / ; > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > _ L M N > > > > > > > > > > ) E n | ' ' ' > > > > > > G O P 4 Q ' > > > > > ) E n | ' ' ' > > > > > > > > > > > > > > > > > > > > > > > R 2 E F ' ' ' ' ' > > > > > > > > > > > > > > > > > > > > G S ' ' > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ' G T U V W X Y Z ` . .. +. ", "@. #. #. $. %. &. *. =. * = - 5 > > > > > ^ ' ' ' , > [ ) > ^ ' ' , > > > > > 9 9 ( > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 0 0 ^ > > > > > , , , > > > > > > ) -. E ;. ' ' > > > > > > > > > > > > > > > > > > > > > > >. ,. '. ). !. ~. 9 ' ' K - 5 > > > > > > > > > > > > > > > > > O ;. S ' , > ; > > > > > > > > > > > > > > > > > , G T I {. ) > , ' ' o ^ > ; > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ; K ; > > > > > > > > > , ^ R [ H , , ' > > > > > ) -. J ]. ^. /. _ > > > > > > R [ H , ' ' > > , ' > > > > > > > > > > , ' > > > > > > > > F ) > ^ ' ' , > > > > > > > > > > > > > , ^ ^ > > > , G T E ) (. ' ^ ^ > > > > > > > > > > > > > > > > > > _ , ' ' ^ ^ > > > > > > > ^ ' ' ' ' o 9 9 ( > > > > > > > > > > > > > > ; _. :. <. [. }. |. 1. 2. 3. 4. 5. ", "6. 6. 6. 7. 8. 9. 0. a. b. c. d. ; > > > > > , ' G H H > > > > > ^ , ^ > > > > > 9 / ; > > > ; ; > > > > > > > > > _ > > > > > > > > ; ; > > > > > > _ _ > > > > ) ) R > > > > > , o ^ > > > > > ^ o ^ > > > > > > ) -. 2 O ' ^ > > > ; ; > > > > > > > > > > > > > > > > > >. ,. e. f. ^. g. / ^ ^ K / ; ) ) ) > ^ > > > > > > > > > > > ^ ^ ' ' , > > > H ) ) > ^ > > > > > > > > > > > _ , S E 2 h. 1 > > , o ^ > > > > > > > > > > > > > > > > > > > > > > > ; ; > > > > > > > > > > > > > > / / ; > > > ^ > > > > > , ' , > > _ , ' > > > > > ) {. I i. j. k. > > > > > > > > > > > , o > > ^ o > > > > > > ; ; > > R O ^ > > > > > > > > > > > ^ , > > > > > > > > > > > > > ^ ' ' ^ > > _ , S E n -. R ' ' ^ > > ^ > > ; ; > > > > > > > > > > > > H G ' ' ^ > > ^ > > > > ^ ' ' ' ' o 9 / ; > > > > > > > > > > ^ > > > ; 5 l. m. n. o. p. q. r. s. t. u. ", "6. 6. 6. v. 8. w. x. y. z. A. > > > > > > _ , ' B. -. [ > > > > > ^ ^ ^ > > > > > ( ; ; > > ; 5 9 ; > > > > > > > , , , ^ > > > > > ; 5 9 0 ^ > > ^ , , , > > > > -. -. [ , > > > > , ^ ^ > > > > > C. C. 0 > > > > > > R [ h. > ^ ^ > > ; 5 / ; > > > > > > > > > > > > > > > > _ D. r E. /. / 5 ^ ^ 0 Q ^ ) {. E R , , > > > > > > > > > > > ^ , , > > > > ) -. E R ^ ^ > > > > > > > > > > > , ' F | H 1 > > > ^ > > > > > > > > > > > > > > > > > > > > > > > > 9 9 ; > > > > > > > > > > > > > ( ; ; > > ^ ^ , > > > > , , , > > > , ' > > > > > ) h. [ F. G. S > > > > > > > > > > > > ^ > ; K 4 ; > > > > ; 5 9 > ) -. E O ^ ^ > > > > > > > > > ^ > > > > > > > > > > > > > > ^ ' ' , > > > , ' ) -. 2 2 G ' , > ^ ^ ^ > 9 9 ; > > > > > > > > > > ) -. T G ' , > , , ^ > > > > , ' ' ' ^ ( ; ; > > > > > > > > > , , ^ > > > ; 0 H. I. J. K. L. M. N. O. P. ", "6. 6. 6. Q. 8. R. S. T. U. V. _ > > > > > _ , G E 2 h. > > > > > > > > > > > > > > > > > > ; 9 / ; > > > > > > > G S ' ' > > > > > ; 9 / W. ' , > ' ' ' G > > > ) X. 2 F ' ^ > > > > > > > > > > ; - / ( > > > > > > > > > > > > > > ; / - ; > > > > > > > > > > > > > > > > > > > > > > > > > , ' , R 2 n | , , > > > > > > > > > > > > > > > > > > ) E n | , , > > > > > > > > > > > ^ ' ' ' , > > > > > > > > > > > > > > > > ) > > > > > > > ; > > > > 9 / 9 > > > > > > > > > > > > > > > > > ; ; ^ ' > > > > > > > > > > ^ o > > > > > > > , p q Y. > > > > > > > > > > > > > > ; / - ; > > > > ; 9 / > ) E n ;. ' , > > > > > > > > > > > > > > > > > > > > > > > ; R ' ' , > > > ^ ' (. R 2 n | , , > ' ' , ; - / ( > > > > > > > > > > ) E n | , , > ' ' , > > > > > G G ^ > > > > > > > > > > > > > ' ' , > > > > G Z. `. + .+ ++ @+ #+ $+ $+ ", "6. 6. #. %+ &+ *+ =+ -+ ;+ >+ > > > > > > > > > [ ) > > > > > > > > > > > > > > > > > > > > 0 W. > > > > > > , G T T | ' > > > > > > ; ; > , , ' ' G ,+ E [ > > > h. ) ^ ' ' ^ ^ > > > > > > > > > 5 ; > > > > > > > > > > > > > > > > ; ; > > > > > > > > > > > > > > > > > > > > > > > > > > , , ' ' G | H > > > , ^ ^ > > > > > > > > > > > ^ ' ' ' G | H , , ' > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ) -. X. h. > > > > ; 9 - 5 > , ' > > , ' > > > > > > > > > > > > > > > > / / ( > , ^ ^ > > > > > > ; 9 9 ; > > > > > > > D. D. > > > > > > > > > > > > > > > > ; ; > > > > > > 0 W. > > R ;. S ' , > > > > > > > > > > > > > > > > > > > > > > ) -. E | , , > > > > > ' ' G | H > > > ' ' , > 5 ; > > , ^ ^ > > > > > > > ) [ H > > > > > > > > > > ) T T [ > > > > > > ; 9 / ; > > > > > > > > > > >. '+ )+ !+ ~+ {+ ]+ ^+ /+ $+ ", "6. 6. #. (+ _+ :+ <+ [+ }+ |+ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ^ , ' > > > > > , , G n n B. ' , > > > > > > > > > , ' ' R 1+ 2 ) > > > > > ^ ' ' ' ^ > > > > > > > > > > > > > > > > > > > ; ; > _ > > > > > > > > ; ; 2+ 2+ R > > > > > > > > > > > > > > > > > > 3+ ) R o ' ' , > > > > ^ , ^ > ) ) R > > > > > > ^ ^ ' ' ' ' , > > , ' , > > > > > ^ > ) ) R > > > > > > > ^ > > > > > > _ ^ ^ , R 4+ 5+ { O S G G 0 C. 6+ 0 o N F. 7+ 8+ ;. ;. H > > > > > > > > > ^ _ > > > > / / ( > ' ' ^ > > > > > > ; 9 / ; > > > > > > > > > > > > > > > > > > > > > > > > > > H ) ) R > _ , , ' > > ^ ' ' , ^ > _ _ > > ; ; > > > > > > > > > > > > > > > ) -. 2 R , , > > > > > ^ ' ' , > 3+ ) ) ' ' , > > > > > ' ' ^ > > _ > > _ ^ ^ > > > > > > > > > > > > ) n ! -. > > _ > > > ; 9 / ; > , _ _ > > > > > R | 9+ 0+ !+ ~+ a+ b+ c+ d+ y ", "6. 6. #. (+ _+ :+ e+ f+ g+ h+ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , , > > > > > , , G n } ,+ , , , > > > > > > > > > , , H [ h. > > > > > > ^ , ' ' , > > > > > > > > > > > > > > > > > > ; 5 9 ^ , , ^ > > > > > ; 5 d. 1+ E [ > > > > > > > > > > > > > > > > > > ) {. 2 O ' ' , > > > > ^ , , ^ -. -. [ > > > > > > > ^ , , , , , > > > , , , ^ > > ^ ^ ^ -. -. [ > > > > > > ^ ^ ^ > > > > i+ i+ >. o ' S j+ k+ l+ S F. S S o W. W. o ' m+ F. n+ o+ p+ q+ | > > > > > > > > ^ ^ , > > > > ( Q r+ , ' ' , > > > > > > > ; 9 > > > > > > > > > > > > > > > > > > > > > > > > > > > H -. -. [ , , , , , > > ^ , , ^ ^ , , , , > 9 9 ; > > > > > > > > > > > > > > R [ h. ; , , > > > > > ^ ^ , , > ) -. E G ' , > > > > > ' ' , > , , , , , , ^ > > > > > > > > > > , , H n } -. > , , , ^ > > ; ( > , , , , , > > > ) -. q+ s+ t+ u+ ~+ v+ w+ c+ d+ y ", "6. 6. #. $+ &+ x+ y+ z+ A+ B+ _ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ) > > > > > _ , G E 2 h. > ' ' , > > > > > > > > > > > > > > > > > > > > > ' ' , > > > > > > > > > > > > > > > > > > ; 9 / O N ' ' > > > > > ( / C+ 5+ D+ h. > > > > > > > > > > > > > > > > > > ) E n | , , > > > > > > , ' G E 2 h. > > > > > > > > > > > > > > > > > ' ' , > > _ , S E 2 h. > ) ) > > > > , ' ^ > > ) E+ F+ _ G+ 1 1 H+ I+ )+ )+ J+ K+ H+ H+ H+ L+ K+ H+ M+ N+ O+ P+ Q+ ! [ > > > > > > > > > ^ o > > > > > > ^ G ' ' ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ) X. 2 F ' ' ' , > > > > > > > , ' S S G > 9 / 9 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ) E n | , , > > > > > ' ' , > G S ' ' ' o ^ > > > > > > > > > > , ' S E 2 h. > ' ' ' ' ^ > > > > > ^ S ' ' , > > ) E R+ S+ `. + T+ U+ w+ V+ d+ y ", "W+ W+ 6. y X+ Y+ Z+ `+ ;+ @ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ) -. X. h. > > > > _ , ' | ) > > ' ' , > > > > > > > > > > > > > > > > > > > > > ' ' ^ > , , , > > > > > > > > > > > > > > _ , ^ -. T ) G+ 1 > > > > ( .@ / +@ @@ 8 > > > > > > > > > > > > > > > > > > > O ;. S ' , > > > > > , ' ' ' | F G o 9 9 ( > > > > > > > > > > > > > > > > > > _ , ' ;. O R ) I 2 [ _ > , ] #@ $@ >. B. 5+ %@ &@ *@ =@ -@ -@ ;@ >@ ,@ '@ )@ !@ ~@ {@ ]@ ^@ /@ (@ _@ :@ <@ [@ }@ |@ 2+ 8+ O > > > > > > ( 9 9 0 , , > > ) -. E | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > h. ) > ^ ' ' , > > > > > > _ , G 1@ E [ > 0 0 ^ > > > > > > > > > > > > > > > > > > ; 9 / ; > > > > > > > > > R [ H > > > > > > > > , , G T E 2@ _ _ > > > > > > > > > > > , ' ' ' | ) > > > , , ' ' ' , > > ) -. E ;. ' , > > 3+ 2+ 3@ 9+ )+ !+ 4@ 5@ 6@ 7@ d+ y ", "8@ 6. 9@ 0@ a@ b@ Z+ `+ }+ c@ > > > > > > > > > > > > > > > > > > > > > > > > > > _ > > > ) -. 2 ) > > > > _ , ' , > ) ) ' ' , > > > > > > > > > > > ^ _ > > > > > > ) ) ' ' ^ > , , R ) > ^ > > > > > > > > O O d@ e@ e@ f@ g@ h@ i@ j@ k@ f@ f@ f@ l@ m@ n@ b. o@ p@ q@ 7+ O ^ > ( ( ; > > > > > > > > > > > ^ ^ ' ' , > > > > > > , ' ' ' > ^ , o 9 / ; > > > > > > > > > > > > > > > > > > > , ' ' ' (. H q+ r@ { ^ 0 : s@ t@ u@ v@ w@ x@ y@ z@ A@ B@ C@ D@ E@ F@ G@ H@ I@ J@ K@ K@ L@ M@ N@ O@ P@ Q@ R@ S@ T@ U@ V@ )+ 1 O ^ ^ > > >. ^ 9 - 3 ' , > > ) -. 2 2+ > > > > > > > , _ > > > > > > > > > > > > > > > > > > > > > > > > > > > ^ > > > > > > ^ , ^ > > > > > > _ , G E 2 h. > , o ^ > > > > > > > > > > > > > > > > > > ; 9 / ; > > > > > > > > > > > > > > > > > > > > > , G E 2 W@ > > > > > > > ; ; > ^ > > ^ ' ' ' > > > > > > , ' O R H > > ) -. 2 O ' ^ > > > > G X@ Y@ Z@ 4@ 5@ 6@ 7@ d+ y ", "%+ %+ %+ `@ # .# +# @# ## $# > > > > > > > > > > > > > > > > > > > > > > > > > , , , ^ > R [ F > > > > > > , ' (. R -. E G ' , > > > > > > > > > > ^ ^ , > > > > > ) -. E G ' , > , R -. E O ^ ^ > > > > > > O O d@ d@ %# &# n@ *# =# h@ -# ;# * ># Z. ,# '# )# !# )# ~# {# ]# 7+ W. K / / 9 ; > > > > > > > > > > > ^ , , > > > > > > > , , , ^ > _ , ^ ( ; ; > > > > > > > > > > > > > > > > > > > > , , (. (. >. ^# /# j+ 6+ (# _# :# <# [# }# |# 1# 2# 3# 4# 5# 6# 7# 8# 9# 0# a# b# c# d# d# e# f# g# h# i# j# k# l# m# n# o# p# q# 7+ o o ^ > ,. Y. K - 3 ' , > > R [ h. ; > > > > > > , , , , ^ > > > > > > > > > > > > > > > > > > > > > > > > , , ^ > > > > > ^ ^ ^ > > > > > > > , ' [ h. ) > , ^ ^ > > > > > > > > > > > > > > > > > > > ; ( > > > > > > > > > > > > > > > > > > > > > > ^ ^ [ W@ r# / ; > > > > ; 5 9 0 ^ ^ > ^ ^ , ^ > > > > > > ^ > ,+ 1+ [ > > R [ h. > ^ ^ > > > > ^ s# t# u# 4@ v# w# x# d+ y ", "y# y# $+ @. z# A# B# C# A+ B+ _ > > > > > > > > > > > > > > > > > > > > > > > > G S ' ' > > , ' ^ > > > > > ^ ' ^ ) E n | , , > > > > > > > > > > > ^ o > > > > > ) E n | , , > > ) E n ;. ' , > > > R O d@ O D# E# F# V@ G# H# I# J# K# L# M# N# O# P# Q# R# S# T# U# V# W# X# Y# 3 (# Z# `# l. K > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ^ ' $ .$ K+ +$ @$ #$ J@ $$ %$ &$ *$ =$ -$ ;$ >$ ,$ '$ )$ !$ ~$ {$ ]$ ^$ /$ /$ /$ ($ _$ :$ {$ {$ <$ [$ }$ |$ 1$ 2$ 3$ 4$ 5$ 6$ D. >. ^ 7$ '. 0 - 8+ G G > > > > > > > > > > > , ' G G ' ' > > > > > > > > > > > > > > > > > > > > > > > > ' ' , > > > > > > > > > > > > > > > ^ ' > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > _ > / - 5 > > > > ; 9 / W. ' , > > > > > > > > > > > > ) X. 2 [ > > > > > > > > > > > > 0 8$ 9$ 0$ 4@ U+ w+ V+ d+ y ", "$+ $+ $+ `@ # a$ b$ c$ ;+ @ > > > > > > > > > > > > > > > , o 9 9 ( > > > , G T E 2@ , ' ' ' ' ' ^ ^ > > > > > > > R | H > > > > > > > > > > > > ; 9 9 ; > > > > > ) [ H > > > > > O ;. S ' , > D# j+ d$ e$ f$ g$ v@ h$ i$ j$ k$ l$ m$ n$ o$ p$ q$ r$ s$ t$ u$ v$ w$ x$ y$ z$ A$ B$ C$ D$ E$ F$ G$ H$ I$ d@ O > D# > , , ^ > > > > > > > > > > > > > > > , ' > > > > > > > > > > > > > > > > > > > > > > > > > > , ' > 0 6+ K J$ K$ L$ M$ N$ O$ P$ Q$ R$ S$ T$ U$ V$ W$ X$ Y$ Z$ `$ % .% +% @% <$ #% #% #% ($ :$ ($ @% $% %% &% *% =% -% ;% >% ,% '% )% !% ~% 0 7+ {% ]% ^% J E [ > > > > > > > > > > _ , S 1@ E [ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , , , > > > > > > > > > > > > > > > > > > > ; 5 ; > > > > > > ; > > > > > > > > > > > > > > > > h. ) > > > > > > > > > > > > > G ~# /% (% T+ 5@ 6@ 7@ d+ y ", "y# $+ $+ Q. _% :% <% [% * }% > > > > > > > > > > > > > > _ , o _. |% 5 > _ , , G E 2 h. > ' ' ' ' ' , ^ > > > > > > ^ ^ , > > > > > > > > > > > > > ; 9 / ; > > > > > > > > > > > > ^ ^ ' , o e@ H. 1% ^ 2% 3% 4% 5% 6% 7% 8% 9% 0% a% b% c% d% e% f% g% h% i% j% k% l% m% n% o% p% q% v$ r% s% t% u% v% w% 5$ 7+ {# x% I$ {# F. ^ > > > > > > > > > > > > > > ^ , ' > > > > > > > > > > > > > > > > > > > > > ^ > > > ^ , ' > ( y% z% A% B@ B% C% D% E% F% G% H% I% J% K% L% M% N% O% N% N% N% P% #% #% #% #% #% #% #% #% Q% Q% Q% R% S% T% U% V% W% X% Y% Z% `% & .& +& C. (# 4 @& I 2 [ > _ ^ > > > > > > > > ^ 7+ E 2 [ > > > > > > > , , ; ; ^ D. ) ) R > _ > > > > > > > > > > > _ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , ' ^ > > > > > > , > > > > > > > > ^ _ _ > > > > ^ > > ; ; > > > > > > > > > > > > > > > > > > > > > > > > > > ; ; > > > > > G #& $& u+ T+ 5@ 6@ 7@ d+ y ", "y# y# $+ Q. %& && *& =& -& ;& > > > > > > > > > > > > > > _ , o 1+ J [ , , , , ^ [ h. ) > ^ ^ , , , ^ ^ > > > > > > > ^ , > > > > > > > > > > > > > > ; 9 > > > > > > > > > > > > > > ^ , ^ >& &# * ,& '& s% )& !& ~& {& ]& ^& /& (& _& :& <& [& }& |& 1& 2& 3& 4& 5& 6& 7& 8& 9& 0& a& b& c& d& e& f& g& h& i& j& k& m@ l& m& F. ^ > > > > > > > > > > > > > > > ^ , > > > > > > > > > > > > > > > > > > > > , , ^ > > > ^ , ^ n& o& p& q& r& s& t& u& v& T% w& x& :$ @% ^$ ($ x& x& +% x& I% I% y& #% #% #% #% #% #% #% #% Q% Q% Q% z& A& B& C& ~$ D& E& F& G& H& I& J& K& L& K 5 3+ [ [ ) > , , ^ > > > > > > ( C. K [ [ ) > > > > > > >. M& N& K K ' ,. O& 1+ [ , , , ^ > > > > > > > > , , , > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , ^ ^ > > > > > , , , > > > > > > ^ ^ , , , > > , , ^ > 9 9 ; > > > > > > > > > > > > > > > > > > > > > > > > > 9 9 ; > > > > G #& P& u+ T+ v# w# x# d+ y ", "$+ $+ %+ Q& %& R& S& T& U& V& > > > > > > > > > > > > > > _ , G E J F ' ' o ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ) > > > G S 0 W& X& Y& Z& `& * .* +* @* #* $* %* &* ** =* -* ;* >* ,* '* )* !* ~* {* ]* ^* /* (* _* :* <* [* }* |* 1* 2* 3* 4* 5* 6* 7* 8* 9* 0* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ' ' , > > > > > G J+ a* b* c* b# d* ~$ )$ &% e* :$ #% #% Q% K% #% #% #% #% #% #% #% #% #% #% #% #% #% #% #% #% #% #% #% #% #% :$ :$ z& f* g* h* i* j* k* l* m* n* o* > > > > > > ' ' , > > > > ) > ( 9 / ; > > > > > > > > >. p p* n+ C. N q* r* n F ' ' o ^ > > > > > > > ^ ' ' ' ^ ; > > > > > > > > > > > > > > > > > > > > > > G O O j+ j+ j+ R > > > > > > > > > > > > > > > > > > > > > > > ' ' > ) > > > > > > ^ S ' ' , > ' ' , ; - / ( > > > > > > > > > > > > > > > > > > > > > > > > > / / ( > > > > G s* P& u+ t* v+ b+ u* d+ y ", "#. #. 9@ 0@ v* w* x* y* z* A* > > > > > > > > > > > > > > > > > [ ) ^ ' o ^ > > > > > > , , , > > > > > , ^ ^ > > > , o 9 9 ( > > > > > > > > > > > > > > _ , ' > > > > > ) -. X. B* > ]# C* D* E* F* G* H* I* J* K* L* M* N* O* P* Q* R* S* T* U* V* W* X* Y* Z* `* = .= += @= #= $= %= &= *= == -= ;= >= ,= '= )= != ~= {= ]= ^= /= (= %# 0 > > > > > > > > > > > > > > > , ' ' o 9 9 ( > > > > > > > > > > > > > > > > > , ^ ^ G _= := -@ <= [= }= x& x& z& |= #% #% #% #% #% #% #% #% #% #% #% #% #% #% #% #% y& N% N% N% N% N% #% #% #% #% #% @% @% z& 1= 2= 3= 4= 5= 6= M@ 7= U@ 8= 1 _= ^ > > > > > > > > ) -. X. h. > ^ W. > > > > > > > > > , 9= 0= ' o 0 6+ a= |% 0 ' C. 9 ( > > > > > > > > > , r+ 9 / ; > > > > > > > > > > > > > > > > > > > , _= x% b= c= d= e= f= g= h= > > > > > > > > > > > > > > > > > > > > > > > R -. X. h. > > > > ) -. E ;. ' , > > > > > 5 ; > > > > > > > > > > > > > > > > > > > > , ' > > > > ; ; > > > > > G s* o& u+ t* a+ b+ V+ d+ y ", "W+ W+ 8@ y P. i= j= k= l= }% > > > > > > > > > > > > > > > > > > > ^ o ^ > > > > > ; ; ^ ' ^ > > > ^ , ' ' ^ > > ^ , o 9 / ; > > > > > > > > > > > ^ > ; ; R G ^ > > > > ) T q+ m= d@ , n= o= p= q= r= s= t= u= v= w= x= y= z= A= B= C= D= E= F= %$ G= H= I= J= K= P$ L= G= M= N= O= P= Q= R= S= T= U= V= W= X= Y= Z= `= }* - .- +- @- 1% e@ G H > > > > > > > > > > > > ^ ' ' ' o 9 / ; > > > > > > > ; ; > ^ ; ; > > > > , ^ > D# #- $- %- &- *- ($ =- #% #% #% #% #% #% #% #% #% #% #% :$ -- -- x& #% #% x& -- +% V% V% .% .% V% -- :$ :$ x& #% #% #% ;- Y$ 1= 1= >- ,- '- )- !- ~- >@ {- ]- +& ; ; > > > > > > ) -. 2 2+ _ , ' > > > > > ^ > > > > , , ' o K - - 9 ^ ' C. 9 ; G G 7+ 7+ e@ ^- ^- ^- ^- /- (- _- :- <- O > _ _ > > > > > ) ) > ^ > > > > O 8+ k@ [- ~@ }- |- 1- 2- 3- 4- K+ f@ 5- e@ ^ > > ; > >. , ^ : > > > > > > > > > > > ) -. 2 ) > > > > ) -. 2 j+ o ^ > > > > _ > ) ) ) > ^ > > > > > > > > > > > > > > > ^ , ' > > > > > > > > > > > G l@ W& u+ t* a+ b+ V+ d+ y ", "W+ W+ 6. y P. 6- 7- 8- 9- 0- > > > > > > > > > > > > > > > > > > > ^ ^ > > > > > ; 5 / 0 ^ ^ > > ^ ^ ' ' ' , > > > ^ ^ ( ; ; > > > > > > > > > > ^ ^ ^ 9 r# 1+ T O ^ ^ > > H | k+ 1% G a- b- c- d- e- f- g- h- i- j- k- l- m- n- o- p- q- r- s- t- u- v- w- x- y- z- A- B- C- D- E- C- F- G- H- I- J- K- L- M- N- O- P- Q- R- S- T- U- V- W- O l+ ;. > > > > > > > > > > > > ^ ' ' ' ^ ( ; ; > > > > > > ; 5 9 ^ ^ K / ; > > > ^ 1 t@ X- Y- Z- `- X$ ; #% @% #% #% #% #% #% y& I% I% y& M% /$ C& .; +; I% @; #; P% +% $; V% V% %; &; .% *; ($ *; .% #% #% #% #% R% A& =; -; ;; d* >; ,; '; ); !; ~; O+ / 5 > > > > > > R [ F > , , , > > > > , , ^ > > > > ^ W. n+ K 9 9 ; > ^ Q 0 ^ S F. ]# e@ e@ ^- {# m& m& {; m& ]; ^; d@ O G _ _ > > > > ) -. E R o ^ > > O <- /; (; _; :; <; [; }; |; 1; 2; 3; K+ l& m@ O > > 9 0 r M 0 9 ( > > > > > > > > > > R [ F > > > > > R [ h. d. C. Q > > ^ ^ , , ) {. E R , , > > > > > > > > > > > > > > > ^ , > > > > > > > > > > > G ~# 4; 5; t* v+ b+ u* d+ y ", "6. 6. #. y P. 6; 7; 8; c= 9; _ > > > > > > > > > > > > > > > > > > > > > > > > > ; / - 5 > > > > > ^ S ' ' , > > > > > > > > > > > > > > > > > > _ , o C. |% J n ;. ' , > > ^ o ] m+ 0; a; b; c; d; e; f; g; h; i; +* j; k; l; m; n; o; p; q; r; I@ s; t; u; v; w; x; y; z; A; x; B; C; D; E; F; G; H; I; J; K; L; M; N; O; P; Q; R; S; T; U; V; W; d@ G > > > > > > > > > > ; R ' ' , > > > > > > > > > > ; 9 / o o K - 5 > > > O X; {@ Y; }@ Z; `; > .> +> R% #% #% #% #% #% I% @> @> N% #> $> %> &> *> U$ => -> ;> T$ T$ >> T$ T$ T$ >> ,> '> >> )> P% #% #% #% #% #% x& .% .% ~$ +% !> ~> {> ]> Q@ ^> l. K > > > > > > > , ' ^ > > > > > > > ' ' , > > > > > (# n+ 0 > ^ ^ O O l+ l+ S ' G+ #- /> V@ {- {- {- {- (> (> 4$ 8= _> : K :> >& 7+ O O O F n n ;. ' ' > > >& 6+ <> [> }> |> 1> 2> 3> 4> 5> 6> 7> 8> 9> 0> o* H O - K '. 6 8+ @& a> > > > > > > > > ; > _ , ' ^ > > > > > > > / / ( > > > , ' , R 2 n | , , > > > > > > > > > > > > > > > > > > > > > > > > > > > > O b> c> d> 4@ U+ w+ V+ d+ y ", "6. 6. #. y v* i= e> f> g> h> _ > > > > > > > > > > > > > > > > > > > > > > > > > > ; ; > > > > > ) -. E ;. ' , > > > > > > > > > > > > > > > > > > > > > > ; ) | S ' , > D# 7+ m@ S i> j> k> l> m> n> t= o> p> q> r> s> t> u> v> w> x> y> z> A> B> C> D> E> F> G> H> I> J> K> L> L> M> N> O> P> Q> R> S> T> U> V> W> X> Y> Z> `> , ., +, @, #, $, %, &, Z. *, > > > , ' , > > ) -. E | , , > > > > > > > > > > > ; ; > > ; 5 ; > > > f@ =, -, ;, >, ,, .> ~$ ($ #% #% #% #% #% #% #% ', ), !, $; ~, {, ], ^, /, (, _, x- :, <, [, }, |, 1, J- w- 2, 3, 4, 5, T% <$ 6, #% #% :$ 7, 8, 9, 0, a, b, L% c, d, e, f, 7+ o ; 9 9 ( > > _ , ' ' ^ ^ > > > > > > > > > > > > > ; > _ _ g, h, i, j, k, l, m, k@ s@ n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, j, F, I$ G, ;. ' ' ' ' ' {# > H, I, J, K, L, S; M, N, O, P, Q, R, S, T, U, V, I$ W, 9 , '. 4+ X, W@ > > > > > > ; 9 - 5 > , ' ' ^ ^ > > > > > ; ; > > > > > > ' ' G | H > > > , ^ ^ > > > > > > > > > > > > > > > > > > > > > > > > 0 b> c> Y, 4@ 5@ 6@ 7@ d+ y ", "6. 6. #. 0@ v* && j= =& Z, `, ) D# > > > > > > > > > ) ) > > > > > > > > > > > > > > > > > > > > > ) -. 2 O ' ^ > > > > > > > ^ _ _ > > > > ^ > > > > > > > , , r ' , ^ ; 8+ H. 8+ a- ' .' +' @' #' $' %' &' *' =' -' ;' >' ,' '' )' !' ~' {' ]' ^' /' (' _' :' <' [' }' |' 1' 2' 3' 4' 5' 6' 7' 8' 9' 0' a' b' c' d' e' f' g' h' i' j' k' l' m' n' o' p' q' ^- Z. d@ > O H H > > ) -. 2 R , ^ > > > > > > > > > > > > > > > > > > > > G )# r' s' t' u' .> v' #% |= B& z& ($ #% ($ -- #% w' x' X$ >; f# y' z' A' B' C' D' E' F' G' H' I' J' F' K' 2, L' H@ M' N' O' P' 6, #% :$ Q' W$ R' S' K= T' T' b# U' P% V' W' W- X' Y' .@ - 9 > > > , ' ' , ^ > > > > > > ; ) ) > ^ _ > G e@ Z' `' - ) .) +) @) #) $) %) &) *) =) -) ;) >) ,) ') )) !) ~) {) ]) ^) /) () _) :) <) }- [) }) #- {# F. ' , S |) L+ 1) 2) 3) 4) 1* 5) 6) 7) 8) 9) 0) a) b) c) d) e) f) g) h) i) j) , E I [ > > > > > > ; 9 / ; > , ' < ' ^ > > > > > > > > > > > > > ^ ' ' , > > > > ^ ' , > > > ) ) > ^ > > > > , , ; ; ) ) 3+ > >. , Q Q ^ N k) [. l) T+ 5@ 6@ 7@ d+ m) ", "6. 6. 6. Q. v. i= n) o) n@ p) E R ^ ^ > > > > > > ) -. 2 R ^ ^ > > > > > > > > > > > > > > > > > > R [ h. > ^ ^ > > > > > > ^ ^ , , , > > , , ^ > > > > > > >. N& q) 9= ^ 0 (# r) :> {@ s) t) u) v) w) x) y) z) A) B) C) D) E) F) G) H) I) J) K) L) M) B> N) O) P) Q) R) S) T) U) V) W) X) Y) Z) `) ! .! +! @! #! $! %! &! e' f' *! =! -! ;! >! ,! l' '! )! !! ~! L+ )# {! K ]! -. 2@ > > R [ h. > ^ ^ > > > > > > > > > > > > > > > > > > > ^ S ^! /! (! _! :! Q% r! s! t! u! v! - 5 > > > > , , ^ ^ > > > > > > ) -. E R ' , > G {! w! x! y! z! A! B! C! D! E! F! G! H! I! J! K! 2* L! M! N! O! P! Q! 1& R! S! T! )! U! V! W! X! Y! Z! >& ,& 7+ *, *, `! ~ .~ +~ @~ #~ $~ %~ &~ *~ =~ -~ ;~ >~ ,~ '~ )~ !~ ~~ {~ ]~ ^~ /~ , 2@ [ ) > > > > > > > ; ( > _ , ' < ' , > > > > > > > > > , , > > ^ ^ , , > > > > ^ ^ , , > ) -. E O , , > > >. M& N& 0 @& (~ E 2+ _ M& _~ :~ f. <~ p [~ }~ l) T+ v# w# x# d+ |~ ", "#. #. 6. 7. 1~ 2~ 3~ 4~ 5~ 6~ n *, ' ' > > > > > > 2+ J 7~ *, 9= ' > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ^ S ' ' , > ' ' , > > > > > > >. p 8~ M& o n+ _- 9~ 0~ s' a~ b~ c~ d~ e~ f~ g~ h~ i~ j~ k~ l~ m~ n~ o~ p~ q~ r~ s~ t~ u~ v~ w~ x~ x~ x~ y~ z~ A~ B~ C~ D~ E~ F~ G~ H~ I~ J~ K~ L~ M~ N~ O~ P~ Q~ R~ S~ T~ U~ T$ V~ W~ X~ Y~ Z~ `~ { .{ +{ @{ :- #{ I h. > > > > > > > > > > > > > > > > > > > > > > > > > > > , ] k) ${ %{ &{ l# J% *{ R% ={ -{ Z$ N% ;{ >{ *> ,{ '{ ){ b' U> !{ a! w' v' _$ _$ _$ _$ _$ _$ ', $; &; $; ', _$ _$ _$ _$ :$ #% #% #% @% ~{ {{ ]{ ^{ /{ ({ _{ :{ <{ [{ J@ }{ |{ 1{ 2{ 3{ 4{ |% 5{ > > > > > > > > > > > > > > ) E n ;. S S O 5$ ^> 6{ 7{ 8{ G* 9{ 0{ a{ b{ c{ d{ e{ f{ g{ h{ i{ j{ k{ {* l{ m{ n{ o{ p{ q{ r{ s{ t{ u{ v{ w{ x{ T; y{ z{ A{ * 5- B{ C{ D{ E{ F{ G{ H{ I{ J{ E- K{ L{ g! M{ N{ O{ 7' P{ Q{ R{ S{ T{ U{ V{ N , > > > > > > > > > > > > > , ' G G ^ > > > > > > > > > ' ' , > > > > > > > > > > > ^ ' ^ ) E n ;. ' , ; > D. p p* E. ^% W{ n [ D. q) e. j. X{ G. 6 [~ }~ l) t* v+ b+ u* d+ |~ ", "$+ %+ `@ Q. 1~ Y{ 3~ Z{ Z, `{ _. '. p r > > > > > > 9 ] .] +] M r > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ) -. E ;. ' , > > > > > > > > > > D. q 8~ N& o >& :> @] #] $] %] &] *] =] e~ -] ;] >] ,] '] )] !] ~] {] '* ]] ^] /] (] _] :] <] [] }] |] 1] 2] 3] 4] 5] 6] 7] 8] 9] 0] a] b] c] d] e] f] g] h] i] j] k] l] m] n] o] p] q] r] s] t] u] v] w] x] y] z] A] |% a> > > > > > > > , ' > > > > > > > > > > > > > > > > > > ^ ' 8+ B] C] D] E] @% v' N% ;{ F] `$ `$ G] c# H] I] J] 6! K] L] >; M] /$ N] :$ :$ :$ :$ :$ :$ :$ -- .% .% +% 6, 6, :$ :$ @% #% #% #% #% -- $> 0# O] P] Q] R] S] T] U] V] W] X] Y] Z] `] ^ J .^ > > > > > > > > > > > > > > > R ;. G +^ @^ #^ $^ %^ &^ *^ =^ -^ ;^ >^ ,^ '^ )^ !^ ~^ {^ ]^ ^^ /^ (^ _^ :^ <^ [^ F! }^ |^ 1^ 2^ 3^ 4^ 5^ 6^ 7^ 8^ 9^ 0^ a^ b^ c^ d^ a e^ f^ g^ h^ i^ j^ k^ l^ m^ n^ X> H] o^ p^ q^ r^ s^ t^ u^ v^ w^ x^ y^ {# _= , , > > > > > > > > > > (. z^ S 1@ E [ > > > > > > > > > > > > > > > > > > > > > > > > > > > O ;. N o C. / 0 ' A^ , > ; R | G 9= B^ m+ C^ W{ o+ >& m@ }~ l) T+ v+ b+ u* d+ 0@ ", "%+ %+ %+ Q. %& i= 3~ D^ E^ F^ r# Y. p D. > > > > > > C. G^ H^ +] ,. D. > > > > > ; ( ^ > ) ) R > > > > > > > > > ; ; > > > > > > > [ n } | , , > > > > > > > ^ > ( ^ r M ' n+ I^ J^ K^ L^ M^ N^ O^ P^ Q^ R^ S^ T^ U^ V^ W^ X^ Y^ Z^ `^ / W= ./ N) +/ @/ #/ $/ %/ &/ */ 1] =/ -/ ;/ >/ ,/ '/ )/ !/ ~/ {/ ]/ ^/ // (/ _/ :/ ) ) R > > ^ , ' , > > > > > > > > > > > > > ; ; > G S H+ ~@ e/ f/ g/ h/ J% i/ N% N% .% .% M% W$ P] K' j/ )- k/ M% .% I% I% I% #% #% #% #% #% #% #% #% #% y& y& #% #% #% #% y& #% B& B& z& #% N% N% *; > > > > > > > > > > > > > ^ S v/ k) k& w/ x/ y/ z/ A/ B/ C/ D/ E/ n- F/ G/ H/ I/ J/ K/ L/ M/ N/ O/ P/ Q/ R/ S/ T/ U/ V/ O* W/ F= X/ Y/ Z/ `/ ( .( 6/ +( @( #( $( %( &( *( =( -( ;( >( }/ ,( '( M' J- )( !( ~( {( ]( ^( /( (( _( :( <( [( 1% {# ' , > > > > > > > ^ > ) R ^ S E 2 [ > > > > > > > > > > > > > > > ^ > ) ) R > > > > > > ^ ^ ' ' ^ 9 / 0 ^ > > > , , , ' ' ' , T I (~ /; * }~ + T+ v+ b+ V+ d+ y ", "9@ 9@ 9@ 7. 1~ i= 3~ D^ }( |( E a D. >. > > > > > > Q 1( /. ' D. >. > > > > > 9 C. Q ^ -. -. [ > > > > > > > > > 9 9 ; > > > > > > [ n } [ _ , > > > > > > ^ ^ ^ 9 9 K 0 ( z* 2( 3( 4( 5( 6( 7( 8( 9( 0( a( b( c( d( e( f( g( h( i( j( m{ k( l( m( n( #/ o( p( q( r( s( t( u( v( w( x( y( z( A( B( C( D( E( F( G( d] H( I( J( O~ K( L( M( N( O( P( Q( R( S( T( U( V( W( X( Y( Z( `( 5 W. o ^ -. -. [ > > > ^ , , , > > > > > > > > > > > ; 5 9 0 _ _ ._ +_ @_ #_ r/ $_ .> +; N% .% $; +% %_ &_ *_ =_ -_ ;_ z& -- +; .% .% C& y& ($ #% #% #% #% #% #% #% y& #% #% #% y& I% I% P% >_ )$ @; I% N% O% ,_ '_ 0, l/ z& )_ !_ ~_ {_ ]_ ^_ /_ (_ t+ __ :_ 2+ > > > > > > > > > > > > > > O 7+ G. <_ [_ }_ 5( |_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_ 0_ a_ b_ c_ d_ e_ f_ g_ k{ h_ i_ j_ k_ +( l_ m_ n_ o_ p_ 6_ q_ r_ s_ t_ u_ v_ w_ x_ y_ z_ A_ B_ C_ D_ E_ F_ G_ J] H_ I_ J_ J_ I_ O( K_ L_ M_ N_ O_ P_ Q_ R_ S_ <- v/ ' , > > > > > > ^ ^ ^ -. -. 2@ ^ [ [ ) > > > > > > > > > > > > > > ^ ^ ^ -. -. [ > > > > > > > ^ , , > ; 9 ^ > > > > > , , , , ' , 2@ h. 2+ 5 * }~ + T+ v+ b+ V+ d+ y ", "6. 6. 6. 7. 1~ T_ 3~ U_ V_ W_ n [ > > > > > > > > > > > > > > > > > > > / C. E. S E 2 h. > > > > > > > > > 9 / 9 > > > > > > ) E n h. > > > > > > > > _ , o 9 - - - __ X_ Y_ Z_ `_ 2> : .: +: g; 0( @: #: $: %: &: *: =: -: ;: >: ,: ': ): !: ~: {: ]: ^: /: (: _: :: <: [: }: |: 1: 2: 3: 4: 5: 6: h] 7: 8: 9: M~ 0: a: b: c: d: e: f: j/ g: h: i: j: k: l: m: n: o: p: q: r: K$ _ F. S E 2 h. > > > > > ' ' , > R R > > > > > > > ; 9 / 0 v/ s: t: u: v: w: x: y: M% $; N% M% #> $> z: A: 2! B: C: w& :$ :$ #% N% N% N% N% z& %% ;- #% #% #% #% #% #% #% #% #% N% D: D: `$ O' O' #; N% N% N% N% N% N% I% x& _$ E: c, F: G: H: I] I: Z# - y% ( > > > > > > > > > > > > > O O K+ 2% J: K: L: M: N: O: P: G( Q: 3! *_ D' R: S: T: U: V: W: X: Y: Z: `: < .< +< @< #< $< )/ %< &< *< =< -< I_ ;< >< ,< '< )< !< ~< {< ]< ^< /< (< _< :< << [< }< |< 1< 1< 2< 3< *_ <# 4< 5< 6< 7< 8< 9< 0< a< b< +& S 7+ > > > > > > _ , S E 2 h. > > > > > > > > > > > > > > > > > > , ' G E 2 h. > > > > > > > > > > > > > > > > > > > > > > > ^ o ^ _ _ G Z. `. + t* v+ w+ V+ d+ y ", "%+ %+ `@ 7. %& c< d< e< f< g< G , ^ ^ > > > > > > > > > > > > > > > > > 0 o ' ' G G > > > > > > > > > > 0 0 ^ > > > ^ ' ' ' G | H > > > > > > > > > > > 0 3 3 8+ h< i< j< k< l< m< n< o< p< P^ q< r< s< t< u< v< w< Z) x< y< z< A< B< C< D< E< F< G< H< I< J< K< L< M< N< O< P< Q< R< S< T< U< V< W< [< X< Y< Z< `< [ .[ +[ @[ #[ $[ /^ %[ &[ *[ =[ a) -[ ;[ >[ ,[ '[ )[ ![ ~[ n* _= m+ ;. O ; > > > > > ' ' ' G E E [ > > > > > > > ; ; > e@ {# {[ ][ ^[ /[ ([ _[ x& :[ $; <[ [[ J] H@ }[ |[ &% w& #% ($ I% N% N% D: D: `$ T% G% 1[ ($ I% I% I% #% #% #% y& N% N% N% N% N% ;{ 2[ w& #% N% N% N% N% N% N% I% +% v' -- 3[ 4[ 5[ H; 6[ 7[ 8[ 9[ X; > > > > > > > > > > _ , S F, 5- 0[ a[ b[ c[ d[ e[ f[ g[ h[ &! i[ j[ k[ l[ m[ n[ o[ p[ q[ r[ s[ t[ u[ v[ w[ x[ y[ z[ A[ B[ O) C[ D> D[ E[ F[ H_ G[ H[ I[ J[ K[ L[ M[ N[ O[ P[ Q[ R[ S[ T[ U[ V[ W[ X[ Y[ Z[ s; F[ `[ } 5< .} +} *< @} #} $} %} &} *} * * > > , , ' > _ , ' ;. O > > > > > > > > > > > > > > > > > > , ' ' ' | 2@ > > > > > > > > > > > > > > > > > > > > > > > ; 9 9 W. , , G =} )+ -} ~+ a+ w+ V+ d+ y ", "%+ %+ %+ Q. 1~ ;} d< e< f< >} ' ' , ^ > > > > > > > > > > > ; ; G >. _ > , ' ' ' G G G > _ > > > > > > > , ' , > > > ^ ' ' ' ' , , _ > > _ > > > > > > > , ' ' G D+ ,} <~ '} )} !} ~} 9( P^ P^ Q^ {} ]} ^} /} (} _} :} <} [} }} |} 1} 2} 3} 4} 5} 6} 7} 8} 9} 0} a} Q> b} c} d} e} f} g} h} i} F~ U< j} A( k} l} m} n} o} p} q} r} s} t} u} v} w} x} H{ E{ y} z} A} B} C} [^ D} n* ^- ] ] ' , > > > > > ' ' ' G E 2 [ > _ ^ > > > > > > > d@ >& E} F} G} H} I} J} /$ *; K} L} M} N} I] S' O} P} :$ #% y& I% N% N% I% N% `$ T% &% e* ($ I% N% y& #% #% y& N% N% N% N% N% N% N% I% ($ ($ N% N% N% N% N% N% N% y& #% _$ _$ ={ D> Q} H- V$ R} S} 8= ^ > > > > > > > > > 7+ m& v/ T} U} V} W} X} Y} Z} `} | .| +| @| &/ #| $| %| &| *| =| J, -| ;| >| *~ ,| '| u- )| )| !| ~| {| ]| ^| /| /| )( -< H- G[ (| _| :| <| [| }| || 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| a| b| c| d| )( )( )( 7_ J- $$ 4, e| f| g| h| i| j| H. >. 2@ 2@ G ' > > , ' ' ' ^ > > > > > > > > > > > > > _ > > > ^ ' ' ' > ( r+ > > > > > > > > > > > > > ; ; > > > > > > > ; 9 / 0 , , S k| l| !+ ~+ a+ b+ u* d+ y ", "9@ 9@ `@ 0@ v* 6- 3~ m| n| o| , _ , , ^ > > > > > > > > > ; 5 5 Y. ,. D. > _ , ' ' B. ,+ | , , , > > > > > > , , , ^ > > > , , , , , , , , , , , ^ > > > > > , , , G p| { q| r| s| t| u| v| q< 9( g; {} w| x| y| z| A| B| C| D| E| F| G| H| I| J| K| L| M| N| O| P| Q| R| S| T| U| V| W| X| Y| Z| `| 1 .1 6| +1 @1 #1 $1 %1 &1 *1 =1 -1 ;1 >1 ,1 '1 )1 B> !1 ~1 {1 ]1 ^1 /1 (1 _1 5$ Z. ] :1 9= , > > > > > ' ' ' ^ [ [ ) > , , ^ > > > > > > 8+ n& <1 [1 }1 |1 11 21 31 41 |{ 51 61 71 81 U' w& :$ :$ #% #% y& I% y& y& I% D& @; e* |= #% I% y& y& #% y& N% N% N% I% y& y& I% I% ($ ($ I% N% N% N% N% N% N% N% y& #% _$ _$ G% 91 01 a1 b1 c1 d1 e1 S ^ > > > > > > > > {# |) I+ f1 g1 h1 i1 j1 k1 l1 m1 a# 5! D> n1 o1 p1 q1 r1 s1 t1 u1 v1 w1 x1 y1 z1 A1 B1 f! C1 D1 E1 F1 G1 H1 I1 J1 K1 L1 J] M1 N1 O1 P1 I{ Q1 R1 S1 T1 U1 V1 |^ W1 X1 Y1 Z1 `1 2 .2 +2 @2 #2 $2 %2 &2 J_ 7_ *2 F' =2 -2 ;2 >2 ,2 '2 )2 L+ !2 ~2 E [ , > > > , , ^ ^ > > > > > > > > > > > > , , , ^ > ^ ^ , ^ 9 9 Q , > > > > > > > > > > > > 9 9 ; > > > > > > > ; 9 ^ ^ , N '+ {2 ]2 ~+ v+ b+ u* d+ y ", "6. 6. #. y O. ^2 3~ U_ /2 (2 > > > ^ ' > ; ; ) > > > > > 5 / / N& p 8 > > _ , G E J F ' ' ' , > ; ; > > > > ^ ' > > > > > > > > G S ' ' ' o ^ > > > > > > > > ; m@ X' _2 :2 <2 [2 }2 |2 12 22 22 32 42 52 62 72 82 92 02 a2 b2 c2 d2 e2 f2 g2 h2 i2 j2 k2 l2 m2 n2 o2 p2 q2 r2 s2 t2 u2 v2 w2 x2 g; y2 z2 A2 B2 C2 D2 E2 F2 G2 H2 I2 J2 K2 L2 M2 N2 O2 P2 Q2 R2 S2 ** T2 U2 V2 e@ )# ' G G ^ > > > > > o o ^ > > > > > ' ' , > > > > > G 8+ W2 X2 Y2 Z2 `2 3 .3 +3 @3 #3 $3 %3 &3 *; @% @% #% z& #% #% #% #% #% #% y& N% ($ ($ #% #% #% #% #% #% N% N% N% N% #% #% #% #% #% #% P% `$ N% N% N% N% N% N% y& #% #% :$ ($ *3 =3 -3 ;3 >3 ,3 '3 )3 F. o > > > > > > > ;. l+ !3 4% .~ ~3 {3 ]3 ^3 /3 (3 _3 #2 E; :3 <3 [3 }3 |3 13 O! 23 33 43 7_ '{ G[ G[ 53 H- F[ I; 63 73 83 I1 M1 '{ |< |< 93 03 J; I1 a3 b3 C% c3 (( d3 e3 f3 g3 h3 i3 j3 k3 l3 m3 n3 o3 p3 b] q3 r3 I1 n] s3 !( !( t3 u3 v3 w3 x3 y3 z3 A3 B3 C3 D3 D+ h. > > > > > > > > > > > > > > > > > > > , ' S S ^ > > > > ; - / Q ' > > > > > > > > > > > > / / ( > > > > > > > > > > > ^ N E3 t+ 5; t* v+ b+ V+ F3 y ", "`@ `@ %+ y O. G3 d< H3 I3 J3 > > > > > > ) -. X. h. > > > > ( / - ^ D. _ > > > > > [ ) > ^ ' ' , ; / / ( > > > > > > > > > > > > ) E E [ > > > > > > > > > > > > O I$ K3 L3 M3 N3 O3 P3 Q3 ,] S2 R3 S3 T3 U3 V3 W3 X3 Y3 Z3 a2 `3 /< 4 .4 +4 @4 #4 $4 %4 &4 *4 =4 -4 ;4 >4 ,4 << '4 )4 !4 ~4 {4 ]4 ^4 /4 (4 _4 :4 <4 [4 }4 |4 14 24 34 44 54 64 74 84 U% 94 04 f~ a4 b4 c4 d4 e4 f4 g4 >. T E [ > > > > > 9 9 ( > > > > > > > > > , ^ > > > 8+ Y' X2 h4 i4 j4 R' C& k4 l4 m4 y: w' I% *; _ O' #> I% ($ #% #% #% #% #% #% ($ I% N% #% #% #% #% #% #% Q% K% #% #% #% #% #% |! )$ -{ ;{ N% D: N% N% P% y& #% #% _$ ', n4 o4 p4 q4 r4 s4 `] t4 F. S , , > > 1 , _ u4 8= v4 w4 x4 y4 z4 A4 C% B4 C4 D4 C4 E4 F4 G4 H4 I4 J4 K4 L4 M4 B> N4 -3 O4 P4 Q4 R4 S4 1, m] T4 U4 V4 3! W4 B@ X4 73 3! Y4 Y4 M1 4! 5! }[ E[ Z4 `4 5 `_ .5 +5 @5 #5 $5 %5 &5 *5 =5 -5 ;5 >5 ,5 T4 ,5 T4 s3 s3 j[ '5 L] )5 !5 ~5 )~ {5 ]5 ^5 /5 [ (5 > > > > > > > > > > > > > > > > > > _ , G 1@ E [ > > > > > 5 ; > > > > > > > > > > > > > > 5 ; ^ ' > > > > > > > > > > > R _5 :5 <5 [5 v+ }5 |5 15 Q& ", "$+ $+ $+ y v* 25 d< e< 35 J3 > > > > > > ) -. 2 ) > > > > ; 9 d. ; > > > > > > > > > > > ^ , ^ ; / / ; > > > > > > > > > > > > R T E [ > > > > > > > > > > > > O 45 B3 55 65 75 85 95 05 a5 b5 c5 d5 &5 e5 f5 g5 h5 i5 j5 k5 l5 m5 n5 o5 p5 q5 r5 s5 t5 u5 v5 w5 C} x5 y5 z5 N! A5 B5 C5 D5 E5 F5 G5 E5 H5 I5 g~ J5 K5 L5 M5 N5 O5 P5 Q5 R5 =< S5 T5 #; U5 V5 W5 X5 Y5 Z5 ;= `5 6 .6 i+ +6 2 [ > > > > > 9 / ; > > > > > > > > > ' ' >. >. O 8+ `( @6 #6 $6 %6 @; > &6 *6 =6 -6 :$ > N% ($ |! )$ -{ F] N% ($ #% #% #% #% #% #% y& I% N% #% #% #% ($ #% Q% Q% K% #% #% #% #% #% |= }! -{ 2[ N% D: N% N% N% y& ($ y& ', +% ;6 >6 ,6 X> '6 )6 +{ !6 K+ (. , ^ > ) k+ ~6 v/ _> {6 ]6 ^6 /6 (6 _6 :6 <6 3! a3 [6 G1 }6 |6 16 26 36 46 56 66 76 O~ 86 96 06 a6 b6 M' c6 d6 e6 f6 g6 h6 J] i6 b* j6 F[ 83 k6 3< M1 4! l6 2! m6 ;$ n6 J} o6 p6 q6 r6 s6 t6 &5 u6 v6 w6 x6 y6 z6 j[ A6 T4 T4 2< t3 S~ G[ B6 C6 D6 E6 &4 F6 G6 H6 I6 > > > > > > > > > > > > > > > > > ^ _ > , ' G E 2 [ > > > > > > > > > > > > > > > > > > > > > > ^ , ' > > > > > > > > > > > R J6 K6 L6 [5 v+ }5 M6 u. Q& ", "$+ $+ $+ Q& v. 2~ 3~ m| c/ }% > > > > > > R [ F ^ ^ ^ > > > ; ; ; > > > > > > > > > > > ^ ^ ^ > ( ; ; > > > > > > > > > > ^ ^ ^ | | R > > > > > > > > > > > > O N6 O6 P6 Q6 R6 S6 T6 g- U6 V6 W6 X6 Y6 Z6 `6 7 .7 +7 @7 #7 t5 $7 7| t{ %7 &7 V( *7 =7 -7 ;7 >7 ,7 '7 )7 !7 ~7 {7 ]7 ^7 /7 8/ W5 (7 _7 I5 :7 <7 [7 }7 |7 17 27 37 47 57 +} 67 T5 77 87 C> 97 07 a7 b7 c7 d7 e7 w! f7 _ g7 [ ) > > > > > ( ; ; > > > > > > > > > ' r ,. M e@ h7 b< i7 j7 k7 l7 > m7 G= n7 a6 o7 _$ > N% #% z& @; #; D& N% I% y& #% #% #% #% #% #% y& y& #% #% #% I% y& y& Q% Q% #% #% #% #% #% z& e* A& w& I% I% N% N% N% N% I% I% .% I% c, p7 q7 r7 '6 s7 o& t7 u7 J+ ^ ^ > {. v7 w7 )+ (! x7 y7 z7 A7 B7 C7 D7 E7 F' S~ F7 G7 H7 I7 J7 K7 L7 M7 N7 O7 %! P7 Q7 R7 S7 H@ 83 T7 d6 s3 e6 U7 F7 4! -$ V7 W7 X7 83 Y7 Y7 S~ I1 N@ 2! T4 Z7 `7 8 .8 +8 @8 #8 $8 %8 &8 *8 =8 -8 ;8 >8 ,8 '8 n] -! A6 T~ )8 N} d6 U~ !8 ~8 {8 |3 ]8 ^8 /8 (8 h, > > > > > > > > > > > > > > > > ^ ^ , , ' ' ' [ [ ) > > > > > > > > > > > > > > > > > > > > > , , , ^ > > > > > > > > > > > R n| _8 :8 T+ v+ w+ 7@ <8 0@ ", "$+ $+ %+ Q. 1~ i= 3~ D^ [8 ;& > > > > > > > , ' ' ' , > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , ' ' o ^ > > > > > > > > > > > > S }8 |8 18 28 (7 i5 38 48 4) 58 68 78 88 98 08 a8 b8 @: c8 d8 32 e8 f8 g8 h8 i8 j8 k8 l8 m8 n8 o8 p8 q8 i8 r8 K2 i8 h; a2 s8 t8 u8 u} v8 w8 x8 y8 z8 A8 B8 C8 D8 E8 F8 G8 H8 I8 J8 I8 K8 L8 M8 3) N8 O8 P8 Q8 R8 O+ {! > > > > > > > > > > > > > > > > > > > ; R o M& p* S8 m& T8 }- U8 V8 W8 t- ~$ X8 ]( O7 Y8 Z8 x& ', N% #% #% I% D: N% N% N% N% #% #% #% #% #% #% #% #% #% ($ I% N% N% N% I% #% #% #% #% #% #% #% #% <$ #% #% y& N% N% N% N% N% N% N% M% `8 9 .9 +9 => e, j| @9 #9 t@ ^ ^ R n $9 %9 &9 *9 =9 -9 ;9 >9 ,9 '9 )9 !9 ~9 {9 ]9 ^9 /9 (9 G; _9 K~ d] :9 <9 [9 }9 |9 19 29 F[ Y4 n] s3 s3 s3 n/ |< 39 49 u3 j[ S~ ,5 Y7 2< 59 I1 I1 ,5 j[ t3 )( 69 M' 79 89 99 09 a9 b9 c9 d9 08 ') e9 f9 r3 3/ s3 s3 s3 !( )( J_ A6 g9 h9 i9 j9 k9 l9 m9 n9 o9 > > > > > > > > > > > > > > > > > ^ S ' ' ' ' > > > > > > > > > > > > > > > > > > > > > > > ^ ' ' , > > > > > > > > > > > > 0 p9 q9 r9 4@ v+ b+ u* d+ y ", "$+ $+ %+ Q. %& T_ 3~ o) r) A* > > > > > > > > ^ ' ' , > > > > > > > > > > > > > > > > > > > > > > > > > , , , > > > > > > _ , S 1@ E F ' > > > > > > > > > > > O s9 t9 u9 v9 w9 x9 y9 z9 i: A9 B9 C9 D9 E9 F9 G9 H9 I9 J9 K9 L9 M9 p: N9 O9 P9 Q9 R9 S9 T9 U9 V9 W9 a2 a4 /7 X9 Y9 Z9 `9 0 48 .0 +0 @0 #0 $0 %0 &0 *0 A> =0 -0 ;0 >0 H8 ,0 '0 J8 I8 )0 !0 A7 ~0 {0 ]0 &[ ^0 /0 (0 _0 d@ l+ > > > > > > > > > > > > > > > > ) -. E | N& :0 <0 [0 }0 |0 10 20 30 40 1[ 50 60 70 3= /$ @% @% #% I% N% N% N% N% N% N% N% I% I% N% N% N% N% N% N% N% N% N% N% % % % N% N% N% I% I% ($ @% <$ #% #% y& y& N% N% N% I% #% N% N% y& /$ 80 90 00 a0 0# b0 c0 Y- X; > H O d0 e0 f0 g0 h0 i0 j0 k0 l0 ]9 m0 n0 8! o0 J- _9 p0 q0 r0 #/ E4 E( s0 t0 u0 v0 w0 x0 y0 z0 A0 '5 l6 O] B0 S~ s3 C0 -! L1 T4 k6 S~ Y7 T4 ,5 I1 I1 I1 D0 E0 N{ F0 N{ Q~ G0 H0 I0 J0 K0 L0 M0 N0 O0 P0 Q0 R0 03 A6 S0 j[ T4 2< J_ !( Q4 T0 U0 V0 W0 X0 Y0 Z0 `0 Z. > > > > > > > > > > > > > > > > ) -. E G :1 z^ > > > > > > > > > > > > > > > > > > > > > > > ^ ' ' ' , > > > > > > > > > > > > G a .a 5; ~+ v+ b+ V+ d+ y ", "$+ $+ %+ Q& v. 2~ 3~ +a H. @a > > > > > > > > > ^ , ^ > > > > > > > > > > > > > > > > > > > > > > > > > , ' ^ > > > > > > > , S E 2 F ' > > > > > > > > > > > O c= #a $a %a &a *a =a -a ;a >a ,a 'a )a &| !a ~a {a ]a *] ^a /a (a _a :a > > > > > > > > > > > > > > > ) -. 2 R ' N& 7$ sa ta ua va wa xa ya za Aa Ba Ca !, x& z& %% #% I% N% N% N% .% .% .% .% P% P% % .% .% .% .% I% O% O% O% D: Da Da Ea I% O% O% O% I% y& w& #% ($ :$ x& C& @> N% N% ($ <$ y& y& #% #% ', Fa Ga a0 Ha Ia Ja ); X' H >& ]% Ka La Ma Na Oa Pa Qa Ra V< Sa Ta =2 Ua Va Wa Xa Ya Za `a b .b +/ +b @b U= #b $b %b &b *b =b 2! -b l6 N@ I1 j[ 2< T~ n] ,5 59 j[ 2< 83 3! 3! ,5 ;b M1 >b N{ N{ N{ ,b 'b )b !b d_ ~b {b ]b G| ^b /b (b _b :b u3 fa '5 59 T~ t3 !( > > > > > > > > > > ; ; ^ > > ) E 5+ { G > > > > > > > > > > > > > > > > ) ) > ^ > > > ^ ^ ' O R H > > > > > > > > > > > > >. k| l| !+ ~+ a+ w+ V+ d+ y ", "$+ $+ $+ 0@ v* 6- 4b & m@ 5b > > > > > > > > > ^ ^ ^ > > > > > > > > > > > > > > > > > > > > > > > > , , ^ > > > > > > > > ^ ^ [ [ R , > > > > > > > > > > > O c= #a $a 6b 7b 8b 9b 0b ab bb cb db eb g; fb gb hb ib jb 9( kb lb mb nb ob R2 pb qb rb sb tb ub vb wb xb yb /& zb y7 Ab Bb Cb Db Eb Fb Gb b' I1 q3 Hb Ib Jb Kb T5 Lb Mb F- J8 J8 J8 77 Nb Ob Pb Qb Rb F{ Sb Tb Ub Vb 5- f@ > > > > > > > > > > > > > > > > R [ h. > ^ W. 7+ Wb Xb Yb Zb `b c .c X% +c @c J@ #c $c }! e* #% I% y& y& I% .% .% &; I% }= #; P% $; $; .% N% M% .> .> %c &c *c =c -c M% .> .> %c `$ O} O} @; .> *; +% .% @> N% N% I% <$ #% #% #% #% =- 1[ ;c >c ,c z: 'c )c !c 7+ z* ~c {c ]c ^c #0 /c (c _c :c > > > > > > > > > > 9 C. 0 , > R F { 4+ T [ > > > > > > > > > > > > > , R -. E R ^ ^ > > > ^ > ,+ 1+ [ > > > > > > > > > > > > >. Dc Ec Fc ~+ a+ w+ V+ d+ y ", "$+ $+ $+ y P. ^2 4b Gc Hc Ic > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , ' R ) 3+ > > > > > > > > > > > > > > > > > > > > > > > > O c= ~! Jc Kc Lc ^7 Mc Nc Oc 98 Pc Qc Rc =] Sc Tc Uc Vc Wc P9 E5 Xc Yc Zc `c d .d +d @d #d $d %d `/ &d *d =d -d ;d >d ,d 'd Fa Fa )d !d ~d {d ]d ^d /d (d _d J8 :d Mb > > > > > > > > > > > > > > > > > > > ( - `# `, 7d 8d 9d 0d e# .c ad bd cd K_ dd )$ ={ A& ($ #% #% #% #% +> ;{ ed &3 fd j! >- ed $> gd &3 hd id 3= U' jd kd ld md &3 hd hd hd K} nd u& L] hd *> ;{ ;{ `$ N% N% P% z& #% #% #% #% #% B& G% O' od pd qd rd 0[ sd }( q9 td ud vd wd xd yd zd x} Ad Bd Cd }< Dd Ed Fd Gd Hd Id O; Jd [c Kd q^ t; Ld Md Nd Od <' Pd Qd Rd Sd 2< S~ Td I1 Ud g6 g6 Vd e6 S~ Td F[ )( Wd -! 93 4! 3/ s3 !( 7_ 7_ N} N@ 39 Xd Yd aa Zd `d e .e +e @e #e $e `[ 93 A6 s3 A6 1< W] %e &e *e =e -e ;e >e f@ d@ > > > > > > > > > > ; - / Q ' > : (. ' E I h. > > > > > > > > > > > > > ' O E n | , , > > > > ) 2 2 h. > > > > > > > > > > 3+ 3+ *, [0 N+ ,e ~+ a+ w+ V+ d+ y ", "$+ $+ $+ y P. 6- 3~ Z{ 'e ;& > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > _ , G E 2 [ > > > > > > > > > > > > > > > > > > > > > > > > O c= i& |1 )e !e ~e {e ]e ^e /e (e _e :e > > > > > > > > > > > > > > > > > > _ 0 P - <. we xe ye -d ze =< Ae Be Ce De $; D& F] N% I% #% P' :$ 1[ L} Ee B0 Fe c| Ge He Ie 74 H- X> Je 83 83 y- Ke Le ], I= Je k^ ,( Me Me Ne Ne Oe M@ Pe Qe Re >; ;{ 2[ )$ O' #> I% I% #% #% y& |! z& Se Te qd Ue *} <. Ve We Xe Ye Q! Ze `e f .f +f @f #f $f %f &f *f =f -f ;f >f ,f 'f )f !f ~f {f ]f M- ^f /f }< (f _f >f :f N} > > > > > > > > > > 5 ; > > > _ , ' ;. R 3+ > , ^ ^ > , , , > > > > > > > R [ G ' , > , ^ > > | R ; > > > > > > > > > > ) -. 5+ if jf r9 T+ kf lf mf d+ y ", "$+ $+ $+ y P. 6- 3~ Z{ 'e nf > ; ; > > _ > > > > > > > > > > > > > ^ > > > > > ; ; ^ > > > > > > ^ , G E E [ > > > > > > > > > > > > > > > > > > > > > > > > O c= of pf qf rf sf S2 _7 tf uf vf wf [2 P^ xf yf zf Af 1> Bf Cf Df Ef x5 Ff Gf Hf 3 H= -> fe If Jf Kf Lf Mf 77 77 I8 J8 ka ka ka F- J8 J8 Nf Of Of Nf Nf J8 J8 J8 Nf Of J8 J8 J8 J8 Nf Pf Qf Rf Kd Sf Tf Uf Vf Wf Xf g, 7+ ^ > > ) ) R > > > > > > > > > > > >. >. (5 F W, l. b. Yf Zf `f g Xa +/ ^| .g +g @g $; .% P% `$ 2[ w& :$ :$ 1[ #g Ee U~ =_ $g %g &g Ie H_ Td *g =g 3! H- b| =g =g =g -g =g &g ;g ;g ;g ;g >g >g 6< $g ,g 'g >; #> 2[ )$ O' F] N% ($ #% #% #% ($ {$ )g pd !g ~g 3{ {g ]g ^g /g (g _g :g bg O> x~ cg v0 dg Od eg ac dg fg gg Ne Td ,5 n] A6 -! u3 ,5 I1 j[ t3 !( 7_ hg *2 T7 Ud Ud I1 I1 I1 T4 M1 ig jg =3 kg lg mg ng og pg qg rg sg tg !{ ug P1 vg wg xg yg zg Ag Bg Cg Hc > > > > > > > > > > > > > > > > > > _ , ' ' , , , ' ' ^ > , ' ^ > > > > > > > ^ ^ , , , , ' ' ^ > , , , > > > > > > ^ > > > ) -. p+ Dg Eg r9 T+ kf lf Fg d+ Gg ", "$+ $+ $+ y P. ^2 3~ Hg Ig Jg , 5 5 ; , , , ^ > > > > > > > > > > ^ ^ , > > > > 9 C. 0 , > > > > > > ^ ^ F F R > > > > > > > > > > > > > > > > > > > > > > > > O Kg Lg Mg Ng Og Pg Qg S2 |} Rg Sg K9 t| Tg 4> Ug l; Vg Wg Xg -/ Yg Zg `g h .h o^ +h @h #h $h %h &h *h =h -h la ;h 77 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf Nf Nf J8 J8 Nf Of J8 J8 J8 J8 J8 >h ,h 'h )h !h ~h {h ]h ^h y% /h W. , , ^ -. -. [ > > > > > > > > > > , M& (h O& E _h K :h c }= +% :$ z& >_ T% B& 4h :$ z& 5h 6h m/ 7h 8h '6 8h 9h 3g 7h '- '6 -6 0h ah t& bh F% ch ch dh eh eh dh dh .3 dh t& '- =% fh gh /$ w& @; A& H% I% ($ #% #% #% @% {$ 7, hh ih ~g jh kh lh mh nh oh F6 ph qh ^' rh sh |$ th R' uh vh wh xh yh zh Ah [] Bh Ch Dh Eh Bd f] 6: 6: Fh O) Gh Hh Ih ^f Jh Kh Lh Td M1 Mh 5# 3/ ,5 I1 I1 j[ s3 n/ !( I] Nh T7 Ud Ud Ud Ud I1 u3 =2 74 p^ )- Oh Ph Qh Rh Sh Th Uh Vh Wh Xh Yh Zh `h i .i +i @i #i $i %i , F, > > > > > > > > > > > > > > > > > > _ , ' , , , ' ' ' , > , ^ ^ > > > > > > ^ ^ , , , , ' ' ' , > , , , > > > > > , , ^ > > H | j+ ># &i *i T+ =i -i u* d+ y ", "$+ $+ $+ y P. ^2 4b k= ;i >i ' 9 / Q ' ' ' > ) > > > > > > > > > > , ' > > > ; - / Q ' > > > > > > > > ' ' , > > > > > > > > > > > > > > > > > > > > > > > > O s9 ,i 'i )i !i ~i {i ]i ^i /i (i _i :i >- 1= 6i ia Nf Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 Nf Of J8 J8 J8 J8 J8 7i 8i 9i Va 0i Ag ai bi ci di :- ,& F. m+ S E 2 h. > > > > > > > > > > , L ei fi 5+ h. K+ gi hi ii ji ki li mi ni oi ,c =- <$ <$ |= G% 1= 1[ #% ($ #% :$ ($ pi qi ~, Z$ Z$ Z$ qi qi qi *> %> ri ri si si si *> ~, Z$ ;{ >{ >{ qi ti ti ed ; Q' +> M% #% #% #% #% #% #% #% #% #% #% ;- ui vi wi xi yi zi Ai Bi Ci Di Ei Fi =d Gi k^ c' ]| '8 6# Hi Ii Ji Ki Li Mi Ni Oi Pi 01 Qi ;! [' Ri Si D( Ti s( Ui Vi -= Wi Xi Yi Zi `i y; c' }[ 8 N@ Ud N; Td Y7 s3 s3 2< *2 J- =_ ;b ,5 I1 I1 ,5 j[ &2 !( j ,j 'j )j !j ~j {j ]j f@ `! > > > > > > > > > > > > > > > > > > > , ' > > > S ' ' ^ > > > > > > > > > > > , ' > > > S ' ' ^ > > > > > > > > > ' ' , > > > , ' s* o& ^j t* v+ w+ V+ d+ y ", "$+ $+ $+ y P. G3 d< /j (j _j (. : ; > ^ ' O ,+ X. h. > > > > > > > > > > > > > > > 5 ; > > > > > > > > > > _ _ > > > > > > > > , o 9 9 ( > > > > > > > > > > > > O :j c ej F- J8 J8 J8 J8 J8 fj gj hj ij jj kj lj mj nj r+ oj pj u4 s9 ^! qj l+ R D# > > > > > > > > > > _ 6$ ~% rj sj _ (> X- tj uj vj wj xj yj zj Aj #% _$ #% #% w& B& 1[ z& ($ I% +% v' $> Bj Cj b6 H- Td =_ Dj Ej Fj Gj Cj Hj Ij >g >g Ie Q] H_ ;< *_ M; Jj Kj Fj Fj Gj Lj Mj Nj Oj 1[ #% :$ #% #% #% #% #% ($ |= Pj Qj Rj Sj Tj Uj Vj Wj Xj Yj &0 Zj `j k Zi .k +k @k #k $k ;g %k &k #' *k =k -k ;k >k ,k G_ Ch 'k )k !k ~k {k G; H> ]k ^k /k Vi (k _k :k > > > > > > > > > > > > > > > > > > > > > ) -. E | > > > > > > > / / ( > > > > > > ) -. E | > > > > > > > > > > > > > > > > > > G s* P& u+ T+ 5@ 6@ 7@ d+ y ", "$+ $+ $+ y P. G3 d< nk v7 ok H _ , > > ' R 1+ 2 ) > > > ) ) R > _ > ; ; > > > > > > > > > > > > > > ) 2+ 9 C. Q > > > > > > ^ , o 9 / ; > > > > > > > > > > > > O V, w/ pk qk rk sk tk uk vk X5 wk xk yk O- zk F% Ak Bk Ck Dk Ek Nf Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >c >c ja ka F- F- J8 J8 fj Fk Gk Hk Ik Jk Kk Lk Mk Nk Ok Pk Qk Rk Sk 1 ' ' ^ > > > > > > > > > > H a Tk Uk > @l #l z1 $l $l :, %l &l *l =l -l ;l >l Ie Ie 70 Fe $l Ob d6 <= ,l 'l -l -l =l )l !l ~l >; 1[ #% P' #% #% #% #% #% :$ [$ hj {l ]l !( ^l s) /l (l _l :l D) 9 cl dl l7 T= U= el b] fl gl hl il jg R~ ]| ^| jl kl ll d6 j[ ,5 I1 E0 '( Pe T' *_ T~ ml I1 Ud ,5 u3 u3 Q= vc nl ol pl ql rl sl tl ul vl wl xl r3 5! $e yl zl Al Bl Cl :- /5 > > > > > > > > > > > > > > > > > ; ; > > > ) -. 2 2+ > > > > > > > / / ; > > > > > , 2@ n } [ > _ > > > ; ; > > > > > > > > > > > ^ s* P& u+ T+ 5@ 6@ 7@ d+ y ", "$+ $+ $+ y P. ^2 3~ Dl El Fl +6 H , , > , H [ [ > > > > -. 1+ [ , , ^ 5 / ; > > > > > > > > > > > > ) -. J ] G^ /. > > > > > > > ^ ^ ( ; ; > > > > > > > > > > > > O 3b a- Gl Hl Il Jl Kl Ll v| Ml Nl Ol Pl Ql K- Rl 7i Sl Ck Tl ia Nf Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Ul ja >0 >0 S5 Vl F- Nf ne Wl Xl Yl Zl `l /& m .m C~ +m @m #m $m %m &m *m m+ S > > > > > > > > > > ;. ;. =m -m ;m >m ,m 'm )m !m ~m l {m ]m |{ si +% +; y& y& I% ($ Q% ($ |! d* gd P% qi ^m /m (m b! b! _m o0 :m d* M% Q% <$ #% #% #% #% #% :$ @; F% 5, 8m 9m 0m am 9* bm cm dm em j} fm gm hm im jm km M1 lm *_ mm nm om pm qm rm sm tm ( um vm wm xm ym zm Am Bm Cm Dm Em ni @k Fm Gm Hm dg Im Jm Km >d o4 =3 D[ $l 3! I1 I1 83 74 Lh Lm '{ ml k6 I1 Ud a3 ,5 ,5 Mm J_ Nm Om Pm L9 Qm Rm Sm Tm Um Vm Wm 74 {| q_ Xm < Ym Zm `m :- m. > > > > > > > > > > > > > > > > > 9 9 ; > > R [ h. ; > > > > > > > ( ; ; > > > > > , | n } [ , , > > ; 5 9 ; > > > > > > > > > > ^ s* P& u+ T+ v# w# x# d+ y ", "%+ %+ $+ y P. 6- 3~ n .n +n 7~ F ^ , > > > > > > > > R 2 E F ' ' o 4 - 5 > > > > > > > > > > > > ) 2 7~ .] H^ /. > > > > > > > > > > > > > > > > > > > > > > > > O @n +{ #n $n %n 2* &n *n =n -n ;n >n ,n 'n >$ )n ha ja Ek Mb ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 F- F- F- J8 J8 J8 !n ~n {n |[ ej ]n Of J8 ^n Fk /n (n _n :n > > > > > > > > > f@ f@ =, e) 6n 7n 8n 9n 0n an bn cn dn en fn 3[ .% $; N% N% I% J% ^$ gn hn gd ={ 2[ .% $; in i/ jn +; $; $; $; $; $; ~$ ~$ ~$ $; &; &; $; $; .; V% &; $; $; +; +; ~$ kn =; H% +% J% ln @% :$ #% #% #% #% N] ~, mn H= Lm nn on 1- pn qn rn sn tn d4 un vn wn xn U5 X8 W> M1 ;$ yn zn cg An Bn Cn Dn En Fn Gn Hn In Jn Kn Ln Mn Nn &9 On Pn Qn >5 T~ Rn Sn Tn Un Vn v0 (' cl Sa Wn Xn N; N; 3! T~ Z> z; Yn Zn I1 I1 I1 Y8 Y8 I1 I1 n] C@ `n o o W, g, > > > > > > > > > > > > > > > > > 9 / 9 > > > > > > > > > > > > > > > > > > > > > ' G T n ;. ' , > > ; 9 / ; > > > > > > > > > > R l@ P& u+ t* ,o 'o u* d+ y ", "6. 6. #. Q. v. 2~ 4b )o !o ~o !. W{ E [ > > > > > > > > > | R ^ > ' o 0 5 ; > > > > > > > > > > > > > R *, +] +] ' > > > > > > > > > > > > > > > > > > > > > > _ , {% {o ]o ^o /o (o _o :o c Mb 3o ja Nf 4o J8 ne Of 4o 5o 6o 7o 5o ,h Ib U4 8o 9o 0o ao @~ bo co do eo fo go ho we io jo ' > > > > > > > > > m@ +^ ko lo O- mo no oo po qo ro so to uo vo G] .% &; @> &; l/ wo xo yo zo Ao Bo Co Do Eo Eo Fo 8, ), &; .% .% .% C& Go Go Ho $; .% .% $; $; gn Io O% C& % .% ~$ _$ Jo Ko E: Lo Mo No Oo 8, 7, _$ :$ #% :$ Po 0f Qo Ro So To Uo Vo Wo *k Xo )] Om Yo Zo `o p ic 03 74 1, J] 5# d6 *2 nn .p +p @p #p $p %p &p *p =p -p ;p >p ,p 'p )p !p ~p {p D' ]p ^p W] /p Gb (' ea n] ;b I1 I1 D4 &! &! P1 (p _p :p

    ^| }p I1 s3 |p 21 1p 2p 3p 4p 5p 6p 7p 8p 9p 0p c' ;< ap bp cp dp ep a> 8+ O > > > > > > > > > > > > > > > > > 0 0 ^ > > > > > > > > > > > > > > > > > > > > > > ^ O ;. S ' , ; 9 9 9 ; > > > > > > > > > ) -. n fp gp *i T+ hp d+ mf d+ y ", "#. #. #. 7. 1~ 2~ ip jp kp lp ^. W{ 2 h. > > > > > _ > > > , , ^ > ^ ^ ^ > > > > > > > > > > > > > > > ^ 9= M ,. D. > , >. H ) > > > > > > > > > > > > > > > > > G S mp np op pp qp rp sp Wc /7 tp up vp wp xp yp zp J8 J8 J8 J8 J8 J8 I8 I8 I8 J8 ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka F- F- F- F- J8 F- ej Ap '6 j! fe Bp Cp Dp {d Ep ~d ~d !d Fp N2 Gp Hp Ip Jp Kp ~h Lp Mp Np Op Qm Pp Qp Rp Sp Tp ' :j ;. > > > > > > > > > m@ Hc Up Vp Wp Xp Yp Zp <[ $2 `p q .q +q @q #q .% % ;{ T$ $q 0h %q &q *q =q y: -q !_ ;q ;q >q Te %_ ,q 'q #c )q 2[ !q [p B- M% N% N% ~q ;{ gh %_ I% !, ), ), {q %% +3 ]q 0# [= ^q /q (q 7! _q w' z& #% {$ :q < q! bq cq dq eq fq gq hq R( iq c2 jq kq lq mq nq oq pq qq rq sq tq Qn }c I1 83 ^| S~ Td &! R4 uq vq wq xq yq |< '{ H- ^| Wn I_ ,5 S0 M} (m Qi zq Aq Bq Cq Dq Eq Fq Gq Hq [p :b Iq ef Jq Kq o+ Lq O > > > > > > > > ) ) > > > > > > > > , o ^ > > > > > > > ^ > _ > > > > > > > > > > > > > ^ ' ' , > ; 9 9 ; > > > > > > ^ > > > ) E Mq Nq Oq Pq T+ hp d+ mf d+ Gg ", "%+ %+ `@ Q. %& T_ 7; 8- `! Qq J^ r# h. ) > > > > , , , ^ > , ^ ^ > ^ ^ ^ > > > > > > > > > > > > > > > ^ ' r D. >. > M& Rq Sq 2 ) > > > > > > > > > > > > > > > > 7+ v/ Tq Uq Vq Wq Xq Yq Zq S2 38 `q r .r +r =3 H8 zp J8 J8 J8 J8 J8 I8 I8 I8 I8 '0 '0 '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka >0 >0 S5 ej ej @r #r #r $r T0 k! ;c N2 Bp %r &r *r =r -r ;r >r *h ,r 'r )r kl !r ~r {r ]r ^r /r (r _r &d :r > > > > > %# m@ 1r 2r e^ 3r 4r 5r 6r 7r 8r 9r 0r ar br cr N% U% r4 1! $l Vn dr er fr gr hr -~ ir jr kr lr mr nr or pr qr rr n4 sr tr l7 $> I% hn ur vr g# wr P% xr #c Se Go yr zr Ar Br Cr R= Dr Er Fr Gr s& M] :$ *{ Hr l] 2' Ir Jr Kr Lr Mr Nr Or Pr Qr Rr Sr Tr Ur 5! Y4 Y8 {9 Vr 39 .| K; 03 -$ Wr K] 7! I; Xr Qb Yr Zr `r s .s +s @s #s $s %s &s *s =s -s ;s >s *_ ,s J> 's 's N~ F> )s I1 uq R~ uq !s ~s {s ]s s3 =2 =2 ^s $l 2< u3 j[ 6# /s (s _s :s > > > > > > > ) -. E ) > > > > > > > , ^ ^ > > > > > > ^ ^ , , , ^ > > > > > > > > > > > ^ , , > > > ( ; ; > > > > > ^ ^ ^ > > R [ { 8s X; -} t* ,o -i u* d+ y ", "$+ $+ %+ Q. 1~ T_ 7; 8; c= 9; o* D# > > > > > , ' S S ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > > , 9s 0s ~2 as h. > > > > > > > > > > > > > > > > e@ e@ bs cs ds es fs gs hs is E5 js ks ls ms E; 77 la J8 J8 ja I8 I8 ns ns ns ka ha os ha I8 ha ha Mf 77 77 ha I8 I8 J8 !n ~n {n S5 -6 m/ ps qs qs rs #g [[ Y[ ss ts us vs ws G' xs xs ys ^s zs As Bs Cs Ds ^e O, Es Xi F[ a# '{ Fs Gs Hs Is Js Up Ks Ls j+ ' ' > > > > > , _= 7+ bs Ms Ns Os +; *{ Ps Qs :k Rs Ss Ts Us Vs % kn Ws D4 J> X) Xs n} Ys Zs `s t .t +t @t #t $t %t &t *t =t ed -t ;t >t ,t Y$ $; 't :m )t !t F- fd ~t {t {, ]t ^t /t (t _t :t H] *3 -- ,q K] }t |t m; }i 1t 2t 3t 6n 4t 5t 6t 7t 8t 9t 0t Z> at ,5 Y7 u3 5# l6 Mh M1 4! 8 8 8 b3 H1 03 .| Rf bt ct dt et ft gt 5a ht it jt kt lt mt nt -b Q] H' ot pt qt +/ rt Y4 G[ I1 I1 ,5 u3 |< s3 st st tt ml ,5 u3 2< S~ ut H1 F> vt wt D9 xt )c yt zt C8 At Dh Bt Ct Dt Et Ft F, 1% > > > > > > > > ) E n [ > > > > > > > > > > > > > > > > > ^ ' ' ' > ) > > > > > > > > > > > > > > > > > > > > > > > ^ ' ' , > > > > >. Gt Ht It ~+ v+ w+ V+ d+ y ", "#. #. 6. 7. 1~ T_ 3~ Jt g> o| _ > > > > > _ , S 1@ E [ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 9= >. 2@ h. ) > > > > > > > > > > > > > > > > H. ^; ~ Kt Lt Mt Nt Ot Pt Qt Rp Rt St $< Tt '8 ha fe J8 77 ~d Ut K8 A- Z[ 6= hj Vt Wt Xt Yt Zt `t u .u +u @u K8 Gp Kb >h I8 ka J8 F- #u ,d $u ;- M% U$ %u ^| &u G> *u n1 =u x< -u ;u >u ,u 'u )u 3i !u ~u ^6 nm cf {u ]u j ^u /u (u 7a _u :u > > > i+ M M q# |u 1u f/ 2u -- [! R% K; 3u 4u 5u 6u 7u 8u ', #% x' ig 9u :, Hi 0u au -q >g I@ bu cu du eu fu !h gu hu iu ju ku lu mu nu ~$ rr ya ou pu qu ]t ru su tu uu vu 0p wu Zs @2 *< X8 xu yu Ij <6 a! Oj .> {q zu H> Au Bu Cu m4 Du Eu Fu Gu Hu Iu m^ Ju ], Vr C0 s3 2< S~ S~ u3 1< -$ 4! N@ Mh 49 03 lm Ku Lu b3 q3 Mu Nu Ou Pu Qu Ru Su Tu Uu Vu Wu Xu Yu Zu `u v .v Q: +v @v |] ]| G[ G[ I1 I1 I1 ,5 3! #v st $v %v &v j[ 59 T4 u3 *v ,5 =v -v z2 ;v >v ,v 'v )v !v ~v {v ]v ^v /v (v _v l& 1% > > > > > ^ ' ' ' G | H > > > > > > > > > > > > > > > > > > ^ ' O ,+ X. h. > > > > > > > > > > > > > > > > > > > > _ , ' ' ' , > > _ _ o :v > > > > > > , S E 2 [ > > > > > ; ; > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > G d@ X- #n 2v 3v 4v 5v 6v 7v 8v 9v 0v av Q* Xs bv ia ie 4o cv G[ /| _f dv ev fv gv hv iv iv jv kv lv mv nv ov !f pv ;< qv rv sv Nf '0 J8 k* K; 1k l7 tv uv vv wv xv yv zv Et Av Bv %4 Cv Dv Ev Fv Gv Hv Iv Jv 9' ]f -< > ( C. 0 Rv Rq Sv Tv Uv Vv 2u +; [! Wv c' :/ Xv Yv Zv b! 1[ `v Oo y& w .w +w @w #w $w %w &w }= ,{ *w m# l0 =w =u -w ;w >w $n ,w 'w m! )w )q !w ~w vm {w ]w ^w /w (w _w :w vu x' *- G] #q >_ gc 2w 3w 4w '; 5w X8 6w H, 7w 8w P2 Q~ 9w 0w Y7 T~ A6 u3 M1 ,5 T~ s3 O] 03 N@ M1 lm 03 N@ Y4 Y4 N1 J; $2 a3 aw bw cw dw ew fw gw !j hw iw jw kw lw mw d6 nw ow ){ >5 pw G' ]| Ud I1 I1 I1 3! qw rw %v sw tw j[ 3! I1 j[ `7 Mh uw x4 vw H4 ww xw xi yw zw Aw Bw Cw Dw Ew Fw Gw 3b m@ ^ > > > ^ ^ ' ' ' ' , > > > > > > > > > > > > > > > > > > > > ' R 1+ 2 ) > > > > > > > > > > > > > > > > > > > ) R G ' G R H > > > H 8+ 8$ Hw 0$ [v Iw 6@ 7@ d+ y ", "%+ %+ %+ 0@ v* 6- 3~ D^ |v 1v > > > > > > > ^ ^ [ [ ) > > > > > 9 9 ; > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > e@ K+ }- Jw Kw Lw Mw Nw Ow Pw Qw Rw Sw zl Tw Uw Vw -> Ww G- `< Xw (6 Yw Zw `w K! o8 x .x +x @x #x $x %x &x *x =x -x ;x ;2 Gr 6# >x ,x !n qv 'x )x !x ~x {x ]x ^x /x (x _x :x . > > C. :~ bx cx dx g7 ex fx gx hx +; *{ g* Zn ix jx kx lx 06 1! R% mx $; ;> +w nx ox px Lo qx rx U$ sx tx ux !( J> Zl /k vx wx xx yx zx Ob Ax *{ Bx Cx Dx Ex Fx Gx Hx Ix Jx Kx Lx Zi Mx ah H% Nx Ox Px Qx Oo y& z& Q% @; f! Rx Sx Tx Ux Vx Wx &3 Xx Yx Zx `x sr $$ y .y Y8 ,5 B0 93 }[ Mh A6 s3 O] 8 03 4! +y +y lm 4! @y #y $y %y N; &y Iv #2 *y +/ =y -y 9j ;y >y ,y 'y )y !y ~y {y ]y rt Y8 ^y 96 /y N1 N; c' c' k6 (y sw _y :y > > ^ , , , , , > > > > > > > > > > > > > > > > > > > > , H [ [ > > > > > > > > > > > > > > > > > > > ; -. -. | ' ,+ 1+ [ > > ) dy J c/ ey fy 4@ v# w# x# d+ y ", "$+ $+ $+ y P. ^2 3~ Z{ /~ ;& > > > > > > > > > > > > > > > > > / / ( > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > f@ t@ gy hy iy jy ky #y Ib !d ly my ny oy py qy ry ly #h sy G> ty uy lj vy wy xy yy 7j J2 E5 zy Ay By Cy O3 Dy Ey Fy Gy Hy Iy Q4 Jy Ky Ly k] My Ny Oy Py Qy Ry Sy B_ Ty Uy lj Vy Wy Ra X< Xy Yy Iv #h Zy `y z .z +z @z au #z b3 $z %z &z *z =z G R R > > > > > > C. -z ;z W{ $9 >z !c ,z 'z )z x& +; k/ [p h] !z ~z {z u( a| K= dh n4 @; ]z ^z /z (z _z r! :z ,{ 9h gz z: Oj hz y& _$ :$ k/ 70 iz :w jz kz lz ~l $q 4r mz uc nz su ~( 03 Y4 I1 M1 4! 8 oz 49 3/ A6 93 8 8 8 pz Q= b3 8 pz ut 8q qz rz 3< k6 N@ v3 a# !t Pd sz tz uz vz wz xz yz zz Az Bz Cz ^| 2' _f E; M1 I1 c' c' Dz Ez Fz :y $2 Y4 a3 I1 I1 '8 B4 _m Gz Hz Iz Jz Kz Lz Mz Nz Oz Pz Qz Rz Sz Tz Uz [) ^- _= ' , > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > R 2 E | ^ E 2 h. > > ) E R+ Vz `. *i t* ,o 'o u* d+ y ", "#. #. `@ y O. G3 d< Wz 35 J3 > > > > > > > > > > > > > > > > > ; ; > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > O G Xz Yz Zz `z A .A +A @A #A $A %A &A *A =A -A ;A >A ,A =y 'A )A #e |6 !A ~A z5 {A ]A ^A /A (A _A :A > > > > > > ^ E. wA O ve ve K3 xA yA Gi =; I% G] Rf zA AA BA CA jl DA EA FA GA f# HA !@ IA h| 3A JA KA f| LA MA NA gr OA PA QA RA SA TA Li tr UA /$ jn VA +9 WA XA YA ZA `A ^f B .B +B @B #B $B %B &B *B Cb =B c' }= ~$ -B ;B nu ^f 8A >B ,B `} 'B |m Oo J] )B !B ~B Lm O= 40 $2 k6 I1 N@ 8 {B Wr 93 Mh N@ 4! 8 {| {| 8 8 ]B 03 !q $2 3< I1 N@ 03 71 #z ut ,5 ^B /B (B _B :B v_ > > > > > > > > ^ ' ' ^ ^ > > > ^ ' > > > > > > , ' > > , ' > > > > > > > > > > > > > > , ' > > > > > > ^ ' | R ^ > [ ) > > > > R lB 9+ 0+ !+ mB nB d+ mf d+ y ", "W+ W+ 8@ y O. G3 d< Wz v7 J3 > > > > > > > > > > > > > > > > > > > , _ _ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > O {# oB pB qB rB sB _9 sh tB uB vB [] wB xB yB zB AB BB CB DB a] EB FB D( :: GB HB IB pf JB KB LB MB NB OB {7 PB y8 d; QB RB SB Jb Jb TB Pd [< UB VB WB XB mc YB ZB `B }p 4o C .C +C 4o BB yp @C Lb !t Cz #C $C %C &C ]q *C =C -C m{ ;C >C f= ,C > > > > > > > > > , ' ' v/ e@ 'C )C !C ~C *3 {C 1[ ]C ^C /C (C _C :C SC TC UC VC WC XC YC ZC `C D W2 d$ > > > > > > > > > > > ^ ' ' ' ^ > > > , ' , > > > > ^ , ' > > R O > > ^ > > > > > > > ^ > > > , ' > > > > > > , ' ' o ^ > > > > > > > , _~ X@ N+ Z@ mB nB d+ mf d+ Gg ", "W+ W+ 6. 0@ P. ^2 3~ .D kp }% > > > > > > > > > > > > > > > > > > ^ , , ' , > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > G m@ : 8> C) +D fw @D #D $D %D &D *D =D -D ;D >D ,D {l 'D )D F> !D ~D 53 3< G' {D 9f An /f ]D ^D /D (D _D `l ;4 :D iD jD kD lD mD nD oD S+ > > > > > > > > > _ , , 7+ 7+ 8= U; pD qD rD sD B& tD i] uD vD wD Ho xD yD 2, Vn t( uD zD AD BD CD DD ED FD GD HD ID JD KD LD MD ND OD PD QD RD =B SD TD _z UD VD WD XD YD ZD `D 4: E .E +E @E #E Bb ~] $E F~ Q- %E HD &E *E =E C% -E ;E >E ,E 'E > > > > > > > > > > > , ' ' , > > > , ' , , > > > > ^ , > ) -. E R ^ ^ , > > > > > ^ ^ , > > ^ , > > > > > > , ' ' ^ ^ > > > > > > > _ ] nE oE pE t* ,o -i u* d+ y ", "6. 6. 6. 0@ v* 6- 3~ }v E^ h> > > > > > > > > > > > > > > > > > > > ^ S mp mp o _ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ^ f@ a> qE rE sE tE uE vE ;h wE xE yE 0' zE AE BE 2i CE 77 ;h ;h ;h fe T5 T5 fe DE EE FE G% g* G% w' x' g! :' 7: $b GE HE IE JE KE Ep LE ME NE OE PE QE m] -6 X$ ]n RE SE TE UE VE WE ,< XE }$ YE ]l N; ZE `E 9g F T5 .F z~ +F @F #F $F %F )# f@ > > > > > > > > > > > > O O E# &F *F =F -F ;F $c >F ,F 'F )F !F 9, :[ yC I% ~F {F ]F ^F /F (F 3m _F :F Rx |' ze .B d ZE ){ ]| 3< CF Dz I1 Td R4 Q~ #2 >5 ck DF EF FF GF HF IF JF KF LF MF h^ NF OF PF %# QF > > > > > > > > > > > > > G G ^ > > > ^ G ' ' , > ; ; > > > ) E n [ ^ , ' > > > ; > _ , ' > > > > > > > > > > ^ ' > > > > > > > > > > > 0 8$ 9$ 0$ 4@ U+ w+ V+ d+ y ", "6. 6. 6. Q. v. 2~ 3~ RF E^ 1v > > > > > > > > > > > , ' > > > > > ) -. J .] SF #@ L 6$ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 1% f@ TF )) Np OB UF VF r4 WF XF YF v( ZF `F G .G Sl '0 77 fe 77 #u -> ah +G ~d @G e* #G $G %G &G *G =G -G ;G >G ,G .v h6 rv T0 x' 'G )G !G ~G {G ce ]G 67 Xn ^G /G (G _G :G > > > > > > > > > > > > > D# J& 0G aG bG c, $c cG O= dG dG gc 0, 1w in $; ed -E eG fG gG hG iG jG kG lG mG nG oG pG qG rG sG |' tG uG vG wG xG dA yG zG AG BG CG DG 65 EG 'y FG GG HG IG JG KG LG MG NG OG PG QG RG SG TG _q y& ', ,- '( 0' UG VG |w WG XG YG w_ ZG `G H Wn Y4 }k J; F7 .H +H @H h6 *_ *_ *v Q= lm 4! !q vg c' fa &- vo 'G !q }/ 8 M1 M1 49 8 N@ Mh -$ l# #H $H Rd 86 %H &H 27 *H =H -H J~ Sa u~ ;H eD !f G' vq >H Ez ,H q4 D4 N1 'H )H #| !H ~H {H ]H X; ^H /H (H _H :H V6 > > > > > > > > > > , G T E [ > > ) -. E ;. ' , ; / / ( > > > R | G , , > _ : 9 - 5 > > > > > > > > > > > > > > > > > > > > > > > > > > G ~# /% (% T+ 5@ 6@ 7@ d+ y ", "9@ #. 9@ 7. 1~ Y{ 3~ Z{ /2 nf > > > > > > > > > > ^ , ' > > > > > ) 2 X, ]. -z #@ q D. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > f@ Z. }) }H |H 1H D9 2H 3H 4H 'D 86 5H `E 6H 7H I8 ,d Ul J8 I8 I8 8H .8 XE GA t( cu 9H Z4 0H aH [l bH cH dH eH fH gH 1G hH f# t& x' 4! iH jH g] <' !q .| (' a] kH lH mH nH oH pH qH -H rH G[ sv sH H1 J1 tH uH Td r3 vH wH xH yH zH AH BH m= j+ > > > > > > > > > ) 2+ 9 C. r+ H q+ 5+ W@ a= 4m T% P% n4 CH e] Lh ~$ +% I% .% .; DH EH FH GH HH IH JH KH LH MH NH OH PH m( QH RH SH TH UH VH A_ WH jx XH YH ;w X= ZH `H 0{ I Rb .I +I @I #I $I %I &I *I A7 =I -I ;I >I ,I 'I )I v' P' =; /E 8: E4 Lh !I ~I {I ]I ^I /I >< )- (I _I :I CF *v > > > > > ^ > > > , , G E 2 [ > > ) -. 2 O ' , ; / / ; > ; 0 r+ , ' , , > ) 2+ d. / ; > > > > > > > > > > > > > > > > > > > > > > > > > > H xI yI u+ T+ 5@ 6@ 7@ d+ y ", "%+ %+ `@ Q. 1~ Y{ 3~ zI r) @a > > > > > > > > > > > ^ , > > > > > ) h. AI P /. o Y. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > d@ ^- X' BI CI DI EI 2: FI cv 7o Y8 Sa (9 GI HI 77 yr >c 1G I8 ha Nb :, II JI KI LI MI NI OI <| x PI QI RI SI TI UI VI WI r4 F% Ww ;b Si XI Qn ^s b3 :f 6E YI ZI *A `I J N: .J +J @J #J 6x $J ,$ U4 %J &J !l -b J] *J =J -J Kz ;J >J ,J J F > > > > > > > > ) -. J ] 'J 1( H )J !J ~J {J !- b# ~, ]J [f ^J y- ;; N% N% ($ /J (J _J :J > tJ :$ #% )$ uJ ]D vJ ~| +; :[ wJ y4 xJ yJ X8 K= (I zJ AJ BJ '5 CJ }I DJ pz EJ EJ +y V> 8 Hi 49 4! fa [E FJ GJ U7 u3 -$ 8 *_ u3 39 8 4! +y 3I g' ^u X7 m1 HJ IJ JJ KJ `f *I W< LJ MJ NJ OJ PJ 0E 2! QJ RJ SJ TJ UJ D@ [k ge =v VJ WJ XJ YJ ZJ `J K .K +K @K #K $K %K &K *K _= x% > > > > > ^ ^ ^ > > > , ^ [ [ ) > > R [ h. ; , , ^ ( ; ; > 5 9 Q , , , , > -. E W@ ( > > > > > > > > > > > > > > > > > > > > > > > > > > > H =K yI ^j T+ v# w# x# d+ y ", "$+ $+ %+ Q& v. 2~ 3~ -K Lq c@ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > O O D# ;K >K ,K 'K )K !K ml ~K 4i Y4 $l 83 {K F- f# -6 F- I8 77 ]K z6 ^K /K (K |* _K :K 2= }$ 1K 2K 3K Xs +b I1 Ud 4K 5K B| #i 6K 7K 8K Mn 9K rt #y 5o 0K KE ,$ Y8 ,s aK bK cK dK u9 eK fK Na gK hK iK n [ > > > > > > > > ) 2 7~ .] -z 1( > e@ !6 ~ jK kK ~9 .3 lK T= /' =_ )$ P% I% J% mK Zp nK U0 oK gg |! Oo pK Yp 'd ~t qK j rK sK tK Ox uK XD vK wK xK 7! yK zK AK BK T] CK DK .h y& EK V~ FK |t GK HK ]G T0 IK JK KK LK MK l/ NK 2= [$ z& Oj y' OK Hj PK `8 QK RK SK TK UK VK I@ WK XK Fz YK ;< @y ZK ZK pz pz >$ +y 8 8 8 8 {| .C `K L g6 U7 u3 93 -b .L A6 5# 8 {B 5! Q= g6 +L eC Ae @L #L $L %L T; &L *L =L MJ -L ;L >L Z4 ,L 'L )L !L ~L {L Sj Q~ bh ]L ^L /L (L 2E _L m& D# :L > > > > ' ' , > > > > > > > > > > > > > > > ^ ' > > > ; - / ( > > , ' S E I h. _ > > > > > > > > > > > > > > > > ; ; > > > > > > > > > G l@ P& u+ t* v+ b+ u* d+ y ", "#. #. #. Q& P. 6- 4b +a H. 5b > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *, 4L 5L 6L 7L 8L 6c ^s }d 9L a! h! g! ns J8 F- Vl J8 Nf Nf 0L aL >5 bL cL dL eL fL @, zg hk Bv gL hL 5| 2J iL B4 I8 77 77 jL q3 kL 94 1, lL mL nL oL pL qL rL sL tL uL T~ vL 6A ha wL xL yL y P~ '{ HK zL AL BL CL DL EL FL m@ GL | > > > > > > > > > > R ;. +] HL ' > S u@ *} IL JL f| KL LL ML NL +} C& ~$ #% Q% K% `v OL PL QL 63 RL SL TL UL VL 7, ', :$ WL E: XL YL ZL T| `L M .M +M @M !w #M $M %M &M *M O] +; ;{ .3 S' =M 3m id R% -M ;M >M ,M X= 'M )M !M ~M {M >_ a! ~9 *E ;q ]M ^M /M (M _M :M > > ' ' , > > > > > > > > > > > > > > > > > > > > > ; ; > > , ' ' ' | ) > > > > , ' > > > > > > , ' > > > ; / / Q ' > > > > > _ , mp DM Eg 0$ 4@ v+ b+ V+ d+ y ", "#. #. #. 0@ P. ^2 4b EM {! 5b > > > > > > > > > > > > > > > > > > ^ > _ >. >. _ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > FM GM HM xe IM JM KM F> Zy LM ;c X$ X$ T5 MM ka J8 J8 J8 Nf NM OM 7i PM QM Er Ix RM )/ SM ,~ TM UM VM Xs WM XM YM Nf Of Of ^d G1 R= ZM K; (d `M N .N S4 +N @N #N $N [= %N &N NM '0 Nf qs F- *N N{ 01 =N -N y_ ;N >N ,N 'N )N m+ v/ , > > ^ > ) ) R > > > , < M ,. >. > > R !N Y; y/ ~N {N ]N yh M2 k^ Fo )I #% Q% K% :$ ^N /N (N _N !0 H 7# F1 1! >c Hr X$ '> :N $ U4 u3 vN 51 v3 v3 71 71 71 fN oz P] }[ M1 Y4 lm 5! Y4 Y4 4! 8 {| lm c' F7 {L wN |/ xN yN zN AN BN CN DN EN xl FN GN -1 F{ HN IN OE JN |M KN LN MN L- NN ON PN QN we RN SN )c TN UN VN Nc n5 WN XN YN 8+ lk / ; R ) ) ' ' , > > > > > > > > > > > > > > > > > > > > > > > > > ^ ' ' ' > > > > > ^ , ' > > > > > ^ , ' > > > ; / / 0 ' , ^ > > > > H l+ ZN `N 0$ 4@ v+ b+ u* d+ y ", " O @. `@ y O. ^2 4b +a {! 5b > > > > > > > > > > > > > > > > > ^ ^ ^ _ ,. ,. D. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 7+ .O +O V} @O #O $O %O &O *O =O Ww he j! Lb MM J8 J8 J8 Nf NM BB hj -O ;O a1 Pd ]y >O TI TI Xw y~ ,O 9m 'O )O !O J8 Nf Of /d G1 %2 Jh G1 ,x ~O {O jL ]O ^O P= /O (O Rl '$ )n me NM Nf _O f# ~F :O `p ^ ^ ^ -. -. [ > > _ ' < o G ^ > > O ^ 2% 5O 6O 7O 8O YG 9O Ne Fo 7, @% Q% Q% #% #q ,, 0O aO bO cO E( 8c >O dO 7_ Q4 EC eO fO gO /C hO iO jO kO O% .% C& +; lO mO 4G _9 T7 }w nO oO pO qO rO sO |w 31 %f tO uO vO wO lO 1w [$ xO *- o^ &l yO zO AO BO CO DO EO FO GO HO IO JO KO LO SI MO NO C0 Z> %! *_ -b OO h! v3 v3 71 OO DC DC }E }[ M1 Y4 *! V> h6 N@ 49 8 V> *! ;b dc PO QO vN 01 GB J[ r] ~r RO SO TO UO VO WO XO F{ YO ZO Tu `O P .P +P @P ev #P $P %P &P *P 'e =P -P Tx VN ;P >P ,P 'P )P !P 8+ g, ( > ) -. E G ' , > > > > > > > > > > > > > > > > > > > > > > > > > ^ ^ , ^ > > > > > > ^ , > > > > > > ^ , > > > > ( ; ^ ' ' ' ^ > > ) dy r@ ~P {P ]P 4@ v+ b+ u* d+ y ", "$+ $+ $+ y P. ^2 4b +a {! 5b > > > > > > > > > > > > > > > > > ' ' ^ H '. M D. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 0 r) W; ^P /P (P R[ _P :P 2I

    x ;G '8 }c 3P &N $J $J 4P 4P ha Mf 5P ha :C }$ 77 5P 5P $J Ha s& fg cu A= 6P 7P am 8P W, 9P 0P aP 6 8 > > , ' S E 2 h. > > _ , o / / ( > > 7+ ]# H+ a- mq bP cP dP hm eP Ap 1[ :$ :$ #% #% v' [! fP <' gP hP `E iP MC el 6_ jP ku kP lP mP yz nP oP pP $c qP N% `$ $; 2N n4 rP ]/ nu fz g# sP tP uP vP wP @h _m rP =y 'f MJ xP N] 7, :$ yP _q ;l zP AP BP CP DP EP /o FP k7 GP HP Fd IP JP KP LP MP fC NP OP /| Q] M@ b6 _, ^u -< $ GJ U4 Y4 03 61 3I >$ [6 M1 'G }[ 74 #J T> SP TP UP VP WP XP YP FG ZP `P Q .Q +Q @Q 2 #Q $Q %Q &Q Cn *Q =Q -Q ;Q >Q ,Q 'Q )Q !Q ~Q {Q ]Q ^Q /Q (Q K+ G O > > ) E n | , , > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , ' S S ^ > > ) 2 ~ _Q :Q > > > > > > > > > > > > > > > > ' G ,+ J ). f. k. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > (# _- [Q }Q |Q qG 1Q 2Q 5E 3Q 4Q 5Q 6Q Td 7Q I8 J8 J8 J8 J8 J8 J8 J8 J8 NM >h fe fe fe fe ,d /O ,d 8Q Ek ka J8 J8 J8 fj 9Q 0Q aQ bQ I1 cQ dQ eQ #u #r Nf '0 Nf #r hH yr ha 5P qs ps fQ gQ hQ iQ jQ %B kQ =, D# _- lQ mQ nQ 8~ 8 > , ' ' ' ;. O > > > > > > 5 ; > > > > ^ , oQ pQ qQ rQ sQ tQ Jk a] Oe ($ 7, #% #% :$ _$ %% j aq lm $2 uQ AB d| H] qC -_ vQ wQ xQ yQ zQ AQ I] =- 4r z& T% )$ |! +> 3m ~( Vn 6: b] BQ CQ Cb DQ Ti TI Pi 'k |B F' P= eN P' _$ #% EQ FQ GQ HQ IQ JQ KQ pf bd LQ MQ NQ gB OQ PQ QQ RQ 8J SQ TQ UQ VQ WQ &2 ^| 'n XQ YQ E~ ZQ `Q R <, y: .R d0 +R @R #R $R %R cv ej {{ &R lm fc lm M1 mz sF ZM hF 4s *R =R -R ;R Li >R ,R 'R )R !R ~R {R ]R ^R 8% /R U. zk (R _R :R > > > > R | H > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > _ , S 1@ E [ > > ; 2+ [ 8R o& ^j t* 9R r. 0R 15 Q& ", "$+ $+ $+ y P. ^2 4b EM H. c@ ; ( ; > > > > >. >. > > > > > > > > , H T X, ]. -z wA >. ) ) R > > > ^ > _ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 0 %# aR ;K bR cR dR eR fR (6 gR hR iR I1 ns I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- ha Mf ]O ka J8 J8 J8 fj jR kR lR N{ ;< qv mR }$ ja J8 J8 J8 J8 F- ]n $r Of wL rs nR oR >9 pR qR W/ rR sR d@ *, K ] tR uR M D. > ^ ' ' ' ' ' ^ > > > > > > > > > > > > ^ 7$ vR L+ wR xR yR Fi zR AR -- 8z #% Q% #% #% #% :$ 6, 6, 4h A& O' $q ,{ BR mA Ek %2 CR DR ER BD E7 _$ 4r %% &% T% $> &3 B- !{ FR ze uc :3 Ql GR HR IR Zl GA K- g9 fP v' :$ #% 4h #% =- JR KR LR MR NR OR PR QR ^ RR SR TR UR VR WR XR YR ZR `R S .S +S &2 !0 @S #S {x $S %S 3s &S XQ *S =S -S ;S iv >S ,S 'S )S $e !S 1k 0q 71 8 M1 6# bD ~S {S ]S ^S /S (S _S :S > ^ ^ , , > ; ; > ^ > > > > ) ) > ^ > > > _ > > > > > > > > > > ; ; > > > > ; ; > > > > > > > > > > > > > > > > > > , S E 2 h. > >. >. , ^ s* o& u+ t* nB jS kS u. P. ", "$+ $+ $+ y P. 6- 4b +a H. lS / / 9 ; > > >. ,. p >. > > > > > > > , H 2@ AI P k. ] ,. &@ 1+ [ > > ^ ^ , , , ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 0 ;. mS nS oS pS qS rS sS |; tS uS vS wS >h ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ha >x {n >0 ka J8 J8 ka _d xE xS E0 ;< #y ^O yS ja J8 J8 J8 J8 J8 #r $J Nf Lf Kf h! zS AS -x BS %^ CS ^; f@ G 5{ DS ES ;. >. >. > ^ ^ , , , ^ ^ > > ^ ^ , > > > > > > > > _ /- d@ FS GS HS IS JS KS LS MS Q% Q% Q% Q% 4h {q 7, 7, Se SL :$ w& 2[ F] NS 87 K; 20 OS PS QS T ,T }c >5 Zl 'T )T -j !T !* ~T Q5 23 {T PQ ]T ^T /T (T _T :T > > ^ , , ^ 5 9 0 ^ ^ > > ) -. E O ^ ^ > , , , ^ > > > > > > > > 9 9 ; > > ; 5 / ; > > > > > > > ^ , , ^ > > > > > > ^ ^ [ h. ) _ ,. M r , s* P& u+ t* oT pT qT <8 O. ", "$+ $+ $+ y P. 6- 4b +a {! `, - C+ /; ; > > >. M 6 D. > > > > > > > > > > > > , rT q r* n h. > > > ^ ' ' ' > ) > > > > > > > > > > > > > > > > > > > _ > > > > > > > > > B{ sT tT uT H. vT wT xT yT zT AT BT )n CT J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ns DT }T ET ~n ka J8 J8 J8 F- k* 6# I1 l] Y8 6# ja J8 J8 J8 J8 J8 J8 Nf Of J8 ,d ;c P] KH FT yF GT HT IT )# _ _ ) 2 ! h. > > > > > > > > > > > > > , ' > > > > > > > > > > R ]# JT KT LT 1C MT &w ~{ K% K% K% Q% #% #% #% #% #% <$ #% I% .% $; ~$ O} +} NT OT PT P> 6[ .> [! <$ QT +> RT ST TT Nd UT dN |w xo VT WT XT !M in in $; ~$ x& #% #% :$ YT ZT `T U .U +U @U #U $U 7s j@ l+ {[ %U &U r[ *U 'P =U .~ -U ;U >U ,U 'U )U Xn G> s2 !U ~U ^I G! {U ]U ^U /U (U _U :U e V, f@ > > > ^; kU lU mU nU rd oU $9 h= ' , > > > > > ' o C. / W. ' , > > ) E n ;. ' , > G S ' ' ^ > > > > > > > 9 / 9 > > ; / - 5 > > > > > ; R ' ' ' ' > > > > > > > > > > > _ p q* pU R l@ P& u+ t* kf lf Fg d+ y ", "$+ $+ $+ Q& v. 2~ 3~ +a {! qU O W' J [ > > ; O O > > > > > > > > > > > > > > _ D. | [ > > > > > ^ ' O ,+ X. h. > > > > > > > > > > > > > > > > >. ,. rU 6$ > > > / / ( > > H sU tU uU f@ vU wU xU yU >w zU DD Hk 7i Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ha ha AU BU CU >5 DU fj ~n ka J8 J8 I8 6A H1 tq dO US L] hH J8 J8 J8 J8 J8 J8 J8 ~n EU DE c' FU GU $T HU IU v/ JU L A^ > KU h. (5 > > > > > > > > > > > > > > > > > > > > > > > > > > O LU MU NU OU PU QU RU L% K% K% Q% #% #% #% #% #% #% #% y& .% SU Z$ uQ `p TU UU VU WU {B #q jn :$ [! %> XU -k YU ZU fB `U =t B& `v V .V *; +% ', x& ($ #% #% K% QT mx lK +V o @V }; #V $V J+ f@ O H. /h %V &V *V =V -V 5& ~1 ;V >V ,V 'V v x; .y )s )V E> Gb _f Q) ^' !V ~V {V ]V ^V /V (V _V :V 5 M1 b3 T7 aV d7 bV cV _g sm dV }* eV fV gV Z. O > > > O hT hV iV jV !c q' | G > > > > > > > > > ; ; > > > > > > O ;. S ' ' G T E F ' ' ' , > > > > > 0 0 ^ > > > ; 5 ; > > > > ) -. E | ' ' > > > > > > > > > > > > > 9= a T n fp gp *i T+ =i 'o V+ d+ y ", " O %+ %+ Q. 1~ 2~ 3~ EM {! n9 >. E 2 [ > > ; / @$ ; > > > > > > > > > > > > > > > > > > > > > > > ' R 1+ 2 ) > > > > > > > > > > > > > >. >. _ ' HL kV ' > > > / / ( > l+ > hT 8P LQ lV 'R mV nV oV pV qV @f R4 ^O Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 dj N2 ut ]f 5' rV &O {d sV Mf J8 J8 77 >h tV M) uV vV wV cv I8 I8 J8 J8 J8 J8 J8 ~n xV yV M1 zB zV AV BV CV DV EV q* N > > > ( ; > > > > > _ > > > > > > > > > > > > > > > > > 0 >& d@ FV GV HV zQ IV JV KV Q% Q% Q% #% #% #% #% #% #% #% 4h C& `$ )> |$ LV MV NV OV PV QV RV mx Qx _$ jn SV ;k TV UV VV iu WV OO hz }w #% R% +> /$ #% #% #% #% #% Q% ^$ Q' 1# XV YV j' ZV H, W2 8+ > _ 1% c/ `V W .W +W @W #W #W $W (T %W 2k &W 9E *W ,5 ^t J' qv Nb =W AU -W ;W >W ,W xD >< u- 'W )t )W Mi !W ~W N; aw M1 c' )w >q m# {W ]W ,y ^W /W (W _W :W }p N@ P] -$ Pd > ) ) ; K _- z* 5W F. ' , > > > > > > > > > > > > > > > > > ^ ^ ' ' ' ' S E E | ' G H H > > > > > , o ^ > > > > > _ > > > > ) -. 2 R ' ^ > > > > > > > > > > > > > > ) 6W Mq Nq Oq Pq T+ ,o w+ V+ d+ y ", "#. #. 9@ 7. 1~ 2~ 3~ EM H. 5b >. [ [ ) > > ; - @$ 5 > > > > > > > > > > > > > > > > > > > > > > > , H [ [ > > > > > > > > > > > > > >. M& p D. 7W 8W 9W {% , _ > ( ; ; > Z. hT 0W aW bW cW }O dW eW fW gW hW iW [/ !u ha I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Vl /O Kf u3 jW kW lW mW 5A jL >x J8 Nf je ,d v l! nW oW 8: 3< os )n J8 Nf Nf Nf Nf pW Kb Ww -$ qW rW sW tW hf m+ uW 4O G ^ ^ ^ 9 5 ; > > ^ ^ , > > > > ^ ^ > > > > > > > > > > > >& ]; N vW wW xW yW zW AW BW N] @% #% #% #% #% #% #% #% #% ', ', T$ M' CW DW q_ ,B Gl EW FW GW Oo HW :$ 3= I] (D IW FD JW KW LW MW %% SL ;- z& /$ /$ #% #% #% #% #% {$ 8N ~l NW OW PW QW RW +{ 8+ g, > > f@ l= +{ SW TW UW VW ]r WW XW YW Gm +C Ul rz V> tH N) ZW uw O4 86 -3 `W !S 5C X m# O= .X ch -6 0q Nh +X `i &! vg 49 @X FQ /m #X $X %X &X *X =X -X -W at k6 N@ 03 49 E[ >E ;X >X ,X 'X << )X !X ~X H. G > ) -. E r# /h `' {X ]X v/ S , > > > > > > > > > > > > > > > > > > ^ , , , ' ' [ [ G ' B. -. [ > > > > > , ^ ^ > > > > , , , ^ > > R [ h. > ^ ^ > > > > > > > > > > > > > > ) h. { 8s X; -} ~+ a+ w+ V+ d+ y ", "6. 6. 6. 7. 1~ 2~ 3~ EM H. ^X > > > > > > ; 5 / 5 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , N& p* r n+ /X ;z wA ' , > G G O O Z. aS (X [L _X :X /h :> O O 7+ 7+ S ^ > > > ' ' , > > > > > > > > > O W. k& bX cX dX eX fX gX hX iX Se _$ #% #% #% #% #% #% #% #% i/ i/ jX kX m~ u; ;q lX {> EL mX nX ^q +> z: ~9 su t2 oX {, u& pX iP -< L% v' #% #% #% #% #% #% #% #% @% 7, fQ qX rX CK sX tX uX W# K+ > O > d@ d@ uM vX wX xX mD yX zX AX BX CX 5x [[ 8 `7 DX EX FX 'T GX HX (6 IX JX :X KX LX ;2 ST MX {| NX vP OX PX +| $2 0q _E QX QX RX SX oC ( 1 M7 TX UX [6 I1 G[ 61 MW ,L bH wD 74 *D TI gJ (B VX :- {! > > ) E 7~ WX - C. W. ' ' , > > > > > > > > > > > > > > > > > > > > > > > ^ ' , (. (. G E 2 h. > > > > > > > > > > > , ' S S ^ > > > > > > > > > > > > > > > > > > > > > > > > >. Gt Ht !+ ~+ a+ w+ V+ d+ y ", "%+ %+ `@ 7. 1~ 2~ 3~ EM H. 5b > > > > > > > > ; > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Q XX YX _h 7~ ZX DS 7+ ' ' O ~6 45 c= b= ve `X `x Y .Y +Y @Y #Y $Y %Y &Y h' *Y Bh =Y fe wL '0 ~n -Y ka J8 Nf Of Of '0 [P ;Y >Y ,Y 3D 'Y )Y %z m( !Y (k Fh rt J8 ~Y {Y ]Y qF 6c R> ^Y /Y [/ 8m (Y I8 Nf Nf Nf Of me ke 4o a6 Mw _Y :Y > > > > > > > O I$ 0+ 9Y 0Y aY bY cY Uz fW dY I; jn _$ <$ #% #% #% #% #% #% #% mx Oo =t eY w[ bu 4= fY gY hY iY jY kY lY mY nY oY pY qY ; Aj }] v( BY ^f [l CY DY h| EY qW ID h! {, FY (f GY 7^ ~5 HY IY JY KY LY MY NY p: u^ OY PY dg >k yD QY G= Je c' fa vo RY ~l 6! Ob 8c SY TY UY VY WY ~n XY '8 a0 YY ZY `Y Z .Z @2 +Z @Z P2 #Z $Z %Z &# > > H | | /; 6+ N p* 8~ M , > > > > > > > > > > > > > > > > > > > > > > > > > ' ' , > [ ) > > > > > > > > > > > _ , S 1@ E F ' > > > > > > > > > > > > > > > > > > > > > _ _ ^ DM jf u# 4@ v+ b+ V+ d+ y ", "$+ $+ $+ Q& 1~ 2~ 3~ EM {! 5b > > > > > > > > _ >. >. _ > > > > > > > > > > > > > > > > > > > > > > > > > , _ > > ) ) R > _ _ > > G &Z *Z =Z -Z ;Z >Z ,Z ve v/ 7+ U, t/ |u 'Z )Z C] !Z ~Z {Z ]Z BT ^Z /Z (Z _Z :Z *v (n x DU ,s eZ xM fZ L3 gZ -, `X hZ iZ jZ kZ lZ mZ nZ oZ gy pZ mh qZ rZ sZ O+ ; tZ N ' r+ : > > > > > G O R _. $V uZ vZ zW wZ xZ n, , yZ zZ *{ i/ ($ y& y& B& |= z& #% %% z& si AZ /V BZ Me [! l/ ~, 7# }, CZ DZ 5t EZ FZ GZ HZ IZ JZ ;_ H@ Xw KZ `i -> $; x& #% #% #% #% #% #% #% 8, LZ MZ NZ OZ 1- PZ QZ RZ T, ~ V@ > f@ e@ := SZ Zi TZ UZ ir YH I} VZ WZ y' ly t- dg XZ |f YZ ZZ `Z ` .` +` zM @` #` $` z< %` XQ &` *` =` -` rz a3 1I G7 ;` >` g' /| bO Fv )4 ,` '` }k ne )` !` ~` fn {` ]` ^` /` (` _` :` <` [` }` l. %# > > ^ , , / K Y. 8~ :0 p r > > > > > > > > > > > > > > _ > > _ > > > > > > > , ' ^ > > > > > > > > > > > > > > > , S E 2 F ' > > > > > > > > > > > > > > > > _ > > > > D# ) F ZN jf u# 4@ v+ b+ u* d+ y ", "$+ $+ $+ 0@ v* 6- 4b EM {! @a > > > > > > > > _ ,. ,. D. > > > > > > > > > > > > > > > > > > > > > > > > , , , , ^ -. 1+ [ , , , , ^ N {% |` z* ;+ 1` 2` 2` ve e@ : ep 3` 4` 5` 6` 7` ~Z 8` 9` 0` 1B a` b` c` d` V$ [6 e` f` LJ k* F- Nf '0 ~n J8 J8 J8 Nf Nf '0 g` h` )O i` j` k` l` m` Cr p! GD 66 x~ TH n` o` 6S p` w~ jP ^u !{ q` r` 8H J8 J8 J8 Nf Of NM Nf {K )s aF s` `2 2L t` 6n u` v` w` x` y` z` A` B` C` D` E` F` G` H` I` J` Rm D3 K` ' Q 9 > > > > , S l+ 5$ L` M` N` O` P` pS d. n* Q` )x R` wo jn I% N% P% )$ >_ 1[ #% |= S` 'I T` U` 2, V` jn ~$ tJ [$ 9L [f W` X` Y` Pb Z` 49 31 Q% M] s& Jm `` .}/ v' ', #% #% #% #% #% #% 1[ Y$ . .+ .@ .# .n* V@ $ .RZ % .QZ & .V@ m@ m@ := WA 69 ,g * .= .- .u9 ; .> .fN )- P1 *E Fr Gh Hh , .' .) .! .~ .{ .] .^ ./ .( .aa 'T _ .: .< .-` rz I1 a3 *! [ .} .| .E; O; 1 .FU FU dO V> 2 .3 .~d r3 <: v] 4 .5 .6 .7 .8 .9 .PF 0 .a .l. >& , > > , , ( > D. M N& N& >. > > > > > > > > > > > > > , , , , , , ^ > > > > > , ^ ^ > > > > > > > > > > > > > > > ^ ^ [ [ R , > > > > > > > > > > > > > > > , , , ^ > > ) -. r@ b ..a Z@ ~+ v+ b+ u* d+ y ", "$+ $+ $+ y P. ^2 4b +a {! @a > > > > > > ; ; > M M pU > > > > > > > > > > > > > > > > > > > > > > > , ' G o ' G E J F ' ' F. F. ' Y# =z X' c .d .E} e .9> 'C f .g .h .i .hm j .u{ k .l .m .n .:C el o .s{ x[ ;> p .V4 q .r .s .ut sv F- I8 J8 J8 J8 J8 J8 J8 I8 Mf t .u .WM TI v .w .x .y .}{ )_ !( lr ZU E Hh z .A .B .[= X$ ;_ #u J8 J8 J8 J8 J8 Nf NM Mf ]l h6 U> F[ Lx C .D .E .F .G .H ./i <4 C| ;7 I .J .K .L .M .N .O .P .Q .R .S .T .g7 ; /; ^% 2+ H > > ' _ S V@ 5C U .V .W .X .Y .Z .=, ` . .....QT -- @> @> `$ O' O' A& #% ,c uJ +..@..gN 0h #..#q N% +% ', ($ $..%..&..Me c# G] M% %c pi M% Fa a! *..^^ J] v' _$ #% #% #% #% ($ .> HA >g =..-..;..wI I$ >..J+ ,..'..)..!..of ~..G := SZ 7_ {..]..^../..(..cd _..03 #y Y8 1, 6< :..<..[..}..|..1..2..3..4..5..6..7..8..KB 9..&$ 0..8q !q M1 ,5 J; ]l ]K I1 #J q; a..{F ck K1 qF [E ;< Iv 6: -9 b..c..-H aF d..e..f..g..h..i..6+ W. ' > > > > > > , ' G G ^ > > > > > > > > > > > > > G S ' ' ' o ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , ' S S ^ > > ) E Mq j..Ht k..~+ v+ w+ V+ d+ y ", "$+ $+ $+ y O. ^2 4b +a H. l../ > > > > > ; 5 / C. 0 ; > > > > > > > > > > > > > > > > > > > , ' > _ , S T E | ' ; ) (5 m..F. io n..Hc =, o..p..q..r..s..t..u..v..w..'z x..y..z..}' :: A..B..T' th Q] SI C..lH D..,c E..zs F..G..$b Q= ns ja I8 J8 J8 J8 J8 J8 Nf qs Lf VI @b H..Kd #k I..J..K..L..M..N..%W O..P..Q..VG R..%u F- _O #u F- J8 J8 J8 J8 ka ~n {n Wl HI |] cg 2< Sd hv S..{z $C T..U..V..W..IW V= X..Y..LP Z..`.. +..+.++.@+.#+.$+.%+.po &+.*+.BW 7~ {. 2+ C. 0 F. Tq =+.-+.;+.>+.,+.'+.)+.!+.cS ~+.{+.;S 5h P% O% +% y& 1[ B& w& z& G% PM ]+..w B6 *> pi `$ `$ N% .% D& ^+./+.D% qz *3 #q .> N% (+.y& w& #.._+.:+.<+.x& :$ #% #% #% P' [+.}+.|+.1+.z/ W~ zt 2+.3+.4+.> 5+.6+.7* 7+.8+.5L ]> 9+.0+.,( P$ a+.b+.c+.d+.{I |k c' Ud Ud *! e+.;3 g! f+.g+.h+.1J F_ .= i+.j+.k+.l+.MD @N 9q ]u DU ts FJ > > > > > > _ , G T E [ > > > > > > > > > > > , G T E [ > > > > > > > > > > > > > > > > > > > > > , ^ ^ > > > > > > > > > > ; 9 9 0 , , > > > > > > , , G 1@ E [ > > (5 2@ w+.x+.y+.r9 [v 5@ 6@ 7@ d+ y ", "$+ $+ $+ 0@ P. 6- 4b +a H. lS 9 > > > > > ; / @$ - / ; > > > > > > > ^ > ) ) R > > > > > > ^ , ' > > , S E E j+ G. z+.A+.l@ lB L+ B+.a- ~! C+.D+.10 E+.F+.G+.&T H+.9J WR I+.J+.K+.s3 *! L+.67 X$ X$ ;3 Gb P> M+.N+.O+.P+.Q+.2K R+.S+.^{ E; cQ #r ha J8 J8 J8 J8 J8 Nf wL hH g! T+.>d !0 2V TB U+.V+.$r Pf W+.X+.Y+.Z+.3! |[ ,- `+.)n Mf 77 77 77 I8 J8 J8 fj ~n BB @.D0 Mi s2 {u 3/ .@.-/ +@.+/ @@.#@.$@.%@.&@.eH #k *@.+/ =@.-@.xQ ;@.>@.,@.6H 6: ,6 H_ v b! j '@.)@.!@.:. IT *m J: s% ~@.{@.]@.5- e@ Lq W, rZ ^@./@.(@.,( ;6 $; jn #% #% #% @% z& O} 1= 1= )$ &; 0, 9, 9, qr 9, 9, #c _@.,- xC |m #> 'q :@.)q !, sO sO /J ct <@.[@.N% #% #% #% #% P' pr }@.|@.1@.Ct /K 2@.3@.!6 l+ O d@ > d .4@.5@.6@.7@.jK 8@.9@.c* 0@.a@.Cf n1 b@.Iv a3 I1 a3 c@.@y r3 K; d@.e@.f@.g@.d! :m h@.i@.j@.k@.l@. j &R > > > > > > > ^ , G E 2 [ > > > > > > _ > > > , , G E 2 [ > > > > > > > ^ > ) ) R ; > > > > > > > > ' ' ^ > > > > > > > > > > ; 9 / 0 o ^ > > > > > > _ , G E 2 [ > > > _ 0 'e A@.fy [v Iw 6@ 7@ d+ y ", "$+ $+ $+ Q& v. 6- 4b EM {! B@.^ > > > > > ; / @$ / ; > > > > > > > ^ ^ ^ -. -. [ > > > > > > > ^ , > > ^ ^ F F 7+ s: C@.D@.E@.H K3 F@.G@.H@.I@.J@.K@.5C L@.M@.N@.O@.(f P@.Q@.R@.S@.+C Nf Wl !d #G |P r3 T@.U@.V@.W@.P~ X@.Y@.Z@.Fb `@. #.HR ^s I8 >h J8 J8 J8 J8 J8 Nf I8 Vl 7r I1 '8 .#.&N +#.@#.##.os $#.%#.&#.*#.=#.-#. v {M Zy >h Mf Mf 77 77 I8 J8 Nf ne fj BB ;#.>#.,#.`/ '#.+y )#.DB Ri !#.~#.{#.]#.^#./#.-Y (#.LE Y> _#.:#.9f <#.eD [#.}#.#D |#.1#.yL J8 F- j 2#.3#.4#.5#.6#.7#.8#.9#.0#.W& a#.d@ O z, b#.c#.d#.e#.f#.[m > )I #% #% @% @% w& e* A& B& C& xr g#.9, h#.9, 9, 9, rr i#.j#.L] 3m `$ 0, 9, 0, !, k#.sO l/ l#.m#.n#.N% #% #% #% #% YT M% o#.7= p#.q#.o .r#.s#.gy !P l+ f@ e@ , t#.u#.!..v#.w#.x#.y#.z#.A#.B#.C#./Y [d ts @y F7 j[ D#.z6 3< q3 E#.d@.F#.G#.H#.rY I#.J#.K#.tx o#.L#.&- Mm M#.g6 .| !| N#.-` 03 O#.Y[ mr P#.Q#.R#.y7 S#.M@ E' /Y T#.(K U#.V#.W#.om X#.Y#.Z#.`#. $.0 > > > > > > > > > > ^ ^ [ [ ) > > > > > , , , ^ > > , G [ [ ) > > > > > > ^ ^ ^ -. 1+ :_ 9 > > > > > > > > , ' ' ^ > > > > > > > > > > ; 9 ^ ^ ^ > > > > > > > , ' [ [ ) > > _ _ ^ Hc &i (% 4@ v# w# x# d+ y ", "$+ $+ $+ Q. %& 2~ 3~ EM {! n9 ' > > > > > ; 5 / ; > > > > > > > > , ' S E 2 h. > > > > > > > > > > > > > ' ' H+ q# R# .$.+$.~@ @$.#$.$$.%$.&$.|d }] E[ bD *$.|P Fp =$.;c ,h ^n ]O I8 I8 '0 J8 fe ;h V4 -$.;$.>$.,$.K{ ~M DE G- F' $e nY '$.Cz Mf DE J8 J8 J8 J8 J8 J8 J8 J8 J8 77 77 ha $J rs o] &O NM )$.!$.~$.{$.]$.^$.uL ;3 /$.O1 (E (E H1 ($.Nb Nf Of Of Nf ja &G _$.:$.<$.@k HI [$.{$.}$.JE |$.1$.2$.os ,0 /#.)n fe `+.3$.hj Ib ~Y 4$.je je Wl 5$.OM Of Nf J8 fz 7h fz 6$.7$.8$.9$.[; 0$.a$.b$._ > ; c$.d$.e$.f$.~~ g$.h$.y& i$.#% #% #% #% #% <$ :$ C& ;{ B6 ly sF 'I DC sF D1 P$ vP j$.fg k$.l$.(q {, 2m gF B6 ~t n4 BR fh Z$ I% #% #% #% #% > T$ RV !S m$.`l n$.o$.VC p$.a- e@ d@ O O O q$.r$.s$.t$.u$.v$.Q` v1 w$.x$.!K y$.z$.A$.B$.C$.D$.*/ D#.GJ rq 8M E$.7U G7 '| F$.G$.H$.DC {B l6 Mh I1 3< Y4 -W I$.J$.!| NX _J g9 .j K$.L$.M$.a..kL E[ ;H Bd N$.O$.P$.Q$.R$.]x S$.T$.U$.f@ b= > > > > > > > > > > > > > > > > > > > > > G S ' ' > > > ; > > > > > > > > > , ' G E I V$./ ; > > > > > > > G S ' ' > > > > > > > > > > > > > > > > > > > > > > ^ ' > > > > > > > G W$.yI ^j t* v+ b+ u* d+ y ", "$+ $+ $+ Q. %& T_ 3~ EM {! 5b > > > > > > > > ; > > > > > > > > , ' ' ' ;. O > > > > > > > > > > > > > > *, X$.Y$._L Z$.`$. %..%.+%.@%.WD /9 %J T4 Q= 2 .~n Fk Kb ,r Pf dj 7i Sl '0 J8 J8 J8 ns =h CT '8 #%.$%.%%.#N &%.ia 77 #r 77 +b *%.}G D> DE =%.pW J8 J8 J8 J8 J8 J8 J8 J8 I8 #r ]C [[ -%.Yp 1[ WI ;%.>%.,%.E( '%.)%.Ab rH D( W< aO ]y !%.~%.yE >x Mf ha ha ]l {%.hP (G ]%.^%./%.h] (%.gD _%.me 2$.Of #r wL yr Ha hH YE gj ,0 >h >h fe )n 77 Mf :%.'0 J8 J8 F- 7h 0h 0f 4U <%.{p [%.}%.|%.Z' 1%.> > 8+ / 2%.3%.4%.5%.6%.mr 7%.p .:$ #% #% #% #% :$ _$ w& S' 8%.9%./K 0%.a%.b%.Cn c%.by d%.e%.f%.QH g%.9F 4D eg su rP GA h%.i%.e! in ', #% #% :$ qP j%.on k%.l%.4C m%.pM n%.'R a- f@ I$ 1% d@ > `#.o%.p%.q%.r%.s%.OF t%..x u%.v%.w%.x%.y%.z%.A%.B%.n! ]y Z> C%.D%.E%.RE +y J= F%.G%.H%.DC -q > > > > > > > > > > > > > > > > > 1 1 > -. E F ' > ; 9 - ; > > > > > > > , ' ' ' | 5{ 0 W. > > > > > > > R E T | ' > > > > > > , o 9 5 ; > > > > > > > > > > > > > > > > > > ( 9 K =} X%.!+ ~+ a+ b+ V+ d+ y ", " O %+ %+ Q. 1~ 2~ 3~ EM H. 5b > _ _ > > > > > > ; ; > > > > > > ^ ' ' ' ' ' ^ > > > ^ > > > > > > > ^ ^ Y%.Z%.`%. &.&.,&.'&.)&.!&.~&.{&.]&.6E 9F t2 'w ^&./&.(&.[9 ,h Mf >h ;h 0` Qn _&.:&.<&.pv [&.}&.|&.1&.%N oe NM Nf F- ]n $r ej S5 ]O -Y '0 J8 J8 J8 J8 J8 J8 J8 Ul F- J8 F- 9L L#.2&.3&.4&.Sd 5&.6&.kB O {# > _ >& /h 7&.{6 8&.9&.0&.4G F' RL SL :$ #% Q% #% #% _$ H% a&.b&.c&.d&.e&.f&.g&.qg h&.i&.j&.k&.l&.m&.n&.o&.T: _P Vi o` ]/ p&.q&.-W +; ', #% ($ x& |w r&.PL s&.z: t&.u&.v&.w&. 0q _E -` J$.DC -q M&.xc q3

    > > > > > > > > > > > > > > > > > > ) h. n 2 | ' > ; 9 / ; > > > > ^ >. >. o o 3 3 > ^ , ' > > > > > > > > E E 2@ ' > > > > > ^ , o 9 / ; > ) ) R > > > > > > > > > > > > > > ; 9 6+ '+ W&.!+ ~+ v+ b+ V+ d+ y ", "#. #. 9@ 7. 1~ 2~ 3~ EM H. X&., , , , ^ > > > > 9 9 ; > > > > > ^ ^ , , , ^ ^ > > ^ ^ , > > > > > > ^ S ~P =, rQ Y&.Z&.`&. *..*.+*.1V G- dj Qf N2 )n Mf @*.yS ja Nf Nf Nf Nf J8 J8 J8 J8 J8 @r H#.4i Cz #*.$*.Zl *$.fe J8 J8 I8 Gp Xn GE '$.UE YF %*.&*.**.>0 '0 J8 J8 J8 J8 J8 fe cQ eD @J N- =*.;| -*.;*.>*.,*.'*.)*.!*.~*.{*.]*.^*. > > > > > > > > > > > > > > > > > ) -. n 2 h. H , > > ; ( > > > > ^ N M ,. O 4 4 C. > _ , , > > > > > > > > [ [ R , > > > > > > ^ ^ ( ( : > -. -. [ , > > > > > > > > > > > > > > ; K Q*.R*.,e t* v+ b+ u* d+ y ", "6. 6. 6. 7. 1~ 2~ 3~ EM H. 5b S ' ' ' ' > > > > 9 / 9 > > > > > > > ; ) > > > > > > , ' > > > > > _ , F. jo S*.T*.U*.V*.W*.X*.Y*.Z*.Cp Mf J8 J8 J8 J8 J8 PM Mb `*.J8 J8 J8 J8 J8 J8 J8 J8 #r Kf @R Y7 >f =..=.+=.84 fe J8 J8 J8 fe qv L- 5E @=.#=.$=.%=.&=.-Y fj J8 J8 J8 J8 '0 ;h H1 @k /*.*=.uj ==.-=.;=.>=.,=.'=.)=.!=.Q! ~=.{=.]=.a] ^=.-3 r` /=.(=.je #r .8 _=.kg :=.<=.[=.Fj }=.|=.1=.TT aq la 2=.>0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 >c 67 J8 Of Of Nf '0 3=.lm 4=.5=.r$.6=.X; F. ' 7=.,& !P 8=.9=.Gj 0=.a=.b=.c=.d=.SL #% Q% K% K% K% /$ .% )q 0, ~q !| 2J e=.6n f=.g=.0< 46 h=.i=.j=.k=. #% ($ I% `$ U' wP n=.o=.NS nu p=.o$.q=.r=.>o T} f..s=.t=.m& _= ; /; - u=.v=.w=.x=.y=.z=.A=.B=.=] 38 C=.D=.E=.F=.G=.'D ;G ZK E#.pz > > > > > > > ; > > > > > > > > > ) E n ) 1 1 > > > > > > > > > ' _~ p q O @$ @$ / ; > > > > > > > > > > R > > > > > > > > > > > > > > > ) X. 2 F ' ^ > > > > > > > > > > > > > > G ~6 Oq u+ t* v+ w+ V+ R=.$+ ", "%+ %+ `@ 7. %& 2~ 3~ 4~ j@ S=.E O ' ' > > > > > 0 0 ^ > > > > > > ) -. X. h. > > > > > > > > > > > > _ , F. T=.U=.V=.~3 << W=.X=.1D ~Y >x NM Of J8 J8 J8 J8 F- F- J8 J8 Nf Nf Nf J8 J8 J8 Nf NM 1K Y=.>d Z=.M< <] `=.ke Mf J8 J8 J8 I8 sv +y -..-.+-.@-.#-.$-.-Y [d J8 Nf NM -Y _d Mf dZ sh %-.J> DX A[ &-.*-.=-.--.;-.>-.,-.'-.)-.!-.~-.{-.|, ]-.^-.{n YE /-.&R CD zU (-.n+._-.:-.<-. N% b-.!, ~$ }= F1 M@ c-.d-.e-.e-.f-.*C 8q 7! g-.h-. i-.j-.k-.7_ l-.m-.n-.;, K& J+ o-.p-.q-.v/ 7+ ; 5{ W. r-.s-.t-.u-.FX v-.w-.x-.y-.z-.A-.B-.C-.iJ .@.D-.H=.ZK E-.1V 7M 1< 5# 8 8 l$.'I D% #y c@.CF I1 E#.F-.#y [p ic ic M@ l6 49 8 5! 49 N} -y G-.H-.I-.m&.J-.+^ f@ > > > > > > > > ; 9 - 5 > > > > > > > > > R | > > > > > > > > > > > > > ^ >. D. > 5 5 ; > > > > > > > > > ) -. 2 h. > > > > > > > > > > > > > > > h. ) ^ ' ' ^ ^ > > > > > > > > > > _ _ 0 K-.L-.0$ 4@ v+ M-.N-.O-.%+ ", "$+ $+ $+ Q& 1~ 2~ 3~ =. j@ P-.I R ' ^ > > > > > , o ^ > > > > > > ) -. 2 ) > > > > > > > > > > > > _ , F. Q-.7* R-.S-.T-.n` U-.Jy xL Of Of Of J8 J8 Ul Ul F- Nf [d J8 Nf Of Nf J8 F- F- Nf me V-./%.v .UG W-.X-.c' Mf I8 J8 J8 J8 J8 dj 7o Z> Y-.Z-.`-.@y :%.Qj Wl Mf Of pW -Y _d '0 ka }Z ;.BB 8Q (| /m ;E =B .;.+;.n%.@;.#;.$;.%;.}m z: g# Sl 2-.EU 2-.sH (` ,X &;.)A *;.f5 =;.a..XI -;.;;.>;.O; ,;.';.{n J8 Nf Of ha ha Of Of Nf J8 J8 J8 ka '0 Nf Of -Y _d '0 F- 67 67 F- ka (d !n a1 .h );.RZ $V ax 7=.v/ d@ !;.%( $) ~;.w' FI gA {;.];.^;.pr pK K% Ps L% %c N% N% C& x& :$ {q Se ), )q l/ +; /J /J $; +; > i/ ), i/ _$ @% ($ ($ ($ #% #% #% M% gh ^q th '- ,- /;.Ij O- (;.n-. H o :;.<;.[;.};.|;.1;.2;.65 3;.-R 4;.5;.6;.7;.at 8;.J%.9;.0;.a;.b;..L 39 8 P] c;.'I qz T' M1 I1 N1 J%.e@.HI [p b6 -< !{ 5! au v3 0q J] *2 70 8 )8 Au ba ~r d;.e;.f;.g;.GL f@ > > > > > > > _ : 9 / ; > > > > > > > > ^ , ' , > > > > > > > > > > > > > > > > > > > > > > > > > > > > ) -. 2 2+ > > > > > ^ _ > > > > > > > > > > ^ ' ' , ^ > > > > > > > > > > > _ 0 p9 y+.u# 4@ v+ M-.N-.#. %+ ", "$+ $+ $+ 0@ v* 6- 4b 4~ H. h;.h. > ^ ^ > > > > > , ^ ^ > > > > > > R [ F ^ ^ ^ > > > > > > > > > > , ' F. QF i;.j;.k;.l;.m;.n;.]d le Of Of Nf J8 Ul 67 67 '0 ~n fj J8 Nf Nf Nf Nf 67 Vl #r os o;.p;.q;.4Z Ik r;.1! I8 J8 J8 J8 J8 J8 fe N2 Q= s;.t;.u;.v;.at Kb w;.,0 NM Of pW fj J8 ka 7i x;.yV !d U' U$ _*.$k }, Gb y;.z;.A;.B;.C;.Te D;.7%.Mf Kb E;.F;.G;.6X H;.I;.J;.K;.-v |K %e M2 L;.M;.N;.O;.P;.Q;.,0 J8 J8 Nf ia Ek I8 Nf Nf Nf J8 J8 ~n ~n '0 Nf fj fj fj J8 Ul Ul Ul J8 NM '0 P= E7 k%.a[ u#.D$ G. ^- R;.S;.T;.U;.V;.#% B1 W;.X;.Az Y;.Z;.`;.y& R% +> M% N% I% ($ :$ ', >.NK Ox TL Fo .>.@M 9, +>.'_ )g @>.Nx @>.v' {$ x& ($ ($ #% #% ($ I% ;{ _q {{ *- ;- #>.!- $>.%>.&>.s&.*>.}- =>.->.;>._= 7+ > > ^ >>.,>.'>.)>.!>.~>.{>.j*.]>.^>.n! +Z #v />.H1 XY (>._>.:>.<>.[>.-$ 49 8 -2 'I 40 40 }>.@X T' lm 7U K%.C4 #N Q] 83 I1 lm .C vH B0 b6 hc *g v |>.1>.2>.3>.4>.5>.6>.7>.ve d@ > > > > > > > , , r+ Q > > > > > > > > > > , ' ' , > > > > > > > > > > > > > > > > > > > > > > > > > > > R [ F ^ , , ^ > > ^ , > > > > > > > > > > ^ , , , , ^ > > > > > > > > > > > ^ 8>..a Z@ ~+ a+ M-.9>.0>.$+ ", "$+ $+ $+ y P. ^2 4b +a {! X&._ > > > > > > > > > > > > > > > > > > , ' ' ' , > > > > > > > > > > G S ^ _. 6O 7T a>.^{ Y4 qs os NM NM Nf J8 J8 Ul 67 ej :%._d ~n J8 J8 J8 Nf Of ej >c ]n os b>.Y7 c>.fD d>.X8 fd J8 J8 J8 J8 J8 J8 ha 77 AU e>.f>.g>.h>.LC Y=.>0 i>.'0 ha ha J8 J8 J8 J8 J8 J8 F- ej m/ #u 77 84 CT H8 3=.je qs Ga ej F- J8 #r 77 j>.k>.l>.;$.&e GY u2 ^..m>.)B H_ q; QD n>.`&.o>.p>.oe )n J8 J8 J8 Mb Mb :d J8 Of Of Nf J8 :%.{n >0 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf #r 4i $3 );.q>.r>.s>.G. ^- t>.u>.v>.w>.x>.Io )g q` y>.nY z>.A>.B>.%; M% #> pi N% z& ;- ;- Fa |[ B1 Aj 3= ;6 C>.n4 n4 ,> K} hd M] X$ x' Fa w& N% N% I% #% #% x& x& `$ ,{ k! 4= ]$ D>.E>.F>.2>.G>.H>.jK am r: Uo 5+.O > > > H I>.J>.K>.L>.M>.N>.O>.P>.Q>.R>.=B ut wc xc Q= RE S>.T>.U>.V>.W>.03 'G oz -` qz W> 5! n@.Bj l$..^B I@ F0 N' Y>.:P Z>.`>. ,..,.+,.@,.#,.;. H > > > > > > > G S ' ' > > > > > > > > > > ^ ' ' o ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > , ' ' ' ' ' > > ^ G > > > > > > > > > > > > > > ^ ' > > > > > > > > > 3+ 3+ *, $,.W&.!+ ~+ a+ b+ V+ F3 y ", "$+ $+ $+ y P. ^2 4b EM {! X&._ > > > > > > > > > > > > > > > > > > > ^ ' ' , > > > > > > > > > > F %,.&,.*,.=,.-,.;,.>,.sH DE Nf -Y -Y fj J8 J8 J8 #r $J -Y _d ~n J8 J8 J8 Nf Of F- F- '0 (d ,,.@@.',.),.Vn K] /O J8 J8 J8 J8 J8 J8 J8 Nf J8 !,.~,.^..{,.T| Nd ],.yE L#.wr Fp je 77 Nf J8 J8 J8 J8 F- Vl J8 I8 )n fe fe >h 77 #r F- J8 fj (d ^,.%R /,.(,._,.:,.5_ )1 <,.[,.)A },.|V F> #e |,.1,.>f >$ Pf 77 I8 J8 J8 ja ja J8 J8 J8 J8 J8 J8 S5 S5 F- J8 J8 J8 J8 J8 Nf Nf Nf J8 Nf 4P 2,.-! 3,.e) 4,.m& s: /- ^- =m 5,.'R 6,.7,.8,.X$ P4 Eb 9,.0,.a,.9, +% #> M% D& b,.&% *h TB c,.h] Qn 96 Vn pP dO FI {D hg d,.OK Pi Vn *g FE H% #% @% #% :$ -- +% .> $> si %_ .> qr FD e,.f,.g,.g..h,.i,.yi m* := G > > > > R (. j,.k,.l,.m,.n,.o,.p,.q,.r,.rA lm cQ {K ]l }d s,.t,.u,.|>.U~ > > > > > > , G T E | ' > > > > > > , ' > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ^ ' ' ' ' ' O ,+ E F > > > > > > > > > > > > > > > > > > ; / / ( > > ) -. 5+ I,.4; u+ t* a+ }5 |5 15 Q& ", "$+ $+ $+ y P. ^2 4b 4~ H. J,.) > > > > > > > > > > > > > > > > > > > > ^ , ^ > > > > > > > > > > K,.R;.[..L,.w1 M,.N,.O,.77 DE J8 ~n P,.'0 J8 J8 Nf Nf Of {n g` ka J8 ka '0 Of Of J8 J8 ~n Q,.R,.S,.T,.U,.O) '{ sv '0 J8 J8 J8 J8 J8 J8 J8 77 V,.vF W,.X,.Y,.kC 6: J> 7A [p Y4 iI AU :d Lf ,d wL Nf fj ka J8 J8 J8 J8 '0 '0 '0 ja 77 3=.3=.Z,.&2 +Y D8 `,. '.Zg dr _f .'.+'.@'.6Q ia <' Jp #'.$'.#D (#.2$.&N sv 1G ja J8 Nf Nf J8 J8 J8 F- F- >c 67 F- J8 J8 J8 J8 J8 Nf Nf J8 J8 Nf ha C Vr %'.e[ &'.Hc v/ v/ v/ *'.2b U$.='.A] #M z& f# -'.;'.h=.~-.%c /$ /$ I% P% )$ ={ ;h ts >'.cO pX L- R) ,O v0 Q} *E ,'.|E V~ rP ''.)'.!'.B& ($ :$ y& |! ~, %> ;6 !> #q #q !> ~'.{'.]'.^'./'.('._'.:'.|- X- ; > > > > > > l+ /- L+ <'.['.}'..7 |'.1'.2'.5l M2 9K ce R] z;./^ n( 3'.4'.1< vo qF 51 b3 6M ts y,.sF y' NX qF qF 61 l^ ;B 5'.x- #E 6'.7'.8'.VI 9'.0'.a'.b'.c'.d'.e'.f'.g'.h'.b$.> > > > > > , , G E E 2@ z^ > > > > > ^ , ' > > > > > > > > > ^ > > > > > > > > > > , , _ > > > > > > > > _ >. >. _ > ^ ' o o ' R 1+ 2 ) > > > > > > > > > > > > > _ > > _ > ; / / ; > > ) E i'.sj j'.u+ t* a+ }5 M6 u. Q& ", "$+ $+ $+ y P. 6- 4b =. j@ k'.2 ) > > > > > > > > > > > > > > > > > > > ^ ^ ^ > > > > > > > > > > h= cx l'.8C m'.;j n'.#k >h ;h J8 !n '0 '0 J8 J8 J8 Nf Nf o'.yS ja J8 ~n -Y NM Of J8 [d !n BB p'.86 q'.r'.s'.tq #y Mf I8 J8 J8 J8 J8 J8 J8 77 t'.4M u'.v'.w'.[' dO Qn >O 6: x'.y'.Cs zu Aj ;c &O me -Y ~n '0 Nf J8 J8 ~n ~n '0 I8 Mf Zy (O 'G k z'.A'.B'.NL ,6 ]y C'.]' D'.]y N; E'.W;..'.F'.G'.,G H'.I'.J'.6x K'.Lb I8 Nf Nf Nf J8 F- Vl 67 67 F- F- J8 J8 J8 J8 J8 Nf J8 J8 J8 Nf #u L'.SD M'.N'.O'.m@ e@ _= ]# *'.P'.Wf Q'.R'.S'.x& |! T'.U'.V'.W'.~| 3= /$ :$ #% |! >_ he 1G ;< X'.>b }E -2 l^ l^ qC K= Y'.Y'.P$ ;E @X Z'.*% @; I% +% D& ~t `'.-E `'.]J +% *; jd ).R>.L;..).+).@).#).$).a- s@ O > > > > > > O h= 5{ |z %).&).y-.i8 *).zf =).-).;).>).,).RM KI ').)).!).L1 &_ 61 {| P] mz B4 LE ~).]t w,.RY RY 71 v,.&%.[, Ql {).]).^)./).Re ()._).:).<).[).}).|).G>.1).0P 1%.> > > > > > > , ^ [ [ H (. > > > > > > ^ , > ^ ^ , , , > > , , ^ > > > > > > > > > M& M& D. > > > > > > > > _ ,. ,. D. > ^ ^ ^ ^ , H [ h. R > > > > > > > > > > > > > , , , , , ^ ( ; ; > > R :_ 2).3).X; -} t* a+ w+ 7@ <8 0@ ", "$+ $+ $+ y P. 6- 4b =. q$.4).! [ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > e@ e@ 'C 5).6).4D Ti JE I8 fe J8 J8 J8 J8 J8 J8 J8 J8 F- bh Mb :d J8 :%.{n :%.Of J8 J8 J8 I8 7).8).LO 9).0).el >5 fe 77 J8 J8 J8 J8 J8 J8 I8 Y@.a).b).c).SH wc M1 ],.#=.d).e).f).g).`i 6< aq h).Nf {n /#.>x os ha I8 Q,.(d '0 k* HI cv j b6 i).j).k).9K n;.53 H..l)./p >` dj ;h ui :b m).n).o).p).q).r).f@.]u i! }$ 77 Of Of Of J8 F- Vl >c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 o'.'g s).t).Z$.u).f@ d@ d@ O n* v).w).x).y).5T ($ jn jd ^( z).sr ,O SV sD {$ P' :$ z& Y$ ^+.O' #; C& in in in in 7N $; ~$ ', _$ l/ x& =; 1= Z$ D: .% ed -t A).B).o0 S$ $; +; C).D).E).F).[N G).q>.q-.H).I).O O > > > > > > > > ; J).K).L)._o M).N).O).P).26 Q).R).S).T).U).V).W).X).M@ :.. 8 {| oz qz v,.ts Y).L{ Bj RY Z).$f !| H rH zw `). !..!.+!.@!.B,.#!.$!.%!.&!.*!.=!.-!.;!.| h= > > > > > > > > > > > > ) > > > > > > > > > > ^ S ' ' , > ' ' , > > > > > > > > _ L q* 4O > > > > > > ; ; > M M pU > > > > > > > > > R R > > > > > > > > > > ) ) H S ' ' ' ' > > > > > 9 / 6+ Gt >!.,!.~+ v+ b+ u* d+ y ", "$+ $+ $+ Q& v. 2~ 3~ EM H. '!.[ ; > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > f@ f@ )!.4W !!.~!.&u .#.'0 I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Vl ja J8 J8 S5 S5 F- J8 J8 J8 J8 ia {!.VG ]!.^!.%S Y< pw fe 77 J8 J8 J8 J8 4o J8 I8 la eH /!.(!.+b b3 G1 iI E0 _!.:!. n` V< ]y 3!.4!.4!.w; 71 [6 5!.6!.7!.8!.g# *O ^d 9!.K> 0!.a!.b!.*y lL c!.d!.e!.Vl Mf Of Of Nf J8 J8 ka ]O ]O ka J8 Nf Of J8 J8 J8 J8 Nf Nf Nf J8 ~n gj @*.6< f!.g!.Qk f@ d@ O O W2 h!.2F i!.i7 5w O% +; !> HA j!.tr 'S k!.l!.fY N] m!.z& ~, $> ;{ N% .% $; $; $; $; V% .% .% x& 6, _$ :$ w& 1[ `$ C& H% 2= UT {-.[y }= D& 2N $; z: n!.o!.p!.q!.r!.5=.s!.1 ^ > > > > > > > > > > O l& t!.u!.9j v!.#< w!.x!.y!.z!.#j A!.IN B!.C!.D!.E!.QM F!.M1 oM .C G!.71 ]t F!.J= Hi vo H!.:q $f I!.J!.K!.kb L!.M!.N!.O!.P!.Q!.R!.S!.T!.U!.V!.`] W!.q+ .^ > > > > > > > > > > ) -. X. [ > > > > > > > > ) -. E ;. ' , > > > > > > > > > > > > R ~2 X!.[ > > > > > > ; 5 / C. 0 ; > > > , ' > > , G E E [ > > > > > > _ , G E n n E ;. ' ' > > > > > > 9 - 6+ k| >!.,!.~+ a+ b+ V+ d+ y ", "%+ %+ %+ Q& v. 6- 3~ +a H. @a > > > > > > > > > > > > > _ _ > > ; ( ; ; > > > > > _ > > > > > > > f@ f@ ex Y!.UN Z!.3< cv ja ja ja J8 J8 J8 J8 J8 J8 ka ka J8 J8 Nf J8 67 ej F- J8 F- F- J8 ia `!. ~..~.Jq +~.@~.^| ;h )n I8 I8 77 T5 YE ,h -h Gp Iv #~.$~.rt G1 #r 77 Ck /=.7Q ]| 'n DB k` %~.&~.*~.=~.<#.-0 -~.;~.#D z6 0V [Z >~.a] ,~.M) Y8 '~.%-.E0 |k <' )~.!~.~~.{~.(*.N2 ha )0 ]~.^~./~.(~.E4 +*.Pf rs $r $J _~.pW NM Nf J8 J8 '0 >0 _d ka J8 #r $J J8 J8 Ul F- Nf Of Nf J8 ~n 2-.Wl #y I@.yA & .{! d@ O ^ U, :~.<~.[~.A! }~.+; l/ #q mx !8 dg |~.1~.2~.3~.;- {q {q -- .> I% O% % N% 2[ 2[ `$ N% N% N% I% #% #% #% ($ ($ in N% $q ]t K' 6[ -6 _$ pr @w 8,.9h su 4~. Z 5~.6~.,..'C d@ O > _ > ; ; > > > > > O l& 8* 7~.+F 8~.9~.0~.a~.b~.c~.d~.e~.f~.g~.h~.i~.j~.8q a1 @y .> > > > > > > > > > ) -. 2 ) > > > > > > > > ) -. 2 O ' ^ > > > > > > > > > > > > R E 2 [ > > > ; ; ( 5 9 / - / ; > > ^ , ' > > , S E 2 [ > > > > > ; : , S 1@ n } 2 O ' ^ > > > > > > ; 9 6+ y~.z~.Z@ ~+ a+ w+ V+ d+ y ", "9@ 9@ 9@ Q& v* 6- 4b -K f@ 5b _ > > > > > > > > > > > , , , , > 9 / / 5 > > > > , , , ^ > > > > > f@ 1% a- A~.B~.C~.H1 ns ja Lb PM F- J8 J8 J8 J8 ka [P }P ka Nf Nf Nf F- F- J8 J8 67 67 F- ]O D~.xN E~.F~.-v G~.H~.la fe ha ha T5 I~.J~.K~.-h ~d ~).bc L~.U4 Nf je fe =h =h 77 DT $l )D M~.N~.O~.P~.Jk @K Q~.R~.S~.T~.mu U~.V~.W~.X~.{/ )D DU ]K N; 9c Y~.Od Z~.`~. {..{.o'.77 ha Gp +{.@{.#{. y: Vr {B -6 }= `v ;{.>{.,{.K] ap '{.){.!{.~{.w% O d@ > _ , ^ 9 9 ; > > > > O l& ;>.{{.]{.]T ^{./{.({._{.:{.<{.[{.}{.|{.1{.2{.3{.$y L+.n;.x,.rF 4{.aL 5{.o0 eh [[ ;< 8: 6{.7{.8{.9{. 7 0{.a{.b{.b| c{.d{.e{.;'.HC f{.g{.h{.i{.j{.k{.l{.> > > > > > > > > > R [ [ > > > > > > > > > R [ h. > ^ ^ > > > > > > > > > > > > > [ [ ) > > ; 5 / / / 9 ( 9 5 > > > > ^ , > > , ' [ [ ) > > > > > 9 9 r+ ' | B. ,+ h. > ^ ^ > > > > > > > ; K m{.n{.u# ~+ v+ b+ V+ d+ y ", "o{.o{.p{.0@ O. ^2 4b 4~ q{.B@.> > > > > > > > > > > , ' S S ^ > 5 /; - / ; > > > G S ' ' > > > > > ve 1% q| r{.s{.t{.]K Nf Ek eQ v& ja J8 J8 J8 J8 ka }P |Z ka J8 Nf Of J8 J8 J8 J8 67 >c Vl ]O u{.v{.w{.x{.y{.c J8 F- Vl >c F- J8 J8 J8 J8 77 77 .#.O{.TH P{.:- 8+ > , F. V, Q{.R{.S{.X4 T{.WL #% P% )q yC z: U{.V{.eu Gr P$ =t Y$ hz |= x& +% N% O} O} U% .% .% .% .% .% .% .% .% N% ;{ 4m W{.C' =t 2N > ^$ X{.Y{.Z{.UA `{. ]..].+].@].k) 3b > > _ , o 9 / 9 > > > > O #].0[ vX $].%].&].*].=].-].zu Z8 w' S` RT &$ sF $2 *! ]K F- g@.;].>].,].*N )| l$.K' O{ '].)].!].~].)*.{].]].i%.'O A1 Y4 ^]./].(]._].:].<].[].}].|].R+ 1].^ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ; d. - / 5 ; > > > > > > > > > > > , ' > > > > > > > > 9 / Q ' ' ' , > > > > > > > > > > _ _ 0 K-.9$ 0$ 4@ v+ b+ V+ d+ y ", "2].3].u. P. X+ ^2 3~ Z{ -& ;& > > > > > > > > > > _ , S 1@ E [ , M '. ^ 5 > > > R E T | ' > > ^ ' _ aR 1% ;>.4].5].7: )n ^d ha I8 #u J8 J8 J8 J8 J8 J8 ka ka J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 I8 I8 6].)U !&.7].8].9].0]..#.3o a].k] 06 3Z =/ b].c].WU ^^ d].e].f].g].h].Ck i].1D )n J8 ha ke gj j].k].l].HR m].n].6~.BO o].p].Vn q].r].s].t].u].v].rH t( uw a| Oe 71 Vl ;h fe 7i BB BB Ib 8H P~ w].x].y].~%.DE fe #r ]n $r I8 ka J8 J8 J8 J8 J8 J8 J8 J8 F- F- fj -Y :%.]O J8 J8 J8 J8 J8 ia ia (E z].*M S@ A].h7 > ^ O B].C].D].Jw E].R} F].x& .% $; /J si uq H> 'w GY R>.G].@2 &@.}! 4r H].tK 7, )g qr I].J].!w !w !w K].H].8, Z$ R= >k ~( 0h )> %; =- #% L].M].N].O].P].Q].R].S].T].s>.)# > > > > > r+ r+ : > R O d@ Z. QF d@ U].lU V].W].X].Y]._!.!t @R Z]._~.`].rv }E b3 mz f! -> &N ^.0D o;.f# .^.+^.zV @^.#^.Zd $^.%^.&^.A4 *^.gc =^.cv H1 -^.NE ;^.MF >^.,^.'^.)^.!^.~^.{^.d@ ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ; ; ; '. M A^ > > > > > > > > > > _ , ' > > > > > > > > 0 0 ^ > > > > > > > > > > > > > > > > G ~# 4; *i t* v+ w+ V+ d+ y ", "]^.^^.8. O. P. ^2 3~ Z{ Z, ;& > > > > > > > > > > > , S E 2 h. , M M >. > > > > R E E 2@ ' > > ^ ' _ ve Z. ;>./^.=-.TI >A ,r Of _~.Of J8 J8 J8 J8 J8 Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y -Y '0 I8 (^.(E _^.0g :^.6Z P> vv <^.[^.}^.FZ N< Jp 2X |^.F>.$T 1^.2^.z'.3^.4^.5^.6^.3P Of 84 os NM [P !,.8i }Z Iv }c 7^.8^.Tj 9^.0^.Ax CT Of a^.b^.c^.d^.`B 6Q 1, m/ D;.e^.=O ^d 4o Hb C e!.Vl Ws B: f^.g^..=.h^.-h >h F- ]n $r #r J8 F- F- J8 J8 J8 J8 J8 J8 J8 [d fj -Y _d -Y fj ka F- F- J8 ha ha 4X i^.j^.k^.Y- X; ^ G R l^.m^.n^.Y! Y! o^.p^.q^.%c `$ `$ #q r^.Z[ (' VE R>.s^.U0 L- t^.F[ Wr u^.g! :..P$ v^.DC 40 40 qz UA 3m w^.x^.T= @N y^.O} P% I% ($ #% P} ,q z^.A^.B^.C^.D^.E^.F^.FM Y%.B{ 8+ :> e@ ^- k) #].#].1% _= 1 t@ n* o*.Y- )c G^.H^.I^.-j J^.!).SH K^.yn H*.L^.M^.N^. 8 >g )t RX Hv t].P;.:f .B kg O^.P^.Q^.R^.S^.T^.[f C;.U^.!| $2 (E Nf ZK 6H n~ V^.W^.X^.Y^.Z^.`^. /.QZ g .> H H >. >. i+ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ^ > > > > > _ p M pU ) > ^ > > > > > > > > , o > > > > > > > > , o ^ > > > > > > > > > > > ^ > _ > > ^ m& ./.*i t* v+ b+ u* d+ y ", "O-.O-.Q& y O. ^2 3~ zI r) }% > > > > > > > > > > > ^ ^ [ h. ) > ^ G ^ > > > > > [ [ R , > > ^ , > f@ ve g .+/.qL @/.EE fe NM pW -Y J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y #/.~n I8 N2 N2 n;.$/.LO %/.1L &/.*/.=/.-/.;/.JG >/.,/.'/.)/.-R !/.~/.O! {/.]/.^/.//.O; @y Jb ^d Nf ka MM 3=.H8 (/._/.:/.0 S5 ej Nf os os sy &u eF _Z 3; *'.' S R p| 9/.n, 0/.a/.E+.b/.z^.za gd Z$ I% c/.}= oz d/.%l e/.f/.g/.h/.i/.j/.k/.cu ^^ +B l/.yh m/.n/.o/.p/.q/.r/.s/.n7 *g wP FE H% ($ ($ #% N] x& o#.t/.u/.v/.w/.x/.#- m..y/.z/..^ I^ ]; /- k) A/.3b Z. Ht B/.C/.D/.E/.F/.G/.H/.I/.J/.~< K/.L/.M/.N/.T> O/.;b L; P/.2z Q/.9V >&.aI R/.S/.K7 X#.T/.U/.V/.W/.X/.Y/.vV O1 ;h o7 ~F +y J'.>x &y Z/.NB `/. (..(.~} +(.d8 @(.#(.aX K$ $(.pU %(.p &(.i+ H ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > , , ^ > > > > _ A^ pU O& E R ^ ^ > > > > > > > ^ ^ > > > > > > > > , ^ ^ > > > > > > > > > > ^ ^ , , , _ ^ Ig *(.=(.~+ v+ b+ u* d+ y ", "$+ $+ $+ y P. ^2 4b -K Lq c@ > > > > > > > > > > > > > > > > ; - / ( > > > > > > > > > > > > > > ^- ^- -(.;(.>(.j^ ,(.T5 Nf fj _d ka J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 :%.:%.:%.ns Ku {K '0 ]| '(.+4 )(.fo !(.~(.{(.pH ](.^T >;.^(./(.((._(.:(.<(.Dt [(.f&.}(.A7 4K 1#.ns J8 J8 J8 |(.$J Sl 1(.2(.3(.4(.1-.'H 2 .I1 *D #=.Bd !f ut M} vN Rd Z` aO aO 5(.6(.7(.8(.9(.PR 0(.a(.q; 4'.#=.b(.z6 77 ha J8 J8 J8 Of $J Vl >c F- J8 J8 J8 J8 J8 J8 F- J8 J8 J8 J8 -Y g` Ws -6 #r c(.le G- H~.aO d].d(.E} F. _= > ^ O Y' vU e(.f(.g(.h(.,> O' i(.I% #% :$ l/ 0, j(.k(.K@ l(.m(.n(.o(.p(.q(.r(.s(.t(.u(.v(.w(.x(.8% AV x] y(..w FE }! z(.1[ #% ($ :$ 7, G] ug fA A(.B(.C(.gi {! D(.E(.F(.G(.P& 0~ t#.H(.I(.s!.Lg J(.K(.L(.R>.M(.N(.O(.P(.Q(.yW R(.S(.T(.#F U(.,X V(.j=.*M W(.qh WE X(.Y(.3_ Z(.`(. _.zl ._.58 %K +_.@_.#_.'6 $_.H=.2I ]B 1I DU I8 Xn (~.*U %_.&_.*_.=_.-_.;_.>_.,_.'_.)_.!_./# ~_.6 8 m..>. ' ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > o o ^ > > > > > > ) E n ;. ' , > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ^ ' ' , i+ 8+ K-.9$ 0$ 4@ U+ w+ V+ d+ y ", "$+ $+ $+ y P. ^2 4b +a H. 5b > > > > > > > > > , , , > > > > > 0 0 ^ > > > > > > > > > > > > > , s>.s>.=, {_.]_.@b K~.7i J8 J8 ka J8 J8 J8 J8 Of ha ia Mb ja J8 Nf Of J8 J8 J8 F- ]n ^_.N2 1V /_.(_.O{.&u 2' Xw #b __.D'.WU u( L/ :_.<_.[_./f }_.|_.=C Ii 1_.2_.9] 3_.4_.5_.6_.7_.u~ M^._O J8 J8 J8 ka [P {n 8_.9_.0_.a_.b_.+Y 7: c_.d_.wc hg '%.e_.f_.g_.^!.c4 h_._g i_.j_.k_.l_.m_.n_.o_.p_.HX q_.r_.fe 77 J8 J8 J8 J8 J8 J8 1G J8 J8 Nf Of J8 :d s_.v& S5 J8 J8 J8 ka ka F- Vl J8 #r ]n [[ J8 t_.u_.v_.$V s: +^ > > 0x q@ w_.x_.y_.z_.A_.,> z& 4h #% #% x& +; > B_.>- >g q/.C_.D_.E_.6+.3L 2+.u+.&9 PU F_.G_.H_.I_.J_.K_.Zo &6 2[ L_.2= Z$ N% ($ 6, M_.T0 N_.3T O_.P_.Q_.)+.R_.F, S_.T_.&F U_.V_.W_.X_.Y_.Z_.`_. :..:.+:.^(.@:.#:.$:.%:.&:.*:.=:.BS KO -:.;:.>:.,:.':.):.!:. - ~:.{:.]:.^:./:..4 (:.av _:.::./k /D <:.q3 !n [:.L{ L+.I=.U4 G[ }k )'.}:.|:.1:.Tb 2:.3:.4:.5:.6:.7:.8:.9:.j{.e$ :j 0:.0x ^- /- G. ' , i+ a:.m..m..pU D(.m..m..m..m..m..i+ _ (. > > > > > > > > > > > > > > > > 9 9 ( > > > > > > > R ;. S ' , > > > , o 9 9 ( > > > > > > > > > > > > > , , , > > > > > > > > ^ ' G ,+ 5+ 5- b:.]P T+ 5@ 6@ 7@ d+ y ", "$+ $+ $+ y P. ^2 4b +a f@ 5b > > > > > > > > > , ' ^ > > > > > , ' ^ > > > > > > > > > > > > > , v/ s>.t#.c:.fA ^y -h 77 J8 J8 J8 J8 J8 J8 J8 _~.NM yS Mb ja J8 #r #r J8 J8 J8 F- ]n d:.;h e:.f:.g:.h:.i:.<9 DE Gp qs 2,.2,.$J ^n &*.j:.+G o7 T0 ;_ Z8 f# ;A W;.I( k:.l:.m:.n:.iP )V %N _O Nf '0 I8 Nf J8 F- ha Of _%.4A o:.zx P) p:.q:.aI 4D -).r:.s:.l*.r] @< .( t:.u:.v:.w:.x:.0) O* y:.NV z:.p4 A:.77 I8 J8 J8 J8 J8 Mf ,d N2 I8 J8 Nf Of Nf ja Ek Lb ja Nf J8 J8 J8 J8 ne ka J8 F- Vl Ha B:.C:.^&.q] D:.O )# > D# 0x E:.F:.V- G:.H:.=6 _q _$ v' #% #% x& .% N% +% 7! P( da I:.t(.J:.#].k) G. F. ^ /> o*.K:.L:.M:.A! b/ N:.O:.C& $c >- ;{ N% ($ JZ $w )( r2 P:.Q:.R:.S:.m@ T:.>e kk U:.N'.V:.W:.X:.Y:.Z:.`:. <..<.5/ PD +<.@<.#<.SI $<.~- %<.&<.*<.=<.-<.o .;<.k;.><.J/.,<.'<.)<.!<.~<.{<.]<.^<.WC /<.J&.N_.jg *W |I (<._<.*N *N {K 7U 3P N1 0w :<.<<.[<.Gx }<.|<.+X 1<.2<.3<.4<.5<.6<.yi 7<.X' E# u! u7 X' I).8<.N a Sq 9<.9<.0<.9<.D(.tZ tZ a<.O& r@ 1` b<.)J F R _ > > > > > > > > > > > > 9 / ; > > > > > > ^ ^ ' ' , > > > _ , o _. |% 5 > > > > > > > > > > > > > , ' , > ) ) R > > > > > ' H T ~ c<.P& u+ T+ 5@ 6@ 7@ d+ y ", "$+ $+ $+ y P. 6- 4b -K Lq c@ > > > > > > > > > , ^ ^ > > > > > , , , ^ > > > > > > > > > > > > > (- v/ t#.cY d<.Sa -h >h J8 J8 J8 J8 J8 J8 J8 pW :%.]O :d J8 J8 Vl ej F- !n !n '0 $J N2 x;.e<.s@.K7 w{ 8L G> K..f<.g<.h<.2D 'r i<.j<.w;.Zy Ww Zy Pj @. @.dj DT k].k<.F; l<.m<.],.I1 Hb ]n Nf os os ha Nf #r sv %R )s =0 <: x~ 6: },.n<.o<.p<.'4 q<.r<.s<.@'.[M t<.,/.u<.(v v<.w<.p- x<.y<.z<.91 A<.{K I8 J8 J8 J8 J8 [d 77 /O e^.ia J8 J8 Nf Nf Nf I8 I8 Nf Nf Nf J8 J8 '0 ~n ~n ka J8 #r wL B<.C<.D<.YA ^l l'.F > > 7+ _ X%.E<.F<.Z!.Z4 a! _$ 7, #% #% 4h C& D: G<.!@ H<.I<.J<.bW Z! j, K<.C* io m& ]# _= +@ L<.M<.Ft N<.O<.6m +% ', Z$ `$ .% +% 31 0! V< P<.Q<.CK R<.S<.T:.T<.U<.V<.V0 W<.X<.$T Y<.Z<.`<.-@.%) Oi :: mu )F [..[.O~ ^| 1, +[.@[.#[.$[.%[.&[.*[.=[.-[.;[.2S ~3 9j <& >[.,[.'[.)[.![.~[.Sa {[.][.^[.vL /[./[.{K 4X ([._[.h).:[.<[.[[.G'.}[.|[.1[.~B nn 0(.2[.3[.4[.5[.6[.7[.8[.9[.Y; 0[.%{.X2 7<.._ *, p| D+ a[.b[.c[.d[.e[.:= s@ f[.g[.h[.i[.j[.x~.r@ 3@ _ > > > > > > > > > > > > ( ; ; > > > > > > > ^ , , > > > > , ' o 1+ J [ > > > > > > > > > > > > > , , , > -. -. [ , > > > > , H 2@ B. k[.h..u+ T+ v# w# x# d+ y ", "$+ $+ $+ y P. 6- 4b 4~ q{.B@.> > > > > > > > > > > > > > > > > > > , ' ^ > > > > > > > > > > > > ^- {# E} ` .c].4E fe 77 J8 J8 J8 J8 J8 J8 J8 _d -Y fj J8 J8 F- >c -6 F- !n ~n _d NM BB Bk l[.sJ W/ ^U G .zc at ha /d os ha :%.{n NM Of Nf J8 J8 [d ~n _d os >x gj Gk Hp i].~d ;h 77 J8 J8 J8 yL m[.n[.os )n DT l] L- su E4 o[.MJ 6E p[.q[.r[.s[.x~ %2 J8 ]K C<.Z+.t[.},.Zs u[.v[.w[.Fa A& x' ,d 77 I8 J8 J8 J8 J8 J8 ns /$.Lu $2 cv '0 I8 J8 Of Of Of Of Of Of Nf J8 F- ja >0 _d ka J8 Nf me Jb x[.y[.>^ >S z[.A[.7+ o ^ ^ U, B[.C[.D[.E[.B0 #% v' #% #% 4h x& Da F[.G[.H[.I[.uj J[.u+.Z. e@ o ' ' S o@ K[.L[.M[.g!.N[.i*.O[.P[.,q .% N% $; .; Q[./' R[.S[.T[.U[.V[.5- {- W[.X[.+< 68 CG J<.E).Y[.U5 Z[.`[. }.Ea .}.L=.Q} +}.C;.fz ($.@}.#}.$}.%}.&}. .$$ *}.=}.-}.;}.T) Z* >}.U .,}.'}.)}.3{.~t mW !}.~}.{}.%*. L ]}.^}./}.(}./[._}.ga 3-.:}.<}.[}.}}.|}.U/.&&.1}.2}.3}.4}.5}.6}.fR j;.7}.nj cd 6T 8}.9}.0}.a}.h. R+ b}.|p ^t IK r/ c}._l d}.e}.Pn f}.g}.C$.h}.i}.j}.D(.H > > > > > > > > > > > > > > > > > > > > > > > > > > > > , ' G E 2 h. > > > > > > > > > > > > > > > > ) X. 2 F ' ^ > > > > > > ^ 8R yI ^j t* v+ b+ u* d+ y ", "$+ $+ $+ Q& v. Y{ 3~ k}.l}.;& > > > > > > > > > > > > > > > > > > _ , ' ' ' , > > > > > > > > > > ^- ^- K3 m}.n}.be ]n I8 J8 J8 J8 Nf #r Vl >c ja Nf Nf Of J8 J8 F- F- '0 -Y _d {n o'.o}.p}.q}.@C r}.A/ s}.Y,.!%.CF K..t}.>c >c >c >c Vl F- J8 J8 J8 J8 J8 Nf NM >x ^n u}.Xl 3=.fe I8 I8 J8 ]l `y 3< DU Zy CT N1 6Q Xs NL v}.w}.x}.y}.#:.!&.7c ag !{ 7r >h (d ET |I at ^s 3! l6 Nu RL he ge ,d Lf I8 J8 J8 J8 ja I8 ns %R }/.z}.A}.!#.fe la J8 J8 J8 J8 J8 J8 Nf Nf Of ej >c ja ka J8 J8 J8 Of je H1 Q} B}.(C C}..F}.G}.H}.:r I}.J}.K}.3b v7 T a ' -. L}.9P M}.N}.O}.P}.Q}.R}.S}.T}.$; /$ +>.U}.*q e=.V}.W}.X}.;, g, }Y ]> Y}.Z}.sE `}. |..|.+|.=< %u a# RL id @|.().A1 1V rv [p }t MO ;H #|.$|.%|.)G 01 &|.*|.[k vg 74 ^u =|.-|.(I ;|.K1 ;b %R sH m[.,$ r` Yl d@.>|.,|./}.1V @y m@.,|.vL #y yE ^J '|.)|.6a !|.~|. > > > > > > > > > > > > > > > > > > > > > > > > , ' ' ' | 2+ 3+ > > > ^ ' > > > > > > > > > > > > h. 2+ ^ ' ' ^ ^ > > ( 9 K e|.0+ !+ ~+ a+ b+ V+ d+ y ", " O %+ 0@ v. _% i= 3~ f|.g|.o| > > > > > > > > > > > > > > > > > > > , ' O R H > > > > > > > > > > ^- f@ 8P h|.i|.j|.g@.5o '0 '0 J8 $J 7o ej >c F- J8 Nf Of J8 J8 J8 J8 ~n _d _d :%.Lb Mb 3o k|.G8 l|.>@.m|.n|.Sf w0 (Y *$.wr X$ o7 f# ej F- J8 J8 J8 J8 J8 J8 J8 Nf :%.}Z }Z ka J8 J8 Mf Mf cQ +/ o|.a: L+.Kb p|.>d el eD q|.r|.s|.n<.@J L' j o7 g# wL NM (d {n Mf I8 Mf Mf Mf '0 #r F- ka J8 J8 J8 J8 J8 J8 '0 '0 ns F1 (&.t|.u|.v|.ns la Nf J8 J8 J8 J8 J8 J8 Nf Of ej ej F- J8 F- F- J8 J8 8Q (Y 3< W< g*.W} w|.#].m& ^ > O QF x|.x_.y|.z|.RY 'd ', x& )I VA +w Yo A|.mN B|.C|.D|.E|.F|.G|.J 2+ o -. H|.I|.J|.2O n-.K|.L|.M|.N|.O|.sO 6, P|.Q|.R|.S|.v&.T|.v4 QR 4+.U|.V|.W|.bz M: 0< A4 >< W$ L#.I8 I8 J8 ns X|.+h L'.k* r3 |] |d }!.+/ 3' 6: #b m;.Y|.*b Z|.`|.)`

    1.,1.^` '1.)1.!1.~1.0&.{1.]1.^1.8/./1.vL Mu 2< ^9 (1._1.:1.1x ky Z..<1.K*.~3 [1.}1.|1.%6 11.21.31.41.*, 7+ ^ > > > > > > > > > ^ > ) ) R > > > > > > > > > , ' ' ' , ^ > > _ , , ' > > > > > > ^ > > > > > > ^ r+ 3 < 9= , > > ; 9 K $,.51.61.~+ a+ b+ V+ d+ y ", "#. #. Q. _% 71.81.3~ 91.,C J,.> > > > > > > > > > > > > > > > > > > ^ > ,+ 1+ [ > > > > > > > > > > f@ f@ 8P 9&.01.v%.2/ C NM {n '0 7o $r @r Ul J8 J8 J8 Nf J8 J8 J8 J8 fj ~n pW NM 9L fz |[ ]O j<.LE W< '$.}<.a1.b1.cI 1G !d LM yr 9L S5 F- J8 J8 J8 J8 J8 J8 ka [P [P [P ka J8 J8 J8 >h fe h6 ({ .! AS c1.d1.mL e1.eD P;.f1.g1.h1.i1.Wn 6x |P LM ,d wL NM >0 BB >h fe -h Wl Cp (d '0 J8 J8 J8 J8 J8 J8 J8 J8 Nf '0 1G => j1.k1.l1.~/ '8 $J os Nf J8 J8 J8 J8 J8 Nf Nf F- F- J8 J8 67 67 F- J8 PM I~.ka t_.ma m1.n1.n..{# > > O l& ^g o1.p1.q1.r1.1m +; .% ), 1w Q[.s1.t1.u1.v1.j&.w1.x1.y1.}S a= 5 ^ g7 b<.n| z1.G^.A1.B1.C1.9|.D1.b6 r^.SL pK E1.MK F1.G1.:X pS H1.I1.mk _L EG J1.O! K1.L1.bD |[ M1.'0 '0 N1.2k 0` L'.'g E1 z1 MP v( =1.O1.P1.Q1.UE Km R1.S1.T1.U1.V1.W1.J%. 1._<.X1.OM 1#.r3 J= [y 7B ,$ Y1.G*.tV L{ qv 5U d_.F-.O1 L{ N@ aw Y> G_ Z1.*j `1. 2..2.+2.@2.#2.$2.r1 %2.&2.Z!.X>.]Z *2.-0 =2.-2.0].;2.J'.,$ q3 [6 2/.>2.^G LJ ~%.D( ,2.5&.8A '2.)2.6(.!2.0J ~2.{2.]2.;K v/ o > > > > > > > > , , ^ -. 1+ [ , > > > > > > > > , ^ ^ , z^ z^ , , , , , ^ > > > > > ^ ^ , > > > > , (. Q k. _~ M r > > > ; O k| 51.61.~+ a+ b+ u* d+ y ", "6. 6. p{.^2./2.81.d< (2.f< h;.> > > > > > > > > > > > > > > > > > > > ) X. 2 [ > > > > > > > > > > d@ d@ _2.R{.:2.<2.[2.x,.OM 5$._d wL $r ]n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Vl >c Ul Nf os Of Ku pX }2.|2.12.22.32.}p #y (E 8H ja ia I8 J8 J8 J8 J8 J8 ka 42.}P '0 Of Nf J8 J8 fe -h h6 U{.#e 52.3x 62.72.82.G[ 1.92.^d Zy CT ,r ha J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 !n ~n _d ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja b,.02.a2.i{ b2.[$.vL ^d ha J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 >c F- J8 s_.M{.>r 2K c2.d2.j$ /- ^- > > ; H. x&.e2.f2.g2.h2.{.. > $; ~$ ~, i2.j2.k2.l2.U; 2>.m2.n2.@$ o2.6+ 0 > > 1% f@ [) p2.k&.;1 @i q2.r2.l0 Y$ Se >_ 74 fA s2.t2.u2.&# Dg v2.w2.x2.>a y2.r@.>(.<' @y H1 Y4 ]K yL +C x,.k* Ul ().H= S7 z2.R+.:^.!W A2.e).d).v{.B2.C2.D2.%! E2.F2.e@.&y #y ]K J8 H1 vg %y FQ B1 $_.,].e@.)- 40 T' h6 G2.H2.=M I2.k^ J2.79 K2.L2.M2.N2.J! 9e V'.D .O2.P2.Q2.R2.S2.Ip Hp T2.-h >h >h fe fe os NM '0 I8 Mf 7i ie la DE DE DE ~d |P g* ;c e!.qF J_ Z` ^' y;.&Y U2.=z _ > > > > > > > > _ , G E J F ' ^ > > > > > > > > > > > G S ' ' ' o ^ > > > > > > > , ' > > > > ' o 6+ /; Y. q Y. > > > > G 9+ W&.!+ ~+ v+ w+ V+ R=.$+ ", "%+ %+ `@ v. _% i= 3~ .D I6 o| > > > > > > > > > > > > > > > > > > > > > h. ) > > > > > > > > > > > 7+ 7+ 0> V2.v%.7E =N U~ dj Qj _d NM $J Of Of Of _~.pW >0 67 67 Ul J8 J8 !n ~n -Y J8 F- '0 -Y Of ha ns 3< _' #.W2.9] X2.[V V= Y2.r7 -; Z2.`2.YE J8 4o J8 J8 J8 ka ka J8 J8 J8 J8 J8 ha >x ,$ 3..3.d&.+3.@3.#3.Ip Y4 $3.%3.#r ,h fe )n Nf J8 J8 [d fj _d J8 J8 J8 J8 J8 J8 J8 ka J8 J8 J8 J8 J8 J8 J8 J8 >c >c F- I8 >_ S= &3.*3.=D =3.-3.,r 77 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 ]O Mf NM Of Nf DE CT 8M J&.;3.Ft ~J 5$ R O > d@ J+ _@ mq >3.,3.t&.b, 8, U' I- $e '3.Q_.Lg Rk 7e )3.!3.~3.{3.]3.l@ > (. ^; ^3.G/ C{./3.(3._3.W<.:3.<3.p7 .V $N [3.3T ,M }3.|3.13.23.33.43.>^ 53.63.73.Ui P;.]l a&.40 {K @1.83.93.K= >< 'g P= H@ du 03.YJ Un 74 h] iP ]v c] h%.a3.b3.4! )- *N F-.H=.m[.J8 Y).6U

    h Mf 77 g# o7 BB _d ~n J8 '0 Mf fe fe fe fe fe ,h oe }d Rl @h Ga #R A: P@.tr p3.v, 7* !P O _= ' > > > > > > > > [ 2+ ^ ' ' ^ ^ > > > > > > > , G T E [ > > > > > > > > > > > > > > > > > ' O ]! X, | D. , > > ( 9 4 +^ q3. + T+ 5@ r3.N-.y $+ ", "$+ $+ $+ Q& s3.Y{ 3~ }v |v nf > > > > > > > > > > > > > > > > > > > > > > > ^ > > > > > > > > > > ^ ^ n& t3.u3.NC 1 .ee t}.la :%.Of Of Of Of ha NM :%.g` S5 S5 F- J8 F- ka >0 _d ka Nf >0 _d Nf I8 I8 J8 (E -0 {/ ~|.9).Z5 Ds Wi v3.w3.x3..k y3.ie -h )n '0 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of ha 1P z3.A3.e&.B3.#C !%.E; *v f+.4o ka J8 J8 J8 J8 J8 fj ~n -Y J8 J8 J8 J8 ja ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >c >c F- I8 LM Ie cf C3. #.I( D3.je 77 J8 J8 J8 J8 J8 F- F- Nf Of Nf J8 ~n {n NM Of |(.,r Ib EJ C*.E3.F3.G3.'C R ;. > > 8+ Y' 6,.H3.I3.L1.(+.Da qu |' wu J3.'N T} 9> K3.`C =;.L3.M3.vR ~P > k+ N3.O3.P3.Q3.R3.SC S3.T3.+m U3.kQ V3.W3.1t %/.X3.Y3.Z3.`3. 4..4.+4.@4.#5 #4.$4.%4.vq 5o (m 40 1#.&4.)` LE F!.S' |[ rv ,6 *4.=4.-4.TG Hi ;4.>4.,4.'4.8c 2G eH }k )4.D% n;.!4.!` ]l L^.8;.83.7U #y *! RE )` .1.@1.m[.sv &N sH 6# !{ ~4.{4.]4.^4./4.(4.m_ Ii o0 FD _4.:4.<4.`D [4.}4.|4.!,.Sl J8 J8 F- ej ej ]O ~n '0 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of ha o'.}$ +G V+.4&.U~ sr 14.24.34.3L 0 (- ' > ; > > > > > > > > ^ ' ' , ^ > ; ; > > > , , G E 2 h. > > > > > > > > > > > > > > > > > , H -. I 2+ > > > > ; 44.A>.J).}~ (% T+ 5@ r3.N-.$+ $+ ", "$+ $+ $+ y v* 2~ 3~ }v E^ h> > > > > > > > > > > > > > > > > > > > > > , , ^ > > > > > > > > > > > ^ ; aG 54.2w 64.O/._O Ww wL Of Of Of Nf ia yS ]O >0 >0 ]O '0 Nf Vl Vl ja ~n J8 J8 '0 ~n J8 J8 I8 77 je m[.C<.Fh c%.74.84.[G 94.04.%A a4.D; tD =h KE ha J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf ha >A b| {'.b4.c4.d4.e4.^G k6 4o wL J8 J8 J8 J8 J8 '0 ~n ~n '0 J8 J8 J8 J8 s_.s_.ja J8 J8 J8 J8 J8 J8 J8 J8 J8 Ul F- J8 J8 Lf v K- f4.g4.h4.i4.77 ha J8 J8 J8 J8 F- Vl Vl #r Nf Nf J8 !n '0 NM Of Nf >h ke H1 o` j4.k4.l4.m4.O h= > > %# &# I# n4.R>.o4.p4.q4.r4.s4.6<.yi t4._= 5-.u4.v4.(P ^& a; H+ #].O f< w4.x4.y4.Pc z4.A4.B4.C4.#V D4.g!.`T E4.&S F4.1s G4.H4.I4.J4.K4.$6 L4.M4.>*.N4.O4.3M g@.;3 !q d@.K%.{K *N ($.]l i! @X }' VM |6 #e 66 Y2.XQ ^..vO U{.}6 >5 Yl P4.q` T' ]K !` LE ut ,$ (#.+1.&4.{K (E ^}._[.J'.$_.G- 6x M^.|V Y> )'.K= tv Q4.R4.S4.#F T4.TQ ;3 @2 U4.V4.W4.lW Td yS X4.Y4.MM J8 J8 J8 F- F- Nf '0 '0 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Of I8 ia >h je )n Z4.a6 `4. 5..5.PU !N (- ' K 5 ; > > > > > > > ^ , , ^ ^ > 9 9 ; > > > , ^ [ h. ) > > > > > > > > > > > > > > > > > , H 2@ [ 3+ > > > > ) 1+ #{ +5.Oq u+ T+ v# @5.9>.Gg $+ ", "$+ $+ $+ y P. ^2 3~ D^ [8 ;& > > > > > > > > > > > > > > > > > > > > > ' ' , > > > > > > > > > > > > O #5.$5.%5.7_.&5.I8 5X ps 7o Of Nf J8 Mb Mb :d J8 -Y _d -Y $J m/ >c Ul J8 J8 J8 J8 J8 J8 J8 J8 J8 Of 1K Gp cv $+.*5.aa ~(.=5.Kc -5.;5.E) >5.&@.2 .4o I8 I8 '0 J8 J8 J8 J8 J8 J8 J8 J8 ha Lf sF ,5.'5.)5.Z(.P1.'8 Mf -h J8 J8 J8 J8 J8 _d -Y '0 J8 J8 J8 J8 ka Y4.Mb S5 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 #r 4&.%N '| !5.,Y Nf J8 J8 J8 J8 J8 F- Vl >c F- J8 J8 J8 J8 J8 Nf Of J8 Mf 77 (E _^.~5.{5.]5.^5.7+ 1% > > e@ ax ) /5.(5._5.:5.B4.<5.7@.R<.+O b> b> _> [) [5.}5.j&.7R {@ ]; _= |5.15.25.35.bE 45.55.k@ 65.qE 75.85.95.05.a5.b5.c5.d(.t3.;Z d5.e5.f5.g5.h5.L;.i5.j5.k5._}.|V U4 l5.O&.)- v,._<.L^.L{ m5.GB y6 n5. =.Am o5.p5.--.+<.E~ q5.(E r5.l[.s5.h6 ]l cv r3 I1 ]K $_.t5.e@.[d 1G M1.x,.k* 7r ]u u5.u5.{| b| v5.f! U0 >4 w5.x5.y5.z5.hA A5.[] )F B5.Z=.[$.Ku fe (*.Mb :d J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Of Of Of Of -Y _d {n 1G b# C5.D5.8..aW Y- S S C. / 9 > > > > > > > > > > > > > / / ( > > > > > > > > > ; ; > > > > > > > > > > > > > > > > > > > > > > > ) E ~ c<.o& E5.t* v+ b+ u* d+ y ", "$+ $+ $+ y P. ^2 4b Hg 0P B@.> > > > _ , ' , > > > > > > > > > > > > > ' ' , > > > > > > > > > > > > > ]; F5.G5.H5.V4 I8 dj Vl F- J8 J8 J8 ja ja J8 J8 J8 ka J8 J8 Vl F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of )n je F- '{ zj )G Am VE I5.<< ;/.P8 J5.K5.3h [:.>_ $u ~Y me _~.ne fj Of Nf Nf J8 J8 77 #u Mh L5.XZ fA M5.Y4 >0 2-.-Y J8 J8 J8 J8 ka J8 J8 J8 ~n -Y _~.Of Sl Sl >0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 #r F- 8H N5.y3.J8 J8 J8 J8 J8 J8 ka ]O ]O J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 cv %! O5.P5.mX 8> _= 1%.> > d@ d@ R*.Q5.IA R5.S5.HU rd x|.j& Tq s: _= > l= a[ !Q bo b; T5.8= {# U5.V|.V5.W5.sI -U X5.Y5.Z5.`5. 6..6.+6.0(.OY @6.t` #6._h _h {^.f0 $6.%6.&6.Cf Nr s4.2< Nf ha 4X *! 5U RE _<.*6.8M nw =6.1 ./&.-6.h] cg ;6.>6.,6.'6.Z4 )6.r3 }k =^.~).cv (#.Y).h6 3! H=.)` E#.iI !6.}Z (#./}.)- D1 v3 rF u5.RY -2 ~6.{6.;'.P! MF ]6.^6./6.H:.(6._6.:6.<6.Bz rt cQ ha ia ja J8 J8 J8 F- 67 67 I8 fj fj J8 J8 ka >0 -Y ka J8 J8 J8 J8 Nf Nf Of _d _d ~n F- k! UT [6.U| }6.[) _> 7+ W. 0 ^ > > > > > > > > > > > > > ; ; > > > > > > , , , ; / / ( > > > > > > ; 9 / ; > > > > > > > > > > > > > ) [ |6.o& ^j t* a+ b+ V+ d+ y ", "$+ $+ $+ y P. G3 16.26.j@ c@ > > ; C. C. O H H > > > > > > > > > > D# ) ) ^ , , > > > > > > > > > > > > _ S 36.46.^s {K '0 I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka '0 J8 J8 J8 J8 J8 J8 J8 J8 F- F- Nf Nf J8 ka I8 fe -h J8 $l U= VE `/ 56.66.76.86.O_ 96.T7 aL )n la H8 Fk os Nf J8 J8 J8 ha os m[.eH *D ow }c 6# '0 {n _d ka J8 J8 J8 J8 J8 J8 J8 ~n -Y NM Of -Y :%.'0 Ul J8 J8 F- ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka Nf Nf J8 J8 J8 J8 J8 J8 J8 '0 >0 _d fj ka F- F- J8 J8 J8 J8 J8 Nf Nf 6A ]l Ri 06.a6.R<.e@ QF > > O O J+ 6=.vX b6.c6.d6.e6.0+ v/ F. ^ R K,.f6.we Op g6.h6.am !;.e$ i6.j6.c5.k6.l6.m6.n6.o6.p6.z{ q6.W*.r6..t s6.>a Wo W2 )+.> 8+ t6.u6.v6.w6.x6.y6.z6.A: ha >h ns ut #y RE _<.A6.1I O4 B6.C6.~%.^y }c :f D6.E6.[(.F6.''.H_ [6 a3 |I ]K $_.K%.H*.1V #y F-.E$.1V r3 G6.j].H6.LE e! sF fN G7 `K Kv -6 MX ,< I6.J6.K6.L6.M6. 3 /( N6.O6.zV P6.1' `< wS I8 ja J8 J8 J8 J8 F- 67 >c :%.-Y '0 F- J8 '0 ~n _d ja Ul 1G J8 J8 J8 #r $J :%.~n !n I8 (O $2 t( w'.iu Q6.'C e@ F. ' , > > > ^ > _ > > > > > > > > > > > > > > ^ ' ' , ; / / ; > > > > > > ; 9 / ; > > > > > > > > > > > > > > ^ l@ P& u+ t* ,o M-.V+ d+ y ", "$+ $+ $+ y P. G3 16.R6.D3 S6.> > Q 'J /X C^ T 2@ > > > > > > > > > > ) {. 2 R , , > > > > > > > > > > ^ ^ , ' T6.oo q3 yL Nf '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ~n ~n '0 Nf J8 J8 J8 J8 J8 F- Vl 67 F- J8 J8 ka >h ~d U6.Gp '0 ;0 O4 X) ms V6.W6.X6.Y6.Z6.`6.tq .| WI C: Gk 77 Nf J8 J8 J8 Nf ha Of yL 7..7.+7.'D J8 '0 fj J8 J8 J8 J8 J8 J8 J8 J8 fj '0 '0 Nf _~.NM S5 >c F- ja Ek Lb ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka I8 #r Nf J8 J8 J8 J8 J8 J8 J8 '0 ~n ~n >0 S5 ej #r Nf Nf J8 Nf Of Of NM Jb @7.uE 6z %( e@ QF > > > O K+ `( #7.lT 7F Z#.u! %# {# S ; AI $7.%7.&7.Gn *7.=7.<5.~@ }+ G$ zY -7.;7.=!.>7.,7.o6.Z5.'7.)7.!7.~7.{7.]7.^7.~[ 8+ 3+.1 N+ /7.(7._7.:7.Z&.<7.~_ L; N1.I8 J8 DU tV !t Z[ h).DT [7.:}.}7.|7.6^.N@ I1 7: 17.X2.27.5!.y; [6 37.XY t5.t5.47.1V 2V {K |I g6 _%.,$ 57.I..67.*N bD 77.ut '5 87.N2 LM ;A 97.;/.+3.07.t( Nh Ch a7.b7.f^ c7.-d d7.F7 Hb I8 J8 J8 J8 J8 J8 J8 F- Vl -Y _d ja >c F- [d fj >0 67 67 Ul J8 J8 F- ]n $r I8 ka !n I8 i].e7.~%.MV f7.g7.h7.{# G. ' , > > ^ ^ , , , > > > > > > > > > > > > > ^ ' ' , > ( ; ; > > > > > > > ; ( > > > > > > > > > > > > > > > ^ ~# 4; u+ t* kf i7.mf d+ Gg ", "$+ $+ $+ y P. G3 d< j7.f< h;.> > Q f. tR k7.! h. > > > > > > > > > > 2+ J 7~ *, 9= , > > > > > > > > > > > , ' ' B* l7.3&.y$.Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y _d -Y Of F- F- J8 J8 J8 F- Vl >c F- J8 J8 J8 J8 J8 J8 ka {n m7.V-.77 l] el =u n7.YZ F4.o7.p7.q7.m5.r7.Z'.:d I8 I8 J8 J8 J8 J8 J8 #u {n s7.1-.t7.J8 F- J8 I8 I8 I8 I8 I8 I8 I8 I8 ja ja ja Nf Of $J @r f# I8 ia (*.Dk :C I8 I8 I8 I8 I8 I8 '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y g` Ws -6 ]n Of Nf J8 Of Of Of /d u7.v7.VU w7.x7.^- F, > > > > > h7 X2 Wo y7.z7.A7.* > > ) E %@ B7.C7.D7.E7.X<.mV .kB F7.G7.H7.s~.I7.J7.K7.H$ L7.Ft M7.N7.Tu O7.P7.B] d@ x% 1 ]- Q7.R7.S7.T7.1> U7.F[ |p a0 sH ka Nf dQ X|.FQ B1 V7.yp W7.X7.Y7.Z7.ut rv /| n` `7. 8.*b .8.[6 XY +8.+8.J%.h6 r3 rv sv #y #y ,$ me @8.H=.L{ =$ K'.,$ HI Y4 ]l DE Mf m;.#8.lD $8.%8.&8.K> +b 8-.*8.=8.-8.;8.>8.rq 5o I8 J8 J8 J8 J8 J8 J8 J8 J8 -Y >0 9L -6 Vl J8 J8 F- >c >c Vl J8 J8 F- @r ps Vl J8 J8 '0 m7.,8.'8.MC )8.!8.f) {; {# *, G > > > ^ ' ' ' , > > > > > > > > > > > ; R ' ' , > > > > > > > > > > > > > > > > > > > > > > > > > > > > G b> c> d> t* ~8.pT mf d+ y ", "$+ $+ $+ y O. ^2 3~ .D I6 o| > > o +] +] | 2+ 3+ > > > > > , , ^ ; 9 @$ {8..] HL p D. > > > > > > > > > > > ^ ' ' ]8.^8.3&.4&.$r #r J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka J8 F- >c >c Ul J8 J8 ka ]O ]O ka J8 J8 J8 J8 J8 J8 J8 '0 ,0 fe >h cv I1 Cz 8r /8.G~ 1W Pc U: (8._8.Dh Ul T2.i].'0 J8 J8 J8 J8 F- '0 -Y t7.fj '0 #u fe ;h ;h 84 84 DE DE la la :8.Gk K~.je je N2 }d la <8.)r [8.}8.}8.|8.E'.~d Zy ~d Z*.~Y NM 6A J8 J8 I8 I8 I8 I8 Of Nf Nf J8 J8 J8 J8 J8 ka ka F- Vl F- J8 J8 J8 J8 Nf Of >x 18.28.38.$o i;.aR F, > > > > ; lk '7.48.Gl 58.h) IT > > 3+ 2+ .^ 68.78.88.!j 98.08.>a M: a8.8I b8.c8.d8.e8.f8.)# g8.h8.i8.j8.k8.t1 l8.m8.*@ ;. _= > ( bd n8.o8.y2.>6.D6.83 vH _}.Hb [d p8.q8.yL sv J8 Kb r8.e7.s8.t8.u8.ia f! @X Fe !0 6^.ys {%.a3 d_.m@.v8.([.]K /s w8.FQ .#.H=.x8.NM +1.+8.K%.ts q8.J%.;2.ZK y8.!,.(s hC z8.A8.B8.v{.C8.D8.E8.F8.G8.H8.I8.J8.qY ;$ ss I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- F- Nf Of Of Of Mf ]O '0 J8 J8 J8 #r 7o F- J8 J8 J8 >h }T 86 K8.f*.6n L8.<_ ,} g@ cx > > > > ^ ' ' , > , , , > > > > > > ) -. 2 | , , > > > > > > > > > > > > > > > > > > > > > > > > > > > > G b> c> d> t* 9R 'o u* d+ Gg ", "$+ $+ $+ y v* 6- 3~ }v |v M8.> > >. ,. p D. > > > > > >. D. 9= ' , > 0 (# /X N8.O8.7$ Y. > > > > > > > > > > H m..&(.D. v@ P8.Q8.Z].@r #r J8 J8 J8 '0 !n J8 J8 J8 J8 J8 J8 F- F- J8 J8 J8 F- >c >c ja !n J8 '0 >0 _d ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 fe ;h ]l zj kC +~.JY R8.S8.R2.-= Od G' cv fe fe 7i ]O ja 1G I8 ,d la DE >h [d ]K L+.H1 qv a1 r3 #y Ku e7.T8.U8.gH V8.~).L+.cQ HI W8.X8..y _!.Y8.*|.{%.CF k6 a3 *! G1 )n ;h Lf F- F- sv ]l ]l &N $J #r J8 ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf os Z8.>( `8.D/ 9.E# f@ > > > > ; <. .9.+9.Y! wR 6+ ^; > > > > 7+ @9.#9.b7.y2.$9.Tf %9.&9.l_.o5 >=.53.*9.`X =9.o2.g8.-9.;9.>9.,9.'9.)9.o+ k@ O G ; f, i7 CK IO @~ >6.!9.Y4 87.6x 4o ne p8.@1.F#.NM sv +G ~9.U> {9.]9.^9.5= /9.S' 67 I8 q3 N@ lm e+.vL v8.3I ^ , > > O R H > , ' ^ > > > > > > ) -. E R , ^ > > > ^ > ; ; > > _ > > > > > > > > > > > > > > > > > > G b> c> d> T+ U+ 99.mf 09.y ", "$+ $+ $+ Q& v. Y{ 3~ }v |v 1v > > _ D. 8 _ > > > > >. M& M _~ ] ' , '. _ &Z a9.(- s: F. ^ > > > > > > > > > B{ b9.c9.&(.5$ O].d9.Nu #r '0 J8 J8 '0 >0 ~n ka J8 J8 J8 J8 F- Vl >c F- J8 J8 J8 Ul ja >0 ~n Nf Nf '0 ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 ;h K..la wS .A e9.f9..&.g9.h9.f5 m_ i9.,O c! dj ^n j9.k9.!O #u ;c wr yr DT '8 l9.m9.Qn .B n9.NL _9 bO >~.o9.p9.#~.q9.r9.s9.'n h] t9.P1.MC u9.v9.w9.x9.y9.O;.Xs $e [C ~).la e^.A- 6# Y4 3< Y4 4i @r ]n J8 ~n ~n '0 Nf Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 Nf os $u Ob z9.A9.3*.Q{.J+ O > > > 0 ># B9.ZJ Y! Ok 8+ g, > > ^ o o I1.C9.D9.E9.F9.G9.H9.I9.J9.8) K9.L9.jz M9.=9.d/ I1.a- e) N9.O9.P9.Q9.R9.* G G ; :h S9.T9.U9.r1 r:.V9.($.i[ !O ka Nf $_.$_.ne ka a&.gF 3g nw K$.V}.W9.Z8 Aj |[ fe je +C X9.61 ;3 sH } .3I N@ r3 $k ($.LE x8.d3.G- tV Y9.A:./%.Z9.x8.]d 4$.]l `9. 0..0.+0.w$.fu }t Ek Cs >5.N%.@0.%[ #0.uc '0 sH M1.k* J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- Vl Vl Mf :%.NM Nf fj '0 '0 Nf J8 ka ~n -Y '0 Ul 67 ej $J Pf #r Pd $0.ye %0.&0.*0.=0.Vo O S ' , > -. 1+ [ > , ^ ^ > > > > > > R F F ^ ^ ^ > > ^ ^ ^ 9 9 ; , , , ^ > > > > > > > > > > > > > > > > G b> c> d> 4@ 5@ r3.N-.y $+ ", "$+ $+ %+ Q. 1~ i= 3~ Z{ /~ ;& > > > > > > > > > > , _~ e. _~ ^ ^ ' e. q -0.K+ 9 4 n+ _ O O O O O O O O 0 a z/.;0.>0.)+ ,0.}@ N^.'0 >0 J8 J8 !n ~n _d ka J8 J8 J8 J8 F- ej -6 F- J8 J8 J8 J8 ka >0 {n NM Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ha Ww fh =$ /^ '0.a1.O0 E7.(v lC B .3! ($.{l )0.g` 8H 'G *2 l~.W< el S2.!0.~0.{0.]0.&d -x p2 h:.F..^0./0.(0.P: _0.:0.<0.N< [0.=I }0.|0.10.20.SK Q- x3 A,.30.40.Lu >c a! O4 1B */ ,s 71 m/ hH J8 -Y _d :%.$J Of Of Nf J8 J8 J8 J8 J8 J8 J8 Nf qs -%.n] 50.60.70..{ t4.O > > > ^ m& Up 80.90.00.G ^- > > G S ' ^; IA a0.b0.c0.90.d0.e0.[Y r$.f0.g0.*9.h0.b^ i0.j0.k0.l0.hL m0.*9.n0.o0.H. G G > Lq p0.1b q0.vw u<.r_ 8H r0.2P !O sH 6A [d J8 7r .w X8 Y'.mr s0./..t0.0q F- Mf >x &N s,.oR ee vc 4X 4o wS h6 Ud 5U XY +1.X1.TB 4x G7 .k 9E y- lm 6# cv cQ zj Hh ak o5 u0.v0.[#.n;.fe w0.,F eY Ra NI D/ v; >r =h I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- 67 >c ]O _d ~n J8 J8 J8 Nf Of J8 ka >0 {n ka Ul >c -6 #r {d Z*.[6 x0.y0.D2 YW z0.Uj B3 ^- _= o ^ ) X. 2 [ > > > > > > > > > > > , ' > > > > > _ , o 9 / Q ' S S ^ > > > > > > > > > > > > > > > > G b> A0.Y, 4@ Iw r3.B0.$+ $+ ", "#. #. 6. 7. %& C0.d< D0.35 J3 > > > > > > > > > > Q E0.F0.C^ +6 2@ o ^- ~6 uR Tq c0 q4.65.G0.H0.b= `! l& 3b 3b 3b 3b I$ I0.J0. @ K0.Ht L0.jK W> yp gj 4o J8 J8 ka ka J8 J8 J8 J8 ~n :%.#r ]n J8 J8 J8 J8 ~n {n ]O S5 F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Lf /O |[ G[ M0.1 .N0.O0.P0.Q0.hS R0.ze I- dZ S0.T0.0g qR U0.V0.W0.X0.Y0.Z0.`0. a.!: .a.+a.@a.c..WC #a.$a.%a.dq $i A8.S8.i0 &a.*a.=a.-a.hE ;a.w5.q[ >a.,a.'a.|F 2, >q )a.!a.iP SH Hi Ap +G J8 J8 I8 Ek Aj ja J8 J8 J8 J8 J8 Nf Of J8 F- ]n o] ~a.U~ {a.]a.p$.^a.B+.O > n& : ^ m@ /a.(a._a.:a.j+ f@ > n& FM %(. Iv yV yV Nf mW ia.ja.ka.r9.la.ma.na.2$.oa.pa.OM 'H 92.[ .#R tV B1 F% /9.|, w~ qa._U ra.sa.ta.ua.v0 7r va.T2.wa.xa.ya.b+.za.HB Aa./3 8Q #r Nf J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 F- F- J8 ka J8 J8 J8 J8 J8 J8 J8 F- S5 S5 J8 J8 F- F- J8 ke -h ut #$.Ba.5z Ca.Da.5@.Ea.m@ Fa.E [ > [ ) > > > > > > > > > > > > > > > > > > > > > > ; ; , S 1@ E [ > > > > > > > > > > > > > > > > G b> c> d> 4@ v# }5 mf /+ $+ ", "#. #. #. Q. v. ;} d< j7.Ga.h;.> > > > > > > ; ; _ Q bx Ha.!@.Ia.1` s@ qE hi Ja.Ka.La.Ma.Na.wI Oa.Lg s!.o# ;>.ex IU IU )!.e .S*.jV S<.Pa.Qa.Ra.(s Sa.o'.ja J8 J8 J8 J8 J8 J8 J8 J8 >0 -Y pW Of J8 J8 J8 J8 ~n :%.#u >c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf J8 [d J8 '0 I8 ;h ]l 7H Ta.Ua.Ad Va.Wa.Xa. #.UE Ya.Za.`a. b..b.+b.@b.#b.$b.gL sE %b.;7 &b.*b.z< t1 !(.!(.=b.oh -b.;b.>b.)(.!*..a.,b.h{ 'b.)b.!b.t1 Ei `1 ~b.,a {b._U tC mz ]b.^b.(,.dg P] 9L T5 J8 J8 ja Ek Mb ja J8 J8 J8 J8 Nf Nf Of Nf #r ]n rs Fp *v /b.(b.gZ Cg F. I$ )# 1% 5- x% b= !;.0/.Gw Ok 7+ x% 1% m@ _b.:b.| {j ZH [b.QF }b.1% Z5.|b.1b.w*.)/.Rw 2b.3b.4b.5b.6b.7b.8b.9b.0b.45 I$ H. H. 7+ #@ 5* 8p ab.bb.cb.:' db.eb.k|./$.*! H=.W1.A6.g@.fb.gb.hb.%R bH ib.h/.t2 '#.e+.#u -h 1!.jb.kb.lb.mb.nb.L> z{.ob.pb.U4 /$._<. 1.ec qb.O,.H; +p rb.T..m( sb.tb.ub.vb.wb.Gb 51 Nj Mh 96 xb.yb.zb.Ab.^>.Bb.Cb.().Ul Nf J8 J8 J8 J8 J8 J8 J8 Nf Nf Of J8 J8 J8 J8 J8 Nf J8 J8 J8 J8 J8 J8 J8 F- Vl >c F- J8 J8 J8 J8 ]O 77 rv Db.Eb.Fb.w-.Gb.j> dB +^ i@ E [ _ > > > > > > > > > > > > > > > > > > > > > > > > > ^ , S E 2 [ 1 > > > > ; ; > > > > > > > > > G b> c> d> t* Hb.'o u* d+ y ", " O O %+ 0@ v* 25 d< Ib.1` >+ > > > > > > ; 5 9 , 0 A>.Jb.DS 3Y q$.AY Kb.{*.<| Lb.$0 Mb.`_.Nb.Ob.Pb.Qb.pk Rb.W_. &.Sb.Tb.Ub.Vb.Wb.'..E_.pf Xb.Yb.Zb.`b.(*.ja J8 J8 J8 J8 J8 J8 J8 Nf '0 -Y -Y J8 J8 J8 J8 fj '0 I8 ]n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf fj fj fj ha 4$.,r $_.Ku M> c.5: .c.[<.+c.@c.#c.$c.3G ! %c.&c.<].*c.=c.k .d4.$8.-c.t[ ;c.Y#.>c.Q* J!.w{ }(.,c.'c.$8.)c.!c.~c.Z6.{c.]c.!r ^c.&;..2.Jk /c.,~ (c._c.w~ Iv :c. }c.6+.' b> @n @n x% FV I,.|c.1c.)9 Wf 2c.t: _ FV Z. 3c.4c.5c.8P '3.oN 6c.7c.Q-.8c.)# 9c.Cg Eq 0c.+( ac.bc.cc.dc.Oa.ec.fc.gc.hc.ic.Y5.I$ n@ m. 7+ +] jc.eK kc.lc.Qb *2.mc.Hp 7i 4i &- nc.oc.z$.4o pc.qc.n[.E2.]Z :: XZ *0 rc.sc.B0 ~d $h 3 .'8.tc.uc.vc.9] wc.xc.6c q; d/.F' yc.zc.Ac.U{.Bc.5^ Cc.u1 Dc.~A Q_ Ec.Fc.Gc.r3 Hc.)l Ic.y7 Jc.Kc.Lc.Mc.Nc.Oc.|$ A- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf J8 J8 J8 J8 I8 #r Nf J8 J8 J8 J8 J8 J8 J8 F- 67 J8 J8 J8 J8 J8 J8 F- sv g9 Pc.Qc.Rc.cq J[.Sc.b> ve | G , > > > > > > > > > > > > > > > > > > > > > > > > > > , ^ [ [ R 1 > > > > 9 9 ; > > > > > > > > G b> c> d> t* Tc.Uc.Fg d+ Gg ", "$+ $+ $+ Vc.Wc.^2 4b 4~ q{.X&.> > > > > > ; 9 4 o G T ~ }+ sd Xc.Yc.Zc.`c. d..d.+d.$` Pm }K Q2.Xq @d.#d.$d.df df j .%d.&d.*d.C8 =d.-d.ca ;d.@'.>d.S4 3$.:C J8 J8 J8 J8 J8 J8 J8 J8 J8 >0 {n ka J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 F- F- J8 J8 J8 J8 J8 J8 J8 J8 Nf Of :%.{n :%.Of Of Of os je M{.O} $q 6! H; /*.,d.'d.)d.,t !d.~d.{d.Z~ Dc.2c M8 ]d.^d.h r3 /f p, C/.K3 -(.Q{.6+.4d.5d.6d.7d.8d.9d.$X 0d.ad.bd.cd.tM dd.i> ed.fd.gd.hd.id.jd.kd.(. S<.ld.md.nd.od.pd.qd.rd.h< w7 sd.td.ud.vd.wd.xd.F:.t7 yd.t7 d .zd.Ad.Bd.Cd.Dd.Ed.Fd.`7 +y Y4 F7 ;$ ;$ *v e+.{K Gd.Z9.uN 3/ UI Hd.Id.M/.4V !Z y;.ns k* 7r K; nJ Jd.Kd.Ld.V*.wB P- Md.Nd.Od.}' uc #C -H Pd.:& Qd.Rd.Sd.Td.2H R..tD Ud.#r Sj }B Vd.Wd.~b.k{ Xd.Yd.Zd.!5.`d.'0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 k* k* 4o '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 DE =W /y 4C j1 et 2O m& s: ' ' ' > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > R > > > ; - / ( > > > > > > > > G +^ j'.d> T+ e.pT mf d+ y ", "$+ $+ y .e.+e.@e.4b +a {! 5b > > > > > > > ^ o ' ' G k+ E$ #e.$e.%e.&e.*e.(g =e.-e.;e.5s F4.>e.,e.'e.)e.sE !e.~e.Cv {e.B} ]e.^e./e.s<.5E GE K5.64.*@.#h fe J8 J8 J8 J8 J8 J8 J8 J8 F- Vl S5 F- J8 J8 J8 Nf Nf Nf J8 >c 9L ]O -Y ka J8 Nf $J ej fz MM -Y ka J8 J8 J8 Nf $J ]n 9L x f+.Wd 6e.7e.8e.9{ Vd.9e.0e.ae.UH be.ce.N9.H[.de.ee.fe.ge.he.ie.je.f5.ke.le.^` me.ne.oe.pe.qe.re.se.te.ue.ve.we.xe.6y ye.ze.U/ Ae.Be. /.Ce.R5.De.Fu Ee.Fe.Ge.He.&9.Ie.Je.2X Ke.Gh ev Le.$b @/ Me.Ne.Q} dO M0.i^.Oe.}t Pe.Qe.}> Re.Se.Te.DZ :' Ue.Ve.|N We.Xe.Xa ^..Ye.[L Ze.YQ `e. f.YD 2Q .f.+f.1<.@f.#f.$f.R7 >( 8m -h B<.K..DT }$.%f.&f.*f.=f.-f.;f.z' >f.79 ,f.I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 9L S5 k* ;A }[ 7Q -h ha J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of le ke _9.'f.p- *) )f.%# 7+ ^ , ' ' ^ > > > > > > > > > > > > > > > > > > > > > > > > > > > ) -. 2 | , , > 5 ; > > , , , > > > > ^ l@ Oq u+ T+ !f.~f.7@ d+ y ", "$+ $+ y {f.]f.^f.3~ EM {! 5b > > > > > > ^ ^ ' ' ' ' S /f.(f._f.:f.c F- Nf J8 J8 Nf Of Nf J8 >c 9L ]O _d ka J8 Nf $J ej fz MM _d ka J8 J8 J8 Nf #r Vl fz v& Lb I8 Of Of Of Of 4P le ke Ud.M{.Y@.hH ,( GD 9Z 6: '8 )0 V+.0f.Aj 2= T5 Mf Mf Mf Mf ha ha Mf 77 ia @*.r0.af./#.BB 77 os os Mf ha ha ha Mf Mf Mf I8 I8 I8 77 la DE 3< bf.V{.$e a! S5 Nf Nf J8 J8 J8 J8 J8 J8 fj ~n :%.Vl >c F- J8 !n ka F- #r >x &N cf.df.tg K7 ef.ff.gf.hf.if.jf.- .YB kf.lf.mf.nf.of.pf.qf.qf.*=.rf.sf.tf. Z uf.vf.7Z wf.xf.yf.zf.Af.i1 Bf.r:.8..Cf.Df.Ef.p3 Ff.Gf.^T $:.z/ Hf.If.Jf.Kf.e(.(7.#O Lf.Mf.Nf.Of.r2 *5.^*.Y..$'.Pf.Qf.n1 D<.Rf.A> ap Cw Sf.Tf.Uf.Vf.98 Wf.+'.nY HB Xf.Yf.Zf.`f. g.oY .g.97.+g.5| @g.v] vf.#g.&B $g.%g.&g.~S '| [9.&! *g.=g.-g.;2.]K E> ;x Ze.;g.>g.,g.'g.89 [9.'O r` ha '0 ka ja ja I8 Mf >h ^n 7i ia MM MM 9L 9L S5 ]l 1, K' H- ($.yL J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 pW _~.Ib Ud./E p/.)g.!g.~g.t@ _= v/ F. F. F. S 7+ 7+ 7+ 7+ O O > > > > > > > > > > > > > > > > > ) ) > ) -. E G ' , > > > > > , ' ^ > > > ) | |6.P& Pq T+ {g.6@ 7@ d+ m) ", "$+ $+ y ]g.^g.81.3~ EM {! 5b > > > > > > > ^ , , ^ ^ ^ ]X /g.(g._g.:g.G/ 'x q5.@Z h je -h -h -h >h 77 77 fe la Y@.Zy 3< cg.FT e9.$N S5 Nf Nf J8 J8 J8 J8 J8 '0 ~n ~n '0 F- F- F- J8 ~n >0 S5 Vl :%.Mf Lv D@ ze U{.dg.eg.fg.gg.hg.ig.rN jg.kg.lg.mg.1+.ng.og.o:.CA pg.Z!.zx 3X qg.rg.`f.;2 sg._6 :J tg.ug.-A (6 /8.$'.l).<{.E~ 6 .vg.wg.fg.kC l).xg.8(.yg.zg.j*.JB )/ Ag.s} Bg.Ed.Cg.Dg.Eg.Fg.Df.2g.jQ @<.Mn Gg. 5.k).3^.Hg.Ig.@V Jg.{E Kg.Lg.Mg.Ng.Og.Pg.Qg._6.+;.F~ @K Z6.Rg.Sg.Tg.o- [3.Ug.Vg.7t Wg.Xg.s;.Yg.Zg.`g. h..h.+h.@h.ha #h.Z~.Bb.$h.%h.&h.*h.=h.UX Nb 6A ha '0 ja Lb /=.Sl /#.Dp Fk ~9.}$ /=.Lb 9L #u I8 ]l %2 FR dO T+.;0 I8 I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 -Y -Y Cp 3=.dQ -h..%.;h.>h.,h./- k) F. F. F. F. F. F. ]# d@ 8+ O > > > > > > > > > > > > > > > > ) -. E ) > 2@ | ' ' , > > > > > , ^ ^ > > ) -. D+ c<.P& Pq T+ v# w# x# d+ |~ ", "$+ $+ 0@ 'h.z# 81.3~ EM {! 5b > > > > > > > > > > O ;. L+ (> )h.!h.{] ~h.5i {h.2D *h ]h.^h./h.(h.L_.Ww Z].-$ wg FI cg _h.#n :h.c ej 7o NM -Y _d ka J8 Nf Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fe -h Ud 4h.Z/.5h.B,.9L Nf Nf J8 J8 J8 J8 J8 _d -Y '0 J8 J8 J8 J8 J8 _d >0 9L >c '0 ,0 T5 b! `y 1B 6h.7h.{u a# H#.+#.ga 8h.9h.0h.ah.ah.bh.ch.dh.a# Qs a# a# dh.eh.fh.gh.1! ly hh.QM =< *2 E' /| ih.jh.K> K> &u kh.lh.mh.-#.O,.&u -#.~k Fh nh.m/.y@.4: CZ s;.%b oh.50.ph.el qh.V'.A .rL #t rh.]=.sh.th.uh.vh.wh.xh.QH yh.nz zh.Ah.Bh.Ch.y3 Dh.c..Eh.l6.Fh.KF Gh.Y#.dL 9y Hh.Ih.r5.Jh.S,.Kh.Lh.Mh.Nh.Oh.$%.Ph.Qh.Rh.Ep YM Sh.Th.Uh.E' jl A; Vh.AU n[.5P 0L sH sv PM Wh.Ly H6..7.p|.w0.nd >F Xh.F- '0 I8 k* Y4 06 a..M2 ^s I8 fe J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 _d _d {n NM sH vo `> Yh.Zh.rd I+ u=.Tq hf =z =z =z =z q# X' 8= _> L+ 1 > > > > > > > > > > > > > > ) E n h. > (. ' ' o ^ > > > > > > > > > > 2+ J R+ `h. i. > > > > > > > > > FM .i.+i.qE @i.$o RG #i.$q 9!.,r ,r t}.^q @g WI =h je wL [d $i..G %i.^].<6 O] oM &i.*i.=i.-i.!D tG ;i.>i.#k 84 la ns ns J8 J8 J8 J8 J8 J8 J8 J8 F- Vl 67 ]O ~n fj J8 J8 J8 Nf $J ej >c Ul J8 J8 J8 Nf Of J8 F- 67 67 ]O ~n fj J8 J8 [d ~n /#.#h 'd id 0f .A NL _t Hh ,i.'i.)i.!i.~i.k6.u<.]!.SX &..K'.{n NM Nf '0 :%.]O 77 os me os os ha ja J8 J8 J8 J8 J8 '0 '0 '0 J8 J8 Nf I8 J8 J8 J8 '0 J8 fe fe iI {i.]i.^i./i.fz J8 J8 J8 J8 J8 J8 J8 ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 1G Nf NM I8 #u >x (i._i.r<.^f Mh 6o :i.jL ke V+.o] hH hH rs ^y nJ ,L 4i.=N KW 5i.6i.7i.8i.9i.0i.ai.)(.bi.ci.|c di.ei.Y~. je 4$.Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka J8 J8 #r Ax zZ zg.ki.li.mi.B/.ni.oi.pi.u+.)c Z! gy qi.ri.si.ti.=z O > > > > > > > > > > > > > > R | R > > ^ ' ' , > > > > > > > > > > a> |% 2).9+ =z !+ ~+ a+ b+ u* d+ 0@ ", "$+ $+ $+ y X+ 6- 4b ui.{! @a > > > > > > > > > > /- EV vi.t' wi.e*.xi.Pc.t}.K..NM NM NM Of Nf J8 J8 J8 '0 {n **.Q,./#.r0.k|.Mf hb.yi.zi.Ai.Bi.$i.6Q GX ! LV UX Ci.Ci.la ie 77 '0 J8 J8 !n !n J8 F- 67 >c ]O {n '0 J8 J8 Nf Nf $J ej >c F- J8 J8 J8 Nf Of Nf Ul 67 >c ]O _d fj J8 #r >h 2-.~n Td a| :b H; >O $t Di.!] Ei.Fi.Gi.Hi.Ii.Ji.]'.TM Ki.sC 0` EU BB J8 ns ]l DT DT ,$ yL m[.yL DU Nb yL $_.$_.$_.sH sH ]l ]l 1G !O =W ^O yL yL ]l ]l ns >h fe E-.Li.Mi.Ni.L= 67 Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 Mf Mf dj fe >h >x me Of ne '0 Jb Dz {/ Oi.ha.KW U> Kb 2-.(d NM NM Nf Nf Nf NM NM NM NM NM NM me me ha '0 F- Vl >c -6 ej wL me me os os ha I8 ja ja I8 I8 '0 NM me os Lf '$ j! o7 o7 o7 => Ap Ha _O os os >x (d Q,.>h )n 77 Mf @*.@*.o'.77 77 77 Mf Mf ]O 77 t}.0K ,r 4$.hH H_ ',.U,.Pi.L$.Qi.Ri.h^ ;7 ]7.Si.Ti.Df.Ui..=.Vi.EB Wi.<: (f qv Z,.fj [d DU G- 6A !O _/.Iv 3P ,$ 0L q3 |I d@..1..#.k6 2B Xi.Yi.,#.Zi.`i.Bc.~!. j.gD <#.=&.c' 7Q gF a+.RK aE }, 3-.>x NM J8 J8 J8 J8 J8 J8 J8 J8 ka ka F- Ul J8 J8 J8 I8 .j.Q4 >B eJ }%.+j.@j.#j.~g $j.$j.%j.&j.7-.*j.Uz 8> =+.=j.O > > > > > > > > > > > > > ^ , ' , > > > ^ , ^ > ) ) R > > > > > > ; 9 6+ [0 I).-} ~+ a+ b+ V+ d+ y ", "$+ $+ $+ 0@ v* -j.3~ ;j.-& ;& > > > > > > > > > > {# ~# YN AV >j.,j.'j.0Z &O 84 '0 -Y -Y pW ne J8 J8 J8 '0 ]O BB /#.Wl V7.^n Wl sV )j.!j.~j.{j.Kb .A SI u2 s;.Z7.]j.,c &% Z8 Lf '0 J8 '0 ~n ~n ka 1G Ul Vl '0 '0 '0 J8 J8 J8 Nf Nf F- F- F- J8 J8 J8 Nf Of J8 1G Ul Vl '0 fj ne J8 #r je Mf &y rH s'.^j.0' Nd /j.M2 5: (j._j.:j.E G[ Kb 77 ns wS 3P k6 Y8 Y4 H1 H1 Q= +y H1 aL @1.@1.fb.%3.87.V> Iv _/.!6.[j.TX Y)._<.6M qv cv 77 >h RE (j.:/ kc mz Hb Of NM Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 Mf Mf fe fe >h /d OM -Y fj '0 1D } .O,.z9.)/ }j.|j.;Y j9.:%.-Y -Y Nf Nf Nf '0 '0 NM NM NM NM NM NM NM '0 J8 F- F- S5 #u wL >x >x >x >x )n g# g# 8Q 77 77 BB ,0 ,x t}._*.7%.;h e^.Ax e^.7%./O ,d je ,r je ke Wl ^#.4H 4H ~d 1K Ww 1j.O' EE Ci.DE DE DE DE la Zy U6.2j.3j.Ut k* J( iP 4j.5j.6j.Dd 7j.8j.)c.9j.}j.0j.$*.aj.@c.bj.cj.W4.iM dj.r3 ns wS r3 |I cQ rv k* ,$ yL [d Of ss n;.;G ET I8 x[.ej.uo fj.5f.gj.hj.,b.W1 ij.3E XZ /w H; P] 1m -2 Ue..B jj.kj.lj.ha Nf J8 J8 J8 J8 J8 J8 J8 ~n >0 S5 >c F- J8 J8 I8 la xP Em mj.nj.oj.pj.qj.rj.sj.tj.uj.NA vj.wj.VR xj.6a.t7 O H > > > > > > > > > > > > > , ' ' , > > ^ ^ ^ ; -. -. [ , > > > > > > ( 0 ,# yj.5; ~+ v+ w+ V+ d+ y ", "$+ $+ %+ Q& 1~ i= 3~ D^ [8 ;& > > > > > > > > > > 1% l= Ok zj.o_.'T Aj.V4 me )n sv ~n _d >0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf NM }Z }P '0 4P 1K #y 9K E~ Bj.Cj.Dj.Ke gN 49 v 4o I8 Mf :%.{n ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 1G /$.$l W< ;j Ej.U,.Q> Fj.2G /| Ud J8 #h Gj.{M Hj.>h 53 !f Am ]/ b' k* J8 6A wS @y )s }c $l N1 Ud I1 I1 [6 1.83.8;.)` 3&.G7 '5 iI &D Ij.o=._3 Jj.7U 47.N1 ]K 77 ^d aL Kj.Lj.;H ut TB 5P me Of J8 J8 J8 Nf I8 I8 I8 I8 J8 ns DT cQ aw #y pz O&.i>.fj '0 F- ha ^d wS 2' Mj.O! Nj.Oj.dZ ]O BB _d ka J8 J8 J8 J8 J8 J8 J8 J8 4o &N &N J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >c >c F- J8 J8 !n ~n g` |[ >c F- Of 7o $r ]n J8 J8 J8 Nf Of J8 J8 J8 F- bh Lb ]O Of Vl 7h v& Wh.ja J8 J8 J8 J8 J8 J8 J8 :%./#.7i ]K ){ u8.,f 7_.]d.A7 A7 >i.+J Pj.I~ NG Qj.Rj.,i.Sj.Tj.Uj.L4 o/.t^.J; r3 Ud Ud [6 [E ;` &N NM '0 J8 NM NM Nf I8 db.at Vj.Wj.g9.)*.Xj..< Yj.K! %` Zj.u2 `j.cu >g 0h b! b3 *y k.D2..k.#u I8 J8 J8 J8 J8 J8 J8 Nf -Y {n Ws -6 Vl J8 J8 J8 I8 sv J; ,O :w Nr jD zh +k.de @k.m0 {u }t |l Ne.#k.wC |@.;. a > > > > > > > > > > > > > ^ ' ' o ^ > > > > R 2 E F ' ^ > > > > > > G b> A0.Y, T+ v+ b+ V+ d+ y ", "#. #. #. Q& v* -j.4b $k.0P B@.> > > > > > > > > > x% I$ 00.U- OI %k.&k.2Z &N 4&.4U J8 ]O ]O I8 Mf Mf ha I8 ha 77 77 I8 J8 Nf $J ha ka J8 Nf $J )n wL wc *k.=k.-k./U ;k.`x >k.)L ,k.mW Zy }d 8Q F- J8 Nf Of J8 J8 Nf Of 7o 7o NM _d ka J8 fj :%.S5 67 F- J8 J8 J8 J8 J8 J8 I8 )n 7i Ih.~f #C 'k.}f Hd.)k.&u eH h6 (E ]l 77 ;h Ww Ww DE Kb '0 D0 Bd v( O) 3k cQ ja Ek z- !t O1 {K j>.57.H6.]K wS J'.`].!O `*.Hb 4i ^O !k.!n [d ]l ]K !` yL ,$ ]K 6A ha os ~k.4/.{9 H .}.Nf Of Nf J8 J8 J8 Nf me V-.wE =%.la yr aq ,k Xw Gh CZ xl {k.yE cv ej ej F- ;h >h /| ]k.'< ^k./k.eH ia yp 2P [P J8 J8 J8 J8 J8 J8 J8 J8 sH M1.>` sH J8 J8 J8 ~n ~n fj J8 J8 J8 J8 J8 #r $J Of Of J8 J8 J8 ka J8 F- Nf Of Of #r Vl 67 >0 ~n fj J8 J8 J8 J8 J8 F- F- J8 J8 Nf $J #r I8 J8 J8 J8 J8 J8 J8 Nf Nf ]n S5 ja ns L+.Ud jA ;~.0V O/.0E Gr 2, }< {D l~.l~.Cz ;H *@.zc.vE #J I- .| 1! 8H H6.(k.j>.]l _k.J8 Nf J8 J8 J8 J8 J8 J8 fe 1#.:k. > > > > > > > > > > > > > > > > > > ^ ' | O o ' ' ' , > > > > G b> c> d> 4@ v+ b+ V+ d+ y ", "#. #. #. 0@ O. G3 16.26.j@ c@ > > > > > > > > > D# 1% 1% 7k.8k.9k.0k.ak.bk.4o ck.A$.wS ]l ]l cv DT DT 0` ^O DT (E (E DT yL 'D ]l ^O sv &N 0L 0L DU ]n g# }[ uc 7' 'a.dk.ek.ii fk.gk.|i.I1 1! Ap ,d >h os Of J8 J8 Nf $J _O _O Mf -Y Nf Nf ~n {n S5 >c Ul J8 J8 J8 J8 I8 77 )n sv 53 hk.ik.jk.kk.lk.7< YE 77 I8 '0 I8 I8 J8 J8 '0 Nf J8 >h je 4X )f mk./*.s;.eH T5 Ud.Lb ja '0 -Y _d nk.-Y '0 #r J8 ja PM eQ ja ka 42.;Y '0 Of Of ha Nf J8 J8 '0 Nf Of 5P |(.g@.Lv j! %G )n Nf 6A J8 :d ia Lf J8 ok.pk.qk.eH 7A *E U= ZQ oX tO Fs <] >'.z; F1 m/ F- la Gp I1 Rc.rk.sk.tk.3i.77 uk.}P ka J8 J8 J8 J8 J8 J8 J8 J8 sH +C 87.k* J8 J8 J8 ~n _d '0 J8 ka ka J8 J8 Nf Of Of Of F- F- 1G J8 J8 Nf fj pW Of #r Vl >c ]O _d fj J8 F- F- J8 J8 J8 J8 J8 J8 Nf Of Of Of J8 J8 F- F- ka '0 Nf Of Vl 67 Ul J8 '0 I8 I8 Mf Mf 77 g# W$ o7 o7 o7 Ha Kf Jf )n Mf Mf Mf Mf I8 ej 9L ]O _d _d :%.'0 ka J8 J8 J8 J8 J8 J8 J8 Nf J8 [d (#.F#.NM fe `+.3$.vk.8i j9.I8 M^.4x N1.'0 wk.Ak ;O 6! Bd T@.2' .| dQ ka ka J8 ~n _d NM Of Of Of Of Of J8 J8 J8 J8 ]n o] )_ %q Rd R xk.l! | .os ke NM '0 I8 >c K] aq 51 yk.zk.E+ i+ _ > > > > > > > ^ _ _ _ > > > > > > > > , ' ' ' ' ' O R H > > > > G ~# Ak.5; 4@ v+ b+ u* d+ y ", " O @. `@ y O. Bk.16.R6.D3 S6.> > > > > > > > > > 1% `#.&9 Ck.k&.Nj.Dk.a].J8 Ek. 1.H1 qv r3 G[ '8 ;< .k y Zn ^s J1 k6 H=.ts Fk.Gk./s 0L 92.fb.3P 6# rv a1 il Hk.=u Ik.Jk.Kk.Lk.Mk.,X Am a6 :..dj ]d >x Nf J8 J8 J8 #r 8Q Lb ]O fj Nf Nf '0 >0 F- Ul Ul J8 J8 J8 J8 I8 je 4o 83 +/ Nk.Ok.Pk.Xr X> Qk.EE DE fe Mf Mf I8 J8 J8 J8 J8 J8 Mf ke 6A D#.Rk.Sk.Tk.Uk.fe Gp ]O I8 >0 {n 2=.{n >0 '0 I8 J8 F- S5 Ek ka ka [P MM Nf Nf Of ha J8 F- F- '0 Nf Nf Of d!.$J Lf he 4H 77 Nf 6A J8 s_.j! '- qC 5k.Vk.Wk.-6.|d |t E4 >O sN Xk.|X h] E( ZE $2 hH J8 ~d 2!.I1 Yk.#~ cb Zk.(9 77 >r !O J8 J8 J8 J8 J8 J8 J8 J8 J8 sv h).DU sv J8 J8 J8 fj '0 Nf J8 ~n ~n ka J8 Nf Nf Nf Nf Vl 67 Ul J8 J8 ka ~n -Y '0 J8 F- Vl '0 fj fj J8 67 67 F- J8 J8 J8 J8 J8 Nf Nf Nf Nf J8 Ul 67 Vl ]O ~n fj Nf Ul Ul 1G J8 I8 fe fe ;h DE DE ge he he ge Ww mc.mW mW Ep 1K <8.`k.xV je hH S5 Mf OM :%.:%.:%.>0 ka J8 J8 J8 J8 J8 J8 Nf J8 Nf >x Kb l.)0 va..l.+l.@l.-r ;h t}.wL I8 '0 !n YE WI y' M/ KH #l.Td ]j.}Z ]O J8 fj '0 '0 Nf Of Of Of Nf J8 J8 J8 J8 #r 1h.$l.%l.RP Lx [b 9Z U-.]d {d >x /d wL th ly %u 93 l* &l.o* , , > > > > > > ^ ^ , ' , _ > > > > > > > , ' ' , , > ,+ 1+ [ > > > > G o@ W& 5; t* v+ b+ u* d+ y ", "$+ $+ $+ y P. G3 d< j7.f< h;.> > > > > > > > > G k@ *l.=l.-l.;l.5Q Nf fe ne pc.e@.@y Y4 Y4 I1 ^| AB s; R4 G' 9D ){ :W E$.d@.[7.pF 7B [d pc.7U @y a3 I1 N1 $@.>l.,l.$C =J OF zN c4 n+.oY V< wD S~ Z@.yL ja ja ja J8 J8 3o Mb |[ J8 Of Of Nf J8 J8 J8 J8 J8 J8 ja ja J8 ja Zn NL a] 'l.)l.!l.~l.1= /=.MM J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 NM 0L h).~%.{l.]l.^l.sv CT Of J8 !n ~n -Y J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka '0 pW [d (E Ud '8 {K J8 I8 ja (*.v& u- L1.(!.n5.Q> /l.(l.:/ G; O/.Mu %N ]B /| cl 2G Xn 77 I8 DE 77 O4 m~.c8._l.K*.Cr 7i ~d J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y _d ~n J8 J8 J8 J8 J8 67 >c Vl J8 J8 ka >0 {n ka J8 J8 J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- Vl >c ]O _d ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 F- F- J8 J8 J8 J8 Nf Of Of $J $J Of -Y _d -Y Of J8 4o &N &N J8 ka >0 _d ka J8 J8 J8 J8 J8 1G sv 6A 6A J8 Nf Of Of Of Of -Y -Y fj J8 J8 ka ka J8 J8 Lf RL mz |t :l.h] >5 x Ib 0L |(.Hb E1 0=.vg O( |N Sk hf ' G ) > > > > > > ^ S mp o ^ > > > > > > > ^ ' > > > ) 2 2 h. > > > > G s* P& u+ t* v+ w+ V+ d+ y ", "$+ $+ $+ y P. 6- 3~ .D 9P 1l.> > > > > > > > > G w+.2l.zh 3l.P:.jH CT ;h J8 $_.x8.} .]K 4l.Sa.($.cQ ~).r` (E 2V _%.aL Ek.m[.5l.]K ns J8 6A x8.,$ } .wS AU i! d! M1 L8 #1.1}.sA o- 6l.7l.8l.9l.0l.Am gc ;> al.fe ha J8 ka ja J8 J8 J8 J8 J8 J8 Nf Of Nf Nf Mb }$ ia ]K {%.b&.^v bl.cl.dl.2V ,d fe I8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 $_.!4.!4.al.el.fl.gl.Hq 73 a# @r F- J8 [d J8 >c >c Ul J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ~n hl.Bi.LE W< il.4e.[$.Mf CT ha Ep #y jl.kl.Bd LV ll.9u 6^.yE ml.cQ sv F- k* (E Ud N1 ~).I8 >h [d ^s GE nl.ol.pl.y[.ql.k|.x;.J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 F- 67 67 NM NM Nf J8 J8 J8 J8 J8 ]O Mf NM Of J8 F- #u wL $J Nf Nf J8 J8 J8 J8 J8 ]O Mf Of Of J8 ka ~n -Y ka J8 J8 J8 Nf Nf #r F- ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >c >c Ul J8 J8 !n ~n :%.]n ej >c Vl J8 J8 J8 J8 J8 sH M1.>` sH ka ka ka J8 J8 Nf Of Nf dQ rl..w n;.@1.F#.Of Of Of Nf J8 Of Nf Nf J8 J8 ja s_.Mb ja wL wL 6# Xw V< O; J1 }T ka I8 J8 J8 ja s_. > > , G B. J .] -z k. > > > > > > > > > > > > > | R ; > > > > ^ ~# j'.d> T+ 5@ 6@ 7@ d+ y ", "$+ $+ $+ y P. 6- 3~ }v wl.xl.>. > ; ; ; ) ) R > FM v@ yl.tr W].zl.5' =%.=h ka !O ja $J NM g` ;Y ka J8 J8 F- Nf Of Of Of NM NM Of $J Nf J8 Ul F- #r Of Nf F- 67 @r qs ^d /O f# #z E[ _] v( Al.Bl.cb.XQ VF ]..;< HI ]l 77 Nf J8 J8 J8 ka ka J8 I8 os le os ha Mb ~M ie .#.Jd /u Cl.&2.f}.N2 Gp '0 Nf Nf J8 J8 Of Of Nf J8 J8 J8 J8 J8 ka `].Dl.El.6].=_ Fl.Gl.Hl.l! 70 S` 8Q J8 [d J8 >c ej F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- F- J8 J8 J8 -Y Il.Jl. 7.MO Kl.Ll.>2.77 =r os CT '8 Ml.Nl.3i./$.eQ Qk.o'.I8 Nf F- ka ka J8 '0 ja ja ka ja ge c' :: Ol.t1 4> Pl.J' ]j.!,.Sl J8 J8 J8 J8 J8 ka '0 J8 J8 J8 J8 J8 J8 Nf Of Nf J8 J8 F- 67 >c #r Of Nf J8 J8 J8 J8 J8 ~n _d pW Of F- Vl @r $r $J Nf fj !n J8 J8 J8 J8 ~n -Y pW Of J8 ka >0 g` ka J8 J8 J8 Nf Of Nf J8 Ul F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >c >c F- J8 J8 ka ~n {n S5 -6 -6 >c F- J8 J8 J8 J8 sH +C 87.sH J8 J8 J8 J8 Nf Nf Of Nf dQ rl..w ts @1.F#.Of Of Nf J8 J8 Of Of Nf J8 J8 ja s_.Lb ja ha ha (E aO T> ]y U> {K NM :%.fj [d ja s_.Mb Mb Mb MM [d J8 !n ~n {n fz >c #r 5P Ql.P;.Rl.Sl.Tl.i! ej 0u _}.Ee ~| qz .| Ul.i6 .9.hf ;. 4+ I ) > > > ' H T X, ]. ^. k. > _ > > > > > > > > > > > , , , > > > R | o9 [. ]P T+ Iw 6@ 7@ d+ y ", "$+ $+ $+ y P. 6- 3~ }v |v Vl.L ; / / d. 1+ -. [ ^ e@ E# *>.Wl.Xl.Yl.Zl.)r Bs ;Y 3o Aj wL me :%.MM I8 I8 I8 #r ha ha ha ha :%.:%.NM $J J8 1G 67 ej #u '0 '0 F- F- wL ,r `l.Zy Ww ,d 7r V4 86 )h m..m.{F V(.V(.8c [#.h6 fe ha J8 J8 J8 ~n ~n '0 I8 qs le os ha ja Ud.>A I1 Qj.+m.@m.#m.t3 Gp j<.~n Nf J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 >0 $m.%m.&m.Hp g9 *m.=m.-m.;m.>m.^+.fe Nf Nf J8 F- #r #r Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 67 F- J8 J8 fj ,m.'m._/.)m.!m.=#.C<.I8 je I8 y3..k.],.~m.!s )n Ci.`+.ie >h )n I8 ka ka '0 I8 77 77 ha ja >- {m.]m.W0.^m./m.tg C 7i ]O I8 J8 J8 J8 J8 J8 ~n ~n '0 J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 F- Vl Nf Nf Nf J8 J8 J8 J8 J8 fj fj fj Nf 67 ej @r 7o Nf fj ~n ~n ka J8 J8 J8 ne fj -Y :%.J8 F- S5 Ws F- J8 J8 J8 Nf Nf Nf J8 67 67 F- J8 J8 J8 J8 J8 J8 J8 J8 J8 F- F- F- J8 J8 J8 '0 >0 Ul 67 67 67 J8 J8 J8 J8 J8 sv h).DU 4o J8 J8 J8 J8 J8 Nf Nf J8 1G B1 7Q !` $_.0L Nf Nf J8 J8 J8 Nf Of Of Nf J8 J8 I8 I8 J8 I8 I8 ]K /| aO uw :b ut OM (m._m.0_.Nf ja :d |[ MM >0 ~n J8 J8 fj :%.ej >c #r me B<.:m. > > > , H 2@ AI P ]% E. , , , ^ > > > > > > > > > , , , > > ) -. q+ |m.4; ]P T+ v# w# x# d+ y ", "$+ $+ $+ y P. 6- 3~ 1m.2m.3m.q G / - /; #{ I [ ^ f@ V@ 8> O}.4m.vc.5m.6m.7m.q}.Wh.v& I8 Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y _d ~n J8 J8 F- Vl >c F- J8 J8 J8 J8 J8 Nf Of J8 J8 J8 I8 ha ge X@.!'.0` ^y Hq ;i.I7 v].!0 ns J8 J8 J8 J8 OM {n [P (Y yL yL $_.Of Nf ~d ~d !0 8m.9m.0m.am.{| BB 2-._d ka J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 '0 nk.bm.cm.ke #g dm.em.fm.gm.hm.C: ;h Of Nf J8 Of Of Of Of F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 >c Vl J8 J8 [d fj {n X4.}$ Ha 6o J8 I8 I8 Nb jg t; 3.Y8 ,$ ha ha J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf ja im.ku jm.2>.km.lm.mm.nm.om.me NM J8 J8 J8 J8 J8 -Y _d ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 ej ]n Of J8 ka >0 {n ka J8 J8 J8 J8 J8 >0 _d ka Ul >c -6 Vl J8 J8 J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 ka Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja ja J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf J8 J8 J8 J8 J8 J8 J8 J8 #r $J Of Of J8 J8 Nf Of J8 ja I8 ns N1 :b U0 Z4 Q4 !n pm.1-.{O NM Nf J8 J8 J8 >0 {n ka J8 Nf $J ej ej ]n os 7).qm.rm.sm.I{.G' b# o7 77 0L A6.qF xc !_ <# tm.um.m..4O 9= H R ; > > > > > > > , ' ' ' > ) > > > > > > > > > > > > > 2+ J R+ `h. i.0 ]O J8 [d fj :%.S5 Vl F- J8 J8 J8 J8 J8 I8 77 ;h ;h Of _%.F' >k ,O v0 96 ih..#.J8 I8 I8 =r zp I~.Fm.Gm.Hm.V8.N2 #G m!.bg.Cz Im.Jm. '.&g /=.u}.gj ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 PM /=.Bk MM N2 7o ^t e4./u Km.Fa =O Of Nf J8 J8 J8 J8 F- >c 9L ]O -Y ka J8 J8 J8 J8 J8 Nf Of :%.]O '0 J8 J8 J8 J8 ka Ek o'.7i >h :%.7i #u H1 Lm.q_.4M 4o Of Nf J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 +G a1 Gb Mm.Nm.Om.!1 !- 3/./d >x J8 >c >c Ul J8 ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 Nf Nf Nf J8 ]O ]O '0 J8 J8 F- S5 S5 F- J8 J8 J8 J8 J8 J8 ka J8 J8 #r ]n F- J8 J8 J8 Nf Nf Nf J8 >0 ]O Vl 67 ]O ~n fj J8 J8 ja s_.Y4.BB -Y ne J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 77 77 I8 J8 PM PM :d J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf Nf Nf F- PM Ws ja J8 J8 J8 J8 6A A- hH ;h ,h Q$ Pm.O>.s(.43 S' 6].Qm.y8.V7.[P J8 J8 F- Vl S5 F- J8 J8 J8 #r Of Of $J Rm._^.Sm.Tm.Um.%-.YM _O ha Nf 6A cv aq 93 Vm.Wm.e0 >. e. p ~2 2 [ > > > > > > > > ^ ' O ,+ X. h. > > > > > > > > > > > > a> Xm.Ym.9+ Zm.,!.~+ `m.vm.u* d+ y ", "$+ $+ $+ y P. 6- 3~ n..n.+n.0 ,. L D. > , , , G @n.7<.#n.$n.~x bf.%n.&n.Wl Of &N J8 J8 J8 J8 J8 J8 '0 ~n _d ka J8 J8 J8 J8 J8 J8 J8 F- I8 >0 _d ka [d ~n {n fz >c Vl J8 F- F- J8 J8 J8 J8 NM NM Of qs H#.0h oz 7_ ^C 4M HI I8 77 ]l 5M $! Y~.*n.=n.-n.;n.>n.Un kL M5.,n.'n.f&.)n.uJ l[.c 9L ]O _d ka J8 J8 J8 ka '0 #r #r :%._d fj J8 J8 J8 J8 J8 J8 ka >0 (d !n.~n.p;.=v {n.xc.}/.84 )n J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Of J8 J8 J8 J8 #r ha (E A5.]n.kM 5a.x@.$l ^d Ib ja ej ej Ul J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of '0 ka F- F- F- F- Nf Of Nf J8 ~n {n '0 J8 J8 F- Vl >c F- J8 J8 J8 ka ka J8 J8 J8 Nf Nf Of J8 J8 J8 J8 Nf Of Nf J8 ~n >0 S5 >c Mf {n '0 J8 J8 ja s_.Mb Sl ~n fj J8 F- F- F- F- Nf Of Nf J8 [d Nf #u #u 4i DU Nf -h (*.(=.1P V7.>h >h >h 77 #u ja J8 J8 J8 '0 >x /d /d me Nf F- Mb /=.]O ha >h -h 84 la S% x' 67 Td ^V ^n.+:./n.(n._n..[.[9 e<.:n.YE -h ha F- Vl >c F- Nf [d [d ne me ~Y l. [n.B5 }n.|n.gH wL Nf J8 ja ]C ]t 49 cK /@ |@ , e. q* X!.2 [ > > > > > > > > > ' R -. 2 2+ > , > ) ) R > > > > > > > ; >& 1n.W&.!+ 4@ U+ w+ V+ d+ y ", "$+ $+ $+ y P. ^2 3~ 91.,C 2n._~ r D. >. > , , , S e$ $V 3n.4n.,u e` 5n.6n.Cp &N &N Nf J8 J8 J8 J8 J8 J8 '0 ~n J8 J8 J8 J8 J8 J8 J8 J8 ]n ]n I8 ~n J8 J8 fj >0 >c >c Ul J8 67 67 F- J8 J8 !n fj pW NM )n N2 /O 0h 6! $2 V4 {K >h je .#.7n.s8.8n.H}.9n.0n.x I8 J8 J8 J8 J8 '0 >0 ~n ka J8 Nf Nf F- Vl |[ |[ 1G ie dn.en.fn.0 #u Vl ja fj fj J8 J8 J8 J8 J8 J8 J8 '0 (d gn.hn.in.jn.kn.ln.mn.~d fe J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf J8 J8 J8 J8 J8 >h fe #y 9Z 5].{*.nn.MP {K je I8 #r #r F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf '0 >0 >0 S5 >c >c Vl Nf Nf Nf J8 fj '0 '0 J8 J8 J8 F- 67 J8 J8 J8 J8 ~n ~n '0 J8 J8 J8 Nf Nf J8 J8 J8 J8 Nf Nf Nf J8 fj ka ja Vl NM NM '0 J8 J8 J8 ja S5 >0 ~n ~n >0 Vl >c >c Vl F- Nf Nf J8 [d I8 yr b! vc .A H1 DE x;.j:.8i 8i ^n >h >h Lf 8Q 9L F- J8 J8 '0 ,0 Cp /d me Nf J8 k9.k|.Mf os ]d ~Y 1K Ww on.o7 69 pn.qn.rn.sn.tn.Rd.L2 Cn 'F un.ql.1G DE )n #r F- 67 Nf fj fj fj ne :%.{d vn.wn.xn.yn.]0 zn.An.Bn.77 I8 F- 9L >c w8.j$.W4 Cn.*@ _ N 4O [ [ ) > > > > > > > > > , H [ [ ; ^ , ^ -. -. [ > > > > > > , r Dn.En.yj.5; 4@ 5@ 6@ 7@ d+ y ", "%+ %+ $+ y P. Fn.d< Gn.Hn.In.p* , > > > > > ^ ]# E$ u+.Jn.Kn.m>.Ln.Mn.Nn.(d Nf Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 $r $r #r J8 J8 J8 J8 F- >c >c F- J8 67 >c Vl J8 J8 !n ~n _d ka J8 J8 F- 9L Aj 8Q ha J8 fe fe Ku _d.On.Pn.'< n|.Kg.zb R( Qn.^I i3 %* Rn.3W >w (! P6.Sn.Tn.~Y )n J8 J8 J8 J8 ka >0 {n ka J8 Nf Of J8 J8 J8 J8 J8 YE J~.7< Un.r0 z9.U= | .os ke J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y {n Ek >c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf OM Vn.Wn.Xn.Yn.Zn.+-.i^.DE fe ka ka F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 77 ns rz FA 2c R( `n.ZE Iv I8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 !n ~n {n S5 -6 -6 >c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 :%.{n >0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 >0 {n S5 -6 -6 >c F- Nf Nf I8 ]O 8Q b! 70 Y< Gh Kd (E o..o.e.;o.V{.g] )D .#.]l J8 J8 J8 Of NM :%.{n I8 {K /%.ok.Bs ll.=-.Bf.>o.s( z6 fe Mf F- ej 3g &$ @l ,o.ep !N ; ; > > > > > > > > _ > > > > > > > > > , ' S E 2 h. > > > > > > , _~ 'o.)o.A0.Y, T+ !o.r3.7@ d+ y ", "6. 6. #. Q. v. 2~ 4b ~o.|m.>} 0 > > > > > ( 9 %Z {o.]o.^o./o.;j &#.c ]O BB Mf ha J8 I8 I8 ]K -~.(o.>,.T> r}._o.:o.Fb ZW Zg 7Z 5 Mf Kb -Y J8 J8 J8 J8 J8 J8 Nf Of J8 J8 J8 F- Vl S5 ia >0 J8 J8 J8 J8 J8 ka ~n -Y ka Nf $J NM 6o.}9.SY 7o.8o.4'.9o.ke (d g` yS bh Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka !,.`i 0o.ao.bo.co.K~ 3o >h 5P Of Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ~n ~n fj J8 Nf Nf '0 ka F- ja ]O ]O ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 S5 S5 F- J8 ]n ]n #r J8 J8 ka ~n {n Vl 67 ja -Y J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- Vl S5 Vl #r #r '0 Of >x jL y8.;#.mA A; a4.>* do.A,.eo.}c >5 }l fo.4C t( ]/ 9K ^s Ul O2 Gj.la .#.){ 96 7A b3 4i I8 >0 [d 2V b3.Q1.* m).6E Wa.ko.lo.mo.no.oo.)s 4o 77 J8 J8 ja yS /=.mc.|B 6 .)A po.qo.=1.ro. A Fs -3 84 )n '0 I8 67 G= B).l# W{.$M d. K > > > > > > >. ,. M >. > > > > > > > , ' ' ' ;. O > > > > > > > Q so.to.uo.q3.d> T+ vo.wo.mf d+ y ", "#. #. #. Q. 1~ 2~ 4b xo.yo.V& / ; > , > > ; C. zo.Bi Ao.Bo.IM Co.}, e+.g@.Do.Of '0 !n J8 J8 J8 J8 Nf Of Nf J8 J8 J8 '0 !n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of -Y :%.'0 J8 ~n _d fj J8 #r #r J8 J8 J8 F- 67 >c >0 -Y pW Of J8 1G 1G ka >x /d )n Lf ~M J~.ie #r K; ,( Eo.Fo.m_ JY P^.h^ 3y Go.ZQ I8 ^d ha #r J8 J8 F- Vl >c F- J8 J8 J8 J8 Nf Nf Of Of os qs ,$ /y _/ NE fD 86 BB xV _d J8 J8 '0 !n J8 J8 Nf Of J8 J8 '0 ja >c fz ]O _d ka J8 J8 J8 J8 '0 ~n _d ka #r os 0L ,Y Ho.Io.|[.^{ [6 )n NM -Y g` yS Mb ja J8 fj !n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 !}.:n.Wg.Jo.9A n$.8` Ko.Nb os le Of J8 J8 ja ja J8 Nf J8 J8 J8 J8 J8 J8 ~n _d '0 J8 Nf Nf J8 J8 J8 '0 ~n _d ka J8 Nf J8 J8 J8 ja ja J8 J8 J8 J8 Nf Of Nf J8 67 >c F- J8 ]n $r #r J8 J8 '0 ~n :%.Vl ej Ek {n ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- ej Ha dj ~Y Lo.Mo.xV >x j>.>G [k 9u No._0.,a.Oo.Po.Bc.>O Q) (D Qo.B= q2 y7 T-.zc x~ [C >k <' Bz @J fA Ro.a| 6# 7i dj 8H D0 Qn Oi.-v n|.7^ So.bE `= To.[* Uo.s0.B'.bO TT -w Vo.Wo.Xo.Yo.{9.NC U> cv I8 J8 ja yS }$ 9g.O@.Zo.`o.5| kl..=. p..p.+p.q5.Ep je Nf 6A 7r w8.v,.c{.;A @p.K W. > > > > > > >. ,. q >. > > > > > > > ^ ' ' ' ' ' ^ > > > > > > K #p.$p.%p.c> d> T+ hp d+ Fg d+ Gg ", "%+ %+ %+ 0@ v* 6- 3~ &p./2 *p.- 5 ^ , , > ^ 0 Q =p.hZ Fi -p.;p.&! K'. C |(.Of :%.~n ka J8 J8 J8 Nf Nf Nf Nf J8 ka >0 ~n ka J8 J8 J8 J8 J8 J8 Nf J8 J8 J8 Nf fj '0 '0 J8 fj fj fj J8 Vl Vl F- J8 J8 J8 F- 67 ka fj fj Nf J8 1G 1G '0 Qj V-.o;.db.Pj >p.2!.Jb Pf ]n Rf b6 Eb ,p.<,.'p.)p.^I kg AB M^.&O wL J8 J8 J8 F- 67 J8 J8 J8 J8 J8 J8 Nf Nf Nf Of $J sv e! |9.!p.=<.~p./#.{p._d J8 J8 '0 ~n ka J8 Nf Of J8 ka >0 >0 F- Ul ka ~n J8 J8 J8 J8 J8 J8 '0 ~n J8 77 )n sy jh.]p.QD ^p.Si Nf =r '0 fj [P ja `*.J8 ne ~n ~n ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 /#./p.Mb (p.^r IM _p.:p.'{ Pf Ib Nf J8 ja Ek Lb I8 Nf Nf J8 J8 J8 J8 J8 fj '0 '0 J8 Nf J8 J8 J8 Nf Nf fj ~n J8 J8 Nf Nf J8 ja Ek 3o ja J8 J8 J8 Nf Nf Nf J8 Ul F- J8 J8 #r #r #r J8 J8 J8 '0 '0 F- Vl S5 Ek F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- Vl hH Pf )c.T: P..Jb Ib 4o ss ]u b# S' L%.40 qp.o ' , > > > > > _ D. 8 > > > > > > > > ^ ^ , , , ^ ^ > > > > > > 5{ Ym.rp.)+.c> ]P t* =i -i u* d+ y ", "$+ $+ $+ Gg X+ ^2 3~ D^ }( Q-./ ; _ , ' > O l+ L+ sp.e(.S-.tp.Qu en.I~.I8 Of NM :%.{n ka J8 J8 J8 J8 J8 Nf Of F- ja >0 _d ka J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 :%.{n >0 J8 Of Of Of Of os ^d ke I8 M1.>5 t9..=.up.kM m( x~ 2! rs N2 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja -B vp.!] G~ h^.wp.xp.-Y J8 J8 >0 {n ka J8 Nf Of J8 !n ~n _d ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >h ke Z@.yp.86.E< ]!.zp.]d =r J8 J8 J8 J8 J8 J8 ka >0 {n ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fj y8.Ap.'| rL Bp.,4 K1.^p 0K CT J8 J8 ja Mb c -6 Vl J8 J8 J8 F- F- J8 J8 J8 J8 J8 I8 I8 I8 ka ]l _%.I*.Cp.Dp.Ep.Fp.Gp.Hp.Ip.'A Jp.Kp.Lp.Mp.Np.Op.Pp.IR Qp.v1.Rp.Df Sp.e~.Ch.Tp.Up.(v bF Dw V{.GX fA 3' 3i Fk Z8 a&.Vp.Wp.Xp.Yp.Zp.iM `p. q..q.+q.K< Yg.y; ut L> @q.#q.$q.%q.p[ &q.O8 *q..! c,.DE fe J8 J8 I8 *G *2 =q.K/.-q.t:.*;.3'.~7.;q.>q.=r Kb ns 2k Ee [= B- L= O$ ,q.o ] ' > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ) 2 ~ FV Ak.'q.~+ v+ w+ V+ d+ y ", "#. #. |~ {f.+e.@e.4b o) v2.= - ; > > > > k+ )q.31.!q.2) ~q.L$.3u G1 la '0 Nf F- S5 S5 F- J8 J8 J8 J8 J8 J8 F- >c >c F- ka J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of ]O Mf ha $J ej fz MM -Y J8 J8 J8 J8 J8 J8 J8 J8 67 Vl F- J8 J8 J8 J8 J8 Nf '0 ha I8 &N J8 {q.}9 ]q.^q.)X /q.pw >h Kb J8 Nf Nf Nf J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 I8 Gj.Vn J;.(q.Ri ,0 Gp J8 J8 F- Vl S5 F- J8 J8 J8 J8 J8 ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fe -h h6 /*.A'.P- fA sl.^d -h J8 J8 J8 J8 J8 J8 F- Vl S5 F- J8 J8 J8 Nf Nf Nf J8 J8 F- 67 67 ~n 2-.Qj ]l jP :*._q.T~.E[ ;c e^.J8 J8 J8 ja MM J8 J8 J8 J8 J8 J8 J8 J8 J8 F- 67 67 ]O ~n fj F- ej ej F- J8 J8 J8 J8 J8 >c >c S5 ]O Of Nf Nf J8 Nf NM -Y -Y ka J8 J8 J8 J8 J8 J8 J8 J8 ka ~n -Y ka J8 F- Vl #r Nf Nf F- >c >c Ul J8 ns J8 77 ~d :q.Ut fe Ud 2e.fq.xS 1! 0h :..O+.gq.hq.iq.jq.kq.98.lq.3d.mq.*h ,r Of Nf '0 V-.Iv v; yv nq.oq.!A .! pq.qq.&$.-h -h Nf ns Y>.>< FQ |$ Hi rq.6+ 0 _ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 3+ 2+ T_.9+ W&.!+ ~+ a+ b+ u* d+ y ", "#. #. O-.sq.tq.^f.4b +a H. uq.d. ; > > > > K,.Ia.vq.wq.xq. Z yq.X*.Kv =O 6A 4o F- Vl >c F- J8 '0 ka F- F- J8 F- fz fz F- J8 ja ja J8 J8 Nf Nf '0 ka F- F- J8 J8 J8 J8 J8 J8 ka '0 Nf Of -Y _d NM $J ej fz MM _d ka J8 '0 !n J8 J8 Nf J8 67 ej F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 DE /p.zq.Aq.Bq.Cq.+g.Dq.wp.xV F- Nf Of Nf J8 Nf Of '0 ka F- F- J8 J8 J8 J8 J8 I8 Eq.Fq.Gq.Hq.ck T5 db.J8 !n ja Vl >c F- Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fe -h ml.#C Iq.Jq.q5.2I ha )n J8 J8 '0 Mf >h 77 hH ej >c F- Nf J8 J8 Nf Of Nf J8 J8 F- 67 >c >0 -Y OM Of ha Cz [: Kq.Lq. j /O J8 ka '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Ul 67 >c ]O _d fj F- fz fz F- J8 J8 J8 J8 J8 fz 9L #r Of $J #r J8 J8 Nf NM -Y _d ja F- J8 J8 J8 J8 J8 J8 J8 '0 ~n _d ka J8 J8 J8 Nf Nf J8 F- 9L g# ia 77 }d T5 cv V4 #D !f }6 fA M8 Mq.#P Nq.Oq.g5 #0.[n Pq.Qq.t~ :9 Rq.FU Sq.<< */ 3=.,,.Tq.6i la.Uq.8i 7i 7i (*.Qk.fd g# ia BB k|.k9.[P ne J8 J8 F- ha >x )n Mf ]O ]O Mf Mf Mf Mf #u ej f# X$ P= Tl.Vq.9O == 9{ Wq.Xq.Yq.Zq.=O je Of Nf '0 2-.^-.ys ]' `q. r..r.+r.@r.f_ P~. ( ; > > > > > > > > > > > > > > > > > > > > ; ; ( ; > > > > > G $r.Y@ Z@ ~+ U+ }5 V+ d+ y ", "%+ %+ `@ P. s3.6- 4b +a H. c@ ; > > > > > `#.%r.&r.g(.*r..I =r.hv [[ 5X +C sH J8 F- 67 J8 fj ~n >0 S5 Vl F- J8 MM ]O '0 Nf Ek Ek ja J8 Nf '0 >0 >0 S5 Vl F- J8 J8 J8 J8 J8 ~n ~n '0 Nf fj fj fj Nf F- F- ka ~n J8 J8 >0 ~n ka J8 Nf Nf F- F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >A zp Iv -r.;r.)Y >r.,r.'r.r8.>c F- Nf Nf J8 Nf '0 >0 >0 S5 Vl F- J8 J8 J8 J8 I8 )r.!r.~r.#'.]k ~9.E'.J8 ~n >0 ja 67 Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fe ;h ml.{r.]r.^r.37.yL Nf I8 J8 J8 '0 Mf >h +G Aj >c Ul Nf Nf Nf J8 Nf Nf Nf J8 J8 J8 F- Vl ka fj pW os 1!.-0 /r.(r._r.:r.$r '0 >0 >0 '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 1G Ul Vl '0 fj ne J8 MM MM ja J8 Nf Nf J8 J8 MM ]O '0 Nf ]n Vl F- J8 Nf Nf NM :%.Vl Vl F- J8 J8 J8 J8 J8 Nf Nf '0 ~n J8 J8 J8 J8 Nf J8 J8 J8 7i >h ,0 Lf 5h 67 /y 3Q Ui.'X $S 0 ~n J8 J8 $J ^d 4$.DE DE -h -h -h -h -h fe Lf #u #u =h BB ~)..y E' wD %e 8r.6H 9r.0r.)n )n Nf Nf '0 ar.da.`d.fi.br.dV cr.dr.er.fr.D! gr..C Mf ke 4o xP [p 1, _[ hr.m+ 7+ / / 9 ; > > > > > > > > > > > > > > > > > > ; 5 / / 9 ; > > > > ^ m{.n{.u# 4@ 5@ 6@ 7@ d+ y ", ". . y Q. %& ;} 3~ EM {! 5b > > > > > > >& /h o& ir.*r.dJ jr.S#.Ap ~K _}.z$.Nf '0 J8 J8 !n ~n {n S5 >c 67 J8 _d -Y pW $J Aj Mb `*.J8 J8 !n ~n {n S5 >c 67 J8 J8 J8 J8 J8 :%.{n >0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka >0 {n ka J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fe ;h a3 kr.;r.F{.$'.lr.mr.r8.-6 Vl J8 J8 J8 J8 !n ~n {n S5 >c 67 J8 J8 J8 J8 '0 nr.or.pr.n2 }=.2= @G J8 -Y _d ~n J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 ka ,h ;h V4 qr.rr.sr.tr.,0 J8 J8 J8 J8 k* (E H1 #z d! dQ Nf Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of /d ur.rV vr.YW wr.xr.M^.Mf {n _d ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y _d >0 F- Of Of Nf J8 -Y _d ~n F- >c >c Vl J8 J8 J8 Nf $J m/ >c Ul J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 ja I8 '0 Z,.ET ]K tV wc 3!.Ld yr.X2.O! JY {7.Q* zr.bZ _^.N@ Ha Ar.)d O' dD ,h T5 Br.Cr.Dr.+1 Er.aL >A }$ ha |(.&N J8 J8 J8 J8 J8 J8 !n ~n _d ka J8 >0 _d ka J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y {n 7i fe -h DE ~d fe lm Y4 (E I8 J8 J8 Nf Of Fr./p.Pj Y8 37 m2.Gr.]` Hr.Ir.Jr.3*..L >x Kb 0L Q= ]| E[ _..Kr.M F. - @$ /; ; _ > > > > > > > > > > > > > > > > > ; d. - @$ - ( > > > > 0 8$ Hw 0$ [v Iw 6@ 7@ d+ y ", "Lr.Lr.d+ v* %& c< 3~ EM {! 5b > > > > > > 0x E:.}0 %( E3.mD dz S) W$ ~l.e!.Nf -Y ~n J8 Nf Of '0 ka F- F- J8 J8 ka Nf Of Of ja ja J8 J8 J8 J8 J8 ka J8 F- J8 J8 Nf Nf Nf F- Vl S5 F- J8 J8 J8 J8 J8 J8 J8 Nf Of J8 F- S5 S5 F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fe ;h CF Mr.Nr.Or.h fe dj dj -h ^#.Uq.Sr.H8 k6 S+.Tr.>O {d >h J8 J8 ja ie #y Q} :: q; 0E ut NM Of #r Vl 67 '0 -Y :%.I8 F- F- J8 J8 Nf NM OM Cp Ur.Vr.#1 Wr.Xr.Yr.m6 >h Mf '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Of Of J8 J8 J8 J8 J8 ja s_.PM NM Of Nf J8 ka ka J8 J8 ]O ]O '0 J8 J8 J8 J8 J8 F- F- J8 J8 fj fj fj J8 Vl 67 Ul J8 Nf Nf Nf J8 ns 77 la }d Lu b6 JH n!.Zr.`r. s.dz LB A .Yg }6 h^. F 1e.pz y$.Pf 84 =O fe 7i BB ^n H% jG 8o..s.xf.+s.Z).>h me |(.Nf J8 J8 J8 J8 J8 J8 J8 J8 ka J8 J8 J8 ka J8 J8 J8 J8 J8 J8 J8 J8 ~n ~n !n J8 J8 J8 J8 ka yS yS ia ha 77 >h fe fe ns ]l ns J8 J8 J8 J8 J8 1G ,h =h #y M=.n+.Dh.@s.xz #s.$s.}D H~.Dp V-.t .;0 ]| ^t %s.&s.' o 5 - 6+ N p D. > > > > > > > > > > > > > > > > > ; 5 - - 9 > > > > G ~# /% *i T+ v# }5 V+ d+ y ", "R=.R=.pT v* %& c< 3~ EM {! 5b > > > ; ; > 0x Q*.-9.*s.w&.wp @:.pP W$ =s.$r Mf ~n '0 J8 Of Nf J8 J8 J8 J8 fj !n J8 Nf Nf Of J8 J8 J8 J8 ka ka F- Ul J8 J8 J8 J8 Nf Of '0 ja >c -6 Vl J8 J8 J8 J8 J8 J8 Nf Nf Of J8 F- Vl >c F- J8 J8 J8 J8 J8 '0 !n J8 J8 J8 J8 J8 J8 J8 J8 [d -h }d I1 Y-.-s.;s.G; >s.)$.pm.~n J8 J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 J8 Nf #r J8 Lb *n.D6 q@.Xy #r db.J8 J8 J8 J8 J8 J8 F- Vl >c ]O -Y fj J8 F- F- F- J8 ns ]l ]K ~).AU ($.#y h6 8m }P I~.Td '0.i5.o|.Gp -h J8 J8 I8 ~d Y8 rH ,s.Dg.zx /| -h 77 F- 67 fz Sl g` !n sH 6A 6A [d J8 Nf NM /#.Xl 's.)s.!s.~s.{s.]s.^t fe Mf J8 F- F- Ul F- F- F- Ul F- J8 J8 Nf Of Of Of J8 J8 J8 J8 J8 ja s_.Mb I8 #r J8 J8 J8 J8 J8 J8 -Y {n '0 J8 J8 J8 J8 J8 J8 J8 fj !n -Y -Y '0 F- >c 67 F- J8 Nf Nf Nf I8 77 '0 ($.H' NC ^s./s.(s._s.:s.h wL wL ha NM $J Nf ka ~n (d O2 %2 'Y [s.}s.J3.|s.DE ke I8 J8 J8 J8 J8 F- F- ka ka J8 J8 J8 J8 J8 J8 J8 J8 ka !n J8 J8 J8 J8 ~n _d '0 J8 J8 J8 J8 ka Y4.Mb ja J8 J8 J8 ka ka '0 '0 J8 J8 J8 J8 ka !n J8 77 7i {K fi.Pj.1s.2s.,1.3s.4s.5s.6s.2-.na.^-.Iv ,5 j[ 8E ^ R O > / K 4O q >. > > > > > > > > > > > > > > > > > ; ; K 0 ; > > > > H xI yI u+ t* v+ b+ u* d+ y ", "O-.O-.O-.7. 1~ ;} 3~ EM {! 5b > > ; 5 9 : 0x s* 7s.8s.9s.0s.T| .j o7 (^.qs '0 '0 '0 Nf Nf J8 J8 J8 J8 '0 ~n ~n '0 Nf Nf Nf J8 J8 J8 J8 ~n >0 S5 >c F- J8 J8 J8 Nf fj ~n >0 fz -6 67 J8 J8 J8 J8 J8 Nf Nf Nf Nf J8 J8 F- 67 J8 J8 J8 J8 J8 '0 >0 ~n ka J8 J8 J8 J8 J8 J8 J8 ~n Kb ge -$ 0l.]q.as.bs.q8.-Y _d fj J8 J8 J8 J8 J8 J8 Nf Nf J8 J8 J8 J8 Nf Of Of Of mc.h9 -/.cs.CZ q3 ;h J8 J8 J8 J8 J8 J8 J8 F- Vl Nf fj ~n >0 Vl ej ]n 6A H1 83 vc O~ $=.'s Kd P..L- c6 rl.wV ds.es.fs.Pj ;h J8 Nf ha Jb k6 ZQ 1o.O^.'6.O; Zy fe F- Ul S5 1P _9.C4 Ud d@.p8.gs.Nf Nf (Y +A a].!d Rn Bg.hs.ca (D )6.fe I8 J8 Vl >c >c >c >c >c >c 67 #r Nf Nf Nf Nf Nf J8 J8 J8 J8 Nf Nf ja s_.67 Vl F- J8 J8 J8 J8 Nf fj '0 '0 J8 J8 J8 J8 J8 J8 Nf fj ~n _d {n S5 >c 67 F- F- J8 Nf Nf Nf ha CT ($.h^.is.zR js.x6.|y ks.ls.ms.ns.U> |V ;h os.:q.(^.mc._*.(*.o'.ha Of J8 [d fj me la 2V ps.@=.d%.qs.rs.@A f* Ek ja J8 J8 F- Vl Vl ]O >0 '0 J8 J8 Nf Nf Nf J8 ka >0 ~n ka J8 J8 J8 fj '0 '0 Nf J8 J8 J8 J8 k9.k9.ka J8 J8 ka [P }Z I8 I8 I8 J8 J8 '0 >0 ~n J8 '0 NM 6A 87.CA J!.,P r1 ss.-D ts.G; pW na.$m.4X oR 93 us.a[.E F > ( ; >. 8 > > > > > > > > > > > > > > > > > ; 5 5 N Y. >. > > > > H =K yI u+ t* a+ b+ u* d+ y ", "6. 6. 6. 7. 1~ 2~ 3~ EM {! 5b > > ; 9 / > e@ e@ 'C '..vs.ws.LG %f L} *h Of J8 J8 Nf Of J8 J8 J8 J8 J8 ka >0 {n NM Of Nf J8 J8 J8 J8 J8 -Y {n Ws -6 Vl J8 J8 J8 J8 !n ~n {n S5 >c Vl J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 F- ja >0 _d ka J8 J8 J8 J8 J8 J8 J8 ~n Xl ge P] z:.AS xs.ys.)n F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of NM NM os zs.8r.KI As.6l.pw 6A I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 [d ~n {n |[ f# 77 !` ^| ]y }' Bs.Cs.Ds.@~.Es.Fs.C5.9B Gs.Hs.Is.Js.8Q +G I8 ha le 2D |I 6: 'T UB p3 )S }d fe Nf Nf ja ~M Ks.>#.eD Ls.q8.pa.os fe O1 3.Ms.ut Ns.ln.Os.3s 0o.O7 -h Mf F- ej -6 -6 -6 -6 -6 -6 ej #r Of J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 67 >c Vl J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 _d _d >0 9L -6 F- J8 J8 J8 J8 J8 Nf os !d +{.Ps.Qs.Rs.Ss.%a.V6.!9.}/.Ts.Us.Vs.ke OM -Y 7o Ws.bt -6 v& Lb I8 Of J8 J8 Nf Of le me @y w0 F'.0{.Xs.Ys.5r./=.ja J8 J8 F- Vl >c ]O _d ~n J8 J8 J8 Nf Of F- ja >0 _d ka J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 -Y -Y fj J8 J8 ka }P |Z ka J8 J8 J8 J8 !n ~n _d ka J8 Nf os Zs._N F~ `s.7K r1 t..t.Q1.d@.Ky :%.M^..C 8 +t.b}.n [ > > > > > > > > > > > > > > > > > > > > > > ; 5 K Dn.M D. > > > > G l@ P& u+ t* v+ w+ V+ d+ y ", "W+ W+ 6. Q& P. 6- 4b -K Lq ^X > > > 0 W. > ^- {# t#.'..w&.+~.J;.@Z 0K (^.Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 F- S5 S5 F- J8 J8 J8 J8 J8 J8 J8 ka ka F- Vl #r Nf Nf J8 J8 J8 ka ka J8 F- Nf Of J8 :d s_.PM 7o Of pW -Y ka J8 J8 J8 J8 J8 Nf Of ej >c ja ka J8 J8 J8 J8 @r @r #r J8 [d 77 fe 5o @t.z6 Iv ~9.ia J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 Lb Lb ]O I8 )0 76 +;.#t.b1.po.Ku 77 I8 ka ~n -Y ka J8 J8 J8 J8 J8 J8 ka F- fe Wl ts G; k $t.%t..;.oW CZ &t.CZ t.,t.5Z Q* 't.,I |, =r ]d Of $J 7o -6 fz Ek >0 #r #r Nf J8 fj -Y -Y -Y J8 J8 J8 J8 J8 Nf Nf Of Mf ]O '0 J8 J8 J8 J8 J8 J8 J8 Nf Of Lb Mb :d J8 J8 F- Vl S5 ka J8 F- F- Nf Nf Nf J8 J8 Nf $J $J Hr J( )t.!t.~t.{t.Mm.rP hc en.=W n[.&O dj ha J8 Of $J #r Vl 7h fz ]n Of J8 J8 J8 Nf Of 4$.)n ^y ]t.^t.//.ge :8.k|.ka J8 Nf Nf #r F- ka ka J8 J8 J8 J8 J8 F- >c ej ja ka J8 J8 J8 J8 J8 F- Vl ej F- J8 J8 J8 Of Of Nf J8 J8 J8 ka ka J8 J8 J8 J8 J8 J8 ka ka J8 J8 Nf qs /t.{u (t.n[ F~.*c._t.>:.:t. , , , > > > > > > > > > > > > > > > > > > >. Y. Dn.1t.f. k. > > _ , mp DM Eg 0$ 4@ v+ b+ V+ d+ y ", "6. 6. 9@ 0@ O. ^2 4b o) q{.B@.> > ^ ^ ' > e@ {# t#.Uv 6n hS [D '#.Kf *h k* 4o J8 J8 J8 J8 J8 Nf J8 J8 F- Vl >c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of '0 ka F- F- J8 J8 J8 Nf Nf Of Nf ja s_.Mb I8 Of :%.{n ka J8 J8 J8 J8 Nf Nf Of ej >c Ul J8 J8 J8 J8 J8 @r $r #r J8 F- ns dZ ]K 0L wL 8Q Mb ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Nf J8 Mb Mb ja I8 Gp ^| `6.:=.2t.5k.[9 Lf #u ka >0 {n '0 J8 J8 J8 J8 J8 J8 J8 J8 >h Wl 3 .E4 p7.qs.[; 3t.[] E4 5e.P) M- Cb 4t.5t.6t.Df.:| |' b3.CF @y G[ Lu ^s ck F'.6f.7t.8t.0` ,0 ,x os Jb U-.9t.;6.0t.at.>b xP k! y1 `e.bt.ct.dt.et.!r ft.1_.#J 0L 5P Of $J wL o7 fd ie Cp OM me Mf BB OM (d {n >0 J8 J8 F- F- J8 J8 Nf Of -Y g` '0 J8 J8 J8 ka !n J8 J8 Nf Of Lb Mb :d J8 J8 F- Vl >c F- J8 J8 J8 Nf Of '0 !n J8 )n Ib m[.mr gt.ht.it.jt.zc 'x j ~M Lb 7r a0 e!.$r #r J8 Nf _~.pW NM ej >c F- Of J8 J8 J8 J8 ne Jb o;.z6 kt.p1 9} Y4 t .{n :%.J8 Nf Of Nf J8 J8 J8 J8 ka F- F- J8 F- ej ej F- J8 J8 J8 J8 J8 F- Vl ej >c ja '0 [d J8 I8 I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf qs lt.{9 mt.W0.-o..` nt.ot.pt.qt.rt.xL 2,.3I H_ GW |@.K+ A^ D. 9= ' , > > > > > > , > > > > > > > > > > > >. ,. M f. ^. ]% > > > H l+ ZN `N 0$ 4@ ,o 'o u* d+ y ", " O O %+ y P. ^2 3~ Z{ -& N6 > > > ^ , > d@ e@ 4$ st.tt.ut.vt.wt.'$ }d >` sH J8 J8 J8 J8 J8 Nf Nf J8 J8 F- 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf '0 >0 >0 S5 Vl F- J8 J8 J8 Nf Of Of Nf ja MM Nf #r S5 S5 F- J8 J8 J8 Nf Nf Nf Nf #r #r F- J8 J8 J8 J8 J8 #r #r #r J8 #u 67.xt.yt.4X $r Lf :d J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 :d ja ja I8 DE N1 Xw zt.W2.At.3D fe )n ja S5 Ws #r Nf Nf J8 J8 J8 J8 Nf Nf >x ,0 L+.MO i9.Bt.Ct.=0 C<.'8 Wn iA K^.Dt.Et.Fo.Ft.Gt.Ht.It.9F :*.v; ZW a..6: xl '~ tb.Jt.^J a1 8Q fe NM 4$.| ._9 V= Kt.X).Lt.S#.Eo.Od.Ft._n -$.Mt.`,.,~ ZA Nt.Pi S~ _[.N1.c! B- 9h ;_ Qf je >x Mf ,0 2-.)n _O hH S5 J8 J8 Vl 67 F- J8 Nf Nf fj '0 '0 Nf J8 ka >0 ~n ka J8 Nf Of I8 :d :d J8 J8 J8 F- 67 J8 J8 J8 J8 Nf '0 >0 ~n J8 -h J..Ot.,n.Pt.Jc.Qt.'` ru 7r Rt.>A fe 5o M^.~` #r #r J8 J8 fj -Y :%.ja F- F- Nf J8 J8 J8 J8 ne V-.St.JE Tt.sk.A'.cg iI Mf >h J8 Nf Nf Nf J8 J8 '0 >0 >0 S5 Vl F- Nf #r #r J8 J8 J8 J8 J8 J8 ]n @r ej Ul >0 ~n fj J8 Ek Ek ja J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf Nf J8 J8 J8 Nf os Ut.Vt.Wt.Xt.:B kp.zM Yt.vh.q|.[/.^d qs wS Y4 ^ ^ > > , , , > > > > > > > > > > _ D. D. k. ]% 9 > > ) dy r@ ~P {P ]P t* kf lf Fg d+ Gg ", "$+ $+ $+ y P. 6- 3~ U_ 8$ V& _ > > > > > d@ d@ !P `t. u..u.#0.+u.@u.;c _}.h).J8 J8 J8 J8 J8 Nf Of F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 !n ~n {n S5 >c 67 J8 J8 J8 Nf Of Of Of Nf J8 J8 F- >c -6 S5 ka ka Nf Of Of Nf J8 Of Of Nf F- J8 J8 J8 J8 J8 J8 J8 Nf Wl #u.$u.%u.)s +C &N J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fe (E m;.5_ Jp NG 3o.DE fe F- >c -6 #r Of Nf J8 J8 J8 Nf Of Of ^d dj /$.06 [< [L &u.|] ,0 i].77 5o G7 *u.=u.%B &f.-u.;u.z4.#0.>u.;6.GC ,u.'u.wv Ji.)u.!u.FB [p Ap +G Nf >h tV :f __.~u.{u.]u.A .^u.`g /u.W/ 7l Z/ M8 #t (u./)._u.>6 Vm.!_ ;W :u.-2 6! &R 2k cv ]K ]K 5l.ej h# {{ >c J8 F- Vl >c F- J8 J8 J8 J8 J8 Nf Of F- ja >0 _d ka J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka >0 _d ]O ha K%.c Vl Of Of Of Nf J8 J8 J8 J8 J8 $r $r #r [d _d -Y fj F- bh Mb `*.J8 J8 J8 J8 J8 J8 J8 Nf Of Of ha I8 J8 J8 J8 Nf ha 4$.

    !.'o.DV ^ > > ' ' , > G G ^ > > > > > > > > > > > > > > > > > > ) 2 ~ _Q :Q > > > > l+ d@ X' 9u.0u.ut.au.N%.bu.cu.'g 1G J8 J8 J8 Nf Of Nf J8 >c 9L ]O -Y J8 J8 fj -Y Vl 67 F- Of J8 J8 J8 J8 Nf Nf Nf ka J8 J8 J8 J8 Nf Of Nf J8 Of Of J8 J8 ne #r m/ Ap 3=.Fk >h 77 ha ha I8 Nf Nf #r Vl ej #r Nf J8 J8 !n fj Nf NM gn.du.eu.AS 9X fj fe J8 J8 J8 J8 J8 ~n ~n fj J8 J8 J8 fj _d ,0 77 I8 J8 J8 J8 J8 ka -h ]l .A Xs AC UO q;.=r fe J8 1G Ul J8 J8 67 67 Nf ne ne J8 ga Kf WI rl.B..Xa 0I fu.%b .v k9.Ak `+.2/.gu.hu.iu.ju.ku.lu..5.mu.FZ '0.56.=5.--.K7 nu.ou.pu.SI Nh => }d Of NM ja qu.l1 Ti.j0 Gh._p.3f.=) I} ru.su.tu.uu.vu.wu.xu.yu.zu.Au.Bu.Cu.Du.Eu.u( Fu.Gu.+N e3.Hu.Iu.AZ dh Aj F- Nf NM Mf ]O ka J8 J8 J8 J8 J8 J8 J8 >c ej ja !n J8 J8 J8 J8 Nf Of Of Of J8 J8 Nf Of Of Nf Nf J8 J8 J8 Nf os ~d Ku Ri Ju.[,.Ku.[6.mz Lf 84 Wl -Y Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 ka ka J8 J8 J8 F- >c >c Ul J8 0L {d Lu.Mu.Nu.Ag.bo.Ou.zp.ia M{.PM Ul J8 J8 J8 J8 J8 '0 NM F- F- Nf Of o'.yS :d J8 J8 J8 J8 J8 F- F- J8 J8 ka J8 J8 J8 ja ja J8 J8 J8 J8 J8 J8 J8 J8 Nf Of ia Lb Mb s_.J8 ja Ek eQ ^n fj jA DQ Pu.Qu.Ru.P| =4.Su.Tu.~Y Jy d3.ZK H_ b* Uu.Vu.*Z Wu.E [ _ ' ' ' G T E [ > > > > > > > > > > > > > > > > > > > ) [ 8R o& Pq T+ {g.r3.7@ d+ y ", " O %+ %+ 0@ P. G3 d< Wz v7 J3 : ( ; > > > 7+ _= X' u).Xu.Yu.Zu.8*.*% `u.Lb F- #r J8 J8 Of Nf F- Ul >c 9L ]O _d ka J8 >0 {n S5 9L #r Of J8 J8 J8 J8 Nf Nf Nf J8 F- F- J8 J8 Nf Nf ja ja T5 fe >h >h ]d je g# -> j>. v.LE {K ]K k* 4o F- ja Vl m/ Ga &O ^d Pf ,d Fk Qj jL ]d .v.+v.@v.#v.$v./#.yV [d J8 J8 J8 J8 ~n _d '0 J8 J8 '0 -Y ~n *&.{K ]l I8 F- F- F- '0 fe aw =E Pj.%v.OG Tt &v.bg.;h je ke >h ,d ;c X$ /O fe fe ,d Qf Ww dD Fm.50 },.*v.'k.=v.v0 Ug.-v.NL ;v.&I >v.,v.'v.)v.!v.~v.Ze.F~ l6.]:.{v.]v.^v./v.(v._v.HX a6 g# la Of Nf +G dh )t 7} y4 [D Bl.:v.c >c Vl J8 J8 J8 J8 J8 Of Of Of Of Nf Nf Nf Of $J #r J8 J8 J8 ne pW hb.2o.#k ^Y gv.-w ,#.01 Hp Ib OM -Y -Y Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 ja ej 9L 8Q ^n Ib K8 G8 o3.hv.<< KG pR iv.la P+.Qk.j9.:%.[d sH 4o Nf Of Of Nf Nf Of Of yS Lb ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Of Ek ^ ' ' G E 2 [ > > > > > > > > > > > > > > > > > > > , ^ s* P& u+ T+ {g.r3.7@ d+ y ", "#. #. 9@ Q& v. 6- 3~ sv.n| tv./ / 9 ; > > 7+ d@ X' u).t(.pN fu.2' 7%.E'.ia ]n ]n #r Nf Nf F- 67 67 67 F- ka ~n J8 F- S5 Ek ia ]O '0 Nf J8 J8 J8 J8 Nf '0 fj >0 Vl Vl F- J8 Nf ka Ek eQ ~M K~.,h >h Ib T5 6= K{ uv.!D `=.z6 ]| '5 6# 1! uJ ly 0! vv.7o Pf Jf Qf Kb EU Qj ]d ~Y |D @=.wv.m;.-h i].fj J8 J8 J8 J8 fj '0 '0 J8 J8 '0 :%.'D 2e.yE xv.,0 hH ej ]n Nf 5o t^.lu m~.yv.%/.`4.b,.Y$ e^.84 ]d ]d N2 Ax >; t& t& fd e^.Qf =h zv.Av.|#.G> 9t.Bv.Cv.Dv.Ev.Si.Fv.Gv.#1 EX Hv.Iv.Jv.6{ Kv.Lv.Mv.Nv.)4 Ov.Pv.Qv.Rv.Sv.Tv.Zj.ow ia la Nf Vl f# >c }[ hv g.Uv.8y bH Vv.vj.5C my Wv.Xv.Yv.Zv.p3.`v. w..w.+w.@w.#w.9..)D <9 km &l $w.%w.&w.*5.Ah I1 ke os Nf fj ~n Nf Nf J8 J8 ~n >0 S5 67 67 67 67 ej #r Nf Nf Nf Of Of Of Of Of Nf Nf Nf ]n Vl F- J8 Nf pW *w.Il.St.G> >o.=w.'$.Kd Yl -w.&=.;w.fj fj J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 >0 >0 F- S5 @*.!}.$D >w.,w.l[.'w.-H )w.!w.|D CT ~w.,h pm.{w.(#.4x Hb Nf Of Of Nf Of Of Of I8 I8 ha Nf Nf Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf Nf Nf :d s_.s_.Ek J8 J8 ja yS 8i !}..G u8.]w.^w. 2 /w.(w._w.:w.0K > > > > > > > > > > > > > > > > > ^ , ' s* h..u+ T+ 1w.2w.9>.d+ Gg ", "6. 6. 6. 7. 1~ i= 3~ k}.U& +n.d. C+ /; ; > > O l+ X' 'N 3w.4w.zR ]y 0K 5w.Of 7o $r 7o Of J8 Ul 67 >c F- J8 J8 J8 J8 F- 67 >c >0 _d ~n J8 J8 J8 J8 J8 F- ja >0 {n S5 >c 67 J8 J8 ja Ws 6w.i-.Hk A1 V> V> *W _!.7w.,l.|d w0 3' eD E; E[ M@ 8w.], J] F7 H1 %R |V Mu 3 .9w.O&.>$ 0w.aw.s'.;j b: N2 Gp (d '0 J8 J8 J8 J8 J8 J8 J8 J8 ha qs } .|] *@.kA 2-.g# Ha wL TB xc xK +<.i0 q0.s6.bw.MX l$.Wr +y g6 pz Q= fc =< ]..]..cw.Hi 'G dw.ew.r).LE Y8 O4 'n fw.gw.hw.iw.D2 jw.kw.lw.mw.nw.ow.pw.qw.Ph {d.NF rw.sw.tw.uw.vw.ww.xw.6Z yw.Mf DE F- T0 g! }p yw.(f j/ )'.Hk Lv #R h J8 J8 J8 Of Of Nf J8 -Y {n Ek >c J8 F- ej -6 ]n me me os os ha NM Of 5P me NM ja f# 9L F- Nf $J c!.9Q Gw. 7.u( Hw.Iw.Jw.8H /p. ;.P,.~n fj J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 !n ~n _d NM ns 4l.+o.2Z 2Z Kw.Lw.}f SP Mw.Nw.=L vL 0L H2.Ow.|$.ts Z).4&.qs )n >x os os os os me me os os ha ha os NM I8 ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of me Of Of Nf J8 J8 J8 J8 I8 I8 ha ha ]O Bk o3.L> Pw.Hq.Qw.Rw.Sw.Tw.Uw.Vw.Ww.Xw.#r 2k />.Yw.Zw.j{.m+ ' : / - 5 > > > > > > > > > > > > > > > > > > > > > > > > > ^ S o@ W& u+ t* ~8.R=.Fg d+ y ", "%+ %+ `@ Q. %& T_ 3~ o) ax `w.,. q+ J r# 1 > O l+ J+ [) SW x.$O 8*.~M 2!.Of Of $J Nf J8 J8 ka ]O ]O ka J8 Nf Of J8 J8 F- F- ka ka J8 J8 J8 J8 Nf Of Ws Mb MM ka J8 F- J8 J8 Nf wL _O 2&..x./' hW l/.;X Zg +x.@x.GY !G DQ 4' aI ~%.'n ^J Rx J*.Si aI Qn E( 5H #x.$x.(j.8c @J Ou.yG ;j Xy JE 3=.Ut o;.%x.ys.NM J8 J8 J8 Nf Of )n ;h fe ss &x.Rn &y 2-.]O #u qs } .)D 1 .-9 v9 *x.=x.-x.NE ;x.DK >x./k Hq ^{ |F '.,x.6E 'x.)x.O;.Yy a^.=r 7r |, MO U{.|_ Bp.!x.~x.{x.C] ]x.^x./x.(x._x.}f.kD :x.=-.c Ul J8 J8 J8 J8 J8 ka ka F- F- ~n >0 F- Vl I8 je 1K Jb `l.4$.Ib je ,r ]d Cp gj -h -h >h 77 qs {d kx.q8.U= lx.zr.u9.'s Bk 6].=h wL ga J8 J8 J8 J8 J8 J8 ~n ~n fj J8 J8 J8 J8 J8 J8 J8 J8 NM Pf 2k j/ mx.nx.ox./U px.;^.)5.{] qH qx.K8.3' rx.sx.tx.G1 ux.=G vx.wx.Z8.1!.xx.yx.zx.&h 2D Ep Zy .j.7r.CT 84 `+.(*.Ek J8 J8 J8 J8 J8 I8 Mf I8 J8 J8 '0 /#.jL >x Of Nf Nf TB #r ;h 2!.Ax.Bx.Bx.T2.~9.ag ;6.=r.Cx.Dx.Ex.Fx.Gx.Hx.Ix.r3 Ws Ws 1! />.^u B' Jx.G ^ > ; ; > > > > > > > > > > > > > > > > > > > > > > > > > ) -. p+ Dg Kx.0$ 4@ ,o 'o V+ d+ y ", "%+ %+ %+ Q. 1~ 2~ 3~ Lx.m@ Mx.q* X!.n 1+ ) > 7+ 7+ s@ (Q )C |^.~U N%.J~.Nx.Of Of Nf J8 J8 J8 '0 >0 _d ka J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Of Ws PM ja J8 J8 J8 J8 ka >x Of _%.WQ &$.ij.Ox..<.Ab.;4 Px.|h Qx.{].^..Rx.4e.u&.NN 3h.@<.oY t8.A7 !&.!&.Ui.Sx.bf.r.RI OG zR jY }, lL As 3 .D3.Tx.Ux.47.I8 ]O '0 ne $_.L+.AU 8H ;0 Ac.Vx.Tn.Wl ]O 77 dj aL m9.is.Wx.Xx.%K Eh.Yx..z Zx.2;.`x.!] Z/ I5. y..y.+y.bo.@y.#y.Ip.>4.u_.em.0d 6S $y.)c.%y.&y.{&.wf.*y.=y.-y.;y.>y.xg &e ,y.OT <; 'y.)y.!y.~y.Ak.0/.{y.Jk i/.:: Ip {n Wl I8 &h ]y.^y./y.~&.5l /D b' 9D tN (y.&4._y._~.Hb ]u nK 9q ,6 :y.ib.qW K7 }[.@4.Wa.;q.(v 16 .@t.0y.Dz Dz p;.`y R~ ay.($.,$ 6= by.ja Nf J8 J8 J8 6A ]K cv sv ]n dj I8 j>.@o.(#.cy.pa.>x -h 1G N1 rt -3 -3 E; ow v0 X< W1 &n dy.ey.fy.gy.hy.iy.jy.=^.Mb PM F1 -$ Ob !- ky.S ^ , _ > > > > > > > > > > > > > > > > > > > > > > > > > > ) +6 5+ %p.jf u# 4@ v+ w+ V+ d+ y ", "9@ 9@ 9@ 7. 1~ 2~ 3~ Lx.f@ n9 S 2+ -. 2 E R S 7+ s@ b< lU ly.l6.N%.J~.Pj Nf Nf J8 J8 J8 Nf Nf '0 ~n J8 J8 Nf Nf J8 J8 J8 J8 Nf Nf J8 J8 Nf Of Of Of ja ja I8 Nf J8 J8 J8 '0 jL ET rt _k my.ny.oy.py.*b.;-.3W qy.ry.sy.P| ty.uy.vy.wy.xy.yy.o .zy.mG Yk./c.iF :,.KB ZA ZA Ef.Ay.By.ph.7r =r E#.2u.7_.Cy.Dy.Tn.-h V7.k|.>0 *&.0V 6^.f' Ey.Fy.Gy.>~.&O Ha yr je aL 1B b2.Hy.%K 0a ^(.Iy.Jy.Ky.J^.]m.!d.:6.K4 Ly.W= W*.My.YD jw ju.a*.T|.Ny.Oy.x{ k( %b.oy #5 Py.Lc.Qy.Ry.Sy.Ty.Uy.Vy.sf.A7 :; Wy.Xy.Yy.Zy.`y. z..z.Na +z.'%.:f @z.#z.wp.ns ,$ /,.-k.$z.%z.&z.*z.d7 ]d.z.4$.,d Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 [d Mf >h Mf Y=.86 Si el {k ,z.}/.$/.pv >5 eH 'z.)z.!z.~z.!0 )6.83 ]| cl C#.{z.k).]z.^z.P,./z.gP U(.k} T> la fe J8 J8 J8 fj '0 '0 J8 J8 J8 J8 J8 J8 77 77 DT ]Z (z._z.:z. > > > > > > > > > > > > > > > > > > > > > > > > > ) h. B. qz..a Z@ ~+ a+ w+ V+ d+ y ", "6. 6. 6. 7. 1~ 2~ 3~ +a m. c. - rz.R 2 n ;. F. S J+ 1a.sz.Zo.d_ tz.Qk.@A J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 Of Of Of Of J8 J8 Nf Of J8 J8 J8 '0 uz. 7.],.r2 B| vz.wz.xz..Q H! yz.zz.gj.Az.Bz.Cz.~< Kz Dz.Ez.lv.Mp.nN b[ Fz.dz Gz.-) Hz.v(.]0.Iz.Jz.Kz.qY =G Lz.z6 Jv Mz.Nz.Oz.[$.=h r0.Pz.~9.Qs Gb cg cn.Qz.Rz.Sz.Tz.nR z: ;_ N2 2 .nv Pj.Uz.gL Vz.D .`* [' Rf.|F t2 Vi sh.Wz.ex.Ra 7z.e=.Xz.Gd Yz.~< k2 Zz.`z. A..A. a.:T 6| s[ Sz +A.@A.#A.$A.%A.FG &A.GD ^z *A.=A.-A.;A.>A.,A.'A.)A.!A.~A.|k {A.s7.]A.]K #k @~.^A./A.(A.'[ _A.%7 :A.Ln w> Xy ps. W2.~) }A.t+.|A.1A.2A.~Y >h J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 cv 3< (9 ac +c.V{.R+.[: mk.^1.d^.h] E( 4' 3A.#! 4A.3' ,O kL ^C Fu.X6.(u 5A.],.]-.kA >~.6A.{(.Hy.]f Gp DE I8 I8 I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fe fe H1 :y.F~ ko.7A.8A.^1 '[ t] Rg _i 9A.%4 w} 0A.aA.bA.zg cA.dA.q1 eA.fA.o .8j.gA.tA hA.iA.jA.kA.b).lA.qr.R> D8 mA.^&.Qn Xn 77 77 >h >h ns $l Pd .x.%! S0 -&.fi.>d t].+1.nA.P,.oA.pA.<{.^..qA.Yt.rA.$i T).tn.Yj.sA.tA.uA.vA.&w.fX wA.!2.S% }d ]l #y Y8 5M 5# xA.1 G G G > > > > > > > > > > > > > > > > > > > > > > > > > > > > >. yA.W&.!+ ~+ a+ w+ V+ d+ y ", "%+ %+ `@ 7. %& 2~ 3~ +a m. c. - Q o G | o F. FM zA.AA.BA.xe.]/.CA.S` bg.Of J8 J8 J8 J8 J8 Nf Nf Of Of I8 Ek Mb ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 Kb Y=.3' ,X lD X= DA.EA.Y; Q'.FA.GA.HA.IA.JA.KA.LA.MA.NA.OA.PA.QA.RA.SA.TA.1c UA.^!.:c Iq oK Bs.=v VA.G*.=O w& +k.+<.a>.7l.J( h6 ]O vB p~.WA.XA.kQ YA.Z~.ZA.`A. B..B.rl.gF W$ ,d ]K ]Z +B.Dd AF @B..g.#B.$B..f.j} wi.]I %B.&B.A,.LB *B.=B.;).+r -B.Q6 ;B.>B.,B.L4.'B.)B.Q'.!B.z{ ~B.{B.]B.^B./B.t[ VZ (B._B.:B.z.4$.yr 9L MM -Y ka J8 J8 J8 J8 J8 J8 I8 fe (E |] ^{ Q- Lg.y{.S| ^v R[.kB.cj.lB.mB.`8.14.tg Qp.}' ^J S= q! $2 a).`a ZF nB.'w +b o|.6Z oB.pB.qB.rB.je 4$.Ep 2!.Y@.;h I8 #r '0 -Y ~n fj J8 J8 -h ;h h6 ]p.m_ Se.sB.tB.Bo.uB.IN vB.wB.xB.yB.zB.rJ AB.0v BB.CB.DB.EB.FB.GB.HB.IB.JB.Q, KB.LB.MB.NB.S/.Bd !W OB.Q].PB.QB.Uw dg *$..l.RB.ur.i].tV SB.TB.UB.VB.WB.rH 86 _[. p;.*_ .C.M# +C.T { > > > > > > > > > > > > > > > > > > > > > > > > > > > > G ,# yj.5; ~+ v+ b+ u* d+ |~ ", "y# y# $+ Q& 1~ 2~ 3~ +a H. l..d. 0 ' ' , , S *, zA.sp.lU Fw 6j.aV _*.U6.|(.sH sH 4o F- J8 Nf NM NM $J #u Ws Mb ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 #r 84 cQ 3' l;.@C.#C.$C.%C.&C.*C.=C.-C.;C.>C.,C.'C.)C.!C.0P ~C.{C.]C.^C./C.(C._C.:C..a/ uC.vC.bz ny.wC.xC.yC.P* zC.AC.GK >2.@v @| R1.[k ]u ps j ^u BC.:1.o5.jj Iq 5x.,z.4$._*.fz MM _d ja F- 1G J8 J8 J8 Nf I8 la G[ q_ CC.DC.EC.FC.GC.HC.tf.IC.JC.bk <3 4| KC.5( nu./r s2 R>.U'.Lt.@J D8 LC.Dw A= .c.Cg.|6 MC.NC.OC.PC.I8 yL 5U z6 0V H1 sv sv i[ gj Xl 7i J8 6A DE Hp *W QC.RC.SC.wx TC.|^.:U 7K UC.VC.WC.XC.+e YC.ZC.`C.;;. D..D.+D.mH @D.Fy )A.Je.#D.D2 $D.%D.&D.;i.aI 3' .E *D.vj Z= NI =D.w3 -D.:' #J ^C '#.v|.;D.>D.,D.pR Bv.3' K^./p nJ P) N< 'D. #.fA )D.!D.~D.}2.{D.1> ]D.i} *%.su 73 L#.,d fe Mf ne I8 DU *v m] k6 cc vl.ep ^D.q+ { > > > > > > > > > > > > > > > > > > > > > > > ^ > ) ) H G ;i /D. + T+ v+ b+ u* d+ |~ ", "y# y# $+ 0@ v* 6- 4b EM H. (D.; > ^ , , , S FM _D.g .:D.3c XB. =r =r DU M@ jD.Dr.kD.FK '$ L_.'- lD.lC.mD.nD.oD.pD.W-.qD.8l.k).nh.A0 r` ia 7i k* |V D'..2W %z `b zD.AD.BD.CD.DD.ED.FD.3B.=o Y<.GD.HD.ID.JD.20 Fw.KD.LD.Wa MD.]y ND.OD.r2 X) PD.*h >_ #f .6.P* P- S#./E QD.RD.SD./e TD.UD.VD.WD.XD.YD.ZD.`D. E..E.kk.Kq.=y I> +E.e+.[[ a! Rd @E.LG P> J~ 17.t8.#E.4$.+G S5 ka >0 Vl 67 Ul J8 Nf Nf Nf I8 ~d ,5 $E.%E.&E.*E.=E.-E.P* ;E.Ay.>E.,E.ab 'E.s}.)E.tA !E.~E.w{ {E.]E.QI UO ^E./E.H~ Aw.>j.(E._E.{v :E. > > > > > > > > > > > > > > > > > > > > ^ ^ ^ -. -. 2@ G yE.zE.AE.T+ v+ b+ u* d+ m) ", "%+ %+ $+ y P. ^2 4b +a {! 5b > > > > > > 7+ ]# k& CM BE.CE.DE.EE.8_.na.ne >` 5x FE.GE.7o NM -Y g` |[ >c 67 J8 J8 J8 J8 J8 J8 J8 Nf Of Of Of Of Of Of Of Nf J8 J8 J8 J8 '0 ~Y 6M 2' l;.@C.MB HE.IE.JE.KE.KE.LE.ME.ME.NE.KE.OE.OE.PE.QE.RE.RE.QE.3D.CD.SE.TE.UE.VE.WE.XE.NL Y8 fe DE cQ iH l;.#:.YE.Zi M{.C: /3 ZE.`E. F..F.+F.jj [< r2 DF I~ /Y J> HI Mf >h J8 rs =N .&..a.F.,F.'F.v_ dx.)F.!F.~F.{F.&0 8y.c` ]F.)$ ^F.

    c >c Vl J8 Of Of Nf I8 Gp 59 9C.WP 0F.aF.bF.cF.My.dF.eF.3F.fF.gF.%>.'A.Kk hF.iF.yq.jF.S8.kF.`C lF.)D./F.mF.l&.nF.oF.$'.A0 pF.qF.$@.rF.sF.tF.uF.vF.T+.bQ wF.xF.Cb.$y NM 77 dQ 0w yF.zF.AF.BF.CF.I^.DF.EF.FF.%A.GF.6G HF.IF.v_ JF.KF.b5.LF.#s.kE.MF.NF.OF.#y.6P PF.QF.`k l RF.=I `E r3 ]G d/.SF.Jk p3 UB Pc Kk TF.UF.7'.n+.K;.P5.Mn .! :^.U4.q2 -).VF.M: WF.XF.YF.3| ZF.`F.YQ hv Oe Ou 7m %3 ej fe >h Mf ja > > > > > > > > > > > > > > > > > _ , G E E | S .G.+G.@G.[5 U+ w+ V+ d+ y ", "6. #. `@ y O. ^2 4b -K Lq ^X > > > > > > 7+ _= l| #G.$G.eW %G.&u &G.*G._m.1G [= 0f.$J Of Of '0 ka F- F- Nf Of J8 J8 J8 J8 J8 ja Ek Lb ja J8 J8 J8 Lb Lb ja J8 J8 ka ~n (d ~Y 6M Kd Y) Ht.=G.-G.;G.>G.,G.'G.)G.!G.~G.{G.]G.^G.^G./G.(G._G.:G..Rc.cG.u2 9t.U= _u.Pz <-.dG.eG.K@.fG.+B gG.hG.iG.1&.3' CD Cf.Q* jG.kG.'/.lG.mG.nG.4D.oG.QE.pG.qG.]E.rG.sG.tG.uG.Gz.3g.S..Xw 73 d! !d $h Z9.vG.wG.}!.,s &N 1V ni xG.yG.l_ +x G8.zG.AG.BG.KP ]&.+2 =0 CG.DG.zA ]L jY DF EG.vy.JP FG.GG.HG.IG.JG.np.9{ w&.KG.LG.EF.MG.F{.g] +*.ji.le Of Nf J8 ]O ]O '0 J8 J8 J8 J8 '0 ~d ,5 NG.OG.PG.QG.*%.Q..TQ x: /b.8r.~k 8r.RG.SG.SG.TG.UG.$[ ck Fh 1J *S dr wD !F VG.WG.(v ZU O4 V8.>r *G )w XG.YG.)A ZG.o@.`G. H..H.+H.+;.cO H.,H.'H.)H.!H.~H.qJ {H.w9 J ]H.^H.e,.Kt./H.=% #@.$A W;.Fm lr x<.fl (H.U< {0.8] n~ -w _H.:H.,/. > > > > > > > > > > > > > > > > > _ , ' | *, N mp 4H.5H.6H.[v 5@ 6@ 7@ d+ y ", "O-.O-.Q. 0@ P. 6- 3~ ui.{! @a > > > > > > 7+ _= 7H.8H.9H.m6.0H.nw c!.aH.bH.MM ej Vl Of Of Nf J8 J8 J8 J8 Nf $J Nf ka !n [d J8 ja Ek Mb ja J8 J8 J8 Mb Mb MM [d J8 ka ~n (d 1K 3P Qn Zj.cH.xh dH.eH.fH.gH.hH.iH.:h b. jH.kH.lH.mH.nH.oH.W, W, pH.qH.qH.rH.sH.tH.uH.vH.wH.ah.hH -h Mf *y xH.{].ap vv.=O ]K z; _, yH.zH.AH.BH.CH.DH.QC.EH.FH.GH.RD +B.H@ RL mc.wL lt.+Z e=.HH.Gx cp.A,.IH.vx R7.2C JH.AQ KH.L3.wi.LH.MH.1h YQ 8y.Ly.EH.Kg.NH.Up.-@.OH.7Y PH.QH.RH.SH.TH.Ds UH.vG mc Go.^6 )B _] VH.^#.BB =h DE 5U 3'.Ad <] @y Jb M#.WH.XH._U QI YH.rE k .Qi.ZH.`H.BQ E' k* ~Y If )n sH Y4 :' ^&.Iq.>E.:< I..I.+I.@I.CG #I.$I.%I.&I.6( *I.=I.!D ,$ le 5P Nf J8 J8 ~n {n '0 J8 ka ka F- ja ~d a3 u_.-I.;I.B/ #b >I.,I.##.GE.Y*.Jb Jb oe Ws.##.##.8h.6o Lf ]n M^.Z).[[ jX X8 'I.)I.!I.T@.J8 ge 67 Q4 Fb ~I.{I.1u.3A ]I.^I./I.%u.(I._I.{i.hb.1= )5 :I. 06 ]/ CZ GX k).cI.Aw.Aw.9l.dI.eI.fI.gI.`D !m.!f #D a3 yL )n fe ja 9L 9L S5 J8 J8 J8 J8 J8 J8 J8 Nf #r I8 dQ wc 93 3/ hI.iI.*} T8 ^ o G T T [ > > > > > > > > > > > > > > > > > > _ , ' ' ' ' mp jI.kI.lI.[v Iw 6@ 7@ d+ m) ", "pT pT jS P. v. 6- 3~ ;j.-& ;& > > > > > > l+ d@ t4 mI.nI.oI.xn tH >x pI.t7.ja F- J8 Nf Nf J8 J8 J8 J8 F- Vl Vl I8 ~n ~n fj Nf Nf ja :d J8 J8 J8 J8 :d MM >0 ~n J8 J8 ka :%.DE HI aI 6A.qI.rI.sI.tI.JB x(.uI.vI.wI.dE xI.(M qw.^v.yI.zI.AI.*r.BI.CI.DI.EI.$} FI.GI.HI.II.@|.Qf $J |I H5.JI.KI.Jd LI.Y@./$.P4 MI.NI.OI.PI.BH.QI.RI.SI.-* Y* TI.UI.]!.76 t}.VI._O WI.S~ /k l( k' XI.YI.bi.ZI.`I. J..J.+J.ye @J.#J.{3 NI >I Mg.7f $J. '.*0 Eh.!T %J.&J.u4.A! *J.=J.-J.;J.>J.,J.'J.VH -8. *.1d./%.H'.)J.|p.Xl DE a3 9} '0.q;.F#.!J.47.|/.U~.Hk.Wa ~J.{J.]J.-x.^J./J.}l K'.db.Jb (J.Ep CT fe DT :W #E._J.:J.P- M+.0 S5 9L Ci.[6 1J.2J.3J.4J.5J.6J.7J.]Y ,I.8J.9J.)r.U6.~l.5w.h<.*O _O c! M} hI af b3 H Im 2J 0J.oG aJ.!d A& US =k .g.bJ.cJ.ff.E{.dJ.eJ.0: ME fJ.gJ.hJ.3P Ud kC s6.iJ.'(.Ba f9 jJ.Cd eq.9 rJ.sJ.tJ.uJ.s0.vJ.wJ.x{ xJ.yJ.I~.zJ.=h Hp K..mW =O Jf ~` 6# ]| E; tq cl :o.AJ.BJ.iD.CJ./' DJ.2|.)6.53 dw.`].77 1K >A `+.1P hH #u I8 J8 J8 J8 Nf Nf J8 F- Vl ej eQ tD xP ;b 2! Qo B@ *} EJ.n+ W. ' | | H > > > > > > > > > > > > > > > > > > > , ' ' , , o io b:.]P 4@ v# w# x# d+ |~ ", "Lr.Lr.d+ a@ _% T_ FJ.D^ 'e ;& > > > > > > l+ d@ o*.K@.GJ.7} Cb ^s ha je J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- 67 >c ]O _d _d :%.Of Of Nf J8 J8 J8 J8 J8 J8 [d ~n _d ka J8 J8 #r ;h HJ.IJ.sE.JJ.lz.KJ.%y.LJ.MJ.NJ.V[ OJ.|H 6'.PJ.>= j0 QJ.iw w-.w-.M, z5 v@.Up.eB RJ.Kp w_ XV dh mc.G- yc.ix SJ.TJ.An.i(.T5 Td UJ.VJ.WJ.XJ.YJ.ZJ.`J.fo.$~ K..K.+K.W..<< H> F- VI.rs Jb EJ KW K.Zf ,K.'K.)K.!K.~K.{K.]K.^K./K.(K.0w.Do._K.:K. Cs 1K.VI rq @v 2K.3K.Ua.K=.*% Ci.Of Of Of Nf I8 ia Ib o;.K..b! !{ ^y @/ DB Zj.Qx.g6.4K.5K.,u T> G[ fe ;h J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y {n 8Q f# Zy a3 6K.7K.8K.9K.0K.aK.:W gQ .*.-|.bK.iv.cK.z;.|B BT !f L- Pb n! B7 dK.eK.O;.;9 'X fK.s|.gK.Ww 5i hK.iK.jK.!D.=I kK.lK.t;.}6 -0 {k mK.nK.oK.Pd )f pK.qK.rK.a7.Hi X8 MX 49 rq rq 5# 5# oR ([.wS [E `7 `7 h ;h DE DE la 1K ~d &G AK.>A Ib -h -h 2-.Cp >x I8 J8 :d 3o Wh.ja J8 J8 J8 J8 J8 Nf Of J8 Ul >c 9h '6 M{ A1 I1 lm Ul.BK.+{ L& j) {% ' ' o ^ > > > > > > > > > > > > > > > > > > > ^ ' > > > H W$.yI ^j t* v+ b+ u* d+ |~ ", "Vc.Vc.Gg Q& 8. w. CK.[% r) }% > > > , ' > ^- ^- Sk DK.Ze.V(.<' 3P me xL #r >c fz MM -Y J8 J8 J8 J8 Nf Nf F- F- J8 I8 S5 Vl F- J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf ka J8 J8 J8 J8 77 ]K 7H u8.Wm kk.C..up.EK.c6.cT oE.FK.D_.GK.HK.z,.W~ c%.IK.Ay.JK.mo.8j.:f.5> 7` KK.08.LK.MK.1h.NK.} .4M ^K OK.PK.QK.2g ^C 6: D..RK.SK.TK.UK.VK.WK.XK.R! YK.N!.XG 7l ZK.^w +y &O xL nr.`K.MO Z/ qf yk 'K.6t. L..L.+L.@L.#L.$L.n} %L.&L.=L O; aV -D.E; k6 EJ F> @J cx.*L.BF (6 :I.+4 =L.-L.;L.>L.,L.JK be y$.^d me x8.n;.)0. ;.4l.Cz 1,.A= sN Kf vc Si 8c pX D0 Ek (*.|[ ^O 4M 9].e).jg 6i uk.pW Nf J8 J8 J8 ka 77 ,r 4$.77 8H L+.&y 5M 8).'L.[F.)L.[n dv T4 sH ia g# 67 ]O ~n fj J8 J8 J8 J8 J8 ka ka F- #u K..'8 ^1.!L.~L.{L.;p ]L.4z.^L./T /L.(L.le._L.9| 8K n$.:L.aa %/.^I #F 9A -;.tb.%z.^* x Of J8 J8 J8 Nf '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- @r Ga 8Q K'. w @X H- Qo kL.1 n+ k. E. G 1@ E [ > > > > > > > > > > > > > > > > > > > > > > ( 9 K =} X%.!+ ~+ a+ b+ u* d+ 0@ ", "$+ $+ %+ Q. 8. w. 0. lL.H. c@ > > ^ , ' _ Lq j@ ~@ Xf.!1 Eb a3 yL 5P me #r ej 9L MM _d ja :d 1G J8 Of Of Nf J8 J8 F- Vl >c F- J8 J8 J8 F- F- J8 J8 Nf Of Nf J8 ja ja J8 J8 '0 sv G1 Ud pw 8: ^0.mL.c:.nL.oL.},.mj.0&.pL.qL.rL.`4.,3.@=.Y-.ln.dB.V{.Y#.sL.tL.01.uL.m~.!).0K &h ne 7H HR d4.X#.vL.!| [w )S wL.xL.'C.yL.zL.AL.BL.CL.DL.`0.EL.X7 :J.3q _D v0 qv Kb na.CB ],.>i.{0 p3 GB I- Hs.[m.FL.!J.om.2,.d!.]d ,r je >h 7i 77 )n >x Of sH ]| 2' X) >d X) &d GL.>a Tf L|.HL.XH IL.pz oe Pf 4&.g@.4U k9.JL..y iH 1,.vO ac Q} SI ,n.HR ^y H1 ia Qk.Qk.#h 3< Ri !W KL.1P Bs _d J8 J8 J8 J8 J8 Nf Of Of '0 '0 ha )n ]d U+.cf.LL.ML.r6.NL.7o 77 ja Vl ej ]O -Y fj J8 J8 J8 J8 J8 J8 J8 J8 I8 ~d /%.9].OL.PL.Lf.a) h9.#O QL.RL.RL.SL.#D.MY TL.>b.>b.G .bb.N: {7.cF {7.br.tb.UL.VL.fo KC.&L G7 WL.4j.XL.YL.ZL.Z) `L.JM zx MO T,. M..M.+M.m( .c.@M.#M.%4 4L.Mv.W= $M.Iq ;6.%M.Ef.^7.&M.2^ Fz.Y#.Um 4| *M.=M.s'.]' rN -M.;M.b_.|B >,.M+.7o.>M.,M.'M.)M.!M.~M.{M.C% i! '0 J8 ka ~n -Y NM Nf J8 J8 Nf Nf Nf J8 J8 J8 J8 ka J8 F- Vl ej #r Of Nf !n J8 J8 Nf $J J8 J8 J8 J8 J8 J8 J8 J8 J8 #r ]n $r $J y3.O= I2.]M.^M./M.: /h _- W. H E 2 [ > > > > > > > > > > > > > > > > > > > > > > ; 9 6+ =} W&.!+ ~+ v+ b+ V+ d+ y ", "9@ 9@ 9@ 7. 1~ (M._M.:M.f@ ^X > > > ^ , _ j@ l{.0 s_.s_.:d J8 Of Of Nf J8 J8 J8 F- 67 J8 J8 J8 J8 67 67 F- J8 Nf Nf Nf J8 s_.s_.ja J8 J8 J8 4o sv (*.}M.|M._&.ML :! c' ;~.iA p] _, ZL 1M.2M.[, |D zc.zc.zc.{k zt.da oL.0H 3M.4M.5M.&% w;.jL vL 6M.)c.a%.L6.<*.7M.8M.9M.0M.aM.bM.zL.cM.dM.eM.^1 aU CD dO ,~.$S y.fM.gM.y8.=%.3 .h^.#C =H hM.:: rv 0} iM.jM.kM.g<.lM.2D zx.Vt Y@. @.j<. l.`l.:i.^d ,r 4o lm Ob Iv 3!.8L.mM.UM Xh (t.nM.M~.oM.OM Y*.rs 8h.@z Z].3=.pM.bI r_ %G.0).(U qM.rM.ro aF mz sv #u '$ S` E'.h6 Si Z=.G' o'.&=._d ka J8 J8 J8 Nf Of Of Of NM os ^d ,r 1D h<.$r sM.tM.:v.SH *h fe F- F- ]n #r '0 fj J8 J8 J8 J8 J8 J8 F- Vl 9L 3=. v.Uk.mk.uM.wJ.vM.Z) Or.}F p=.+r.wM.xM.yM.zM.mD Pd.Sq.7' LO P5.(-.J;.(%.= .zh.Wf.AM.q=.BM.&E CM.(E.DM.EM.FM.KI P:.~7.GM.z> HM.IM.JM.KM.-,.LM.nE.MM.N).NM.lE za.Ef.j} OM.3a.PM.mE.QM.[x H7.RM.SM.TM.><.&f UM.hs.mo.VM.Q0.^q.]n.Q- WM.XM.vz.YM.ZM.`M.{n. N..N.+N.D0 Mf I8 J8 '0 fj Nf J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 F- F- Nf '0 >0 ~n ka F- ]n 7o F- J8 J8 J8 J8 J8 J8 J8 Nf Nf #r #r Nf dQ @N.#N.$N.%N.&N.`( lk /5 %# > [ [ ) > > > > > > > > > > > > > > > > > > > > > > > ; K Q*.R*.^j ~+ a+ w+ V+ d+ y ", "6. 6. 6. 7. 1~ ;} 3~ EM {! 5b > > > > > 1 fp *N.=N.Mr -N.`f.Y[ $J NM NM J8 J8 J8 J8 F- bh Mb MM J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 Mb Mb ja J8 J8 J8 J8 ia P+..k .b ,@.=b ;N.>N.EU -h je je ,h J~.mA la ~Y DE o;.o;.m[.>O _9 ,s ih.,N.'N.)N.FE V7.OM $J K1 Sf !N.Qb w3 !Y ~N.z% {N.]N.^N./N./z x(.(N.P^.Ch.1y.({ =k.H~ X} zb._N.:N.6].($.@k c fz MM _d NM Of Of Of $J wL RL ;_ Ww P= kL 1N.&t.2N.Z` /s 3N.4N.Wl ps &O dj t}.Jf na.5N.B6.6N.WE !] 7N.8N.9N.0N.4G Fa }d F- 67 m/ la 3< }6 Nd ^| >0 &=._d ka J8 J8 J8 Of Of Of Of Of Of Of Of 5P Pf Vl H@ aN.,x.6: ~d fe Nf Nf Of F- F- J8 J8 J8 J8 J8 J8 J8 F- ej f# /#._d Iv jP BC.Z-.bN.a: eD GI $/.>d 40.-D.o4 kc `* pn.X) cN..hN.iN.(A.vz jN.kN.'[.lN.f9.mN.nN.oN.pN.nz.qN. 2 :R WF.rN.sN.bo tN.YP uN.vN.ss.wN.*Q se b) xN.,1.yN.zN.AN.BN.K^.Fb Pw.s( )D fe 77 J8 J8 F- J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 !n ~n _d ka F- ]n $r F- J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 J8 8H [:.w,.CN.DN.EN.3{ f, mk H. _ > > > > > > > > > > ; ) > > > > > > > > > > > > ; ; > G s* P& u+ t* v+ w+ V+ R=.$+ ", "W+ W+ 6. Q& P. 6- 4b EM {! 5b > > > > > n& 5- 7s n, J<.]n.!).e!.qs NM '0 J8 J8 J8 Nf Of ha I8 Nf J8 ej ej F- J8 J8 J8 J8 J8 Nf Nf Nf J8 ]O ]O '0 J8 J8 J8 Nf Of ha I8 Nf J8 ~n ~n fj I8 #h D4 (&.FN.uv.I~.cD la.:C ha os )n 7i T5 ke ]d Fk V-.Z*.sy ck _' 0E E' GN.HN.IN.Hr H- Ob q3 2 .96 S> Iq.JN.KN.LN.MN.NN.ON.PN.QN.S#.RN.WM.TP hE JY -H.bk P* UL.SN.=k !O :8.`b.`9.TN.>J./..^9.]K s'.*%.Km.H8 ]d Of Nf J8 F- F- J8 J8 J8 J8 J8 F- ej m/ hH Lf DE DT :f ph.UN.VN.WN.DE XN.,0 &O dj YN.ZN.`N.{p. O..O.+O.;/ @O.#O.Ah $O.%O.[s.&O.Y$ 7%.F- F- S5 la '8 cO ac !0 >0 &=._d ka J8 J8 J8 J8 Nf Of Of Nf Nf Nf Of _~.N2 _*.Oe pu.]q.Ri DE fe Nf Nf Of Ws PM :d J8 Nf Nf Nf J8 Nf Nf #r Vl Mf 1G 'G Lx qa.5x.=L } .g' ;b *! H1 #y r3 )w %u [p 83 3< V4 *O.1i.LV pX vB _$.=O.-O.fA [p Qs nw ;O.>O.}y.b' +b RD << }<.x} yF O/ l; ,O.w{ +( 'O.)O.TF.EG.!O.~O.{O.:<.nw a| I; l~.:k ]O.KM._6.^O./O.Uj.(O../ oJ _O.W9.E~ #| 4_ LP re =x :O.c >c Vl F- J8 J8 Nf Of Of Nf Nf J8 J8 J8 J8 J8 J8 ns ;G

    > ^ ' > _ , ^ 9 N3.6W 1O.[ 0 ^ > > > > > > > > > / / ( G s* P& u+ t* v+ M-.2O.y $+ ", "6. 6. 9@ 0@ O. ^2 4b +a {! 5b > > > ^ > > 1% aR To e*.Va.=v.##.om.Of Nf J8 J8 J8 Nf Of Of Of Nf J8 fz fz F- J8 J8 Nf J8 J8 Nf Nf J8 J8 ~n {n '0 J8 J8 J8 Nf Of Of Of Nf J8 ~n _d '0 #r la `y >~.KH z6 ia f* /=.MM '0 pW NM #r #r #r Of -Y Fk -h Mu 7: X) *E _, F~ I;.zx `7 4i.MP I_ 0L a)./G 4_.3O.AN 4O.5O.t' 6O.7O.8O.1x Jd.9O.0O.rG.aO.$9.bO.#P m_.QJ._D 4M cO.dO.{6.!8.=r.eO.q;.]K U{.fO.Pi *- Qf $J Nf J8 J8 Nf J8 J8 J8 J8 J8 F- fz fz Vl J8 fe ~).O4 `-.gO.hO.iO.Gp Ib $J 8h.jO.OO kO.lO.mO.nO.oO.pO.qO.rO.%^ CQ (~.sO.tO.A5.*$.fe '0 [d '0 la '8 @/ KH !0 ]O Fk -Y J8 J8 J8 J8 J8 J8 Nf Of J8 J8 Nf Of Of 84 e^.!{ Bg.uO.LC DE fe Nf Nf Of Ws Mb ja J8 Of Nf J8 J8 Nf Of Nf J8 I8 sv 'G wD |F (d.3i.lM.4&.M^.4o Mf Mf #u hH Ha hH dj )n J8 en.>( vO.Bz _!.wO.xO.R8.&u.rs.pP u( yO.zO.AO.2o.2!.+b vO sI ]L.BO.v_.CO.DO.Dr.EO.`1 FO.GO.'k.HO.IO.JO.KO.77 (d `k.<8.#y ,n.'$.Yg 76 Ta.LO.^t Y[ Kv M^.G1 qv Y4 !0 >'.5H ap S> :l./,.*! MO.fQ NO.OO.cO 0r.,x ha ja s_.Lb ja J8 ka ka F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >c fz ja [d J8 Nf Nf Of ha I8 J8 J8 ka ka F- F- F- 6A p8.e@.;2.H_ PO.tm.Y' n+ mp ' > > , ' ; ^ N +] QO.A7.RO.Ia.(5 SO.X$.B{ H > ^ > > > > ; / / ; G s* P& u+ t* v+ 'o TO.$+ $+ ", " O O %+ y O. ^2 4b EM {! 5b > > ^ ^ ^ ^ K,.UO.VO.WO.XO.u_.0 -Y -Y NM Vl 67 F- Nf pW ke ,d M} O) u( (f )6.Iq Oi.%O Ns.YO.ZO.]Z ss bN.`O. P..P.+P.@P.#P.$P.m3 %P.qf 9I.zw &P.=H N8 zl ef Q3.*P.u<.=P.NN -P.;P.z- >P.,P.'P.)P.!P.DT U{.l;.6_ id =$.$r $J Nf Nf Nf Nf J8 J8 J8 J8 J8 MM MM ka J8 77 AU ~P.Vx.{P.]P.^P.Vt ,r le /P.(P._P.:P.x ^n >h 77 Lf yr Qf Rt.*O ha W> UT dj.ze s0 4P.;<.[z.5P.[W z= S+.5_.6P.7P.8P.9P.-3 gB.0P.aP.]O.5i.bP.]k cP.dP.eP.j3.z!.SK fP.gP.hP.)r DE m7.iP.jP.{K (d.)B M) 7Q HJ..#.Nf mW kP.mW CT ;h fe ns 6M Dz yc.D#.=|./%.0L *O 5X v3 MP }6 ;~.Cp Mf ka ja ]O Nf ne ~n >0 |[ 67 F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja ]O >0 fj J8 J8 Nf Nf ia Ek ja J8 ~n >0 S5 ej #r Of d3.L^.e7.;< > , ^ 9 K S O8.mP.2( nP.A7.T8 oP.pP.sT B{ ^ ^ , > > > ; ( ; ; G s* P& u+ t* v+ 'o Fg Gg $+ ", "$+ $+ $+ y P. ^2 4b +a {! 5b > > > , ' ]# v@ qP.rP.sP.3t tP. l.{d NM Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y _d ~n J8 Of Of Nf F- J8 J8 J8 J8 J8 J8 Nf Of F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 la '8 bO `p {9 o] oe _~.pW _d _d >0 67 >c 67 J8 Nf Pf Kf 6! 4C |d 3i.>5 jH &o SI @~.kn.uP.vP.i.[' D;.D;.$r $J Of Of Of Nf J8 J8 J8 J8 J8 -Y _d fj J8 I8 ]l NP.h] no.OP.HZ ~l.oe tr.PP.QP.RP.SP.TP.UP.VP.WP.XP.YP.ZP.`P.ef Rb 5' <9 6A /d c!._d fj F- la '8 @/ KH jl I8 je Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ne J..Ib Y8 5| iF ;4.>A fe J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 '0 J8 (E rt %~.G~.)V rK Pf NM -Y _d ka J8 J8 J8 ]n &O ^d m[.B0 uK >E Od FB .! Mv _K Q.Cv ,! .Q.9I.XB.+Q.,].sH .@.xv @Q.#Q.!B $Q.%Q./z.<] 8L *x.B5 x:.f~.>^ nw 77 DE J8 ~n EU -h Ud )B &Q.(9 K..la )n >x 5P 5P NM '0 I8 I8 ha ^d ,r ~Y ~Y ~Y ]d 5P xL H#.y' l! C[ +{.Fk BB Nf Nf Of Of pW -Y {n S5 >c 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka _d _d _d -Y J8 J8 J8 J8 Mb Mb :d J8 -Y g` Ws -6 #r NM ha ns qv Y8 Z> M; 36.' ] ' > > > > 9 / =p.A{ *Q.=Q.-Q.;Q.>Q.,Q.'Q.tT )Q.> ^ ' > > > _ > > > G s* P& u+ t* v+ w+ V+ d+ y ", "$+ $+ $+ y P. ^2 4b +a H. c@ > > > > ; e@ 0> yt R}.!Q.pN.8g @A mA Lb ja J8 J8 J8 Nf Of J8 J8 J8 J8 ka ka J8 J8 J8 F- 67 7h ]O ~n fj J8 J8 J8 J8 F- >c fz MM -Y ka J8 J8 J8 J8 J8 J8 I8 CT Y8 h9 Nt.7_ Ha N2 J8 J8 ka ka J8 J8 J8 J8 J8 Nf ke Wl V8.f] zw.~Q.SE {Q.yG &d ]Q.=r.cB.^Q.^}./Q.(Q._Q.:Q.Z..m].[F.n8.0 _d J8 J8 '0 _d ka 4o 5o J8 pQ.qQ.XN.N; ;j Al.@/.C: ,h J8 J8 J8 J8 [d [d J8 >c 9L ]O _d ka J8 Nf NM Q,.!n b3 a6 el 7: /| fe )n '0 J8 ka J8 J8 J8 J8 '0 ,0 c!. o.3< #J Q) Xw F> Nd `/ #a.rQ.sQ.tQ.uQ.cz up.64.vQ.wQ.xQ.2C ju..l yQ.zQ.AQ.BQ.CQ.P#.DQ.`B.EQ.x=.Bp._f )n Gp J8 ~n EU -h Ud )B &Q.3' ~d -h I8 Of Of Of Of Nf F- @r $r qs /d ^d ji.^d /d 5P 4P ~` `7 OO.6: P4 _*.ia J8 J8 J8 J8 J8 ka ka F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja s_.3o _d #/.~n J8 J8 J8 J8 J8 ja ja J8 J8 ka ka F- Vl J8 I8 k9.ea.qv 3< I1 us.FQ.' < o 9 9 ( ^ F. GQ.HQ.IQ.JQ.KQ.LQ.MQ.NQ.OQ.PQ.QQ.m..> > > > >. ,. rU A^ > > G s* P& Pq T+ 5@ 6@ 7@ d+ y ", "$+ $+ $+ y P. ^2 4b RQ.Z. SQ.D. ) ) H G {! f .PF }H TQ.UQ.sg.AK.VQ.0 -Y fj J8 J8 J8 J8 F- >c 9L ]O _d ka J8 Nf J8 J8 J8 J8 Nf Ep Y8 h9 2H nn f# ,d J8 J8 J8 J8 J8 F- F- J8 J8 Nf ,x Cp ]-.|t X) `=.WQ.{Q.XQ.YQ.J[ ZQ.`Q. R.at .R.=A $K.nz.=N RP +R.kQ @R.#R.$R.%R.&R.*R.=R.-R.;R.jm.Xa.t8.>R.Ux.,R.'R.)R.CZ 6' !R.~R.4h.J{.($.{R.t;. fR.gR.L, hR.iR.br.+z wL (^.F- fj Qj Ib Ud B'.#C cl la fe J8 Nf Of Of Nf J8 F- @r $r $J Of NM NM ha #r ha $J [ .3/ *Y ck vc Hr Ha F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka F- |[ 3o Wh.k|.g` ka J8 J8 Nf J8 J8 J8 Nf J8 J8 J8 J8 J8 J8 J8 ka }Z ea.;0 I1 J] jR.U, ' ' o 9 / ; ^ kR.lR.mR.nR.oR.pR.qR.rR.sR.tR.uR.0:.l+ ; > > > , _~ Dn.a ) R H |6.vR. + wR.xR.yR.|5 d+ y ", "$+ $+ $+ y P. ^2 4b RQ.~# zR.,. dy &@ +@ M @n *} hi xq.d8.G>.AR.5r.BR. ($.gt.0 '0 Ul Ul F- Nf J8 J8 J8 J8 Nf Nf Nf Nf Nf )n 0f.Sd QR.RR.SR.sK.TR.UR.VR.WR.XR.YR.ZR.`R. S.1R..S.+S.@S.#S.yd.~O Qj >h ha Nf ne '0 '0 ha CT !s $S.Fl.K1 Lf $D }Z ~n -Y -Y Of Nf Nf #r wL 0f.F- ~n hl.#/.Ib N2 fc hQ %S.1' Ha 77 '0 -Y >0 |[ >c Ga ]n Vl F- ka fj J8 J8 Nf Nf BB =W Td m;.x~ M) I_ Kf #u J8 J8 J8 J8 J8 J8 J8 ne >0 >0 'D Y8 Sa #l.G; |#.HJ..x.%e `W &S.1&.(z.d*._l.,b.!* *S.4& =S.-S.;S.ir )6.>A B: >S.cp.dV sA.*c.IB.K$.sD.~` ~l.@r Nf Ib Ib U4 X~.7X F; la fe J8 J8 Nf Nf J8 J8 J8 #r #r #r Nf -Y >0 S5 ej S5 #r M^.n] iR [c rt yr Ha Vl F- Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf '0 >0 >0 67 |[ Ek !,.o}.yS ja J8 Nf Nf Nf Nf Nf Nf Nf J8 J8 J8 J8 J8 J8 ka [P _/.e7.3! ,S.'S.u@ ' ' ^ ( ; ; G [0 )S.!S.~S.{S.]S.^S.]S./S.(S._S.Nq ve K ; > > Q E0.|w.]! -. [ H :S.0 J8 Of Of Nf J8 J8 J8 J8 J8 {n As ,].83.5S.$J $J Of Of Of Of Of Of Of Nf J8 J8 J8 Nf Of J8 J8 J8 ja ;h JE 7n.c >c Ul J8 J8 77 77 Iv |t :y.UJ.A).D'.cj.6S.7S.8S.9S.D6.u8.UO 0S.aS.kn.zc.>r O} bS.;k.~(.cS.Jm./c.Y) /*.dS.G; Yi.eS.Rj.jl ]| fS.3F.V0.(g m{ gS.hS._F.!D L+.n( wv =L ;h ~M Mb :d J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Of Of me KE iS..g jS.Za kS.lS.TR.mS.nS.oS.pS.qS.rS.sS.tS.`R.uS.vS.wS.xS.yS.zS.hb.Of Nf J8 J8 J8 Nf os Ep !s X+.AS.Wd L} f* q}.g` :%.$J d!.$J NM BS.CS.~n.DS.ES.FS.Bi.GS.GS.HS.Nl.IS.JS.KS.+#.os OM _d ja ej Ga $r F- J8 J8 J8 J8 J8 J8 J8 I8 DU I1 ow t( (' d6 ~K _O J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 ]l I1 T+.+/ J( LS.Wl 5w.]Y Ep B<.MS.1< '(.na NS.OS.PS.s] Pm QS.RS.SS.UA Te TS.US.#g.gA.4L.VS.lo.kn.WS._J tK.H#.$J ,r ~Y M#.eS. =.u8.fe fe J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y g` Ws -6 Vl #r C F7 [c Gv =Y T5 => >c #r Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of pW -Y {n fz Vl '0 _d o}.Mb |[ J8 Nf Of Of Of Of Of Nf J8 J8 J8 J8 J8 F- I8 I8 ns HI *_ XS.~@ )+ ' S > > > > G YS.ZS.`S. T..T.+T.@T.+T.#T.$T.%T.&T.d$ l. 0 > > @{ -z ;z k7.D+ g7 H (j p^.@G.*T.!o.r3.7@ d+ y ", "$+ $+ $+ y O. ^2 4b & Z. o| 8+ |% |% _. 6+ l& |u =T.j} W2.-T.;T.>T.8i g` '0 F- 7o wL #r J8 J8 J8 J8 J8 J8 J8 J8 J8 S5 Vl F- d!.$r ps $r 7o Of _~._~.$J 7o 7o #r J8 J8 J8 J8 J8 J8 ja yS Mb Ga uH 5H c o7 8Q .#.Lm.Lm.ih.E-.&~.:^.,T.'T.)T.Dd !T.H7 ~T.yq.{T.]T.(s %G eQ .[.-).NH.^T./T.(T.W8 ZQ hP _T.0].:T.Q~.Jm /H.c ej $J Of Of Of Nf J8 J8 J8 Nf $J $r @r #r ns wc -$ Vm.MT.36.^ ^ > > > > N NT.OT.PT.QT.RT.ST.+T.TT.UT.VT.WT.&T.d$ l. 0 > > ^ E. wA >& O H G _Q Rm XT.T+ YT.ZT.qT d+ y ", "$+ $+ $+ 0@ v* 6- 3~ o) r) = / / / K :> $.TF `T.!x.8} u( ys 8i /#.~n !n F- 7o 7o #r J8 J8 J8 F- F- J8 J8 J8 J8 67 ej Ga $r 6o 6o $r ps 7o Of Of $J $r 7o #r J8 J8 J8 J8 J8 J8 ja yS eQ ps qb.5H c o7 Lf 6M Lm.4k.]~.F-.nv U..U.+U.@U.M8 JS.K{.:1.#U.$U.Y0 %U.&U.i=.RI *U.l' =U.13 -U.vJ Xw 9g ;U.U1.!K Ed.~-.>U.,l.,U.'U.3'.)U.!U. ! ~U.vc 3P 4h.9f.eT.6o wL J8 J8 J8 J8 '0 ~n -Y J8 J8 !O !O J8 '0 :%.{n NM ,r $r eq.<&.jf.{U.j* Ib ]U.^U./U.(U._U.:U.0 J8 J8 J8 Nf Of Of os Z*.5U.6U.7U.8U.9U.0U.0_.aU.bU.cU.dU.eU.fU.gU.hU.iU.jU.kU.lU.kU.mU.mU.nU.oU.pU.qU.rU.sU.tU.ha ej {n #/.~n sv sv [d ~n {n ka J8 J8 F- &O 0f.q` cZ 4' cl eH 77 I8 J8 J8 J8 $r $r $J Of Nf $J 4P 6A [9.uU.KZ Bz {9 4x d!.4P Of )n yr a! PJ vU.Iq.*P.wU.g5 xU.Ki.6[ ;_ yU.$r >x 4P zU.R: AU.#8.SD.>r.-0 /d Z*.:%.Of ]d Qj BU.(V CU.eo.fg r` I8 Mf J8 J8 ka ~n _d ka J8 J8 J8 J8 J8 J8 J8 Nf ^d )n $k j` y> 3.^+.L] -6 F- J8 J8 J8 J8 J8 Of I8 Ek Lb ja Nf J8 J8 J8 J8 J8 J8 Nf Of NM '0 g` g` [P F- >c ej #r Of $J $J Nf ka ka fj NM $J wL _O #r 8H mz H] $3 DU.EU.> ^ > > ; R ;. FU.GU.HU.IU.JU.KU.LU.MU.@T.NU.OU.PU.d$ 6+ K ; > > ^ o ' ' ^ G EV QU.5; t* 1w.2w.9>.d+ Gg ", "$+ $+ $+ Q& v. 2~ 3~ ;j.Z, (2 ( ( ^ N DV #^ RU.Mk SU.!1.f#.%2 ^n ,0 fj [d J8 $J $J #r J8 J8 F- Vl ]n I8 ~n fj J8 F- ]n 7o $J x8.m[.ga #g $r 7o $J $J $J $J Of Nf J8 J8 J8 Nf Nf Nf I8 77 Xw.U-.[c KH pw hH ,d J8 J8 J8 J8 J8 J8 J8 J8 J8 Ul Lf dj 6M 5H _/ TU.!t Cd E4 U~.fl.&$.5(.`7 1< SQ Oc UU.VU.WU.XU.lc.@I.Mp YU.ZU.sE $e bv Ne.9g E-.CF eK.`U.9V V.Z~.V.,V.'V.)V.!V.~V.~n ka J8 J8 Nf Of Of Of os 5A 4/.{V.p(.]V.Ww.^V./V.(V._V.:V. Ku ha je wL Of /d ,x LE Qn ^w Eb dg c{.Lb T5 J8 J8 ka ~n _d ka J8 J8 J8 J8 J8 J8 J8 J8 dj t}.mz f] ~B Zi r4 _q >c Ul J8 Nf Nf Nf Nf Nf Nf I8 I8 Nf Nf Nf J8 J8 J8 J8 J8 Nf '0 [P }Z }Z }Z ka J8 F- #r #r Of 7o ]n #r ka ~n -Y -Y NM :%.Mf I8 8H 'O r;.hV.Cn.36.> ^ > > ) -. r@ iV.jV.kV.lV.mV.nV.oV.pV.@T.qV.rV.PU.5- 4 4 d. ; > ; K ^ ^ ^ G p@ QU. >. M 7$ I1.uV.vV.wV.qp g/ af ]d Mf J8 J8 Nf Of Of Nf J8 J8 F- ]n $r Mf _d ~n J8 Of Of Of n[.83.t5.4o ps #g ps $J pW Of Of Of Of J8 J8 Nf $J $J $J Of me 1D Dz cO `p Nh f# ,d J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 )n )n 6M 7: 5: }y L= 'G &S.C[ ]/ u3 xV.Zs.X9.yV.zV.M).AV.BV.s= CB.CV.DV.nH u:.9| G> e7.+=.hP zs PD.`B yF ry ku `9.h] @{.SP Lg.@B.Al.Y~.W> oz w> 5Z &8.;h fe J8 J8 J8 J8 J8 J8 J8 J8 ka }Z 2P >0 $J 7o $r Of {d 1K :I EV.FV.f].Ep GV.HV.ES.IV.JV.KV.LV.MV.MV.NV.OV.PV.QV.RV.nm.ka J8 J8 Nf Of $J $J Of os h<.4/.+V.3C SV.TV.UV.VV.WV.XV.YV.ZV.`V. W..W.+W.@W.@W.@W.@W.@W.#W.#W.$W.%W.&W.*W.=W.-W.;W.>W.,W.'W.%m.As F- #u hH ej >c F- J8 J8 ka Q,.)W.vg kL x~ iH @t.^d ha Nf Nf ha Of Of Of $J Of os os 6A en.!W.s0 &8.vg g# ,d Of J8 J8 J8 J8 I8 Zy )0 Of )1 /^ b: 8h.~W.$r $J Of J8 F- ej W$ 3= |P mW :i.I8 F- Vl $r $J os /d yL yE @k Am (e.{W.}$ ~9.J8 J8 ka >0 _d ka J8 J8 J8 J8 J8 J8 J8 J8 Lf RL [y :y.Am ,k ;_ o7 >c Ul J8 Of Of Of Of J8 J8 Nf Of Of Of Nf J8 J8 J8 J8 J8 J8 ka }Z ]W.^W.h` ka J8 Of Of Of $J ps 1h.5o ns '0 {n {n _d _d {n '0 8H /W.$A (W.~@ t@ > R R (. ; 1+ _W.:W. > G p@ QU.,e ~+ v+ b+ u* d+ y ", "/+ 5W.6W.7W.8W.9W.4b 0W.aW.qU > > > O d@ 9- U].ev.rm bW.,2.cW.]d _d As ne &N y$.0L _~._~.`].[d Nf $J g` }Z 42.J8 J8 Nf Nf Of dW.d3._~.7o ps wL ,m._m.$J eW.[[ Vl ]n @r 1h.Ws.ps wL :%.-Y 4P [ _' Nd J- f# +G J8 Nf Nf Nf J8 J8 F- 67 67 J8 BB j9.{q.f] el J{.!` G- 6M &y 3i C fW.gW.hW.Dr iW.sh.x} jW.t} kW.lW.mW.8K v{ &u.[9 VH.nW. @X.#X.$X.H'.wp.fj &N &N 4o 5o >c Ax VI.J'.s@.nl H: vv.7o $J Of Of Of #r ej Ap _*.dj d!.2,.b! |[ ]O NM Nf '0 :%.`].c' uw J~ %X.8< X4.K~.4o sv 1G }P |Z wk.Ly '0 Nf Nf Nf Nf Of Of dj RL [y &X.@S pv }d T5 F- J8 F- Ws Ws ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf 5P n[.Nf :C Ak *X.bH.$m.(Y ne ne ne Nf $J 3/.4x a0 ~` Lf :C o}.q}.}Z [P ns Y9.;< X.,X.'X.)X.!X.~X.{X.ST.]X.^X./X.{ /; /; @$ (X.'J _X.^ > > , A^ :X.c F- 7i gX.hX.iX.d^.jX.kX.lX.mX.nX.oX.pX.qX.rX.Lo.-w.sX.,r.tX.uX.vX.wX.S] mA.0 Ly DX.'0 $J $J #r 67 Vl I8 NM fj m7.%x.vq EX.FX.GX.j* fW.HX.Ap v& wL 77 j:.IX.hP.da.JX.|p.>0 Nf J8 J8 ka '0 Of $J wL _O $r @r e^.KX.LX.MX.NX.OX.PX.@W.QX.RX.SX.SW.TX.UX.VX.WX.XX.YX.ZX.`X.ZX.ZX.YX. Y..Y.+Y.@Y.#Y.$Y.%Y.&Y.*Y.=Y.-Y.;Y.>Y.,Y.4H _*.]C 5o Nf F- ja j! &%.[p 'Y.T> @k )Y.pm.!Y.OM {n k|.yr ps 1h.ga d!.>x Q,.~Y.{Y.]Y.^Y./Y.(Y._Y.:Y.0 sH Y9.Xn ^s M; hY.l+ I>.6W =X.iY.jY.]; kY.lY.,X.mY.nY.oY.pY.qY.ST.rY.sY.tY.aR uY.uY.:> vY.mQ wY.m+ N FM s: E:.xY.A{ 5; [5 U+ }5 V+ d+ y ", "yY.zY.AY.BY.}X.CY.DY.EY.8Y FY.GY.HY.0 9 5 IY.JY.R{.B= 5A.dS.iv.KY.LY.MY.{#.}p.NY.OY.'> PY.rD lT.T0 k9.42.ka Nf Nf J8 J8 Nf '0 >0 g` Mf ji.QY.RY.SY.TY.UY.VY. l.WY.XY.YY.ZY.`Y.,x H#._O Lf ;c %2 ]/ !W {9 H#.oe Nf ]n Vl F- J8 J8 J8 F- 67 Vl (*. Z.hX.4k..b .Z.|N.cQ.+Z.@Z.#Z.$Z.qX.qX.%Z.&Z.*Z.=Z.-Z.(<.0;.;Z.g6 b^.yw.0E Ie 77 c@.^G Nd >Z.,Z.'Z.n1 nl )Z.Lu uz.x;.A1 P4 t^.!Z.~Z.{Z.[7.]Z.^Z.9].G[ #r ;h >A K~.fe Of (#./Z.Nf $r Ga ej Ul ja ha )n OM J..Bp C:.(Z._Z.}K.:Z.eh.hT.+R m/ y$.X1.x af.DZ.EZ.^%.FZ.GZ.HZ.IZ.JZ.KZ.LZ.MZ.6n.NZ.)j.}u.m7.xv.^K =w @-.xL le Of Of Of Of Of #r #r ~n fj ~` OZ.PZ.)_ _*.(*.(*.'$ g# hH BR b' QZ.RZ.SZ.TZ.5h !Y.UZ.VZ.WZ.XZ.YZ.ZZ.`Z. `..`.+`.+#.V7.g` 7i ia /$.o4 J( &u #y cv J8 >0 >0 ]O I8 I8 Nf Nf Nf J8 J8 J8 Nf Nf Nf Nf ns /s d! 9L Z8 X$ 2= @`.#`.xL $`.cY.%`.&`.%`.*`.=`.-`.;`.^d T5 Lb !,.>`.yi.-Y k* J2.ql.{%.3/ G(.S j+ KU ,`.'`.)`.qj !`.~`.{`.]`.^`./`.TT.(`.ST._`.:`.dh.o0.mP.<`.s: [`.mQ }`.]# m+ q@ ~P :j |`.C+ 1`.2`.5@ 6@ 7@ d+ y ", "3`.3`.4`.5`.6`.7`.8`.9`.0`.a`.b`.c`.z^ 3 G #].0[ d`.e`.f`.g`.h`.i`.j`.k`.l`.m`.n`.o`.p`.l`.q`.%Q -% X4.[P J8 Nf $J F- 5o 4o [d ar.k|.f# r`.s`.t`.z% u`.v`.w`.x`.y`.z`.A`.Y% }T #r GE.~W.L} eN [p 6: G~.^t rs c 67 J8 J8 J8 J8 J8 >c ;_ J~.^[.:: #E B`.4v.C`.Z; p7 D`.E`.F`.G`.H`.I`.J`.K`.J`.L`.'+.M`.N`.O`.5X e^.la Jb zs +z 4F.Cp.P`.Q`.IN.[%.R`.bv XN.(d Mf >h -h I8 x;.Uq.2Z ,#.P- S`.!( T`.U`.V`.fd RL 6o ~k.fb.&N H#.T0 m/ ha wL Ga wi !8 W`.X`.eB.Y`.Z`.``.NK. +. ++ +7o 4U @ +xu # +6$.%N 3&.([.$ +5P 5P Of _d -Y NM NM {w.pQ.aU.% +& +* += +- +; +> +> +, +' +) +! +~ +{ +] +^ +/ +( +_ +: +< +[ +} +| +1 +2 +3 +4 +5 +6 +7 +7 +8 +7 +9 +0 +WW.a +b +c +_~.NM ha $r ps Kf d +e +f +1+.g +D; P,.Vl qe >` _[.e!.6o 92.c3.'H 5$.j:.&W h +C+.i +j +k +l +m +n +o +p +q +r +s& T5 Qj s +t +%~.[#.,r ^d Of Of Of Of Of Of Of -Y {n T5 H#.$J '0 }Z |4.u +v +n .bh w +:W x +y +z +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +|Z V7.BB 3-.;~.)#.F> O4 ut I8 BB {n NM Of Of $J Of Of Nf J8 J8 J8 Nf Of Of 7r P ++F.dh 2= H (5 D# 1 @.+#.+[W.$.+%.+/`.&.+*.+ST.=.+-.+;.+>.+,.+'.+[Q ).+!.+~.+{.+EJ.( ].+^.+/.+:. (.+2`.Iw 6@ 7@ R=.$+ ", "_.+:.+}5 <.+1~ [.+}.+|.+1.+2.+3.+4.+5.+:1 S 9- 6.+7.+8.+9.+0.+a.+b.+c.+d.+e.+f.+g.+h.+i.+j.+k.+l.+o;.m.+n.+[P F- >c -6 c! G- pc.o.+xp.p.+q.+r.+s.+t.+u.+v.+w.+x.+y.+z.+A.+B.+C.+AI D.+E.+-h 4H 3! iG.AS.J_ rs oe Of NM I8 J8 J8 J8 J8 J8 J8 b! !d F.+tr.G.+H.+I.+J.+K.+L.+M.+N.+O.+P.+:R.Q.+R.+S.+T.+U.+V.+W.+X.+Y.+Z.+`.+fX. ++.+++++b(.`p t_.3P >5 Qn uc |d @++EU 2-.OM >x 77 Sl #++$++%++&++*++=++-++;++>++u`.]u fz bh >c ]C pa.tr.,++'++)++!++~++`# {++]++^++/++dz.(++_++5A :++$r ;w.{w.<++l. [++}++|++1++2++3++hW.2$.4++Of Of '0 Ek PM cC pQ.5++6++7++8++9++0++SX.a++b++c++d++e++f++g++h++i++j++k++l++m++n++o++p++q++r++v1.s++t++u++v++w++x++y++z++A++B++C++8Z.D++E++F++G++H++;w.os $J t}.e!.vH I++X+.J++K++L++M++N++1++O++RV.P++Q++BS.R++S++uz.T++U++V++W++X++Y++P.+Z++`++ @+.@++@+@@+#@+$@+Kb %@+&@+*@+=@+(| I8 Of Of J8 Nf 5P 5P Of wk. ;.X4.!,.-@+;@+>@+,@+'@+)@+!@+~@+{@+]@+^@+/@+(@+_@+:@+<@+[@+}@+|@+1@+2@+3@+4@+5@+6@+7@+8@+9@+0U.0@+=O )0.=W =|.H5.h%..y ja +G S5 Of $J 7o ps 7o Of fj '0 67 Vl F- J8 X1.3m oH.a@+b@+Hr c@+d@+e@+f@+g@+h@+i@+j@+k@+l@+m@+n@+o@+p@+q@+r@+7h aL.s@+t@+me dZ $y Mx rz 49 u@+t7 ._ G+ A^ $(.v@+w@+x@+y@+HU.z@+A@+B@+C@+D@+pY.E@+F@+G@+H@+I@+J@+K@+L@+M@+N@+O@+P@+Q@+R@+S@++@ X%.T@+U@+U+ 99.2O.y $+ ", "V@+W@+R=.X@+Y@+Z@+`@+ #+.#++#+@#+##+$#+K,.,J %#+&#+*#+=#+-#+;#+>#+,#+'#+)#+)#+!#+~#+{#+]#+^#+/#+(#+>++_#+{n !n.^n Aj ~9.77 Y[ 0O :#+<#+[#+}#+|#+1#+2#+3#+4#+5#+6#+7#+8#+9#+0#+a#+b#+c#+d#+w^.la WQ.e#+f#+I_ ~K NK.os (d **.Mf I8 ia ia I8 I8 ~9.g#+h#+i#+j#+k#+l#+m#+n#+o#+p#+q#+'#+r#+r#+s#+t#+u#+v#+w#+x#+y#+z#+A#+B#+C#+D#+E#+F#+a3 q|.G#+(I 4U ]B ow Z=.MJ H#+uz.}u.5$.Mf 77 gX.8i B,.I#+J#+K#+L#+M#+N#+O#+P#+Q#+r7 vk.R#+Fk >h S#+3O T#+U#+V#+W#+X#+Y#+Z#+`#+ $+.$++$+@$+tK.tK.Jy #$+TB $$+%$+&$+*$+=$+-$+;$+>$+,$+1h._K.>x me wL '- @u._d '$+)$+!$+~$+QW.aZ.b++{$+]$+^$+MW./$+($+_$+:$+<$+[$+}$+|$+1$+2$+3$+4$+5$+6$+7$+8$+9$+0$+a$+b$+c$+d$+e$+@W.b++8 +8 +f$+g$+h$+i$+j$+k$+Gw.$J + +l$++ +M&.m$+7#.n$+o$+p$+q$+r$+r$+s$+t$+u$+v$+w$+mL x$+y$+z$+A$+B$+C$+D$+E$+r#+F$+r#+G$+H$+I$+J$+K$+>$+L$+y] xg.Hq [_.|m 8Q )n qs ha qs qs )n >x ;h M$+N$+O$+P$+Q$+R$+S$+T$+U$+V$+W$+X$+Y$+Z$+`$+ %+.%++%+@%+#%+$%+%%+&%+*%+=%+-%+;%+>%+,%+'%+)%+!%+~%+{%+]%+^%+Ku /%+(%+<9 #u /O ej Nf $J wL _O 7o OM ,m.)j.:C Aj Ws ia _%+:%+S#+<%+[%+}%+|%+1%+2%+3%+4%+5%+6%+7%+8%+=%+9%+0%+a%+b%+c%+d%+e%+f%+g%++#.bY.h%+FE.~l -q .P i%+j%+sU k%+l%+u' m%+n%+o%+p%+q%+r%+s%+B@+C@+t%+u%+v%+w%+x%+y%+z%+A%+B%+C%+D%+E%+F%+G%+H%+I%+J%+K%+L%+M%+N%+O%+-i P%+$+ $+ ", "Q%+R%+S%+T%+U%+V%+W%+X%+Y%+Z%+`%+@#+ &+m= a<..&++&+@&+#&+$&+%&+&&+*&+=&+-&+;&+>&+,&+'&+)&+!&+~&+{&+]&+^&+_#+B +/&+7i EU o7 (&+_&+:&+<&+[&+}&+|&+1&+2&+3&+4&+5&+6&+7&+8&+9&+0&+a&+b&+c&+d&+e&+F#+f&+g&+h&+i&+MO.j&+,0 gX.gX.BB 77 (*.1P 7i 77 k&+l&+m&+n&+o&+p&+q&+r&+s&+t&+u&+v&+w&+x&+y&+z&+A&+B&+C&+D&+E&+F&+G&+H&+I&+J&+K&+L&+M&+N&+NL Ln.C:.ga Rf ,| L< O&+H#+$-.}u.af.j9.@*.P&+'$ Q&+R&+S&+T&+U&+V&+W&+X&+Y&+Z&+`&+ *+.*+^n +*+@*+#*+$*+%*+&*+**+=*+-*+;*+>*+,*+'*+)*+!*+~*+~K {*+]*+UO.^*+/*+(*+_*+:*+<*+[*+}*+|*+1*+{d 5$.nA.H#.=t 8i 2*+)$+3*+~$+4*+5*+6*+7 +7*+8*+9*+0*+a*+b*+c*+d*+e*+f*+g*+h*+i*+j*+k*+l*+m*+n*+o*+p*+q*+r*+s*+t*+u*+v*+w*+x*+y*+6Z.6Z.f$+z*+A*+B*+C*+D*+E*+TB F*+G*+H*+I*+J*+K*+L*+M*+N*+O*+P*+Q*+R*+S*+T*+hb.92.U*+V*+W*+X*+Y*+Z*+`*+ =+.=++=+@=+B&+#=+$=+%=+&=+*=+==+-=+;=+>=+}_ Dt.>c ;O ~9.fe qs H#.yr :C V7.,=+'=+)=+!=+~=+{=+]=+^=+/=+(=+_=+B;.:=+<=+[=+}=+|=+1=+2=+3=+4=+5=+6=+7=+8=+9=+0=+a=+b=+c=+d=+e=+f=+g=+h=+i=+j=+xS a3.L5.C<.qs N2 Vl Nf Nf ha wL os nA.#z.mr.gX./=.o}.T5 k=+l=+m=+n=+o=+p=+q=+r=+s=+t=+u=+v=+w=+x=+y=+z=+A=+B=+|W.C=+D=+E=+F=+G=+H=+I=+J=+K=+L=+&_ M=+N=+O=+P=+Q=+R=+S=+T=+U=+V=+W=+X=+Y=+Z=+`=+ -+.-++-++T.@-+#-+$-+%-+&-+*-+=-+--+;-+>-+,-+'-+)-+!-+~-+{-+]-+^-+/-+(-+_-+:-+$+ $+ ", "<-+[-+}-+|-+1-+2-+3-+4-+8T.5-+6-+7-+8-+9-+0-+a-+b-+c-+d-+e-+f-+ S.1R.1R.2R.g-+h-+i-+j-+k-+l-+m-+n-+o-+p-+q-+r-+2=.s-+b# 3++LV.t-+u-+v-+w-+`R. S. S. S.x-+x-+y-+z-+A-+y-+ S.1R.y-+0T.B-+C-+D-+E-+F-+G-+H-+I-+Vl ,h J-+JL.PC.dZ k* M{ K-+_/.8H dD L-+M-+N-+O-+P-+Q-+9T.y-+ S. S.1R. S.R-+S-+T-+U-+V-+W-+X-+Y-+Z-+k-+`-+ ;+.;++;+@;+#;+$;+%;+M4 &;+[d ,Y t; ^K (n dl.**.~n )W.&D JL.~Y.a# *;+=;+-;+;;+9T.`R.y-+>;+,;+';+);+!;+~;+{;+];+^;+/;+(;+_;+:;+5-+`R.x-+1R.<;+ S.9T.[;+};+/ 2,.|;+GV.1;+2;+3;+4;+`R.9T.`-+5;+6;+7;+.a 2$.8;+d3.bt o7 9;+0;+!$+a;+7Z.QW.8 +b;+, +c;+d;+e;+f;+g;+h;+i;+j;+m-+8T.k;+l;+m;+n;+z-+o;+p;+p;+q;+`R.x-+<;+r;+s;+t;+u;+v;+w;+x;+> ++Y.8 +A++y;+z;+A;+B;+C;+D;+}l.E;+F;+7M )Z G;+H;+I;+8T. ;+ ;+J;+K;+L;+M;+N;+O;+P;+Q;+R;+S;+T;+U;+9T.1R. S.x-+x-+x-+ S.x-+9T.5-+8T.V;+W;+X;+Y;+Z;+`;+L^.by.K-+i[ yL c! Q$ z- _/. >+.>++>+@>+#>+$>+%>+&>+C@+*>+=>+->+;>+>>+,>+'>+)>+!>+pY.~>+{>+oV.]>+^>+#T.#T.pY.!>+/>+(>+@T._>+:>+<>+[>+}>+ar.ql.*u /d.qb.qs 4$.os #r #r $J U+.+#._~.|>+1>+2>+_/._/.l[.3>+4>+5>+6>+7>+8>+9>+0>+#T.+T.ST.ST.a>++T.b>+&>+&>+c>+UT.+T.+T.ST.d>+e>+f>+g>+h>+i>+jA Q: (] j>+k>+l>+m>+n>+o>+p>+q>+r>+s>+t>+pY.ST.b>+u>+v>+w>+x>+ -+#T.+T.+T.@T.@T.+T.ST.UT.%>+%>+~X.y>+a>+z>+A>+B>+C>+D>+E>+F>+G>+$+ $+ ", "H>+I>+J>+K>+L>+M>+N>+1R.y-+9T.O>+P>+Q>+R>+S>+T>+U>+V>+W>+X>+Y>+<;+Z>+V-+`>+ ,+<;+W-+.,++,+@,+#,+$,+%,+&,+*,+=,+-,+;,+>,+,,+',+),+!,+~,+{,+q;+],+^,+j-+/,+(,+_,+:,+R-+S-+h-+<,+q;+9T.[,+},+|,+1,+2,+3,+4,+5,+WY 6,+7,+8,+QD.D4 D4 .k 9,+sh Q] F: 0,+a,+5-+9T.n;+y-+y-+l;+b,+R-+c,+d,+d,+e,+e,+f,+g,+h,+i,+j,+k,+l,+q;+m,+n,+o,+p,+q,+r,+s,+t,+u,+v,+w,+Tl.x,+y,+G; z,+[7.f' dq.dq.;P.c' A,+B,+C,+D,+1R.y-+0T.E,+F,+G,+H,+]s I,+J,+K,+L,+M,+N,+O,+P,+9T.x-+ S. S. S. S. S.Q,+R,+S,+T,+U,+V,+W,+X,+Y,+Z,+9T.9T.`-+`,+ '+.'++'+@'+#'+$'+jO.tU.%'+&'+*'+6*+='+-'+;'+>'+,'+''+)'+!'+~'+{'+]'+^'+/'+('+_'+:'+x-+Z>+Z>+1R.k-+k-+9T.y-+ S. S.<'+['+}'+|'+1'+2'+3'+4'+5'+6'+7'+7'+-'+@Y.qZ.8'+9'+0'+a'+b'+c'+d'+J:.e'+f'+g'+h'+`R.k-+m-+i'+j'+k'+l'+m'+n'+o'+p'+j;+q'+r'+s'+t'+u'+v'+w'+x'+R-+y'+z-+z'+A'+B'+C'+D'+E'+F'+G'+H'+I'+.k D4 D0 uq b| .k N; J'+K'+L'+M'+N'+O'+c>+C@+0>+P'+Q'+R'+S'+T'+U'+V'+W'+~X.X'+Y'+Z'+c>+@T.a>+@T.@T.u%+~X.pY.`'+oV. )+.)++)+@)+#)+$)+%)+&)+*)+)( wr =)+-)+0x.;)+>)+,)+')+))+~l oz lm I*+!)+~)+{)+])+^)+/)+()+_)+b>+0>+%>+c>+%>+%>++T.UT.C@+0>+:)+:)+&>+%>+<)+$>+UT.[)+})+|)+1)+2)+3)+4)+5)+6)+7)+8)+9)+0)+a)+b)+c)+d)+y>+pY.u%+a>+b>+e)+f)+g)+h)+%>+%>+c>+c>+%>+%>+b>+O'+$>+c>+C@+oV.(>+c>+pY.i)+j)+k)+l)+m)+n)+Wc.#. %+ ", "o)+p)+q)+r)+s)+t)+u)+v)+w)+}R.O>+x)+y)+z)+A)+B)+C)+D)+E)+F)+G)+H)+I)+[R.J)+K)+L)+M)+#=+#=+N)+O)+P)+Q)+R)+S)+T)+U)+V)+W)+X)+Y)+Z)+`)+ !+.!++!+@!+#!+$!+%!+&!+*!+=!+-!+;!+>!+*!+,!+['+y-+5-+'!+)!+!!+~!+{!+]!+^!+/!+(!+_!+:!+:!++3!+3!+4!+5!+6!+7!+8!+9!+0!+a!+b!+c!+d!+e!+f!+g!+h!+}'+i!+D,+j!+(,+k!+l!+m!+n!+o!+p!+q!+r!+s!+t!+u!+v!+w!+x!+y!+:!+z!+A!+B!+C!+D!+E!+F!+<;+n;+0T.G!+H!+I!+J!+K!+L!+M!+N!+O!+P!+D,+Q!+R!+S!+ ,+T!+U!+<;+<;+Z>+V!+W!+X!+Y!+Z!+`!+ ~+.~++~+@~+q;+j-+`-+#~+$~+%~+;/ &~+*~+=~+-~+;~+>~+,~+'~+)~+!~+~~+{~+]~+^~+/~+(~+_~+:~+<~+2R.z-+[~+}~+|~+;&+1~+2~+3~+4~+5~+6~+7~+8~+9~+0~+a~+P)+h-+k-+b~+c~+d~+e~+f~+g~+h~+i~+j~+y*+y*+k~+l~+m~+n~+o~+p~+q~+r~+s~+t~+u~+l;+<'+9T.v~+w~+x~+y~+z~+A~+B~+S-+['+C~+C~+D~+7!+E~+F~+G~+o,+H~+I~+J~++!+K~+L~+M~+N~+O~+P~+Q~+R~+S~+T~+[!+U~+V~+W~++%>+&>+@{+#{+${+%{+&{+*{+={+-{+D@+9>+;{+.-+>{+,{+'{+){+!{+~{+{{+UT.<)+]{+^{+/{+^{+({+_{+:{+<{+[{+}{+|{+1{+2{+3{+J{.<' .j 4{+4A.Ds.5{+6{+7{+8{+9{+0{+a{+b{+c{+d{+e{+f{+UT.<)+g{+h{+i{+j{+k{+l{+m{+n{+o{+p{+q{+O'+r{+oV.$>+UT.s{+t{+u{+v{+w{+x{+y{+z{+A{+B{+C{+D{+E{+F{+G{+H{+I{+J{+K{+-{+L{+M{+N{+~{+/`.B@+O{+B@+ -+ -+/`.P{+Q{+Q{+R{+/`.v>+S{+T{+U{+V{+W{+X{+Y{+Z{+$+ n)+#. %+ ", "`{+I>+ ]+.]++]+@]+#]+$]+B'+%]+&]+*]+=]+-]+6&+;]+>]+J~+,]+']+)]+!]+~]+{]+]]+^]+/]+(]+_]+:]+<]+6!+h-+k-+N~+[]+}]+|]+1]+2]++=^+2R.-^+;^+>^+,^+'^+)^+!^+~^+5-+9T.y-+{^+J~+]^+^^+/^+(^+_^+:^+Z>+<^+[^+}^+|^+1^+2^+3^+4^+5^+6^+7^+8^+9^+0^+a^+b^+c^+d^+e^+f^+g^+h^+i^+j^+k^+l^+m^+n^+o^+p^+q^+r^+s^+t^+N~+y-+x-+y-+w)+u^+v^+w^+x^+y^+z^+A^+B^+C^+D^+E^+F^+G^+H^+I^+x'+p;+J^+K^+L^+M^+N^+O^+P^+Q^+R^+S^+T^+U^+V^+W^+X^+Y^+Z^+`^+ /+./++/+@/+#/+k,+(,+$/+%/+&/+*/+=/+-/+`R.`R.}R.o,+;/+C]+>/+,/+'/+)/+!/+~/+{/+]/+^/+//+#=+(/+|~+_/+:/++C@+0/+a/+b/+c/+d/+e/+f/+{{+>{+g/+h/+i/+j/+k/+l/+m/+n/+o/+p/+ -+q/+R{+g)+nV.+T.-{+r/+s/+t/+u/+v/+w/+x/+y/+z/+A/+B/+C/+D/+E/+F/+G/+H/+I/+J/+K/+L/+M/+N/+LU.pY.+T.ST.O/+P/+Q/+R/+S/+T/+U/+V/+W/+X/+Y/+Z/+`/+ (+.(++(+@(+#(+y>+$(+%(+&(+*(+=(+-(+;(+>(+,(+'(+)(+!(+~(+{(+](+^(+/(+((+_(+:(+<(+R{+P{+B@+[(+}(+|(+1(+2(+3(+4(+5(+6(+7(+J{+8(+9(+0(+a(+b(+c(+d(+e(+f(+@. g(+%+ $+ ", "<-+o)+h(+i(+j(+k(+l(+m(+n(+o(+p(+q(+r(+<,+s(+l*+t(+u(+v(+w(+x(+y(+z(+A(+B(+C(+D(+E(+F(+G(+H(+I(+D~+J(+$/+K(+L(+M(+N(+O(+P(+],+Q(+R(+S(+T(+U(+V(+W(+X(+Y(+Z(+`(+ _+._++_+@_+#_+$_+%_+&_+*_+=_+-_+;_+>_+,_+'_+)_+!_+~_+{_+]_+]_+]_+{_+^_+/_+(_+__+:_+<_+[_+}_+|_+1_+2_+3_+4_+5_+6_+7_+8_+9_+0_+a_+b_+c_+d_+e_+f_+g_+h_+i_+j_+T-+ !+k_+&!+l_+m_+n_+o_+p_+q_+r_+s_+t_+u_+]_+]_+]_+u_+v_+w_+x_+y_+z_+A_+e,+D)+B_+C_+D_+E_+F_+G_+H_+k-+(,+L)+}_+I_+J_+K_+L_+M_+N_+O_+P_+Q_+R_+S_+T_+U_+V_+W_+X_+Y_+Z_+`_+ :+.:++:+@:+I(+#:+$:+%:+&:+*:+=:+-:+;:+>:+,:+':+):+!:+~:+{:+]:+^:+/:+(:+_:+::+<:+[:+-/+}:+|:+1:+2:+3:+4:+5:+6:+7:+8:+9:+0:+a:+b:+c:+d:+e:+f:+g:+/'+h:+i:+j:+k:+l:+m:+n:+o:+p:+q:+r:+s:+t:+u:+v:+w:+x:+y:+z:+A:+B:+.!+ !+ !+[:+P!+`-+p;+i-+C:+D:+E:+F:+G:+H:+I:+J:+K:+f_+L:+M:+N:+O:+P:+I_+Q:+Q:+R:+S:+T:+U:+V:+W:+X:+Y:+Z:+`:+ <+{_+.<+{_++<+@<+#<+$<+%<+O{+0>+ -+B@+UT.~X.&<+*<+=<+-<+;<+><+,<+'<+)<+!<+~<+{<+]<+^<+/<+(<+_<+:<+<<+1W.[<+}<+{{+@T.|<+1<+2<+3<+4<+5<+6<+t_+7<+8<+9<+0<+a<+b<+c<+d<+e<+f<+g<+h<+i<+j<++T.#T.p/+-{+k<+l<+m<+n<+o<+p<+q<+r<+s<+t<+u<+v<+w<+x<+y<+z<+A<+B<+C<+D<+E<+{{+F<+G<+H<+I<+J<+K<+L<+M<+N<+O<+P<+Q<+R<+S<+T<+U<+w>+V<+_(+W<+B@+ -+X<+Y<+Z<+`<+ [+ [+.[++[+.[+ [+@[+#[+$[+%[+&[+*[+=[+-[+;[+>[+#. $+ $+ $+ ", "`{+I>+,[+'[+)[+![+~[+{[+][+^[+ !+.,+/[+([+_[+:[+<[+[[+}[+|[+1[+2[+3[+4[+5[+6[+7[+8[+9[+0[+a[+b[+<~+c[+ !+w)+d[+e[+f[+g[+|~+h[+i[+j[+k[+l[+m[+n[+o[+p[+q[+r[+s[+t[+u[+v[+w[+x[+y[+z[+A[+B[+L)+sS.C[+D[+E[+F[+G[+H[+I[+I[+J[+K[+L[+M[+H[+N[+O[+P[+Q[+R[+S[+T[+U[+V[+W[+X[+Y[+Z[+`[+ }+.}++}+@}+#}+$}+%}+&}+*}+=}+-}+;}+>}+,}+R(+'}+i!+k,+,!+)}+!}+~}+{}+]}+^}+/}+(}+M[+_}+:}+:}+L[+<}+[}+}}+|}+1}+A_+e,+#/+2}+3}+4}+5}+6}+7}+8}+j!+e,+9}+0}+a}+b}+c}+d}+e}+f}+g}+h}+i}+j}+k}+l}+m}+n}+o}+p}+q}+r}+s}+t}+u}+*_+^/+v}+w}+x}+y}+z}+A}+B}+C}+D}+E}+F}+G}+H}+I}+J}+K}+L}+M}+N}+D~+m;+O}+`R.P}+Q}+R}+S}+T}+U}+V}+W}+X}+Y}+Z}+`}+ |+.|++|+@|+#|+$|+%|+&|+*|+_/+=|+8T.-|+;|+>|+,|+'|+)|+!|+~|+{|+]|+^|+/|+(|+_|+:|+<|+[|+}|+c,+4]+ !+ !+||+1|+2|+t'+3|+4|+5|+6|+7|+8|+9|+0|+a|+b|+c|+d|+e|+f|+g|+h|+i|+j|+*!+=!+h-+k|+l|+m|+n|+o|+p|+q|+r|+s|+t|+t|+u|+v|+w|+x|+y|+z|+C@+0>+ -+B@+oY.A|+B|+C|+D|+E|+F|+G|+H|+I|+J|+K|+L|+M|+N|+N|+O|+P|+Q|+R|+S|+T|++T.p/+s{+U|+V|+W|+X|+Y|+Z|+`|+ 1+.1++1+@1+#1+$1+%1+&1+*1+=1+-1+;1+>1+,1+'1+)1+@T.B@+e)+!1+~1+{1+]1+^1+/1+(1+_1+:1+<1+[1+}1+|1+11+21+31+41+51+61+71+81+91+e)+01+a1+b1+c1+d1+e1+f1+g1+Q& 9@ h1+i1+j1+k1+l1+m1+5(+n1+o1+/`.B@+p1+q1+r1+f1+s1+t1+u1+v1+v1+w1+x1+y1+z1+A1+B1+C1+D1+E1+F1+G1+#. @. @. @. %+ ", "p)+H1+J>+I1+J1+K1+L1+M1+ !+p(+&_+N1+-/+@_+O1+P1+Q1+R1+S1+T1+U1+V1+W1+X1+Y1+Z1+`1+ 2+.2++2+@2+#2+X-+j!+%_+f]+|R.$2+%2+&2+*2+=2+-2+;2+>2+,2+'2+)2+!2+~2+{2+]2+^2+/2+(2+_2+:2+<2+[2+l*+A[+&_+&_+e,+}2+|2+12+22+32+42+52+52+62+72+82+92+02+a2+b2+c2+d2+e2+f2+g2+h2+i2+j2+k2+l2+m2+n2+o2+p2+q2+r2+s2+t2+u2+v2+w2+x2+y2+z2+A2+B2+C2+&_+k,+k|+k,+D2+E2+F2+G2+H2+I2+J2+K2+02+L2+72+M2+N2+O2+P2+Q2+R2+S2+T2+e,+#/+U2+V2+&|+k_+W2+X2+Y2+Z2+`2+ 3+.3++3+@3+#3+$3+%3+&3+*3+=3+-3+;3+>3+,3+'3+)3+!3+~3+{3+]3+^3+/3+.!+K~+(3+_3+:3+<3+[3+}3+|3+13+23+33+43+53+63+73+83+93+03+a3+b3+c3+>]+m;+d3+e3+f3+g3+h3+i3+j3+k3+l3+m3+n3+o3+p3+q3+r3+s3+t3+u3+v3+w3+x3+y3+A-+P,+S:+5-+z3+A3+B3+C3+D3+E3+F3+G3+H3+I3+J3+K3+L3+M3+N3+O3+P3+Q3+d,+k,+[:+A[+A[+R3+S3+T3+U3+V3+W3+X3+Y3+Z3+`3+ 4+.4++4+o2+@4+#4+$4+%4+&4+*4+=4+-4+;4+`>+>4+]^+,4+'4+)4+!4+~4+{4+]4+^4+^4+/4+(4+_4+:4+<4+z|+C@+0>+ -+B@+>{+[4+-<+z|+}4+|4+14+24+34+44+54+}1+64+74+84+94+04+a4+b4+c4+d4+e4+W<+N{+s{+s{+z>+f4+g4+h4+i4+j4+N2+k4+l4+a2+a2+m4+l4+n4+K2+o4+p4+q4+r4+s4+b>+!X.P{+t4+u4+v4+w4+x4+s<+y4+z4+A4+B4+B4+C4+D4+E4+F4+G4+H4+I4+J4+K4+L4+M4+N4+O4+b>+P4+Q4+R4+S4+T4+U4+V4+8W.6. W+ %+ W4+X4+Y4+Z4+`4+ 5+.5+1W.oY.+5+@5+k/+#5+6W.jS R=.$5+%5+%5+&5+6W.O. W4+*5+V4+=5+-5+$+ $+ y# y# %+ @. #. %+ ", ";5+=5+>5+I1+,5+'5+)5+@:+!5+~5+{5+]5+^5+/5+(5+_5+:5+<5+X@+[5+}5+|5+15+25+35+45+55+65+75+85+95+:U.Y-+y-+['+#/+<'+:^+3|+-/+05+a5+b5+c5+d5+e5+f5+g5+h5+i5+j5+k5+l5+m5+n5+o5+p5+q5+r5+s5+t5+u5+&_+e,+v5+w5+x5+y5+[1+z5+/4+/4+62+A5+B5+C5+D5+E5+D4+F5+G5+H5+I5+J5+K5+L5+M5+N5+O5+P5+Q5+R5+S5+T5+U5+V5+W5+X5+Y5+Z5+`5+ 6+y2+.6++6+@6+Q]+%_+.!+&_+D:+#6+$6+%6+&6+*6+=6+-6+E5+]4+;6+>6+,6+'6+)6+!6+R2+~6+T2+e,+#/+U2+<~+{6++:+]6+^6+/6+(6+_6+:6+<6+[6+}6+|6+16+26+36+46+56+12+66+76+86+96+06+a6+b6+c6+d6+e6+f6+^/+|R.g6+h6+i6+j6+k6+l6+m6+n6+o6+p6+q6+r6+s6+t6+):+u6+v6+w6+x6+y6+y-+w)+z6+A6+B6+C6+D6+E6+F6+G6+H6+I6+J6+K6+L6+M6+N6+O6+P6+Q6+R6+S6+T6+U6+V6+h'+W6+X6+N~+Y6+Z6+`6+ 7+.7+F3++7+@7+#7+$7+%7+&7+*7+=7+-7+;7+>7+:^+4]+t5+//+F!+,7+'7+)7+!7+~7+{7+]7+^7+/7+(7+_7+:7+<7+[7+}7+|7+17+27+%4+37+47+57+67+>4+77+/^+87+97+07+a7+b7+c7+C5+^4+^4+/4+d7+e7+f7+<4+z|+%>+0>+ -+O{+>{+qY.g7+h7+i7+j7+M|+k7+l7+)6+m7+n7+o7+p7+q7+r7+s7+t7+u7+v7+w7+x7+y7+z7+s{+s{+-{+S{+A7+B7+C7+D7+E7+k4+N2+F7+G7+H7+I7+J7+K7+L7+M7+N7+O7+P7+0>+O{+c>+Q7+}4+R7+S7+T7+U7+z4+A4+V7+W7+W7+W7+n4+b7+X7+Y7+c<+Z7+`7+ 8+.8++8+@8+#8+#T./`.$8+%8+&8+*8+=8+g(+P. @. @. %+ $+ -8+;8+>8+`4+ 5+,8+'8+}<+)8+!8+~8+{8+]8+]8+^8+jS R=.n)+ O #. 9@ /8+(8+$+ g(+y# y# y# _8+y# $+ %+ @. $+ ", ":8+Vc.<8+[8+}8+|8+18+28+38+48+58+68+78+1-+88+98+08+a8+6W.b8+c8+d8+%+ $+ -8+/8+e8+f8+g8+h8+i8+j8+k8+ S.V-+#/+<'+<'+l8+m8+n8+o8+p8+q8+r8+s8+v2+N2+l4+b7+62+72+l7+l7+t8+u8+v8+w8+x8+y8+//+z8+B[+A8+B8+C8+D8+E8+[1+g5+^4+F8+D5+F4+72+62+F8+b7+E5+G8+L2+H8+I8+J8+K8+L8+M8+}1+N8+O8+N8+N2+F4+,6+P8+Q8+b7+R8+E4+S8+92+T8+U8+V8+W8+X8+Y8+Z8+P}+A_+^6+`8+ 9+.9++9+@9+=6+#9+N8+D5+S8+$9+%9+54+&9+*9+R2+~6+T2+e,+#/+=9+}'+o,+O~+-9+;9+>9+,9+'9+)9+!9+~9+{9+H8+r8+]9+'6+^9+/9+(9+_9+:9+<9+[9+,6+}9+|9+19+29+39+49+;!+ ,+59+69+79+89+99+09+a9+b9+c9+d9+e9+f9+g9+h9+i9+j9+k9+l9+k-+q;+o;+A-+m9+n9+o9+p9+q9+r9+s9+t9+u9+v9+w9+x9+w9+x9+y9+z9+A9+B9+C9+D9+E9+F9+G9+D~+H9+b,+Z>+-!+I9+J9+K9+L9+L9+M9+N9+o:+O9+P9+Q9+R9+S9+T9+U9+V9+3|+.!+K~+4]+W9+0]+X9+Y9+Z9+`9+ 0+.0+Y5++0+@0+#0+$0+%0+E4+&0+62+04+*0+=0+-0+;0+>0+,0+D)+<]+'0+)0+!0+~0+{0+]0+^0+02+^4+^4+^4+(4+e7+f7+<4+z|+%>+0>+B@+0>+/0+(0+m<+_0+:0+<0+[0+}0+W7+C4+B4+E5+l4+D5+^4+^4+62+C5+t7+|0+10+20+30+40+}<+s{+}<+50+60+70+80+E7+90+;6+B5+E7+E7+N2+;6+00+a0+M2+b0+c0+-{+0>+O{+d0+N{+e0+f0+g0+h0+i0+B4+n4+n4+B4+E5+E5+l4+D5+62+j0+k0+l0+m0+n0+o0+p0+q0+r0+s0+@T.b>+~X.t0+u0+v0+w0+6. 7. y $+ $+ $+ %+ x0+y0+z0+A0+B0+C0+D0+1W.+5+E0+F0+E1+^8+d+ d+ R=.y -8+-8+$+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "G0+W@+H0+I0+}8+|8+18+28+>!+J0+K0+L0+M0+N0+O0+Q. P0+Q0+R0+S0+$+ %+ $+ $+ -8+/8+T0+U0+V0+W0+X0+Y0+Z0+`0+x-+V-+;4+.:+ a+.a++a+@a+#a+$a+%a+D5+N2+&a+z4+;6+82+B5+l7+k4+l4+o2+*a+=a+-a+;a+>a+A8+t5+d,+,a+'a+)a+!a+06+~a+{a+R8+]a+^a+M8+^4+^4+z4+^a+}1+/a+(a+_a+:a+a2+$9+}1+6+[a+}a+b7+|a+D4+1a+N8+]a+B4+|a+62+04++0+2a+3a+4a+5a+6a+7a+8a+P}+T2+9a+0a+aa+K7+ba+ca+da+N8+|a+^4+M8+ea+fa+ga+ha+R2+~6+T2+e,+['+&!+ia+,7+ja+ka+la+ma+na+oa+pa+qa+ra+O2+sa+82+ta+!2+M2+ua+va+wa+xa+ya+za+06+Aa+W5+19+Ba+Ca+}2+v)+S!+Da+Ea+Fa+Ga+Ha+Ia+Ja+Ka+La+Ma+F3+f9+Na+Oa+Pa+Qa+Ra+Sa+9T.Ta+^,+z-+Ua+Va+Wa+Xa+Ya+Za+`a+ b+.b++b+@b+#b+$b+%b+&b+*b+=b+-b+N6+;b+>b+Q` ,b+'b+)b+!b+~b+r;+{b+]b+^b+/b+(b+_b+:b+G3+a+-4+nb+@:+ob+pb+qb+rb+sb+tb+C5+A5+{a+ub+e7+f7+<4+z|+%>+0>+B@+0>+B0+vb+wb+g0+xb+yb+zb+Ab+C4+E5+E5+E5+l4+D5+^4+{a+72+72+{a+27+Bb+Cb+Db+Eb+'8+!{+1W./`.Fb+Gb+Hb+Ib+C4+A4+E7+B5+l7+[1+Jb+v8+^0+Kb+Lb+Mb+ -+0>+B@+B@+Nb+Ob+o<+a4+X7+)6+;6+Pb+Pb+S8+Qb+M8+62+C5+72+Rb+Sb+Tb+Ub+Vb+Wb+Xb+Yb+Zb+`b+]{+%>++T. c+.c++c+@c+#c+$c+%c+Vc.$+ $+ %+ &c+*c+=c+-c+;c+>c+}<+1W.+5+,c+F0+E1+jS d+ d+ d+ y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "'c+)c+!c+~c+}8+|8+18+28+{c+]c+^c+/c+(c+_c+:c+d+ ]+3!+nb+6c+7c+8c+9c+0c+c2+J2+ac+E7+E5+E5+k4+l7+B5+B5+N2+E7+N2+bc+p8+cc+dc+ec+fc+t5+e,+gc+hc+ic+jc+kc+/9+Qb+^a+]a+E4+E5+b7+S8+lc+A4+mc+]a+nc+[a+oc+pc+E4+]a+qc+U7+rc+sc+O2+tc+'6+{4+uc+42+~2+vc+wc+{2+]2+xc+yc+zc+Ac+Bc+Cc+Dc+T:+i!+)5+Ec+Fc+Gc+Hc+Ic+Jc+%9+z4+62+t7+H8+Kc+Lc+Mc+R2+S2+T2+e,+['+L)+Nc+Oc+Pc+Qc+Rc+Sc+I2+D5+N2+l7+F4+C5+62+z4+E5+E5+&a+&a+Tc+Uc+Vc+Wc+Xc+>6+Yc+Zc+`c+ d+.d++d+nb+S!+f,+k,+@d+#d+$d+%d+&d+*d+=d+-d+F3+;d+>d+,d+'d+)d+!d+~d+w)+[:+{d+]d+^d+/d+(d+_d+:d++0>+B@+0>+Pd+Qd+34+Rd+o4+K7+00+Sd+E5+E5+E5+E5+b7+D5+^4+;6+Qb+B5+72+ub+Td+f7+Ud+Vd+C0+1W.1W.%>+Wd+Xd+Yd+Zd+b<+A4+E7+B5+k4+}1+]a+*a+`d+ e+.e++e+%>+&>+h)+@e+#e+$e+%e+&e+C5+62+*e+=e+-e+/4+A5+62+^4+C5+72+j0+;e+{_+>e+,e+'e+)e+!e+~e+{e+]e+c>+b>+[4+^e+/e+(e+_e+:e+.m) $+ $+ $+ %+ T0+fe+|c+ge+he+ie+je+5c+x-+>]+3!+-!+ke+le+me+ne+oe+pe+J2+ac+N2+E7+^0+}1+qe+Qb+B5+B5+N2+re+B4+se+te+ue+ve+we+&_+xe+ye+ze+Ae+Be+Ce+De+Ee+E5+B4+$9+Xc+]a+W7+fb+Fe+Ge+z4+He+sc+Ie+fb+lc+E7+>6+rc+l2+H8+Yc+Je+Ke+n2+Le+Me+Ne+bb+Oe+Pe+Qe+Re+Se+Te+Ue+Ve+We+ !+3|+=!+Xe+Ye+Ze+`e+ f+.f+I7+,6+F4+t7+;6+k4+e7+qe++f+R2+S2+T2+e,+#/+j,+7a+@f+#f+$f+#a+O2+%f+w2+)3+re+,6+F4+{a+z4+E5+E5+&a+&a+n4+&f+*f+=f+-f+A4+&6+;f+>f+la+,f+'f+z[+D)+d,+V-+)f+!f+~f+{f+]f+^f+/f+(f+F3+/f+_f+:f+a+.!+Df+Ef+Ff+Gf+Hf+If+E5+R8+$9+F4+.f+eb+Jf+@0+Dd+Kf+Qb+E5+Lf+Mf+Nf+Of+Pf+Qf+;!+i!+.:+Rf+Sf+Tf+Uf+Vf+Wf+Xf+Yf+*e+62+Zf+`f+f7+Od+z|+%>+0>+B@+0>+ g+.g++g+82+h0+@g+%a+n4+E5+E5+E5+E5+E5+b7+D5+l4+k4+Qb+72+#g+$g+%g+&g+*g+=g+1W.1W.%>+-g+;g+>g+,g+S8+G8+N2+F4+&0+&a+k4+C5+'g+)g+!g+g{+/`.c>+K{+E|+~g+{g+t7+]g+/4+j4+=e+^g+j4+/4+62+/4+/4+^4+62+/g+(g+_g+:g++N{+4g+5g+6g+7g+8g+.e.y $+ $+ %+ 9g+[5+0g+ag+bg+2e+2e+1W.x>+cg+dg+5e+<8 d+ /+ y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "G0+P0+eg+~c+}8+|8+18+5]+E)+,]+fg+gg+hg+ig+jg+Q0+09.%+ $+ /+ R=./+ $+ $+ $+ Q& kg+lg+mg+ng+og+pg+qg+rg+x-+>]+d,+67+sg+tg+ug+vg+db+wg+xg+|a+B5+t8+$9+E4+]a+h+,h+'h+)h+o,+e,+67+!h+f6+~h+{h+]h+^h+zd+Kg+He+He+,6+[a+He+l7+k4+E5+E5+&a+&a+n4+xg+/h+(h+_h+:h+]2++>4+1h+2h+3h+4h+5h+6h+q6+(f+F3+7h+8h+9h+0h+ah+bh+5-+<~+ch+Nc+dh+eh+fh+gh+hh+ih+jh+4d+kh+lh+lh+mh+nh+6d+oh+lh+ph+bf+0f+qh+rh+sh+th+uh+vh+wh+xh+yh+mf+zh+Ah+Bh+Ch+Dh+Eh+e9+Fh+Gh+Hh+Ih+Jh+Kh+Lh+Mh+Nh+B:+Oh+Cf+B:+Ph+Qh+Rh+Sh+Th+Wf+D5+}1+%9+Uh+Vh+Uc+Wh+Xh+Yh+Zh+72+C5+`h+ i+.i++i+@i+#i+$i+%i+.:+j,+&i+*i+=i+-i+;i+>i+Og+,i+^4+s7+'i+)i+!i+~i+%>+0>+B@+0>+Pd+{i+]i+^i+]4+/4+D7+B4+E5+E5+E5+E5+E5+E5+E5+E5+E5+t8+72+/i+(i+_i+:i++}i+{i+|i+r8+tb+^4+Qb+&a+E5+;6+ua+O2+1i+2i+3i+[4+U|+f{+4i+5i+6i+7i+8i+9i+n5+0i+db+tb+62+62+^4+^4+^4+^4+^4+/g+ai+bi+ci+di+v3 ei+fi+gi+hi+ii+ST.b>+ji+ki+li+mi+ni+oi+y y $+ $+ `@ pi+qi+ri+ 5+<<+2e+2e+-{+si+ti+ui+^8+wo.09.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "7W.vi+wi+xi+yi+'5+L1+zi+Ai+Bi+fg+Ci+Di+Ei+Fi+Gi+y $+ $+ $+ y $+ $+ (+ Gg Hi+Ii+Ji+Ki+Li+Mi+Ni+Oi+Pi+ S.>]+<;+ ,+Qi+Ri+n4+Si+0c+Ti+Ti+B4+E7+E5+E5+b7+F8+^4+M8+&a+Ui+E5+tc+sa+Vi+Wi+Xi+Yi+R!+d,+Zi+`i+ j+w8+.j++j+Kg+[a+E4+N8+O8+re+sc+k2+@j+M8+Dd+A5+62+#j+$j+%j+&j+*j+@g+=j+-j+;j+>j+,j+,j+'j+)j+!j+~j+{j+]j+^j+/j+(j+_j+:j+6+rc+8j+nc+}1+E5+E5+l4+M8+D7+9j+/h+(h+a0+0j+W5+u8+aj+bj+cj+dj+ej+D)+3!+fj+gj+hj+ij+jj+kj+lj+q6+(f+p:+mj+nj+oj+EW.pj+qj+y-+d3+9T.z3+rj+sj+tj+uj+vj+wj+xj+yj+ph+zj+zj+zj+mh+oh+mh+zj+lh+ph+Aj+Bj+Cj+Dj+Ej+Fj+Gj+Hj+Ij+Jj+=^+%i+Kj+Lj+Mj+Nj+Oj+Pj+Qj+M9+Rj+Sj+Tj+Uj+Vj+Wj+Xj+c,+.!+Cf+B:+d!+Yj+Zj+`j+ k+.k+^a++k+He+@k+#k+$k+%k+&k+,6+*:+ua+62+*k+x2+=k+-k+;k+>k+3!+J0+;4+J0+,k+*i+'k+)k+0i+Qe+Le+!k+{a+84+~k+{k+]k+e0+B@+0>+B@+0>+Pd+^k+/k+54+D7+y2+(k+n4+&a+&a+E5+E5+E5+E5+E5+E5+E5+E5+l4+_k+:k++z|+R/+|k+1k+2k+3k+>6++O4++-+nk+ok+pk+qk+rk+. y $+ $+ %+ sk+R0+tk+uk+vk+1W.wk+-{+xk+yk+zk+Ak+F3 09.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "Gi+:8+<8+[8+J1+'5+L1+]c+A8+Bk+fg+Ci+Ck+Dk+7W.:8+$+ $+ $+ $+ $+ $+ $+ (+ .e.}5 Ek+Fk+Gk+Hk+Ik+Jk+Kk+Lk+ S.y'+<;+Mk+Nk+Ok+)3+Pk+B5+E7+E5+E5+E5+E5+E5+b7+S8+^4+D5+&a+Ui+B4+Qk+Rk+Sk+Tk+Uk+Vk+67+d,+Wk+Xk+Yk+Zk+`k+Lf+%9+N8+N8+Xc+$9+{a+72+[1+%9+re+82+ l+.l++l+@l+#l+$l+%l+&l+*l+=l+-l+;l+>l+,l+'l+)l+!l+~l+{l+]l+^l+Dc+/l+(l+_l+.!+t5+i!+f]+r;+A8+:l++4j+2l+0_+3l+4l+'6+[a+N8+]a+k4+Qb+,6+[a+$9+E5+E5+z4+D5+D7+9j+}l+/h+5l+6l+7l+8l+9l+0l+al+)f+bl+I~+cl+dl+el+fl+gl+hl+il+jl+]+#/+x-+Fl+Gl+Hl+Il+Pj+Jl+M9+Kl+Ll+Ml+Nl+Ol+Pl+Ql+cl+nb+B:+B:+d!+Rl+Sl+5l+oe+Q8+,6++k+He+qe+Tl+Ul+Vl+Wl+,6+Xl+Qb+C5+Yl+ua+Zl+`l+ m+.m+Z>+T!+T!+:^++m+@m+=i+)k+Fe+Ng+F8+{a+{a+#m+~k+$m+%m+&m+B@+0>+B@+0>+Pd+^k+/k+m2+o4+*m+}l+Sd+&a+}1+R8+E5+E5+E5+E5+E5+E5+E5+B4+*a+=m+-m+;m+>m+B@+0>+ -+%>+h{+,m+'m+)m+2k+y2+E5+He+F4+72+ua+!m+~m+{m+]m+Q{+f{+f{+4i+^m+/m+(m+_m+:m+n+,n+92+62+y2+}l+V7+k4+[1+E7+n2+gb+*9+R2+'n+V6+f,+S!+d,+)n+!n+0_+~n+2a+Aa+sc+}1+^a+&a+F4+&a+$9+$9+E5+E5+E5+z4+lc+00+}l+/h+5l+{n+]n+vc+^n+/n+(n+_n+bl+I~+U!+:n++0n+an+bn+cn+dn+en+fn+gn+4d+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+hn+in+jn+kn+ln+mn+nn+on+pn+qn+m;+~5+`R.rn+sn+tn+F}+/f+un+vn+wn+xn+yn+zn+An+Bn+Cn+Dn+67+;4+B:+d!+En+Fn+Gn+Hn+72+He+re+,6+&a+In+Jn+Kn+.k+>6+qe+,6+;6+ua+M2+Ln+`l+Mn+Nn+On+Pn+Qn+T!++m+Rn+Sn+Tn+Un+Vn+Wn+P2+62+Xn+Em+Yn+Zn+`n+B@+0>+B@+0>+Pd+^k+/k+m2+Vn+*m+}l+ o+32+}1+E4+R8+E5+E5+E5+E5+E5+E5+B4+=k+32+.o++o+@o+t%+0>+B@+C@+#o+$o+%o+&o+*6+Vn+E5+>6+z4+D5+82+*o+w7+=o+-o+;o+oY.f{+>o+,o+'o+)o+!o+~o+{o+]o+]o+{o+^o+{o+]o+/o+/o+(o+{o+_o+:o++e)+9/+5o+6o+7o+8o+9o+. y# $+ $+ $+ `@ 0o+ao+bo+C0+}<+2e+}<+co+do+eo+pT F3 R=.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "fo+tm+go+[8+yi+ho+L1+z8+om+pm+fg+gg+Di+io+'c+:8+$+ $+ $+ $+ $+ $+ $+ %+ O<+jo+ko+lo+mo+no+oo+po+qo+ro+ S.y'+<;+Dm+Nk+Ok+)3+so+B5+E5+E5+E5+E5+E5+R8+]a+%9+rc+B5+B5+l7+%9+to+uo+vo+wo+Bg+xo+]/+3!+yo+Om+Yk+Zk+Nd+zo+B5+,6+]a+Q8+^4+F8+G8+t7+B5+06+pc+Ao+Bo+Co+Do+Eo+Fo+Go+nb+d,+Z>+Ho+Io+Jo+/^+3!+c,+t'+u}+K~+t5+-4+Ko+ !+A[+F!+Q(+#/+D)+D)+r;+d,+Lo+Mo+,n+C5+;6+$a+J2+b7+F4+F4+l4+v2+f5+No+R2+S2+A_+e,+67+Da+f6+Oo+'k+Po+2a+Ke+72+l4+E5+E5+E5+E5+E5+E5+E5+E5+&a+&a+C4+Qo+Ro+So+To+.j+Uo+m5+Vo+Wo+Xo+Yo+ej+67+1R.+,+Zo+`o+ p+.p++p+@p+#p+#p+$p+%p+&p+*p+=p+-p+&!+x-+~b+Z>+;p+>p+,p+'p+)p+!p+~p+{p+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+mh+]p+^p+/p+(p+_p+:p++0>+B@+0>+Pd+^k+/k+m2+0j+pp+5l+qp+$9+}1+[a+E5+E5+E5+E5+E5+E5+E5+E5+n4+k4+rp+sp+tp+50+0>+B@+C@+up+vp+wp+xp+yp+zp+E5+E5+A4+Ap+L2+Bp+Cp+Dp+c>+C@+/`.!X.Ep+U{+Fp+Gp+Hp+Ip+z>+K{+K{+K{+K{+K{+Jp+Kp+Lp+X<+K{+K{+Mp+Mp+}<+y>+Np+Op+Pp+Op+t>++T.B@+ -+Qp+Rp+Sp+Tp+Up+Vp+y# $+ $+ $+ %+ E1+qi+Wp+Xp+f/+1W.wk+wk++5+E0+F0+Yp+jS 09.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "Zp+`p+ q+.q+yi++q+@q+xe+om+pm+fg+gg+Ck+#q+6e+:8+$+ $+ $+ $+ $+ $+ $+ $+ W4+W1+$q+%q+&q+*q+=q+-q+;q+>q+ S.y'+<;+Dm+Nk+Ok+,q+so+B5+&a+E5+E5+E5+E5+E5+E7+rc+qe+nc+nc+,6+06+h5+'q+)q+!q+~q+{q+]q+3!+yo+Om+^q+/q+Xf+(q+t7+Qb+He+32+E4+E4+$9+z4+4l+_q+:q++Z>+Z>+Z>+e,+A8+)5+e]+6q+7q+;/+Ij+8q+C)+`>+V-+#/+A8+:l++yq+zq+Aq+Bq+Cq+Dq+~p+{p+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+oh+kh+gn+Eq+Fq+Gq+Hq+Iq+Jq+dl+f-+L~+1R.Kq+Lq+Mq+Nq+7h+Oq+F3+Qj+Pq+Qq+Rq+Sq+Tq+Uq+Vq+T!+d,+B:+Ph+cp+Wq+Xq+4l+N2+32+E5+b7+&0+Yq+Zq+Vl+Wl+,6+Xl+He+`q+qe+ r+hp+ip+.r++r+@r+#r+$r+Yi+O_+%r+&r+*r+=r+-r+;r+I2+^4+s7+e7+f7+<4+z|+%>+0>+B@+0>+Pd+^k+/k+m2+0j+pp+(h+5l+>r+b<+l7+]4+D5+b7+E5+E5+E5+E5+E5+b7+B5+,r+'r+tp+50+0>+ -+c>+)r+!r+'m+~r+D7+m7+E5+E5+A4+D7+Yl+{r+]r+^r+c>+0>+%>+!X.Ep+Ep+/r+}(+(r+_r+O{+B@+O{+d0+d0+O{+O{+:r+:r+d0+B@+B@+O{+O{+%>+c>+UT.a>+~X.pY.u%+ST.@T.$>+u>++Qr+Rr+9q+n4+32+a2+Ti+Jb+]a+z4+92+uc+Sr+,h+'h+S2+A_+e,+S!+g,+Tr+f}+Ur+Vr+!k+o2+E5+E5+E5+E5+E5+E7+E7+E5+E5+E5+&a+&a+b<+Wr+To+Xr+Yr+Zr+`r+ s+.s++s+@s+#s+oq+67+Dm+:n+$s+%s+&s+*s++p+Kl+3n+#p+$p+E3+=s+-s+;s+>s+fj+Z>+U-+Z>+,s+'s+)s+!s+~s+{s+]s+{p+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+mh+~p+0f+^s+/s+(s+_s+:s++[s+}s+|s+1s+2s+3s+G3+4s+5s+6s+7s+8s+9s+0s+_^+ ,+d,+B:+as+bs+cs+ds+es+^0+E4+b7+^4+>6+Tl+fs+gs+Wl+,6+Xl+He+hs+%9+is+Sr+js+ks+ls+ms+I~+bp+ns+os+ps+qs+rs+ss+94+db+,i+^4+s7+e7+f7+<4+z|+%>+0>+B@+0>+ts+^k+/k+us+%a+c2+`j+_h+(k+|a+B5+C5+G8+b7+E5+E5+E7+&0+&0+M8+Gm+vs+'r+tp+50+0>+ -+C@+D<+ws+xs+ys+D7+0j+E5+E5+A4+P2+72+zs+As+Bs+b>+e)+P7+wk+Ep+>o+Cs+,{+Ds+t4+c>+c>+e)+<)+Es+.-+t4+e)+e)+e)+e)+e)+t4+b>+t4+Rp+xk+Fs+Gs+Hs+Hs+Hs+Is+Js+Ks+Ls+Ms+Ns+:8+9@ `@ $+ $+ $+ %+ Os+2r+Ps+jm+C0+N{+/`./`.Qs+Rs+Ss+7r+d+ R=.Gg y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "Ts+9r+Us+ar+Vs+Ws+Xs+Ys+e,+i,+fg+gg+hg+Zs+`s+W1+$+ $+ $+ $+ $+ $+ $+ $+ y O. T0+ t+.t++t+@t+#t+$t+%t+ S.y'+<;+Dm+Nk+Ok+)3+Pk+B5+D5+b7+C4+E4+R8+&0+72+B5+nc+}a+P8+}1+^a+&t+*t+Wg+=t+-t+$i+%_+;t+>t+`i+,t+'t+)t+!t+}1+k4+E7+&a+}1+R8+92+es+~t+{t+]t+^t+/t+j,+z8++:+P}+.:+(3+(t+_t+:t++V-+Z>+yt+zt+At+Bt+Ct+Dt+Et+bf+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+~p+af+Ft+Gt+Ht+It+:s+Jt+h-+`R.t5+Z>+[s+;s+Kt+Lt+Mt+Nt+3n+Ot+Pt+Qt+Rt+St+Tt+Ut+Vt+Wt+d,+B:+as+bs+Xt+Yt+Zt+mc+E4+b7+^4+`q+@j+`t+Zq+.k+He+Xl+,6+O8+8j+l7+Sg+ u+.u++u+3!+@u+$i+I~+#u+$u+%u+&u+*u+=u+{n+-u+^4+s7+e7+f7+<4+z|+%>+0>+B@+0>+ts+;u+/k+>u+Ge+{n+,u+'u+0j+b7+F4+M8+b7+b7+E5+E7+F4+F4+F4+{a+Rd+vs+)u+tp+50+0>+B@+0>+!u+~u+{u+]u+D7+m7+E5+E5+A4+_k+^u+/u+(u+_u+oY.z>+:u+v+ht+,v+'v+Z>+#/+A8+)v+Fc+;h+!v+bk+~v+{v+tr+nc+rc+M2+]v+Xc+^v+'h+S2+A_+e,+<'+Z>+/v+2l+0_+(v+;6+z5+E5+E5+E5+E5+E5+F4+B5+F4+E5+E5+E7+!2+ua+O2+:h+_v+:v++V-+Z>+cv+dv+ev+fv+gv+hv+iv+jv+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+zj+lh+kv+Bj+lv+mv+nv+ov+:s+pv+i-+`R.i-+Z>+qv+rv+sv+tv+L9+Na+#p+uv+vv+wv+xv+yv+zv+Av+Bv+77+:^+k|+Ph+Cv+Dv+Ev+Fv+Jc+}1+&0+62+R8+@j+Gv+Bd+02+F4+`q+P8+N8+re+{4+Tg+Hv+Iv+Jv+d,+z]+/^+bp+mp+Kv+Lv+Mv+Nv+Ov+a0+|j+^4+s7+e7+f7+<4+z|+%>+0>+B@+0>+ts+^k+Pv+Qv+Rv+;r+Sv+!v+62+z4+E5+E5+E5+E5+E5+F4+B5+B5+72+]4+Rd+vs+)u+tp+50+0>+O{+0>+n/+Tv+Uv+Vv+yp+zp+E5+E5+Wv+Wv+Xv+Yv+%m+Zv+!X.'8+f/+>c+D0+jm+`v+ w+.w++w+@w+#w+$w+%w+&w+*w+=w+-w+;w+;w+-w+>w+,w+'w+)w+!w+~w+{w+]w+^w+^w+/w+(w+_w+:w+:w++D)+g,+Nw+Ow+Pw+Qw+0i+.k+Rw+k4+He+[1+is+Sw+`f+Mc+R2+~6+T2+e,+67+3!+Tw+Uw+Sn+Vw+Ww+bb+E5+E5+E5+E5+E5+E7+E7+E5+E5+E5+E7+l7+B5+Dd+Xw+Yw+Zw+`w+ x+.x++x+@x+al+)f+ej+67+Dm+:n+3v+#x+$x+%x+7v+&x+F3+3n+$p+E3+=s+*x+=x+-x+67+Z>+V-+Z>+;x+>x+,x+'x+)x+!x+~x+gn+zj+{x+zj+zj+zj+zj+zj+zj+zj+zj+lh+]x+^x+/x+(x+_x+:x++}x+|x+1x+2x+un+3x+4x+;d+5x+6x+7x+8x+Tt+9x+0x+ax+3!+Mk+bx+cx+dx+ex+Lf+72+Qb+B5+{a+Yq+2k+fx+=e+gx+}1+E5+D5+;6+M2+U7+Sr+hx+ks+ix+Da+#r+$r+z8+jx+kx+lx+mx+nx+>r+J2+3k+^4+s7+e7+f7+<4+z|+%>+0>+B@+0>+ts+ox+px+qx+rx+sx+gp+!v+X7+z4+E5+E5+E5+E5+E5+E5+E7+E7+I7+M8+Gm+vs+)u+tp+50+0>+O{+0>+tx+:i+ux+r8+/4+#g+F8+E5+C4+W7+rc+vx+wx+xx+UT.1W.}<+p/+C0+yx+zx+Ax+Bx+Cx+Dx+Dx+Ex+Fx+Gx+Hx+Ex+Ix+Jx+Kx+Lx+Mx+Nx+Ox+Px+Qx+Rx+Sx+Tx+Ux+Vx+Wx+Xx+Yx+Zx+`x+ y+.y++y+_% @y+_8+$+ $+ %+ #y+$y+%y+&y+=g+*y+bg+}<++5+=y+-y+E1+^8+d+ d+ d+ Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", ";y+>y+,y+.q+yi+Ws+L1+'y+fc+)y+6w+!y+~y+{y+7W.:8+$+ $+ $+ $+ $+ $+ $+ $+ . 0@ ]y+^y+/y+(y+_y+:y+!+#=+by+cy+dy+ey+fy+gy+hy+Wf+x2+!k+t8+32+k2+a2+!2+Rd+He+qe+ r+sc+iy+jy+ky+ly+4j+D)+3!+D)+g,+Nw+my+Pw+ny+oy+py+P8+k4+6+is+Sw+qy+Mc+R2+S2+T2+e,+67+bq+ry+sy+ty+uy+vy+wy+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E7+N2+B5+72+Yq+xy+yy+zy+>i+Ay+By+@x+Cy+Dy+ej+Qn+1R.@,+Ey+Fy+Gy+Hy+Iy+Jy+4x+3n+$p+E3+Ky+Ly+My+Ny+r;+Z>+Y>+Z>+Oy+Py+Qy+Ry+Sy+Ty+Uy+lh+]s+]x+xl+lh+zj+mh+oh+xj+mh+zj+bf+Vy+Wy+Xy+Yy+Zy+`y+ z+.z++z+@z+`R.i-+Z>+#z+$z+%z+&z+*z+@p+F3+Pj+=z+-z+;z+>z+,z+'z+)z+#r+3!+Mk+!z+~z+{z+]z+ s+Rd+Gm+l7+t8+-u+Sv+^z+/z+(z+}1+E5+D5+{a+M2+rc+hp+ip+ks+ix+Da+$r+3!+k|+_z+:z+ty++0>+B@+0>+}z+|z+s<+]v+Ti+1z+Bd+@0+/4+b7+E5+&a+&a+E5+E5+E5+E5+E5+E5+z4+Gm+vs+)u+tp+50+0>+O{+0>+2z+3z+4z+54+9i+#g+F8+E5+C4+W7+He+Bp+Cp+Dp+b>+50+!X.!X.5z+6z+7z+8z+9z+Zf+h0+#g+84+#g+0z+0z+ub+az+ba+^g+#g+62+bz+Yq+cz+dz+ez+fz+gz+hz+iz+t@+jz++`.kz+lz+mz+nz+oz+pz+qz+rz+$+ $+ %+ x0+y0+%y+5z+=g+*y+Ep+N{++5+=y+sz+0>.jS d+ d+ 09.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "tz+uz+vz+wz+}8+K1+L1+{c+xz+yz+zz+Ci+Di+Az+Bz+:8+$+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ ]y+Cz+Dz+Ez+Fz+Gz+Hz+Iz+ S.>]+<;+Mk+Jz+>v+0c+Kz+^4+$9+}1+&a+;6+E5+E5+E5+E5+&0+E7+E7+E5+A+fj+$r+D)+!h+,A+'A+;h+|j+)A+!A+~A+mc+>6+>6+^u+e7+re+{A+R2+S2+A_+e,+67+bq+ry+]A+ty+^A+/A+(A+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E7+F4+B5+ac+_A+:A++bA+Z>+cA+dA+eA+fA+gA+hA+iA+jA+kA+lA+mA+lh+mh+hn+nh+nh+nA+3d+oA+Vy+pA+qA+]f+rA+sA+tA+.z+uA+O}+`R.y6+1R.vA+wA+xA+yA+zA+AA+G3+wn+Pj+BA+CA+DA+EA+FA+cl+ ,+3!+J0+GA+HA+IA+JA+_1+Rd+Qb+>6+}1+0c+KA+LA+MA+.k+He+>6+mc+&a+rc+(a+hp+js+NA+OA+3!+f,+d,+Mk+bt+PA+=i+QA+RA+SA+J2+Ge+t7+ub+e7+%g+<4+z|+%>+0>+B@+0>+_<+V/+t<+k4+n4+In+@0+0i+I2+lc+&a+k4+N2+E7+E5+E5+E5+E5+E5+z4+Gm+TA+)u+tp+50+0>+B@+0>+UA+Ob+VA+WA+yp+XA+b7+E5+C4+W7+He+Bp+YA+^r+b>+50+@T.!X.5z+R/+ZA+(i+`A+`A+q7+q7+q7+d7+d7+d7+ B+.B++B+@B+q7+d7+#B+Sv+$B+%B+&B+*B+=B+-B+;B+>B+,B+'B+)B+!B+~B+{B+]B+^B+/B+_8+$+ $+ %+ (B+>8+_B+:B+C0+]+<;+Dm+Nk+bB+,q+cB+62+E4+N8+]a+E5+E5+E5+E5+E5+E5+E5+E5+&a+qc+dB+eB+fB+gB+hB+iB+K~+Qz+_]+jB+kB+lB+mB+nB+Rm+qc++Qr+Rr+9q+E5+D4+DB+}l+EB+,6+l7+B5+^u+>h+,h+'h+FB+GB+e,+67+HB+IB+JB+KB+LB+MB+NB+^0+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+&a+Rd+Wv+OB+PB+QB+=0+{2+9l+RB+Cy+.n+SB+D)+1R.}R.TB+UB+VB+WB+XB+@7+#p+#p+$p+YB+ZB+`B+ C+.C+t5+ S.dl+Z>++C+@C+#C+$C+6*+%C+&C+*C+=C+zj+xj+zj+mh+-C+;C+;C+>C+,C+'C+)C+!C+~C+{C+]C+^C+%8./C+(C+yh+_C+y6+x-+:C+w'.+U!+d,+B:+6C+7C+dp+8C+sc+72+F4+,6+[a+90+^g+Jf+Wh+,i+Qb+9C+N8+N8+8j+is+1a+0C+.u+aC+Z>+3!+d,+U!+bC+*i+cC+dC+eC+pe+9j+|a+B5+h0+e7+%g+<4+z|+%>+0>+O{+0>+fC+gC+^9+b7+B4+b7+/4+;r+hC+iC+&a+Qb+72+;6+E5+E5+E5+E5+E5+z4+Gm+vs+)u+tp+50+0>+ -+c>+jC+kC+lC+mC+D7+0j+E5+E5+C4+W7+He+nC+oC+pC+#T.{{+f{+f{+;c+qC+rC+sC+F5+m7+^4+^4+^4+^4+^4+^4+^4+tC+tC+/i+^4+^4+uC+vC+wC+xC+v].yC+KE qs Of Of Of os zC+AC+BC+CC+DC+EC+. y# $+ $+ $+ hm+%5+FC+jm+C0+N{+ -+GC+HC+km+IC+JC+d+ Wc.0@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "R=.6+]a+C4+tb+Un+Q8+,6+;6+^4+Vn+yb+;D+Tn+>D+,D+'D+Wt+3!+#/+N>+)D+Rr+9q+{a+M8+sb+Ro+-6+&a+{4+Rd+v2+90+*9+3j+!D+U2+3!+D)+ms+Cc+~D+{D+]D+/g+2a+&a+F4+F4+&0+E5+E5+E5+E5+E5+E5+E5+E5+&a+Gm+Vh+^D+/D+(D+_D+:D+j+[D+}D+nb+//+],+<,+|D+1D+2D+3D+4D+5D+*z+Pj+Pj+)|+6D+7D+Tf.8D+9D+ S.M~+0D+aD+bD+cD+dD+eD+fD+gD+hD+iD+jD+kD+in+jv+jv+lD+mD+nD+oD+pD+qD+rD+sD+tD+uD+vD+wD+xD+yD+,0+}R.$/+x-+zD+AD+BD+CD+DD+ED+Gh+FD+GD+HD+ID+JD+KD+LD+Z>+:^+e,+B:+Ph+cp+MD+ND+Ww+U8+]4+;6+&a+Ab+To+OD+PD+QD+qe+Xl+He+N8+RD+SD+TD+UD+ks+Nn+ms+$r+:^+U!+bC+VD+ty+Xg+WD+;r+!4+0c+B5+h0+e7+%g+<4+z|+%>+0>+B@+0>+XD+YD+%e+^u+B4+|a+D7+ZD+ya+qp+&a+]4+C5+D5+E5+E5+E5+E5+E5+A4+F4+vs+)u+`D+50+0>+B@+B@+ E+.E++E+@E+G8+_k+E5+E5+C4+C4+E7+Rd+#E+$E+)8+p/+2e+U|+O/+%E+&E+*E+=E+ub+^4+^4+^4+^4+Rg+Rg+/i+-E+-E+;E+Rg+^4+J[+>E+,E+'E+c>.af )E+Pf Of Nf J8 [d !E+_%+IO.~E+{E+]E+. y# $+ $+ %+ (B+M. FC+jm+C0+N{+ -+ -+4r+^E+/E+JC+d+ Wc.0@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "pT 0>.KC+LC+Vs+'5+L1+;!+yz+{[+6w+QC+Di+(E+5`.G0+Lr.y $+ $+ %+ `@ #. 6. @. `@ T0+5B+6B+_E+:E++#/+!h+)v+5t+9q+!k+t8+ o+Qo+=k+z4+F4+B5+n2+f5+2j+3j+eE+fE+3!+D)+Dn+gE+hE+iE+]D+jE+t2+Tc+;6+F4+E7+E5+E5+E5+E5+E5+E5+E5+z4+E7+kE+Un+lE+mE+nE+oE+pE+qE+rE+[D+sE+nb+{5+R!+@z+tE+uE+vE+wE+xE+yE+zE+/f+!|+AE+BE+CE+DE+EE+38+1R.[:+Kj+FE+GE+HE+IE+sZ.JE+KE+LE+ME+NE+OE+PE+QE+RE+SE+TE+UE+VE+WE+XE+YE+ZE+`E+ F+.F++F+@F+#F+Jj+$F+-4+7E+%F+&F+*F+=F+-F+;F+!|+>F+,F+'F+)F+!F+~F+{F+d,+;4+e,+B:+P:+bs+]F+^F+{2+Rg+]4+72+F4+=k+/F+(F+PD+Wl+qe+Xl+He+N8+_F+80+:F++0>+B@+0>+ts+^k+'g+>u+z4+F8+D7+|F+c2+1F+l4+62+^4+D5+E5+E5+E5+E5+E5+Sd+k4+2F+)u+`D+!X.0>+B@+&>+3F+4F+5F+@E+Gm+z4+E5+E5+E5+E5+E5+^4+6F+7F+8F+~{+f{+f{+Cs+9F+0F+aF+Xn+=0+/4+/4+^4+62+If+04+/g+bF+cF+dF+52+^4+J[+>E+eF+fF+gF+hF+iF+Pf Of Nf F- Ul jF+kF+lF+mF+nF+oF+y $+ $+ $+ %+ pF+@+ qF+jm+C0+p/+/`. -+4r+rF+sF+tF+d+ R=.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", ".e.Gg 1B+[8+J1+'5+L1+'y+B:+M1+uF+/c+hg+vF+`s+de+09.y $+ $+ $+ %+ O O %+ `@ T0+5B+6B+_E+:E+6+dB+eB+xF+yF+zF+AF+S!+BF+(t+CF+DF+Tz+EF+FF+{a+R8+32+B5+Dd+GF+HF+IF+JF+-n+%_+4q+:]+KF+LF+MF+NF+OF+ua+Gm+Gm+Rd+72+M8+Q8+E5+]a+N8+N8+z4+Ng+PF+;r+&t+QF+RF+SF+,v+'v+Z>+D)+f,+TF+g|+9q+D5+[1+E4+UF+|a+D5+M8+&0+ua+b<+!6+3j+VF+fE+3!+D)+ms+WF+XF+YF+ZF+`F+ G+.G+S8+E7+E7+E5+E5+E5+E5+E5+E5+b<+b7+M8+m2++G+@G+#G+$G+%G+7l+&G+*G+=G+.n+>!+by+J0+Jj+-G+;G+>G+,G+'G+)G+zE+!G+!|+~G+{G+]G+^G+/G+C&+ S.[:+r'+(G+_G+:G++0>+B@+0>+ts+^k+r<+:F+;6+F8+/4+!4+!4+Yq+D5+^4+^4+b7+E5+E5+E5+E5+E5+Sd+&a+2F+)u+`D+!X.0>+B@+0>+MG+NG+OG+PG+^i+F4+B4+E5+E5+E5+E5+h0+QG+RG+SG+Q7+P{+oY.#8+TG+UG+VG+t<+62+tb+tb+^4+]4+{a+82+A5+WG+XG+YG+/4+^4+ZG+`G+eF+ H+.H++H+*O je Of Of #r @r @H+#H+$H+%H+&H+*H+O. y $+ $+ $+ =H+-H+=c+jm+;c+p/+/`. -+4r+;H+>H+,H+R=.R=./+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "fo+tm+go+wz+J1+ho+L1+]c+e,+pm+fg+gg+'H+)H+!H+de+Wc.0@ $+ $+ $+ $+ $+ y# y# `@ ~H+5B+6B+SC+{H+]H+^H+/H+ S.y'+<;+Mk+(H+Eu+:a+_H+N8+N8+P8+E4+E5+E5+&0+F4+l7+,6+N8+N8+]a+Xl+:H+(q+=A+!+S!+BF+}H+|H+kB+lB+1H+2H+G8+E5+k4+l7+;6+3H+4H+5H+6H+@!+%_+!5+7H+8H+9H+MF+0H+H2+B5+B5+{a+Qb+F4+02+S8+$9+Kg+Lg+[a+z4+tb+aH+KA+-v+bH+cH+dH+eH+k|+d,+67+3!+fH+my+9q+@j+[a+%9+$9+|a+S8+b7+E5+!2+b<+2j+gH+hH+dl+cl+D)+g,+iH+jH+kH+lH+mH+nH+oH+Rv+E5+&a+E5+E5+E5+E5+E5+E5+E5+b7+62+pH+qH+rH+sH+tH+9c+!t+uH+vH+Cy+wH+ej+67+T!+xH+Mu+yH+zH+AH+BH+CH+DH+EH+F3+FH+GH+HH+IH+JH+KH+9T.y6+2|+yz+LH+MH+NH+OH+PH+o:+83+QH+RH+{:+SH+TH+UH+VH+WH+XH+YH+ZH+rG+`H+ I+.I++I+@I+#I+$I+%I+of+2R.=&+&I+*I+=I+-I+;I+>I+>I+,I+'I+)I+!I+~I+{I+]I+^I+Z>+U!+3!+pm+'f+/I+(I+_I+T8+&a+nc+sc+Qb+:I+*e+Zq+DG+,i+Qb+9C+N8+N8+[1+M2+Tg+Hv+Iv++U!+f,+i,+T(+kx+[I+}I+eC+!v+/4+^4+^4+(4+e7+f7+<4+z|+%>+0>+B@+0>+Pd+^k+/k+`f+D5+Ap+Ng+db+Bd+cb+62+^4+F8+b7+E5+E5+E5+E5+E5+V7++B@+0>+|I+1I+2I+3I+4I+M2+B4+E5+E5+E5+b<+5I+6I+7I+8I+9I+/`.P{+1W.N{+0I+aI+bI+Td+9i+84+62+{a+72+72+;6+cI+cI+]4+^4+^4+ZG+>E+eF+dI+gu.eI+~Y ke Of |(.|(.&O fI+gI+hI+iI+jI+kI+X+ Gg $+ $+ y# lI+mI+nI+jm+f/+P7+ -+ -+4r+oI+pI+*5+5W.09.O. $+ $+ $+ $+ $+ 0@ 0@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "Zp+`p+ q+.q+yi+Ws+L1+;4+e,+pm+fg+gg+Di+qI+rI+sI+t. O-.$+ $+ $+ $+ $+ y# tI+uI+vI+wI+xI+yI+zI+AI+hr+ir+ S.>]+<;+Mk+fw+gw+-u+BI+sc+N8+P8+E4+E5+;6+N2+[1+8j+rc+N2+D5+|a+F4+CI+Si+DI+EI+FI+GI+r;+;t+R:+HI+5y+6y+rr+II+E5+E5+&a+}1+$9+JI+KI+LI+MI+NI+OI+we+PI+QI+RI+SI+TI++9+32+.k+@9+Q8+,6+]a+$9+k4+re+N8+P8+b<+0j+'u+1z+UI+9b+VI+WI+XI+S!+d,+S!+Z>+YI+ZI+9q+tr+Jb+Ie+oy+Ti+E4+$9+l4+v2+f5+*9+`I+ J+.J+ms+ ,+d,++J+@J+Sn+#J+$J+%J+&J+B4+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+I7+72+3k+*J+=J+-J+;J+>J+,J+'J+=G+Yo+Jo+)J+^^+8q+!J+~J+{J+]J+^J+/J+(J+_J+4x+:J++:^+d,+Mk+AJ+cx+BJ+CJ+N2+]4+b7+$9+nc+DJ+(z+fs+EJ+FJ+]a+qe+E7+F4+{4+l7+Sr+hx+jp+ls+ms+cl+f,+B:+GJ+HJ+IJ+JJ+KJ+ny+Yf+LJ+{a+ub+e7+f7+<4+z|+%>+0>+B@+0>+ts+^k+q<+l4+|F+MJ+db+NJ+|F+rx+l4+^4+F8+b7+E5+D5+D5+b<+E5+z4+Gm+vs+)u+OJ+oY.0>+B@+C@+PJ+QJ+RJ+@E+Gm+z4+E5+E5+E5+E5+B4+@g+SJ+TJ+UJ+-c+E+.K++K+@K+#K+:i.^d TB f+.$K+%K+&K+*K+=K+-K+;K+>K+,K+Gg $+ $+ $+ 'K+*c+)K+!K+>c+/`.O{+ -++5+k<+~K+{K+&5+y %+ $+ $+ $+ $+ %+ ^8+a@ 0@ y# $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "8r+9r+Us+ar+}8+Ws+L1+]c+e,+pm+fg+gg+Di+io+]K+]f.t. Q. $+ $+ $+ $+ $+ y# ^K+/K+(K+%q+_K+:K+]+<;+Mk+fw+|K+cb+1K+Gm+,6+]a+^a+k4+N2+k4+}1+$9+sc+N2+C5+62+F4+2K+Si+3K+4K+lw+HB+r;+;t+R:+4y+2E+6y+pw+5K+>6+^a+}1+}1+32+6K+7K+8K+9K+0K+<~+V6+}_+aK+bK+cK+j4+dK+eK+LG+@9+tr+N8+N8+}1+F4+l7+fK+fK+gK+;i+hK+iK+jK+kK+lK+Fo+mK+S!+c,+S!+d,+nK+>n+*v+B4+k2+RA+oK+|l+N8+,6+;6+v2+pK+No+`I+qK+rK+#r+ ,+Z>+eH+sK+Sn+tK+U8+O2+&a+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+X7+j4+uK+$0+#0+vK+ab+wK+xK+yK+zK+Jo+AK+BK+CK+DK+EK+FK+GK+HK+IK+JK+KK+Fh+LK+MK+7A+NK+.=.OK+PK+y-+Ta+`-+QK+RK+SK+TK+UK+VK+WK+XK+YK+ZK+`K+M9+:b+zE+/f+rG+ L+DD+.L++L+;F+@L+#L+$L+%L+1R.fj+&L+*L+=L+-L+;L+>L+,L+'L+F3+)L+!L+~L+{L+B}+]L+^L+/L+(L+3!+$r+3!+Dm+Yu+_L+:L++0>+B@+0>+ts+;u+q<+ o+3L+4L+Bd+wg+5L+qp+l4+62+F8+b7+E5+D5+G8+z4+z4+M8+Gm+vs+)u+6L+N{+0>+B@+&>+7L+8L+9L+0L+M8+aL+E5+E5+E5+E5+Q8+(4+w2+bL+cL+dL+z>+%>+ -+VJ+u4+ (+eL+fL+gL+Rg+ B+84+Ap+yb+5l+}l+(k+b7+Gm+;6+bz+hL+iL+jL+kL+lL+mL+nL+oL+pL+qL+rL+sL+tL+uL+vL+wL+xL+yL+Gg $+ $+ $+ zL+AL+BL+CL+v+]4+PL+Gm+&a+&a+k4+l7+[1+}1+B4+Q8+}1+>6+F4+Dd+Qb+jr+QL+RL+SL+TL+On+r;+BF+(t+CF+DF+Tz+UL+VL+c7+nc+]a+[1+M2+WL+XL+YL+ZL+`L+ M+.M+Ar++M+@M+#M+$M+%M+&M+*M+If+Jb+P8+R8+M8+C5+ua+^i+80+=M+-M+;M+>M+,M+'M+)M+~q+!5+V-+'v+r;+A8+!M+~M+*v+M8+I7+RA+wg+#9+[a+>6+F4+{4+Sg+aq+`I+{M+G~+$r+ ,+Z>+]M+sK+Sn+#}+U8+s2+&a+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+X7+Ng+sx+Ul+^M+/M+(M+_M+>j+yK+zK+ej+(3+:M+6+E7++1+JM+gs+KM+LM+WA+MM+t<+U7+[1+Ui+hp+js+NA+OA+3!+3!+f,+]^+/3+NM+OM+3K+Rg+bk+n5+Rg+62+s7+e7+f7+<4+z|+B@+0>+B@+0>+ts+^k+q<+-6+`j+#j+Un+J2+5L+Wr+M8+^4+^4+b7+E5+b<+z4+;6+;6+]4+Rd+vs+'r+PM+#8+%>+B@+0>+QM+RM+SM+TM+F8+m7+E5+E5+&a+&a+Q8+eC+Yf+UM+J|+VM+z>+&>+B@+)8+~{+WM+XM+~<+YM+ZM+`M+27+G8+|a+$a+ N+0j+]4+Gm++k+.N++N+@N+#N+$N+%N+aL.aL.&N+*N+=N+-N+;N+>N+,N+'N+)N+!N+yL+Gg $+ $+ $+ Q. ~N+{N+]N+@(+[(+HC+<(+GC+>c+^N+/N+(N+[e+_N+6. #. m) Gg y+,y+.q+}8+Ws+L1+]c+e,+pm+fg+Ci+qm+|N+vu+mm+$+ $+ $+ $+ $+ $+ $+ $+ $+ %+ T0+1N+2N+3N+4N+5N+6N+Du+ S.y'+<;+Dm+Nk+Ok+7N+Pk+72+E5+E5+&0+;6+Ui+}1+Q8+S8+mc+}1+sc+B5+Yh+}7+eB+1E+8N+lw+ms+r;+7^+zh+|H+kB+lB+1H+9N+Yh+0N+nc+k4+Rd+aN+bN+cN+dN+7q+eN+fN+~q+gN+hN+ j+iN+jN+iK+va+Qb+8j+[1+{a+U8+52+O2+kN+*o+lN+mN+nN+oN+pN+qN+rN+sN+I~+`>+`>+#/+A8+tN+}j+uN+4l+!k+|j+5l+vN+%9+He+B5+)3+wN+,h+R2+xN+T2+e,+<'+Z>+/v+2l+Sn+Vw+04+O2+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+E5+62+Ap+yN+}l+4L+zN+}A+By+AN+BN+CN+ej+J0+DN+EN+FN+GN+HN+IN+JN+KN+LN+MN+43+!|+'L+Mt+NN+ON+PN+QN+RN+V6+y6+SN+TN+UN+VN+WN+XN+YN+ZN+`N+!|+(f+ O+kM+4n+(f+.O+ L++O+@O+#O+$O+%O+&O+*O+tS.L~+//+=O+-O+;O+>O+,O+'O+)O+!O+~O+{O+]O+^O+/O+(O+_O+:O++Mk+}O+|O+1O+2O+8j+[a+,6+He+{a+Yf+LA+3O+4O+to+5O+6O+7O+8O+8j+is+1a+0C+.u+.m+Z>+Vq+cl+AF+9O+~h+=i+0O+'6+U8+^4+^4+^4+(4+e7+f7+<4+Nb+B@+0>+B@+0>+ts+^k+q<+Sd+xg+lc+B5+yb+J2+3k+Rg+^4+F8+b7+E5+E5+E7+N2+B5+{a+Rd+vs+aO+S|+Gs+%>+C@+0>+:<+bO+cO+dO+Ap+0j+E5+E5+E5+E5+Ti+!4+eO+bk+fO+gO+hO+h)+B@+N{+VJ+B@+q/+iO+jO+kO+lO+42+&e+&e+ua+62+62+t7+F4+nc+mO+nO+oO+pO+qO+rO+Y4.sO+tO+uO+vO+wO+xO+yO+zO+AO+BO+CO+yL+Gg $+ -8+$+ P+,P+'P+~5+:]+)P+Ko+!P+~P+{P+]P+^P+/P+(P+_P+:P+{+&>+O{+0>+ts+^k+>Q+k4+Wv+90+B5+Fe+,Q+*6+^4+^4+F8+b7+E5+E5+E7+Qb+B5+{a+Gm+vs+'r+'Q+p/+&>+C@+0>+)Q+!Q+~Q+54+{Q+ac+&a+Qb+M8+Wr+5L+]Q+Yq+tb+U5+^Q+/Q+_<+0>+C@+ -+B@+B@+(Q+_Q+:Q++Mk+CQ+bB+&A+DQ+^4+}1+EQ+FQ+00+D5+M2+[1+E4+M8+62+92+C5+k4+:H+QL+GQ+HQ+)P+HB+|R.;t+IQ+JQ+^q+KQ+LQ+MQ+Ap+;6+rc+%9+8j+yB+NQ+OQ+PQ+Hr+OI+QQ+<]+F!+-4+RQ+SQ+TQ+UQ+VQ+WQ+G2+XQ+XQ+YQ+ZQ+`Q+ R+.R++R+@R+#R+$R+Qn+:^+3!+>4+#/+#/+#/+S!+d,+%R+&R+*R+Je+52+=e+hC+=R+a<++k+ua+^9+M8+1l+gH+VF+fE+3!+D)+HB+-R+;R+>R+,R+t8+w2+^0+^0+E7+F4+B5+E7+^0+^0+^0+N2+l7+>6+k2+@9+sx+wg+_h+.j+'R+)R+!R+~R+{R+]R+5!+Wt+cl+ax+sg+^R+gP+/R+(R+_R+:R+{+&>+O{+0>+ts+^k+KR+:1+z4+D5+LR+MR+;r+Yq+G8+^4+0c+b7+^0+^0+E7+F4+72+{a+Rd+TA+)u+NR+50+&>+c>+0>+Nb+OR+PR+r8+Un+QR+l4+M2+M8+K2+00+Sd+b<+F8+L2+RR+SR+TR+D0+[B+B@+B@+/`.)8+Cs+UR+VR+WR+XR+YR+1i+QG+ZR+SJ+SJ+`R+ S+.S++S+@S+#S+$S+%S+&S+*S+=S+>o+b>+-S+;S+>S+,S+'S+)S+!S+O. $+ $+ y 09.P. y# 4w+~S+N{+B@+%>+B@+jQ+{S+Js+]S+^S+/S+(S+_S+y0+Z4+Z4+=5+:S+]+1R.^,+Ta+o,+@T+#T+$T+%T+&T+*T+=T+-T+;T+IS.>T+,T+'T+)T+!T+~T+x-+l;+tS.{d+{T+]T+^T+/T+(T+_T+oP+1R+:f+H3+:T++O{+0>+ts+;u+r<+:F+yg+,i+kT+JM+lT+1F+M8+LJ+0c+ct+^0+^0+^0+l4+t8+]4+v2+TA+)u+OJ+!X.%>+oY.0>+mT+nT+oT+pT+n5+Ng+WD+t8+l4+Tc+&J+B4+&a+M8+!k+84+qT+rT+sT+D<+N{+P{+!X.+IT+JT+KT+LT+MT+NT+OT+PT+`@ %+ $+ y 9@ zL+QT+RT+U+0B+aB+ S.U-+d,+y]+,U+'U+&1+)U+JR+!U+oc+oc+l4+cI+%f+LR+JR+dK+42+42+!2+Jb+~U+{U+op+2y+Uk+@:+xr+]U+3}+JQ+^U+/U+{n+(U+ya+_U+:U+V+,V+'V+)V+!V+~V+{V+d,+J0+c,+Dm+]V+^V+/V+ex+%f+ct+^0+(V+_V+:V++0>+O{+0>+Nb+aV+bV+:F+02+=e+/z+pe+00+qp+9T+*e+*e+WD+9T+Q8+Jc+Jc+Q8+D5+&A+cV+dV+eV+U|+#T.}<+ -+#o+fV+gV+hV+yp+8i+/4+Tc+l4+cI+ta+F7+iV+m4+]4+(4+!2+Ex+jV+kV+lV+mV+nV+oV+pV+C0+'8+!X.b>+50+qV+rV+sV+tV+uV+vV+wV+xV+yV+zV+AV+Np+BV+&<+^>+U|+c>+@T.CV+DV+EV+FV+GV+HV+IV+wu+8@ %+ $+ $+ zL+pQ+7r+JV+B0+KV+B@+ -+B@+B@+ -+LV+MV+MV+NV+OV+PV+PV+PV+ 5+QV+v>+V<+RV+SV+TV+/8+%+ $+ $+ $+ $+ ", "UV+yQ+vz+[8+VV+WV+K)+%i+]c+Bk+XV+YV+vQ+6S+7S+yQ+$+ %+ $+ $+ $+ $+ $+ $+ y v* ZV+`V+ W+.W++W+@W+#W+$W+%W+fd+)z+/^+&W+*W+=W+-W+;W+>W+,W+'W+)W+!W+~W+{W+]W+^W+/W+(W+_W+:W+v_++y-+jW+kW+lW+mW+nW+oW+<'+Z>+67+pW+qW+rW+sW+tW+uW+vW+e<+wW+xW+yW+~W+zW+AW+BW+CW+DW+EW+bq+@!+xz+FW+GW+HW+IW+JW+KW+aW+)W+)W+)W+aW+)W+)W+)W+aW+~W+aW+aW+aW+LW+MW+NW+OW+PW+QW+RW+SW+TW+UW+VW+;!+ ,+WW+XW+YW+ZW+`W+ X+.X+I7++X+@X+#X+$X+%X+Gh+&X+*X+=X+-X+;X+>X+,X+'X+)X+!X+ S.9T.~X+g:+_l+{X+]X+^X+/X+(X+_X+:X++0>+0>+0>+QX+RX+SX+TX+UX+VX+WX+XX+Gv+YX+aW+KX+~W+aW+aW+)W+bW+bW+ZX+`X+N[+ Y+.Y++Y+1W.p/+*y+O{+!>+@Y+#Y+$Y+V7+Pb+%Y+)W+aW+w_+&Y+*Y+*Y+=Y+LW+xX+-Y+;Y+>Y+,Y+'Y+)Y+!Y+)1+a>+@T.#T.%>+c>+50+}<+@e+~Y+&y+2z+{Y+]Y+Ip+Fs+Mp+nV.u%+~X.BV+Np+u%+UT.~X.^Y+/Y+(Y+_Y+'S+:Y+7. |r+6. O $+ /+ Q& 9@ ee++%>+ -+q/+9/+1Y+}(+2Y+VJ+VJ+VJ+<<+/r+[B++-+3Y+4Y+TV+(8+$+ $+ $+ $+ $+ ", "mm+nm+5Y+6Y+7Y+8Y+9Y+0Y+A8+aY+bY+cY+dY+eY+fY+fo+$+ %+ $+ $+ $+ $+ $+ $+ y v* pz+gY+hY+iY+jY+kY+lY+mY+5-+nY+m;+m;+oY+pY+qY+rY+sY+tY+uY+vY+wY+xY+yY+zY+AY+BY+CY+DY+EY+FY+GY+HY+IY+JY+KY+LY+.;+MY+NY+OY+PY+QY+RY+SY+TY+UY+VY+WY+XY+YY+ZY+`Y+ Z+.Z++Z+@Z+#Z+$Z+.,+%Z+&Z+>]+>]+w)+A-+z-+J^+v~+[~+J^+q;+p;+*Z+&|+=Z+-Z+;Z+>Z+,Z+'Z+)Z+!Z+y-+<;+9T.~Z+{Z+]Z+^Z+/Z+(Z+_Z+:Z++n;+&L+wh+MZ+NZ+OZ+w'.PZ+QZ+RZ+SZ+wn+TZ+UZ+VZ+WZ+XZ+YZ+ZZ+`Z+ `+.`++`+@`+#`+$`+%`+5-+y-+y-+bx+&`+*`+=`+-`+;`+>`+,`+'`+)`+!`+~`+{`+]`+^`+^`+^`+[Z+/`+(`+_`+:`+<`+[`+%`+p;+x-+<;+}`+|`+1`+2`+3`+4`+FY+FY+dZ+5`+6`+7`+8`+9`+>{+c>+b>+0>+0`+a`+b`+c`+d`+e`+f`+g`+h`+i`+j`+k`+vY+FY+l`+aZ+aZ+m`+vY+n`+o`+p`+q`+r`+pY.a>+mV+c>+s`+t`+u`+v`+w`+x`+y`+z`+A`+B`+m`+C`+D`+E`+wY+E`+F`+G`+H`+I`+J`+K`+L`+M`+N`+O`+P`+c>+b>+UT.+T.b>+C@+&>+%>+Es+O4+~{+ST.u%+u%+u%+pY.oV+Q`+R`+S`+T`+U`+V`+W`+X`+Y`+Z`+Gg Q& 9@ %+ $+ Gg O. 0@ ``+ @+@ @[(+q/+O{+d0+d0+d0+d0+O{+O{+q/+oY./`.O{+P7+# @4Y+$ @(8+%+ $+ $+ $+ $+ ", "Gi+nm+5Y+6Y+% @& @* @= @7e+- @; @> @, @' @7W.:8+$+ $+ $+ $+ $+ $+ $+ $+ $+ Q& ) @1N+! @~ @{ @] @^ @/ @( @Xu+_ @!X+: @< @[ @} @| @1 @2 @3 @4 @5 @6 @7 @8 @9 @0 @a @b @c @d @e @f @g @h @IQ+g]+i @2f+j @k @l @m @n @o @p @q @r @s @t @u @v @w @x @y @z @A @B @C @D @$F+'v+R-+w)+{d+z-+z-+X6+w)+.S.z-+E @F @G @H @I @J @K @L @M @N @O @PI+p(+:;+P @Q @R @S @T @U @V @W @X @Y @Z @` @ .@..@+.@@.@#.@$,+P)+$.@d[+%.@&.@*.@=.@-.@;.@>.@,.@,.@'.@).@!.@~.@{.@].@^.@/.@(.@_.@:.@<.@[.@}.@|.@1.@2.@3.@4.@5.@6.@P,+7.@m-+8.@9.@0.@a.@b.@c.@d.@e.@f.@g.@h.@i.@j.@k.@l.@m.@6*+='+n.@o.@p.@q.@r.@s.@t.@u.@v.@],+Z>+:^+ ,+ ,+ ,+ ,+z-+{d+w)+R!+_,+J^+F @w.@x.@y.@z.@A.@B.@C.@D.@E.@jJ+F.@G.@H.@I.@J.@K.@L.@M.@N.@O.@P.@Q.@R.@S.@1|+v.@|~+]d+T.@U.@V.@W.@X.@Y.@Z.@`.@ +@.+@++@@+@#+@$+@%+@&+@*+@=+@-+@;+@>+@,+@'+@)+@1f+!+@~+@X-+{+@]+@^+@/+@(+@_+@:+@<+@[+@$/ }+@|+@1+@2+@3+@x=+Gs+ST.4+@5+@6+@7+@8+@9+@0+@a+@b+@c+@d+@e+@f+@g+@h+@i+@i+@j+@k+@l+@m+@n+@o+@p+@D|+`'+Cs+`'+q+@r+@s+@t+@u+@v+@w+@x+@y+@z+@A+@B+@C+@D+@).@E+@F+@G+@H+@I+@J+@K+@L+@M+@N+@O+@P+@Q+@oY.!X.{{+.-+R+@S+@T+@U+@V+@W+@,{+C|+X+@X+@Y+@Z+@`+@ @@.@@+@@@@@#@@$@@%@@&@@*@@v* Q& %+ %+ $+ y y 0@ |~ =@@uQ+-@@;@@>@@,@@'@@)@@GC+&>+&>+&>+0>+IO+!@@)@@e)+O{+B@+2e+^N+4Y+~@@/8+%+ $+ $+ $+ $+ ", ":8+Vc.{@@]@@^@@/@@(@@_@@:@@<@@[@@}@@|@@1@@F3 Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ `@ ]y+5B+2@@3@@4@@5@@6@@7@@8@@9@@0@@a@@b@@c@@d@@e@@f@@g@@h@@o;.uB i@@j@@k@@%y l@@m@@,G n@@o@@p@@q@@r@@s@@t@@u@@v@@w@@x@@y@@z@@A@@B@@C@@D@@E@@}! K} .3 F@@j@@'$ G@@H@@I@@$p.OV.J@@K@@L@@M@@N@@O@@P@@Q@@R@@K^+S@@T@@U@@V@@W@@X@@Y@@Z@@`@@ #@.#@+#@@#@##@$#@%#@&#@*#@=#@-#@;#@>#@,#@'#@)#@6h.J} '> [$ !#@#-.&n.~#@{#@]#@^#@/#@(#@_#@:#@<#@[#@}#@9J.e@@b>.|#@1#@2#@3#@4#@5#@/p.Ut.zJ.>p.j* MS..u 0` 6#@7#@8#@9#@0#@gi a#@b#@c#@d#@e#@f#@g#@h#@i#@j#@Wt B6 X@.L_.L_.M{.z(.k#@l#@m#@n#@o#@RW.a++p#@YX.q#@r#@s#@t#@u#@v#@qv+w#@8&+8&+x#@y#@y#@z#@A#@B#@C#@D#@p*+E#@F#@G#@H#@I#@J#@K#@L#@6Z.@Y.6 +b;+M#@N#@O#@cm.DE pe ]Y P#@Q#@R#@S#@T#@U#@V#@W#@X#@Y#@Z#@`#@ $@.$@+$@@$@#$@$$@$$@%$@B4 &$@*$@W< =$@-$@;$@1#@>$@,$@'$@)$@H,.!$@~$@a@@{$@]$@^$@/$@($@_$@:$@<$@&r s@+[$@}$@|$@1$@2$@3$@4$@5$@6$@7$@8$@9$@0$@a$@k|.E1.b$@rq c$@as.d$@e$@f$@g$@4Y.QY.h$@h$@i$@j$@k$@5= l$@m$@n$@o$@p$@q$@r$@s$@t$@u$@v$@MD.w$@x$@y$@z$@A$@B$@C$@6x.~w.Ap.D$@D$@E$@3#@F$@G$@mA H$@I$@J$@K$@L$@M$@N$@O$@P$@Q$@R$@R$@R$@S$@T$@T$@U$@V$@W$@X$@Y$@Z$@`$@ %@.%@+%@@%@#%@$%@%%@&%@*%@%& Q. $+ $+ $+ $+ %+ #. W+ =%@_N+-%@;%@>%@,%@'%@)%@!%@o1+N{+/0+N{+Mp+kQ+~%@{%@]%@@e+,o+^%@/%@$ @(8+$+ $+ $+ $+ $+ ", "O-.O-.eg+(%@_%@:%@<%@[%@}%@|%@1%@2%@3%@(%@Gg y $+ $+ $+ $+ $+ $+ $+ $+ y v* 4%@5%@6%@7%@8%@9%@0%@a%@b%@c%@d%@e%@f%@g%@h%@MS.i%@j%@k%@ke ge la.Ak 8Q ]C oi C4 6A s@+l%@m%@{d n%@o%@p%@q%@r%@s%@t%@u%@v%@w%@x%@db.!}.^#.=O Qf /O Ak (/.fe i%@Lo.y%@/O z%@A%@B%@C%@D%@E%@F%@G%@H%@I%@J%@K%@L%@M%@N%@O%@P%@Q%@R%@S%@8Q {p.T%@U%@V%@W%@X%@Y%@Z%@`%@ &@.&@on.os.AZ.+&@@&@)6.Z8 Y@.la Zy ;h #&@T# $&@%&@&&@*&@=&@-&@;&@>&@ 8 ,&@'&@ux.K~.x;.=h la yp &=.xV Z*.E;.DE &O )&@Y@.(E v~ fl !&@~&@%F.b$@{&@]&@^&@/&@(&@_&@:&@<&@[&@}&@EU 6i !'.O' mA la.0Y.cm.|&@1&@2&@3&@4&@5&@aZ.7*+6&@7&@8&@9&@0&@a&@b&@c&@d&@e&@g3+f&@g&@h&@i&@j&@k&@l&@m&@n&@o&@p&@q&@r&@s&@t&@u&@9 +v&@w&@x&@y&@z&@BS.t}.~K 5X ^_.2D k* A&@B&@C&@D&@E&@q%@F&@G&@H&@I&@J&@m. rK $-.&=.Uq.6i '- &_ K&@L&@M&@N&@Uq.tB &=.O&@}p.P&@r8.5i Q&@R&@S&@T&@U&@V&@W&@X&@Y&@Z&@J~.Ib ~Y 1K he PZ.[:.`&@ *@.*@+*@@*@#*@$*@%*@&*@**@6i T$ =*@M&.A> Bv.-*@;*@{Y >*@:i.je (/.Ak x;.^#.uk.>Y ,*@'*@)*@!*@~*@{*@]*@^*@/*@1i >U.(*@_*@:*@<*@rX.[*@:i.}*@|*@*O DE x;.yp Gk tB C: &% uz.bm.1*@2*@3*@4*@5*@6*@7*@8*@9*@0*@a*@b*@c*@d*@e*@f*@g*@h*@i*@j*@k*@l*@m*@n*@o*@p*@zs.q*@r*@s*@t*@v. 0@ y# y# $+ @. #. 6. 6. 9@ /8+(8+_8+u*@v*@w*@x*@3Y+y*@y*@y*@z*@A*@B*@C*@^N+D*@E*@F*@G*@H*@%c+$+ $+ $+ $+ $+ $+ ", "6. 6. #. . m) I*@J*@J*@J*@K*@L*@=@,=@'=@)=@!=@l. 00 ,0 5$.;w.ha #g ~++~=@{=@]=@^=@d9./=@(=@'x e^._=@Ux.:=@,@.pv ha 84 #r ka 5o OZ.<=@i'.[=@}=@|=@1=@2=@3=@4=@5=@6=@3=.ej 7o $J Nf I8 $J NM {n j9.**.fj h).4x je @y O; kC i:.m<.C:.N2 7=@8=@:~ 9=@9=@9=@9=@rz.KS.0=@a=@!,.}$ -@,-@'-@;&.tC .[ 8M os je $J os NM Nf '0 Of NM g` !,.j! ie (m.+.+)-@!-@Jf s_.~-@{-@]-@^-@/-@(-@_-@:-@<-@[-@}-@|-@1-@2-@3-@4-@7Y.5-@Kf fd yS !d b>.6-@7-@8-@9-@P. y $+ y# $+ `@ #. #. 9@ %+ $+ $+ %+ hm+S0+0-@a-@b-@c-@c-@c-@c-@c-@d-@d-@e-@f-@g-@h-@Vc.R=.0@ $+ $+ $+ $+ $+ $+ ", "@. @. %+ . vi+i-@j-@k-@l-@m-@n-@o-@Gi+. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ ]g.ZV+5%@p-@q-@r-@s-@Ww.t-@90 E'.St.u-@VZ. ^.7o m/ m/ 0L d3.6A J8 Of Of Nf I8 )n )n ha Nf Nf Nf Nf Nf /d v-@XZ.w-@x-@y-@z-@A-@f}.B-@)E+Of J8 J8 Nf Of Nf Nf Nf '0 J8 ,x !Y.C-@D-@E-@OP 4U.F-@G-@H-@I-@J-@K-@L-@M-@Oq ~> N-@jL fX.SY.O-@nA.Nf #u N2 1K P-@%Z.%Z.Q-@R-@S-@0].,d T-@U-@V-@~/ #k I8 je J8 J8 5o nm.8h.If W-@X-@Y-@Z-@`-@ ;@~m.s].nA.fe Ul #r Nf J8 J8 &N Nf yS Wh.MM [d sH N1.je @y O; CZ i:.@/ .;@Ib DE =h Ib ,r ,r ,r oe dj ]O Ly Ly ]O Wh.v& s_.!n $m._d 2=.*i.+;@@;@#;@$;@%;@&;@*;@D=@=;@-;@;;@>;@,;@';@);@!;@~;@{;@];@^;@/;@(;@_;@:;@<;@[;@};@|;@1;@2;@3;@*Y.4;@5;@6;@7;@8;@~j.Ga 6o 6o 5o J8 J8 ,0 L{ OK 9;@0;@a;@b;@c;@pX.aH.SY.d;@os &N ne fj Nf ha _O C =2 cK.e;@f;@5U #r &O Of $m.$m.Fr.:d k9.^#.{p.g;@h;@i;@j;@k;@l;@8_.ke 0f.ga NM {n wk.'D 3/.m;@n;@[i.[i.0L.@H+@H+o;@V+.#u MM K~.;h Q= ^{ jH :' 84 )n J8 J8 J8 #r #r ja 42.42.!O I8 om.p;@q;@r;@s;@@H+t;@u;@v;@w;@S7 q; 3K CF #r t}.Vl :%.-Y fj J8 &N Nf '0 ja 9L 77 nA.2$.x;@bY.y;@z;@$l.A;@B;@C;@D;@E;@F;@G;@H;@I;@J;@K;@L;@M;@N;@O;@P;@Q;@z;@:++T0 -M 0x.R;@S;@T;@U;@P. y $+ $+ $+ %+ `@ O %+ $+ $+ $+ %+ (B+@. tF+V;@TV+$ @W;@W;@W;@$ @TV+TV+X;@Y;@n)+-%@%+ 0@ 0@ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ %+ `@ #. %+ y# y# y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ a@ ZV+5%@Z;@`;@ >@.>@#R +P +>@@>@qs pa.pW _~.Nf Vl >c #r Of Nf J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 !n Ly >0 >0 Q;.#>@$>@GP.CU 77 la J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 77 ^d vL b(.yp.%>@&>@]U.%r B +*>@&r =>@->@->@O-@{O -Y fj Of Of Of Nf J8 J8 J8 !n !n ,0 ,0 xv.9].;>@YF dj GE.0Z C'.hP +{.I8 fe J8 J8 J8 J8 ka !n :%.OM $_.N; ow Qn J( zs $J )n J8 J8 J8 J8 J8 J8 ja PM v& S5 J8 J8 I8 1K 5U O; SI Md b(.P;.]d /d pW pW fj fj fj fj >0 Wh.Lb I8 Of Ek Mb :d 4o 5o fj _m.r).2=.bH.>>@,>@'>@)>@!>@~>@b;+f$+f$+SX.{>@]>@^>@/>@(>@_>@_>@_>@:>@<>@[>@t&@}>@7 +SX.RX.|>@~ +1>@2>@3>@4>@5>@6>@7>@Te h# [d J8 J8 J8 J8 >h L+.0V @k 4K -3 iI Mf Mf fj fj ka ka ka J8 J8 J8 ha >x ,$ 50 )h E> Cz H1 '0 Mf J8 J8 J8 J8 F- >c g# ^n 8>@9>@Ne.Zl (' N; I8 >h Nf Of Of NM :%.ka J8 Nf Of Nf Nf Nf Nf Nf Of Of Of J8 77 77 ;0 $b b] 96 J8 I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf #r ha NM 'D N@ *E 'n +/ V4 #u yr >c ]O _d ~n J8 J8 J8 J8 J8 J8 J8 Nf Nf F- F- J8 J8 $J 7o ps 0>@aY.dY.a>@b>@G@@kF+c>@d>@e>@;Z ))+NM Of Of Nf J8 i! f>@*`.g>@h>@i>@j>@X+ Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ /8+(8+(8+(8+(8+(8+(8+(8+/8+[e+#y+`@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ s3.k>@5%@l>@m>@n>@83.o>@~9.p>@8Q :%.fj J8 Of Nf F- Vl F- J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 [P }Z q}.@u.(s Co.^v 76 8Q he J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 77 ^d

    @me (d Q,.Q,.5$.&G.2=.;w.;w.pW Nf J8 Of Of Nf F- >c fz `*.{%+(Y 77 77 HI MJ /!.YF dj ##.DG.5H r>@s>@k9.,h J8 J8 J8 J8 J8 J8 '0 ha TB N@ *E 'n J( U4 ha ^d Of Of _~.pW g` |[ >c Vl I8 J8 J8 J8 #r Ib g6 3o.^&.:/ 3o.x t>@u>@v>@w>@x>@y>@z>@A>@B>@z;+C>@D>@E>@F>@G>@H>@H>@I>@G>@n.@J>@K>@L>@M>@N>@O>@P>@Q>@R>@S>@T>@U>@V>@W>@j9.wL #r J8 J8 J8 J8 J8 fe cQ zj >n.M0..x.)w 9L S5 J8 J8 J8 J8 J8 J8 J8 J8 ha os 1#.X>@kX 06 `7 4i ka ka J8 Nf Of Of #r -6 Ha 77 (#.[p GA :*.KH cz.Q,.m7.-Y Nf F- Vl Vl F- J8 Nf Of -Y ~n '0 J8 Nf Of Nf J8 >c o7 8Q Iv Fb Xs MO NP.AU J8 I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 '0 ]l 3! m;.dr [' 4! _O t}.F- J8 ka J8 J8 J8 J8 J8 J8 Nf Of Nf F- >c >c Ul J8 J8 Vl Ga h# ##.Y>@0>@~W.@#.0L.Z>@or `>@PZ.+#.Of 7o ]n #r J8 1G Y*.b>@ ,@.,@+,@@,@09.Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ %+ `@ `@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ y y . y X+ #,@$,@%,@&,@*,@+1.)$.JX.Mb g` -Y '0 J8 Of pW fj J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Nf J8 J8 J8 J8 J8 J8 ka }Z k9.'6 =,@4: KM wD Ap he !n J8 J8 '0 !n J8 J8 J8 J8 J8 )n ^d

    0 Vl Vl #r Of J8 J8 ka '0 4$.|I eV.{$.Xy Kd 3< ^d qs $J NM NM F- F- J8 J8 J8 Nf Nf Of J8 J8 J8 J8 J8 Nf Of Of Of qs qs 2 .;,@>,@,,@',@),@!,@~,@XW.{,@],@^,@/,@(,@F=@_,@:,@<,@[,@},@|,@1,@2,@3,@4,@5,@6,@7,@8,@ew.8h.M..Ws.wL I8 F- F- J8 J8 J8 J8 fe H1 W;.|' fi.l] !t f# F- J8 J8 J8 ka '0 J8 J8 !n >h ^d 6M Rq.;n.)V vv.F- J8 J8 J8 Nf Of Of #r ej hH ha 0L 71 ,O 1 .9,@H#+Q,.}u.-Y J8 F- 67 >c F- Nf Nf Of -Y ~n ka J8 Nf Nf Nf J8 fz g# 8Q (E B..Ah Zl c 4o Lf x' 31 0,@$r $J Of 7o @r F- J8 [d Jf V+.{[.a,@b,@c,@d,@Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ `@ |~ 0 '0 J8 Nf Nf Nf Nf s_.s_.:d J8 Nf Nf Nf Nf '0 ]O Ek s_.o>@6=@(d H1 u( gP !D fe wr F' Bd 'f /y T5 =h J8 s_.s_.ja J8 J8 I8 ha sH <6 >k l! >O k6 #r )n Nf Ek yS ]O '0 #r $J $J Of J8 !n ~n :%.CT 2I LO.L< DQ _f p;.^d H#.Vl ]O :%.S5 Vl F- J8 J8 J8 Nf Nf J8 J8 J8 J8 Nf Of Of |(.Of )n &O >` i,@j,@k,@l,@m,@n,@o,@p,@q,@r,@s,@t,@u,@v,@w,@v,@x,@y,@z,@A,@B,@C,@D,@E,@F,@G,@H,@I,@8Q HX.J,@B-@8Q Ek fz 67 J8 J8 J8 J8 fe H1 ^y >O fi.l] (E hH F- J8 J8 J8 ~n ~n '0 J8 ~n Cp ke 6M K,@;>@8).&O wL J8 J8 J8 Nf Nf Nf Nf F- #r ha &N a# :b `p L,@Tn.Mf Kb fj J8 J8 Ul 67 J8 J8 Nf Nf ne ka ka J8 Nf Nf Nf J8 MM BB ha k* t- Pu .m.P1.jA '0 >h J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 ]l '8 Sa MO 'n Y4 wL dj J8 J8 J8 J8 J8 J8 J8 J8 J8 Vl Vl F- J8 #r #r F- J8 Nf Nf #r F- J8 J8 F- Ul J8 I8 +G /O _O $J Of Of #r F- F- J8 J8 &O bt M,@a,@N,@O,@d,@Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. O-.pT P,@F3 d+ V1+&+ Q,@R,@f,@S,@T,@#r ha J8 Of Of Nf J8 >0 _d _d -Y J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf os `l.:I {U.5i.k$.Ha $D _d J8 J8 ~n _d ka J8 J8 J8 J8 77 77 .#.U,@{^ ~.>< MM -Y -Y J8 Of Of Of $J eQ Mb :d J8 J8 J8 Nf Of _d >0 0f.L#. N =i.(m.$k _/ M/ b' ie G] ug Ld 'U.eq.rs mc.ja Mb Mb S5 J8 J8 I8 I8 k* }[ wD Od X) }p '0 )n F- v& Mb :d J8 Of Of Of Of J8 ka >0 ,0 VI.V> 1d.G~.'w _9 C<.je T0 9L [P _d S5 >c 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Of Of Of os ^d } .V,@W,@lh.-! X,@NM Y,@Z,@`,@ '@.'@+'@@'@#'@$'@#'@%'@&'@*'@='@Z,@-'@;'@3# o:.s@.XE >'@fe _~._~.Nf s_.v& bh >c F- J8 J8 J8 fe H1 3i.6: tq )s 2V I8 J8 J8 J8 J8 _d -Y '0 J8 ~n Cp ,x RE 9].;>@YF fe 77 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Nf L#.a6 Jy.,'@O/.#u N2 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y _d pW F- L] +..''@FN.#k I8 fe J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 ]l Y8 Sa +/ +/ ml.ja 77 J8 J8 J8 J8 J8 J8 J8 J8 J8 >c >c Ul J8 Of Of Nf J8 Of Of Of Of J8 J8 J8 J8 J8 J8 J8 [d J8 J8 Nf Of J8 J8 J8 ja Nf GE.]q )'@!'@~'@{'@09.Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ m) R=.]'@^'@/'@/'@/2.$,@('@_'@:'@<'@ha 77 J8 J8 J8 J8 J8 67 Vl ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ~n -Y ka J8 J8 J8 J8 ka }Z }Z 7o qb.Jw.v( }c hH 7%.S5 J8 J8 J8 ka J8 J8 J8 J8 J8 77 77 Iv 8: Mi ,6 Qs $J NM NM J8 J8 Nf Nf Of S5 ja J8 J8 J8 J8 Nf $J _O 0f.O#.2k ew.['@}'@e<.ix |'@:f WI G] Q] 8: 1'@yc.dj he Wh.!,.g` >0 J8 J8 I8 I8 ns xP zj [] <] D3.ha fe J8 S5 ja J8 J8 J8 J8 J8 J8 J8 F- #u rs mW *! +/ @{.HX :*.b' -h dj #r Nf ka J8 F- J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 '0 ~n -Y Of >x ,x !` {u .@.2'@3'@G7 #g ,x Bi.K=@4'@5'@6'@7'@8'@9'@0'@a'@b'@Y,@c'@d'@e'@f'@g'@h'@aH i'@ie ^n -Y fj J8 J8 F- #r Nf J8 J8 J8 J8 fe #y fi.x~ Q} )s 2V I8 J8 J8 J8 J8 ka J8 J8 J8 NM hb.oa.j'@k'@l'@m'@>h qs Of Of Of J8 J8 Nf Of Vl Vl #r Nf 3g XE y>.FN.#k I8 fe J8 J8 J8 J8 J8 Nf #r Vl 67 ]O ~n fj J8 J8 J8 J8 J8 ka ka J8 I8 he z; ix e` O/.I8 -h J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 ]l Y8 (f SH aV Ud '0 77 J8 J8 J8 Nf Of J8 J8 J8 J8 ]n #r J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 ja s_.Wh.[P n'@o'@p'@q'@r'@s'@X+ O. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ . 5W.F3 5e+t. # t'@fe+u'@v'@eI+w'@os )n J8 J8 J8 J8 F- fz 7h Vl J8 J8 J8 J8 J8 ka ka F- F- J8 '0 ~n _d ka J8 J8 J8 J8 ka }Z }P 7o x'@zw.v( #D I8 /O >c F- J8 J8 J8 J8 J8 J8 J8 J8 77 77 H1 X) TH *L qL+d!.Of Nf J8 J8 J8 '0 pW J8 J8 J8 J8 J8 J8 Nf $J _O 1h.#R >` K=@2(.y'@e<.Un.<] zj X$ w' [p bv.h ,0 >0 '0 J8 ja ja I8 ha Nf J8 J8 ja ;h '5 =v $b E> %! ~).I8 J8 J8 J8 J8 J8 J8 J8 J8 Nf os cy.+++k'@q_.m'@>h )n NM Of Of J8 J8 Nf $J >c ej #u Nf 3g n7 4C hP z6 '0 Wl [d J8 J8 F- F- Nf #r Vl >c ]O g` ka F- J8 J8 Nf J8 J8 J8 J8 I8 Zy eH s( aQ.`=.77 la F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 ]l Y8 <' SH [' Y4 I8 )n J8 J8 J8 Nf Of J8 J8 J8 J8 NM NM Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Nf J8 J8 J8 J8 J8 J8 ja 3o Mb 8H 0>@H'@I'@J'@K'@L'@M'@O. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y y $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ #. %+ y# . n)+|~ Q& P. %& N'@O'@P'@Q'@;].os )n J8 J8 J8 J8 F- PM bh S5 Nf Nf Nf J8 J8 ~n >0 S5 >c F- J8 '0 ~n J8 J8 J8 J8 J8 J8 ka [P je J1 5e.CZ *y I8 ,d 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 77 77 H1 X) TH 3k.qL+ga Nf Nf J8 J8 ka >0 -Y ka J8 J8 J8 J8 J8 J8 Nf Mf I8 ~` vv.t7.!n.af.Fk.MJ %b -3 }d !d D0 ni 0 ~n ka J8 J8 J8 J8 J8 ka ~n Of os Mf j>..A ],.R'@S'@g6 ##.n'@8h.bt bt T'@T'@h# z: U'@V'@W`.ej I8 >0 ia F- 87.W'@3Q Bh =Y >h BB '0 Nf J8 s_.Mb Lb ia Nf Nf J8 I8 Fp F7 ck fn.KZ &! ^O I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Mf NM ;2.(j.Un.:!.fe ,0 :%.NM Of J8 J8 Nf #r -6 9L ]O '0 Vl ^u Fb Nd ^| '0 Fk fj Nf #r Vl >c F- Nf F- 67 ka ja Vl 67 F- Nf Nf Nf J8 J8 J8 I8 ~d 7H Z=.wv !D dj he >c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 ]l Y8 <' MO 'n $2 hH dj Nf J8 J8 Nf Nf J8 J8 J8 J8 -Y -Y '0 J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 ka MM Ul rv X'@fW.Y'@Z'@`'@ )@G>+09.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg R=.y $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ #. 6. %+ $+ $+ $+ $+ y# _8+Q. .)@O'@+)@L8 ;].4P qs J8 J8 J8 J8 J8 3o Mb S5 Of Of Of Nf J8 -Y g` Ws -6 F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 =r '8 5e.zc ){ I8 -h J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 77 77 Iv f] TH 3k.#R F- J8 J8 J8 J8 !n ~n _d ka J8 J8 J8 J8 J8 J8 J8 ~n {n Lf H#.Mf Cp ,0 H1 MJ %b |D Ib Gp `y bO ',.jl I8 fe J8 J8 J8 J8 J8 J8 J8 Nf Of @#.lJ.W9.>i.u~ hb.qQ.r).t7.NM NM _d ka J8 J8 J8 J8 J8 Nf Of me qs &R ]{ @)@:&.#)@&h Rt._O $J Of Of Of Nf J8 J8 !n ~n _d ka J8 J8 J8 J8 J8 J8 J8 Of os 77 AU 86 @k cl Sa HI me /d Nf J8 J8 J8 J8 -Y g` Ek >c F- J8 J8 J8 J8 |[ ().~6.E4 [k.0r.>h #u J8 J8 J8 s_..S~ !K w( $)@'O y3.Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 77 77 H1 MJ <] $v.fe /#._d -Y Of J8 J8 J8 F- -6 9L ]O -Y d!.Wd &~.Jy.^| '0 &=.{n NM $J ej -6 Vl J8 J8 J8 J8 F- Vl >c F- J8 Nf Of J8 J8 J8 I8 ~d eH @J `j.;H sv _*.-6 Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 ]l Y8 Sa G; +/ 6< f# dj Of J8 J8 J8 J8 J8 J8 J8 J8 -Y _d ~n J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ns 87.d +)_ %)@&)@*)@=)@-)@09.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y R=.d+ y $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ y# _8+7. }c+;)@>)@6/.T,@os /d Of J8 J8 J8 J8 ka ja J8 J8 J8 J8 J8 J8 Vl |[ 67 F- Nf Nf Nf J8 J8 J8 J8 J8 J8 ka ~n {n CT '8 (&.=y #k '0 fe J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 7i V7.e<.f] TH 3k.#R F- J8 J8 J8 J8 J8 J8 ka J8 J8 J8 J8 J8 ka !n !n !n '0 $J 7o Of ^d )n H1 MJ <] $v.-h Gp Xn 4C 9O [, I8 je J8 J8 J8 J8 J8 J8 J8 Nf d!.8h.gQ W9.>i.a).OM m7.t7._~.Of Nf ka J8 J8 J8 J8 J8 J8 Nf Of 5P KE ~` ,)@AG ')@))@zx.yV BB NM Of Of Nf J8 J8 J8 J8 ka ka J8 F- 67 >c #r Nf Nf J8 J8 ha ]n DT )D @k _] *@./n OM fe >c F- J8 J8 J8 ka ka J8 J8 Nf Nf Nf J8 '0 J8 P= :, 7: [c 0r.>h I8 J8 J8 J8 J8 ja ia ha Of Of Nf I8 *h `< rH ,n.=3 dZ 7i J8 J8 J8 J8 J8 J8 J8 Nf Of J8 77 77 Iv |d C( u~ fe >x -Y -Y -Y ka J8 J8 F- Ga $r ha NM je S~ )1 Xs :W I8 dD o}.[P Nf #r ]n F- ka ~n -Y J8 J8 I8 ]O ka J8 J8 J8 J8 J8 J8 '0 DE N; Xw 'w cl ^s DT #u F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ~n {n ]O ]l '8 3i.G; +/ H] {{ yr J8 J8 F- 67 67 Nf #r Vl 67 NM NM Nf J8 J8 J8 J8 F- ej ej F- J8 J8 J8 J8 J8 ~n ~n fj J8 J8 J8 J8 J8 J8 J8 J8 J8 sH + +@q !)@~)@{)@])@+e.O. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ @. #. %+ $+ y y $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# . v. $,@%,@^)@&t /)@ha >x #r J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 >c Ul J8 Nf Of '0 ka F- F- J8 J8 J8 ka ~n {n ~d `y ()@KH jl I8 ,d F- J8 J8 J8 J8 J8 J8 J8 J8 J8 7i V7.U8.Fu.V< 3k.#R #r Nf J8 J8 J8 J8 J8 J8 J8 J8 Nf 4o ~` Lv @R [= ]C J8 Nf Of Of ke >h HJ.MJ <] $v.-h Pj H- G].@p E' #u -h J8 J8 J8 J8 J8 J8 '0 -Y nA.Pf :P dv l;.O/.,r Ep Of Of Of Nf J8 F- #r J8 J8 J8 J8 #r $J Of ~Y &O _)@:)@<)@NG.CT Qj :%.NM Of Nf J8 J8 J8 F- F- J8 J8 J8 F- 67 >c ha NM Nf J8 J8 I8 Mf $i.[)@4K 6Q 91 p|.BB T5 >c F- J8 J8 J8 Ul F- J8 J8 Nf Of Nf J8 '0 J8 (E G' |t [c 0r.)n ha J8 J8 J8 J8 Nf Nf Of Of Nf J8 I8 CT `< P) BF H' I8 ;h F- J8 Nf J8 J8 J8 Nf Nf Of Nf 77 )n Iv |d C( O4 fe qs NM -Y _d ka J8 J8 F- @r $r $J $J la Y8 D( ac z6 ia dD Mb :d J8 Nf Of J8 ka >0 g` ka J8 ~n _d ka J8 J8 J8 J8 J8 J8 ka ke Iv }t [w (&.GI 3< wL I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ~n {n :%.]l *_ Lq.M) >f N1 ia fe 4o J8 Ul 67 >c Nf #r Vl >c #r Nf Nf J8 J8 J8 '0 ja >c ej F- J8 J8 J8 J8 J8 ~n _d '0 J8 J8 Nf J8 J8 J8 J8 '0 ka fj })@|l.|)@1)@2)@3)@sq.O. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . Vc.4)@$,@5)@6)@7)@8)@$J hH Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja MM ka J8 Nf '0 >0 >0 S5 Vl F- J8 J8 J8 '0 :%.H8 `y >~.h Y=.|t V< <#.g9 ga Of Nf J8 J8 '0 '0 >0 J8 J8 Nf &N d +9)@ZX 0)@@R Nf Nf Nf NM Cp 2-.p|.MJ <] -3 ;h Nx.Lh n- @p I] 8Q ie J8 J8 J8 J8 J8 J8 fj {w.cm.=r J_ J@.a)@tH oe Ep Of Of Of Of Nf ]n ]n #r J8 J8 F- Vl @r >0 xV 4$.b)@c)@d)@e)@#u ke me NM Nf J8 J8 J8 J8 ]n ]n F- J8 J8 J8 F- F- :%.:%.'0 J8 J8 :%.)j.f)@g)@3' l0 *E Iv >0 77 Ul J8 J8 J8 J8 67 67 F- J8 Nf Nf Nf J8 '0 J8 v F[ Fu.I( =Y )n ha J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 I8 la z; P) BF rt Lf e^.Vl Nf Nf Nf J8 J8 J8 Nf Nf Nf )n ^d 3P g] #=.4M fe xL $J NM ~n J8 J8 J8 J8 #r #r #r #r LM H_ 5e.MC 0V ]O K~.|[ J8 J8 Nf Nf J8 F- S5 Ws F- J8 fj ~n J8 J8 J8 J8 J8 J8 J8 J8 ha cv 0w h)@|'@[c #k 77 I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 !n >0 '0 k* i)@j)@k)@l)@m)@n)@Cp &N J8 1G Ul Vl Nf J8 F- Vl Nf Nf Nf Nf J8 ka >0 >0 ja F- F- J8 J8 J8 J8 J8 fj '0 '0 J8 Nf Nf Nf J8 J8 '0 >0 P,.#/.,r o)@$g p)@q)@r)@d,@09.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ O $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . .e.&+ $,@s)@t)@u)@v)@#r hH >c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y _d ~n J8 J8 !n ~n {n S5 >c 67 J8 J8 J8 J8 F- ;h Xn o|.`p J' Ap *3 -6 Vl J8 J8 J8 J8 J8 J8 J8 J8 )n )n Z@.Fh V< ,O NX 3/.Of NM J8 J8 !n ~n _d ka J8 Nf d!.[g+X, Xm.C`.FE.NM NM J8 fj 2-.2-..7.Un.<] $v.;h ,,.Lm w)@Y/ 3, f# /O J8 J8 J8 J8 J8 J8 fj x)@I'.=%.C@ y)@&T &Y d +dj &N Of Of Of Of $r $r #r J8 J8 F- >c -6 ]O uz.yV p;.~T.|6 $t a# wL ha NM J8 J8 J8 J8 F- ps $r #r J8 J8 J8 J8 J8 -Y _d ~n J8 J8 _d #z.z)@A)@Q} uw ^C ut #r ha J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 ka F- g! Q4 B)@$~.~P.>h Mf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 la z; u( 0p b3.hH Z8 >c #r Of Nf J8 J8 J8 J8 J8 J8 ke ]d Z@.R/.%b $v.fe )n Of Nf J8 J8 J8 J8 J8 J8 J8 J8 ja S% T7 |'@L,@[)@I8 -h J8 J8 J8 J8 J8 J8 F- >c -6 Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 ja ek i` -T.L< &u fe 77 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 '0 7r iN C)@D)@E)@F)@r).GS.Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf $J J8 !n ~n _d ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 J8 ka g` nk.~j.^#.*h aq x[ G)@H)@8W..e.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# . s3.$,@%,@I)@DU.J)@I8 BB k9.ka J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 ka ka J8 J8 J8 J8 Nf NM F- F- J8 J8 J8 J8 J8 J8 7o qb.5H /{ E[ Ap *3 -6 Vl J8 J8 J8 J8 J8 J8 J8 J8 wL qs _%._9 lr 4g 2! G- $J ha J8 J8 J8 ka ka J8 F- ]n ps J,@'@.K)@L)@ C NM '0 J8 ne je ie A1 Bd <] $v.-h Pj Td Zl 1 .}c #u fe J8 J8 J8 J8 J8 '0 M)@N)@O)@lM.P)@Q)@R)@S)@T)@2/ M^.s_.yS Mf Of $J $J Nf J8 Nf #r >c -6 Nf 1K 4H ig ]J.&B.8L.0f $J NM NM J8 J8 :d s_.bh 7o $J Nf J8 J8 J8 J8 J8 ka ka J8 J8 J8 '0 ~n ^z.QD.U)@V)@W)@X)@Of )n J8 Nf Nf J8 J8 ]O ]O '0 J8 J8 J8 J8 J8 J8 F- %N A6 #=.Un.86 fe 77 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 la '8 Bh `E qb.H#.Qf F- J8 J8 J8 J8 J8 J8 J8 J8 s_.K~.=h vL !%.Xy -3 fe 77 Nf J8 J8 Nf Nf Nf J8 ]n ]n F- ja O} p^ Zl.L,@!D I8 ;h J8 J8 J8 J8 J8 J8 J8 F- Vl #r Nf Nf J8 J8 J8 J8 J8 Nf Of Nf I8 Mb Qk.Ek ml.@&!@9@.J)@NM c!.-Y Nf J8 J8 J8 J8 Nf Nf Of Nf J8 ka !n J8 J8 J8 J8 ka '0 Of Of J8 J8 J8 J8 J8 J8 J8 J8 ]n qb.5H e).J' Ap k! >c F- J8 J8 J8 J8 J8 ja ja ka Mf 77 /$.L- Od 9K }, L+.NM Mf J8 J8 J8 Ul Ul ka I8 7o $r rs 6o 2&.+C y$.Of Nf J8 Of Pf ,d .| Bd <] $v.-h Gp '8 (&.^1.A'@I8 fe J8 J8 J8 J8 J8 :%.*!@wN GY.=`.=!@-!@;!@>!@,!@'!@_k.Ws Lb ]O Of Of Nf J8 J8 pW NM Vl ej &N 1K -O )!@ua.Hx tr V` wL $J #r F- J8 ja yS /=.I8 Nf Nf F- J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf F- 8H !!@'~.~!@{!@]!@$J dj J8 NM NM Nf J8 -Y {n '0 J8 ka ka F- F- J8 #r ~` 3/ DB DB *D ,d 77 J8 J8 J8 J8 J8 ja ja J8 J8 J8 I8 Ww ;< DW 1 .K1 H#.N2 [d J8 J8 J8 J8 J8 J8 J8 J8 s_.(*.ia >$ |t ^!@}, fe 77 J8 J8 J8 Nf Of Nf F- @r $r ]n ja 1j./!@p&.,'@`=.ha 84 J8 J8 Nf J8 J8 J8 J8 '0 ka Nf Of Nf J8 J8 J8 ka !n Nf Of Of ha Lb *% 7%.#y (!@dS.J> je 77 J8 J8 J8 J8 J8 ja ja J8 J8 J8 J8 Nf NM NM z$._!@:!@c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 Ek Mb ;Y gX.!}.}!@|!@1!@2!@:-+{f.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 7. 3!@R,@&,@4!@T,@me hb.pW Of Nf J8 J8 Nf Nf Nf Nf Nf '0 >0 ~n ka J8 J8 J8 ~n -Y NM Of J8 J8 J8 J8 J8 J8 J8 J8 dj ^s [c KH E[ f# _*.Ul J8 J8 J8 J8 J8 ja Ek yS >0 j9.@*.z- z1 uw ;4.B6.5!@{n >h J8 J8 Ul 67 67 >0 :%.ha $J os #r Ul tD Nf Of Of Nf Of ^d dj ut Bd <] $v.-h Gp at zw.Bv.A'@ha je J8 Nf Nf J8 J8 NM 6!@7!@8!@V+.9!@0!@a!@b!@c!@d!@ia 7i ]O I8 Nf Nf J8 J8 J8 -Y :%.I8 F- &N DE -O )!@e!@f!@`* _m wL $J ]n ej #r '0 >0 ar.>0 #r ]n ]n F- J8 J8 J8 J8 J8 J8 J8 Nf Of #r dQ y,.g!@h!@i!@j!@I8 dj J8 -Y -Y NM Nf fj '0 Nf J8 ~n >0 S5 >c J8 77 hH l6 5_ b] W;.;c Lf J8 J8 J8 J8 ja Ek 3o ja J8 J8 I8 LM Q] xk.[< )6.wL je [d J8 J8 J8 J8 J8 J8 J8 J8 ja S5 cv ]| @S k!@~P.>h ]O J8 J8 J8 Nf Nf Nf F- m/ @r #r J8 yr G' 7c 1'@D#.ha ,r Nf Nf Nf Nf J8 J8 '0 >0 ~n '0 Nf Nf J8 J8 '0 >0 ~n '0 Nf Of Of ja `+.Z8 5! CZ @{.>d -h >h J8 J8 J8 J8 ja Ek Mb ja J8 J8 J8 Nf '0 NM N1.l!@Ce k)@1' >b _/.**.$m.J8 J8 Nf Nf J8 J8 J8 J8 J8 J8 Ul Ul J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf I8 #u ka ,0 /#.}4.m!@n!@o!@TO.G>+Gg y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ %+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 7. }c+R,@f,@p!@T,@ha )n $J Of Of Nf J8 Of Of Nf J8 Of NM :%.{n ka J8 J8 J8 :%.{n :%.Of F- F- J8 J8 J8 J8 J8 I8 la `y >~.`p 7_ Ap ,d [d J8 J8 J8 J8 J8 ja 3o Wh.g` **.Ak Xh.[y *k.~B q!@r!@BB -h J8 J8 F- 67 >c ]O _d -Y Of Of ha Lb x Ib J8 Of Of Nf J8 Of 4&.s!@t!@dj 3&.u!@v!@w!@x!@y!@Xl ,x Of Nf J8 J8 J8 J8 J8 -Y _d ~n J8 &N 84 al.d' z!@6F.*~ RT 77 ha 9L -6 Vl Of pW -Y J8 F- ]n $r F- J8 J8 J8 J8 J8 J8 J8 Of NM NM ns ]K rt D( gP eH I8 fe J8 -Y _d -Y Of J8 J8 J8 J8 -Y {n Ws -6 Ul fe /O .| )S B}.Lx k! Lf J8 J8 J8 J8 ja yS Wh.MM J8 J8 I8 (O =< BZ *-.[, ]O ,h J8 J8 J8 J8 J8 J8 J8 J8 J8 #r 4o %R ^| A!@B!@~P.)n #u J8 J8 J8 J8 J8 J8 F- -6 >c F- J8 6o 0Z C'.C!@qk.>x Ib Of &N &N &N J8 J8 !n ~n _d ka J8 J8 J8 J8 ka >0 {n ka J8 Nf Of J8 ,d ;c Hi XQ ,~.tq -h >h J8 J8 J8 J8 ja Lb c >c Ul J8 J8 J8 J8 I8 la N; h] Nd *2 Ha 3=.-Y J8 J8 J8 J8 J8 J8 ja MM _d _d Mf 67 RT =,@nh.I!@!0 dj 84 J8 Nf Nf F- F- ka '0 Nf Of 7o 7o #u Ek >c ej $J Of Of Pf Jf Mu s .<] K> -h zx.at J!@Vi O7 (*.K~.J8 J8 J8 J8 J8 J8 &N 4&.nm.rs Z].K!@L!@M!@N!@O!@=h >h Nf J8 J8 J8 J8 J8 J8 ka ka J8 J8 Nf 84 ;h N; Kq.3h.aF a# n)@I'.-Y 0f.F- F- Vl Vl J8 J8 J8 J8 J8 J8 J8 J8 ~n ~n fj J8 J8 J8 J8 Nf )n at +z $b [9 I8 fe J8 J8 ka J8 J8 J8 J8 J8 J8 ka ka F- F- Nf ke je b3 S`.o5.Lx k! Lf J8 J8 J8 J8 ka ]O Sl wL ]n #r '0 <8.A:.DW =y !0 ja 1P )O Ly ~n ne J8 J8 J8 J8 F- @r ##.~k.Ls.P!@4k.~P.)n #u F- J8 J8 J8 J8 Nf #r -6 >c Ul Nf dj Z> Q!@R!@S!@'r.T!@s_.4x F;+N1.ka }P }Z [P ka 67 Vl #r Of J8 F- S5 S5 F- J8 J8 J8 J8 >h fe b3 g.eu :' fe 77 J8 J8 J8 Nf Of ha I8 J8 J8 J8 J8 J8 I8 ]O h).O=@U!@V!@fF N1 I8 77 J8 J8 J8 J8 J8 Nf #r Vl 67 I8 -Y -Y -Y J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of W!@M)@-$ X!@Y!@G!@Z!@TO.d+ n)+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ %+ `@ 6. W+ 6. `@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# . v. Q,@l>@`!@iI.J)@]O 1P Mb ja J8 J8 J8 J8 J8 J8 J8 J8 F- Vl >c F- J8 J8 J8 67 >c F- J8 >c 9L ja [d J8 J8 Nf I8 N2 at >O Nd *2 f# =h _d J8 J8 '0 !n J8 J8 J8 J8 >0 :%.'0 J8 gF w- O5.n'.K{.o] =O J8 Nf Of Nf J8 J8 J8 Nf Of 7o ]n #r J8 fz 9L #r _~.0_.ke Qf NX g] <] $v.-h zx.W+.rH 6N.9u Ak hj J8 J8 J8 J8 J8 J8 J8 Nf 5P Jf N-@N=+ ~@.~@+~@@~@=h fe F- F- F- ka '0 J8 J8 F- F- J8 J8 Nf ,r -h 3< .! -y `Q 7# yi.bH.#/.F- J8 F- Vl >c F- J8 J8 F- ka '0 J8 J8 ~n _d '0 J8 J8 J8 J8 Nf ~Y Dz Ri Wt.^| I8 je J8 Ul F- J8 J8 F- F- J8 J8 J8 J8 J8 J8 Nf ^d >h #y :*. g.:b ;_ Lf J8 J8 J8 J8 ka ~n _d wL @r F- '0 <8.kA o[.KH ;~.,d Fa d* hj g` !n J8 J8 J8 J8 F- _O Pf GV.W=@#~@4k.~P.>h OM fj !n J8 J8 J8 Nf $J ej >c ja ]O uk.N; $~@8#@%~@=i.&~@v& g9 5x h).ja }P }P ka J8 67 ej #r Of J8 F- Vl >c F- J8 J8 J8 J8 >h >h #y b] ^{ ZE fe 77 Nf J8 J8 Nf Of Of Of J8 J8 J8 J8 J8 I8 I8 h).A6 *~@Vv.fF c' I8 7i ka J8 J8 J8 J8 Nf #r Vl >c I8 -Y _d -Y J8 J8 Nf J8 F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of W!@M)@;A =~@-~@;~@Fg :-+09.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ %+ @. 6. 6. O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . Vc.4)@Q,@>~@,~@|N 0f k9.@*.`*.J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- 67 J8 J8 J8 J8 Ul F- J8 J8 ja ]O ~n fj J8 J8 Nf Nf 7o )s *Y :l.*2 f# ie ~n J8 Nf >0 ~n ka J8 J8 J8 S5 S5 I8 J8 [[ Cd M/ EB x'@~W.Qf J8 J8 Nf Nf Nf J8 J8 J8 Nf #r #r Nf J8 MM ]O '0 _~.pQ.!n.;h 71 M/ <] $v.-h 2!.^s ZQ &&.g!@gX.=h J8 J8 J8 J8 J8 J8 J8 Nf me oe '~@hx 2,+)~@!~@~~@=h >h F- Vl Vl ]O ~n fj J8 ]n ]n #r Nf J8 -h -h 3< .! k).>S.C;.{~@]~@ ;.Ek #r Nf F- 67 J8 J8 Vl Vl ]O >0 '0 J8 fj '0 '0 J8 J8 J8 J8 Nf ^~@/~@(~@G~.z6 ha ,r Nf 67 67 F- J8 67 67 F- J8 J8 J8 J8 J8 J8 )n )n HI DQ 6c &u fe wL J8 J8 J8 J8 ka ~n _d I8 F- F- I8 he Td b(.h >h #y hP `E !f fe 77 Nf Nf Nf Nf Nf Nf Nf J8 J8 J8 J8 J8 I8 I8 ]l S~ Lq.dr hM y k9.j:.42.J8 J8 J8 J8 Nf J8 F- Ul ka '0 fj '0 J8 J8 Nf Nf Vl Vl F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of W!@}&@Yl 2~@3~@4~@5~@,K+y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ @. @. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ @. #. `@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . .e.&+ Q,@l>@H!@MT.7r ;.Sl J8 J8 J8 J8 J8 F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y _d _d :%.J8 J8 Nf Of +#.0Z zw.e).z1 f# /O J8 F- ja >0 _d ka J8 J8 F- -6 >c F- J8 1h.K1 8r hP ^t H#.Qf J8 J8 J8 Nf Of Nf J8 J8 J8 J8 J8 J8 J8 _d -Y NM pW 6~@2(.x;.fN M/ <] $v.-h @.G' b] @'.7~@Q,.xV F- J8 J8 J8 J8 J8 J8 Nf $J oe IZ We.`X 8~@9~@R] -h ,0 F- 67 >c ]O _d ~n F- ps $r $J Of J8 fe ;h 3< Kq.k).w)@0~@/=.Y4.Wh.v& #u Of Nf J8 J8 F- Vl >c ]O _d ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 c(.pb.fs.hP H~.os :i.$J ej >c Ul J8 67 >c Vl J8 J8 J8 J8 J8 J8 77 77 H1 9].;>@YF fe ia J8 J8 J8 J8 J8 '0 -Y J8 J8 J8 I8 x' M@ ck %~.a~@Y@.b~@c~@d~@(*.!O J8 J8 J8 Nf Of -Y ;w.'H e~@C6.k!@0V ]d s7.H++$m.J8 F- F- Nf Of Of Nf ka ;Y !'.gg %5.lC f~@UD + +T'@Ha o7 o7 Ha #u NM NM Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- fe fe Ku Y)@FN.[$.fe 77 Nf Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 ]l '8 <' dr hM TX g~@KO.}P ka J8 J8 J8 J8 J8 J8 J8 F- F- J8 J8 J8 J8 Nf Of Vl >c 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Of W!@h~@i>.i~@j~@k~@l~@sq.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# . s3.$,@s)@m~@n~@4o !,.k9.J8 J8 J8 Nf $J ej fz MM _d ka J8 J8 J8 Nf Of Of Of J8 J8 J8 J8 J8 '0 S5 Vl F- J8 J8 #r fe NP.Bh KH O7 Ha N2 Of Vl 67 ja ka J8 J8 J8 J8 ]n #r Nf F- ;c H_ o|.@i$@7%.fN M/ <] $v.-h T2.}c Le.o~@8).Wl >r bh F- J8 Nf Of J8 J8 Nf Of ^d [ .O=@p~@q~@1q R` >h ]O J8 F- F- NM NM Nf J8 Vl I8 >0 -Y Nf ,r je 3< wc.k).N_.7h 77 I8 9L 7h ]n Of Nf J8 Nf Nf #r F- ka ka J8 J8 J8 J8 Nf Of J8 J8 J8 Nf ,r WQ.r~@22.s~@Mf -h Nf F- F- J8 J8 ]O Mf NM Of J8 J8 J8 J8 J8 77 77 H1 MJ %b E; Z8 =% Mb :d J8 J8 J8 J8 J8 J8 J8 J8 I8 pe u3 g] [c.t~@yp u~@v~@la BB ka J8 J8 F- ]n 7o :%.{O w~@x~@|d |d O/.]d y~@z~@~n $J ej ej F- J8 @r L#.2&.&R A~@B~@C~@D~@E~@F~@G~@H~@I~@J~@K~@L~@M~@8R.2=.pW Of Of NM -Y ka J8 J8 J8 ]n 7o #r Nf PM ~M YE #y ^&.XI 3i.fe 77 J8 J8 J8 J8 J8 J8 J8 ~n ~n fj J8 J8 I8 I8 ]l Y8 (f dr hM /W.oA.j:.'0 Of #r Vl 67 MM ~n pW $J ej >c Ul J8 J8 ka ~n _d ka F- J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 Nf Of Of Nf Nf J8 Of le 2Y.m[.p;.N~@O~@:-+{f.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 7. fe+s)@P~@n~@3/.Sl Sl J8 F- F- Nf $J ej fz MM -Y J8 J8 Ul F- Nf Of Of Of J8 J8 J8 J8 J8 F- Vl >c F- J8 J8 I8 DE 5M >~.KH P4 f# Qf $J Vl Vl F- J8 J8 J8 J8 J8 Of Of Nf ja x' k^ ]k -/ !0 ]O Qj _d ka 4o TB 3/.d!.$J Of Of Nf 4o sH sH 4o J8 J8 J8 fj Wl ,h $k Bd <] $v.-h $h >5 h Mf Nf J8 J8 Nf Nf J8 J8 J8 '0 -Y _d ne 84 DE Ud T~@U~@WU 5! 4o $J _O m/ ]n Nf J8 J8 Nf Of Nf J8 J8 J8 J8 J8 J8 J8 Nf Of Nf J8 #r ha 4$.U4 F( ]v V~@_d ,0 k* 4o Nf J8 J8 ~n {n NM Of J8 J8 J8 J8 J8 77 77 H1 MJ <] t^.,{ @h Lb :d J8 J8 J8 J8 J8 J8 J8 J8 I8 b>.H_ C( =1.'~.!,.3=._~.-Y :%.'0 J8 J8 F- ]n _O Sl /#.BS.x~@!%.u( O/.]d @*.}Z >0 $J ej >c 67 Ul ej hH sv .P W~@X~@Y~@Z~@`~@ {@.{@+{@@{@#{@${@%{@&{@*{@[= ,m.me NM :%._d ka J8 J8 F- hH _O 7o Of yS J~.K~.r3 Yg B}.<' -h >h '0 J8 J8 J8 J8 J8 J8 ~n _d '0 J8 J8 I8 I8 ]l Y8 (f dr Pi ay.!,.7i Of $J ]n ej >c ]O _d pW $J ej >c F- J8 J8 ka ~n -Y J8 F- J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 Nf Of ha I8 '0 !n 6A d!.W!@~k.={@-{@;{@:-+{f.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 7. fe+%,@I)@>{@,{@Mf BB >0 Vl Vl F- Nf F- F- ka fj J8 F- 67 67 F- Nf Nf Nf J8 J8 J8 J8 J8 J8 F- 67 J8 J8 J8 I8 CT Hv v .KH P4 Ap ;c Vl Vl F- F- J8 J8 J8 J8 J8 Of Of Nf ja ={ '{@Oh [< }c ha Jy :%.'0 sH M^.4x nm.7o $J Of Of TB ss +C Hb Nf Of Nf Of Cp !n.){@K,@<] *D -h o;.p;.f] !{@+b H1 >0 j9.>0 J8 J8 Nf ~n -Y pW Of ,r IZ ~{@{{@]{@4g Y8 )n os Of Nf J8 Nf J8 J8 J8 Nf Of pW -Y ne ge (O r3 ^{@/{@({@^C %R qs o] Ga #r J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 Nf J8 J8 J8 Nf Nf Nf ]n H#.la Ud 4A._{@:{@_m.pW a0 TB Nf Nf J8 fj '0 '0 Nf J8 J8 J8 J8 J8 77 77 H1 MJ DB Vw 2g Aj I8 ka J8 Nf Nf Nf J8 J8 J8 J8 I8 .j.p^ :: ,n.m'@[P >h $_.[d '0 '0 J8 J8 J8 F- #u /=.j:.0_.e~@<{@zw.0V ke ia ka Nf Of #r 67 67 67 #u 2-.af.[{@}{@|{@1{@2{@3{@4{@5{@6{@7{@8{@9{@0{@a{@b{@c{@d{@nA.'0 '0 ~n J8 J8 J8 F- Ws 8Q ha Of g` yp 7%.0q s+.k*.W;.-h Cp >0 ka J8 J8 J8 J8 J8 fj '0 '0 J8 J8 I8 I8 ]l Y8 (f dr Pi rz Ws Lf Nf 7o $r @r 67 ka fj ne Nf F- F- F- J8 J8 J8 ka '0 Vl Vl #r Nf J8 J8 J8 J8 J8 J8 J8 Nf J8 J8 Nf Nf ia o'.]O fj ss [ .4&.'D &y e{@f{@:-+{f.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 7. }c+l>@g{@h{@/)@me c!.g` |[ >c 67 J8 J8 J8 J8 J8 J8 F- Vl >c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 Ep Hv >~.`p K' Ap k! >c F- J8 J8 J8 J8 J8 J8 J8 Of Of Nf I8 LM Me cf Ix 2/.os :i.Of Nf sH 2k _}.e!.$r wL Of 5P Do.4x _}.3/.Of 5P Of Of Bp %r i{@j{@UE -3 je Ep HI y'.]v H> 0V `K.Q,.Mf F- F- J8 -Y _d NM $J Jf UD k{@l{@4J -0 E#.le 5P Nf Nf J8 J8 J8 J8 J8 Of Of Of Nf 6A `+.O' 6# m{@n{@o{@/^ PD.os ^_.$r F- J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 Of $J $r ps }d 3< G; p{@q{@r{@_~._}.2,.Nf '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 77 77 H1 q;.DB 8q.L= 5o Of Of J8 Of Of Nf J8 J8 J8 J8 I8 %G )'.uV oX ){ I8 je J8 J8 J8 J8 J8 J8 J8 J8 ka Mb Ck fj e~@kS.[c =Y 77 I8 J8 Nf Of J8 Ul 67 >c >0 ,Y.s{@t{@u{@v{@w{@x{@y{@z{@A{@B{@C{@D{@E{@F{@G{@H{@I{@lX.;w.J8 J8 J8 J8 J8 J8 J8 3o Mb S5 Of pW Wl 7%.-2 64 jD.W;.>h Cp {n >0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 ]l Y8 <' q; [' />.m/ Lf J8 7o $r ]n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >c ej #r Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- bh /=.k|.fj 3&.4U 2,.{l J{@K{@L{@M{@sq.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 7. }c+l>@g{@N{@O{@os >x ka J8 J8 Nf Of J8 !n ~n -Y J8 J8 I8 ]O ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 la Hv |/.6H E[ Ap ;c F- J8 J8 J8 J8 J8 ja s_.Mb I8 _~._~.ha S% 70 1g.!G D#.os Ib J8 Nf ne `].`].Nf Nf ne ne _~.Nf Ul wP Nf Of Of Of Of ke Ib L+.P{@Q{@xD.Ib 4H 'h $! ()@ix F; R{@Bp Pf Ga ej 67 ka I8 ]n Ws.8h.S{@T{@U{@V{@W{@X{@NM NM '0 J8 J8 J8 J8 J8 J8 J8 #r Vl 67 J8 YE dD y,.Y{@Z{@`{@ ]@.]@F#.ke F- J8 J8 J8 J8 ~n ~n ne J8 Nf Nf Nf J8 J8 J8 J8 J8 yS Lb 8Q 5o +#.Ta _9 ]f +]@nA.Pf e!.Nf -Y ~n J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 77 77 .#.Gv {/ =B FY k* Of ha J8 J8 J8 J8 J8 J8 J8 Nf ha uk.&@.)d.v( !0 I8 fe J8 J8 J8 J8 J8 J8 J8 Nf Of Sl Q,.BS.@]@kS.[c =Y 7i I8 J8 J8 J8 J8 J8 F- F- PM &~@,Y.zu.#]@$]@%]@&]@*]@=]@-]@;]@>]@,]@']@)]@!]@~]@{]@]]@ys.Nf J8 J8 J8 J8 J8 J8 ka ja J8 J8 [d fe ~M 5, ^]@/]@^y sH os me '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 ]l k6 *L l! l! '{ #r )n Of $J $J Of Of J8 ka ~n -Y ka J8 Nf Of Of _~.pW _d ja F- J8 J8 J8 F- 67 67 ]O -Y _~.Of J8 J8 J8 J8 F- S5 #u 7o Hb 3/.ga =W J{@(]@_]@s. M'@$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# . v. Q,@l>@,~@:]@/)@os >x J8 F- F- Nf Of J8 ka >0 {n '0 Nf ~n _d ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja ;h ^s .b S2.H@ Ha Qf J8 J8 J8 J8 J8 J8 ja s_.Mb I8 _~.Of ha wr 73 Z=.eS.|D os 1K ha ,r %x.kx.Z*.mW kP.j&+j&+lM.84 K~.Ck Mf Of Of Of Of Pf Jf Ee <]@[]@c F- Nf ha wL qs }]@|]@1]@2]@3]@eY.NM 6A sH 4o J8 ka ka J8 J8 J8 F- Vl >c J8 7i I~._F 4]@Es.5]@6]@7]@F#.ke F- ka '0 J8 J8 ~n ~n ka ja Of Of Nf J8 J8 Nf J8 J8 3o Mb Ek 4o 1h.{9 v; Jy.=|.os ^_.@r Mf ~n !n J8 Nf Of Nf J8 J8 J8 J8 J8 J8 77 77 ($./%+Fu.+N.1, wS NM ha J8 J8 J8 J8 J8 J8 Nf Nf ha ;h }p 8c FN.#k I8 ,h J8 J8 Nf J8 J8 J8 Nf Nf Of BB {n o.8]@9]@Gv =Y >h Mf J8 J8 J8 J8 J8 [d ka eQ Xl 0L 0]@a]@b]@c]@d]@e]@f]@g]@h]@i]@j]@k]@l]@m]@n]@o]@#H+^d ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 7i ~9.1K.(/ ;n.@k ]| } .NM NM J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 7Q 3< q5.n` Am 2e.ha je os ha NM _~.Of J8 ka >0 g` ka J8 Nf Of ha NM :%.-Y J8 J8 J8 J8 J8 F- 67 >c ]O -Y pW Of F- F- J8 J8 J8 F- ]n $r #r ha ha dZ WY p]@q]@8. X+ y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . Vc.4)@Q,@>~@`!@:]@r]@ha >x >0 Vl Vl F- Nf J8 F- S5 Ws #r ne fj ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 t}.9D g.Fg.-'.Ha }d J8 J8 J8 J8 J8 Nf Nf ja ja Nf Nf Of $J d:.gQ 1A.s]@BT ^d =r )n ~Y `l.Ib Jf t]@u]@v]@w]@x]@1K DE fe ha Of Of Of Of Pf 0K Ee o:.[]@y]@1K Ww /O ]u rV re ox.K~ X@.}d ]n F- Vl Nf pW ,m.H'.m7.*,@z]@A]@B]@C]@8)@NM M1.+C N1.Of ~n ~n ka J8 J8 J8 F- Vl Nf 7i Ck D]@j/ Zs E]@+-.nJ._~.}d Vl >0 >0 '0 J8 ne ka Ek yS I8 Of Of Nf Nf Nf Nf J8 :d ja J8 J8 Kf Q4 v; Z=.:W os oe #u '0 !n !n J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 I8 #u ~).F]@rF.:_.,s 2V '0 ha J8 J8 J8 J8 J8 J8 J8 Nf Nf &O %J $b M< }, I8 -h J8 Nf Nf Nf J8 J8 J8 Nf '0 @*.yS UX G]@Ml.Gv #k ke Mf J8 J8 J8 J8 !n Ly g` gj #r H]@I]@J]@K]@L]@M]@N]@O]@P]@Q]@R]@S]@T]@U]@V]@W]@X]@Y]@O`.S5 ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ia o'.'h kc _/ 8c _^.@y '0 Mf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 #u 7# c' zS {$.`E Z]@BB *O qs :%.-Y pW Nf J8 F- S5 Ws F- J8 Nf Nf ia yS ]O fj J8 J8 J8 J8 J8 J8 F- Vl J8 fj -Y :%.Vl Vl F- J8 J8 ka I8 ha NM Mf Sl YM I%.`]@ ^@.^@P. 09.Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ #. %+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . .e.&+ Q,@%,@&!@N{@IZ :%.(d {n S5 >c 67 J8 J8 F- >c -6 #r Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka J8 $r ,)@+^@46 @^@Ap ge J8 J8 J8 J8 J8 Of Of Nf J8 J8 ja I8 $J ##.-#.tO.#^@ov.,r `l.J'.RE PD..*.BN.$^@'v 'v %^@ [ 2K

    ^@,^@'^@)8 cv Of 4U a0 G- me {n {n >0 J8 J8 J8 Nf Of Of 77 :C M{ {( |' Hl.)^@!^@qs Ax -6 ]O _d ~n J8 J8 ja 3o Wh.I8 Of Of Of Of Of Nf J8 J8 J8 J8 S5 S% Q] |t ^d.#k Mf -h J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 #u AU ~^@{^@]^@2G h6 I8 77 J8 J8 J8 J8 J8 J8 J8 J8 J8 ##.[O.W9.GX zj #u ;h J8 Of Of Nf J8 J8 J8 J8 ja }$ Mb B4 ^| 3Q [k.A'@Pf 77 J8 J8 J8 J8 !n P,.2=.^^@eC /^@(^@_^@:^@<^@[^@}^@|^@1^@e]@e]@2^@3^@4^@5^@6^@7^@8^@9^@m/ I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- #u I8 DT a6 Ah Z=.G< eH I8 fe J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 #u hH [= 03 2' mk.9,@0^@/#.mc.1h.ha -Y ~n J8 J8 F- ej -6 Vl J8 J8 J8 Mb Mb :d J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 [d ~n {n S5 >c 67 J8 J8 !n ~n _d Of Mf k|._9.a^@b^@c^@d^@e^@{f.Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ #. 6. %+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# . s3.Q,@;)@&,@f^@[ .{n (d ka J8 F- J8 J8 Nf Nf F- Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka J8 +#.WQ 'S Dg.aD T0 e^.J8 J8 F- 67 67 ha pW ne J8 J8 I8 _O 1h.#R TQ tO I~ M1 g^@U6.>5 Z!.h^@i^@j^@k^@l^@m^@n^@o^@4_ Xk.p^@,k.n'@Rj Ep q^@vi *{ Ww.r^@s^@t^@6=@|>+`M }N.u^@v^@w^@,t y8.,h J8 J8 J8 J8 '0 -Y t7.^n x^@y^@z^@A^@l^ :d 5P Do.TB |(.$J 7o wL :%.-Y ka J8 Nf Of 7o &O _O sv J; 9K hQ B^@C^@qs yU.-6 F- ka J8 J8 J8 J8 ka ka J8 J8 J8 J8 Of Of Nf J8 67 fz PM eQ hz Cd 0p ^v 91 ~9.>A [d Nf #r Vl 67 ]O ~n fj J8 J8 J8 J8 J8 J8 I8 ha cv XE D^@BT.Ti T7 Ha N2 Of J8 J8 J8 J8 J8 J8 J8 I8 Zy 2/.Bv.Oi.`W rs la J8 J8 J8 J8 J8 J8 J8 J8 J8 ja ja cv +*.yp.8r vc Hr hH ka ~n _d Of pW -Y ,m.E^@F^@G^@H^@I^@J^@K^@L^@M^@2^@N^@O^@O^@P^@Q^@R^@S^@T^@U^@V^@## W^@O`.[d J8 J8 J8 J8 J8 J8 J8 J8 @r H#.wL k* G[ */ C!@7_.E' f# 7%.J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 I8 ha 5o g! (f G~.tc.]~.ka @r 4U 3/.'0 '0 J8 J8 J8 #r ]n F- J8 J8 J8 ja ja J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 Nf Nf Nf ka F- F- J8 J8 J8 !n P,._d Nf '0 {n ~n H& X^@Y^@Z^@_+ {f.Vc.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 7. }c+R,@&,@*,@q>@{n BB :d J8 Nf J8 J8 Nf Of Nf J8 J8 J8 J8 J8 J8 J8 '0 !n J8 J8 J8 J8 J8 J8 Nf J8 J8 J8 F- F- rs 2B },.`j.,k Ha }d J8 J8 F- 67 >c :%.-Y fj J8 J8 I8 _O 8h.Z].TQ 6 .`^@ /@/9 $~@[X ./@+/@@/@#/@$/@%/@&/@/< E9.*/@J;.=/@ps.+]@-/@;/@>/@[J ,/@'/@)/@!/@~/@{/@]/@^/@//@(/@_/@:/@h }/@|/@1/@2/@().~9.5P Of Of Of $J 7o wL Mf g` ka J8 Nf Of ]n &O qs m[.Ku W< 3E )^@3/@qs yU.-6 F- J8 J8 J8 Nf Nf J8 F- J8 J8 F- F- Of Of Nf J8 Vl fz bh @u.#; P4 (d.1,.<<.Qk.M{.ka Of $J Vl >c ]O {n '0 J8 J8 J8 J8 J8 J8 '0 '0 k* 4/@Y` I!.`E J' Ha }d Of J8 J8 J8 J8 J8 J8 J8 I8 >A rt ({ oY `W rs Ww F- J8 J8 J8 J8 J8 J8 F- F- I8 Nf 2 .cW.*Y LC }c +G '0 [d F- #u ha :%.Q,.(d 5/@6/@7/@8/@9/@0/@a/@b/@e]@N^@d]@c/@d/@e/@f/@g/@h/@i/@j/@k/@l/@m/@fQ [d J8 J8 '0 !n J8 J8 J8 J8 @r $r wL ka sv E; O;.M< 0E f# }d J8 J8 J8 J8 J8 Nf Of Nf J8 J8 '0 NM 0L @R 3k O;.r0 pv J8 ga a0 z$.Of Nf J8 ka fj Of Of J8 J8 J8 J8 J8 J8 J8 F- Nf Of '0 ka F- F- J8 J8 Nf Nf J8 J8 J8 J8 J8 J8 J8 '0 >0 >0 J8 '0 :%.>x n/@o/@p/@q/@^g.Wc.y %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 7. }c+R,@f,@*,@oc.BB 1P Mb #r Nf Nf Nf Nf Nf Nf Nf J8 J8 J8 J8 J8 '0 >0 ~n ka J8 J8 J8 J8 Nf Nf Nf J8 F- Vl ej }d ^| s( 4Z }, #u ;h J8 J8 J8 F- Vl >0 _d pW Nf J8 '0 ha +#.ps !k r/@s/@t/@u/@v/@w/@x/@y/@z/@A/@B/@C/@D/@E/@F/@G/@H/@I/@J/@K/@L/@M/@N/@O/@P/@Q/@R/@S/@T/@U/@V/@W/@X/@Y/@Z/@`/@ (@.(@+(@'0 '0 Nf Nf Of Of $J Kb @(@#(@$(@%(@@u.dn.Of Of Nf Nf Nf #r ]n S5 Ek J8 J8 J8 Nf #r wL os m[.@y cl zc &(@=2.qs iF+Ga Vl J8 Nf Nf Of #r Vl 67 J8 J8 Vl @r $J Of Nf J8 F- Vl fz '- )$ c6 DB P> x- L] -{ yS Of Of #r 67 ka '0 Nf J8 J8 J8 J8 J8 J8 J8 '0 J8 {, sC ]f /*.H' 8Q ;h Nf J8 J8 J8 J8 J8 J8 J8 J8 I8 4M v( D8 u~ _O e^.>c F- J8 J8 J8 J8 F- Vl ej wL TB >$ 2B *(@WS.tx.}Y.~;+} .=(@4#.7h YE yp ,h -(@;(@>(@,(@'(@)(@!(@N^@~(@d]@d/@c/@{(@i]@P^@](@^(@/(@((@_(@i2.o7 N2 Nf J8 ka >0 ~n ka J8 J8 J8 F- I8 :%.>0 7%.J- V< #.3!.hH 84 Nf J8 J8 J8 J8 Nf Nf Nf J8 J8 ka '0 0L 7r :f Xs ,~.b3.Of qs G- &N Of Nf J8 ~n -Y pW Of J8 J8 J8 J8 J8 F- Vl 67 F- fj ~n >0 S5 67 Ul J8 Nf J8 J8 J8 J8 J8 J8 J8 Nf #r #u 9L J8 Nf wL rs :(@<(@[(@}(@z# |~ @. 9@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ #. %+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 7. }c+R,@f,@*,@T,@]O Ck c f# !d jA O&+iP `=.I8 -h J8 J8 J8 J8 J8 >0 :%.NM Of J8 I8 Mf &N |(@1(@2(@3(@4(@5(@6(@7(@8(@9(@0(@a(@b(@c(@d(@e(@f(@g(@h(@i(@h0 j(@k(@l(@m(@n(@o(@p(@q(@r(@s(@t(@u(@v(@w(@x(@y(@z(@A(@B(@C(@Of NM Of Of Of Of os St.;^@D(@E(@F(@-O -r Of J8 J8 J8 J8 J8 F- >c -6 F- J8 J8 J8 J8 I8 ha TB '5 aV zc &o G(@Pf :Z.o] #u '0 NM $J |(.ga Vl >c J8 F- @r ps 7o Of Nf J8 J8 F- ej 9h ,- *< Hd.T@.7A Ap ^+.Wh.I8 Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 )d H- #=._: [)@I8 -h J8 J8 J8 J8 J8 J8 I8 I8 ns DT Sa +@.H(@9X #u X$ -6 Vl J8 J8 J8 J8 F- ej m/ &O ,$ Ip <' JS.I(@J(@K(@L(@^}.p^.dT.M(@Qk.mA ;_ <++N(@O(@P(@Q(@R(@S(@T(@T(@T(@T(@d]@e]@U(@{(@V(@W(@X(@Y(@Z(@`(@ _@!n.Of J8 !n ~n _d ka J8 J8 J8 J8 !n ~n {n S% Oe Eb t2 O/.ha Ib Of J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 I8 sv DT ;H eg zc (I os ~Y Of $J $J Nf J8 :%.{n :%.Of J8 J8 J8 J8 J8 F- Vl >c Vl ka ~n {n S5 >c 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of $J ej -6 F- #r $r o)@._@+_@@_@3. #_@8@ 6. 6. `@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ #. 6. %+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# _8+Q. 3!@R,@$_@*,@T,@I8 7i MM J8 J8 J8 J8 J8 J8 J8 F- >c 9L ]O -Y J8 J8 J8 ka J8 ja s_.bh Vl J8 J8 J8 J8 J8 #r _O |P T7 #=.9,@Tn.'0 -h J8 J8 J8 J8 J8 67 Vl F- J8 [d YE dn.k* %_@&_@*_@=_@-_@;_@>_@,_@'_@)_@!_@b(@~_@{_@]_@e(@^_@/_@(_@l2 __@:_@<_@[_@}_@|_@1_@2_@3_@4_@5_@6_@7_@8_@9_@0_@a_@b_@c_@d_@e_@5P pW $J $r $r $J me St.;^@f_@g_@h_@-O 6o.Of J8 J8 J8 J8 J8 J8 F- F- ~n >0 S5 >c F- '0 NM TB A: i_@yZ j_@3M B:.k_@'d ~d 1K 84 &O s,.M^.Hb I8 Nf $J 7o 7o $J Of Nf J8 J8 F- >c 9h ,- n^ l_@C!@^| #u 7%.ja J8 Nf Nf Of J8 ka ~n -Y ka J8 J8 J8 J8 J8 J8 I8 #h }p m_@9,@Tn.I8 ;h J8 ~n ~n fj J8 J8 I8 ha TB Q= :' HR ^&.&;+wL ;c -6 Vl J8 J8 J8 J8 J8 #r 7o dj ~).n_@o_@MO p_@q_@Xb+r_@s_@fa ;0 )n 7).t_@u_@P;.=I.v_@w_@x_@y_@z_@A_@B_@C_@D_@E_@2^@E_@{(@F_@G_@H_@I_@J_@K_@Q,.SY.Of J8 J8 J8 J8 J8 J8 Nf Of J8 J8 ka I8 !d Ob Y< l;.)D :%.Ib J8 >c >c F- Of -Y ~n fj J8 J8 ja 9L 0h VI |] T@.r0 ia.os ~Y $J $r $r #r J8 S5 S5 F- J8 J8 J8 J8 J8 J8 ka ]O ]O J8 J8 '0 NM F- F- Nf Of J8 ka ~n -Y ka Ul 67 67 :%.:%.I8 Vl J8 #r $r H#.-%.L_@M_@N_@_% `@ 9@ 6. 6. 9@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y 1~ }c+R,@&,@p!@O_@I8 ]O J8 J8 J8 J8 J8 F- F- J8 F- >c 9L ]O _d ka J8 J8 [d J8 ja 3o /=.ja Nf J8 J8 J8 J8 Of os 5h ~( Xy 9,@O/.wL ;h J8 J8 J8 Nf J8 Vl ej F- J8 sv he >_ RY P_@Q_@R_@S_@T_@U_@V_@W_@X_@Y_@Z_@`_@ :@.:@+:@@:@#:@$:@%:@&:@*:@=:@-:@;:@>:@,:@':@):@!:@~:@{:@]:@^:@/:@(:@_:@::@<:@[:@}:@|:@Of NM $J $r $r $J me na.1:@2:@3:@4:@f* Ud.TB 4o #r J8 J8 J8 J8 J8 J8 -Y g` S5 >c F- NM ke &O KN 5:@6:@7:@i^.H1 xP k^ '5 87.nR 8:@r]@O#.F- 7i NM n[.0L d3._~.Of Nf J8 J8 F- 67 7h O' .k bv.KH #k I8 je J8 J8 J8 Nf Of J8 ka >0 {n ka J8 J8 J8 J8 J8 J8 I8 Zy ^s ;>@9,@Tn.I8 ;h J8 ~n _d '0 J8 J8 I8 ha G- ]| 3' O> O5.^s _O /O >c F- J8 '0 ka F- F- NM me Pf ($.*g.9:@)G YF 0:@%r *N+a:@b:@c:@d:@e:@f:@g:@h:@i:@$o.j:@k:@l:@m:@n:@o:@p:@q:@1^@3^@E_@{(@r:@s:@t:@u:@v:@w:@1$.x:@y:@z:@As ka :d |[ ja Nf Of J8 J8 J8 I8 ~d >5 Jy.#<.O~ ia ;h J8 >c ej #r Of :%.g` '0 J8 ja S5 9L b! M1.a: T@./*.ia.os ~Y $J $r @r #r J8 67 >c F- J8 F- F- ka !n J8 '0 >0 _d ka J8 Nf Of J8 J8 Nf Of J8 ka >0 {n ka F- 67 >c ]O _d fj J8 J8 #r ps H#.va.A:@B:@C:@'h.$+ %+ #. #. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y P. #_@$,@l>@D:@9@.%N k9.Sl J8 J8 J8 J8 J8 67 67 F- J8 Ul Ul ka ~n J8 ka '0 ~n J8 ka ]O k|.>0 Nf Nf J8 J8 [d ne os pe 1, Xy iP b3.rs =O Nf J8 J8 Nf Nf F- F- J8 J8 Ul g* E:@DU.F:@G:@H:@I:@J:@K:@L:@M:@N:@O:@P:@Q:@R:@S:@T:@U:@V:@W:@X:@Y:@Z:@`:@ <@.<@+<@@<@#<@$<@%<@&<@*<@=<@-<@;<@><@,<@'<@)<@!<@~<@6o Vl I8 Of $J $J Of me {<@]<@^<@/<@(<@;O +G >` ~` ]n #r J8 Nf Nf Nf Nf pW NM #r #r Nf >x 84 0K _<@:<@C(.c6.wH |d $b nW VR 2F <<@[<@}<@M=+:..wP $_.pc.@1.,].cy.Of Nf J8 J8 J8 F- S5 al.D0 cO KH #D I8 je Nf J8 J8 J8 Nf J8 F- S5 Ws F- J8 J8 J8 J8 J8 J8 I8 LM Ob #=.9,@Tn.I8 -h J8 !n '0 '0 J8 J8 I8 77 ]K )D w0 b p&.T7 Ha /O Ul J8 fj ~n >0 67 Vl ]O OM Ib .#.|<@l_@l0 K{.vL oe 1<@2<@3<@4<@5<@6<@7<@8<@9<@0<@a<@b<@c<@d<@e<@f<@g<@h<@i<@j<@f]@U(@{(@r:@k<@l<@m<@n<@o<@p<@q<@r<@s<@t<@`d.c Vl J8 J8 J8 J8 J8 J8 ka >0 {n ka [d fj -Y Of Of Nf J8 J8 J8 Nf wL g* %2 O> 4Z 9D V+.*O Of J8 J8 Nf Of J8 J8 J8 J8 S5 *- z<@8@.A<@B<@T_@C<@D<@E<@E<@F<@G<@H<@I<@J<@K<@L<@M<@N<@O<@P<@Q<@R<@S<@T<@U<@V<@W<@X<@Y<@Z<@`<@ [@.[@+[@@[@#[@u;@1= DE Dp )j.P,.|[ >c Vl Of Of Of Of me {d A6 $[@%[@&[@_*.@r _}.Z].@r ]n J8 Of Of Of Of $J $J Of me os os Hb |p *[@=[@-[@;[@>[@,[@'[@zF c -6 F- J8 J8 J8 J8 J8 J8 I8 wr %2 #=.9,@`=.#u ;h J8 J8 J8 J8 J8 J8 I8 ia ~).F> IR ^[@l'@=_ hH ,d J8 J8 !n ~n {n Vl fz ]O ;w.Kb 3P 3i.&~./[@([@Z).fW._[@:[@<[@[[@}[@|[@1[@2[@3[@4[@5[@6[@7[@8[@9[@0[@a[@b[@c[@d[@e[@U(@f[@d/@g[@h[@i[@j[@k[@l[@Mh [>.G7 +C Ul @u.c -6 Vl J8 J8 J8 J8 J8 J8 J8 J8 F- $r n'@q[@r[@s[@t[@ # $+ y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ /+ Lr.P,@e,@$,@y<@`!@N{@a# !,.k|.J8 Nf Nf Nf J8 ]O ]O '0 J8 J8 J8 Nf Of J8 F- S5 S5 F- J8 J8 J8 J8 J8 J8 J8 Nf $J ]n Ap fP Q4 ZQ Y) -0 qs 4$.Of J8 J8 J8 J8 J8 J8 J8 '0 /#.]O =2 u[@vA.v[@w[@D<@x[@y[@z[@A[@B[@C[@|^ D[@E[@F[@G[@H[@I[@J[@K[@L[@M[@N[@O[@P[@Q[@R[@S[@Vr.T[@U[@V[@W[@X[@x%@)_ :C 7i BB :%.[P J8 F- Nf Of Vl Vl $J Of os Y[@Z[@`[@(<@t}.je TB &N #r Vl 67 Nf Of Of Of +#.wL ,0 m7.$h 1h. }@.}@+}@@}@#}@$}@%}@&}@*}@=}@-}@;}@>}@,}@'}@)}@!}@~}@yc $J Bp {}@_~.Of Nf J8 J8 J8 J8 I8 la '8 @/ KH &;+ha je J8 J8 J8 J8 J8 J8 J8 J8 F- Nf Nf Nf J8 J8 J8 J8 I8 g* %2 Xy iP 3!.f# 7%.J8 J8 J8 Nf Of Of os wL (E }] Mi O5.aI 3i BB ke Of J8 J8 '0 NM F- ja g` 2=.EU F-.g}.]}@^}@Y[@qF t}./}@(}@_}@:}@<}@[}@}}@F_@|}@1}@2}@3}@4}@5}@6}@7}@8}@9}@0}@a}@b}@c}@d}@c/@d/@e}@f}@g}@h}@i}@j}@k}@l}@t*.m}@-G F#.`].`*.Lb S5 J8 J8 Nf Ib g6 _^.DQ xK Lx N@ Mf '0 J8 Nf Of $J $J Of NM NM BB 1P C;.a:@& .n}@o}@=|./d ~Y Nf J8 J8 J8 J8 J8 J8 J8 J8 '0 ]O Ek S5 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ~n :%.S5 >c 67 F- Nf Nf Nf J8 J8 J8 J8 J8 J8 Nf $J U+.p}@q}@r}@s}@#_@$+ _8+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ R=.R=.n)+$+ $+ y /+ R=.y $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ Gg 6W.Lr.4)@Q,@y<@`!@:]@a# k9.Sl J8 Nf Of Nf J8 ~n {n '0 J8 J8 Nf Nf Of J8 F- 67 >c F- J8 J8 J8 ka ka F- F- Nf #r Vl f# Po &2 t}@u}@iv./d `l.Of J8 J8 J8 J8 J8 J8 #r ha Qj j>.=3 v}@w}@x}@y}@z}@A}@B}@7[@C}@D}@u6 E}@F}@G}@H}@I}@J}@K}@L}@M}@N}@O}@P}@Q}@R}@S}@T}@U}@2,.V}@W}@n>@}d Qf _O I8 J8 Nf Nf Nf J8 J8 Nf Of Of Vl ej #r Of os }]@X}@%[@(<@,d 1K Of Of #r Vl >c #r _~._~.ha d:.Fp -h !` n] i_@([ Y}@Z}@`}@ |@.|@y[@+|@@|@#|@$|@%|@&|@*|@=|@-|@;|@z_ >|@,|@'|@)|@xL Of Nf J8 J8 J8 J8 I8 la '8 @/ KH &;+ha je J8 J8 J8 J8 J8 ja :d F- F- Nf Of Nf J8 J8 J8 J8 I8 wr 1, #=.iP 0E Ha }d J8 J8 J8 '0 pW Of /d )n (E 'n V< u( 2G E-.(d Cp _~.Nf Nf Nf Of J8 ka :%.;w.EU `K.!|@~|@Y*@Wd L+.5$.{|@]|@^|@/|@(|@N^@_|@:|@<|@[|@}|@||@1|@{} 2|@3|@4|@5|@6|@7|@8|@9|@0|@O^@d/@e}@a|@b|@c|@d|@e|@f|@g|@h|@i|@hY.]}.Y).)W.Wh.ja J8 J8 J8 ^d 2 .rt +/ Jy.]/ pw fe ia J8 Nf Of Of &N TB 3/.|(.>x V7.(| j|@O'.k|@l|@W'@Of ,r Of J8 J8 J8 J8 ka ka F- F- -Y {n Ek >c F- J8 J8 J8 J8 J8 F- F- J8 fj ~n {n S5 67 F- J8 Nf Of Nf J8 J8 Nf J8 J8 J8 Nf $J ##.m|@n|@o|@p|@pz+y# _8+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ R=.R=.y $+ $+ y /+ R=.y $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y . n)+%& $,@l>@`!@:]@Nu I8 ]O J8 Nf Nf Nf J8 fj '0 '0 J8 J8 J8 Nf Nf J8 J8 Ul 67 J8 J8 J8 J8 ~n >0 S5 ej #r J8 F- S5 9g.q|@r|@s|@t|@,x Z*.Of J8 J8 J8 J8 J8 F- ]n _O DE LE M0.P~.u|@v|@w|@x|@y|@z|@A|@B|@C|@C|@D|@E|@F|@G|@H|@I|@J|@K|@L|@M|@N|@O|@P|@Q|@R|@S|@T|@J'.U|@V|@W|@jL ke ha NM Nf Nf Nf Nf Nf Nf Of Of Of #r #r Nf Of jL 3B X|@%[@W7 }d yV Of 7o 7o ]n 67 J8 ne ne ha Fp d:.87.qY Y|@<4.Z|@`|@ 1@.1@+1@@1@#1@$1@%1@&1@*1@=1@-1@;1@>1@,1@'1@)1@!1@~1@{1@]1@G@@$J Nf J8 J8 J8 J8 I8 la '8 @/ KH z6 ha je J8 J8 J8 J8 J8 s_.PM fz Vl Nf Nf Nf Nf J8 J8 J8 I8 Ww ^s #=.iP O/.hH ;h J8 J8 ka >0 -Y Of ke Cp V8.>O Xs v; )D 1#.(d Cp -Y Nf Nf Nf Nf J8 J8 '0 OM Qj xv.O,.^1@!2.I_ /1@Nn.(1@_1@:1@<1@[1@_|@}1@P^@|1@11@21@31@41@51@61@71@81@91@01@3^@a1@b1@c1@d1@T(@e}@a|@e1@f1@g1@h1@i1@j1@k1@l1@m1@n1@E#.57.Ek ka J8 J8 J8 I8 J8 (E *y KH vU.Tl.f* T5 J8 Nf Nf Nf TB M^.4x 4&.)n ^n 1G $Q o1@p1@l|@q1@[ .qs Of Nf J8 J8 J8 ~n >0 S5 Vl :%._d '0 67 J8 Nf Nf Nf J8 F- Vl ej #r ne fj >0 F- F- F- J8 Nf Nf Nf J8 Nf Nf Nf J8 J8 Nf 7o GE.r1@s1@o|@t1@pz+y# _8+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ n)+y y $+ $+ $+ y n)+$+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ T0+fe+l>@u1@v1@4x '0 Mf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y {n Ws -6 Vl J8 [d I8 #G w1@x1@y1@z1@Q,.<8.Of J8 J8 J8 J8 J8 F- @r H#.la |I A1@B1@.J.vh C1@D1@E1@F1@G1@H1@I1@J1@K1@L1@/e M1@N1@*1 O1@P1@Q1@R1@S1@T1@U1@V1@W1@X1@u-@Ot.!%.Am -0 ]d /d Of Of Of Of Of Of Of Of Of Of Of Of Of Of me 0D Y1@Z1@`1@ 2@ge yV Of 7o $r ]n J8 J8 I8 I8 4o 0f -! .2@+2@@2@aE.#2@$2@%2@&2@*2@=2@-2@;2@+|@>2@,2@'2@)2@!2@~2@{2@]2@^2@/2@(2@_2@:2@<2@os :%.J8 J8 J8 J8 I8 la '8 @/ KH jl I8 fe J8 J8 J8 J8 J8 s_.v& bh >c F- J8 Nf Of J8 J8 J8 I8 Ci.NP.O&+9,@!D F- fe J8 J8 !n ~n _d Of ke 2-.[2@bO Jy.#l.^s } .NM (d _d NM Of Nf J8 J8 J8 Nf me ,r ZK [Z o|..j H- }2@|2@12@22@32@42@52@62@72@82@e]@92@02@a2@b2@c2@d2@e2@f2@g2@h2@i2@3^@2^@2^@E_@d]@d/@d/@d]@j2@k2@l2@m2@n2@o2@p2@q2@r2@HJ./Z.#r J8 J8 J8 J8 J8 fe ;h .#.s2@(l.@b !'.T5 J8 J8 J8 J8 sH 2k _}.@z t}.ke `].t2@/[@u2@v2@lJ.g@.U+.$J Nf J8 J8 J8 _d >0 S5 >c ]O -Y fj J8 J8 J8 Nf Of J8 Ul >c -6 #r Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 J8 I8 _O ~W.w2@x2@y2@z2@#_@y# _8+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . Gg 8. fe+A2@B2@Pd AU Sl 77 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 ka ka F- Vl #r Of Of ha E'.C2@D2@E2@F2@{n }u.-Y J8 J8 J8 J8 J8 J8 F- #u >r G2@H2@I2@J2@YP K2@L2@M2@N2@O2@P2@tA.Q2@R2@S2@T2@U2@ r.V2@W2@X2@[o.Y2@Z2@`2@ 3@.3@+3@/@ @3@oe #l.(&.!#.jL /d Of Of Of Of $J 7o $r $J Of Of $J 7o 7o $J me {p.1:@#3@$3@%3@/O yV Of Of $J Of Of Nf je Qf 5x d].Re.y*.&3@*3@=3@-3@;3@>3@,3@'3@T_@)3@!3@~3@{3@]3@]3@^3@/3@(3@(3@_3@:3@ ` <3@[3@}3@|3@ke Ib Nf J8 J8 J8 I8 CT Dz @/ KH jl I8 fe J8 J8 J8 Nf Of #r I8 ]O ]O ka J8 J8 J8 J8 Ul 67 9L X@.E0 #/ is.13@S' g# Nf J8 J8 '0 NM Of ke 2-.dw.|/.-6.3K $l DT ha os NM 7o 7o $J Nf J8 ka -Y (d Ib Ku _^.Yi.<' Y4 .!@{O 23@*@,r ha $J $J $J $J $r $r $J _~.NM ha 7o $r $J me xp.P)@W3@3:@X3@Jf ~d $J Of Of Of $J |(.`l.&h L; v*.Y3@Z3@`3@ 4@.4@U:@c(@+4@.4@@4@#4@$4@%4@&4@*4@=4@-4@;4@>4@,4@~a '4@)4@N9 $I.!4@~4@{4@os Ep Of J8 J8 J8 #r *O CF {k.r>@;~.Nf >h J8 J8 J8 Nf Of Of NM -Y _d ka J8 J8 J8 J8 F- >c Ap O} R~ 7c ,'@3S.+h Aj Nf J8 J8 Nf Of Of ,x Cp dw.~%.gP #l.!0 ut 4o wL ha $r 7o $J Of J8 ka ~n {n DE Ud &8.Fj.$! .#.6A ha 1P o'.L)@]4@^4@/4@(4@_4@:4@<4@[4@}4@|4@14@24@34@44@T(@d]@d]@E_@E_@i]@O^@O^@d]@N^@E_@54@64@74@84@94@04@a4@b4@BB !,.s_.>c F- J8 J8 J8 1G fe fe G[ t2 Iy.dg Ax fe J8 J8 J8 J8 Nf Of Of Vl f# H#.Z].c4@d4@e4@v2@=|.)n mc.$r $J #r Vl >c F- J8 J8 J8 J8 J8 ka ka F- F- ka ka F- F- ka ka J8 J8 J8 J8 ka '0 J8 J8 J8 J8 '0 ka F- F- J8 F- Mb v& hH qs o;.f4@g4@h4@/8+y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# . X+ i4@j4@k4@l4@]K !,.o'.J8 J8 ka [P }P ka J8 J8 J8 J8 J8 J8 J8 J8 F- Vl Vl F- J8 J8 J8 J8 J8 J8 J8 Nf fj -Y (d )0 hI.m4@n4@o4@hH $D ~n J8 J8 >0 ~n ka J8 J8 '0 <8.n] p4@q4@r4@s4@t4@u4@v4@D1@w4@x4@y4@z4@A4@B4@C4@-3@D4@fy.E4@F4@G4@H4@I4@+|@J4@K4@L4@M4@l[ AA t<.AA N4@O4@P4@_O _O $r $r 7o 7o #r Nf fj -Y :%.ha $J Of me %D t2@Q4@R4@'!@0K *h 7o Of Of 7o $r &N 5A !J.-! S4@T4@U4@V4@W4@X4@Y4@Z4@`4@ 5@.5@+5@ 3@@5@#5@$5@%5@&5@Y4@*5@.e .e =5@-5@;5@>5@,5@'5@)5@ss *O Of Nf J8 J8 #r 84 V4 Me.!5@~5@(#.>x J8 J8 J8 J8 Nf Of Of pW ~n J8 J8 J8 J8 J8 F- ej T0 S% D0 I( ~/ 50 L'.T5 J8 J8 J8 Nf Of Of ^d ,0 3 .>O DB o|.-3 ;b Qs 9L :C wL $J $J Of J8 J8 ka >0 la 3< aI 6H P7 +A 7i #r MM ^n Ww.{5@]5@v#@^5@/5@(5@_5@:5@<5@[5@}5@|5@15@25@f[@i]@d1@{(@{(@i]@N^@E_@d1@i]@{(@82@35@45@55@65@75@85@le BB MM ja Ul J8 J8 J8 J8 67 _*.,d N1 XZ l;.Gb e^.fe J8 J8 J8 J8 J8 Nf Of #r #u wL 2,.95@05@a5@b5@c5@YE la $J Of Of #r ]n J8 J8 J8 J8 J8 '0 >0 >0 Vl Vl ja >0 Vl Vl ja ~n ka J8 J8 J8 ~n ~n '0 J8 J8 '0 >0 >0 S5 Vl F- J8 :d |[ 9L H#.d5@e5@f5@g5@^K+y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# Q& h5@i5@j5@k5@M^.!,.Sl J8 J8 ka }P |Z ka J8 J8 J8 J8 J8 J8 J8 J8 F- Vl >c F- J8 J8 J8 J8 J8 J8 J8 J8 ka >0 ,0 8g.73 Nt.&S 9f T0 }d J8 J8 !n ~n _d ka J8 J8 '0 3=.K( l5@m5@n5@o5@p5@q5@r5@s5@t5@z}@u5@G3@=2@v5@w5@x5@#|@y5@z5@A5@B5@C5@D5@#:@E5@F5@_R ~< #H.jw W|.G5@H5@I5@J5@M..#g ps ps $r #r J8 J8 !n ~n _d NM Of Of qs }! V;.K5@`1@F(@L} yU.$r Of $J $r ps ga Jb Z*.I++L5@M5@N5@O5@P5@Q5@R5@S5@x4@T5@U5@V5@_R W5@X5@Y5@Z5@`5@ 6@.6@^3@Z4@+6@@6@#6@$6@%6@LK &6@u3 $J os Of J8 J8 '0 Kb i4.4A.2K.*6@,].NM J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 F- @r H#.la '8 (~@Y)@z6 ha je J8 J8 J8 Nf Of Of ^d )n H1 7: ac .b a: m6 6x Ws }$ Mf Of Of Of J8 J8 J8 #r la '8 bO KH s>@r0.x;.J8 ne fe o#.=6@-6@;6@>6@,6@'6@)6@!6@~6@{6@54@54@d]@T(@f[@7|@U(@T(@O^@]6@1^@1^@e]@i]@O^@^6@/6@(6@_6@:6@t*.T0 -Y ka J8 J8 J8 J8 J8 J8 J8 >c ;_ ie Ud <6@HX _f ;h fe J8 J8 J8 J8 J8 Nf Of Of os os TB [6@}6@{1.|6@$$ Ck =h Of Of Of Of Of J8 J8 J8 J8 J8 !n ~n {n 9L 67 >0 _d S5 >c ]O _d ka J8 J8 J8 -Y _d ~n J8 J8 !n ~n {n S5 >c 67 J8 J8 F- ej h# 16@26@36@46@^K+y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# Q. 56@p-@66@76@g9 !,.Sl J8 J8 J8 ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ]O ]O ka J8 J8 J8 J8 J8 J8 J8 J8 F- S5 9L Y@.Cd -{.86@96@Ap he J8 J8 J8 ka ka J8 J8 J8 J8 >h g@.{2.06@vs.a6@b6@c6@d6@e6@f6@w6 g6@h6@i6@j6@k6@l6@m6@n6@o6@p6@q6@r6@s6@t6@u6@v6@w6@h&.x6@y6@z6@A6@B6@C6@D6@E6@F6@H#.ps $r #r J8 J8 J8 '0 NM 7o 7o _O Ws.l, G6@H6@I6@J6@K6@d:.$J Of Of $J 7o ej Z8 Lv {;.L6@M6@N6@O6@P6@Q6@R6@S6@T6@U6@V6@W6@X6@Y6@Z6@`6@ 7@.7@+7@@7@+:@-4@#7@$7@%7@&7@*7@=7@^s.eD F-.ji.^d nA.*w.bH.-7@9,+I> Jy.;~.[d >h J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- #r CT jA 9].;7@0V #u ;h J8 J8 J8 J8 Nf -Y Wl >h #y :/ MC zw.#k ){@x)@(d wL Of Of Nf J8 J8 J8 J8 Nf la '8 bO KH H~.BB -h J8 ne fe [= >7@,7@'7@)7@!7@~7@{7@]7@^7@/7@(7@1^@e]@U(@N^@f[@T(@c/@r:@N^@1^@|^@3^@i2@T]@_7@:7@<7@[7@}7@jO.BB J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fe fe #y eu kC fi.je )n J8 J8 J8 J8 J8 Nf Of Of os &O nm.vH |7@UG.Jy.17@j9.Kb Of Of Of Nf J8 J8 J8 J8 J8 J8 J8 '0 NM F- J8 J8 ka J8 F- J8 ka J8 J8 J8 J8 ka ka J8 J8 J8 J8 ka ka F- F- J8 J8 J8 J8 #r ##.16@27@36@46@37@0@ y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# Q. 56@47@57@67@77@ ;.k|.J8 F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 >0 _d ka J8 '0 !n J8 J8 J8 J8 J8 F- Vl Ha 2!.9D >k.87@hY g# la J8 J8 J8 J8 J8 F- F- J8 J8 :%.wL vo 97@07@a7@M|.b7@c7@d7@e7@f7@v5@i6@]_@g7@h7@i7@j7@k7@l7@m7@n7@o7@p7@q7@r7@s7@PG t7@u7@v7@w7@x7@y7@z7@A7@B7@C7@_O ps $r #r J8 J8 J8 #r $J 7o _O rs 8:@D7@E7@F7@G7@H7@K6@0K Of Of Of Of $J g# h# I7@J7@K7@L7@M7@P6@N7@O7@P7@hL.Q7@R7@S7@T7@U7@^Q V7@W7@X7@Y7@Z7@d(@$7@k6@~3@$7@`7@ 8@.A.5> .8@3t.eq.Ep qs X1.t>@#z.+8@@8@4' 5E [9 I8 fe J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 #u Zy ^s #=.;d O/.77 ;h J8 J8 J8 !O ka ~n Dp Wl #y ^=.zm t( y; f)@jR {O |(.Of Nf J8 J8 J8 J8 ka ja la 5M cO `p &;+os je J8 '0 77 wc Z4 WH #8@$8@%8@&8@*8@=8@-8@;8@>8@,8@'8@)8@m2@!8@i]@~8@{8@_|@]8@^8@/8@(8@_8@:8@<8@[8@}8@|8@OM :%.J8 J8 J8 ka !n J8 J8 J8 J8 J8 >h >h #y /d.eu ZE je )n J8 J8 J8 J8 J8 #r $J Of ha _O 6o E2.K^.18@5E r_.(d jL Of Of Nf J8 J8 F- F- J8 J8 J8 Nf #r #r J8 J8 J8 J8 J8 J8 J8 J8 ka '0 J8 J8 J8 J8 J8 J8 F- F- J8 J8 J8 J8 J8 J8 ka fj Of W!@28@38@36@48@S%+58@y %+ O %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# Q& 68@78@88@98@`u ;.k|.J8 67 67 F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 ~n J8 J8 >0 ~n '0 Nf Nf J8 J8 J8 #r _O $h eq.08@a8@X>.)n CT Nf Nf Nf Nf Nf 67 67 #r Nf Nf ;h t}.}]@b8@c8@d8@-A e8@kE.v|@f7@f8@]_@g7@g8@h7@h8@^3@x5@6[@z|@i8@U:@j8@k8@l8@m8@n8@]{@o8@p8@q8@r8@s8@t8@u8@v8@w8@I8 $r $r ]n J8 J8 F- Vl Vl ]n 7o &O 8:@x8@y8@z8@>^@A8@J,@5X 7o Of _~._~.$J /O jO.B8@C8@D8@E8@F8@P6@0(@G8@H8@I8@J8@K8@L8@M8@N8@N8 uf.O8@P8@Q8@R8@w5@S8@T8@&2@U8@V8@W8@X8@Y8@Z8@`8@Xe.Qf ~` A6.0L ,x yV V4 G; <] <9 I8 fe J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 ja o'.;O &% T7 rH #.pv Mf ;h J8 J8 !O 42.42.fj jL jL |I /&.n( ,l.[k i>.#/.:%.&N Nf J8 J8 J8 J8 F- Ek Lb ~d CF Ri @~.:W os ,r Nf )n J8 z; S`.^` 9@.9@+9@@9@#9@$9@%9@&9@*9@=9@-9@0|@;9@b1@>9@,9@'9@)9@!9@~9@{9@]9@^9@/9@(9@_9@:9@<9@2$.NM J8 Nf '0 >0 ~n ka J8 J8 J8 J8 >h >h #y 'w CZ 96 -h >h J8 J8 J8 J8 F- ]n $r $J ha wL 4o E2.K^.-M.|6@7H :%.jL Of Nf J8 J8 J8 67 67 F- J8 Nf #r ]n Vl F- Nf Nf Nf J8 J8 J8 J8 ~n ~n '0 J8 J8 J8 J8 J8 67 67 #r Nf J8 J8 J8 J8 ~n ~n fj 4P 28@38@[9@48@}9@h1+Vc.6. #. @. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# Q& |9@19@29@39@Z).k|.j9.J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka >0 {n NM Of Nf J8 J8 J8 Nf os zx..g 49@jz IK le `l.Of Of Of Of Of >c ej #r Of 6A la (^.S@.59@69@79@Mn BX 89@99@f7@k6@i7@i7@09@a9@/3@b9@d(@c9@d9@e9@f9@g9@5z h9@i9@j9@k9@l9@m9@n9@o9@p9@q9@r9@s9@+`.'0 7o $r ]n J8 J8 F- 67 >c #r Of 7o ps t9@u9@v9@w9@x9@rs 5X ps 7o Of _~.ha }d y9@V[@z9@A9@.4@B9@C9@D9@G8@E9@F9@G9@H9@I9@J9@K9@Iz `P L9@M9@N9@O9@P9@Q9@R9@S9@T9@U9@V9@=] i5 W9@X9@b=.49 &R #R 1h.rs lM.2K Y9@d^.>5 J8 77 J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 ja (*.r4 Y$ Oe Eb t2 b' J8 fe J8 J8 !O 42.}Z Nf :i.:i.g6 Z9@s'.K~ [9.dQ #r I8 J8 J8 J8 J8 J8 J8 :d Mb @u.CT zs +z :*.:W os ,r ha ;h (E }$.1>.`9@ 0@.0@+0@@0@#0@$0@%0@&0@*0@=0@[|@-0@;0@>0@,0@p:@'0@'0@'0@)0@!0@~0@{0@]0@^0@/0@m[.Of Of Nf J8 Of NM :%.{n ka J8 J8 J8 J8 fe fe h6 zc #.Q} ;h fe J8 J8 J8 J8 F- @r ps 7o NM '0 k* oR *m.AC.v2@(0@ha je Of J8 J8 J8 J8 67 >c Vl J8 Of $J Vl >c F- J8 Nf Of J8 J8 J8 J8 :%.{n >0 J8 J8 J8 J8 J8 67 ej ]n Of J8 J8 J8 J8 :%.{n '0 7o 28@_0@:0@<0@[0@@y+nm+6. 6. #. O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ 7. }0@H)@|0@7 .87.]O )n Of Mf ]O '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- 67 S5 F- J8 J8 J8 J8 J8 ka $J t]@10@20@30@bf >x m7.-Y -Y -Y pW Of $J #r Nf J8 1G 84 CT 40@50@60@A<@Mf.70@80@90@>3@00@a0@b0@>3@3d c0@^< b0@d0@e0@f0@g0@w% %# H$ h0@i0@j0@k0@l0@n9@m0@n0@o0@p0@q0@pq BB wL I8 >0 -Y ka J8 F- F- J8 Nf Nf 7o ^d m[@L:.r0@fn o] ~K ps 7o Of _~.Of _O s0@t0@u0@v0@w0@x0@y0@z0@A0@B0@C0@D0@E0@F0@G0@H0@G{ 28 |F.I0@J0@w5@]2@K0@L0@M0@N0@O0@c~ P0@Q0@R0@S0@UN T0@Ul.|P Gp Mf ^_. (E I8 ka J8 J8 '0 NM Of ,r ,r U4 n( [E.U0@(#.wL _O Mf -Y ka J8 J8 J8 J8 :d Mb @u.|P F7 $~@ac !0 I8 3=.k|.T2.sl.rJ.L .V0@W0@X0@Y0@Z0@`0@ a@.a@+a@@a@#a@$a@%a@&a@*a@=a@-a@;a@>a@,a@'a@)a@!a@~a@{a@]a@eI+]d yr ej F- J8 J8 #r S5 S5 F- J8 J8 J8 J8 fe fe h6 U{.s2 >d CT fe J8 J8 J8 J8 J8 #r $J Of os ha 6x 6/.^a@/a@(a@@t.ha je J8 J8 J8 J8 J8 ]O ]O '0 J8 J8 '0 ]O ]O ka J8 J8 J8 J8 J8 J8 J8 S5 S5 F- J8 Nf Nf Nf J8 ]O ]O '0 J8 J8 J8 J8 J8 S5 S5 F- $J _a@:a@c F- J8 J8 J8 J8 J8 ka F- 3a@4a@5a@`[@6a@OM EU _d P,.-Y NM $J Of Of Nf J8 J8 84 `l.ec eZ 7a@rI.%}@8a@9a@0a@aa@ba@ca@ca@P2@cr.da@uf.ea@fa@ga@7c.ha@ia@ja@ka@ja@la@ma@na@oa@pa@qa@ra@sa@ta@ua@va@ke Mf '0 >0 _d ka J8 J8 J8 J8 J8 Nf NM sV &- Xd wa@@3 o] 0K $r $J Of Of $J 1h.b>.8g.7M xa@ya@za@Aa@Ba@Ca@Da@Ea@Fa@Ga@Ha@Jz U[ Lw X~ Ia@Ja@aa@^2@Ka@La@Ma@Na@Oa@O0@&/@>3@Pa@Qa@uf.Ra@a8@Ba J; >0 Cp mc.xc :' )d.E; G[ k* I8 Nf J8 J8 J8 J8 J8 :d ja Of Of Nf J8 J8 J8 Vl f# eN Q] u( n'.*/ *! sv ja ka '0 Nf Of Nf je -h Ud Y) GX Sa@oa.om._O Mf _d ka J8 J8 J8 J8 ]O /=.Ta@4! ce +Y |d NP.MM yp r0.Ua@Va@Wa@Xa@Ya@Za@ZC._i `a@ b@.b@+b@I8@@b@#b@$b@%b@&b@*b@=b@-b@;b@>b@,b@'b@)b@!b@~b@{b@]b@^b@CT ;_ -6 67 J8 J8 F- Vl >c F- J8 J8 J8 J8 fe ,h }k /b@E~ G> I8 Mf '0 J8 J8 J8 J8 Nf Of Of me pW +C (b@$) w: oo._I os je J8 J8 J8 J8 J8 ~n _d fj J8 J8 ka >0 _d ka J8 J8 J8 F- F- J8 J8 67 >c F- J8 #r #r J8 J8 ~n _d fj J8 J8 J8 Nf J8 67 67 F- ha _b@:b@0 ~n J8 F- Ek yS g` >0 S5 ej #r '0 I8 ]O J8 J8 Nf Nf J8 J8 J8 F- oe 5b@6b@7b@6a@NM Fk ~n fj '0 #u 7o $J Of Of Nf &N 1K Jb zs hp.@e 8b@9b@O:@0b@ab@bb@cb@db@eb@fb@gb@PU ~ gy hb@&9 ib@jb@n9@n9@n9@n9@n9@n9@kb@lb@kb@mb@nb@ob@pb@qb@rb@jL ,0 '0 '0 -Y J8 J8 J8 J8 J8 J8 Nf me Y8 M1.I8 >0 >0 '0 Nf J8 je -h Y4 W..Iq P..5S.qs #r '0 ~n J8 J8 J8 Nf Nf fe ~M Ks.l! !).u( 96 aw ja V7.BB 's.U=@Sb@Tb@Ya@Ub@Vb@P[ Wb@Xb@Yb@Zb@`b@ c@.c@+c@@c@#c@$c@%c@&c@*c@=c@-c@;c@>c@,c@'c@)c@!c@A5.x' k! >c Ul J8 J8 J8 F- 67 J8 J8 J8 J8 J8 7i ~9.N' ~c@Xs 2' #y ns '0 '0 J8 J8 J8 Nf Of Of pW {}@aL {c@]c@^c@/c@(c@os je J8 J8 J8 J8 J8 fj fj ne J8 J8 J8 '0 ~n J8 J8 J8 J8 67 67 F- J8 Ul F- F- J8 Vl Vl F- J8 fj fj fj J8 J8 Nf Nf Nf F- F- F- ha _c@:c@0 {n J8 :d 3o Wh.g` :%.S5 -6 Vl NM -Y _d ka J8 Nf Of J8 J8 J8 '0 kx.4c@5c@6c@7c@'0 ^n J8 J8 F- ]n $r $J Of Of Of Of *O 4$.&;+pr.8c@9c@0c@J4@D1@ac@bc@R3@K[ cc@dc@+9.ec@fc@gc@hc@hc@ic@jc@kc@n9@n9@n9@kc@kc@kc@lc@n9@n9@mc@nc@oc@pc@qc@EU ,0 Nf Nf Of F- F- J8 J8 J8 J8 Nf me d@,d@'d@)d@(,.G> U$ k! ej F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 77 (*._F X-.w~ Q) /| L+.'0 I8 J8 J8 J8 Nf Of Of cy.+1.93.:5 !d@~d@{d@&;+ha je J8 J8 J8 J8 J8 F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >c >c F- J8 J8 J8 J8 F- -6 >c F- J8 F- F- J8 J8 J8 J8 Nf Of J8 J8 J8 ha ]d@^d@/d@(d@_d@>y+}N+b8+rz+y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ 6. 6. 6. 1~ :d@c fz MM -Y ka J8 Nf Of ld@md@nd@BM (<@Jf *O 7o Of d!.Ws.H#.'r.od@pd@qd@rd@sd@td@ud@vd@wd@xd@yd@zd@Ad@Bd@Cd@Dd@Ed@Fd@Gd@Hd@Id@Jd@Kd@$6@Ld@Md@b(@_3@Nd@Od@Nd@B_ S2@Pd@Qd@Rd@Sd@KA fz *G v 5[ #b #J G[ ]l '0 Of ha ia Mb ja J8 ja S5 F- J8 J8 J8 J8 J8 '0 me 4$.DT +k Zl vU.(~@jl fe Mf '0 J8 J8 J8 fe fe h6 `@.+B.uw Lf 77 Nf Nf Of Of Of Of Of Of ;h f* Td@;/ zm %L.a0 Nf 0L A6.O_@w]@Ud@Vd@Wd@Xd@Yd@Zd@`d@ e@.e@+e@@e@#e@$e@%e@&e@+Q *e@=e@-e@;e@>e@,e@'e@)e@!e@~e@{e@]e@^e@@k &3 *3 f# MM -Y ka J8 J8 J8 Nf Nf Nf J8 J8 ]O ia VI {D 66 DX <#.r3 I8 77 J8 J8 J8 Nf Of Of me _~.ck./e@(e@~d@c ja -Y J8 J8 J8 J8 J8 J8 Nf Of F- ja >0 -Y ka J8 J8 J8 Vl #r Of Of ej >c Ul J8 J8 J8 J8 J8 J8 J8 J8 I8 _e@:e@c F- J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf I8 K..h}.4e@5e@lz I8 Wl J8 J8 Nf Nf #r Nf Nf Of qs 6e@Ga 3k 5x.7e@8e@9e@)2@0e@;2@ae@I3@Pc@kE.sb.Rw be@H+ ce@n9@n9@n9@de@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@ee@fe@ge@he@,d 77 I8 F- F- >c 9L ]O _d '0 #r $J Of ie@je@ke@le@me@#g yU.H#.7o 7o wL c!.ne@ne oe@pe@qe@re@se@te@ue@ve@we@xe@ye@z[@ze@Ae@Be@Ce@De@x.Re@qA ]M.cH /^ zj r3 k* Nf $J wL 8Q Mb ja J8 J8 J8 ka ka J8 J8 J8 Nf NM me x ne ss 4U Ue@$^@Ve@We@Xe@Ye@Ze@`e@ f@.f@+f@@f@#f@$f@%f@eM.j3.&f@*f@=f@-f@;f@>f@4K.,f@'f@)f@!f@~f@{f@Bz ]f@pd 9L ]O _d ka J8 ka !n Nf Of Nf J8 J8 I8 I8 cv F' ,O Yh (' I1 I8 >h !n J8 J8 Nf Of Of me me ~` ^f@(e@~d@c fz ]O _d '0 F- J8 J8 J8 Nf Nf Of J8 ka ~n _d ka J8 ka !n Nf Nf Of Of >c >c F- J8 ka ka J8 J8 J8 J8 F- #u _e@/f@(f@_f@:f@V4+Gi+$+ g@Wh ,g@'g@)g@!g@~g@_Q.>5@{g@]g@/* ^J.^g@/g@=z.(g@fQ ]n '0 ~n J8 J8 >0 ~n '0 Nf Nf J8 J8 I8 '0 ]l r3 |] (&.M/ eH ]O Fk ~n J8 J8 J8 Nf Of me me ~` ^f@_g@(r 0 Mf k* fc 5g@@y.6g@7g@8g@9g@a(@>2@A[@0g@ag@bg@cg@dg@^I Ed.~{@eg@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@la@fg@gg@hg@ig@jg@kg@})@GE.$r $J Of Of $J ps $r $J me kx.Z7 lg@6c@mg@ng@k! }$ Ga ,0 )$.og@pg@qg@rg@sg@tg@ug@vg@wg@xg@yg@zg@Ag@Bg@Cg@Dg@to Eg@Fg@^H.Gg@Hg@Ig@Jg@xf@Kg@Lg@Mg@Ng@Og@Pg@Qg@Rg@Nd@Mf@Sg@Tg@Ug@Vg@Wg@}3.Xg@Yg@Zg@TT +b h6 ns os ps $r $J Of J8 J8 J8 J8 >0 {n NM Of os ^d qs 4x 6/.`g@ h@.h@+h@@h@#h@^d /d Of Nf J8 J8 ,d ;c Hi E~ U{.Q} -h >h J8 J8 J8 >0 g` >0 F- J8 >h ke 47.h@,h@'h@)h@!h@~h@{h@&/.]h@^h@/h@(h@_h@:h@0 {n ka J8 J8 J8 J8 '0 '0 1G 4i O4 #=.i:.#k Mf ^#._d ka J8 J8 J8 Nf NM OM 3/.S}.k^.Az 6H 6h@(d Kb $J J8 J8 J8 J8 J8 [d fj :%.Vl >c 67 J8 J8 J8 J8 J8 J8 J8 J8 F- J8 !n ~n _d ka J8 J8 J8 J8 J8 J8 J8 -Y _d ~n J8 J8 F- $r Y>@7h@8h@9h@0h@ah@Gg M'@6. `@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ v* bh@|c@ch@dh@eh@fh@>0 P&+:%.Vl 67 Ul J8 J8 J8 J8 J8 Nf NM -Y :%.S5 67 F- J8 J8 F- 67 67 ]O ~n fj J8 J8 J8 J8 I8 CT gh@WV wZ L.L3@Oc@Yh@Zh@`h@ i@.i@+i@Tg@Me@@i@#i@$i@%i@&i@*i@=i@-i@>o.Xy +{.lL c!.)n $J Of Of J8 J8 J8 J8 67 Vl $J /d 5A 8g.;i@'; (t >i@,i@'i@)i@!i@~i@7%.ke NM Nf J8 J8 fe ,d lm V9.}D M0.-h >h J8 J8 J8 |[ 9L ej $r >0 2-.>h H1 Fj.{i@]i@EU ;h _O #r ha WI.^t ^i@+s |z.0( /i@(i@_i@:i@c ]O _d ~n ka J8 F- 67 67 Nf #r Vl >c ha NM Nf J8 Nf Of $J le gi@hi@ii@ji@ki@RO+.e.6. `@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "n)+y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ 8. t'@li@mi@ni@oi@nM NM Q,.{n S5 >c Ul J8 J8 J8 :d ja Of pW -Y {n |[ >c Ul J8 J8 F- 67 >c Mf {n '0 J8 J8 J8 J8 I8 *h pi@qi@ri@si@ha jL Of Of Of Nf '0 xV fj 2/.ti@ui@vi@wi@xi@yi@W_@zi@Ai@Bi@P9@Ci@Di@@|@Ei@Fi@1F.;'.Gi@Hi@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@de@ed@Ii@Ji@Ki@Li@Mi@Ni@Oi@Pi@NM X1.0L 7o ps $J NM -Y (d kx.!s Ch@Qi@Ri@Si@0>@pa.Of ]A.OM Ti@Ui@Vi@Wi@Xi@Yi@Zi@`i@M#. j@.j@+j@@j@#j@$j@%j@&j@*j@=j@-j@;j@>j@,j@'j@)j@!j@~j@{j@]j@^j@/j@Og@(j@_j@Sg@:j@x Of Of Of Nf Nf '0 ha ;O Z8 N2 |(.pz !l k{@Ge.2j@HL.bz L|.1s 3j@8_ ;_ 7o y$.4o J8 J8 >h >h @y zc B( G> -h >h J8 J8 J8 67 ej @r $r :%.2-./#.H1 Bd ;>@7~@3=.0K @r F- ka Z*.fa <2.DP iy 4j@5j@6j@7j@8j@9j@0j@aj@bj@+W cj@dj@ej@fj@gj@hj@ij@jj@kj@lj@mj@nj@oj@pj@qj@qY Q;.';.{w.-Y J8 J8 F- Vl >c F- J8 J8 J8 4o ka wk.h` @u.rj@pm ~u.T+.BB DE J8 J8 J8 J8 J8 Mb }$ 77 z$.h' sj@+V.Xs 7H #u Qf $r F- Ul J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of '0 ka F- 67 >c >c ]O -Y fj J8 F- 67 >c >c Nf #r Vl >c #r Nf J8 J8 NM pW Of qs tj@^d@uj@(d@vj@wj@mm+9@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "R=.R=.Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ v. bh@li@xj@yj@zj@Aj@I8 BB >0 #r #r J8 J8 J8 :d s_.Ek $J _~.pW >0 Ul Ul Ul J8 J8 J8 F- Vl NM NM '0 J8 J8 J8 Nf ha Ep Bj@Cj@Dj@Ej@&O Ib Of Of Of Of ha ~d kJ.Fj@Gj@Hj@lh@Ij@-f@Jj@zi@Kj@Lj@Mj@Dc@O2@Nj@Oj@Pj@Qj@Rj@Sj@Tj@Uj@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@Vj@Wj@Xj@Yj@Zj@`j@ k@.k@+k@@k@ha p8.x8.ga ps $J _~.pW OM kx.7M #k@$k@%k@&k@Y>@pa.OM me *k@=k@-k@;k@>k@,k@'k@)k@!k@~k@{k@]k@^k@/k@(k@n9@n9@n9@n9@_k@:k@M.ek@;,.F< A ha 40@fk@gk@hk@ik@jk@kk@DF.TL.lk@^B g! _O s,.f+.N1.J8 J8 ^n Fk KT.VE PY uw -h >h J8 J8 J8 F- ]n #r $J Of ,x Cp Y=.P1.;>@mk@-h dj ]n J8 ka ke N1.nk@ok@pk@qk@rk@0[@sk@tk@uk@vk@wk@xk@yk@zk@Ak@Bk@Ck@Dk@Ek@Fk@Gk@Hk@Ik@Jk@Kk@Lk@Mk@Nk@Ok@lS.!Y.>x ha Nf J8 J8 F- 67 J8 J8 J8 J8 4o fj 'm.bH.fe Pk@Qk@]0.;H ,0 yV Nf J8 J8 J8 J8 :d ia ha y$.3I *2.P) Xs [9 I8 N2 ]n 67 67 Ul J8 J8 Nf Nf Nf J8 J8 J8 J8 Nf '0 >0 >0 S5 >c >c Vl '0 fj fj Nf Vl >c >c F- Nf J8 F- F- Nf J8 J8 J8 ~n -Y ha GE.Rk@Sk@Tk@Uk@Vk@qz+vu+%+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ @. @. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "d+ d+ R=.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ `@ |r+|c@1a@Wk@k5@Xk@I8 ]O J8 Of Of Nf J8 J8 ja s_.Mb I8 Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 Nf me kx.Yk@Zk@le@`k@V+.4$.Of Of os ^d &N [E l@.l@+l@@l@Yo.#l@$l@bb@%l@&l@*l@=l@-l@m5 ;l@P:@Oj@>l@6f.,l@'l@kb@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@)l@!l@ma@~l@{l@]l@^l@/l@F*+rs 92.!4.y$.ps 7o Of Of me kx.+L (l@hf@_l@:l@V+.NM (d 2,.]2.x >x os U+.$J 0L J'.]-.KT.2/.ul@vl@wl@xl@yl@zl@Al@Bl@Cl@SH Ul ~d _~.>` a0 h).#r J8 -h ^#.e7.PY (s.M5.Kb >h J8 J8 J8 Of Of Of Of Of ]d Dp Dl@9].%b $v.fe Mf J8 J8 J8 ]O N2 #R El@Fl@Gl@Hl@Il@Jl@Kl@Ll@Ml@Nl@Ol@Pl@Ql@Rl@Sl@Tl@Ul@Vl@Wl@Xl@Yl@Zl@`l@ m@.m@+m@@m@#m@w~@qs ps 7o Of J8 J8 J8 J8 J8 J8 J8 J8 J8 ~n bH.jR ji.$m@ir :v.l9.5$.kx.Of J8 J8 J8 J8 J8 '0 NM 0L DT b' 7: Jy.G' I8 fe J8 67 >c Vl J8 J8 J8 Nf Of J8 J8 J8 J8 J8 !n ~n {n S5 >c 67 J8 J8 J8 Nf Of ej >c F- [d J8 J8 J8 J8 J8 J8 J8 J8 ~n g` _O %m@&m@^E *m@=m@:f@V4+W1+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "Gg Gg y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ P. -m@;m@>m@,m@'V I8 Mf J8 Of ha ia Mb ja J8 J8 J8 J8 J8 J8 J8 Nf NM -Y -Y ka J8 J8 J8 J8 Nf Nf Of ej >c #r me i].3# 'm@le@`k@o] =O Of d3.kx.)m@G- !m@~m@{m@]m@^m@#D.@s./m@Dc@M3@(m@_m@:m@@jm@Ns km@lm@mm@nm@l0@om@kc@lb@pm@qm@rm@)R sm@tm@um@vm@wm@xm@ym@zm@d9 P2@Am@Bm@Cm@Dm@Em@Fm@Gm@Hm@Im@Jm@Jf@Km@Lm@Mm@Nm@Om@Pm@+(@Qm@Rm@9g.Sm@Tm@87.0V X;.Um@FW ae.Vm@Wm@Xm@Ym@Zm@`m@ n@.n@+n@(d 2-.:%.~` nR 1h.$r ~n ^#.Ci.P] _D +J s0 uz.>h J8 J8 J8 J8 #r 7o 7o NM 8_.';.i{@j{@<] K> fe )n Of Nf '0 {n wE {Y W'@@n@#n@l2 $n@%n@&n@*n@=n@ud -n@;n@>n@,n@'n@)n@!n@~n@{n@]n@^n@/n@(n@_n@:n@0 -Y ka J8 Nf Of -Y _d ]O ia x' 73 5E P> !D Mf 84 J8 J8 J8 J8 J8 Nf NM ha ns Mu |i.n` Xs F[ 8Q 3=.-Y Nf $J '0 >0 |[ Vl F- J8 J8 J8 J8 J8 J8 J8 '0 NM F- F- J8 J8 J8 J8 J8 J8 Vl F- '0 -Y J8 J8 J8 J8 J8 J8 J8 J8 |[ ej Ga fW.}n@c@+|n@1n@2n@m@5n@6n@I8 Mf J8 Of ha Ek Mb ja J8 J8 ja J8 J8 F- F- Nf NM :%.g` ka J8 J8 J8 J8 J8 Nf Of >c >c ]n os iF+7n@8n@`[@9n@dj Qj pW qs oe G- 0n@an@bn@0r cn@KK dn@en@fn@I<@gn@hn@in@F4@o@,o@fr.'o@)o@;I.!o@~o@{o@i%@nk.nk.:%.#u Ga Ga $r :%.Fk Lf M@ XZ a] fe )n me os ,x Wl ~n '8 CA ^o@EB.R2@Qa@/o@(o@_o@:o@c 9L ]O _d ka J8 #r $J :%.>0 S5 m/ eN T7 #=.do@`=.77 ;h J8 J8 J8 J8 J8 Nf NM '0 8H K; FR n` Xs b6 g# 3=._d Of Of -Y {n S5 >c Ul J8 J8 J8 J8 J8 J8 J8 Nf Of Nf J8 J8 J8 J8 J8 J8 J8 J8 '0 >0 {n '0 ka J8 J8 J8 J8 Nf J8 67 >c Ga ~K eo@fo@go@ho@io@/+ vi+_8+y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ R=.R=.y $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 0@ jo@ko@lo@mo@$R I8 Mf J8 Of Of I8 :d J8 F- Ek yS '0 Nf Vl 67 J8 Nf S5 Ws F- J8 J8 J8 J8 J8 Nf Nf Ul Vl 7o GE.t]@no@oo@po@Y[@,x 8R.{w.MO.*k@qo@ro@so@to@uo@vo@wo@xo@yo@)< zo@Ao@in@Bo@sh@Co@Do@Eo@Fo@Go@u!.Ho@Io@ln@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@la@m9@Jo@Ko@Lo@Mo@No@Oo@Po@Qo@Ro@So@To@Uo@Vo@-M Wo@Xo@Yo@Zo@`o@ p@(Q K6@n'@7o Of |(.4&..p@u_@:i./d NM pW Qj ^#.>s +p@@p@#p@$p@%p@ma@n9@kc@lc@&p@*p@+%.Zw =p@-p@kN ;p@YD >p@,p@'p@K1@)p@!p@~p@{p@]p@^p@!p@5E./p@(p@_p@:p@ Md ^y 7%.T5 J8 J8 J8 J8 J8 F- ]n Vl ,h Wl Jj.9].<] K> fe os me /d >x ns I' dp@ep@fp@gp@Yq Yw hp@ip@jp@kp@lp@mp@np@op@pp@qp@rp@sp@tp@up@vp@7o@wp@xp@yp@zp@Ap@=2 ~n Cp me _~.pW >0 >c >c ja ~n J8 F- Vl ej I8 ka F- Vl (O z; MJ 9,@ih.77 ;h J8 J8 J8 J8 J8 Nf '0 '0 8H 8U (s :y.Xs |, hH ,h ~n Nf Nf pW :%.#r Ul 1G J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf Nf Nf J8 J8 J8 J8 J8 fj >0 ia Ws ]O >0 '0 J8 J8 Nf Nf Nf F- Ul Vl _O Bp@Cp@Dp@Ep@Fp@Gp@tz+Hp@_8+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ n)+y y $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y y Q. }0@Ip@Jp@*,@T,@I8 Mf J8 Of Of Nf J8 J8 ja 3o Wh.'0 $J Vl >c J8 F- ej -6 Vl J8 J8 J8 J8 J8 J8 J8 [d ka hH #g Kp@Lp@Mp@Np@Op@c!.Fh@#z.Pp@Qp@Rp@Sp@Tp@Up@Vp@Wp@Xp@Yp@De@$l@Zp@`p@ q@Ei@]2@Bi@.q@+q@@q@#q@$q@%q@&q@)l@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@kc@$j@ja@*q@=q@-q@;q@>q@,q@'q@)q@!q@~q@W>.us.{q@d .]q@^q@/q@(q@r' . +%m@$r $J Of Of NM NM NM Of Of ga N2 Xw._q@:q@ T@.Yi.0E ;_ Lf J8 J8 J8 J8 J8 J8 J8 >c RL Jf Z@.R/.%b $v.fe ^d os 0L 3P ]Z tq@uq@vq@wq@xq@yq@zq@Aq@ln@n9@n9@n9@n9@m9@Bq@Cq@Dq@Eq@Fq@Gq@Hq@Iq@Jq@Kq@Lq@Mq@Nq@Oq@c 67 J8 J8 F- >c -6 Vl J8 J8 '0 Ww NP.MJ iP )D F- fe J8 J8 J8 J8 J8 J8 I8 I8 sv Td@Pq@|j.Jy.7H I8 fe J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 _d >0 9L -6 ]O _d ~n J8 J8 J8 Nf Of J8 J8 J8 #r Qq@Rq@Sq@Tq@Uq@Vq@;y+b8+_8+$+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. O $+ $+ 0@ v. bh@li@Wq@Xq@Yq@q>@(d Mf J8 J8 J8 J8 J8 J8 J8 ja ja Of NM Mf ]O ka J8 #r ]n F- J8 J8 J8 Nf #r Vl 67 ~n :%.ia Ap Ar.Zq@`q@A]@ r@.r@!d _O +r@@r@#r@$r@%r@&r@*r@=r@-r@;r@Ey >r@,r@'r@)r@`_@Hc@!r@~r@Gf@{r@]r@^r@/r@ed@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@kc@(r@_r@:r@c 9L ]O -Y J8 J8 fj :%.S5 67 Ul J8 J8 Nf Nf Of J8 J8 J8 J8 ka J8 F- F- ka ka J8 J8 J8 J8 J8 J8 J8 Ul 67 9L `l.&s@*s@=s@-s@W1+o-@rz+y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. %+ $+ $+ 0@ v* #_@li@2b@;s@>s@A6.(d BB J8 ka ka F- F- J8 J8 J8 J8 Of NM :%.P,.ka J8 Nf Of J8 J8 J8 J8 Nf #r Vl >c >0 >0 S5 f# 7r.,s@'s@)s@J6@!s@~s@{s@]s@^s@/s@(s@.o@_s@l*.:s@ Rs@Ss@Kk.Ts@Us@Vs@Ws@Xs@Ys@Zs@`s@ t@hD os pW Of Of Of Nf J8 J8 J8 J8 J8 fe ;0 J> ^!@(e.Kd '8 Mf ha Nf '0 !n P,.~n ka J8 Nf ke -h Y=..t@+t@bz.oe @t@61 l! P- #t@$t@%t@Mp &t@RF.*t@=t@-t@;t@n9@ys@ma@ma@>t@,t@kb@'t@)t@!t@~t@{t@]t@^t@/t@(t@_t@:t@c 9L ]O _d ka J8 ~n {n S5 >c Ul J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- 67 f# lM.|t@1t@2t@3t@4t@tq.Q& y y $+ $+ y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ %+ O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O %+ %+ $+ $+ $+ 0@ 1~ h5@5t@6t@%)+Z4.ar.j9.J8 ~n >0 S5 >c F- J8 J8 J8 Of Of NM ~n J8 J8 Nf Nf J8 J8 J8 J8 Nf J8 F- Vl '0 ka ja S5 r8.7t@8t@9t@0t@P4@at@bt@ct@dt@et@ft@gt@ht@it@jt@kt@lt@mt@h3 ba@+|@.q@.|@B/@nt@%p +t y).ot@ka@n9@n9@kc@kc@kc@kc@lc@n9@kb@pt@na@na@lb@cd@zs@kc@kc@)l@)l@la@kc@mb@qt@rt@st@tt@V, ut@vt@wt@xt@yt@zt@At@Bt@Ct@Dt@Et@Ft@Gt@Ht@It@,d mA 3o >0 NM ha 7o $r $r $J os Jb Jt@Kt@Lt@Mt@Nt@Ot@Pt@lb@lb@jc@kc@lc@n9@ma@Qt@Rt@^h St@1s vG Tt@Ut@Zz.Vt@Wt@Xt@Yt@Zt@hE.`t@WO u@`q..u@Qa@+u@@u@#u@$u@k2 um@%u@&u@Yt@*u@=u@-u@$I.Mn@;u@>u@Q; ,u@{r@'u@)u@!u@~u@{u@)E+os '0 Nf Nf Nf Nf J8 J8 J8 J8 J8 fe Iv ]u@0q.A..aO 3! Mf I8 Nf >0 ~n ~n ka J8 J8 J8 fe ,d a1 !W -P.^u@oe Tm@/u@.Z gA.(u@_u@Df@:u@'.3< le os Of Nf J8 Nf #u 8Q fz 0q du@eu@|6@@t.os je J8 J8 J8 J8 J8 Ul Ul ka ~n J8 J8 '0 >0 #r #r F- J8 J8 J8 Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf J8 J8 J8 J8 F- @r fu@gu@hu@iu@ju@h4@T0+'h.Wc.Gg y $+ /+ /+ y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 0@ |g@1g@2g@3g@E2.!,.o'.J8 -Y {n Ws -6 Vl J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka gj ku@lu@mu@nu@2Y.ou@pu@qu@ru@su@tu@uu@vu@wu@x|@xu@yu@zu@Af@Ec@Hc@.|@Kd@$2@Au@lE Bu@Cu@3m@n9@lc@kc@kc@kc@kc@jc@Hn@kc@3m@Du@Eu@ir@Fu@Gu@Hu@ln@3m@$j@$j@la@kc@kc@Iu@Ju@Ku@zI+t@ma@lc@lc@kc@kc@ma@>t@k0@ v@.v@+v@F@.@v@#v@>o@$v@$v@>o@>o@(;.%v@&v@&v@&v@*v@=v@=v@nP -v@-v@;v@&v@>v@,v@'v@)v@!v@~v@YW {v@YW YW YW K|.7b.]v@$v@^v@/v@O- OC 4&.os Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 dj ($.(v@_v@dG.,O 3! 77 I8 ka >0 {n ka J8 J8 J8 J8 +G ;_ P] `p ^1.-2.qs :v@'2.0 _d ,0 7Q 74 ,O Ui yp.gv@,r ^d Of Nf J8 J8 Ek Lb Ta@wc hv@iv@v2@jv@os je J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 #r y;@kv@lv@mv@nv@Z`+ov@^2.$q+R=.y $+ /+ R=./+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . Vc.X+ [f@pv@dh@eh@fh@I8 Mf J8 J8 ka F- Vl #r Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ~n :%.S5 67 Ul J8 Nf Nf Nf ka gj ku@qv@rv@sv@%R tv@uv@vv@wv@xv@yv@zv@Av@Bv@Cv@Dv@Ev@Cv@Fv@ph@.|@.|@Kd@Gv@Hv@Iv@Jv@Kv@n9@n9@kc@kc@kc@lc@kc@Lv@cd@Mv@Nv@Ov@Pv@Qv@Rv@Sv@Tv@k0@Uv@pa@lc@lc@kc@jc@Vv@Wv@#].=0.Xv@2{ dm@Yv@Zv@`v@ w@.w@+w@#3 z; )0.y- @w@p-.MT.t}.H8 g` pW |(.+#._O hl.s7.#w@/}.$w@%w@&w@*w@' =w@kb@pa@kc@kc@kc@kc@kc@kc@ma@-w@;w@nm@>w@,w@u7 cY 'w@B1.mI )w@!w@&v@Q; *v@Ts@~v@Ts@&v@&v@*v@~w@{w@]w@^w@/w@(w@_w@:w@o@#D.Ds@WF.Kw h Iv 9c Eh :o.76 Y4 Mf '0 F- S5 S5 F- ka ~n _d J8 77 dj cQ Xy M/ 2/.M^.<: ~Z Dv OS.1w@2w@Z3@3w@x9 4w@P0@5w@gV 3v@n9@n9@lc@ma@zs@zs@ma@n9@n9@6w@7w@8w@9w@0w@aw@bw@cw@dw@ew@fw@gw@hw@,++_m.|-.J8 J8 ka ~n :%.S5 67 Ul J8 J8 J8 Nf Of os 4o }k b{.L< Bd UI f* fe Of Nf J8 J8 I8 I8 [d `K qY az.iw@Ta &O N2 J8 Nf Nf Nf J8 J8 J8 Nf Of J8 J8 J8 J8 Of ha ia v& ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- 67 67 Mf -Y fj J8 J8 J8 J8 I8 jw@kw@lw@mw@nw@ow@+e.wo.Yp+Q& %+ $+ y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . .e.]g.li@pw@qw@oi@$R >0 Mf J8 Ul F- J8 J8 Nf Of Nf J8 J8 J8 J8 J8 J8 Nf J8 J8 J8 '0 ~n {n S5 >c F- J8 Of Nf Nf ja x;.pi@rw@sw@tw@uw@vw@ww@xw@yw@zw@0N.Aw@`p@Bw@Cw@Zp@Dw@Ew@;2@Fw@Gw@.5@.5@^_@Hw@Iw@Jw@ed@n9@n9@lc@lc@lc@kc@ma@0l@Kw@Lw@Mw@Nw@Ow@Pw@Qw@Rw@Sw@Tw@Uw@Vw@Ww@_k@ma@la@Vw@al@Xw@Yw@4J Zw@`w@ x@.x@+x@~g.@x@y9@rs BB #x@J2.vj.uC Wm.t}.Kb _d NM +#.$r 77 yi.cm.t<@4/.$x@%x@Xs@&x@=j.*x@n9@ma@kc@kc@kc@kc@kc@kc@kc@kc@-w@jr@=x@-x@;x@1Y /o >x@,x@QB 'x@QL.QL.`t@)x@A<@&v@~v@~v@~v@~v@YW !x@~x@{x@]x@^x@/x@(x@/F QL.RL.Fd _x@:x@~< Q, 3s@c F- '0 ~n -Y Nf )n /d

    c F- J8 J8 Nf pW pa.hb.'0 fx@gx@s;./!.rh f* fe Nf Nf J8 J8 ha os Do.qF yD.{/ `p 7A H#.}d !n Of Of Nf J8 ja ja Nf Of J8 J8 ka !n Nf I8 ia Mb ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- 67 >c ]O {n '0 J8 J8 J8 J8 I8 2D 8M hx@ix@jx@b+ kx@R=.O-.6. `@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . Vc.a@ 56@lx@mx@nx@g@.k9.Sl J8 67 67 F- J8 Nf Nf Nf J8 J8 J8 J8 J8 Nf Nf Nf J8 Nf Nf '0 >0 F- F- #r Nf Nf Nf Nf I8 ge ox@px@qx@rx@sx@tx@ux@vx@xK.jx wx@xx@yx@zx@Ax@Bx@z|@A[@A[@Cx@Dx@7f@Ex@Fx@Gx@b. m9@n9@n9@n9@lc@lc@kc@Sr@ys@Hx@Ix@Jx@Kx@Lx@Mx@Nx@Ox@Px@Qx@Rx@Sx@Tx@Ux@Vx@Pt@cd@Wx@Xx@Yx@Zx@Id Yw.yk.`x@`=@ y@[..8:@VI.=r Kb St.&y >n..y@Vr t}.Kb _d wL $r $r ha As ;G hI +y@@y@#y@x-. A.$y@%y@3m@na@ma@kc@kc@kc@kc@kc@kc@kc@ma@kb@n9@kc@&y@*y@=y@-y@;y@>y@Pp ,y@UD.>B.'y@98 A<@~v@~v@~v@)x@)y@!y@~y@{y@]y@^y@/y@(y@3J._y@or@:y@}i@O ~%.Uk.&y wL I8 J8 F- 67 J8 [d fj pW Nf /d 4++d_.4y@:k K1 3/ g=.I ./S $` hz.5y@|x@1x@6y@DP.XM.#8.7y@ka@n9@)l@jc@lc@lc@lc@kc@kc@n9@kb@3m@8y@>k.9y@0y@ay@by@K9 DV.I| cy@dy@ey@GS.sV J8 J8 J8 '0 >0 F- F- F- J8 J8 fj *w.I'.&G.[P }4.gx@s;.<] :!.K~.7i Nf Nf Nf Nf ha &O nm.x,.@Z 8-.[< 7_ Ha =h ~n Of Of Nf J8 s_.s_.ja Nf J8 ka >0 ~n Nf Nf I8 I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- Vl '0 '0 '0 J8 J8 J8 J8 I8 4$.`K N%.fy@gy@hy@iy@R=.#. 6. @. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# _8+Q. jy@ky@&,@he@h).!,.Sl J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 Of Of Nf J8 J8 J8 Nf Of J8 J8 Nf ha (O L@ ly@my@ny@oy@py@qy@Bq.Ou.zR ry@sy@ty@uy@Zp@vy@-3@.|@wy@/m@xy@yy@zy@;K.Ay@dC.n9@n9@lc@kc@ma@kc@3m@By@Cy@Dy@Ey@Fy@Gy@Hy@Iy@Jy@Ky@Ly@My@Ny@Oy@Py@Qy@Ry@,t@mc@Sy@Ty@Uy@Vy@Wy@4/.Rt.V-.oe y9@. ++#.NM NM me %x.!s ^1@r_ {9 t}.Kb _d _O o] ##.M)@Xy@5b@Yy@Zy@[5.`y@ z@ZD.9=..z@+z@>t@3m@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@kc@@z@#z@Q&+$z@%z@&z@#O F9. Q *z@~v@~v@~v@=z@-z@;z@>z@,z@'z@)z@C1.!z@;u.yv.%9.#* ~z@{z@]z@:Q.^z@/z@(z@_z@je !d ps Vl J8 J8 J8 J8 J8 J8 J8 Of Of Of 4P tK..C vE .b %L.:z@|I Mf '0 J8 J8 J8 J8 J8 Nf $J $J 5P @1.SE 3Q &~.OP Q@.G8..7_ g# Xl _d NM Of Nf J8 PM Mb MM J8 J8 ka >0 {n ka J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf ke 4x 0z@az@bz@yR.7@ d+ |~ 9@ `@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# O. cz@dz@ez@fz@gz@I8 >x Of Mf ]O '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 !d hz@iz@jz@kz@lz@mz@nz@wK _&._s.oz@pz@qz@rz@sz@tz@uz@Qn@vz@wz@xz@yz@zz@Az@ME.Bz@n9@n9@ma@jr@,t@jr@Cz@Dz@Ez@Fz@Gz@Hz@Iz@Jz@Kz@Lz@Mz@Nz@Oz@Pz@Qz@Rz@Sz@Tz@Uz@Vz@-x@Wz@Uy@z[.*$@Xz@84 =O 0K GE./P.$r $r $J me kx.7M Yz@Zz@m# :C 3=.nA.DE @3@`z@ A@.A@us@+A@@A@#A@$A@%A@&A@!m.*A@=A@kb@-A@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kb@Sr@;A@>A@,A@'A@3+ )A@!A@~A@oH =u@*z@>u@{A@~v@Fr@]A@^A@/A@7b.(A@_A@`L f2 u|@vG Z6@Tb@:A@x Of -Y g` '0 J8 J8 J8 ja ja J8 J8 ka ka F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 K..gh@sA@tA@uA@vA@wA@xA@yA@zA@AA@BA@CA@DA@EA@FA@GA@Ao@HA@IA@JA@Qn@KA@h0 hT LA@n9@n9@n9@ma@jr@,t@Uv@MA@NA@OA@PA@QA@RA@SA@TA@UA@VA@WA@XA@YA@ZA@`A@ B@.B@+B@@B@#B@$B@qm@Yx@Be be @t.)n rs $r $J Of $r $r $J me l.e +%B@&B@*B@EE Ax.Y*.FE.=B@-B@;B@>B@,B@'B@)B@!B@~B@4w.{B@]B@^B@/B@n9@n9@-A@kc@kc@zs@zs@ma@kc@kc@kc@kc@kc@lc@3m@jr@ys@ma@n9@la@(B@_B@:B@0 {n ka J8 J8 J8 Ul F- Nf os Jb R{@O&+8o 8B@9B@0B@**.[P J8 J8 J8 $J #u Ek /=.3=.1#.0V 2k.aB@]y bB@cB@4& K2 xB.dB@eB@fB@=l@gB@hB@iB@jB@kB@lB@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@ma@jr@jr@ln@*x@mB@nB@oB@pB@eV ;V cc@/o.(=@&2 3/.ha J8 J8 J8 J8 J8 J8 J8 J8 J8 F- Vl m/ #u 4o 2V !0 Fj.Ld ,k k! 8Q F- ]n $r #r NM os ~k.qB@rB@t{.Xy /~@nA.ke F- 7o 7o $J Of Of Of Nf F- J8 F- Vl >c F- Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 -h a0 sB@tB@uB@vB@wB@.e.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. %+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 0@ xB@yB@zB@AB@BB@$J >x Nf fj '0 '0 Nf J8 ja Ek Ek #r ne fj >0 |[ 67 F- J8 J8 J8 J8 J8 Nf Nf J8 J8 J8 J8 Nf ha Z*.:v@sA@CB@JP.DB@EB@FB@GB@&&.8].HB@IB@JB@KB@LB@MB@NB@6d@OB@PB@QB@+1 RB@7Y Xj@n9@n9@n9@kc@zs@na@SB@TB@UB@VB@WB@XB@YB@ZB@`B@ C@.C@+C@@C@#C@$C@%C@&C@*C@=C@-C@;C@>C@,C@'C@9l 4K 7H )n #u #r Of NM $J $J $J os :Z.)C@!C@~C@he@Y@.{C@]C@ >@^C@/C@(C@_C@:C@K.xC@yC@zC@jc@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@ma@lb@ma@n9@n9@AC@#B@BC@CC@DC@EC@j&.;7.uD ]y Q= 77 I8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- Vl #r 4o 2V !0 UE Am a| k! 8Q J8 #r #r Nf ha os A6.FC@WV GC@>~.HC@Il.!Y.#r $J $J $J Nf pW :%.S5 >c F- J8 F- Vl Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka [P }P ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 3=.4I Br IC@JC@KC@]f.. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O %+ %+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . . Q& |g@5t@LC@MC@NC@I8 77 J8 J8 J8 Nf Of J8 :d s_.Mb #u Of -Y g` |[ >c 67 J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 Nf me kx.OC@PC@QC@RC@SC@TC@UC@VC@DZ 2E WC@XC@YC@ZC@n8@Zz `C@ D@.D@+D@@D@~D.#D@f, $D@kc@n9@ma@kb@kb@cd@k0@%D@&D@*D@=D@-D@;D@>D@,D@'D@)D@!D@~D@{D@]D@^D@/D@(D@_D@:D@ oD@pD@qD@xf@rD@sD@tD@&Y w' uD@Y4.2P g` '0 J8 J8 F- ej -6 Vl J8 [d J8 67 >c Ul '0 >A NP.#=.4I.iG.C' u^.f# Vl J8 ne Of 67 ej $J 5P jL @o.vD@2k.01 _O.wD@xD@yD@zD@AD@BD@xf@1x@`k CD@_1 DD@ED@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@jc@fg@vR FD@GD@HD@go.M/ }p fe 77 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of '0 J8 {K U> $b __.a6 ;_ 8Q J8 J8 J8 J8 ha >x ss ID@7-.JD@KD@q_@jR !Y.Of Of Of Nf J8 -Y g` Ws -6 Vl J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka }Z |Z ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 =h LD@MD@ND@OD@PD@&+ y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ /+ 6W.Lr.X+ QD@2b@RD@SD@TD@I8 Mf J8 J8 J8 J8 J8 J8 J8 ka ka Of Of Nf ka J8 :d s_.3o ka F- 67 >c $J Of Nf J8 J8 J8 Nf me `k.7t@UD@VD@WD@XD@YD@ZD@`D@%S. E@.E@+E@@E@#E@U@.$E@%E@&E@Qs@h9.*E@}-.=E@-E@;E@om@n9@na@>E@ys@,E@'E@)E@!E@~E@{E@]E@^E@/E@Wj@_k@(E@_E@:E@x ,x } .PC PE@QE@Z+.[/.nA.,x Of Of Of Nf J8 ka ka F- Vl #r Nf Nf J8 J8 F- 67 67 ]O ~n fj J8 J8 J8 J8 J8 J8 J8 '0 '0 Of Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 Nf je _}.8q.RE@SE@TE@]f.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ R=.pT |~ #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ Gg Lr.d,@]g.UE@VE@WE@>s@TD@'0 Mf J8 J8 J8 J8 J8 J8 J8 J8 F- Nf Nf Nf J8 J8 ja s_.Mb ka F- 67 >c #r Nf Nf J8 ka '0 Nf os xp.XE@YE@ZE@`E@ F@.F@w( +F@9R.@F@nV i|.f` #F@$F@%F@OG Xl.+4 b5.&F@*F@=F@-F@;F@n9@kb@;A@>F@oa@,F@'F@)F@!F@~F@{F@]F@^F@0l@pa@/F@(F@_F@:F@Uv@$ 0p 6N.}:.-O fe Nf J8 J8 Nf qs qs >` UF@]}@`R WD 8M os ^d Of Of Of Nf J8 J8 J8 [d ka Of Nf J8 J8 !n ja >c -6 ]O _d fj J8 J8 J8 J8 J8 J8 Nf Nf Of Of Nf 6A $_.[d J8 J8 J8 J8 J8 J8 Nf ke 5x VF@WF@XF@YF@M{@$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 09.pT |~ #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ %+ O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Vc.Vc.a@ ZF@s3@`F@ G@rF '0 Mf J8 J8 J8 J8 J8 Nf #r Vl 67 F- Nf Nf Nf J8 J8 ja S5 J8 J8 F- F- Nf Nf Nf Nf ~n ~n '0 ha .G@_q@+G@@G@#G@$G@OG.=k.%G@`a &G@*G@P~.=G@-G@;G@>G@+y.F'.,G@'G@)G@!G@~G@{G@Qt@n9@kc@ka@(F@]G@^G@/G@(G@_G@:G@v@]v@,o@7b.>v@GG@HG@IG@JG@KG@Kb ^n ia ]n $r $J Of Nf J8 J8 fj -Y _d S5 >c >c 9L Zy }p <] LG@1J {u 6# ha Nf fj -Y _d #u Vl Vl #r &O 3-.MG@NG@//.bp.OG@PG@QG@0v ve.RG@SG@TG@UG@VG@WG@kb@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@DD@XG@YG@W<.0C.mr (O ~9.ja J8 J8 J8 J8 J8 J8 J8 F- Vl ej ka Fk Ib |I (d.)F L- Ud.fe Nf Nf Nf Nf ]n Ww.^8.ZG@`G@`R WD T,+4P ^d Of Of Of Nf J8 Nf '0 ~n ~n '0 J8 J8 J8 ~n >0 9L -6 ja fj fj J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf 6A !` t5.$_.J8 J8 J8 J8 J8 J8 Nf ke 4x H@.H@lA@YF@5~@$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y y m) %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# _8+Q. +H@@H@#H@$H@u5.#u 7i J8 J8 J8 J8 J8 Of $J Vl >c F- J8 Nf Of J8 J8 Nf Of J8 J8 J8 J8 J8 J8 Nf Of -Y _d ~n I8 Fp %H@&H@*H@=H@-H@'{.u;.eS.;H@>H@,H@'H@)H@!H@hq@~H@yq.{H@]H@^H@/H@(H@v%._H@-w@n9@Hn@:H@na@-w@ /^ 0E xP I8 J8 [d fj :%.Vl >c Ul J8 qs UX VH@WH@XH@YH@ZH@`e@`a@`H@ I@ I@*8 .I@c5.,q.+I@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@@I@u).#I@$I@%I@&I@$q T5 J8 J8 J8 J8 J8 J8 J8 J8 F- >c -6 #r ]d ke h6 CZ ,~.tq ;h fe Nf Nf Of ka @r :l@*I@5:@lM lM hA 1I os ^d Of Of Of Nf J8 Of NM :%.{n ka J8 J8 J8 -Y {n Ek >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 $_.t5.)` $_.J8 J8 J8 J8 J8 J8 Nf ke ]u VF@=I@G!@YF@5~@$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# Q& -I@;I@>I@,I@G!.(*.gj -Y Vl 67 Ul J8 J8 '0 ]O ]O ka J8 J8 J8 J8 J8 Nf Of Nf Ul 67 67 [P >0 wL $r $J nA.:%.5o 'I@rd )I@!I@~I@>G@{I@]I@Sk.^I@/I@(I@_I@EV.JN.:I@o@&v@#J@Vt@)x@$J@%J@&J@*J@Qa@=J@-J@;J@Jf ^d $J $r ps 7o Of Nf J8 J8 J8 J8 J8 J8 F- ]n wL Zy eH >J@Y-.uW.4B &R I8 J8 J8 Nf Of F- F- J8 J8 )n ]K m'@L5.$S b) DB.QG q+.&n ,1.L1@,J@'J@)J@!J@~J@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@{J@]J@E_.^J@/J@Yb.n .ia Nf Nf J8 J8 J8 J8 J8 Nf Nf F- F- J8 >h >h #y ^{ Rf.Lx Ax fe F- 67 Vl '0 ##. =@(J@_J@:J@$ me /d Of yS 3o :d J8 J8 #r S5 S5 F- J8 J8 J8 J8 '0 Nf #r J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 [d $_.$_.[d J8 J8 J8 J8 J8 J8 Nf ke 5x [J@=I@}J@YF@5~@$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y /+ R=.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ @. ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 0@ |J@1J@2J@3J@au Ak gj -Y Vl >c Ul J8 J8 ka >0 _d ka J8 J8 J8 J8 Nf Nf Of J8 Ul 67 >c >0 {n wL $r $J >x ]O g9 4J@5J@6J@7J@8J@9J@0J@aJ@bJ@cJ@dJ@eJ@fJ@gJ@V*.hJ@iJ@jJ@n6@kJ@lJ@mJ@nL.nJ@oJ@kc@n9@pJ@)l@qJ@rJ@sJ@tJ@uJ@vJ@wJ@BG@xJ@gc@yJ@zJ@AJ@BJ@CJ@DJ@EJ@FJ@GJ@HJ@IJ@JJ@KJ@LJ@MJ@NJ@OJ@PJ@x,.]l J8 J8 fe Qf `u QJ@:2 RJ@rr@v/.SJ@|p@8J@TJ@UJ@VJ@WJ@(Q.{K.XJ@YJ@ZJ@A<@`J@$>.3h.:^.MV ]a. K@.K@`3.de@n9@n9@n9@n9@n9@kc@Hi@+K@@K@#K@$K@%K@&K@*K@=K@-K@;K@>K@,K@'K@)K@!K@~K@kc@kc@ma@3m@l0@[G@{K@^) ]K@Lp oq.^K@Q; }5.>v@KB./K@(K@_K@:K@h H1 :*. g.%f T0 77 F- Vl ej Of om.0K@c[.aK@bK@nI.Wy@>$ os ^d $J yS 3o :d J8 J8 F- Vl >c F- J8 F- F- J8 Nf ne Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 ke +C ~B+=I@cK@dK@eK@%+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y /+ R=.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ `@ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# 0@ kS fK@gK@hK@Z4.j9.^n '0 #r #r F- J8 J8 J8 '0 ~n J8 J8 J8 J8 J8 J8 Nf Nf J8 J8 Ul Vl NM NM ha $J 4P 77 s_.iK@jK@kK@lK@mK@nK@9' oK@pK@qK@Zn.rK@sK@tK@LY uK@vK@wK@xK@yK@zK@AK@>8 BK@tF@Jo@la@kb@pJ@CK@DK@EK@FK@GK@HK@IK@Uv@JK@gc@KK@LK@MK@NK@OK@PK@QK@RK@SK@TK@UK@VK@WK@XK@YK@ZK@`K@r*. L@x,.sH J8 J8 ia yr gh..L@+L@@L@/q.N/ =#.iG.#L@Rc. I $L@%L@&L@*L@=L@-L@;L@>L@,L@$s.'L@P< QS AN.)L@!L@~L@>A@{L@n9@n9@n9@n9@la@]L@^L@/L@(L@_L@:L@5 Hq Hp.~|@1< h).I8 J8 J8 Nf Nf J8 J8 J8 I8 la J; xk.oC HH.`o.jy hL@YD.{< 6G v|@iL@Q).jL@kL@)l@m9@eD@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@Hn@)l@$D@Rt@Bl lL@p7.@b Iv I8 Mf J8 J8 Nf Nf Nf Nf Nf Nf J8 J8 77 77 H1 #=.Wt.tq 6x Nf Of #r F- Nf Xw.0L.:Z mL@Tx nL@oL@>$ os Jf 7o wL I8 ja J8 J8 J8 F- 67 J8 J8 Vl Vl I8 ~n fj Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 jL wS pL@qL@rL@.# sL@`@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y n)+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg tL@uL@vL@ea } .(d ,0 J8 Of Of Nf F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Of Of |(.#u /+.wL@xL@yL@zL@AL@BL@$*.CL@DL@EL@V4.;K.8j.Gs@@s.FL@GL@HL@IL@JL@V).KL@+_.9~ n9@LL@4I@la@ma@Vz@ML@NL@OL@PL@QL@RL@SL@'D@TL@UL@VL@WL@XL@YL@ZL@`L@ M@.M@+M@@M@#M@$M@%M@&M@*M@=M@-M@;M@3&.TB J8 J8 F- ]n Ws.>M@,M@'M@)M@!M@~M@{M@6h ]M@96@^M@/M@(M@_M@:M@v@YW Qb@Jg@qM@rM@j|.>$ dj _*.>c F- NM :%.g` ka J8 Nf Of J8 J8 J8 I8 Zy ^s Jy.@'.1&.NO.3/.I8 J8 J8 J8 J8 J8 J8 J8 I8 K..;< =k Ct jq.IM sM@tM@uM@vM@hB@wM@xM@yM@!N n9@la@$j@la@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@dd@!l@zM@AM@BM@CM@/C >O I1 I8 >h J8 J8 J8 Nf Of F- F- J8 J8 J8 77 77 Iv .b 6c (9 *! TB ha ha J8 J8 oe Rt.|p S{.UN yV.DM@GJ qs Jf $r $J Of Nf J8 J8 J8 J8 J8 J8 F- Vl >c ]O _d ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 J..,$ EM@qL@FM@PD@sL@@. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ /+ 6W.Lr.{f.GM@HM@IM@JM@KM@1P 7i J8 Of ha Ek v& ja J8 J8 J8 J8 J8 Nf $J Vl |[ [P _d ka J8 J8 J8 J8 Nf Of n[.$K+c! LM@MM@NM@OM@PM@*H@QM@QG.c..RM@SM@f_.`Z Uy TM@UM@VM@yz@WM@XM@YM@ZM@`M@ N@.N@n9@+N@@N@m9@kc@#N@$N@%N@&N@*N@=N@-N@SB@1G@;N@>N@,N@'N@)N@!N@~N@{N@]N@^N@/N@(N@_N@:N@.S~ UE ]d.gD qF ga J8 J8 J8 J8 J8 Nf Nf Nf I8 Hp .y Nd %S ;K.HC MY qJ I@Uf (i B) I-.tN@DN@n9@n9@jc@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@kb@kb@EN@FN@GN@HN@IN@JN@h] N; '0 ke Nf J8 J8 J8 F- >c >c ja -Y J8 77 77 ($.h] Am .@.S~ 2&.m/ f# 67 J8 >h ,d -q 10 {x.KN@3i.ZK os )n J8 Of Of Nf J8 J8 J8 J8 J8 Nf Nf #r F- ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 }P }P !O J8 J8 J8 J8 J8 J8 J8 J8 Nf ]d 2k LN@MN@NN@ON@o-@0 J8 J8 Nf J8 J8 J8 Nf &N N1.rv ;g I{ +:.UN@VN@WN@XN@YD.q@.YN@Pu.G1.MB@GL@ZN@`N@=2@ O@y|@.O@+O@5k@T2 @O@#O@n9@la@)l@la@6s@Mv@$O@%O@&O@*O@=O@-O@Nv@_k@;O@>O@,O@'O@)O@!O@~O@{O@]O@^O@/O@(O@_O@:O@v@>o@fb@[U }* oO@hC@pO@qO@(j@rO@y0.KA Rf 84 NM Nf F- Vl >c F- J8 J8 J8 J8 J8 J8 I8 b>.S~ sO@_: cK.M^.77 ka F- F- J8 J8 #r #r #r #u b>.S~ ap [r.UA.Yz.tO@vj bA uO@c 9L >0 _d '0 >x >x L+.-D.Fb Q) .x.]t -6 Ap ej J8 77 +G pC cd CO@&L Uk.RE os )n F- Of NM fj [d J8 J8 J8 J8 Nf Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf J8 J8 }P }P ka J8 J8 J8 Nf J8 J8 J8 J8 J8 dj 4U DO@EO@FO@YF@#+ b8+g(+#. `@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Wc.<8 GO@HO@IO@JO@KO@LO@@u.YE J8 Of Of ha I8 J8 J8 J8 J8 J8 !n ~n :%.ej gz 7h S5 J8 Nf Nf Nf J8 F- Vl ej BB 6# MO@NO@OO@PO@QO@RO@SO@sl@TO@UO@VO@WO@XO@YO@ZO@`O@ P@ O@`4@.P@+P@@P@#P@$P@%P@n9@kc@jc@kc@6s@Mv@&P@*P@=P@-P@;P@>P@,P@Mv@'P@)P@!P@~P@{P@1G@Nv@]P@^P@/P@(P@_P@:P@A Ci.db.U6.VI.+R 4P@5P@6P@7P@H4.8P@9P@ei 0P@n9@n9@n9@la@aP@0O@bP@cP@dP@kc@gc@eP@fP@gP@hP@iP@jP@kP@lP@mP@nP@BH@kc@kc@kc@kc@kc@kc@kc@m9@oP@5~ gm #M.`P =v@^` 0 Vl Vl F- Nf Vl ej @r H#.Sm@d..9N rP@$* -[ Uf sP@5k@tP@uP@vP@wP@RZ xP@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@n9@yP@zP@*s.|F.fA@Mp.AP@BP@CP@MS.hb.Nf J8 J8 J8 Ul ja >0 _d NM >x os sy T+.4' E( 96 Lu Vl H#.#r Nf )n yr pC DP@1q JD@Uk.RE os t}.]n ha -Y -Y fj Nf Nf J8 J8 Nf Nf Nf J8 Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 !O ka ka J8 J8 Nf Nf Nf J8 J8 J8 J8 77 }t./y EP@FP@GP@kS RO+``+`@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ Q& 8. z# HP@IO@IP@:` RP '$ YE J8 Of Of Of Of J8 J8 J8 J8 J8 !n ~n {n S5 -6 -6 >c F- J8 Nf Of J8 Ul >c f# -r g' JP@z6@KP@LP@MP@NP@OP@PP@QP@RP@SP@TP@UP@VP@WP@WP@XP@YP@.|@ZP@`P@g0. Q@.Q@+Q@n9@n9@n9@kb@3m@1G@@Q@#Q@$Q@%Q@&Q@*Q@-w@1G@=Q@-Q@;Q@>Q@,Q@Nv@ja@$j@'Q@)Q@!Q@~Q@{Q@]Q@^Q@/Q@(Q@_Q@xO@:Q@3&.F2.NM _d _d -Y Nf J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 ja }$ Lb ja J8 J8 [d ne Of om.d:.yU.~l.<.lQ@1F.IP mQ@nQ@oQ@J1@:m@fr.pQ@}x@0w.0 :%.&N $J os G- :W 1B Bh w0 D0 Mf je Of Of )n yr zQ@AQ@CO.BQ@Uk.RE qs Jf $r ha _d _d :%.Of Of Nf J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 wL CQ@}p DQ@EQ@FQ@QD@d,@Vc.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg R=.O-.9@ %+ $+ $+ $+ $+ $+ $+ Q& 8. sL@GQ@HQ@IQ@JQ@ 8 #u )n J8 J8 J8 J8 Nf >c >c Ul J8 J8 J8 Nf NM J8 ja ]O ]O ka J8 J8 J8 J8 J8 F- ]n b1 KQ@LQ@MQ@NQ@OQ@PQ@d7@QQ@RQ@SQ@TQ@UQ@yI@P9@h8@VQ@WQ@XQ@YQ@ZQ@ J Fb@`Q@O]. R@n9@-A@-A@jc@-w@oa@1G@.R@#Q@+R@@R@#R@$R@%R@_k@&R@*R@=R@-R@;R@Mv@>R@,R@'R@)R@!R@~R@{R@]R@^R@/R@(R@_R@:R@Kp@m[.$ +Of NM NM Nf J8 J8 F- 67 67 Mf -Y fj J8 J8 J8 Nf Of 77 I8 Nf J8 J8 J8 Nf Of 4P Pf N2 84 ]A.CS.A$..IR@3D RE os ^d Of _~.NM #u Vl F- J8 J8 J8 J8 F- 67 67 Mf -Y fj J8 J8 ka ~n :%.S5 67 Ul J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 $J J8 JR@KR@LR@MR@u. yL+Vc.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg R=.O-.#. %+ $+ $+ $+ $+ $+ $+ Q& 8. NR@-m@OR@PR@QR@!q I8 )n J8 !n ka F- Ul fz fz Vl F- ka '0 Nf Of J8 !n ~n _d ka J8 F- F- J8 :%.,x om.@k@RR@SR@TR@UR@VR@WR@MJ.[,.i5./*.8X XR@YR@ZR@`R@ S@ S@i7@I9 Y6@#i &a .S@,C 7H@n9@kc@lc@jc@jr@l0@Mv@+S@@S@#S@$S@%S@&S@Vz@_k@*S@=S@-S@;S@>S@Mv@,S@'S@)S@5K@!S@~S@{S@]S@^S@gc@In@/S@(S@fW._~.cy.pW Of Nf Nf J8 J8 F- 67 >c ]O g` '0 J8 J8 J8 Nf Of Of Nf ne !n J8 Nf Nf Of Nf $J $J pW _m.:K.Qj hW._S@:S@c Of $J @r Ap FE /!@]f $C }< T0 mc.Of J8 >0 >h ~Y 1K *O Ws.uS@vS@wS@xS@Le@yS@zS@AS@BS@d;.2x@CS@DS@^h ES@ma@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@FS@GS@>c.HS@IS@JS@KS@6b.U:.9_ fc 4o fe Mf ha hH bt 4x 4x [= 7h L} K{.6c iP f^.=% S% ps NM .p@LS@MS@NS@N>.`f.^y ZK os ^d $J Of $J ej >c F- J8 J8 J8 ja |[ >c >c ]O g` '0 J8 J8 !n ~n {n S5 >c F- J8 J8 J8 J8 J8 J8 4o sH sH 4o J8 J8 J8 J8 J8 J8 J8 $J '0 OS@PS@QS@RS@bh@yL+Gg %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y n)+ O %+ %+ $+ $+ $+ $+ $+ $+ Q& t. NR@-m@SS@TS@Bz h6 ]O >h J8 ~n >0 S5 67 MM ]O S5 Vl ]O >0 '0 Nf J8 J8 fj ~n J8 F- Vl ]n '0 Q,.Dp PP.US@~o@VS@WS@XS@A5@YS@uJ.r2 Qn yE #E.ZS@`S@ T@`R@.T@{3@+T@@T@#T@Ed U[ &w.$T@)l@n9@kc@kc@kc@zs@Gn@_k@%T@&T@*T@=T@-T@;T@Vz@1G@>T@,T@'T@)T@!T@~T@{T@]T@^T@/T@(T@_T@:T@<.sT@tT@Gd@uT@vT@wT@xT@{T.2X yT@zT@AT@BT@_%.os )n Nf J8 J8 F- Vl Of $J $r T0 $G {%.<] tE.2, Ap }d Nf [P Sl ^n DE la FE.CT@DT@bE@ET@[u@O3 FT@GT@HT@=4 n> @s [z@IT@T8 JT@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@6w@KT@Yf.LT@Z5@MT@NT@OT@PT@QT@RT@5/.5o >x )n H#.bt '~@Lv 5o 9L wr {9 y9._: 9u ^+.5h ps NM ST@TT@UT@VT@TN WT@XT@>$ 4P Jf $r $r 7o ]n 67 J8 J8 J8 J8 s_.PM fz Vl '0 '0 '0 Nf J8 J8 fj :%.#r F- F- J8 J8 J8 J8 J8 J8 sH M1.2k sH J8 J8 J8 J8 J8 J8 J8 I8 U+.($.YT@ZT@`T@k>@yL+P. `@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ s3.^2.nA@ U@.U@+U@'5 o}.YE J8 -Y >0 9L >c g` :%.S5 >c ]O _d ~n J8 J8 J8 J8 J8 J8 F- ]n $r >x Q,.`].B$.@U@#U@Vs@$U@JB.tJ.7b.%U@Fd.K..&U@@t.*U@=U@-U@;U@h7@gb 8E.1F.b0.]R ~j w_ 7E@$j@n9@kc@kc@mb@n9@6s@pa@>U@,U@'U@)U@!U@~U@;t@Nv@{U@]U@^U@/U@(U@_U@:U@0 {n NM Of Nf J8 J8 J8 Nf $J 8h.o] Z8 '$ V> !l 6U@l= 7U@JT@8U@9U@0U@aU@bU@cU@dU@eU@fU@gU@eT@hU@iU@iP@jU@kU@lU@mU@nU@oU@pU@qU@rU@sU@kc@kc@kc@n9@jc@tU@e#.uU@O| Fr@vU@wU@uT@vT@A|@_x sq@IG xU@Xt@rM@dK.cW.os ,r Of F- F- J8 J8 Of $J $r H#.Fp G]@m_@iP 0E f# /O ka !,.:n.r` M1 P4 yU@zU@AU@BU@CU@=_@DU@EU@#' FU@(i /i GU@HU@ye H$ ja@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@la@gc@IU@5n JU@KU@LU@MU@NU@a2 OU@+U PU@QU@Z@.$J 0K o] o] ps #r I8 S% T7 Xy iP AB z(.Ar.$r ha 8Y.}:@RU@SU@TU@e4@!k ec 4P 0K ps ps $r #r J8 J8 J8 J8 J8 s_.Mb Ek J8 J8 J8 Nf Of F- F- Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 sH +C x,.k* J8 J8 J8 J8 J8 J8 J8 '0 UU@VU@WU@XU@YU@ZU@W@+0>.#. O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ P. mf `U@ V@.V@9q Ck K~.J8 J8 J8 F- F- ka J8 J8 F- ka ka J8 J8 J8 J8 J8 J8 J8 J8 Nf os Ql.Nf .A +V@@V@#V@$V@%V@Q3@cF@&V@*V@=! B:.Ut.UF@=V@-V@;V@ S@>V@Md@,V@'V@dU )V@6K PS !V@LL@n9@kc@kc@kc@kc@kc@kb@~V@{V@]V@^V@/V@(V@Jo@1G@_V@:V@c Ul J8 Of Of Nf I8 pe %2 #=.9,@O/.S5 ie I8 Y@.Qs JV@01.KV@LV@MV@NV@(s@OV@7[@Ja@PV@QV@&7@RV@CS@/i SV@O8@TV@$j@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@la@n9@UV@Bg VV@WV@XV@YV@ZV@`V@ W@jD@.W@b_.@#./t.{C@mW ^d Nf J8 |P Y7 gP iP wg W$ +W@ps _O H!.@W@#W@$W@%W@&W@5e.at os ,r $J 7o $J Of Of J8 J8 Nf Of Of Nf Nf J8 J8 J8 J8 F- >c ej F- J8 67 Vl '0 pW J8 J8 J8 J8 J8 4o TB TB 4o J8 J8 J8 J8 J8 J8 J8 >0 :%+*W@=W@-W@;W@>W@Fi+c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- F- J8 J8 J8 F- Vl >c F- Nf Nf Of J8 F- ]n $r $J ne _~.me K..Mj mW@nW@oW@pW@=w@qW@rW@sW@tW@uW@vW@wW@xW@yW@zW@AW@BW@CW@hO@DW@EW@FW@GW@HW@IW@JW@KW@LW@kc@kc@kc@n9@kc@$B@W@ MW@ x.NW@Hs OW@Pn@PW@QW@Dz.RW@SW@Dz.[* 7b.ZG.j9@>` xL $J ej >c F- J8 I8 I8 #r #u eN ug Xy 9,@`=.fe db.#r F7 V|@w#.TW@Ez.L3@m7@UW@VW@WW@XW@YW@ZW@8A@Do@DU@@s %t@'E.|..`W@$j@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@jR@ X@.X@+X@@X@]_@;4@#X@Ie@$X@&E@%X@^C@4B g' } .Of Ib K..u~@F7 s .=1.x- Ap Ax $r ps fQ PZ.&X@*X@=X@,S $b G]@os je #r Of Of Of Of J8 J8 Nf Of ha ha Nf J8 J8 J8 J8 F- 9L 9L F- J8 67 S5 ]O {n '0 J8 J8 J8 J8 Nf Nf Of J8 J8 J8 J8 J8 J8 J8 J8 '0 -X@as ;X@>X@,X@,K+'X@R=.O-.`@ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ P. 4)@qT )X@!X@~X@{X@,d al.Mb J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 >0 ~n [d ia YE 6= z6 s .ky 4z.py.&9.OE s} BE@.Z.]X@,&@^X@ o.bz.tO./X@(X@_X@:X@,3@#2@C@lX@m#.&W i[ J8 F- 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 67 F- J8 J8 J8 F- 67 Nf Nf Nf Nf J8 J8 F- #r Nf fj ~n OM =O dr@mX@nX@oX@pX@qX@rX@sX@tX@uX@vX@wX@xX@yX@zX@AX@BX@CX@DX@8S@EX@FX@GX@HX@IX@JX@KX@LX@MX@kc@kc@kc@n9@n9@*q@NX@OX@PX@%u@QX@eq@=l@PW@ai $}@RX@SX@ve.TX@Ir.[h UX@:v@7o NM #r F- J8 J8 Ek Ws hH hH )$ '( Ld iP -0 VI.VX@([.AS.WX@XX@YX@e9@ZX@`X@ Y@.Y@Pn@+Y@@Y@#Y@#Y@O3@YW@B|@$Y@9| %Y@&Y@$j@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@ir@*Y@=Y@-Y@;Y@ T@U:@>Y@Ka@C1@,Y@'Y@)Y@!Y@_J.~Y@7M #r )0 {Y@Mm s .=1.0E T0 mc.7o ps ~K Kf vo ]Y@^Y@/Y@DB P;.os Qf ej Nf Of Of Nf J8 J8 Nf Nf ia ia I8 Nf Nf Nf J8 J8 ]O ]O ka J8 Ul |[ yS o}.]O Nf Nf Nf J8 J8 Nf Of J8 J8 J8 Nf Nf Nf Nf J8 Nf c (Y@_Y@:Y@B0.7W.d+ c Vl J8 J8 J8 J8 J8 Of Of Nf F- J8 J8 J8 J8 J8 !n ~n _d wL 0U.yY@gE@zY@'N AY@yO@BY@CY@DY@EY@FY@GY@HY@IY@h .JY@KY@LY@CW@MY@NY@OY@PY@QY@RY@SY@TY@gS@kc@kc@kc@n9@n9@ka@UY@h_@VY@WY@XY@YY@QW@99@ZY@`Y@gB@ Z@5K.z4.#D..Z@+Z@@Z@8)@>x ]O F- J8 J8 3o eQ yr rs =; '( #/ iP 9D :Z.VI.dH #Z@$Z@%Z@qO@P2@&Z@*Z@=Z@*H *l@Wn@Hf@,V@v_ nQ@-Z@nH G{ Y} ;Z@ME.)l@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@pF@>Z@,C@W2 ye ;L.,Z@'Z@Je@)Z@!Z@~Z@{Z@]Z@^Z@/Z@@E.(Z@H7 3< Lv %J %b ,'@Jm o7 *h os 7o Jf Pf x,.z6.34._Z@DQ 0y.qs ;c -6 #r Of Nf J8 J8 J8 J8 J8 Mb Mb ja Of Of Of Nf J8 -Y _d ~n J8 J8 ja PM v& #u Of Of Of J8 J8 Nf Of J8 J8 Nf Of Of Of Nf J8 J8 &$.LP im 3Z@9m H1 >0 i$@}Y.H'.2j.JE /*.I/@4Z@5Z@6Z@09@_3@B_ 7Z@8Z@9Z@MB@0Z@aZ@bZ@-w@n9@kc@kc@lc@lc@ma@Nv@oJ@cZ@dZ@eZ@fZ@gZ@>E@Vz@oa@JK@hZ@iZ@jZ@kZ@lZ@mZ@nZ@oZ@pZ@qZ@CK@rZ@m9@sZ@tZ@uZ@7# dQ J8 Nf Of J8 ka ~n -Y ka J8 J8 J8 Nf Nf Nf J8 I8 :%.-Y -Y J8 J8 J8 J8 J8 F- Vl -6 ]n Nf Nf J8 J8 J8 '0 NM -Y H8 mc.vZ@wZ@xZ@yZ@zZ@hc@AZ@BZ@CZ@DZ@EZ@FZ@GZ@q*@HZ@IZ@JZ@KZ@LZ@MZ@hR@CH@NZ@OZ@PZ@OY@sU@kc@kc@kc@n9@n9@la@AC@QZ@RZ@SZ@TZ@UZ@VZ@WZ@S6@XZ@YZ@ZZ@`Z@>H. `@uU@qR@2/@0M }d (*.3o :d J8 ka ja #r &O !M@k] #/ iP tN Ww..`@v_.U&.+`@@`@#`@$`@Lg@kz.%`@pr@&`@GU@bA <| *`@AI@=`@-`@3) ;`@>`@,`@jc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@n9@*q@ec@>x@'`@$K.`Q@PW@)`@!`@~`@{`@]`@^`@/`@(`@qB mW.:=.9Z E4 T@.$h@hc >'@Rm@_`@[~@GV.@#.:`@<`@[`@}`@$b D3.ha N2 ]n Nf J8 J8 J8 J8 J8 J8 J8 ja ja J8 J8 J8 J8 J8 J8 ka ka J8 J8 J8 J8 F- S5 F- J8 J8 J8 J8 J8 J8 J8 J8 F- Vl ej F- J8 J8 J8 1G |`@1`@2`@3`@4`@5`@6`@7`@d+ Vc.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ a@ ^g.3n@8`@9`@0`@a`@k|.jL Of J8 J8 J8 J8 Nf Of Of Of J8 ka >0 {n ka J8 J8 J8 Vl ej F- '0 Kb HI >d Zl b`@(| '$ Mf {n :%.:%.,0 8J.D#.3h.c`@d`@8Y@e`@]3@OV@+q@f`@y[@g`@h`@i`@io j`@;A@n9@lc@kc@kc@kc@ma@>t@;w@^S@k`@l`@m`@n`@SB@oa@}G@ys@Bz@o`@p`@q`@r`@s`@t`@u`@oa@xJ@v`@cd@-w@w`@x`@y`@7# sv Nf Nf Of J8 ka >0 g` ka J8 F- F- Nf Of Nf J8 fj -Y _d >0 J8 J8 '0 ka F- Vl >c >c #r Of Nf J8 ka '0 Of Of t7.^#.*$.z`@Xu.A`@B`@C`@5s@#B@D`@E`@F`@G`@H`@I`@J`@K`@L`@M`@N`@O`@P`@hR@jc@jc@LL@Q`@LL@pF@kc@kc@kc@n9@n9@kc@n9@Yx@(..D3@TZ@gC@R`@S`@eq@*3@T`@U`@zw@V`@M: Tf W`@X`@bK 5X ;O Mb s_.ja J8 ne _~.os ]Y k6 d^.iP :' /u@>C -o@Y`@MF@Z`@``@SV@[B@ #. #8D@+ #@ ##d@# #$ #H7.d2 % #i_.& #* #In@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@n9@jc@vQ@xm = #5D GN #, #' #) #! #Me@WZ@lj ~ #z'.!w..! c F- J8 J8 J8 ka zC+1`@( #_ #: #< #6`@tV.5W.. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Wc.!S+HP@[ #} #| #a`@k|.]d Of J8 J8 J8 J8 Nf Nf Nf Nf J8 F- S5 Ws F- J8 J8 J8 #r #r J8 '0 Kb t .%i..v K'.Ww ~d Wl :%.NM wL t}.1 #|] o&.U2@RV@2 #>2@c(@3 #4 #d9@Bi@5 #6 #7 #u4 FS@=x@kb@lc@kc@kc@kc@ma@xs@0I@8 #9 #0 #a #b #SB@_F@l0@-w@c #d #e #f #g #bI@h #JH@Uv@BG@;R@%j@i #j #k #l #b! Nf Nf Nf Nf J8 F- S5 Ek J8 J8 Vl Vl #r Nf Nf J8 fj '0 ja 9L F- fj ~n >0 S5 >c >c F- Nf Nf Nf J8 ~n -Y NM Of 0_.;h m #n #o #p #q #r #s #9l@$j@&q@t #u #$K@v #6K@BC@w #x #y #z #A #YI@kc@jc@jc@jc@jc@kc@kc@kc@kc@kc@n9@kc@n9@B #y7.C #D #YY@E #Fb@F #zz@WR@U`@G #H #Tf Ks@I #J #|J n'@yr PM Mb yS I8 _~._~.os h<.zs Ml.f` Uv.lc K #L #Wn@[r M #N #O #P #z5.7D wH *=.Oc Lp Q #Ng.R #S #T #um@U #V #W #kb@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@jc@X #E].85.-B.RG Y #z4.7A.Z #` #N<@ .#..#j7@+.#+5@ZW@@.##.#$.#gE.%.#&.#9&.gW A%.*.#=.#-.#;.#>.#,.#B6.G[ &O ,r Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 ka >0 ~n ka J8 Nf Nf J8 J8 J8 Nf J8 J8 J8 J8 J8 J8 F- Ul Nf Nf Nf J8 >0 '.#>h ).#!.#~.#{.#@5.R=.. y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y 09.sq.9>.].#^.#/.#(.#V7.Ib Of J8 J8 J8 J8 J8 J8 J8 J8 J8 F- >c -6 Vl J8 J8 J8 Of Of Nf J8 fj nk.2-.Qj /d pW pW _d :%.$J $r Kf E..nv _.#_j@:.#xf@,Z@<.#<.#f`@x}@:j@[.#vj }.#|.#fc@)l@n9@kc@kc@kc@kc@jc@$j@1.#2.#F@SB@Nv@kb@kb@na@BG@BG@By@,t@kr@7.#8.#41 67 Nf Of Nf J8 J8 F- Vl >c J8 F- Vl >c F- J8 J8 J8 J8 F- >c -6 Vl ka ~n {n S5 >c 67 J8 J8 J8 J8 J8 >0 {n :%.Of _~.0U.A +H 9.#0.#a.#b.#c.#d.#~O@!l@BR@ja@)l@la@jc@m9@e.#3S@f.#g.#h.#YI@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@i.#j.#k.#l.#m.#m.#n.#o.#:R p.#q.#r.#s.#t.#u.#v.#w.#|6@8h.qs ja o}./=.ha Of Of os Jb Hv -6.N0.K4 x.#y.#z.#cg@A.#B.#n^.`k@||.@R 4i j[ C.#D.#me.E.#F.#G.#H.#I.#J.#K.#L.#Wj@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@ma@/B@)J M.#yM@0) ^p.]7.N.#O.#^< ,Z@,Z@,Z@:j@[m@[m@4 #+.#Dc@eq@P.#Q.#R.#S.#+U >C T.#i!.U.#V.#W.#X.#)k.wc rs Pf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 ka >0 {n ka J8 Nf Of J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 '0 `l.hP.Y.#Z.#`.#HP@0 Mf me Of Nf ka _d _d :%.>h ++#@+#p!.ca@8A@#+##2@<.#$+#vz@;l@fn@%+#&+#be@*+#$j@jc@n9@kc@kc@kc@kc@jc@$j@%R@=+#-+#;+#>+#,+#n9@'S@l0@-w@lc@ma@_k@_k@pa@kb@kb@om@lb@'+#l0@2m@)+#!+#o)@5o ja J8 J8 J8 J8 J8 J8 Nf J8 J8 ka ]O ]O ka J8 J8 J8 J8 J8 #r Vl F- J8 ka ka F- F- J8 J8 Nf Nf J8 J8 67 ej @r 7o wL P4@~+#{+#]+#^+#/+#(+#_+#:+#<+#Vj@)l@$j@m9@jc@jc@jc@:H@[+#}+#|+#1+#gR@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@2+#3+#4+#5+#6+#7+#8+#i&.ve.9+#;u.0+#a+#b+#c+#wT@sM@.H+##.Wl {n g` NM Of Of Of >x iP.'z.`j.|W d+#r@l+#m+#b*.n+#9l@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@6s@8l@o+#p+#q+#iL@r+#s+#o3 t+#u+#xr@zm@v+#C4@i6@C4@w+#x+#y+#0k@&7@z+#A+#B+#C+#D+#QF.E+#'j@F+#G+#xv po..| T0 yr J8 J8 ka ~n :%.S5 67 F- Of J8 J8 fj :%.Vl Vl F- J8 J8 F- Vl S5 F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- YY.Ci.H+#I+#J+#:-+Fi+wo.5e+^8+/+ @. `@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ %+ %+ $+ $+ y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ Q& v* wB@K+#L+#M+#VD V+.84 J8 J8 F- 67 >c ]O {n '0 J8 J8 J8 J8 J8 Nf Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf J8 J8 >0 _d nk.-Y N2 mJ yG.N+#=3@O+#P+#ba@Hb@Q+#d9 ba@R+#@#,@#'@#gR@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@)@#!@#~@#{@#]@#^@#/@#(@#{< _@#TJ@:@#<@#[@#}@#/m@Lw .Z =2 (Y (d >x $J Of Of Of >x 3j.0r.rh.>a 'y k^@.z.gk@|@#1@#2@#os g@.TB n)@3@#4@#5@#6@#Le@7@#8@#xM@1F.lQ@7` _# n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@la@*q@44.9@#0@#X0@+D.a@#Mp >f@b@#F4@Ks@G4@J3@iq c@#d@#e@#f@#I4@Hb@g@#'A.NB |i@I^.h@#i@#iy.j@#i:.=3 mz f# 8Q J8 J8 '0 ~n {n S5 >c F- Of J8 !n ~n _d S5 >c Ul J8 J8 F- Vl >c F- J8 J8 J8 J8 J8 J8 J8 J8 4o sH sH 4o J8 J8 J8 ka ka F- F- 67 H'@0x.k@#l@#m@#F3 Fi+n@#3].^'@R=.|~ #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ ", "$+ $+ $+ $+ %+ `@ #. %+ y Gg 09.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O. M'@9>.o@#p@#q@#O( om.:i.Nf J8 J8 F- Vl '0 '0 '0 J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 Nf Nf J8 J8 Nf J8 J8 J8 J8 BB P&+xE at B( h5.r@#s@#~Z@t@#l7@R3@mt@u@#aa@v@#w@#x@#n9@n9@n9@n9@kc@kc@kc@kc@jc@ja@@N@0X@Kv@y@#z@#A@#B@#Io@dd@n9@lc@lc@lc@lc@lc@kc@jc@C@#$j@ka@7l@D@#Zu@E@#Nf DS.bH.>0 Vl Vl Nf ]n $r $r 7o #r _~.pW NM ]n ]n #r Nf ]n 7o $J Of Of #r ]n @r NM NM 77 &O Pf ]d ]d je 5X 5X 0K 0K mc./)@F@#G@#H@#I@#_@ *'.J@#K@#L@#5T@Bz@)l@jc@kc@kc@kc@jc@4I@QY@M@#N@#sU@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@O@#P@#Q@#R@#S@#T@#U@#V@#W@#X@#~g@Y@#Z@#`@# ##.##+##@##*~ Ud ^d ##eD@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@lc@n9@,##'##NH.hE.dc@>L@)##!##~##{##]##^##/##$s.VM.(##_##*##:##<##[##3} ]'.o .)u.(r.}##Nl.|##7~@N1 cv F- I8 Nf J8 J8 '0 >0 F- F- F- Nf J8 ka ~n _d I8 Ul Ul J8 J8 ka ja ]O J8 J8 J8 J8 J8 J8 J8 J8 J8 sH M1.2k sH J8 J8 J8 ~n >0 S5 >c K'..=@nL+1##2##3##4##sm+Hi+3].E1+/+ O %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ O $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ %+ #. 6. %+ y R=.d+ y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ n)+R=.+e.x# [ #5##6##+| le 7##Of F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 ,0 2-. 7.cl q2 5K.Dx@sy@8##9##Dv@0##2F.Hb@+4@a##b##U].n9@n9@kc@kc@kc@kc@kc@kc@jc@)l@:H@:H@>Z@c##`I@L_ d##e##O@#n9@kc@kc@kc@kc@kc@kc@jc@)l@!l@4I@-x@f##g##{u@ha x)@bH.ia ej 5o &N $r ps ps $r $J Of Of $J $r _O qs os &O rs &O os me os GE.~W.Ws.6o Z].IZ ([.RE 47.>$ M&.h##Nu FE.5X i##j##k##l##m##n##;. o##p##q##r##s##BR@eD@n9@kc@kc@kc@kc@pF@LL@LL@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@-A@Hn@8U@t##u##v##w##nr@)o@x##y##br.}(.uE._Q.vC@]p@z##YV :z@KE h<.$r $J _~._~.os -%.Y7 gA@(,.h] Mh L} Fp C +C Kv ps ha Ib ~Y 2I t[.A##B##OV@yS@C##Z: D##]3 E##F##G##kc@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@H##I##.2.J##G:.K##./@L##M##N##Ui.4'.I(@O##(H.W:.9s.pS@P##Q##5f..y.]!.Qb ~U.R##C$.NM )$@V-.I8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 F- F- '0 :%.J8 J8 J8 J8 J8 !n ~n _d ka J8 J8 J8 J8 J8 J8 J8 J8 sH 2k x,.sH J8 J8 J8 -Y {n Ws -6 1G b>@)|@S##T##U##V##G>+Hi+15 Q& $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ %+ %+ $+ O |~ O-.%+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ m) ^8+e,@9>.W##X##/Y !@le :i.NM Lb Mb :d J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 ka ~n :%.S5 67 Ul J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ke Ib Z@.5g@Y## I@+4@xy@Z##`## $#UH..$#B2 +$#@$##$#>o n9@n9@kc@kc@kc@kc@kc@kc@kc@la@CH@jc@la@$$#%$#&$#ep i.#4I@n9@kc@kc@kc@kc@kc@kc@kc@jc@la@n9@zC@*$#=$#t-@#r ne Mf 77 4o f+.>` e!.$r 7o J8 J8 Nf Of le 2$.~O -$#g<.Qm@;$#k$@B<.>$#{Y ,$#'$#)$#!$#:+.~$#{$#]$#^$#/$#($#_$#HF :$#<$#[$#}$#|$#1$#2$#3$#4$#5$#6$#7$#8$#9$#0$#Gn@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@gc@a$#${ b$#c$#'b.d$#e$#C[@f$#er.~h iy g$#h$#i$#j$#gD %x.!J.$J Of Of Of ha WI a&.NP.(i.@y 4o dj fe &N TB 3/.7o 7o d:.Rt. q(.s$#. #U< t$#u$#Ts.-/@H~.I_ }$.Md (~.X..^k M) v$#t_.x[.uN } .^d ~Y >h ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Vl >c >c Vl J8 J8 J8 J8 Nf Of '0 ka J8 J8 J8 J8 J8 J8 J8 J8 J8 4o sH sH &N Nf Nf J8 ka ka F- Vl Nf _%+w$#x$#y$#z$#A$#%!@B$#wo.n)+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ %+ @. 9@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ s3.e,@N-.C$#D$#E$#]s >x Ib NM Lb Mb ja J8 Nf Of Nf J8 J8 J8 fj !n J8 '0 -Y {n S5 >c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -h 1K >$ F$#G$#]< H$#vz@I$#J$#K$#L$#M$#N$#O$#P$#Q$#R$#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@n9@fc@S$#u4 T$#AR@+N@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@!l@qm@U$#d:.pW ga #g ha 0L A6.M^.V+.d:.Qf o'.,h je os G- V$#W$#X$#dH V3@-*@-*@|D 9X lJ.+s.Y$#Z$##p@`$#Tu@ %#$$.QE .%#+%#@%##%#$%#1+ uM %%#&%#*%#=%#-%#;%#>%#,%#'%#}K@)%#!%#%R@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@Ii@~%#BI 5B.{%#ss.:R ]%#ey.Mg@R`@^%#NF@`Y@.i@=|@/%#UX@6o &h _~.Of $J Of ha Lb Lb 77 os |(.0L 6A [d pW pW _~.Of 7o yU.pe 8 _Z@tm@(%#_%#:%#<%#[%#}%#|%#~%#$B@LL@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@1%##^ %j.l6 [d ;0 <#.nL@2%#,t o3.b=@s7.!n.jL Jb 6M ]z.3%#Fr *E V> 84 je )n os me Of Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 ja ja Nf Of S5 9L >c >c F- Nf J8 J8 Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Nf J8 Ul F- J8 J8 Nf G@@4%#5%#6%#z$#A$#yL+d,@R=.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ X+ !S+7%#8%#9%#0%#a%#BB Kb Nf ja ja I8 Nf Nf Nf Nf J8 J8 fj ~n ~n Nf Of NM :%.F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 sv DE =r !s ;).b%#@T@wz@c%#GE@CV.Lj@w6@d%#e%#f%#jy $n rm@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@>R@g%#h%#i%#j%#xJ@n9@mb@kc@kc@kc@kc@kc@kc@n9@n9@BC@k%#l%#jL *w.NM M..$J n[.0L &N Y*.yU.Z8 '$ ge N2 sH 3/ m%#n%#o%#p%#+l q%#KM GX w'.RH v#.r%#s%#t%#u%#v%#w%#70.G4.x%#y%#x%#z%#sN@A%#B%#C%#D%#E%#F%#G%#H%#I%#J%#K%#L%#(Q *M@!l@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@M%#N%#tj G #O%#P%#G4@Q%#Co@R%#YU.S%#T%#U%#V%#W%#X%#Y%#Z%#~W.os 7o 7o $J Of I8 7i Ib :i.CQ@ss G- X1.{w.{w.{j.Of d!.*h &% &g |f.`%# &#.&#=a +&#S6 @&##&#$&#%&#kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@&&#p6.u+.pi@fj fj q3 [O.=&.J; k9.2=.8_.1K (^.B<.$_.@++a3.t( %e 03 #G (^.84 >h >x Nf Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 s_.s_.ja Nf >0 ]O ja 67 Nf Nf Nf J8 Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 67 67 F- J8 [d -(@[i.*&#=&#U##-&#Vc.Vc.y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . .e.sq.sL@;&#>&#,&#'&#r0.Xl J8 J8 J8 Nf Of F- F- J8 J8 J8 ka >0 {n NM Of Of Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 sv CT =r @t.s0.:m@f`@f`@BB.U[ S3@)&#Kd@!&#-2@~&#Vu {&#]&#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@pJ@@N@^&#/&#(&#_&#n9@n9@kc@kc@kc@kc@kc@kc@kc@n9@aI@5F@:&#~O I'.nA.ps qs Of TB Z4.oM -b <&#:E eC 2/ [&#}&#|&#B` 3&#N9..8@rm 9a.4&#sX 5 �n kd.aa.b&#b&#c&#d&#e&#f&#g&#h&#i&#%&#la@n9@j&#`] Zf.2+.k&#zM@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@lE@J3.le.m&#vR@ZY@e9@99@OW@n&#o&#p&#q&#r&#s&#t&#a~ G: u&#-M fQ @r Nf _~.n[.GV.me $J +C 4U Z].xL I'.r).t>@|(.n[.yV @A X> v&#wy@O.##2@+q@x&#y&#kp 1R@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@Iu@z&#A&#bK pz $_.ke `l.~Y >x J8 J8 F- @r H#.,r ,$ ^| 'n ac Am E' ;_ 8Q J8 J8 J8 J8 J8 Nf Of F- F- J8 J8 J8 J8 J8 J8 PM Mb :d J8 -Y _d ~n J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 >c Vl J8 (Y }*@h<.B&#C&#C$#D&#. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . d,@M'@#,@E&#F&#G&#Y8.r0.H8 J8 J8 J8 J8 F- >c Vl '0 -Y Vl >c >c S5 J8 J8 J8 F- >c >c ja -Y J8 J8 J8 J8 J8 J8 J8 ka (Y CT 84 &u H&#I&#J&#K&#u+#L&#M&#N&#Ae@O&#P&#GB.Ox.Uo Q&#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@$j@R&#S&#T&#ka@n9@kc@kc@kc@kc@kc@kc@kc@kc@-A@U&#V&#W&#wL &G.Dp CT U6.H#.P/.X&# , _w Y&#Z&#`&# *#.*#+*#@*##*#$*#%*#t4 g, 1Y &*#)+.#^ AY@**#=*#-*#;*#>*#Q&#TE.,*#eY@i0@eg@'*#)*#!*#~*#{*#]*#^*#*q@zs@$j@la@AR@/*#lk =T.(*#_*#n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@C@#:*#<*#$ .9@#[*#}*#PG@$X@eb@gC@[U |*#1*#2*#3*#=_@ZW@4*#Wo #r.5*#6*#sH H2..1..1.F#.)n e^._*.L..qQ@7*#GV.]X@(#.3/.m[.Z*.T2.iI 8*#'o@R2@9*#0*#a*#%A.Nn@Rt@m9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@ma@pa@b*#c*#0 /, Ob xP RL Qj Cp Mf J8 J8 ka >0 BB oe Qs d*#sg.eg 8c /| +G ia J8 J8 J8 ~n ~n ne F- >c 9L ]O -Y ka J8 Nf Of 7o I8 J8 J8 ka ka J8 J8 J8 F- Vl 67 ]O ~n fj J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ]O ]O '0 J8 (Y b>@mL+e*#f*#C$#g*#. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . .e.M'@z# h*#i*#j*#k*#(/.la J8 J8 J8 J8 F- 67 S5 ]O {n S5 9L >c >c F- J8 J8 F- >c 9L ]O _d '0 F- J8 J8 J8 sv Hb sv J8 fe AU ck l*#m*#n*#Dy vz@o*#p*#q*#r*#s*#t*#;P u*#2+ v*#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@)l@@N@ja@)l@la@kc@kc@kc@kc@kc@kc@kc@kc@jc@jc@zM@nB@.^ LN ([.dI w*#3N@x*#y*#80.z*#N'.A*#B*#C*#D*#E*#F*#p* G*#H*#I*#J*#yP@R&#Xj@cf@[D@xJ@=x@dd@$j@$j@)l@)l@)l@)l@)l@;A@jr@zs@kc@n9@K*#L*#M*#N*#!l@(r@$j@$j@m9@BC@O*#P*#P*#V, n9@n9@6s@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@jc@Q*#R*#,0.S*#VB [z@sP@$X@T*#Fb@gC@eB@:.#U*#W%#V*#.##b##W*#Y' X*#Y*#Z*#`*#)e+0x. =#.=#*A@+=#@=##=#$=#%=#0x.un@gW.~W.|*@5-@&=#*=#==#eq@e0@4E.0v WO -=#|W@jc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@Mv@;=#>=#,=#'=#!S -< _*.^n :%.NM J8 J8 '0 -Y {n je Y[ Ij (*@HR @/ A'@77 ha Nf J8 J8 >0 ~n fj F- ej 9L ]O _d ka J8 Nf Of Of Of Nf F- J8 J8 J8 J8 J8 F- Vl >c ]O {n '0 J8 J8 J8 J8 J8 J8 J8 '0 !n J8 J8 J8 J8 J8 J8 J8 J8 -Y {n '0 J8 !n }*@)=#!=#f*#~=#{=#. W4+_8+y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y .e.sq._+ ]=#^=#j*#/=#`+.*h J8 J8 J8 J8 J8 ka ]O ia Ek ia ]O ja 67 J8 J8 J8 J8 Ul ja ~n _d S5 Vl F- J8 J8 sH 6x 4x #u ns #k n'.(=#_=#:=#Ec@K&#-3@i8@A}@<=#[=#}=#Ia@Z$.|=#ia@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@la@la@jc@jc@kc@kc@kc@kc@kc@kc@kc@n9@n9@jc@la@1=#2=#3=#kL.4=#5=#6=#;T 7=#8=#9=#x&.<- 0=#a=#b=#c=#d=#e=#f=#Yj@g=#h=#cd@n9@n9@n9@kc@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@i=#oW@j=#k=#l=#n9@la@la@n9@kc@m=#n=#o=#(h ed@n9@mb@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@lc@:H@p=#q=#S*#VB Au@|x@eq@Q%#r=#;e@Vb@s=#t=#u=#Ne@qP@v=#w=#+& x=#y=#z=#A=#B=#C=#D=#E=#F=#G=#H=#I=#J=#_H@K=#L=#M=#N=#O=#P=#Q=#R=#oD@S=#dB@O.#T=#U=#V=#i.#kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@cd@*x@W=#X=#f[ m;.=h ,d wL ha Nf Nf Of pW :%.^d _k.'{ yJ.C( @/ ;~.)n os Of Nf J8 Nf '0 ~n >0 F- F- ka ~n J8 J8 J8 Nf pW :%.S5 >c F- Nf Nf Nf J8 J8 F- Vl '0 '0 Nf J8 J8 J8 J8 J8 J8 '0 >0 ~n ka J8 J8 J8 J8 Nf Nf Nf fj '0 Nf J8 ^-.Y=#YY.Z=#`=#~=#-:@/B+0 9L >c >0 _d ~n J8 J8 J8 J8 J8 J8 [d fj :%.Vl >c 67 J8 Nf TB +C a0 t}..#.IJ.@-##-#F<@$-#]2@.|@.|@.|@.5@!&#%-#&-#U2@Gl *-#~O@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@kc@vh@=-#--#;-#>-#e .,-#'-#us@)-#!-#~-#{-#-x@ed@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@kc@kc@n9@n9@tU@k@ vM ]-#O@#n9@n9@n9@n9@jc@g%#^-#/-#(-#s##_-#mb@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@)l@:-#0~ <-#1F.[-#eB@YY@}-#>f@Au@W8@wf |-#1-#2-#Je@3-#4-#oB n9@5-#w`@e.#6-#Iu@7-#*x@ja@=x@,P@,P@~T@%p@+I@8-#9-#0-#a-#b-#c-#*t@d-#G9 xB.e-#f-#g-#TF q$#kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@vh@tU@]j F$#_^.}u.^_.ps 7o Of Of Of Of Of le yL 3< 3i.-6.bO #D fe )n Of Nf J8 J8 J8 >0 _d ka J8 J8 J8 J8 J8 J8 J8 -Y g` Ws -6 Vl J8 Nf Of F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 F- J8 !n ~n _d ka J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 ~n Y=#h-#i-#j-#k-#D&#nm+b8+b8+O<+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ n)+R=.,K+P%+ -#^=#l-#m-#MO.n-#Of J8 J8 J8 J8 ka J8 F- F- ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- F- J8 J8 Of &N TB ns >A 3< o-#UO Q<.rl@@Y@By Hc@i8@p-#qh@q-#r-#s-#EF 48./*#ka@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@n9@2G@t-#u-#v-#w-#x-#y-#z-#A-#o9@B-#BC@jc@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@C-#D-#E-#F-#$j@n9@n9@n9@n9@jc@G-#|r@H-#I-#J-#In@lc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@lb@K-#gc@Z .YH L-#M-#UZ@N-#lh@HF.O-#%Z@qD@q&#ai 8A@[m@P-#Q-#]> n9@lc@Lv@m9@LL@O@#@N@fV@;R@zs@3m@ys@BG@CK@$j@ja@R-#,t@S-#T-#U-#V-#=##W-#wB.X-#Y-#Z-#`-# ;#kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@&p@.;#2N.+;#EU d:.#g ]n J8 J8 J8 Nf #r Jf h).>5 s0 s( o|.=b 2= T5 Nf J8 J8 J8 J8 J8 ka J8 J8 Nf Of J8 J8 J8 J8 ka ka F- Vl #r Nf Nf F- >c >c Ul J8 J8 ka ~n -Y J8 Ul s_.v& S5 J8 ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 [d >*@jw@@;##;#$;#%;#mm+RO+W4+y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg sq.&;# -#^=#l-#m-#~K NK.Of J8 J8 :d ja J8 J8 Nf J8 J8 J8 J8 J8 J8 J8 !n !n J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Nf I8 Pj eH *;#%I hF.=;#QG /< Ka@i8@)r@-;#;;#>;#,;#Ia@PZ j&#vh@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@n9@gc@Xx@';#);#!;#;T@ka@dd@)l@O@#)l@jc@n9@n9@kc@kc@6s@kc@kc@kc@kb@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@~;#bN@{;#F-#)l@n9@kc@n9@n9@la@6w@S$#K+ 3; 8P @B@jc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@na@~T@ln@];#Wp ^;#K3@/;#(;#gy.+P._;#:;#qD@<;#ai Eb@4 #[;#};#L0.n9@n9@kb@kb@n9@n9@3m@jr@;A@ma@ma@jr@l0@3m@n9@n9@6s@n9@|;#1;#2;#3;#.|@g3 xR@4;#ht 5;#6;#7;#kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@[D@2/@oJ p:.Fk rs nR 5o ka ja ja 1G F- 0K %N ee cl s( ni =b J~.:C J8 J8 J8 J8 J8 J8 J8 :d ja Nf Of J8 J8 J8 J8 Ul F- J8 J8 Nf Of Nf F- fz fz Ul J8 J8 '0 >0 {n '0 ja yS Lb ja Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- F- J8 J8 1G =`.a>@8;#9;#0;#a;#v* y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y O. :-+ -#^=#+-#'f.e^.*h Nf J8 :d s_.Mb ja Nf Nf Nf J8 J8 J8 J8 Nf '0 ~n ~n ka J8 J8 Nf J8 J8 J8 J8 Nf Nf Nf ]O Y@.z6 b;#c;#Gs@7K d;#w6@ba@B}@A[@x[@U:@e;#f;#QX@$ .g;#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@la@gc@h;#i;#:U@j;#k;#n9@n9@n9@n9@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@l;#m;#n;#W=#la@n9@kc@lc@kc@-w@o;#IU@0=#|].p;#O*#m9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@3m@-w@zs@`W@qR@qJ q;#r;#vK@.P.-I tA.s;#t;#u;#v;#w;#Dc@x;#Wd@#9.m9@_k@Sr@pa@n9@n9@kb@3m@lb@kc@kc@zs@lb@kc@n9@n9@n9@n9@6M@)Z y;#3;#f`@z;#:i A;#,9.B;#C;#>A@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@%p@D;#E;#cK.Wl ~` g@.N1.'0 yS s_.:d F- RL 0f -! F;#!K @/ +{.ie ia J8 J8 J8 J8 J8 J8 J8 s_.Ek I8 Of J8 J8 J8 J8 67 67 F- J8 Nf Nf Nf J8 MM MM ka J8 Nf #r #u Ek >0 >0 ]O I8 Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 67 67 F- J8 1G G;#H;#I;#J;#K;#L;#M;#8@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# . -)@ -#^=#+-#x; he *h J8 J8 ja Lb #f1 2R .>#/< +>#=R @>##>#]j $>#ln@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@%p@;>.g/ OP fe C Z4.z$.ha }$ Mb :d J8 g# %>#&>#BT@3u Gv A'@KE qs J8 J8 J8 J8 J8 J8 J8 Mb Lb I8 Of J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 -Y _d ~n J8 Of #r Vl >c k9.-Y pW Of Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 67 >c Vl J8 J8 *>#=>#->#;>#>>#,>#IV+PT+$+ y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ _8+X4+@y+o-@'>#)>#!>#n_@Wl 1K J8 Nf Of ha I8 J8 J8 J8 J8 J8 J8 J8 J8 Vl ej ej S5 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 #u LY.:f ~c.~>#^R =8 {>#]>#Jc@,2@^>#-3@Ao@/>#Ex@BF.X; (>#n9@kb@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@Hn@C@#!l@ia@fc@6w@~O@ln@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@4T@->._>#B #jc@n9@kc@kc@kc@ma@3m@n9@:>#<>#[>#}>#$j@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@la@|>#)+.qj@MJ.1>#C|@vz@YW@R2@2>#6E.3>#P7@4>#5>#a(@6># A.;m *M@~O@jc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@7>#Zf.8>#9>#Ka@Ay #7 0>#a>#d$.=x@n9@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@AR@b>#U!@B0 87 Hp Bp c(.Of J8 J8 J8 J8 8Q rv U> =v KH s .(I ^_.dj J8 J8 J8 Nf Nf Nf J8 ja ja Nf Of J8 J8 J8 J8 ]O ]O '0 J8 J8 J8 J8 J8 ka ka J8 J8 J8 J8 F- F- ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ]O Mf NM Of J8 [i.J=+c>#d>#e>#f>#]y+g>#9@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ _8+#)>#l-#i>#,x 4$.J8 Nf Of Of Of J8 J8 J8 J8 J8 J8 J8 J8 |[ fz >c >c F- J8 ja :d J8 J8 Nf J8 ja ja '0 wL %% [C m~.j>#k>#,J@l>#g7@m>#,2@>3@7d@; #TP@n>#o>#^; ka@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@m9@#B@WG@@B@fc@ja@la@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@iQ@C] R-.p>#la@n9@kc@kc@kc@kc@n9@n9@q>#Z)@r>#{K@$j@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@ja@s>#c$.t>#u>#v>#w>#x>#Hb@y>#Eb@8[@`C@z>#y/@A>#B>#C>#rJ 5p@D>#LA@lc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@n9@n9@E>#F>#yB ZP@Hc@Ay G>#H>#I>#h..n9@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@Kw@J>#K>#L>#73 Ip VH.5l.77 77 ia ja J8 T5 r` jl +/ FN.#=.9D =$.Lf J8 J8 J8 #r #r J8 J8 J8 Nf Nf Of Nf J8 J8 J8 -Y {n '0 J8 ka ka F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka '0 J8 J8 J8 J8 J8 J8 ~n {n NM Of J8 i%@'.#L +M>#N>#O>#M'@v* O-.%+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# tm+fo+]K+'>#)>#l-#vD@/d 4$.J8 J8 Nf Nf Nf J8 Nf Nf Nf J8 J8 J8 J8 [P ]O ja 67 J8 ka Ek Mb ja Nf Nf Nf Ek yS j9.Mf wr cu fw P>#Q>#R>#l>#S>#T>#ZR@K&#/m@vy U>#V>#~H.W>#CK@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@-w@Tr@X>#W=#+I@la@kc@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@,w@Q_.H9.Y>#)l@n9@kc@kc@kc@kc@n9@n9@Z>#`>#([ ,#ja@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@-x@.,#tW +,#@,#`##f6@Ad@ZW@S2@`C@Tg@`C@vC@PN #,#$,#%,#vN@&,#;+ *,#kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@n9@n9@=,#-,#;,#/< +5@>,#,,#[| ',#]J@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@_L@),#!,#~,#F$#9t.po.p^ ah j! :C I8 J8 I~.|Y@I- cg Ua.#=.Pd D;.Lf J8 J8 J8 Vl Vl F- J8 J8 J8 Nf Nf Nf Nf Nf Nf fj '0 Nf J8 ~n >0 S5 ej #r Nf Nf J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 J8 ~n ~n '0 J8 J8 J8 J8 J8 fj '0 '0 Nf 1G {,#],#^,#/,#(,#_,#%!@,K+c Vl J8 J8 J8 J8 J8 Of Of Of Of J8 J8 J8 J8 -Y g` Ws -6 ]n Of Nf J8 J8 J8 J8 J8 $J $J Nf J8 J8 J8 J8 J8 :%.{n >0 J8 J8 J8 J8 J8 J8 J8 J8 J8 1G _=@qX.t,#u,#v,#w,#x,#6`.R=.n)+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ n)+R=.,K+P%+y,#z,#!>#~z.,x 4$.J8 J8 ka ~n {n S5 67 F- J8 J8 J8 J8 J8 ka ka J8 J8 Nf Of ha I8 J8 J8 Nf Of F- ia >h `].A,#B,#C,#D,#E,#F,#G,#`N@N3@v+#xM@ J $+#Ad@nz@h*.H,#;A@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@zs@~O@v*#I,#J,#K,#n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@ec@L,#'P *Y@m9@n9@n9@kc@kc@kc@6s@n9@M,#N,#LA r##ia@la@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@#B@|=#O,#OV o8.P,#c@#Zm@Q,#xf@@i@{2@Ub@R,#PN S,#Cc@T,#@q@U,#V,#6M@Vj@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@W,#X,#}s@I3@O;#Y,#Z,#1i@`,# '#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@la@!l@5T@Rt@.'#+'#@'#'S.#'#$'#lY Km L+.Hp f* th 49 _N z9.Nd $! 3=.7i Nf Nf Of I8 :%.-Y -Y J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka F- Vl F- J8 J8 J8 J8 J8 J8 J8 ej >c Ul J8 J8 J8 J8 J8 S5 S5 F- J8 J8 J8 J8 J8 J8 J8 J8 J8 (Y 4$.5w.%'#&'#*'#='#]K+-)@d+ n)+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg {f.P%+y,#z,#!>#-'#/#.1K J8 J8 !n ~n :%.Vl ej F- J8 F- F- J8 J8 J8 J8 J8 J8 Nf Of Of Of J8 J8 Nf Of J8 ha )n 5l.yt.;'#>'#,'#''#)'#!'#G3@`4@nt@. X =~.Qd 2! a# [[ &R ;|.N/ ac vF EU ,0 J8 Nf Of pW -Y _d >0 J8 J8 F- F- J8 J8 J8 J8 F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka fj [d J8 fz fz F- J8 F- F- J8 J8 Vl ej F- J8 J8 J8 J8 J8 J8 J8 F- F- sv ^_.(^.d'#e'#f'#g'#&;#G>+09.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg :-+ -#^=#!>#h'#gX.1K Nf J8 [d fj '0 F- F- J8 J8 67 67 F- J8 J8 J8 J8 Nf Nf Nf Nf Nf J8 J8 J8 Nf J8 ha 77 ]K Dq.^[@i).,'#ry@i'#j'#ac@k'#w|@l'#HA@m'#n'#+'#o'#oJ@ma@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@*x@>=#p'#*M@q'#zC@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@kc@n9@r'#9&.s'#8> t'#w`@m9@kc@n9@n9@kb@n9@%y@|D@u'#v'#+I@$j@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@w'#x'#b6.y'#z'#A'#bz tO@oq.99@Me@B'#C'#}'#pO@@i@y5@D'#'1@E'#F'#G'#eD@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@H'#I'#J'#K'#L'#M'#N'#O'#/'.xO@n9@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@m9@$j@ja@BC@P'#Q'#R'#S'#T'#6w@6M@U'#V'#W'#X'#Y'#M; FE.2&.^u ({ Md ~p.Qj ,0 J8 J8 Nf fj '0 ja 9L F- J8 Vl 67 F- J8 J8 J8 67 67 F- J8 J8 J8 J8 J8 J8 J8 J8 J8 ~n ~n fj J8 MM ]O '0 Nf Vl Vl F- Nf F- F- F- J8 J8 J8 J8 J8 J8 F- Vl >c 0h ^_.Z*.Z'#`'# )#.)#+)#sq.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y :-+ -#^=#!>#@)#V7.1K Of J8 J8 J8 J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 77 ]K 0V @~.I;.Ld.#)#$)#%)#x|@&)#*)#M2@x|@=)#-)#|u LL@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@la@;)#>)#H##H'#,)#')#Jo@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@m9@))#H,.!)#~)#{)#])#^)#)l@jc@kc@kc@n9@n9@/)#()#!; J,#fc@)l@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@FS@_)#:)#hd.E+#Is@=p@wC@vM@1x@Sg@Dc@Cc@Ub@AN@<)##|@J&#[)#})#C)@q$#kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@ma@n9@n9@|)#1)#=o 2)#3)#e-#4)#5)#=U |=#pa@n9@lc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@$j@ja@ja@BC@LA@6)#7)#8)#9)#kc@n9@9l@0)#a)#b)#O,#c)#X9.NX K- i:.FN.!f ,d Lf J8 J8 J8 J8 F- >c -6 F- F- Vl >c F- J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 {n :%.'0 J8 -Y _d -Y $J m/ >c #r Of J8 J8 J8 J8 J8 J8 J8 J8 J8 F- >c gz 1m d:.Vs.d)#e)#f)#g)#7%#X+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y :-+ -#^=#l-#;T.Mf 84 F- 67 S5 >0 -Y ka J8 J8 J8 ]O Mf NM Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 I8 ia ]l `y #9e@E)#%}@AI. '#6w@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@zs@jr@>t@n9@F)#G)#H4 DU@H)#*] I)#ZI.N'.J)#pa@n9@lc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@la@4I@#B@K)#L)#M)#N)#O)#m9@n9@kc@P)#p8@7U@`W@Q)#vJ z;.aZ Bv./Y t^.X$ 8Q J8 J8 J8 J8 J8 F- F- Nf Of '0 Sl ka J8 J8 J8 >0 :%.NM Of J8 J8 J8 J8 Nf Nf Nf J8 S5 Vl F- J8 ka ka J8 J8 F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Ul >c gz rY +W@pe R)#S)#T)#U)#8. Q& $+ $+ $+ $+ $+ $+ $+ #. #. O $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg :-+y,#V)#W)#Y|.wL 84 ja >c 9L ]O _d ka J8 J8 J8 ~n {n NM Of J8 J8 J8 J8 F- F- J8 J8 J8 Nf Of Of Nf 77 >h =W NP.!#,!#'!#)!#!!#nm@P)#Vj@n9@n9@~!#{!#A~ ]!#ja@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@*y@^!#/!#uC.5K.}m@zB.(!#_!#:!#:j@.|@]2@t@n9@F)#3!#<].^< 4!#5!#6!#7!#a/.8!#kb@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@Lv@7l@9!#0!#a!#W%.b!#$j@n9@n9@n9@n9@la@c!#d!#e!#f!#g!#h!#2H.5[ ;c ;h )n I8 J8 J8 J8 J8 J8 I8 ha :%.-Y J8 J8 J8 J8 >0 :%.NM Of J8 J8 J8 J8 #r #r J8 J8 67 >c F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- 67 -6 Xh.ux.i!#j!#k!#l!#m!#Wc.O. y $+ $+ $+ $+ $+ $+ #. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg 09.P%+n!#V)#W)#i'@yr CT >0 >c >c ja ~n J8 J8 J8 J8 fj '0 '0 Nf J8 J8 J8 J8 67 67 F- J8 Nf Of Of Of Nf ke Qj $i.J> rh.>R S( lv.MY rr@o!#p!#q!#zo@y*.r!#jp@lb@kb@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@de@ja@R*#7=.]X s!#t!#u!#65.v!#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@jc@i;#%i w!#x!#y!#z!#A!#B!#C!#D!#E!#F!#om@n9@G!#H!#I!#J!#$j@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@la@K!#L!#`%#Q, ,g@Ia@EB.ai M!#Kg@:j@Gw@.|@WW@N!#O!#P!#Q!#R!#S!#!l@-A@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@zs@3m@n9@T!#U!#Gd@V!#W!#Z4@La@X!#` .Y!#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@m9@aI@g=#c*#E} Pa.Z!#CK@n9@n9@n9@n9@n9@vh@`!# ~#.~#+~#9&.@~#4i.@r ,r ke ha Nf Nf Nf J8 J8 Ek o'.Mf pW J8 J8 J8 J8 F- S5 I8 Nf J8 J8 J8 J8 Vl Vl F- J8 Ul F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- Ul :d 5X rK #~#$~#%~#&~#*~#yL+Gg y $+ $+ $+ $+ $+ O %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y 09.{f.P%+=~#-~#;~#>~#RL ~d _d S5 >c 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- F- J8 J8 67 >c Vl J8 Of Of Of Of Of jL Qj ;,+}!.Ag.,~#mQ@[,..2.m&.+/@'~#)~#O| N'.!~#Sr@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@9l@-+#~~#t: K<.{~#AR@|Y ^; ]~#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@;R@^~#/~#(~#_~#:~#<~#[~#}~#|~#1~#;j@2~#3~#kb@Tj@4~#2f.NN.$j@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@$$#5~#6~#}B@7~#8~#9~#;L.M!#0~#{2@Sg@v6 y5@+q@4 #Bi@^< a~#b~#D$ n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@|W@5p@c~#9c@B/@d~#e~#f~#g~#h~#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@m9@gc@z)#En@G. {[ k%#jr@n9@kc@kc@kc@kc@-A@eD@eD@zC@O*#i~#j~#S] IZ 87.1#.yL os Of Of Nf J8 Mb Lb I8 Of J8 J8 J8 J8 67 >c 67 J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Pf Pf M +k~#l~#m~#15+Bz+Wc.0@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg l~@n~#o~#p~#q~#&O |*@J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 Nf Of ej >c Ul J8 ]O ]O '0 J8 J8 Nf Nf Of +#.Rt.fe -3 C..Dx.n>#r~#s~#=G@Sd@t~#u~#tM@v~#w~#$B@kb@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@x~#y~#z~#A~#B~#C~#ia@o (. 4v@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@D~#E~#F~#G~#H~#I~#J~#K~#L~#M~#N~#O~#P~#Q~#R~#S~#T~#U~#;3.rm@$j@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@$$#F-#a~ vM@Pn@xf@vC@R,#U*#Ub@e,#Me@:j@:j@Cc@Dc@ba@V~#6c.7[.TV@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@|W@t` 2 W~#+5@J0@X~#uT@Y~#^; n9@n9@de@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@la@[D@Z~#R9.%p.`~#$D@zs@n9@kc@kc@kc@kc@kc@n9@lc@gc@ {#.{#+{#@{#'S.Oi Fr >5 1D ji.Of Nf J8 ja ja Nf Of J8 J8 Nf Of Mf ]O ka J8 J8 J8 J8 J8 MM ]O '0 J8 Nf Nf Nf J8 Nf Nf Nf J8 ~n ~n fj J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf >h #{#${#%{#&{#*{#fY+W1+y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ +e.={#-{#;{#>{#]n Rj ka F- F- Nf Of J8 J8 J8 J8 ka fj ne Of 9L fz Ul J8 ~n {n '0 J8 J8 ha ke os NO.s3 m;.^{ b) 3K@,{#'{#){#!{#~{#vI@%E@}w@aG :H@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@kc@n9@n9@n9@!l@E>#{{#xj.]{#]P@pJ@w'#^{#/{#({#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@C@#>R@g##K+._{#:{#<{#[{#c1@U(@K~#}{#|{#1{#2{#3{#4{#]++5{#6{#7{#p)#)l@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@m9@O)#Vf.@.#k7@8{#9{#}'#}'#C'#@i@Cc@Cc@Cc@@i@y5@0{#8q@zT a{#SF@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@B #e#.9+#W~#$`@X-#b{#c{#&z@d}.-x@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@cf@d{#e{#E# f{#x=#kc@n9@kc@kc@kc@kc@kc@n9@jc@*x@g{#h{#i{#j{#{g k{#l{#:' $ +Of &N J8 J8 J8 J8 Nf $J '0 '0 Nf Of -Y g` '0 J8 J8 J8 J8 J8 ~n ~n fj J8 Nf Of Nf J8 Nf Of Nf J8 ~n _d '0 J8 J8 J8 J8 J8 J8 J8 '0 ka F- F- 1G J8 4o 7i m{#n{#o{#p{#q{#tz+nm+%+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# %+ s3.r{#s{#7I 2h.B- }d >0 Vl Vl F- Nf J8 J8 J8 J8 ~n ~n fj Nf ]O ]O ka J8 fj '0 '0 J8 J8 fe 1K m[.t{#o}@0l.!U ]#,]#l0 .;@3P N1.4o J8 J8 F- Vl Vl ]O >0 '0 Nf fj '0 '0 Nf J8 J8 J8 Nf _~.pW fj J8 Nf Nf Nf J8 Nf Nf Nf J8 fj '0 '0 J8 J8 J8 J8 J8 J8 '0 >0 >0 S5 67 Ul J8 4o &O @*.']#)]#!]#~]#d,@Q& `@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# `@ *U+{]#]]#F>.5*.uJ $D {n S5 >c 67 J8 J8 J8 J8 J8 {n :%.'0 J8 -Y _d ~n J8 J8 J8 J8 J8 I8 )n 6A @t.^]#/]#(]#_]#:]#!p@<]#[]#}]#3S |]#1]#2]#|D@6M@U&#G##-A@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@n9@kb@n9@jc@R&#mm@3]#To V@ 4]#1%#cd@cd@1%#Ht 5]#({#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@n9@cd@T&#O*#)P 6]#7]#8]#9]#0]#2^@3^@O]@a]#U(@b]#c]#d]#e]#f]#g]#h]#i]#/B@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@la@j]#zj.6G d9@Mf@pO@|'#S,#Me@Cc@Cc@Cc@Sg@Sg@)&#k]#l]#m]#n]#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@iQ@o]#|a.p]#Dy q]#r]#s]#t]#u]#gi 9A@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@la@v]#w]#x]#y]#z]#A]#kc@n9@kc@kc@kc@kc@kc@n9@jc@*x@O*#BV c ]O _d ~n J8 J8 J8 Nf Of J8 J8 Nf Of $J $J Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 !n ~n {n S5 ej Vl J8 J8 V+.^_.E]#g=+F]#G]#a@ v. #. O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# 9@ H]#I]#J]#K]#L]#yS CT J8 J8 F- J8 J8 Nf Nf Nf J8 S5 Vl F- J8 ka ka J8 J8 J8 J8 J8 I8 Gp sH g}.M]#<&.N]#O]#Z##P]#,3@Q]#R]#k .S]#T]#U]#V]#W]#X]#Y]#Z]#kc@n9@n9@kc@kc@kc@lc@kc@kc@kc@kc@kc@kc@lc@lc@n9@n9@n9@n9@n9@n9@n9@n9@n9@#B@`]#&9 ^#`%.TV@+I@$j@kb@lb@.^#T:.Tq +^#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@ma@jr@@^#[D@#^#JY.$^#%^#&^#*^#=^#E_@-^#;^#>^#,^#'^#)^#!^#~^#{^#]^#^^#Ov@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@la@T{#/^#(^#_^#Rg@qD@1-#:^#Cc@Cc@Sg@Dc@y5@y5@N!#<^#[^#}^#*q@n9@n9@n9@kc@kc@kc@lc@kc@kc@kc@n9@lc@lc@kc@kc@kc@kc@n9@n9@|^#1^#ek.rl@2^#3^#X2@r7@4^#5^#h,#j`@ma@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@kc@lb@,P@6^#7^#8^#9^#0^#a^#xs@kb@n9@kc@kc@kc@kc@kc@n9@jc@*x@b^#c^#d^#e^#kc@xJ@f^#,Q.V) aK `K y$.NM J8 F- Vl Vl J8 ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Ws Ws ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka #r #r NM >0 Mb ge *r g^#h^#i^#j^#v* sq.pT |~ @. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y# Q& k^#l^#m^#n^#o^#o}.la ka J8 J8 J8 J8 Nf Of Nf J8 67 >c F- J8 J8 J8 F- ja J8 Nf '0 J8 ]l O,.8z.p^#q^#r^#FA@s^#t^#u^#v^#w^#5).q- 1b U&.wY x^#y^#z^#A^#n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@Wj@*x@l&#{J@B^#C^#D^#h= E^#'..& .mk Bq@la@n9@n9@ma@b*#0+ J$ F^#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@pa@Mv@pt@kc@0I@G^#H^#I^#J^#K^#L^#72@M^#N^#O^#P^#Q^#R^#]9@S^#T^#U^#V^#)Q@ma@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@la@T{#W^#[!#X^#Rg@Y^#Jm@e,#Sg@Le@Mf@3)#.|@y[@R,#Z^#`^# /#LL@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@kb@kc@kc@lc@n9@n9@*$#}- ho @s.iL@iL@./#3 #Fm@+/#x/ Bq@kc@n9@n9@n9@kc@jc@zs@ma@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@zs@pa@CG@@/##/#$/#%/#&/#1R@kb@n9@n9@lc@kc@kc@kc@kc@n9@jc@*x@g{#*/#=/#-/#n9@n9@;/#>/#,/#u3.2B pz fe ]O ka fj fj J8 J8 J8 J8 ka ka F- Ul J8 Nf J8 J8 PM Mb MM J8 F- F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of -Y g` Mb >A Lo.'/#)/#!/#~/#}X.sm+Wc.O-.#. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# y &+ {/#]/#^/#//#d{.dD }Z ka J8 J8 J8 Nf Nf Nf Nf F- Ul F- J8 J8 ja Ek Lb I8 os >x ,$ #k o>.uM.;u.vK@(/#_/#'H.:/# |/#1/#2/#3/#4/#5/#6/#Jo@la@$j@la@jc@zs@zs@la@CH@jc@pJ@zs@zs@zs@zs@fd@gc@7/#8/#9/#0/#a/#b/#c/#d/#e/#f/#g/#6M@R&#la@m9@jc@la@t!#V@ 'C h/#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@kc@3m@Sr@lb@zs@kc@kb@}G@i/#j/#k/#l/#m/#n/#o/#p/#q/#r/#s/#t/#u/#v/#w/#x/#y/#z/#na@kb@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@)l@,w@A/#B/#j7@`3 C/#D/#Cd@v6 He@E/#F/#G/#%1@H/#I/#J/#K/#Q`@kc@CH@CH@CH@fd@la@zs@zs@zs@la@la@cd@na@Sr@ma@lc@lc@n9@n9@w'#`#.L/#bo %V@M/#u@#Bi@N/#$v@}H R;#kc@n9@n9@n9@ma@-w@jr@zs@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@-w@ys@n9@ v@O/#:2 P/#Q/#R/#S/#n9@n9@n9@lc@kc@kc@kc@kc@n9@jc@II@g{#T/#=/#U/#n9@n9@&j@FS@,##V/#+z !0 Z8 1P h` 'm._m.fj J8 J8 J8 ~n >0 S5 >c #r Nf Nf J8 :d MM >0 >0 Vl Vl F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of _~.pW >0 :d 84 3Y.W/#X/#Y/#Z/#`/#}X.O. `@ `@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . 'X@ (#.(#6J +(#@(#6i 2P [P J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 J8 ja Mb (#,(#'(#)(#!(#!N ~(#{(#](#o)#^(#/(#]'#((#Xx@_(#q$#:(#aA@aA@DG@<(#[(#_# }(#f(.7w |(#1(#2(#3(#4(#g/ 5(#6(#o;#M%#t!#[D@ia@6E@x'#ep iQ@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@mb@mb@n9@ma@7(#_E@&p@+I@w'#w'#rX@8(#9(#0(#a(#b(#c(#d(#e(#f(#g(#h(#i(#j(#k(#l(#m(#eg@n(#o(#om@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@6w@F|.p(#=l@q(#Cc@r(#s(#t(#y5@u(#Lc@v(#x}@Be@w(#x(#>-#y(#z(#A(#}T@}T@g;#p$#B(#C(#D(#E(#,)#D{#F(#G(#H(#zs@n9@n9@n9@n9@I(#D>#tj .u@J(#K(#/m@f`@L(#%`@sP.c 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 1G T-@zC+p).T(#U(#V(#W(#X(#$+ (8+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y sm+n~#Y(#Z(#`(#S5 (O Wh.MM J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja Ek _O +#.s,.87.Z[ X[ _#._#+_#X' ^r@@_#K)#mc@n9@LL@#_#$_#%_#&_#*_#=_#-_#u4.;_#>_#,_#'_#(P u-.)_#S%.ao.!_#~_#{_#}; ]_#D! ^_#BO@tE@D&./_#(_#__#:_#<_#[_#}_#|_#1_#2_#J8 3_#4_#5_#6_#7_#3Y ,/#8_#0,#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@n9@n9@n9@n9@n9@n9@n9@n9@9_#H'##^ V@ /> r' 0_#a_#*L@b_#c_#d_#e_#f_#g_#h_#i_#j_#k_#l_#m_#n_#!>.o_#_&#ma@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@p_#q_#5@.r_#Mj@s_#t_#+i@#2@/< u_#v_#v_#Od@Sg@w_#x_#Cg@y_#z_#A_#B_#br C_#D_#E_#(6 F_#G_#H_#I_#J_#:#,:#':#):#6w@!:#)l@kc@n9@pa@~:#)C@{:#]:#^:#/:#(:#_:#j%+o]#::#<:#[:#Y6 }:#|:#1:#+z.WG.2:#3:#u1 Px.`H 4:#5:#6:#7:#M|.8:#9:#0:#a:#b:#c:#d:#e:#f:#g:#h:#i:#j:#k:#l:#m:#`;+8Y ,`@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@ma@kb@n9@n9@jc@R&#n:#o:#p:#q:#m* a; r:#s:#t:#cP w&.0I u:#v:#w:#x:#y:#z:#A:#B:#C:#D:#E:#F:#G:#.a.H:#I:#|P@Hn@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@cd@ic@|.#J:#K:#L:#M:#N:#O:#P:#Cc@k7@Cd@v_#u(#O0@Q:#O%#R:#S:#T:#U:#V:#W:#X:#Y:#Z:#`:# <#.<#+<#@<##<#$<#%<#&<#*<#=<#]-#-<#;<#+N@jc@><#r2@A<@Q:#.4@:j@k7@..#,<#'<#)<#!<#[D@iE@$j@O@#)l@m9@pa@~<#Kw@6w@)l@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@Jo@{<#]<#ue.)4@^<#8b.k@ n9@n9@lb@ys@l0@zs@n9@n9@ma@lb@/<#(<#_<#:<#0/.p)#n9@n9@n9@la@8U@%y@d^ 6=.<<#P/.7o )n J8 J8 J8 J8 J8 J8 J8 ne ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of '0 ka F- F- J8 J8 J8 Nf Nf Of J8 J8 J8 J8 J8 J8 J8 J8 1G [i.[<#}<#|<#1<#2<#sq.uz+@y+W4+$+ $+ $+ $+ $+ #. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y y $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ @. @. %+ $+ d,@3<#4<#5<#6<#&O xV.ja J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Nf Nf Ek Ek ja J8 #r Hb a0 qA 7<#8<#9<#0<#a<#jc@lc@n9@kb@_k@4,#b<#c<#d<#e<#f<#g<#h<#i<#j<#k<#cS l<#m<#C4.G3.n<#o<#p<#q<#r<#s<#t<#u<#=y.!..#%#0_#8P 36.v<#w<#x<#y<#z<#A<#B<#C<#D<#E<#F<#G<#H<#I<#J<#9p@K<#L<#+I@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@Sr@na@fd@ja@+I@M<#N<#O<#P<#u&.5G >v@Q<#*u@e_ R<#S<#T<#U<#V<#W<#X<#Y<#Z<#`<# [#.[#+[#@[##[#$[#%[# M tM 6M@m9@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@kc@AR@Yx@2b &[#*[#=[#-[#;[#>[#,[# 0@Dc@f`@@: '[#)[#![#~[#{[#][#^[#/[#([#_[#:[#:[#<[#[[#}[#|[#1[#2[#3[#4[#5[#6[#7[#mU 8[#9[#0[#:E@a[#v]#dd.b[#c[#9c@d[#e[#f[#g[#h[#i[#j[#k[#l[#Xj@fV@ln@c #m[#n[#o[#=y@In@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@p[#q[#r[#/A@=n s[#t[#u[#pa@v[#ys@jr@lb@ma@n9@n9@kc@kb@w[#x[#y[#z[#A[#zZ@-A@n9@n9@kc@m9@)l@B[#/> C[#D[#+ +_O J8 J8 J8 J8 J8 J8 '0 ~n ~n ka J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 Nf '0 >0 >0 S5 Vl F- J8 J8 J8 Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 [d E[#F[#G[#H[#I[#J[#8. d,@mm+nm+$+ $+ $+ $+ $+ O %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg R=.y $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. O . 6`.K[#L[#M[#N[#77 lM.J8 J8 J8 J8 J8 J8 J8 J8 J8 F- F- Nf NM o}.Mb |[ J8 ka 5l.q3 jm@O[#%$#P[#Mv@*q@-x@7l@Q[#R[#S[#T[#U[#V[#W[#X[#Y[#Z[#`[# }#.}#0I@n9@n9@n9@n9@eD@l=#yP@+}#@}##}#$}#%}#&}#'A@*}#=}#pJ@n9@fd@-}#;}#>}#,}#'}#)}#!}#~}#{}#]}#^}#/}#(}#_}#:}#<}#[}#}}#|}#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@-A@ma@1}#2}#a$#ec@}+ 3}#4}#5}#6}#7}#8}#9}#0}#a}#b}#c}#d}#e}#f}#g}#h}#i}#j}#k}#l}#m}#n}#o}#p}#q}#r}#s}#t}#u}#v}#4I@n9@ma@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@la@w}#x}#GG y}#O+#z}#A}#B}#C}#D}#s(#{>#Ka@Ib@E}#F}# o@G}#H}#I}#J}#K}#L}#M}#N}#N}#O}#P}#Q}#R}#S}#T}#U}#V}#W}#X}#Y}#Z}#`}# |#Ld .|#+|#@|##|#$|#ea@v|@%|#&|#*|#=|#-|#;|#>|#,|#'|#)|#!|#~|#*,#{|#]|#FL _l -<#zs@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@jc@q'#No@^|#/|#(|#_|#:|#<|#_k@[|#'+#cd@lc@ma@ma@kc@-A@n9@}|#||#1|#2|#3|#4|#fd@6s@6s@kb@n9@n9@/)#5|#6|#C].:`@_J '0 J8 J8 J8 J8 J8 ka >0 {n ka J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 J8 !n ~n {n S5 >c 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 `].7|#8|#9|#0|#a|#b|# # !S+09.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y R=.d+ y $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ m) /+ d,@c|#d|#e|#f|#Yi gX.6o.42.J8 J8 J8 J8 J8 J8 Nf $J ej 9L ]O _d [P ja J8 J8 ]O Y=.^s -,+}/#Wx@n9@n9@&q@Fn@g|#h|#i|#j|#k|#l|#m|#n|#o|#p|#q|#r|#s|#t|#u|#n9@n9@jc@jc@la@)l@zC@aI@#B@v|#d #v|#w|#P'#x|#kc@n9@n9@n9@(F@y|#z|#A|#B|#C|#K~#h[@D|#E|#F|#G|#H|#GW+I|#J|#K|#L|#6s@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@M|#N|#O|#P|#-5.Q|#R|#S|#T|#U|#V|#W|#X|#Y|#Z|#`|# 1#.1#+1#@1##1#$1#%1#&1#*1#=1#-1#;1#>1#,1#'1#)1#!1#~1#{1#$j@kb@l0@zs@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@jc@)l@n9@kc@B[#Ba.mj Hb@,p@aq@]1#^1#/1#jl@(1#_1#MT@:1#<1#[1#}1#|1#11#21#31#41#51#61#71#81#91#-1#01#a1#b1#c1#d1#e1#f1#g1#h1#i1#j1#k1#l1#eu.m1#n1#ni.o1#p1#q1#r1#s1#t1#u1#v1#w1#x1#y1#z1#A1#B1#C1#D1#E1#F1#G1#-).H1#)l@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@eD@^O@I1#J1#K1#L1#M1#N1#O1#kb@kb@ma@ma@ma@;A@;A@3m@n9@n9@P1#Q1#R1#H`.S1#T1#|G@l0@;A@zs@mb@n9@l=#U1#V1#r-@A%.ml >x '0 J8 Nf Of J8 F- |[ S5 F- ka ~n {n S5 Vl F- J8 J8 J8 J8 J8 J8 J8 Nf NM J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 [d W1#X1#e! (2.Y1#Z1#+e.sq.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y y $+ $+ $+ $+ #. #. O $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ n)+/+ {f.c|#`1# 2#.2#60 Uq.6o.}P J8 J8 J8 J8 J8 Nf Nf $J ej 9L ]O _d ka J8 J8 I8 fe G[ %f fr B{#:*#>=#,=#k@ :> ># +2#@2##2#$2#%2#;R+&2#*2#=2#-2#;2#>2#,2#'2#)2#0X@4I@4I@)l@)l@$j@$j@G##jc@mb@kc@kc@kc@lc@n9@n9@n9@n9@n9@Dy@!2#~2#{2#]2#^2#)9@/2#(2#_2#:2#<2#[2#}2#|2#12#Z+#n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@@z@22#32#42#52#62#72#82#92#02#a2#b2#c2#d2#e2#f2#g2#g2#h2#i2#j2#k2#l2#m2#n2#o2#p2#q2#r2#s2#t2#u2#v2#w2#x2#](#m9@kb@oa@3m@lc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@dd@IU@; y2#]2@Oj@,p@z2#UJ@A2#B2#C2#MT@@: D2#E2#F2#G2#H2#I2#J2#K2#L2#M2#N2#O2#P2#Q2#p2#R2#p2#S2#T2#U2#V2#W2#X2#Y2#Z2#`2# 3#.3#+3#@3#Oz.#3#$3#%3#&3#*3#=3#-3#;3#>3#,3#'3#)3#!3#~3#{3#]3#^3#/3#(3#_3#:3#<3#[3#&y@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@}3#|3#13#23#Z5@33#43#53#ES@n9@n9@n9@n9@n9@Sr@3m@pa@1G@63#73#83#93#03#G(#Du@~T@BG@;A@zs@kc@n9@n9@O@#yO@(@ 7C Wn ,h Mf '0 #r #r J8 F- 67 >c F- '0 ~n :%.Vl >c Ul J8 J8 Nf J8 J8 J8 fj NM Of #r F- J8 J8 J8 Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 qs 2Y.~).a3#b3#c3#-)@{f.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. %+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O |~ P. x,#d3#e3#f3#g3#I~.>r [P J8 J8 J8 J8 J8 J8 Nf Nf F- F- ka ~n J8 J8 Nf ha *h B0 7^.h3#;x@6M@i3#j3#k3#l3#m3#n3#o3#p3#q3#r3#s3#t3#u3#v3#w3#x3#y3#z3#A3#B3#C3#Lv@la@la@jc@jc@jc@kc@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@D3#E3#F3#G3#H3#I3#J3#K3#L3#M3#N3#O3#P3#Q3#R3#S3#:E@kb@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@T3#U3#V3#W3#X3#Y3#Z3#`3# 4#.4#+4#@4##4#$4#%4#&4#*4#>1#=4#-4#;4#>4#,4#'4#)4#!4#~4#{4#]4#^4#/4#(4#_4#:4#<4#[4#$$#n9@Sr@ma@lc@lc@kc@kc@kc@kc@kc@kc@lc@lc@n9@n9@}4#|4#BO cA +.##|@FL@OW@S`@Gb@14#24#3># 0@34#44#54#64#74#84#94#04#a4#q}#b4#c4#P2#d4#{4#~4#e4#f4#g4#h4#i4#j4#k4#l4#m4#n4#o4#p4#q4#r4#s4#t4#u4#v4#w4#x4#y4#z4#A4#B4#C4#D4#E4#F4#G4#H4#I4#J4#K4#L4#M4#N4#O4#P4#ja@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@Q4#R4#S4#9p@T4#U4#V4#W4#KT@#!#kb@n9@n9@kc@jc@lc@-A@ln@X4#Y4#Z4#`4# 5#.5#+5#>t@K-#=x@lb@ma@kc@n9@n9@n9@>C@Jx.@5#K' hj /#.:%.#u ej F- J8 F- ]n J8 [d fj '0 F- F- Ul J8 Nf Nf Nf J8 fj -Y -Y NM Vl Vl F- J8 Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 os 2Y.{K #5#$5#%5#N. G>+Gg y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O %+ %+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O #. 8@ {f.J+#&5#*5#=5#;O x]@J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf os mW A: X&#->.q$#-5#;5#>5#,5#'5#)5#!5#~5#{5#]5#^5#/5#(5#24@e/@!9@_5#:5#<5#[5#~@#}5#ka@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@kc@kb@|5#15#25#35#45#55#i]@]8@r:@65#75#85#95#@: 05#;o a5#ln@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@b5#EG@98 c5#d5#e5#f5#g5#h5#i5#f2#)4#j5#k5#l5#l5#l5#l5#m5#n5#o5#p5#q5#P2#r5#r5#l5#s5#t5#u5#v5#w5#x5#y5#z5#A5#B5#n9@n9@jc@jc@kc@kc@kc@kc@kc@kc@kc@n9@n9@kc@n9@!~#tj C5#YY@D5#E5#Je@Z0@d;..7 F5#B_ 6#,6#'6#)6#!6#~6#{6#lB@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@]6#^6#GX /6#J0@(6#_6#:6#<6#[6#>t@kb@c #DK@}6#|6#16#26#36#46#56#66#76#86#|G@jr@ja@CH@lc@n9@kc@kc@n9@kc@$B@j+ *>.96#/=.**.:%.S5 -6 Vl J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 :%._d _d >0 67 >c 67 J8 Of |(.4o sv J8 J8 J8 F- J8 J8 J8 J8 J8 qs xL }T 06#a6#b6#V+ TO.d+ n)+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O #. 9@ mm+c6#d6#e6#f6#(/.#h J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of os ss 0q g6#=j@h6#i6#j6#k6#l6#m6#n6#o6#p6#q6#r6#s6#t6#u6#v6#w6#x6#y6#z6#A6#B6#C6#D6#lb@la@Lv@$j@la@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@kc@n9@E6#w$#F6#G6#H6#I6#J6#K6#L6#M6#N6#O6#La@P6#Q6#U, R6#C@#n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@n9@S6#/s.T6#U6#V6#W6#X6#Y6#Z6#`6#`6# 7#P2#l5#l5#l5#l5#l5#l5#q5#.7#+7# 7#@7#@7##7#R5#$7#%7#&7#*7#=7#-7#;7#>7#,7#'7#)7#n9@LL@O@#la@n9@n9@kc@kc@-A@n9@n9@n9@zs@!7#h7 ~7#XZ@f`@3 #OV@8[@gB@{7#n> vk@d`@2 #Pa@]7#^7#/7#(7#_7#Z2#:7#<7#[7#}7#P5#|7#l5#l5#l5#l5#l5#l5#l5#t5#~4#Q2#^4#17#27#37#47#57#67#77#87#97#07#a7#b7#c7#d7#e7#f7#g7#h7#i7#j7#k7#l7#m7#n7#o7#p7#q7#r7#s7#t7#u7#ka@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@la@v7#w7#fI.,B.x7#y7#z7#A7#B7#$B@zs@-w@n9@C7#D7#E7#F7#G7#H7#I7#J7#K7#L7#M7#Ov@N7#,t@;R@jc@lc@lc@kc@kc@n9@3m@_E@AY@O7#V7 e+.$_.me ha Vl F- J8 J8 J8 J8 ka ~n -Y ka J8 J8 J8 J8 J8 J8 J8 Vl S5 ja J8 J8 F- J8 J8 J8 sH M1.>` sH J8 Vl -6 F- J8 Nf Of J8 os 2Y.UX P7#Q7#R7#S7#wB@d+ n)+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ Q& uz+T7#U7#V7#1B Ak 7r.J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of _~.#r id W7#X7#Y7#Z7#[J `7# 8#.8#+8#@8##8#$8#%8#&8#*8#=8#-8#;8#*2#>8#,8#'8#)8#!8#~8#ot@JT@)l@$j@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@{8#]8#^8#/8#(8#_8#:8#<8#[8#}8#|8#18#.Z@28#38#48#[D@la@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@LL@58#68#78#88#98#08#a8#b8#P2#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#P2#P2#l5#@7#'4#c8#m5#d8#e8#f8#g8#h8#i8#1*#j8#k8#l8#m8##j@$$#ma@n9@n9@n9@n9@n9@n9@n9@)l@w`@ {#kp 8$#n8#o8#f`@.|@4 #8[@$g@wN@p8#7A@9>#Me@uP@wz.q8#r8#s8#t8#u8#v8#w8#x8#y8#z8#|7#l5#d4#d4#t5#l5#l5#l5#d4#~4#A8#B8#C8#D8#E8#F8#G8#H8#I8#J8#K8#L8#M8#N8#O8#P8#Q8#R8#S8#T8#U8#V8#W8#X8#Y8#Z8#`8# 9#.9#+9#@9##9#$9#$j@n9@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@fd@%9#&9#oD *9#=9#-9#;9#>9#,9#'9#TL@n9@_k@R[#)9#!9#~9#{9#]9#^9#/9#(9#_9#:9#<9#Q_#[9#oa@,t@BG@-w@ma@kc@kc@kc@kb@Sr@Qt@/*#}9#|9#N4 _%.me os Of Nf J8 J8 J8 J8 ka >0 g` ka J8 '0 ka F- F- J8 J8 67 >c F- J8 J8 J8 J8 J8 ka ns M1.87.sH F- S5 9L F- J8 Nf Of J8 4P -G 4l.19#29#39#xB@49#09.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ y 59#69#79#89#99#+G 7r.J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of Of 1h.09#a9#;/#b9#c9#d9#e9#f9#g9#h9#i9#j9#k9#l9#m9#n9#o9#p9#q9#r9#s9#t9#u9#v9#w9#x9#W@ IU@Wj@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@H(#y9#&# z9#A9#B9#C9#D9#E9#F9#G9#>K H9#I9#~%#J9#;w@lb@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@-A@K9#L9#M9#N9#O9#P9#Q9#R9#S9#d4#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5##7#T9#U9#N2#V9#W9#X9#Y9#Z9#_y@`9# 0#.0#+0#@0#u4 #0#om@kc@la@la@la@jc@cd@0T@Ur@$0#%0#&0#*0#=0#@P@o8#4 #-0#e,#;0#>0#,0#wM@'0#)0#@T@_x !0#~0#{0#]0#^0#/0#(0#_0#:0#<0#[0#l5#N2#N2#~4#l5#l5#d4#{4#N2#T2#}0#|0#10#20#30#40#50#60#70#80#90#00#a0#b0#c0#d0#e0#f0#g0#h0#i0#j0#8|@X8#k0#l0#m0#n0#o0#p0#q0#r0#dd@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@=}#s0#t0#u0#v0#w0#x0#y0#z0#A0#B0#C0#pa@D0#E0#F0#G0#H0#I0#J0#K0#L0#M0#N0#O0#P0#Q0#'S@/F@>t@BG@,t@jr@zs@kc@kc@kb@ma@;A@*x@H'#:# R m6 me /d Of Nf Nf J8 J8 J8 F- S5 Ws F- ne ~n >0 S5 Vl F- J8 Ul F- Nf Nf J8 J8 J8 J8 >0 '0 sH DU 4o J8 ]O ]O J8 J8 '0 NM J8 $J -G CE R0#S0#T0#+)#tq.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . 59#U0#V0#W0#V/#Hr !d J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of dj S#+Q+ u!#h6#'+#_k@Mv@n9@X0#Y0#Z0#`0# a#.a#+a#@a##a#$a#%a#&a#*a#=a#-a#;a#>a#,a#'a#l{@)a#&y@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@!l@a$#R+ !a#~a#{a#]a#^a#/a#(a#_a#ja@n9@cd@;A@ys@lb@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@-x@u4 :a#w@fa#zZ@!6 ga#M1#ha#me.ia#Xq ]p@W{#ja#B'#u=#/j@ka#UZ@-r@la#ma#~g@na#oa#pa#qa#ra#sa#ta#ua#va#m5#!4#t5#N2#p2#e4#l5#l5#d4#N2#S2#wa#xa#ya#za#Aa#Ba#Ca#e4#Da#Ea#Fa#Ga#Ha#Ia#Ja#Ka#La#Ma#Na#Oa#Pa#Qa#Ra#Sa#Ta#Ua#Va#Wa#Xa#Ya#Za#3g@`a#ln@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@~;# b#.b#+b#@b##b#$b#%b#&b#*b#!7#=b#-b#;b#>b#,b#'b#)b#!b#~b#d/@Ua#{b#]b#(:#^b#/b#;=#kb@_k@,t@BG@l0@lb@kc@kc@kc@lc@n9@n9@7/#(b#Fo.^t 5P ^~@Of ha ha Nf J8 J8 F- >c -6 Vl ka ~n {n S5 >c Vl J8 J8 J8 Nf Of J8 J8 J8 J8 -Y _d >0 J8 J8 !n ~n _d J8 ka ~n _d ka $J -G ^z.k@#_b#:b#l~@Wc.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ Q& 6`.c F- J8 J8 J8 J8 J8 J8 J8 ~n -Y pW $J e^.;A Em +(#1b#dd@n9@kb@jc@0X@2b#}Y 3b#4b#5b#L1#6b#7b#8b#9b#0b#ab#bb#cb#db#eb#fb#gb#`;+,##c!#n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@kc@=x@hb#ib#jb#kb#lb#mb#nb#ob#pb#A(#m9@n9@kb@3m@3m@ma@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@3m@Tr@S-#qb#rb#sb#tb#ub#vb#wb#o2#xb#yb#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#l5#r5#@7#zb#Ab#Bb#c4#c8#Cb#Db#Eb#Fb#Gb#Hb#Ib#Jb#Kb#Lb#ly.Mb#Nb#)B.t% Ob#Pb#Qb#Rb#Sb#Tb#Ub#Vb#Wb#Xb#Yb#Zb#.4@!r@+T@MT@ 0#`b#!p@- #TZ@*l@ c#.c#+c#@c##c#$c#%c#&c#*c#=c#l5#l5#l5#d4#d4#l5#l5#!4#V2#-c#;c#>c#,c#'c#)c#!c#~c#31#{c#]c#^c#/c#(c#_c#:c#0 {n S5 Vl F- J8 J8 J8 J8 J8 ka ka J8 J8 J8 J8 ka ka J8 ka >0 _d _d ,x ^d ]K Cc#p. Dc#-)@{f.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ @. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ %+ 9@ 7. %!@Ec#Fc#Gc#Hc#)_ aL.J8 J8 F- 67 >c F- J8 fj !n J8 J8 J8 J8 ~n _d pW $J *$.70 ze JD@kn@)l@n9@lc@)l@jc@la@Ic#Jc#Zc.Kc#Lc#Mc#Nc#Oc#Pc#}A.Qc#Rc#Sc#fk.aK@CO@h3#,q.~%#[D@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@jc@-w@ys@Sr@;w@Tc#*'.Uc#Vc#0+ +N@cd@ln@jc@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@Sr@k0@Wc#Xc#Yc#O%#Zc#`c# d#.d#Y6#+d#@d##d##d#$d#%d#&d#P2#P2#d4#b8#~4#d4#l5#r5#*d#=d#=d#*d##7#c4#Q5#-d#;d#>d#,d#'d#)d#!d#~d#{d#]d#^d#/d#(d#6' Pj.!/ _d#y2#:d##Jd#Kd#v!#Wz@jR@Ld#*y@1%#Md#Md#Ic#Nd#SE.ME.Od#t% Pd#Qd#Rd#Sd#Td#Ud#Vd#Wd#Xd#Yd#Zd#`d# e#.e#+e#@e#^8@(7@#e#Va#$e#64@%e#&e#*e#=e#-e#;e#>e#,e#'e#fc@ja@kc@kc@kc@kc@6s@n9@X #)e#!e#R` CF sy ha :C Mb :d J8 ka ka J8 F- Nf Of Nf J8 J8 '0 ~n :%.>c -6 Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 fj >0 _d P,.Cp ^d wS WZ ~e#{e#PN@sq.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ O $+ $+ $+ $+ $+ $+ $+ $+ $+ O #. 7. d,@]e#^e#/e#(e#Hr ]Y Nf J8 J8 F- Ul J8 fj ~n ~n ka J8 J8 J8 fj fj ne #r X$ ;g _b _e#:e#=x@n9@lc@la@kc@n9@6K@f#,f#'f#)f#!f#~f#{f#]f#^f#Ad#Bd#v3#/f#(f#_f#:f#x ia :d Ul J8 ~n >0 S5 ej F- Nf Nf J8 J8 [d fj '0 >c -6 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf fj ~n ~n >0 fj >x )n M1.zf#Af#Bf##_@a@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ `@ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O @. 9@ :8+Cf#Df#Ef#1' D'@]Y Of J8 J8 J8 J8 J8 ka >0 {n ka J8 J8 J8 J8 J8 J8 ja ;O qu on Ff#pW@}G@n9@lc@lc@n9@kb@9l@Gf#Hf#If#'C@Jf#Mv@pa@1G@pa@n9@n9@n9@pa@kb@n9@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@n9@kc@m9@#B@Kf#Lf#M%#)l@jc@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@kc@kc@ir@Mf#=>.Nf#Of#Pf#Qf#Rf#Sf#Tf#Uf#Vf#Wf#Xf#Yf#<0#<0#Zf#`f#91# g#%d#c4#m5#m5#P2#P2#l5#t5#Q2#.g#+g#@g##g#@d#$g#g2#%g#&g#*g#=g#-g#;g#>g#,g#'g#)g#!g#~g#{g#]g#^g#/g#(g#_g#~!@:g##ng#og#pg#qg#TF+rg#sg#tg#ug#vg#wg#xg#yg#zg#Ag#Bg#Cg#Dg#Eg#Fg#Gg#Hg#1X@Ig#Jg#Kg#Wn@6 #dn@Lg#Mg#Ng#Og#oV D4.O}.IB Pg#Qg#Rg#X~ b@#Sg#Tg#Ug#Vg#Wg#Xg#Yg#Zg#`g# h#o|#.h#'^#+h#@h#~8@d/@d]@#h#N^@N]@$h#%h#&h#*h#=h#-h#;h#>h#,h#'h#)h#!h#~h#n9@n9@kc@kc@kc@n9@m9@w'#{h#]h#^h#Pd ]d qs J8 J8 J8 -Y {n Ws -6 Vl J8 J8 J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of {n :%.'0 J8 J8 I8 wL DU /h#(h#_h#:h#s3._8+_8+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ @. ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O #. 8@ :8+i#,i#'i#)i#!i#~i#{i#!G.-x@AC@]i#)h#^i#/i#(i#15@_i#:i#c Ul J8 ka ka F- Vl #r Nf Nf J8 Nf NM -Y -Y NM #r Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 S5 Vl F- J8 J8 I8 wL DU Ei#Fi#Gi#Hi#M'@/B+O<+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ Q. 09.}b@Ii#Ji#Ki#Li#Mi#ka 67 9L ]O _d ka F- Vl >c F- J8 F- F- Nf pW -Y {n }d !q 5[ BM.Ni#v*#l=#n9@n9@ma@jr@~T@dd@Oi#)l@m9@jc@lc@lc@lc@lc@ma@-w@ys@3m@n9@lc@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@jc@-w@,t@l0@jr@zs@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@de@n9@jc@>Z@Bq@k<#Pi#.! Qi#Ri#Si#Ti#Ui#Vi#Wi#Xi#Yi#Zi#`i# j#.j#+j#@j##j#$j#%j#.f#&j#*j#+d#o5#=j#-j#;j#kh#e2##i#>j#,j#'j#)j#!j# g#q5##i#~j#{j#]j#^j#ol@/j#(j#_j#:j#kd#M}#S2#c Ul J8 J8 J8 J8 J8 Nf Of '0 !n Nf NM -Y _d NM Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 67 >c F- J8 J8 I8 wL DU >k#,k#Gi#'k#]g.N<+0 dj tV |, <:.u$+/k#')#n9@n9@ma@lb@lb@pJ@lc@n9@n9@lc@lc@lc@lc@lc@kc@zs@cd@ma@lc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@zs@lb@3m@pa@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@de@n9@n9@n9@Wj@{J@(k#P*@_k#'x.:k#l#,l#'8@'l#'l#c}@)l#8|@!l#~l#{l#]l#^l#/l#(l#_l#:l#P*@L& t: }7@!6 A].8+ D# `( 0 ~n Nf Nf '0 ~n Nf Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja MM ja J8 J8 I8 77 G- nl#ol#pl#ql#&+ mm+tm+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 09.rl#sl#tl#ul#6h ~s@J8 J8 J8 J8 J8 F- F- J8 J8 J8 F- Vl >c F- J8 J8 J8 Of 4o 4i 61 vl#wl#xl#n9@n9@kc@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@n9@Q`@jR@yl#zl#V`@~j Al#Bl#Cl#Dl#El#Fl#Gl#Hl#Il#Jl#Kl#Ll#Ml#Nl#Ol#Pl#Ql#Rl#Sl#Tl#Ul#Vl#Wl#Xl#Yl#Zl#`l# m#.m#+m#@m##m#$m#%m#&m#*m#=m#VO@-m#;m#dj#>m#m5#,m#2a#2a#51#$m#'m#)m#!m#~m#HR.FF.{m#CV.wT@.D@; #C_ &4 ]m#^m#/m#(m#_m#:m#0 {n ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y _d >0 F- J8 ha )n ax.Bm#Cm#Dm#Em#49#d,@Vc.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# O<+Fm#Gm#Hm#Im#_*.-%.J8 J8 J8 Nf $J ej >c Ul J8 fj -Y :%.]O J8 J8 J8 J8 Of >x :%.G1 Jm#Km#Lm#(r@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@n9@4I@t!#Mm#Nm#M9.Om#Pm#)A.Qm#Rm#5u.Sm#Tm#Um#Vm#Wm#Xm#Ym#Zm#`m# n#.n#+n#@n##n#$n#%n#&n#*n#=n#-n#;n#>n#,n#'n#)n#!n#~n#{n#]n#^n#/n#(n#_n#:n#t@3m@kc@lc@kc@kc@n9@n9@qZ@vn#wn#xn#yn#zn#Y8#Y8#b}@Zj#An#Bn#Cn#Dn#En#Fn#Gn#Vw@ma@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@jc@CH@Hn@kc@n9@y/#Hn#In#Jn#Kn#Ln#Mn#Nn#On#Pn#K~#f[@U(@3^@O]@3^@O]@-^#Cd#Qn#Rn#Sn#Tn#Un#_k@kb@;A@Vn#lc@lc@kc@kc@kc@kc@kc@kc@n9@kc@Wn#@=#/O 6A Of [d J8 ]n ps F- J8 J8 J8 J8 F- S5 S5 F- J8 J8 J8 J8 ka ~n -Y ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ja Vl >c J8 ha &O B-@Xn#Yn#Zn#`n#P%+ o#ee+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# /B+.o#+o#@o##o#hh =#!n J8 J8 Nf $J ej >c Ul J8 pW -Y _d -Y J8 J8 J8 J8 Nf ,x sV 1#. _#$o#%o#Lv@lc@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@lc@n9@3m@@^#&o#f@ i;.Xu.`~ y:.~3 !7.-8.*o#=o#-o#mH ;o#>o#Up@,o#'o#)o#!o#~o#{o#]o#^o#/o#(o#_o#:o#c >c F- J8 J8 J8 J8 '0 ~n _d ka J8 J8 J8 J8 J8 '0 !n J8 J8 J8 J8 J8 F- 67 >c Nf os &O B-@;p#>p#,p#`n#P%+;5+'p#$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ %+ `@ #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# @y+)p#!p#~p#9y {p#]p#~n [d J8 Nf Of #r Ul Ul J8 pW pW pW fj J8 J8 J8 Nf Of ]d sV

    q#,q#'q#c/@8l#+h#+h#c1@tm#)q#!q#~q#{q#nn@~O@3m@ln@)l@la@kc@kc@kc@kc@kc@kc@n9@kc@oJ@]q#q5.&;+os hH ej ej #r J8 J8 J8 J8 67 >c >c 67 J8 J8 J8 J8 J8 J8 '0 ~n J8 J8 J8 J8 J8 '0 >0 ~n '0 Nf Nf J8 J8 J8 Ul Vl Of os xL iS.^q#/q#(q#`n#M{@Gi+S0+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ @. @. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ %+ #. 6. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . vu+_q#:q#r#,r#'r#n9@ln@ka@m9@kc@kc@kc@kc@kc@kc@n9@kc@c!#)r#Wt.!r#,r RL >c Ul [d J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 F- J8 J8 J8 J8 J8 J8 J8 J8 J8 ka >0 {n NM Of Nf J8 J8 J8 J8 J8 Nf os le z$.~r#{r#]r#^B+GO@09.. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. O $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y sm+^r#/r#(r#_r#E1.:r#S5 J8 J8 J8 J8 J8 J8 J8 F- ej ej F- J8 J8 ka ~n -Y Of os os ~k.Ta [q t@Rr#Sr#_Q@5~#Tr#Ur#Vr#Wr#Xr#Yr#Zr#`r# s#.s#+s#@s##s#$s#%s#&s#*s#pa@zs@jc@kc@kc@kc@kc@kc@kc@n9@kc@t!#ND x,+mv 4$.fe ja >0 -Y J8 J8 Nf Of Mf ]O '0 J8 J8 F- ]n ps F- J8 J8 J8 J8 J8 J8 J8 J8 F- Vl 9L F- J8 J8 J8 J8 J8 J8 J8 J8 7o GE.]C =s#-s#;s#>s#8. y . $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Bz+,s#'s#)s#!s#Rl ~s#>c J8 Nf J8 J8 J8 J8 J8 F- fz fz F- J8 J8 '0 ~n _d NM Of Of &N 4&.n] {s#]s#kW@n9@n9@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@kc@kc@kc@kc@kc@pJ@-w@;A@;A@CK@ka@l=#CK@CK@ka@;)#Ic#^s#d^ G$ ^; /s#*$#(s#_s#:s##p)#ds#es#fs#gs#Ha.hs#is#>Z@@N@&y@jc@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@)l@Pt@|G@js#ks#ls#ms#ns#os#ps#qs#rs#ss#ts#us#vs#Bc#Wj@iR@$j@la@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@kc@kc@zs@jr@l0@Vn#n9@n9@kc@m9@ln@=x@v`@;T@ws#xs#ys#zs#As#Bs#Cs#Ds#Es#Fs#Gs#Hs#Is#Js#Uq#n9@n9@n9@kc@kc@kc@kc@kc@kc@n9@kc@.^#Ks#]$.Kj.4$.>h '0 ~n _d ja ja Nf Of -Y g` '0 J8 J8 F- #u _O F- J8 ka !n J8 J8 Nf J8 J8 F- Vl 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 7o &O Vl Ls#Ms#Ns#Os#_% $+ y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . }X.Ps#Qs#Rs#Ss#`+.Ts#Vl Nf Nf Nf J8 J8 J8 J8 J8 MM MM ka J8 Nf Nf '0 ~n Nf Nf Nf #r *O ml Us#Vs#Ws#m9@kc@)l@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@kc@kc@kc@kc@kc@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@9l@II@ia@9A@j&#Xs#,Q@Ys#Zs#`s# t#.t#+t#@t##t#$t#%t#&t#*t#=t#-t#;t#>t#,t#1%#1=#'t#)t#&&#tU@!t#~G.Nd#WG@g;#}T@AR@JT@))#5T@~t#{t#]t#^t#Hn@n9@n9@de@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@la@de@_k@=w@/t#(t#_t#:t#h fj fj :%.Ek Ek ja Nf fj '0 '0 Nf J8 ka ]O :%.J8 J8 ka ~n ka J8 Nf Nf J8 ka ja >0 J8 J8 J8 J8 J8 J8 J8 J8 J8 I8 qs #r 6o kt#lt#Hi##_@$+ y# $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . X(#mt#nt#ot#pt#;_ ]Y J8 Nf Of Nf J8 J8 J8 J8 J8 -Y _d ~n J8 Of Of Nf F- J8 J8 J8 I8 la at Q!@qt#rt#fc@>R@ja@la@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@kc@kc@kc@kc@n9@n9@kc@m9@la@n9@n9@pJ@st#=q@tt#ut#vt#wt#ri#f[@}1@'l#xt#yt#zt#At#Bt#Ct#Dt#n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@Sr@Qt@ZK@>,+Et#Ft#Gt#Ht#It#Jt#Kt#Lt#Mt#Nt#C~#-A@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@ma@jr@N7#By@>E@Ot#Pt#Qt#Rt#St#Tt#Ut#Vt#Wt#Xt#Yt#Zt#CV n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@n9@zs@`t#48. u#.u#~Y >h Nf Nf $J Aj Mb `*.J8 J8 J8 Nf Of J8 ka >0 _d ka J8 ~n _d ka J8 Nf Of J8 ka >0 _d ka J8 J8 J8 J8 J8 J8 J8 J8 F- #r iS.+u#@u##u#$u##,@. _8+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ #. pT 09.y $+ $+ $+ $+ . %u#&u#*u#=u#-u#QU ;u#fj [d F- 67 67 ]O ~n fj J8 J8 ka J8 J8 J8 F- 67 -6 #r Nf Nf J8 ^d 2V ,s >u#~g.,u#D{#jc@kb@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@kc@n9@n9@n9@n9@'u#Rq )u#!u#~u#j7#f[@E_@3^@U(@{u#]u#^u#/u#|/ (u#kb@n9@n9@n9@kb@Sr@jr@kc@n9@n9@n9@n9@n9@n9@n9@n9@kb@na@jr@kb@n9@n9@n9@kb@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@pa@-w@;w@_u#:u#c -6 ]O _d fj J8 J8 J8 J8 !n J8 F- 67 >c #r Of Nf J8 os 6A ut '&#su#tu#uu#vu#la@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@kc@-x@j&#wu#IU xu#yu#zu#Au#Bu#Cu#>9@92@7|@Du#Eu#Fu#Gu#Hu#Iu#jc@n9@ma@kc@ma@jr@l0@zs@kc@n9@kc@kc@kc@kc@kc@n9@3m@jr@l0@3m@kb@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@kc@kb@|>#Ju#Ku#Lu#Mu#Nu#Ou#Pu#Qu#Ru#kb@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@ma@jr@l0@,t@l0@fV@ja@$j@Jo@Su##B@da#Tu#Uu#xP@FS@m9@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@BC@Vu#(@.S/.Wu#{d >h J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 F- Vl >c ja ka F- Ul J8 J8 J8 J8 F- Vl ej >c F- J8 J8 J8 J8 J8 J8 J8 ka 5o Z].Xu#Yu#Zu#`u#q/@GO@09.Gg %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y /+ R=.y $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ O n)+y y $+ $+ $+ $+ y v#^r#.v#+v#@v##v#$v#!n $m.>0 9L -6 ja fj fj J8 J8 ka [P ~n '0 Nf F- F- Nf Nf Nf J8 :%.,0 J8 G[ )1 %v#&v#*v#-x@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@zs@zs@cf@/'#=v#-v#;v#>v#,v#'v#)v#!v#](@,9@~v#{v#]v#^v#er#/v#(v#_v#BC@kb@>t@ma@ma@lb@-w@3m@kc@kc@kc@kc@kc@kc@kc@kc@ma@lb@-w@3m@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@Lv@:v#Z@jc@kc@kc@kc@kc@kc@kc@kc@-A@n9@!l@mm@&*#8v#P..z'@2-.BB J8 J8 Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- Vl >0 >0 S5 >c F- J8 J8 J8 67 >c ej ]n J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 pW 5P 9v#0v#[(@`n#e,@Gg 0@ 9@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y n)+$+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y sm+av#bv#cv#dv#.=@ev#J8 ~n {n Ek >c Vl J8 J8 J8 J8 !n ~n _d NM Of Nf J8 J8 J8 J8 J8 ~n Cp >h ]K fv#M) gv#3@ F(#eD@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@cd@hv#iv#jv#kv#wU X<. I.lv#mv#nv#ov#pv#qv#`j#rv#sv#tv#uv#vv#wv#xv#yv#zv#j`@N7#oa@3m@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@kb@=x@Av#Bv#Cv#Dv#*y@zs@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@n9@kb@kb@kc@kc@kc@n9@n9@la@m9@jc@n9@kc@kc@kc@kc@kc@kc@kc@n9@n9@+I@Z .kQ z[.4# n;.**.>0 J8 J8 J8 J8 J8 J8 F- J8 J8 J8 J8 J8 J8 J8 J8 -Y {n Ws -6 Vl J8 [d J8 >c ej #r Of J8 J8 J8 J8 J8 J8 J8 J8 J8 ~n jR Ev#cp@Fv#Gv#q/@'h.%+ `@ 6. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . Hv#Iv#Jv#Kv#Lv#)E+zs.J8 J8 '0 Nf #r J8 J8 J8 J8 Nf Nf '0 ka ej ej F- J8 J8 J8 J8 J8 J8 '0 Mf 1G 0` ,k 4/ 1h#((#n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@Mv#Nv#)t@Ov#{x@Ia@Pv#j>#Qv#Rv#Sv#Tv#Uv#Vv#b:#Wv#Xv#Yv#qi#~8@Zv#`v# w#.w#+w#|5#[9#3m@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kb@Q4#Kw@S&#@w#Jo@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@#w#)c p%#*V@u5.#r >0 ka J8 J8 J8 J8 ja s_.bh Vl J8 Nf Of J8 J8 J8 J8 J8 '0 #r ]n F- !n ~n -Y ja F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 -Y 2$.$w#%w#&w#C:@8. $+ $+ `@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y tz+Ii+*w#=w#-w#3a@;w#F- J8 Nf ne Of J8 J8 ja ja Of Of Nf J8 >c >c F- J8 J8 J8 J8 J8 J8 J8 J8 I8 LM $2 B Z4 >w#1%#Lv@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@,w#'w#)w#!w#~w#Tu {:.{w#]w#^w#/w#(w#_w#:w#c >c Vl I8 ~n fj Nf J8 J8 ka ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of -G Dw#Ew#Fw#}(@71.`@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ O-.Gi+|a@Gw#Hw#Iw#Jw#Kw#fz g` _d ~n J8 J8 ja s_.Mb I8 Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of me pW 3 .O/./Y@j$ Lw#M%#m9@kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@Hn@la@-x@tU@eC.7E@Mw#Nw#ng#aI@/<#Ow#Pw#6K.Qw#Rw#Sw#Tw#Uw#Vw#Ww#Xw#}{#Yw#Zw#`w# x#k{.n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@n9@kc@$B@.x#/p#+x#hu V3@^d Ww >c F- J8 J8 J8 J8 J8 '0 -Y J8 J8 J8 J8 67 -6 -6 >c ]O _d ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Of -G @x##x#$x#k^#%x#7. 0@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ Q& tq.&x#69#*x#=x#C7@-x#F- ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 !n ~n :%.S5 67 F- Of J8 J8 Of 5P ^d ,].;x#>x#1,.,x#Kq $ ._(#n9@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@m9@ja@DK@M%#'x#)x#Du@zs@n9@m[#!x#~x#{x#]x#^x#/x#(x#_x#:x#i@4x#U0 [6 /d Fk ]O J8 J8 J8 J8 J8 F- ]n 7o J8 J8 J8 J8 ]O ]O ja F- J8 ka J8 J8 J8 J8 Nf Of Of I8 Ek Mb ja J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf d!.P;@5x#6x#7x#8x#8. P. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y tq.&x#9x#0x#ax#MO.bx#J8 J8 J8 J8 J8 J8 J8 J8 ja J8 J8 J8 J8 J8 '0 ~n {n S5 ej #r Of J8 J8 #r $J Jf (#.cx#dx#9' N;.= #*9.[- qW@v`@lc@kb@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@kc@ma@lb@ys@ma@n9@kc@+I@vM ex#4g.fx#gx#hx#ix#jx#kx#lx#mx#nx#ox#px#qx#kc@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@jc@*q@Nd#^; rx#sx#v}@3! sH me (d P,.fj ka F- F- J8 #r ]n $r F- J8 J8 J8 -Y _d fj J8 J8 J8 J8 J8 J8 J8 '0 NM $J #u Ws Mb ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ga tx#ux#vx#wx#xx#4)@Wc.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y vi+ZU@yx#zx#Ax#e^.Bx#Nf J8 J8 J8 J8 J8 ja Ek Lb I8 Nf J8 J8 Nf Nf '0 >0 #r #r Nf Nf J8 F- Vl m/ L} qs Cx#Dx#',.zM.Ex#5G y7.Fx#ot@kb@n9@kb@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@n9@n9@n9@Vn#kb@n9@kc@BC@Gx#;!.A^.Hx#Ix#Jx#Kx#Lx#Mx#Nx#Ox#Px#Qx#Tj@/<#kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@v*#/; Rx#+:.YA Od J8 ha Nf '0 ~n ~n >0 S5 ej #r Nf #r ]n J8 J8 J8 Nf fj fj fj Nf J8 J8 J8 J8 J8 ka >0 :%.]n ej 9L :d J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ]n Sx#Tx#Ux#Vx#Wx#M'@09.$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ #. %+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ . vu+-I@Xx#Yx#Zx#*$.`x#Of J8 J8 J8 J8 J8 ja Mb .T+.S2.On.`H.pN J3. y#_k@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@cd@.y#+y#.^#-x@ja@jc@kc@=j@@y#]w.#y##x 1m@rZ@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@kc@pF@$y#%y#,u.jd+hr Q4 ;h 77 J8 J8 J8 -Y g` Ws -6 ]n Of Nf J8 J8 J8 Nf Of J8 J8 Nf Of J8 J8 J8 J8 J8 !n ~n {n S5 >c 67 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 7o &y#*y#=y#c< ^8+d+ Gg $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ #. 6. %+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Gg R=.yL+-y#;y#>y#,y#rK 'y#J8 J8 J8 J8 J8 J8 J8 ja ja Of $J ]n 67 Mf -Y fj F- ej >c Ul J8 ~n :%.I8 ga 4x %N #r me ,$ yw.k` uh.rf.)y#N%#om@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@jc@k0@z/#0X@CH@l=#LL@n9@9l@!y#~y#{y#tu#((#cd@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@]y#^y#/y#(y#X&#Vx 5m g# wL Nf J8 J8 ka ka F- Vl F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 NM F- F- Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 7o &y#*y#_y#:y#]^.^'@P. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y R=.P,@yL+-y#c ]O _d fj F- fz fz Ul J8 ~n _d NM &N +C +C z$.os `l.O&.`f@Z=.1y#2y#3{ 3y#AR@6s@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jr@,S@3m@lc@)l@)l@jc@Vj@gc@1%#vQ@/S@[D@$$#6s@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@n9@n9@zs@*q@4y#5y#6y#%t 7F@7y#8y#41 ej $J Of Nf J8 J8 J8 J8 J8 J8 J8 ka ka F- F- 1G J8 J8 J8 J8 J8 F- F- J8 J8 J8 J8 Nf Of J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- $r &y#9y#0y#ay#by#8. P. $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ n)+R=.P,@ v#cy#dy#ey#fy#Xw.gy#J8 67 67 F- J8 J8 J8 J8 J8 Nf J8 F- Vl '0 fj ne J8 MM MM ka J8 fj '0 Of &N h).h).3/.os 4$.os HI O/.+z hy#$B }(#iy#oJ@jc@jc@kc@n9@n9@kc@lc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@Vn#W_#kb@n9@la@la@jc@n9@n9@jc@CK@jy#dd@la@Hn@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@n9@n9@Kw@0,#3b.ky#MK =&.2I nm.~W.Ga F- Of Of Of Nf Nf Nf Nf J8 J8 '0 >0 >0 S5 67 Ul J8 J8 J8 J8 J8 67 67 F- J8 J8 J8 J8 Nf J8 J8 Nf Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Vl Ga ly#my#ny#oy#py#v* 0@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y R=.Lr.Hv#|a@qy#ry#sy#je ty#J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y _d ~n J8 F- F- J8 J8 J8 J8 Nf Of Of )n je I8 V4 w0 U7.mN.uy#vy#bZ@fc@3v@la@kb@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@pa@Pt@o(#ma@lc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@Hn@lc@ma@pt@wy#+>@#'#uh 06 Ud -h Mf J8 J8 J8 Of Of Of Of Of Of Nf J8 J8 !n ~n {n S5 >c 67 J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- ej T0 16@_0@xy#yy#zy#0@ y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ n)+R=.V1+ o#Ay#qy#ry#By#,h ^%+J8 >0 ]O '0 J8 Nf Nf Nf J8 Nf Nf Nf J8 J8 F- 67 67 ka fj ne $J ej >c Ul J8 J8 J8 J8 J8 -Y (d /d wL Hb `7 l~.Cy#(=@gW U; 5-.Dy#Ey#kb@n9@n9@pa@kb@n9@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@3m@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@jc@)l@pF@n9@de@Fy#Gy#Hy#Iy#ea #y 6A )n '0 J8 J8 J8 J8 ja Ek Mb ja J8 J8 J8 J8 J8 '0 NM F- F- Nf Of Of Nf Nf J8 ]O ]O '0 J8 Nf Nf Nf J8 J8 ka ~n :%.S5 67 Ul J8 J8 J8 J8 J8 J8 ka ]O >h Jy#Ky#Ly#Vx#My#Q& 0@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y /+ d,@Hv#Ay#qy#ry#Ny#x;.Oy#J8 ~n {n '0 J8 Of Of #r F- NM NM Nf J8 J8 F- 67 >c F- Nf Nf $J ej >c ja !n J8 J8 J8 J8 ~n -Y pa.4P &O 0K [[ T7 1 .Py#Qy#@_ tm.bA@Ry#M(#da#Sy#cd@n9@n9@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@kc@kc@kb@kb@n9@n9@n9@la@p_#/)#Ty#Uy#Vy#Wy#~Y@*! ha )n Nf J8 J8 Nf J8 J8 ja Ek Lb ja J8 J8 J8 J8 J8 Nf Of J8 J8 Nf Of ha I8 J8 J8 ~n _d fj J8 #r #r J8 J8 J8 '0 ~n {n S5 >c Ul J8 J8 J8 J8 J8 J8 ka :%.,x Xy#Yy#36@Zy#My#Q. Q& $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ %+ `@ #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y Vc.UV+|a@dy#ry#`y#-h ty#J8 !n '0 '0 J8 Of $J Vl Vl Mf :%.'0 J8 J8 J8 F- Vl Nf Nf Nf Nf F- ja >0 ~n ka J8 J8 Nf fj fj _~.5P xL =O Qf cv fi.w~ 3J z#B%..z#U #f1 := xP@M%#la@jc@jc@kc@n9@n9@kb@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@lc@kc@kb@n9@n9@n9@kc@G##cN@nM@Tv +V {-.U> a3 yL 77 ha Nf J8 J8 Nf Nf J8 J8 ja I8 Nf Nf Nf J8 J8 J8 Nf Of J8 J8 J8 Nf ia Ek ja J8 fj fj fj J8 Vl Vl F- J8 J8 J8 '0 >0 #r #r J8 J8 J8 J8 J8 J8 J8 J8 '0 >x +z#26@36@Zy#@z#7. 0@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ %+ #. 6. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y W1+-I@dy##z#$z#Y>@%z#J8 J8 J8 J8 J8 Of #r Vl >c ]O _d ~n J8 J8 J8 J8 J8 Of Of Nf J8 J8 ka >0 {n ka J8 Nf Of J8 J8 Nf Of Of Of Nf #r 6o Kv r3 *D 'Y &z#*z#=z#_v -z#&Y@qm@_(#g;##B@la@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@ma@ma@kc@kc@jc@C@#!l@[D@q$#;z#>z#zl#Xr 4M xv.-h Mf J8 J8 J8 J8 J8 Nf Of J8 J8 Nf Of Of Of Nf J8 J8 J8 Nf Of J8 J8 J8 J8 Mb Mb :d J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 ha 28@26@36@Zy#My#Q. 0@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ v* t. +e.-y#,z#'z#)z#4l@!z#J8 J8 J8 J8 J8 J8 J8 J8 F- ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- S5 S5 F- J8 J8 J8 J8 ja Ek Lb ja J8 J8 J8 I8 ]n c! .| E[ z;.~z#gk.D'.(k {z#]z#D{ }- rT@^z#Hn@n9@n9@ma@kc@lc@n9@kc@lc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@ma@>t@pt@kb@n9@lc@/z#p>#Y- (z#2b _z#.L@]M.%R t .Q,.'0 J8 J8 J8 J8 J8 J8 J8 J8 ja Ek Ek ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja ja J8 J8 J8 J8 Nf Of I8 :%.-Y -Y J8 J8 J8 F- ej ej F- J8 J8 J8 J8 J8 J8 !O 42.Sl :z#_0@c F- Nf J8 J8 J8 ja Ek Mb ja J8 J8 J8 J8 F- Vl f# Ap o7 0f.g' 1B FN.FT p5.3z#4z#,/#5z#6z#7z#R6#LA@kc@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@n9@n9@pt@2m@&p@>=#R;#*!#-z#7-.b=.~x#$^@!s@%m@&O >x ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 ja Ek Mb ja J8 J8 J8 J8 J8 J8 J8 Ul F- J8 J8 J8 J8 J8 J8 ka '0 Nf Of pW -Y _d >0 J8 J8 Nf F- ej 9L ja ka J8 J8 J8 J8 J8 ka k9.(/.8z#9z#0z#g5@^K+y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ R=.R=.y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ p{.]8+{f.}0@az#bz#cz#dz#ez#>0 Vl Vl ja >0 |[ 67 F- Nf J8 J8 J8 J8 Nf Nf Nf J8 ~n >0 S5 >c F- J8 F- Vl Nf Nf Nf J8 J8 J8 ja :d J8 J8 J8 J8 J8 Nf ha Lf 7%.Ww la Nf 0 _d S5 >c ]n Of J8 J8 J8 J8 $J $J Nf J8 -Y g` Ws -6 Vl J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 F- F- Nf Of J8 J8 J8 '0 >x 4$.Ep ;h 7# l~.2h rz#U~@sz#y..t@ tz#i/#uz#t!#vz#H(#-w@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@la@Xj@/)#CC@d^ ep wz#*4.uc 06 c! je ,r ke NM Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 ja ja J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 S5 9L Vl J8 J8 J8 J8 ka {n {n >0 J8 J8 F- >c -6 F- J8 Nf NM -Y _d h` }P ka J8 J8 J8 J8 ja '$ x' xz#yz#zz#Az#37@y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ y# yQ+ZU@Bz#Cz#Dz#g9 Ez#me F- F- J8 ka F- F- J8 J8 J8 J8 J8 F- ej ej F- J8 ka ka F- Vl #r Nf Nf J8 J8 F- 67 67 ]O ~n fj J8 J8 J8 Nf $J ej >c F- J8 J8 J8 J8 J8 Mf >h ,r ,r 7o _%.@t.v7.Fz#Gz#T0@uu :2 Hz#sN@Iz#^s#t!#LL@n9@n9@n9@n9@n9@n9@n9@n9@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@n9@kc@jc@Hn@n9@!l@Jz#Kz#Ob# ^#Lz#Mz#zZ ^t V> F- qs 7i ar.2P ka J8 J8 J8 J8 J8 J8 J8 Nf Of Of Of Lb Mb :d J8 J8 J8 Nf Of J8 J8 J8 ka j9./#.OM Of J8 [d [d ka 9L ej F- !n ka J8 F- F- Nf ha ia yS [P '0 '0 '0 J8 J8 J8 J8 J8 F- _O =$.Nz#Oz#Pz#Qz#Rz#y . $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ 0@ 0@ yQ+ZU@}z#Sz#Tz#g@.Uz#Of J8 J8 J8 J8 ka '0 [d J8 J8 J8 J8 F- fz fz F- J8 J8 J8 [d ka Of Nf J8 J8 !n ja >c -6 ]O _d fj J8 J8 Nf Nf $J 9L fz Ul J8 J8 Nf J8 J8 J8 Nf Of Of Of me >x ^d Vz#Mj fk@>i.Wz#:X Xz#Yz#Zz#+v@`z#SF@|;#$>#AR@dd@jc@n9@n9@n9@n9@n9@kb@de@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kb@n9@kc@@N@[D@:E@b!#8+ 5% A#.A#BM.!q e!.rs 77 fj J8 ka }P }P ka J8 J8 J8 J8 J8 J8 J8 Nf Of Of Of Lb Mb :d J8 J8 Nf NM pW J8 J8 Nf Nf `].[d ga nm.Vl F- #r $J S5 I8 NM me os $J J8 ka Nf I8 Lb 0 9L -6 ja fj fj J8 J8 J8 Nf Nf ]O ]O ka J8 Nf Nf Nf J8 J8 J8 Nf Of NM >x Ib Ep j* 4o 7H cl a..iz 0d ~z#*A#=A#}c.-A#5S .R ;A#!|#[D@!l@C@#jc@zs@3m@pa@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@jc@m9@jc@ka@D@#>A#,C ,A##'#'A#)A#z;.T7 Nb ,d 84 ^n ~n J8 1G !O !O J8 Nf Nf Nf J8 J8 J8 Nf Nf Nf Nf Nf ja :d :d J8 Nf NM :%.-Y '0 5o ,k.yn@1|.!A#~A#{A#c# 6$.j[.]A#'0 #/.5P X'@^A#,k.F- }P ka ja Lb 0 ~n ka J8 #r W1#/A#(A#_A#:A#zy#y . $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ Q& 8. u. 0 J8 J8 J8 J8 J8 -Y _d ~n J8 Of NM :%.{n ka J8 J8 J8 -Y {n Ek >c Vl J8 J8 J8 J8 J8 J8 J8 -Y _d ~n J8 Of Of Nf J8 J8 J8 Nf Of J8 J8 Nf Of -Y **.^n ;h )d *$.!t ^y U{.NN /F.2A#W@.BJ.3A#4A#5A#6A#Nd#7A#T1#D0#7H@-A@n9@n9@n9@n9@jc@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@-A@n9@n9@la@!l@6w@w'#8A#9A#X. 0A#aA#z<..x.7# Z8 ;h '0 J8 !n ~n _d ka J8 J8 J8 J8 J8 Nf Of J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 Of pW -Y _d ~n @R ZX 5$ bA#cA#dA#eA#fA#gA#hA#|O@Lv As iA#{2 k& jA#b# ^W.[P ja yS Wh.MM J8 J8 J8 J8 !n ~n _d ka J8 Nf W!@@x#kA#Ly#Zy#^K+y y $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ Q. t. lA#mA#nA#oA#pA#oR gI+I8 J8 J8 J8 J8 S5 S5 #r Of J8 J8 J8 J8 ka ka J8 J8 J8 #r S5 S5 F- J8 J8 J8 J8 ka J8 F- Nf Of Of Of J8 J8 J8 J8 ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 '0 ]O fe =O N2 ns ;0 0E jP '#.<' 3k pP qA#T0@rA#sA#tA#uA#vA#wA#xA#n9@n9@n9@n9@n9@la@m9@la@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@kc@jc@n9@n9@n9@n9@eD@Iu@yA#u@ zA#AA#w$@Gi E7 4! L+.F- Lf 77 J8 Nf Nf Nf ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 F- 67 67 ]O -Y _~.Of Of Of NM NM ,0 A+ BA#CA#DA#EA#FA#_+.GA#HA#IA#JA#KA#:~ LA#MA#NA#OA#hN PA##/.Nf >0 Sl ka J8 J8 J8 J8 J8 ka ka J8 J8 Of xL QA#RA#SA#TA#@z#0@ . $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ #. #. O $+ $+ ", " O %+ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ /8+p{.UA#VA#WA#XA#YA#,3 *>#Mf ka J8 Nf J8 67 ej #r NM #r F- J8 J8 J8 J8 J8 J8 J8 F- Vl >c F- J8 F- F- J8 J8 [d J8 Nf Of NM NM #r F- J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 $J Of Of I8 hH RL Kf rs 0f.d6 !m.E~ d+.Df.[g pn.PC ZA#`A#3h#,w@({#c ]O -Y pW _~.Of Of Nf '0 af.@B##B#$B#%B#&B#*B#=B#-B#;B#>B#,B#'B#)B#!B#~B#{B#]B#^B#/B#2=.ja >0 -Y J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf qs (B#_B#:B#0 :%.S5 67 Ul J8 Nf Nf Nf J8 J8 J8 F- 67 J8 J8 Vl Vl I8 ~n fj J8 J8 '0 :%.:%.S5 67 Ul J8 Nf Nf Nf J8 J8 J8 J8 J8 ~n ~n '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of )n }d Ww *h Rt.N2 4X :W >d )G CH |l @-.mh.wX.T.#1B#2B#3B#4B#5B#6B#gc@la@jc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@n9@n9@n9@n9@kc@kc@kc@kc@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@n9@n9@n9@n9@n9@kc@la@aI@6M@,##1+ xi 7B#!X 8B#-A#0m NW *L Q: j>.Kb -h I8 Nf Nf Ek Ek I8 Of Nf J8 J8 '0 >0 >0 S5 Vl F- Nf J8 J8 J8 J8 J8 J8 F- Vl J8 fj -Y -Y Of Of >0 }Z &*.R' 9B#0B#aB#bB#cB#dB#eB#5v.fB#gB#hB#iB#jB#kB#lB#mB#nB# ^.^n yS MM fj J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf #r oB#pB#qB#rB#sB#Gp@fo+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ O %+ %+ $+ $+ ", "6. 6. #. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ 6. p{.:8+sL@}A#tB#uB#vB#<2@Q,.>0 J8 Nf Of J8 !n ~n {n S5 >c 67 J8 Of Of Nf J8 J8 J8 J8 J8 J8 F- 67 >c ]O _d ~n J8 J8 !n ~n {n S5 >c 67 J8 Of Of Nf J8 J8 J8 J8 J8 -Y _d ~n J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 Nf Of NM me ^~@~Y 84 CT `l.n[.q1@f].wB#A'.Y##fe.xB#yB#zB#Z!#a$#hc@9A@fc@fc@z)#fc@6w@gc@$j@m9@m9@m9@la@kc@n9@n9@n9@n9@n9@n9@kb@n9@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@kb@kc@jc@la@)l@v`@AR@AB#BB#'C@b* lw CB#DB#^*.&&.|d )6.Qs yr >h (d _d ~n J8 Of I8 Ek Mb I8 Nf Nf J8 J8 !n ~n {n |[ ej ]n Of J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >0 {n NM pW wk.gY.EB#dQ FB#GB#HB#IB#JB#R qs /D.KB#LB#@9 MB#NB#OB#PB#QB#RB#SB#g# /=.MM J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ka ka F- TB#uU.UB#VB#WB#XB# o#$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "`@ `@ %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ R=.R=.n)+$+ $+ $+ $+ $+ $+ |~ ]8+^^.V1+sL@}A#YB#ZB#`B#SB#:C ja J8 J8 J8 J8 J8 J8 ka F- F- J8 J8 Of ha ia PM F- J8 J8 J8 Nf Nf F- F- ka ka J8 J8 J8 J8 ka ka F- F- J8 J8 Of ha ia PM F- J8 J8 J8 ka ka J8 J8 ~n ~n fj J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 -Y (d ,x ]d ^_.^_.oe me /[. C#(i.>2..C#|w@+C#lg.e4@R|@@C##C#$C#O|#%C#2; <5.AY &C#qm@z)#c!#%p@pm@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@n9@n9@n9@n9@n9@n9@n9@n9@n9@*C#>C@j&#=C#gE@i' wj.C#,C#'C#)C#!C#N3.~C#{C#]C#^C#|/ /C#(C#_C#$B#:C#0 >0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja Ek Lb nL+[C#}C#|C#}g@ee+Gi+$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ R=.R=.y $+ $+ $+ $+ $+ $+ Q& E1+u. V1+sL@}A#YB#1C#2C#Xu#Ha Vl J8 J8 J8 J8 J8 J8 [d J8 J8 J8 J8 Nf I8 Ek Mb ja ka F- F- Nf Of Nf J8 J8 J8 J8 !n J8 J8 J8 J8 ka ka J8 F- Nf I8 Ek Mb ja ka F- F- J8 J8 J8 J8 ~n _d '0 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ~n -Y NM Of $r $r $J Of Of me >x os ga &- [q JS.3C#4C#j_@|h.p7. 5.w4 5C#cq p%#l(.xZ n, AY h7.{@ TV@|W@Kd#1P@6C#7C#8C#:(#9C#)*#7-#Q*#)l@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@ma@ma@ma@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@n9@n9@n9@n9@n9@n9@m9@0C#kB@cN@kB@6E@aC#bC#/'#cC#Ym. >@~k 6c dC#eC#fC#4! ^d C M^.4o I8 '0 J8 J8 Nf ~n ~n '0 J8 J8 J8 J8 ja J8 J8 F- F- J8 J8 Nf Of J8 J8 Nf Of Lb Mb ja J8 ja ja J8 J8 Nf $J 7o $r 7o {j._m.{w.]k#gC#D;.'- hC#iC#jC#kC#lC#mC#nC#oC#pC#{s@qC#rC#sC#tC#uC#}m.vC#b! ja Nf Nf 4o sH sH 4o J8 J8 J8 J8 ja 3o (=.Ts#wC#xC#f'#yC#0 >0 S5 ej F- Nf Nf J8 J8 '0 >0 ~n ka J8 J8 J8 ~n >0 S5 ej #r J8 ja MM >0 >0 S5 >c F- J8 J8 J8 fj '0 '0 J8 J8 J8 J8 J8 J8 Nf Nf Nf J8 J8 J8 J8 fj fj ne Nf $J #r Nf Nf ha ke Ib 1K Z*.Mf 6# 73 vE 3o.F; >f Fb CC#1y#f!@xM.-,.gu DC#EC#MB.FC#GC#&0.7% J-.HC#IC#JC#KC#m8.m8.=F f7 LC#Xx@MC#9l@la@jc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@de@lb@na@3m@n9@lc@lc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@n9@n9@kc@ma@jc@la@jc@1%#NC#Sk V@ K$ C)@)9 OC#PC##B {V.AJ.W< Kd dO jG Me 4i 4$.je )n >h >h I8 Nf Nf Nf fj '0 '0 J8 J8 ja Ek yS '0 Nf Vl 67 F- Nf Nf Of J8 J8 J8 Nf ja ja J8 J8 s_.s_.I8 Nf Nf Nf #r ]n $J pW t>@pa.T'@~W.Y*.QC#RC#SC#TC#UC#VC#WC#XC#YC#ZC#`C# D#51..D#+D#@D# G.#D#$D#6$.Of Of TB ss +C sH J8 J8 J8 J8 ka q}.X4.%D#&D#*D#f'#2n@Yp+]g.`@ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ #. 6W.sL@}A#YB#=D#tH -D#Mf '0 J8 J8 J8 J8 !n ~n _d ka J8 J8 J8 J8 J8 J8 J8 -Y {n Ws -6 Vl J8 J8 J8 J8 !n ~n _d ka J8 J8 J8 -Y {n Ws -6 Vl J8 J8 J8 -Y {n Ws -6 Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 Nf Of J8 J8 J8 J8 J8 J8 J8 ka Of Of Nf J8 J8 J8 J8 J8 -Y {n T5 o7 +G =h DE fe [ .Z> Gb 4F.Co.NN ~E.aS.;D#>D#,D#'D#)D#Wh@!D#~D#{D#]D#^D#:C.C_./D#(D#_D#ex &*#ec@B[#>=#w}#q$#jR@:D#B-#1=#+I@$D@l&#l&#M%#c F- J8 Nf Of J8 J8 J8 J8 J8 J8 J8 J8 Mb Lb I8 Of J8 J8 J8 J8 Of Of Of $J pa.Do.&,.8D#9D#0D#aD#bD#=, cD#dD#eD#z~.s!@fD#gD#hD#iD#jD#kD#lD#fH.2#.GV.me 6A +C x,.k* J8 J8 J8 J8 ka }Z !,.%D#mD#*D#f'#nD#]8+4)@#. %+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ `@ #. %c+z# oD#YB#pD#L8 qD#Q,.>0 J8 J8 J8 J8 J8 ka ka J8 J8 Nf Of J8 J8 J8 J8 ka ka F- Vl #r Nf Nf J8 J8 J8 ka ka J8 J8 J8 J8 ka ka F- Vl #r Nf Nf J8 ka ka F- Vl #r Nf Nf J8 J8 J8 J8 J8 J8 ka ~n :%.S5 Vl F- J8 J8 J8 J8 J8 J8 ja s_.Wh.I8 Of Of Of J8 J8 J8 J8 J8 ka I8 #u 8Q fe ke ,x $J } .g6 0y.0r.O,.1&.aw.X*.rD#%f.sD#M,.tD#- .uD#vD#wD#xD#yD#zD#AD#{m BD#Hr@CD#.u.DD#lW.v4.`~ ED#FD#GD#0n 34.Y! HD#ID#AO JD#KD#LD#MD#>B@ND#OD#K=#_E@kb@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@kc@lc@kc@kc@kc@kc@kc@kc@kc@kc@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@n9@Jo@PD#QD#->.RD#SD#TD#UD#VD#WD#'D.|X !( sM.Wy#.j CU XD#YD#ZD#($.ka K~.T5 #u J8 J8 J8 J8 J8 J8 J8 J8 J8 F- >c >c Ul J8 J8 J8 ja ja Of NM Mf ]O ka J8 J8 J8 J8 J8 Nf Of Ek s_.:d J8 ja ja Nf Of J8 J8 J8 J8 Of $J ]n 9L *r QU.`D# E#.E#]|@+E#R} 9)@m}@0[#rq.Q8.F2.Hb @E##E#$E#<> 2&.,; 4m 67 Nf Nf 4o sH h).sv J8 J8 J8 J8 J8 ka ]O %E#&E#*E#=E#-E#]8+M'@%+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ %+ 9@ p{.6W.NR@;E#>E#,E#WK 'E#Q,.:%.J8 J8 J8 J8 J8 F- Ul J8 Nf Nf Of F- F- J8 J8 Ul F- J8 J8 Nf Of #r F- J8 J8 J8 J8 J8 J8 J8 J8 Ul F- J8 J8 Nf Of Nf J8 J8 J8 J8 J8 Nf Nf ja ja J8 J8 J8 J8 J8 '0 ~n {n S5 >c Ul J8 J8 J8 J8 J8 J8 ja s_.Mb ha Of Of Of J8 J8 J8 J8 J8 J8 F- F- ja I8 ha $J $J ha os qs os )n Jf d:.iF+Kf ;3 F[ 6Q C( )E#!E#~E##B.,u |x 0 J8 J8 J8 J8 F- Vl >c F- J8 Nf Nf Vl Vl F- J8 67 67 F- J8 Nf #r ]n @r F- J8 J8 J8 J8 J8 J8 J8 67 67 F- J8 Nf Nf Nf J8 J8 J8 J8 J8 Nf ja Ek 3o ja J8 J8 J8 Nf Nf '0 >0 F- Ul Ul J8 J8 J8 J8 J8 Nf Nf ja ja Nf Of Of Nf J8 J8 J8 J8 Nf #r Vl Vl >0 >0 I8 ej ha qs t}.5X 84 Ep zx.^,.va.8g.!d hH r3 D3.xE#yE#3o.R@G##$$#ja@!l@BC@BC@BC@ja@+F#$$#!l@!l@$j@G##$$#$$#$$#$$#$$#ln@m9@la@la@la@jc@ma@zs@zs@jc@kc@zs@zs@jc@eD@zs@zs@jc@ma@zs@zs@jc@jc@jc@la@la@zs@la@la@jc@kc@jc@la@la@la@m9@-x@/)#>=#6x@@}#@F#4D.#F#$F#%F#&F#*F#=F#[j -F#;F#>F#,F#PS 'F#)F#4:#!F#~F#nH@J!@&u V8.-h ~d }d 1K ~Y /d NM >x >x OM pW J8 J8 J8 J8 J8 J8 J8 J8 s_.s_.ja J8 MM ]O '0 Nf Nf Nf J8 J8 Of Of NM ~n J8 J8 J8 J8 J8 J8 Nf $J 9L PM ]O fj [d J8 J8 Nf ~n ~n '0 Nf Of I8 Ws eQ {F#~l ]F#^F#/F#jO.oe 4$.)n os 2$.lS.w~@F#.`].'0 5$.2-.7i 9L NM _~.ne J8 J8 ka [P }Z ka ka [P }Z J8 [d -Y >x (F#&D#*D#l~#_F#'p#vi+`@ %+ y# y# $+ 9@ 9@ %+ y# :F#c Ul J8 67 >c Vl J8 J8 F- @r ps F- J8 J8 J8 J8 J8 J8 J8 67 >c Vl J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 ja yS Wh.ja J8 J8 J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 Of Of Nf J8 Nf Nf Nf J8 J8 J8 J8 J8 Of $J Vl >c >0 g` Ek -6 $J #r ej -6 Vl Of Of Of J8 J8 J8 I8 _O Wl qQ.4F#NM 1h.Jf i].Gp U6.5F#{M@7).xx.va.%D#6F#7F#8F#af ;|.OC 0| Gg.5C#Y##Wy 9F#0F#/L.aF#>R w/@cA c[#D #bF#YZ@cF#X%#dF#eF#fF#Ks#D)@gF#hF#iF#TF EA. ~ w/ nM@jF#X>#kF#]&#lF#v'#nB@w~#S$#mF#F-#ec@/'#mB@k=#6e#6e#6e#nF#oF#b!#O*#4T@B[#eY@w}#v*#pF#xl#i=#:D#(&#(&#i=#g%#qF#rF#p$#ES@:(#fa#bZ@jR@6M@6E@sF#bf@tF#mm@@B@R6#5s@vQ@,*#B[#uF# '#3+.u@ vF#2 rq.wF#xF#yF#zF#AF#BF#CF#dR.t.#dV cb DF#KI EF#FF# %.*(@ [ s,.rK pe Lf [d [d J8 Of 3/.4x Ee 3/.Of 5P $J J8 J8 J8 J8 J8 J8 J8 J8 Mb Mb :d J8 -Y _d -Y Of Of Of Nf J8 Of Of Nf J8 J8 J8 J8 J8 J8 J8 Nf Of Vl 9L ]O _d ka J8 J8 '0 _d _d -Y Of Of ha :C /=.GF#I'.HF#IF#le /d dj ps 7o Of Of Of 7o 7o #r '0 Nf F- ej m/ 7o Of Nf J8 J8 !n h` h` ka J8 [P |Z ja ja g` /#.JF#mD#*D#KF#LF#MF#yL+py#0@ . $+ @. @. `@ $+ 58@%5+%5+ee+$+ 58@. |~ O-.0@ y 0@ 0>.NF#NF#Yp+p{.p{.Q. %+ $+ %+ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ Q& 8. 3].u. h5@}F#|F#1F#OF#PF#77 I8 J8 Nf Of J8 J8 #r ]n F- !n ~n -Y ka F- J8 J8 ]O ]O '0 J8 J8 J8 F- F- J8 J8 J8 J8 Nf Of Of Of Mf ]O '0 J8 J8 J8 J8 J8 ~n ~n fj J8 J8 J8 '0 '0 Of Nf Nf J8 J8 J8 J8 J8 Nf Of Of Of Lb Mb :d J8 J8 J8 J8 J8 >c >c Ul J8 J8 :d s_.3o '0 Of #r F- ka ka J8 F- J8 J8 F- Vl J8 J8 J8 J8 J8 J8 J8 J8 I8 Mf c!.!Y.os qs dj -h Ib 1K CT Zy 5w.j* h<.1D kF++(@4++DS. v.*! Ta E; :' 'k JS.jv lW zn QF#cO RF#SF#)2.TF#*I m].`n.2E UF#N[.VF#WF#XF#YF#ZF#)1.KK.mX `F# G#xe ,j@.G#ei@+G#lL@3&#Kt Kt @G#f5.#G#$G#%G#&G#LM.N9.N9.M3 $6.*G#=G#-G#;G#>G#i`@,G#}1 'G#)G#!G#~G#{G#]G#^G#/G#(G#_G#:G#.CM.E[.(D Eb 6: jl.mm jG#rA }[ Kv GE.0K fe ha Nf J8 J8 J8 F- i! i! Nf 4P U+.ps #r J8 J8 J8 J8 J8 Nf Of ha I8 J8 J8 J8 ka '0 Of Of Of Nf J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 J8 >0 Mf 8Q :C o'.BB _d hl.#/._d (d hb.nA.pa.os 77 ia 77 /d kG#I~@ZY.Jy &O ^d Bp ^~@dj lG#mG#t}.6=@{O OM >x )n yr g# 8Q Ek wL &G.3Y@nG#Do.OZ.@r @*.g# Aj eQ Ck d5@/f@oG#pG#qG#1S+]g.JL+Wc..e.rG#sG#}9@wj@tz+Gi+mm+Vc.Gg Vc.tG#Q%+BY.uG#yL+vG#wG#xG#yG#>[+zG#,K+8W.:8+nm+y 9@ ", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ Q& t. AG#u. QD@}F#BG#CG#;J@3F#77 ja J8 Nf Of J8 J8 Nf Of J8 ka ~n _d ka J8 J8 J8 ~n >0 I8 F- ka ka J8 J8 J8 J8 J8 J8 Of Of Of Of -Y g` I8 F- J8 Nf J8 J8 ~n P,.fj J8 F- #r $J $J NM ne 6A sH 4o J8 J8 J8 Nf Of Of Of Mb Mb ja J8 J8 J8 J8 J8 >c >c ja ka F- S5 Ws }$ ha Of Nf J8 J8 J8 Nf Nf F- F- J8 J8 J8 J8 J8 J8 J8 J8 !n ka Ul F- Nf Of Of Nf #r #r Of Of I8 F- [[ 1h.#u Mf ha -Y x)@ N nA.os /d ,x ,h #u ~` [ .I8 >h Wl ,r *O 0K +#.M^.4X 6# 'G F[ ~k DG#EG#FG#GG#HG#IG#JG#KG#{9.LG#MG#M3 Vd.XQ.{9.Ev BG aF@8J@8J@BX NG#y'#OG#PG#QG#RG#]##Rb JM YH@SG#TG#UG#VG#-H@WG#dF@dF@nz.XG#YG#ZG#`G#D{. H#.H#+H#@H##H#$H#%H#&H#){.*H#=K.;o@=H#-H#py.LY E.;H#>H#>H#cF@dF@,H#0a. Z 'H#OG#Vm@)H#!H#oP <)@eF./O.)B n` gQ E2.m/ _*.T5 77 g# Ap f# m/ L} rs ]n ne Of Of Nf J8 J8 ja Ek Lb ha |(.nm.nR 5o F- J8 J8 J8 Nf Of Of Of Nf Nf J8 J8 4o sH sH ga $J '0 !n J8 J8 F- 5o Hb sH 4o J8 F- F- J8 J8 >0 >0 I8 ej 8# ]q ej ha #u #r 0L dW.d!.4P 4++~H#>0 >0 _~.2,.{H#]H#e, .r@,M@^H#0` ,Y i# /H#(H#_H#O#.~k.$ +y$.3/.]G :H#:H#vv.gs.t7.:%.s!@F*+R=@3#.i! }Z ;.j:.+rQ+{=#fH#gH#<8+hH#iH#jH#kH#", "$+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ $+ Q& t. AG#u. QD@}F#BG#lH#mH#nH#77 I8 J8 Nf Nf J8 J8 Nf Nf J8 J8 ka ~n J8 J8 Nf Nf ne '0 ]n @r ]O >0 '0 Nf J8 J8 Nf Nf Of Of Of Nf fj '0 #u @r #r Nf Nf J8 !n fj fj Nf ]n $r $r 7o Mf ne DU 2k 3/.Of Nf Nf Nf Nf Nf Nf ja ja J8 J8 ka J8 J8 J8 F- I8 :%.>0 #u @r Ha g# wL Of Of Nf J8 J8 Nf Of 7o ]n #r Nf Of Nf J8 J8 J8 '0 ~n >0 |[ 67 F- Nf Nf #r ]n @r #r J8 67 L#.O#.2&.Ul Lb BB fj (#.(#.me ]d J..V-.@A 7r.*h Rj i]..G@:q.Yt Eq.Qm@WI.5w.=r ~d =O #r 2K oH#+;#pH#qH#rH#sH#tH#uH#vH#ig.wH#xH#n! lr 3u ~!.yH#9J dK.zH#9-.AH#BH#CH#o}@ap 'w (k (k BQ D<..E DH#EH#FH#lJ GH#&t.Qc.0| u[@HH#IH#o` hg.JH#KH#LH#MH#BE#'u m].+E ;x.NH#j6#J #wV.OH#}j.vO Hp.Zp.hQ PH#QH#gg.Ab (z.=/@De#&W@RH#SH#NG.TH#eu@mJ +z )#.x[.ss *O Y@.8g.U6.Zy >r }d @r e!.ps rs wL ne Of Of Nf J8 J8 ka ]O Mf :%.&N s,.O#.[= 67 F- Nf Nf Of Of Of Nf Nf Nf Nf Of TB ss 2k e!.7o Mf ~n '0 $J ]n 0f.6x +C z$.Nf Vl 67 F- Nf ]O Ul g9 UH#VH#WH#XH#A>.YH#M`.ZH#`H#,q.W{ s,. I#57.wS m[@tm..I#+I#@I#:> E* #I#$I#%I#&I#O+ *I#=I#-I#;I#>I#,I#'I#kL.EJ.rz.t3.)I#o& !I#E. ~I#{I#m +W3.}h.]I#1G C$@^I#/I#(I#_I#.q+:I#h Mf J8 J8 ka J8 F- F- #r Nf J8 J8 J8 J8 #r $J $J Nf #r @r GE.Mf -Y pW Of Nf #r $J 4P |(.|(.Nf J8 J8 F- $r GE.d!.&N Nf Nf F- #r $J 4P 8h.Ws.ps &O ,0 ne ss _}.3/.$J os Of #r F- F- Nf Nf Nf Nf J8 5o 5o 5o Nf Of pa.nA.(d )n ps Ws.8h.$J 5P 5P Of Nf &N &N d!.$r ps 7o 5P 5P 5P Of Nf #r ha :%.{n 9L ej F- Nf J8 #r $r ps ]n ja S5 j 4U 2k K'.}$ )n Do.O_@Z).4&.os OM {n o}./=.8Q os ;w.:%.7o 8h.ha :%.:%.4P os os os le ]d ~Y 4$.Ep Ep ~Y ^.pI#qI#QY.h<.=G =s.5h 5h -%.rI#rI#rI#=G !M@:q i]#sI#tI#=G 9g.w' Wv Wv Wv eN ;_ 0f |/ uI#Mu cv 7r [[ *- w' >_ G% eN =$.GE.7o ~d 7i (E ;b ]u Y[ >q J] QU@vI#wI#5*.(s D[ P1 8 oR >` n'@xI#on.hz 2!.yI#k=+CW.zI#=G 6x.6x.)e+-%.CT :i.ji.os d!.ga ga Nf '0 6A +C ;` nm.##.qs 5P 5P 5P Of Nf #r #r Of 5P 5P Do.g@._}.[= ej wL 5P ha ha $J Of Nf #r #r 4P 5P y$.g@.Z).,k.&O )n (d me 4P ##.8h.4U 3&.z$.os Ga ej 7o 4P dj ^6#AI#BI#CI#R&@DI#EI#FI#GI#HI#II#JI#KI#LI#D7 k!.MI#NI#OI#PI#QI#RI#SI#TI#UI#VI#WI#XI#YI#ZI#G&@`I# J#.J#+J#@J##J#$J#%J#&J#*J#mc#=J#-J#;J#>J#,J#'J#)J#!J#~J#{J#]J#^J#/J#(J#_J#:J#@W1#W!@4P $J $J ##.Y>@n'@^d /d xL m;@8)@s,.4&.xL W!@2Y.@W1#W!@W!@le os +#.vJ#vJ#wJ#le W!@G#.^~@^~@ji.PP.6!@xJ#iS.G#.^~@,x /d d!.8)@/)@.r@~W.V+.yJ#yJ#W!@W!@-G Y>@V+.^d /d W1#W1#-G W!@W!@-G W1#W1#-G -G W1#W1#iS.iS.U+.Pf xL -G wJ#)&@sJ#Y>@xL le ,x ,h ~9.7%.ke 4P 6!@/)@1h.rs n'@0>@T-@2Y.yJ#2Y.u_@7##{,#{,#{,#{,#l%@zJ#,++l%@Y=#h<.n-#NK.NK.Rt.~a.~s#%D#@3@0>@})@AJ#]%+n-#h<.kP.kP.~s#~s#:Z.*h ~l.:++uJ#BJ#-G T-@KE i%@|*@VI.$G T% ~W.)&@})@oe r8.Xl 77 4&.##.V+.W1#iS.oc.0;.qF CJ#a! K'.F- 6o 4&.##.fW.DJ#]Y EJ#[$@n-#mL+]%+mL+h<.h<.h<.n-#mL+{,#7##FJ#GJ#HJ#HJ#|:@le 4P $J d!.iS.PP.!-@h~@yJ#yJ#W!@W!@-G Y>@Y>@-G yJ#yJ#-G @#.)&@})@W1#-G 2Y.,d ,d om.W!@W!@W1#Y>@AJ#!-@-G @#.8h.^d ]d Xw.[i.!-@h~@h~@W1#BJ#BJ#le Bp om.om.xL 2Y.'++IJ#JJ#KJ#LJ#MJ#NJ#OJ#PJ#QJ#RJ#SJ#TJ#UJ#VJ#WJ#XJ#YJ#ZJ#`J# K#.K#+K#@K##K#$K#%K#&K#*K#=K#-K#NJ#;K#>K#,K#'K#)K#!K#~K#{K#]K#^K#/K#(K#_K#:K#.|g@DK#EK#FK#GI GK#@#.ej |[ `*.k9.ka #r 8h.ps 7o $J #r #r #r ]n @r $r Mf :%.NM &N 4x 5x _k.I8 $J qs rs bt 4U +C ns BB ]O I8 #r &N 4U +C ns BB dj L} L} bt O#.4x 1G (d ha $J $r ps {{ ej ]O :%._O ps $r $J $J Of Nf 5o HK#IK#,k.NM Of Of ha $J os &N g@._}.3/.ha ,0 BB Mf 4o 4x Z).[= ej wL $J $J $J $J $J ps ps 7o $J $J $J $J $J $J $J $J $J $J $J $J $J $J ha ha $J $J 7o _O #g #g $r 7o $J OM BB Lb eQ Lf &N g@.Z).[= Ap T0 ps 7o Of Of ha 4P 4P 4P 4P 4P os os qs os os ha ha 4P $J #r F- f# T0 L} ps #R g@.3/.os ha ha os qs rs H#.#u I8 H#.rs &O qs qs qs ha ha 4P wL '$ v& 2&.4x Hb ]O !,.k9.ia #u #u I8 $J os os qs rs Kf @h (*.8Q I8 I8 #u 9L Ap _O qs qs 7o os os os ha ha ha ha $J 4P os os d!.IK#IK#JK#ha #r #r I8 $J $J $J $J $J $J $J $J $J ps ps 7o $J $J 7o $r $r $J Of Of ha eQ eQ ia $J $J 7o $r $r 7o 7o _O H#.BB Mf _O ps 7o $J $J $J $J ha Mf {n NM Of Of 4P h@@KK#LK#MK#NK#OK#PK#QK#RK#SK#TK#UK#VK#WK#XK#YK#ZK#`K# L#.L#+L#@L##L#$L#%L#&L#*L#=L#-L#;L#>L#,L#'L#)L#!L#~L#{L#]L#^L#/L#(L#_L#:L#M#ZL#`L#&M#;M#TL#UL#&M#rW.OL#OL#OL#OL#OL#,M#,M#WL#OL#OL#OL#OL#OL#OL#OL#OL#OL#OL#OL#OL#OL#ZL#ZL#OL#OL#OL#WL#+M#@M#,M#WL#WL#OL#ZL#VL#`L#'M#+M#QL#;M#TL#)M#'M#!M#XL# M# M#rW.OL#OL#OL#OL#OL#OL#OL##~##~##~#ZL#ZL#OL#OL#rW.rW.%M#~M#XL#{M#XL#]M#]M#QL#ZL#VL#rW.OL#OL#WL#PL#PL#rW.WL#+M#^M#/M#(M##~#ZL#ZL#OL#PL#`L#'M#UL#]M#&M#VL#_M#:M##~##~#`L#rW.M#ZL#RL#SL#*M#NL#7M#8M#9M#0M#aM#bM#cM#dM#eM#fM#gM#hM#iM#jM#kM#lM#mM#nM#oM#pM#qM#rM#sM#tM#uM#dM#vM#wM#xM#yM#zM#AM#BM#CM#DM#EM#FM#GM#HM#IM#JM#KM#LM#MM#NM#OM#PM#QM#mM#RM#SM#TM#UM#VM#WM#XM#YM#ZM#`M# N#.N#+N#@N##N#$N#%N#&N#*N#=N#-N#;N#>N#,N#'N#)N#!N#~N#{N#]N#^N#/N#(N#_N#:N#O#,O#'O#)O#!O#~O#{O#]O#^O#/O#(O#$q+ZT.x+ _O#:O#B$#x,#n@#P#,P#'P#)P#!P#~P#pO#{P#]P#^P#/P#(P#_P#:P#.^8+^8+jS R=.y "}; marionnet-0.90.6+bzr434.orig/share/images/logo.paris13.png0000600000175000017500000000573712167200764022074 0ustar lucaslucasPNG  IHDR%!PLTEJJZZZZzrzr88IzrjbQAr漼088YYR A80I0)cZZzrrż 0(rjI9sIArccs޵QQj0(I81kQIzYQzŵŽŃzA8QBBRbYzbZ{JBRIBZYYbYYj(!9))9A1cA1kbYjbYrjc{kk{QIrQQrzzzzŴ80Q80YYQbYQj   (攌sk{ss{!!1!!90(Q00Q0(Y00Y( A((A( I((I((rjrrA9kA9sIAjIIjkcskks֬QIbQQb0(A00A8)c81cw> pHYsHHFk>IDATXõWs~jZɆ8xC'",)Y3H*rg텪nLB6MgzZ$+gEzdғ3k *c<={n+ﳳg=AaOB2ư!F TJdv ~P~JMJ#D<'YY)6~!~fY̮ cn wjŷHdƆf S]lDBݘ<GJJ' 9m3Y R7iܥl \]U  @$FZ Jk2ţR6@l.t.5|n %ۄ)WpӂHp]]kabr e,t# T! f$4 pYwo Ёt#ԣ Mΐp4-!tl?i<Քшp H%tr1/ٱ00rGZiЙUR(~\2'I\İx'd==Y͹t!@U]9(fQV.n80oPgc Urp``3y,o9ͅӜٷ[ʓ8R ;dV(EeH̪ U g EYadla9ٶ=Y?H3ҍVt`Z[V>k-֍De"CIB.snúd(͡|vz#b0N;4tD*765H&,ZDEbHb5\^+2/W: d(NءH >|P]LÆo:v>0xR+o"^x'4UgNw-7`BX"njP)7?9vlcC']d ;,U󘲣,bh> }($:(s0Hhqv RYO#Ŋ3)aaQ,]q?AܱbbX~0!#G>>xăN{|bb؟vGC} ?12$vuv'غ~H{ӑv BMkΎ{)qv}C3nvFGa6`k]րf\41xZ2W*GtnťR$-%r! Fj~d1O4݂[p踣BS\OGv\9 u!W3:z>5a}#l~)F8W[po;l]Iiخ{[#G(5[ǔ! #L#N==*})N:gpN?:CZx\ӣTW2ep{= '(u5#PrΑq*R2F |gKy}<& H\=4{:$z]Ưt)pq?5@jےxՎV3\vm8. iAeY!>PC?j[u@h -Sk2V xٶHb^nh@y[Ң6NcLcU/i!{㰒L-{ѯeeqmY!6?;,{߲IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.med.png0000600000175000017500000000541112167200764024025 0ustar lucaslucasPNG  IHDR**[sRGBbKGD pHYs  tIME IDATXõ{PT .,/!KTPQT4>cqI:ژi38$m3`4t2L644V!k|H`MRþOY͝U@ep>] q|}9,`ioom;&Uˎ,37v$+Έ"fHH $d$%k}gqix4/쟑5}>ZH ni:wfM^-U`j7Hii-%[d_$ 7y͸a:k>dC wܠFɬ]Z$IȲW%d125'{Cu4H_hki}D+C5V$Nw9hߍE/>,hPԌrgz~#i7ZJmTtJQ5_tEX޿@G}GrQPVUjD+"Pvt\5eAiO*c-!]r~ZSȔ+OgjCA^t//8ș:gN#ZNpxے'fr["a C}E,IC^5og&<}8\8ҷzGȿ'Ts4NaiRMNVin+` !Dq\M4yvWC,JG  aܕP߸i6JmڬT L \@5V[6j5o( xOhī/DD3vbГh2bR 4oz8z&GpоkT<q\€%+F1:@'[uAaX.:} 4|Eu &B .B`,F-;Hǎ,d1pMiȲAOW %&N4'c,[FF];?/IGւ l_j!8? ?7 SO^ B6!$ȰhF|Y`uD|@D:u"ZN񖍌K;#<;8٣E5괼ٚܔ"AG܅:lE}G͛w^nf=l+,y`-@G29sBl w{%)2♑jhR:w%fK<fK!o$"`+mH;W;Ӻ!Bc2;`aGyr3׾JL;Vu:WkI#.BM2@n{uj4`ĴD/(#$NGnlf߻*{I2fͫEEB%,(կ5nb$~!0굯1h#!)5֌i˯o;?k>1 N>1-S9 )]n%E8x́}'3>,$6@ˊ"/=CVAvE0EGq5LIꖏ`Lg|ҟ?~$sāe/h9{d Ssܧe`/'t0'MTd4ˊ򩪦 \pjDGmթ9nw]['ʰ=&O FtGB90WGxKHAm|Z:np)dYMAcڕzAi._2ƠlЇYZ~(uTЭUZzkU^{onwѿ]\iP)Ä8 ˂ ʊzHoZgM4=6%9PRF=yD,O۷HRj(*}dӲ P}>SfD-}oߴ;3<FGsv!( Z.D(dQGGw/XFzS!w HYrp!g`5GCݏŨ肄`[/.BB"B Vs5:r9f.HM^3ˊwE9`K$~qv!D P=gZ] ))7IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.machine.pause.small.png0000600000175000017500000000444012167200764024241 0ustar lucaslucasPNG  IHDR.--YbKGD pHYs  tIME 0(}AIDAThY[lvfm]lc6Rl(@l h4ԔHi$UJ@}@ J^>4MT8URȀ ^{exv.3{ݝh89?|ό r3}Q(Jb>}"P>z磏{/LL-;s52:p/;aGι `?B`Ӗ<9]i'0>yK:GܤǞšjq\NE9nPi ܸE{`?~|}g#Aۡj&#Ge ] y~n.׆uDhz_n狰 <1p}ӱվFjD ?| *Ns@m^z<σ"؟)ulKo|hniRx֍[g+*=i#JsPǻO`4]eKm+ sG g[4t|Jlx+o>!2)irɻS_9 8۶ y֬YY 3A nhn47>Եk7z̤3rkס]MNNAQX<\1'UX$vǡ}U"YBB,C5GQ^7-ǡ:EYʔD1SJϡؿtWic6I98,B 4FFi ø/;ZNGeӷ]ė(9Sς eYnUU*b=[;%\ɰ$F__6 #9r(8X 0 XUSm1CGuLt 2O9g1Rqu=M| Y4ir|[~2<5]:TOaY})jfnϱtPP eIɉ*NualG,!$=D&Y\9 Ǒ1 A5J} $Vr^.49KWeOQyCeHp6Pm $90S@-fͲHFꄺڃg; i@ DG/)rvVsSj ޙFmmm,U G, !tM?V`qwI'oiJlA6@4F2)I2i\P$3>EccM:-jo:~txt] @qpDկ݈KVx< 9|#)V'/ Ynx$ 6z0o.\B8u=DIo$Ԟ9SP ^p% E4SLۖ:؁P _i VNa{ _$VR70"b`p2Q8K,jD8I6$, }a=cqqccJǎ|w"!=qͨj׫T^}Uɓ(RBJ8{E8>`uu> •H$>p):Fa0oi_}׆˗/cll 1 )!dRܾyRjJ%nv҈3g7|>zjEqH)Ml J > 8H)țoI_~e 8QA)^nZDR r /K)mB$J`+rn 7۝Y_76sc[x BaW(?soϟs>جNkv,3J!JW3geJex)o*S1\,avu 0 f.֫z;;; օ >:R2&+~yew'fNLL޶rX* }f@Z4m۳--/wRC$9ӧ'Ro_x"l+×.]4g-{_°R<㧦d"!$q ڕ+u%TAK/0lCʦkis%JtV/!%cB2!C* <+j/m5CCR~@@dH'N!f&&&(|\s/)Z[xQkEگ5p=HkUrD[߄Q۶S&'T[_Jyq?V`}TɓJHq=*E!@h_̙3q0&l۾`e l6,zfrr7<a.OM=S9A뱽)xq}~RRC/j ^b:RmP\׷ b's^r]n@)255U,see! C왹X;ԄdH0svW^;@BPEY,oY^, .@B|Բ7!;g''N.>+g?r?P|f 7?U.ONϴ)0 XJ)c\n6%t:R}N)!D/7+Ձ+qX=Q^Ag&@b9NW*LrBʹOqǣcZ?p~`LXB Àr( [Q !ܴ- 40 8"zf+aT$5/r)[QS=` Hft:ãcg;y܄FJydAjUx\s Aev|1,Oy$%aRT ."s uy|G:P*C^_<_ B ]pc~3 ~>s3_-< %d{-B6}:46~v4zK]}yqxcf#BLYWn-䜣sB!zCE4%@nooqc,f|FL}Cl'$$JQJnuFKf O} §8m0$K9 S R*5t+w_B\hۈJcxQԋ! ApRaj86~-y$9ǒ]~r9^oPS RV vww.R4ͦ)nzphk,cvE١]_[3pNڶCr#UT]T45{/}՟ <%H@zU}wzpVFn g`&$Qu!9)eoSJNrN:5L˳lh&9VihZ2^ZqKuݒyX__GلRi] z'2ETGPJ >)fqP8̵;wxV GFGɺ,gGwzxyzW?51h4TF. q@'''0 8|Yu+ZmҴlrMQdGɚ )?{RJ4 lllHiZJRy)e.{纅jevrݔG4)`)NŞ;t_?iq]t:(d>j>PJ}=~D|߿aYVAJbP< _bĉBZVBĆeizHQ> n ҧ*mMXAwƅƝ;wn!Pa\m)f ^[d+B<$FB}^r0 Z*cDAdy}ޤ8poBa>Hx|ݩ׊ޏn) Cuns\BZKAo!>N>iOݤRB`^/]r%^y3g&/ 8!Ԣ zo\7}6qg֖oo\6ylzu !p]JRj~ yR^$%DT%d&*sjbhxĝ9s6W颬 \7+)JNJ )!LQju7V佑;KK~3'I)z]=ӓqk:e$XH+|>uAPA CŰT.Sϴ]_``h圓/#/|װtKcDZҤu]u4MWy8t]])o eu+ξ#0Zv+掻c i²,0Ӕi\.1c0ƔaPe2 CB$Ma(<[[[h6@[܁ݒR` zP5P$67eRs,HV À^6M 9PxRij7$}Ak!K}Ą Z\B!c$fA={V:wdRJBRefR7Rh3Hz}t`!)7DT2&8%=wOCh&XR0@)C)c}l[v^?k3T ee۶m۾MB !,UI??zsB3iwgr=Rt;MG8?*d,Ō|-˝p2^D Mӌm/ i,wXŁŏ@> Ǒ+z=$Q⤚OU%8(NGo B(AAFGų=i9-<^KQld 8U7GOEBL[V5YW\į}l q}=${{ !IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.hub.pause.large.png0000600000175000017500000000453212167200764023377 0ustar lucaslucasPNG  IHDRR'bKGD pHYs  tIME ,g|IDATh{pT={aO&͍@D\JP Զ^3NEƶɠSքqDqtN3-Ku*P0 dɆ$`&{v9#ɚ%!D S;wy;>+ (Kw SSg8Fm94;5}<YysYٹXqG⮮"r5.p뢥CY]Vwu㭑6VYƤ Jd\ͬ7.H';2"ݛ6mgO+:OX`O~%)iRXgx?L)sn]5+'?_: _50ucRj,}bIt9=eƆJP#:?\ͼ :yyzP#>'>_'Ngwu9Spք r]U#3Ʋ6DTLT'`+\MVCn:_PǏrcTmՖ#e!(؝wk t(^_#"㣝ۓXb\?y (m跑$ƥ}Z?*P]70:+W dqc<1'hn:D=kmȆfYD6y8y:زfYB6IװMS(adG;"OD 4LI=?>ꚾ^xqHlaۯ:O E( DnsEKᆬ9z3C[uWH{亪ʢr [:caMW= t<*7K԰ӑjo)vW4$܅|]Ue+]}d҂Ds Y"ݷan^F[(/seXͲ$ HIz $D4|]]hQUc)ʯ(*Yq 95mǼַ5d l7m#鷷@^o(tN$]aZ%e^˿9f-\FD_a$LOGvVvIImmm+|ݧ=8]hqwuv͛[/Ys-a$HDfEZZz#uUE99!B eY&99 A1͗\'2Fd\[  @@t]0.<8\f6۴!Om?o0!1%9EQuP;fss`ˉ颩q$PPX@07]B_o/a\HPM>L9$Q4NTK#ub+W"`0lxnhˑ~ԔTIKQgLtvrtj#>_7so,ލQ))Ylf:VyٿlԔ8< G.jDꆅ612g1 )DgDӉj3?ºʲENKK#8$L\!D]$;棪*Wt]G*e$0! a膝h4 MOI&ىb#i -&bUMT׿G1iW LD D 3a {933kng&ozCP0JB[c+KlE}5$Q X,1bN8 BH$򴻺o套}Ͽ>dy"u˖IIIcć@ k7+~YXaTD񭄺r lPa'⢂>έra^vtq~kBиy?xoi": cL圃1]{Miu)83,t:4EeHiGGGx!鷺 :|$ڠO>DMqIaus:QuiBuTUX0 ifkk)g}idLӔӘQ"`I@iJzq9u! 2$[n14ohq18F$pU5:UBTU i >9GZjg|ZJB$IJWEJA%D:Tq#˲R)VU:wͲ30L*B0$Y TRrO&+t& 30 7|SG}y9_˸\T[a0 p9ir;ZCTm0 TU!J巛p+3M+T"E"RUAYޣ.NNN9nkH@}6!w]Y0MSvJfh2N@q\;C駟jm۫VGVqSDJdYYIIHGaY(t:=iJ4MaW^?}Ѯ\3,{af[ T81NEљ8NA}8<|IX~ahDQEQG.mۘNZIFk(P\P9UE`Yi=bӀa8UQ t¶m!>BzMT}cssiqF$I.^5qZ-( 9!"|, ziJB>[_#MR<4M\rqc4Ɍ@ͿrTU`żJ5LpuZ %@<6ߏ?l61!|G?S~Ut=ʸNjG\Wiŀss!""2F# C YN&,,,`wwb7B @mP2A7JFTH|׮]d2v_]?xꩧ,Fɤ/t]O0 ]5˲$IVBU낾{peie)4˲;Ο9qFoO_Mpcc gnܸ0VN9SKe뙺}<~C{.[nuBKF9___Or}6{=1+.{ ƘX[[Kz^I*g2IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.machine.dialog.png0000600000175000017500000001052612167200764023256 0ustar lucaslucasPNG  IHDRppKbKGD pHYs  tIME  5'ZYvIDATx][pՙfƲ,Y_42` %H K%ԾmR!)ypٵT$ J*,6ހ!@|IX;!xFFִ$3ه{fDUS_C(+4TA`(!J`(!!J``(. !c?BDdd?pOV{,$X51>6g~BJ6ed)4DQ0C q!Pso#{}@i @䍁Fg s=]w;q.d[]3Qѫb2A3`hHF 7DcmчMA^a^]$u=i<1)[ΒęiȲl8 CqL07 I0*oӹBʚբ}4(!(׵Y<31{JA:쩗Syn9Q۬cme?mo/zi('oszhuI`9@4z;ǼդQ{z}_- ,.sKdƸ:X@,^z0)65;5~~~ђDҋUl yEa&!>f9ڃ @N! {d)*)E:8=ub8 %usAjsB~C7j{xW`)Xc13F2f0Ȳ_?h@!B) ɲ A Q񿧧1JrgהgpBՓn)<{4f8x蹠81>6zЭGoi^ճ7 g &~|mښ*F i)!\*iiJ  ֺdi=M*aȤIr([gjXBB`eL4ZPTnDfq/0/-r.^9XHPW)% 0PvnL}ܴc_'u3i@}zl`rSc'_~qz_HKSݚżJ@AT(]I?R‚@薭8 "s9J=pJm6ſ\N.&]Q**(h5 0@P PT\{UQ0' C`ꃿ(x4hS,Rs5Y@ZZrPK$~ofg}]嫋'@>ZMFP#S膁Adg/"rr c?";{9î#r{9\p7>NÏH| t,L݆u-w-H)tl*w~,Rsy;:Ni Ţz|4nw?{מc+^3C;IDAThŚw|]Օ￧ݮ|%HmYWl3ϴ4l I0){iy{`L ;խ^t%z!# ?9kok}.\x$Q\n6BFnL>|l޾/sU>8r \onx+ 5%awe)LJr2iI=$xRz)(1mbi>w?V/q$ՂƱ(T]e x}vdYD.)iD 5"rvIz%:ď''b-;۶~8-u}B+ ;'$EeF'cup׿)-DD ̒\;ü(gW=mnDA$/7gt9B܌Sj q[[&2B ɥ0y\]Z3'ɗTu-<3_L8ϥf9_:Q f^TyC$+~.$>ISˈF>|ǧU ;}~[WyMV~{>YD(̹nDYfq)LK{{&'sp.eq5VՕU";` geCÑ/:r#C!kff&Gg~BiAj^9gz {zdF~[~/\u3o=̙Z̔Ye ģH<@U̞1FV^V²=9 -eCa?(>F "O#0R%3It$xjG7=[g0x'vѾ _݅f/~֟+'Nqיݏ3;Lvӿ7bσWwu$~ʘEճ<]`\i2^ä4d֌dԼ潇vJi>1K9F*]#ʹȞ5Q14ڷ`GzPּ\s .Tفp4Hp`=rQ|iiUYy?/T\=]k?S +|';1`.gH4\_jIl{4u0%+LCCHȪ_ü477(IX+?37֕:vdYעz~1U%\Op:}C1\K*YV݇tE9TcsJ\.UqcQ$$ADPx^3 X,_+0ß**gZ~^s̙x(;N^ٯM9]F:{ȅ!=ǸgC@U+@Ϸ3t:IIK%9%j!a)d1kL&Lâ{5’trY(.U5M~F "dx}9x0;C1D0@ BHOKm4q%P: C410 }}4Dhmc]HLBV\;db ¸NY&C $y=(>"C!z{zE` Z^$5GkW`(E̬G_nuh ey_YoAIt%0~`dIW{V$At299wvHx׉Ƣ?ʣ)//''#njzVrq6Tioag\I$!!Ncp8 @LU4z?  ^3*3P(D45k^>pǏ'}m_zoKm͔90~\a +'hknqMNI ;#;Ё8y̛ٙ;?Drss9x a;aa-:I_pO:,dk HRL,#wKftanvH ih .cZ4Ӥ':Vyޭb)l}G[;vU.?M <9FT Q0?ZJJJ3gYYY<ȲBOOG-[(k>}:,c&DD3Oj2 <$EA4 @uxvP;6cߧCvv6NP(db0nL>= y:{w@Y~z҈jjlq44tIIIfɒ%TTT4 ]4M9x ̙5SOjj*&(ʥtoBDQ$)`J(V,`pGٴm+$( v)SJKxX<456a ZƦEǎHl ̟;Muu5}}}deeDhkmAQQK,aܘHRRi200@8rb]cQŊjE$TC"4AELD*$$'1w"͜Acmtww͎{5Q043M&Xx!wl8/ڍ[LCwh`x$ݪP[[;1P(D00 vAuu}A~?vp\p;'߷o7n$StjR6|RRl b( abm ;z9p<04D\SGϪ~½MD9K`Z J6oߊ܅sϽws'lknaZx\{(3449^~Ž1t=jd/6xB$wI(-%{iinS[]3+R{p誊xNa0m\b(ֽi }E0D\hY *PQq`hN|?/]nT*N}xՅŢ( =V+mmm6Yf?v狆8Uu3 5\.TUE@@EG* E0 "nʔVLeҴYXRމOMo'^r o>g֪ںn&0|V&￾-GkcՇ5h &"3eNٕX0sJY@mGnj_WUj* b"pD6*U^^~s? ^/}|XAASc TNnƣx{KCZp:?WNmkςثlwwtvwuqd߁Ζ6, cǵNZtǭ+#$/+{7?5ob⫺a$='OnimMuN ^wu?Gѥzz ޾{x??/mGض}=0vT `͚5Ph Rc߼z0Wn [Y'M=twoy ?`ҹ/=z;4Č3kTV1lwܺbgc(ŃV4DW}Em̜i+]nHEU‹/ڬu}}2488NT3q'.woq"7/g=ϊD" ;}Yj'';];Y/=?x44%>q2,~6tN7ݹ  =I /M[0/ _*&6O4>/cْc(_1x\u0뺀 |>O8+#hnE1SIs_z'NNdS^ۼ+ IrGNP/dv7c`>Ϡk,;wWVc}7O. All the icons in this directory are released by the authors under the GNU GPL version 2 or later. marionnet-0.90.6+bzr434.orig/share/images/launcher-icons/marionnet-launcher.png0000600000175000017500000001244612167200764026353 0ustar lucaslucasPNG  IHDR@3'IDAT8wt]u $AHJ)H-kKJf<8rY3'Q$j$Eb'HXЈ+6@%"o-s9{ݍ},FXbIzx0uù S!P%Rg=S+g,Sv᳌2RI~ ^Ohm?K7$_ge Hv~M:>+_7$ fϯbM 2<8Cؾc p:"wR[rtRY;pΏ+x<GF<[SuKί ΁tZAڻJudf SZdq&UfB(1 JY[Nf ImhZbC3/|-^S*0 9e]v-v!*=hI]8ON8@B_H CüN{94j$H8o}Wǔ(\:s:ï0:^uΌ v_)7+ iOu)m({zHQadMlgpNm iu +W$k2^6놛"Js\< 2X",A8lߔ2`ر_(`E_8n& ۨwVip]޹'UUYYeÝknܭ}JL~+ͭȼxoc\$1 O޷EfiE/r Q?r-~J~*/7TA^n]Q`XKn+}n2H0gε&SC _J ?>|ݮTQabvOn?yy ) gN[Pa/(N\/)u:Z3rL^ ?9S_0+)O9A\SrWlv״:_l쎍}+9TE;.|v/~~ WJ9q%Tԟ~ޞ%&D.\6ϱv"w{}_N*/ ,$g:vz1jtٿi/H˰,6O 6Ueb1;:|ߦM`+q{^^gMWׅ Z\Aj);~}USM--UCc8tqCd]G>8cte"3bb2\vK1utؼifXt)ɩ3>ݺC'bByùg>eX|>R\UU=j$  SUMVv`VF<\&RI sY|9eS38~u,|Jge3O_1"0Mf.ŔELi89, OyU 00- Ӵ2>:JWW'j2E_wu#)2e3xԔPxnY&J242aH#d2Ӎ!MhQjV>=>^'[IR5 EV006>Nee%V"??OF&044ĩӧdΝ s,]Y, ׇjM QC1M0iz{9A=ށM&PPP&O"y0sf04 g?`^\p&3k_'sSoz 6l`ѢE0e8vZŋ366F80 zz{Ew'h" QQu Ad , Ů.pf)swwB$ErQ[[C^~P9H60-v_MU~䩯_hP'Kkqx}^%??d2IOw7ǎ>ٰasfFE~?e1>>N"qt\i%lsƋ,bf#KiL"²@E,B+d^%˗8 q ]d Lݠp0wcnLs>ʯUKqI ] G<'b&{ѱ(<}˅t!oN:b\+*;GA1^,j,! JhaYX%p|aw:id-PUQDcٵbzA{mskc38vQ ww(eǓA,6{dI0 à-[Bdfff,k/o:l %}t7q#Yd1f!yEDID;i"i"H"i"2vQ$ .(N$roW%g%ÛIx>x?^ft$ʒ%KXf-$keqQ^ < DY0v~u.$Ih݈(N":Fw<@ky%3Qgb2,#&&c  " 2n!" N XJw%ʢb.$!4l۶a.)/ͩ-jPpǼywny-[*aI,⭺\dyujblןю$G ?|J,[ L"(hX)eQL#+ ^A4`i-v$T*\.dvqJJgv]w?[ϳMY곹S#m<rr΋jկʀæabYTrnZd疷8y攓 >Lnδ4L4Dǚl.XJVV*+,Jp8HX躎fC$R$ΝBK#>cO|9V]]: vTFtKmu U0Of@@-D̄6oF[Tb|M(;ٹ9/'+O:%#ÌpI@ @jJJK #9\i`Ͼb1g<>1AZlRA@ӴOeY(CEQ zvم;$V]٥dIaŒx/ D݌lk<|xi~!f84%`b!(2_鲚 YtؾW2kږÁie(D~~nٌ⁚ϭ}F@ E55.--]F]6Ac=J{.U=7w}?֞F~uˮ޾@ߛ'f1bNouՂuO?1Z>c86z[{0`(:|]2>6WF?p>S W6WLLL|vn13 $둏U*R67&1 I]%yY*CwL=;wVͫ_|kdg8}?{%le*T/_z7u`6"$JsE{QV-_8N*z ͯ@(Yt\n0ab-ƇO&sN'I .($RP?_mi{Yt7dfx|jfǯI@^^^<''m ͯqd3[>W(P;/{ 80[W{?BAArr;N!U 4-I(YysU0$L$'⏹kR>yykWp-$[ZZxcg]/eɴeW2̀##CEtV/M?#s^IEpt(q X~`(^*Y\_OV^_yzkɜό^Q$叺IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.off.xxl.png0000600000175000017500000001314312167200764024440 0ustar lucaslucasPNG  IHDRHHUGsRGBbKGD2 pHYs  tIME 51\IDATx՜{t}?OIVOIS yF86!}Ď6?rڞ@rNS4mm! $@bi;kfvGZ ly̽ݫ˦=45˫a~5@M"EiK@K}g^33]g` >9v!YP^P[o Ц= <ڲf]kե+<4\/ kgp-KowECBhرs㞛;Oto=t;ofMr;G ;*ɵ[@3rff-$S HEHf DdmOtcپ@k5s;aƟ7WrK`Ʉ`uM0JKxgg;=:Zǽc zzEYQl5B)?DOĎ sSV?wfp?={Ze'8LAScQ !63cMn܆'âk=]۟t`85$iXoZC ]pp6u4'bބu;в3ȱXT@;k 33)a(ظg>s0ި>an>BۘW7$s瘙޴3; gEB@p0qMɼ8{?J4u'doTK )ٷ?[xp)}p *9w>BWk5% HDޏ/0e3<؟촧 Ӳh=\մy8>W0@1A>'{\h +b]owsܾh>^^b+8{Aٵs[G9cݞfzf<&M3SjHKMEZXAUi~R*4wc:/MjIt T8x2ۗ2 bI81zk{B'PJDelZUe$E#I)&5HB xyfiFF=aIGE=s CЮOt"JIn#`ɼlY;/ϧ$ "y{C$M֓moiRJCRw`NW6KU3 {?`P|X-7oxbHt40j׫H><]DYiiYByA)g/t1&Kw"jjI9ʞKBPRP=lC.!esxbZM(O?cfߧɔc݉QzM33 zix :8د.(/E gR M/u1)resɕPsmdwZ#J r Oc5jO19eܶ nHԚɼ_BwmUbb3Ѱ($5h9׭GÚe7RĎJRr8^|=qlR!<7f D[޵ SC<^s\BY!jMm&y572A 8(= 2]mԦNigOsPV1~r$:9q5OĢĴUEEB'ԧfE5b SBbxKwo/xD"h,e244}\P6{;_wpqhsW\5f->/z"8c&e(|! M׮QWW,-`;n}F$\u]/`?fF ?f"7INNyȲBvv6v`p,-s ̮,o@rm+ ﴟ&.jTO63+I"k\ E O`pN9ٌ}x<^|>ӋÍxHD8a7Z>N|F>AFFx+{:KS8Vň9Ws{Z[0YIo'`x˙39|kWo0 „Nɉ#\: @g('ciy$el: %i)޾Uk M?ah9W% ":A4E"R2stSf3݄FD=[Vf3&IEQ.m,;pnLuوEϞIWR?E\gX@2(f֭V+  '<(D"JyOP닜XM ?( SԼƟ;|2[p3%ջ"˚-YYDHČ?eEBfÞa"D%_BA(L^Є/BVNK R_l%J$8! ,l6%b!@SelJ[Vl6j~L(jG8 m7(Y̌ ƫ-tуtk,/#Ӿ1YVt1D4uYY!n2HH$EiHg~CKi.wQrάjon RSC+ÈXcb&Q"&(zXRJb1HE '"[f'<^˚nZImyT289\(\gG8j-YVD>*Π$:`o4d?AG-bgxM ҃%8c?&3F 誯4 Iiلnr^|H &e>2vCp™3c =Pŋs5>p^^T8mT.^rU3P"dlDlI9DfڪuL@+I%PM]XFS~Xk@JX54ܴq0HY` lh^z]Sѥ eR4T (.FIY9%e$}=}^$ɔцCɴĽ"( 4/F9b2N-pNY#mVU-e$)IҞpi}>E "E4 ), ΋ ^'7? 2[2W/G+1'z5 KIC[^?x.)JGDlJ-ANf]Po+9{mb+0$IjlrD % .>Hbj122Zr 8BJKM%j6%UIɖR}HQ\AnǞC~Ak _Pbʊly!^̮-̭-D"rxPKk}z1> t,e1%MpeggrgeS9:1@Ux^%3 /ߘ E$u<+J?$} 1ťIlA)&gF\eKx|^ޝ@ظQXX8B>QpfSv3&8S¨DߏC$i Vd:2ҪC~zi+NA;u q6|^o3$p0Br{nZg!!^91;\lXfzHo^[V6PO|b}+B}:9y X$~ ze9#, 3kF#fY _n!]g!/?v:' _|ZɵYav]ZQjXeRߺlR 2[̄r +đuQd`- ʆff~@te,M.5hYlTϨ5h-43#L6d" =UԖi[P=,C4ZB ptg%NnoOaHnq  Y 92k4߾itl(٭Iw~-|XG_V,C'o5"\?~UMsNXw!k99,-.4$I ;g@YTIJ.S3W޻Hqlf5V^8Y5fc)#HlÒ:#ٵdxx黏m:;HRk[q*nMfS4^77X4xT锔A?0c oVcqxPئWG0o4fe8CjIkb S;j{Ѳ{s͘QШ/y8e70;`sK,Rv|t3,,<<=0o8r-9홂feCID8QX"1Fc)\[}Ԡ]i9p2͏Ief$ʝY4ͬ0*Y"ZPՄ!ȟ3iT =]s2C[c5bڤ^9^/s50ɀ3%b =+k3i mY͚?sI,,՜v4aR_?/~‹Xٕ %M x壎놿Jds+KqucQr]&b1!Mb/ 8] @au_~ѣ>ፃ{ $f?0 7Y`TXsR HwҸx)R_7!؞ 4Ȩ,]MQ+؂ 1p9Rj?Y? iӿiԮXXfs/jGc2rJZ̊wY&26?ϵ{ϧчOGxP aZ-hLX Hۀ6!O }9vf0F`@,_Py):]@EIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.hub.pause.med.png0000600000175000017500000000314412167200764023050 0ustar lucaslucasPNG  IHDR:0NbKGD pHYs  tIME φ%IDATXݘalSgy׉601ƣD[(ұUZE4ďugڠ _ɺVh;V !5 P`!Sl'ϱbGV&JGPeґ;Z6nn;_rٱ޻,v.~̙Kǎjǩ{62vpWr`~DUe `Z4eu\掎'mi J~Lo P)/Jh$/T"VK B$)4V^TbjMӤ $wHtl+F>rH$B0$gt6mj%>CH$cx>ΜCj~Ø%xK VRK$E) v1*)SFlBNu0[pR%t$B<#[|8|l|eb8ǁ5Zv۬SvN'Xew]bn4fRF_QS?g xEʶ]J Io }e,$lvɠVK 02+dXb@+AW 1 1###*{}>4)8x!PuVAMnBAi&>b)5smsRY6X%9|qx̖ t<.(+WκU999ћJR%d5k݋Th@!`hR'HRٙvL5P41/)TU9$EU^i<ТvNSlIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.script-analyse-3.med.png0000600000175000017500000001174512167200764024262 0ustar lucaslucasPNG  IHDR@0K|IDAT8͚ypTו[[kߐIl0fqIddT&aR85I5L'U3U1I% ,@`@B [Bn~-%00sOᄒ|ss<+Cl@ P߿l6{AV+EiynhDVy!5M755vqe߾}5:77cyyK&VEH$"ۥ_Wt]O$^Wvttȍ7lY,B/~ !fT!c``8L& )卿$]|Naa!999V)匆xs%t:˗!R0A, B|>V!~ł(hf(  0 vW$! bZ)**b͚5IngX?>~|掿fp:Bصg\t͛7˗ٴimmm ꫯݍi/с墵 ٴi~ǃYxs \.Z[ikia-x 򾟖h<@ 0f(,@JM ȬYٳdff֭[Yf " aΜ9ŋy饗HLLHaa!]]]\pwy~34Ml6D4.͛hYRkVܪ(ʟFv(1 B5H)y7HLLdڵvQUS"b0gXx1֭pf#>>۷ԄdvS__?a1'cۖ-_eIt]? -/UBQY[[=C[[l6 4 )%&%))!HNNFJfa4q^4, qqqaV+RJZy_58x#z !着 /PB8NB!FFFشi)))tuu/bZ&`PU0. шl6cXd2ۋgh7 \7<@͵wUUnddd`2&lgp}e&OLYY8JJJ ?Ncc#?Xr%fvMvv6易UVQQQA~~>چ M_CnCwr_RJʊDw-[`v;GAUUJJJ(**b``sQWWGBBv_e˖a6HIIf͚5X6DQU V;?$aٳ7C1Y _0&\"`00|eee,Y)%AMF^^D" 1H)tttǮ:I,_0W_]T䩵vUUm4NMM-|<se۶mX4:;;9v---X,~~a RB\\!x;kTUҹ[}DJKKQUEf]{7?OεUU4 Zb!J_yΟ?Oii)V .p ֯_ٰ͛)a&MĔ)SxwygxZW8)kV}4ҥ $ǨF*3f 33ݎʕ+A HHgڴX6v;8|hFoo/uu'(ڻw/}}}GFZo5}ݸo[ O?C>K`PQ~477pB JlKOO7ddd:]]]444`4)--E5Ο7Bzz:v vXRnygȆq< T5CwTT|0>b@ bϞ=q)233`hhUVq!:;hjj"##=̟?ł!̛7M0L4c* )f{DS+X,$%%:gs!.^H[[;mmm,Zjjyrf PXXw` o/, ##KXL&3?8),,nB"Xq?sSTTlLEP`X4))ȇ QTĺ|_VCQPp_k@&XVVFOO7c0:~+488y}vL&####<7E۫EQ;++? !>>qNOqq1Ǐgppg$>>srI222ɦ`0HNNK.ܹz>c23o?,`ܹ`6b)Xdz{q$%%Չ` --nL&8Nlhxe4Mn}}}XV^~oGawU4 ^mU-81Ôͥ=P\<{oDHرcttt(EΝ;R2}tf͚ѣGq+G2)>t4(stILLtbZOH`p @9FT<7~8PTn@OO~}pdZ,ٹ[X"TQQArr2K,a۶֣xO0*x}]DaԒ#р( ;w.&?:H$^N״8NVU5c՘FZZZl4VV+qqqtww( 8݄#77IYWZ, 8?RʣB7 !.H). !6-_yFh+[׵?BaNc…l.7իWS>ED&xdb8Di(+"A Pr'sG슂mlܧjg$ߐB'UUU{̙)BRXJ?}v\=0L1: ܉f'Fbݻ46y=uGQs }pאhHB'>$-z;~yEtYJG!DZ]B00XxPhGzzh:{}t]c͚՜/V |PUo]Kq HV%ck;4+$Pbˏ=Ȫ;vl(oM@Dh QU ,4Ñ h^NR^IJ @A0 @X,J{!B΋~._BI&9D|Oq\4GRB(^hBzy'9p`?^pB-p:y=DqXmN8 Ô"5afM"~ a2c3WcmBxby^R0Ӯ/,LfRF{+V Atv;+W\!JRI1xoyZ);cܮ߯-/H);ٳ"\ DKL ֢i>XΩSgдRPPiӁudÜy(W,~ô;PR2q`P1ub, fMȢ4g7#I.^NBa=uN`BGwVV^ʮ׀]:MӴܼXG6f͚0ÒҸitwD٬\H f$kaeB=\VJqLEQ5d.iFCCCC.L&3 .h9>>wM{zϡIII(B$gyu]GuE0QUuP_3R~ ~Q f;cc\ 0 B`4F1cmu]3< M5rD|>pEQس=TM\ܻNͤI80h8c 3gL?`Ud`Uww&] )*K RʖlihɅiBX6mzNCiBB C$++k:{IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.on.large.png0000600000175000017500000001111512167200764024556 0ustar lucaslucasPNG  IHDR::J(sRGBbKGD2 pHYs  tIME  WIDATh͛{p\}?jWZVZd=lYlK1ؼqR{?: 2Nz K@Kj'Azr·yy\-K^|Ojg3_ Ax\Z7w7TS{r7^lzt'{^y skqxq3_zn|<@fX_:w?^Ƃ\ W#t( q̈́V$/Xz/>1t`bx~5|@/4-U{}"Xdw`q&oݰr˻޿O(K88B !zd_^F(~BXe،fo3?| w>P9&>;Kpڭy;Z󾧥g$nKQ{a3?| 'fv+[wq&BqXy g 5R"%ȯ}[ ?F8_>yy׿T e 2k-.Ř%xy`ߡah3#  ΍kIBk6B嵼=3m'1!yu.ƹ d:W 7չY\/RI$#SA̅ + Hhj[c[ʹ+y+2|XT"o1#cA>8W8|ely+[Wׂ2#R"/2)w^ |9&?BWʙhr@Q w?@qfjP\Guvu'fW;@Q +cEpƽkSXg`LGJY" : ( Skf_)_}T3(J7ԳpUq{(Ljq[}~tp28$Af u+g)Ea%2T]{*x|N6W2;t jױֵT|<ɰ'_Fns1w~ˆuU;&S(2"8YyAm9AG#-enſv++ˊzvpgsGIV ?߾ (ۊ&g .3Dwf/d[&FZCm5H`_\ 0jz@&9SsCM 0;YÐьE@,VeE=JjkkYպ՚_u97t qh{|-B1p\5Q)ew2] /FƎ ΥJ2?bj*Wh?GhFmUre*5>W!g|^^/n*9z*gMC J6#\8uOu:0МVi߇̖%%Gb1LN D"@7qhX\.(j27[Z m^'o V+~W)@"%\@1o7O2#dgGq(u+lQ-}^jbqpx uQuFIAJEyYigTN;X4Bf4Y3"-/w0tGh4Yp݄A6P]GUR/2yaʶ4͍.}xrNtIXm>I$ +m+ATxGuKUU(H#$ȸNPcc NƖ>^be`d6bD44 E TJm sܼFׯãQlz=͕\H Y1,TUfStQt*RB)zI)TEQ(w* 2g1)_\S H  kh sKJ%s O7Z:q]\ZU|x}>N= EE/]VuQVNm`$@ߛ_/!e}4nSu^Ed~>_7~S5Vhw]bI58Y .TڒѪ0oP [FNڦ4V":=zD#QVc.`*a/ܕUjO,wJ)%(0Gдd`ɜ 02=6R32cJ,{CCCLNLmhluUXK(W$YQ_բc($KtG=v<҃n0/2>=[^t}Z,ee477Z'\`4l%Ф !DCO|}_PgYMsصج5hZ Υ-뼙@㣧!;l,/b|v#6r|h4LG \|#I8]2^M(^^Wް)(XdU٘S\M2o6}*j'ߓ)9:8Gk $}-H\JR2I0e?-5ɱѹk>b}\ f"HU,d)ב9V55 uuP4n@ōMlBPeqS!n4 ,||6-j3~u}Ce;ט(jx\+3.!ƙR/"<18kZEjJh,J-q`ʒe+"x3t}YV2+Pu깓{z6*a8 Am#/BJPwE5-ӗy͏nE=z+m-4ZP!Xڪq QpL?z mk|f૪ 04 P_&S(cyR;>ĥveN[ nHEmDWīPWV !kg\ͺmO=13)0%B$.r54rֹ3+ǃA4ŊlpbtSRgt-2:"]e T.UWط9']!K޶'?Snl [.aNJpڸj3>rWGѰcUFO~/m9 zCKѝ󦕹G&JIs}z}[;|~_o迃LpН.|Leߎ l?8aiSJ˪roG[MMPP-[T3 F t9Ѧ#1mdКH$Nkvgfj) p6՚H$.*a]j4*C% U -IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world.palette.png0000600000175000017500000000625312167200764023202 0ustar lucaslucasPNG  IHDR@@iqsRGB pHYs B(xtIME 3vGtEXtCommentCreated with GIMPW IDATx[]yk˹̙9=؆ 6H4GIUJRRUZCJUTT)%UҤhڪE&v\c{flxf裏>裏>B-Ս\}tjT6(!YnoZh?wogbV/{`s;sə޴P iK7rG8y_??;՚/le " ';_sOi`LN&ڭfg+3z#AWk6u"QR!>.V88 Z ("79y)Yt;$iBfӗ.3o9z#7}wCCO8&J(G% JҞvE(TFaxlt]#o=̍zF ťBG1r2RJ)4 iF #T8sDabaE}jJ^;D鞝ϗns1SюxAG%t",n@i֠$ B0BFvJep离-臂_|772M\*hMǬ^Sn{AG]'B¾\A)EAnƊ" CJ%RrϦUAZ $w}ֱufE0\sXsg(gYbR g\rNaUli]ce~3'vcL!J1CED!^(@X$9\)-]\@Da`o`-a*x\ [`9B8!7(,b\V)/4Mٱmic` Xk}^ ܾvXg@%C<8F<^6]8l[11bu[rxtxnҥ5: /+ċwV/=9!9Xmk湷8crӨ 1\ " lO(إ# I<'s|mRB`<3#@ͷ1~q33T)mSW[pvj)ƚ8kz.p"K("S~ uݷ6[Ge̷ڌg$DZZ>44*t]m";< M BY:]K4)Eqɧ;XvK33cxne˭MNeġfx1/=#qrC7ox(vv;]:MG(!j ʯ8Yy-XmvzrNSbN0Ɛ9>YKqy7^?ۻ "y_eժQʕ*q\&"@g9y἗:^:Χ<G5̵Z^*1{m9&Ȍ%K^>4Zh$ ICtIӴ)vcgYㅍX1g;qkr3,c0xsy9IFW"BNM-zw/GnK @*m/hJ[S΋'b+9 Wg)3V ||TCit xwXrJaD:hCRarvW{37^'DJHɲo}})(Uoӝ  0 BKWNf> X I/YXШmB&ᆵ9' 0&Q̶FR̊ ug,YLn"64Q Xa?}|vvf%`vx6ce+IQXcȍn6ku_AXbrlBÕ2R=={{WC}sy,fkWVp}C2u>ML_YTQ)zfUJ ^;A?u87tz95g<#3<("O&cPV3Ҋ=?fs}HcY[W߄ta J2$8;u%KݢmT˴ZJqz'^_>apA#UE(!113MfV V 70Xp/{У;ܱaöjk72f[mejޱN'2ßA?Y)jZMK%. ,iے$I+MobOB}G}G}G7ʂMwKWIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.router.palette.png0000600000175000017500000000263412167200764023372 0ustar lucaslucasPNG  IHDR@@iq pHYs  tIME  7܋tEXtCommentCreated with The GIMPd%nIDATxoUsfJC+E D%HT…Ą+/ Lޡ_@ERmΧ;[y99gs BP( BP( BA7`ffض%׻^4{v$(n055yffх@ 4$XaYn L3a`y6cs\%5 )8XX,L=;e'r9.3X3VfDb 5 #00 YK!%Bt]G |<\uq˭86~shjZEkk뢼k>0SiRֲ|j\ MB` Q (!BHt].4ʈrq݊)-4=uY QΎ]br GQeVSE:{z0Xt]*gLO梅t=$ YjEh)VukhZXyM b@Tfml޵]= w0/x92A%RV_O?!a5ݏ%Yf,W_?|piڂ RVtk h=D}ϧ~u-M&Syh̬䦬4WK[\ڷ$1~aD$T4~c-A@KdG0hZ-@c}tF7Džн"QӔdOذ#|Pf׾R19rc9NHYi34uP[GMU-d,bZ7;'F)Lae:Xݶo%kwvnf>ˮ}U?nfL$sm㑮g[ o-?ұKE2 -MBRVf))-wQѸuu["?yͣ LhҊiOifglWuC> VW+c}ag˟{Ņs#75=|M QЉvރCAcCm KO[y4Ӷv@"QR֐uڧ/KA BP( BP( BP(V9 UFIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable-serial-left-right.large.png0000600000175000017500000000517012167200764026072 0ustar lucaslucasPNG  IHDRZ]7 ?IDATݘk]U{ܹxNBM{($TB*$h4iE%}H%uZ 7UiLqmZuLx^w3ޙ:Ͻp-i>Za)a޶QoFRwC7ZK sG~faa`ѱLǏ<_^o :WIYhitdpպo}h֚Rwi?VJػ6k`38irf$<=ur~]-䂠4ݑV_ڽz&z_Ck۔h4ضE.GgZί|'M34ֻno޸Xq)Dk9۱1clj|lQR?3~_#w Z6mž"RHu4s]V*B>Dd!Ic(,Pnư.=_E^>s0fi0cPJfqhurfgr F1q!*y@|.ϡw|k.˷C#|O'^Cen(GeHrN=3jybī?5Ç?\T z =ae۶q]JetFIνof)ϿE5V)zaAey$IZ$ 硵MfTżtزmCl%%t$&M#z)_| !$QƗ>e`Ɛ #h9s fK;omo/Y'uY$ Ie,өɕeJJ BJaYce:c1)%BBHLc ZA{We5@ PJ=vئWP讝]6)%J) )$:osKhc ktl*fhGS<`p8XJEoo/Y2<4eۄaXtmhAk͕R|)1p؂@1H)veLr;՚r6m Rs+4R(H)bi_*u0ѱY4Zw mYC.U=uG3(LbKGD pHYs  tIME 3, IDAThZ{pv{{.&$y$R/AN[)۱ttLi&qguԶ*muTKR%@ryy{?n\f~w+P(_ܑ?stc]}_r55r`%7c/RzA5k-)[VkSݸ~ z]z^s8clc>FZ#7o#!I Df r\mCVܺ@艟iVM8vM<6^֦8hm>I[xwlD*ddmY8wm]jij %# +6T Z;Qv%q[Z`P=w=U]SlJ~~  {Yztca7ĪMhTTAex-'bqy%cBWTܽi}ZwC"7_\hk,h?.>yM&_op}oy慃VmeVo$pݤ tn 11B"ΝXnhL]y̝;Wt]}-,]yȖWhW}'su76}tP쑁r dYlJGEƧ蛪N]ٙ4t[UY^Qti^hN{N?cFu[yQ!kwRWyGf3D16:9 3g  ]Iӯ4**kj$4ԀMV"&תVF#؎b{I KM$2H}ɀSn#N8gΦ))0\7s'kYmz&gYf8gڝhm?mK`Z9%dNlyW AI52עr80^Ȟ*ɴs@ 0%+hL0w~{4m.C>+ nf?Y Ql>3=223*K(@v/_uz>z1b;ە~ @LSjzLOy nR%;G=(LBԜǰDh&rgyCUy+92-j Py'7tW[u ªxg:ܛ149Yscdl! ~x?| y~q\r7ܗ/3:%#'0 C[F&0,(J9H-/L|-ffb"\Ea110Ṇ/'{ڑ㤛]ݖc?{ƃx?9bX[ptп;ObKwJҸ=/ڳiF5Ȟ~p]}(MOXT]z*1$+/[⌼ΡijXDt|U|*MYRrSר Nmui$[&N :mߴ4E H/~ft#7}trF4Ɣ2!дDw4陭I)OӖLQ#}UzLO3&hWdM#44U>r&1{,Q0jf;jqhIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.diffuser.orig.png0000600000175000017500000000527012167200764023162 0ustar lucaslucasPNG  IHDR00WbKGD pHYs  tIME #0,A EIDAT8՚{pT?wل!@$4@HM UXAGǪt:U`T;W)hVy@4 $1fA̋cnNg}s{.\vi[>,m= wM{`CMivJ~q)sťꚺuMZ.߯)eJO|xjO˩+lg ڪe)u8?9xP\3(aЋ?ļz`8'i:ѥ兀X`hϩ< ReVnKn|o>YsT3Gi jg3-}I߼}ϛ/=] ܚ݃VܼYp-B(>4[7( If䟖/̻(pJWߖ; ζ nDNO{r, HN"|z'jrܩW5Mǖ|&Cjw5Z'0lwmZsW%nSrUtcbaŵϽ:|d+ ڼkDkKџsGS @vynxuU{ockM+Rv%?_z'šsB"_IS$&%İioqM;Š/]u] ]z߬'xջVnݛ~3a[5uے_[g74|C'=ƭ!X@y[bqED]]eYȲ,B@wwwnQVV&ϟ/yFF ]f.`e>Q]]MFFݴ!@ӴkYIOO3f %i4M*TUb(`PADiii"TUd@SRR"B8y䀲R:u Imj<6f5%TU()M g9{*ṅHKO`rNxΤ# LVVV-Qe..d)84Zf͹UQI{>Y{$*|a$ /n^I&Iv\.,iNZ<$)Jf \.t]Spf]PuZx۷mcڵ1ǹi@O} i,^{og-^AO|~V\mժUsp8@l-1eʔT#lDB!v{&˅#35M `KJJ(((#1{n"77-b`Xᔔ-˖-cԩ} Lqq… {[D 444KEEǏ^fx<Ѽ,,Y~-T#ѣ)//gܹv-k9=־ BoذSL<EQeP(Kf0Eʘ8~?gΜ!55rS0"%%zFŹsHMMɓ(u"~ڵ٨蓦_ѫl6zzz@UU222#r/k_tt^4kFe D5M;M:P䟗tfa,֮]{pprS ifN',Ӄi00)e"s!| Zn+E50bB4TMCUG lpX)6eUU{-N1+ Qŋx0?x񐘘!!!Ӊn{zх7m ,--˗|1Okf^ox8|0 ֆi>}v(++`ӦM7n0ms^R, հ,v^?1ckQ!du<:;%%eŨFƍ?>X!ΰkavCѺ# ?TBmŊ,X!` 0 %\4)JV`{$nJKK-%܀_Q>FOG6E!C1b8ahbIWO:.K:n}y_}ֶuVƌ8p@ĺ!Kfu+e۷/by^9vXC4??l<---?~_ʕyCh X,0HRc0mdԄ8?(wNwƘ1 k)JH ! $KP}]SrOD k@/>ӄIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cloud.off.med.png0000600000175000017500000000254312167200764023037 0ustar lucaslucasPNG  IHDR0$E tEXtSoftwareAdobe ImageReadyqe<IDATxY_L[U?Shb PdmO2Ԣ{e3Lto4:N#-&j@0`c )- 5ik?>zs{%(th99%eYCm_A2aտuiqNcN'wWσ3|[(2!)p?tǫhC2]Ric)apLK٬7! 9KB7{zI6V9 /my`y 2B;K}񞨳Xj!_$[]>xwT) &lH$Qe ` @T bQ*L1ѥXrMPdPlZ Jdy̟}esI"ټ]VVUY_()ʤUA!^ut^>Dɰ8EӥZ))ƇRx<}N^?/WVZ ԱĻk !)gZ[Twk e!$huZZ+d29 DHm^BCY:dc׹'e@a`d`a$ByRPzeeSxo)mmclt#hTiij҅&K^a En 0.QsҢ55I">1>qL7p>0I" Fg$M湏?qp'qGg|Z!⏐ χyVWW9ʴ4Wc6J 斦ܜi4:%5U"bL;q=w]4#z$BjxǼ>{~S8j.#G-/Eo _A!3ЍFcD"nZC&5acIFZ9v$7Ǐ$\7 eOۚf٠]0rrB4 efjy9w۵Vads2<`nv4;GGqYBPU#7Ak[DEMs**J[N9sfnLF+rf kj ;:]Ĥ녻 fG8.tm~c·Amx6PFTQPSVm腕b?C~ vg++;f׮YF#:b=4Aܷ`0`ǥso \ÈؒJIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.action.zoom.in.png0000600000175000017500000000217512167200764023262 0ustar lucaslucasPNG  IHDRw=DIDATxڵkLUϝewGQ ,6ZRcbW%Ejc *D1`Ò-jZw]aHӇ?ERle\%,iqՓ={νy!? Yo㝢^_XqQ*QUY2ЀmF3gd9o( #A1vF}TttUlkTtq$q{FoN?pG4PTJd _ :^K_ Y]Nj߁yqz ?lߑM8#+d#52 8Ѽ!GMMsjù'b"E3v-A{իJX_'wcΐO{179izGW、+/"$VRqm./F>?O>jEܽd'`x444ߟܽw afuMqkQuң!38ysW3FlԏQ3w]Rxk4FCbbc 5aշPT!Xkf!g)kkpGAQ_?o9RW[UH@ɓy[RR9 4hkj&;FR$ CWw,0>tH)>=2 TBl&0 I&t򺻻 NWWZ/(ؑt:=p(,r{r^pfff p||x^NII F# v&&&\Er8&O{0cccRH@PRy?)r$nCחfggMt #`ttT z~3KbPV&*b eBH `Y b)]lnw?B oS3`0Vt:~ɛ/9sy b6h4ݥe˷02F o-:222rj; X̦?n,+l17(J s=iu'=T,f⥛ #zN{q+;^UTS:%KKj3SSS14=}qL]r=,1nj I0|g ^/~;:`MqJ6E&.EqOE@FFi168gGcCD+F%&3S7+ĦB0 n|se˭6;q4`8z5͜^GxVfF 7-WT'c%X'Kd2 yN3lug֮yk[JeB%lL&\!$3#Tm]] yyR0S9Y#03 >w;iPk4DQ,ǁ8<A)I 4Mȗ$if$o<# ENh2qH؆H+OT)H|zSx[SP @CP A]ɑɼCwHpEbu*7dKeY"A8P(IR܊d"AR8wbw$DI 0ښc~XՉK}rssiIE'ۈ JߋFb53j@Pøyw2_[o g%&HM 4]ُ0yW4444TV#jwh-f@7ެF|&"A pp/H/DQA"n}HXmvބB ^P0ڛ>^ > \11Ltё$ɤNJJQKH:X"v:&no,[m\('kpFٙZma`4z.A^;gP(' u=8hƍ[X]ZP8!zQ_ߝY\;JM#|(H_* yۢ/ֽH3fEˣ=CcP A3 2e>eT\R(sv3$+h Wܯ4eT4 ]+y8lÄRRW@69L_F,Y${A6 Orls@G ˋ蝗H ukk}BU*bD1؂o~cnz-<"pHLˀ}2!gxTlǃx#u5jR 11lmm10 ke @m/RFbPDW$ ApO`OknW{ngE2Q>}kkk'4*}wf&O9l MO&Cugi\.'.-[-x6ʑû*=z6RНKˎչm J;Ԅ}x(4$:Cz< a9B!Yrl{%0xʐ"!8y6!BW +++y1蛫(n\.Եb]דo.79|%i%|)ˢUQ(L'(+e("d=\׉3wp5 DH$_mw1BmAPtGfvPJ–SWBG(/CwgOl9rYFY+RZ)1]"ԟ'ۆ*;4miR)C{F1J(\#|AƘ@گy.v@vbX'PoVI d!IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.pause.small.png0000600000175000017500000000535612167200764025514 0ustar lucaslucasPNG  IHDR +7sRGBbKGD pHYs  tIME71or nIDATXíyp?ϻɆlB6D FHp#!DĖԣzgihVg:VeXgڱD d@6s7${e>c7l>3>;GuXmiNLקt# P0p͛@(7/oK&sbNOBhR% Fz{P~Pp|[͸?;{,Nh4D"D"+ D#|>o̞>6a7wR9uV(ѡ(,Y^ɼEhS.}0|svD̝bٴuuve>t MvN."*ȨLFU~jE`6d__yUioʙZia t):\T^+9HWg'^o >ori0bB 'CfAOJA:;9s\6{%]}|;|wg ٓladvbt:#(`H PQ5:)sz6^[>oh>u&Gb09 1}RJM@ԟ>F#GtWDь2':8@iikmFs=YhwO77ht^i<{&UUQU6V x?h)-KWc2!Db0pw4}20|oG9,ӧfuOuk|Fo&Yz-hL5Ϝ.C~Z|aT) -B`nYV8?ą&?&YrKaəʤ@a) Y΀%m3fvA@ HЌCA(Eh\#e9&ObzAEyy)E."\v FjRϥytTT̬X{ܹos\h ]<Ftv9Z\P4!*R%ppcP$+,~ަ$:[&E Bp={vSmc/W1ІP3DibjV羝;h"|a nn]]6mҎp<8vD#TU% b4WNiؗR}xp_3E!cNnL*L*}vN8lUu |14[#Dq9  Ws)4j KS{ 53|$XuU9[Mm]! !$sR1 ertCxX ysI^T N> \(ye- {\="DJdJ))[ɢiomdKq52x):}*07v+_JN P ckEp#ݞvvY%&5`N gI+F$#Nz|~(oށh~)iĬ"G@Ƥ.*l̕k7QRr:CKO[ȬX9>gܴ,Ռ*%:L_GS{[yo_ǓR%a/j $X~/28W^uӊRQ W'.vLd0*RJ1Gmʘ P% Yz1#F~a y[|6lk1[2/,od $L ~s~J&Nv^Jя_^1Z8!xg^JgXG,Gdgi I:chS4{03\{hd&m06;[RRzeR*XЮ XnXjm\Rm׸OfJI r 7_ͤ+ry+m3WXtxV'miـI!˯ 5[3:M"^Y[owM]RrM s %KCTRX\<0r:C&]nkk\!ŽIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cloud.pause.large.png0000600000175000017500000000535012167200764023726 0ustar lucaslucasPNG  IHDR@0K|tEXtSoftwareAdobe ImageReadyqe< IDATxZ PW'_.A9 r jQ+Kmw<+tmGtv3]]:쌶gZ ZUJPC%`" '9<ޗ{/0}{RTIqL&Ϗ^CoR[ r$۳zgsP^@y*|I=>!gWJ /LLNBCy>5Mp*+~ |h'^{O/sW0Eg0a``ЧB MȨqPtF]굵'C# qb57Ӥ$^C!YP PUyw(~ fzΙ$HN܎..}VjjNpp:QsɩY`[ ȐAc ~BsE *01ʘ=fgT5RߟtYaҥcoL&S`M(EX]("t̬,r^hB̎d8tSG^5E^X!^0sN, .Zs__9bL7 '8z`gGU`eԫAN0:R; '~ߔ7o}`T_@l6/A,ƉFLxizGKZfēm4!l9Jlu$V`@}da.n%vzuZѴc"KJJޏWZn=GϨ7v4 k CikqZ MMuU0-sA sKR=vu2_G>s/4R-8}fp QpՠlvHY56a˖?*a|ڐYHB#ikbP.͍s8=ЩQE٬ [΂-5gpppB/=q†:4P[}WAP ԏoś Y;vO8MRVrB@ v+%zل[4',NL |x0^+[r O0(k ;v)ʒ VӪ;5d!JbE/TP@^m*zG9WVfoqmZMA< b7@{9q֭c0㬽VA(47LO l^^p(>!l'9{A`2Ȉ7o+̝7\_70_Ax U@ .`Yn &V5\4ih7K#I։Jۥ`n#gZQL;T{(!5JF'4Sm(޹C_(""n! 3m6IqqPOXЬA<bG! j&/8<p Sh0HCB[/]]gμNEDC'Z&lW`0@mC #:cĀ 6T*S)vg;<leT3iQKX-"،}(\ v,f \[}Z7"AEK9Ѡ5,&5nb*?+=X,]a*(m3AUo4WXI[0\ΎyO٠#)By~0 !0GD Z-8@N΂@Zt:M=l`)Y,eA5hf#揌aR"#)OT q!}P@lb E5C"?UqOFl0H b!Hn U`60 B$dpr'!q6+ d(D=(oKmm$rhYUTgJB@hJЁUT*7mu*e1qr3 3P2\nE:<Vk2{p(u\ *AɆ \>*rG(H'%UF!/1)5Ձ6jS':n% $bcCC慇RGXmM xΐ}w"\yTW'c'p@ bIP³Z>##)9?:d>m|j/kP::4,(EOK%PF3q TVxἂ-ʚ;Wrp& z]GcmXpN&'HmWnmU<UO.O'6^IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.switch.on.small.png0000600000175000017500000000152012167200764023431 0ustar lucaslucasPNG  IHDR, tbKGD pHYs  tIME 1$'IDATH͔kQ;d2y4634Z* ZA.ą;Aut.Dw[ōQApR_HIkbIąhE:9{W?,o#ʅz7g‹L2Udt٫9f(|$ѹ I.H:v uN,hKXUQrU3F2*D% h%_~Xݻskz0uvN%IhNut}w>?\{CeTT^v.!-'D%<`4ؾ{?ezˁt PNv;Ř3V˛mYo> Q1ZgȚKWQuf[K0vc-!`=Bt*pڜvc?zF PVA(D%`iSFP XRnR-E&'yEZbdҞnV}3FѰ8:Vho^(NWеV.;V&ӴSaJWo>ٵaˉ~"\AUeW/o)o=#R.XAh0|!~CK3օ|.yeIթ\q0t]}_<1|jsUALXEIhXSY;17AKgZiM{C>uneIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.off.med.png0000600000175000017500000000575312167200764024402 0ustar lucaslucasPNG  IHDR**[sRGBbKGD pHYs  tIME w kIDATXõ{lTWzΝ=1 ȒеIB`VUU%6nۥRVjV+UDmUӬ*UѶ%d ~Þܹ̝$ґs9 󝟼Btgc";Hz$r{=_e%6m[];9* %Tdž$J)"2#ǎWD+Gzg?Ūm=xfA礊Df_3`:_+赉Dx 85f)7}B!h8p1a`rSb!dlwɗD(" {Eߙ_Zs]BmosUn5&~OF#RJu~?L+Ω4)jm1h,u2NOe}vєƧe2ĉ.ap6lm&E?1p3 5vm}&M,:mݸky '3xgl;E5rT9~N %(bOil_]Jq6'h8qj z<Mn+ uO-hlsC?Zt`r ~9Տ:mٵX@( Pº0)%ȝ(tnp9$@1T o`ƃBX!s~~u]a<E1"j+!R"Dx~u7OG8uOcRl^s!  =gWik\oB(J(W'4! d:Y}mn;wxbRB;\xUɺߺMr۷@r~;{X[꼟ϻFŤ4ξwxJc}CKLPXt]7@x;k{:ND;) '=ŵ$k6Y,&\|RHZ%8/-bٱcW!}fcg>;[aZhZ[n3;;K&r&" ș$*ä."Rl P}:q~kC_j^P:ޓYH )%nw1 RwK(*CQwQvjkkѴ4Pl9hyjOV~sFx:&<l%U!,p@%M'cy+cwΑ'Pm ?)++pm0ĶPy~֦r0WI@H6YWV/P "g8eǢMNQp3d8YdrR!>QCܝ{6)K-`d6ťl̹dl߅T26E4.չ;3;{T zZ?7Ötn8RJKV^'9kAB*MAQܝfCUR7,)0x׭`K-J>!^HcHu$T^zK:ssO| [n:uIP enn=H)Q'.޲o\^HRiPVQԬ79l}Q'h~DVZG^m=9t=[:j^/#(Xf#aE!PY Գ%ya+~3=DSZ@tiD+d4*HR``0ȭ[\cBk J8N/=r̤·hRJ2y$%'fSC+4|StD>a{a2u8>^~, |_A?!hFo=h pq<<\DX,:[J-aZϾ_t݆VZ7>PM_eO'\>E`CTtR3L 4"%CmY'<>jaNw e !z<z YĪJi{qG~!Ө&5%KnFw]gG'?5>K[UUWh dH"O. yEOj d:{&@lnk G#-y~kc4x i.J=[iŲp|f(vew޸MEOA ]Bok ,͙Mi~C]]vl5c€.4i<1Mߓ_ۆR?3]-%=ڰًϥP+^>FK{ eGZmIErϑvlO'<b(rFh"e:%{lv_SPU\SoKQ"p8`f[f·{/Դk\Fj@186篠8<oy=xM>ld~+_tkcazCRkJt둅܍av5p@~|7i\\tTM@BcCͩHRnХ'W;]d_{]_/XIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.switch.dialog.png0000600000175000017500000000337112167200764023153 0ustar lucaslucasPNG  IHDRppKbKGD pHYs  tIME  8/ӻIDATx[LWǿޔ jE 4,&:e8^>D,Þa1ۈ3̌ K% ӱlOk[}?/s~Ϲbbbd&@B)P @BH(P @ $H(P  $H(  $H R @B)P @BH(P TPn/ܰ$ު3ƳKOwʃ 0B2Qv$OU D0>P_ᨴIRTX[T]ChuؒsV {l-Vr{5-;'+NGvPV a$+׶fmy"+XgRl,`q L'N?$ӿЌښ X?@2߽vo.e"-;mlk#`?dKM/*9=]ngkR1Z/ `}-=jkNǪlǟ=y֤w>cUSwXfK!n9 g HZ_m~1JvAK%YgQ'N1/޻-!nq}Xr/_-Nyr{AWW`6@m@WGF=`Z -6ШTA#2\6z1;a -4cZ6JBj[LirbgJooOxDn nZF=0y6kNÔ7MG86[ ĔW!okf]Ė[l$%%}!9}è56/vOy)UosLF#m߉޿@!++ xَ3W0yvzͰ 5ӌL 0ʄqU䣳HBmöy=64o33`Sh~Q1O9H΁g㕴 tw޳X3`JDjvtN'+Fg[荑#+T.TkFH>>jysB.7+=?ta=~/~撩. lrehtl9fw8){ }>TZF1(qp7av-[ vzl/W8*݊W?L,ϓmݩOmTr{YimgCW8*CH5j]-%GfnjѺ54 v\(T 1;op}O}BQn0 EaDeEqʹQ/|mmKZ L*9!"?F/,E$㹅@^VfKVJͅ&l (pP@J^QrYj4+B \G`7'Bl8P(A"Ğ'";ͅ KPNDa#Ĩ+V~sn6|%;ً Lcݻ_a9fU05/f-΁ )KDq6 1"FBLLL梵 W!x_( E#O R @B)P @BH(P @ $H(P  $H(  @B R @B)P @2;M eTIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.machine.pause.xxl.png0000600000175000017500000001302012167200764023736 0ustar lucaslucasPNG  IHDRjhebKGD pHYs  tIME .҈@"IDATx]ypՙS3ȗ_#K2ؒ5`@@ &Nȱl*jRn ٪vVlT.N` M|H|eK3:,<tg33#YB_K3ݯ_woLQΨ Cv;Zx5u1S:86 KJJE%((pQ(14ģǍηv]| [ M)rз,zvI2ͷTiwhhǎƙw {Q),ּyzᢥ54cَ[ޒ_cXH UzhӓK( Ќф*lNIT@*yޥ啎Vruӏqӏlhljn@r,*}u:ZXǞD8Bu=ֵqwmjhl⧀G֭q# +o.l=  Ur^<_`P:iʧ-|-F N 7mbC8,7\>s 7_@7ޞn73@k0.߿?qyD(>c`>;q_"2uJ'4Aa0~pz1n[`F`+y ^/;,V|1!}+̢q @ U_W[cX8 !tg5!2a׶ĕa/7֮a0 ⃝C_O7֮߄ a&=?lB'{ښ,Ai3`ߍ.]ܳ%;65u'cڌbyϣ0wױOEK+v/@R |r`% Ʀ<׬Nؽ{uH,Es �pWžo3[-γx;lN|wmQ3Jqӷ-.tn+/6qӷqw/!.M] ꕭbv (ش㹟Y jjLBbtʸsEť0r6|/*I? 7i^RRK׷|W;f*wQ]ų-h;﹆ƦGT ӧq!F SҜ=??Em~Ks^.pST^Xl7V/C}8}}qH4&6n7nYbhGoOOjڷW<[v7-h$UQ5w6/"Լ)HcAю4վ0mFU"zz.t;}' E2cݦd9 j $yNjBqՋZFIWb P.15u #Y{߁RV\ M.n4#6Q՟6:-K˪_v@[iֈQMQ%?s ¼9_Ȥ/>9Vq;+)@5QYe vgڎBA?fϙ7=Oak}Kr2^+9 #kgYee4P(<"zyNM718JFvL&p71 ,_u%nnAaA|Ix}yy]dNyQIJ!Q& &)> " I#ͬM-q`T-+nGRJxa4B J)|>|>~pC?"ktw})`ݺV Ӊ2L0! Mh''q@ DޮFekԋRH$@ K0r5梷k-ƴR]>-PBHĉNI @$0N@)n֛;p) Mjr x8l6XVB!~A 3Lx];WIs}Cz`ZaX $o2.y |>x< @O^(`lƙd0`YX,8P{ٵ n[YadnP`0eYFABqU]hk]w?z{6Z@IB͍r Z="yPP(Z2s'q)6Q̀\&FBtw͛P>.NKq,s!DRj%,[d6qJg#",pJI(do$S28I˖]^ك~QLT2.IGi|@)`,}?W%f&f3۸QV;cl0a$;|C!=Ig[!oP.J2WB6e Cawfz_4g+x=7x~BQ('&ǩ%OVFCŏjKJA'[[OqQ`fedՒVk PUX^Y%IV'_.MfY$5t"d'JL0)`Qqee줒4&>qmaӍ,g XxDFsHZ "[ UG1no)SFUJoWTTF; ٷMINH怨a*!'&Ȁi BR388S'Z j% D"{.^5"~R.1E`)"ֹ0Z y0ۉշ`ݺ0ҫJG}~6=.JWiϲ@|N8f:?Koˏ4a "IBI)u%g+`1X<,+ۃ0p<>?K-O>:B {^^d6cÃ'GxLMJ\1AbMΓܛCMǫf Xs缈WOadqAiG/[<Kq`D0]PEWNSnp 6B))@G5vڽO .g5c X }LK HHET.Uh D~zﴔGF@M쟜..hRp,А+ a;^?\2XR\pu1r*>1Qy ;߉mٚ%ITJ4u$UW4ZTX4~Ƽ0q@8DŽ6*,<) 3*$0@8Lqs[:A$i'v2~o2j$ Gu"`LD(]ZCm2p)$ol=5)c Fł,S/QA D76k }[O}1ݩ;vƉIJ^b%"P,C VV# )G P6^qM>yMXLr*2<"PDED2ͣS4U_W3ϛl a)~:xx  ~XW_WHܬWTM7e`Y0 T1 P0!08 m[jW!}{aY:ᜊ뉪UIZTݷ[(C^?]\Xac3i);"+O]n2ދ]xhiխq.? hF`xhRxʫn}{6?p Pt͏`V`ßzc˻XYmIՊ<$D,҂[P4gryo=tw \h~.mBx].;ǞxODi[Z~s-'د̨iy5VV!@ͫF58q?Q $TQLjk ZE⹊%2PT|8yU"{O,hEC&P C4ώZFLP%PQ.Q dFD/$%BQ$}Zj͓WRX(~Yh,$9q~QMm c?`[&S鶉:$^n ixKO.C`bpZ1QML?^-/∖&҆yր7k6*C挹jJtO WL$;v\(Hn9$f}YQ}d.r1zN.l~i xEeQ7slNpVh8j7c+٨8{`Le:13 wL{9 hBP8L9Ksc݆7g+3IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.switch.on.med.png0000600000175000017500000000232212167200764023067 0ustar lucaslucasPNG  IHDR:GlxbKGD pHYs  tIME  2-:_IDATHݖoSU?{r Vm;ل!{0bH$!Ą1a @c$FMMCׁm5йt={1ʢ8={sys{{7pR/y{ێ}H]-ʥbh oKr3E&&&Ci k6"M$ƑL/r 0 V"ݺ d Q`膅RWívk%L&Ιs7]m [6:db^D[H&ftlLc tnl%cypPB.Xb.ܖSGgѡd3iZ;cyy04SQQd EbkծzZ>u\%x1Hj%#SZc|KFzЅs$ͤ1TUqu&B/^:Ήo#cWTaZ;,m]/K*}Eɉkܤ5pBNQ1ċr~ S ڛNW/h)KK50d2R% |DEERg u5RX8GeY7ttJ{缺-܇&̥3"s9" LZ_=>?u>?5'i"I&,EPe E5@2cK;Ew*#@hLl~ؤ6W-5˸n/rq({{tuM-'׊=~PGwӦ^~%_؝ވ oe`FJ))e7@ ,U,+x!ĿJI b%n#.@A`?,}[^,BnT3 c,gE+`2NA|b2FrK燙s _{u=A_{5nbrƦpI &@Oy9J$1&bF,&@ZF6}'7qd?`eHȦ$GK؂Iħm|U= (.1? V\t=<69R5axI6awWPpD&uFg;? j=r8\}uxuXeh4* `{7mݶ]vjA3dv@kPw墹/hrHu.mB<1L&O#ف)HM˂l)z7 t5l{?}@(t6){-am *e-['OD ,7%!V:aZ]z~>v]bպqZo-+2@ZEk ֍'n݆LabG{[8 u=V8>-]Gtˍ]8bӇk(N@%(uZR!~~" PNwjF0?.m(;Wl;bb8Ǚ*sT\=QSgcrH;YI2q#.XZJ<0L# ͋1fXny~7E_*E6ވC%PGP@7Aʂ0.ZP(\kjBKKb' ,X~G$;EWJo3N+XySނ~2EofN[*8Xzˀ, Y(_vxhL<m'aNF*݇upMF$"8&쯬hڡhaˡ# #tu|.3&-m8X}K&ة5ʱ@96U:|g?@dlnZ4m&EQl4C#t#v8b!vO8:\Ph:٦'1JqMhfQNE7wd1E1^ol'}8g|Ut#SYi kbFҋii &g #Raշ^1,xT)̇Dkj8Vl\--~;ۧNs/~oKaĿ/2uCQJIhͫ3*B%fyTLB .cuPa9er f6.]87҅ ҳS1ܧŵ^[]|  Nz -Ɉ_͝4eEUk3pI0\2%7 vrL}KI DZ|:Qȃ$pjT]D>P{Fq% [23ZBXYV3W{h@.#KNT8kͩrca-:-QV zݐd{yS! Md&>8m@kk:gLN8&NJX{R} 4]p̉=X}?rU(+)BYIfYYyqB`2#XI"wW&˱3i6 HixPU\xΖwʛ8˙{pǬd4a&Zc?!6 2 -by.Z.pɑlC-Sf,Ffb|UȜK?||_:,+q4K`v#t4blrz0V-7]g k !.%.')EQd5/Ϸ"yJ'9QVR0_@4\.w |2 Zy/$"1i3"a`m$sh0nj95Pۦl豓xv_>0o>W#,Hx]D:J5<_5k 3>] V5촇MΞ,vWm0>~w.32㑧p ~qh L$`8HV>v+jyGRgD&8@@ov!Fȉ=Qt!=I6o?UKBZ$FQjZՠ1RlB:ba6ш 8|c̽qIvz15{ ;j4+kG㛡pK1]8,": * 6v[!^Qv[@Κc~GÕTWv `e-ت|}Eڎ2$)d=ō+D|ݼrU4%qXr'Bp(5#d1/gg8vG$6NڊsBmTZ\FnU.Wћ1i\UFku*!`j$y u(W]hb&8p2\lvܳwy퇰ɍSĤ,C$zM%/)Q4rQ?2(:'$)0r|\B9Ϯ+% N0V/v,Ϙs}JާAH܈rHJormB5W",/ MHWZ氞.I@<ęzTp쵧mS&%zܪ-KLd}5iM9y_ `[e% nc/G93rfjgȅ0.qXj8^f|AX1%T\ӳo6rV6HJO׻]1EPpr(XcS<RQǵg_rΫQ)dtLƒhWzy25{#x8xrg/q^`5ǎFʪB}y~j7##+hTyN}Z13hTtҥt} nJ| 7ÈP?n_b4b' 2;܀}y$D˃Pi̇fxhQ{82+&@0ITߣANxs܌8+>ۮuEݲ 1,1+31{)[wo_V =6װni&,z6g wWȐw\"V@Hi]]eVaBCwܜܾJǗ2LAXl9l# XöNH/ơʛZ l}[7prfh7fWn{\N]w!9K1g8!"Uˡj46:bmw<ҝ/؄ ݆ucJOJJ;ϙGNj;_ Q!0P~8uU>bGѧ-8|fg 7F0S, ñfKSwr~>׭XN|PvSŒ>d_3GM]D &8WA\1y#a@h[BjK&W+,{ӲK Wۣ^"Rs]7-){@BqJ joaT̉A&yD̄Q(5,o!v8diafJXo}hB mfQk>H%`q3&@H;A>!PY6Sو^ >wH3&9YŖwLgzrc bc?/0xT:yh?:W03">-x!8 xCa !O*Yř}:x *B8 Ekn; ;PA"L֮+s")D`7! 6ɞOY g ||5VaR0EkXM]pn9dWYߗ0#H՞@5!NB+\]F" 0&8J )w98IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.pause.xxl.png0000600000175000017500000001534012167200764025004 0ustar lucaslucasPNG  IHDRH^bRsRGBbKGD pHYs  tIME ]`IDATxݜyxTe?TRU @X *: 3Ӄs{;w@/ڷm(t;z[QiPPe–$B֖JUzZJ=Iԩ{}O$ȳ<]TSSǎ-.|j=˻WdAac%eEťKN{s 9}[vۦ /@>+gTV1e䍺ǏpKOJ1f)ko]4f{D-{?߹[h /l^螚I>vl\ve^N,J9^gpSOi{p~<|}s};/4k5:yvO @uۜu-:=#W y9MDmyV>ӫk=%'N_WLJ='Q+l-zV'W݌,{6}vm'?bq2Mtu PIٔd}9' #kbO>پGs}hWJ-nXzqBO?#٘"YFR*} >k/~ΎKC8Yvz /ܼ>Kԟ8D9MVE`k`Hz).O>SbʴxU '/dϹ1Fz#T/}??0w(vNǰ{ >dA ȡ};n Eodh#%rJ\n/./v6&Vouoߟ?Rޮf-@`b;?O/1_48ơ};XR*׀'9{|(oi/@yzn4{?}0$)[ ;P;5oV:[~~]XMrW(p?ð-7#;zo[RTZNQi]yK/sTnif^Sm[~G5yLr mݑO|~w"YsbiӦ߉ԹhY)f2ęsQZÙhk_^N;6wœ_A_F9Ik{.;Ԇ^,Bfl`]-;fUʾ5Vz%P =N7?Ö$xF> jxNkW/OxpoofpBC}=s'm?d6J7!TS'NWoXywQS@=Zpڡol8 صbk)@J?VqRVJQ۫3VAwV`:T7V}kb~pvŲ7/~W6h14̸əz,.~F^تEOEB@mn\3xy\džQ3cݼzHJRhdNM͍ŨpһXTNC 8},MMg)[Dv˽JdV$5t`uU)wwK>Mז%~ǖ|#pDrO~_IWkxV<.~[O_@8SgΠʔ%p,[p)iLObYnr$\i4=ė&WsaGWb͑%I\{[1@~- l<֎Arb>@EV|_]hNМK-=vlnTԇS??[?>jdPMW'#IRk? o4>n I.yP)N OYa j}s<[j5f9Fn¡A JIÙAlGJ28].ۑ$I̜17X'I>`HR &$!B.vZxeG]됵>Ohk1co=M5vo^Å ;MHb $Ae`^49H$8A> )Ϻ.v`?O-hcTKV ;$WðN_~fc8 'c(y!Z͕nyG}Cz1V, oE27?_z"!0gŤt (EJ83yٜ:̠ QW)@rI $I1> z. 93KnԜI<|cTWɚeI\Y|309'Iꁖ`Q#"f42(55C1hPˎs='ӳ쑁߾Hc3xhT'vm{xYUsJ$宝Zc8pBпR2c&N;*b1&"Q2Ow+Sa^M, 2)T+:ƶ[6sXp(7L)G%)Nrn#)7uW)=RgBL?wJ" {@ zxgR0f3 &sƇnv>լUWe}~|[N*2}U%qe}"itr';@/}3*@ySXTB(HDAcf $ E)!oΎN,~^/zI ޯvt&/77ȞHmxF88mgfԱ(mnf9.0/`88-EaKBUl3(++jaZXvd;t$I⶛w([Uhw!嵟R6~!/?ȓ >AV> VY8NJ,N$IM;n",j0 8`4qج8v1y@ ieVޘ(&P+ <^zYMu(&Q`pJ I o'B}}_˾'r{pܸ:ǿl*阿3PI:+f+b֬1SgR>^Fk Jͩ6YaU^/7sL:#Kj5NG`:)˝jQըT*3?p!-UqKMV[3o kXPw>졼u3xSey$5 l6h{R̶VEMBxA&2^ޑ'@AgkUA?%73 OjLZ8-F(nTѠKN+xjlv%<)MJB`xB\.g<"|B0 'f 0(xqPP/< $d٫nGxTxs [Q g"vGn6ɟF3(T*5sYn*Cc^#u&Y֣ rpڟgheB1;K&l`Z|oW $aUj:Ɂ 0D''0b>EVr7.1m\b6(䝁I TG;hlm(qe^*5j7̇?2,!+OYrP0cr5a2 bl8#ܔqP0(ܳ mA;zE 2l# Jw"l:\V1nT 97"6IR%!mik9'7ؗ@ED#U/%p$Hjm H*IUQGͲenlb be43MA1Lp 87ؗ;g^cDK=w/o&) Vƙ (wz'i$ 6U^JL&{V1Nn뱓iJ뽆f @]kuթIaF0MBU,YJy>$MPХF=!I z u='4X:l8RZ O{k VDTLgFOˍ`QDuP WJIIot}]BS((*&vf(V>X>Uk9Z1ޘAbK$)I;.mB̞M__-.[('7+ 5-(`#m̞RqnEx_LgѬ1߽UVJUYVʩkࠋcGkZ, ϠJ``iL}T?z^Y;tܷ`Ad9vH~ peZ:x< h(WShہLadAYYCj&zp 8P] BbEF FAV'P[NѰg˼ ;nhv=l@ ]t諳$Q\THٮ؛hFRP mJ+PΡpEɦxl; ظ zhG|/-tݷ4q3q <¼%@[-j>)sۀ+T1X|t&aHN[W$&@>>,n-O`[ucW֢YwuEmoiHPn=F<¼qA Y4'dkSșaSndSp=\5t0=Ur3Χ/~ nV`f8ʶ[y;NbN,pP'XN2,Y&M.P)i)de Anz WKܼ"1RegZv3c}x_`{wt=\jҏջ$qx$_lJQiq{s0Bp>RL-K4xf^ypMuVmiwY<8 k6Io\?FBq8r撅/ȹ~'^!7X` B@[۷fIaU+2(1@~̝25z{v+jY#ۨSS!$kUTQ\p $ }>R0U(8y[zo!DDRt>\dvv8/Θ]My7}@} x|qyA+g(/񣫁z!#6ʑSTS0rDY8<ܵ.VV !6dw\$sT,r_;-bGg 8È*UӃLJ$ꍧvyd9cX:׷ZpwB0fΈ DmPo3 y Pr7`HJY=維Kq#ޱ(6Xv]XLGژ_j;qiB|#޸%K}q/4|{c8  k:@a@C`PzX;o[6+u@2v"31gƭnkfɬ Bn\CtZl2{aYFt4UgP:S-m)K?mOV̽Iԩ_2wZ/xzBX%B칖|+EʁF&?`wԬo>?ŋV^IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.crossed.large.png0000600000175000017500000000471712167200764024221 0ustar lucaslucasPNG  IHDR@%RbKGD pHYs  tIME 0g \IDATX͘[lgvvf/_corB*PDbӖFB4@(/Mx} m.ZI *D\*T 4&$M$^ǎ/^sٙovu'f=9wٵ3C-PW ?]ނGY^x'NRIojf^,\ʤ&x$P\'JB?ϧ}~O'c;m_Kf-)G7B:=vn^ͮ;`h+\uBl̆Kfsԇ%L-<y02IbU^M()뗺QD @ipoKVke#muԓK8IvFԓKx7;L-QeF f&U6SHW38#}TTM@R^주l%jGy~|vRa((c1b>yU-Publt衰l9{ރ3-GXƂ&)%;sjsPDAX e؜`k["ZUq-n`^WA}U[}WڲEk¶^뺌N&I%b^%M5DPŶT`> xU*:ÌFw*S|q0(*)iǞ X4~(a [i^LPXưaZ674]Ks|8erQE ɳhsŇ^%>A&Y7a}5;`+IFk!PTTVUL$kh$I#Fccmy*ĺӍVdKZBj4Jc/^: \4k׷&"P&#k#<˳Yz6l.'$-JNEPGnd~z._ƫtw{JWK\ 1kH23ݼϧ as&&NJI&뒘B*E(ĴND#3+Pd:mzxP0 c g'OMlQǾL$,k>)gN} 8UiQ#@~9R X܊iCW\ۙa~\` [UpRkB4[!CK! yHQS}}qԒkNs=:|!-s_ !PQ,Y {W-ˢtڠkrNZ w=bF(,HWӽ")yU6bUw+䉧TA Q)n! ޳kgdI gΈ-;hWFFhZZ{vlVgw:߿hf&jZ錛F:'HgsdWn t9>/x]ů*J % XsbhT@Z>9v`14cSزiz!5嘁f@603dp,^TCEfĐWS^gٗĐ'~{꺆PG92Côb<&+X?#.ܘ(t]4nqR8.9ţ(8 K & $'?j|> a,Ĵf /Փ&5Eư/]kܓPUU ?!qDZsH!NضKQvXE$GP$HM$q,mF ^@'gvZc1zu^M' I).qx̷{0̈7{s)̑yb73I3E7XCMIk))-~y#ib& |~5O,%ID"#[EQ8<5"{J϶D"aP]B__?>/^˲uUʇgzy3YIӊ0MոX֦9CS@D6<(s''p"c>yH3U&R ! !3afZݞIONIgđd3-˃ j֮o.oF"-y\W4[ϖe(9Ѱ8J圯BG"]9OPݽ=qyR B>:y""O}-a܂w⓸%oCoQf?ckg!.&l2?| !,$"IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.error.orig.png0000600000175000017500000001331112167200764022477 0ustar lucaslucasPNG  IHDR@@iqbKGD pHYs  d_tIME  bVIDATx[Yu=^fzzpDɑ"K,Ӳc#Qap8A> '_Y$6-/QHV䐜ӳZ[QU=M\j["9BclN*9[ޯ +ݥ8Z,)%jifY**8E?u@ƗBe(Ɲ 2xzvxV)Qo8^tw>yJf8V* V `L`WH|m稐o-Yƥ-D ~'O=7Yyr)q*q{_̲`.A>#75kkwPѽ3iع-;Q5'?w/zdA"^/]l|Ag;ί8Na0Jw"7>kdܱeA;Dwv\C/ÿ -_3c_V+ HxzH3<rp3(B~j F-VQEP#(AG",B Ul=,: ΅迃o/} %""vH_>9sucL_:>{`d4''"F]*: "&A()c2|~m|Gb^SO^>6?!""{z/M|l{N1>#PAAp -ت5T b#gV ׮r~5Gk燑VBqh[ xG_eV}axLB@!TBhݜ__[XjԝʁS!?˭5A#vW [+fnK/|O^ZM`lZF{Z :Ⰸp yf[K3oA+qAF_5ŵZebjjW<`$;IS֥Zyٟ<e4~߫)=f"o|&ތ@w|V=MNB ٨;vn+}N^x-ˋD!"EDAkH Ԁ" a[Nnbbs)*5csYlaE%Jz]]Ļ+S'>]Gal[._)>X=vlzRK2xbqc)RT0Cc+␴gL4mZG&Hc0>wȴĂK;Zo"irB+R7h֪7{ ɻ>A*=0J65WSGo/J*-Z=U5RL HwJq`^*xų:noJQø4<|ڍkMH`<.?MAR-Κ澩'Njv' ^eTf]:UYz.'%PmnZ?RE ̍M%h)}Aqmj~:·\ >&tOO-?~8A:MhYЀNss wE-i2t`/(#CFoWAjOHk}cnCGc]$k$;NpA#'Nx5 ^Uڻ>sM5BW0sv[V ښ./,Ik}A'qǶk3N,5TnO׮;g/t^\xW5Sb02 z(Hձ\ZjRᜰg']O=75G=~BhUGvz̙MȺ|||L%\Itrdd_Ls2em엗:L73x4!} ῴN###c+i RqJA(=FQ((q5D޺PyԜNhqf"B.4ut)5p GZAZ8?{S/iX;Tbc}TR2!"2ە\1<1GX=ʰ`=dBD&qS,  =VS90}`^kS`Dڃ%"KLmw%0mJљHsÆ1|<+KqșA.L<4433N˧ 2/R ?:9^1f2*woB!~ACRPH!>V̗JǙeqnY{>F9z++ XWe]}wOϳS,WޯxR4YhX48<pTӾe};@06LMLXGVZpLnBќbXu;8Ԍ)b 2Q1Gф~V](-e}HG|-e(g)Lg̐t\=G˴ly\2-X5,`Y* "H߇veI.4d ,e& O= VX?Lc>,011bAXLw=)% .wQ96R{PccDObZIhd MZJȎ ĵȗGʊ B)-J>W7e>{_jCBfԉgCbqNɓnK@O']61hKRi?*,X1MoxD 0 BDн=Au01nZtJۣO!Nd' 8AL9)*o&bQH+SPjxQ'{3 #1 Ĉ²oAu<5$f#E2 <:uOD` ]"Ҡdjo MTy@LgdI.SBD`DD` 2^i0ֻJkׅ_5.-R$@1~Dx.x("wsE'?"v-`uմDs{{b$>%@KEpΡw“в|hҨh7J^]o)gD,q}b`lN_9c<@-Fo"/&|s+/EAp-vSI>ωǃN]\X`qa( ]{*pпL|BvR#KMz,(>(b#!4wDn vw| ;5ccϿ<6VkꭅPj~Z(,uqy(U$ ["]U q,ȥqe&v1 ?f{N# %KKPDӁ 69]$}E)jK+;Q #'VU:VN%jXV{#ϖh1DC6wj{8 Ċ{~i0bN}ggaZ\fs)s*5БU)!>TEQ@K{Kcp. >o_pwj'B 3U'iFV  nc!I]QPRݩ2Z-[_[Tv(/lM,`qwucVO4~ϊ>9΄4F~mAyR `qWY$0Ua^߀b 9wN}gw׸@t)x pT=_7!G(L7 mh.VӨ%o(EZW;3sQW_ ؾAf#gi; ##ܲ#gDtܛڍux\hUQravJ_߀Zt=h!?44BgГ͵3BIӤT.{q r~LSRprےY&3b02!% }=?Ծv~Z#؄{uՆZ]fV~Wc]Nv0qtw'`v܂>wAEk2W-U-e-+u[qrcL9L1Q1zV_g$/_h LkR}VYz"i`s\N CۼXK&#S%nU4SwݻM ^(hV wDm~m Օ>sQFW눭_["@/1bG&˯FjRn0AEg& Cw{S8ż́IDqx ַOQ&)\+Vk>l5]A/~:nՆJ.2-1ʍ9(/4]a+6~ yh= MAʒir1?`DNT!MQ7ΥKb_/˳OV %.A lmý`}V L\JO~ gryx-`x[ӟ(~䘦 ]5Τ.V*ppsʾͱ1.rN` @(tE܍W#7i~qiBD- x5D;x:s˟ioQF)Mg=oTdPǫgo8~pqf LS4%Y a741sM+ F'AA. Fg @k 9_Ջu)ЫIMo[L˅ G+GgG-/7lSnL}}{IfLk%g~CH>X$  F-.>k3!!b=凊PhbZTc$5XLߝfLDonڎ c #0179FF", ", c #177FFF", "' c #0575FF", ") c #0058C4", "! c #0068DE", "~ c #005FCA", "{ c #0065D6", " ", " ", " ", " ", " ", " .+@#$ ", " %&**= ", " -;>,,'& ", " -;>,,'& ", " )%&**=# ", " .+@#$! ", " ~ { ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/leds/router/nothing.xpm0000600000175000017500000000060412167200764023574 0ustar lucaslucas/* XPM */ static char * nothing_xpm[] = { "16 16 1 1", " c None", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/leds/world_gateway/0000700000175000017500000000000012167200764022726 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/share/images/leds/world_gateway/README0000600000175000017500000000006012167200764023604 0ustar lucaslucasMade by Luca Saiu with the GIMP. Public domain. marionnet-0.90.6+bzr434.orig/share/images/leds/world_gateway/off.xpm0000600000175000017500000000061712167200764024234 0ustar lucaslucas/* XPM */ static char * off_xpm[] = { "16 16 2 1", " c None", ". c #000000", " ", " ", " ", " ", " ", " ... ", " ..... ", " ....... ", " ....... ", " ..... ", " ... ", " ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/leds/world_gateway/on.xpm0000600000175000017500000000131212167200764024067 0ustar lucaslucas/* XPM */ static char * on_xpm[] = { "16 16 23 1", " c None", ". c #0A9700", "+ c #0BA900", "@ c #0CB700", "# c #0DBA00", "$ c #0CB500", "% c #0BA500", "& c #0DC100", "* c #0FD500", "= c #0FD700", "- c #0ECA00", "; c #0A9300", "> c #0CB000", ", c #0ED300", "' c #10ED00", ") c #10EE00", "! c #0FDA00", "~ c #0DC200", "{ c #0A8E00", "] c #0DB900", "^ c #0CAB00", "/ c #0A9500", "( c #0BA300", " ", " ", " ", " ", " ", " .+@#$ ", " %&*=- ", " ;>,')!~ ", " ;>,')!~ ", " {%&*=-] ", " .+@#$^ ", " / ( ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/leds/world_gateway/nothing.xpm0000600000175000017500000000060412167200764025124 0ustar lucaslucas/* XPM */ static char * nothing_xpm[] = { "16 16 1 1", " c None", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/leds/switch/0000700000175000017500000000000012167200764021357 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/share/images/leds/switch/README0000600000175000017500000000006012167200764022235 0ustar lucaslucasMade by Luca Saiu with the GIMP. Public domain. marionnet-0.90.6+bzr434.orig/share/images/leds/switch/off.xpm0000600000175000017500000000061712167200764022665 0ustar lucaslucas/* XPM */ static char * off_xpm[] = { "16 16 2 1", " c None", ". c #000000", " ", " ", " ", " ", " ", " ... ", " ..... ", " ....... ", " ....... ", " ..... ", " ... ", " ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/leds/switch/on.xpm0000600000175000017500000000131212167200764022520 0ustar lucaslucas/* XPM */ static char * on_xpm[] = { "16 16 23 1", " c None", ". c #0A9700", "+ c #0BA900", "@ c #0CB700", "# c #0DBA00", "$ c #0CB500", "% c #0BA500", "& c #0DC100", "* c #0FD500", "= c #0FD700", "- c #0ECA00", "; c #0A9300", "> c #0CB000", ", c #0ED300", "' c #10ED00", ") c #10EE00", "! c #0FDA00", "~ c #0DC200", "{ c #0A8E00", "] c #0DB900", "^ c #0CAB00", "/ c #0A9500", "( c #0BA300", " ", " ", " ", " ", " ", " .+@#$ ", " %&*=- ", " ;>,')!~ ", " ;>,')!~ ", " {%&*=-] ", " .+@#$^ ", " / ( ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/leds/switch/nothing.xpm0000600000175000017500000000060412167200764023555 0ustar lucaslucas/* XPM */ static char * nothing_xpm[] = { "16 16 1 1", " c None", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/leds/hub/0000700000175000017500000000000012167200764020634 5ustar lucaslucasmarionnet-0.90.6+bzr434.orig/share/images/leds/hub/README0000600000175000017500000000006012167200764021512 0ustar lucaslucasMade by Luca Saiu with the GIMP. Public domain. marionnet-0.90.6+bzr434.orig/share/images/leds/hub/off.xpm0000600000175000017500000000061712167200764022142 0ustar lucaslucas/* XPM */ static char * off_xpm[] = { "16 16 2 1", " c None", ". c #000000", " ", " ", " ", " ", " ", " ... ", " ..... ", " ....... ", " ....... ", " ..... ", " ... ", " ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/leds/hub/on.xpm0000600000175000017500000000131212167200764021775 0ustar lucaslucas/* XPM */ static char * on_xpm[] = { "16 16 23 1", " c None", ". c #978B00", "+ c #A99C00", "@ c #B7A900", "# c #BAAC00", "$ c #B5A700", "% c #A59800", "& c #C1B200", "* c #D5C500", "= c #D7C600", "- c #CABA00", "; c #938800", "> c #B0A200", ", c #D3C300", "' c #EDDB00", ") c #EEDC00", "! c #DAC900", "~ c #C2B300", "{ c #8E8300", "] c #B9AB00", "^ c #AB9E00", "/ c #958A00", "( c #A39600", " ", " ", " ", " ", " ", " .+@#$ ", " %&*=- ", " ;>,')!~ ", " ;>,')!~ ", " {%&*=-] ", " .+@#$^ ", " / ( ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/leds/hub/nothing.xpm0000600000175000017500000000060412167200764023032 0ustar lucaslucas/* XPM */ static char * nothing_xpm[] = { "16 16 1 1", " c None", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; marionnet-0.90.6+bzr434.orig/share/images/ico.exporter-jpeg-16.inv.png0000600000175000017500000000105612167200764024224 0ustar lucaslucasPNG  IHDRabKGDC pHYs  d_tIME 'k$dtEXtCommentCreated with The GIMPd%nIDATxڝjAvpڐNiL7Rp]0Hcܙ@6.BZ)ib,ޓb 32{=i*@y#3! 3C&$#Wqˊ~:I#HV-$d̈ јVc0H%fˌ?͐{N&wӛTUķLYMfXϨ,9Kzד G{n )nsr%MCG# | F)I. _l0_&"`^sr89ᩨ-XJcXb`#v-DQ)jt[Ue5u!`bdFȉ"gXQ7lIp%Tf|@W[j(JJi M)e tY-KY+nU˓&)دh^E@!ں8=p˜R1M)T?ދ0\4R ) $s:QDǁ"^LR|av?5K(MC+>A(TsrN\ʒJNW*@8zkEx)JT}5aO캋STTd,>ˮd;M(<]AqhFG;"/i \ gvu[^>Ps gxj+x]B6#Lb V5U!!Pq\B!"mk֒8?|`IT鑝/K(U8L;p0d>q<>qGp- ktDosMwou ӬNDGQѕR NͲ:ⵢ/3Hޗ;!NzSY:1>Ex_ӡl: W-Fk:KnWh @J44M<٬ !OqKOUiR(iwj ^=1 XRS&&ii0t˻49 && |>Se*k \M-r}M6oBm>L4Lr %ٜ3v;0 y N{d+o^K˒Xi6:m.]A3MP 4( h;"Yg%qҹ,|7Ť`  3= &SV\Ck8dE!Vϻ.uvsgq\kY-TBVQٮ"PB^_޽]Y TBZeE4|W\.7w.Ҝy?7Ak*qut.oj}.Z^7_S6l k֭<# B. ɏ_VB+#/:e#ow7lN'am8d^{eYZXֺb\.233X~bOgryqr51z^{Oss)F"&Tt&iZ ֫[^0Ù374 ADH{*q&Eoپ0HC~W2Y^gX*k1)LҴF4'9o-Yo-;8b\ϭ_9Is/yh붮`]5658 5.?R3yz k}f۲ "ā+#i3]gN;T>]L A~"~ƦR?I+}qRx<,mۻU }=%= GtZX`dV2>𕃈 _E+#}X>GDRa$8V]c,oHkn*O|[jDh$.{_qa{8&&F&ؼ " ?ڍ4΃Cau?7m%v$" ;WDz)S;EQѴyg{q`믽G[777 rn\xT躁aIS|a{=vo4ȚSJ Z THRi>~Kxo0<-";;af\?KXMLq412h4doB`:%~N84 mu\?qqE|Yt]GdÐ~ }2@)CÔ8Ijdtq,}qHx̠gqq4I(WDQirek:hvrx4"MS>|>8A.#_(.rJB$RҾsqEa:l\geu\~x`Y6J|fRb&lFǝjna!N)%J7o4L"lBA@hFE,벷q4`mٌFC("I,f^GJ* 3WS5QnJK\|i2 C!*U#pQ,SOۇRl|__'''RQJ~GcG>UJwVBq.?o!P6&.}= ,z!Ħkȱ1IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.router.on.med.png0000600000175000017500000000262612167200764023115 0ustar lucaslucasPNG  IHDR= bKGD pHYs  tIME 66AK #IDATXoTE?sfn=m͂-Rl()EF# / ނoBc01K R )[Jo6>VTo2͙3fce1coI,(nIYum2*H$=J*V8ڶ]ێR5e.rq">µN;1=5ujzzzpttt, >YxDIٓH$̅ZGu[6ҮJ)RH), !0 :p>9]Ӹ˟`'\bJBiUvWqRdHKbI ˒X@a!3@T~G16ob͚e`fUR3K{|x]uC+į]RNݨD-Nۉ$?,CQ0 <ϥ(B9J3qH]ZnF!`b0Yxw#pSM`0 [ӽu3%%, O`Z (QWLeߧ^C%ȬIY޻nV]飇8?p&n7fv;Q0uo:8 h?Cc ȹo\(7fȆ Ќacޅ#zaEgxqBSZz|^S!ind'ttmk#nHnxEWN-2+Xڼ"``BZ,m4Sb9yз4W9T~qK ډ$YLMr$3&:5~5qq%WOfZ۷. $)~lRLl mrC"ue@'H9 XaaNZ;Ջe[V#d^H&< Œ޽?ٰIgUk; ȥneʥQ^Sإ-:4~wrKn,ygo7Tߒ&ВbW%%sٯz7z$V-crrD[Gˍwts&L@"5ZD"H)]ZKJJ%)RFZ Sc s;r pxɋEE5'IH&mRJ@7`/W*eT !Դ&Yibf>~ѝ[\mxeeӧݿ@!U¸ٮH$|*Jr;a'S( ߸9kz+siFcz~dq|_dr(1iz>A[q7+n5NϘtIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.dado-no.24.png0000600000175000017500000000332012167200764022153 0ustar lucaslucasPNG  IHDRw= pHYs  tIME ;t@tEXtCommentCreated with The GIMPd%nFIDAT(ŕkP r^ U֌3A*RI&56δLӚ6f&3aFSͅ U Q/4aDae(,.,ޟ~ 13y> Vc/u(8 x ~xn|>?CO`i twR'؎ G~ԩ_H04Lm9PH7`dY2wB86Q ?EE_|@+BN4V[V]{{t+ @]):)Cg1+3}:h&Z/3s+L$q%B+QX^Na<$I|0Ƣ9'mwāSs ӏfqE𕗃 IdXG9A׃e8C@L*W&ڶy}S^y͛3)+ 9s!@"$ɓA@A=vc]]\_[t.EUQU۱]n,c5a-cttC@3XPn/pēMl9)iAr06i0{lIT= ƣ mNq^dΚEuM/2`1n`Y@ tw6eJ׋/DCf&7Qn2'M0 ZÌHKK%77D"i( QsS,6 Iz^Tn0H$B[ @[K MSc=Ugi_<<88&ֿ]&<$gpz:23>))NKCa"xmضil[SYp"1' >3Hln{OP>ʗ}8̜ &!.']7vWUUdvt]Kv0 t:ťgvO"pHKKcَrqXo/IU%Ƙׇi1]c+2fҒpl6lFxWPV[Ŧh.ζmŝ==daxT…5w ޟYSҥk:aaΟp R[ZZ:5oP(|۶ⒿWTTD?z҃SKbIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.switch.pause.large.png0000600000175000017500000000526312167200764024124 0ustar lucaslucasPNG  IHDRR)~bKGD pHYs  tIME $? @IDAThLTW?͛73EIAQhu֮fڦl6۴n]ڄBfl6h+VUJA"G`ffyo _7L;|ϻw=+Bڎ2L^V^Q?q6ر}V9fUFL%%ݎэvYmq`Yy6}gsreLؿKk_++x1ܱ}[~=VOKm-d8:E$ΪhSl` Y8)w\.G3gW(^zقBvgRX@]H"{vǖ $bI+ATM' x2ɑf߱U|>{);XsFic;.^xv#/p5Ey{>2lzY ?zhסu `L򊖲Wgd+}>:@%j>'&{Yr=;^tz6]mx%盿{ݦGb#OYy]ȁAjkha»H13oCŏꁝz:sVw7$&ۜvuwtGqr`ӦS f`ϟӝsμZR?6v9am冽ke-Dv;yw)N5ځz֖/ꁫ@}YyEu8 1őĢ{27HbU% pn{Ӳ"wl߶Uk)($ՆPx MuItLJ>ucTth޿0] @ՑSA<1c#=+Ku"KZMCt9tnmvh%.`fy~h|β 4 zikjt n 86=X:~$ D' Q߉UJP!';E|x ";EɽK"2t*x=9"iX6 hXwe]6k<o^zAs! oVk7;t1(?¯ACљ&Sخu1=%vR8wf'BT 8j)֙b d c"9h?(@^E,Gq 솇^٨&41H_Bl΅ utɩ,H^Q60xzf2nPI1 t+Vdf.j!#^|فyg rn TK-)pZm72X^Bn^Dz Ibk֭^7Y0SPȒ5peUksE b0bIE͊96͏R2(3cnBn`A'ZK\WW5z-CS-MJ@ GKc͏VY2q{qaXY!ƤQ!zZW'&bSj_inf >eh%OCd M%Z4021I T|j/~??(ZL+(z.>;mc浒eYR2G.W{]'nUbgR6ۉQ]޲ { oGgu3Axb[ުD=pDLqAT֋ںLY Ev3^!Z&ug1o<palE@iA]%oB[[-5|ij3Oe`l6'o`ǷdY?U׾>S6f+n'߈oF.d^BČHum&^Lzz\ dJ/_ϼl9>IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.machine.off.large.png0000600000175000017500000000651412167200764023664 0ustar lucaslucasPNG  IHDRUJubKGD pHYs  tIME 4/X IDATx\[levחk{%YؔC-Š*URZ-xhVy-?\jժ/}ɉ(D΄,ݬ.N]YqFoӛ"ׯ8D,3y>o =Iy  T 3+O5i;ż0ˆXj;"yQs+W {ISܴZd9n2! @1*R> !uOuS,fb1r[oIx7(睕U_k.&Xd\VBuvhe2tu(6mYLFAH9ni-uiJ@k:TDRgKp1ק;~Owȓ#MT$r-l:v @8?B1tZ9yAE֒ Z7JU.妷45Ns Yh\V2ǔRJTک HYObf`),-d@ff*-rE,f_ t^" Ij-O<=]%LלPeC+C<R)5,Q_QS[XU \<%d0~'Kgd:<<H/&ASITVUkOo_ vSJA5@} pNuX#*R*ͭRi\/;Hw(Y[K_ēiCv_q;8|OwWSo_(cg'.aj! JBIT@0m/maɸ)VI4`1b/sKҊGG46Cb./YeI|xD'sҺcඟ<4[-w{/RXm#V"T)_҇%s96q_7BS>2F;kCA{a8¡^uY@[6Xљ{jegh{c"N=x )][m(6z|N}M_l6)o+IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.hub.pause.small.png0000600000175000017500000000220012167200764023403 0ustar lucaslucasPNG  IHDR,e~bKGD pHYs  tIME (.M-I^˲#SWWX\ G7Lɣ&= o+I:bx'WE\.(h$Ih#=2e70C'BuUO&J%pwVo@`YE$/vzܒT7#1B(_uNT/٥Ԑd^0ذA$me+ʲϘ\>wv]ŲYvH&=4Ƨ|wя?ryNd$䖘Oo7oYXϫρi0(jB.Kfuɹ(MQ(@}}},#333N'Y]!,UzQa`Btl, U~K[s4ͨ&N3%͞liko%1G##i\.W_pͺ7 F1M[B-u<[Iw(KIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.resource-2.med.png0000600000175000017500000001765712167200764023162 0ustar lucaslucasPNG  IHDR@@iq pHYs  aIDAT8w\W?J]աJ[[-Y%+KlK840 {|< a̰f`Y;ٱǖpP%JԒZRZVu酻V syu{{߽-ܔ~+=_I)kxĻ27Ub/ GG뿱|k uք㩪wkәtfͪm4=<YL--5o|¯e%Bgyqmso >7o^+tl6O0'K388};D(cN+@+ ڏnVԆ|Tԅ|o{ ÷-@l["% y;vJ>/3Ld2C>_$+099ITbÆ5|T;4gώ$w6|ݭ@@ %˅^Y n kSnfT0 EQ ¶^2^7wFmS(fR&hl NH&3d298'|fږ!e7p'wl{c;{toBreﮚXRgy䑗Y|:UQAWIjkgt{9`\qŕ(aΜy{-[uFm@JBDGݸTWUq! #xyY<x_>qwm_ᢩ>@BaLƲ]'ߤ9e %0N088rɁ%|"|?)o0MX,3ϼS#躟ٳ)`rrQbx(P,樫fݵ7$_ȦVStWϻ@bIJ ̙4I$XRx7;,۲e.n7UU"[a||Ph躎[|/)vUuw5n?}/{<|捋׶H8IӅc?C[40M )%+Yfea6ҲƶeڶE"w_U4Te,b˖-<3r$RTVzX lpnkF)3׌Œ]b@0.~b*l>5>5u((#&iP,X0JEbB8s/ U,bqm`pI. f^w1~WPv4fg<̽g).*\Gu*| Q*Xs8P*0MmcZ֌9VFmzU ;׷RpPUٍf7a\NMq"LgO ְ Eq汯c)س*{۬N W'w4rwa8Jpa% 4zm;ϕľeY, 4RbYSSyZ)d:2"\]*+6rii`tDY;ړmyl/0Lp""#_>]At]T2Bb&b MRӞA X )%B0J|]+On.裱RɢX̑L\TT8H?tQvJL#wp{1`)֟>H| qxi4]`q3Pę0!NSdB[Llj nMs`ʲlRDWwB2U\)NG}|){%iϫrؿt]-9@tȊMXPBH]!_\,R`4dY֌gR,k%'˕S$?[oerm_5jll7/l3%EK;fG z#KX BxM |>7m;K)m/l["i&do? _8]Rn.oa]lU q㵄1}k u:J +/G^qI9zڲ]^wY(1޵aaC2M5 ߿yRoIp֮]G P;/Q]=[@scؖAUU{]mN͛;3n*]d羳 N ?//0j˖*|e 砪*CQǦhi)xg%PUF8 \aZi]*pxĹ:aRy,ch4S^83x<Ɔ 7ÏCGɞS[{ TVz,(4r]@]OTK)w隶lA\TI/_O_^*/]д:.s}]PUEQ^4m2"G.o04kmg׮Wa5rx[&TG0XM,6׾wx<;m?{{6Z,EYr$i*lۦ2F=ϗPMf\6@Q0X"DKeAß08gljj|lj.CׅfddZۨ  b+8tp?LPt'8ȼOoz>W!OE,b2ҝh ۇ4M\Ef,c]q&&TϽ+\Fss >_(RrAQ]{'r^҄-[^p]MCc3O};A*>J6W$x!jHƇɦ"s b\>C8usuPspap{t{Z?sʀl6B0X͑' vǟ9_qaߏpWqr7WY4ZX[%4w'&{qf` KTЈOϑKG0KiRpj0>K؏AK9\g.`c''xY*6V^ρ8u?nϰpB&&&xؿC_y4J{~ yI&PzY\^.2|:rzL ҾpXiJa FmV60M\}iir9%,ߏ闬-2"- e٢|1\.7۶(w]R.pHs,NR4 $tGpWPW}U;La&XT嫮Gu9)%RZ嫼62m9@Y/1` (J~EQgbp8ۜ^N3+la2v$k(mȆkx5]3:8zG \s[ZmB sϣ~,%aLV%3Gbt!4?F~T&O.WyNli;M۲nң9(84&=8sV2`{E**PsN\D.Wb2%ʡ(pz B?47͢sIE nVw^vb 1:>ٮ*2˖ iccBⲥ)jZL ضA":,3AX!B(*|DfYK/>=wD48gR*䄧cCOSت"F,[FU˦'ƨV񷠻}o15qBkj >6|0.9`[Hd:Ӵ-(di%Օm[hp/3y tpBI4<u>7k̦ػ;B$4Z߳ήv0L՞~n#{SlhޫٶiH$+7c4D>"#ڻgs*kLliNXM.7Id$Sc%aЧU \%BR2 ')"dsN](@σǭ( 8ywݸ߿M9LΎ龳 mx·@^^r7xKEmOw/y9hl#@Q1 ~դ\Co!z;3_ >9e0"F+U@ 410FsWSS]CݬJ*|޲LxЗjPBHTU!{?.l@H8LӬ WhL *gz\GOFb^MQ5TEö`2ɦ&Ȧ&p+Yr)K{^{uO&;S^㤺,*s >Z:KzAUmM,jMEEB(\1^ئIƟɽd2$T@ = TVYp~`d|l6\sZ5-=uj۲d:K0^bKҤbl`/ފ MuTW߂(qiyZ@U \.-Pһt Ul/f,ȪW?3ɪUk [GώRxWYqGhXtGbn׳OwRST("dҲ3@" hQFfUE 8|6Jl+E%ؽ\$>KAB 'T(:hx/6mz$*vm۶ryq*6r:Tz4 xtm׭S/l^wT֯Roר#6M mP4lTl Ps1Ft#}"O*H Υ #"07t XtPǣ'S<>wC2ڟŧR8qJbB( AUT,rʬ`+ EE 4v(Mx@bF)͸vDj!/G,u]EםK3%W^LKs#l}ʀKc) 9fbZ(8ߢzfl"px8q l'&1:JPQѐqҼ{]j (EEPȥoٴj08Ο;y!j3cn**\ضwWOHf822=!XmA^)q@‡&\)eeҀ}|Xv}QEp3 ѻY#]-S_EQ7O$v;9LIrpbh$*j|oa4DgzOlo 8;U89[&-fRŢg|6V85pD%4l pNL> H\VҞr?ϿkʍcA[qT&9^S7w{'8A޾k˂zp%%c}nl 6:R:ĥ\QNu;ș9#z+ePTTg v/ oJ)DHwjǖ'ģCCp+'3E::'8s~,Pw,p 9 :::9"cUPp9"קTytWWgv=PB+S^( =e˗;ov WCeOğU~1=S;?Ɏ Z4$}?e3$%}MG (Xxuݸڛ֬ZZlP(,pb6ۿI$z@g,bs{7L<tnb> Y pǯ883۵U!IW0TU^Ιd B %,ٳ]NӲvUbfAN$Cy{}PM*}o]p 7nX9{n[S--\ |s:`,='u,νv㐍)$;7ktBL/)% KS?z`Wolk/uW,HQTTÁ#HX"{ =(`ҿ]os.t "JP++mmMlLӛ&MuxݐDTjEʇVtGfa9|80痜y~>y3 2UUAl^8$ $  $H $H A H H@@$ $  $H $H AI A H@H@$:`'Ԙ@Kk[f;`I $@>NsWvvv c vNgkkΓw(s.9G0Dp6U(*< TU\$_himR lnj%8#GQp8s$InnB! Ie[@X!I6Z9c ,/]qȲ,CcP󘞞zX N-mÛVQuj!D$I$222 $IHCYHOh/11m\F9.PE_dȲ[*)1yeaͅ  G"=P*εfl]?P 5KbS"I% ׳I$e!qn9g`e`z UiU@Q( EMd)&{T3ke!C0D( vYa-mU lnj|WTPq(5yё֗slZpkB,cC.J?o(#7K1,;VfF TŚM*DS!MԳg8Sf?:;)J)݃NXy+*6cyt|p sΓ$ƅ.º6c΍1O2-Ӓ3ΐg.,QBHh42.R52sL-3mYl8t(ҙ ^0yo+[ge5gs=K`zۂk:W<'?:v}t/v]u `H/]ͬ;+]cUsc#ob+*nv۷F<: %16Ѕt`ka9"IJ 9՜QnB3gӈ`zr}&CAN ۊva7A7?я144,+@h:\TףI}g8\V"89b^h2WhncJc'lmS‰2/mAyTMۛ7|DY'%/H)x7鱯Wm^N'緃Xr5 ' [i ʎ=Pe!O{ % $TBh'>m5uaBP.iQD]p*~w{Epپؕ;{Winj^+[ }O?.~+/+_ $zǖ~t $H AI A H@H@$$  $ $H AI A H@H@@$ $  $H $H AQ$RpIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cloud.off.large.png0000600000175000017500000000357712167200764023374 0ustar lucaslucasPNG  IHDR@0K|tEXtSoftwareAdobe ImageReadyqe<!IDATxZ{LSW?m뀶 HQPt*ɨ?:Wm1NJehb,?|l:)"l((yclڝ6ŕկr{;wz8(Ȳ뫝$(nSXk*,eGZ[-gZ]m9RTt Q8^\?vx-vָqC8>E [|\iZFaRLIF/_b[JJ* ~4߇T*uG,mc0tdOՅỆzqՎv><ǖpo4[*@axV]~+Y*qbXy U_oL.֬]fZ$)i2}˗+| v7no䥥!̼` dL|D9f~566V "Ms&=?Dp[ @0P'c;zo+?2Fc&T(+dfV"Ii91ш(JTtZ8cgs=v5%>?@?¬R9ծvhҥˮaI:ݱſ9yJϖol# -"Î`R EZ%Wkj~;o-n&!ػCCC%BA M 燄-y+ t~0 ,9Ksk29= 3::f`>996S{#x xmKР۳L 1<3XAt0ic|`GSu!VwrEw/Y" 8OLL͝hoGUUTKsFgt"̹={DٿG"=ڣ?6lI;s山1TUY.qcP[[)rBը(% nD;(أ 72 E9IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.hub.off.small.png0000600000175000017500000000120712167200764023046 0ustar lucaslucasPNG  IHDR, (_7bKGD pHYs  tIME (TIDATHՕOq?WorpJLRL4q0:#?0&řU7Z,DB]`CaB|򾟼|^<9ё9΢f\*,ҳّG3/$VA0H$\Ѳmb˶*!徴lfGqLÙ[ Y*u*2621zx BBJRjG'._ʥ@ !0 &ml3la# C!z.+<=( 8JJU\鴃Y(D 4FRSL,{i[NѶ;) fr(S%W"RV+Wۓ R=lD L4___GtvRՎQ//-ƍ7wcq@.ϬW %Jّ 8lfܛs8ߟ;T7 9v.sUCIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable-serial.xxl.png0000600000175000017500000004701712167200764023556 0ustar lucaslucasPNG  IHDRpg3h IDATHԽw_u~t`'%f$[mrU}- ?Q,U#M4 :jfI`eaZ( y ,!@UTU% ljcq4MC$dzRh$;wz4ٓ:5;;Sƣobno/0p̩<0Pٺ]LãT.P,(45 8"_,I8 8mW'$IxB(Dd"A<"#2,022|fpp?r|tx[ xҥc|dٟm6CQ6~MڭJUb(xX,N*$LDQT ۲q]P,..b.yej5ix (iR)2~zD"a{xtpihh|rER~o_]ŋ?mQu66z2JuQU$tH$z؎ntt:TkU:mqDAQE I@up=A۶ZrD.V+`&*# "N11eO_vxK Uxم ~j ɕˬoQUp]X,ccɤ$rFRhc&ni:;1"oPYE%B pP(J$AQ:mb)m"K*"L1C&=$y ׎;遁_9v+0To3/q=NWX^^ը#06>$c;DETRo)4 ڝi.("J! !ax*H ==}Ģ ,ˠbnZAdx, *#wu###5==i i"gP a}} 2Og'FݲYAqJ<[dMLKql@@5HX =E7L7̀>bG_r"\Y]ŗt윚uec9Bť[zϕѴ#L7GT M6Ѩa:k 2(jhZǶDӴhw:G0-LB 'F\lS.`11h䎉'~e޽ʼ%Nb~ڋ/yP1M ϲD8c!Hqyy qVk\vvh6XM (\:F ϶<MH$ғ%J$Dc1‘MC PT[<Q+uںC4dIBſZ$ APd˲mzg@Db"ݗ! r?~mxxp7k6?駟z$-/66#ٳbDX¶$^fin`;.p}{355HXb"B2p=ױIr`>2G_:C<|41%/iV$ Ejn6c˗ʔM\,E=?,g{=(2*w7 #y(`.̥xÎ-w>:v߷^ߗ{ǾS9u mfgg8qN8dY.R(lc:?=Dq\A<$ %(x8$1Ah$B"dXD_ E(n\]p?v>ѰRzCSh4TyZyE%uAȲL,0D$$Y\.pyu+8.ff T'Ʋ~C8==D"aaV{nـ3l OQٻN:mRiY/e D`lld/t+m:6V 0q]˶EUTEQkjȞMHrK4w4:KWR[MSs\BD>Z`(t8SO/.lFRTR=  %E.\H(c$=cC7rOOOaFi~#C +i!^~ ;ٻ 2"37wrnX[[!bYΤdd2zI$RI .$!!8VhR)uSdVy.^FAYVV+Xx⮻&ٗX,VPU%΍i rZiX,xgh4CDT5$Hp(Hv{Zή]Әλ~s_)o揼t$}ѹ9ο|G0;{J ,,ED,S*pMӘdxxQo&8(u WKX* o~S/dm s; (ô-r,a&A&T$8x䶿?G?u]Vo{gt2l5QۛfxhYDb1KoI瞻s?Cѿ_ύl駟*ɋ'#ɼ}?N6[!HR$I* KKlg7p=`0@t:M?o?oUU=Fxyˏ4K\xb, z{RubлNVtۿB7 -@ D ftl@@#h5R=ض;qۏKzo~n?_|Sb}㸜9*Yzh6d2i\trD8HPUL;wrwpttt.@G[eS~?Z\s*ΝѨ?f߾=ٳOpĉ޽{GfzzzJ@^4-"(Dt[[l$XƦW'(g;v c6h1ZI R WTbxǿws%,l0?G<ejjiN~txxpN2,e2NNNf?wpp0ڦX(P*0Ma6ֳSNNmɲr/wSF8n;syyivu`p06h;Ģ1AdaaAH_K$՛'܀??lt P,eff X^^dee AX,JVPȳc$ǎĉ=z#CCC $\K_y7-.oo8G*`zz':tЯX,_8n>i&v>tX8 gld($I"`S?dޞon\ L }=;&i#J8&N!KnuCrrl|p8P(tS)4#_c<ʕ%#Kn;N2GUD.]UTUAUʥkz1=b>\\)*CC; Od2MO,S} Iޠl%7$1:6\gll,!£ȍo/^ӀjilsL s@TLӤjLǏswr۽{~4~翳^|Z ػw{4<<]v]QD,kg2oE/ŋ_;'?$KؼJ4\.c6pp;8v{ƍ>5ͣN !e<;FGG߸YߍD"Q:55<11⼼I`hh]KKڿA׳En؈CËg%jx4IR@l4 b$Ft:"B'֍{;9+?>֌n69i>Hf`0E66GBdmA*5q=?"MWV?$ 2+WV3,woތB8vKTݻgnRIetŋvMhpcFk:DR)0X;$b1S0bSw:upKsK3?B,e4rmLdff\.ˮ]S8pxǩ oFgϜ9p0n8{_zprrF@$z$hѨulKfeeiAQ Q2s~pdlt˲kHeۄB!puc=g=e$y= 'ܿV{C.ctxkWXYYD wmξwtttfx%_J:jY^^" g>gϞ=soF"֦d2v}baq^t z3Y*񼪪5M!3/ݼqg4t:LN c:Z@A$4uҙ4|M  \If2sϞ}T8U/_^"ݗ&٪27wrH"K055իWٷo/~n;ӟY} _S'O_Pti=ʡ}xhh㪪ެ[B(zz)Z}dX.CC\Y~b,RD4s?c:VR!涰mIVp\XE,eiyhXjӧ~űpY!C hH\ǢժjEݻ%cjj}'܊^xG"QJ*RA&'8td"[c옚ÇPz> ~ˣ7*;{zJ2X 8CR<*&a:O=LTׯ%oɓ#.p8e;&RdK,ˠZ df{uثWRm$Ba@@cbb#Gthhe~}}vf&rX,ɧ>Z19wϴUl;D D"*%ĥz&oμިzX/fWVZ LX,hk׮*juu5xJh6K9vΝ;oVP<ܷ*agg{/ި}qc*J9Ν,ަj`:aa6pz:᭭{݀/_VWV6q<%²LLq<\W$#O/l1<2===Oފ}\Tht:h4nE=?v6hgϼfݨO {]4%r@*G"GB:$Sm%-~d^7Q #vlv!u]'&h6(;vA+W.?PzNRaxx;w222GGG"FL{{C˅z~X*7"/y=wnTE*C<_I[[[իg4:2;:DZ X&VQRh6[A0̙sRTfSx<}Oa HZix-d0 pIӌsS7&ONb݊7[?c} ֮"OZwgNM2^o~zR}zxx4[m:zQXbmmB0Jy"3ZTX(JD"Q6xG~2~obr.}+1::ZN#W77;=<([[[Z}u]YDYt|>Df96`;&ٶ,˚/]GUZ~;}JLqLn_#xePoϞ97juд===4J O>XZrk"vmYyB!rR\[Ecp"ˌv7 Ie& gEh4&^^#t:Ȋ |Ԇa( a\QX53@YֈFLNdhx~jK~P$0i4;_˗g3 }:2KA^ʚw "(i" "kiAd\פiLyTU`E^"VV*K=loػ>tqi,FUe,æ]kgh0304{iyA5ppdHEDpulǦׯyΝ>}:t`0,˴-R>TU-Ȉ㸴mA~Wh̼xȑCؘ_btdH$qvlv3grQ1^:{.pԩL4cvln߾}o+'H=ēTRG27pﻒVj:i\_Ϗ#2$a;(U*{/ y.PUUVLN(:ͦ$Z$I?f@DbY6^g3MVԪR}euퟔJU$Yq/$?08_E^,w.^:T(\%xiؘ^p!6D"JD`P0ڞGd71vꙧ|_Wev!͙8F޾iRV G~kO|/_xE>^wuFQ*uYX EBA$I>)߳{[z@0e[T5$xR H$NT\-&@-ʮA3rt:6WpwtRYEU, ( J HFD0Xv]xHXzΆ{Oɚ GՀle7| I3J]|EX^̎+?Q⋋QѦӮs0."Ѝ6"8z6j˲EU_ ?;ĢQOS*,T*:NB1(WPV[5޽䩳>mVrm(akj:<${lݍʲLG{RDW#?'dhx#ǎH? ȄB!*Jd/C%b K+굿wݷӮDEH4B#Is#_C{Nd*N__Xl^熇b޾>uD^"bdP0ʬ" "fRfqORa4up4E;oNǶQU|>=#I(Z܀FX(W N9꼯P((h4hZ4M n+5K˗+WV?$Q$NNOg8V?SIg ETz_[$C>Eӂ *xXdzR"(ϣi>_ya\m]AS?paB (8ӈFcH4% i%Ai>iASd$)E!1 C,x.,E0 ,ǣ2躁b424:;;E"ܿoz&a&1&NgJ"RSP[h|ıV: M</x48 q8Υ?>i6y<@RokP_݁`C* $!x,sx JbΝz<X, 1յ\o$R"뺘@PUǑJ 8o_6X6}emw UmNRłߨA|'?ravGYBy4.R{}bǎ^J%W{CCߞzhmm*M#T:Ǒii"E8iL0!ǯg,T*B#iº."|=ַg˲. F-NCd׏`۔ET5Ϻ;~)4B% X4d29!RIݻKRJ0bt汉>VDggssm](ʘEs* %Rl?p"ɳ, xe*܈ u]'̈́eWX,=O{ hp&]޶X23 ӦY8_Y[2|Et+O ;>1/Eb N>8b0-l\2,,,!jq]V^@*xpl0-JZ,eY(nAHjeFBnUjd ]2lL*)3kTP\z0 ?FVOsh_dT>w(9?X,I477#`hhl:::^ӁpJo}?߽^*#ۅQ<SA\ X%M"щT-8:[;PTQ +ٳgѝrA\3OC$K~ KYR xJ8>U~=6aRX*GC,,`YpML0 À8r9ttt`hh;^9P k8/ށaxM=ת`}c9,Ƴp`gO*{R,qiV [П_-ό ӑTl0159d*P%.= sa\oxJ,υgG* ~vmJ(Ѿ+ {]C{&AssH7׃\XN2(dY&odV :PlB e9, G@qEK&UADIB zPbQQ(XX^칥SϏL@UC4-t x $_ېf&ڧgַb66Va:< {vF3ё۔ <v9N_pk7ՁҼz}!lnnZ,人Ӄi+<jcyCP0>@٨ Pڶ8E4F$܄@P(I_PG38$mc² 0r}eR5 o.!Gw AR(XVGN0@0B{{;088+mmm$9JEfPǏF=嗘v< ӄm~NTKL8ϥ͡騔0u C)ej9A@,@8MhqEq< ]S<\e !(D q(}q+!ya<8 ]Y*ږ˲^t0yD<@6E*Dkk {osB8&477chhz{wN$fo[@O k8q8N8e˲a: SkTǀcCaD J9sF۶c 2DA@4cB1lAZit m´#X$ɐ% <ǁ㣫=EQWU  ChjJ#iF4Ek[;w{,H|&J=2f%q j5T*X\B!?ccc mle]=0Y7ۅȋ~5-Jr]sDI1x%SxXlVȀA (S~bqR)J%HL悻^^dnkkZ~t}}[Gώabb (J0 zy4M`;6C@QG X/a(_qLX7:`RPDz90t VJ@F4EP ""ɠljj:D~NORK9n]ZR%ei1%lllP1p16]XX (C#|45!6`c0Ѽ1˲X@EEPDH$hjj3DNDѧYNSSJ4tPmwv[]]MT[k5RTX[[VY&*4]pl|r%%}AJʧ~APj~ȧJI6YjV*Дh0$};chȏ4ݹݝwg|A}@sSwos̹ @mʪ!^ [B ZʢҥːJ"DID2Ab,`cܢ #ý1Ɛ7>N*5N2`<'&1^(J8)p&Ќ(Y[j:*:VC)#k)BH7|poh6 q|CCNTx ݒfI$$x8f]/qxIP{=Zb Й+:&,E*w|A߃QJ=(*S~ BLf4F*MPAzp'÷nx6*v zrTTPp-•DWmxh Ot֋=y3'-omw$@(L R@|ɾkJ3~ fO٧io;\Ӫְ홧R]owAـ4RTe9˖lAy-eLؕ.PEkH q&Ɔ_JͲ53Ħͭ,o\?S2/Ej+ @LT^*VP66CN 5 ȭlF "qYtXYaQ멵o\KZڐ:3THF:vhm#$H.{ Iˤ?>,_cxuQvϟwIj&:mkPa+Ê,hGԷ70x#{񓊩P',XdK@z5{M[.B4$f eUx*sI)CITtFn_ eMpĮtQr|㺇i\0ϟ6[/wfguَCe,o\M6+(],L L! R|Lkv9'e%iYq܇S`&0ƞKwpV"\YOB" \ \YKw5`ӧ~L[\XUH!l@oO Uk$Pګ eppAnvV"j#GذpEuO{|N_:4~_ƇXUacl0<1TC i7.ۿ$vW5m=io#1>#`l΀֯.J~0 j`C?H8,ı-"j 0`3jھ\>¢ekH mHJL->0. H2>6-N>n/a>Ň} 1P+YPYEyeU XXRA Cl; 7$"`ge@(BCw016ٿ@(²$5볶idJ\RJVT٧YG(8 g[9@Z[qXA,Ơb}vE-9ƚ+h 6c\)ۑmcƌbBrFGZt6-o X^p~ v{KflhAJ@[@ɀxqd#󠰸~XFco_}9Z~[Df0tt7f(9:Q{ad0ag?G>*KpnPd.'[Yւʒ''n3qs`᰷X?Y^ѷ:>{;%_?`٪o~p4o- Z:n= 驪˰ؼ;gΝ%3g^)4::b4hz4XI lӵ5+mw{rx.t%cccu:JbFffE$ddds^ZV | nՅJ!M'h "Ph%RRT-=*V"Z^ Vfk^[Ym%$&hUTdmmD>◪Q-EK%eJ .9Y%D߷)aqZ!xt( BYrRI\dT+ k %|9;v`OʫeQ0VP" &F*iP^>,#0:"b?( Hdhz->^%TbRa E޼O_ID(1"FR(Х%` kX'r}*'Ip HAlmwβǡT*jtdļ1Mà uR_jq;ilz$~!ܘxͨ[5rijjR5n!BJ$Ξ[Yf<%HzğjTJ-KwtoFHҹ*d2 RȄ瘘~\wkUG1Z/JJԤTaiQ_WwS7!pgfG?%Fsɺ=UŊ ڪGǎ§.JS+WG}\/ٷIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.router.pause.small.png0000600000175000017500000000273212167200764024157 0ustar lucaslucasPNG  IHDR.bKGD pHYs  tIME z([TgIDATHՖ[lgngv]ml18N Ph JJm\TR%Q))HIUV܀("ڐY_]]c{wgw.}Xlc9yO49g?Gͭ7V7K)l۞,KΟ8t-?n'r]#c;fͳckֶ N|->ٲ>˗U7`7ϟ;g~:26+~?}s5E!R}e1FkiYmLL :.uPMu"\{"S3ܒ:|dw&72pK"ٝ7/SjtrϽ;OO}ǣLL䘞ΓI_;,47w߱fs˹ŏxwL_yzaYۉݷraOvxf97[լj4`Tut]V5<);erl"/L:L:wߎ'UILMJŁC'>[PӷD7WةZTJ X,”&ҔHibJ9זRΥ! @uTU}^*(6t+TGmM${P/3 Bbr2wֶYܡGszk흹1aU//B:0ĐҐQ4*i:(b;y88`Y+(lJv]$mk[|ѣď~p_*LJtifU+MDJ)EEAUU4MC 4&P0MUSB.RJTE!sŨ f8NTfk^o*b}OF rl irCS %{J0Y$/uw_*w\۶Iruݴl؄!M"(H3[ິVr?I֯SClDˆM Ȍ1H章lf 3`r''\`8Bê&V5-~yGm"9r50]%~3ks*G:{<$U,mE!OO4v5yO߾@]cƊ^>^[T<}}7ɎHͳ?OePu`z8{~@\e󼣾G}ߏ޲& BI!YV`/kDY~|3#Z(1 rH@QIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.poweroff.24x24.png0000600000175000017500000000243412167200764023024 0ustar lucaslucasPNG  IHDRw=sRGBbKGD pHYs  tIMEo}tEXtCommentCreated with GIMPWwIDATH}ˋUVucg2IID! (nA\uZĵ b0ItLg^GߺEzR{9\y:S*Ö08!-wSߟGFx,BOSVT^:mY,e#,:9O$Fqv?G ز X&Aax"ND_`hUм*W79jx逿wev7swnCk&Nu{\_-dR"*- neKбK/Fϵfoe%9aX;{[c;Nd`qrRO34g.]"Z$m2Ѐu.s(&(( .@kcK>I O|uDJZht/%3 QcÿjJD@m8A0keܵ JR >vE!bef8W>zrU}EVa,DL;Db ~;q##gz{w|;2 `lBp@i@Q8'@dG{f/P+H6jqeϭ^*E+<'tv)7o iJ(2f 6pJ <:uŌn]y^ƫx_-P j0ݔvTACwv9"1nC!opc쁠(',e#eg$kbp{Ju]d#whM8#W="TxXbGa$S+/$7H4Pڱ \ǯn22Zԣ*}嫶*},H ̥3]'V&%;hh%?̅B֎h诟fPTIR8g26oLSg`tf8duNKVΕ 3i? jȴIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.machine.off.med.png0000600000175000017500000000455412167200764023341 0ustar lucaslucasPNG  IHDR=51bKGD pHYs  tIME 2ƉmIDAThZ[L[f6 ! &6\VIPZiC+VnVC>Tj婢>tդ]R@$i̭@@x%H;93g?ɵs/{tY λmמLggw64m1!![~&P(׾ B ǑL>|LLO?B,O!ryp7ǎp%j ~dXCC]L)>՝/]F'.hRdaxxh(;3y])iąJ!Pqi\H !&7ovK \$EUUi6IUihxZ֠U?v^UȁCEY^0BuM-Z@1tJWv'PJ9;AX.z3=Ifԋo )%vLa;ߧ]Y׶u.ZN8?zG>"d9Ѕ@Uenpg`@}]CH$BLd>[eTXq(*tǣOB4<t_͙ s!d `v> ljh,N9߼!q&8r sB(pۆ{k=[YW2!g]WlDRk*Psk,\xI7ԕCqGJ 9J@)U,@O/ H5z&'M/jA; XŌAȮH Rif2"Hʼn^ZbuߊnB`|,dhkaH/(w^@}|V 5wDg+wv dYG6!ӕj*`"+RQ.pP!d&'{apռsrνýVieKk7uK͟H(w=eUwKQ^`.Dsu_~ gO! ,MCe~";'p[3~6U1@ŔaRҙ >軁J5y+X/~Y2/޸B*k d MIp|ۍYnf#\ʚ]х|zz_ߏ44;y+ģ9\vjoEiA{h ,PJ@9}^U(r5Tiew@kUyLWzrRNR%iD';ǰӕ*1/]zn䒴G8(O`m $|N[䞹Ҹw*]T4Bt=!VV?G$<|IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.dado.24.png0000600000175000017500000000303712167200764021546 0ustar lucaslucasPNG  IHDRw= pHYs  tIME 9V5tEXtCommentCreated with The GIMPd%nIDAT(ŕoTW{ +[pKS$Pbm7*@$$%B4&jMbcc)eImL6j PPg 3;;;;39f]Aiv{sxɇ*FG(~Vc@|?GLhTQL$sw1wzY-_fc3|'x|ʕ+{pb:Pb|y|ȑ;qj7nmۈGdtFUVJ$o鿧=4𥁁< /ш`DP#gr4p*ʲNoɲjRwaG-ުݢ<wtF|&>C\ٍ1ޒCشi#"(jUO<'zOOq׷@Aqe߰峟g|uqNqNQUsܜy،_J;|j4深.ATA:"x~X>E2 } |RLL6K.XeTVGq~fN& u>PC: b&$ıb-Sjiʙ3o}PH $Vku*Rb|yJq/%?h4i5[o޵#fH8g3Y|oP.WVի099*dϘbhxw6_mGAp` "_GTg055 o.}_~Pu޾}rvM˕J7wY{"s9 *P\_Hoo`ŋc<6@ڍFCCJ&759I>Fsj#ˁ 2 afơCbbb e׮0Юi[GsIeP\vՊ \HTg;\O32 K vmĤś_BeLf;T Q23;A]Xs3;w[EQ"'zf3~Y_^S.qNȑh4aݺ58U0{i1UuYsoW+LNߤ^_DD9p G 4u;N%Ӫm7ѣ% C|?_.?ʉ_...>|QNH KOdwx|oH?lđeu6oR=w}}=(*JAPXc5[<۷, 9PIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cloud.palette.png0000600000175000017500000000204012167200764023147 0ustar lucaslucasPNG  IHDR@@iq pHYs  tIME  4b!tEXtCommentCreated with The GIMPd%nIDATxOAǿ3=Ԧl+r5(cB- RJvٝ}t(4M3}vh4Fh4Fpa-CF0vi7ėyj|q0>1 +loo^ 6=E \QF~ϩD;D?ϘSv{k ZLq$OpZ_qoߟej6mk6٥R}n'r P3$-eRdH^R+3XY^Te(c" p*aRd&|0yG*ȾKO,.$lTڄpL*bj&R ]V453J#]@IFk-*~)&SS(uIy]9۷a$ .< lI*7;y "nyh. ɘ 7RrR 0_@u< s0C%a0xSkKLD 繨?<'g&c?~q@ړ"$  \S, ع\E$2 $$YIϋ_DꊬxGWd, ) }$GdBw'pd+Kt\\'ǃ; vi ݺ3`"YHvAMGd bWTUOXO06nceN#O_&U EcY*0woAZ|s `| ! ;;6*]b# X}x-ܝ^ȯ0&SS2fn1l$?3T0#QpvXso/?4Fh4Fh407IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.large.png0000600000175000017500000001037712167200764024154 0ustar lucaslucasPNG  IHDR::J(bKGD pHYs  tIME DcTIDATh͛{pSWzWe[dٲ L@^&!Ii^Lw!f'd:mgڴlڙNn6;Lj̆G   _$y=Cza'3sGst~w#(mXs3[BM_ .o>dw:õ%Vm8c>\եN< xBO(g~'@ xa}a][ݵe3F 6"ţ\]V(ൽ;=<G I. !?|>޷&cC~t"W>LL`‚P;'ThL;*J}?@z.|_v:Rտص|hȌ+ ؞ޞ1Qەt̯.]b[ObhENI%I"zdA!$جج|%έ;㺂ZO?3F Z7/ZO}y ns^{u_t]TWVX8 @ B Φ[Xur#, Fe%lB Ѿ4m xK}y[~"yΐHRBˤ} ێ<e$nNշLǚ*'%Zi,):;QKfF\ o*AZp; GW )!ԸA&f;E xK~5OB-^D VP 0 M Bq+r6/e5(-Mm\:w཮ynhhI I /2_KSǛLÊ?=gS(*'+*d]:``ϡ1^HjW}?;Rk6k,| x6if_K29sxv\c lX^ zˌTyPN~vwt35*O :.v9@;j~ C_ IUv`M,'$ d_ wڬܳM L 5JI3-.!DQxD0$vҒB#d)RݿqNE蛚_}?}?<; ^K~O^0mP䞹$P?܆<_7| ^On޻Yz[Xڕ{ۭHU6=/2@{GC@9 I 34F'T3eyAmu|x6> K|=>áO?axMD6c']Y'n_+YU+;re[tTO>eMJ*y&2  4s;[- xWl`i|vݮ7R}hC(AuğlZ5(݊&J YA Iqݙ)¨ŀEH\ "}˜̆0Ǣ{0 }uBLI`Laxd"!Q YaaЉF(FjkQJ5,bdݲ;r84@S띌`T&M- Cޅ TknJ cc\ =_ ,XXqVz$]&J Oۍ`rri8pCBLqM[vj?OpAu6KL]LdJ˽-!8x]'O F\;fÀR"a+8HpJaɿ8f Ujq픺JNE09sAW2͒ZL$* I _TicFpǂ '@\V:8$꘴1(ٜp&GL2<,a6ITxP6;`足?X:jMBВk*v6xK2zWq@QCG#bq3 "&31iEX,,yrc`ZwP-+ƞԙNpe6(@VLȊ HLm6Mr<,!ۚK>-PfRQUU0f +i͆,KC8@( C$2oٴqR̒U@ZW!h Fbf0VA,"# +2<+ђ}W=Ep̊$cw&%Ĭ4O'AUY 5'dBֈlXD,P=9k!kiVZ+@QdA69{zʲRs'2nSL8dž*ޅZ`g`PA(S]dץBd'b͋2FM\WF% "8n"@eBJJYF*d{ !PdDAaQQ2 2:S)\K_5U~%E)-w^K-\gVnG(-yu^:< ,df(mMgGם!,ouko"Du%aE[](),R Z^dp̈́j ^UT~? 4 RԌL]54Ӡ Nt-M30@c+V H>ID5d`r+9Y֔0ZiYWA8ne: [W9L}AIŨ)[W{L__##9e^КŋiXHYYK+T}49m=_?{'!-IXXnt#r!  lbPY]ՠv4oC)!}yufGJZCu*fY#1lxDouk[,DQhNiBqrEVm473#1mz%EVf OM-e&Bt`u֠ZufYm5!ӞqǗ "iAK;5QIP@h=YGz Op;Hcݢ \5>ywn.uKqZ6~•}jbӓHjAJ3O]d<`]e "ƈa8a?gèӃ@5'@Zֵʼn)zO}FZ@k4ӧIzJXMҭ[qs!'yw d0hRB BP*fMGt-H55T#p܌IZVۈBBg/Yԫp7#ikꪩmMWyɱ/<--$b.4:7{ᜬ૫-q톜B\rNGZ|&Z`6li!Z|Ħa~i%8o9糀 eֆMB{7.{W TʖHP,Eb] +ixtsuONeսc|vl VI18kuʕ rUot0D x ؑ{ؕɌlV i n{:L6 xn*O|ԟjڎ=ࡏ "+ Mz]%q{.yt]iOC0nXԕy-ݮ\64'֔&]׿|qnhK)®I+uط^ىfs]sD> eeEwՎ2\X/IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_bridge.dialog.png0000600000175000017500000001316012167200764024312 0ustar lucaslucasPNG  IHDRppKbKGD pHYs  tIME  *fzIDATxkpו=OI3Fz$)xc#Ǝpp6ڐ;$v>Vv&[JgR)[8 ۉ`@ $! Cf5=-djMt9oHB f2h00a@ @  3 3f4h4hаD\/$<_T[=A~񧝥@G g빿z tͿpn.X,Y2}6͝X]B"}Q]~yכee)3jUI'TiB,H%W%*MTx xm/dJ&E n"AAfnBSVhiD}V7b3*x|)%wZV_Hs_8~dDPUdظ +BԪT "* ̱;J̰ERG ^/\躀K8T_t@Nԭrr!T %w_~ę>NuXR # s?3- z!ՅWsXFNus%|>^@d``o~w[$Iq~v|]U-C~Q>kN222"IOOn100\ h츠>l|mӧT200@0XwIۉD0x7.f ` 8q:2`TfbZ{. ;Ii3UBr2?i[Vf3&Iu*g6(TU8\+`TparbWRc_IʲZbdF /T󡠤9oZXmpPHeY&wba aՍ*dXMJZ1??OkiDHv//L$r(jHł=-0ª, IIV {ZJr(DXz)Hܢi׬~F/T,V:> l69l!@5 LI͆w( "r~htEl̈́u%BP}/wYTE -vaᰉ@_X5!$4oڰ*B2r8<j3ʅ~vXR`T>|znEEBj66!GC4oIOOWѲ(pNL..\9pjAbgbPӕ_ iUVܯ*0L&3Gg.LTs9@8r]5oIpd(#c ˲rz|C_Q3{# n(| k.nNXy# ]|(!1Mi E?7R(ǻЈ$Nlp DX__, +@}7QAF[#F DX&3˕Okap ߉>4[&Cp|p) +>0|]`EQ1HrL8gM XGCE|ڿϴ|vZjMppIS[64=\2H?kb%1k($%fHQ"E\5\D2bp3 ;'OBsrrU7$t!hl`vyJw0)"i驩pTRT.&n_BH%ˤ륩xJgOKpzRFRUoE+6XYn,Oj:f1A$>)$$6zdxdkְ|2<+;Sڹ|ox̬,rssBc,_RpǣmTچ+]Z:Z&z\h| *!~܀M9Y$ YSKf,MHz/VV&ӳvv} *7KžeZZGVy PPP(A[,,8M zwշ|ԧK`_̷7Ԓi{L]QˊnRdƤ@L0l6 eW++ǣ6n#_`]k\NN6Jf٥bF20)MD8,0ͣ!ޏ/Is9)||PHw|"Й $,q/h%:hDJ p'iPh~XT)c5_ߨo8l)2Xu<x\' W:>++-z*l 鳞IRi6)~}9v/À ~ 澋cU ޤV [~S[}s>zX|Z[& !}_/N3U35uy/ęf Bn*vq:|U7jדi:*6`3Wlks9qgؙpR#S6LI v}8m?xHU4&_Z*`Jz}SXִr-=Mf:Bt xY yN~5T  dBU< K5 )BП_5FՊ$x_W+sN{\~*wmBԍAqVr]+7Nvp{;k7]D=ܷ[t6 s}Z)R 7]ނ{K bF's*YnFwv7yN6r׮4l-B2!&-|Gr}o>\V,toBɞ!x7\WhkinrV],IԄhEL5<_beE-˒/?ؙ^ʔZTruy %Z 3*rݻh!-HN$B6ͥ6Βm杏ފd`(4-~.; @%,KݝtwPX hʹ9h8~ F%q qq 7\A6XWsok'rXmޟq;#4Y~o/!׺"7GwgGio9IM?}yM̾vZ9YwCbN*7̪Ty]u-t7c"!vty \'Ͼ˜}"-*~d0!;Hf{xb5pg; 1$&_mZo˵nQ4 ʅRӍ)͞ l@ iw.`\jNb\BVLg&2?z}LJ?ke7jJ/_rVQ.OE2'~&rzTcmgh "t@*gU!`wlao!ҩ"f!VU*![!0;M6Z<@k[G-nZc}_Vuf9ӲjًWfQ}2|sD }{̮"u; Mm⚵eٱx]$ɪzRJ8K\SBtO,Za&ֳ8*G֊Sz Q~ڻ}rX,&Hgٴy3mm\8wuضm;a0:z yFG/a zz{ijnj ?bB*ePZn;N\GޛuRbTK?Co?҂&&ĭĉD8VZ?z) PJTLŋ.ް@[XI  ֥To5!Ry+ъ7ee8rHRbqXRBgnMp8HJn$3 >R))TX,\9pӧN YyT*x$7Oill|ۿHs^MJy oJHjR) ־UP}k3!'ܪB5Q`DV0!59 M9K*IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.direct.med.png0000600000175000017500000000225212167200764023474 0ustar lucaslucasPNG  IHDR.XbKGD pHYs  tIME 4`/7IDATHŕn[U}s<446H4rARehyxZJ* ADSԙk;k'ٛ QА˒Y{ A\8.{zzPM˶|>o6#r7_z+`Y6]|!@驩Ο3D''Sf0H.#&Rnmmmn%<^\gff߇SzD%'8H4ӫ+Ab #/  _8ڷWфƩwOs0VůSyu=^|1oQjH%i4TklFsjd3iFB@ M4uʥNFNgZ% ,--Z.IYa , ]שT*~0 zVi":=c㓩j. 4Mxt )%'qd2it`IKzi4Lh4fg0ŕRH)R3%߿N`mee;_<.Ɩ䓇qGB)q[֕)wU(-0Xv*=vÁA0w՟=Z"Qר,r =|-DQ`pǚg X,{8|:Brpr4٦fPic յ?hbrH"~Geycۧ`yVEc'@H#Bѽ䜘hݹ9F_z W.WZ "rB~ǃ^sWu&X(tp޸l&}ֲ,VV1t)%ig:tX2kC'x4M&ǨfҗF)PR*lF0H?6M67+lV*D  ۻcFF>JTjxOҖ{Q>$RJTm0Bд;R_(6R)ՎżRpq ]!pLO[IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.direct.invert.png0000600000175000017500000000103512167200764024234 0ustar lucaslucasPNG  IHDR0< pHYsaa?itIME /getEXtCommentCreated with The GIMPd%nIDAT(nQ{gz'E#%5)X ҥ/S]tMtb"ĆZ 03Aހ/9qZw DQYyq&wo7Yv[rݯ {V}W*V_<(ufX`QVꗸvmrfhDM0 C:8ZK4M}g$#%BڝVH#^7xe<5y> % rĠ(q4Mɲ}48/t}_}z8Rr8#?28?KIDATxoV8is5iB;$HB4m6b7i Ez $ԡi4;ًB5Fv>os8((((((ڻ>++Kd:4M\ŋuEC#E6%u@`&rMC4^|0+mW9Z8?3t2| LOMtvU*`:K 1 4`lVdׯtW!8}>͗>r}MC4E, utC-L4M^]'t]2===8:::(1'oIUm9iiHMçq)RJ(mcYk̬ CGT.Lo:KP~ټ#.~(3?0L @UU4-RzAZЅRzUUQU(^C@8xf.1g:MJVx1Y~|7W|[gWܿooyK[GmCߝ!;<+ @1ٳmwo1Lx*d2.dV\NI^UUTEEQEEQB 9hwrv6iAgT5,4}šs  ;r+2*[j[zn1LO01&|on=3K">D">D* Zj(\Li$Jg*obF^z|JjxH++=R>:*k뼱{SLN};&q,l^x{D2wDJ4w7^".CV*.&_#p+p6L*QUbR*ș ` K0^Yι( H1%"r˪JiH)sp't'ཧi&ƈ9g6A]JQ !R9s^|MP~{PURJ"BJ =,@UUL&εkʲRHm:k-WWW_cPU181b9d2>A#"]mi-? 9g!FQrpx" G*؋E%o%͖a||V2e }³Zo5D>0=plPLZ{Eq1 MzB8_p6#&4y Yt(/!b/ h""Ho9>i,#MY`t B,.#=vрWHj{8|߭ļ'E+ Mq2EMHrV` óN#D,(_0#"6~e{4'Oϯ)3z֪>L/3IYrlKbEi3c6W֝u[X V.~1\,$(y!ON''4D5(iq ]T^"e:} UXNR0J]KϦ; pmmU)#n3;h݁iDwtThkWcxU+C!bu+ ~Ķ!PȾ_šzT:t`pd=U7 G>NwAK@ys&zLJ-vj_y*}5oYV`Cs_[9Q+4>b;2pd]EE1pd-RjͼF&I'ɀn1kf #lw0UBbtaYыsKY:6vm{3~}JEOd2A*d+аw+R,l^~~7Ʈ  _޾tw :6w q{.[o XK!/|>|v3pH)xپs8W˗\ oks_?z[[K_}}6jXY2 p0MW{nؼ>99fMIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.direct.xxl.png0000600000175000017500000000450712167200764023547 0ustar lucaslucasPNG  IHDRQ#ebKGD pHYs  tIME .IDAThݚ[lgf_v׹/c;I IJJ 1UP$ԂD > }UԧZq%7$e3s81i9goVbG~` G׎>VmkU*X?z~˲lo/EEQBQGc!Kr\|gyVe cyƲN ٳhih5c}60'PT&!"b|LpCwWAKK+׮^}* ]#85I"X@ `~ns]zeB ҇8z䰧4]ġk0 c9!UU89pGxӫr9t]Nw:.:t]p8?{nسQD{B0cgO//;Md7Go޳L:*165Ů%f!>!pk(~Ka^D4DR),BA**23=$ޱNfB!L,^ęY4x"iYD)%PM[}ܰa#?L`4q84:q{<bQ8^5Zu8Y+(C!yۖf_fYNEPWWeYԐqc˲Aƴ0Bar`-dcM5 .]d*ϤStL&RRt*-G~Bw wW/70 SSAR$}ٷV.B,HLj dVX,gO?_5y??^r9v]GwLMN gׯ/ UHcFw-6DpYrt, B̄B8].2ԕ׎ӡI鍔)% _G{-˗w[ض$LbYip<+E8w/0͓@:/byx%Vt!WxË5Ԭْ[J^Y;geXI4 yXSUƩ.+*VXE\%xNzjRp 3̤civA.=]]k}[| <51>~̙o۶P"9}VF">u<܌먪C<{7T\.w<^A^\jBGo}t~rEptM͛ΤE`===w0QXưٷgog6kDHH)u[z v) =~,Ek[[!m&I&켯USm4G BYHj:uK;LTA.R䬴J/`ؒy@aZ&s岻];+n@l.}|q)OdliW2\)*q I@*^JRa9_5eQВP+vYJ;_Sx;LTaU0o?> )!8O!Dd7W`'R$~;F#RRv.[$wC,<]ʶu-݁tspIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.on.xxl.png0000600000175000017500000001304412167200764024507 0ustar lucaslucasPNG  IHDRHHUGsRGBbKGD pHYs  tIMEW2IDATx՜{TT?Ν1 /y*/ETM#6nvDMd6ٞӳinOg4{nBI7)L"jTŨD``af~Ǽ`@Ls7~}{G3{~bP{GFy՚\ H8=r}A Ç>J#P l*SϢ:329[_~zN=OSpꝏ4tϏ^X2Nq5/INClP7 Ko&v !Z瀪ꝏzTntlgg|~,Έ1".J!XmO8%GiH IHj-BHٶU]iPScUtradQ1@cث'0[팦F(5qej- l,zףЅNK.P?`uяֆҊūE 1&]V}n.tZvc{XiwTey#bݏ>3@ns\BP}>y5[~l)< 8H4i8ڱVlU }ܺo)]Ce)w7 {lnAmwT8oZ)A67)23֝x斘PF-ϟh#fQ Q Y+ˀNudj^0 [vr&u2 '13gc;"fp$uS%ɷ _KyN(fC¶wsWn"=CHHŅfZZə>iIF}膅%HDcŠ́E7hS[mboUT0;V-wj =j8cl/{?5|S WMcF1wJ(ȲkpV;&6 '5)#^`<@Z姒8VHC}Dс?T&SZ$-o&/KI}oqQ:nYpd~[{/~ʲسWtM0Hь$Vf! .v lBJ;SlU A$ X`h6\!F 5H|9h߃kg=-}ޞ).f Jzy].fXTJ;YEˍf_>?V^`?I^JYVP'#. =fefwGY ̫,}\ȧ}Daޤf~K5kD3g7L]+*@acq냄&.̟\buDn'q+x}|=>>ޔAzxm!.ΛNa`EWwݯq:&~R 3jg)<0sfQP]Tά</ΌSHևxr̃.Smpΐz;y'_QǤddҲ0#!XF\4C8}9F=l^@AcsV5z5d;] OwK`GA[Q1 w-)M1$3t$ƙM '}u_L#>y>jbmĤq*B 1Z3)#.`rdu9k:Sme@9~5}!6GڰdKkgnzO\\Q/ii2e/^ϯ}`rצjw_YWok7lge}it04@F\|8_4Ni xA% p:jXaAB =nˌFu|(i_/1j9W.[i:{dAtmM}]4=K Nb1˦mOG(`Ha* 2 V[ednWI,_uf; ق׭Nmp/ioi Zsw !\DLC7sbw {?ǽuژWSbʹ^>HL.{ Zq*h$ k_~;SINQwi\:݋CVZ<}2 @NA`>#NaK#@rrM~^W}_^h;Z}!\(gF6 7(sX+ $8tWt q DK؅+ɍ4zG yV#ہC^:)-&N ݁38rz^ Iz,>/^9E!B#he:,^G/HdMir61"i4Q{ I{iaS$+Mg&D,NiݪJM!Ey<6V锰 K2#L.Aq Q4Eu>6g",k~ Nx|ݛ#sn*f$]tֆK`:BTp8NvrhLQ ԲKW*f&YEɠ>ZK 5UQNVT2;m v_fF{!|*1kfWPO&]|dl }׶n|$Ҡ4~Xmi`? eUaҵN|OE.(!Xmd #R8+[݉r!,/Iʶ]|2}g(gʢP;{99 56iJz,V\,{Tp t Gx׳f/ᡅi,/I >Wzo?R!rG‡dq:Gt؁0=TBv ~ߛX|k "cg('?y@UQlʢ ;@8 yd^BꩱqY^:޵#~gCQ5{ɓ /MH-OND1zg&z5)#) h&`qV<;BM9 RAz*ph[PxzX̲ew9W{`x0;arDL ҳBFLA-#.s. oaz9ܱj}rg'ǒC$^jjA FaԳλ:=/կN+ԚɎqJ'.@j5o J@Naγh͔RڅQj=UwQlB;~|P8Y8+q"OAk(8T>8_1ۍ_dV>Hk*8SAQSoIDATxo?xwm 1 QKjP~"EJѨUUTjsV*EZJT 7yd2Jb`?`c[{UmYZy%#L ؗ]?hxދT`=h ! #O&02<ؾmk0~$sZB"-bnޞIoXi!FhtH L#oʥ;ev!=ui˯Ȉ׋tZ2.ށJ єq"φk*/ia$q<(CLml򴎺t!KH̷s|~˓Ϭ? i~G#k(--|#؆ dBIc۳A[E=5нk7;w 02{(N6xo%X)5[go>> ƹ:Af0BÊAI$DS lLB7GIMTL_8 -ɉ'B1<J#,C2KǡwJygk;{:d2 fj8|mn D}s"ĶAmVJ !, O4P_|D7w$iJL<jͭ56A[&&%' PiXP|"=3?"8On065E*Et|xZEJ<2J\x!hjnJN$u+L3ui$:_NG=ܟIs~p>O:ä  ?KWعDF@a\kRiok%#`S^-{^:Mzqh_ӗJ7JƌuS<PJs;wtVN$ҙ 6S1,CX!jk!67=vx|1Aő!uYD*޻ -(U+q[J)VVnTI{=O8v ##S؄J)pKwu&YՠH\)(|LRA)iDFNeq]x)5̎?[(Q#qo"ֵ \ BXqM*C9_A]0>9Cu/ ]}"}pmy{UB;00'Yf]Ε>t*'N3qCĤR.:iY9S`>?Or9HyǺ֪e$ Ru8 jffF!ZOU-J}H8 @]}#)ߤs[wbyoPbyg$ϞCbnz ~OK*I;S 2kϦT<1dYe$e՞zeѨ)|^A㒕|la4R(0 A@7 >'A'N+4WJqap3gާǾ6|ihx54/]8ti/=gO|{P #q, "vɋjgy_{a9ճ?vũӧ/}l} "a-Al &+W{3qS4[Ё  0z*e^SyÁn!"XPpNy]/`UnlN۪  S?Ӵ$/̬x˼+8iFnӳq\Rр`4 "^^V8C9&W.~Ǝg?9s۶1~wd?3f`+ۘ1~M*Svh5M{ZƙDs3A2fw03>7]>L^qoՆ罢/-fx<[I]RD4wX(8@kp}O?m|^s27S "E.-YEeU^\"<M7&Va1O_b^Q^k}4-"B\HOc[4bg`gk}477lάw`t_[!;vr3zٱin-pD$Z?N.%NkNēvDh]\KӞu\hzor Ǽ@c ,QB=rIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.hub.on.med.png0000600000175000017500000000176212167200764022353 0ustar lucaslucasPNG  IHDR:GlxbKGD pHYs  tIME vIDATHݖMoUx'6IT$F)RA# H`uYU.!!V$eԴ) #a; 33PDHgu9{y5GW}0Gڳ;w-)oݜ;._*ӧB4HܘƩ@3Z:VxpC&gQ?P >(B  v*;7!S0űvqJ}kd~mrRr 0M !4l$iqeiHLˤP(fCX瑆SA & $dvIߘQ\"Fk0ȯEǏ=vT=j5LCCCx;*!-vzbϷꝻy`lqcD" (0|ik꺞-loU_^alh'IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.crossed.dialog.link.png0000600000175000017500000000525412167200764025317 0ustar lucaslucasPNG  IHDRdA pHYsaa?itIME KftEXtCommentCreated with The GIMPd%n "IDAThil\eV8؉HL [ "*@~(RӤ jQժ@JEK!PJ#J!8؉=g̛~q⤀4@/w=Ι{98 }@XS Ɩ}Myzrec`]Sh[ߵp ou@@Tj! S m~l:3\ө͈u͞SJ:8"`*BET4GVnܸ f\_1Rg)eh)B"`5<ŭ-W ;H$ZlCv $AA DJELC>3l=P*лy3]==<'O`6[n%\9~IYfքuٱ. 8˲x#Qh%+A\j&Fp{L>#_):c%'cyȗ=ET@V[wwIBnV q7~xI;dr([QnNq]߿n\t]gyW7T`SYND::V MbIB;ƫG>0}J#c4GLuRo).%z'8.CCs)z1pb Y(!/wƒyLNN`63) ,I%'3s=ttvw9|O7."EaZZZ=OqMh5Q3V:~,7nϭY_ؾtI;dhh5WP*L(|d X,_B0y^ k3} /hBț)J)!XX{ a%מh4~st ˲$ `Sp2'm.v;\>iTE"r `0&X4RH5'Cl5Myz׫SVb|C?kf݌ ]'9Sw/CH%ϝ:YS#J(_)E.N(V˲z M>N(],[P* 69$ybƕ@4PrۅWs@ u;e6֎/\H|^^3 JUVC5&RShvzIzbϗU rix@0  5A}k/a`kg^kbOm)$@'oE7;E]r@06!ZZxP%;4ě(}SQWn!䔠LL YA:'X;~Kplsքn:~H}'Vʯ9F| +_)Ɠj\*ޫ,Zx e d 4,je&;sr97l~ppzaPѻaףr2g[q5RD4XWʅRec})EW/[  X[o0Qth4rGD h>So㸓dǒt]ǐek=&&qXVں: #qahڜ%B` >#}Ёle_ʥRg V,KT|-R8ބIV|IjjbguӬ_H|VJD"_3_G|Vq#V8_{gFw1f0 5 9.x|-,fTJSJ+U4îiZZZ){P([#!Ik NyIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.invert-arcs.png0000600000175000017500000000226212167200764022647 0ustar lucaslucasPNG  IHDRw=sRGBbKGD pHYs  tIME-.1n2IDATHUMH\W=߽đD1e1!?R#%M !@,*mw tQJ,u.H'`4BB J`IRB' o~Eɤ)E ]r{>ܿ8omnn¶mw5Ş-P[JDY5yJ)B@kBX۶F !@DL@-"4Q]]x<Φii;\B&",,,,pKK ݻ" ivTB>}H$BDDUUUtQq]wիdb2333?%rRm۸u?~[ !q^\\Ҥ8ٯVm>ח{ifY)߽{̬ֆh }yޙ\.7_,yٷoJzRJauu2L@ jjjHT*i.ŋ߷٢>ˬb&'' $%13`uXHKm7ڵk5ZC;wPUUŕcJ)*eZkR֚@Jɏ?_tAgJ) 3aXDè.0DH[<ܸqY*'NJLMM=#p4;N9r@J)!^D%"oF*P( 2L,\,WTVV***eY#\pRJ Е$șL3ׯ_/;}a3MsY͛7P(l6M(MՇt6qssi.dӧOkkkOXYYy';wBJIRJ(P$" OOO Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. marionnet-0.90.6+bzr434.orig/share/images/ico.uml-gray.small.png0000600000175000017500000000422012167200764023252 0ustar lucaslucasPNG  IHDR!0cPLTE堠ԃ###,,,bbbtttRRR((( 777;;;999 ddd"""AAA@@@)))666^^^iiikkkllljjj&&&***HHH:::ccc|||yyyrrr444!!!VVVCCCLLL... KKKvvv888IIIĻuuu??? zzzʯ~~~ xxx===ȿWWWJJJeeeoooޱTTTggg```333EEEmmmQQQwww\\\[[[YYYqqqXXX'''nnnGGGMMM222___PPP}}}///SSS000+++111DDDUUUhhh555sssZZZ]]]NNN<<<%%%{{{BBB$$$F8lIDATeWW1,2@RI f%PKհ HDM$ `I!.ui JQi.UZغu9gfyw3o b`?9 ar8?a0 A!3#xo͌zĬ1sVqsߋ?ABb„Dp!&q!ID89eR0pقRWbk~H.-J_(6,ȔlyfW|hlB~شY((T*̩-[1FE 0vbDE)vfI;+"wHRS%4e1aA52RZфiu򌴝`R(.TШ TM?jjVqBeӃV}TLj8rk{իOj5T)$[kk F[4L;SÈ Ҍ;tTԌXQ=gkvZe'L=ݍP3ie+>WcDoi-ab;*.~tHI]u<jUrq+Smyk?wBz&k דେo ( zh _e. K بmVo|K D|AFܯxfDfECaQ؍(DGF 6 hkCp~ѡI/8C`'j~LM +g)&d!!|B՜;)nY!Nۤ߹ۇ $5-PrUs7 aˌ}<}O'O*I|٣v(cktBY6%Zo_u5QBL,0j/ؘh**DXE?wNe3~}ϣMÅV(qq$~rIFɄ / 5 itY5AGs?¹>T&!]7[(8aŧR( .A8(\S]$Pp(YKXAq3 I$LQeւ$P4xsM&5 >1@^)Ty.DQNlwCXw_,$yЛ4u(!Tf,=O|x^QZB d4G/OV<[9 %[M(nWc`3SƑ+82bo;tfe qX ^Z%=4&oKdIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.small.png0000600000175000017500000000377712167200764024405 0ustar lucaslucasPNG  IHDR szzsRGBbKGD pHYs  tIMEyIDATXåmPTe.讂PY0h[DѴJؤ4L2/&3헶$~M3mf2b3S&IDcߦ+ZEyY]X`釻{Es9Ϲ@QqyEEFx 4 =z견{Fz9q5(vʁ.x=Xu,.R>$?#0ᄄ$b>7E%"ŝ_0zAl ' ODvѩiӀWM @)EJ%Xb/t&oivH?L7 2+owo[y t2*ѐ:p5t(s 36R "boցp*JShJQ{[[)X6䑗&䒪ƹ;ȬzǙgՈ.6 /{N{@(ҔBFq:E(M#NPJBsŧgN?SaMnoLnvjM3R\ԩv)u4 - !,++ ˅ C{J 9]lD :YjRjF1擥d[0]Uo{.K* hq~As d~mٷi~|70U^D`􍐙S-$Lꨤo(VG%ϙ;%eRgsP0¶TW[u˲6)z@_j@:w2ȶ[],7:.+ZF(q&%6}]twp ,W'ڲ b2b%'?jnT~\ⵔw~[w_D#[ J2|.:6sVXČѱ2'.hf]\n:31|u)V]QQeccd?`6V B=TMR`<4l1Bx6x,}~)baun.ڤNԚԱWxwWU.:㺊k\:fO2>;>z癟WBIÉeO@٪m1U c!S"nڡt] 'IGcuxl6lidcЍǵ)|5k7j91D~9iV>B),\7V{]=s2B g اe $p{ƐdڶHOwm- 4ȁo۶rk@[]S22%MuIE|yٙ1U9+NyJHiȝtr˧ %B("s@`-,peNWn6ָ]R^?":" |pChT>tN .G^g[ƚ vQ[qZePJr{ -^IYb28@UQ gp6cf< -^/w&S:| k]"VD|F#mY*XK!iEcY Mk!Gh-Da(+YxfcMNg;v*om{016"[[|yx{y[\ѷMQ>[ B;xK$ԍ"rlyԌo Eo"aHIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cloud.pause.small.png0000600000175000017500000000407312167200764023745 0ustar lucaslucasPNG  IHDR.#'8bKGD pHYsaa?itIME  UtEXtCommentCreated with The GIMPd%nIDATXX{PT]E /ARmM$b4cmg8!Zٵ3f:LhLiLmn4հ ȆE,˽(%&q?:5mY&"2$)9e,((E5t:ͦӶc:a{A\[VRߕ (jF1Muo ޻No`H/KIͮ~fa4OxFTL8~Iơe'+FB-0!:IcEBD &g iP8Vlj?ǥ gPZ^K;.R9TUO`x<<&XX}]_>2{-[?rAqhznׂ+ߌMu'e= =;! /07@*nO3clNo0 f~hZazaUU P!D wPWuF6N1]9QG'ՄJ0j͚hlX-ݓvSzNo$ ^|GFzKŅ//ciz} no>>kJbq378 >D-Ziǥs~vШ8_RNNި,R\#nniAk[':.CBFs]mv`; l{9"n7XT*&Z8J7E%%11BM l ..Nlr&'4g , RFGǀy29] З@/x89Xq^oy=G4(!dqP QO4M Àax<De=@@@oY=n1Q)۵^bǁ80 3IS5"NАHQ WgQO rRKvjEQ@ )xg7&Sn;2k:,Xe_J"Ll"4,ApAG!@tNx*1ot2W>D ʑ‚vgB਌1_>Z(*_/Vt(J Jrp![&ݡsYxWg退y4sd@ǹYiS__;c2BpZ2ֺcs!Kht.Q)O<٦T*ɝN'fJ,ˢm ۂjJCCBB~)J%FTCV뭞U[>CbM~wm@)~SOVkNoo_^ʏ~x7o\. Ss3C)6ڲ77,OM}9>^Ybv Ryjǃ/t[=IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.dialog.png0000600000175000017500000001232412167200764024520 0ustar lucaslucasPNG  IHDRppKsRGBbKGD pHYs  tIME#$kUhTIDATxyXgǿM7H7-4\ȡhPxE1ݸC'kƸDg39w3;dOلL&ALQQ' "ECnjh?{骷OjAWDB " "D(P(P @ @A b+>)z'ԯ?H &ٍK:1bFh @嗯m+y Q= _ @hEihC\--F}e>Gl2z Ͻab {^z\.糖> z.6NETÇqK;HZ;Zۙ@ }0[o^ܣ IB*ًE" )@~[1gV}l-D(S `?b+ػqϸZ>ܑ1hPWvs2/i(UzptH4FUȔZжy{kǛ;74b4 ҂AV%/!ݪsE+Զv@aZG\,&,Gt$KY(%,u} :;mtDnh!Cy/51OZbvrq&)eOYŜ}N-t%/@9w*:x͊J.ݾ< $ND9~(a, v|~?Qi{) LSA; "313=C#(=W SZi{9CnBB;8yt \91PK[jE [y=*4zކ5ؒݐ(D&gk'R1(>_т2uFXmzJ|*|MsfFe4k9`i U\Ȏ"R2sn鲯֠k "o~zG:Al4 v/ A+ͮn,$*aՓ(SwEmym롼Qh]kQ&ccۢ_9Dfgh3_2ŠC ARZ D2kSa4]- R_@=l->f;`ԫֵ鋸^WOXDDC NUTU%F jR (,;Ϛuqr ćm9g`.f`]k_.CLٴݵ],*4zP RHKNSMGQ&pfx=y2!B@A˽?^$HV/,";7pwPr(便?ߣv{q nZ`dl]9f ,9 ךv96=r7ݶpߎ @q&R&pu Sx&g r+0c³Z`9hY>Vy F-ܷCiҲ 6 E"{Gpx 28d#"Cn_L)mY1۟\@G0u y7tI@ڜ>(؞E1rx?k@50/^ @~f4elXo?Br'`n/ܷc=LȘ@tP(<A6?"È5.XSx<6ynqE[k8$>RBscgtz8jZpR݆Ө!;gpgOh@v"'HY /w}-oGOsc_@OЗ8Ϊ'ōNƈXKsˆǷ#'bI/R(:5b& 3s^k_᭼(>>xUdUMlSOZup=kr:njuYz+թY.-`۩O ^]kp]^jJ"4}l0ǘP2֪N ш WVTrڪGUl g 푃.i#! FQci yyb2cjjYFLW ѩ髐 <.I]kA*D_) vq.[YqXg³ duHBLig'wK=~:ڞ&7;g9;'ob zVb E!;gSB,u:@lm3#2 ʧ h=h4CpS}5]V};&aw4drL bf5= "}Xmhs`B/+tVkpݟqI]MϽ$~Ť ci*)dhIyLgi 15\FߠB,fM>;@DLH)~5LRnLR2+h!z@E5<МY@KB4L`0fmN9Ǘo$U̫H} M?k,Lss&_;sMo6$(!7t=bCpۈ z?6=x`--Z$ƅ'N´ `<߷1E݃@ ɋP[zJC)"[-ȓK H;pej]o(^2,k7tɱӚsKG07zC%n5$O Gj AvŃvE*EՊ)(륖i2=kB5̴ ma\x%zG]"sK}'`٪ob3B'e%AO__',P#F2'\*#(m"Ĥ!Eu\ƙ|0+}ضP/[\G#gƽU(4ҩ2#nKX]$|CTZѭܖyq;QF+L(ԽÕ!'j[Pp8f+/ S9l($zsbUAN1^xTc'o&Mj5ށbf"k5e)AXԮ*/bIJ/ܼ`7〤kRtPv;l4"sb9;=kԵ3Uw1o/ _%Um}˛91LJ7#I¥Z=-37954^lfAƉ[`9n:oަ'hi3gMuIw$SO`S'goX3/S객10;  vYl.LRj=qly@)ش8wxv;ֵ#%>bE(Z v &| zqy>p0^v6zc„1xLM-F N)LJ.DO[at݈ž#7v7uQBG)Ē PYWx!wt2F^ qW?`n (8qF$=H,0 5PQ$Q$thՐK}Pz=3r|ጻn[ޘxVBH;CGS +&dT -V .D+dx.-xcяcԩA&1Uqnȉ0 ^F=B& n4߬%j+𗈐j֘fM ēU Xb޸hx,%Z}yQ!~,ǣH?t (n.1ݶ_DXxt&)Sv2.Gr\\9JWhcHBu+й(!Ԫx5l^#S"{$~?l2{(űEV^r_ZHdy]^ @A=XElJ$!4$G2wZ^BH,!d+A6.'2S0-X:xb3["Ah\"ϛ} ы[izL*Fc+ 830 @f$z&@y"e;`zhBH=>@%!' ]k'$*@Ӛi:&۸(# " "D(P(P @ @A " 2 uYKQIENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.hub.off.large.png0000600000175000017500000000213712167200764023033 0ustar lucaslucasPNG  IHDRRqObKGD pHYs  tIME IDATXMOG%f P j;* F}9Tͥz"U GH?AmoHJ  Vx=oXyyj;3Hatd +`ZB.&OX__c}mɻ7nF{{C5i\#ÑP[ \Dۍ%}&"9Ȳ|j߿x .-}늉ůa9EA2 H"¥Ve4-K  2td5; "t4Oי4MCeR4+2a T-? atuw3Y>!c1,p؜Fgf; Hi0t 0,:ҩZV{f4-kӴOӲb)̖(Ͼh6f@0h}>]jPl|'Bܩ8z! /2`h_BY>E_%o$Z!oy-6ҞUD*; rUU-_'_%Ҩ %)CSlJ"Gx<>u==70%nUL&xeZZZ?=Q0Fefggxw2;; }6>ƗN0 ==ULxyvtd=MMMh[┖*oOx_0 NϘܧ|oEnz+&չn5Ovv| #}w--CPC(q]ׯHeOhC"9F9<)sI(IBuuus|4͸BdF4uvP_.I;SSc nݸ1falنiϓiaL{$2$ݽ|:#\Xzf Ir\.D<>,`49^MB~ IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.machine.on.med.png0000600000175000017500000000473112167200764023200 0ustar lucaslucasPNG  IHDR=51bKGD pHYs  tIME +ⴭ fIDAThZ[lŞ1I` R[DKPuهvժ} J%oJE*/U%`[h] JB qB=38 9ᅵaϝ=l6ᕋ.~;vDn&~F4ߺmkJ@ՑL&1t1Tzܣrl]پ}mPUu͘("0,:nGD}slLb }]kF4wKP7 KQk"c+Rvy3feZ"O|!PY8r8y!$Ƙ__; i%cP  FA4N7fM+L"bHphw qG";s ˸,"0KW B0C2i H&uR׈NsEDv7|[ajjmm6 $].AIHi&R)Z@R3<{5xb߼vS MJEhzYD6cbrZVgo@JHd˪yM 8`iAI}h!C,2U 9PW+sH hiACך2DDY{^QtR11t!j> O%νqۃ/wpYnzlg9$Ա+dM͇U PI(HvwAp0Fu"itlf,gfػ6BU՜jJ(" dVުa4;nE$, 1?L+`LI`I8g D8s9G"B8yeY9WA%ۖBT/TqiU_L"ADG1*[q)­4U"鵊@GeYͭmx,ueU>+\$AlxCK{jKT9JY̠te? Vw\@T>G^}G1i߸؄HJQ$psҊZK 0g壡"ĻK_htfZL"ΌWhP8ܺx2*RDz@FUa> ?BH߬*v\)(}ORUMyRL5U+VIIwV;/QyC,J4ZgʙP)_QBlzB5͕U HCV:/+~Fа^Zz{EJދ. ,Jη+vw-l~Uz=$;iɪ|傭+eT*)OoV-z +l3^I5{IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.switch.off.small.png0000600000175000017500000000140412167200764023570 0ustar lucaslucasPNG  IHDR, tbKGD pHYs  tIME 2 lIDATHRMLQvoBw,Ii&j"``4FxMc5^4 rQĐR E[\@nM4efޛ!p00ַMt]>޺}'+=Z킮aka[Ǚ#1}t RMY&ݞkl, }.eAS\RaZY(_Q0Gyd gxn(67DC11T}8De(-ⶶcء#_(-z)X? 3) }mE?J!=\ H&ڷǡmlB݉.`iC &so3` $et j"^q]Aefo9|%,ldr(f п0lT1IY d&U}(_tOCVB4Q,ZyJt'7ӌLl;,eaR&ǯjO^,$rA!U $UsWLk=N:47myA^9/ /i_!G97:*U%{YAVZjbYB Rb6|IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.cable.direct.small.png0000600000175000017500000000162512167200764024042 0ustar lucaslucasPNG  IHDR$~#bKGD pHYs  tIME 2Ȋ"IDATHǽnUw?zߣ\Y\veqJ&YztݠgR8# ޚ=>N2G `FΝ\jJVP,p88(9aSUTݲ/1::7oye u $7Tr{eo7! ܻ 2;7wH/S!&&') ܿwozD(dEm)ݷ˶oL~CZӴ_J.8,LMNJ !VU:)DeNnP9"j78:' XOo5-*q"1D| E08 2ǫxCajl1|fEQ8(IЫ]nno\L> u/q)XVv[+2V C98 yboxsO^E׫4&p?F$5a6Q`EJ> ?e/ʽ#_k={|eT@unk?}Azwa6ч̩_~H !ROmU=-IENDB`marionnet-0.90.6+bzr434.orig/share/images/ico.world_gateway.pause.med.png0000600000175000017500000000732012167200764025142 0ustar lucaslucasPNG  IHDR*7zsRGBbKGD pHYs  tIME+CPIDATh޽{t՝?߼L2y %$$! 0@%(x=]uz={S׭uJUjB !3ydwL3 s9~׽ܱ߰#⬸8cJ%1fJ)~ߘ1z--/:V[>7,dߒ2?8SJeY(;|VpKz| /^wН;wʉME%+~`>!!hVpwWGkkx_}=A㓾~EʵX%Y"Ò$ǩ:)ɜj$bb=guo~.G{{sLs eo假#::f9qIn_S3._Їz(&9%c{9ubIɍ R_WC)+Pui~?}|>dY&9% S̭t⒜xV¼%˸cM gXt0'm̿.L=>iSMO5[+ ~VNS]NV\]"7)OEtL,~Th:t^x$ p(m-Xn+I\{%&=k ^%NY]ĨcI!r]ByP$z[9W{Ys8u쏴7}F-1߃%+b:Z8[#C;Gٽ t_O#y㥭 _b@Vi>%mMYv Ei?ŞV֬F\6_!*:}L q{cZ}➑+|bFTj 21S-[&Fo tkou}շDU*jZ롷 OIRB0zt~'/^7n*';} Q+KڕiI$%%&[ŀ4{B#v;Ͻ䓏cZq邤+>6WTŮ#M-}$Ek(I7^1&0|uvpɋ|+ҙ?˘/9_ӨU9ar H3h9q#"yW@Cϧ֡8v:[Z5BySQ1c12ܣHƮݻwf}MmwZ6]VzO0Bׅ 8cepcoʨ :@]k>B?>葫1֡u`l$I%I*$ I.66bB9H\O.j$]nG␮ {k &] ܘm !;W Q%"+ Q_Oڛ0ij $7U%:0V@$Mvywpx|^OLn)&UK.HL*=ً6;:i؋"d1?Wޭ$щR]NI49\*:y6$$YFd$iƄ(B( G]\h=MNȲ㳁TNI9?k\ [WfTd9zIB @";l魋9דCliB@IY$:F;o@YμP$IȲ @$9ttt0ihmM?)ѝ35V$:Q-|Y B VkR j~|]y5;hAݴN$c*ߣeͪbY_@o|Df?l~oYG+'$mQL#iqgTqOYƴI7OlTS&e~Z&/"SjfQ:F=> \d,ss'zz>l5IVk2r<ܒ…a@({u `4,:9x%~Dž:@Om?'1ZK ɤt 7d/2}~~X|iLLBl M)v7[Cp:muƫ?`{Xf+zih`4 Ъ> d  ] {x EQho?^ٝtwԇITA|7EZ5z&'@_zanVH|NT@z83%7ނ⩟܊ϖD5hu8@sM:c0s^-*} 4a  .B`ӌP64# XÆ^o">!9ԦE{vYV1> BQ&.yk4tP2u1~NaɼbI{}A$0M4 @_laeJG}Y/(H.z۷歘 }w$ff(B UxsڢU!S4 9)MEZk6pbZ5x)d:Bm7} ; y@& kZ/8sA7- ԍz|-)A 7eij"tV x x WsQqI \ m }q3Uϖ6tkB_!FǼah6l>|>K,]*CIB}Y7,]2@ѪanBD/QJ"`qJ7rYPQ$gM*+2wMO}h`6MBa^S~z1ddB/0 3<[eȘ=@= N@VZ"盻H!r4[I7w Ox?+CIԱ nH 'nXbapSʊaQdԪÎ( ^%)gt3Sv/J2DGᥣʃQ>7Q>W#TWǨoc%& r4+ˊ̿ =ݝji1g6&JCB ]655VFE S"q|?/';BTL4莄n 5Nn4%i%5D}#T<52U?m!7Q+}Ai!Ѫ1haV|5'軻bw.rKb?) |uQh,!6o9幢\v&~wUy{'?Ix_)IIsF7 i&"A-+2hYdqib6S_'kzŒ' Z_ZQY\R rGYxX*!(Y ^XPXƲ8F]䛍lYA.i֗SKM ӌǛϠc#ä[7݊Q肄`OP'mW[ĸ<'~PDPDPM(UQc1È܂A&Sn3ˊ;kƗM#ۂeB-CvdUO B*W/6 Ep"X0u|]#*ãIENDB`marionnet-0.90.6+bzr434.orig/share/vde_switch.lang0000600000175000017500000000630312167200764020670 0ustar lucaslucas text/x-vde_switch *.vde_switch;*.switch;switch*.conf;switch*.config;switch*.rc;switch*.rcfile;vde*.conf;vde*.config #