ktikz/0000771000175000017500000000000011455641372014356 5ustar fhackenbergerfhackenbergerktikz/qtikz.pro0000660000175000017500000000271111455414614016240 0ustar fhackenbergerfhackenbergerlessThan(QT_VERSION, 4.4) { error("QTikZ requires Qt version 4.4 or higher.") } SUBDIRS += app TEMPLATE = subdirs CONFIG += warn_on \ qt \ thread include(conf.pri) include(defaults.pri) message(*** QTikZ v$${APPVERSION} ***) message(Qt version: $$[QT_VERSION]) message(The program will be installed in) message(" $${BINDIR}") message(The resource files will be installed in) message(" $${RESOURCESDIR}") unix:!macx { message(The desktop file will be installed in) message(" $${DESKTOPDIR}") message(The mimetype will be installed in) message(" $${MIMEDIR}") message(The man page will be installed in) message(" $${MANDIR}") } message() message("If you would like to change these paths,") message("please adjust conf.pri to your needs and rerun qmake.") ts.target = ts ts.CONFIG = recursive QMAKE_EXTRA_TARGETS += ts license.path = $${RESOURCESDIR} license.files += LICENSE.GPL2 INSTALLS += license unix:QMAKE_EXTRA_TARGETS += PACKAGE PACKAGE.target = package PACKAGE.commands = "tar --exclude='debian-package' --exclude='*/.svn*' --exclude='moc_*' -cf - \ Changelog \ CMakeLists.txt \ conf.pri \ defaults.pri \ macros.pri \ Doxyfile \ INSTALL \ qtikz.pro \ TODO \ app/CMakeLists.txt \ app/*.h \ app/*.cpp \ app/*.ts \ app/*.qrc \ app/*.desktop.template \ app/*.pro \ app/*.rc \ app/*.ui \ app/*.xml \ templates \ app/icons \ common \ part | tardy -Remove_Prefix ktikz -Prefix qtikz-$${APPVERSION} - - | gzip -c > qtikz-$${APPVERSION}.tar.gz" ktikz/Doxyfile0000660000175000017500000002440511455414614016066 0ustar fhackenbergerfhackenberger# Doxyfile 1.5.1-KDevelop #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = ktikz PROJECT_NUMBER = 0.5 OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /home/hacki/Documents/projects/autonomous_flying/ufo2/src/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = YES FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = /home/hacki/Documents/sandbox/master_thesis/trunk/figures_source/backup_diagram/ktikz FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM \ *.PY \ *.C \ *.H \ *.tlh \ *.diff \ *.patch \ *.moc \ *.xpm \ *.dox RECURSIVE = yes EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = YES LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = yes XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ktikz.tag ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO ktikz/po/0000771000175000017500000000000011455417211014765 5ustar fhackenbergerfhackenbergerktikz/po/ktikz_es.po0000660000175000017500000003101311455414614017152 0ustar fhackenbergerfhackenberger# Copyright (C) 2007-2010 Florian Hackenberger, Glad Deschrijver # This file is distributed under the same license as the KTikZ package. # # Glad Deschrijver , 2009, 2010. # Glad Deschrijver , 2010. msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: http://www.hackenberger.at/\n" "POT-Creation-Date: 2010-08-26 11:09+0200\n" "PO-Revision-Date: 2010-08-26 11:12+0200\n" "Last-Translator: Glad Deschrijver \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../app/main.cpp:105 msgid "KTikZ" msgstr "KTikZ" #: ../app/main.cpp:106 msgid "A TikZ Editor" msgstr "Un editor TikZ" #: ../app/main.cpp:108 ../part/part.cpp:114 msgid "Copyright 2007-2010 Florian Hackenberger, Glad Deschrijver" msgstr "Copyright 2007-2010 Florian Hackenberger, Glad Deschrijver" #: ../app/main.cpp:109 msgid "" "This is a program for creating TikZ (from the LaTeX pgf package) diagrams." msgstr "Este es un programa para crear diagramas TikZ (del paquete LaTeX pgf)." #: ../app/main.cpp:111 ../part/part.cpp:117 msgid "Florian Hackenberger" msgstr "Florian Hackenberger" #: ../app/main.cpp:111 ../part/part.cpp:117 msgid "Maintainer" msgstr "Encargado" #: ../app/main.cpp:112 ../part/part.cpp:118 msgid "Glad Deschrijver" msgstr "Glad Deschrijver" #: ../app/main.cpp:112 ../part/part.cpp:118 msgid "Developer" msgstr "Desarrollador" #: ../app/main.cpp:117 msgid "TikZ document to open" msgstr "Documento TikZ para abrir" #: ../part/configdialog.cpp:29 msgctxt "@title:window" msgid "Configure KTikZ Viewer" msgstr "Configurar el visor KTikZ" #: ../part/configdialog.cpp:53 msgctxt "@title:group" msgid "Viewer" msgstr "Visor" #: ../part/configdialog.cpp:55 msgctxt "@option:check" msgid "&Reload document on file change" msgstr "Recargar el documento cuando el fichero cambia" #: ../part/configdialog.cpp:57 msgctxt "@info:whatsthis" msgid "" "When this option is checked, the TikZ image will be reloaded each time " "that the file is modified by another program." msgstr "" "Si esta opción está seleccionada, el imagen TikZ se recarga cada vez " "que el fichero está modificado por un otro programa." #: ../part/part.cpp:111 msgid "KTikZ KPart" msgstr "KTikZ KPart" #: ../part/part.cpp:112 msgid "A TikZ Viewer" msgstr "Un visor de imagenes TikZ" #: ../part/part.cpp:115 msgid "" "This is a plugin for viewing TikZ (from the LaTeX pgf package) diagrams." msgstr "" "Este es un plugin para visionar diagramas TikZ (del paquete LaTeX pgf)." #: ../part/part.cpp:126 msgctxt "@info:whatsthis" msgid "Save the document under a new name." msgstr "Guardar el documento sobre un nuevo nombre." #: ../part/part.cpp:140 msgctxt "@action" msgid "Configure KTikZ Viewer..." msgstr "Configurar el visor KTikZ..." #: ../part/part.cpp:152 msgctxt "@info" msgid "Cannot read file %1:%2" msgstr "" "Imposible de cargar el fichero %1 :%2<" "/message>" #: ../part/part.cpp:152 msgctxt "@title:window" msgid "File Read Error" msgstr "Error de lectura de archivo" #: ../part/part.cpp:182 msgctxt "@item:inlistbox filter" msgid "TikZ files" msgstr "Archivos TikZ" #: ../part/part.cpp:184 msgctxt "@item:inlistbox filter" msgid "All files" msgstr "Todos los archivos" #: ../part/part.cpp:185 msgctxt "@title:window" msgid "Save TikZ Source File As" msgstr "Guardar fichero de fuente TikZ como" #: ../part/part.cpp:281 msgctxt "@info:status" msgid "Reloading the document..." msgstr "Recargando el documento..." #. i18n: file: ../app/ktikzui.rc:6 #. i18n: ectx: Menu (file) #. i18n: file: ../part/ktikzpart.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 rc.cpp:126 msgctxt "@title:menu" msgid "&File" msgstr "&Fichero" #. i18n: file: ../app/ktikzui.rc:22 #. i18n: ectx: Menu (edit) #: rc.cpp:6 msgctxt "@title:menu" msgid "&Edit" msgstr "&Editar" #. i18n: file: ../app/ktikzui.rc:42 #. i18n: ectx: Menu (view) #. i18n: file: ../part/ktikzpart.rc:8 #. i18n: ectx: Menu (view) #: rc.cpp:9 rc.cpp:129 msgctxt "@title:menu" msgid "&View" msgstr "&Ver" #. i18n: file: ../app/ktikzui.rc:50 #. i18n: ectx: Menu (go) #: rc.cpp:12 msgctxt "@title:menu" msgid "&Go" msgstr "&Ir" #. i18n: file: ../app/ktikzui.rc:54 #. i18n: ectx: Menu (process) #. i18n: file: ../part/ktikzpart.rc:15 #. i18n: ectx: Menu (process) #: rc.cpp:15 rc.cpp:132 msgctxt "@title:menu" msgid "&Process" msgstr "&Proceso" #. i18n: file: ../app/ktikzui.rc:63 #. i18n: ectx: Menu (settings) #. i18n: file: ../part/ktikzpart.rc:20 #. i18n: ectx: Menu (settings) #: rc.cpp:18 rc.cpp:135 msgctxt "@title:menu" msgid "&Settings" msgstr "&Preferencias" #. i18n: file: ../app/ktikzui.rc:66 #. i18n: ectx: Menu (sidebars) #: rc.cpp:21 msgctxt "@title:menu" msgid "&Sidebars" msgstr "Barras &laterales" #. i18n: file: ../app/ktikzui.rc:78 #. i18n: ectx: Menu (help) #: rc.cpp:24 msgctxt "@title:menu" msgid "&Help" msgstr "A&yuda" #. i18n: file: ../app/ktikzui.rc:92 #. i18n: ectx: ToolBar (mainToolBar) #: rc.cpp:27 msgctxt "@title:menu toolbar title" msgid "File Toolbar" msgstr "Barra de herramientas Fichero" #. i18n: file: ../app/ktikzui.rc:99 #. i18n: ectx: ToolBar (editToolBar) #: rc.cpp:30 msgctxt "@title:menu toolbar title" msgid "Edit Toolbar" msgstr "Barra de herramientas Editar" #. i18n: file: ../app/ktikzui.rc:104 #. i18n: ectx: ToolBar (processToolBar) #: rc.cpp:33 msgctxt "@title:menu toolbar title" msgid "Process Toolbar" msgstr "Barra de herramientas Proceso" #. i18n: file: ../app/ktikzui.rc:111 #. i18n: ectx: ToolBar (viewToolBar) #: rc.cpp:36 msgctxt "@title:menu toolbar title" msgid "View Toolbar" msgstr "Barra de herramientas Ver" #. i18n: file: ../common/ktikz.kcfg:11 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:39 msgid "" "Whether the TikZ commands should be listed in a dock widget instead of in a " "menu." msgstr "Mostrar los comandos TikZ en una barra lateral en lugar de en un menu." #. i18n: file: ../common/ktikz.kcfg:15 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:42 msgid "" "Whether the preview is generated automatically while editing instead of only " "when pressing a button." msgstr "" "Generar automáticamente la vista previa durante la edición en lugar de sólo " "generarla quando pulse un botón." #. i18n: file: ../common/ktikz.kcfg:19 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:45 msgid "" "Whether to reload the TikZ image each time that the file is modified by " "another program." msgstr "" "Si esta opción está seleccionada, el imagen TikZ se recarga cada vez " "que el fichero está modificado por un otro programa." #. i18n: file: ../common/ktikz.kcfg:23 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:48 msgid "The path to the pdflatex command." msgstr "La ruta para el ejecutable de pdflatex." #. i18n: file: ../common/ktikz.kcfg:27 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:51 msgid "The path to the pdftops command." msgstr "La ruta para el ejecutable de pdftops." #. i18n: file: ../common/ktikz.kcfg:31 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:54 msgid "The path to the TikZ documentation file." msgstr "La ruta para la documentación de TikZ." #. i18n: file: ../common/ktikz.kcfg:35 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:57 msgid "Whether to run pdflatex with the --shell-escape option." msgstr "Ejecutar pdflatex con la opción --shell-escape." #. i18n: file: ../common/ktikz.kcfg:38 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:60 msgid "The file name of the currently used template." msgstr "El nombre del fichero de base actualmente utilizado." #. i18n: file: ../common/ktikz.kcfg:41 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:63 msgid "The list of file names of the previously used templates." msgstr "La lista de los nombres de los ficheros de base previamente utilizado." #. i18n: file: ../common/ktikz.kcfg:45 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:66 msgid "" "The text in the template file which is replaced by the TikZ code before " "typesetting." msgstr "" "El texto en el fichero de base que está reemplazado con el código TikZ antes " "de compilar." #. i18n: file: ../common/ktikz.kcfg:49 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:69 msgid "The path to the editor command used for editing templates." msgstr "La ruta para el ejecutable de pdftops." #. i18n: file: ../common/ktikz.kcfg:55 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:72 msgid "The font of the main text in the editor." msgstr "El tipo de letras del texto principal en el editor." #. i18n: file: ../common/ktikz.kcfg:59 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:75 msgid "Whether to show white spaces." msgstr "Mostrar los carácteres blancos (espacios)." #. i18n: file: ../common/ktikz.kcfg:63 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:78 msgid "Whether to show tabulators." msgstr "Mostrar los carácteres blancos (tabuladores)." #. i18n: file: ../common/ktikz.kcfg:67 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:81 msgid "Whether to highlight matching brackets." msgstr "Realzar corchetes emparejados." #. i18n: file: ../common/ktikz.kcfg:71 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:84 msgid "The color used to highlight white spaces." msgstr "El color utilizado para realzar los espacios." #. i18n: file: ../common/ktikz.kcfg:75 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:87 msgid "The color used to highlight tabulators." msgstr "El color utilizado para realzar los tabuladores." #. i18n: file: ../common/ktikz.kcfg:79 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:90 msgid "The color used to highlight matching brackets." msgstr "El color utilizado para realzar los corchetes emparejados." #. i18n: file: ../common/ktikz.kcfg:83 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:93 msgid "Whether to use TikZ code completion." msgstr "Utilizar terminación de código TikZ." #. i18n: file: ../common/ktikz.kcfg:93 #. i18n: ectx: label, entry, group (Highlighting) #: rc.cpp:96 msgid "The type of syntax highlighting." msgstr "El tipo de realce de sintaxis." #. i18n: file: ../common/ktikz.kcfg:101 #. i18n: ectx: label, entry, group (Preview) #: rc.cpp:99 msgid "The factor by which the preview is zoomed." msgstr "El factor con cuál la vista previa está ampliada o reducida." #. i18n: file: ../part/configgeneralwidget.ui:6 #. i18n: ectx: property (windowTitle), widget (QWidget, PartConfigGeneralWidget) #: rc.cpp:102 msgid "Configure KTikZ Viewer" msgstr "Configurar el visor KTikZ" #. i18n: file: ../part/configgeneralwidget.ui:12 #. i18n: ectx: property (title), widget (QGroupBox, groupBox) #: rc.cpp:105 msgid "Commands" msgstr "Comandos" #. i18n: file: ../part/configgeneralwidget.ui:18 #. i18n: ectx: property (text), widget (QLabel, latexLabel) #: rc.cpp:108 msgid "PDF&LaTeX command:" msgstr "Comando PDF&LaTeX:" #. i18n: file: ../part/configgeneralwidget.ui:34 #. i18n: ectx: property (text), widget (QLabel, pdftopsLabel) #: rc.cpp:111 msgid "&Pdftops command:" msgstr "Comando &pdftops:" #. i18n: file: ../part/configgeneralwidget.ui:53 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) #: rc.cpp:114 msgid "Templates" msgstr "Ficheros de &base" #. i18n: file: ../part/configgeneralwidget.ui:59 #. i18n: ectx: property (text), widget (QLabel, replaceLabel) #: rc.cpp:117 msgid "&Replace text:" msgstr "Texto de &reemplazo:" #. i18n: file: ../part/configgeneralwidget.ui:75 #. i18n: ectx: property (whatsThis), widget (KLineEdit, replaceEdit) #: rc.cpp:120 msgid "" "Enter the text which will be replaced by the TikZ code in the template " "here." msgstr "" "El texto en el fichero de base que está reemplazado con el código TikZ antes " "de compilar." #. i18n: file: ../part/configgeneralwidget.ui:82 #. i18n: ectx: property (text), widget (QLabel, editorLabel) #: rc.cpp:123 msgid "&Editor command:" msgstr "Comando del &editor:" #. i18n: file: ../part/ktikzpart.rc:24 #. i18n: ectx: ToolBar (mainToolBar) #: rc.cpp:138 msgctxt "@title:menu toolbar title" msgid "Main Toolbar" msgstr "Barra de herramientas principal" #: rc.cpp:139 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Glad Deschrijver" #: rc.cpp:140 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "glad.deschrijver@gmail.com" ktikz/po/extractrc0000770000175000017500000002620011455414614016715 0ustar fhackenbergerfhackenberger#! /usr/bin/env perl ### TODO: other copyrights, license? # Copyright (c) 2004 Richard Evans sub usage { warn <<"EOF"; extractrc [flags] filenames This script extracts messages from designer (.ui) and XMLGUI (.rc) files and writes on standard output (usually redirected to rc.cpp) the equivalent i18n() calls so that xgettext can parse them. --tag=name : Also extract the tag name(s). Repeat the flag to specify multiple names: --tag=tag_one --tag=tag_two --tag-group=group : Use a group of tags - uses 'default' if omitted. Valid groups are: @{[TAG_GROUPS()]} --context=name : Give i18n calls a context name: i18nc("name", ...) --lines : Include source line numbers in comments (deprecated, it is switched on by default now) --cstart=chars : Start of to-EOL style comments in output, defaults to // --help|? : Display this summary EOF exit; } ########################################################################################### use strict; use warnings; use Getopt::Long; use Data::Dumper; use constant TAG_GROUP => { default => "[tT][eE][xX][tT]|title|string|whatsthis|tooltip|label", koffice => "Example|GroupName|Text|Comment|Syntax|TypeName", none => "", }; use constant TAG_GROUPS => join ", ", map "'$_'", sort keys %{&TAG_GROUP}; # Specification to extract nice element-context for strings. use constant ECTX_SPEC => { # Data structure: extension => {tag => [ctxlevel, [attribute, ...]], ...} # Order of attributes determines their order in the extracted comment. "ui" => { "widget" => [10, ["class", "name"]], "item" => [15, []], "property" => [20, ["name"]], "attribute" => [20, ["name"]], }, "rc" => { "Menu" => [10, ["name"]], "ToolBar" => [10, ["name"]], }, "kcfg" => { "group" => [10, ["name"]], "entry" => [20, ["name"]], "whatsthis" => [30, []], "tooltip" => [30, []], "label" => [30, []], }, }; # Specification to exclude strings by trailing section of element-context. use constant ECTX_EXCLUDE => [ # Data structure: [[tag, attribute, attrvalue], [...]] # Empty ("") attribute means all elements with given tag, # empty attrvalue means element with given tag and attribute of any value. [["widget", "class", "KFontComboBox"], ["item", "", ""], ["property", "", ""]], ]; # The parts between the tags of the extensions will be copied # verbatim my %EXTENSION_VERBATIM_TAGS = ( "kcfg" => [ "code" ], ); # Add attribute lists as hashes, for membership checks. for my $ext ( keys %{&ECTX_SPEC} ) { for my $tag ( keys %{ECTX_SPEC->{$ext}} ) { my $arr = ECTX_SPEC->{$ext}{$tag}[1]; ECTX_SPEC->{$ext}{$tag}[2] = {map {$_ => 1} @{$arr}}; } } ########################################################################################### # Add options here as necessary - perldoc Getopt::Long for details on GetOptions GetOptions ( "tag=s" => \my @opt_extra_tags, "tag-group=s" => \my $opt_tag_group, "context=s" => \my $opt_context, # I18N context "lines" => \my $opt_lines, "cstart=s" => \my $opt_cstart, "help|?" => \&usage ); unless( @ARGV ) { warn "No filename specified"; exit; } $opt_tag_group ||= "default"; die "Unknown tag group: '$opt_tag_group', should be one of " . TAG_GROUPS unless exists TAG_GROUP->{$opt_tag_group}; my $tags = TAG_GROUP->{$opt_tag_group}; my $extra_tags = join "", map "|" . quotemeta, @opt_extra_tags; my $text_string = qr/($tags$extra_tags)( [^>]*)?>/; # Precompile regexp my $cstart = $opt_cstart || "//"; my $ectx_known_exts = join "|", keys %{&ECTX_SPEC}; ########################################################################################### # Escape characters in string exactly like uic does. sub escape_like_uic ($) { my $text = shift; $text =~ s/<//g; $text =~ s/&/&/g; $text =~ s/"/"/g; $text =~ s/\\/\\\\/g; # escape \ $text =~ s/\"/\\\"/g; # escape " $text =~ s/\r//g; # remove CR (Carriage Return) $text =~ s/\n/\\n\"\n\"/g; # escape LF (Line Feed). uic also change the code line at a LF, we do not do that. return $text; } ########################################################################################### # Program start proper - NB $. is the current line number for my $file_name ( @ARGV ) { my $fh; unless ( open $fh, "<", $file_name ) { # warn "Failed to open: '$file_name': $!"; next; } # Ready element-context extraction. my $ectx_ext; my $ectx_string; if ( $file_name =~ /\.($ectx_known_exts)$/ ) { $ectx_ext = $1; my $ectx_tag_gr = join "|", keys %{ECTX_SPEC->{$ectx_ext}}; $ectx_string = qr/($ectx_tag_gr)( [^>]*)?>/; # precompile regexp } my $string = ""; my $in_text = 0; my $start_line_no = 0; my $in_skipped_prop = 0; my $tag = ""; my $attr = ""; my $context = ""; # Element-context data: [[level, tag, [[attribute, value], ...]], ...] # such that subarrays are ordered increasing by level. my @ectx = (); while ( <$fh> ) { last if $. == 1 and $_ !~ /^(?:{$ectx_ext}{$tag} ) { my @atts; for my $ectx_att ( @{ECTX_SPEC->{$ectx_ext}{$tag}[1]} ) { if ( $attr and $attr =~ /\b$ectx_att\s*=\s*(["'])([^"']*?)\1/ ) { my $aval = $2; push @atts, [$ectx_att, $aval]; } } # Kill all tags in element-context with level higer or equal to this, # and add it to the end. my $clevel = ECTX_SPEC->{$ectx_ext}{$tag}[0]; for ( my $i = 0; $i < @ectx; ++$i ) { if ( $clevel <= $ectx[$i][0] ) { @ectx = @ectx[0 .. ($i - 1)]; last; } } push @ectx, [$clevel, $tag, [@atts]]; } if ( ($tag, $attr) = $string =~ /<$text_string/o ) { my ($attr_comment) = $attr =~ /\w*comment=\"([^\"]*)\"/ if $attr; $context = $attr_comment if $attr_comment; my ($attr_context) = $attr =~ /\w*context=\"([^\"]*)\"/ if $attr; $context = $attr_context if $attr_context; # It is unlikely that both attributes 'context' and 'comment' # will be present, but if so happens, 'context' has priority. $string =~ s/^.*<$text_string//so; $in_text = 1; $start_line_no = $.; } else { $string = ""; } } next unless $in_text; next unless $string =~ /<\/$text_string/o; my $text = $string; $text =~ s/<\/$text_string.*$//o; if ( $text cmp "" ) { # See if the string should be excluded by trailing element-context. my $exclude_by_ectx = 0; my @rev_ectx = reverse @ectx; for my $ectx_tail (@{&ECTX_EXCLUDE}) { my @rev_ectx_tail = reverse @{$ectx_tail}; my $i = 0; $exclude_by_ectx = (@rev_ectx > 0 and @rev_ectx_tail > 0); while ($i < @rev_ectx and $i < @rev_ectx_tail) { my ($tag, $attr, $aval) = @{$rev_ectx_tail[$i]}; $exclude_by_ectx = $tag eq $rev_ectx[$i][1]; if ($attr) { for my $ectx_attr_aval (@{$rev_ectx[$i][2]}) { if ($attr eq $ectx_attr_aval->[0]) { $exclude_by_ectx = $aval ? $aval eq $ectx_attr_aval->[1] : 1; last; } } } last if not $exclude_by_ectx; ++$i; } last if $exclude_by_ectx; } if ( $context and $context eq "KDE::DoNotExtract" ) { print "$cstart Manually excluded message at $file_name line $.\n"; } elsif ( $exclude_by_ectx ) { print "$cstart Automatically excluded message at $file_name line $.\n"; } else { (my $norm_fname = $file_name) =~ s/^\.\///; print "$cstart i18n: file: $norm_fname:$.\n"; if ( @ectx ) { # Format element-context. my @tag_gr; for my $tgr (reverse @ectx) { my @attr_gr; for my $agr ( @{$tgr->[2]} ) { #push @attr_gr, "$agr->[0]=$agr->[1]"; push @attr_gr, "$agr->[1]"; # no real nead for attribute name } my $attr = join(", ", @attr_gr); push @tag_gr, "$tgr->[1] ($attr)" if $attr; push @tag_gr, "$tgr->[1]" if not $attr; } my $ectx_str = join ", ", @tag_gr; print "$cstart i18n: ectx: $ectx_str\n"; } print "$cstart xgettext: no-c-format\n" if $text =~ /%/o; if ( $context ) { $context = escape_like_uic($context); $text = escape_like_uic($text); print qq|i18nc("$context","$text");\n|; } else { $text = escape_like_uic($text); print qq|i18n("$text");\n|; } } } else { print "$cstart Skipped empty message at $file_name line $.\n"; } $string =~ s/^.*<\/$text_string//o; $in_text = 0; # Text can be multiline in .ui files (possibly), but we warn about it in XMLGUI .rc files. warn "there is floating in: '$file_name'" if $. != $start_line_no and $file_name =~ /\.rc$/i; } close $fh or warn "Failed to close: '$file_name': $!"; die "parsing error in $file_name" if $in_text; if ($ectx_ext && exists $EXTENSION_VERBATIM_TAGS{$ectx_ext}) { unless ( open $fh, "<", $file_name ) { # warn "Failed to open: '$file_name': $!"; next; } while ( <$fh> ) { chomp; $string .= "\n" . $_; foreach $tag (@{ $EXTENSION_VERBATIM_TAGS{$ectx_ext} }) { if ($string =~ /<$tag>(.*)<\/$tag>/s) { # Add comment before any line that has an i18n substring in it. my @matched = split /\n/, $1; my $mlno = $.; (my $norm_fname = $file_name) =~ s/^\.\///; for my $mline (@matched) { if ($mline =~ /i18n/) { print "$cstart i18n: file: $norm_fname:$mlno\n"; } print "$mline\n"; ++$mlno; } $string = ""; } } } close $fh or warn "Failed to close: '$file_name': $!"; } } ktikz/po/CMakeLists.txt0000660000175000017500000000201211455414614017524 0ustar fhackenbergerfhackenbergerFIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt) IF(NOT GETTEXT_MSGFMT_EXECUTABLE) MESSAGE( "------ NOTE: msgfmt not found. Translations will *not* be installed ------") ELSE(NOT GETTEXT_MSGFMT_EXECUTABLE) SET(catalogname ktikz) ADD_CUSTOM_TARGET(translations ALL) FILE(GLOB PO_FILES ${catalogname}*.po) FOREACH(_poFile ${PO_FILES}) GET_FILENAME_COMPONENT(_poFileName ${_poFile} NAME) STRING(REGEX REPLACE "^${catalogname}_?" "" _langCode ${_poFileName} ) STRING(REGEX REPLACE "\\.po$" "" _langCode ${_langCode} ) IF( _langCode ) GET_FILENAME_COMPONENT(_lang ${_poFile} NAME_WE) SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) ADD_CUSTOM_COMMAND(TARGET translations COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile} DEPENDS ${_poFile}) INSTALL(FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo) ENDIF( _langCode ) ENDFOREACH(_poFile ${PO_FILES}) ENDIF(NOT GETTEXT_MSGFMT_EXECUTABLE) ktikz/po/ktikz_fr.po0000660000175000017500000003112611455414614017157 0ustar fhackenbergerfhackenberger# Copyright (C) 2007-2010 Florian Hackenberger, Glad Deschrijver # This file is distributed under the same license as the KTikZ package. # # Glad Deschrijver , 2009, 2010. # Glad Deschrijver , 2010. msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: http://www.hackenberger.at/\n" "POT-Creation-Date: 2010-08-26 11:09+0200\n" "PO-Revision-Date: 2010-08-26 11:10+0200\n" "Last-Translator: Glad Deschrijver \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../app/main.cpp:105 msgid "KTikZ" msgstr "KTikZ" #: ../app/main.cpp:106 msgid "A TikZ Editor" msgstr "Un éditeur TikZ" #: ../app/main.cpp:108 ../part/part.cpp:114 msgid "Copyright 2007-2010 Florian Hackenberger, Glad Deschrijver" msgstr "Copyright 2007-2010 Florian Hackenberger, Glad Deschrijver" #: ../app/main.cpp:109 msgid "" "This is a program for creating TikZ (from the LaTeX pgf package) diagrams." msgstr "" "Ceci est un programme pour créer des diagrammes TikZ (du paquet LaTeX pgf)." #: ../app/main.cpp:111 ../part/part.cpp:117 msgid "Florian Hackenberger" msgstr "Florian Hackenberger" #: ../app/main.cpp:111 ../part/part.cpp:117 msgid "Maintainer" msgstr "Mainteneur" #: ../app/main.cpp:112 ../part/part.cpp:118 msgid "Glad Deschrijver" msgstr "Glad Deschrijver" #: ../app/main.cpp:112 ../part/part.cpp:118 msgid "Developer" msgstr "Développeur" #: ../app/main.cpp:117 msgid "TikZ document to open" msgstr "Document TikZ à ouvrir" #: ../part/configdialog.cpp:29 msgctxt "@title:window" msgid "Configure KTikZ Viewer" msgstr "Configurer la visionneuse KTikZ" #: ../part/configdialog.cpp:53 msgctxt "@title:group" msgid "Viewer" msgstr "Affichage" #: ../part/configdialog.cpp:55 msgctxt "@option:check" msgid "&Reload document on file change" msgstr "Recharger le document si le fichier change" #: ../part/configdialog.cpp:57 msgctxt "@info:whatsthis" msgid "" "When this option is checked, the TikZ image will be reloaded each time " "that the file is modified by another program." msgstr "" "Lorsque cette option est cochée, l'image TikZ est rechargé chaque fois " "que le fichier est modifié par un autre programme." #: ../part/part.cpp:111 msgid "KTikZ KPart" msgstr "KTikZ KPart" #: ../part/part.cpp:112 msgid "A TikZ Viewer" msgstr "Une visionneuse d'images TikZ" #: ../part/part.cpp:115 msgid "" "This is a plugin for viewing TikZ (from the LaTeX pgf package) diagrams." msgstr "" "Ceci est un plugin pour visionner des diagrammes TikZ (du paquet LaTeX pgf)." #: ../part/part.cpp:126 msgctxt "@info:whatsthis" msgid "Save the document under a new name." msgstr "Enregistrer le document sous un nouveau nom." #: ../part/part.cpp:140 msgctxt "@action" msgid "Configure KTikZ Viewer..." msgstr "Configurer la visionneuse KTikZ..." #: ../part/part.cpp:152 msgctxt "@info" msgid "Cannot read file %1:%2" msgstr "" "Impossible de lire le fichier %1 :%2<" "/message>" #: ../part/part.cpp:152 msgctxt "@title:window" msgid "File Read Error" msgstr "Erreur de lecture du fichier" #: ../part/part.cpp:182 msgctxt "@item:inlistbox filter" msgid "TikZ files" msgstr "Fichiers TikZ" #: ../part/part.cpp:184 msgctxt "@item:inlistbox filter" msgid "All files" msgstr "Tous les fichiers" #: ../part/part.cpp:185 msgctxt "@title:window" msgid "Save TikZ Source File As" msgstr "Enregistrer fichier source TikZ sous" #: ../part/part.cpp:281 msgctxt "@info:status" msgid "Reloading the document..." msgstr "Rechargeant le document..." #. i18n: file: ../app/ktikzui.rc:6 #. i18n: ectx: Menu (file) #. i18n: file: ../part/ktikzpart.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 rc.cpp:126 msgctxt "@title:menu" msgid "&File" msgstr "&Fichier" #. i18n: file: ../app/ktikzui.rc:22 #. i18n: ectx: Menu (edit) #: rc.cpp:6 msgctxt "@title:menu" msgid "&Edit" msgstr "&Édition" #. i18n: file: ../app/ktikzui.rc:42 #. i18n: ectx: Menu (view) #. i18n: file: ../part/ktikzpart.rc:8 #. i18n: ectx: Menu (view) #: rc.cpp:9 rc.cpp:129 msgctxt "@title:menu" msgid "&View" msgstr "Afficha&ge" #. i18n: file: ../app/ktikzui.rc:50 #. i18n: ectx: Menu (go) #: rc.cpp:12 msgctxt "@title:menu" msgid "&Go" msgstr "&Aller" #. i18n: file: ../app/ktikzui.rc:54 #. i18n: ectx: Menu (process) #. i18n: file: ../part/ktikzpart.rc:15 #. i18n: ectx: Menu (process) #: rc.cpp:15 rc.cpp:132 msgctxt "@title:menu" msgid "&Process" msgstr "&Processus" #. i18n: file: ../app/ktikzui.rc:63 #. i18n: ectx: Menu (settings) #. i18n: file: ../part/ktikzpart.rc:20 #. i18n: ectx: Menu (settings) #: rc.cpp:18 rc.cpp:135 msgctxt "@title:menu" msgid "&Settings" msgstr "&Options" #. i18n: file: ../app/ktikzui.rc:66 #. i18n: ectx: Menu (sidebars) #: rc.cpp:21 msgctxt "@title:menu" msgid "&Sidebars" msgstr "Barres &latérales" #. i18n: file: ../app/ktikzui.rc:78 #. i18n: ectx: Menu (help) #: rc.cpp:24 msgctxt "@title:menu" msgid "&Help" msgstr "&Aide" #. i18n: file: ../app/ktikzui.rc:92 #. i18n: ectx: ToolBar (mainToolBar) #: rc.cpp:27 msgctxt "@title:menu toolbar title" msgid "File Toolbar" msgstr "Barre d'outils Fichier" #. i18n: file: ../app/ktikzui.rc:99 #. i18n: ectx: ToolBar (editToolBar) #: rc.cpp:30 msgctxt "@title:menu toolbar title" msgid "Edit Toolbar" msgstr "Barre d'outils Éditeur" #. i18n: file: ../app/ktikzui.rc:104 #. i18n: ectx: ToolBar (processToolBar) #: rc.cpp:33 msgctxt "@title:menu toolbar title" msgid "Process Toolbar" msgstr "Barre d'outils Processus" #. i18n: file: ../app/ktikzui.rc:111 #. i18n: ectx: ToolBar (viewToolBar) #: rc.cpp:36 msgctxt "@title:menu toolbar title" msgid "View Toolbar" msgstr "Barre d'outils Affichage" #. i18n: file: ../common/ktikz.kcfg:11 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:39 msgid "" "Whether the TikZ commands should be listed in a dock widget instead of in a " "menu." msgstr "Montrer les commandes TikZ dans une barre latérale au lieu du menu." #. i18n: file: ../common/ktikz.kcfg:15 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:42 msgid "" "Whether the preview is generated automatically while editing instead of only " "when pressing a button." msgstr "" "Générer l'aperçu automatiquement durant l'édition au lieu de seulement le " "générer lorsqu'un bouton est pressé." #. i18n: file: ../common/ktikz.kcfg:19 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:45 msgid "" "Whether to reload the TikZ image each time that the file is modified by " "another program." msgstr "" "Lorsque cette option est cochée, l'image TikZ est rechargé chaque fois " "que le fichier est modifié par un autre programme." #. i18n: file: ../common/ktikz.kcfg:23 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:48 msgid "The path to the pdflatex command." msgstr "Le chemin d'accès du fichier exécutable de pdflatex." #. i18n: file: ../common/ktikz.kcfg:27 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:51 msgid "The path to the pdftops command." msgstr "Le chemin d'accès du fichier exécutable de pdftops." #. i18n: file: ../common/ktikz.kcfg:31 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:54 msgid "The path to the TikZ documentation file." msgstr "Le chemin d'accès de la documentation TikZ." #. i18n: file: ../common/ktikz.kcfg:35 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:57 msgid "Whether to run pdflatex with the --shell-escape option." msgstr "Exécuter pdflatex avec l'option --shell-escape." #. i18n: file: ../common/ktikz.kcfg:38 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:60 msgid "The file name of the currently used template." msgstr "Le nom du fichier de base actuellement en utilisation." #. i18n: file: ../common/ktikz.kcfg:41 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:63 msgid "The list of file names of the previously used templates." msgstr "La liste des noms des fichiers de base utilisés précédemment." #. i18n: file: ../common/ktikz.kcfg:45 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:66 msgid "" "The text in the template file which is replaced by the TikZ code before " "typesetting." msgstr "" "Le texte dans le fichier de base qui est remplacé par le code TikZ avant de " "compiler." #. i18n: file: ../common/ktikz.kcfg:49 #. i18n: ectx: label, entry, group (General Options) #: rc.cpp:69 msgid "The path to the editor command used for editing templates." msgstr "Le chemin d'accès du fichier exécutable de pdftops." #. i18n: file: ../common/ktikz.kcfg:55 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:72 msgid "The font of the main text in the editor." msgstr "La police du texte principal dans l'éditeur." #. i18n: file: ../common/ktikz.kcfg:59 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:75 msgid "Whether to show white spaces." msgstr "Montrer les caractères blancs (espaces)." #. i18n: file: ../common/ktikz.kcfg:63 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:78 msgid "Whether to show tabulators." msgstr "Montrer les caractères blancs (tabulateurs)." #. i18n: file: ../common/ktikz.kcfg:67 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:81 msgid "Whether to highlight matching brackets." msgstr "Illuminer parenthèses correspondantes." #. i18n: file: ../common/ktikz.kcfg:71 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:84 msgid "The color used to highlight white spaces." msgstr "La couleur utilisée pour illuminer les espaces." #. i18n: file: ../common/ktikz.kcfg:75 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:87 msgid "The color used to highlight tabulators." msgstr "La couleur utilisée pour illuminer les tabulateurs." #. i18n: file: ../common/ktikz.kcfg:79 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:90 msgid "The color used to highlight matching brackets." msgstr "La couleur utilisée pour illuminer les parenthèses correspondantes." #. i18n: file: ../common/ktikz.kcfg:83 #. i18n: ectx: label, entry, group (Editor) #: rc.cpp:93 msgid "Whether to use TikZ code completion." msgstr "Utiliser complètement des commandes." #. i18n: file: ../common/ktikz.kcfg:93 #. i18n: ectx: label, entry, group (Highlighting) #: rc.cpp:96 msgid "The type of syntax highlighting." msgstr "Le type de coloration syntaxique." #. i18n: file: ../common/ktikz.kcfg:101 #. i18n: ectx: label, entry, group (Preview) #: rc.cpp:99 msgid "The factor by which the preview is zoomed." msgstr "Le facteur avec lequel l'aperçu est agrandi ou rétréci." #. i18n: file: ../part/configgeneralwidget.ui:6 #. i18n: ectx: property (windowTitle), widget (QWidget, PartConfigGeneralWidget) #: rc.cpp:102 msgid "Configure KTikZ Viewer" msgstr "Configurer la visionneuse KTikZ" #. i18n: file: ../part/configgeneralwidget.ui:12 #. i18n: ectx: property (title), widget (QGroupBox, groupBox) #: rc.cpp:105 msgid "Commands" msgstr "Commandes" #. i18n: file: ../part/configgeneralwidget.ui:18 #. i18n: ectx: property (text), widget (QLabel, latexLabel) #: rc.cpp:108 msgid "PDF&LaTeX command:" msgstr "Commande PDF&LaTeX :" #. i18n: file: ../part/configgeneralwidget.ui:34 #. i18n: ectx: property (text), widget (QLabel, pdftopsLabel) #: rc.cpp:111 msgid "&Pdftops command:" msgstr "Commande &pdftops :" #. i18n: file: ../part/configgeneralwidget.ui:53 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) #: rc.cpp:114 msgid "Templates" msgstr "Fichiers de &base" #. i18n: file: ../part/configgeneralwidget.ui:59 #. i18n: ectx: property (text), widget (QLabel, replaceLabel) #: rc.cpp:117 msgid "&Replace text:" msgstr "Texte &remplacé :" #. i18n: file: ../part/configgeneralwidget.ui:75 #. i18n: ectx: property (whatsThis), widget (KLineEdit, replaceEdit) #: rc.cpp:120 msgid "" "Enter the text which will be replaced by the TikZ code in the template " "here." msgstr "" "Le texte dans le fichier de base qui est remplacé par le code TikZ avant de " "compiler." #. i18n: file: ../part/configgeneralwidget.ui:82 #. i18n: ectx: property (text), widget (QLabel, editorLabel) #: rc.cpp:123 msgid "&Editor command:" msgstr "Commande de l'&éditeur :" #. i18n: file: ../part/ktikzpart.rc:24 #. i18n: ectx: ToolBar (mainToolBar) #: rc.cpp:138 msgctxt "@title:menu toolbar title" msgid "Main Toolbar" msgstr "Barre principale" #: rc.cpp:139 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Glad Deschrijver" #: rc.cpp:140 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "glad.deschrijver@gmail.com" ktikz/po/extract_messages.sh0000770000175000017500000000465311455414614020700 0ustar fhackenbergerfhackenberger#!/bin/sh #BASEDIR="../" # root of translatable sources BASEDIRS="../app ../common ../part" # roots of translatable sources PARTDIR="../part" PROJECT="ktikz" # project name BUGADDR="http://www.hackenberger.at/" # MSGID-Bugs WDIR=`pwd` # working dir TIKZCOMMANDSLIST=lists/tikzcommands.list add_list() { LIST=$1 if [ -z "$LIST" ] then echo ">>ERR<< add_list() - missing parameter LIST - exiting" return fi if [ -f "$LIST" ] then cat $LIST | while read ROW do echo "tr2i18n(\"${ROW}\")" >> ${WDIR}/rc.cpp done else echo ">>ERR<< add_list() - file $LIST does not exist." fi } echo "Preparing rc files" #cd ${BASEDIR} # we use simple sorting to make sure the lines do not jump around too much from system to system #find . -name '*.rc' -o -name '*.ui' -o -name '*.kcfg' | sort > ${WDIR}/rcfiles.list # dirty hack: let Qt translate the .ui files instead of KDE #find ${BASEDIRS} -name '*.rc' -o -name '*.ui' -o -name '*.kcfg' | sort > ${WDIR}/rcfiles.list (find ${BASEDIRS} -name '*.rc' -o -name '*.kcfg'; find ${PARTDIR} -name '*.ui') | sort > ${WDIR}/rcfiles.list xargs --arg-file=${WDIR}/rcfiles.list extractrc > ${WDIR}/rc.cpp # additional string for KAboutData echo 'i18nc("NAME OF TRANSLATORS","Your names");' >> ${WDIR}/rc.cpp echo 'i18nc("EMAIL OF TRANSLATORS","Your emails");' >> ${WDIR}/rc.cpp cd ${WDIR} # Add tikz commands descriptions #add_list "$TIKZCOMMANDSLIST" echo "Done preparing rc files" echo "Extracting messages" #cd ${BASEDIR} # see above on sorting #find . -name '*.cpp' -o -name '*.h' -o -name '*.c' | sort > ${WDIR}/infiles.list find ${BASEDIRS} -name '*.cpp' -o -name '*.h' -o -name '*.c' | sort > ${WDIR}/infiles.list echo "rc.cpp" >> ${WDIR}/infiles.list cd ${WDIR} DBASEDIRS=`echo $BASEDIRS | sed -e "s/\([^\ ]*\)/-D \\1/g"` xgettext --from-code=UTF-8 -C -kde -ci18n -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 -ktr2i18n:1 \ -kI18N_NOOP:1 -kI18N_NOOP2:1c,2 -kaliasLocale -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \ --msgid-bugs-address="${BUGADDR}" \ --files-from=infiles.list ${DBASEDIRS} -D ${WDIR} -o ${PROJECT}.pot || { echo "error while calling xgettext. aborting."; exit 1; } echo "Done extracting messages" echo "Merging translations" catalogs=`find . -name '*.po'` for cat in $catalogs; do echo $cat msgmerge -o $cat.new $cat ${PROJECT}.pot mv $cat.new $cat done echo "Done merging translations" echo "Cleaning up" cd ${WDIR} rm rcfiles.list rm infiles.list rm rc.cpp echo "Done" ktikz/po/lists/0000771000175000017500000000000011455415074016130 5ustar fhackenbergerfhackenbergerktikz/po/lists/tikzcommands.list0000660000175000017500000000433611455414614021535 0ustar fhackenbergerfhackenberger&Insert foreach with iteration foreach with custom text &Draw Specify &coordinate &Node &Clip and draw the clipping contours Draw &line between two points Draw p&olygon &Clip rectangle Draw &to Next Point &Move to point &Move to relative point &Line to &Line to relative point &Line to node &Line to node with anchor C&urve to C&ycle &To &Plot &Function &Plot function &Specifying Coordinates &Absolute point Point &relative to initial position Point &relative to previous position &Polar coordinates &Intersection of two lines &Curves &Rectangle &Circle &Ellipse &Arc &Parabola &Sine curve in [0, pi/2] &Cosine curve in [0, pi/2] &Grid &Arrows &Shorten start of line &Shorten end of line &Options Define style for &every path &Node Options Set node at &start of path Set node very near &start of path Set node near &start of path Set node &midway path Set node near &end of path Set node very near &end of path Set node at &end of path Set relative &position of node on path Set &text width in node Set &text in node justified Align &text in node to the left Align &text to the left without hyphenation Center &text in node Center &text without hyphenation Set &text height in node Set &text depth in node Set &separation between text and node shape Set &separation outside node shape Set minimum &height of node Set minimum &width of node Set node &sloped in the direction of path Set &shape of node &Define style for every node &Define style for every node &Line Options Maximal length of &miter join &Plot Options &Dash Patterns &Equal lines &Alternating lines S&hift dash start &Shade Options &Snaked Lines Options &Path Options &Transformations on Subsequent Objects in Path S&hift horizontally S&hift vertically S&hift to a point &Cancel all transformations except shift &Rotate by angle &Rotate around a point S&cale horizontally S&cale vertically S&cale in both directions &Flip horizontally &Flip vertically &Slant horizontally &Slant vertically C&oordinate transformation Para&bola Options Parabola with specified &width and height &Grid Options Draw \\"subdued\\" &grid with specified step &To Options to curved with &label to curved with to &path &Define style for every to ktikz/po/extractattr0000770000175000017500000000733511455414614017273 0ustar fhackenbergerfhackenberger#! /usr/bin/env perl # # Copyright (c) 2004 Richard Evans # # License: LGPL 2.0 # sub usage { warn <<"EOF"; extractattr [flags] filenames This script extracts element attributes from designer (.ui) and XMLGIU (.rc) files and writes on standard output (usually redirected to rc.cpp) the equivalent i18n() calls so that xgettext can parse them. --attr=spec : Specify the attribute to be extracted. The specification consists of the following comma separated arguments: Element,attribute[,context] The context is optional and overrides the name set by --context below. Repeat the flag to specify multiple attributes: --attr=Title,data --attr=Description,data,Stencils --context=name : Give i18n calls a context name: i18nc("name", ...) --lines : Include source line numbers in comments (deprecated, it is switched on by default now) --help|? : Display this summary EOF exit; } ########################################################################################### use strict; use warnings; use Getopt::Long; ########################################################################################### # Add options here as necessary - perldoc Getopt::Long for details on GetOptions GetOptions ( "attr=s" => \my @opt_attr, "context=s" => \my $opt_context, "lines" => \my $opt_lines, "help|?" => \&usage ); unless ( @ARGV ) { warn "No filename specified"; exit; } unless ( @opt_attr ) { warn "No attributes specified"; exit; } ########################################################################################### # Program start proper - NB $. is the current line number my $code =<<'EOF'; our $file_name; for $file_name ( @ARGV ) { my $fh; unless ( open $fh, "<", $file_name ) { warn "Failed to open: '$file_name': $!"; next; } while ( <$fh> ) { last if $. == 1 and $_ !~ /^(?:]*?| . quotemeta($attribute) . qq|="([^"]+)"/ and write_i18n('| . $context . qq|', \$1, "| . $element . "\",\"" . $attribute . qq|");\n|; } return "$code\n"; } sub write_i18n { my ($context, $text, $tag, $attr) = @_; our $file_name; unless ( $text ) { print "// Skipped empty message at $file_name line $.\n"; return; } $text =~ s/<//g; $text =~ s/'/\'/g; $text =~ s/"/\"/g; $text =~ s/&/&/g; # Escape characters exactly like uic does it # (As extractrc needs it, we follow the same rule to avoid to be different.) $text =~ s/\\/\\\\/g; # escape \ $text =~ s/\"/\\\"/g; # escape " $text =~ s/\r//g; # remove CR (Carriage Return) $text =~ s/\n/\\n\"\n\"/g; # escape LF (Line Feed). uic also change the code line at a LF, we do not do that. $context ||= $opt_context; print "//i18n: tag $tag attribute $attr\n"; print "//i18n: file: $file_name:$.\n"; if ( $context ) { print qq|i18nc("$context","$text");\n|; } else { print qq|i18n("$text");\n|; } } ktikz/qtikz.nsi0000660000175000017500000001322011455414614016226 0ustar fhackenbergerfhackenberger;NSIS Modern User Interface ;QTikZ installation script ;Written by Glad Deschrijver !define ORGNAME "Florian_Hackenberger" !define APPNAME "QTikZ" !define FILENAME "qtikz" ; qtikz.nsh file is created by "make install" and it contains VERSION !include "qtikz.nsh" ; Compression type SetCompressor lzma ;-------------------------------- ;Include Modern UI !include "MUI2.nsh" ;-------------------------------- ;General ;Name and file Name "${APPNAME} ${VERSION}" OutFile "${FILENAME}-${VERSION}-install.exe" ;Default installation folder InstallDir "$PROGRAMFILES\${APPNAME}" ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\${ORGNAME}\${APPNAME}" "" ;Request application privileges for Windows Vista RequestExecutionLevel highest ;-------------------------------- ;Variables Var StartMenuFolder ;-------------------------------- ;Interface Settings !define MUI_ABORTWARNING ;-------------------------------- ;Pages !insertmacro MUI_PAGE_LICENSE "data\LICENSE.GPL2" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY ;Start Menu Folder Page Configuration !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${ORGNAME}\${APPNAME}" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Installer Sections Section "Main Section" SecMain SectionIn RO ; Set output path to the installation directory SetOutPath "$INSTDIR" ;ADD YOUR OWN FILES HERE... File "${FILENAME}.exe" ;File "${FILENAME}_readme.txt" SetOutPath $INSTDIR\data\documentation File "data\documentation\qtikz.qch" File "data\documentation\qtikz.qhc" SetOutPath $INSTDIR\data\locale File "data\locale\qtikz_de.qm" File "data\locale\qtikz_es.qm" File "data\locale\qtikz_fr.qm" SetOutPath $INSTDIR\data\templates File "data\templates\beamer-example-template.pgs" File "data\templates\template_example.pgs" File "data\templates\template_example2.pgs" ;Store installation folder WriteRegStr HKCU "Software\${ORGNAME}\${APPNAME}" "" $INSTDIR ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Create shortcuts CreateDirectory "$SMPROGRAMS\$StartMenuFolder" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${APPNAME}.lnk" "$INSTDIR\${FILENAME}.exe" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Section "Poppler Section" SecPoppler ; Set output path to the installation directory SetOutPath "$INSTDIR" ; Put files here File "iconv.dll" File "jpeg62.dll" File "libfontconfig.dll" File "libfreetype.dll" File "liblcms-1.dll" File "libopenjpeg.dll" File "libpng12.dll" File "libpoppler.dll" File "libpoppler-qt4.dll" File "libxml2.dll" File "zlib1.dll" SectionEnd Section "Qt4 Section" SecQt4 ; Set output path to the installation directory SetOutPath "$INSTDIR" ; Put files here File "assistant.exe" File "libgcc_s_dw2-1.dll" File "mingwm10.dll" File "QtCore4.dll" File "QtGui4.dll" File "QtXml4.dll" SectionEnd ;-------------------------------- ;Descriptions ;Language strings LangString DESC_SecMain ${LANG_ENGLISH} "Main application and data files." LangString DESC_SecPoppler ${LANG_ENGLISH} "Poppler runtime files." LangString DESC_SecQt4 ${LANG_ENGLISH} "Qt4 runtime files." ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecMain} $(DESC_SecMain) !insertmacro MUI_DESCRIPTION_TEXT ${SecPoppler} $(DESC_SecPoppler) !insertmacro MUI_DESCRIPTION_TEXT ${SecQt4} $(DESC_SecQt4) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Section "Uninstall" ;ADD YOUR OWN FILES HERE... Delete "$INSTDIR\${FILENAME}.exe" Delete "$INSTDIR\data\documentation\qtikz.qch" Delete "$INSTDIR\data\documentation\qtikz.qhc" Delete "$INSTDIR\data\locale\qtikz_de.qm" Delete "$INSTDIR\data\locale\qtikz_es.qm" Delete "$INSTDIR\data\locale\qtikz_fr.qm" Delete "$INSTDIR\data\templates\beamer-example-template.pgs" Delete "$INSTDIR\data\templates\template_example.pgs" Delete "$INSTDIR\data\templates\template_example2.pgs" RMDir "$INSTDIR\data\documentation" RMDir "$INSTDIR\data\locale" RMDir "$INSTDIR\data\templates" RMDir "$INSTDIR\data" Delete "$INSTDIR\iconv.dll" Delete "$INSTDIR\jpeg62.dll" Delete "$INSTDIR\libfontconfig.dll" Delete "$INSTDIR\libfreetype.dll" Delete "$INSTDIR\liblcms-1.dll" Delete "$INSTDIR\libopenjpeg.dll" Delete "$INSTDIR\libpng12.dll" Delete "$INSTDIR\libpoppler.dll" Delete "$INSTDIR\libpoppler-qt4.dll" Delete "$INSTDIR\libxml2.dll" Delete "$INSTDIR\zlib1.dll" Delete "$INSTDIR\assistant.exe" Delete "$INSTDIR\libgcc_s_dw2-1.dll" Delete "$INSTDIR\mingwm10.dll" Delete "$INSTDIR\QtCore4.dll" Delete "$INSTDIR\QtGui4.dll" Delete "$INSTDIR\QtXml4.dll" Delete "$INSTDIR\Uninstall.exe" RMDir "$INSTDIR" !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder Delete "$SMPROGRAMS\$StartMenuFolder\${APPNAME}.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" RMDir "$SMPROGRAMS\$StartMenuFolder" DeleteRegKey /ifempty HKCU "Software\${ORGNAME}\${APPNAME}" SectionEnd ktikz/app/0000771000175000017500000000000011455641416015135 5ustar fhackenbergerfhackenbergerktikz/app/mainwindow.h0000660000175000017500000001243511455414611017462 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * * * Copyright (C) 2007, 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #ifdef KTIKZ_USE_KDE #include class KUrl; #else #include class QUrl; class AboutDialog; class AssistantController; #endif #include #include #include "../common/mainwidget.h" class QAction; class QCloseEvent; class QCompleter; class QDockWidget; class QLabel; class QMenu; class QSyntaxHighlighter; class QToolButton; class Action; class ConfigDialog; class LogTextEdit; class RecentFilesAction; class TikzCommandInserter; class TikzEditorView; class TikzHighlighter; class TikzPreviewController; class Url; /** Provides a tiny application for simple editing of TikZ graphics * @author Florian Hackenberger */ #ifdef KTIKZ_USE_KDE class MainWindow : public KXmlGuiWindow, public MainWidget #else class MainWindow : public QMainWindow, public MainWidget #endif { Q_OBJECT public: MainWindow(); virtual ~MainWindow(); virtual QWidget *widget(); bool isDocumentModified() const; QString tikzCode() const; Url url() const; static QList mainWindowList() { return s_mainWindowList; } public slots: void loadUrl(const Url &url); bool save(); signals: void setSearchFromBegin(bool searchFromBegin); protected: #ifdef KTIKZ_USE_KDE bool queryClose(); void readProperties(const KConfigGroup &group); void saveProperties(KConfigGroup &group); #endif void closeEvent(QCloseEvent *event); private slots: void checkForFileChanges(); void saveLastInternalModifiedDateTime(); void setDockWidgetStatusTip(bool enabled); void setToolBarStatusTip(bool enabled); void newFile(); bool closeFile(); void open(); bool saveAs(); void reload(); void showTikzDocumentation(); #ifndef KTIKZ_USE_KDE void about(); void showDocumentation(); #endif void configure(); void applySettings(); void setDocumentModified(bool isModified); void logUpdated(); #ifdef KTIKZ_USE_KDE void toggleWhatsThisMode(); #endif void showCursorPosition(int row, int col); private: void createActions(); #ifndef KTIKZ_USE_KDE void createMenus(); void createToolBars(); void setToolBarStyle(); #endif void createCommandInsertWidget(); void createStatusBar(); void readSettings(); void writeSettings(); bool maybeSave(); bool saveUrl(const Url &url); void setCurrentUrl(const Url &url); QString strippedName(const Url &url) const; void showPdfPage(); void updateCompleter(); static QList s_mainWindowList; TikzEditorView *m_tikzEditorView; TikzHighlighter *m_tikzHighlighter; QCompleter *m_completer; bool m_useCompletion; TikzPreviewController *m_tikzPreviewController; bool m_buildAutomatically; QDockWidget *m_previewDock; QDockWidget *m_logDock; LogTextEdit *m_logTextEdit; QSyntaxHighlighter *m_logHighlighter; QDockWidget *m_commandsDock; TikzCommandInserter *m_commandInserter; QLabel *m_positionLabel; QMenu *m_settingsMenu; QMenu *m_sideBarMenu; QToolBar *m_fileToolBar; QToolBar *m_editToolBar; QToolBar *m_viewToolBar; QToolBar *m_runToolBar; QAction *m_newAction; QAction *m_openAction; RecentFilesAction *m_openRecentAction; QAction *m_saveAction; QAction *m_saveAsAction; QAction *m_exportAction; QAction *m_exportEpsAction; QAction *m_exportPdfAction; QAction *m_exportPngAction; Action *m_reloadAction; QAction *m_closeAction; QAction *m_exitAction; QAction *m_procStopAction; Action *m_buildAction; QAction *m_viewLogAction; QAction *m_shellEscapeAction; QAction *m_configureAction; QAction *m_showTikzDocAction; QAction *m_whatsThisAction; #ifndef KTIKZ_USE_KDE QAction *m_helpAction; QAction *m_aboutAction; QAction *m_aboutQtAction; #endif QToolButton *m_shellEscapeButton; bool m_useShellEscaping; #ifndef KTIKZ_USE_KDE QPointer m_aboutDialog; AssistantController *m_assistantController; #endif QPointer m_configDialog; Url m_currentUrl; Url m_lastUrl; QDateTime m_lastInternalModifiedDateTime; }; #endif ktikz/app/loghighlighter.h0000660000175000017500000000463111455414611020305 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * * * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef LOGHIGHLIGHTER_H #define LOGHIGHLIGHTER_H #include #include /** A simple, incomplete highlighter for LaTeX .log files * @author Florian Hackenberger */ class LogHighlighter : public QSyntaxHighlighter { Q_OBJECT public: LogHighlighter(QTextDocument *parent = 0); virtual ~LogHighlighter(); protected: /** Implements QSyntaxHighlighter::highlightBlock() * @see QSyntaxHighlighter::highlightBlock() */ void highlightBlock(const QString &text); private: struct HighlightingRule { QRegExp pattern; /// The pattern to match for formatting QTextCharFormat format; /// The style of the formatting }; /// All highlighting rules with their formatting for easy iteration QVector m_highlightingRules; /// The start of the statistics output by LaTeX QString m_statisticsStartExpression; /// The highlighting format for LaTeX statistics QTextCharFormat m_statisticsFormat; }; #endif ktikz/app/assistantcontroller.h0000660000175000017500000000311511455414611021416 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef ASSISTANTCONTROLLER_H #define ASSISTANTCONTROLLER_H #include class QProcess; class AssistantController { public: AssistantController(); ~AssistantController(); void showDocumentation(const QString &page = 0); private: bool startAssistant(); QProcess *m_process; }; #endif ktikz/app/qtikz.desktop.template0000660000175000017500000000051411455414611021477 0ustar fhackenbergerfhackenberger[Desktop Entry] Type=Application Name=QTikZ Exec=qtikz Icon= Terminal=false MimeType=text/x-pgf;text/x-tex; Categories=Qt;Office; GenericName=TikZ editor GenericName[fr]=Éditeur TikZ Comment=Program for creating TikZ (from the LaTeX pgf package) diagrams Comment[fr]=Programme pour créer des diagrammes TikZ (du paquet LaTeX pgf) ktikz/app/configgeneralwidget.cpp0000660000175000017500000001447111455414611021652 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "configgeneralwidget.h" #include #include #include #include #include #include #include "ktikzapplication.h" #include "tikzdocumentationcontroller.h" #include "../common/utils/icon.h" ConfigGeneralWidget::ConfigGeneralWidget(QWidget *parent) : QWidget(parent) { ui.setupUi(this); #ifdef KTIKZ_USE_KDE ui.historyLengthLabel->setVisible(false); ui.historyLengthSpinBox->setVisible(false); ui.toolBarStyleLabel->setVisible(false); ui.toolBarStyleComboBox->setVisible(false); #endif QCompleter *completer = new QCompleter(this); completer->setModel(new QDirModel(completer)); completer->setCompletionMode(QCompleter::PopupCompletion); ui.tikzDocEdit->setCompleter(completer); ui.latexEdit->setCompleter(completer); ui.pdftopsEdit->setCompleter(completer); ui.editorEdit->setCompleter(completer); ui.tikzDocButton->setIcon(Icon("document-open")); ui.latexButton->setIcon(Icon("document-open")); ui.pdftopsButton->setIcon(Icon("document-open")); ui.editorButton->setIcon(Icon("document-open")); connect(ui.commandsInDockCheck, SIGNAL(toggled(bool)), this, SLOT(setCommandsInDock(bool))); connect(ui.tikzDocButton, SIGNAL(clicked()), this, SLOT(browseCommand())); connect(ui.tikzDocSearchButton, SIGNAL(clicked()), this, SLOT(searchTikzDocumentation())); connect(ui.latexButton, SIGNAL(clicked()), this, SLOT(browseCommand())); connect(ui.pdftopsButton, SIGNAL(clicked()), this, SLOT(browseCommand())); connect(ui.editorButton, SIGNAL(clicked()), this, SLOT(browseCommand())); } void ConfigGeneralWidget::readSettings(const QString &settingsGroup) { QSettings settings(ORGNAME, APPNAME); settings.beginGroup(settingsGroup); #ifndef KTIKZ_USE_KDE ui.historyLengthSpinBox->setValue(settings.value("RecentFilesNumber", 10).toInt()); #endif ui.commandsInDockCheck->setChecked(settings.value("CommandsInDock", false).toBool()); if (settings.value("BuildAutomatically", true).toBool()) ui.buildAutomaticallyRadio->setChecked(true); else ui.buildManuallyRadio->setChecked(true); ui.tikzDocEdit->setText(TikzDocumentationController::tikzDocumentationPath()); ui.latexEdit->setText(settings.value("LatexCommand", "pdflatex").toString()); ui.pdftopsEdit->setText(settings.value("PdftopsCommand", "pdftops").toString()); ui.editorEdit->setText(settings.value("TemplateEditor", KTIKZ_TEMPLATE_EDITOR_DEFAULT).toString()); ui.replaceEdit->setText(settings.value("TemplateReplaceText", "<>").toString()); settings.endGroup(); #ifndef KTIKZ_USE_KDE settings.beginGroup("MainWindow"); ui.toolBarStyleComboBox->setCurrentIndex(settings.value("ToolBarStyle", 0).toInt()); settings.endGroup(); #endif } void ConfigGeneralWidget::writeSettings(const QString &settingsGroup) { QSettings settings(ORGNAME, APPNAME); settings.beginGroup(settingsGroup); #ifndef KTIKZ_USE_KDE settings.setValue("RecentFilesNumber", ui.historyLengthSpinBox->value()); #endif settings.setValue("CommandsInDock", ui.commandsInDockCheck->isChecked()); settings.setValue("BuildAutomatically", ui.buildAutomaticallyRadio->isChecked()); TikzDocumentationController::storeTikzDocumentationPath(ui.tikzDocEdit->text()); settings.setValue("LatexCommand", ui.latexEdit->text()); settings.setValue("PdftopsCommand", ui.pdftopsEdit->text()); settings.setValue("TemplateEditor", ui.editorEdit->text()); settings.setValue("TemplateReplaceText", ui.replaceEdit->text()); settings.endGroup(); #ifndef KTIKZ_USE_KDE settings.beginGroup("MainWindow"); settings.setValue("ToolBarStyle", ui.toolBarStyleComboBox->currentIndex()); settings.endGroup(); #endif } void ConfigGeneralWidget::searchTikzDocumentation() { const QString tikzDocFile = TikzDocumentationController::searchTikzDocumentationInTexTree(); if (tikzDocFile.isEmpty()) QMessageBox::warning(this, KtikzApplication::applicationName(), tr("Cannot find TikZ documentation.")); else ui.tikzDocEdit->setText(tikzDocFile); } void ConfigGeneralWidget::browseCommand(QLineEdit *lineEdit, bool isProgram) { QString location; if (isProgram) { location = QFileDialog::getOpenFileName(this, tr("Browse program"), QDir::rootPath(), QString("%1 (*)").arg(tr("Program")), 0, QFileDialog::DontResolveSymlinks); } else { const QString oldLocation = lineEdit->text(); location = QFileDialog::getOpenFileName(this, tr("Browse file"), (!oldLocation.isEmpty()) ? oldLocation : QDir::homePath(), QString("%1 (*.*)").arg(tr("All files"))); } if (!location.isEmpty()) { location.replace('\\', '/'); lineEdit->setText(location); } } void ConfigGeneralWidget::browseCommand() { QToolButton *button = qobject_cast(sender()); if (button->objectName() == QLatin1String("latexButton")) browseCommand(ui.latexEdit); else if (button->objectName() == QLatin1String("pdftopsButton")) browseCommand(ui.pdftopsEdit); else if (button->objectName() == QLatin1String("editorButton")) browseCommand(ui.editorEdit); else if (button->objectName() == QLatin1String("tikzDocButton")) browseCommand(ui.tikzDocEdit, false); } ktikz/app/tikzcommandwidget.cpp0000660000175000017500000000272311455414611021364 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "tikzcommandwidget.h" TikzCommandWidget::TikzCommandWidget(QWidget *parent) : QWidget(parent) { } QSize TikzCommandWidget::sizeHint() const { return QSize(100, 200); } ktikz/app/editgotolinewidget.cpp0000660000175000017500000000447211455414611021535 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "editgotolinewidget.h" #include #include "../common/utils/icon.h" GoToLineWidget::GoToLineWidget(QWidget *parent) : QWidget(parent) { ui.setupUi(this); ui.spinBoxGo->setMinimum(1); ui.pushButtonClose->setIcon(Icon("window-close")); setFocusProxy(ui.spinBoxGo); connect(ui.pushButtonGo, SIGNAL(clicked()), this, SLOT(goToLine())); connect(ui.pushButtonClose, SIGNAL(clicked()), this, SLOT(hide())); } GoToLineWidget::~GoToLineWidget() { } void GoToLineWidget::goToLine() { emit goToLine(ui.spinBoxGo->value() - 1); } void GoToLineWidget::setMaximumValue(int maximumValue) { ui.spinBoxGo->setMaximum(maximumValue); } void GoToLineWidget::setValue(int value) { ui.spinBoxGo->setValue(value); ui.spinBoxGo->setFocus(); ui.spinBoxGo->selectAll(); } void GoToLineWidget::hide() { setVisible(false); emit focusEditor(); } void GoToLineWidget::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Escape) hide(); else if (event->key() == Qt::Key_Return) goToLine(); QWidget::keyPressEvent(event); } ktikz/app/editreplacewidget.h0000660000175000017500000000413011455414611020764 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef REPLACEWIDGET_H #define REPLACEWIDGET_H #include "ui_editreplacewidget.h" class ReplaceWidget : public QWidget { Q_OBJECT public: ReplaceWidget(QWidget *parent = 0); ~ReplaceWidget(); void setForward(bool forward); void setText(const QString &text); public slots: void doFind(); signals: void focusEditor(); void search(const QString &text, bool isCaseSensitive, bool findWholeWords, bool forward); void replace(const QString &text, const QString &replacement, bool isCaseSensitive, bool findWholeWords, bool forward); protected: virtual void showEvent(QShowEvent *event); virtual void keyPressEvent(QKeyEvent *event); protected slots: void hide(); private: void doFind(bool forward); Ui::ReplaceWidget ui; private slots: void setBackward(); void setForward(); void doReplace(); }; #endif ktikz/app/configappearancewidget.h0000660000175000017500000000530511455414611021775 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008, 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_CONFIGAPPEARANCEWIDGET_H #define KTIKZ_CONFIGAPPEARANCEWIDGET_H #include #include "ui_configappearancewidget.h" class QTableWidgetItem; class QTextCharFormat; class ConfigAppearanceWidget : public QWidget { Q_OBJECT public: ConfigAppearanceWidget(QWidget *parent = 0); void readSettings(const QString &settingsGroup); void writeSettings(const QString &settingsGroup); void addItem(const QString &titleName); void addItemFont(const QString &fontName); void addItemColor(const QString &colorName); void addItems(const QStringList &titleNames); void setItemFonts(const QStringList &fontNames); void setItemColors(const QStringList &colorNames); void setCustomizationType(bool custom); QStringList getItemFonts(); QStringList getItemColors(); bool getCustomizationType(); void setTypeNames(const QStringList &typeNames); void setDefaultTextCharFormats(const QMap &defaultFormatList); protected: Ui::ConfigAppearanceWidget ui; private slots: void setItemHighlighted(QTableWidgetItem *item); void toggleCustom(); void showFontDialog(); void showColorDialog(); private: void showEvent(QShowEvent*); void setHighlightedForeground(const QString &colorName); void setItemToolTip(QTableWidgetItem *item, const QFont &font); int m_itemHighlighted; int m_itemMargin; bool m_custom; QStringList m_itemFonts; QStringList m_itemColors; QStringList m_typeNames; }; #endif ktikz/app/tikzeditor.h0000660000175000017500000000610211455414611017470 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef TIKZEDITOR_H #define TIKZEDITOR_H #include class QCompleter; class QLabel; class QString; class TikzEditor : public QPlainTextEdit { Q_OBJECT Q_PROPERTY(int numOfLines READ numOfLines) public: TikzEditor(QWidget *parent = 0); ~TikzEditor(); void setShowWhiteSpaces(bool show); void setShowTabulators(bool show); void setShowMatchingBrackets(bool show); void setWhiteSpacesColor(const QColor &color); void setTabulatorsColor(const QColor &color); void setMatchingColor(const QColor &color); void goToLine(int line); int numOfLines() const; void setCompleter(QCompleter *completer); public slots: void showCursorPosition(); signals: void cursorPositionChanged(int row, int col); void showStatusMessage(const QString &message, int timeout = 3000); void focusIn(); void focusOut(); protected: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); void focusInEvent(QFocusEvent *event); void focusOutEvent(QFocusEvent *event); private: void showMatchingBrackets(); uint spaceWidth() const; void paintTabstop(QPainter &painter, qreal x, qreal y); void paintSpace(QPainter &painter, qreal x, qreal y); void printWhiteSpaces(QPainter &painter); QString textUnderCursor() const; int getCursorPosition(int row, int col) const; void setCursorPosition(int row, int col); QColor m_highlightCurrentLineColor; QRect m_previousHighlightedLine; int m_oldVerticalScrollBarValue; QString m_plainText; QColor m_whiteSpacesColor; QColor m_tabulatorsColor; QColor m_matchingColor; long m_matchingBegin, m_matchingEnd; bool m_showWhiteSpaces; bool m_showTabulators; bool m_showMatchingBrackets; QCompleter *m_completer; private slots: void highlightCurrentLine(); void matchBrackets(); void insertCompletion(const QString &completion); }; #endif ktikz/app/editindentdialog.cpp0000660000175000017500000000372611455414611021153 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "editindentdialog.h" IndentDialog::IndentDialog(QWidget *parent, const QString &name) : QDialog(parent) { ui.setupUi(this); setModal(true); setWindowTitle(name); QButtonGroup *buttonGroup = new QButtonGroup(this); buttonGroup->addButton(ui.radioButtonSpaces); buttonGroup->addButton(ui.radioButtonTabs); buttonGroup->setExclusive(true); ui.radioButtonTabs->setFocus(); } IndentDialog::~IndentDialog() { } int IndentDialog::numOfInserts() const { if (ui.radioButtonSpaces->isChecked()) return ui.spinBoxSpaces->value(); return ui.spinBoxTabs->value(); } QChar IndentDialog::insertChar() const { if (ui.radioButtonSpaces->isChecked()) return ' '; return '\t'; } ktikz/app/tikzcommandinserter.h0000660000175000017500000000655011455414611021403 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef TIKZCOMMANDINSERTER_H #define TIKZCOMMANDINSERTER_H #include #include class QDockWidget; class QDomElement; class QListWidget; class QListWidgetItem; class QMenu; class QPlainTextEdit; class QTextCharFormat; class HighlightingRule; struct TikzCommand { QString name; QString description; QString command; int dx; int dy; int type; int number; }; struct TikzCommandList { QString title; QList commands; QList children; }; class TikzCommandInserter : public QObject { Q_OBJECT public: TikzCommandInserter(QWidget *parent = 0); QStringList getCommandWords(); QMenu *getMenu(); QDockWidget *getDockWidget(QWidget *parent = 0); void setEditor(QPlainTextEdit *textEdit); QMap getDefaultHighlightFormats(); QStringList getTranslatedHighlightTypeNames(); QStringList getHighlightTypeNames(); QVector getHighlightingRules(); void insertTag(const QString &tag, int dx = 0, int dy = 0); signals: /*! * This signal is emitted whenever a message should be shown in * the statusbar. * \param message the message to be shown in the status bar * \param timeout the duration in milli-seconds (if non-zero) during which the message must be shown */ void showStatusMessage(const QString &message, int timeout = 0); private: void getCommands(); TikzCommandList getCommands(const QDomElement &element); QMenu *getMenu(const TikzCommandList &commandList); void addListWidgetItems(QListWidget *listWidget, const TikzCommandList &commandList, bool addChildren = true); TikzCommand newCommand(const QString &name, const QString &command, int dx, int dy, int type = 0); TikzCommand newCommand(const QString &name, const QString &description, const QString &command, int dx, int dy, int type = 0); QPlainTextEdit *m_mainEdit; QWidget *m_parentWidget; TikzCommandList m_tikzSections; QList m_tikzCommandsList; QStringList highlightTypeNames; private slots: void setListStatusTip(QListWidgetItem *item); void insertTag(); void insertTag(QListWidgetItem *item); }; #endif ktikz/app/tikzeditorhighlighter.h0000660000175000017500000000530111455414611021707 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * * * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef TIKZEDITORHIGHLIGHTER_H #define TIKZEDITORHIGHLIGHTER_H #include class TikzCommandInserter; struct HighlightingRule { QString type; /// The name of the formatting type QRegExp pattern; /// The pattern to match for formatting }; /** A simple highlighter for the TikZ graphics programming language * @author Florian Hackenberger */ class TikzHighlighter : public QSyntaxHighlighter { Q_OBJECT public: explicit TikzHighlighter(TikzCommandInserter *commandInserter = 0, QTextDocument *parent = 0); virtual ~TikzHighlighter(); QMap getDefaultHighlightFormats(); QStringList getTranslatedHighlightTypeNames(); QStringList getHighlightTypeNames(); QMap getTextCharFormats(); void setTextCharFormats(const QMap &formatList); protected: /** Implements QSyntaxHighlighter::highlightBlock() * @see QSyntaxHighlighter::highlightBlock() */ void highlightBlock(const QString &text); private: /// All highlighting rules with their formatting for easy iteration QVector m_highlightingRules; TikzCommandInserter *m_commandInserter; QMap m_formatList; QStringList m_highlightTypeNames; }; #endif ktikz/app/tikzcommands.xml0000660000175000017500000011056511455414611020365 0ustar fhackenbergerfhackenberger
ktikz/app/editindentdialog.ui0000660000175000017500000001157511455414611021007 0ustar fhackenbergerfhackenberger IndentDialog Indent Selection Using &spaces Qt::Horizontal QSizePolicy::Fixed 20 20 &Number of spaces: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter spinBoxSpaces false 0 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 2 Using &tabs true Num&ber of tabs: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter spinBoxTabs 0 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() IndentDialog accept() 257 101 157 274 buttonBox rejected() IndentDialog reject() 325 101 286 274 radioButtonSpaces toggled(bool) spinBoxSpaces setEnabled(bool) 64 33 389 34 radioButtonTabs toggled(bool) spinBoxTabs setEnabled(bool) 64 64 389 65 ktikz/app/editreplacewidget.ui0000660000175000017500000001036511455414611021161 0ustar fhackenbergerfhackenberger ReplaceWidget Find and Replace Close find and replace box :/icons/window-close.png:/icons/window-close.png Find: 0 0 true &Whole words &Case sensitive Replace with: 0 0 true Search backward :/icons/go-up.png:/icons/go-up.png true Search forward :/icons/go-down.png:/icons/go-down.png true true &Find &Replace pushButtonClose comboBoxFind comboBoxReplace checkBoxWholeWords checkBoxCaseSensitive pushButtonBackward pushButtonForward pushButtonFind pushButtonReplace ktikz/app/configappearancewidget.cpp0000660000175000017500000002343711455414611022336 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008, 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "configappearancewidget.h" #include #include #include #include #include "../common/utils/colordialog.h" #include "../common/utils/fontdialog.h" ConfigAppearanceWidget::ConfigAppearanceWidget(QWidget *parent) : QWidget(parent) { m_itemMargin = 10; ui.setupUi(this); QButtonGroup *buttonGroup = new QButtonGroup(this); buttonGroup->addButton(ui.standardAppearanceCheck); buttonGroup->addButton(ui.customAppearanceCheck); buttonGroup->setExclusive(true); connect(buttonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(toggleCustom())); QPalette palette = ui.itemTable->palette(); QColor highlightBackgroundColor(QApplication::style()->standardPalette().color(QPalette::Normal, QPalette::AlternateBase)); if (highlightBackgroundColor == QApplication::style()->standardPalette().color(QPalette::Normal, QPalette::Base)) highlightBackgroundColor = highlightBackgroundColor.darker(110); palette.setColor(QPalette::Normal, QPalette::Highlight, highlightBackgroundColor); palette.setColor(QPalette::Normal, QPalette::HighlightedText, QPalette::Text); palette.setColor(QPalette::Inactive, QPalette::Highlight, highlightBackgroundColor); palette.setColor(QPalette::Inactive, QPalette::HighlightedText, QPalette::Text); palette.setColor(QPalette::Disabled, QPalette::Highlight, highlightBackgroundColor); ui.itemTable->setPalette(palette); m_itemHighlighted = -1; connect(ui.itemTable, SIGNAL(currentItemChanged(QTableWidgetItem*,QTableWidgetItem*)), this, SLOT(setItemHighlighted(QTableWidgetItem*))); connect(ui.fontButton, SIGNAL(clicked()), this, SLOT(showFontDialog())); connect(ui.colorButton, SIGNAL(clicked()), this, SLOT(showColorDialog())); } void ConfigAppearanceWidget::readSettings(const QString &settingsGroup) { int num; QSettings settings(ORGNAME, APPNAME); settings.beginGroup(settingsGroup); m_custom = settings.value("Customize", true).toBool(); const int numOfRules = settings.value("Number", 0).toInt(); for (int i = 0; i < numOfRules; ++i) { num = m_typeNames.indexOf(settings.value("Item" + QString::number(i) + "/Name").toString()); if (num >= 0) { m_itemColors[num] = settings.value("Item" + QString::number(i) + "/Color").toString(); m_itemFonts[num] = settings.value("Item" + QString::number(i) + "/Font").toString(); } } settings.endGroup(); setCustomizationType(m_custom); setItemFonts(m_itemFonts); setItemColors(m_itemColors); } void ConfigAppearanceWidget::writeSettings(const QString &settingsGroup) { m_custom = getCustomizationType(); QSettings settings(ORGNAME, APPNAME); settings.beginGroup(settingsGroup); settings.setValue("Customize", m_custom); if (m_custom) { for (int i = 0; i < m_typeNames.size(); ++i) { settings.setValue("Item" + QString::number(i) + "/Name", m_typeNames.at(i)); settings.setValue("Item" + QString::number(i) + "/Color", m_itemColors.at(i)); settings.setValue("Item" + QString::number(i) + "/Font", m_itemFonts.at(i)); } settings.setValue("Number", m_typeNames.size()); } settings.endGroup(); } void ConfigAppearanceWidget::setItemHighlighted(QTableWidgetItem *item) { m_itemHighlighted = ui.itemTable->row(item); setHighlightedForeground(m_itemColors.at(m_itemHighlighted)); ui.fontButton->setEnabled(true); ui.colorButton->setEnabled(true); } void ConfigAppearanceWidget::setItemToolTip(QTableWidgetItem *item, const QFont &font) { const QFontMetrics metrics(font); ui.itemTable->setRowHeight(m_itemHighlighted, metrics.height() + m_itemMargin); if (metrics.width(item->text()) >= ui.itemTable->contentsRect().width() - 30) item->setToolTip(item->text()); else item->setToolTip(""); } void ConfigAppearanceWidget::showEvent(QShowEvent*) { for (int i = 0; i < ui.itemTable->rowCount(); ++i) { QFont font; font.fromString(m_itemFonts.at(i)); setItemToolTip(ui.itemTable->item(i, 0), font); } if (m_itemHighlighted < 0) return; setHighlightedForeground(m_itemColors.at(m_itemHighlighted)); } void ConfigAppearanceWidget::addItem(const QString &titleName) { const int itemTableRowNum = ui.itemTable->rowCount(); ui.itemTable->setRowCount(itemTableRowNum + 1); QTableWidgetItem *item = new QTableWidgetItem; item->setText(titleName); item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); ui.itemTable->setItem(itemTableRowNum, 0, item); } void ConfigAppearanceWidget::addItemFont(const QString &fontName) { const int rowNum = m_itemFonts.size(); m_itemFonts.append(fontName); QFont font; font.fromString(fontName); ui.itemTable->item(rowNum, 0)->setFont(font); ui.itemTable->setRowHeight(rowNum, QFontMetrics(font).height() + m_itemMargin); } void ConfigAppearanceWidget::addItemColor(const QString &colorName) { const int rowNum = m_itemFonts.size(); m_itemColors.append(colorName); ui.itemTable->item(rowNum, 0)->setForeground(QColor(colorName)); toggleCustom(); } void ConfigAppearanceWidget::addItems(const QStringList &titleNames) { for (int i = 0; i < titleNames.size(); ++i) addItem(titleNames.at(i)); } void ConfigAppearanceWidget::setItemFonts(const QStringList &fontNames) { m_itemFonts = fontNames; for (int i = 0; i < m_itemFonts.size(); ++i) { QFont font; font.fromString(m_itemFonts.at(i)); ui.itemTable->item(i, 0)->setFont(font); ui.itemTable->setRowHeight(i, QFontMetrics(font).height() + m_itemMargin); } } void ConfigAppearanceWidget::setItemColors(const QStringList &colorNames) { m_itemColors = colorNames; for (int i = 0; i < m_itemColors.size(); ++i) ui.itemTable->item(i, 0)->setForeground(QColor(m_itemColors.at(i))); toggleCustom(); } QStringList ConfigAppearanceWidget::getItemFonts() { return m_itemFonts; } QStringList ConfigAppearanceWidget::getItemColors() { return m_itemColors; } void ConfigAppearanceWidget::setCustomizationType(bool custom) { if (custom) ui.customAppearanceCheck->setChecked(true); else ui.standardAppearanceCheck->setChecked(true); toggleCustom(); } bool ConfigAppearanceWidget::getCustomizationType() { return !ui.standardAppearanceCheck->isChecked(); } void ConfigAppearanceWidget::toggleCustom() { if (ui.customAppearanceCheck->isChecked()) { ui.appearanceGroupBox->setEnabled(true); for (int i = 0; i < m_itemColors.size(); ++i) ui.itemTable->item(i, 0)->setForeground(QColor(m_itemColors.at(i))); } else { ui.appearanceGroupBox->setEnabled(false); for (int i = 0; i < m_itemColors.size(); ++i) ui.itemTable->item(i, 0)->setForeground(QApplication::style()->standardPalette().color(QPalette::Disabled, QPalette::Text)); } } void ConfigAppearanceWidget::setTypeNames(const QStringList &typeNames) { m_typeNames = typeNames; } void ConfigAppearanceWidget::setDefaultTextCharFormats(const QMap &defaultFormatList) { for (int i = 0; i < defaultFormatList.size(); ++i) { m_itemColors << ""; m_itemFonts << ""; } QMap::const_iterator it = defaultFormatList.constBegin(); int num; while (it != defaultFormatList.constEnd()) { num = m_typeNames.indexOf(it.key()); if (num < 0) continue; m_itemColors[num] = it.value().foreground().color().name(); m_itemFonts[num] = it.value().font().toString(); ++it; } } void ConfigAppearanceWidget::showFontDialog() { if (m_itemHighlighted < 0) return; bool ok; QFont currentFont; currentFont.fromString(m_itemFonts.at(m_itemHighlighted)); const QFont newFont = FontDialog::getFont(&ok, currentFont, this); if (ok) { QTableWidgetItem *item = ui.itemTable->item(m_itemHighlighted, 0); m_itemFonts.replace(m_itemHighlighted, newFont.toString()); item->setFont(newFont); setItemToolTip(item, newFont); } } void ConfigAppearanceWidget::showColorDialog() { if (m_itemHighlighted < 0) return; bool ok; const QColor currentColor(m_itemColors.at(m_itemHighlighted)); const QColor newColor = ColorDialog::getColor(&ok, currentColor, this); if (ok) { m_itemColors.replace(m_itemHighlighted, newColor.name()); ui.itemTable->item(m_itemHighlighted, 0)->setForeground(newColor); setHighlightedForeground(m_itemColors.at(m_itemHighlighted)); } } void ConfigAppearanceWidget::setHighlightedForeground(const QString &colorName) { QPalette palette = ui.itemTable->palette(); const QColor color(colorName); palette.setColor(QPalette::Normal, QPalette::HighlightedText, color); palette.setColor(QPalette::Inactive, QPalette::HighlightedText, color); palette.setColor(QPalette::Disabled, QPalette::HighlightedText, QApplication::style()->standardPalette().color(QPalette::Disabled, QPalette::Text)); ui.itemTable->setPalette(palette); } ktikz/app/configdialog.cpp0000660000175000017500000002023011455414611020256 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008, 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "configdialog.h" #ifndef KTIKZ_USE_KDE #include #include #include #include //#include #include #endif #include #include #include "configgeneralwidget.h" #include "configeditorwidget.h" #include "configappearancewidget.h" #include "ktikzapplication.h" #include "../common/utils/icon.h" #ifdef KTIKZ_USE_KDE ConfigDialog::ConfigDialog(QWidget *parent) : KPageDialog(parent) { setFaceType(List); setCaption(tr("Configure %1").arg(KtikzApplication::applicationName())); setButtons(KDialog::Ok | KDialog::Cancel | KDialog::Apply | KDialog::Help); setHelp("chap-configuration"); addPage(generalPage(), tr("&General"), "preferences-desktop-theme"); addPage(editorPage(), tr("&Editor"), "accessories-text-editor"); addPage(appearancePage(), tr("&Highlighting"), "preferences-desktop-color"); connect(this, SIGNAL(applyClicked()), this, SLOT(accept())); connect(this, SIGNAL(okClicked()), this, SLOT(accept())); } #else ConfigDialog::ConfigDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Configure %1").arg(KtikzApplication::applicationName())); addPage(generalPage(), tr("&General"), "preferences-desktop-theme"); addPage(editorPage(), tr("&Editor"), "accessories-text-editor"); addPage(appearancePage(), tr("&Highlighting"), "preferences-desktop-color"); QDialogButtonBox *buttonBox = new QDialogButtonBox; QAction *whatsThisAction = QWhatsThis::createAction(this); whatsThisAction->setIcon(Icon("help-contextual")); QToolButton *whatsThisButton = new QToolButton(this); whatsThisButton->setDefaultAction(whatsThisAction); whatsThisButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored); buttonBox->addButton(whatsThisButton, QDialogButtonBox::HelpRole); buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(centerWidget()); mainLayout->addWidget(buttonBox); setLayout(mainLayout); } QWidget *ConfigDialog::centerWidget() { /* m_pagesTabWidget = new QTabWidget; for (int i = 0; i < m_pageWidgets.size(); ++i) m_pagesTabWidget->addTab(m_pageWidgets.at(i), m_pageTitles.at(i)); return m_pagesTabWidget; */ // create list QListWidget *pagesListWidget = new QListWidget; pagesListWidget->setViewMode(QListView::IconMode); pagesListWidget->setMovement(QListView::Static); pagesListWidget->setFlow(QListView::TopToBottom); pagesListWidget->setWordWrap(true); pagesListWidget->setUniformItemSizes(true); pagesListWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); // add items to list QFontMetrics fm(qApp->font()); int iconWidth = 0; for (int i = 0; i < m_pagesListWidgetItems.size(); ++i) iconWidth = qMax(iconWidth, fm.boundingRect(0, 0, 0, 0, Qt::AlignCenter, m_pagesListWidgetItems.at(i)->text()).width()); iconWidth += 20; const int iconHeight = fm.height() + 42; for (int i = 0; i < m_pagesListWidgetItems.size(); ++i) { m_pagesListWidgetItems.at(i)->setSizeHint(QSize(iconWidth, iconHeight)); pagesListWidget->addItem(m_pagesListWidgetItems.at(i)); } pagesListWidget->setFixedWidth(m_pagesListWidgetItems.at(0)->sizeHint().width() + 6); // create title QFrame *titleFrame = new QFrame(this); // titleFrame->setAutoFillBackground(true); // titleFrame->setFrameShape(QFrame::StyledPanel); titleFrame->setFrameShape(QFrame::Box); // titleFrame->setFrameShadow(QFrame::Plain); // titleFrame->setBackgroundRole(QPalette::Base); m_pagesTitleLabel = new QLabel(titleFrame); m_pagesTitleLabel->setStyleSheet("QLabel { font-weight: bold; }"); QGridLayout *titleLayout = new QGridLayout(titleFrame); titleLayout->setColumnStretch(0, 1); titleLayout->setMargin(6); titleLayout->addWidget(m_pagesTitleLabel); // add pages QStackedWidget *pagesStackedWidget = new QStackedWidget; for (int i = 0; i < m_pageWidgets.size(); ++i) pagesStackedWidget->addWidget(m_pageWidgets.at(i)); connect(pagesListWidget, SIGNAL(currentRowChanged(int)), pagesStackedWidget, SLOT(setCurrentIndex(int))); connect(pagesListWidget, SIGNAL(currentRowChanged(int)), this, SLOT(setCurrentPage(int))); pagesListWidget->setCurrentRow(0); QWidget *mainWidget = new QWidget; QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(pagesListWidget, 0, 0, 2, 1); mainLayout->addWidget(titleFrame, 0, 1); mainLayout->addWidget(pagesStackedWidget, 1, 1); mainWidget->setLayout(mainLayout); return mainWidget; } #endif void ConfigDialog::addPage(QWidget *widget, const QString &title, const QString &iconName) { /* Q_UNUSED(iconName); m_pageTitles << title; m_pageWidgets << widget; */ QString title2 = title; title2.remove('&'); #ifdef KTIKZ_USE_KDE KPageWidgetItem *page = new KPageWidgetItem(widget, title2); page->setHeader(title2); page->setIcon(KIcon(iconName)); KPageDialog::addPage(page); #else QListWidgetItem *item = new QListWidgetItem(Icon(iconName), title2); item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); m_pagesListWidgetItems << item; m_pageWidgets << widget; #endif } #ifndef KTIKZ_USE_KDE void ConfigDialog::setCurrentPage(int page) { m_pagesTitleLabel->setText(m_pagesListWidgetItems.at(page)->text()); } #endif QWidget *ConfigDialog::generalPage() { m_configGeneralWidget = new ConfigGeneralWidget(this); return m_configGeneralWidget; } QWidget *ConfigDialog::editorPage() { m_configEditorWidget = new ConfigEditorWidget(this); return m_configEditorWidget; } QWidget *ConfigDialog::appearancePage() { m_configAppearanceWidget = new ConfigAppearanceWidget(this); return m_configAppearanceWidget; } void ConfigDialog::readSettings() { m_configGeneralWidget->readSettings(""); m_configEditorWidget->readSettings("Editor"); m_configAppearanceWidget->readSettings("Highlighting"); } void ConfigDialog::writeSettings() { m_configGeneralWidget->writeSettings(""); m_configEditorWidget->writeSettings("Editor"); m_configAppearanceWidget->writeSettings("Highlighting"); } void ConfigDialog::setTranslatedHighlightTypeNames(const QStringList &typeNames) { for (int i = 0; i < typeNames.size(); ++i) m_configAppearanceWidget->addItem(typeNames.at(i)); } void ConfigDialog::setHighlightTypeNames(const QStringList &typeNames) { m_configAppearanceWidget->setTypeNames(typeNames); } void ConfigDialog::setDefaultHighlightFormats(const QMap &defaultFormatList) { m_configAppearanceWidget->setDefaultTextCharFormats(defaultFormatList); } void ConfigDialog::accept() { writeSettings(); emit settingsChanged(); QDialog::accept(); } void ConfigDialog::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_F1 && event->modifiers() == Qt::ShiftModifier) { QWhatsThis::enterWhatsThisMode(); } QDialog::keyPressEvent(event); } ktikz/app/main.cpp0000660000175000017500000001230011455414611016554 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * * * Copyright (C) 2007, 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifdef KTIKZ_USE_KDE #include #include #include #endif #include #include #include #include #include #include // needed for abort() below #include "ktikzapplication.h" void debugOutput(QtMsgType type, const char *msg) { // qDebug() and qWarning() only show messages when in debug mode switch (type) { case QtDebugMsg: case QtWarningMsg: #ifndef QT_NO_DEBUG fprintf(stderr, "%s\n", msg); #endif break; case QtCriticalMsg: fprintf(stderr, "%s\n", msg); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s\n", msg); abort(); } } bool findTranslator(QTranslator *translator, const QString &transName, const QString &transDir) { const QString qmFile = transName + ".qm"; const QFileInfo fi(QDir(transDir), qmFile); if (fi.exists()) return translator->load(qmFile, transDir); return false; } QTranslator *createTranslator(const QString &transName, const QString &transDir) { #ifdef KTIKZ_USE_KDE const QString locale = KGlobal::locale()->language(); #else const QString locale = QString(QLocale::system().name()); #endif const QString localeShort = locale.left(2).toLower(); bool foundTranslator = false; QTranslator *translator = new QTranslator(0); // find in transDir if (!foundTranslator) foundTranslator = findTranslator(translator, transName + '_' + locale, transDir); if (!foundTranslator) foundTranslator = findTranslator(translator, transName + '_' + localeShort, transDir); // find in dir which was set during compilation #ifdef KTIKZ_TRANSLATIONS_INSTALL_DIR const QDir qmPath(KTIKZ_TRANSLATIONS_INSTALL_DIR); if (!foundTranslator) foundTranslator = findTranslator(translator, transName + '_' + locale, qmPath.absolutePath()); if (!foundTranslator) foundTranslator = findTranslator(translator, transName + '_' + localeShort, qmPath.absolutePath()); #endif // KTIKZ_TRANSLATIONS_INSTALL_DIR // find in working dir if (!foundTranslator) foundTranslator = findTranslator(translator, transName + '_' + locale, ""); if (!foundTranslator) foundTranslator = findTranslator(translator, transName + '_' + localeShort, ""); return translator; } int main(int argc, char **argv) { qInstallMsgHandler(debugOutput); #ifdef KTIKZ_USE_KDE Q_INIT_RESOURCE(ktikz); KAboutData aboutData("ktikz", "ktikz", ki18n("KTikZ"), APPVERSION); aboutData.setShortDescription(ki18n("A TikZ Editor")); aboutData.setLicense(KAboutData::License_GPL_V2); aboutData.setCopyrightStatement(ki18n("Copyright 2007-2010 Florian Hackenberger, Glad Deschrijver")); aboutData.setOtherText(ki18n("This is a program for creating TikZ (from the LaTeX pgf package) diagrams.")); aboutData.setBugAddress("florian@hackenberger.at"); aboutData.addAuthor(ki18n("Florian Hackenberger"), ki18n("Maintainer"), "florian@hackenberger.at"); aboutData.addAuthor(ki18n("Glad Deschrijver"), ki18n("Developer"), "glad.deschrijver@gmail.com"); KCmdLineArgs::init(argc, argv, &aboutData); KCmdLineOptions options; options.add("+[URL]", ki18n("TikZ document to open")); KCmdLineArgs::addCmdLineOptions(options); #else Q_INIT_RESOURCE(qtikz); #endif KtikzApplication app(argc, argv); QCoreApplication::setOrganizationName(ORGNAME); #ifndef KTIKZ_USE_KDE QCoreApplication::setApplicationName(APPNAME); QCoreApplication::setApplicationVersion(APPVERSION); #endif const QString translationsDirPath = qgetenv("KTIKZ_TRANSLATIONS_DIR"); QTranslator *qtTranslator = createTranslator("qt", QLibraryInfo::location(QLibraryInfo::TranslationsPath)); QTranslator *qtikzTranslator = createTranslator("qtikz", translationsDirPath); app.installTranslator(qtTranslator); app.installTranslator(qtikzTranslator); app.init(); int success = app.exec(); delete qtTranslator; delete qtikzTranslator; return success; } ktikz/app/qtikz_fr.ts0000660000175000017500000041310011455414611017330 0ustar fhackenbergerfhackenberger AboutDialog Copyright 2007-2010 Florian Hackenberger and Glad Deschrijver Copyright 2007-2010 Florian Hackenberger et Glad Deschrijver This is a program for creating TikZ (from the LaTeX pgf package) diagrams. Ceci est un programme pour créer des diagrammes TikZ (du paquet LaTeX pgf). <p>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.</p><p>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.</p> <p>Ce programme est un logiciel libre; vous pouvez le redistribuer et le modifier conformément à la licence « GNU General Public License » telle que publiée à la « Free Software Foundation »; soit la deuxième version, soit selon votre convenance n'importe quelle version ultérieure à cette dernière.</p><p>Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS GARANTIE AUCUNE; même avec le concept implicite de VALEUR MARCHANDE. Référez-vous pour plus de détails à la « GNU General Public License ».</p> About %1 À propos de %1 ConfigAppearanceWidget &Standard Par &défaut <p>When this option is checked, the default fonts and colors are used in the output.</p> <p>Lorsque cette option est cochée, les polices et les couleurs définies par défaut seront utilisées.</p> Highlighting Coloration syntaxique &Custom &Personnaliser Change &font... Changer p&olice... Change c&olor... Changer &couleur... <p>When this option is checked, the fonts and colors defined below will be used in the output instead of the default ones.</p> <p>Lorsque cette option est cochée, les polices et les couleurs indiquées ci-dessous seront utilisées au lieu de celles définies par défaut.</p> Change st&yle for: Changer le st&yle pour : <p>Select the structure appearing in the TikZ code for which you want to change the fonts and colors.</p> <p>Sélectionnez la structure apparaissant dans le code TikZ pour laquelle vous voulez changer les polices et les couleurs indiquées.</p> <p>Select the font in which the structure that you selected in the box above should be displayed.</p> <p>Sélectionnez la police pour la structure indiquée ci-dessus.</p> <p>Select the text color in which the structure that you selected in the box above should be displayed.</p> <p>Sélectionnez la couleur pour la structure indiquée ci-dessus.</p> ConfigDialog Configure %1 Configuration de %1 &General &Général &Editor É&diteur &Highlighting Coloration &syntaxique ConfigEditorWidget Configure Editor Configuration éditeur Editor Éditeur <p>Select the font of the main text.</p> <p>Sélectionnez la police du texte principal.</p> Text &font: &Police texte : Choose... Choisir... <p>Show white spaces in the text by replacing them with special symbols. These symbols will not be saved on disk.</p> <p>Montrer les caractères blancs (espaces) dans le texte en les remplaçant par des symboles spéciaux. Ces symboles ne seront pas enregistrés sur disque.</p> Show &white spaces Montrer &espaces <p>Select the color in which the spaces will be shown.</p> <p>Sélectionnez la couleur dans laquelle les espaces seront montrées.</p> &Use color: Co&uleur : <p>Show tabulators in the text by replacing them with special symbols. These symbols will not be saved on disk.</p> <p>Montrer les caractères blancs (tabulateurs) dans le texte en les remplaçant par des symboles spéciaux. Ces symboles ne seront pas enregistrés sur disque.</p> Show &tabulators Montrer &tabulateurs <p>Select the color in which the tabulators will be shown.</p> <p>Sélectionnez la couleur dans laquelle les tabulateurs seront montrés.</p> U&se color: Cou&leur : <p>If the cursor is on a bracket ({[]}), then the corresponding opening/closing bracket will be highlighted.</p> <p>Lorsque le curseur est sur une parenthèse ({[]}), la parenthèse ouvrante/fermante qui correspond sera illuminée.</p> Show matching &brackets Montrer pa&renthèses correspondantes <p>Select the color in which the highlighted brackets will be shown.</p> <p>Sélectionnez la couleur dans laquelle les parenthèses illuminées seront montrées.</p> Use c&olor: Couleu&r : <p>When the first letters of a TikZ command are typed in the text, a list of possible completions will be shown.</p> <p>Lorsque vous tapez les premiers caractères d'une commande TikZ dans le texte, une liste des complètements possibles est montrée.</p> Use command &completion Utiliser &complètement des commandes ConfigGeneralWidget Cannot find TikZ documentation. Documentation TikZ introuvable. Browse program Feuilleter programme Program Programme Browse file Feuilleter fichier All files Tous les fichiers General Général Interface Interface <p>Select the maximum number of entries that appear in the "Open Recent" menu. When the number of recently opened files exceeds this limit, the oldest entries will be lost.</p> <p>Sélectionnez le nombre maximal d'entrées qui apparaîtront dans le menu « Récemment ouvert(s) ». Si le nombre de fichiers récemment ouverts est plus large que ce limite, les entrées les plus vieilles seront perdus.</p> &Number of entries in the "Open Recent" menu: &Nombre d'entrées dans le menu « Récemment ouvert(s) » : <p>If this option is checked, a dock widget is available with a list of TikZ commands which you can insert in your code by clicking on them. If this option is not checked, the TikZ commands will be available in a menu instead.</p> <p>Si cette option est cochée, une barre latérale contenant une liste des commandes TikZ est disponible. Vous pouvez insérer ces commandes dans votre code en les cliquant. Par contre, si cette option n'est pas cochée, les commandes TikZ seront disponibles dans un menu.</p> Show TikZ commands in &dock instead of menu Montrer les commandes TikZ dans une barre &latérale au lieu du menu (you have to restart this program for this change to take effect) (vous devez redémarrer ce programme pour appliquer ce changement) <p>Specify whether the preview should be generated automatically or manually. If the option "Automatically" is checked, the TikZ code in the editor is compiled while editing. If the option "Manually" is checked, a "Build" button is available and the TikZ code is only compiled when you press that button.</p> <p>Précisez si l'aperçu doit être généré automatiquement ou manuellement. Si l'option « Automatiquement » est cochée, le code TikZ dans l'éditeur est compilé durant l'édition. Par contre, si l'option « Manuellement » est cochée, un bouton « Compiler » est disponible et le code TikZ est compilé seulement lorsque vous appuyez sur ce bouton.</p> Preview generation: Génération de l'aperçu : <p>If this option is checked, the TikZ code in the editor is compiled while editing.</p> <p>Si cette option est cochée, le code TikZ dans l'éditeur est compilé durant l'édition.</p> &Automatically &Automatiquement buildButtonGroup <p>If this option is checked, a "Build" button is available and the TikZ code is only compiled when you press that button.</p> <p>Si cette option est cochée, un bouton « Compiler » est disponible et le code TikZ est compilé seulement lorsque vous appuyez sur ce bouton.</p> &Manually &Manuellement <p>Select the style in which the toolbar will be displayed.</p> <p>Sélectionnez le style de la barre d'outils.</p> Toolbar st&yle: Style de la barre d'&outils : Icons only Icônes seules Text only Texte seul Text alongside icons Texte contre les icônes Text under icons Texte sous les icônes Commands Commandes <p>Enter the path to the LaTeX executable here.</p> <p>Introduisez le chemin d'accès du fichier exécutable de LaTeX.</p> PDF&LaTeX command: Commande PDF&LaTeX : Browse command Feuilleter commande <p>Browse to the LaTeX executable.</p> <p>Feuilleter vers le fichier exécutable de LaTeX.</p> <p>Enter the path to the pdftops executable here.</p> <p>Introduisez le chemin d'accès du fichier exécutable de pdftops.</p> &Pdftops command: Commande &pdftops : <p>Browse to the pdftops executable.</p> <p>Feuilleter vers le fichier exécutable de pdftops.</p> Templates Fichiers de base <p>Enter the text which will be replaced by the TikZ code in the template here.</p> <p>Introduisez le texte qui sera remplacé par le code TikZ dans le fichier de base ici.</p> &Replace text: Texte &remplacé : <p>Enter the path to the executable of the text editor for the template here.</p> <p>Introduisez le chemin d'accès du fichier exécutable de l'éditeur du fichier de base.</p> Editor &command: Commande &éditeur : <p>Browse to the editor executable.</p> <p>Feuilleter vers le fichier exécutable de l'éditeur.</p> Help Aide <p>Enter the path to the file containing the TikZ documentation here.</p> <p>Introduisez le chemin d'accès du fichier de documentation sur TikZ.</p> &TikZ documentation: Documentation &TikZ : <p>Browse to the file containing the TikZ documentation.</p> <p>Feuilleter vers le fichier contenant la documentation sur TikZ.</p> <p>Press this button to search the file containing the TikZ documentation in the TeX directory structure using kpsewhich.</p> <p>Appuyer sur ce bouton pour chercher le fichier contenant la documentation sur TikZ dans la structure de dossiers TeX avec kpsewhich.</p> Search in TeX directory structure Chercher dans la structure de dossiers TeX &Search &Chercher FileDialog File "%1" already exists. Do you want to overwrite it? Le fichier « %1 » existe déjà. Voulez-vous l'écraser ? GoToLineWidget Go To Line Aller à la ligne Close go to line box Fermer outil « Aller à la ligne » Go to line: Aller à la ligne : &Go &Aller IndentDialog Indent Selection Indenter sélection Using &spaces Avec &espaces &Number of spaces: &Nombre d'espaces : Using &tabs Avec &tabs Num&ber of tabs: Nom&bre de tabs : KtikzApplication The document "%1" has been modified. Do you want to save your changes? Le document « %1 » a été modifié. Voulez-vous enregistrer les modifications ? LineEdit Clear input field Effacer le champ de saisie MainWindow Messages Messages <p>The messages produced by LaTeX are shown here. If your TikZ code contains errors, then a red border will appear and the errors will be highlighted.</p> <p>Les messages produits par LaTeX sont montrés ici. Si le code TikZ contient des erreurs, un cadre rouge apparaîtra et les erreurs seront colorées.</p> Preview Aperçu Open PGF source file Ouvrir fichier source PGF PGF files filter Fichiers PGF All files filter Tous les fichiers Save PGF source file Enregistrer fichier source PGF The document was modified by another program. What do you want to do? Le document a été modifié par un autre programme. Que voulez-vous faire ? &Overwrite É&craser &Reload file &Recharger le fichier Cannot open TikZ documentation. No application is found which can open the file "%1". Impossible d'ouvrir la documentation TikZ. Aucun programme capable d'ouvrir le fichier « %1 » n'est trouvé. Reloa&d Re&charger Reload the current document Recharger le document actuel <p>Reload the current document from disk.</p> <p>Recharger le document actuel du disque.</p> Create a new document Créer un nouveau document Open an existing file Ouvrir un fichier existant Save the current document to disk Enregistrer le document actuel sur disque Save the document under a new name Enregistrer le document sous un nouveau nom Close the current document Fermer le document actuel Exit the application Quitter le programme &Build &Compiler Ctrl+B View|Build Ctrl+B Build preview Générer aperçu <p>Generate preview by building the current TikZ code in the editor.</p> <p>Générer l'aperçu en compilant le code TikZ dans l'éditeur.</p> View &Log Voir &log View log messages produced by the last executed process Voir messages log produit par le processus dernièrement exécuté <p>Show the log messages produced by the last executed process in the Messages box.</p> <p>Voir messages log produit par le processus dernièrement exécuté dans l'éditeur « Messages ».</p> Configure the settings of this application Configurer ce programme TikZ &Manual &Manuel de TikZ Show the manual of TikZ and PGF Ouvrir le manuel de TikZ et PGF %1 &Handbook &Manuel utilisateur de %1 Show the application's documentation Montrer le manuel utilisateur de ce programme &About %1 À &propos de %1 Show the application's About box Montrer l'information sur ce programme About &Qt À propos de &Qt Show the Qt library's About box Montrer l'information sur Qt Show simple description of any widget Montrer une simple description de chaque élément Open a recently opened file Ouvrir un fichier ouvert récemment &File &Fichier &Settings &Configuration &Toolbars Barres d'&outils Show or hide toolbars Montrer ou cacher les barres d'outils &Sidebars Barres &latérales Show or hide sidebars Montrer ou cacher les barres latérales &Help &Aide File Fichier Ready Prêt Hide sidebar "%1" Cacher la barre latérale « %1 » Show sidebar "%1" Montrer la barre latérale « %1 » Cannot find TikZ documentation. Go to Settings -> Configure %1 and change in the "General" tab the path to the TikZ documentation. Documentation TikZ introuvable. Ouvrez le dialogue « Configuration de %1 » et changez dans la page « Général » le chemin d'accès de la documentation TikZ. <p>Create a new document.</p> <p>Créer un nouveau document.</p> <p>Open an existing file.</p> <p>Ouvrir un fichier existant.</p> <p>Open a recently opened file.</p> <p>Ouvrir un fichier ouvert récemment.</p> <p>Save the current document to disk.</p> <p>Enregistrer le document actuel sur disque.</p> <p>Save the document under a new name.</p> <p>Enregistrer le document sous un nouveau nom.</p> <p>Close the current document.</p> <p>Fermer le document actuel.</p> <p>Exit the application.</p> <p>Quitter le programme.</p> <p>Configure the settings of this application.</p> <p>Configurer ce programme.</p> <p>Show the manual of TikZ and PGF.</p> <p>Ouvrir le manuel de TikZ et PGF.</p> &Insert &Insérer Hide toolbar "%1" Cacher la barre d'outils « %1 » Could not copy "%1" to temporary file "%2". Impossible de copier « %1 » vers le fichier temporaire « %2 ». Cannot read file "%1": %2 Impossible de lire le fichier « %1 » : %2 File Read Error @title:window Erreur de lecture du fichier Cannot read file "%1": %2. Impossible de lire le fichier « %1 » : %2. Cannot write file "%1": %2 Impossible d'enregistrer le fichier « %1 » : %2 File Save Error @title:window Erreur d'enregistrement du fichier Cannot write file "%1": %2. Impossible d'enregistrer le fichier « %1 » : %2. Could not copy temporary file "%1" to "%2". Impossible de copier le fichier temporaire « %1 » vers « %2 ». File saved @info:status Fichier enregistré Line: %1 Col: %2 @info:status Ligne : %1 Col : %2 Show toolbar "%1" Montrer la barre d'outils « %1 » &Configure %1... &Configuration de %1... The document has been modified. Do you want to save your changes? Le document a été modifié. Voulez-vous enregistrer les modifications ? File loaded Fichier chargé %1[*] - %2 %1[*] - %2 QObject &New &Nouveau &Open... &Ouvrir... &Save &Enregistrer Save &As... Enregistrer &sous... &Close &Fermer &Quit &Quitter &Undo &Défaire Re&do Re&faire Cu&t Cou&per &Copy &Copier &Paste C&oller Select &All Sélectionner &tout &Find... &Chercher... Find &Next &Poursuivre la recherche Find Pre&vious Chercher en arri&ère &Replace... &Remplacer... &Go to Line... &Aller à la ligne... Zoom &In A&grandir Zoom &Out &Rétrécir &Configure %1... &Configuration de %1... Ctrl+Q File|Quit Ctrl+Q Ctrl+G Edit|Go to Line Ctrl+G &Open Recent &Récemment ouvert(s) Unable to open the help file (%1) Incapable d'ouvrir le fichier d'aide (%1) Unable to launch Qt Assistant (%1) Incapable de démarrer Qt Assistant (%1) RecentFilesAction Open &Recent &Récemment ouvert(s) ReplaceCurrentWidget &Replace &Remplacer Replace &All &Tout remplacer &Don't Replace Ne &pas remplacer &Cancel &Annuler Replace %1 by %2? Remplacer %1 par %2 ? ReplaceWidget Find and Replace Chercher et remplacer Close find and replace box Fermer outil « Chercher et remplacer » Find: Chercher : &Whole words Mots &entiers &Case sensitive Tenir compte de la c&asse Replace with: Remplacer par : Search backward Chercher en arrière Search forward Chercher en avant &Find &Chercher &Replace &Remplacer TemplateWidget Choose Template Choisir fichier de base <p>Give the file name of the LaTeX template. If this input field is empty or contains an invalid file name, an internal default template will be used.</p> <p>Introduisez le nom du fichier de base LaTeX. Si le champ de saisie est vide ou contient un nom de fichier invalide, un fichier de base interne sera utilisé.</p> &Template: Fichier de &base : <p>Select template file</p> <p>Sélectionner fichier de base</p> <p>Edit this template with an external editor specified in the "Configure" dialog.</p> <p>Éditez ce fichier de base avec un éditeur externe défini dans le dialogue « Configuration ».</p> Edit Éditer All files Tous les fichiers Select a template file Sélectionner un fichier de base %1 template files Fichiers de base %1 <p>Browse to an existing template file.</p> <p>Feuilleter vers un fichier de base existant.</p> <p>Reload template file</p> <p>Recharger fichier de base</p> <p>Reload current template file.</p> <p>Recharger fichier de base actuel</p> <p>Edit template file</p> <p>Éditer fichier de base</p> <p>The template contains the code of a complete LaTeX document in which the TikZ picture will be included and which will be typesetted to produce the preview image. The string %1 in the template will be replaced by the TikZ code.</p> <p>Le fichier de base contient le code d'un document LaTeX complet dans lequel l'image TikZ sera incluse et lequel sera compilé pour créér l'aperçu. Le texte %1 dans le fichier de base sera remplacé par le code TikZ.</p> TikzCommandInserter &Insert &Insérer &Draw &Tirer une ligne &Curves &Courbes &Options &Options Commands Commandes Draw to Tirer vers Options Options Draw &line between two points Tirer &ligne entre deux points &Clip rectangle &Clipper rectangle &Move to point &Repositioner vers point &Move to relative point &Repositioner vers point relatif &Line to &Ligne vers &Line to relative point &Ligne vers point relatif C&urve to &Co&urbe vers C&ycle C&ycler &To &Vers &Absolute point Point &absolu Point &relative to initial position Point &relatif à la position initiale Point &relative to previous position Point &relatif à la position précédente &Polar coordinates Coordonnées &polaires &Intersection of two lines &Intersection de deux lignes &Rectangle &Rectangle &Circle &Cercle &Ellipse &Ellipse &Arc &Arc &Parabola &Parabole &Sine curve in [0, pi/2] &Sinus dans [0, pi/2] &Cosine curve in [0, pi/2] &Cosinus dans [0, pi/2] &Grid &Quadrillage Define st&yle Définir st&yle Define style for every node with a certain &shape (standalone) Définir style pour chaque nœud ayant une certaine &forme (autonome) Define style for every node with a certain &shape (as option) Définir style pour chaque nœud ayant une certaine &forme (comme option) Append style for every node with a certain &shape (as option) Ajouter style pour chaque nœud ayant une certaine &forme (comme option) &Equal lines Lignes &égaux &Alternating lines Lignes &alternantes &Slant horizontally &Obliquer horizontalement &Slant vertically &Obliquer verticalement C&oordinate transformation Transformation des c&oordonnées Draw "subdued" &grid with specified step Tirer &quadrillage à distances définies "to" curved with &label « to » courbé avec é&tiquette "to" curved with to &path « to » courbé avec « to &path » &Clip and draw the clipping contours &Clipper et tirer les lignes de contour Draw p&olygon Tirer &polygone S&hift dash start &Repositionner le début du tiret Parabola with specified &width and height Parabole avec &largeur et hauteur définies &Define style for every to &Définir style pour chaque « to » <p>This is a list of TikZ commands. You can insert these commands in your code by clicking on them. You can obtain more commands by changing the category in the combo box.</p> <p>Ceci est une liste des commandes TikZ. Vous pouvez insérer ces commandes dans votre code TikZ en les cliquant. Vous pouvez obtenir plus de commandes en changeant la catégorie en haut.</p> Alt+I Alt+I General Général Category: Catégorie : &Arrows &Flèches Define c&olor Définir c&ouleur Add to st&yle Ajouter au st&yle &Shorten start of line &Rétrécir début du ligne &Shorten end of line &Rétrécir fin du ligne Set &distance between node and its label Définir &distance entre le nœud et son étiquette Set &distance between node and its pin label Définir &distance entre le nœud et son étiquette épinglée Set &pin edge options Définir options de l'arête d'une é&pingle &Double line Ligne &double &Distance between the two lines of a double line &Distance entre les deux lignes d'une ligne double Specify shape of line &end Spécifier forme du &fin de la ligne Specify shape of line &joins Spécifier forme des &raccords des lignes Maximal length of m&iter join Longueur maximale des enjoignements « &miter » S&hift horizontally &Translation horizontale S&hift vertically &Translation verticale S&hift to a point &Translation vers un point &Cancel all transformations except shift &Annuler toutes les transformations sauf les translations &Rotate by angle &Rotation avec angle &Rotate around a point &Rotation autour d'un point &Flip horizontally &Symétrie horizontale &Flip vertically &Symétrie verticale &Line to node with anchor &Ligne vers nœud avec ancrage &Node &Nœud &Path Options Options &courbe end point point final half width moitié de la largeur half height moitié de la hauteur start angle angle de départ end angle angle de fin bend coord coord courbure math expression expression math part name nom de la partie arrow tip kind type pointe de flèche color name nom de la couleur core color couleur du noyau dash pattern patron tirets dash phase distance tirets zigzag/brace/triangles/coil/expanding waves/bump/saw number or dimension or coordinate nombre ou dimension ou coordonnée number or dimension nombre ou dimension Draw &to Next Point Tirer &vers prochain point &Specifying Coordinates &Spécifier coordonnées Assignments using &let Allocations avec « &let » &Nodes &Nœuds &Styles &Styles &Node Options Options &nœuds &Positioning &Positionnement &Style &Style &Line Options &Options ligne &Plot Options Options &traçage &Opacity &Opacité &Dash Patterns Patrons &tirets S&hade Options Patrons &ombrage &Snaked Lines Options Options &serpentines &Transformations on Subsequent Objects in Path &Transformations sur les objets suivantes d'une courbe Para&bola Options Options para&bole &Grid Options Options &quadrillage &To Options Options « &to » \foreach with iteration \foreach avec itération \foreach with custom text \foreach avec texte personnalisé Specify &coordinate Spécifier &coordonnée &Edge to &Arête vers &Edge to (with options) &Arête vers (avec options) &Node (with options and name) &Nœud (avec options et nom) &Plot &Tracer &Function &Fonction &Plot function &Tracer fonction &Let &Soit Let &number Soit &nombre Let &point Soit &point &Child &Fils C&hild node Nœud &fils Node &part &Partie de nœud Set &distance between nodes Définir &distance entre les nœuds Set parent &anchor Définir &ancrage parent Set child &anchor Définir &ancrage fils Set node tree &grow direction Définir direction de &croissance de l'arbre de nœuds Set &label Définir é&tiquette Set &pin (label with connecting edge) Définir é&pingle (étiquette avec arête de liaison) Set &definition Établir &définition Define style for every &path (standalone) Définir style pour chaque &courbe (autonome) Define style for every &node (standalone) Définir style pour chaque &nœud (autonome) Define style for every &path (as option) Définir style pour chaque &courbe (comme option) Define style for every &node (as option) Définir style pour chaque &nœud (comme option) Define style for every &edge (as option) Définir style pour chaque &arête (comme option) Define style for every n&ode part (as option) Définir style pour chaque partie de nœ&ud (comme option) Define style for every node &label (as option) Définir style pour chaque étiquette de nœ&ud (comme option) Define style for every node &pin label (as option) Définir style pour chaque étiquette d'une épingle d'un nœ&ud (comme option) Define style for every node &pin edge (as option) Définir style pour chaque arête d'épingle d'un nœ&ud (comme option) Define style for every &join (as option) Définir style pour chaque &raccord (comme option) Define style for every &picture (as option) Définir style pour chaque « &picture » (comme option) Define style for every &to path (as option) Définir style pour chaque courbe « &to » (comme option) Append style for every &path (as option) Ajouter style pour chaque &courbe (comme option) Append style for every &node (as option) Ajouter style pour chaque &nœud (comme option) Append style for every &edge (as option) Ajouter style pour chaque &arête (comme option) Append style for every n&ode part (as option) Ajouter style pour chaque partie de nœ&ud (comme option) Append style for every node &label (as option) Ajouter style pour chaque étiquette de nœ&ud (comme option) Append style for every node &pin label (as option) Ajouter style pour chaque étiquette d'une épingle d'un nœ&ud (comme option) Append style for every node &pin edge (as option) Ajouter style pour chaque arête d'épingle d'un nœ&ud (comme option) Append style for every &join (as option) Ajouter style pour chaque &raccord (comme option) Append style for every &picture (as option) Ajouter style pour chaque « &picture » (comme option) Append style for every &to path (as option) Ajouter style pour chaque courbe « &to » (comme option) Set node at &start of path Mettre nœud au &début de la courbe Set node very near &start of path Mettre nœud très près du &début de la courbe Set node &midway path Mettre nœud à &mi-chemin de la courbe Set node near &end of path Mettre nœud près de la &fin de la courbe Set node very near &end of path Mettre nœud très près de la &fin de la courbe Set node at &end of path Mettre nœud à la &fin de la courbe Set relative &position of node on path Définir &position relative du nœud sur la courbe Set &text width in node Définir largeur du &texte dans le nœud Set &text in node justified Justifier &texte dans le nœud Align &text in node to the left Aligner &texte dans le nœud vers la gauche Center &text in node Centrer &texte dans le nœud Center &text without hyphenation Centrer &texte sans césures Set &text height in node Définir hauteur du &texte dans le nœud Set &text depth in node Définir profondeur du &texte dans le nœud Set &separation between text and node shape Définir &séparation entre le texte et le contour du nœud Set &separation outside node shape Définir &séparation à l'exterieur du nœud Set minimum &height of node Définir &hauteur minimale du nœud Set minimum &width of node Définir &largeur minimale du nœud Set node &sloped in the direction of path &Incliner nœud dans la direction de la courbe Set &shape of node Définir la &forme du nœud &Line to node &Ligne vers nœud Set node near &start of path Mettre nœud près du &début de la courbe Align &text to the left without hyphenation Aligner &texte à gauche sans césures TikZ Commands Commandes TikZ Parse error at line %1, column %2: %3 Erreur d'évaluation à la ligne %1, colonne %2 : %3 Cannot parse the TikZ commands file. Impossible d'évaluer le contenu du fichier contenant les commandes TikZ. options options variable variable list liste first premier first+step premier+pas last dernier value1 valeur1 text1 texte1 value2 valeur2 text2 texte2 color couleur name nom x x y y text texte x1 x1 y1 y1 x2 x2 y2 y2 x3 x3 y3 y3 width largeur height hauteur end fin label étiquette north/south/... nodes nœuds ctrl1 ctrl1 ctrl2 ctrl2 function fonction xcoord coordx ycoord coordy degree degré radius rayon x4 x4 y4 y4 corner coin start début angle angle dimension dimension value valeur rectangle/circle/... style style fraction fraction rectangle/circle/coordinate round/rect/butt round/bevel/miter factor facteur inset encart number nombre dim dim axis/radial/ball/... ratio ratio degrees degrés a11 a11 a12 a12 a21 a21 a22 a22 x0 x0 y0 y0 coordinate coordonnée dx dx dy dy path courbe code code S&cale horizontally A&grandir/rétrécir horizontalement S&cale vertically A&grandir/rétrécir verticalement S&cale in both directions A&grandir/rétrécir dans les deux directions TikzEditorView <p>Enter your TikZ code here. The code should begin with \begin{tikzpicture} and end with \end{tikzpicture}.</p> <p>Introduisez le code TikZ ici. Le code doit commencer par \begin{tikzpicture} et être terminé par \end{tikzpicture}.</p> Undo the previous action Défaire l'action précédente Redo the previous undone action Refaire l'action précédemment défaite Cut the current selection's contents to the clipboard Couper le texte sélectionné vers le presse-papiers Copy the current selection's contents to the clipboard Copier le texte sélectionné dans le presse-papiers Paste the clipboard's contents into the current selection Coller le contenu du presse-papiers dans le texte sélectionné Select all the content Sélectionner tout le contenu &Indent... &Indenter... Indent the current line or selection Indenter la ligne actuelle ou la sélection C&omment Comm&enter Comment the current line or selection Commenter la ligne actuelle ou la sélection Unco&mment Déco&mmenter Uncomment the current line or selection Décommenter la ligne actuelle ou la sélection &Edit &Édition Edit Éditer Indent Indenter End of document reached. Continue from the beginning? Fin du document. Continuer à partir du début ? Beginning of document reached. Continue from the end? Début du document. Continuer à partir de la fin ? Look up a piece of text in the document Chercher un bout de texte dans le document <p>Undo the previous action.</p> <p>Défaire l'action précédente.</p> <p>Redo the previous undone action.</p> <p>Refaire l'action précédemment défaite.</p> <p>Cut the current selection's contents to the clipboard.</p> <p>Couper le texte sélectionné vers le presse-papiers.</p> <p>Copy the current selection's contents to the clipboard.</p> <p>Copier le texte sélectionné dans le presse-papiers.</p> <p>Paste the clipboard's contents into the current selection.</p> <p>Coller le contenu du presse-papiers dans le texte sélectionné.</p> <p>Select all the content.</p> <p>Sélectionner tout le contenu.</p> Ctrl+I Edit|Indent Ctrl+I <p>Indent the current line or selection.</p> <p>Indenter la ligne actuelle ou la sélection.</p> Ctrl+D Edit|Comment Ctrl+D <p>Comment the current line or selection.</p> <p>Commenter la ligne actuelle ou la sélection.</p> Ctrl+Shift+D Edit|Uncomment Ctrl+Shift+D <p>Uncomment the current line or selection.</p> <p>Décommenter la ligne actuelle ou la sélection.</p> Search the next occurrence of a text Chercher la prochaine apparition du texte Search the previous occurrence of a text Chercher l'apparition précédente du texte Search and replace a piece of text in the document Chercher et remplacer un bout de texte dans le document Go to a certain line in the document Aller à une certaine ligne dans le document <p>Look up a piece of text in the document.</p> <p>Chercher un bout de texte dans le document.</p> <p>Search the next occurrence of a text.</p> <p>Chercher la prochaine apparition du texte.</p> <p>Search the previous occurrence of a text.</p> <p>Chercher l'apparition précédente du texte.</p> <p>Search and replace a piece of text in the document.</p> <p>Chercher et remplacer un bout de texte dans le document.</p> <p>Go to a certain line in the document.</p> <p>Aller à une certaine ligne dans le document.</p> TikzHighlighter Environments Environnements Comments Commentaire TikzPreview <p>Here the preview image of your TikZ code is shown. You can zoom in and out, and you can scroll the image by dragging it.</p> <p>Ici un aperçu du code TikZ est montré. Vous pouvez agrandir et rétrécir l'image, et vous pouvez la défiler en « glissant/déposant ».</p> Zoom preview in Agrandir l'aperçu <p>Zoom preview in by a predetermined factor.</p> <p>Agrandir l'aperçu avec un facteur prédéterminé.</p> Zoom preview out Rétrécir l'apercu <p>Zoom preview out by a predetermined factor.</p> <p>Rétrécir l'aperçu avec un facteur prédéterminé.</p> &Zoom &Zoom &Previous image Image &précédente Alt+Left View|Go to previous page Alt+Left Show previous image in preview Montrer image précédente dans l'aperçu <p>Show the preview of the previous tikzpicture in the TikZ code.</p> <p>Montrer l'aperçu du tikzpicture précédent dans le code TikZ.</p> &Next image Image &suivante Alt+Right View|Go to next page Alt+Right Show next image in preview Montrer image suivante dans l'aperçu <p>Show the preview of the next tikzpicture in the TikZ code.</p> <p>Montrer l'aperçu du tikzpicture suivant dans le code TikZ.</p> Generating image tikz preview status Génération de l'image Select or insert zoom factor here Sélectionnez ou introduisez la proportion du zoom ici <p>Select the zoom factor here. Alternatively, you can also introduce a zoom factor and press Enter.</p> <p>Sélectionnez la proportion du zoom. Vous pouvez aussi introduire la proportion du zoom et appuyer sur Retour.</p> View Affichage TikzPreviewController E&xport E&xporter Export image to various formats Exporter image en divers formats <p>Export image to various formats.</p> <p>Exporter image en divers formats.</p> &Encapsulated PostScript (EPS) &Encapsulated PostScript (EPS) Export to EPS Exporter en EPS <p>Export to EPS.</p> <p>Exporter en EPS.</p> &Portable Document Format (PDF) &Portable Document Format (PDF) Export to PDF Exporter en PDF <p>Export to PDF.</p> <p>Exporter en PDF.</p> Portable Network &Graphics (PNG) Portable Network &Graphics (PNG) Export to PNG Exporter en PNG <p>Export to PNG.</p> <p>Exporter en PNG.</p> &Stop Process &Terminer processus Escape View|Stop Process Escape Abort current process Terminer processus de force <p>Abort the execution of the currently running process.</p> <p>Terminer de force l'exécution du processus actuellement en exécution.</p> S&hell Escape S&hell escape Enable the \write18{shell-command} feature Activer l'utilisation de la commande \write18{commande du shell} <p>Enable LaTeX to run shell commands, this is needed when you want to plot functions using gnuplot within TikZ.</p><p><strong>Warning:</strong> Enabling this may cause malicious software to be run on your computer! Check the LaTeX code to see which commands are executed.</p> <p>Permettre à LaTeX d'exécuter des programmes, ceci est nécessaire pour pouvoir tracer des fonctions avec gnuplot dans TikZ.</p><p><strong>Attention :</strong> Si cette option est activée, des programmes malveillantes pourraient être exécutés sur votre ordinateur ! Contrôlez le code LaTeX pour voir quels programmes sont exécutés.</p> &View Afficha&ge Run Exécuter All files Tous les fichiers Export Image Exporter image EPS image Image EPS PDF document Document PDF PNG image Image PNG Export image Exporter image A file named "%1" already exists. Are you sure you want to overwrite it? Le fichier « %1 » existe déjà. Voulez-vous l'écraser ? &Overwrite Do you want to overwrite an existing file - warning box É&craser &Cancel Do you want to overwrite an existing file - warning box &Annuler The file "%1" could not be overwritten. Impossible d'écraser le fichier « %1 ». The image could not be exported to the file "%1". Impossible d'exporter l'image vers le fichier « %1 ». Template file could not be copied to a temporary file "%1". Impossible de copier le fichier de base vers le fichier temporaire « %1 ». TikzPreviewGenerator Gnuplot cannot be executed. Either Gnuplot is not installed or it is not available in the system PATH or you may have insufficient permissions to invoke the program. Gnuplot ne peut être exécuté. Gnuplot n'est pas installé ou n'est pas disponible dans le PATH du système ou vous n'avez pas la permission d'exécuter ce programme. Warning: could not load LaTeX logfile. Attention : impossible de charger le fichier log de LaTeX. Process aborted. Processus terminé de force. Process finished successfully. Processus terminé avec succès. Error: loading PDF failed, the file is probably corrupted. Erreur : impossible de charger le PDF, le fichier est probablement corrompu. Error: run failed. info process Erreur : exécution failli. Running... Exécutant... ktikz/app/editreplacecurrentwidget.h0000660000175000017500000000476311455414611022403 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef REPLACECURRENTWIDGET_H #define REPLACECURRENTWIDGET_H #include class QLabel; class QPushButton; class ReplaceCurrentWidget : public QWidget { Q_OBJECT public: ReplaceCurrentWidget(QWidget *parent = 0); ~ReplaceCurrentWidget(); void setReplacement(const QString &text, const QString &replacement); void search(const QString &text, const QString &replacement, bool isCaseSensitive, bool findWholeWords, bool forward, bool startAtCursor); signals: void showReplaceWidget(); void search(const QString &text, bool isCaseSensitive, bool findWholeWords, bool forward, bool startAtCursor); void replace(const QString &replacement); void replaceAll(const QString &text, const QString &replacement, bool isCaseSensitive, bool findWholeWords, bool forward, bool startAtCursor); void setSearchFromBegin(bool searchFromBegin); protected: virtual void showEvent(QShowEvent *event); virtual void keyPressEvent(QKeyEvent *event); protected slots: void hide(); private: QLabel *m_replaceLabel; QPushButton *m_replaceButton; QString m_text, m_replacement; bool m_isCaseSensitive, m_findWholeWords, m_forward, m_startAtCursor; private slots: void replace(); void replaceAll(); void dontReplace(); }; #endif ktikz/app/qtikz_de.ts0000660000175000017500000046025611455414611017327 0ustar fhackenbergerfhackenberger AboutDialog Copyright 2007-2010 Florian Hackenberger and Glad Deschrijver Copyright 2007-2010 Florian Hackenberger und Glad Deschrijver This is a program for creating TikZ (from the LaTeX pgf package) diagrams. KtikZ is ein program zur Erstellung von TikZ (aus den LaTeX pgf Paket) Diagrammen. <p>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.</p><p>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.</p> <p>Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder (nach Ihrer Option) jeder späteren Version.</p><p>Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK.(sp)(sp)Details finden Sie in der GNU General Public License.</p> About %1 Über %1 About TikZ editor Über den TikZ Editor ConfigAppearanceWidget &Standard &Standard <p>When this option is checked, the default fonts and colors are used in the output.</p> When this option is checked, the default fonts and colors are used in the output. <p>Wenn diese Option gewählt ist, werden die Standard Schriften und Farben in der Ausgabe verwendet.</p> Highlighting Hervorhebung &Custom &Individuell Change &font... Change &font Schrift ä&ndern... Change c&olor... Change c&olor F&arbe ändern... <p>When this option is checked, the fonts and colors defined below will be used in the output instead of the default ones.</p> When this option is checked, the fonts and colors defined below will be used in the output instead of the default ones. <p>Wenn diese Option gewählt ist, werden die unten gewählten Schriften und Farben in der Ausgabe verwendet.</p> Change st&yle for: Stil än&dern für: <p>Select the structure appearing in the TikZ code for which you want to change the fonts and colors.</p> Select the structure appearing in the TikZ code for which you want to change the fonts and colors. <p>Wählen sie den TikZ code für welchen sie die Schriften und Farben anpassen möchten.</p> Change fo&nt Schrift ä&ndern <p>Select the font in which the structure that you selected in the box above should be displayed.</p> Select the font in which the structure that you selected in the box above should be displayed. <p>Wählen Sie die Schrift für die oben ausgewählte Struktur aus.</p> Change co&lor F&arbe ändern <p>Select the text color in which the structure that you selected in the box above should be displayed.</p> Select the text color in which the structure that you selected in the box above should be displayed. <p>Wählen sie die Text Farbe für die oben ausgewählte Struktur aus.</p> Change st&yle for Stil än&dern für ConfigDialog Configure %1 Configure TikZ editor Konfiguration des %1s &General All&gemein &Editor &Editor &Highlighting &Hervorhebung Select the font of the main text. Wählen die die Schrift für den Haupttext aus. Text &font: Text Schri&ft: Select Auswählen <p>Select the font of the main text.</p> <p>Wählen die die Schrift für den Haupttext aus.</p> Select font Text auswählen <p>Show white spaces in the text by replacing them with special symbols. These symbols will not be saved on disk.</p> <p>Leerzeichen im text durch Symbole ersetzen. Diese Symbole werden nicht gespeichert.</p> Show t&abulators T&abulatoren anzeigen <p>Show tabulators in the text by replacing them with special symbols. These symbols will not be saved on disk.</p> <p>Tabulatoren im text durch Symbole ersetzen. Diese Symbole werden nicht gespeichert.</p> <p>If the cursor is on a bracket ({[]}), then the corresponding opening/closing bracket will be highlighted.</p> <p>Wenn sich der Cursor auf einer Klammer ({[]}) befindet, wird die entsprechende öffnende/schließende Klammer hervorgehoben.</p> <p>Select the color in which the highlighted brackets will be shown.</p> <p>Wählen Sie die Farbe in der hervorgehobene Klammern angezeigt werden sollen.</p> &Number of entries in the "Open Recent" menu: A&nzahl der Einträge im "Zuletzt geöffnet" Menü: <p>Select the maximum number of entries that appear in the "Open Recent" menu. When the number of recently opened files exceeds this limit, the oldest entries will be lost.</p> <p>Wählen sie die maximale Anzahl an Einträgen die im "Zuletzt geöffnet" Menü erscheinen sollen. Wenn die Anzahl an zuletzt geöffneten Dateien überschritten wird, geht der älteste Eintrag verloren.</p> <p>If this option is checked, a dock widget is available with a list of TikZ commands which you can insert in your code by clicking on them. If this option is not checked, the TikZ commands will be available in a menu instead.</p> <p>Wenn diese Option gewählt ist, wird ein Dock Fenster mit einer Liste von TikZ Befehlen angezeigt, welche durch drücken der Maustaste in den Code eingefügt werden. Wenn diese Option deaktiviert ist, werden die Befehle im Menu angezeigt.</p> <p>Enter the text which will be replaced by the TikZ code in the template here.</p> <p>Geben Sie den Text ein der durch den TiKZ code in der Vorlage ersetzt wird hier ein.</p> <p>Enter the path to the executable of the text editor for the template here.</p> <p>Geben Sie hier den Pfad zur ausführbaren Datei des Text Editors für die Vorlagen ein.</p> <p>Browse to the editor executable.</p> <p>Nach dem Editor Kommando suchen.</p> Select the maximum number of entries that appear in the "Open Recent" menu. When the number of recently opened files exceeds this limit, the oldest entries will be lost. Wählen sie die maximale Anzahl an Einträgen die im "Zuletzt geöffnet" Menü erscheinen sollen. Wenn die Anzahl an zuletzt geöffneten Dateien überschritten wird, geht der älteste Eintrag verloren. Enter the path to the LaTeX executable here. Geben Sie den Pfad zum LaTeX Programm hier ein. &LaTeX command: &LaTeX programm: Browse command Durchsuchen Browse to the LaTeX executable. Nach dem LaTeX programm suchen. Enter the path to the pdftops executable here. Geben sie den Pfad zum pdftops Programm hier ein. &Pdftops command: &Pdftops Programm: Browse to the pdftops executable. Nach dem pdftops Programm suchen. Cannot find TikZ documentation. Das TikZ Handbuch konnte nicht gefunden werden. Browse program Durchsuchen Program Programm Show TikZ commands in &dock instead of menu TikZ Kommandos im &Dock statt im Menü anzeigen If this option is checked, a dock widget is available with a list of TikZ commands which you can insert in your code by clicking on them. If this option is not checked, the TikZ commands will be available in a menu instead. Wenn diese Option gewählt ist, wird ein Dock Fenster mit einer Liste von TikZ Befehlen angezeigt, welche durch drücken der Maustaste in den Code eingefügt werden. Wenn diese Option deaktiviert ist, werden die Befehle im Menu angezeigt. (you have to restart this program for this change to take effect) (Sie müsen das Programm neu starten um die Änderungen anzuwenden) Toolbar st&yle: Werkzeugleis&tenstil: <p>Select the style in which the toolbar will be displayed.</p> <p>Wählen Sie den Stil der Werkzeugleiste aus.</p> Interface Interface Ti&kZ documentation: Ti&kZ Handbuch: <p>Enter the path to the LaTeX executable here.</p> <p>Geben Sie den Pfad zum LaTeX Programm hier ein.</p> <p>Browse to the LaTeX executable.</p> <p>Nach dem LaTeX programm suchen.</p> <p>Enter the path to the pdftops executable here.</p> <p>Geben sie den Pfad zum pdftops Programm hier ein.</p> <p>Browse to the pdftops executable.</p> <p>Nach dem pdftops Programm suchen.</p> Commands Befehle &Typesetting Sa&tzsystem Show matching &brackets Klammerpaare hervorhe&ben If the cursor is on a bracket ({[]}), then the corresponding opening/closing bracket will be highlighted. Wenn sich der Cursor auf einer Klammer ({[]}) befindet, wird die entsprechende öffnende/schließende Klammer hervorgehoben. Show &white spaces &Leerzeichen anzeigen Show white spaces (spaces, tabs) in the text by replacing them with special symbols. These symbols will not be saved on disk. Leerzeichen und Tabulatoren im text durch Symbole ersetzen. Diese Symbole werden nicht gespeichert. Select the color in which the highlighted brackets will be shown. Wählen Sie die Farbe in der hervorgehobene Klammern angezeigt werden sollen. Brackets matching &color: &Farbe für hervorgehobene Klammern: Editor Editor Browse file Durchsuchen &Search &Suchen Help Hilfe Enter the text which will be replaced by the TikZ code in the template here. Geben Sie den Text ein der durch den TiKZ code in der Vorlage ersetzt wird hier ein. &Replace text: Zu e&rsetzender Text: Enter the path to the executable of the text editor for the template here. Geben Sie hier den Pfad zur ausführbaren Datei des Text Editors für die Vorlagen ein. &Editor command: &Editor Pfad: Browse to the editor executable. Nach dem Editor Kommando suchen. Templates Vorlagen All files Alle Dateien &Toolbar style: Werkzeugleis&tenstil: Select the style in which the toolbar will be displayed. Wählen Sie den Stil der Werkzeugleiste aus. Icons only Nur Symbole Text only Nur Text Text alongside icons Text und Symbole Text under icons Text unter Symbolen ConfigEditorWidget Configure Editor Einstellungen des Editors Editor Editor <p>Select the font of the main text.</p> <p>Wählen die die Schrift für den Haupttext aus.</p> Text &font: Text Schri&ft: Select Auswählen Choose... Wählen... <p>Show white spaces in the text by replacing them with special symbols. These symbols will not be saved on disk.</p> <p>Leerzeichen im text durch Symbole ersetzen. Diese Symbole werden nicht gespeichert.</p> Show &white spaces &Leerzeichen anzeigen <p>Select the color in which the spaces will be shown.</p> &Use color: <p>Show tabulators in the text by replacing them with special symbols. These symbols will not be saved on disk.</p> <p>Tabulatoren im text durch Symbole ersetzen. Diese Symbole werden nicht gespeichert.</p> Show &tabulators T&abulatoren anzeigen <p>Select the color in which the tabulators will be shown.</p> U&se color: <p>If the cursor is on a bracket ({[]}), then the corresponding opening/closing bracket will be highlighted.</p> <p>Wenn sich der Cursor auf einer Klammer ({[]}) befindet, wird die entsprechende öffnende/schließende Klammer hervorgehoben.</p> Show matching &brackets Klammerpaare hervorhe&ben <p>Select the color in which the highlighted brackets will be shown.</p> <p>Wählen Sie die Farbe in der hervorgehobene Klammern angezeigt werden sollen.</p> Use c&olor: <p>When the first letters of a TikZ command are typed in the text, a list of possible completions will be shown.</p> Use command &completion ConfigGeneralWidget Cannot find TikZ documentation. Das TikZ Handbuch konnte nicht gefunden werden. Browse program Durchsuchen Program Programm Browse file Durchsuchen All files Alle Dateien General Allgemein Interface Interface <p>Select the maximum number of entries that appear in the "Open Recent" menu. When the number of recently opened files exceeds this limit, the oldest entries will be lost.</p> <p>Wählen sie die maximale Anzahl an Einträgen die im "Zuletzt geöffnet" Menü erscheinen sollen. Wenn die Anzahl an zuletzt geöffneten Dateien überschritten wird, geht der älteste Eintrag verloren.</p> &Number of entries in the "Open Recent" menu: A&nzahl der Einträge im "Zuletzt geöffnet" Menü: <p>If this option is checked, a dock widget is available with a list of TikZ commands which you can insert in your code by clicking on them. If this option is not checked, the TikZ commands will be available in a menu instead.</p> <p>Wenn diese Option gewählt ist, wird ein Dock Fenster mit einer Liste von TikZ Befehlen angezeigt, welche durch drücken der Maustaste in den Code eingefügt werden. Wenn diese Option deaktiviert ist, werden die Befehle im Menu angezeigt.</p> Show TikZ commands in &dock instead of menu TikZ Kommandos im &Dock statt im Menü anzeigen (you have to restart this program for this change to take effect) (Sie müsen das Programm neu starten um die Änderungen anzuwenden) <p>Specify whether the preview should be generated automatically or manually. If the option "Automatically" is checked, the TikZ code in the editor is compiled while editing. If the option "Manually" is checked, a "Build" button is available and the TikZ code is only compiled when you press that button.</p> Preview generation: <p>If this option is checked, the TikZ code in the editor is compiled while editing.</p> &Automatically buildButtonGroup <p>If this option is checked, a "Build" button is available and the TikZ code is only compiled when you press that button.</p> &Manually <p>Select the style in which the toolbar will be displayed.</p> <p>Wählen Sie den Stil der Werkzeugleiste aus.</p> Toolbar st&yle: Werkzeugleis&tenstil: Icons only Nur Symbole Text only Nur Text Text alongside icons Text und Symbole Text under icons Text unter Symbolen Commands Befehle <p>Enter the path to the LaTeX executable here.</p> <p>Geben Sie den Pfad zum LaTeX Programm hier ein.</p> PDF&LaTeX command: PDF&LaTeX programm: Browse command Durchsuchen <p>Browse to the LaTeX executable.</p> <p>Nach dem LaTeX programm suchen.</p> <p>Enter the path to the pdftops executable here.</p> <p>Geben sie den Pfad zum pdftops Programm hier ein.</p> &Pdftops command: &Pdftops Programm: <p>Browse to the pdftops executable.</p> <p>Nach dem pdftops Programm suchen.</p> Templates Vorlagen <p>Enter the text which will be replaced by the TikZ code in the template here.</p> <p>Geben Sie den Text ein der durch den TiKZ code in der Vorlage ersetzt wird hier ein.</p> &Replace text: Zu e&rsetzender Text: <p>Enter the path to the executable of the text editor for the template here.</p> <p>Geben Sie hier den Pfad zur ausführbaren Datei des Text Editors für die Vorlagen ein.</p> Editor &command: &Editor Pfad: <p>Browse to the editor executable.</p> <p>Nach dem Editor Kommando suchen.</p> Help Hilfe <p>Enter the path to the file containing the TikZ documentation here.</p> &TikZ documentation: Ti&kZ Handbuch: <p>Browse to the file containing the TikZ documentation.</p> <p>Press this button to search the file containing the TikZ documentation in the TeX directory structure using kpsewhich.</p> Search in TeX directory structure &Search &Suchen FileDialog File "%1" already exists. Do you want to overwrite it? GoToLineWidget Go To Line Zu Zeile gehen Close go to line box Box schließen Go to line: Zu Zeile gehen: &Go Go &Los IndentDialog Indent Selection Auswahl einrücken Using &spaces &Leerzeichen verwenden &Number of spaces: A&nzahl Leerzeichen: Using &tabs &Tabulatoren verwenden Num&ber of tabs: Anzahl Ta&bulatoren: KtikzApplication TikZ Editor TikZ Editor The document "%1" has been modified. Do you want to save your changes? Das Dokument "%1" wurde verändert. Wollen Sie die Änderungen speichern? LineEdit Clear input field Eingabefeld leeren MainWindow Messages Meldungen <p>The messages produced by LaTeX are shown here. If your TikZ code contains errors, then a red border will appear and the errors will be highlighted.</p> The messages produced by LaTeX are shown here. If your TikZ code contains errors, then a red border will appear and the errors will be highlighted. <p>Hier wird die LaTeX Ausgabe angezeigt. Falls ihr TikZ code Fehler enthält, wird ein roter Rahmen angezeigt und die Fehler werden hervorgehoben.</p> Preview Vorschau PGF files PGF Dateien All files Alle Dateien Open PGF source file PGF Quelldatei öffnen PGF files filter PGF Dateien All files filter Alle Dateien Save PGF source file PFG Quelldatei speichern Export image Bild exportieren Cannot find TikZ documentation. Das TikZ Handbuch konnte nicht gefunden werden. Create a new document Neues Dokument anlegen &New &Neu Open an existing file Existierende Datei öffnen &Open... &Öffnen... Save the current document to disk Das aktuelle Dokument speichern &Save &Speichern Save the document under a new name Das Dokument unter einem anderen Namen speichern Save &As... Speichern &unter... Close the current document Aktuelles Dokument schließen &Close S&chließen Close File Datei schließen Exit the application Anwendung schließen &Quit S&chließen Ctrl+Q File|Quit Strg+Q Encapsulated PostScript (EPS) Encapsulated PostScript (EPS) Export to PostScript Nach PostScript exportieren Portable Document Format (PDF) Portable Document Format (PDF) Export to PDF Nach PDF exportieren Portable Network Graphics (PNG) Portable Network Graphics (PNG) Export to PNG Nach PNG exportieren &Stop Process Proze&ss abbrechen Escape View|Stop process Escape Abort current process Den aktuellen Prozess abbrechen <p>Abort the execution of the currently running process.</p> Abort the execution of the currently running process. <p>Die Ausführung des laufenden Prozesses abbrechen.</p> View &Log &Logdatei anzeigen View log messages produced by the last executed process Zeigt die Logdatei des zuletzt gelaufenen Prozesses an <p>Show the log messages produced by the last executed process in the Messages box.</p> Show the log messages produced by the last executed process in the Messages box. <p>Die Logdatei des zuletzt gelaufenen Prozesses in der Ausgabe-Box anzeigen.</p> &Configure... &Einstellungen... Configure the settings of this application Die Einstellungen des Programms ändern TikZ &Manual TikZ &Handbuch Show the manual of TikZ and PGF Das TikZ und PGF Handbuch anzeigen &About %1 &About Ü&ber den %1 Show the application's About box Informationen über die Anwendung anzeigen About &Qt Über &Qt Show the Qt library's About box Informationen über die Qt Bibliothek anzeigen Show simple description of any widget Beschreibung aller Widgets anzeigen Open &Recent &Zuletzt geöffnet Open a recently opened file Eine zuletzt geöffnete Datei laden E&xport E&xportieren Export image to various formats Bild exportieren &File &Datei &View &Anzeigen &Settings &Einstellungen &Toolbars &Symbolleiste Show or hide toolbars Symbolleiste anzeigen oder verstecken &Sidebars S&eitenleiste Show or hide sidebars Seitenleiste anzeigen oder verstecken &Help &Hilfe File Datei Run Ausführen Ready Fertig Hide sidebar "%1" Seitenleiste verstecken "%1" Show sidebar "%1" Seitenleiste anzeigen "%1" The document was modified by another program. What do you want to do? &Overwrite &Reload file Cannot find TikZ documentation. Go to Settings -> Configure %1 and change in the "General" tab the path to the TikZ documentation. Cannot open TikZ documentation. No application is found which can open the file "%1". Reloa&d Reload the current document <p>Reload the current document from disk.</p> <p>Create a new document.</p> <p>Open an existing file.</p> <p>Open a recently opened file.</p> <p>Save the current document to disk.</p> <p>Save the document under a new name.</p> <p>Close the current document.</p> <p>Exit the application.</p> &Build Ctrl+B View|Build Build preview <p>Generate preview by building the current TikZ code in the editor.</p> <p>Configure the settings of this application.</p> <p>Show the manual of TikZ and PGF.</p> %1 &Handbook %1 Handbook Show the application's documentation &Insert E&infügen Hide toolbar "%1" Symbolleiste verstecken "%1" Could not copy "%1" to temporary file "%2". Cannot read file "%1": %2 File Read Error @title:window Cannot read file "%1": %2. Cannot write file "%1": %2 File Save Error @title:window Cannot write file "%1": %2. Could not copy temporary file "%1" to "%2". File saved @info:status Datei gespeichert Line: %1 Col: %2 @info:status Zeile: %1 Spalte: %2 Show toolbar "%1" Symbolleiste anzeigen "%1" <p>Enable LaTeX to run shell commands, this is needed when you want to plot functions using gnuplot within TikZ.</p><p><strong>Warning:</strong> Enabling this may cause malicious software to be run on your computer! Check the LaTeX code to see which commands are executed.</p> <p>Enable LaTeX to run shell commands, this is needed when you want to plot functions using gnuplot within TikZ.</p><p><strong>Warnung:</strong> Diese option kann zur Auführung von Schadcode führen! Überprüfen sie den LaTeX code um zu sehen welche Kommandos ausgeführt werden.</p> &Configure %1... &Einstellungen %1... The document has been modified. Do you want to save your changes? Das Dokument wurde verändert. Wollen Sie die Änderungen speichern? Cannot read file %1: %2. Datei %1 konnte nicht gelesen werden: %2. File loaded Datei geladen Cannot write file %1: %2. Datei %1 konnte nicht geschrieben werden: %2. File saved Datei gespeichert %1[*] - %2 %1[*] - %2 Line: Zeile: Col: Spalte: QObject &New &Neu &Open... &Öffnen... &Save &Speichern Save &As... Speichern &unter... &Close S&chließen &Quit S&chließen &Undo &Rückgängig Re&do Wie&derholen Cu&t &Ausschneiden &Copy &Kopieren &Paste &Einfügen Select &All &Alles auswählen &Find... &Suchen... Find &Next &Nächstes Find Pre&vious &Vorheriges &Replace... E&rsetzen... &Go to Line... Zu Zei&le gehen... Zoom &In Ver&größern Zoom &Out Ver&kleinern &Configure %1... &Einstellungen %1... Ctrl+Q File|Quit Strg+Q Ctrl+G Edit|Go to Line Strg+G &Open Recent &Zuletzt geöffnet Unable to open the help file (%1) Unable to launch Qt Assistant (%1) RecentFilesAction Open &Recent &Zuletzt geöffnet ReplaceCurrentWidget &Replace E&rsetze Replace &All &Alle ersetzen &Don't Replace &Nicht Ersetzen &Cancel Abbre&chen Replace %1 by %2? %1 duch %2 ersetzen? ReplaceWidget Find and Replace Suchen und Ersetzen Close find and replace box Box schließen Find: Suche: &Whole words Ganze &Worte &Case sensitive Groß/kleins&chreibung berücksichtigen Replace with: Ersetze mit: Search backward Rückwärts suchen Search forward Forwärts suchen &Find &Suche &Replace E&rsetze TemplateWidget <p>Edit this template with an external editor specified in the "Configure" dialog.</p> <p>Diese Vorlage mit dem im "Konfiguration" Dialag eingestelltem externen Editor bearbeiten.</p> <p>The string %1 in the template will be replaced by the TikZ code.</p> <p>Der Text %1 in der Vorlage wird durch TikZ code ersetzt.</p> Select a template file Wählen Sie eine Vorlagedatei %1 template files KTikZ template files %1 Vorlagen Dateien All files Alle Dateien Choose Template Vorlage wählen <p>Give the file name of the LaTeX template. If this input field is empty or contains an invalid file name, an internal default template will be used.</p> <p>Geben Sie den Dateinamen der LaTeX Vorlage an. Wenn dieses Feld leer bleibt oder einen ungültigen Pfad enthält wird eine Standardvorlage verwendet.</p> &Template: &Vorlage: <p>Select template file</p> <p>Wählen Sie die Vorlagedatei aus.</p> <p>Reload template file</p> <p>Reload current template file.</p> Edit Bearbeiten <p>Browse to an existing template file.</p> <p>Nach einer existierenden Vorlagendatei suchen.</p> <p>Edit template file</p> <p>Vorlage bearbeiten</p> <p>The template contains the code of a complete LaTeX document in which the TikZ picture will be included and which will be typesetted to produce the preview image. The string %1 in the template will be replaced by the TikZ code.</p> <p>Die Vorlage enhält den code für ein komplettes LaTeX Dokument in das die TikZ Zeichnung inkludiert wird. Das Resultat wird von LaTeX übersetzt um daraus die Vorschau zu erstellen. Die Zeichenkette %1 in der Vorlage wird duch den TikZ code ersetzt.</p> TikzCommandInserter &Insert E&infügen Commands Befehle Draw to Options <p>This is a list of TikZ commands. You can insert these commands in your code by clicking on them. You can obtain more commands by changing the category in the combo box.</p> This is a list of TikZ commands. You can insert these commands in your code by clicking on them. You can obtain more commands by changing the category in the combo box. Alt+I Category: General Allgemein TikZ Commands Parse error at line %1, column %2: %3 Cannot parse the TikZ commands file. options variable list first first+step last value1 text1 value2 text2 color name x y text x1 y1 x2 y2 x3 y3 width height end point half width half height start angle end angle bend coord math expression part name arrow tip kind color name core color end label north/south/... nodes ctrl1 ctrl2 function xcoord ycoord degree radius x4 y4 corner start angle dimension value rectangle/circle/... style fraction rectangle/circle/coordinate round/rect/butt round/bevel/miter factor inset number dim axis/radial/ball/... ratio degrees a11 a12 a21 a22 x0 y0 coordinate dash pattern dash phase zigzag/brace/triangles/coil/expanding waves/bump/saw number or dimension or coordinate number or dimension dx dy path code &Draw Draw &to Next Point &Specifying Coordinates &Curves Assignments using &let &Nodes &Arrows &Options &Styles &Node Options &Positioning &Style &Line Options &Plot Options &Opacity &Dash Patterns S&hade Options &Snaked Lines Options &Path Options &Transformations on Subsequent Objects in Path Para&bola Options &Grid Options &To Options \foreach with iteration \foreach with custom text Specify &coordinate &Node &Clip and draw the clipping contours Draw &line between two points Draw p&olygon &Clip rectangle &Move to point &Move to relative point &Line to &Line to relative point &Line to node &Line to node with anchor &Edge to &Edge to (with options) C&urve to C&ycle &To &Node (with options and name) &Plot &Function &Plot function &Absolute point Point &relative to initial position Point &relative to previous position &Polar coordinates &Intersection of two lines &Rectangle &Circle &Ellipse &Arc &Parabola &Sine curve in [0, pi/2] &Cosine curve in [0, pi/2] &Grid &Let Let &number Let &point &Child C&hild node Node &part Set &distance between nodes Set parent &anchor Set child &anchor Set node tree &grow direction Set &label Set &pin (label with connecting edge) &Shorten start of line &Shorten end of line Define c&olor Set &definition Define st&yle Add to st&yle Define style for every &path (standalone) Define style for every &node (standalone) Define style for every node with a certain &shape (standalone) Define style for every node with a certain &shape (as option) Append style for every node with a certain &shape (as option) Define style for every &path (as option) Define style for every &node (as option) Define style for every &edge (as option) Define style for every n&ode part (as option) Define style for every node &label (as option) Define style for every node &pin label (as option) Define style for every node &pin edge (as option) Define style for every &join (as option) Define style for every &picture (as option) Define style for every &to path (as option) Append style for every &path (as option) Append style for every &node (as option) Append style for every &edge (as option) Append style for every n&ode part (as option) Append style for every node &label (as option) Append style for every node &pin label (as option) Append style for every node &pin edge (as option) Append style for every &join (as option) Append style for every &picture (as option) Append style for every &to path (as option) Set node at &start of path Set node very near &start of path Set node near &start of path Set node &midway path Set node near &end of path Set node very near &end of path Set node at &end of path Set relative &position of node on path Set &text in node justified Align &text in node to the left Align &text to the left without hyphenation Center &text in node Center &text without hyphenation Set &text width in node Set &text height in node Set &text depth in node Set minimum &height of node Set minimum &width of node Set &separation between text and node shape Set &separation outside node shape Set &distance between node and its label Set &distance between node and its pin label Set &pin edge options Set node &sloped in the direction of path Set &shape of node &Double line &Distance between the two lines of a double line Specify shape of line &end Specify shape of line &joins Maximal length of m&iter join &Equal lines &Alternating lines S&hift dash start S&hift horizontally S&hift vertically S&hift to a point &Cancel all transformations except shift &Rotate by angle &Rotate around a point S&cale horizontally S&cale vertically S&cale in both directions &Flip horizontally &Flip vertically &Slant horizontally &Slant vertically C&oordinate transformation Parabola with specified &width and height Draw "subdued" &grid with specified step "to" curved with &label "to" curved with to &path &Define style for every to TikzEditorView <p>Enter your TikZ code here. The code should begin with \begin{tikzpicture} and end with \end{tikzpicture}.</p> Enter your TikZ code here. The code should begin with \begin{tikzpicture} and end with \end{tikzpicture}. <p>Geben sie hier TikZ code ein. Der code sollte mit \begin{tikzpicture} beginnen und mit \end{tikzpicture} schließen.</p> Undo the previous action Die letzte Aktion rückgängig machen &Undo &Rückgängig Redo the previous undone action Die letzte Aktion rückgängig machen Re&do Wie&derholen Cut the current selection's contents to the clipboard Die derzeitige Auswahl in die Zwischenablage ausschneiden Cu&t &Ausschneiden Copy the current selection's contents to the clipboard Auswahl in die Zwischenablage kopieren &Copy &Kopieren Paste the clipboard's contents into the current selection Inhalt der Zwischenablage in die derzeitige Auswahl einfügen &Paste &Einfügen Select &All &Alles auswählen Select all the content Gesamten Inhalt auswählen <p>Undo the previous action.</p> <p>Die letzte Aktion rückgängig machen.</p> <p>Redo the previous undone action.</p> <p>Die letzte Aktion rückgängig machen.</p> <p>Cut the current selection's contents to the clipboard.</p> <p>Die derzeitige Auswahl in die Zwischenablage ausschneiden.</p> <p>Copy the current selection's contents to the clipboard.</p> <p>Auswahl in die Zwischenablage kopieren.</p> <p>Paste the clipboard's contents into the current selection.</p> <p>Inhalt der Zwischenablage in die derzeitige Auswahl einfügen.</p> <p>Select all the content.</p> <p>Gesamten Inhalt auswählen.</p> &Indent... &Einrücken... Indent the current line or selection Die aktuelle Zeile oder Auswahl einrücken <p>Indent the current line or selection.</p> <p>Die aktuelle Zeile oder Auswahl einrücken.</p> C&omment K&ommentar Comment the current line or selection Die aktuelle Zeile oder Auswahl auskommentieren <p>Comment the current line or selection.</p> <p>Die aktuelle Zeile oder Auswahl auskommentieren.</p> Unco&mment Ko&mmentar aufheben <p>Uncomment the current line or selection.</p> <p>Den Kommentar aufheben.</p> Ctrl+I Edit|Indent Strg+E Ctrl+D Edit|Comment Strg+D Ctrl+Shift+D Edit|Uncomment Strg+Shift+D Uncomment the current line or selection Den Kommentar aufheben &Find... &Suchen... Look up a piece of text in the document Nach einem Stück Text im Dokument suchen Find &Next &Nächstes Search the next occurrence of a text Nach dem nächsten Vorkommen des Textes suchen Find Pre&vious &Vorheriges Search the previous occurrence of a text Nach dem vorherigen Vorkommen des Textes suchen &Replace... E&rsetzen... Search and replace a piece of text in the document Ein Stück Text im Dokument suchen und ersetzen &Go to Line... Zu Zei&le gehen... Ctrl+G Edit|Go to Line Strg+G Go to a certain line in the document Zu einer bestimmten Zeile im Dokument springen <p>Look up a piece of text in the document.</p> <p>Search the next occurrence of a text.</p> <p>Search the previous occurrence of a text.</p> <p>Search and replace a piece of text in the document.</p> <p>Go to a certain line in the document.</p> &Edit &Bearbeiten Edit Bearbeiten Indent Einrücken End of document reached. Continue from the beginning? Ende des Dokuments erreicht. Am Anfang des Dokuments weitermachen? Beginning of document reached. Continue from the end? Anfang des Dokuments erreicht. Am Ende des Dokuments weitermachen? Replace this occurence? Dieses Vorkommen ersetzen? TikzHighlighter Environments Umgebungen Comments Kommentare TikzPreview <p>Here the preview image of your TikZ code is shown. You can zoom in and out, and you can scroll the image by dragging it.</p> Here the preview image of your TikZ code is shown. You can zoom in and out, and you can scroll the image by dragging it. <p>Hier wird die Vorschau des TikZ codes angezeigt. Sie können vergrößern und verkleinern, sowie scrollen indem sie mit der Maus das Bild ziehen.</p> Zoom &In Ver&größern Zoom preview in Vorschau vergrößern <p>Zoom preview in by a predetermined factor.</p> Zoom preview in by a predetermined factor. <p>Vorschau um einen bestimmten Faktor vergrößern.</p> Zoom &Out Ver&kleinern Zoom preview out Vorschau verkleinern <p>Zoom preview out by a predetermined factor.</p> Zoom preview out by a predetermined factor. <p>Vorschau um einen bestimmten Faktor verkleinern.</p> &Zoom &Previous image V&origens Bild Alt+Left View|Go to previous page Alt+Links Alt+Right View|Go to next page Alt+Rechts Generating image tikz preview status Show previous image in preview Vorheriges Bild in der Vorschau anzeigen <p>Show the preview of the previous tikzpicture in the TikZ code.</p> Show the preview of the previous tikzpicture in the TikZ code. <p>Vorschau vom vorangegangenen tikzpicture im TikZ code anzeigen.</p> &Next image &Nächstes Bild Show next image in preview Das nächte Bild in der Vorschau anzeigen <p>Show the preview of the next tikzpicture in the TikZ code.</p> Show the preview of the next tikzpicture in the TikZ code. <p>Vorschau vom nächsten tikzpicture im TikZ code anzeigen.</p> Select or insert zoom factor here Zoom Faktor auswählen oder eingeben <p>Select the zoom factor here. Alternatively, you can also introduce a zoom factor and press Enter.</p> Select the zoom factor here. Alternatively, you can also introduce a zoom factor and press Enter. <p>Wählen Sie hier den Zoom Faktor aus. Sie können auch einen Zoom Faktor eingeben und Enter drücken.</p> View Anzeigen TikzPreviewController E&xport E&xportieren Export image to various formats Bild exportieren <p>Export image to various formats.</p> &Encapsulated PostScript (EPS) Export to EPS <p>Export to EPS.</p> &Portable Document Format (PDF) Export to PDF Nach PDF exportieren <p>Export to PDF.</p> Portable Network &Graphics (PNG) Export to PNG Nach PNG exportieren <p>Export to PNG.</p> &Stop Process Proze&ss abbrechen Escape View|Stop Process Escape Abort current process Den aktuellen Prozess abbrechen <p>Abort the execution of the currently running process.</p> <p>Die Ausführung des laufenden Prozesses abbrechen.</p> S&hell Escape Enable the \write18{shell-command} feature <p>Enable LaTeX to run shell commands, this is needed when you want to plot functions using gnuplot within TikZ.</p><p><strong>Warning:</strong> Enabling this may cause malicious software to be run on your computer! Check the LaTeX code to see which commands are executed.</p> <p>Enable LaTeX to run shell commands, this is needed when you want to plot functions using gnuplot within TikZ.</p><p><strong>Warnung:</strong> Diese option kann zur Auführung von Schadcode führen! Überprüfen sie den LaTeX code um zu sehen welche Kommandos ausgeführt werden.</p> &View &Anzeigen Run Ausführen All files Alle Dateien Export Image EPS image PDF document PNG image Export image Bild exportieren A file named "%1" already exists. Are you sure you want to overwrite it? &Overwrite Do you want to overwrite an existing file - warning box &Cancel Do you want to overwrite an existing file - warning box Abbre&chen The file "%1" could not be overwritten. The image could not be exported to the file "%1". Template file could not be copied to a temporary file "%1". TikzPreviewGenerator Gnuplot cannot be executed. Either Gnuplot is not installed or it is not available in the system PATH or you may have insufficient permissions to invoke the program. Warning: could not load LaTeX logfile. Warnung: Konnte die LaTeX Logdatei nicht öffnen. Process aborted. Prozess abgebrochen. Process finished successfully. Prozess erfolgreich beendet. Error: loading PDF failed, the file is probably corrupted. Fehler: konnte PDF nicht laden, die Datei ist wahrscheinlich beschädigt. Error: run failed. info process Fehler: Durchlauf fehlgeschlagen. Error: run failed. Fehler: Durchlauf fehlgeschlagen. Running... Verarbeitung... ktikz/app/configeditorwidget.ui0000660000175000017500000002335511455414611021357 0ustar fhackenbergerfhackenberger ConfigEditorWidget Configure Editor Editor <p>Select the font of the main text.</p> Text &font: generalFontButton 0 0 <p>Select the font of the main text.</p> true <p>Select the font of the main text.</p> Choose... <p>Show white spaces in the text by replacing them with special symbols. These symbols will not be saved on disk.</p> Show &white spaces false <p>Select the color in which the spaces will be shown.</p> &Use color: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter whiteSpacesColorButton false <p>Select the color in which the spaces will be shown.</p> <p>Show tabulators in the text by replacing them with special symbols. These symbols will not be saved on disk.</p> Show &tabulators false <p>Select the color in which the tabulators will be shown.</p> U&se color: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter tabulatorsColorButton false <p>Select the color in which the tabulators will be shown.</p> <p>If the cursor is on a bracket ({[]}), then the corresponding opening/closing bracket will be highlighted.</p> Show matching &brackets false <p>Select the color in which the highlighted brackets will be shown.</p> Use c&olor: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter matchingBracketsColorButton false <p>Select the color in which the highlighted brackets will be shown.</p> <p>When the first letters of a TikZ command are typed in the text, a list of possible completions will be shown.</p> Use command &completion Qt::Vertical 20 20 ColorButton QToolButton
../common/utils/colorbutton.h
showWhiteSpacesCheck toggled(bool) colorWhiteSpacesLabel setEnabled(bool) 102 78 226 79 showTabulatorsCheck toggled(bool) colorTabulatorsLabel setEnabled(bool) 102 107 226 108 showMatchingBracketsCheck toggled(bool) colorMatchingBracketsLabel setEnabled(bool) 102 136 226 137 showWhiteSpacesCheck toggled(bool) whiteSpacesColorButton setEnabled(bool) 73 69 251 61 showTabulatorsCheck toggled(bool) tabulatorsColorButton setEnabled(bool) 66 100 251 101 showMatchingBracketsCheck toggled(bool) matchingBracketsColorButton setEnabled(bool) 88 131 251 131
ktikz/app/CMakeLists.txt0000660000175000017500000000667511455414611017706 0ustar fhackenbergerfhackenbergerset(KTIKZ_DATA_INSTALL_DIR ${DATA_INSTALL_DIR}/ktikz) set(KTIKZ_TRANSLATIONS_INSTALL_DIR ${KTIKZ_DATA_INSTALL_DIR}/locale) set(KTIKZ_TEMPLATES_INSTALL_DIR ${KTIKZ_DATA_INSTALL_DIR}/templates) add_definitions(-DKTIKZ_TRANSLATIONS_INSTALL_DIR=\\\"${KTIKZ_TRANSLATIONS_INSTALL_DIR}\\\") add_definitions(-DKTIKZ_TEMPLATES_INSTALL_DIR=\\\"${KTIKZ_TEMPLATES_INSTALL_DIR}\\\") include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../common ${CMAKE_CURRENT_SOURCE_DIR}/../common/utils ) set(ktikz_SRCS configappearancewidget.cpp configeditorwidget.cpp configgeneralwidget.cpp configdialog.cpp editgotolinewidget.cpp editindentdialog.cpp editreplacewidget.cpp editreplacecurrentwidget.cpp ktikzapplication.cpp loghighlighter.cpp logtextedit.cpp main.cpp mainwindow.cpp tikzcommandinserter.cpp tikzcommandwidget.cpp tikzdocumentationcontroller.cpp tikzeditor.cpp tikzeditorhighlighter.cpp tikzeditorview.cpp ../common/templatewidget.cpp ../common/tikzpreview.cpp ../common/tikzpreviewthread.cpp ../common/tikzpreviewcontroller.cpp ../common/tikzpreviewgenerator.cpp ../common/utils/action.cpp ../common/utils/colorbutton.cpp ../common/utils/filedialog.cpp ../common/utils/lineedit.cpp ../common/utils/recentfilesaction.cpp ../common/utils/selectaction.cpp ../common/utils/standardaction.cpp ../common/utils/toggleaction.cpp ../common/utils/url.cpp ) # dirty hack: use qt4_wrap_ui to let Qt translate the .ui files instead of KDE (to have less duplication in the translation effort) #kde4_add_ui_files(ktikz_SRCS qt4_wrap_ui(ktikz_UI_FILES configappearancewidget.ui configeditorwidget.ui configgeneralwidget.ui editgotolinewidget.ui editindentdialog.ui editreplacewidget.ui ../common/templatewidget.ui ) kde4_add_kcfg_files(ktikz_SRCS ../common/settings.kcfgc) qt4_add_resources(ktikz_SRCS ktikz.qrc) file(GLOB ktikz_TS_FILES qtikz_*.ts) qt4_add_translation(ktikz_QM_FILES ${ktikz_TS_FILES}) kde4_add_app_icon(ktikz_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/icons/hi*-apps-ktikz.png") # add icons for win32 and mac; this command assumes that the first arg is of the form _SRCS # dirty hack: use qt4_wrap_ui to let Qt translate the .ui files instead of KDE #kde4_add_executable(ktikz ${ktikz_SRCS} ${ktikz_QM_FILES}) kde4_add_executable(ktikz ${ktikz_SRCS} ${ktikz_UI_FILES} ${ktikz_QM_FILES}) target_link_libraries(ktikz ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KTEXTEDITOR_LIBS} ${POPPLER_QT4_LIBRARIES}) install(TARGETS ktikz DESTINATION ${BIN_INSTALL_DIR}) install(FILES ktikzui.rc DESTINATION ${DATA_INSTALL_DIR}/ktikz) install(FILES ../common/ktikz.kcfg DESTINATION ${KCFG_INSTALL_DIR}) install(FILES ktikz.desktop DESTINATION ${XDG_APPS_INSTALL_DIR}) install(FILES ${ktikz_QM_FILES} DESTINATION ${KTIKZ_TRANSLATIONS_INSTALL_DIR}) install(FILES ../examples/template_example.pgs ../examples/template_example2.pgs ../examples/beamer-example-template.pgs DESTINATION ${KTIKZ_TEMPLATES_INSTALL_DIR}) add_subdirectory(icons) add_custom_target(uninstalldirs_app) add_custom_command(TARGET uninstalldirs_app POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove_directory ${KTIKZ_TRANSLATIONS_INSTALL_DIR} COMMAND ${CMAKE_COMMAND} -E remove_directory ${KTIKZ_TEMPLATES_INSTALL_DIR} COMMAND ${CMAKE_COMMAND} -E remove_directory ${KTIKZ_DATA_INSTALL_DIR} COMMAND ${CMAKE_COMMAND} -E remove_directory ${DATA_INSTALL_DIR}/ktikz COMMENT "Removing directories ${KTIKZ_TRANSLATIONS_INSTALL_DIR} ${KTIKZ_TEMPLATES_INSTALL_DIR} ${KTIKZ_DATA_INSTALL_DIR} ${DATA_INSTALL_DIR}/ktikz" VERBATIM) ktikz/app/configdialog.h0000660000175000017500000000534611455414611017736 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008, 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_CONFIGDIALOG_H #define KTIKZ_CONFIGDIALOG_H #ifdef KTIKZ_USE_KDE #include #else #include #endif class QLabel; class QListWidgetItem; //class QTabWidget; class QTextCharFormat; class ConfigGeneralWidget; class ConfigEditorWidget; class ConfigAppearanceWidget; #ifdef KTIKZ_USE_KDE class ConfigDialog : public KPageDialog #else class ConfigDialog : public QDialog #endif { Q_OBJECT public: ConfigDialog(QWidget *parent = 0); void readSettings(); void writeSettings(); void setTranslatedHighlightTypeNames(const QStringList &typeNames); void setHighlightTypeNames(const QStringList &typeNames); void setDefaultHighlightFormats(const QMap &defaultFormatList); signals: void settingsChanged(); private: #ifndef KTIKZ_USE_KDE QWidget *centerWidget(); #endif void addPage(QWidget *widget, const QString &title, const QString &iconName = 0); QWidget *generalPage(); QWidget *editorPage(); QWidget *appearancePage(); void keyPressEvent(QKeyEvent *event); // QTabWidget *m_pagesTabWidget; // QStringList m_pageTitles; #ifndef KTIKZ_USE_KDE QList m_pagesListWidgetItems; QLabel *m_pagesTitleLabel; QList m_pageWidgets; #endif ConfigGeneralWidget *m_configGeneralWidget; ConfigEditorWidget *m_configEditorWidget; ConfigAppearanceWidget *m_configAppearanceWidget; private slots: #ifndef KTIKZ_USE_KDE void setCurrentPage(int page); #endif void accept(); }; #endif ktikz/app/aboutdialog.h0000660000175000017500000000270611455414611017600 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H #include class AboutDialog : public QDialog { Q_OBJECT public: AboutDialog(QWidget *parent = 0); }; #endif ktikz/app/qtikz.rc0000660000175000017500000000005511455414611016620 0ustar fhackenbergerfhackenbergerIDI_ICON1 ICON DISCARDABLE "icons/qtikz.ico" ktikz/app/ktikz.desktop0000660000175000017500000000056011455417212017660 0ustar fhackenbergerfhackenberger[Desktop Entry] Type=Application Name=KTikZ Exec=ktikz Icon=ktikz Terminal=false MimeType=text/x-pgf;text/x-tex; Categories=Qt;KDE;Office; GenericName=TikZ editor GenericName[fr]=Éditeur TikZ Comment=Program for creating TikZ (from the LaTeX pgf package) diagrams Comment[fr]=Programme pour créer des diagrammes TikZ (du paquet LaTeX pgf) X-DocPath=ktikz/index.html ktikz/app/editindentdialog.h0000660000175000017500000000314211455414611020610 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef INDENTDIALOG_H #define INDENTDIALOG_H #include "ui_editindentdialog.h" class IndentDialog : public QDialog { Q_OBJECT public: explicit IndentDialog(QWidget *parent = 0, const QString &name = 0); ~IndentDialog(); int numOfInserts() const; QChar insertChar() const; private: Ui::IndentDialog ui; }; #endif ktikz/app/extract-tikzcommands.xq0000660000175000017500000000454211455414611021662 0ustar fhackenbergerfhackenberger(: XQuery script to extract all translatable strings from tikzcommands.xml : and obtain a .h file containing QT_TRANSLATE_NOOP("TikzCommandInserter", str) lines. : The translatable strings are the arguments of
, : and the options which are the strings between < and > : in the arguments of . :) declare variable $prefix := string("QT_TRANSLATE_NOOP("TikzCommandInserter", ""); declare variable $suffix := concat("")", codepoints-to-string(10)); (: The function below gets the list of options of one in the xml file :) declare function local:getOption($text as xs:string) { let $text := fn:replace($text, "<=", "") let $option := fn:replace($text, ".*<([^>]*)>.*", "\\1") let $option := fn:replace($option, " ", "<") (: dirty hack to keep the spaces in an option, since we have filtered out all < this is a good temporary replacement string :) return $option, (: get recursively the other options on the same line :) let $temp := fn:replace($text, "^[^>]*", "") let $temp := fn:replace($temp, "^>", "") return if (fn:contains($temp, "<")) then local:getOption($temp) else "" }; declare variable $doc := doc("tikzcommands.xml"); (: The function below gets the list of options of all s in the xml file :) declare function local:getOptionList() { for $text in ($doc//item/@description) return if (fn:contains($text, "<")) then let $options := fn:string-join(local:getOption($text), ' ') return $options else "" }; (: join all options in a space-separated list which is then turned into a : real list from which all duplicates are removed :) let $options := fn:string-join(local:getOptionList(), '') let $options := fn:tokenize($options, '\s') let $options := fn:distinct-values($options) for $option in $options let $option := fn:replace($option, "<", " ") (: dirty hack to keep the spaces in an option :) return fn:concat($prefix, $option, $suffix), (: get the titles of the
s and the names of the s :) for $text in ($doc/tikzcommands/@title, $doc//section/@title, $doc//item/@name) let $text := fn:replace($text, '\\', '\\\\') let $text := fn:replace($text, '"', '\\"') return fn:concat($prefix, data($text), $suffix) ktikz/app/logtextedit.cpp0000660000175000017500000000403611455414611020173 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "logtextedit.h" #include LogTextEdit::LogTextEdit(QWidget *parent) : QTextEdit(parent) { } QSize LogTextEdit::sizeHint() const { return QSize(300, 90); } void LogTextEdit::logUpdated(const QString &logText) { setPlainText(logText); } void LogTextEdit::logUpdated(const QString &logText, bool runFailed) { setPlainText(logText); setLogPalette(runFailed); } void LogTextEdit::setLogPalette(bool runFailed) { moveCursor(QTextCursor::End); if (runFailed) { QPalette failedPalette(QApplication::palette()); failedPalette.setColor(QPalette::Background, QColor(255, 102, 102)); setAutoFillBackground(true); setPalette(failedPalette); } else setPalette(QApplication::palette()); } ktikz/app/editreplacewidget.cpp0000660000175000017500000001005711455414611021324 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "editreplacewidget.h" #include #include #include "../common/utils/icon.h" #include "../common/utils/lineedit.h" ReplaceWidget::ReplaceWidget(QWidget *parent) : QWidget(parent) { ui.setupUi(this); ui.comboBoxFind->setLineEdit(new LineEdit(this)); ui.comboBoxReplace->setLineEdit(new LineEdit(this)); ui.pushButtonClose->setIcon(Icon("window-close")); ui.pushButtonBackward->setIcon(Icon("go-up")); ui.pushButtonForward->setIcon(Icon("go-down")); setFocusProxy(ui.comboBoxFind); connect(ui.pushButtonBackward, SIGNAL(clicked()), this, SLOT(setBackward())); connect(ui.pushButtonForward, SIGNAL(clicked()), this, SLOT(setForward())); connect(ui.pushButtonFind, SIGNAL(clicked()), this, SLOT(doFind())); connect(ui.pushButtonReplace, SIGNAL(clicked()), this, SLOT(doReplace())); connect(ui.pushButtonClose, SIGNAL(clicked()), this, SLOT(hide())); } ReplaceWidget::~ReplaceWidget() { } void ReplaceWidget::setBackward() { ui.pushButtonBackward->setChecked(true); ui.pushButtonForward->setChecked(false); } void ReplaceWidget::setForward() { ui.pushButtonBackward->setChecked(false); ui.pushButtonForward->setChecked(true); } void ReplaceWidget::setForward(bool forward) { if (forward) setForward(); else setBackward(); } void ReplaceWidget::hide() { setVisible(false); emit focusEditor(); } void ReplaceWidget::doFind(bool forward) { const QString currentText = ui.comboBoxFind->currentText(); if (currentText.isEmpty()) return; if (ui.comboBoxFind->findText(currentText) < 0) ui.comboBoxFind->addItem(currentText); emit search(currentText, ui.checkBoxCaseSensitive->isChecked(), ui.checkBoxWholeWords->isChecked(), forward); } void ReplaceWidget::doFind() { doFind(ui.pushButtonForward->isChecked()); } void ReplaceWidget::doReplace() { const QString currentText = ui.comboBoxFind->currentText(); if (currentText.isEmpty()) return; if (ui.comboBoxFind->findText(currentText) < 0) ui.comboBoxFind->addItem(currentText); const QString replacementText = ui.comboBoxReplace->currentText(); if (ui.comboBoxReplace->findText(replacementText) < 0) ui.comboBoxReplace->addItem(replacementText); emit replace(currentText, replacementText, ui.checkBoxCaseSensitive->isChecked(), ui.checkBoxWholeWords->isChecked(), ui.pushButtonForward->isChecked()); } void ReplaceWidget::setText(const QString &text) { ui.comboBoxFind->lineEdit()->setText(text); ui.comboBoxFind->setFocus(); ui.comboBoxFind->lineEdit()->selectAll(); } void ReplaceWidget::showEvent(QShowEvent *event) { ui.comboBoxFind->setFocus(); QWidget::showEvent(event); } void ReplaceWidget::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Escape) hide(); else if (event->key() == Qt::Key_Return) doFind(); QWidget::keyPressEvent(event); } ktikz/app/ktikz.qrc0000660000175000017500000000014111455414611016767 0ustar fhackenbergerfhackenberger tikzcommands.xml ktikz/app/icons/0000771000175000017500000000000011455415074016247 5ustar fhackenbergerfhackenbergerktikz/app/icons/document-export.png0000660000175000017500000000147111455414611022111 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڥOSQ{}DkStЁ2 &A(F!90( N4M00Ib& 1c AhQ㵶^Ͼ;xsߞ{_%!m]\\&A3܆,K$)Q 57HzO C`b0pzd2@ #M%OH/0 Qh "Ȥldx(O0z{ o---%@b6`uWWB( fgg^oxqqtIyU0dJp{||}4M4 z Vx tOXV1<$33_> H ^CAU9&ZX|ݿ: 8<;1q A jp|Ag$'] z%_e׬Mr\[ '.(pIENDB`ktikz/app/icons/image-x-eps.png0000660000175000017500000000157611455414611021076 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxڥ?LQǿz-ZK j`D.nƕ`LRIL1Agi  ,:Ѣ0!PiIM-^y/?~oޟ\?o'C1p&Pv'&'c!WuBA 2GQ2l]}}}֜AvsX7%C4'dj,20d9'W>\B$%`oV:&B$"vܾS:v±[aO/}0Np 0ىx>,߂qb~`_+$ -m#`_w@r6YP!L`#E[AGh2S 8{ǼpZ!n{dMЈVNwh 4-#eh*Th%M[EzaxtG!C!)w?Zl }RJi27۫ ZE U jr+b]*԰u KO47 V(fS{cKPZӰOtP2T! LViDn|?FߐX8`h~hA.C8F"c[,`)]f2tffn<ŘV*Uë;*S49??Ib-q \)O@P/ k)IENDB`ktikz/app/icons/edit-cut.png0000660000175000017500000000110011455414611020457 0ustar fhackenbergerfhackenbergerPNG  IHDRnsBITUF pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxڕOHqtahKCCRz AyPt < g#b a%f[Pα-7(lsH;1HnbsG}| 7'ű3ƔM6 ӝ黣aPA^٭Ic?T =B)lEJK˸ki\mKR-C-C^DHU]aeq7 '    " & 0 : " $(09=CGLX`dht7 '    & 0 9 "F65 !43   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_yz|~+labd-ojfne{mgrt`hs.ux"#()%&20156,p'*/wv} kq 2 Prociono,ch8\2z %+1<GQ[agmsz )+-8CIOU[agmsz *7BMXcioy !%(+.38;IT]fosofthyphenAmacronamacronAbreveabreveCacutecacuteCcircumflexccircumflexCdotaccentcdotaccentCcaronccaronDcarondcaronEmacronemacronEbreveebreveEdotaccentedotaccentEcaronecaronGcircumflexgcircumflexGbrevegbreveGdotaccentgdotaccentHcircumflexhcircumflexItildeitildeImacronimacronIbreveibreveIdotaccentIJijJcircumflexjcircumflexLacutelacuteLcaronlcaronNacutenacuteNcaronncaronOmacronomacronObreveobreveOhungarumlautohungarumlautRacuteracuteRcaronrcaronSacutesacuteScircumflexscircumflexTcarontcaronUtildeutildeUmacronumacronUbreveubreveUringuringUhungarumlautuhungarumlautWcircumflexwcircumflexYcircumflexycircumflexZacutezacuteZdotaccentzdotaccentlongsuni0237gravecmbacutecmbcircumflexcmbtildecmbmacroncmbbrevecmbdotaccentcmbdieresiscmbringcmbhungarumlautcmbcaroncmbcedillacmbhyphentwouni2011horizontalbarEurof_ff_if_lf_f_if_f_ls_tcircumflex.capcommaaccentacute.capcaron.capgrave.caphungarumlaut.capuni2014.altc_tf_tf_f_t2.3This font has been released into the public domain by its author, Barry Schwartz. This applies worldwide. In some countries this may not be legally possible; if so: Barry Schwartz grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.ProcionoProcionoh  !"#$%&'()*+,-./0123456789:;<=>?@|BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abfj}srx{~:oAuiwvpqtyzklD#&\}QoFxnRJ*  8 X z +   1 _ + W t ,Q"<@h1G>R[_"4Zsy}46 ? y !X!"#"L"u"""#)$P% %R%%&)&V&&&''F'n'''((())W)z**K***+#+c,,,--0-c----.%.M.v...///0-0o00011<1o1112292[2223S334404v4455?5566I667 787\77778'898o8889(9V999::W::::; ;U;<=D=}==>>8>b>>>?"?o???@@S@@@A6ApAAABB8BcBBBC*CdCCCDD%D7DJDeDuDDDDDDEEE1EMEfEzEEEEEEEEFF!F:FTFlFGHH-HIIBIIJK(KLM4MNN$N8NLN`NNO@OQDC$$uCC߁2zb"7գ\pch~& _|IIv! 0v! 77ɁЪ~7aB`Žǒ`C`ʒڋ2㋕.Ԑ—Us?l+—Rs?l?_؋.=.~5˴N.pu<kxois|{x؊<֘AI.zx`}Ǝx|tpkb5[oueN~wppεēfp.|w^aoq\=d=33ߵ3JՋҒf-{fntouvdP踍gMHzrQg[ sf 2KՋҒe-{fntpuudP蹌hMGzsQg[eyavuY8VWTZSЋዛv CHNWGrbabarjYUxChJP> 5|P|}n$>@A\NRrlɊ]K(Yp8 pn?d5?pnifދ !;vy|9n߲苜W[GEL.B2_׷;1]y +L6뷲Ëˋ-5xyy3oٷs=o}8Do_"PO("~~Uw]1,Ίm`iMtXf^&5C.a/:<$unhlii_11]]7N!._x㒫؊?Sb`q~}}kayËͅ"(2~~zwwP,-72+glo_ ͸xNwWp[gBT Ӌwc%2j%9{>גjaHCO~Qm@>($x}}y{|knYzDT|DV8' gDiҋC75a1b+TfP,نԭvmf5?b:/R7خJƵָ]=QcYHmAX̋`p0h>,L?si+Bf!& Y] '_SZ`y|r` w߁2M2  M2F`? " wng??`a@@$ }$ w`angN??2 +U.tmc}wPilo6kY*ue[d{I #z{^} _#;.5):v)kċ󤴛cJ}NLY<39)g10<]t̠uhlnOi9-"E߀Ih˾,z(0G YB~v[8P߀cXQfZcTLiWw% r& مȻ';ƍ SͬrKw\.WPpfk' P򋦋؍̍X&"DX["d܍o VtK ,c5ЍQňnOuN|oLg`]؋c0/+gę{-ecYfQxZƎxpHN>R8Htxb)OeRКQ? @ A B C B}]D E ͋׼ eVRS b9w\-VQofkG55_&iecZYՎfDUW'%Pc{B}]e7s0Uk_Hpf,jR1n@fSp9E 티Խ'3 F ' SG W|v5CNH I J Rc%dkK L M N O ދN}# LQP Q R GvQQtfˋ‘dӄnsH)f,NAvQ$QS ֋,t\h $wv[pf\9o>ytdͅxxG"@%'7pfza_M"Wrtvwlswً.QT 勽v3խdU a;U&Yeo^xww]=ʋ_=a;?igx^oeYj]]&wȗ??gnE~D)`TD]$h$_h7fUGkoovs.)Kl8 V W X g|(iwjԋ11Idtɑʋq0wqPb|)5ӱp%~axMm]WO|}Y _|#iw.Z [ \ ] #|[,m^ _ b5 .:T` эD k9F0F/&2|+`WvV??f耕8a b c d e Ȁf g 5lwih G,-i P-j j-k @l Nzw1QjΈg4D!L}ilUËċth}宏tggfft}^ ^Pc|)Uw-m n o 6VT0eq~~^i`Z|Î֋reSnYS}Xi`[ħ㋍kKB]LXi`Yދs2HI]irUifZViRkypgqC6+bp q r Uz%s t z_7+1jɏ])-r}~_k`Y􋧎͌ȓ}Z Yg+zDPThzc|(3ÏˌͶͼ]WitQU+ڇh{srzryi~jOPA2-u Lz7HNv w |Tx |[wi30y z { | |cTTocc~kkw_|=KCjؙo夰kecoTc>Yj~k}d[gvAg[xdukc}kk͈@iß͋L׋ԋ˝VgZws@UB?Jb]j^ߖvÌ}"j}As{\D}ApvsaZv\^bi]omv>ϝȴvIGIxw_ IOb1jcxGMrqtZbV"7{ދ8ImNY Zj:Z݊ n{KwzeAKoY1}ăhp7hgˎ΋vqgتYXQ-k~w耗yM}ݐoRfQd}hnpudfENUeXhTdtpAߦ٢WE87kScjD O ayYGI$8$Q )^V W X .)˷JKV8$ 3`V W X .)Kw98$ \uV W X .)K=8& O ЀV W X .)˱K᳅835$  @7V ĀW ȀX Q`0Klm LG苖QauZ[ZtNaЗA`^Ypdk{d3e*i镩ҋyGss,i=X C_ |!ɨ^bi]omrFyywmxGe]_ v:@Hnsv|}#ۋċ~rK IO[`yy g#|[,̯]jf_ Li^ _ #|[,̮]gPS 5^ _ #|[,̺Jh '^ _ #|[,sO O #^ _ G]yf6y_ _j G]gL Yj GJ4 j Gzj d O 6+h>$,  p q r Uz%Ҭ]f(_ 8[s t Uz%ҫ]gu(g Is t Uz%ҷJ* s t Uz%{p( <s t Uz%t, O s t Uz%DgmNyӑeWhkKokmSVfQ{qrPEONj9q}U;n_C,e_lz{glr|G]Uf30(_ %my z { | |G]ga30(r \:y z { | |GJzy30(5 8y z { | |G^`30, O Ѐ'y z { | <]cg\ `c c=~ < [ p  O $~ LiC % r& .)K\8$  .V W X LiC& ?% r& .)KH8$ B V W X z ɾBU{wk( a( ) }Ь]gi(N 0Y z ɶ+k( Q( ) }иJ( ,Y z dk( ( ) }˩N 0)Y z ɵ,k( ( ) }дJo(` Y aS%`"  D9ƍ* T+ B' O, |#iw."Z{uzel]}ϡtrmuxuYxhZ [ \ ] Ћfڶg |­e U- r. *2/ 0 #|[,n "5^ _ Ћfڶg zc& }?- r. *2/ 0 #|[,Z B %e^ _ Ћfڶg  - r. *2/ 0 #|[,S 5#^ _ Ћfڶg ír m9- r. *2/ 0 #|[,̶JV `  ^ _ Nzrɶ1Z Q1 2 +`WvȹJV?zOf  ,a @b  c d e  f @g Nzr#Z& 1 2 +`WvV?pAfB  <a @b  c d e  f @g NzrjZ 1 2 +`WvV?fV  Lla @b  c d e  f @g (# 3 4 5 6 ' 5lJ U]gV- Qm n o f*#?̰; U< = > "Q" +P-m n o BT" b)BO6{R$ ? @ A B C 6Ԭ]+gC$ r5p q r b)O R$ |? @ A B C 6ԴJ+I$K` Fp q r B}  |D E Uz%" 's t B}& D E Uz%( B 9Ws t B}ɿB{[{7$Z (K yiD E Uz%ҫ]g( K ,s t }fZI%c9uƋ^<If}Ue{MruGq \(-+nv:Oŋċŋ3]rzW9티ԽB'{w g3 F ' SG A2֮]mgo(7 u 티Խ'z^ V93 F ' SG A2ֶJ-0` -u W|l ˽BC{JNi 0H I J Lz7Ƭ]γgDN(,  qv w W|l ˵CkN? H I J Lz7ƸJv\N( ]sv w W|l ˴CnN@ H I J Lz7ƴJlJN(` Lv w R(E%dP ɀhbK L M N ɀO ދ'|ëTx }" N}# ҵL( rP Q R |GQ\30(  )#y z { | N}# L( RP Q R |Gr30(- $9y z { | N}# L(& P Q R |Gpk30(+B Liy z { | N}#  L6  ȀMP Q ȀR |G䛵᳨306V$  @j4y z Ȁ{ | N}#B {[{*L$v (K P Q R |G]ag30( K :y z { | A<P(* *S |J ;} ً.m0 T ,:x`skT 5 .:.:쀩T` эDpAhPBi'эD k9F.F*$o k9F0F/&2|2áw b=TAhPBi'ċэDCy} ddEi|_t >uC β׋q/ʁ,ZR:2|2 .l:TAhPBi'  :؋ŋΉ80F/&2|2áw:b=TAhPBi'ċэDpAhPBi'ċэDCy} ddEi|_t >uC β׋q/ʁ,WQ7o k9F0F/&2|2 .:.l:T` эDpAhPBi'@ 䀚 @:؋ŋΉ8.F*$o k9F0F/&2|+zMe[簉`jG͋\hoP Zs|zx݋ēNN ׋EmUn ۮlgl@ 83)#V uuo7npbI~wpp** " B{ : B{K Bc{[{ K GA4a|E[X$j^^bi]omu拿ֻvEDHw "tj?ۮmf ^:6)#U utp|^c*2rqtZbV|S5:~TAhPBi'ċэDq 6G#Ovkxtycʎ݋:t8q k9F0F/&2|>|S5:.:}TAhPBi'ċэDpAhPBi'эDq 6G#O拣vkxtycʎ݋:t8q k9F0F(&o k9F0F/&2|tyaa 8|&FR^Fh|*R_ 0LgUx0D_pGf G  1 P ^ ~ > Q   5 | - 3;Z&$.:f 0H_{$CUg惦5frqqW vyxxy sic_cjauykQ t€g ^R `\xz{_mrwjVgiY{{ YdL1O  [ecY $2Ṛ(f}Ue|_blZwRWakن)ʋW| #fkE13/fk >#fk kìř MIfk v.[ZIP If}Ue{Mru ~.|vCq >#fk UsffV ~Fk qgkg`g_a S-> e჎|`j7Y 2a}EQ e7sŋ$ҋf,jR1n@fSp9 {}>s zYڌ ŐO?> NVeQZhԮYQ F  ņi[G`gpWo}wiwds[qR B{ Jmnf{gDI' "<uZ[ZtNaЗA`>,:x`x}LD 3]szW9 AhPBi' *sW_owI  ry™Ë€ ڵmbq _au"54~p~nerJpm 5ql|ny XXk ϟfdH_W$O? ׂw2+woJGj jюXO-Oq}~^i`SҋB΢ϔt G;[iR[ˋ܎ҋNj|)bAu>`b|) ~\_|jvJ |_t b|)j;ddE ~\_|juJ z;ȋc|(j}3g0 J C؋zފ݊d|(jh[ +#AM%F~ ek #Pif[ &ƝVoUi`[u5_Ny8\yphqB eӑ>"SVfQ{qrPE ONjt_,e_lz{*J> /wGڥxS|Ym_uJLzohqCe˅jA G͋\hoP]s~ois|zx݋ēNN ׋u x`}Ǝx|qnu9k}Z<~wpp  6G#O拣vkxtycʎ݋:t/4z iNJ0,aI{PaՕ̑OѢ ^ ԓmc}(j8 \AldwxToxlɏ `z3 jzg1tUIQ1t~znm{{y{|iY{V$9x剗]P|yveq0DFLTlatnkernVt-""%%&&''//0011 33 44 55 66 7788::uz{{}  %%(("  ""((55667788::BBFF PP VVZZuz  &&))<"%&'/01345678:uvwxyz{}~%(Z ""BBFFNNQQSSWWXXZZ uz   BBCCFFIIQQWWXXZZ   #"BFNQSWXZuvwxyz{iV<28p<0T* -<JdJ2 ??< (#??8*4*QO8 . *}* 9`"'d'( m 5?B 3 *-O ,+!2Q81Q2a$6( q2}6( ?^( -8 IOOOO ******""""V(((((((3 ,,,,((***** * * Q5OO O O8.J 3  3 ***N*D  9-9-9-` ",",",",",+!!!Y~pr[5?^8E|BBBBBB44m?*EF- Xd-j?1ktikz/app/icons/go-next.png0000660000175000017500000000165411455414611020340 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;bKGD pHYs cytIME /9IDATxݔohVUǿ}={ 4*(i$6E %T,|")Bd( ^:TЬ)D)ksϞ{ۓ=̦"}/ps3t\o_'܇`,Z_/'=O]7uS׷ ^W4It1>.Q K^7mhX{-J=_@b,KF1t!O.\x㶯ZUel") iUE %;fLfsa7~GԼ]q]@*l k [kћ1rlnͷ%|GE&H<Ц^?l{[^GNˢq9p] !Pk!]B> cwy6켲D ߲D ? U$]"V #?([au|ԱH [0B@?gᆫrG/;aD:p4#-{Mr{hfD,ݺȾ\lo(:q4} ]ge֟޼AIENDB`ktikz/app/icons/go-up.png0000660000175000017500000000164111455414611020002 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;bKGD pHYs cytIME   >.IDATxڽKhWƿg#6ƤZk#j!bP؊sUw*`Ůtn( Zq. .Y`T|{wfΜ(<(f9s~3uKELSPc0R?w8ZE_]һx^9iH` 9rjX[KwWqƬ7[p,v~ˆeZCEd\~z΋YMXQTSGAkv!{>-ҤcqUQ1j,,>Վͨw?d++c8PFUnOL8p`a#PAF~g&=_86%uq6H %%f4BCH ^j_-4"|Y*)H$,$L6 €=`70Cs%kS҂@6Aڐ c #q(huḿ$9՜0PtDF#ҀpH ı$N_b<vVJΕފ'&q`Q KʄKS5gIAzM(G_/%݉}nG~&,0DCZyh}63jBpV abow~/~pO%N &MIG/x$$a)F9@Bf6&9A8{&<فAE׃ \?߄DY{xW N˯u׈a ABA(kg_wJHIENDB`ktikz/app/icons/hi16-apps-ktikz.png0000660000175000017500000000162711455414611021621 0ustar fhackenbergerfhackenbergerPNG  IHDRasRGBbKGD pHYs B(xtIME$GIDAT8}]h[e{s%i3"e.30v kt' v7^UE-VPtLZ뚴1W=Ir"??<}}}Gĕb2L񸷷H$=x\J)iRJn5CCC[` Y3PNR[Ӵ;A ZZZΌ5\π` !t5ӃI&@iB*2 PL4o(6Ml4lMoD7$Ѥ@b#k9>{T[@ NƟq-jf?NXe&''g===^~m^u>J#7? .̫`Q`z@(%*ϵ:Q=F8{}V= ç?&|+ns#)֕vU#[^իl)4oSZ@,Z1hlR,sۃqru/:A*SUx=E:NxiO\^d.~Iap>.8G:[uk$M-ϟp%]L&Iݜ?, Un0׊y*һKO8Gim Á/ kmٲ;DGSzJVv [^d%}#ܼ4) .OnjjjѬ-,,R֮XeRئiڹ\:77D"mw%u...ہzWK]n3APIENDB`ktikz/app/icons/go-previous.png0000660000175000017500000000161311455414611021231 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;bKGD pHYs cytIME 4$z,IDATxݓIhA_UwLY-&* x4ADA<EozS8B\.ndzz;&*z5 _S7_XZ1nJSɋ-UN4ͮntu/ 5"(7ͪ]c]Υo*ҚaWϮi;s͌xق'Əl^5V A0,fQ1oA bТ?nT%,^~h۪z(܂E^c!K D)h$P>}'h7gTvضBèT*L#r\.<,t/8;;C$!!h6̱7;wip$z(B(_}“1F677gzs4Mcm1NOOI+Ȳs&\ sssb.[TTɓa˖-=V^SN][dS>!.ΟR7o{A9{<ϧwtt@j`ò]9xJDSZw$•p tV ܽbŊ%`#Z)5(.[CR^km>JK/Ro@pe#H]F:;;pر$P(4x j~%Z$Dt2I)Ф;s_GƇDccc@ccc3~|5.BPAGhfB{nr;ixi Ǵ9A%kCGMo&%%%={`0x̶iI@o}}!z2fǏ,p@{rsضpIDzNwHaz"vԩSJ#KΝ;~_fݽCDy£'2zuOʚ׹}t &u"\|;wÇ`YiZeY ]֭[Τ?wLFS(=|kqĄ۳-R7j$rӺS\HB938$Ϟ@H'yAvRTT4:#F9òC -m[,7/izZ 4].$|7sxCʓz prņ Jĥ @xuBuN<#nR<#cK&z!]K1bs84>{7Ix@)fHD!Ν_ ;;"~iQVVVn@HѠ@8l*ޅk E|ܓ64АB \D9+"H#(;N;m~N:ņ ;8/UUUݑFBM"d=;z,FO .L)rPʑnzv`p \n K,N/W]I$ \Y=wPV7$?ޅR6*GҎ! `#PlNź_?±gT[ eg/a(ɟm_d[.9sH644ڶmIV@X]q*_ED @,ʸ|=>7JteHk~.~:vcHP ov6> 'LEKyP@6/G龖 BDUl9y)|Dp"RJ(PJ25,X,F[O*:NMƫ`30B([j468_Wj ﲇ}(5 =sv:4*ً)GA5qbnS5RyzgǶ-sÜNgU`hj»v'Dj_Cm`_k_@ bcu`ut >48| gJr{O¸i@7yP5CS+y!s֭rRbZW@Y pDؑ( F"#<~BrCOOgc}1YR .O@xWD}}}-YL-nG;z # ؛t9Q8 !(**$)ilߴys)v^T9h.O6 yDo 9J޻ w&132G =>DzsE0_EnvbX7Uvqb.j{H B2R ]匒{'{1D!{ޓ5¥KX(̛;8n^9EQN@'0 &(p\5KpR ˲lrCf}9"QtTe *g۫g۶m8 #mN.Ow A!pԚ X, EwY4w z gOec '9> ¯(G4p-1pI@+uvŽ>Ľr{5aѺ(eP: >jgot,w- SXt7g&2iT_8%SO4/}j?ۦ[6EVVOKG dFsvHn2}ypo@t 7pm#(G{Vi^:Gre3:_|X3SoLI$+=BQުfVq'jX^c׻8;>`wQQ,d}0[4$ 忏F!""ufᖘnۭ [Sn`l]KYG: wóY|x22D"b1$ea#e'H"Ą Cbgt:yy7Dg|Q> M  v9/ RH@0$N >M-r @Ν;zpfC=׿$6@Lhl6 3{3M˲0MLas8)&.?^;~4I{ =s_@zngZ r <Px0Mwg6o\o7ض{c։*͊i*҅#?1` &uӉBӴmea UUUnڴD Бz;*e  wB,%Q{>Ҽ~pr>IJ,RH)mmm۶m{tW*l(PmmmMAA@+UCsf\7\jR555GKR$4XF i};vؿt%aW6v͙qY"H$:kjj+++nٲ`ssskl_Zk TWWoZ65M3Y]]}?PQQqe9psccJDMM͇_}C -@!@_a +sKo;gZIENDB`ktikz/app/icons/run-build.png0000660000175000017500000000234311455414611020654 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<`IDATxڭUKoU=qJ$@ %HHEB,{6la`"HTB@iUVM؞=~̛s&5ZGs^+y )T^}omzMQTJۂm 2ad]ס*<4EJ$In?1ƣ1rG?4 :kg8l~ {H 6tL>y;=ùaq Erw86TUfLJ3 Z+\>!law.Sd|SKڥ({^4K`[60D-98Bfx|xvxɊj,O>i&)<ߧ}<ϣrXPItfN*3edzd9$%'YJbA1a˲x-ض*ac9(\vQB-I"X@T0HZA9QncEpI'1q JLChʊ2zFZe 8)P]b]KR((MISU@fCPN&cQO[$D#JU 2L'#ꁏxH K#jPiZؙyҳ4ayRh3cyI,,,b U ]lPe6Lfw#h=Is?}a0])%RIۖ&D4R"+`qqJII#ekPjXKT i^+)FgffQʮ"jnC25X_xD'&x\^nZ4"b}_!ݶ |HOQVa<7 z+QIp˲f!/sPQ=]tF %?WV'T$SA@0QH5mf)G…-{ mxԲH4isr$$&B D @H08-dPE;LEaZmG*`bR"4@C $Nrr>}ꏐ4Fo曵w}w~83--UV/))ټ`كSLYlٲ?3Cg""hjh 99/%2}lmm=*1B]15l$N 2N0gfWFj-N4Cq]}8~>mbD<$#3Hq4Bq!Suh^Rƾx:wNLftVclܷ99Hìɜ9[|S^Io3gE:[99Ŝ7r{KH=ɬs`H`p9S׸8y6.ыX!Js_䠛ss[r.Ob8{$v:<]nD"T r\k,AZQ(c)~hi =J)XEܢ-* Ej 77#բ嬝],$XY# "%@X`)] ~5[)Ky{D#gB؉ B+[%eLjG /&g@$+ՎÎ"xc(3|X!6l1E1J$;Qe6SJw raOxjs%cZ@jiB̽+WN$1qO{F-!y a !pJ)v)0Vրql39y${t6 V:yP:bn}{^RsW2Cu?T.6xQހr:@Р[0 _%OzI$ dca(j '4A@IENDB`ktikz/app/icons/zoom-in.png0000660000175000017500000000224711455414611020346 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;bKGD pHYs cytIME ({O4IDATxڵ_L[U0n-mdtpfMfH&dfK|$A3 &S7l#۔ ʟB<{0!|_N_=s^GFFl-H ALW_0ǒٳSHʂ $:VZp ޜ._&]7yW,[j^R$&wU ⍳ \278 x7gM8Jyzą*"8hN2̪㨡Ϡ}|xÁ8#LrfDI'(T1DZ"$P^5yCYFq.p/ IH̐$"(Oms>fZ.S|';l \KCc=gT#-J91P((հ|AUG H.G\^4 `FX$Z YA}ǧFwV{G￝d^9f @匒*do^YIGi>R e2X1 ~"i{]v2J|AZ ues䉓#eY\XX( Q|>;5R^L5ۖ<]/g~ʧD"W <n::dYYӹ=.]kj(*Bt:---7 Xs@MQzx7㿞*@)1qؼrLpiXm2~r{rrrHD"mAן UN{r->,?h4 ;pjS)3qܦH69@``q0 _D"QBvFնz?%_a2  nIENDB`ktikz/app/icons/document-open-recent.png0000660000175000017500000000203411455414611023003 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;bKGD pHYs B(xtIME$IDATxڝ[LUsYXXX. vMr1B_I_g FcMXEIHi4x샖Vk܄m]v^fao츙,cw"*:JѴa //vvvv'ihxl ˮ&mg]׸=c|L^u!b'pubKiz_;ɳ͇*"Nܣg{ׯKφDAԡUHS|+\)X_Cimmjv]@, V4 2'J/VI#O06+y/‘2Sn.u= cHDgTQotqL"Lq?y 5Vq])SiA6f; b,Th4$|1ܚ3 R"mCJ3H$c[޵G* QyR}@d*v1Ҷx1+Y)ɾ6p \ _"p;x̳40Z/T䇸(+H=h˵{4;!ne7"&[%'OsB?toSPK7ȍFÜS[VYR>4:{ůpš67AvkuuiQ&Nko^t ܳ_fnnN~ ]',Jpn9.'Fj-B͍</(-&[nTVUǻ s!GefQtD1 11,hxlgLI_* LLLW&+..^g]LVfjpddfҧV+3{6jAf[TVV慆ѴpMfFIҦqQoo%,,4w@>pt ǐ IcN@Ir|B8s: !*.E]^ a|iHO" W[A~OCoipj~pГ_1 1-] ك,:$uy BpasRGBbKGD pHYs B(xtIMEt%o IDATxw|չ3U}%V$ɒ 66clL ҹZMH($x!$M.ZrPB tLu^b5]i̼llSq7/G-3;;s8N!~ p7hzXEK   ( &ɓh:(ʛ@@8q"~r=@gy殰o|gy슊겲%%%%$ŀi ăƲeڰa&h[Qw APPP?mood۶m_Կ)g_tgΩZZZ:q%!l۝sY9s+7lذ3L* 77 X,fEQ[&Lj'@Igu슊eeez=ONv(Œ3ki `6 4hD4<^x!VСCe, mh]vY%KUVVN-//PRRRb4"`#Ӈ#(TTT݇qM)bh͛v#\'_|yʕ˖-SYY9tRqqqlN TUEӴ!hOEI7|߿O?ߏh7Y ^~<O0L>{oC}/[lveea}>`UUzx},>uŒxq7nlHtc=vGqqSxb~`3`ߏm&ݻWoR 5?+V̩VVV6b|>dYqǓБ<) F򺪪XrƍF*yL1cg̝;#2"2_ӴQ&bŊ;/ vIIIbHH hAvi:75lll|jΜ9ƈȠ:,|I8{eЀk# ; [rϭV^^>djx<Ȳz)SFE7Hy3ॗ^:/==Sb2$`0ba??@x~^ )+o/[ .[UU5lrLC @QEIs$$p yyy/Ktyuu5\~ZQQEZZ$O}vAid`D`/] /6KJJƧen~?`0Ə葂|4X{ugq͛7˻ xQq.UU3V\YgEzz:fA p8Xv-O>^T\-gyf%\vzzz&ȝN'NsX@W?o@E /ؼysJ!m?~<999ܹS3{;v}B"qA0LTTT H #--|e^UUNOOvx^dYpp8  AtttPUUknnF߷o=˗/W91 Tdal@z< .rySN^^^' i1I=  An̙uapDgk,X L&z5O6즛nƵzJ`\QQoKSN;'bƇ{4hx@ Z7n\,˻N:͛7&oE:::<Oq$/p饗f}_ + sYe˖vuuEO0L,Z(Af̘1?7ozvؑDsӁ"۷^wF7}nGΝ|$Ǔ'{qyMVPΘ1#ݣ8@7778͈;;k(D_CC #DPI(̞={NOϙ3Gc޽vS?rH(t/m~?Z<`وQG H )N( 4D8w$GB Z0XRĉAv{YYɓ'駟u |>tu/1LhQܹqҥ bCDDXpT:@|  -0Ma`yyy`ZS~.SjZ]]M{{;/+dޘNnw腠=''rD#KNj þH p`A3efG0b{iii*mmm 6$5mmm {oǒ Bp…C fC 8@ ~_ d7b B*j@*C =XCÁ~,X@***⣏>";;[K|"c#%]-~5Qԣ ]ba;j;-5!-/ HG # _|>N;4XdI`dD \qV6R _zu]wEQ>AЬ6-}Q R"n?bЃ h ht0gd"1GGxGY|9@u͚5dFMcG8D֭[{@L`Av B՘V!l.OtXAw͌3(--wޡ ^jn8# \͔>LjQP@Ќh<S:g294z.8yd^ pl_CCCrHfEt6!ż/jA1BTh,1`L3t8_,[ CMM k֬IfUU}8h,^ji n$o/G&AL}[ %`^5JT цS !ɡ~_P]]ɓٴi{. Q?8#%/,Ӈ<]}=H. ZQD*EέBΫFMFM`H3#>t f^z,><ۈDG=x t444h"oΒ%Kxg^ÝQ1E%17oȏvn4AE9(EG;ihQGNfhVqQkާ{Yup2Jio8 SCMxx?obɒ%8Nn^KQ{+'iQ^vdggWD澫\ּ`D;c#m8xH0A@T4B!B~[ ±fҤITUU뮻|0#G1 N!~b4GPP~ldXjFHk* bLyN덜w۶mܹE'`T7w-'ݻw7-YYxR|\:K|^aO7Ky╛XwoSZ htrn 񄢊,YtwxJ-i^Z'go zOn ??Xhlذl{ &XQQUc4ERwq1ɒ6sHu'=vZ͛ǖ-[oLn,fN'$!I8 >Q|68܏Ys&%h@:_a?Ƨgi3WSҴ|5πY:`\>vu/l1L3WwFEQ{?>Gaݺu߿?7۷/:GU&/~Jhh]]]@Ff6SO?Xpz'*c,d$=+))ӛ׼ .k5bE &۳ؠ6e7yl31q=?˸qƮ].V+Ydp = $޽iҥQ!j4#œ_ԐBlI5n'V.B B9ٌ)ݭl<UEL+gOƷYytuqt*d:W̦yY*)63\Gc R>z*d%2QFLݷ+سg%%%\r%I{jł`ꫯTUM $I`4X,L0~4cƌ<NDƍ]~/$ ֜дTфؽi-4Rאu~1eŧAihy u(`ldEɐ$Oʟ 4ȘIWPF44D&Afm6V^￟{GHEjrEU28x "#v$ `0=z!-m4x7L/GӬI,Nd0&& B2 쑲3%mR/mB.׹%1|d>`#YK_R҆Ztvvd&gy&'r$ `0/Ջ=9PxSlÆ7UC߻~b0Lq?H@4J(I(e%Xufd[>)S*Qq߾}X,V+w}sO,R8!!ILJȬ^N i@ZԎ]>5(UW^XVZ[[bpbŊrl3f3 =q$5߰aC2BBjAO0DȔ˼q!^4-}SXr+@4"$?c# @I.RJd;$???)f͚51NxODBIA@d'fa?p 0'(if'E,h^;USiEF8$"U#D^*nw(?azuӄ~NMM V+"yF X={4EB!qx\4ك㱏݀otpE+4t(=(mQ:vyl3g#ϥ|f`@4HC 5Gy1cr{@Jcc#UUU̓>=gu OF,f͚:I7+a. ZܐPydΥHY$"):'ShDs֡v5&F"g A*?)G"s 9sfM" ~غu+֭d2q`3sӇhdQg~?/85MfeO6-O'SD;eYi @ Ri*@#~)$&_~Ӆa+r/nJՍ걃1d" ((rMȘy=lCOË|ۥ1<JJJ8|0vSdM&555l6 \uU6rXV V1vI j &0q3;.%O wрh`JO$J 1-CltF>QǛkxs]|S&sh4rسgz^~= 4<ۗ+{tMVaQ9oư` `tfnlJ>~4>1n zƣ̌M7f J h<P-ѽOޞh-@T~!(I)Jx.-X?|?lZ%/^O\3w[OI 碋.N%ll6|>_^%f̚OKCLOO|kB ]89᪵4>Jj<|v>,K>"J Ǎ |3[Ϗz@?7 Iظq#?{Ww'*hl w{ߖ6&m/v189qx!諫kE1Q AC3/`dt E pdSZ?hll2?O?bi2-;t;7̼b59F0r;aR - }Od (A(Ja#fiI4@`%AuyBYlyj]ꍔpIDATpj%d~5V]ʳ;2i%Ud%dyM]$ާ OV9^ F477w$K<|ޅR-x#չ`ԾF4AB;d.RW_SQ=}(=(lLe+j%cL'%Z'?'|s0dޜ)gY4w#} `q/Hh@UB!6fUNG"Q-WĞbX D>٘F]8ٺ^ZvtDnڄҲ`V4WB C\ 0XP1 DqbP d29vHAWy &AO5 6crL#1~i#N&Bo]K|4üj0O3M"l UdX6CB NAȏTᆁG5HB]Jkk+>xmt xi+!)(e2Ɗ*_|qEX(/`TGi ;E(M-1\skAK )Z%  [lOSYٗ(2g{5p8:{{/>Bnn*64 y|]@R"ax k3}SO0o%X!fZPGn}.^4IH(tvv2n8.233፞' #G $#mڸhy)oxH+'vрw<ޏ6>CMD0+wLV\^7 {ph&-¯~pٳgS`̈́o69s&WObr1CN~&zD jdԱ3@˝fiܜɓ'B ' ]\BpgjJ r,I |F,J!S`0m݆,nА@ 1f(//G_f`8]ڴ?eDG+i,ˬ\r2 vtu7Bn@3xC"dNh^ft({SO=rܹsS|T]\tE8Nrssy`P`͈nFuM#O,z;} JMzw8l#j 6o%t"X08t e 0LE=l;'%lƮ8s#?E "[y/Chabs#4B OUUW 7|nވ%  7}%hbB܅mSiQ|4nu+bz.yOXø*̱E'F0 ЇӍ1?333eGmm2beP!N ⧄xyriBuu3NCA ͼ :;?b>@{V~:%_H؋i+'GQh];XtFQ?rpQgݔy8-(?t:)?8Hx#f#JqCD優zY'%L>oD)fbFVTdYFeE!(ظ?G- V \m}O qcxt%ض 5Fm\'Z gT|\]Ud)E)}ioE js.Ƅ4ʪ?e'ry0D]roƋ``y 8b^8< @ؽ{7D#N*J|yi9f`~AB vlބҼ k[RI1#AGeE\;>|p z%BojL.|*[e\]'KeAӘo݄V<)qkTW;dUm9 GA`2V}2#.@*[X< V"P>6B@ ``W'alv:(uoQX̉u8ᇆ8f(0''OAޜw1\2q=6hlHxۍŠ !'?ŬJ WWFh`?.Q!^ 9ĘvygrQFsz`ƍ{U3c҄4Q(gN P'#3@6h&Q-2~R߉g'?-1~}q{[yL~'@ɒ#w_̏[}ɌҟH'rG_}=z؇+eEAs [;ycr#.hrʲDCZB_a?bo#Z e0qH&O23e>rfL=328 CibZ>XPv~U35KJ4{^A a8_f@!( 9ņђm3={>s=Jeӳ1 {v-+ gBTTUՅulVᮆsNؠmWw&гmX_?N;})c*/#3H7w>"^_ |_˰y>/F od&5z^yɿJ'|}_HR ,h;\#U*rnC@,4wht+WfRo;q.@SGlE^5^ o.J5aN ;:ޅvڵȍw|ͫt=Cm n7ߕ|]> p/v94 _ wvp0K 8d ݎd4?Kk~ ?!8'f/x )9V?][@YaH0Ͳ":aהoxָЌL?)[[IH[GKՐDA ""H̊jQR '1@9PqhzQQ73qSRP'9Z?K҃͘9\,Ѓ((BEEE5k$5n\t\b>lz޽˗/?#:&KNqĎ`cxww7y>0TF!/]u4@ 3Td;) zBy$s:XlEh*4A-iSU.czIi'N"H\PzN4֭k7jЏi{DQмPϖݡQӲr'!ZBfLU=|D;$30K4AET ZZZ:ʆ :'>ۼ_Cӂ{߃Mz?qW ({hKRF.b$k%iZ<^Oc SLDQ4wb`kkkgYYY 'v׉:Ѝ2Ѝ:®ܽ/w'NS5AMKW9J'{譒hh4kjj׬YwQm1ws1̡|XY twz@UوH1/\.ꫯ掟4*˾8<!"'GHPf?"RE EQb`2z76曇.q/*@?ݻ9",uhG:lHY0V#eE*sv^ߣ~Q%Ih4&˓'pcx L5EɄjl6ѳf͚C/rUz"$AxTUu+܀#ʩDX~}O~4 Ս2Ѓ߅u "e!3ѐ]E$!/?;wuWll65Y$!e$40 ʁZ?ƿM{u iv+[UU(0 < {@!0h4N(NO0fChTh;K!fKIUU|["??/jU}*o0>#?>l2{A֭[V^nGuQU&Oz ܯ?#r* &5\[[pYYY^+TIYq:L}fv(?>ST=_Qf3V zzzz?䓦W_}_? ]zS~@C8!>"/Vl:%{D^^^@Mfև?Y`'!pAZXVL&RWWo־ {>v]փEȁBi#4$ 4TdƳC}fF#faoky$`ջѻO9 nݺ[ned߲BӥV;Q^d`0`m-۶m;k:tI'^s9tdѲшUZdY0`hX@H>p*5ُnۓ(/@]4>d e9. `0Z@#>liii;x`;ꫵaIL_tS8Y5Ƒ AS "Gp$nAmuuu-۷oo|7kw`.|Ȅ)6+oGzCeΝ|ښ>:lDUDC6lP7R!(\ݡQH`p 477׷رުݳgɆ\`^ GAHږ;w6۵vS$G'\{vGg۵;wMo`ˌ"]BpPG^WW׺sCV۾}{O I`B}5-]tQ|Ue׮]ov֭[;7So\suݍVۼys`k@L$T#1--., e.g. hi22-apps-ktikz.png ktikz/app/icons/qtikz.svg0000660000175000017500000076250711455414611020147 0ustar fhackenbergerfhackenberger image/svg+xml QTikz ktikz/app/icons/qtikz.ico0000660000175000017500000030253611455414611020112 0ustar fhackenbergerfhackenberger hV 00 %f@@ (B; (6}(  @Mѓ_ppp- ѓʑ]AAA% Օ! v`1e.WsNrga@pqOxɼ_;{^Ab0]2aPaL3hîJ/3_11yNҼ>>>ZD-k@^1\«C,XH=syb1-1 eĬūYA'A,jd8f1V2Mqqq-zqeRCED? _lNzxPv73+???~1JJJ ȵAAA{%%%111{ -_ԓ yyyZZZ' /aڕ ( @ ZZZQ;;;?!Ǹo888?!#ǵo555=!CCCAūbbba1 siii aC#rQ=Թ789]PD\dkC!ƿqbͳYs+`1A[&gf8 d2i5j?d2YU*e8 b)d3qArfxC tbe4c1d2[2, g1|MvCuNm0eu\`cg^īvYCβe7kY0u1)`2v1Ow@~cTrHϸ`*YĿf7 O?-222W. a_TtHiZ&d2c2d2W1===?zxt>ŸVӼHHHX. #!qzH~fVhmVѽe?"('ı vJ$d4 ʪhVSٿ~dRlI-6/ MMM~S&qqJ&d-|`PvFyQ+j7\5f8 ռ|cQҴsXBdZH$$$!nPbȿ¯°d4eOOO###;;;?ĸuuu---o\\\$$$ Sqqq::: ]]]oHHH''' gƣ +(((e888$$$000Q ?sȣ111UUU  Au̥ 3???  CuϥuW Cwfff?---sYYY1(0` %5% %%%;Ŭ|||wFFFS9% KKKWūyyyw!!!K3#  }ŧ|||wGGGU7% çuuuuEEEQ7% '߾[A+ ;ۊEEEgO9'QQQ[pH3556盛NNNe }c1ݸ679&(*qx`UH 8@X_%h9ЪxmReI5龲zw}MfHi7l1i>2' O!oi?d2c1d2agB c1d2d2[Lsqrc1d2Ud7c1o6Ŭd3x=i9 c3c1c1d2a1=15~'%g0f3[*azY=K{`Od2ojAJHl}f\}Eռd2iu]Sd2Ld4Z0].f1h1c2=29t0d2s:zfa{!}He1L12_<1Wj1[e2ͬzmmw;j1Ǻ...$$$$$$P.Qd3˟d2dſg.X1/ Y1<2t1n7̬Yj2Ұ$$$$$$N+W6 c3ͶkD(G l*`1=1=f1vAFj2ְ___%%%N,T3SUUd4sDf3Ơmp )e2O1o1Gw9j1կ)))&&&N,Q011/d4sFIOOOYq2Z11t0Om2۾i2խS1Q0%&#KKKc4ӷX=Դ8.en2[b1F1_r/ǑTj2ѱi2ԬWWWJ(R/%%#---[W[d4Ǜw=źI.1g1T1 o.ɑTh1իh1̪T1U0$$"$$$G@?d2ǜrM4ƞS0q2a2-1/h+ˍQh2Ԫh2ԩrgY400+$$$. d1վSufX132Cd1O2#c4(τJj2ײg2ԧmN6X1>>;&&&2&"d1}s]d2q;\8%}d1\1c2}g1g1Z2,13}lt{En3g2ӥi<j6A@:AAA2&"d1@=+{\H}T*{Q(¢pC[g1d2d2d2d2\2:1#&&&Mr=շhe{>Ⱥf2ϡ½FFFB72d1 GGG% |||yj8ռmO:RZe2ɝqkjjjUMJd1*'000qqqlF-\d5m3`-d2͙]>aZXd2*(  %Lc1ʤqz=d2ɔ}P%s5d2 8.%%%111XXX_9jA"[g<t<e5nd2̪uyEteZKd2XK2'''$$$ YYY=GGGSf4 ~R#\8f8 f3cd3d2d2d2d2d2d2d2wD a#d2ufKAAA%%%Y xxxy}[@j; yJo|nnoopppxfVd2rMsss---$$$ cLj<ԴYYY$$$%xxx777%%%57lll((($$$ JJJWgggKKK$$$y |||y]]]222%%%'666OOO&&&### <<>>[ [[[1Wͱ rrr+++ %W˱[[[a !!! ***fff3Sϱ=;###///%%% bbb5}}}M5553qqq)(@ B!' Wjjj}UC3' tttàhhh}SC3% )ßfff{SC3% 5Þddd{SC3%  Ecccy SA3% Ybbby QA1# rrrݤHHH[I9+ )bbbyeSC3% 5Bvvvq_K- Ef2˓;BJᏏ000A YgIGd2˘[}3qqqd2}>(.Dkwq%)wkqd2П^}fRP_5d3FoZJV```O E龳|d2bqNG\777A }1eL2DonJ2d2d2d2d2t>sppd2d2d2d2d2[Ted@?d2d2d2\dCDd2d2d2Qd:$d2x8k<l=a0b1c2d2e2d2L1l-h0d2d2d2d2d2h3ྊ~hZd2d2d2aU*CzlPnkJ/d2K ̰d7d2Q͹d2d2p0d2d2d2d2d2d2d2d2N2v/d2d2k/θfB*z>uikd2z]uL6D2;=d2ʘ_~wyd2ծwhIAd2p5hKCd2G- / v2-u1wg2O2,e2d2a d47d2x@a-S^&*W^fd2fd2‡d2d2y8d2T1x1P2o1yd2n3ר~v}v6d2zA;GJ%%%$$$ xud2Ϟfd2rbcd2t8Ѯd3c2!,M2cO2z1d2kd2קld2jD%%%%%%###;#"d2џfd2ؼd2 d2DnVNd2G017M1d3 f2d2שod2n$d2D<<<&&&%%%%%%eKBd2џfd2yd2y;fPd2P12L1|2+d2k2ޯdEHCd2F$$$%%%%%%E)!d2fd2侄d6d2LlLF{f1b2"29l$H32Yd2Bncho2d2Fuy}$%%%%%%%%G(d2cU3d2侃d2}> Qv/d2I1l1yd2d|{|d2Вd2E444,,,%%%G*d25*d2}Nd4d2ŕTA-Sd2R2 5d1d2|1d2wd2D"""$$$G*d2E=###d2d2d2A3W l2c2-1O|0d2Nd2Ӡfd2Bppp***G*d22' @@@jjjd2V*d2U%{1d2L1}/d2ƕ\d2œYd2A,,,$$$Q5(d26+%%%999d2߷~|lri"\N<{21d2[12{.d2͜dd2Jd2?C("d27+&&&AAAMMMd2~h7ÎV0 +s2d2A2{ x-d2Пgd2Ad2=cccC#d28+%%%!!!AAAX=?d2~Ya0 %m1yd2R1-s,d2Ξed2 mP;d2d2^$Qq1d2d2c2d2d2d2d2:2q Cd2}5iX`d2\d22mE$d2pEAAATTT%%%K+d2C?(HHHV+`9_9U/ֻAv0d2d2d2d2d2d2d2@1yUd2gd@>d2ڨod2/Ϸ̱fff;;;DDDK+d2$ 3lll}d5Fd2d2Ɗϝcd2x+AUUULLLL,d2,('''bbb%'iUVn2۲d2m29d2|'>[[[fOGd2-)$$$ CCCeeey3d2ҧod2Gad2y#:ʵgkneL@d2-)%%%S Cd2 ad=.d2~7?d2vnbg6k2ڦ`FAd2,)%%%%%%A Uwfki2d2e2߿k2߭d2rd<30{x{d2Κ_{sd2cK%%%%%%%"""DDD3jjj}d:k<īd2d2Zd2uA uKtsS:d2}Fq|eoJ+d2}+~d2Qd2jT/PPP%%%%%%***%%d5d2d2d2d2d2s8̢d2d2d2d2d2d2d2d2d2d2d2z%d2羄yuxd2ziF\\\$$$%%%&&& 53qO9d2d2d2{E ٿeAfAfAfBfBgBgBgBgBfCbCk|d<#d2\.UUU%%%%%%  Cɴd2d2d2ܬqrrr~~~CCC%%%%%% _UqN7ڻ}}}\\\$$$%%% iii}}}}~~~EEE%%%%%%%eeexxx555%%%$$$Q3oooSSS%%%%%% Cjjjlll777%%%%%%SGGGccc+++%%%$$$Cggg{ZZZHHH%%%%%% %iii}$$$SSS...%%%%%% #S'666FFF$$$%%%!!!OOO?/}}}aʵC yAAA666%%%%%%/// 1a˵3888***lllooo 1a˷%1@@@888+ !1c̹jjj}+++  !"""3e͹U@@@###%%% _ !$$$3gλC =### # !'''3gλ3###E !)))5iϽ塡'GGGWWWaaa# !) (  '9;3-' ;]aYQIA;3-' !CRRRۮ666waYQIA93-'  'Kۮ444uaYQIA93-' /S٬|||222uaYQIA93-% 5[٬{{{000uaYQIA93-% =c٪zzz///s_YQIA93-% !CQQQתyyy---s_YQIA93-%  'Kרxxx+++q_YQGA93-% /Sרvvv)))q_YOGA93+% 5[զuuu$$$q_YOGA93+% =cզsss$$$q_WOGA93+% !COOOեrrr"""o_WOG?71'!  'Kф!!!ue]SKC;3-% /Sᖖ===ukaYOG?91)! 5[먨WWWyqg]UKC;5-% =ctԛ:PPPdddssswmcYQG?91)!!CNNNdBj_```ߌ///}si]UME=5+ 'K{d2 x7 ___룣OOOyoeYG+/Se[d2l2Sbdd___kkkyW15[d2+d2d2y]_`݆uQ-=crd2d2d2?*.0CO_mmmmI% !CNNNd=Vd2d2d2@_acFFFeA 'Kd2d2d2m2Q "5;[]]_9/SdVd2d2d2eX[[ET?uhjkY35[d2d2d2|2|'+d\RRBzloowQ-=cnyd2d2d2yI]cudVNQC|ruvmG% !CLLLd7Bd2d23{o]OJPGvyzeA 'Kd2d2d2ՁXv{hWIGQJy}~_9/SdJqd2d2v3`jmuaPDESN|oooW32Y2155[qPPd2d2d2d2AΣtd2d2d2d2!*) 0%r2d2`22GE#j2d2d2d2d2Mmqd2d2?d2)d2d2u2mW?+r)Zg"',dWd2d2Od25d2d2ז'd2d2d2d2f2˘6d2%d2d2d280)2Cd2c22M/ad2d2d2d2~2Հd;Jd2d2,d2+d2d2p2ƒ{Fhs'+,%%%%%%~~~dWd2d2Kd3>d2d2ܛ)dNud2d2d2d2FխdRyd2d2d2P290g2d22WU1d2d2d2d2، yd2d2Ed2,d2d2g2Ȇr&'(%%%%%%%%%""" d[d2d2Od6Ed2d2ޛ)d2d2d2d2h2գ?}d2d2d2c2+k3x2d21cc.d2d2d2d28d20d2m2Wd2-d2d2n2~itxTag179%%%%%%%%%%%%%%%$$$LHId[d2d2Od7Hd2d2'igd2d2d2d2Kd6>d2d2d2+0 2d23o2Wd2d2d2d2|dXd2d2s d2/d2d2~2ac@$$$%%%%%%%%%%%%%%% dIcd2d2Od9Kd2d2ɏ%d2*d2d2d2j2Ijbd2d2d2F1$1d2!3}1d2d2d2u2lsd2d2>d20d2d22LJ-"""%%%%%%%%%%%%%%%%%%d.d2d2Pd9Kd2d2ڒ"p}d2d2d2d2Nd2d2d2^2/G3[d2$1^@ q2d2d2d2Fd2d2o2øgd21d2d22̓!!!!!!%%%%%%%%%%%%%%%+++}d<>d2d2Pd9Ld2d2ِ d9Gd2d2d2m2سSi0d2d2d2(13Ad2&1g/d2d2d2d2~d4>d2d2)d22d2d22///$$$%%%%%%%%%%%%$$$OKLd'd2d2Od9Ld2d2׌~d2d2d2d2V})d2d2d2C2$12)d2(21?d2d2d2f2GdMyd2d2ed23d2d22ZZZ###%%%%%%%%%%%%%%%&&&d=@d2d2Md9Ld2d2׋dCbd2d2d2p2\{sd2d2d2\21?l$S37(63kd2d2d2~2ێedd2d2Dd24d2d2v2Ɍ!!!"""%%%%%%%%%%%%%%%1++d)d2d2e9d9Ld2d2׉d2d2d2d2\___=Kq1d2d2d2(32d2d2d2Esd2d22d25d2d22ڌ~;;<%%%%%%%%%%%%%%%*##d,d2d2=.d9Ld2d2׉dKrd2d2d2r2d o?,d2d2d2E232d2d2d2_d2d2q2dd26d2d2~2ߌMMM !"%%%%%%%%%%%%+%%d/d2d2\6<;2d:Md2d2׉d2d2d2d2b_9 9d2d2d2_21I$s1d2d2d2Մd2d2d29d27d2d2~2ދ///"""%%%%%%%%%+%%d/d2d24+sssd:Nd2d2׊dd4Ad2d2;d2;d2d2{2܃WWW*$$d0d2d2H1%&%%%@@@SSSLLLd;Sd2d2}jgd2}2O+2d2d2d2E17)Wd2d2d2Fd5Ed2d23d2=d2d2{2܂vvvSPQd0d2d2I1%&###666QQQdd2d2z2d=Ad2d2J0%&%%%%%%!!!CCCGGG222d=Wd2d2|dFgd2_o/E2%2ud2d2d2T2 3)$kd2d2d2Rd8Jd2d2~2݆d2>d2d2z2}hhhd- d2d2K1%&%%%%%%%%%BBBWPRd=Rd2d2|d2m2Rp/O2+E.!d2d2d2d2'1"od2d2d2Sd5Fd2d2y2~d2=d2d2s2y'''* d, d2d2L1%%%%%%%%%%%,,,###A55d5#d2d2|d@Zd2Hr/X2 *=U2d2d2d2G2- qd2d2d2Rd4Bd2d2x2|d2?d2d2v2x#d/d2d2L1%%%%%%%%%%%$$$$$$_\^d7+d2d2{wd2d2ڒ'{uut.b2.S3[d2d2d2b22aqd2d2d2Pd2ճd2d2d2}2݇d2@d2d2t2nd2d2d2Y3___"""%%%%%%%%%%%%4&%d1d2d2sKsz{d2&d2d2d2<ٔuuuG0d2d2J2/3=2d2d2d2c23_A`?=d:Nd2d26d2d2d22d2@d2d2s2ld<6d2d2d2W2>>,%%%%%%%%%%%%4&%d1d2d2yN664d2d2d2d2d2Bґ+++q?0d2d2d2d2d2c2d2d2e2e2d2d2d2d2d202 'IdHld2d22۔d2d2d22d2@d2d2r2hipd2d2d2d2d2\2JI4444===%%%%%%%%%3&%d1d2d29/GGDFFFxd2d2d2d2d2d2d2u2g_90d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2F2; -QdWd2d2y2{rd2d2d28d2?d2d2q2ffhd2d2d2d2d2400!NNN&&&{{{$$$%%%%%%3&%d0d2d2B3QQMFFFd^d2d2d2d2d2d2d2d2+W30d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2M2.3Yjnd2d2o2Zlud2d2d2Ad2?d2d2p2cxod:"d2d23\GGGKKK%%%%%%3&%d0d2d2%&UUQ$$$,,,qLbptssknR׏O -.yd2d2d2d2d2d2d2d2d2d2d2d2d2d2d2:2+;ayd2d2d28dYd2d2d2Rd2?d2d2o2`vggO BBBWWWAAA 444%%%3&%d0d2d29/&&&QQQvvvG% A===yd2d2d2Ӎ!dCed2d2d2cz؍Ad2>d2d2n2]bA;;;]]]111$$$3&%d0d2d25-%%#WWW+++q? 'Id2%d2d2gd24d2d2d2ׁdPSd2>d2d2j2ֻX||2݃yyyWWWYYY3&%d0d2d25-##! HHH^^^____9-Qd>Sd2d2Md2d2d2d20dO}<d2>d2d2k2Tkt{2ہBBBeeeLLL0008++d0d2d25-%%#,,, {{{PPPYYYW33Ye]d2d24ۚzd2d2d2m2YdM{2d2=d2d2j2QdPs2~IIIkkk:::d1d2d25.%%#%%%"""!!!O-;azd2d2n2Wd]d2d2d22dLwm2Xd2Md2d2d2d2d2d2d2d2d2d2d2d2Ld6Ed2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2g2Hnyd2g2>d2d2d2Q:ooo}}}###%%%%%%%%%%%%%%%*** A666wjXpd2d2d2d2d2d2d2d2d2d2Nۤd9Md2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2j2Qd2&ddZd2d2d2OffaTTT%%%%%%%%%%%%%%%###+ 'Id=0d2d2d2d2d2d2l23nYJd2d2d2d2s KKG444CCC%%%%%%%%%%%%%%%)))-QnbvN-}O g6h׶d2:d2d2d2d2d2u JJJppp###%%%%%%%%%%%%%%%m3Yd24d2d2d2d2d2t zzzgggTTT%%%%%%%%%%%%%%%!!!9apXNd2d2d2t DDD<<<333%%%%%%%%%%%%%%%A666wjB7“3IIIppp$$$%%%%%%%%%%%%%%%] 'IllldddRRR%%%%%%%%%%%%%%%-Q;;;~~~BBB'''%%%%%%%%%%%%%%%3YEEEmmm%%%%%%%%%%%%%%%$$$O9a^^^```MMMiii%%%%%%%%%%%%%%%A444u333wwwDDD!!!%%%%%%%%%%%%%%%  %I}}}@@@ggg%%%%%%%%%%%%%%%$$$A-QRRRYYYFFFSSS%%%%%%%%%%%%%%% 3Y###mmmwwwDDD###%%%%%%%%%%%%%%%9aAAA:::yyy___xxx%%%%%%%%%%%%%%%###5A222u111wPPPxxx>>>>>>%%%%%%%%%%%%%%% %I|||_ [bbbjjjDDD###%%%%%%%%%%%%%%%}-QY3222kkkSSSiii%%%%%%%%%%%%%%%)3YQ-GGGiii111000%%%%%%%%%%%%%%%9_}}}I' 7VVV]]]AAA###%%%%%%%%%%%%"""m9222q666wA)))]]]DDDVVV%%%%%%%%%%%%%%%'E_9 <<<[[[%%%###%%%%%%%%%%%%### XXXת%+19777OY3EIIIOOO===$$$%%%%%%%%%%%%,,, %+19999QQ-NNN555DDD%%%%%%%%%%%%,,,pppY %+19<<>>333111ooo S %+39CCCUa9???WWW222 %+39EEEUY3&&&ooo %-39FFFWQ-|||FFFC %-39HHHYI'  nnn***%%%### %-39MMMY:::wAw111###%%%%%%%%% '-3;OOO[a;[[[""" %%%%%%%%%!!! ,,, '-3;RRR[Y3"""%%%%%%$$$} '-3;UUU]Q-+ %%%$$$JJJ  '-5;XXX]I' '''"""(((! '-5;YYY_<<]4nm*;KtקtW{*cUBe™3i kc[o/ e$zzyR(RC^ ։VASbQº:1 ٮnܔ\>BuVV079u9ľz0w}7wbaJ-%?ʭ<ϡlw$k#f!j$O=Ͽ 2@'2qzҳ֑=O\XQx}dbZ_ĥp.J)!bUć)<UwX)t 딤-'{V D IK^ 1H e} Bzu7P|8@#F߄Ik3l`368Sŷ $Mt#0'FАY$uᣨ} |?'fEgBR?B<Qk8}5h4 4~iIFxeNu{d:`lS4(=H$557߂Jb ~L#eWKpK6 (:@8e:>53owk/…$Y~0#8+cPbA gs(@/ bF "V [SXr}{ۣ/&"0 J I#,=@Iә2 j<Xf<) fy56؅'>Z?(!3*?lIENDB`ktikz/app/icons/edit-undo.png0000660000175000017500000000230411455414611020640 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<AIDATxڵIh]Usy3uږmmH-B[\R.ąƅ.Vp,hmBC^p{NT|p;?*wuKbG:.qd2A}GGR-J6hZ.e#T.Rb7&Fv3n|LG hhK\qg/Nn v+% %PMDSŸ>5"oA)BC4uaΝ l*A[vT "(% k:/#PQ\zV`|Imh"ճeak({bÖ}7X ԬόR:CBK9Cq) kJ$ WVh#Qb!r وlahWCW;6IW Tp[Y0p"c<7n) d}:|8 #9G+qռR'x[e͎=EX'LFib2_/EJZI fM#sqp476fNc&BJA*'CG- Ȃ$qY [Z[JvWámK';"aUGp&DU*l| aUO r[ :EM7n'AA!ʵۋ~>p#2FZARyUxRX=9An~"@IئtuͼV*s[٤tdl0?.ԁOmGG yIENDB`ktikz/app/icons/ktikz.svg0000660000175000017500000076250711455414611020141 0ustar fhackenbergerfhackenberger image/svg+xml KTikz ktikz/app/icons/edit-clear-locationbar-rtl.png0000660000175000017500000000120411455414611024051 0ustar fhackenbergerfhackenbergerPNG  IHDR(-SsBITO pHYs:tEXtSoftwarewww.inkscape.org<5PLTE:B:,2, =><=>;ccc01/$%$   !"!"""''&/0.111231777:::=>;???AAAAB?DECEEEGGGJJJJKHKKKMNKNNNNOMPPPSSSTTTVVUVWTXYVYYY[[[ddcdfbfhdhhhjjjjkgqqquuuyyyzzzuJtRNS..??TTee IDATm۶mv[{#=@5. SbA7}`+3bRo\Uy5Ltx<[!b GB$SS Xmt=t:q);,#*F/ԛ6j Mh \r+/IENDB`ktikz/app/icons/preferences-desktop-theme.png0000660000175000017500000000206611455414611024025 0ustar fhackenbergerfhackenbergerPNG  IHDR szzbKGD pHYs^tIME  _5\IDATxݗOL#UǿoM m.c&Qlj1&d/!N\Bgcԋћ'oȁDHH떺AŦN?닓6zK^߼~fY[[%x˜._p eR. &\4-r>".,,n?!=~{"0n~? j"g'ydݬY={whtx{Ef`p\mBhsJLMAI%P^Ykv#?\n9K ü~* "ce꼀v;"π"8mBaVS\aTĭ[~8 D0p!cXMȣx<,~'Lha,NH$022ҁP#xy2e T%eGz;`rrfm A)\HH8 u-^ێ?t5677 أP(|>BBo6663pppP(I`"Ӿ)0z@^G7lmmazzJzM>sHFEP12ւv]C>d]31e-R>jZpֱ)Bk~Qc\W1>'7g3w`~ DMAԑZƪCst Hklۦ1躎bd{ܜ훫ؓ٦-xYX5`$(wLhfR0JpfF N_9q l 0o+>xo[s\P[KVdP*lP(TfeF̟?#׮]Y(/K!`ǀ+p Zi؍0uŢ/s3 $E-ϳ8w]yŊi -]a ܺ}gIPK@oܵnWhL?#f̛icɛu#l[lPTbɓ>u]Z13226tvvr#26IN޹ul쬭x+ | wur5:s~Kќl]%ׁmb1&!2e --( &.^zF8E?Xj#缅T1 +VY!6Ц .@ qc Lݳs':o E׭Ԃ";>ζc𕵋e}6fxK@$<@< v4|f4CЄ(ʌb…wn,.pTY!bL8s\f˾UH0, co&kP#7t P @Ƨg[DkF4>ښrB&" Θ˖дh @B߂<v"#z2sr _Zq%no|#o0-`tkY83۟2' Z*hyq=\]v}=a>1FH0tf;"ZbAPzv45UJ`/pPr#@@պn3G%=ݿ%j:3Ę#NL=&GK`3RC3nnB1VDE,ߙz{WΈUO~s=@۸hMwpudzn*J- 2M8H`-x;@0{ƕZ݆f6@h&Q\:К޳ܹwjw= :ZtbS.}>?ou͓4MR@AP",]r#)dfaZH3AB+<, KI]unfڢ'giˀC Dc'ֿ'O [V2 s "s0[2€iPEjA2D,}&v>=?AOXAj!"G]v3ڌ@Xbˁjh(!t p*0:ϽR)N0 M6@?_ @+(*lӉ01_e'SFGGdP"8-(] 2Qme0:']6ы;Av NAy q=xL{cVJԄ>`B)ڿ`:thJfd9Z Pςf hzT^eKo i 6tW{?i2yeL4Ȓ, "+ XAoy󮾾4 >)U@Jn*w *t#F@?gxU~6ݗ.3=-H@V~>;\@:?4CPx9ֶ>T… O @@& f0Q{ (U.B4ΏPVR| >ys#nI,y'ʕ<ɩKf2+ݺus^Q3y2{|wB(T9($J F\15TZm$3YW7ѿޱz5͘>ԩ['Kii ۷#JaUUߗ!鼮Ʀ&Q__:*kmіq1mBs@'ĉnwMMlmЯ*3T $-55 5  ]N={xE$OwuninO^SSl\04=-dYrS=Ν;\ ^unmmEʺ~Dk^}_Y3_5 JR8$M3Ӽm۹Ox7V}]̈́xy8 E;MBOLz9HT {$>u'|;9tww۽^)e$RUuSt_[{Z̲,zZ? Au M+> P$޺U \ -|}XǬYxC3~]OD _B۷?f*J+ǁAWg1ɗ- V]S@(-L;w8? e6J)oijPܾibSssˍ/Ved:2Hbg4->Zdj<Ѩ$1v»5Fke_ 1 N4>6q":ܾ 9#sv~M{IHqzvT4ѫon @| EM%@tG6Ĺb7EyӉ1 SVƐ2h'4 5r Aɚci'6)%4Ps9̈́h%1لyS27FSNv"B$ĽC-~$(iN@dE bESTq86<22V,ՙٙ&-mM"m8KBPS4eSEoi~oO>1>.Xj!wԒ$4!DIqMyYęlQQ`(ZM  w< H e[ۙLz*k|}ed䅌3eee(ޅ㸭PhWvvLACpd%¿,m6[r$Rr``naaabee< L#FF(yyyxKKKwGGs?f$i3"A{]Áb"jk~=0;;gWnX):U TW+rsllL$ ].)pqq!e=ђQ@ 4M =̆`0xcmmb\ς 0tFFc2IENDB`ktikz/app/icons/edit-redo.png0000660000175000017500000000233511455414611020630 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<ZIDATxڵk\Uǿw&L&GټZhE+VBPх΍_Tp!pP(RRE6&ih$޹Ð6pq؉>񘒹R]~sfyx'Љx8܄0I\ҋwroI)9 z![Oaݡ"z"0.SuX.azX& '{w N ONT; v !lm XMhDkwǞD\;~D#8`@B TiKqվz]UV dPHA`|2 7aHP@jt4ّHD) lVAF97P/bhM ef ~T?;FU*WtTX$EETP_eM\b֕Rp;Q JFIxG.\.P2U8~] o+>S&"}`H~XȤحmSqip؃dp<Iԕ ZyAUg# yH6O~[;4"WZ_^8t]`ieUO ȱm}s=N%~C((J 7[عm H`NCC]ݔc~\ ]ะ0b3veeb{#yi:!( Wҭ D.1԰g{W+oM_&<Ӏ?\D$*k]Op,LWC dYú Rlm0XZC$GoX茅g; TmcaS-o9+9_U$` `9=13i?:#&uJ.=qgzV,QXE (3y[lfױs3ޢy&xf*65A!I\Ī-R>EF~&ol%A&+ޱ,sBV^⦪du]2nL0$28"R̚ZH<4iΟ"+/;n~LKNK/OSiڗjG͵YHE D~*Sn1M|guR\m s]_ҥ%0<Ɋon|NhcŚfVH/ǩjlf2%L4^eDԢ|uҏBhGf{qp$ӌĈz OEJ:Y#sQβغ aG*5\aDQn% |9ї4٣p웼 ]%~6+&D PlgRPcI:.:%LxK]SB\,DH-cE|:N26gZ.DZZJY6nj0&~fKZM x /V\bO;,zXiIУ,5YZOۑ}a2h4 )uR6LfS#|П2Y[*RiVO >a#!adr\ ʓ^: RX[[|1*َ SOz .M£}L\pй;_SܨHc;&mF;1{gss~Kq{cOcȹ^V^ Uc0cvsoɦ4? z>zEQhSr+ck;̝Z&)=Wbrrrw&U?{^=ϣX,b*dVoNwww:;;jiigO[2115KAgƏ¿z%UwfiIENDB`ktikz/app/icons/application-x-executable.png0000660000175000017500000000134511455414611023643 0ustar fhackenbergerfhackenbergerPNG  IHDRnsBITUF pHYsaa0UtEXtSoftwarewww.inkscape.org<dIDATxuOQo%q;WF ](pCbBxIZC 5)F1"5 e(By( * 2;3T 937g|%t xNap_ɝywTddYY| n rWB 7U*k~bZN5mKأKgpmWl)ZZADW=zl= ֐T^F)VKx/ֽ\ĬY TC9HnfRE \SLiRd QqIU+du,LVAeLۀhcLcg`"d~'Di0lnM7F(Dz9 4M\}kFt?vќ %PhHA1Td)/"v_^7&0i檖DW0{ȟ|n$RH#C7kj׃6<%MkZ{)r?eis^)ŠtVNL- qr\[&S5q^J₨ttF{MQ!Ή_$#ƛ IENDB`ktikz/app/icons/window-close.png0000660000175000017500000000234311455414611021365 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl; pHYs B(xtIME 6 ibKGDpIDATxڅ{\UϽwfvg-EtkK`Dmhb#@ljF|ŘC!АHB 4tݵu+ܹ݇ /7s'!y^DlD&e6!#;YFzFΉ/?>La ?`oww>kվq#a6?o7;frtTU!#k-Gtݶ+nO$gQ*W#{+uqp=_F JH̝>SOK2{~y< ]]>^u`A}ZYRY/-*m06P]Y<5Vg{%t^Ǒtli+qglׅQ.,kJsr]pHK_s/ʹs*IhFYd,,L*o9q|ۅ1S0Tv崡^*FA}fgWںow\קcuk6)ǚhriދC_~h|J}zN**< 8'VsӚvV [htd5-`Rɟ~r>2_c]rde"ͦ E~saix/ZU>nú\O"CT B Oo C54&Mh$L̲펯Z;p }J@r_nk`Sw[հL |{?8).lS?gu夭>y@q2~'nUeQ#omG̯N"5zy 7Z>oa v?K z*~|]dȴfIR*INHt[T#@2LP-ר/C-R/gYx:0y2D5F)$1%*Eg(ORJxG+? }ul.%bZtƜ~UH5b^kڀ(ț$'QE WdЊr:*XA Wk]X9_IENDB`ktikz/app/icons/hi22-apps-ktikz.png0000660000175000017500000000267311455414611021620 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sRGBbKGD pHYs B(xtIMEA;IDAT8˕mlsډ]QKBXEU@TeԪP:Zu6 MC(~lk'Ml "UD+UQJC(4T$M@G?[H.=9ݤk3gGFF".{xv|oٳgӁ@T8.GQFu,x\ܹs ֭[~0Ay"kw'ONu(ґHDONNX,dRR)}uvv˭]_رc555mԅ F)u_[0$իWB<:66͛7Z#(0 VEC0E U(d``U,D"a۶w4طo~°(]iH1n t.Yt2A Blv8uUCIY*$QNדߌA 6ˡ XwI&Swn޸USvT k._O9xɓ]ͰiL9)gcǎ̝`yڙL& Q:go^Κ_qvbV>c||˗t`AtbCc<-.eE Xr=?]o.9en7PqOpOO~!*m.--u(D8(ג8u;8W_=ϊ-IV}|ĉ+RI"ANϞA`XrUfYk5W_%9TKx_-= ߒ -$7ef²~(hYA~<ʅji8Vy @ խ{q"y}U놕j>?4)ZZx'K'P~_ܴiF`0x}(;UYY9H)`t]Gqȓ,n8W^vH ,p{O:"ү 6lpnNNNnkw}7gغuk; -2k+**fSU=pΞ ܙ) uuuNz3;)ZNNζɓ'Omjjϟ?{7r|}jx~)S\TQQ1=77wj$1hOu GHHsIII 췞sY.jTUtӦMlٲmɒ%{N`% H T=z >oc^^^~aa>!D$d*R5 !Ν{͛?E]BdH)=htxm7^(~x~93F%t~ѢE=l9v^DJp# P]]P a=%gL$JćBta6mZEllP#V_Lԡ83뇚Ll lG^(E$(F4;ž ' EЦ-#Gd !G9 W'#`|>/HOᅈN{H%֋FtFQ=\yE$g C9s؏?PֶOJYl:_@O{{s 3y`usdIGljE<;9fLVWWwX,.Jٳ+A.D1FH&dP5gjA8&8Թ.֭[dV!}:aΥ*"@PFڽHgMsvd#T y*mjF}۶ؿ=ń>H^cyGKu|0ʁUڳdfgg߻w{x5֋0(uSj91Q9g~ά=扒+8<*,US]]MUU9wpCCC"9+3!`\ B!k:>{,c@$>}\jZ3*yzb>>)=oqPL ƂX{t]gVۀg dS B`/ҋDoZ(q!%svh+;١x ɟs5C y'5k9''x<>V1H>:߳g^wlz&.Mޠ$PhL\x%?h\н˙ikOo^@Qfx-*~uT9'ž(oXXG۪>࣏>2URtwt8P]]… ͎6I4 @ɠ$ڭ}0< a,XwQU {hq$+`dܯd"2g }4gJ~*pڴ^x<7oށ?#%@9իkZRK2fTN3 2pњ-q L=(v7 c/<g(;jK@SS]VB:9JKTTе :u*xKuu5s''3YhGGGWJc5 @>4ŞOqP "GL.u$@+`,cGZ./ y jֻ(`/=;Faa!< ťSkq9YՖ,EhVpB6G9L8՞ʹQ~7'D,j T3FQUVaʧ.0b!6z:8V¡Plbsn& 8_{ 耿 !VͼTP@οG|ԋ튂-Lu20g3=OE !Z1Z1z[8s]K~UD#߳gӦMG?QŋOZ";[w nd@$|lx06s k>7o9:5bkŸU >|]kiӁ:d{14M#U6mZH 8UQ4jժ?8!jT!R^h('`i\-/2t Q349eƈRSnob?޹<ֵR0'' -|khFC+ǔ!6AusՙMSjz*E[&O@Br#ͬ89D[RDNJ8.y73Ya)N'pY2g7ٍ?7:6>? qx8VnL@ mnnn2$X;5%s4Sbs z(D\^nkP>{Ybf:)Q5 on4uɮמBګFB@p׮]5jf|Qr9C0Lwϛ0|B ir?ߙ@ }㴷ޟOǁ"__+RAم3#i!6 o4;;Rk֬/Ā';osB"c!t ߌ=$ɧ@&- 5 yBlI׼̙{iqY= AX[[[W4( c܍K ?H4oD0z}GZ0ap#2ELv_Ēl|?A/?|p,^U_PYxX7w?W;‿YђM MU XB՞&ffJFV O!3a.\Əl][,lV^w [dee)jnû%Y.u"{!}(aS"c͔X?OO?4R ;LT<\~]Y,=w +H=MGZ ރu7!77xAt# ~T3&p| }VF0 bmxѿ"<9^t6j^ c轭=Mg9hGZmI,w!q{6?Ƀ躎bI[M*(4&.8̯7$cdO"qv,>ڂqKCBΐO:` Q$w!:}(Ԭ;,A(D(j>!<ǡC(..&571PE1c w)1Ekf ]'9Xa Q'+D &FB@a4s]Z,Q<%̽vYɋP-_\'}d55C㚉Y@P7FO}Ǒ3h~:p8Bquyύ$khK!NJt œFօ{7@ <iznۿsa8qt(wsPlH42I@bx U;N'u#7D|R7a<A"~<.h>k2߻nn<;8hA?RGOHt=J;Tb7IV 6s pH΂k'b&-#@? HPX=laѼ'm1'>䣳f5io}EtsM^-\yӂ3Y?ynv caSֻm$J/r) dy*:D=\t%%%b1(Xx<]j)^wPUH1z[ 2*V!;ł+|j5wtR/MgZvy„ OAgs u'ƪBmFU)((ݛh??"Q ErR 4t]'Hi*RJ󫪪;GSbI)H$R"(^Aqqq3`XDڣhnM[2܍h@F؟/o-Qt- Sǀ0Ain]7n]׻Τ})zo~l ,YňDv`bH{{;׬c̘1鹪iV5 x(Ti(x]7cE<~֬YwŊha.Mз{K,R8n=vBilƌ'CP>IH !X,2gWXcƍ_%`ef ؙn8y9reĨQ,0`0hlllܵk׾۷׬Z@ Ip!fX@=vDS`0P__߸};vYr$؁#Hl [_u6  vLFllllܶm;vԬ^z> HwzwqlܠJpA@ lhh8ݹsgʕ+~_ 7E@p57tӕBƦvYbEjd{ ѿou\k׮+W|[Myqc)IQKIENDB`ktikz/app/icons/document-open.png0000660000175000017500000000143411455414611021530 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵjAS6DР(AV\$H|"t% DшD$LgRt:3ATMM}]d!y)LVEB. ...-͆"9JL{F9.TN ~0N:1}4|ϓo@UU̬p@8pn\9 A]ںrgo>|rZ ̻(2TZ~X?TQ| cJs g:-%F)}>:qg2] ߑ}:`[:'Tkl2tC)hXk Pڕ|gr|sY&O Z"P_, uJinsO˩=5<FZ7ȶzcu#FL7 5\lАR4(n 6W560v$t# 0 oŠ^pJ=(dDF`E2g" wWT| 5ï?;S0 V$`!'nMBtf͆QG(\eY^lw1Z ou"fتghꭼ<}D0#WM;JW/pj]{8tg{8xK/qTyIENDB`ktikz/app/icons/application-pdf.png0000660000175000017500000000160611455414611022026 0ustar fhackenbergerfhackenbergerPNG  IHDRj sBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE!!!999ρ33ssի99ڛܪܷݙ,,޼LL22CCNNᙙ;;qq⛛QQWWJJ]]ccee00UU鏏uu눈뫫봴뼼~~퀀퉉PotRNS#&MS\l>z#BIDATxmWW0apV{ u[VQ 5 6n)'{Xsfp_ZS,?ˑ27 (I Qk\QDRՉWXa m!q<~KCʱO?ksw}lSI@NN! [Gm$ަ)GPkH&%u*kMe+ Їh!qBXz~ }g{O'Pl)wH[\\H-7SGzc GͶI`f-|A^f{Ͷ7Rks3PO@Уl!^XeM2[@O ~KI[B5s2P"^KJs=H5 0$bmȞ>NpڞS =J`"0tUfqh qKAa&!7}>O@)_ *o#Y<.0CCQ_=`KU &1GHvz=-&e{Ax>XE!xo@֙ q=/o' $ 'kwC! Qw6[ C+4dr4{Hi9 9YNzfG7&Gã~doH~)B^6и0 bف`˖j_$3RXG@m5 oՒc= ˕ &z֭"m]KÇ_$oDd!$IQ$Ď]r.C@fR[ȿ6 ¯:֚cDr*=LB{ݮےډtw-9nL2 )"Z@QMӄ_Hٯ\mMY [ӥ% R@BlAwgTà$`nRC BeH;bl:c 76yN2*Bڢdw 9͵Rz۳Fy.#`X!~ +w ,#U5 0}F?K1F܈lnH*ԁ/1~rI5?#4UTodKڨ EZ.ICn/^ pя_TR]NIRmnHa|>\R{Mj~rwv?he"zTXtSoftwarex+//.NN,H/J6XS\IENDB`ktikz/app/icons/edit-find.png0000660000175000017500000000165611455414611020624 0ustar fhackenbergerfhackenbergerPNG  IHDRj sBITO pHYs B(xtEXtSoftwarewww.inkscape.org<PLTE.../// ;;;,,,777777???111CCCTTTuuuSSRUTS<62KKKPPPWWW BBBJJJQ;)rrr{s   !!!"""#$&&&----0'!6 888>>>AAAD GGGIIIK( N( RD9RRRTTTUUUX(YVT]]]_<"`-`?%dH0fbagREic`l4ooopVFtG!w8xDxxx{]C|A |eP`4b9c:rKyUgFtRNS #'.3CYfaڴ*IDATxڵMR0F$m!H-Pʀٸrƅ'p9qԊEhJ6:зo=DeZZ>duؠY鯆ӶaFշ6zBT?SmN( vxTzp*˥Ȼo$uS=ұq]/9)>Q}=x|YO]O&do+3FL+[+r:esT-;L?UvE3`,XLsC!]# fh| isƷtj2B-6_29, IENDB`ktikz/app/icons/application-postscript.png0000660000175000017500000000146211455414611023467 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxڥKA.B)B<4)\ߟݼyQp̙SuuuQf6ui(4e#b"vR`(חBиR aH). qp)A.FFFmD"eu4#GE^d>M(@ tpc5@ ~?ݛ^ k׫N ~^~}y>01>'ԔWq7ʼnkbs477k׮%-0 ]cu{5e6{b [N=_~&ɓEz)leT.l#]#P^=-[XB0?̩d'VvDq$y{"0EY9 y[i CΆxX%(Z ߾Υd|PP8_N0Zu |ʺx)`5[)& XOM_hǤz[t1{6 kngF<s2uJ韧ysh~Ld*k_/34? rbpNy`W<ϔxO',1z!>^Cq.wKL}hoolҘ="ylEѰQUm[9WhXuUZCuL$Ji:Rj .H$l&X8Ǐʎ[$me*˩l62bjzz:bkkg?4:::6Z̢r[yjhhh~@MMMMycgngIENDB`ktikz/app/icons/document-save.png0000660000175000017500000000143611455414611021527 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵ]kAMo&闔ŏkZ?oMAH?@HHJAkۚݝYa Bp朰s}lvyP׮oGQ4>lLZRJ[hig2YJ3NR`st>6>uqݼ09R(DBsA8p<\C097Y+$ƱEKM,qsѕ)d2'qXc:`fI`ݚոڗCqjQ8ma8{ʂ5'wt BPi>9ɍ S;~v\4ĹaV:r#dd̰\fw0:[dp}@VQl4?O!0T8) C<}iZًr^z{{%~!"8ȢvaCpN@XX z S pnh_o4us1c~"IIQQs[,fjoLv}/3 [ kʃHyoRO58@~;Bb4T[woN ОNT+^*T0ѧ298 p E`~0R+/m ڲj 7RR!\޺ǭbȧRAY)QP (~UZqNJ|_8v Bb\t'M^zG1Mb+- ZUP1h"O/CV$KwJ 9u9Sa/@qk@\<,+/zM GP@1{$pTXתzĭR-Rҗx3̈́7Ҏ rYLWׄc͏?@hs!b@2Vt\d. |,\.8n-nWQn@݄ `› ^2V3 M?:{08eࠁnkL)2ܮu"0"C.$K8}成',*H70JBp G?s9yu 9):ZWGTzfD$^|i سo+FGg`l$Oސ;0oFsF΅gLpfI͒淍pEH둔˕OoyR#_fZvjoQ{^OG 3ܯxE@>H P(7ʮ+: Tl֞=κi X.Z4,Uga>P5+,_ >/Umūq@ΩgMmV{n :8@> z7Z1jU@ZE6Mw^cxOXjEO~l],?;ODڒI%oqtxVCnI "PQ%a2@Y[Ȼ*YO E] A'+'IF@Py.U`ҤI'څjhՠ(}׹_֒VV֛[Jy|M_G< RIإl)[j*I:Z{֢t(_08Pس+-8y = yAoժ$@ZW޽,]w80?zNv Cu؛c櫀nn,zUlؐa>\P)[*Zk~+i9֨Q)򿍛}{'G@Ihc NځH}P[*_mn XmӃ8;Z2/N=07 5ut.n'] nߺCGpo&z gPa_3nRue9ˎ,7zw>;jckW-b2H@)O_=M0Ry]yZ]ۙ.C{f\`!S4' `ސmTdd˶$E sP@B_oK38c?cYqEBF GQ`.jTLlrs_L  ( @ޑu|kAx5,˂U9u}\7`ccςo{PَPeòeuad/s?V!E"/xtlBV07vl#[eyseZ_V d^@2TF2` P^TF ` \sNq] c9 ;[6:DQ߰ı^ٿ[R1r")#׌:!{/'**k}%O!t }.`_b~YNֿm-ݲ ܴҘhLgm-ʶ8r8(KWiFky~pXt 9'9;gȎo!GP#$u˱rb f0sxL{_HIb%!ŞzWS4u*5@A' l}Uu1`@.^]ޏx?~xQT|<$,-?Kt 06FC444a@G{ۨ 9snN2O/&!'>^"C[t@m~03ljv(PpPtOpX HRT[ SLz̨3ֵ[C?םwN\`$TםN+lb6g}k:nX謞@님G74C*pv0">מ?x ^ T5sڙ˦%umplus)0f չŸ"^ۼ6Y>>@Y љu&0 &???rm ~^t 3nZo: $ζ Tًn+ZQ(U߮꼪Lj_jz51A[W^N:>׾ՑEFtZة+{VGZcc1 쀡a!ي17LLL6\;XH44}FMv146*sTe8ƘB3K`3?B=BCFH"%$zZ#QՀ%"-ݖewNuފ1Nxt>(Фi@5N3А*`8iXg[c4b<@yM9%P:4dff碁 Z vIY@-3/@֪Qu=x1]| u E>gUީ aTr2RemhcblL2Un+lZM ht 8%.Qw^]G.n`xàLg]q%gFevMr(Z_R$;LiKr6mgOOO5$dumڷr2*gkGSJUQr}^}q`oh=̱+uV hDZdE" \{y`ܫsM'-;h!]|$(^%.Px"EqCʥ?Bp!@PzSnI$jŜYӖO;0X]|IJ҉l_bJ-`-?()rSgI& <x m1ךĨcN;<\ $7 *H'JA ?(jT8;($ܙ@9;5{3!+c|FP8DPkn]mY+-ZĊݜW5Ԫ9zWCIJ-AԧPFſo*w.^RśOMlU4%f3 {3L|O< @#$且@Jo݁Yd-oe>tYs/5@άzQC*Hs 7l>??O|+}IM)B)V(Q GqfA :sTuqܱmDx*3Y^kf 31+;H~{Sx{diZg/wӿ E8 P (<S^(G*d_h{E1 Y|d7]{|1cizyRcX):QTӝӓt$)_)Z IcƠ4( 2cX-؋!crۭ^lIG{.oݾy;“QԱzrȝc( K=r&˰'Ŋȹ  yGu3t,ߋBE efvlPvF;9ԬR!UkЗQgPTv :k4EV!-Р7E_QL BǑʴ@r?9V TDt؟AnCW]У#EzFP=?"zTXtSoftwarex+//.NN,H/J6XS\IENDB`ktikz/app/icons/process-stop.png0000660000175000017500000000206611455414611021416 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxڵke3sMM[JBL$Ђh`Do ZI^UPl]=%6j*NlR CI&=dwf^ߗ첦ҫ<y> 0()CUX0K@΁-U)>il gE]^FPR Vk ѣG Ŧ3B]?Fs#\7D7NiC[8c0v:,ӃaP/ko'ى"Skmh( ,!u,MֆPsl~u j4c6ra=Kpi&I}t@ 8 Dȁ藺gA^@x$ p͙kĆX$}faMm6+)P243R>'fߣy c(б$NXW>>C0U8u5p=ȭ"\ Snpz1 RnF1l{aІ67&,|В_ȕߓ7}?hPCѽv_!. Rw? .0H`K, KQQ8y+]+q苄tkh byw״k?}IENDB`ktikz/app/icons/qtikz-128.png0000660000175000017500000004016311455414611020427 0ustar fhackenbergerfhackenbergerPNG  IHDR>asRGBbKGD pHYs B(xtIMEt IDATxwUչ^{S` e`@B14$^/1QKb&oƒXPPԈHLar)O ~뜳>ϳ󔵖m"7()2k0ϾA3NfD̀h 3 X @[e˖-()))+((p8/^Sʾl2)33kK/@GGXUg:y!/uY󋋋ˊJdz~TUl6;SRRT@TrrŪzbڴix<(++szǞz;Z38`K_*>N˓e9l]BDիܺu'@ ;r~x<XxGܹ͗307G/~>ų )` >;d֭{Be:HOO#TjJbb"G__6uOKKKW>|uf`UW]5}Ŋ󋋋gv:1;ަ*E-x]xy@zzl!]VɄ8N."6lѣGEy X8_x` _^rE%%%L&{lvܑzhB*0d!%%%ÁjULT188[_(q)f[֭[Wz%%% Y,i pB `JJCw:>`2L&Srwߏ墯9spC@ٟV^=dNQQѴ nߏi\.\.ט>^j&,_|ʶmϠK6x<\`:t`6 #l\Pv Yۍ q9,cSII&Yp;4 χu}-ȣq3`Yvm;///j&{,dxAΝ;`F%O,X`撗NJ+Çqx< :p=uH`A?.%%%lDӉ ^cb䧓h"V'06iҤ^xf͚lFe~?Vŋϳ>3K/4섄ABpp8Fd BTU墋.*޾}D0%%% x,??T٣LDEQ_ݻk&B`6).. 4[-[6.[TZZ:'dRq\|>z{{=aOE?B0*삂ZZZ(--uB>'_6i]vux< q3l LH^1ȓB <_?Bcts"Zb6"‡lcÚL]'5526f/_f<쌨To;I#t7&1.;|dT7ۏ-yU$|bq&а.B4[njt]7_;N$3K(!t{TB12#u "y6[V s)5!bz$F;^Yd{GJJ>m,9 4VػwojCuuoi*O/hiQgg% a%m0ڱ_fܹձrJ}LePH:p'aXX5gƍwy'}}}#F4AO|\`kHADnJK jb6BO8$<>^3#<š5kzh6m2sju]7Oh&;vz1D0^aNIBz`@T$ L `KC5!r3' zwuoR\\L}}lv; 9IX;D0%%%W7'wKhH~$o  $t[9RǙO?^G:_K/Çf{1)ojjr 8NxwMMMŋ0KfKGrԡ#G.~ˁ@R=&tK2}LzjN'lڴ)^$nx4׀tbՉ[} &d(C͜^u?0pn,oDP{w2f̘'|y睇Fp^7I* NHH!Fva@lCDHjrR|ei3&) 5C8VG]笵ew>555,[]vrJz꩸8vXk0AھO`RBD0]@В_RPzA2;Cm4AzQXRB}R|N'۬\;^MUU#{(H[RRRCc5k:^[Flo$!w]אn ;^1$2}tJKKyc{߯uuuc@L6K|Q*XSH0?~vn>:),Wʥd%|x]Oށ@IHKR0d5#O{vdϞ=\}|,Yxcǎu N}խ\7;oFwD͋UOOZYx:ae|{G|&f98@;R}K2]dI4C࿘MCPrK,Yyhoo=CTzv3^%B>—j3_x!^\2vU¯na5|\Jh_;vp\2+V+p7rM71\p( {UU]TLHc<DpP G2jʱpcy_p$*.q7i3{K|{cwxF'`K#ֱ駟RVVƷWX,8dYFeTU-p ޤq 2djWX?pwռk-2yb,<1-NE,%հGNIwW[lСCqUdQ=dLDfo{WC3閯ٟ惴q/Cc/OE%~&i@0[ ;G0 d44>c?w޸ ͆(|34nB7e[jUR^Q3FK y1'=}xFִ2nug uso3Q9sؙb!/[:8XU'{7$&y(__Emb.:]$ǗB91c8J<.ҸfQSSjEQ:>4 7mTi4PӧlL^ZsD0B9-3)~o_VH0 B\DfAH}]lkɕY;' fk2 Ɋ:]֜J7c%?m*矿{~t:Vg!ȴo@-"\vUiZ\eYɄjeԩ< )g۶mmg0jvwCz~gWw8/ܽ:H:SxYrC;ֿJ{00X\6?%/1'+RۭL*fݴX1- qhܳ/o`A N\a _l6.FZNAnhhh1z=!,)w PѺѺP b@<}\)̹\1-Z{FKɹK,bN11B_bc>c)g'\;??) ;ߋ;56V1|_F4`N",ˆSaiյ )%l=mH-k DQi˹mn-iueбBB 5?R $efxB*>#e4'>0u Lu,)!F0H`Q`kH΢l +R1:+;[e "=){"8ds$͛7S]]b<= S*KJJl6swW8iBGBž麳 '{:e Qq|k t0ZYnšAVIBfJ#pD}}h-O?Ě!rS>yh"NG$(@ m<}}=N;~8DVc~TTT`ٸ+78`O[ :ٌ 1sN.9( t9$3#:&TbR@A$]S]1(${Rv9r|32f 2@RX8 Jۧ:/4i޽n 7[[[Kii)p[aaalڴl6nn"$[#n ȋv6FdhtV-AI~N*hMLS|Dc:dr旳"R Z`ǎlٲÇy衇7$vٿ?˗;2{ O&|ArS1GkM Q{+i̛  .t/t _±蒂!ġ 5qy=qޕ8*_ur˳ ?&//cǎO?HR"--^/^{$% .tp׵8 #VahA1GB3= GC9Bgs3ґa:U dIm:}GټW~KGC"ݣ`2`| 8|07x#<וL6kR<#~G_ ٌԸzrdR*-?^d%;A-P$wT.$͏@Yd"L.zřcݢM$1fL)wj2shnn-[Ăowrops;ODXDoOʉ gX" pH}qb'𱅷ze/4Bw4!\Ս4y"or")Lp ӓB^zfce!6;8 H-_u^`CHp%JO?^_sg, ̜"m%j"g_ 袋+* ht5;n<(||Ft<1%Ctk`͘L #&wak@IJ!1`#5ǯ 񃱙gH]Nv|I@:Բt`\Cu<]Q&=t_W" .J((vvns'%*zPzPiH&R5_wWH#w\RJb7~su_[à*>< h:f4pO#LpZY0YA6#\qy@tX7&@鈢jPtLySf#Rr"{zZ,xFdZX,tM:Ҁ[um(4WؗcUt"y%S Nps2ߣV iD `Guuka"ɸ`iVMX^ٍM "fMF(gAIΆ8;^6{p )JH؈,˼N& ju=xƱ>r>gF02v+Ow(#3*!YQs $/SRVvl"ȸm޼_|1`I*7hpYhu_ 9S5[4=٠?,VJxٰGDMl5[BB@ڀ`v"i(y Q ,ƔU8) Nn`2#5?яߓ_f<w999̚5"!Te~ wn^L">"R1}qV_4661w6bɥi466( 塇B`oɭO6㖙17}xcml#y"D hH]v]} ˁDӐSrYe)ј=(O?C5kعs?$.IX`x<=\rrrY!{9-:;nlnad7Hi*;YdTMݘ[ |'.rbd5@hXߍQ>Qpv"T7J@>/#$d1 )Wpml$۷(ܽL2v&M_?t65O_Ӡ'6lXlv܎&TX33Z"|Z'>ȊݩA ȜdI J]bzvR15-yL9x0˭J~v^x!~!sHyyY"8ݝ`KEOe"`Y2;@mybH{&-qEB6!Ym[Z Q䎿sF&HheUTT4|**EH̝GKK =gy&ņjh#M>=}:-cTSg̘ʭ2x<5L^S'֡j-΁}R* {Hqv>C5oMM9R޿]S޺e׎d[xo~|>֭[7&W_aG9DN\s]ku&!l+,cܽqEsciȔɘucZL08-=3w,\WHMg ==:t2M,+ev̍whO ~?ϟF@4݌|)>7J'.m]jQb߄@/^'bJ쬢}㗄R,?kXM|/zs]SG_4TUpf3 -5e;aҾ't<:=?tq{:T:Ӌ(K60\}--o`۶m_JKSdo}Uvl3箺ܞgDjXҊRj"qgkEj6^N|[bާ߻ӫÞhQPy1ЊBS1p#zQ{j2 4mZ"%L(e,a`KxLO?)u?Ҵʕ+ 'a:xM_c89}.ʽ="aMB蠻<}mCdexPۅ~;=Q׷#OHΟdȣeO5>g-_C{]q*|1cF6+f"ȸA|z؛qW,eIi 7km#ꖆ­ -|h3*>G5O~cXQQ ,A^{z+ōD:t!3yy8.ϏLWhFW0//' ȣ[ 4r>&F\]1uǻ9=v/l>Wp !p5p؂$"(c"ɘ`zfYHIS@6@, ?K}}}qbĢEs9gѤᴁdkp~t]%0H^t`}>nd,Qy7YAf31nHйjH{:PjW!5o*ND):SR)INLb++3TF$)2-Rf5+[8L"٨ߏPUǍٜ3W?k^:/A9&F%/F<{hկT(Z_R+X {X =ԕNzÑ..3Ƿ>@gZc; /ˬg<^*?O|w1*hKh(>lԖyS\dK= m?Gm\|tRhA= _KW>7w8}m,'7.,nI;Ӭuqew!~?^SꈠFuuDcy&&NfiALp{dA)X9aK-k'%|6[h]w |n⪪a"ьZZa;ZѓQ ֔AޯYu!AnMӢG=lGax@ [308xK*ښ]i&3)Aa1Ff*CUTzjj"&fПFRP@"R7+/G}GPX^ 9a SŇz`_߶ܖJ>m(9^{$N_vZCF$[8}ƍHȝ"uuuuswH%?mrn펈z( 3d뵘4k}~T&]PbQ*7"w;n/v/if?ņ*$$$ IHKK㪫znӦM{~ac.h.Bzs;zwOf(=Z{s qS1@s4kDH"µɮd[7o*=A[/:{Q}I69T=qGD} eB 4(2m|IWہMA ]#@_$TU8iӦM6FPzG,=hUO 9p@5k Ikh(y_?\m@溻KI9NNF/MQLv*hλFu^otc] cBU;߉p;2OW- I2RrЭALMC2fδiӒ >|=nze˖3y2SמǹooپV=aOGΜdKF0ސ`4@vvvB$isB=TUu744Oe.o#g&?+Tx^ ɍ$ziOc\.W75v:{SH dtȶdhCɡk#F{ы9'uVs?͜.DM66ю>wwCHf13g&ݒ$Y4M3 D`俘KЦ.?% q".Z;j;@{UgЄ_Znf[kB]Cr$jߔF ?DТ6 h|Gr$Il6cٰX,tlڴK/TaÆ !|B'4mPUU'0$^@= >d@;jZ_91RMmY|Vi0K/D_ _׸;|X,0!pjލG AȥOϏvdYncQE=|p[?Bt.!ĠiNUU*mxyB|?m L7nh$UaJ\ɖ2p{ٓ1QS47|o~s=hbѶ(|b;vmܸc}OOOA]ם 1|`\@0[85\YY`aaa~\ATyrɰ)aM q88}x(5;Xp=_UU, 6D::::?ú_~W_=4MsiP>{^.8 =zX44· I1#<Xf222TuPj<>x}hAh#Bl66 ٬VUU5_G5k n4x/CƟ&uk֬Yj${FM5Wώ@BaX0LX,z{{{TW1k 3㛊 ËFAk^}8<lv* |pHVp`FdCtȑݻw}+`{p6m#vtk!\c#f;܎z4! n!===}MUUU v]~}C* nCDplDМrcFA3\{{{ꚫstUh}U \u֪AaOChL2 7UWW7޽_ܿx.׿,@P:44q!iuaϞ=oF޽{;?`XQx}}}Kg{{ `G38q"{{{stÆ UvloاVZ,*a޽oF;Fgi*!T_UUUݰaC>_T`7QO @'FDA q ^hP#Ap)J B%IENDB`ktikz/app/icons/go-down.png0000660000175000017500000000157411455414611020332 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;bKGD pHYs cytIME N  IDATxՒ aǿmeעFDjrK yEJI?wⅴ/v%B["bWa-\֞93gyƳXy37ԧ|gA0 ^{Ӣ R*hܴ ״{J `$/w#ۇlT@(ҰL ĉd cAӊ.dbb6Q(T;.EEBS^تh(?xM$~a(c$|.7}ћ|.HF? j0XNi 8<3.1~q!{8v*A\t^=WCӑv?^дk +7/!q`Dfd͞U=v@oQ9h 1@DO7L3 )K Y?c'jy2tIENDB`ktikz/app/icons/go-jump.png0000660000175000017500000000107611455414611020333 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxK[Ag6s A(B5[ HV$B#K (^#r(^r $F`!$}8wx dzBf/0HD7$EgbX]kҶַ_׫//i5H#h ?Z;Z w+adؚ$@ f2.Ƃ]9s-OIm1߹ 7LJ$~J2kP.N* 1Ľ)˖.gl*<.v7kg]sDCw~|=T*5d۰(9)SbcyL{ D:0}k(-:khzz*h4Z< AgG=FD\|yq 3m1-+{Wl?w8۾IENDB`ktikz/app/icons/document-new.png0000660000175000017500000000155111455414611021360 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڕk` uXv*  "d/QAt? VwUP:h=̥6ٮi/n{ǛᗗjBփvO {_$$ZDKn!7ma=d7Iah@Z8@;}  ] ]?S<,Ick@w&{S=uy"LN<=A#=g!$_5&'2.W\~>3 G?G"C.|{ٲQ(N _s8|$/@W]R-'UHa~74Xףk8omoUѽ&r(ʶk{ چ4"Sw5 "Tj+Pmq=yo' Nw"~w>!vI)lvBЀfwV&wSeuiv;,˒."t%#7 #̂n¾I,// aT*NժNԱs}||G}kڧlW(PxzҼvL6MM4KDtr98xB<~"7ZlŋRtx<~[Sh˲ D~E&]52k Jd?IEGpAL 34'9T.V, 48:Taj1.>טx<~{R>1ica߯uczـV.`Ʊh4*_YsZG]]}:]=vfvkBV7^\=yX.,\Ԟwv@apƓ5_YЯH;"+ a{ 73e3z l6o`Љq ̥CwCI&^t</cKc͡L?~xvsFDf,IENDB`ktikz/app/icons/view-refresh.png0000660000175000017500000000240311455414611021356 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵ[lTU>s3ә5\,۪D NgRʴޔP-I4 JJ TZ 4rDCo<4&Ac:{ƄI[A_xZzҨzv>kSdAOTaOa$3ﶻ=a(@g֕|ZhPO _/D*t}҅_ov~lو+a3մ|yЅe&g)D\+~>#a v|q>#bXnطV;f傾t@Ůi^EY=zpC {5]H:Wumcm1֟Y.Gv{6) SA~_>v-HjL j^ɞcBHoN1UBD)"ј K.E#?9j0bA}#9˸/MZV/'1#$o}maXr| 縟⤰EF/)+eP]1(ڧ-G_) `1^wsu8R\ؽEۊ橬To͐jR0! p~D޵<}^³{h.[qTvx1o<侖 PT];C,s*j$a JA iMfOS`5@\0\<'J*Wdg.:_ۧJ5s: }|{ᖚK ,҃)*I0}#nJ+qJWv^zu( r5Buh'B'!c[Vb*K+n܇m۬AI'𚢔Ns.#-"h\ 2dbqRHnM9H>}M:]5YM R"nB?ө(8S98wYGc[m(D31Āp!s码#r?paH=+.\sDq2F,8!y4̗P첫6߅,Oj22',x~JcYrtVR RVenP.8' &xxf[coU0ͨc3 TKuM!..{ʽlIENDB`ktikz/app/icons/hisc-apps-ktikz.svgz0000660000175000017500000020310011455414611022173 0ustar fhackenbergerfhackenbergerhU#Lhisc-apps-ktikz.svgo7)/ X/;E$ph,dm_Ŗi"6vhz8M6Sd">zڸÃom9x}=m>\ӓۃv_A\<\7o9l|󗃃Çҝo/Wcp|O~Oaq7g\jHcLjNڝ|\~5*0URgu^|j-8wO_x W?Ígmk>79Nmoߟnopq{$޾^yۿ8{uc ^|bH In;Q\tr^9=}{sǿ.~?~L:9=xwf{;fxWCR#|*~~m3jq_lw7o~{= %3Ϳߜ]0SƟT;Ǵ)\ܜ^_^߼Jåk/vw/woѵwop^x&}*-s7$/)aEGd-}~DVhe,*l%kl-R)ocw'mq=\~8:x{ c, y7qC_Wn'~9vݫw'_ V#P;G;H i#4gͧ[~|uP_{uhIsRB9= C>}Rd/uCYOյZ tč-8%> ">#v~%t}B;C6j(Eu ]*ilZkPV8ԟZFkVu3CN ioYUk2_7%jpU R~_ QaͰ^ٞwOm #Yi o0(c`@.d.|J2 /}Xs!-,#Y֐-IV$)3偋!C/$ݸ~(Wd$FaٜFE\y|[A2$䡞$tEEp֐}1&%7vhXSp$Jʫ 0vk\Ʈ EXV1UeVVɸƇ'UTV!/-5CKG!eOO(ۘ*.+%$nM))RiPl*(Ԓbi@yb]Q<c,oc2(v Ic7%X|u@!ςv .@L=A<cnc.+Gw|⦠thϮK zTl0a* =!b1P1U(\:Z ȤVxi6ll V;`z`8"O~5 o+A bKD!&,@+%֭a, {Bx DYdVQ ivoJyl$1 i_qp7րqA] wS0f 7fc}j&aR$т 䖺ZOvjEpVlB}OOh-.џuG2nI*T;-U;kP/pܕj7c,oc2+)VRIcI^N[~%ͱ 5x s&`d6沆a *(^C1<.eIj[JvHk-0ܗd`1P1U k.PҨğ*_&+UvZ v 94î/n D9\V1V2i0._ әȬ_q`M;\`t 3eyY9^J dcYZp`M;\`稀pW] @"$+= %fRXL9:.'?QXLuT5uN=JKѓ,^VB>ćbwE.FM:a߮$M N6a zAP7UT:R*fɒ6f_oL"_Qg KKmd `wNƉCǘH2n"#5AmtM"eme$4;XYSA#Zh YLKYd9[tW\E,gc"EmzF/Rx|tѪ" =tK=8[4u9"O1U: ` I.!e$*/ YW6w R-Hq+)."O1UPV%5Zc/~9#ǹx,sZPK-h Z-hqԕ7#P1/LVya}*7RR5Hq őLJNlc R gt9r9X;pһt8M"emeNXLw?R@uyiq gkT8lT8[PTW*\ @YTV4XrG5~MM7Xf 2a'٘*zydLŒ{p]08 rz{SɦAy3MuM(ۘ I4>0Å!G.+-e75ڛl5ho)׎jxEH@ڄ__bҍW’MĢ MkLAî 9E`PIy8r3% i0ۗT !NBtkLAî 3qЬ*DKv+kM(7w)HN|Hے%B.7;c tAY"(koz.W F҆mf'*9iZsҬA3uR&`Q.Bc#n*\dzcE'*G8` ݢ^P'o :S+n EY"8kHy옒 $į ¶K0 O>2bXX' >Y"$kEjo&mtRźBRN:i:=b,mp%wlbqYٟI67 BrM)^h LK(K rJROL/)aj'm -5;֠f'*d9Yg]7&!ԍwharIܻ착fkӚ}ivS2偋!y1}6#/ѲPtpM;Xpuel/9EЬi7>Yɱ + =6Z-"FAT /nJFn5p1YYbl2IDn,Ev'jwr ڝ~Z?~qEjZ໬?f¨m͚>k!o[Ϛ#+?"iJ۠bA40fRxjWFdɴB\HQh0QGe<(Rio gs3Of+W|s 2;? ;%%iۏޅU;h& cII4y6m P¼dK*lkW.yy~($5F?{W7rW^u#@&/ʽ=ܳlIȥ9&-jCT&ds8gw"όuϩ,_OЂcoDž)?[~YY}i ub*ܛmkl[w@4 YS8 qhj&1WOPwtU!&i<t$L?q͎ τTfE Qkiu>僟n7 />ԋгS<"쏁.J)/I{M]10>uc%{9;FEHxpCoH<{ċƅ}[=V,}2X[(uʸʥ`Ne]J<{d.֖Wd+1%.2h;wEpysQolw9=z[CDZ }9Fhܯ'ީtWtZ [FX&1AM)ZcGz4)䮮[z>夷aO΁dK b$&y8Gxq~g<2ߨ?s*̔g/_\AItvre).}={LF2BLLZ7ټ)Q1z"u ŲyLsciH*W0bѣrвI@7tQm=*ܤ-`ѣjHM֐^jРGcDb/qI l^I10-C;aПР0ac<26X.{)_&i` oI,B'sLy,e˴(41=^)3nڅ,EH0\3>Jf4vw&)5umEhtlhZ󉛲:1*C,t)fL ħPE|tM.3Mn(6HRWJ.О-3$Y 8&btm\ bHF.FՕH.Mװ4Y>S 5 h҉j;tOKjɍ^4XH\ =1S>;1.'m%w +ic ]#K\4}yJP^;76#rn^&Quz$7oDW]3L"YnL\xFKι&< ˑm[D}}78Wq sVArH_,I;x Zl@։#ɞ7#lCjp+żmdS3rD8zD)m!iEۼkҦ !6&zJوU$s:yפMQ \"C6ԥt z fc% ]Cx6uk"Eױ7m6@SȤ7A;nը`-]g]Ͷh7* MPh+-|Vr$P_2WFv4|# CY  WAMzS4'zn~S4]ctllvA,]ڲ5a7N&x4]'|a 4g[E ~c =|0D9:AڕWNy4y0ķ1;=SZ,Pm,HNu" :DCF4²N@,mU,P?ؘVYѨQaeFj͸*mY:۪Xdhjk9w\>\^ζJxZb݆H>Q x%l~*+@xU< &4꒼K>C~W g[u xAHShK9(I+q@yU#DRZHawӵSmUJV ^ݲ^ QSL Tv!͂ g[ )Kucb z94Xf+Yγ`7jFle2/k"ůV; g[ 3[#o@)hưzU@Œ[4iO9ȡQ`p8:>۪-M2 ^ӸM#h2=},AqIE>aR}OxGPZ&tIvrce azٱQQF.]zHp 5k:3?]ҽ ##(d+=m@ VGrR({*Rmr cϝ^\, <{O-[Vj&]u ǭp4TPdynաȦm"VMõV}jfB65h!Ķ^v >+=v΂}LW*9T.⟣r 7|m[cyx2} 1_Ύ{KJEWofzV/3[HC8^Z'bJT;c==IJcF!x֥ٱck$Ⱥc$G;Ȼ:ڗ\v5݋?J,>ĩ PxF^ߕ5w0wc/g2NYp<Aw+bfGԷKb~!Ɗ5XXH1saûyVuUG-Kr|^ANUeG^$8YkCKm5+{;64w8 ]΁ ŽU=A]AO$qoKA ӏim\b!vѩdQ <^Vc94H&+8V=xkCޚbwن&#ILЭcSQC6ٌAe2Tx]ini+9'g pL',ņձ]Am9X/Ͼ9-cd0V5ka08}PkB=Ɵ';;6^ۃ[yre>So S{e*k^Y{ER~bAQ?~]Or͛|h_ae۟xsu}~q}{Jp㱫.Oܽ?ֻaί~kO+Ļbs ./ugb ߟr}Wy ߼/>{WrɺN>]ܜݜݿ#1[cr~?޾}Ww+^Pp ~w;>n~wwb4_ŏW_^77_z/z?7>~Oɝp)c<nwz\|w'4}W_>:_~ ܻy?~Nfr"ll㼻fT/n#PKa~ #rx͍8qל-%"F\x41R`?ݼ 3族X7Ii?˜_N/xaN%I?f+v tvu+gwWF88ZӢZd=GʹF/p>d̡O,w " 4POd.̂R;I(t :qÝtHS<_N-_I͂2T@LgIpTSF2 m7_xh67F^\mP D%PpՐmז0QaAy.! U&*XrH'$VY j(|,2Nzԍx}݂/,; *]6"HB{d T ^o%H$aO\zQ'Ɛdz8w?¯2߹Z@~Mގa%mXD L~ou,NrLB+oȷˇ1Y<dYgM/@i3vHq=ď i'}so.u{"׆"s5B>P ZpXzK#QʛK"dL9gRQM+ճd$ ,KĔm-XBMp":K|%.S| bM|c緗ٌ ۝ l[`=9Xr7Ր{;%#$,M  {g)͍kP2{1 쳘MBw_鞎}B(W5: iqqZE}yRTʣuW ͸6h!ˊHq^9d]lf6}!Sp #[k0,A# ?yA/DŽh2?sb3G/ten`P.@ ߁AuNk;QQ Ս`}6-h-[2Byz qPAMG,ϕ!ٮpj}H{:~Xj, mNM?} 1maO oNbΒ!V]7VF:iBv{OKA^KY?`aٿ嶼JE]Q?/¼ 9}&ޖB? b۰Da=..e¬/[7*^L̵ifshA6Jb:[0M?] C~Fگ8͢ķn/d `2\71HNf7Lf\9!?ɕq]"n".Ж!F}PK<w!x ZsN 7yvH͟uPKÇ@k]Zz}BU/Am_|V.KZ}qE }/U0nVײ}}xN&~╥nJnpRމ kID_{=LK ]0N30{BH-ZSU9J(!aXcصZ^8> ao.g!з7qvqx~  ;F(KZC -Ip]:8X,[l[ja7aGuWZ|世^Lr0 [)^mbP#NLGt7bP^ 1%xP^"ŮߛBo[ϡ 70yfp]XT<'_R嚽_>y_Ã^rSBg([f:!#da`+ Jt!Lkv 'L4!ofQ8/9dh~[Ȅ ڵ]PL/̦ 3Ɓ,lŕ0e@ 6~cB 0g6CKwbm}tв qCŘfK|O=^Qj$F;НO$qخlN 8lc, ̊>X{f<% i?Ny]إ*) K-":ڱ`H)?N]u%߷phVI99V5޼!‹Aiyu3޵8O+oህ™ |zgIqxBTshbDL?>؛ReKGse2K֭%QN9:& ?∋RXPR9 -^>i;L-b&ԡU=pl 3cV ̴8m+C!TRH{r~N1ӚИ'߼8^A)i|,H ^Z,źX-QQXEq{ }7Cm6n ͐8yw&`=g 9yՁ%KMaGZGw* u pJ1n 95N6ߌӴ_q'taWµ%t;uV|c5+X^y:4DW=~FvAėk!)u~C?6Z)ٶoffX!NNA/=s[v_jaZAG"^-D R,dR,Pː*xƲp~@MZ5L a~V]0mXfDc|q/$!QF700,p}op^q'b[2];\2~djMü9`ef!쑰0[vm1c T*?ZtpZb:b}82[5s*у!_Xݰw-! 4ݶZH;ǭnBmRN>oCgqP6;jVks, oB03C?C 1mB"5)Agʠ,,6CB!Vġ<;^G4\YX q@|~#3E\:pSR|i@,&*mbˈDmԁl1-,-b֑!뾵t(! uRWM ^41SYq\rOa(*X8H8G?¬phbԈH3Tfp&:^M\恄r~$^&-gD tN;|31B,0lC`:~lH=ȖEaʰ5pw(_TPu ݏF'\.Z :bkȀФ$;YM!e\AC~2򖶮ܘPմ-\D_nWO &+rҜ0p[9s* PHӚyVs)W3Łęgf>(ƒG+K);΁ u$~ab](̩[mZ Na')Q(EW֦`[שCAC~sŠwtL ~1-lPA0eq/M6&] HRi?Rx~AriP7DRg^T)Bng+^ S6v,.bdn"qB'EfcQ I/iA&Ʊ"ObˇIQCC`B[mق*x_S3)T˓XXf8O*tg@5 ށ/TЮ"5аUu jehGx,K)^>p#Rq?kUVf[? a9,SJ nF}!R'3kzF/3z#(A}B-|%WRp4T}cyaU35GBۘB6v A$J]qv#ؽ١苶 =*4wFOmm!&:.T 1+Vd jLFg&ᧈ;В6vz˔[}9ϪTE RP[BHNƐoNJX{I?qlZx]| 40hl.nYmp-h}U[yULWER50͝!:KhCMOḻa=bɡR1kjk\!gNji6{k$M.";g2yb6mRn>y4(;ĩғ-QGU.HHN:)OMJ |^WImBܫ.&1 agnX\*Z;sRN τ3뮰=3l)Åe4v]I/.ޒRK'BȂXnO&e nZbJjRӰEtEoeKe_X|xea8Y]/+ |%EXXA(K1i#l\Kǘ؂DQcc4Į#63P Ot\ùQOa[5h$OVP[Yi'>͘R+V3koV>Hs! k.!wR>,CF)#57ţa;]<`>ʿm䨠M@%(JT #-y Nj|Ls_yԩZ )]> bHG> nZ{c@nm u5*z6t Gr9'BEՆV1vlcIAY$Aߍ ii> aa IۥRiΡ0Cj`RWE&q7x'½aŢ]_ֹY}SH"7pa7  ZKHF))BDݡ24o/qB@'gc̗; dE㯂/&#PVI ,& (ZI\J3sWCSо$EH~/>8=&_˾Ən;)Yy`T< RJvW0C H^t&8@F*l'rs)STi iVaϖ&O#~{ڶ(GaSMa\ze#[]m{>|O998f9H["'&qѬ.joP]ҭ'j;vCA0"x#v,hh:38P_X#{!+Xqz,{C.wP=t b >-2UՄPsH(Fʛqm]D EoAߏq>/D-3 Ij>{kjw򺋝V8Cw9])6&mZ&6x򚺙$*6Z צrE`it3O.Ye )D!~Yt30<_=4cB´+xFA]![^qp%=T!!jVeCEY-hn;v-Eq![LW^*nKãOR1B/YvFFo 8#75'.Z q=wǜQBç2 rD:C-KAd}ONWwuͰs.Tkp ~|i6}gF* N(Σ*3kfƍf4, zMZjUT/L)j{ AG/(A o0.J1 DƅrJ $\jDZH@o h@ah)HsypeSuwx3 cc WF&ݢp!E-NhUHu!]K^hhwf֎fNCPSCA4HxKqBf:ﰓfPK42V DJtC<-9نAH!@^M.%]0N!;wAii 1[ Ex#7«\ZPuE4BÀJ![1u I8G.Q+Gk~G(R͖r{iH:SO{*"RrBC ֗jCX=;> PZbWhsb5L ݻLX,W*si8Thj84\ ؒ:GTɹIKTz[;u_(-f=.( LەL5G$bA0>!=tM)U7?IL.$\O@+CPaIzIʪBz W)XDʒSv>nbׁQE덀= {UwOR{J<"BE*<*<G>DV$ӛu4mvix`L{Ӂޙ-98J`yz3tP#zx{6AntmFM]}g_p•jڕRMhC2^kqH0s% Z8=َ PB˳W_馢ǿϢ}fmT\?Vk%ҕSmWJ 2@Lm(誡DQ/%o1HH&T8IR%"M5mujIOӤqC-DŠкz&L}rh"!]Hn|8跣N45Fy+ I ugv!Zscҭlb03>I:>-> ' 6_BFj^M_בk95:@_\LL4*uC҈nq}5$xe,mwiGJ'\q~PZ Kʡs +IWsN(N˾U#|IO%A&t CWuԯ4 $KBGrVsˀ.t =B(1:iܣN$El(0it6z+ԛ+Zkc3?z2xC{͇ZK6-mVjwT9ZSLV:~ʥXM_}%W<}%%3 >/ X)ZlfRJ<\8qY$x/ "wJw/`^nՑD &̓JنTt`3#>LpC|lLqC6ǟ)E妃G%N lt/)Mdb|PMdP+9]QNxC (befҽ| R ?{Q)&RCMz=3M([OM3;wWP6@`OF9VVy aYwՎ\J f1k0vV18VGHhCA*DǓsB$u:L9tC_SIlI: mKvM=]`r},Ί ?.Za91ți{Hts5 Yꀞ(abG.Q5P[lڱ#e3m'C 8[:c [VZk,#n7nDUtG(UwmA[6LgVHRE mpACge"@Ǒ|'S1*eT|Qsx՞mQs/"ge)$#XWUt  @!>s:À43!ϩc>)L|h_!ߗVɒ%ӤSZfKӤYE\ӿf -EΖyo30C8^+փr[+Հ<ڲ 63ԚXrigΗ :8=d$4N#=(^mheO =أ!1> 4:y¶ lc|)V?  81% u'y?ݞi뤃;޴,j5,UWZaC{(YrB 5L*:pTg% ]v 0IDBU6PB0WOl}06U!Pd[S{؛8Ld(ӱ/X^q^K]`G۠O?ۯqYup:L>mSmZlL/N ")MSW.xpRc4eBp$ILCB#_W98 %'E-6*_S1K[h0GO)L14 haVhݼanbaV"j-Uh_:x>+,*E9 n1P8ٖ䶸p- v _nW%v5T2Ag"bO=wӽXd5[ŏ#p䱧/{|;ZBcG(ep*P ##ڶ{ɽx͐A눐u!n@6̾#v{upt[ f0 ;4\МuMk݂/kfQlhl0ԻNOcj&3EC}EK~l*B*mH21j4Q6dh4BNq-}qu ]ɘ+,N59+EWr)bpR*u[NHjRC4Q{ìI m!-jX$KԉHc&iy7"aMƪFV݈$aB3xbTA WR6āx!CdOQs6ܺ)‹NsNg˒J@0`S-܍b=晲8þn>uj6{Z x¥&ˀB=>tBi2#ly_Qa##*w mZF>`(d$IӤBۡ>M]k$lUL/Τ@SA8@~QG wQ}rj2+qqo`X(ӻ R}g亠Ӭؤ8jaSq4_.&I !BRQ?DMt㥺]V Wv*lYH:Տڢ7k|jfڷҜͺ%N**qW~/2C-=Y\3fC2+KM_7=Vo7:c S ?0j8Ԥ͆ꋚ]5TvzRJJ^eMKP.w aP/oM-˳ xTh"鞦sC@%ߊ@,6蠢 1yTnӊ*%QT4^^!)ɄxI ӈJ&;V-T ߈\-@1I67PNw= Z,bX{Wڂac]7DoY#t6v-Yo/UNﶪikȒu4B鄡ǧ?H%I,dk 1i41]˄**Vmk^,/DOit^%mK˥k|!xx|jƪumD8aoZ%&sii:Db.k!\6p|:s,D@2UZrO0;>IHH!qLh"1˨ Q+Hҧ=jXڤ*0-56D;`_}_"sMJ4d䞄LQЅMiWxW @5D<u$Vr8`->ꜝY3l1 a!&H'/%5Qf`:7­T3l WWv9̄@-EU{h$Kuoyi/-4Jyr]5YZlMR m yUwS!ZSLL9j^u/M6^~[Sp4 hS=P仇?jKxg+I74zv8ejܚ _{-IyHtmj'ҙBPN`~i`̰NZ^rRצ3V=>`nFϕ6vT(TY_^a9KN+5k84%ɕ<$%j1Ke=0 Y?Xq{Jl^3!BÑbj2*ͨ4)ا -TlIѺiSa$<\5GXx@O&ܧuB~ݡ^LY 2ݶhuK-FVYPLbʽv<&-Uj/t=it*Go4X F؜p5Pu?&>I i2cF@HPXeR5aq٭HH}ԝ$&Ɨh1௨f^W4`j8Cq6hj ml9D]Z,pl1!}8>}ng!A%O:wOgZ420ldJ7z鼗x/yXh30Öԋ 4L m PCZGxt!Q-̀ɗ4ɷ̚ch7_Tց֖ ֠Q]c?J-IdgꊩTp@H烠 =ӆ 4}/1d:廬kF-zeR2XÞ'˒z7驦F*t)coY!f9AAN/!sQcqo@dQ^`J#)%܆$f,V^9~nX Pf*Ƕ,DM[ie<׾}]W-6JM%!oh @7ڴ_XG7CR[_IK*})lݭZqSR\(4 ~tƺ3٭`7;f\WcV^{.&~O%~%^qZ - 'ViKEM9 ֏~)]fh9RIH2ZlY' *_ /yEe-52njolIP 3'+ʬHtV~9MN ijNQtmdN!)nkVߍkn<#Q{[LBL( M=էQ *@c0ԪJ 1OΰCW `8YugZk9zu!D*S8`̛Btp"H`ʁ>T)l;-Qc0D,2 ٗNEH;Vr6NBeHWzp`c(N 1ck>Q{u[XeB 7hMn1>)M 8}sl[0(JT)PeHuxΩx6T 6OFXH&ЄN-`eQ8sh.G5JA93xIܺ}!&;VR)*$̩..CP8 s^i_V5W׋H,ae}wCSikgÄ .D7njM쟦"Qi'|"*>T"bыlI ͷPHjNP)d"Du{D`7;q`q`z @²W2Jo^mx.ģN(q]$PцHޓcD=>NQ-HM^1\LlaW2Qy+Fѱ!޴<ϺEn;T"z0P^@VN;a<^@$7ӔcNlrKQ%FHt]ZPKKi+ 18 $黾*$ü`H2*i.ǮP.!ែ-3j@>4@ڋZPCG yuPG_HO؟qA>~<#b}bLAnٔ+fa4Ahh KX˖$)0ݝ6l˰0LCk\JNK:Dsk*8`#HeJENu@Ё4m7'.~ўwgEZC5F] lVLDa%uRn'i0 jCʞx;R UPm|'+4n w { >[}be7/Lq᷍14ʾ8 tW&F$s Ǻ=i3rQFg,{ASMك!/L3Ď` Mhr9)8bM!WN~zfSu9\xHK5 ӥGH@c nea_ JX)}b8Dc٠c&?C`W1:pͼ&'tX5SǁPhS;anu^Z@R@Zc⛏D&CQ@E0 S"L~s I8al RޣNJZA bja@f`UM/w-7Zv"m*UfoaT$9M"weF9ڒy:h =`95m`AMjBS_A%À=7T0da٫Z4vZ&bVF'![lMzDu )U]҅WnBpZ4j V 5U~+~ȴČ8AKtC3;cac-V(M/+de4!@3`2Dն!/`q1$X(T5+!ZLso"{h5 QǝP I8 6Mnփ WEs-B;hT"32Osמ!lATA& yAg 5E؜ Lj(¦iF 2DgWi- y̡_BI_-(% _?$zGj!(V5x nFhIA6I3X12I7AŊd0,މk[.mDr uY=^{BKd-`,2ǹ2!yF7DULO2'|=HBGDYK#Jrqc ȎPUeiRb|CKILu HD~Ĩ*_PN+V0]hЖ:(@;=[vRo6@V :ViaΐV'~Q?R/U%.(+ ISl><-k ٛe7&Z n 4̕DgNvj ]3 56O_R(d2'ǑCjD"0<ؘ_W6'Ix>{k[v{b}|?Fpi=8+u~@8FHVm W 0id AHl#11otPK4UR\MyjPǩC p)u$|aNb ):L% BJcD&[ R\ 6SXP2D"j9UP 2tElk'(UY bP8- **'* Q==sUyqL֘ތ@24U;p'-CHMjXS37[yO. Kbx)g膠sbхZa]e( .v ?Wbq{n&G ?p 0T $.?Kػa*5STWy!  H\+^5mSLQYD6=L]OڠMrc4zc*Oɨ+߄Izch3|7Xf΍:`q>aߨ%'4kw0f +KG;0LhLJp= ;Lc?kVp^K5gAUsqmc9J_IP N}N AgH-2.os4J'k3 Z 5Ԙ)-?EiCw3y?(wa#N:<^J$[[ l CL7e ;Bѓi䠵U.^x 8K@0̴a[龛 d߬)[ Di] &Uö={tG-2@/C r.3%yq] ƪ!kS%~ciL A` m+SU:w'(ݡHaK4qdh Rғ:+ד8I36ŏPt?ك <@;҉qi&b z.Ad{ p(ZrkNKC4v2QWl +@X!ZS3u6& TlWC_bqe?s(0nݽn&;M#/ A'"сauDz!Y@kRf P$i:9澙>p?am7 L| {uFJ~$* ~єt d'\Lrh7$*(wѼ*@ Qr)矜y.xV%C}i,P_ 3aJ a4ߜTiEP3lvs2$x|V*t*x>] tj~# .C/Ņ(zg|05aObZ=:g] h<my82~}GC 5"g_Ьy ^@ꋐ$d. |9NQX>A rջ䭹kϷgR]U!,̝h|8Cҟ(ˊ\_[GaG)W;^Ro*|@k3 `JCIm [^/4NXv)D'<6Mu.DV8|[ۓ#ӱޙ/ M FqMsT궻~.9ީH.QƔİ Ds(>FO'^ <_Е;A+g1g H|)"nox/a)hJ5GL}Z6MaE<  `(Fa] ݇+,CM=lf}b#&-#88ݎ=:urV.8J!t%չJK9\vW&RhZlCeGh`C2 P!6Out&k9̴,)OC  C &):- i7'O {0l1U3qbV`bO\@'fzU| 6'e&CoLk&<$xT;e|ɔ T:Kg7)n6Y 6FWC pB[ {[n@:>A94Eڻ$㿭P|vWgӼ8ˊ] 2ըV!w4L 3@3A:mo+[W2;|c(؏Ug~kt4p`uQ16C±%|-,G BEQiج"|VKBCPܡNAA`8d- }\f2O: w63~@ T4MqBw6ԿaX!\)*z 9%@+,S.%Wfv/kLC}?glA_ZuQV. :lg({?!ghq(Ԛ(&*!:T@g%"V 8{_id/,Q&to2ڤ|f WZ!jEt LubzJtZJF}!o zAīm:=Uh|T~k$RT@{}(<: !%jrgL)c!jʓ;r[n0ɁMzW<4K M^ׁCz|ƈVs`]0="m*ߥٮS~pJ+PK ,{^iƖlԤ@^x-kla5f1Jfv5Xc(d$GxSyIjjL/i%4ogFr})OxaynA# r6 5/L#[j9c]L8Vgzw߶%,' J`f n8+1Q2wH,-D UHw&$O%>fK@H#`G]4^  Ơ15J yzu3IJ4*!Lp >BoL>l9sPZs2(_Qh09D?}+ Rkh0f>$+iUz2A̓f-Dܼځ:mEJ{{ީ9j7V4wr3tJ_df58Y4nZ/nWzP+MD%gQ*Gr`h wN8jiQŒO$`f *o@m2Ջ>xe6A=U 4)8KﭞDC Vtk#%4TPQz4ƿTLc@:$ `_S<#a P0NxC%!:MZ}2ƕjI]e,fg\EΘͺS,Pu_42 = j- Ӿ(b&4;OV(dOjPnIxBƢͩz *Y{  9BCsEpR%h+.sؕrCM5I ohѨvՕmAbDKc%jT>{! -Ѵ[HȽZajQ@LF Hڢ]N" ±Z #H` Ѻ*odHAs~t=VJN- vNߩ' MEC(:WrIlC!~զ NS!HL%0+"G#ܤW ~ً&xh\mI.`j8[2>WMi *rEZ1{P L7?^C.[J*ApIg%bp;llׄ\BL'^C#vcӘ -Ohp&q }ZXԜ.@?7-,$Wim; @Z|FIXtt mDo`$] %V[9Cd_J.+.C3 yը#+J1C$xIĻ e [^uVhصl1vFOl*S|W T@O8(Ġ8([qJ(#@A{tBe/Ԉ;@n AꮉDP.OvQ'$$ZɣPu)[)Sjo c9Da] d胲um]b6$ )dVF2cdaCӆDFQK^3͚}P&jS[.t^XGzP "96 0בOAlzF-p޶ihkB['dgyZaU:DLBtt#1]ô>AOl-< Tmc•pR'|d1g+n``J5q"tH? #ESȮh,ri2d[ C05@Q:p(\]s T:+aUVK'c%[]XcrF;4 JYFz7қ[NL`Aj!BtZ nYQzf V}Fŷ^v;H4g2: i$ߎvCDVRH[p:݀K>.4UĪ~ض :;8ЅuA{ xks*CR2l`c:ɼP\+Ss8ڭ#I~ޑR5Z#%;FҲ3;|JvfPQ}*GF4@"tľZ4(y);lUUa10Dpy s-.Z9|-Tئ`MBD,3YWbОj3_tPc̼rGEϞx~ ãR@B .'1E?&͝g CHLw>NSkfwa4H|4 anp_7Ҵ5;?:6&JJs$b(Z׵J؄dA~f~0 0%J'ikրjʆvp Ev' w;$3c,Wq!Pu*6خf[7{[-"暖L%ѣJ 0!t*!CJ9"QlZ.RozqпB+u E3 &RنqQjo;6'W:J:-%3!SV>Qb=˥ȔqTN Rwz*L 9k`a% }ו e0cX2qD`afei;doCDoAֽ:-t^֕jZB"īAką L~'H"Qժ?ɡ a<V>|-wy83B##s(0FM;~Gu=8 )}ϖ -/sfkMՖT8әk܆xCo5 %]s/+^A )ZkPLcD"!NyPݲ=z`-T,lں 0-hqe\B[J}.:_}1h~s5q$ĕ|У,"Xר 1">Ed`l{m@Ligd>pht@4xs02pۨu o&+W&&Idn!0H16s+`++Yuj #<. cTd4 |+bnx' Ӵ R4$E=I{R}Q CLEoR>.!gLtZaUtUB_?=o]4YOs;2·OFe/#tuM *v\ yh Jߣd6pm1M `}Vc~>%*:+29_qGq/]KShOauhe;|sĺP8hQs>$. 8SCK s& cxv F/E`muX, OuC{-@zo% ÑjxJ;kF˵0Ln:*}̅ hCEŽ @˜Z=9aPʤ(X;ߐm+ Uy05-%E UETZ0*vෛꙈTo/^J79f5r19k[Tte6۩DLHJ"3Hf>SW})˱%pLu Wu4C6@fJp0l18&"ldb[ zHlVQ],E'09/w^%n+GO-T`9HdAb,բU {pIH[VWOtݞb?Lw 8!2@TB3 -¸`HLj;Nu2tb4Bo AZ]^wv*AZ(hPA%O5!Z ̜ (cYf$໙l*Gӕ4GlK#xE=2aZXЙ?pr X9]w\;E)6{wH( kv2뤖-atcAнĭ2c laNI6vc% fJhLL劚S(rNgLe0$V/*p(5+5-;(`.! gX"E!O8)jy%J\"tUq?B pKSѫLp@B6a _Oʕ'_%%q%Ǫ+l%{aRƸU0]slb&}(Я0 h@j͵'>-:l&e1H*JZ5Q4ltE*hז1:-f rs@-Mچg C}JLa-&tiaOk!9m XnF䦑4W~YZ+lON]ĦzF(iE֧ݿ|g.2!&%C ,X|a Ŋ}| @L+Ӻ"R|LGAaxVhiG!Q=%ӛ-Һ{!&2 p,J4Pa~ c{8~rz8@w\Ն46$#TRG2!ۡF_`IB6p3ó9n:԰vqcŪ )0? oݻ fiM[S(Ԃ%`KN6vYAHJ0(o+u%=6ts4( &\-Vv} 1 ܂!Tv̅{n%[Ecv~7ɼ-!5!XŖJf@j:90h{Â)fB>(}lC\DGS}w),e YuiRM%,X $wiZ9<,.t X#SGj6%7XxgLs@4;2^P7SͦT#z88fnjI@\^J{'p-4홉(2I&Lk2F0J^w^.WfUyb6HgJǤXd{xk:H.$J=L0"w [̈́-84 GQI =(&5`hz_4I:=r%EGQ>#+%>7S?I& &Sè"-QRIWe&C _% o^9`cb<7JS}QڝN1 0Iv o^Z۔:$Fw#CWCIt% Z£q %]Cn|{ j4肆ֆ&"^AHQbW++G^=(/+# |3GH$JCW"=izRkRIf1iiD'`>to$ϐ#E`7Gr{7א0bٷ"Ζ WV2B#~fË*W`ݻ ;B}.25,E]1$0אJz0ᩔ_Mkhb/p=gV۶mTX+.J%F />8Lc1;lKobdr[S:ɩ٠|Mu.CcaѪ19d(]=ŋc^iq#FB-ٌN8úE+7GTG.ֳKv8eVʻCC~7M?fHZ$F,/ͻW[SMR;9P(2Yļ`rj`qqدHɾ 2MD-*Asq.V8Eá>M Z1>|_z3=S#!.fk*CfeZH.I([FJ _\Li7 "ȆG@ru5<v#;=XGѸS}n44r|{<O)3GE Vu_Rw޲KoOŪ4}L_.mQGPv]:a}"wIrQ%"&` [4SET#sɢ9 K:[T9'\f0AE5aEpw P45uWDX=m<{W}ir9ר 5%g Gt=wNڡhZ􆻴VB]5Hÿ׀;7PGT}0Pz68yb!{'8^Sk}t~Tc&C{ :uٷnW6 -$DT歛'AX{y?u.40L]9<Â5VhʇU m8SI?iɜG("*fgRͨYh3}qu'&~|B_ ԟt`V6`.vf{qY5e/B 8_Fi()-j&6f ,h`7ahioh<c|WQ× S8GoP|F6htɴDӱȯ'srpc.up(y^!7hF^=4e-?2>x/hn@ۥ=WLYꂓ8 &w|Hf cn 2Ze((MsۮG}r v1X7au ZWw/pba]T0t]է"{M؇Y,cubcūbvJ)10 fAAiB6ϯo`eZIM:4q&G>*z|BbjgYAPuc,L.Ͱ{oM0x2 \3U͝%VyTTPj@LqOd4:!H|D!κHDVȶd 9ZGt,|!Ȳ¡ oSUo)D?ubpp`w#}TNObj59&XXJ-?DH$l,|vwjD$' NH3go N$Wh\dFr (d4 f TKC ,CLJsc-c^-qQ2^\aϤW(DˮQD::&BDs;8,bzЦtH7ۖq\(# q25>VW/^G9:!X_FP+sA= mAc21BJ9qL]]ϺPsPy-~}k&B$ {3 X5+Gy$0 p O Zr~2@@KSpv-N x1pyr^.\)-J_Қu^vKbuzuel֬&+1b]!GKO&4@.#5=w)(b?0:D s$V?l%. G^SHqrm7 hFU,hG9B|I@ pn&ˀ4AC>`t 2 j6HX(6`ݽ_Xrn3J+Cnj)Hf:ph{").B:R8A3DJ-(قYE{,+)u-zFtD)TS duAq&[%vŇ4ʭ Upz8f4ʯ+@]е(Ϫ{9eSZҋ곶AJu3F@LOfV@KGUPk $GU_C&q=m&I/|a\z N82CV|ROB+)FKfq@',>hT%E@m@"QSMۡ = |r0kh..w`fUx-aa? ť'}Bۧpߤ*B<βl-;gs E'; cִ͈wf4v3|pQj0W?,p$|LP)^]tua1>0po"EɵhX~z{`Ab}/6>Jvu QF D&ux2jR S4솘ƌUtDM25ȟ!lE K1o{ԲNnMZhWAB[vCbhwO++zt%ዩqu7QR,tݸ4kkn!U2ebĉ.Z8qW$ mP?2 nUlYW]ms# ]G&00Tfv=7'C,Ӊ`=&os X0@6F+`r^GblnfQjE hmZ0{hP*}0ਆ:NF Jؖ4nXAvE XP90O1ĐxME26ܣDzEc)Tyx%Qz-;Im[AN?x j(>OQcR BV=vnciO 퐀TO Hΰ6Z]5\kGh#Hti}Be+ K͐8Pm :]6{੶56 xS#1lh"2wmDb:WAz0U)CkJBL0F3%#7 &0!b@?e/$~ WkLc(g{2UO 3IbpL6>B9+PH:(C]X0 ؎k aRbܖdc%l<˲:VW.gu>|Z9y3881]"EM'?+['4@%ETᗗ | _kCU/) Hr38(}柊a0Vrd8NS#݋^brҵ0awd*tD 婑Ϥ"Q; |6 S-fpOqPn 4ּ@h*K\޼e62BS3?0}2N(EWcC,8tpmUC{jA^y hċ_%/[0]Rn,n( l(_ ҜYe:lki:w9W`> I`QMum*tI" p+Nw0|%Q(ec(Y(}Ϝաs'E0L7=\&PKhf&+/^`St.h`0LZȃ P`kWһ6ts(%э} -zJkfy(sa5fF#|)kdySn[nK}\!3Ag4Q{nY'e#<\*2md"nJb"gۮpŐӪ^{"ELOǺކ ljQ)P۶C3mqZMDJ:g&9/lmoa̋D {=D~Jfx@AKhd% e/h?Hłb0 :`#" &C'Xj)pܹ}N6X|cidlhRȰL|3ѮMNIym g(Vպ P^1L0$KK ЉDro %r+("];*$o?/.vBA_QOµIB|$mVLwA $*MgZ)Q^ 32V ԰7$T7I*5)A:)&6Zhhz+;ϔfO1!'9ڌ68mzBٖ5UA'_Cվe [l텈@!Fh}^|lzFo53+:&Am i)/We˶ZEh(zpbwaX. ,mT &.bc6:-5,!Z57N:i]ב_$( >Dp3: pQgt3+i$& ͨQ C>A*'*Ƅ X"t*ito+ Epr1t_ŷS"$bwGGFo)Hk3n%'w{I ^,@>m]IO1 h]3`Jk"CEJކɼu[#zuܖ0 OFp.{65X<s^`!JlXnK%:^$BQfA %Wi#|2dLF1VoBK5kzD&px,G2g^ΪBrT wExN_YP3QE)UR"a`C$:3 TT,bδDnYJ u-/ma07=EVt +gCYM"ݩ<|װ塛+(Gk-͋&',PγRUhҔR Ya5 ym 9Θ_j[`%Bk%a?SRfcq0@QzHթ'O[ܭ7|Ngqj:6W Bƨ{jd۬6.ଫGWP83~>4L͡0,J~f. `k,)^sÏ A<ת_.]Śf Y*)ނ<x%ͫTfvMXu8!qr%&$^ЂUf^䦁)?w&KpAAɧ6`W *,&@PNf e y|Dnf#(PvMekh1' Ղ%2xGpJz.0HИoOF f 28J0t%f!:Fj' "NxW4poC$eONxU# (TE);^;f>"tdN1ɉIkQ){C<7B™ *3hŐ #8cM4"8+-$#QKݏU!,P1۵3}o%cj/pGE٤$a J+s ]͑ =uBμgP A\` CBát)nZ>)pNUS4zrr`MɬrC4ѾB[zvE }4ViZ3FŁpAoZYLuīaY=#grÃW%U 5@ڲ&8kFrכE:>D`ԤDօYBOwt,@ p6HL~|7FHouA pq+X XnDu{u)TK`ɕRm~ kFBW0>Y*3TJ\`\C .wp! j4u'6s#Oh6^`f(92GT iDgq>5ZEWWRW :Lo*:F zIHL;6{4wH==PvWJ~+0bH7kTRO=`w#:pn"Ő6>he쏰>,@,]cui88^a!Q=^!9ą"nRF?q2=:oztpZG18zˣm-Ef\¥^S; ʻA5eƊ$˕Y`Z`Ρ-:~3ښƄTj}|WnP =DrR$.8 =[lQAOQPM)y@tfJL{ʮ%(R%CN1GƔ2B˕ 0dA :<ۢG`A0kduF1Dm/k6V&d:#2C Qb: N ݃Qİ#@>2Zb£)QJۮVN&K74=zO¼fMۅSFdvLphk M#hp9l0E*ێi$]} "Q9V?#es"0 1"Q7f᷌^<KK!_6}fPO)vifF^`I0JQ{˜ G$$mO""U4枼1DU[&>KB/QclL^d4 #snSS2쓁zLlgz5?J6vjğY/@5ʄ`b5(Y9WwhP<ӧtsC'\GFdv0AhA4JR9/.UA+M^C]{S-sÂz=Ɨb JMƅ)1eA~ l*-S$4A`9{[V #vYsES.;(b•o yB⥔d΋0OsKd†)􁬐 ‘\I"+ =kb{zŦ'9!z)~_!ߗ? 4iT0[;P`l$Hr'/̕͢3 NE&m c̴&'k)Z0^laP;a!O?#,w[;r)o-_woBT4Q8]XFxtemfFp0oJ/)"GX? tQpA5t(ZĦQ(o0 3]3~hfILפ.b9 ݖ;@ kWm:Wu&4ORRkpR3-q\)P-6s^U?-MOQ *h 55ՅT5Zp-Cw,ÄeSӺ .Τhmf+wV!#,I:7C5ˋ Bv(%RUtXAs2E~cMٖ`&԰>͌7оGUd$!wԡ4&8-3rN РjK/|=γfA [8_pBVKՆ-*\GeϞuqnD*mZ΋]x>KCvgy3Y,Ge!13Եȷ8NJxO7+ʢ@>~f|ܡR5nq.%p0ҌXu+63! ~28yfnZf_8yڪ=s$Pwo Q&PPW?L -ESQlY}XU{=H[Fk@FJT J^_/Bsx [_e 0;D9§ieS蔠XF*@%jcK0oR䬆BGej@YjW@f-z1Bkwuee:B`F87"ܔA/g)5F.czU K_k.&iSD'bK  ɘRӢ4ge߬#wkx4W Q?Y0$^k 5`j`#: -D"P-&I_<+LKhpN/ ViLQ^ PWi"3bfeXAKBߗ\يtPK LA|a Sip%`0&ș@A|75#FpV4t:f9գoFꮩ UvXn_aA[Ԫ ]Y%WLN}g#\MtWs-mQQ5RmLں81# u7e/Z~R=A(HˢM-71zziJi'kLڙ'mJ M8|V4,ab3h%wlvFTSx",Nr@˳ר W݉!.NXkdZ D Ы3f⿩嫰G)bjK~4&>h?yʹs|)6f : MeU;@8y`Bf\fYu/#3XmnALfH* 75:3zKӁԢO읶ڛ0cӠmdN ё8oP"Ȣn)vʋMH2H&ejxЖ*LRI >S4ow/DZ4P* 5C"15{ƹ =PU q4Vg.th/`O~;Dn:vɭ|M U>#6g`}C=E+*CNT {blc 𭙲h= DMc\rqI: GyڨS,UUD&K!T$MԈA8Ūï.4(Kf0lזUp RYrAc.oy{ ϒN!긎ߌW#-֦??3‚{W M/ `+l.zqoi$n̰ͪkۦD+`mzoQgbM# Ԋe1:@3<]M'Gu9#Rh4+1?hD(w6O ףz$LNL!Y3,fMLٙͅҹa͛j/ȇ2F9TI螛' ABSgЀЩR>\آҖA TVs;~.ʞ>* t.sV7~[Du&cOg:\a`$5g$oI}kO8'Aw=?XdGk1]2ܱ<B48IT|C=LP(r^M^ ZcƸWBg >l3qAnKʻc~MR/ &|5Ѓ^5b ֈJmޫgc +Z]-A7Q;&K ! ґA-h3C al>傍g!¡7e7cʠ& EʉYuf,C:k`m]1VQ*W/vX *;%bJBݓz g fL5o fQ,k@+Xq#̔+*<ƃ!Â@uMa^9b^!2' ~f&QuwmJ:Z]Jפud wА h TF/&nb0v PI>*s3>0vAN1c2C*'qKjRc':1u%],=%EK@+"DA-hD RC$k-S@M8J!&UiKj}DwSa{5'`4GY$Cc@G3j=KmkzN#t)+X0D?e+Ѐ{y-^R."_ʄVڜqZ%=KQZ]7q_6ET)¨큂`$ QQ3R7fׇRnj?Ylz  &` @9`P}4 T,٪qԩ3C7 bJKPa/$HmF*NV\|ZTD꼧=cL./V;Z^9,00OH6+SBwX} ؜XrHHSWk|tj!GH=~ W@j5XA'QjQl1h-B>d L5Ǒ^jA;bˈ7"ot ֛15KqML)ٲ^oD{yh.AE|5)V hՄpPP0*ghB .\v e16U[#R4Op)@"zܭ^2$6P .I =|]E3ڲoIK%Bk5ȉ64rSC'xGuV K^IXFׁƞSyM6 VI+\ #A8W3ɁB=ǴxfCնR87zDpBPX1BQ) Bd"ajiZ>w'FmnsWǭ˲D_IB:d81e+&ȟ\mH36⽯ $f?Z2 1$#HmS= #^OuއDha[h?'k6P`Wr-ѳN ,[)@Snᝉڇ+TGzi}Dբ̋,Zm^㨌*Ćv骯P}j5Jjuq;"m~9l== :zՓE+u-$ T^ k,n9 #AU?8rTR4Iz͂jjOaRQCky<L$.< H0z4jLkCv,=@*eQJ=8DLIpbwjA!34X}30LID|yz`1Xj9C-f*Рƴbh>vmWH?[]7']zU6`݀s,}/^@譾U{B^SVD:vbɤK4FjO^7XT-R ǿ9([,6@E54XCqwyKșc^_p590 ԐliJ+) sP c[yhm&TD-q##%}7iw ]:ߴ-ՙ<}m3KP lmcS'Q@;:Xd٦9byt7&"{ H|4/8`z-~X; ܜ4>5u:~S34aH5+Y=\i9-=֞Ry{լl6V*=9vTխM,z_NUCUFj>ºy[6z0MZ lH~- xg-%͍B\E*hn2^mYM')Ӂrces ˙(~4dΧJ%p1c?51,\6c~eeq8 |AP4ɭ+&kE$2q''9;r-קg;yj4s ]{$_Z%1Mf3Y4-a09,!؎TUMrO T_ o~MV~eL4xUR2qIӊpF4|L:Ta/8p\qʏ!DW޼0UFݷ_'մլCa1?oSޙ! ~wޯ0×0O1V3T%$r@ɚk⡯`dw_~o~7滟Ϳ7Ư7-\vhRO#ʸ %PKʤjD"Td-V%֤ESd c(jtaն#t>= UESсfJbF;a@, Z%,ۺy~&5} Om*m4Hjy~_W矅kW \Ͽ?jO.ow_[>[tb9RT;Kq{Pi'uʉ \JآA/Vv"-$/b(}a6EXu .jۄbKmoW[MJֆJkto$/@\Q3@*8(.qt]wS/Ip'V33P g ?lYV*"/%*=EH,O~}RT 9 4Ӫ-\r3"\οbt8/K?4\9J^, Oz?X{p֟{iK_=_?o4ϳ4`1f}j[Yrs/[YMϽ4#F?!:k _\#jbZ>O-2bw?HP3ÈWAG_~g?'|K;b없 Bn#HqQ)P?/.S:'o/o?(/|/G?`=b~?Cޕ_9e:SAQqS2*nQA;_d܁Y_bU5(w;0[USxYFj p Jd^Mњ*=dʸFs\S.zozFrAkRk3D%̳'# M!#4gS,uFCEH ;Do GBO?lޚwd$U.1w'*V_W0`d$}59r<'{Y(Im0y=LŐdJe3uCFR= 8ͭ\ GL-}tnIE7#$N{U" [~^+|?Fo|'>9/NWjEsqW.qcTBPu,4Ƒ:K/ q,BPߨhEW#!D @lsB!\]]Wm |*])j?hqe584e5d-A;Vq\XeTpB >o [oY׈gug#Ja-A܉z27i ټ,VD2?E.elwr?y4,\l@ S/RcX [i*4bǘ\u`!ALMF\;[5뮗DUx(QS. lcReWGaq1lO_4+E?hՆT5d1SC^Y~x3Wi ;<~_s l%ŴG;4RQe|KhfQZQ?|yG=auA{MO57A훟vy7P[_Dh׸>PG8~5t l*>|)%4?W/٩3'x?'~Iy/_b ; K$abi.DB ~_|7ͯ~?ү~Xe/%t︵կN (~0P^*H#{}9eo@𿐙 BTO5&{ ARSeL IpQ K>7:1 7FS/RlyMPkڷqÓbFJx$2aHUgaps N0"fώuL71̚햾Bл6DkaV}nz9rsĄ'1q?|T2:?vfl%vxav% _0(x[mK~,FB&)ȀPd C4]CrZ9JTj0[+*R^FWrjNs+'gm _ ]8m?(cZO%&_#o?w%0fm)1%`}7O/?w3pmVg}G嶯w}ŤrmE MC9;4cL6R-k)+Dc;4sPaM iNYV~ʮBrp.lrx;N-;2(k@;mP N[b*;j :OGea+$}C=[ k&x}dF8}ſڏ-ᑢsth2Qe}QxIǿ ?}S_?wGlΦ[_6O8fO7UZw Vo)WH3V3Txk jAy@z!U7ca5Uء 7)+L1CeNL4J@o`P*4w*Kg|}`oMNʯL]G[sbG i'j Aڗ9{w\MȤ֣'d=^5@Qckyqʇj7/@>@|#ZMIo*Ʈ R!,]yDo&Q8|i@ЍO@)ҾZܓĥ&U_bx=uJha ɈlAk7L@6wo`vA!VO'vzʙ "^-ǀPN w#H`W[| .} 1 7pUI\mU>H[pJ OylPK4f=\ r4|4js%"8'"iM8s~ϕsr q[+)9vA.6DG>AV]3ҟ 1OC%{wi:cAMl!&܂"*`}3YQD ?zQQt62vD5{3zFE ۝ .Dy֛Fn1$$E Ic)r i=$ڭ ?aDcE3j[6aнОoݷ{X`׮rAWz@n*VL$F?X4"gz)TJU^05em &0-Rc !ǖkdI\#Ķ'q8p BUOҌD܇fC2hp+ӑp4 6%_3ׯݝtq cOy-DX롆@oퟤ/@.ʠޟ1M(' *dvVLېֵ!LE#D+N|q}*d4^^*U(Zjt~eޡlho)QCԷi fv7/u1]ٟY&P`ZEYPѳ?]|Aw~xc=2~U7f\Cf=kxf 'i!2YLMPb9.l2ΟO!BMz5g/7JK $88UUkL1_9qC9zNZỏb2M0&} #-mf cj1,vE8Hvm|0[wS̆i<7$p1f\@`nNB2ctuvF_\μ<3D4 =|qdZ1EF}1ޅ}6aoEXW>m8HU~1vޚ ς.\-ʣ{&iݖG̭}:b:hRGO#t7wC73˨J583& I#gmX!)Ѣ]y:De 0#N!Bͷ4t1X2/,"w_|HV"u|'ZI3ɒ+BjNI!;u8-/ B"i<"Il݅Yh2fu5,|L*W?Zut%$V-}~UK:!愰j/|wL9aw 8rMϾt%W y?Wj+~o/o_h[9>}osW D [I &zQ+֍| 띷t K!6&h]vw 7j;6)3W+3Hv(jRyKjVV"BjJ7("Zފ b)!H#cR'?3cQ):b&9~XW &rBFLl/KnD0-3?׳ףz!b׋TTd\\ 39dNU9j83VwV%iC% Pn-}pLeQ ksn!癩$Wg=[5ց|Kqm)V?S{ˮNqvfєݓIŒwV͇qV2Ga;T\ ЉSb*wO_hv`Mz]x(?<2V)V tnY7FԺpP nb)d4LNpPV;6J7^]b۟ J'H'.?q|ktikz/app/icons/edit-copy.png0000660000175000017500000000100311455414611020640 0ustar fhackenbergerfhackenbergerPNG  IHDRj sBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE%%$&&&(((ĮWvtRNS$'017LMeevW9%IDATx]A! D; W|ݺEI>JX< zٿ 6C0s$ftJb`{fi v//F٫/Ds!UՍ4`Ҽ8j\(l+P7>v yhũL0o{͑WxR/)E}JIENDB`ktikz/app/icons/help-contents.png0000660000175000017500000000203611455414611021535 0ustar fhackenbergerfhackenbergerPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxڅKUs3= ӓh2A IpИ( Y՝d Vĵn"B"*р1:>0N_u[0Nw4拈9i2_ܼVocil.⮴~s QBں0 /4, 3@ P/~pcx»+?zzssV J)<z|o243(sZp0SٓuÉ`!b uZ16b:z>_Fӎ+`` cfFYTKWc Qha67[ "H,okCH1!kɍE\1*XXNp 1icAexh=J$|gP+2(} * * * * 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 . * ***************************************************************************/ #include "editreplacecurrentwidget.h" #include #include #include #include #include #include "../common/utils/icon.h" ReplaceCurrentWidget::ReplaceCurrentWidget(QWidget *parent) : QWidget(parent) { m_replaceLabel = new QLabel; m_replaceButton = new QPushButton(tr("&Replace")); QPushButton *replaceAllButton = new QPushButton(tr("Replace &All")); QPushButton *dontReplaceButton = new QPushButton(tr("&Don't Replace")); QPushButton *cancelButton = new QPushButton(tr("&Cancel")); cancelButton->setIcon(Icon("dialog-cancel")); QVBoxLayout *mainLayout = new QVBoxLayout(this); QWidget *buttonsWidget = new QWidget; QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(m_replaceButton); buttonsLayout->addWidget(replaceAllButton); buttonsLayout->addWidget(dontReplaceButton); buttonsLayout->addWidget(cancelButton); buttonsLayout->addStretch(); buttonsLayout->setMargin(0); buttonsWidget->setLayout(buttonsLayout); mainLayout->addWidget(m_replaceLabel); mainLayout->addWidget(buttonsWidget); setFocusProxy(m_replaceButton); connect(m_replaceButton, SIGNAL(clicked()), this, SLOT(replace())); connect(replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(dontReplaceButton, SIGNAL(clicked()), this, SLOT(dontReplace())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(hide())); } ReplaceCurrentWidget::~ReplaceCurrentWidget() { } void ReplaceCurrentWidget::setReplacement(const QString &text, const QString &replacement) { m_replaceLabel->setText(tr("Replace %1 by %2?").arg(text).arg(replacement)); } void ReplaceCurrentWidget::search(const QString &text, const QString &replacement, bool isCaseSensitive, bool findWholeWords, bool forward, bool startAtCursor) { m_text = text; m_replacement = replacement; m_isCaseSensitive = isCaseSensitive; m_findWholeWords = findWholeWords; m_forward = forward; m_startAtCursor = startAtCursor; emit search(m_text, m_isCaseSensitive, m_findWholeWords, m_forward, m_startAtCursor); } void ReplaceCurrentWidget::replace() { emit replace(m_replacement); emit setSearchFromBegin(false); emit search(m_text, m_isCaseSensitive, m_findWholeWords, m_forward, m_startAtCursor); } void ReplaceCurrentWidget::replaceAll() { emit replace(m_replacement); emit replaceAll(m_text, m_replacement, m_isCaseSensitive, m_findWholeWords, m_forward, m_startAtCursor); } void ReplaceCurrentWidget::dontReplace() { emit setSearchFromBegin(false); emit search(m_text, m_isCaseSensitive, m_findWholeWords, m_forward, m_startAtCursor); } void ReplaceCurrentWidget::hide() { setVisible(false); emit showReplaceWidget(); } void ReplaceCurrentWidget::showEvent(QShowEvent *event) { m_replaceButton->setFocus(); QWidget::showEvent(event); } void ReplaceCurrentWidget::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Escape) hide(); else if (event->key() == Qt::Key_Return) replace(); QWidget::keyPressEvent(event); } ktikz/app/editgotolinewidget.h0000660000175000017500000000342711455414611021201 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef GOTOLINEWIDGET_H #define GOTOLINEWIDGET_H #include "ui_editgotolinewidget.h" class GoToLineWidget : public QWidget { Q_OBJECT public: GoToLineWidget(QWidget *parent = 0); ~GoToLineWidget(); void setMaximumValue(int maximumValue); void setValue(int value); public slots: void goToLine(); signals: void goToLine(int lineNumber); void focusEditor(); protected: virtual void keyPressEvent(QKeyEvent *event); protected slots: void hide(); private: Ui::GoToLineWidget ui; }; #endif ktikz/app/configeditorwidget.cpp0000660000175000017500000000725011455414611021520 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "configeditorwidget.h" #include #include "../common/utils/fontdialog.h" ConfigEditorWidget::ConfigEditorWidget(QWidget *parent) : QWidget(parent) { ui.setupUi(this); connect(ui.generalFontButton, SIGNAL(clicked()), this, SLOT(selectFont())); } void ConfigEditorWidget::readSettings(const QString &settingsGroup) { QSettings settings(ORGNAME, APPNAME); settings.beginGroup(settingsGroup); m_generalFont.fromString(settings.value("Font", qApp->font().toString()).toString()); ui.generalFontEdit->setText(m_generalFont.family() + ' ' + QString::number(m_generalFont.pointSize())); ui.generalFontEdit->setFont(m_generalFont); ui.showWhiteSpacesCheck->setChecked(settings.value("ShowWhiteSpaces", false).toBool()); ui.showTabulatorsCheck->setChecked(settings.value("ShowTabulators", false).toBool()); ui.showMatchingBracketsCheck->setChecked(settings.value("ShowMatchingBrackets", true).toBool()); ui.whiteSpacesColorButton->setColor(settings.value("ColorWhiteSpaces", Qt::gray).value()); ui.tabulatorsColorButton->setColor(settings.value("ColorTabulators", Qt::gray).value()); ui.matchingBracketsColorButton->setColor(settings.value("ColorMatchingBrackets", Qt::yellow).value()); ui.useCompletionCheck->setChecked(settings.value("UseCompletion", true).toBool()); settings.endGroup(); } void ConfigEditorWidget::writeSettings(const QString &settingsGroup) { QSettings settings(ORGNAME, APPNAME); settings.beginGroup(settingsGroup); settings.setValue("Font", m_generalFont.toString()); settings.setValue("ShowWhiteSpaces", ui.showWhiteSpacesCheck->isChecked()); settings.setValue("ShowTabulators", ui.showTabulatorsCheck->isChecked()); settings.setValue("ShowMatchingBrackets", ui.showMatchingBracketsCheck->isChecked()); settings.setValue("ColorWhiteSpaces", ui.whiteSpacesColorButton->color()); settings.setValue("ColorTabulators", ui.tabulatorsColorButton->color()); settings.setValue("ColorMatchingBrackets", ui.matchingBracketsColorButton->color()); settings.setValue("UseCompletion", ui.useCompletionCheck->isChecked()); settings.endGroup(); } void ConfigEditorWidget::selectFont() { bool ok; const QFont newFont = FontDialog::getFont(&ok, m_generalFont, this); if (ok) { m_generalFont = newFont; ui.generalFontEdit->setText(m_generalFont.family() + ' ' + QString::number(m_generalFont.pointSize())); ui.generalFontEdit->setFont(m_generalFont); } } ktikz/app/qtikz.qrc0000660000175000017500000000333411455414611017004 0ustar fhackenbergerfhackenberger tikzcommands.xml icons/qtikz-22.png icons/qtikz-128.png icons/dialog-cancel.png icons/edit-clear-locationbar-rtl.png icons/view-refresh.png icons/document-new.png icons/document-open.png icons/document-open-recent.png icons/document-save.png icons/document-save-as.png icons/document-export.png icons/application-exit.png icons/edit-undo.png icons/edit-redo.png icons/edit-copy.png icons/edit-cut.png icons/edit-paste.png icons/format-indent-more.png icons/edit-find.png icons/go-up.png icons/go-down.png icons/window-close.png icons/go-jump.png icons/image-x-eps.png icons/application-pdf.png icons/image-png.png icons/zoom-in.png icons/zoom-out.png icons/go-previous.png icons/go-next.png icons/process-stop.png icons/run-build.png icons/application-x-executable.png icons/configure-toolbars.png icons/configure.png icons/accessories-text-editor.png icons/preferences-desktop-color.png icons/preferences-desktop-theme.png icons/help-contents.png icons/help-contextual.png icons/qt-logo-22.png ktikz/app/ktikzapplication.cpp0000660000175000017500000001226311455414611021220 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "ktikzapplication.h" #ifdef KTIKZ_USE_KDE #include #include #else #include #include #include #include #include #endif #include "mainwindow.h" KtikzApplication::KtikzApplication(int &argc, char **argv) #ifdef KTIKZ_USE_KDE : KApplication() #else : QApplication(argc, argv) #endif { #ifdef KTIKZ_USE_KDE Q_UNUSED(argc); Q_UNUSED(argv); #else for (int i = 0; i < argc; ++i) m_args << QString::fromLocal8Bit(argv[i]); #endif m_firstTime = true; } void KtikzApplication::init() { if (isSessionRestored()) { #ifdef KTIKZ_USE_KDE kRestoreMainWindows(); #else QSettings settings(ORGNAME, APPNAME); settings.beginGroup("Session" + qApp->sessionId()); const int size = settings.beginReadArray("MainWindowList"); for (int i = 0; i < size; ++i) { settings.setArrayIndex(i); const QString fileName = settings.value("CurrentFile").toString(); MainWindow *mainWindow = new MainWindow; mainWindow->show(); if (!fileName.isEmpty()) mainWindow->loadUrl(QUrl(fileName)); } settings.endArray(); settings.remove(""); settings.endGroup(); m_firstTime = false; #endif return; } MainWindow *mainWindow = new MainWindow; mainWindow->show(); #ifdef KTIKZ_USE_KDE KUrl url; KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); if (args->count() > 0) { url = args->url(0); if (url.isValid() && url.isLocalFile()) mainWindow->loadUrl(url); } args->clear(); #else if (m_args.size() > 1) { const QFileInfo fi(m_args.at(1)); mainWindow->loadUrl(QUrl(fi.absoluteFilePath())); } m_args.clear(); #endif } KtikzApplication::~KtikzApplication() { // don't delete the MainWindow's here because they are already deleted on close } QString KtikzApplication::applicationName() { #ifdef KTIKZ_USE_KDE return "KTikZ"; #else return "QTikZ"; #endif } #ifndef KTIKZ_USE_KDE void KtikzApplication::commitData(QSessionManager &manager) { if (manager.allowsInteraction()) { QList saveDocuments; QList mainWindowList = MainWindow::mainWindowList(); // find out which documents to save for (int i = 0; i < mainWindowList.size(); ++i) { if (mainWindowList.at(i)->isDocumentModified()) { const int ret = QMessageBox::warning(mainWindowList.at(i), applicationName(), tr("The document \"%1\" has been modified.\n" "Do you want to save your changes?").arg(mainWindowList.at(i)->url().fileName()), QMessageBox::Save | QMessageBox::Default, QMessageBox::Discard, QMessageBox::Cancel | QMessageBox::Escape); if (ret == QMessageBox::Save) saveDocuments << i; // store the number of the document that has to be saved else if (ret == QMessageBox::Cancel) manager.cancel(); } } manager.release(); // release the manager so that it can handle other programs // do the actual saving for (int i = 0; i < saveDocuments.size(); ++i) { if (!mainWindowList.at(saveDocuments.at(i))->save()) manager.cancel(); } } else { // TODO save unsaved documents to a temporary file } } void KtikzApplication::saveState(QSessionManager &manager) { Q_UNUSED(manager); QList mainWindowList = MainWindow::mainWindowList(); if (mainWindowList.size() == 0) return; #ifdef Q_WS_X11 // in X11 the session manager calls savedState also on startup, // we don't want to save anything at startup, so we return // this is a dirty hack: it would be better to actually determine // *when* this function is called if (m_firstTime) { m_firstTime = false; return; } #endif QSettings settings(ORGNAME, APPNAME); settings.beginGroup("Session" + qApp->sessionId()); settings.beginWriteArray("MainWindowList"); for (int i = 0; i < mainWindowList.size(); ++i) { settings.setArrayIndex(i); settings.setValue("CurrentFile", mainWindowList.at(i)->url().path()); } settings.endArray(); settings.endGroup(); } #endif ktikz/app/tikzcommandinserter.cpp0000660000175000017500000004507611455414611021744 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "tikzcommandinserter.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tikzeditorhighlighter.h" #include "tikzcommandwidget.h" static const QString s_completionPlaceHolder(0x2022); TikzCommandInserter::TikzCommandInserter(QWidget *parent) : QObject(parent) { m_parentWidget = parent; getCommands(); highlightTypeNames << "Commands" << "Draw to" << "Options"; } void TikzCommandInserter::getCommands() { QFile tagsFile(":/tikzcommands.xml"); if (!tagsFile.open(QFile::ReadOnly)) return; QApplication::setOverrideCursor(Qt::WaitCursor); QDomDocument domDocument; QString errorStr; int errorLine, errorColumn; if (!domDocument.setContent(&tagsFile, true, &errorStr, &errorLine, &errorColumn)) { QMessageBox::information(m_parentWidget, tr("TikZ Commands"), tr("Parse error at line %1, column %2:\n%3") .arg(errorLine).arg(errorColumn).arg(errorStr)); return; } QDomElement root = domDocument.documentElement(); if (root.tagName() != "tikzcommands") { QMessageBox::information(m_parentWidget, tr("TikZ Commands"), tr("Cannot parse the TikZ commands file.")); return; } m_tikzSections = getCommands(root); QApplication::restoreOverrideCursor(); } TikzCommandList TikzCommandInserter::getCommands(const QDomElement &element) { TikzCommandList commandList; QList commands; commandList.title = tr(element.attribute("title").toLatin1().data()); QDomElement child = element.firstChildElement("item"); QString name; QString description; QString insertion; QString type; while (!child.isNull()) { name = tr(child.attribute("name").toLatin1().data()); description = child.attribute("description"); insertion = child.attribute("insert"); type = child.attribute("type"); description.replace(QRegExp("([^\\\\])\\\\n"), "\\1\n"); // replace newlines, these are the "\n" not preceded by a backslash as in "\\node" description.replace(QRegExp("([^\\\\])\\\\n"), "\\1\n"); // do this twice to replace all newlines description.replace(QLatin1String("\\\\"), QLatin1String("\\")); // translate options in the description: QRegExp rx("<([^<>]*)>"); QString tempDescription; for (int pos = 0, oldPos = 0; pos >= 0;) { oldPos = pos; pos = rx.indexIn(description, pos); tempDescription += description.midRef(oldPos, pos - oldPos + 1); if (pos >= 0) { tempDescription += tr(rx.cap(1).toLatin1().data()); pos += rx.matchedLength() - 1; } } if (!tempDescription.isEmpty()) description = tempDescription; insertion.replace(QRegExp("([^\\\\])\\\\n"), "\\1\n"); // replace newlines, these are the "\n" not preceded by a backslash as in "\\node" insertion.replace(QRegExp("([^\\\\])\\\\n"), "\\1\n"); // do this twice to replace all newlines insertion.replace(QLatin1String("\\\\"), QLatin1String("\\")); if (name.isEmpty()) name = description; description.remove('&'); if (name.isEmpty()) name = insertion; if (description.isEmpty()) description = insertion; if (type.isEmpty()) type = '0'; commands << newCommand(name, description, insertion, child.attribute("dx").toInt(), child.attribute("dy").toInt(), type.toInt()); if (child.nextSiblingElement().tagName() == QLatin1String("separator")) commands << newCommand("", "", "", 0, 0, 0); child = child.nextSiblingElement("item"); } commandList.commands = commands; QDomElement section = element.firstChildElement("section"); while (!section.isNull()) { commandList.children << getCommands(section); section = section.nextSiblingElement("section"); } return commandList; } QStringList TikzCommandInserter::getCommandWords() { QStringList words; QString word; for (int i = 0; i < m_tikzCommandsList.size(); ++i) { word = m_tikzCommandsList.at(i).description; // remove all special characters and at the beginning of the word word.remove(QRegExp("^([^a-z\\\\<>]*<[^>]*>)*")); word.remove(QRegExp("^[^a-z\\\\]*")); if (!word.isEmpty()) words.append(word); else { word = m_tikzCommandsList.at(i).command; // remove all special characters and at the beginning of the word word.remove(QRegExp("^([^a-z\\\\<>]*<[^>]*>)*")); word.remove(QRegExp("^[^a-z\\\\]*")); if (!word.isEmpty()) words.append(word); } } return words; } /*! * \name Menu with TikZ commands */ //@{ QMenu *TikzCommandInserter::getMenu(const TikzCommandList &commandList) { QMenu *menu = new QMenu(commandList.title, m_parentWidget); const int numOfCommands = commandList.commands.size(); QAction *action; for (int i = 0; i < numOfCommands; ++i) { const QString name = commandList.commands.at(i).name; if (name.isEmpty()) { action = new QAction(this); action->setSeparator(true); } else { action = new QAction(name, this); action->setData(commandList.commands.at(i).number); // link to the corresponding item in m_tikzCommandsList action->setStatusTip(commandList.commands.at(i).description); connect(action, SIGNAL(triggered()), this, SLOT(insertTag())); } menu->addAction(action); } const int numOfChildren = commandList.children.size(); for (int i = 0; i < numOfChildren; ++i) { menu->addMenu(getMenu(commandList.children.at(i))); } return menu; } /*! * This function returns a menu containing a list of TikZ commands * which can be inserted in the main text. * \return a menu with TikZ commands */ QMenu *TikzCommandInserter::getMenu() { return getMenu(m_tikzSections); } //@} /*! * \name Dock widget with TikZ commands */ //@{ void TikzCommandInserter::addListWidgetItems(QListWidget *listWidget, const TikzCommandList &commandList, bool addChildren) { QFont titleFont = qApp->font(); titleFont.setBold(true); // QColor titleBg(QApplication::style()->standardPalette().color(QPalette::Normal, QPalette::Highlight)); // titleBg = titleBg.lighter(120); QColor titleBg(QApplication::style()->standardPalette().color(QPalette::Normal, QPalette::Window)); titleBg = titleBg.darker(200); QColor titleFg(QApplication::style()->standardPalette().color(QPalette::Normal, QPalette::HighlightedText)); QColor separatorBg(QApplication::style()->standardPalette().color(QPalette::Normal, QPalette::AlternateBase)); if (separatorBg == QApplication::style()->standardPalette().color(QPalette::Normal, QPalette::Base)) separatorBg = separatorBg.darker(110); for (int i = 0; i < commandList.commands.size(); ++i) { QListWidgetItem *item = new QListWidgetItem(listWidget); QString itemText = commandList.commands.at(i).name; item->setText(itemText.remove('&')); if (itemText.isEmpty()) item->setBackgroundColor(separatorBg); else item->setData(Qt::UserRole, commandList.commands.at(i).number); // link to the corresponding item in m_tikzCommandsList } if (!addChildren) return; for (int i = 0; i < commandList.children.size(); ++i) { QListWidgetItem *item = new QListWidgetItem(listWidget); QString itemText = commandList.children.at(i).title; item->setText(itemText.remove('&')); item->setBackgroundColor(titleBg); item->setTextColor(titleFg); item->setFont(titleFont); addListWidgetItems(listWidget, commandList.children.at(i)); } } /*! * This function returns a dock widget containing a list of TikZ commands * which can be inserted in the main text by clicking on them. * \param parent the parent widget * \return a dock widget with TikZ commands */ QDockWidget *TikzCommandInserter::getDockWidget(QWidget *parent) { QDockWidget *tikzDock = new QDockWidget(parent); tikzDock->setObjectName("CommandsDock"); tikzDock->setAllowedAreas(Qt::AllDockWidgetAreas); tikzDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable); tikzDock->setWindowTitle(m_tikzSections.title); tikzDock->setWhatsThis(tr("

This is a list of TikZ " "commands. You can insert these commands in your code by " "clicking on them. You can obtain more commands by " "changing the category in the combo box.

")); QAction *focusTikzDockAction = new QAction(parent); focusTikzDockAction->setShortcut(QKeySequence(tr("Alt+I"))); tikzDock->addAction(focusTikzDockAction); connect(focusTikzDockAction, SIGNAL(triggered()), tikzDock, SLOT(setFocus())); QLabel *commandsComboLabel = new QLabel(tr("Category:")); QComboBox *commandsCombo = new QComboBox; commandsCombo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); QStackedWidget *commandsStack = new QStackedWidget; connect(commandsCombo, SIGNAL(currentIndexChanged(int)), commandsStack, SLOT(setCurrentIndex(int))); QListWidget *tikzListWidget = new QListWidget; addListWidgetItems(tikzListWidget, m_tikzSections, false); // don't add children tikzListWidget->setMouseTracking(true); connect(tikzListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(setListStatusTip(QListWidgetItem*))); connect(tikzListWidget, SIGNAL(itemEntered(QListWidgetItem*)), this, SLOT(setListStatusTip(QListWidgetItem*))); connect(tikzListWidget, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(insertTag(QListWidgetItem*))); // connect(tikzListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(insertTag(QListWidgetItem*))); commandsCombo->addItem(tr("General")); commandsStack->addWidget(tikzListWidget); for (int i = 0; i < m_tikzSections.children.size(); ++i) { QListWidget *tikzListWidget = new QListWidget; addListWidgetItems(tikzListWidget, m_tikzSections.children.at(i)); tikzListWidget->setMouseTracking(true); connect(tikzListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(setListStatusTip(QListWidgetItem*))); connect(tikzListWidget, SIGNAL(itemEntered(QListWidgetItem*)), this, SLOT(setListStatusTip(QListWidgetItem*))); connect(tikzListWidget, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(insertTag(QListWidgetItem*))); // connect(tikzListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(insertTag(QListWidgetItem*))); QString comboItemText = m_tikzSections.children.at(i).title; commandsCombo->addItem(comboItemText.remove('&')); commandsStack->addWidget(tikzListWidget); } QGridLayout *tikzLayout = new QGridLayout; tikzLayout->addWidget(commandsComboLabel, 0, 0); tikzLayout->addWidget(commandsCombo, 0, 1); tikzLayout->addWidget(commandsStack, 1, 0, 1, 2); tikzLayout->setMargin(5); TikzCommandWidget *tikzWidget = new TikzCommandWidget; tikzWidget->setLayout(tikzLayout); tikzDock->setWidget(tikzWidget); tikzDock->setFocusProxy(commandsCombo); return tikzDock; } void TikzCommandInserter::setEditor(QPlainTextEdit *textEdit) { m_mainEdit = textEdit; } void TikzCommandInserter::setListStatusTip(QListWidgetItem *item) { if (item && !item->font().bold() && !item->text().isEmpty()) { const int num = item->data(Qt::UserRole).toInt(); emit showStatusMessage(m_tikzCommandsList.at(num).description, 10000); } else emit showStatusMessage(""); } //@} /*! * Returns a list of default formats which will be used by TikzHighlighter * to highlight the different types of highlighting rules given by * getHighlightTypeNames(). Any value in the list returned by * getHighlightTypeNames() serves as a key in this list. * \return a list of default formats */ QMap TikzCommandInserter::getDefaultHighlightFormats() { QMap formatList; QTextCharFormat commandFormat; commandFormat.setForeground(QColor("#004080")); commandFormat.setFont(qApp->font()); commandFormat.setFontWeight(QFont::Bold); formatList[highlightTypeNames.at(0)] = commandFormat; QTextCharFormat drawFormat; drawFormat.setForeground(Qt::darkRed); drawFormat.setFont(qApp->font()); drawFormat.setFontWeight(QFont::Normal); formatList[highlightTypeNames.at(1)] = drawFormat; QTextCharFormat optionFormat; optionFormat.setForeground(QColor("#004000")); optionFormat.setFont(qApp->font()); optionFormat.setFontWeight(QFont::Normal); formatList[highlightTypeNames.at(2)] = optionFormat; return formatList; } /*! * Returns the list of the names of the different types of highlighting * rules provided by this class. This list contains the names which may * be presented in a user interface and which will be translated when * another language is used. * \return a list of types of highlighting rules * \see getHighlightTypeNames */ QStringList TikzCommandInserter::getTranslatedHighlightTypeNames() { QStringList translatedHighlightTypeNames; translatedHighlightTypeNames << tr("Commands") << tr("Draw to") << tr("Options"); return translatedHighlightTypeNames; } /*! * Returns the list of the names of the different types of highlighting * rules provided by this class. This list contains the untranslated * versions of the type names and should not be used in the user interface. * \return a list of types of highlighting rules * \see getTranslatedHighlightTypeNames */ QStringList TikzCommandInserter::getHighlightTypeNames() { return highlightTypeNames; } /*! * Returns a vector with the highlighting rules derived from the TikZ * commands which are available in the menu/dock widget. These rules * are used by TikzHighlighter to highlight the commands in the text. * \return a vector containing the highlighting rules */ QVector TikzCommandInserter::getHighlightingRules() { QVector highlightingRules; HighlightingRule rule; for (int i = 0; i < m_tikzCommandsList.size(); ++i) { QString command = m_tikzCommandsList.at(i).command; const int type = m_tikzCommandsList.at(i).type; int end; switch (type) { case 1: { const int end1 = command.indexOf(' ', 0); const int end2 = command.indexOf('[', 0); const int end3 = command.indexOf('{', 0); end = end1; if (end < 0 || (end2 >= 0 && end2 < end)) end = end2; if (end < 0 || (end3 >= 0 && end3 < end)) end = end3; } command = command.left(end); command = command.replace('\\', QLatin1String("\\\\")); rule.type = highlightTypeNames.at(0); rule.pattern = QRegExp(command); highlightingRules.append(rule); break; case 2: // command = command.replace("()", "\\([^\\)]*\\)"); // command = command.replace("(,)", "\\([^\\)]*\\)"); // command = command.replace("(:::)", "\\([^\\)]*\\)"); command = command.remove('+'); command = command.remove(" ()"); command = command.remove(" (,)"); command = command.remove(" (:::)"); command = command.remove(" {} "); rule.type = highlightTypeNames.at(1); rule.pattern = QRegExp(command); highlightingRules.append(rule); break; case 3: command = command.replace('|', QLatin1String("\\|")); end = command.indexOf('=', 0) + 1; if (end > 0) command = command.left(end); rule.type = highlightTypeNames.at(2); rule.pattern = QRegExp(command); highlightingRules.append(rule); break; } } return highlightingRules; } TikzCommand TikzCommandInserter::newCommand(const QString &name, const QString &command, int dx, int dy, int type) { return newCommand(name, "", command, dx, dy, type); } TikzCommand TikzCommandInserter::newCommand(const QString &name, const QString &description, const QString &command, int dx, int dy, int type) { /* type: * 0: plain text * 1: command * 2: draw to next point * 3: option */ TikzCommand tikzCommand; tikzCommand.name = name; tikzCommand.description = description; tikzCommand.command = command; tikzCommand.dx = dx; tikzCommand.dy = dy; tikzCommand.type = type; tikzCommand.number = m_tikzCommandsList.size(); m_tikzCommandsList << tikzCommand; return tikzCommand; } void TikzCommandInserter::insertTag() { QAction *action = qobject_cast(sender()); if (action) { const int num = action->data().toInt(); const TikzCommand cmd = m_tikzCommandsList.at(num); emit showStatusMessage(cmd.description, 0); insertTag(cmd.command, cmd.dx, cmd.dy); } } void TikzCommandInserter::insertTag(QListWidgetItem *item) { if (item && !item->font().bold() && !item->text().isEmpty()) { const int num = item->data(Qt::UserRole).toInt(); const TikzCommand cmd = m_tikzCommandsList.at(num); emit showStatusMessage(cmd.description, 0); insertTag(cmd.command, cmd.dx, cmd.dy); } } /*! * Inserts a TikZ command and moves the cursor to a position located * dx characters to the right of and dy characters below the * start of the inserted tag. * \param tag the TikZ command to be inserted * \param dx the x-offset of the new cursor position w.r.t. the beginning of the inserted tag * \param dy the y-offset of the new cursor position w.r.t. the beginning of the inserted tag */ void TikzCommandInserter::insertTag(const QString &tag, int dx, int dy) { QTextCursor cur = m_mainEdit->textCursor(); const int pos = cur.position(); m_mainEdit->insertPlainText(tag); cur.setPosition(pos, QTextCursor::MoveAnchor); if (tag.contains(s_completionPlaceHolder)) { cur = m_mainEdit->document()->find(s_completionPlaceHolder, cur); } else { if (dy > 0) { cur.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, dy); cur.movePosition(QTextCursor::StartOfLine, QTextCursor::MoveAnchor, 1); } if (dx > 0) cur.movePosition(QTextCursor::NextCharacter, QTextCursor::MoveAnchor, dx); } m_mainEdit->setTextCursor(cur); m_mainEdit->setFocus(); } ktikz/app/tikzeditorview.h0000660000175000017500000000703011455414611020364 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef TIKZEDITORVIEW_H #define TIKZEDITORVIEW_H #include //#include "tikzcommandinserter.h" class QAction; class QCompleter; class QMenu; //class QSyntaxHighlighter; class QPlainTextEdit; class QToolBar; class GoToLineWidget; class ReplaceWidget; class ReplaceCurrentWidget; class TikzEditor; //class TikzHighlighter; class TikzEditorView : public QWidget { Q_OBJECT public: TikzEditorView(QWidget *parent = 0); virtual ~TikzEditorView(); QPlainTextEdit *editor(); QMenu *menu(); QToolBar *toolBar(); void applySettings(); void setLine(const QString &line); void setCompleter (QCompleter *completer); public slots: void goToLine(int lineNumber); signals: void modificationChanged(bool changed); void contentsChanged(); void cursorPositionChanged(int row, int col); void showStatusMessage(const QString &message, int timeout = 3000); void setSearchFromBegin(bool searchFromBegin); void focusIn(); void focusOut(); private slots: void setPasteEnabled(); // void showCursorPosition(); void editGoToLine(); void editIndent(); void editComment(); void editUncomment(); void editFind(); void editFindNext(); void editFindPrevious(); void editReplace(); bool search(const QString &text, bool isCaseSensitive = false, bool findWholeWords = false, bool forward = true, bool startAtCursor = true); void replace(const QString &replacement); void replace(const QString &text, const QString &replacement, bool isCaseSensitive = false, bool findWholeWords = false, bool forward = true, bool startAtCursor = true); void replaceAll(const QString &text, const QString &replacement, bool isCaseSensitive = false, bool findWholeWords = false, bool forward = true, bool startAtCursor = true); private: void setFont(const QFont &editorFont); void createActions(); void setLine(int lineNumber); QWidget *m_parentWidget; TikzEditor *m_tikzEditor; ReplaceWidget *m_replaceWidget; ReplaceCurrentWidget *m_replaceCurrentWidget; GoToLineWidget *m_goToLineWidget; // TikzHighlighter *tikzHighlighter; // TikzCommandInserter *commandInserter; QAction *m_undoAction; QAction *m_redoAction; QAction *m_cutAction; QAction *m_copyAction; QAction *m_pasteAction; QAction *m_selectAllAction; QList m_editActions; // int customHighlighting; }; #endif ktikz/app/tikzeditorhighlighter.cpp0000660000175000017500000001075511455414611022253 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * * * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "tikzeditorhighlighter.h" #include #include "tikzcommandinserter.h" TikzHighlighter::TikzHighlighter(TikzCommandInserter *commandInserter, QTextDocument *parent) : QSyntaxHighlighter(parent) { m_commandInserter = commandInserter; HighlightingRule rule; if (commandInserter) { m_highlightingRules << commandInserter->getHighlightingRules(); m_highlightTypeNames << commandInserter->getHighlightTypeNames(); } const int currentIndex = m_highlightTypeNames.size(); m_highlightTypeNames << "Environments" << "Comments"; QStringList keywordPatterns; keywordPatterns << "\\\\begin\\{[^\\}]*\\}" << "\\\\end\\{[^\\}]*\\}"; foreach (const QString &pattern, keywordPatterns) { rule.type = m_highlightTypeNames.at(currentIndex); rule.pattern = QRegExp(pattern); m_highlightingRules.append(rule); } rule.type = m_highlightTypeNames.at(currentIndex + 1); rule.pattern = QRegExp("%[^\n]*"); m_highlightingRules.append(rule); m_formatList = getDefaultHighlightFormats(); } TikzHighlighter::~TikzHighlighter() { } QMap TikzHighlighter::getDefaultHighlightFormats() { QMap formatList; if (m_commandInserter) formatList = m_commandInserter->getDefaultHighlightFormats(); const int currentIndex = m_highlightTypeNames.size() - 2; QTextCharFormat keywordFormat; keywordFormat.setForeground(Qt::darkBlue); keywordFormat.setFont(qApp->font()); keywordFormat.setFontWeight(QFont::Bold); formatList[m_highlightTypeNames.at(currentIndex)] = keywordFormat; QTextCharFormat commentFormat; commentFormat.setForeground(Qt::gray); commentFormat.setFont(qApp->font()); commentFormat.setFontWeight(QFont::Normal); formatList[m_highlightTypeNames.at(currentIndex + 1)] = commentFormat; return formatList; } QStringList TikzHighlighter::getTranslatedHighlightTypeNames() { QStringList translatedHighlightTypeNames; if (m_commandInserter) translatedHighlightTypeNames = m_commandInserter->getTranslatedHighlightTypeNames(); translatedHighlightTypeNames << tr("Environments") << tr("Comments"); return translatedHighlightTypeNames; } QStringList TikzHighlighter::getHighlightTypeNames() { return m_highlightTypeNames; } QMap TikzHighlighter::getTextCharFormats() { return m_formatList; } void TikzHighlighter::setTextCharFormats(const QMap &formatList) { m_formatList = formatList; } void TikzHighlighter::highlightBlock(const QString &text) { // Try each highlighting pattern and apply formatting if it matches foreach (const HighlightingRule &rule, m_highlightingRules) { // const QRegExp expression(rule.pattern); // int index = text.indexOf(expression); QRegExp expression(rule.pattern); int index = expression.indexIn(text); while (index >= 0) { const int length = expression.matchedLength(); if (index == 0 || text.at(index-1) != '\\') setFormat(index, length, m_formatList[rule.type]); // index = text.indexOf(expression, index + length); index = expression.indexIn(text, index + length); } } setCurrentBlockState(0); } ktikz/app/mainwindow.cpp0000660000175000017500000010624511455414611020020 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * * * Copyright (C) 2007, 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include #include "mainwindow.h" #ifdef KTIKZ_USE_KDE #include #include #include #include #include #include #include #include #include #include #include #else #include #include #include "aboutdialog.h" #include "assistantcontroller.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include "configdialog.h" #include "ktikzapplication.h" #include "loghighlighter.h" #include "logtextedit.h" #include "tikzcommandinserter.h" #include "tikzdocumentationcontroller.h" #include "tikzeditorhighlighter.h" #include "tikzeditorview.h" #include "../common/templatewidget.h" #include "../common/tikzpreviewcontroller.h" #include "../common/tikzpreview.h" #include "../common/utils/action.h" #include "../common/utils/filedialog.h" #include "../common/utils/icon.h" #include "../common/utils/recentfilesaction.h" #include "../common/utils/standardaction.h" #include "../common/utils/toggleaction.h" #include "../common/utils/url.h" #include QList MainWindow::s_mainWindowList; static const QString s_tempFileName = "tikzcode.pgf"; MainWindow::MainWindow() { #ifndef KTIKZ_USE_KDE m_aboutDialog = 0; m_assistantController = new AssistantController; #endif m_configDialog = 0; m_completer = 0; s_mainWindowList.append(this); #if !defined KTIKZ_USE_KDE && QT_VERSION >= 0x040600 QStringList themeSearchPaths; themeSearchPaths << QDir::homePath() + "/.local/share/icons/"; themeSearchPaths << QIcon::themeSearchPaths(); QIcon::setThemeSearchPaths(themeSearchPaths); #endif setAttribute(Qt::WA_DeleteOnClose); #ifdef KTIKZ_USE_KDE setObjectName("ktikz#"); setWindowIcon(KIcon("ktikz")); Action::setActionCollection(actionCollection()); #else setWindowIcon(QIcon(":/icons/qtikz-22.png")); #endif setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); m_tikzPreviewController = new TikzPreviewController(this); m_tikzEditorView = new TikzEditorView(this); m_commandInserter = new TikzCommandInserter(this); m_commandInserter->setEditor(m_tikzEditorView->editor()); m_tikzHighlighter = new TikzHighlighter(m_commandInserter, m_tikzEditorView->editor()->document()); m_tikzHighlighter->rehighlight(); // avoid that textEdit emits the signal contentsChanged() when it is still empty QWidget *mainWidget = new QWidget(this); QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget); mainLayout->setSpacing(0); mainLayout->setMargin(0); mainLayout->addWidget(m_tikzPreviewController->templateWidget()); mainLayout->addWidget(m_tikzEditorView); m_logDock = new QDockWidget(this); m_logDock->setObjectName("LogDock"); m_logDock->setAllowedAreas(Qt::AllDockWidgetAreas); m_logDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable); m_logDock->setWindowTitle(tr("Messages")); addDockWidget(Qt::BottomDockWidgetArea, m_logDock); m_logTextEdit = new LogTextEdit; m_logTextEdit->setWhatsThis(tr("

The messages produced by " "LaTeX are shown here. If your TikZ code contains errors, " "then a red border will appear and the errors will be " "highlighted.

")); m_logTextEdit->setReadOnly(true); m_logHighlighter = new LogHighlighter(m_logTextEdit->document()); m_logDock->setWidget(m_logTextEdit); m_previewDock = new QDockWidget(this); m_previewDock->setObjectName("PreviewDock"); m_previewDock->setAllowedAreas(Qt::AllDockWidgetAreas); m_previewDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable); m_previewDock->setWindowTitle(tr("Preview")); m_previewDock->setWidget(m_tikzPreviewController->tikzPreview()); addDockWidget(Qt::RightDockWidgetArea, m_previewDock); setCentralWidget(mainWidget); createActions(); #ifndef KTIKZ_USE_KDE createToolBars(); // run first in order to be able to add file/editToolBar->toggleViewAction() to the menu createMenus(); #endif createCommandInsertWidget(); // must happen after createMenus and before readSettings createStatusBar(); #ifdef KTIKZ_USE_KDE setupGUI(ToolBar | Keys | StatusBar | Save); setXMLFile("ktikzui.rc"); createGUI(); guiFactory()->addClient(this); #endif connect(m_commandInserter, SIGNAL(showStatusMessage(QString,int)), statusBar(), SLOT(showMessage(QString,int))); connect(m_tikzEditorView, SIGNAL(modificationChanged(bool)), this, SLOT(setDocumentModified(bool))); connect(m_tikzEditorView, SIGNAL(cursorPositionChanged(int,int)), this, SLOT(showCursorPosition(int,int))); connect(m_tikzEditorView, SIGNAL(showStatusMessage(QString,int)), statusBar(), SLOT(showMessage(QString,int))); connect(m_tikzEditorView, SIGNAL(focusIn()), this, SLOT(checkForFileChanges())); connect(m_tikzEditorView, SIGNAL(focusOut()), this, SLOT(saveLastInternalModifiedDateTime())); connect(m_tikzPreviewController, SIGNAL(logUpdated(QString,bool)), m_logTextEdit, SLOT(logUpdated(QString,bool))); readSettings(); // must be run after defining tikzController and tikzHighlighter, and after creating the toolbars, and after the connects // the following connects must happen after readSettings() because otherwise in that function the following signals would be unnecessarily triggered if (m_buildAutomatically) connect(m_tikzEditorView, SIGNAL(contentsChanged()), m_tikzPreviewController, SLOT(regeneratePreview())); setCurrentUrl(Url()); setDocumentModified(false); saveLastInternalModifiedDateTime(); m_tikzEditorView->editor()->setFocus(); /* QDir dir(QDir::tempPath() + "/ktikz"); if (!dir.exists()) QDir::temp().mkdir("ktikz"); */ } MainWindow::~MainWindow() { s_mainWindowList.removeAll(this); writeSettings(); #ifndef KTIKZ_USE_KDE delete m_assistantController; #endif delete m_tikzPreviewController; m_logHighlighter->deleteLater(); m_tikzHighlighter->deleteLater(); /* QDir dir(QDir::tempPath() + "/ktikz"); if (dir.exists()) QDir::temp().rmdir("ktikz"); */ } QWidget *MainWindow::widget() { return this; } #ifdef KTIKZ_USE_KDE bool MainWindow::queryClose() { return maybeSave(); } void MainWindow::readProperties(const KConfigGroup &group) { const KUrl url(group.readPathEntry("CurrentUrl", QString())); if (url.isValid() && !url.isEmpty()) loadUrl(url); } void MainWindow::saveProperties(KConfigGroup &group) { group.writePathEntry("CurrentUrl", m_currentUrl.url()); } #endif void MainWindow::closeEvent(QCloseEvent *event) { if (maybeSave()) { QApplication::restoreOverrideCursor(); event->accept(); } else event->ignore(); } void MainWindow::newFile() { MainWindow *newMainWindow = new MainWindow; newMainWindow->show(); } bool MainWindow::closeFile() { if (maybeSave()) { disconnect(m_tikzEditorView, SIGNAL(contentsChanged()), m_tikzPreviewController, SLOT(regeneratePreview())); m_tikzEditorView->editor()->clear(); connect(m_tikzEditorView, SIGNAL(contentsChanged()), m_tikzPreviewController, SLOT(regeneratePreview())); setCurrentUrl(Url()); m_tikzPreviewController->emptyPreview(); // abort still running processes m_logTextEdit->logUpdated("", false); // clear log window return true; } return false; } void MainWindow::open() { const Url openUrl = FileDialog::getOpenUrl(this, tr("Open PGF source file"), m_lastUrl, QString("*.pgf *.tikz *.tex|%1\n*|%2").arg(tr("PGF files", "filter")).arg(tr("All files", "filter"))); if (openUrl.isValid() && !openUrl.isEmpty()) loadUrl(openUrl); } bool MainWindow::save() { if (!m_currentUrl.isValid() || m_currentUrl.isEmpty()) return saveAs(); else return saveUrl(m_currentUrl); } bool MainWindow::saveAs() { const Url saveAsUrl = FileDialog::getSaveUrl(this, tr("Save PGF source file"), m_currentUrl, QString("*.pgf *.tikz *.tex|%1\n*|%2").arg(tr("PGF files", "filter")).arg(tr("All files", "filter"))); if (!saveAsUrl.isValid() || saveAsUrl.isEmpty()) return false; return saveUrl(saveAsUrl); } void MainWindow::reload() { const Url currentUrl = m_currentUrl; if (closeFile()) { saveLastInternalModifiedDateTime(); loadUrl(currentUrl); } } void MainWindow::checkForFileChanges() { QDateTime lastExternalModifiedDateTime(QFileInfo(m_currentUrl.path()).lastModified()); if (lastExternalModifiedDateTime <= m_lastInternalModifiedDateTime) return; QPointer fileChangedWarningMessageBox = new QMessageBox(this); fileChangedWarningMessageBox->setText(tr("The document was modified by another program.\nWhat do you want to do?")); fileChangedWarningMessageBox->setWindowTitle(KtikzApplication::applicationName()); fileChangedWarningMessageBox->setIcon(QMessageBox::Warning); QAbstractButton *overwriteButton = fileChangedWarningMessageBox->addButton(tr("&Overwrite"), QMessageBox::AcceptRole); QAbstractButton *reloadButton = fileChangedWarningMessageBox->addButton(tr("&Reload file"), QMessageBox::AcceptRole); fileChangedWarningMessageBox->addButton(QMessageBox::Cancel); fileChangedWarningMessageBox->exec(); if (fileChangedWarningMessageBox->clickedButton() == overwriteButton) saveUrl(m_currentUrl); else if (fileChangedWarningMessageBox->clickedButton() == reloadButton) reload(); delete fileChangedWarningMessageBox; } void MainWindow::saveLastInternalModifiedDateTime() { m_lastInternalModifiedDateTime = QDateTime::currentDateTime(); } /***************************************************************************/ void MainWindow::showTikzDocumentation() { QApplication::setOverrideCursor(Qt::WaitCursor); const QString tikzDocFile = TikzDocumentationController::tikzDocumentationPath(); const bool tikzDocFileExists = QFileInfo(tikzDocFile).exists(); // true if tikzDocFile is local and exists const QUrl tikzDocUrl = tikzDocFileExists ? QUrl("file:///" + tikzDocFile) : QUrl(tikzDocFile); if (!QDesktopServices::openUrl(tikzDocUrl)) { if (!tikzDocFileExists) QMessageBox::warning(this, KtikzApplication::applicationName(), tr("Cannot find TikZ documentation.\n" "Go to Settings -> Configure %1 and change in the \"General\" tab " "the path to the TikZ documentation.") .arg(KtikzApplication::applicationName())); else // if tikzDocFile is local and exists then failure to open it is caused by not finding the correct application QMessageBox::warning(this, KtikzApplication::applicationName(), tr("Cannot open TikZ documentation.\n" "No application is found which can open the file \"%1\".") .arg(tikzDocFile)); } QApplication::restoreOverrideCursor(); } #ifndef KTIKZ_USE_KDE void MainWindow::about() { if (!m_aboutDialog) m_aboutDialog = new AboutDialog(this); m_aboutDialog->exec(); } void MainWindow::showDocumentation() { m_assistantController->showDocumentation(); } #endif /***************************************************************************/ bool MainWindow::isDocumentModified() const { return isWindowModified(); } void MainWindow::setDocumentModified(bool isModified) { setWindowModified(isModified); m_saveAction->setEnabled(isModified); m_saveAsAction->setEnabled(m_currentUrl.isValid() && !m_currentUrl.isEmpty()); } void MainWindow::logUpdated() { m_logTextEdit->logUpdated(m_tikzPreviewController->getLogText()); // m_logTextEdit->logUpdated(m_tikzController->getLogText(), m_tikzController->hasRunFailed()); } /***************************************************************************/ #ifdef KTIKZ_USE_KDE void MainWindow::toggleWhatsThisMode() { if (QWhatsThis::inWhatsThisMode()) QWhatsThis::leaveWhatsThisMode(); else QWhatsThis::enterWhatsThisMode(); } #endif void MainWindow::createActions() { /* Open */ m_newAction = StandardAction::openNew(this, SLOT(newFile()), this); m_openAction = StandardAction::open(this, SLOT(open()), this); m_openRecentAction = StandardAction::openRecent(this, SLOT(loadUrl(Url)), this); m_saveAction = StandardAction::save(this, SLOT(save()), this); m_saveAsAction = StandardAction::saveAs(this, SLOT(saveAs()), this); m_reloadAction = new Action(Icon("view-refresh"), tr("Reloa&d"), this, "file_reload"); m_reloadAction->setShortcut(QKeySequence::Refresh); m_reloadAction->setStatusTip(tr("Reload the current document")); m_reloadAction->setWhatsThis(tr("

Reload the current document from disk.

")); connect(m_reloadAction, SIGNAL(triggered()), this, SLOT(reload())); m_closeAction = StandardAction::close(this, SLOT(closeFile()), this); m_exitAction = StandardAction::quit(this, SLOT(close()), this); m_newAction->setStatusTip(tr("Create a new document")); m_openAction->setStatusTip(tr("Open an existing file")); m_openRecentAction->setStatusTip(tr("Open a recently opened file")); m_saveAction->setStatusTip(tr("Save the current document to disk")); m_saveAsAction->setStatusTip(tr("Save the document under a new name")); m_closeAction->setStatusTip(tr("Close the current document")); m_exitAction->setStatusTip(tr("Exit the application")); m_newAction->setWhatsThis(tr("

Create a new document.

")); m_openAction->setWhatsThis(tr("

Open an existing file.

")); m_openRecentAction->setWhatsThis(tr("

Open a recently opened file.

")); m_saveAction->setWhatsThis(tr("

Save the current document to disk.

")); m_saveAsAction->setWhatsThis(tr("

Save the document under a new name.

")); m_closeAction->setWhatsThis(tr("

Close the current document.

")); m_exitAction->setWhatsThis(tr("

Exit the application.

")); /* View */ m_buildAction = new Action(Icon("run-build"), tr("&Build"), this, "build"); m_buildAction->setShortcut(tr("Ctrl+B", "View|Build")); m_buildAction->setStatusTip(tr("Build preview")); m_buildAction->setWhatsThis(tr("

Generate preview by building the current TikZ code in the editor.

")); connect(m_buildAction, SIGNAL(triggered()), m_tikzPreviewController, SLOT(generatePreview())); m_viewLogAction = new Action(Icon("run-build-file"), tr("View &Log"), this, "view_log"); m_viewLogAction->setStatusTip(tr("View log messages produced by the last executed process")); m_viewLogAction->setWhatsThis(tr("

Show the log messages produced by the last executed process in the Messages box.

")); connect(m_viewLogAction, SIGNAL(triggered()), this, SLOT(logUpdated())); /* Configure */ m_configureAction = StandardAction::preferences(this, SLOT(configure()), this); m_configureAction->setText(tr("&Configure %1...").arg(KtikzApplication::applicationName())); m_configureAction->setStatusTip(tr("Configure the settings of this application")); m_configureAction->setWhatsThis(tr("

Configure the settings of this application.

")); #ifdef KTIKZ_USE_KDE actionCollection()->addAction("toggle_preview", m_previewDock->toggleViewAction()); actionCollection()->addAction("toggle_log", m_logDock->toggleViewAction()); #endif /* Help */ m_showTikzDocAction = new Action(Icon("help-contents"), tr("TikZ &Manual"), this, "show_tikz_doc"); m_showTikzDocAction->setStatusTip(tr("Show the manual of TikZ and PGF")); m_showTikzDocAction->setWhatsThis(tr("

Show the manual of TikZ and PGF.

")); connect(m_showTikzDocAction, SIGNAL(triggered()), this, SLOT(showTikzDocumentation())); #ifdef KTIKZ_USE_KDE m_whatsThisAction = KStandardAction::whatsThis(this, SLOT(toggleWhatsThisMode()), this); #else m_helpAction = new QAction(Icon("help-contents"), tr("%1 &Handbook").arg(KtikzApplication::applicationName()), this); m_helpAction->setStatusTip(tr("Show the application's documentation")); connect(m_helpAction, SIGNAL(triggered()), this, SLOT(showDocumentation())); m_whatsThisAction = QWhatsThis::createAction(this); m_whatsThisAction->setIcon(QIcon(":/icons/help-contextual.png")); m_whatsThisAction->setStatusTip(tr("Show simple description of any widget")); m_aboutAction = new QAction(QIcon(":/icons/qtikz-22.png"), tr("&About %1").arg(KtikzApplication::applicationName()), this); m_aboutAction->setStatusTip(tr("Show the application's About box")); connect(m_aboutAction, SIGNAL(triggered()), this, SLOT(about())); m_aboutQtAction = new QAction(QIcon(":/icons/qt-logo-22.png"), tr("About &Qt"), this); m_aboutQtAction->setStatusTip(tr("Show the Qt library's About box")); connect(m_aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); #endif } #ifndef KTIKZ_USE_KDE void MainWindow::createMenus() { QMenu *fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(m_newAction); fileMenu->addAction(m_openAction); fileMenu->addAction(m_openRecentAction); fileMenu->addSeparator(); fileMenu->addAction(m_saveAction); fileMenu->addAction(m_saveAsAction); fileMenu->addAction(m_tikzPreviewController->exportAction()); fileMenu->addSeparator(); fileMenu->addAction(m_reloadAction); fileMenu->addSeparator(); fileMenu->addAction(m_closeAction); fileMenu->addSeparator(); fileMenu->addAction(m_exitAction); menuBar()->addMenu(m_tikzEditorView->menu()); QMenu *viewMenu = m_tikzPreviewController->menu(); viewMenu->insertAction(viewMenu->actions().at(viewMenu->actions().size()-2), m_buildAction); viewMenu->addAction(m_viewLogAction); menuBar()->addMenu(viewMenu); m_settingsMenu = menuBar()->addMenu(tr("&Settings")); QMenu *toolBarMenu = new QMenu(tr("&Toolbars"), this); toolBarMenu->setIcon(Icon("configure-toolbars")); toolBarMenu->menuAction()->setStatusTip(tr("Show or hide toolbars")); toolBarMenu->addAction(m_fileToolBar->toggleViewAction()); toolBarMenu->addAction(m_editToolBar->toggleViewAction()); toolBarMenu->addAction(m_viewToolBar->toggleViewAction()); toolBarMenu->addAction(m_runToolBar->toggleViewAction()); m_fileToolBar->toggleViewAction()->setStatusTip(tr("Show toolbar \"%1\"").arg(m_fileToolBar->windowTitle())); m_editToolBar->toggleViewAction()->setStatusTip(tr("Show toolbar \"%1\"").arg(m_editToolBar->windowTitle())); m_viewToolBar->toggleViewAction()->setStatusTip(tr("Show toolbar \"%1\"").arg(m_viewToolBar->windowTitle())); m_runToolBar->toggleViewAction()->setStatusTip(tr("Show toolbar \"%1\"").arg(m_runToolBar->windowTitle())); m_settingsMenu->addMenu(toolBarMenu); m_sideBarMenu = new QMenu(tr("&Sidebars"), this); m_sideBarMenu->setIcon(Icon("configure-toolbars")); m_sideBarMenu->menuAction()->setStatusTip(tr("Show or hide sidebars")); m_sideBarMenu->addAction(m_previewDock->toggleViewAction()); m_sideBarMenu->addAction(m_logDock->toggleViewAction()); m_previewDock->toggleViewAction()->setStatusTip(tr("Show sidebar \"%1\"").arg(m_previewDock->windowTitle())); m_logDock->toggleViewAction()->setStatusTip(tr("Show sidebar \"%1\"").arg(m_logDock->windowTitle())); m_settingsMenu->addMenu(m_sideBarMenu); m_settingsMenu->addSeparator(); m_settingsMenu->addAction(m_configureAction); connect(m_fileToolBar->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(setToolBarStatusTip(bool))); connect(m_editToolBar->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(setToolBarStatusTip(bool))); connect(m_viewToolBar->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(setToolBarStatusTip(bool))); connect(m_runToolBar->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(setToolBarStatusTip(bool))); connect(m_previewDock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(setDockWidgetStatusTip(bool))); connect(m_logDock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(setDockWidgetStatusTip(bool))); menuBar()->addSeparator(); QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(m_helpAction); helpMenu->addAction(m_showTikzDocAction); helpMenu->addAction(m_whatsThisAction); helpMenu->addSeparator(); helpMenu->addAction(m_aboutAction); helpMenu->addAction(m_aboutQtAction); } void MainWindow::createToolBars() { m_fileToolBar = addToolBar(tr("File")); m_fileToolBar->setObjectName("FileToolBar"); m_fileToolBar->addAction(m_newAction); m_fileToolBar->addAction(m_openAction); m_fileToolBar->addAction(m_saveAction); m_fileToolBar->addAction(m_closeAction); m_editToolBar = m_tikzEditorView->toolBar(); addToolBar(m_editToolBar); QList viewAndRunToolBars = m_tikzPreviewController->toolBars(); addToolBar(viewAndRunToolBars.at(0)); viewAndRunToolBars.at(1)->insertAction(viewAndRunToolBars.at(1)->actions().at(0), m_buildAction); viewAndRunToolBars.at(1)->addAction(m_viewLogAction); addToolBar(viewAndRunToolBars.at(1)); m_viewToolBar = viewAndRunToolBars.at(0); m_runToolBar = viewAndRunToolBars.at(1); setToolBarStyle(); } void MainWindow::setToolBarStyle() { QSettings settings(ORGNAME, APPNAME); settings.beginGroup("MainWindow"); int toolBarStyleNumber = settings.value("ToolBarStyle", 0).toInt(); Qt::ToolButtonStyle toolBarStyle = Qt::ToolButtonIconOnly; switch (toolBarStyleNumber) { case 0: toolBarStyle = Qt::ToolButtonIconOnly; break; case 1: toolBarStyle = Qt::ToolButtonTextOnly; break; case 2: toolBarStyle = Qt::ToolButtonTextBesideIcon; break; case 3: toolBarStyle = Qt::ToolButtonTextUnderIcon; break; } m_fileToolBar->setToolButtonStyle(toolBarStyle); m_editToolBar->setToolButtonStyle(toolBarStyle); m_tikzPreviewController->setToolBarStyle(toolBarStyle); settings.endGroup(); } #endif void MainWindow::createCommandInsertWidget() { QSettings settings(ORGNAME, APPNAME); bool commandsInDock = settings.value("CommandsInDock", false).toBool(); if (commandsInDock) { m_commandsDock = m_commandInserter->getDockWidget(this); addDockWidget(Qt::LeftDockWidgetArea, m_commandsDock); #ifdef KTIKZ_USE_KDE actionCollection()->addAction("toggle_commands_list", m_commandsDock->toggleViewAction()); #else m_sideBarMenu->insertAction(m_sideBarMenu->actions().at(1), m_commandsDock->toggleViewAction()); #endif connect(m_commandsDock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(setDockWidgetStatusTip(bool))); } else { #ifdef KTIKZ_USE_KDE KAction *insertAction = new Action(tr("&Insert"), this, "insert"); insertAction->setMenu(m_commandInserter->getMenu()); #else menuBar()->insertMenu(m_settingsMenu->menuAction(), m_commandInserter->getMenu()); #endif } } void MainWindow::createStatusBar() { QStatusBar *status = statusBar(); m_positionLabel = new QLabel(status); m_positionLabel->setMinimumWidth(150); status->addPermanentWidget(m_positionLabel, 0); status->showMessage(tr("Ready")); } void MainWindow::setDockWidgetStatusTip(bool enabled) { QAction *action = qobject_cast(sender()); QString dockName = action->text(); dockName.remove('&'); if (enabled) action->setStatusTip(tr("Hide sidebar \"%1\"").arg(dockName)); else action->setStatusTip(tr("Show sidebar \"%1\"").arg(dockName)); } void MainWindow::setToolBarStatusTip(bool enabled) { QAction *action = qobject_cast(sender()); if (enabled) action->setStatusTip(tr("Hide toolbar \"%1\"").arg(action->text())); else action->setStatusTip(tr("Show toolbar \"%1\"").arg(action->text())); } /***************************************************************************/ void MainWindow::configure() { if (!m_configDialog) { m_configDialog = new ConfigDialog(this); m_configDialog->setTranslatedHighlightTypeNames(m_tikzHighlighter->getTranslatedHighlightTypeNames()); m_configDialog->setHighlightTypeNames(m_tikzHighlighter->getHighlightTypeNames()); m_configDialog->setDefaultHighlightFormats(m_tikzHighlighter->getDefaultHighlightFormats()); connect(m_configDialog, SIGNAL(settingsChanged()), this, SLOT(applySettings())); } disconnect(m_tikzEditorView, SIGNAL(contentsChanged()), m_tikzPreviewController, SLOT(regeneratePreview())); m_configDialog->readSettings(); m_configDialog->exec(); if (m_buildAutomatically) connect(m_tikzEditorView, SIGNAL(contentsChanged()), m_tikzPreviewController, SLOT(regeneratePreview())); } void MainWindow::applySettings() { QSettings settings(ORGNAME, APPNAME); m_tikzEditorView->applySettings(); m_tikzPreviewController->applySettings(); m_buildAutomatically = settings.value("BuildAutomatically", true).toBool(); m_buildAction->setVisible(!m_buildAutomatically); settings.beginGroup("Editor"); m_useCompletion = settings.value("UseCompletion", true).toBool(); if (m_useCompletion) { if (!m_completer) m_completer = new QCompleter(this); updateCompleter(); m_tikzEditorView->setCompleter(m_completer); } else if (m_completer) { m_tikzEditorView->setCompleter(0); // do this before deleting m_completer because a signal is disconnected from m_completer delete m_completer; m_completer = 0; } settings.endGroup(); settings.beginGroup("Highlighting"); bool customHighlighting = settings.value("Customize", true).toBool(); QMap formatList = m_tikzHighlighter->getDefaultHighlightFormats(); if (customHighlighting) { int numOfRules = settings.value("Number", 0).toInt(); for (int i = 0; i < numOfRules; ++i) { QString name = settings.value("Item" + QString::number(i) + "/Name").toString(); QString colorName = settings.value("Item" + QString::number(i) + "/Color").toString(); QString fontName = settings.value("Item" + QString::number(i) + "/Font").toString(); QFont font; font.fromString(fontName); QTextCharFormat format; format.setForeground(QBrush(QColor(colorName))); format.setFont(font); formatList[name] = format; } } settings.endGroup(); m_tikzHighlighter->setTextCharFormats(formatList); m_tikzHighlighter->rehighlight(); m_openRecentAction->createRecentFilesList(); #ifndef KTIKZ_USE_KDE setToolBarStyle(); #endif } void MainWindow::readSettings() { m_openRecentAction->loadEntries(); QSettings settings(ORGNAME, APPNAME); settings.beginGroup("MainWindow"); // QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); // move(pos); QSize size = settings.value("size", QSize(800, 600)).toSize(); resize(size); restoreState(settings.value("MainWindowState").toByteArray()); settings.endGroup(); applySettings(); } void MainWindow::writeSettings() { m_openRecentAction->saveEntries(); QSettings settings(ORGNAME, APPNAME); // settings.setValue("TemplateFile", m_tikzEditorView->templateFile()); settings.beginGroup("MainWindow"); // settings.setValue("pos", pos()); settings.setValue("size", size()); settings.setValue("MainWindowState", QMainWindow::saveState()); /* int toolBarStyleNumber = 0; switch (m_fileToolBar->toolButtonStyle()) { case Qt::ToolButtonIconOnly: toolBarStyleNumber = 0; break; case Qt::ToolButtonTextOnly: toolBarStyleNumber = 1; break; case Qt::ToolButtonTextBesideIcon: toolBarStyleNumber = 2; break; case Qt::ToolButtonTextUnderIcon: toolBarStyleNumber = 3; break; } settings.setValue("ToolBarStyle", toolBarStyleNumber); */ settings.endGroup(); } /***************************************************************************/ bool MainWindow::maybeSave() { if (m_tikzEditorView->editor()->document()->isModified()) { const int ret = QMessageBox::warning(this, KtikzApplication::applicationName(), tr("The document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Save | QMessageBox::Default, QMessageBox::Discard, QMessageBox::Cancel | QMessageBox::Escape); if (ret == QMessageBox::Save) return save(); else if (ret == QMessageBox::Cancel) return false; } return true; } void MainWindow::loadUrl(const Url &url) { // check whether the file can be opened #ifdef KTIKZ_USE_KDE if (!url.isValid() || url.isEmpty()) return; const QString localFileName = url.isLocalFile() ? url.path() : m_tikzPreviewController->tempDir() + s_tempFileName; if (!url.isLocalFile() && KIO::NetAccess::exists(url, KIO::NetAccess::SourceSide, this)) { KIO::Job *job = KIO::file_copy(url, KUrl::fromPath(localFileName), -1, KIO::Overwrite | KIO::HideProgressInfo); if (!KIO::NetAccess::synchronousRun(job, this)) { // KMessageBox::information(this, i18nc("@info", "Could not copy %1 to temporary file %2.", url.prettyUrl(), localFileName)); KMessageBox::information(this, tr("Could not copy \"%1\" to temporary file \"%2\".").arg(url.prettyUrl()).arg(localFileName)); return; } } QFile localFile(localFileName); if (!localFile.open(QFile::ReadOnly | QFile::Text)) { // KMessageBox::error(this, i18nc("@info", "Cannot read file %1:%2", localFileName, localFile.errorString()), i18nc("@title:window", "File Read Error")); KMessageBox::error(this, tr("Cannot read file \"%1\":\n%2").arg(localFileName).arg(localFile.errorString()), tr("File Read Error", "@title:window")); m_openRecentAction->removeUrl(url); return; } #else const QString fileName = url.path(); QFile localFile(fileName); if (!localFile.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this, KtikzApplication::applicationName(), tr("Cannot read file \"%1\":\n%2.") .arg(fileName) .arg(localFile.errorString())); m_openRecentAction->removeUrl(Url(fileName)); return; } #endif // only open a new window (if necessary) if the file can actually be opened if (!m_tikzEditorView->editor()->document()->isEmpty()) { MainWindow *newMainWindow = new MainWindow; newMainWindow->loadUrl(url); newMainWindow->show(); return; } // load the file and generate preview disconnect(m_tikzEditorView, SIGNAL(contentsChanged()), m_tikzPreviewController, SLOT(regeneratePreview())); QTextStream in(&localFile); QApplication::setOverrideCursor(Qt::WaitCursor); m_tikzEditorView->editor()->setPlainText(in.readAll()); QApplication::restoreOverrideCursor(); m_tikzPreviewController->generatePreview(); if (m_buildAutomatically) connect(m_tikzEditorView, SIGNAL(contentsChanged()), m_tikzPreviewController, SLOT(regeneratePreview())); m_lastUrl = url; setCurrentUrl(url); m_openRecentAction->addUrl(url); statusBar()->showMessage(tr("File loaded"), 2000); } bool MainWindow::saveUrl(const Url &url) { if (!url.isValid() || url.isEmpty()) return false; #ifdef KTIKZ_USE_KDE const QString localFileName = url.isLocalFile() ? url.path() : m_tikzPreviewController->tempDir() + s_tempFileName; KSaveFile localFile(localFileName); if (!localFile.open()) { // KMessageBox::error(this, i18nc("@info", "Cannot write file %1:%2", localFileName, localFile.errorString()), i18nc("@title:window", "File Save Error")); KMessageBox::error(this, tr("Cannot write file \"%1\":\n%2").arg(localFileName).arg(localFile.errorString()), tr("File Save Error", "@title:window")); return false; } #else const QString fileName = url.path(); QFile localFile(fileName); if (!localFile.open(QFile::WriteOnly | QFile::Text)) { QMessageBox::warning(this, KtikzApplication::applicationName(), tr("Cannot write file \"%1\":\n%2.") .arg(fileName) .arg(localFile.errorString())); return false; } #endif QTextStream out(&localFile); QApplication::setOverrideCursor(Qt::WaitCursor); out << m_tikzEditorView->editor()->toPlainText().toUtf8(); out.flush(); QApplication::restoreOverrideCursor(); #ifdef KTIKZ_USE_KDE if (!localFile.finalize()) { // KMessageBox::error(this, i18nc("@info", "Cannot write file %1:%2", localFileName, localFile.errorString()), i18nc("@title:window", "File Save Error")); KMessageBox::error(this, tr("Cannot write file \"%1\":\n%2").arg(localFileName).arg(localFile.errorString()), tr("File Save Error", "@title:window")); return false; } #endif localFile.close(); #ifdef KTIKZ_USE_KDE if (!url.isLocalFile()) { KIO::Job *job = KIO::file_copy(KUrl::fromPath(localFileName), url, -1, KIO::Overwrite | KIO::HideProgressInfo); if (!KIO::NetAccess::synchronousRun(job, this)) { // KMessageBox::information(this, i18nc("@info", "Could not copy temporary file %1 to %2.", localFileName, url.prettyUrl())); KMessageBox::information(this, tr("Could not copy temporary file \"%1\" to \"%2\".").arg(localFileName).arg(url.prettyUrl())); return false; } } #endif m_lastUrl = url; setCurrentUrl(url); m_openRecentAction->addUrl(url); saveLastInternalModifiedDateTime(); // make sure that the save in this function is not seen as an "external" save statusBar()->showMessage(tr("File saved", "@info:status"), 2000); return true; } Url MainWindow::url() const { return m_currentUrl; } void MainWindow::setCurrentUrl(const Url &url) { m_currentUrl = url; m_tikzEditorView->editor()->document()->setModified(false); setDocumentModified(false); setWindowTitle(tr("%1[*] - %2").arg(strippedName(m_currentUrl)).arg(KtikzApplication::applicationName())); } QString MainWindow::strippedName(const Url &url) const { if (!url.isValid() || url.isEmpty()) return "untitled.txt"; const QString fileName = url.fileName(); return (fileName.isEmpty()) ? "untitled.txt" : fileName; } /***************************************************************************/ void MainWindow::showCursorPosition(int row, int col) { m_positionLabel->setText(tr("Line: %1\tCol: %2", "@info:status").arg(QString::number(row)).arg(QString::number(col))); } /***************************************************************************/ QString MainWindow::tikzCode() const { return m_tikzEditorView->editor()->toPlainText(); } /***************************************************************************/ void MainWindow::updateCompleter() { QStringList words = m_commandInserter->getCommandWords(); QStringListModel *model = new QStringListModel(words, m_completer); m_completer->setModel(model); m_completer->setModelSorting(QCompleter::CaseSensitivelySortedModel); m_completer->setCaseSensitivity(Qt::CaseSensitive); m_completer->setWrapAround(false); } ktikz/app/tikzeditorview.cpp0000660000175000017500000005151411455414611020725 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "tikzeditorview.h" #include #include #include #include #include #include #include #include #include "editgotolinewidget.h" #include "editindentdialog.h" #include "editreplacewidget.h" #include "editreplacecurrentwidget.h" #include "tikzeditor.h" //#include "tikzeditorhighlighter.h" #include "../common/utils/action.h" #include "../common/utils/icon.h" #include "../common/utils/standardaction.h" TikzEditorView::TikzEditorView(QWidget *parent) : QWidget(parent) { m_parentWidget = parent; m_tikzEditor = new TikzEditor; m_tikzEditor->setWhatsThis(tr("

Enter your TikZ code here. " "The code should begin with \\begin{tikzpicture} and end with " "\\end{tikzpicture}.

")); /* commandInserter = new TikzCommandInserter(tikzEditor, this); tikzHighlighter = new TikzHighlighter(commandInserter, tikzEditor->document()); tikzHighlighter->rehighlight(); // avoid that textEdit emits the signal contentsChanged() when it is still empty tikzController = new TikzPngPreviewer(textEdit); */ m_replaceWidget = new ReplaceWidget(this); m_replaceWidget->setVisible(false); m_replaceCurrentWidget = new ReplaceCurrentWidget(this); m_replaceCurrentWidget->setVisible(false); m_goToLineWidget = new GoToLineWidget(this); m_goToLineWidget->setVisible(false); // QFrame *mainWidget = new QFrame; // mainWidget->setLineWidth(1); // mainWidget->setFrameShape(QFrame::StyledPanel); // mainWidget->setFrameShadow(QFrame::Sunken); QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->setSpacing(0); mainLayout->setMargin(0); mainLayout->addWidget(m_tikzEditor); mainLayout->addWidget(m_replaceWidget); mainLayout->addWidget(m_replaceCurrentWidget); mainLayout->addWidget(m_goToLineWidget); createActions(); connect(m_tikzEditor->document(), SIGNAL(modificationChanged(bool)), this, SIGNAL(modificationChanged(bool))); connect(m_tikzEditor->document(), SIGNAL(contentsChanged()), this, SIGNAL(contentsChanged())); connect(m_tikzEditor, SIGNAL(cursorPositionChanged(int,int)), this, SIGNAL(cursorPositionChanged(int,int))); connect(m_tikzEditor, SIGNAL(showStatusMessage(QString,int)), this, SIGNAL(showStatusMessage(QString,int))); connect(m_tikzEditor, SIGNAL(focusIn()), this, SIGNAL(focusIn())); connect(m_tikzEditor, SIGNAL(focusOut()), this, SIGNAL(focusOut())); connect(m_replaceWidget, SIGNAL(search(QString,bool,bool,bool)), this, SLOT(search(QString,bool,bool,bool))); connect(m_replaceWidget, SIGNAL(replace(QString,QString,bool,bool,bool)), this, SLOT(replace(QString,QString,bool,bool,bool))); connect(m_replaceWidget, SIGNAL(focusEditor()), m_tikzEditor, SLOT(setFocus())); connect(m_replaceCurrentWidget, SIGNAL(showReplaceWidget()), m_replaceWidget, SLOT(show())); connect(m_replaceCurrentWidget, SIGNAL(search(QString,bool,bool,bool,bool)), this, SLOT(search(QString,bool,bool,bool,bool))); connect(m_replaceCurrentWidget, SIGNAL(replace(QString)), this, SLOT(replace(QString))); connect(m_replaceCurrentWidget, SIGNAL(replaceAll(QString,QString,bool,bool,bool,bool)), this, SLOT(replaceAll(QString,QString,bool,bool,bool,bool))); connect(m_replaceCurrentWidget, SIGNAL(setSearchFromBegin(bool)), this, SIGNAL(setSearchFromBegin(bool))); connect(m_goToLineWidget, SIGNAL(goToLine(int)), this, SLOT(goToLine(int))); } TikzEditorView::~TikzEditorView() { // tikzHighlighter->deleteLater(); } QPlainTextEdit *TikzEditorView::editor() { return m_tikzEditor; } void TikzEditorView::setFont(const QFont &editorFont) { m_tikzEditor->setFont(editorFont); m_tikzEditor->setTabStopWidth(m_tikzEditor->fontMetrics().width(" ")); } void TikzEditorView::createActions() { m_undoAction = StandardAction::undo(m_tikzEditor, SLOT(undo()), this); m_redoAction = StandardAction::redo(m_tikzEditor, SLOT(redo()), this); m_cutAction = StandardAction::cut(m_tikzEditor, SLOT(cut()), this); m_copyAction = StandardAction::copy(m_tikzEditor, SLOT(copy()), this); m_pasteAction = StandardAction::paste(m_tikzEditor, SLOT(paste()), this); m_selectAllAction = StandardAction::selectAll(m_tikzEditor, SLOT(selectAll()), this); m_undoAction->setStatusTip(tr("Undo the previous action")); m_redoAction->setStatusTip(tr("Redo the previous undone action")); m_cutAction->setStatusTip(tr("Cut the current selection's contents to the clipboard")); m_copyAction->setStatusTip(tr("Copy the current selection's contents to the clipboard")); m_pasteAction->setStatusTip(tr("Paste the clipboard's contents into the current selection")); m_selectAllAction->setStatusTip(tr("Select all the content")); m_undoAction->setWhatsThis(tr("

Undo the previous action.

")); m_redoAction->setWhatsThis(tr("

Redo the previous undone action.

")); m_cutAction->setWhatsThis(tr("

Cut the current selection's contents to the clipboard.

")); m_copyAction->setWhatsThis(tr("

Copy the current selection's contents to the clipboard.

")); m_pasteAction->setWhatsThis(tr("

Paste the clipboard's contents into the current selection.

")); m_selectAllAction->setWhatsThis(tr("

Select all the content.

")); Action *action; action = new Action(Icon("format-indent-more"), tr("&Indent..."), this, "edit_indent"); action->setShortcut(tr("Ctrl+I", "Edit|Indent")); action->setStatusTip(tr("Indent the current line or selection")); action->setWhatsThis(tr("

Indent the current line or selection.

")); connect(action, SIGNAL(triggered()), this, SLOT(editIndent())); m_editActions.append(action); action = new Action(tr("C&omment"), this, "edit_comment"); action->setShortcut(tr("Ctrl+D", "Edit|Comment")); action->setStatusTip(tr("Comment the current line or selection")); action->setWhatsThis(tr("

Comment the current line or selection.

")); connect(action, SIGNAL(triggered()), this, SLOT(editComment())); m_editActions.append(action); action = new Action(tr("Unco&mment"), this, "edit_uncomment"); action->setShortcut(tr("Ctrl+Shift+D", "Edit|Uncomment")); action->setStatusTip(tr("Uncomment the current line or selection")); action->setWhatsThis(tr("

Uncomment the current line or selection.

")); connect(action, SIGNAL(triggered()), this, SLOT(editUncomment())); m_editActions.append(action); action = new Action(this); action->setSeparator(true); m_editActions.append(action); m_editActions.append(StandardAction::find(this, SLOT(editFind()), this)); m_editActions.append(StandardAction::findNext(this, SLOT(editFindNext()), this)); m_editActions.append(StandardAction::findPrev(this, SLOT(editFindPrevious()), this)); m_editActions.append(StandardAction::replace(this, SLOT(editReplace()), this)); m_editActions.append(StandardAction::gotoLine(this, SLOT(editGoToLine()), this)); m_editActions.at(4)->setStatusTip(tr("Look up a piece of text in the document")); m_editActions.at(5)->setStatusTip(tr("Search the next occurrence of a text")); m_editActions.at(6)->setStatusTip(tr("Search the previous occurrence of a text")); m_editActions.at(7)->setStatusTip(tr("Search and replace a piece of text in the document")); m_editActions.at(8)->setStatusTip(tr("Go to a certain line in the document")); m_editActions.at(4)->setWhatsThis(tr("

Look up a piece of text in the document.

")); m_editActions.at(5)->setWhatsThis(tr("

Search the next occurrence of a text.

")); m_editActions.at(6)->setWhatsThis(tr("

Search the previous occurrence of a text.

")); m_editActions.at(7)->setWhatsThis(tr("

Search and replace a piece of text in the document.

")); m_editActions.at(8)->setWhatsThis(tr("

Go to a certain line in the document.

")); m_undoAction->setEnabled(false); m_redoAction->setEnabled(false); m_cutAction->setEnabled(false); m_copyAction->setEnabled(false); m_pasteAction->setEnabled(m_tikzEditor->canPaste()); connect(m_tikzEditor, SIGNAL(undoAvailable(bool)), m_undoAction, SLOT(setEnabled(bool))); connect(m_tikzEditor, SIGNAL(redoAvailable(bool)), m_redoAction, SLOT(setEnabled(bool))); connect(m_tikzEditor, SIGNAL(copyAvailable(bool)), m_cutAction, SLOT(setEnabled(bool))); connect(m_tikzEditor, SIGNAL(copyAvailable(bool)), m_copyAction, SLOT(setEnabled(bool))); connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(setPasteEnabled())); } QMenu *TikzEditorView::menu() { QMenu *editMenu = new QMenu(tr("&Edit"), m_parentWidget); editMenu->addAction(m_undoAction); editMenu->addAction(m_redoAction); editMenu->addSeparator(); editMenu->addAction(m_cutAction); editMenu->addAction(m_copyAction); editMenu->addAction(m_pasteAction); editMenu->addSeparator(); editMenu->addAction(m_selectAllAction); editMenu->addSeparator(); editMenu->addActions(m_editActions); return editMenu; } QToolBar *TikzEditorView::toolBar() { QToolBar *editToolBar = new QToolBar(tr("Edit"), m_parentWidget); editToolBar->setObjectName("EditToolBar"); editToolBar->addAction(m_undoAction); editToolBar->addAction(m_redoAction); // editToolBar->addAction(m_cutAction); // editToolBar->addAction(m_copyAction); // editToolBar->addAction(m_pasteAction); return editToolBar; } void TikzEditorView::setPasteEnabled() { m_pasteAction->setEnabled(m_tikzEditor->canPaste()); } void TikzEditorView::applySettings() { QSettings settings(ORGNAME, APPNAME); settings.beginGroup("Editor"); QFont editorFont; editorFont.fromString(settings.value("Font", qApp->font().toString()).toString()); setFont(editorFont); m_tikzEditor->setShowWhiteSpaces(settings.value("ShowWhiteSpaces", false).toBool()); m_tikzEditor->setShowTabulators(settings.value("ShowTabulators", false).toBool()); m_tikzEditor->setShowMatchingBrackets(settings.value("ShowMatchingBrackets", true).toBool()); m_tikzEditor->setWhiteSpacesColor(settings.value("ColorWhiteSpaces", Qt::gray).value()); m_tikzEditor->setTabulatorsColor(settings.value("ColorTabulators", Qt::gray).value()); m_tikzEditor->setMatchingColor(settings.value("ColorMatchingBrackets", Qt::yellow).value()); settings.endGroup(); /* settings.beginGroup("Highlighting"); customHighlighting = settings.value("Customize", true).toBool(); QMap formatList = tikzHighlighter->getDefaultHighlightFormats(); if (customHighlighting) { int numOfRules = settings.value("Number", 0).toInt(); for (int i = 0; i < numOfRules; ++i) { QString name = settings.value("Item" + QString::number(i) + "/Name").toString(); QString colorName = settings.value("Item" + QString::number(i) + "/Color").toString(); QString fontName = settings.value("Item" + QString::number(i) + "/Font").toString(); QFont font; font.fromString(fontName); QTextCharFormat format; format.setForeground(QBrush(QColor(colorName))); format.setFont(font); formatList[name] = format; } } settings.endGroup(); tikzHighlighter->setTextCharFormats(formatList); tikzHighlighter->rehighlight(); */ } /***************************************************************************/ /* void TikzEditorView::showCursorPosition() { QTextCursor cur = m_tikzEditor->textCursor(); const int curPos = cur.position(); cur.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); emit cursorPositionChanged(cur.blockNumber() + 1, curPos - cur.position() + 1); } */ /***************************************************************************/ /* Go to line */ void TikzEditorView::setLine(const QString &line) { bool ok; const int lineNumber = line.toInt(&ok, 10); if (ok) setLine(lineNumber); } void TikzEditorView::setLine(int lineNumber) { m_replaceWidget->setVisible(false); m_goToLineWidget->setVisible(true); m_goToLineWidget->setFocus(); m_goToLineWidget->setMaximumValue(m_tikzEditor->numOfLines()); m_goToLineWidget->setValue(lineNumber); } void TikzEditorView::goToLine(int lineNumber) { m_goToLineWidget->setVisible(false); m_tikzEditor->goToLine(lineNumber); m_tikzEditor->setFocus(); } void TikzEditorView::editGoToLine() { int lineNumber; lineNumber = m_tikzEditor->textCursor().blockNumber() + 1; if (lineNumber < 1) lineNumber = 1; setLine(lineNumber); } /***************************************************************************/ void TikzEditorView::editIndent() { QPointer indentDialog = new IndentDialog(this, tr("Indent")); if (!indentDialog->exec()) { delete indentDialog; return; } const QString insertString = indentDialog->insertChar(); const int numOfInserts = indentDialog->numOfInserts(); delete indentDialog; bool go = true; QTextCursor textCursor = m_tikzEditor->textCursor(); if (textCursor.hasSelection()) { textCursor.beginEditBlock(); const int start = textCursor.selectionStart(); int end = textCursor.selectionEnd(); textCursor.setPosition(start, QTextCursor::MoveAnchor); textCursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); while (textCursor.position() < end && go) { for (int i = 0; i < numOfInserts; ++i) textCursor.insertText(insertString); end++; go = textCursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor); } textCursor.endEditBlock(); } else { textCursor.beginEditBlock(); textCursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); for (int i = 0; i < numOfInserts; ++i) textCursor.insertText(insertString); textCursor.endEditBlock(); } } void TikzEditorView::editComment() { bool go = true; QTextCursor textCursor = m_tikzEditor->textCursor(); if (textCursor.hasSelection()) { textCursor.beginEditBlock(); const int start = textCursor.selectionStart(); int end = textCursor.selectionEnd(); textCursor.setPosition(start, QTextCursor::MoveAnchor); textCursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); while (textCursor.position() < end && go) { textCursor.insertText("% "); ++end; ++end; go = textCursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor); } textCursor.endEditBlock(); } else { textCursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); textCursor.insertText("% "); } } void TikzEditorView::editUncomment() { bool go = true; QTextCursor textCursor = m_tikzEditor->textCursor(); if (textCursor.hasSelection()) { textCursor.beginEditBlock(); const int start = textCursor.selectionStart(); int end = textCursor.selectionEnd() - 2; textCursor.setPosition(start, QTextCursor::MoveAnchor); textCursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); while (textCursor.position() < end && go) { textCursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 2); if (textCursor.selectedText() == QLatin1String("% ")) { textCursor.removeSelectedText(); --end; } go = textCursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor); } textCursor.endEditBlock(); } else { textCursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); textCursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 2); if (textCursor.selectedText() == QLatin1String("% ")) textCursor.removeSelectedText(); } } /***************************************************************************/ void TikzEditorView::editFind() { m_goToLineWidget->setVisible(false); m_replaceWidget->setVisible(true); m_replaceWidget->setFocus(); const QTextCursor textCursor = m_tikzEditor->textCursor(); if (textCursor.hasSelection()) m_replaceWidget->setText(textCursor.selectedText()); } bool TikzEditorView::search(const QString &text, bool isCaseSensitive, bool findWholeWords, bool forward, bool startAtCursor) { bool isFound = false; QTextDocument::FindFlags flags = 0; if (isCaseSensitive) flags |= QTextDocument::FindCaseSensitively; if (findWholeWords) flags |= QTextDocument::FindWholeWords; QTextCursor textCursor = m_tikzEditor->textCursor(); if (!startAtCursor) { if (forward) textCursor.movePosition(QTextCursor::Start); else textCursor.movePosition(QTextCursor::End); m_tikzEditor->setTextCursor(textCursor); } else textCursor.setPosition(textCursor.selectionStart()); if (!forward) flags |= QTextDocument::FindBackward; else textCursor.movePosition(QTextCursor::Right); const QTextCursor found = m_tikzEditor->document()->find(text, textCursor, flags); if (found.isNull()) { const QString msg = (forward) ? tr("End of document reached.\n\nContinue from the beginning?") : tr("Beginning of document reached.\n\nContinue from the end?"); const int ret = QMessageBox::warning(this, "Find", msg, QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape); if (ret == QMessageBox::Yes) { return search(text, isCaseSensitive, findWholeWords, forward, false); } } else { m_tikzEditor->setTextCursor(found); emit setSearchFromBegin(false); isFound = true; } m_tikzEditor->viewport()->repaint(); return isFound; } void TikzEditorView::editFindNext() { m_goToLineWidget->setVisible(false); m_replaceWidget->setVisible(true); m_replaceWidget->setFocus(); m_replaceWidget->setForward(true); m_replaceWidget->doFind(); } void TikzEditorView::editFindPrevious() { m_goToLineWidget->setVisible(false); m_replaceWidget->setVisible(true); m_replaceWidget->setFocus(); m_replaceWidget->setForward(false); m_replaceWidget->doFind(); } void TikzEditorView::editReplace() { /* m_goToLineWidget->setVisible(false); m_replaceWidget->setVisible(true); m_replaceWidget->setFocus(); const QTextCursor textCursor = m_tikzEditor->textCursor(); if (textCursor.hasSelection()) m_replaceWidget->setText(textCursor.selectedText()); */ editFind(); } void TikzEditorView::replace(const QString &replacement) { QTextCursor textCursor = m_tikzEditor->textCursor(); if (textCursor.hasSelection()) { const int start = textCursor.selectionStart(); textCursor.beginEditBlock(); textCursor.removeSelectedText(); textCursor.insertText(replacement); textCursor.setPosition(start, QTextCursor::MoveAnchor); textCursor.setPosition(start + replacement.length(), QTextCursor::KeepAnchor); textCursor.endEditBlock(); m_tikzEditor->setTextCursor(textCursor); } } void TikzEditorView::replace(const QString &text, const QString &replacement, bool isCaseSensitive, bool findWholeWords, bool forward, bool startAtCursor) { m_replaceWidget->setVisible(false); m_replaceCurrentWidget->setReplacement(text, replacement); m_replaceCurrentWidget->setVisible(true); m_replaceCurrentWidget->search(text, replacement, isCaseSensitive, findWholeWords, forward, startAtCursor); /* bool go = true; while (go && search(text, isCaseSensitive, findWholeWords, forward, startAtCursor)) { switch(QMessageBox::warning(this, "Replace", tr("Replace this occurrence?"), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes)) { case QMessageBox::Yes: replace(replacement); emit setSearchFromBegin(false); break; case QMessageBox::YesToAll: replace(replacement); replaceAll(text, replacement, isCaseSensitive, findWholeWords, forward, startAtCursor); return; break; case QMessageBox::No: emit setSearchFromBegin(false); break; case QMessageBox::Cancel: go = false; break; default: break; } } if (go) emit setSearchFromBegin(true); */ } void TikzEditorView::replaceAll(const QString &text, const QString &replacement, bool isCaseSensitive, bool findWholeWords, bool forward, bool startAtCursor) { while (search(text, isCaseSensitive, findWholeWords, forward, startAtCursor)) { replace(replacement); emit setSearchFromBegin(false); } emit setSearchFromBegin(true); } void TikzEditorView::setCompleter(QCompleter *completer) { m_tikzEditor->setCompleter(completer); } ktikz/app/qtikz_es.ts0000660000175000017500000041003011455414611017327 0ustar fhackenbergerfhackenberger AboutDialog Copyright 2007-2010 Florian Hackenberger and Glad Deschrijver Copyright 2007-2010 Florian Hackenberger y Glad Deschrijver This is a program for creating TikZ (from the LaTeX pgf package) diagrams. Este es un programa para crear diagramas TikZ (del paquete pgf en LaTeX). <p>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.</p><p>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.</p> <p>Este programa es software libre; puede ser redistribuido y/o modificado bajo los términos de la GNU General Public License como fue publicada por la Free Software Foundation; ya sea la versión 2 de la Licencia, o (a su elección), cualquier versión posterior.</p><p>Este programa se distribuye con la idea de que será útil, pero SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de SER COMERCIAL o SER ADECUADO PARA ALGÚN PROPÓSITO PARTICULAR. Vea la GNU General Public License para más detalles.</p> About %1 Acerca de %1 ConfigAppearanceWidget &Standard E&standar <p>When this option is checked, the default fonts and colors are used in the output.</p> <p>Si esta opción está seleccionada, los tipos de letras y los colores predeterminados serán utilizado.</p> Highlighting Resaltado &Custom &Personalizar Change &font... Cambiar &tipo de letras... Change c&olor... Cambiar co&lor... <p>When this option is checked, the fonts and colors defined below will be used in the output instead of the default ones.</p> <p>Si esta opción está seleccionada, los tipos de letras y los colores seleccionados por debajo serán utilizado en lugar de los predeterminados.</p> Change st&yle for: Cam&biar estilo para: <p>Select the structure appearing in the TikZ code for which you want to change the fonts and colors.</p> <p>Seleccionar la estructura apareciendo en el código TikZ para la cuál quiere cambiar el tipo de letras y el color.</p> <p>Select the font in which the structure that you selected in the box above should be displayed.</p> <p>Seleccionar el tipo de letras para la estructura seleccionada por encima.</p> <p>Select the text color in which the structure that you selected in the box above should be displayed.</p> <p>Seleccionar el color para la estructura seleccionada por encima.</p> ConfigDialog Configure %1 Configurar %1 &General &General &Editor &Editor &Highlighting &Resaltado ConfigEditorWidget Configure Editor Configurar Editor Editor Editor <p>Select the font of the main text.</p> <p>Seleccionar el tipo de letras del texto principal.</p> Text &font: &Tipo de letras del texto: Choose... Seleccionar.... <p>Show white spaces in the text by replacing them with special symbols. These symbols will not be saved on disk.</p> <p>Mostrar espacios en el texto cambiandolos con símbolos especiales. Estos símbolos no serán guardado en el disco.</p> Show &white spaces Mostrar &espacios <p>Select the color in which the spaces will be shown.</p> <p>Seleccione el color con cuál los espacios serán mostrado.</p> &Use color: C&olor: <p>Show tabulators in the text by replacing them with special symbols. These symbols will not be saved on disk.</p> <p>Mostrar tabuladores en el texto cambiandolos con símbolos especiales. Estos símbolos no serán guardado en el disco.</p> Show &tabulators Mostrar ta&buladores <p>Select the color in which the tabulators will be shown.</p> <p>Seleccione el color con cuál los tabuladores serán mostrado.</p> U&se color: Co&lor: <p>If the cursor is on a bracket ({[]}), then the corresponding opening/closing bracket will be highlighted.</p> <p>Si el cursor está sobre un paréntesis ({[]}), entonces la correspondiente paréntesis abierta/cerrada se destaca.</p> Show matching &brackets Resaltar &corchetes <p>Select the color in which the highlighted brackets will be shown.</p> <p>Seleccione el color para el resaltado de corchetes.</p> Use c&olor: Colo&r: <p>When the first letters of a TikZ command are typed in the text, a list of possible completions will be shown.</p> <p>Cuando las primeras letras de un comando TikZ se escriben en el texto, una lista de completaciones posibles se muestra.</p> Use command &completion Utilizar &completación de comandos ConfigGeneralWidget Cannot find TikZ documentation. Imposible de encontrar la documentación de TikZ. Browse program Seleccionar programa Program Programa Browse file Seleccionar fichero All files Todos los archivos General General Interface Interfaz <p>Select the maximum number of entries that appear in the "Open Recent" menu. When the number of recently opened files exceeds this limit, the oldest entries will be lost.</p> <p>Seleccionar el número máximo de entradas en el menu «Abrir reciente». Quando el número de ficheros recientemente abiertos excede este limite, las entradas más viejos se eliminan.</p> &Number of entries in the "Open Recent" menu: &Número de entradas en el menú «Abrir reciente»: <p>If this option is checked, a dock widget is available with a list of TikZ commands which you can insert in your code by clicking on them. If this option is not checked, the TikZ commands will be available in a menu instead.</p> <p>Si esta opción está marcada, un dock widget está disponible con una lista de comandos TikZ que puede insertar en el código haciendo clic sobre ellos. Si esta opción no está marcada, los comandos TikZ están disponibles en un menú.</p> Show TikZ commands in &dock instead of menu Mostrar comandos TikZ en &barra lateral en lugar de menu (you have to restart this program for this change to take effect) (tiene que reiniciar este programa para que este cambio tiene efecto) <p>Specify whether the preview should be generated automatically or manually. If the option "Automatically" is checked, the TikZ code in the editor is compiled while editing. If the option "Manually" is checked, a "Build" button is available and the TikZ code is only compiled when you press that button.</p> <p>Indique si la vista previa debe ser generada automáticamente o manualmente. Si la opción «Automáticamente» está marcada, el código TikZ está compilado durante la edición. Si la opción «Manualmente» está marcada, un botón «Compilar» está disponible y el código TikZ sólo está compilado quando pulse este botón.</p> Preview generation: Generar vista previa: <p>If this option is checked, the TikZ code in the editor is compiled while editing.</p> <p>Si esta opción está marcada, el código TikZ en el editor esta compilado durante la edición.</p> &Automatically &Automáticamente buildButtonGroup <p>If this option is checked, a "Build" button is available and the TikZ code is only compiled when you press that button.</p> <p>Si esta opción está marcada, un botón «Compilar» está disponible y el código TikZ sólo está compilada cuando pulse este botón.</p> &Manually &Manualmente <p>Select the style in which the toolbar will be displayed.</p> <p>Seleccione el estilo para la barra de herramientas.</p> Toolbar st&yle: Est&ilo de la barra de herramientas: Icons only Sólo iconos Text only Sólo texto Text alongside icons Texto junto a los iconos Text under icons Texto bajo los iconos Commands Comandos <p>Enter the path to the LaTeX executable here.</p> <p>Introduzca la ruta para el ejecutable LaTeX aquí.</p> PDF&LaTeX command: Comando PDF&LaTeX: Browse command Seleccionar comando <p>Browse to the LaTeX executable.</p> <p>Seleccione el ejecutable LaTeX.</p> <p>Enter the path to the pdftops executable here.</p> <p>Introduzca la ruta para el ejecutable pdftops aquí.</p> &Pdftops command: Comando &pdftops: <p>Browse to the pdftops executable.</p> <p>Seleccione el ejecutable pdftops.</p> Templates Ficheros de base <p>Enter the text which will be replaced by the TikZ code in the template here.</p> <p>Introduzca el texto que será reemplazado con el código TikZ en el fichero de base.</p> &Replace text: Texto de &reemplazo: <p>Enter the path to the executable of the text editor for the template here.</p> <p>Introduzca la ruta para el ejecutable del editor de textos aquí.</p> Editor &command: Comando del &editor: <p>Browse to the editor executable.</p> <p>Seleccione el ejecutable del editor.</p> Help Ayuda <p>Enter the path to the file containing the TikZ documentation here.</p> <p>Introduzca la ruta para el fichero conteniendo la documentación de TikZ aquí.</p> &TikZ documentation: Documentación de &TikZ: <p>Browse to the file containing the TikZ documentation.</p> <p>Seleccione el fichero conteniendo la documentación de TikZ.</p> <p>Press this button to search the file containing the TikZ documentation in the TeX directory structure using kpsewhich.</p> <p>Pulse este botón para buscar el fichero conteniendo la documentación de TikZ en la estructura de ficheros de TeX con kpsewhich.</p> Search in TeX directory structure Buscar en la estructura de ficheros de TeX &Search &Buscar FileDialog File "%1" already exists. Do you want to overwrite it? Fichero «%1» ya existe. ¿Está usted seguro de que desea sobrescribirlo? GoToLineWidget Go To Line Ir a línea Close go to line box Cerrar herramienta «Ir a línea» Go to line: Ir a línea: &Go &Ir IndentDialog Indent Selection Sangrar selección Using &spaces Con &espacios &Number of spaces: &Número de espacios: Using &tabs Con &tabs Num&ber of tabs: Núm&ero de tabs: KtikzApplication The document "%1" has been modified. Do you want to save your changes? El documento «%1» ha sido modificado. ¿Quiere guardar las modificaciones? LineEdit Clear input field Limpiar campo de entrada MainWindow Messages Mensajes <p>The messages produced by LaTeX are shown here. If your TikZ code contains errors, then a red border will appear and the errors will be highlighted.</p> <p>Los mensajes producido por LaTeX aparecen aquí. Si su código TikZ contiene errores, los errores serán iluminados.</p> Preview Previsualización Open PGF source file Abrir archivo de fuente PGF PGF files filter Archivos PGF All files filter Todos los archivos Save PGF source file Guardar archivo de fuente PGF Create a new document Crear un nuevo documento Open an existing file Abrir un fichero existente Save the current document to disk Guardar el documento actual en el disco Save the document under a new name Guardar el documento sobre un nuevo nombre Close the current document Cerrar el documento actual Exit the application Salir desde el programa View &Log Ver &log View log messages produced by the last executed process Ver mensajes log producido por el proceso ejecutado <p>Show the log messages produced by the last executed process in the Messages box.</p> <p>Ver mensajes log producido por el proceso ejecutado.</p> Configure the settings of this application Configurar las opciones de este programa TikZ &Manual &Manual de TikZ Show the manual of TikZ and PGF Abrir el manual de TikZ y PGF &About %1 &Acerca de %1 Show the application's About box Mostrar información sobre este programa About &Qt Acerca de &Qt Show the Qt library's About box Mostrar información sobre Qt Show simple description of any widget Mostrar descripción sencillo de cada uno elemento del interfaz de usuario Open a recently opened file Abrir un archivo reciente &File &Archivo &Settings &Preferencias &Toolbars Barras de &herramientas Show or hide toolbars Mostrar u ocultar barras de herramientas &Sidebars Barras &laterales Show or hide sidebars Mostrar u ocultar barras laterales &Help A&yuda File Archivo Ready Listo Hide sidebar "%1" Ocultar barra lateral «%1» Show sidebar "%1" Mostrar barra lateral «%1» The document was modified by another program. What do you want to do? El documento ha sido modificado por un otro programa. ¿Que quiere hacer? &Overwrite &Sobrescribir &Reload file &Sobrescribir fichero Cannot find TikZ documentation. Go to Settings -> Configure %1 and change in the "General" tab the path to the TikZ documentation. No puede encontrar la documentación de TikZ. Vaya a Preferencias -> Configurar %1 y cambíe en el menú «General» la ruta de la documentación TikZ. Cannot open TikZ documentation. No application is found which can open the file "%1". Imposible de abrir la documentación TikZ. No programa capable de abrir el fichero «%1» ha sido encontrado. Reloa&d Re&cargar Reload the current document Recargar el documento actual <p>Reload the current document from disk.</p> <p>Recargar el documento actual del disco.</p> <p>Create a new document.</p> <p>Crear un nuevo documento.</p> <p>Open an existing file.</p> <p>Abrir un fichero existente.</p> <p>Open a recently opened file.</p> <p>Abrir un archivo reciente.</p> <p>Save the current document to disk.</p> <p>Guardar el documento actual en el disco.</p> <p>Save the document under a new name.</p> <p>Guardar el documento sobre un nuevo nombre.</p> <p>Close the current document.</p> <p>Cerrar el documento actual.</p> <p>Exit the application.</p> <p>Salir desde el programa.</p> &Build &Compilar Ctrl+B View|Build Ctrl+B Build preview Generar previsualización <p>Generate preview by building the current TikZ code in the editor.</p> <p>Generar previsualización compilando el código TikZ en el editor.</p> <p>Configure the settings of this application.</p> <p>Configurar las opciones de este programa.</p> <p>Show the manual of TikZ and PGF.</p> <p>Abrir el manual de TikZ y PGF.</p> %1 &Handbook &Manual de %1 Show the application's documentation Mostrar la documentación de la aplicación &Insert &Introducir Hide toolbar "%1" Ocultar barra de herramientas «%1» Could not copy "%1" to temporary file "%2". No se pudo copiar «%1» al archivo temporal «%2». Cannot read file "%1": %2 Imposible de cargar el fichero «%1»: %2 File Read Error @title:window Error de lectura de archivo Cannot read file "%1": %2. Imposible de cargar el fichero «%1»: %2. Cannot write file "%1": %2 Imposible de guardar el fichero «%1»: %2 File Save Error @title:window Error guardar archivo Cannot write file "%1": %2. Imposible de guardar el fichero «%1»: %2. Could not copy temporary file "%1" to "%2". No se pudo copiar archivo temporal «%1» al «%2». File saved @info:status Archivo guardado Line: %1 Col: %2 @info:status Linea: %1 Col: %2 Show toolbar "%1" Mostrar barra de herramientas «%1» &Configure %1... &Configurar %1... The document has been modified. Do you want to save your changes? El documento ha sido modificado. ¿Quiere guardar las modificaciones? File loaded Fichero cargado %1[*] - %2 %1[*] - %2 QObject &New &Nuevo &Open... &Abrir... &Save &Guardar Save &As... Guardar &como... &Close &Cerrar &Quit &Salir &Undo &Deshacer Re&do R&ehacer Cu&t C&ortar &Copy &Copiar &Paste &Pegar Select &All Seleccionar &todo &Find... &Buscar... Find &Next Buscar &siguiente Find Pre&vious Buscar &anterior &Replace... &Reemplazar... &Go to Line... Ir a &línea... Zoom &In &Ampliar Zoom &Out &Reducir &Configure %1... &Configurar %1... Ctrl+Q File|Quit Ctrl+Q Ctrl+G Edit|Go to Line Ctrl+G &Open Recent Abrir &reciente Unable to open the help file (%1) No capable de abrir el fichero de ayuda (%1) Unable to launch Qt Assistant (%1) No capable de lanzar Qt Assistant (%1) RecentFilesAction Open &Recent Abrir &reciente ReplaceCurrentWidget &Replace &Reemplazar Replace &All Reemplazar &todo &Don't Replace &No reemplazar &Cancel &Annular Replace %1 by %2? Reemplazar %1 por %2 ? ReplaceWidget Find and Replace Buscar y reemplazar Close find and replace box Cerrar herramienta «Buscar y reemplazar» Find: Texto a encontrar: &Whole words Palabras &completas &Case sensitive Distinguir &may/minúsculas Replace with: Texto de reemplazo: Search backward Buscar anterior Search forward Buscar siguiente &Find &Buscar &Replace &Reemplazar TemplateWidget Choose Template Seleccionar fichero de base <p>Give the file name of the LaTeX template. If this input field is empty or contains an invalid file name, an internal default template will be used.</p> <p>Introduzca el nombre del fichero de base LaTeX. Si este campo de entrada está vacío o contiene un nombre de fichero inválido, un fichero de base interno será utilizado.</p> &Template: Fichero de &base: <p>Select template file</p> <p>Seleccionar fichero de base</p> <p>Edit this template with an external editor specified in the "Configure" dialog.</p> <p>Editar este fichero de base con un editor externo definido en el diálogo «Configurar».</p> Edit Editar All files Todos los archivos Select a template file Seleccionar un fichero de base %1 template files Ficheros de base %1 <p>Browse to an existing template file.</p> <p>Abrir un fichero de base existente.</p> <p>Reload template file</p> <p>Recargar fichero de base</p> <p>Reload current template file.</p> <p>Recargar fichero de base actual</p> <p>Edit template file</p> <p>Editar fichero de base</p> <p>The template contains the code of a complete LaTeX document in which the TikZ picture will be included and which will be typesetted to produce the preview image. The string %1 in the template will be replaced by the TikZ code.</p> <p>El fichero de base contiene el código de un documento LaTeX completo en el cuál el imagen TikZ será incluso y cuál será compilado para obtener la previsualización. El texto %1 en el fichero de base será reemplazado por el código TikZ.</p> TikzCommandInserter &Insert &Introducir Define st&yle Definir est&ilo &Options &Opciones Define style for every node with a certain &shape (standalone) Definir estilo para cada nodo con una &forma (autónomo) Define style for every node with a certain &shape (as option) Definir estilo para cada nodo con una &forma (como opción) Append style for every node with a certain &shape (as option) Añadir estilo para cada nodo con una &forma (como opción) &Define style for every to &Definir estilo para cada «to» <p>This is a list of TikZ commands. You can insert these commands in your code by clicking on them. You can obtain more commands by changing the category in the combo box.</p> <p>Este es una lista de comandos TikZ. Puede insertar estos comandos en su código pulsandolos. Puede obtener más comandos cambiando la categoría.</p> Alt+I Alt+I Category: Categoría: General General Commands Comandos Draw to Tirar a Options Opciones Define c&olor Definir c&olor TikZ Commands Comandos TikZ Parse error at line %1, column %2: %3 Error de análisis en línea %1, columna %2: %3 Cannot parse the TikZ commands file. Imposible de analisar el fichero de comandos TikZ. options opciones variable variable list lista first primero first+step primero+paso last último value1 valor1 text1 texto1 value2 valor2 text2 texto2 color color name nombre x x y y text texto x1 x1 y1 y1 x2 x2 y2 y2 x3 x3 y3 y3 width anchura height altura end point punto final half width mitad del ancho half height mitad de la altura start angle ángulo de inicio end angle ángulo final bend coord coord recodo math expression expresión matemática part name nombre del parte arrow tip kind tipo punta de flecha color name nombre de color core color color del núcleo end fin label etiqueta north/south/... nodes nodo ctrl1 ctrl1 ctrl2 ctrl2 function función xcoord coordx ycoord coordy degree grado radius radio x4 x4 y4 y4 corner esquina start inicio angle ángulo dimension dimensión value valor rectangle/circle/... style estilo fraction fracción rectangle/circle/coordinate round/rect/butt round/bevel/miter factor factor inset encarte number nombre dim dim axis/radial/ball/... ratio proporción degrees grados a11 a11 a12 a12 a21 a21 a22 a22 x0 x0 y0 y0 coordinate coordenada dash pattern patrón de guiones dash phase fase de guiones zigzag/brace/triangles/coil/expanding waves/bump/saw number or dimension or coordinate número o dimensión o coordenada number or dimension número o dimensión dx dx dy dy path ruta code código &Draw &Tirar Draw &to Next Point Tirar &al punto siguiente &Specifying Coordinates E&specificar coordenadas &Curves &Curvas Assignments using &let Asignaciones con «&let» &Nodes &Nodos &Arrows &Flechas &Styles E&stilos &Node Options Opciones &nodos &Positioning &Posicionamiento &Style &Estilo &Line Options Opciones &línea &Plot Options Opciones &trazar &Opacity &Opacidad &Dash Patterns Patrones de &guiones S&hade Options Opciones de s&ombras &Snaked Lines Options Opciones &serpentinas &Path Options Opciones &rutas &Transformations on Subsequent Objects in Path &Transformaciones en los objetos siguientes en la ruta Para&bola Options Opciones pará&bola &Grid Options Opciones &grilla &To Options Opciones «&to» \foreach with iteration \foreach con iteración \foreach with custom text \foreach con texto personalizado Specify &coordinate Especificar &coordenada &Node &Nodo &Clip and draw the clipping contours Re&cortar y trazar contornos de recorte Draw &line between two points Trazar &línea entre dos puntos Draw p&olygon Trazar p&olígono &Clip rectangle Re&cortar rectángulo &Move to point &Avanzar al punto &Move to relative point &Avanzar al punto relativo &Line to &Línea a &Line to relative point &Línea a punto relativo &Line to node &Línea a nodo &Line to node with anchor &Línea a nodo con áncora &Edge to &Enlace a &Edge to (with options) &Enlace a (con opciones) C&urve to C&urva a C&ycle &Ciclo &To &A &Node (with options and name) &Nodo (con opciones y nombre) &Plot &Trazar &Function &Función &Plot function &Trazar función &Absolute point Punto &absoluto Point &relative to initial position Punto &relativo a la posición inicial Point &relative to previous position Punto &relativo a la posición anterior &Polar coordinates Coordenadas &polares &Intersection of two lines &Intersección de dos líneas &Rectangle &Rectángulo &Circle &Círculo &Ellipse &Elipse &Arc &Arco &Parabola &Parábola &Sine curve in [0, pi/2] &Sinusoide en [0, pi/2] &Cosine curve in [0, pi/2] &Cosinusoide en [0, pi/2] &Grid &Grilla &Let &Sea Let &number Sea &número Let &point Sea &punto &Child &Hijo C&hild node Nodo &hijo Node &part &Parte de nodo Set &distance between nodes Definir &distancia entre los nodos Set parent &anchor Definir &áncora del padre Set child &anchor Definir &áncora del hijo Set node tree &grow direction Definir dirección de &crecimiento del árbol de nodos Set &label Definir &etiqueta Set &pin (label with connecting edge) Definir &perno (etiqueta con enlace) &Shorten start of line &Acortar comienzo de la línea &Shorten end of line &Acortar final de la línea Set &definition Establecer &definición Add to st&yle Añadir al e&stilo Define style for every &path (standalone) Definir estilo para &cada ruta (autónomo) Define style for every &node (standalone) Definir estilo para cada &nodo (autónomo) Define style for every &path (as option) Definir estilo para &cada ruta (como opción) Define style for every &node (as option) Definir estilo para cada &nodo (como opción) Define style for every &edge (as option) Definir estilo para cada &enlace (como opción) Define style for every n&ode part (as option) Definir estilo para cada parte de &nodo (como opción) Define style for every node &label (as option) Definir estilo para cada &etiqueta de nodo (como opción) Define style for every node &pin label (as option) Definir estilo para cada etiqueta de &perno de un nodo (como opción) Define style for every node &pin edge (as option) Definir estilo para cada enlace de &perno de un nodo (como opción) Define style for every &join (as option) Definir estilo para cada &juntura (como opción) Define style for every &picture (as option) Definir estilo para cada «&picture» (como opción) Define style for every &to path (as option) Definir estilo para cada ruta «&to» (como opción) Append style for every &path (as option) Añadir estilo para &cada ruta (como opción) Append style for every &node (as option) Añadir estilo para cada &nodo (como opción) Append style for every &edge (as option) Añadir estilo para cada &enlace (como opción) Append style for every n&ode part (as option) Añadir estilo para cada parte de &nodo (como opción) Append style for every node &label (as option) Añadir estilo para cada &etiqueta de nodo (como opción) Append style for every node &pin label (as option) Añadir estilo para cada etiqueta de &perno de un nodo (como opción) Append style for every node &pin edge (as option) Añadir estilo para cada enlace de &perno de un nodo (como opción) Append style for every &join (as option) Añadir estilo para cada &juntura (como opción) Append style for every &picture (as option) Añadir estilo para cada «&picture» (como opción) Append style for every &to path (as option) Añadir estilo para cada ruta «&to» (como opción) Set node at &start of path Poner nodo al &comienzo de la ruta Set node very near &start of path Poner nodo muy cerca del &comienzo de la ruta Set node near &start of path Poner nodo cerca del &comienzo de la ruta Set node &midway path Poner nodo a &mitad de la ruta Set node near &end of path Poner nodo cerca del &final de la ruta Set node very near &end of path Poner nodo muy cerca del &final de la ruta Set node at &end of path Poner nodo al &final de la ruta Set relative &position of node on path Definir &posición relativa del nodo en la ruta Set &text in node justified Justificar &texto en el nodo Align &text in node to the left Alinear &texto en el nodo a la izquierda Align &text to the left without hyphenation Alinear &texto en el nodo a la izquierda sin cesura Center &text in node Centrar &texto en el nodo Center &text without hyphenation Centrar &texto sin cesura Set &text width in node Definir anchura del &texto en el nodo Set &text height in node Definir altura del &texto en el nodo Set &text depth in node Definir profundidad del &texto en el nodo Set minimum &height of node Definir &altura mínima del nodo Set minimum &width of node Definir &anchura mínima del nodo Set &separation between text and node shape Definir &separación entre el texto y el contorno del nodo Set &separation outside node shape Definir &separación al exterior del nodo Set &distance between node and its label Definir &distancia entre el nodo y su etiqueta Set &distance between node and its pin label Definir &distancia entre el nodo y su etiqueta con perno Set &pin edge options Definir opciones del enlace de &perno Set node &sloped in the direction of path &Inclinar nodo en la dirección de la ruta Set &shape of node Definir &forma del nodo &Double line Línea &doble &Distance between the two lines of a double line &Distancia entra las dos líneas de una línea doble Specify shape of line &end Especificar forma del &fin de la línea Specify shape of line &joins Especificar forma de las &junturas de las líneas Maximal length of m&iter join Longitud máxima de las junturas «&miter» &Equal lines Líneas &iguales &Alternating lines Líneas &alternas S&hift dash start &Desplazar comienzo del guión S&hift horizontally &Desplazamiento horizontal S&hift vertically &Desplazamiento vertical S&hift to a point &Desplazamiento hacia un punto &Cancel all transformations except shift &Cancelar todas las transformaciones salvo desplazamiento &Rotate by angle &Rotación por un ángulo &Rotate around a point &Rotación alrededor de un punto S&cale horizontally Es&calar horizontalmente S&cale vertically Es&calar verticalmente S&cale in both directions Es&calar en ambas direcciones &Flip horizontally &Voltear horizontalmente &Flip vertically &Voltear verticalmente &Slant horizontally &Inclinación horizontal &Slant vertically &Inclinación vertical C&oordinate transformation Transformación de c&oordenadas Parabola with specified &width and height Parábola con &anchura y altura especificada Draw "subdued" &grid with specified step Trazar &grilla con paso específico "to" curved with &label «to» curvo con &etiqueta "to" curved with to &path «to» curvo con «to &path» TikzEditorView <p>Enter your TikZ code here. The code should begin with \begin{tikzpicture} and end with \end{tikzpicture}.</p> <p>Introduzca el código TikZ aquí. El código tiene que empezar con \begin{tikzpicture} y terminar con \end{tikzpicture}.</p> Undo the previous action Deshacer la acción precediente Redo the previous undone action Rehacer la acción precedientamente deshacido Cut the current selection's contents to the clipboard Cortar la selección actual en el portapapeles Copy the current selection's contents to the clipboard Copiar la selección actual en el portapapeles Paste the clipboard's contents into the current selection Pegar el contenido del portapapeles en la selección actual Select all the content Seleccionar todo el contenido &Indent... Sa&ngrar... Indent the current line or selection Sangrar la línea actual o la selección C&omment C&omentar Comment the current line or selection Comentar la línea actual o la selección Unco&mment Desco&mentar Uncomment the current line or selection Descomentar la línea actual o la selección &Edit &Editar Edit Editar Indent Sangrar End of document reached. Continue from the beginning? Alcanzado al fin del documento. Continuar al inicio? Beginning of document reached. Continue from the end? Alcanzado al inicio del documento. Continuar al fin? Look up a piece of text in the document Buscar un texto en el documento <p>Undo the previous action.</p> <p>Deshacer la acción precediente.</p> <p>Redo the previous undone action.</p> <p>Rehacer la acción precedientamente deshacido.</p> <p>Cut the current selection's contents to the clipboard.</p> <p>Cortar la selección actual en el portapapeles.</p> <p>Copy the current selection's contents to the clipboard.</p> <p>Copiar la selección actual en el portapapeles.</p> <p>Paste the clipboard's contents into the current selection.</p> <p>Pegar el contenido del portapapeles en la selección actual.</p> <p>Select all the content.</p> <p>Seleccionar todo el contenido.</p> Ctrl+I Edit|Indent Ctrl+I <p>Indent the current line or selection.</p> <p>Sangrar la línea actual o la selección.</p> Ctrl+D Edit|Comment Ctrl+D <p>Comment the current line or selection.</p> <p>Comentar la línea actual o la selección.</p> Ctrl+Shift+D Edit|Uncomment Ctrl+Shift+D <p>Uncomment the current line or selection.</p> <p>Descomentar la línea actual o la selección.</p> Search the next occurrence of a text Buscar la aparición siguiente de un texto Search the previous occurrence of a text Buscar la aparición anterior de un texto Search and replace a piece of text in the document Buscar y reemplazar un texto en el documento Go to a certain line in the document Ir a una determinada línea en el documento <p>Look up a piece of text in the document.</p> <p>Buscar un texto en el documento.</p> <p>Search the next occurrence of a text.</p> <p>Buscar la aparición siguiente de un texto.</p> <p>Search the previous occurrence of a text.</p> <p>Buscar la aparición anterior de un texto.</p> <p>Search and replace a piece of text in the document.</p> <p>Buscar y reemplazar un texto en el documento.</p> <p>Go to a certain line in the document.</p> <p>Ir a una determinada línea en el documento.</p> TikzHighlighter Environments Entornos Comments Comentos TikzPreview <p>Here the preview image of your TikZ code is shown. You can zoom in and out, and you can scroll the image by dragging it.</p> <p>Aquí se puede ver una previsualización del código TikZ. Ud. puede ampliar o reducirla.</p> Zoom preview in Ampliar previsualización <p>Zoom preview in by a predetermined factor.</p> <p>Ampliar previsualización con un factor predeterminado.</p> Zoom preview out Reducir previsualización <p>Zoom preview out by a predetermined factor.</p> <p>Reducir previsualización con un factor predeterminado.</p> &Zoom &Ampliar &Previous image Imagen &anterior Alt+Left View|Go to previous page Alt+Left Alt+Right View|Go to next page Alt+Right Generating image tikz preview status Generación del imagen Show previous image in preview Mostrar imagen anterior en la previsualización <p>Show the preview of the previous tikzpicture in the TikZ code.</p> <p>Mostrar la previsualización del imagen anterior en el código TikZ.</p> &Next image Imagen &siguiente Show next image in preview Mostrar imagen siguiente en la previsualización <p>Show the preview of the next tikzpicture in the TikZ code.</p> <p>Mostrar la previsualización del imagen siguiente en el código TikZ.</p> Select or insert zoom factor here Seleccione o introduzca el factor de amplificación aquí <p>Select the zoom factor here. Alternatively, you can also introduce a zoom factor and press Enter.</p> <p>Seleccione el factor de amplificación aquí. También puede introducir el factor de amplificación y pulsar Enter.</p> View Ver TikzPreviewController E&xport E&xportar Export image to various formats Exportar imagen en varios formates <p>Export image to various formats.</p> <p>Exportar imagen en varios formates.</p> &Encapsulated PostScript (EPS) &Encapsulated PostScript (EPS) Export to EPS Exportar como EPS <p>Export to EPS.</p> <p>Exportar como EPS.</p> &Portable Document Format (PDF) &Portable Document Format (PDF) Export to PDF Exportar como PDF <p>Export to PDF.</p> <p>Exportar como PDF.</p> Portable Network &Graphics (PNG) Portable Network &Graphics (PNG) Export to PNG Exportar como PNG <p>Export to PNG.</p> <p>Exportar como PNG.</p> &Stop Process &Abortar proceso Escape View|Stop Process Escape Abort current process Abortar proceso actual <p>Abort the execution of the currently running process.</p> <p>Abortar la ejecución del proceso actual.</p> S&hell Escape S&hell Escape Enable the \write18{shell-command} feature Activar la función \write18{comando de consola} <p>Enable LaTeX to run shell commands, this is needed when you want to plot functions using gnuplot within TikZ.</p><p><strong>Warning:</strong> Enabling this may cause malicious software to be run on your computer! Check the LaTeX code to see which commands are executed.</p> <p>Habilitar LaTeX para ejecutar comandos de consola, es necesario si desea trazar funciones con gnuplot en TikZ.</p><p><strong>Atención:</strong> activar esto puede causar que programas maliciosas se ejecuten en su computadora! Compruebe el código LaTeX para ver los comandos que se ejecutan.</p> &View &Ver Run Executar All files Todos los archivos Export Image Exportar imagen EPS image Imagen EPS PDF document Documento PDF PNG image Imagen PNG Export image Exportar imagen A file named "%1" already exists. Are you sure you want to overwrite it? Un fichero llamado «%1» ya existe. ¿Está usted seguro de que desea sobrescribirlo? &Overwrite Do you want to overwrite an existing file - warning box &Sobrescribir &Cancel Do you want to overwrite an existing file - warning box &Annular The file "%1" could not be overwritten. El fichero «%1» no puede ser sobreescrito. The image could not be exported to the file "%1". La imagen no podía ser exportado al fichero «%1». Template file could not be copied to a temporary file "%1". El fichero de plantilla no puede ser copiado en un fichero temporal «%1». TikzPreviewGenerator Gnuplot cannot be executed. Either Gnuplot is not installed or it is not available in the system PATH or you may have insufficient permissions to invoke the program. Gnuplot no se puede ejecutar. O Gnuplot no está instalado o no es disponible en el PATH del sistema o Ud. no tiene permisión de ejecutar este programa. Warning: could not load LaTeX logfile. Atención: imposible de abrir el fichero log de LaTeX. Process aborted. Proceso abortado. Process finished successfully. Proceso terminado con éxito. Error: loading PDF failed, the file is probably corrupted. Error: carga del PDF faltada, el archivo está probablemente dañado. Error: run failed. info process Error: ejecución faltada. Running... Ejecutando... ktikz/app/assistantcontroller.cpp0000660000175000017500000000600311455414611021750 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "assistantcontroller.h" #include #include #include #include #include #include "ktikzapplication.h" AssistantController::AssistantController() : m_process(0) { } AssistantController::~AssistantController() { if (m_process && m_process->state() == QProcess::Running) { m_process->terminate(); m_process->waitForFinished(3000); } delete m_process; } bool AssistantController::startAssistant() { if (!m_process) m_process = new QProcess(); if (m_process->state() != QProcess::Running) { QString app = QLibraryInfo::location(QLibraryInfo::BinariesPath) + QDir::separator(); #if !defined(Q_OS_MAC) app += QLatin1String("assistant"); #else app += QLatin1String("Assistant.app/Contents/MacOS/Assistant"); #endif const QString ktikzDocFile = QLatin1String(KTIKZ_DOCUMENTATION_INSTALL_DIR) + QLatin1String("/qtikz.qhc"); if (!QFileInfo(ktikzDocFile).isReadable()) { QMessageBox::critical(0, KtikzApplication::applicationName(), QObject::tr("Unable to open the help file (%1)").arg(ktikzDocFile)); return false; } QStringList args; args << QLatin1String("-collectionFile") << ktikzDocFile << QLatin1String("-enableRemoteControl"); m_process->start(app, args); if (!m_process->waitForStarted()) { QMessageBox::critical(0, KtikzApplication::applicationName(), QObject::tr("Unable to launch Qt Assistant (%1)").arg(app)); return false; } } return true; } void AssistantController::showDocumentation(const QString &page) { if (!startAssistant()) return; if (!page.isEmpty()) { QByteArray ba; ba.append("setSource qthelp://hackenberger.qtikz/doc/"); m_process->write(ba + page.toLocal8Bit() + '\0'); } } ktikz/app/translations.pri0000660000175000017500000000157211455414611020372 0ustar fhackenbergerfhackenbergerTIKZCOMMANDS_TR_H = tikzcommands_tr.h XMLPATTERNS = xmlpatterns LUPDATE = lupdate SED = sed contains(QT_VERSION, ^4\\.[0-6]\\..*) { ts.commands = @echo ERROR: This Qt version is too old for the ts target. Need Qt 4.7+. } else { system($${SED} -n q $${_PRO_FILE_}) { ts.commands += \ $${XMLPATTERNS} -output $${TIKZCOMMANDS_TR_H}_tmp $${_PRO_FILE_PWD_}/extract-tikzcommands.xq && \ $${SED} -e "s/amp\\;//g" $${TIKZCOMMANDS_TR_H}_tmp > $${TIKZCOMMANDS_TR_H} && \ (cd $${_PRO_FILE_PWD_} && $${LUPDATE} . ../common ../common/utils $${OUT_PWD}/$${TIKZCOMMANDS_TR_H} -ts $${TRANSLATIONS} && \ $${QMAKE_DEL_FILE} $${OUT_PWD}/$${TIKZCOMMANDS_TR_H}_tmp && \ $${QMAKE_DEL_FILE} $${OUT_PWD}/$${TIKZCOMMANDS_TR_H}) } else { ts.commands = @echo ERROR: $${SED} is not found on your system. Please install it if you want to use the 'make ts' target. } } QMAKE_EXTRA_TARGETS += ts ktikz/app/editgotolinewidget.ui0000660000175000017500000000316211455414611021363 0ustar fhackenbergerfhackenberger GoToLineWidget Go To Line Close go to line box :/icons/window-close.png:/icons/window-close.png Go to line: spinBoxGo &Go Qt::Horizontal 40 20 pushButtonClose spinBoxGo pushButtonGo ktikz/app/configeditorwidget.h0000660000175000017500000000334311455414611021164 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_CONFIGEDITORWIDGET_H #define KTIKZ_CONFIGEDITORWIDGET_H #include #include "ui_configeditorwidget.h" class ConfigEditorWidget : public QWidget { Q_OBJECT public: ConfigEditorWidget(QWidget *parent = 0); void readSettings(const QString &settingsGroup); void writeSettings(const QString &settingsGroup); protected: Ui::ConfigEditorWidget ui; private slots: void selectFont(); private: QFont m_generalFont; }; #endif ktikz/app/loghighlighter.cpp0000660000175000017500000000740211455414611020637 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * * * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "loghighlighter.h" LogHighlighter::LogHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent) { HighlightingRule rule; QTextCharFormat keywordFormat; keywordFormat.setForeground(Qt::red); keywordFormat.setFontWeight(QFont::Bold); QStringList keywordPatterns; keywordPatterns << "\\S*:\\d+:.*$" << "Undefined control sequence" << "LaTeX Warning:" << "LaTeX Error:" << "Runaway argument?" << "Missing character: .*!" << "Error:" << "^\\[.*\\] Line \\d+: .*"; // error msg created by TikzPngPreviewer::getParsedLogText() foreach (const QString &pattern, keywordPatterns) { rule.pattern = QRegExp(pattern); rule.format = keywordFormat; m_highlightingRules.append(rule); } QTextCharFormat commandFormat; commandFormat.setForeground(Qt::darkBlue); commandFormat.setFontWeight(QFont::Bold); rule.pattern = QRegExp("^\\[[^\\]\\d][^\\]]*\\]"); rule.format = commandFormat; m_highlightingRules.append(rule); m_statisticsFormat.setForeground(Qt::darkGray); // m_statisticsFormat.setFontPointSize(5.0); m_statisticsStartExpression = "Here is how much of TeX's memory you used:"; } LogHighlighter::~LogHighlighter() { } void LogHighlighter::highlightBlock(const QString &text) { // Try each highlighting pattern and apply formatting if it matches foreach (const HighlightingRule &rule, m_highlightingRules) { // const QRegExp expression(rule.pattern); // int index = text.indexOf(expression); QRegExp expression(rule.pattern); int index = expression.indexIn(text); while (index >= 0) { const int length = expression.matchedLength(); setFormat(index, length, rule.format); // index = text.indexOf(expression, index + length); index = expression.indexIn(text, index + length); } } // The current block state tracks multiline formatting setCurrentBlockState(0); int startIndex = text.indexOf(m_statisticsStartExpression); // Index to start highlighting statistics (if any) if (previousBlockState() == 1) // The previous block ended within statistics startIndex = 0; if (startIndex >= 0) { const int endIndex = text.size() - 1; const int statisticsLength = endIndex - startIndex + 1; setFormat(startIndex, statisticsLength, m_statisticsFormat); // Make the next invocation of this routine aware that it should continue highlighting in statistics format setCurrentBlockState(1); } } ktikz/app/ktikzui.rc0000660000175000017500000000714711455414611017161 0ustar fhackenbergerfhackenberger &File &Edit &View &Go &Process &Settings &Sidebars &Help File Toolbar Edit Toolbar Process Toolbar View Toolbar ktikz/app/tikzeditor.cpp0000660000175000017500000004772311455414611020041 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * Bracket matching and white space showing code originally from * * qdevelop: Copyright (C) 2006 Jean-Luc Biord * * (http://qdevelop.org) licensed under GPL v2 or later * * Enhanced version of bracket matching inspired by codeedit example in * * the Qt documentation: Copyright (C) 2009 Nokia Corporation and/or * * its subsidiary(-ies) (qt-info@nokia.com) licensed under LGPL v2.1 * * Enhanced white space and tab marking code based on katerenderer which * * is part of the KDE libraries: * * Copyright (C) 2007 Mirko Stocker , * * Copyright (C) 2003-2005 Hamish Rodda , * * Copyright (C) 2001 Christoph Cullmann , * * Copyright (C) 2001 Joseph Wenninger , * * Copyright (C) 1999 Jochen Wilhelmy * * licensed under LGPL v2 * * Completion code originally from texmaker: * * Copyright (C) 2003-2008 Pascal Brachet * * (http://www.xm1math.net/texmaker) licensed under GPL v2 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 . * ***************************************************************************/ #include "tikzeditor.h" #include #include #include #include #include #include #include #include static const QString s_completionPlaceHolder(0x2022); TikzEditor::TikzEditor(QWidget *parent) : QPlainTextEdit(parent) { m_showWhiteSpaces = true; m_showTabulators = true; m_showMatchingBrackets = true; m_whiteSpacesColor = Qt::gray; m_tabulatorsColor = Qt::gray; m_matchingColor = Qt::yellow; m_completer = 0; // setLineWidth(0); // setFrameShape(QFrame::NoFrame); const QColor lineColor(QApplication::style()->standardPalette().color(QPalette::Normal, QPalette::Base)); const QColor altLineColor(QApplication::style()->standardPalette().color(QPalette::Normal, QPalette::AlternateBase)); if (lineColor == altLineColor) m_highlightCurrentLineColor = lineColor.darker(105); else m_highlightCurrentLineColor = altLineColor; connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine())); highlightCurrentLine(); connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(showCursorPosition())); connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(matchBrackets())); } TikzEditor::~TikzEditor() { } void TikzEditor::highlightCurrentLine() { /* // this hides the white space and tab marks on the current line :-( QList extraSelections; if (!isReadOnly()) { QTextEdit::ExtraSelection selection; selection.format.setBackground(m_highlightCurrentLineColor); selection.format.setProperty(QTextFormat::FullWidthSelection, true); selection.cursor = textCursor(); selection.cursor.clearSelection(); extraSelections.append(selection); } setExtraSelections(extraSelections); // highlight the currently selected brackets (if any) matchBrackets(); */ // update the area covering the previously highlighted line (updating the whole viewport is too slow :-( ) m_previousHighlightedLine.moveTop(m_previousHighlightedLine.top() - (verticalScrollBar()->value() - m_oldVerticalScrollBarValue + 0.5) * m_previousHighlightedLine.height()); m_previousHighlightedLine.setHeight(2 * m_previousHighlightedLine.height()); // should be large enough to cover the previous line (ugly hack :-( ) viewport()->update(m_previousHighlightedLine); // update the area covering the currently highlighted line QRect rect = cursorRect(); rect.setX(0); rect.setWidth(viewport()->width()); viewport()->update(rect); m_previousHighlightedLine = rect; m_oldVerticalScrollBarValue = verticalScrollBar()->value(); } void TikzEditor::matchBrackets() { // clear previous bracket highlighting QList extraSelections; if (!isReadOnly()) { QTextEdit::ExtraSelection selection; selection.cursor = textCursor(); selection.cursor.clearSelection(); extraSelections.append(selection); } setExtraSelections(extraSelections); // find current matching brackets m_matchingBegin = -1; m_matchingEnd = -1; if (!m_showMatchingBrackets) return; m_plainText = toPlainText(); // QString matchText = simplifiedText(plainText); const QString matchText = m_plainText; const QTextCursor cursor = textCursor(); int pos = cursor.position(); if (pos == -1) return; else if (cursor.atEnd() || !QString("({[]})").contains(m_plainText.at(pos))) // if the cursor is not next to a bracket, then there is nothing to match, so return { if (pos <= 0 || !QString("({[]})").contains(m_plainText.at(--pos))) return; } // get corresponding opening/closing bracket and search direction QChar car = (!cursor.atEnd()) ? matchText.at(pos) : matchText.at(pos - 1); QChar matchCar; long inc = 1; if (car == '(') matchCar = ')'; else if (car == '{') matchCar = '}'; else if (car == '[') matchCar = ']'; else { inc = -1; if (car == ')') matchCar = '('; else if (car == '}') matchCar = '{'; else if (car == ']') matchCar = '['; else return; } // find location of the corresponding bracket m_matchingBegin = pos; int numOfMatchCharsToSkip = 0; do { if (matchText.at(pos) == car) numOfMatchCharsToSkip++; else if (matchText.at(pos) == matchCar) { numOfMatchCharsToSkip--; if (numOfMatchCharsToSkip == 0) { m_matchingEnd = pos; break; } } pos += inc; } while (pos >= 0 && pos < matchText.length()); if (m_matchingBegin > m_matchingEnd) qSwap(m_matchingBegin, m_matchingEnd); // if there is a match, then show it if (m_matchingBegin != -1) showMatchingBrackets(); } void TikzEditor::showMatchingBrackets() { for (QTextBlock block = firstVisibleBlock(); block.isValid(); block = block.next()) { if (blockBoundingGeometry(block).top() > viewport()->height()) break; const QString text = block.text(); const int textLength = text.length(); for (int i = 0; i < textLength; ++i) { if (block.position() + i == m_matchingBegin || block.position() + i == m_matchingEnd) { QList extraSelectionList = extraSelections(); if (!isReadOnly()) { QTextEdit::ExtraSelection selection; selection.format.setBackground(m_matchingColor); selection.cursor = textCursor(); selection.cursor.setPosition(block.position() + i, QTextCursor::MoveAnchor); selection.cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor); extraSelectionList.append(selection); } setExtraSelections(extraSelectionList); } } } } void TikzEditor::setShowWhiteSpaces(bool show) { m_showWhiteSpaces = show; } void TikzEditor::setShowTabulators(bool show) { m_showTabulators = show; } void TikzEditor::setShowMatchingBrackets(bool show) { m_showMatchingBrackets = show; } void TikzEditor::setWhiteSpacesColor(const QColor &color) { m_whiteSpacesColor = color; } void TikzEditor::setTabulatorsColor(const QColor &color) { m_tabulatorsColor = color; } void TikzEditor::setMatchingColor(const QColor &color) { m_matchingColor = color; } uint TikzEditor::spaceWidth() const { return QFontMetrics(document()->defaultFont()).width(' '); } void TikzEditor::paintTabstop(QPainter &painter, qreal x, qreal y) { QPen penBackup(painter.pen()); QPen pen(m_tabulatorsColor); pen.setWidthF(qMax(0.5, spaceWidth() * .1)); pen.setCapStyle(Qt::RoundCap); painter.setPen(pen); // FIXME: optimize for speed! qreal dist = spaceWidth() * 0.3; QPointF points[8]; points[0] = QPointF(x - dist, y - dist); points[1] = QPointF(x, y); points[2] = QPointF(x, y); points[3] = QPointF(x - dist, y + dist); x += spaceWidth() / 3.0; points[4] = QPointF(x - dist, y - dist); points[5] = QPointF(x, y); points[6] = QPointF(x, y); points[7] = QPointF(x - dist, y + dist); painter.drawLines(points, 4); painter.setPen(penBackup); } void TikzEditor::paintSpace(QPainter &painter, qreal x, qreal y) { QPen penBackup(painter.pen()); QPen pen(m_whiteSpacesColor); pen.setWidthF(spaceWidth() / 3.5); pen.setCapStyle(Qt::RoundCap); painter.setPen(pen); painter.drawPoint(QPointF(x, y)); painter.setPen(penBackup); } void TikzEditor::printWhiteSpaces(QPainter &painter) { const QFontMetrics fontMetrics = QFontMetrics(document()->defaultFont()); for (QTextBlock block = firstVisibleBlock(); block.isValid(); block = block.next()) { if (blockBoundingGeometry(block).top() > viewport()->height()) break; const QString text = block.text(); const int textLength = text.length(); for (int i = 0; i < textLength; ++i) { QTextCursor cursor = textCursor(); cursor.setPosition(block.position() + i, QTextCursor::MoveAnchor); const QRect rect = cursorRect(cursor); // const QFontMetrics fontMetrics = QFontMetrics(cursor.charFormat().font()); if (m_showWhiteSpaces && text.at(i) == ' ') paintSpace(painter, rect.x() + spaceWidth() / 2.0, rect.y() + fontMetrics.height() / 2.0); else if (m_showTabulators && text.at(i) == '\t') paintTabstop(painter, rect.x() + spaceWidth() / 2.0, rect.y() + fontMetrics.height() / 2.0); } } } void TikzEditor::paintEvent(QPaintEvent *event) { QPainter painter(viewport()); // highlight current line QRect rect = cursorRect(); rect.setX(0); rect.setWidth(viewport()->width()); painter.fillRect(rect, QBrush(m_highlightCurrentLineColor)); // show white spaces and tabulators if (m_showWhiteSpaces || m_showTabulators) printWhiteSpaces(painter); painter.end(); QPlainTextEdit::paintEvent(event); } void TikzEditor::goToLine(int line) { if (line <= numOfLines()) setCursorPosition(line, 0); } int TikzEditor::getCursorPosition(int row, int col) const { int i = 0; QTextBlock p = document()->begin(); while (p.isValid()) { if (row == i) break; i++; p = p.next(); } return p.position() + col; } void TikzEditor::setCursorPosition(int row, int col) { const int pos = getCursorPosition(row, col); QTextCursor cursor = textCursor(); cursor.setPosition(pos, QTextCursor::MoveAnchor); setTextCursor(cursor); // make sure that the cursor is in the middle of the visible area /* ensureCursorVisible(); const int newPosition = verticalScrollBar()->value() + cursorRect().top() - viewport()->height() / 2; verticalScrollBar()->setValue(newPosition); */ centerCursor(); setFocus(); } int TikzEditor::numOfLines() const { int num = 0; QTextBlock p; for (p = document()->begin(); p.isValid(); p = p.next()) ++num; return num; } void TikzEditor::showCursorPosition() { QTextCursor cursor = textCursor(); const int cursorPosition = cursor.position(); cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); const int startPosition = cursor.position(); emit cursorPositionChanged(cursor.blockNumber() + 1, cursorPosition - startPosition + 1); } /** * Determines the word on which the cursor is positioned * (necessary for completion). */ QString TikzEditor::textUnderCursor() const { QTextCursor cursor = textCursor(); const int oldPos = cursor.position(); // cursor.select(QTextCursor::WordUnderCursor); // const int newPos = cursor.selectionStart(); int newPos; for (newPos = oldPos; newPos > 0;) // move the cursor to the beginning of the word { cursor.setPosition(--newPos, QTextCursor::KeepAnchor); if (cursor.selectedText().trimmed().isEmpty()) // if the current char is a whitespace, then we have reached the beginning of the word { cursor.clearSelection(); cursor.setPosition(++newPos, QTextCursor::MoveAnchor); break; } else if (cursor.selectedText() == "\\" || cursor.atBlockStart()) // these characters also delimit the beginning of the word (the beginning of a TikZ command) { cursor.clearSelection(); break; } else if (cursor.selectedText() == "[" || cursor.selectedText() == ",") // these characters also delimit the beginning of the word (the beginning of a TikZ option) { cursor.clearSelection(); cursor.setPosition(++newPos, QTextCursor::MoveAnchor); break; } cursor.clearSelection(); } // cursor.setPosition(newPos, QTextCursor::MoveAnchor); cursor.setPosition(oldPos, QTextCursor::KeepAnchor); QString word = cursor.selectedText(); // if (word.right(1) != word.trimmed().right(1)) // word = ""; return word; } void TikzEditor::keyPressEvent(QKeyEvent *event) { const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers(); /* completer */ if (m_completer && m_completer->popup()->isVisible()) { // the following keys are forwarded by the completer to the widget switch (event->key()) { case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Escape: case Qt::Key_Tab: case Qt::Key_Backtab: event->ignore(); return; } } /* scroll viewport when Ctrl+Up and Ctrl+Down are pressed */ if (event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_Up) { const int dy = -1 + verticalScrollBar()->value(); verticalScrollBar()->setValue(dy); } else if (event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_Down) { const int dy = 1 + verticalScrollBar()->value(); verticalScrollBar()->setValue(dy); } /* ensure that PageUp and PageDown keep the cursor at the same visible place */ /* else if (event->key() == Qt::Key_PageUp || event->key() == Qt::Key_PageDown) { const QTextCursor::MoveOperation moveOperation = (event->key() == Qt::Key_PageUp) ? QTextCursor::Up : QTextCursor::Down; QTextCursor cursor = textCursor(); const QFontMetrics fontMetrics(document()->defaultFont()); const int repeat = viewport()->height() / fontMetrics.lineSpacing() - 1; const int oldPosition = cursorRect().top(); if (modifier & Qt::ShiftModifier) cursor.movePosition(moveOperation, QTextCursor::KeepAnchor, repeat); else cursor.movePosition(moveOperation, QTextCursor::MoveAnchor, repeat); setTextCursor(cursor); const int newPosition = verticalScrollBar()->value() + cursorRect().top() - oldPosition; verticalScrollBar()->setValue(newPosition); ensureCursorVisible(); } */ /* the first time End is pressed moves the cursor to the end of the line, the second time to the end of the block */ else if (event->key() == Qt::Key_Home && !(modifier & Qt::ControlModifier) && !(modifier & Qt::ShiftModifier)) { QTextCursor cursor = textCursor(); const int oldPosition = cursor.position(); cursor.movePosition(QTextCursor::StartOfLine); if (cursor.position() == oldPosition) cursor.movePosition(QTextCursor::StartOfBlock); setTextCursor(cursor); ensureCursorVisible(); } else if (event->key() == Qt::Key_End && !(modifier & Qt::ControlModifier) && !(modifier & Qt::ShiftModifier)) { QTextCursor cursor = textCursor(); const int oldPosition = cursor.position(); cursor.movePosition(QTextCursor::EndOfLine); if (cursor.position() == oldPosition) cursor.movePosition(QTextCursor::EndOfBlock); setTextCursor(cursor); ensureCursorVisible(); } /* keys that change the content without moving the cursor may alter the brackets too */ else if (event->key() == Qt::Key_Delete || (event->key() == Qt::Key_Z && (modifier & Qt::ControlModifier))) { QPlainTextEdit::keyPressEvent(event); highlightCurrentLine(); matchBrackets(); // calculate new bracket highlighting } /* go to next argument in text inserted with code completion */ else if (event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab) { QTextCursor cursor = textCursor(); QTextBlock block = cursor.block(); QTextDocument::FindFlags flags = 0; if (event->key() == Qt::Key_Backtab) flags = QTextDocument::FindBackward; if (block.isValid() && block.text().contains(s_completionPlaceHolder)) { cursor = document()->find(s_completionPlaceHolder, cursor, flags); if (!cursor.isNull()) setTextCursor(cursor); else QPlainTextEdit::keyPressEvent(event); } else QPlainTextEdit::keyPressEvent(event); } else QPlainTextEdit::keyPressEvent(event); /* completer */ if (m_completer) { // const QString endOfWord("~!@#$%^&*()_+{}|:\"<>?,./;'[]-= "); const QString completionPrefix = textUnderCursor(); if ((event->modifiers() & (Qt::ControlModifier | Qt::AltModifier)) || (event->text().isEmpty() && event->key() != Qt::Key_AltGr) || completionPrefix.length() < 3) // || endOfWord.contains(event->text().right(1))) { m_completer->popup()->hide(); } else { if (completionPrefix != m_completer->completionPrefix()) { m_completer->setCompletionPrefix(completionPrefix); m_completer->popup()->setCurrentIndex(m_completer->completionModel()->index(0, 0)); } if (m_completer->completionPrefix() != m_completer->currentCompletion()) // || m_completer->completionCount() > 1) { QTextCursor cursor = textCursor(); // cursor.movePosition(QTextCursor::StartOfWord); cursor.movePosition(QTextCursor::Left, QTextCursor::MoveAnchor, m_completer->completionPrefix().length()); QRect rect = cursorRect(cursor); rect.translate(5, 5); rect.setWidth(m_completer->popup()->sizeHintForColumn(0) + m_completer->popup()->verticalScrollBar()->sizeHint().width()); m_completer->complete(rect); // show popup } else m_completer->popup()->hide(); } } } void TikzEditor::focusInEvent(QFocusEvent *event) { if (m_completer) m_completer->setWidget(this); emit focusIn(); QPlainTextEdit::focusInEvent(event); } void TikzEditor::focusOutEvent(QFocusEvent *event) { emit focusOut(); QPlainTextEdit::focusOutEvent(event); } void TikzEditor::setCompleter(QCompleter *completer) { if (m_completer) disconnect(m_completer, 0, this, 0); m_completer = completer; if (!m_completer) return; m_completer->setWidget(this); m_completer->setCompletionMode(QCompleter::PopupCompletion); m_completer->setCaseSensitivity(Qt::CaseInsensitive); connect(m_completer, SIGNAL(activated(QString)), this, SLOT(insertCompletion(QString))); } void TikzEditor::insertCompletion(const QString &completion) { if (!m_completer || m_completer->widget() != this) return; emit showStatusMessage(completion, 0); QTextCursor cursor = textCursor(); const int extra = completion.length() - m_completer->completionPrefix().length(); const int pos = cursor.position(); // remove all options (between <...>) and put cursor at the first option QString insertWord = completion.right(extra); const QRegExp rx("<[^<>]*>"); const int offset = rx.indexIn(insertWord) - 1; // put cursor at the first option insertWord.replace(rx, s_completionPlaceHolder); cursor.insertText(insertWord); if (insertWord.contains(s_completionPlaceHolder)) { cursor.setPosition(pos, QTextCursor::MoveAnchor); cursor = document()->find(s_completionPlaceHolder, cursor); } else if (offset > 0) cursor.setPosition(pos + offset + 1, QTextCursor::MoveAnchor); setTextCursor(cursor); } ktikz/app/tikzdocumentationcontroller.h0000660000175000017500000000317211455414611023163 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_TIKZDOCUMENTATIONCONTROLLER_H #define KTIKZ_TIKZDOCUMENTATIONCONTROLLER_H #include class TikzDocumentationController : public QObject { Q_OBJECT public: static QString tikzDocumentationPath(); static void storeTikzDocumentationPath(const QString &path); static QString searchTikzDocumentationInTexTree(); }; #endif ktikz/app/app.pro0000660000175000017500000001211611455417661016443 0ustar fhackenbergerfhackenbergerinclude(../conf.pri) include(../defaults.pri) include(../macros.pri) TEMPLATE = app CONFIG += warn_on \ thread \ qt QT += xml win32:INCLUDEPATH += $${_PRO_FILE_PWD_} $${_PRO_FILE_PWD_}/../poppler-win32 win32:LIBS += -L$${_PRO_FILE_PWD_}/../poppler-win32/ LIBS += -lpoppler-qt4 LOCALESUBDIR = locale TEMPLATESUBDIR = templates DEFINES += ORGNAME=\\\"$${ORGNAME}\\\" DEFINES += APPNAME=\\\"$${APPNAME}\\\" DEFINES += APPVERSION=\\\"$${APPVERSION}\\\" DEFINES += KTIKZ_TRANSLATIONS_INSTALL_DIR=\\\"$${RESOURCESDIR}/$${LOCALESUBDIR}\\\" DEFINES += KTIKZ_TEMPLATES_INSTALL_DIR=\\\"$${RESOURCESDIR}/$${TEMPLATESUBDIR}\\\" DEFINES += KTIKZ_TIKZ_DOCUMENTATION_DEFAULT=\\\"$${TIKZ_DOCUMENTATION_DEFAULT}\\\" DEFINES += KTIKZ_TEMPLATE_EDITOR_DEFAULT=\\\"$${TEMPLATE_EDITOR_DEFAULT}\\\" ### Build files MOC_DIR = moc OBJECTS_DIR = obj RCC_DIR = rcc UI_DIR = ui ### Input FORMS += configappearancewidget.ui \ configeditorwidget.ui \ configgeneralwidget.ui \ editgotolinewidget.ui \ editindentdialog.ui \ editreplacewidget.ui \ ../common/templatewidget.ui #SOURCES += $$formSources($$FORMS) \ # linguist does not use translations in corresponding cpp files if we use this :-( SOURCES += ../common/utils/action.cpp \ ../common/utils/colorbutton.cpp \ ../common/utils/filedialog.cpp \ ../common/utils/lineedit.cpp \ ../common/utils/recentfilesaction.cpp \ ../common/utils/standardaction.cpp \ ../common/utils/selectaction.cpp \ ../common/utils/toggleaction.cpp \ ../common/utils/url.cpp \ aboutdialog.cpp \ assistantcontroller.cpp \ configappearancewidget.cpp \ configdialog.cpp \ configeditorwidget.cpp \ configgeneralwidget.cpp \ editgotolinewidget.cpp \ editindentdialog.cpp \ editreplacewidget.cpp \ editreplacecurrentwidget.cpp \ ktikzapplication.cpp \ loghighlighter.cpp \ logtextedit.cpp \ main.cpp \ mainwindow.cpp \ tikzcommandinserter.cpp \ tikzcommandwidget.cpp \ tikzdocumentationcontroller.cpp \ tikzeditor.cpp \ tikzeditorhighlighter.cpp \ tikzeditorview.cpp \ ../common/templatewidget.cpp \ ../common/tikzpreview.cpp \ ../common/tikzpreviewcontroller.cpp \ ../common/tikzpreviewgenerator.cpp \ ../common/tikzpreviewthread.cpp HEADERS += $$headerFiles($$SOURCES) \ ../common/mainwidget.h \ ../common/utils/colordialog.h \ ../common/utils/fontdialog.h \ ../common/utils/icon.h RESOURCES = qtikz.qrc TRANSLATIONS = qtikz_de.ts qtikz_es.ts qtikz_fr.ts ### Output TARGET = qtikz target.path = $${BINDIR} INSTALLS += target ### Desktop file unix:!macx { ICONDIR = $$replace(RESOURCESDIR, "/", "\\/") DESKTOPTEMPLATES = qtikz.desktop.template createdesktop.name = create desktop file createdesktop.input = DESKTOPTEMPLATES createdesktop.output = ${QMAKE_FILE_BASE} createdesktop.commands = sed -e \"s/Icon=/Icon=$${ICONDIR}\\/qtikz-128.png/\" ${QMAKE_FILE_IN} > ${QMAKE_FILE_OUT} createdesktop.CONFIG = no_link target_predeps QMAKE_EXTRA_COMPILERS += createdesktop desktop.path = $${DESKTOPDIR} desktop.files += $${OUT_PWD}/qtikz.desktop desktop.CONFIG += no_check_exist INSTALLS += desktop resources.files += icons/qtikz-128.png } ### Translations include(translations.pri) LOCALEDIR = $${LOCALESUBDIR}/ # the function qmFiles assumes that this variable ends with / or is empty !isEmpty(TRANSLATIONS) { updateqm.name = lrelease ${QMAKE_FILE_IN} updateqm.input = TRANSLATIONS updateqm.output = $${LOCALEDIR}${QMAKE_FILE_BASE}.qm updateqm.commands = $${LRELEASECOMMAND} -silent ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT} updateqm.CONFIG = no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqm #translations.path = $${RESOURCESDIR} #translations.files += $${LOCALESUBDIR} translations.path = $${RESOURCESDIR}/$${LOCALESUBDIR} translations.files += $$qmFiles($${TRANSLATIONS}) translations.CONFIG += no_check_exist INSTALLS += translations } ### Documentation include(../doc/doc.pri) ### Templates templates.path = $${RESOURCESDIR}/$${TEMPLATESUBDIR} templates.files += ../examples/template_example.pgs \ ../examples/template_example2.pgs \ ../examples/beamer-example-template.pgs INSTALLS += templates ### Resources (install resources here so that "make uninstall" tries and succeeds to remove $${RESOURCESDIR} after everything inside it has been uninstalled) resources.path = $${RESOURCESDIR} INSTALLS += resources ### Mimetype unix:!macx { mimetype.path = $${MIMEDIR} mimetype.files += ../common/qtikz.xml INSTALLS += mimetype } ### Install icon and dll files win32 { RC_FILE = qtikz.rc icon.files = icon/qtikz.ico icon.path = $${PREFIX} INSTALLS += icon dlls.path = $${PREFIX} dlls.files += $${_PRO_FILE_PWD_}/../poppler-win32/*.dll debug { dlls.files += $$[QT_INSTALL_BINS]/QtCored4.dll \ $$[QT_INSTALL_BINS]/QtGuid4.dll \ $$[QT_INSTALL_BINS]/QtXmld4.dll } dlls.files += $$[QT_INSTALL_BINS]/assistant.exe \ $$[QT_INSTALL_BINS]/QtCore4.dll \ $$[QT_INSTALL_BINS]/QtGui4.dll \ $$[QT_INSTALL_BINS]/QtXml4.dll \ $$[QT_INSTALL_BINS]/mingwm10.dll \ $$[QT_INSTALL_BINS]/libgcc_s_dw2-1.dll INSTALLS += dlls installer.path = $${PREFIX} installer.files = ../qtikz.nsi installer.extra = "echo !define VERSION \"$${APPVERSION}\" > $${PREFIX}/qtikz.nsh" INSTALLS += installer } ktikz/app/configappearancewidget.ui0000660000175000017500000001034011455414611022156 0ustar fhackenbergerfhackenberger ConfigAppearanceWidget Highlighting <p>When this option is checked, the default fonts and colors are used in the output.</p> &Standard <p>When this option is checked, the fonts and colors defined below will be used in the output instead of the default ones.</p> &Custom true Change st&yle for: <p>Select the structure appearing in the TikZ code for which you want to change the fonts and colors.</p> false QAbstractItemView::SingleSelection 1 false true false false true false Qt::Horizontal 80 20 false <p>Select the font in which the structure that you selected in the box above should be displayed.</p> Change &font... false <p>Select the text color in which the structure that you selected in the box above should be displayed.</p> Change c&olor... Qt::Vertical 20 20 ktikz/app/configgeneralwidget.h0000660000175000017500000000347011455414611021314 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_CONFIGGENERALWIDGET_H #define KTIKZ_CONFIGGENERALWIDGET_H #include #include "ui_configgeneralwidget.h" class ConfigGeneralWidget : public QWidget { Q_OBJECT public: ConfigGeneralWidget(QWidget *parent = 0); void readSettings(const QString &settingsGroup); void writeSettings(const QString &settingsGroup); protected: Ui::ConfigGeneralWidget ui; private slots: void searchTikzDocumentation(); void browseCommand(); private: void browseCommand(QLineEdit *lineEdit, bool isProgram = true); }; #endif ktikz/app/ktikzapplication.h0000660000175000017500000000367111455414611020670 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZAPPLICATION_H #define KTIKZAPPLICATION_H #ifdef KTIKZ_USE_KDE #include #else #include #include #endif class MainWindow; #ifdef KTIKZ_USE_KDE class KtikzApplication : public KApplication #else class KtikzApplication : public QApplication #endif { Q_OBJECT public: KtikzApplication(int &argc, char **argv); virtual ~KtikzApplication(); void init(); static QString applicationName(); #ifndef KTIKZ_USE_KDE protected: void commitData(QSessionManager &manager); void saveState(QSessionManager &manager); #endif private: #ifndef KTIKZ_USE_KDE QStringList m_args; #endif bool m_firstTime; }; #endif ktikz/app/logtextedit.h0000660000175000017500000000321511455414611017636 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef LOGTEXTEDIT_H #define LOGTEXTEDIT_H #include class LogTextEdit : public QTextEdit { Q_OBJECT public: LogTextEdit(QWidget *parent = 0); virtual QSize sizeHint() const; public slots: void logUpdated(const QString &logText); void logUpdated(const QString &logText, bool runFailed); private: void setLogPalette(bool runFailed); }; #endif ktikz/app/tikzcommandwidget.h0000660000175000017500000000277711455414611021042 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef TIKZCOMMANDWIDGET_H #define TIKZCOMMANDWIDGET_H #include class TikzCommandWidget : public QWidget { Q_OBJECT public: TikzCommandWidget(QWidget *parent = 0); virtual QSize sizeHint() const; }; #endif ktikz/app/aboutdialog.cpp0000660000175000017500000000622111455414611020127 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "aboutdialog.h" #include #include #include #include #include "ktikzapplication.h" AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent) { QLabel *pixmapLabel = new QLabel; pixmapLabel->setPixmap(QPixmap(":/icons/qtikz-128.png")); QLabel *label = new QLabel(QString("

%1 %2

%3

%4

") .arg(KtikzApplication::applicationName()) .arg(QCoreApplication::applicationVersion()) .arg(tr("Copyright 2007-2010 Florian Hackenberger and Glad Deschrijver")) .arg(tr("This is a program for creating TikZ (from the LaTeX pgf package) diagrams."))); label->setWordWrap(true); QWidget *topWidget = new QWidget; QHBoxLayout *topLayout = new QHBoxLayout; topLayout->addWidget(pixmapLabel); topLayout->addWidget(label); topWidget->setLayout(topLayout); QTextEdit *textEdit = new QTextEdit(tr("

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.

")); textEdit->setReadOnly(true); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(topWidget); mainLayout->addWidget(textEdit); mainLayout->addWidget(buttonBox); mainLayout->setSpacing(10); buttonBox->setFocus(); setWindowTitle(tr("About %1").arg(KtikzApplication::applicationName())); } ktikz/app/configgeneralwidget.ui0000660000175000017500000004215511455414611021505 0ustar fhackenbergerfhackenberger ConfigGeneralWidget General Interface 10 <p>Select the maximum number of entries that appear in the "Open Recent" menu. When the number of recently opened files exceeds this limit, the oldest entries will be lost.</p> &Number of entries in the "Open Recent" menu: historyLengthSpinBox <p>Select the maximum number of entries that appear in the "Open Recent" menu. When the number of recently opened files exceeds this limit, the oldest entries will be lost.</p> Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal 40 0 2 <p>If this option is checked, a dock widget is available with a list of TikZ commands which you can insert in your code by clicking on them. If this option is not checked, the TikZ commands will be available in a menu instead.</p> Show TikZ commands in &dock instead of menu (you have to restart this program for this change to take effect) 2 <p>Specify whether the preview should be generated automatically or manually. If the option "Automatically" is checked, the TikZ code in the editor is compiled while editing. If the option "Manually" is checked, a "Build" button is available and the TikZ code is only compiled when you press that button.</p> Preview generation: <p>If this option is checked, the TikZ code in the editor is compiled while editing.</p> &Automatically buildButtonGroup <p>If this option is checked, a "Build" button is available and the TikZ code is only compiled when you press that button.</p> &Manually buildButtonGroup <p>Select the style in which the toolbar will be displayed.</p> Toolbar st&yle: toolBarStyleComboBox <p>Select the style in which the toolbar will be displayed.</p> Icons only Text only Text alongside icons Text under icons Qt::Horizontal 40 0 Commands <p>Enter the path to the LaTeX executable here.</p> PDF&LaTeX command: latexEdit 0 0 <p>Enter the path to the LaTeX executable here.</p> Browse command <p>Browse to the LaTeX executable.</p> :/icons/document-open.png:/icons/document-open.png <p>Enter the path to the pdftops executable here.</p> &Pdftops command: pdftopsEdit 0 0 <p>Enter the path to the pdftops executable here.</p> Browse command <p>Browse to the pdftops executable.</p> :/icons/document-open.png:/icons/document-open.png Templates <p>Enter the text which will be replaced by the TikZ code in the template here.</p> &Replace text: replaceEdit 0 0 <p>Enter the text which will be replaced by the TikZ code in the template here.</p> <p>Enter the path to the executable of the text editor for the template here.</p> Editor &command: editorEdit 0 0 <p>Enter the path to the executable of the text editor for the template here.</p> Browse command <p>Browse to the editor executable.</p> :/icons/document-open.png:/icons/document-open.png Help 0 0 <p>Enter the path to the file containing the TikZ documentation here.</p> &TikZ documentation: tikzDocEdit 0 0 <p>Enter the path to the file containing the TikZ documentation here.</p> Browse file <p>Browse to the file containing the TikZ documentation.</p> :/icons/document-open.png:/icons/document-open.png 0 0 <p>Press this button to search the file containing the TikZ documentation in the TeX directory structure using kpsewhich.</p> Search in TeX directory structure &Search Qt::Horizontal 40 20 Qt::Vertical 20 0 LineEdit QLineEdit
../common/utils/lineedit.h
ktikz/app/ReadMe0000660000175000017500000000052611455414611016213 0ustar fhackenbergerfhackenbergerREAD THIS IN ORDER TO COMPILE THE Qt4 TEMPLATE ---------------------------------------------- Before compiling, check the Qt Options, go to Project->Project Options->C++ Support and open the Qt Options tab. Check that the Qt installation directory is correct for the Qt version you've chosen. ------------------ Andreas Pakulat July 2006 ktikz/app/tikzdocumentationcontroller.cpp0000660000175000017500000000525111455414611023516 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "tikzdocumentationcontroller.h" #include #include QString TikzDocumentationController::tikzDocumentationPath() { QSettings settings(ORGNAME, APPNAME); QString tikzDocFile = settings.value("TikzDocumentation").toString(); const bool tikzDocFileInSettingsEmpty = tikzDocFile.isEmpty(); if (tikzDocFileInSettingsEmpty) tikzDocFile = searchTikzDocumentationInTexTree(); #ifdef KTIKZ_TIKZ_DOCUMENTATION_DEFAULT if (tikzDocFile.isEmpty()) tikzDocFile = KTIKZ_TIKZ_DOCUMENTATION_DEFAULT; #endif if (tikzDocFileInSettingsEmpty && !tikzDocFile.isEmpty()) storeTikzDocumentationPath(tikzDocFile); return tikzDocFile; } void TikzDocumentationController::storeTikzDocumentationPath(const QString &path) { QSettings settings(ORGNAME, APPNAME); settings.setValue("TikzDocumentation", path); } QString TikzDocumentationController::searchTikzDocumentationInTexTree() { const QString kpsewhichCommand = "kpsewhich"; QStringList kpsewhichArguments; kpsewhichArguments << "--format" << "TeX system documentation" << "pgfmanual.pdf" << "pgfmanual.pdf.gz" << "pgfmanual.ps" << "pgfmanual.ps.gz"; QProcess process; process.start(kpsewhichCommand, kpsewhichArguments); process.waitForStarted(1000); while (process.state() != QProcess::NotRunning) process.waitForFinished(100 /*msec*/); QString tikzDocFile = process.readAllStandardOutput(); return tikzDocFile.trimmed(); } ktikz/screenshot_v0.1.png0000660000175000017500000031556411455414615020021 0ustar fhackenbergerfhackenbergerPNG  IHDRx IDATxwx]u*lE1l\J$pIhT΁7rrB vI $  brrz_μVVʺs]<=XQt]n"B!B[gF!d/]g:&!B!W_\e߼ wL$B!B,eWX6?!B!>mgS#א+IJN%=3-W!B!D;tq1eʔ!Wo>ls\!B!b mӆV7SRɔ"ۇ-)+W!B!cp(!RSSD"Lik>`l%cX^^ :4]h%>IB!B! _aEsX8%)r,V[klnI5~!IB!Bq~PKII YYYލ+y՝ݛJr)i]~D[AQͯ.] 3o|4mԓۗ;X2__=Vb81 1*ڵ8;׮B!8:UV rp&&]8ڊ2{wuOң{A_]g\k}:f]CyI˩*'>{JXgK]5s!ϾZcMt^nlaǦ{_ z'k!B!f,(rmǑFf?y96@+;vfL/ȭLܼ޲ؒy\2u)^c˸\]{vo9~k@:-*bd:N=GtZ>V#=^uؗ?)Fe7jaDrS<.TO6lcwck/N$;q]~]ulERrZO{׶(9o,]>c?Jdln;n1+N-bޤ<fV8ȇj;5{߼ /Ƽ\2&^/Uhm{uO !BKjF3rhG"& a132:d^\Υ>Yr=>;h}(_+\7{V{,<[AF3}UjdOZ?fU!kr1_6~*&}Z+k=a:O@Zyɧw$}]ٿ)^阮]\K[z_1&kr1_MˡMo//uw}0fg*+]I}U7y '͑za)9iqgV4\KQ{+x|z8=4=rJsq:{\oٷ}I3ɷ?G!c{To-0wYak_7("x_%L䌙HňlTS/Y4c#ysnkfp[c3{mGszFU7wPxץ2:=SB!l@d+fU'נW^?xߞ'gW/o1aؼ/a¼Iq;9v/~ޡ< |ՀjAm;v1/{<_VKXF_4J<{xJ776rl?0rtFƎHi?{B!ʲGrH~P`0HWD?ѾOrކQE=Ev?xu !{B6%VuYE( Gv96Ӊ 1pkP#LoM#dOj2aQ{z.D>zjQ;ɈgR=v}b6z'm[Lf fS))wIC&b6[0|Y5&يb$){I~Pc-B֓}0jdw{ݶN_ku3lװ,thg'Ac]#^gy(ʈ=oh8N8gj1])yB!lbJt.<|=`p$:~ӕsqoj>/.~C.c+ށh5PU,6 &s&qa.LQgUu+O?X}ѵ0UaQf)6#^UbR:;?ÒA^bo5`l;)ޜ,f{R2ҟP(0ZUՂɒgfUl5v^V^Guol/)LĦWmMͅ6Y=% xؒx=mdo\=˯,ְ5LUafBAc_]D#Ϥ2l(XD"wB!#(œ%bٱ(`+ؿqDZE6G;d[t9&nll5߹R?֥W'bv_ԭ_s%.f;3`='ln!%2-i?6iøXtv\8m1uVnYYeXv.l+/kڮò/-,ou_;7^_=wT'Š0.)gu( %o>_6֐WHV́{=-t?kWy<.,哚Рc^ffyiwb";'L_?zk|qr27_VTOz[Y=B!vd'$YdN_LJkԃdBuvobŒ}ـhf6|o_rE:}9ԓ{ܸ3LWyrM=Bțkh8]>:6ɳ..޹=d0kx y|zuXSgŚC|zp]\qtT'|pmNgiٻF4>=SΟC2?uvދ۵y\[:.<著?.,muξvf_{b3uW#[ͷ9,IJn+M {v D444}:5eO9{ٹs{ѵϥ~;6,WaJ9-E!ByUeHhTS6ۿ^Dٶ]G4vSW~܂ *_ꋷ˾yPSŔ){9lϰ\cL0`4aO#gX*[26#ini%c0IY[mJJM#ZOMm#>@(j59YIu<U&4tR1fd&GG0gԡ#n''/ziuE4V)4Uu:1':qʶe\weMcqc^OTߊ'zg]xc{k>]Lޮ5pPWCS]&3vT֠bQ[ۈ! (&I8HH=[{[*im%b0&#7;-B!6Ws=T51SWc2{Zѣx<+@͚@rjFeVcW:>PzuavsliM՘6Krg(G50*( )6&kR{ݦr޴aATtՆ(2XSұl(@0%sDjьƎw،bs_L97Қd$-;SǘEu|T5.lY,$H-o&Je{=퓓_-c6FZHNKگa@{u;ٹmidW1SجB T\r30jDUU 0{瓣XLFCَj!Bs[}QZnXbuT}Jv z0¾GVBFW 58+|v/b='O'%S}zث:9 f36f6}.m('y$rЛB!B.e}heiB}(\?c5[ׯjvݧY -*+xv OsmoW{pB!BhhhO/۰1sxdđDd]c8GwWZ[9̊-{&c w3C@u,|`V,6,+i:'!B!=Jm 8X@=2Xcp$UL0J@CͽK~}ǜcθZi F!B!8m!B!"$B!B!߉-[d󘴯B!B$ƀzǏOvvEaҾB!B1tCMqq$a1i_!B!H~'gm'>DUU%?2yy%#F`4XzǴ57°Q}Jq=m*Wv E*!tM$hŽ/p=p= d$}n7@ut]tY}vG}>;wd߾}\ w +lQJrJZHҝqX[yΧh !B!ά%ŇǓdӪ`PAb+JGz7p 9r!ڟ0Y{70iꝤ5PtZ14D)-'+-OnzZCvQp9@Q jP0T# Sa3y2ԩpp}`7p餼JKK4iKv;ӧO''q inn79Uz_ ^bXyFH$ ];y(ǟGeC[!Bqf *0u/):QM'`&Z[Γ1#h4[7xyU`+XG) /a PVL u)#wt1?'X_WV^&VTc6K)`0`ZX,f#V Ɍdh4bڰ:%qw }UU墋."55]xzFR!B! :Oc)kDa4Mќ˖qpkVbF+H~.]z #.D 52fN#0gҦ\N,`ہUZ$p}1<7p_p<:`R  vQ1DaBP}hP(L  xq,#Y=Wh߲2 鴴F q 4@ d"33P(D]]ٸn֭[n'6 IDAT u;v***0t=,fMHM18jbTpgK3j2y\׬M^X h !Bq8{;'_QnFiixA%sry,&\6?c!ذ݊b'i*QMa41h[&??G}S*&EQpXLQ?{|XR / df0 DQ<^?V/٪πA1$:u4f455رcjOb˙>}:yyyXVMF `֭466-ܒ/ :J{D;^Ww[4pBh7ªch~9{Vo%JfGbG\ʎa6pC5- 1q! !B!N3F s(Jzu"8[UjCM4eÊ1,4F 8⬮mkWLFs|{dClQB\d6o{`4jU7vx9p$߯芊 J+(++h42n8&Oi;vp8Lff&dff2gx ü { ;s(F1 Ǧ%D`0tN԰Өl)\s̓C]Q j=1@UB!3x0EѺ/ҶXixaZ|Bz پTm7_Cf>j%- huzVooaCI!;, vH0rtfjD, ͌& }~mN'ӧO'77Iii)4j Bq̙Ø1cᦛnbŊTWWsկ~#F P(>KڽkXƂ 8EIE5H=suX *ᨆPUP^ű@7##4vIii)Hܹsѣ:tV򕯐BMM ?9p477SXXȼyD"߿gyǃ>0qEQB+ޛ Dss3TVVt:imm%99y)f6yEǙ__F qc76ı PTB!B^g`qP- 7`$6m TSNegPwNjVjP%5Wm=ox|F믿YfV[l6 HINH"`FGAF!x-OS㑄k_K8fҤI "Ǐ'55SZZk믿ɓ'0bx7cǎ1yd 8x ^wHFD"uxX|9---Al!Gtt_)R\PGC%fmK*Ia )օ7`EcuMM477R__E]]-5|"H ]}N'w零< h2<h|+l6nHeeeWU}^x^. jkk׋9oԄŠc~V~ (Jhr 'QhFS1v~m;~k%{<~_?xyVˋ0.WDn̛7n/}K g{-o'q_w}'m:_p$H$㡺2jjjp:x<^o;6I6@Eζ쯆Ҫ_@3*hR] %iWX_S@wL<˗mŋ&9]v'nV`{<&'pM7 Ξl; >9=}=qK]KK&7w}2rHϟ)B!BSﴯ:rw~Nȑ#OIǥPf9Ɗ|˱믿~߀w"A};m?+< ^II 7o& NN,ٝ;w.}qSvNII4 v[EEE aB!B>U_M_ͻhlnifsOzPWg7i_!B!HJZGd},>X}B!bpl'+B!7heA4qB!Bq!B!Bt'B!B@݆WB!B!uK.\x&B!B!I{^]uD`B!BB!B!Hm!B!"$B!B!Hm!B!"$B!B!Hm!B!"$B!B!Hm!B!"=pÆ %2!B7ns,B!N|fPv}ҤIT!}+--^>BSd}T`ꪫsBqޫg˖-l۶m@͜9bƏϻ뇻| !>2B!]<я~4|A 6\M!&Y M!8dxB!EzBS(BqIPVxbVt B!Fht@?B!8Du?CI%CS똞9t$gcZL3Iovt@Bq)X,h !籡'ځF~<.=\O{՟pkG6~ĢTzNxSѶJ8 y">jr/p_{Bs\Dn`%B!SCOi|ii2[u{_S t筃K~jX2% I/BD'''wږ,BqJq#cnH? v߬ܿr$[NgY -wohopX~N觹O4'ŧNw~3S; :t<:Iq٤n9E/U~sFQPIk5G_>4%^d wC\]0k~ s5O2F][ʴl;|}uwC{>Ôl̩\f\=j/~%S0g^ʹ)qkTQP Bq贴I-Bg2G6 ]7z,_m*o=/BD9ݔ_|;j潯ûw>H3}>w(ت^nFߡS>/h>}JDRk.csKEGw1[QƷY|KZqLSGut'a[kǵ?^“h9nݷ#Kx_WʵoޝEU +(ifeW\ f4 ,M4-%PsfBf悥L1f)aaz9p>络 :@f1wM%X{I`~K߈~s%yOtxo}QM^ȉH79~ky/S a,g+ڱX0no[%5B$Bq\-Zr ku wjD#י& /|c]K1[}eW|D&qj1Zz^ S1cgۢm;=X@;G\22 Q`"݈ZՎɡY+#4ƪiOFe~8'[^nN3tk(d.ܾD\EaAkk2R?O^-/Gȯ^Cki?m=0IO\ޯN?VH-KJJ*!A\s IDAT(1zj2SL֮]//&!؈W9~TK9t$v-P}]_a.cs'#Ɍb֑:Y]tqBq9tPvڕ֭[m6BCC cb!BXFBBBl~]ݹ{-9 ƌa[\e73%oƄa,n@œic^7-iR;q1_ B!6Ja[PR*sj'N1 5*ZwmMLaUcOq9<"{\ؕ%BC:Č3vܹn5B!RwVXlye+iWMB!;wܝB!NB!B!wh !B!Tw !uPe !m!B!‚j&Mg ?>˒u[ V]PmW!BQ^}15ө6uY qG.<3v@Pp3z%PM!BV@;센[ RJgR [u;؞0+Y͹C3:jH\M}PsK]rM./el4R٢jc#> .sIQK4hte aR?B!h۷.|wB T+JQo_kEMWF9šA4(BN]m2t#WHMo6XϿB>BA1* +B!B,0uې )Ŕ $\:#`FG e`kĹ;nX~%uo7\6#}i;> x`DC?'5DeHPV.i[U!BQX V1&r2SS2z.VfL-si ϥ{'QY&уx<ԉxo7nr1}J3Jeozqі5'6=2h+^#.c>i/9g=}p1`4ylؗw;GԺsO\,67եt'[&\)΍Yt 1RH?sWg<&gg`q̿e^&1&Cֿ2H9Ϭd̜l:Gc8\} čro`Lew*l `@VFڟ Ί%Q &jbRl$ ;g[9`mHCk\Iu<g:2ez݇w~D L5˯F!B!lfUaB\Nl%gqh0?ƱlH3lPDa嚗hn (Hpsײkыtu2TGf2n~F}jklu>Ct,]6غt[s+PM ϡ[:*#(lgp2,=>0|aØ~8SKPu`oDESS+sn2iXil}Gdp(c'-MX5Lj)x9 o絅F7q0 oţ=dm6^le- OOIӄ$iXQ[NytY kQ#Kx4ƭAKҼRrM~5nghqcբC֌ X ')JK9H#D&kBevn}}rMk>܃ٌyY"O޸kk駪ND~9g3<{ ^64aN7'17fs½mFMCjTbvHتnckl[&ۙK2s}4rz e籢dr&υn T\#Eb?yvBI!=\/Fmp@immyMnJ!B! =ˎC}'e *?>i9 &xan[x?WtY)#ZFJV>mpT҉ֶMƢa3޶z8lJ^wL#llL4]L'3Gikk1sG~ Sr2GA"Y;-B!D,mUMo)E`eOeή ]}̲ r|-B!BX.V8'@j,႕PXs9mȾGd˭sjX<-tzg-0Zf=5zgbx3{OFt#|W&봻m+ˮ-'q *+"LWC;a >scX^CY`&tz#Trƽ(v~_#.s6 n{W;םcg ݨoYfy簴ng~"̯CXo }:̔9Dž͌頢ͥ'[S{^4wE7jVb9m!?lf $LOe3=L&Zv-_ίzSwLU6 b8 nSftpXԶgipdhT%M,fTs>=Khh3QԑNs2c Lm@QޥKXn!!!l۶PX!Pź>۶gWw.$&p^ˍh5cw(e,N}FTL~Ï޷v+JwN~17&[! FkJy\d SMwFzMWF!Bӌ> *|qKX  C[_f|&,lvzT~wKR+7b4Z8Qsn~nyTCER[7!B!h]X*uG=g_}Q5B2Z!ȖFB!B!I-B!BXB!B!ݻkBZ@h !Mg ?ʒu[ V]PmW!BQ^}15ө6u9686ЅPWuE\cѮ깗[@7!B!jX?xng(Hq `W.\]aw+0R rUNB|SY\o_ؾhEF|@\rc\ؕ֡ u5s $.]&͌>깿׌%ʮ 6oluSwy֤zB! h۷.|wBG}E9\)jc:ʬOiz\"5?`= šA4(BNQV\b8oQbH%*zy<^i4J!qG_lCƃS2B*sqꌒ+&"iɠJaS菴p廷lmq|UGJ藙|U0hutɂ¶ȿķӟc#Rd)FEEAүS|}|[t5~>K7%׉&N6غcwiy.dP@CE97kB!tl耭S3ye TF7]nZx(m傭#MM)5?X5;Mlqhԉska|Y}կ{H+2Pve bmA%BiO]-&iJ?7Ta !N25RY. A$ O0yIGW2]ڎB68:ѸP_v Q:?KV4B!B1t ŵԔ#S5\Asb'vɭtMAl |_x970ub,-Ŭ\{>@[^|g9r女w2rGML<ĊȼpOK7lY%k\n< cZwIZKEF,ŤHJA4wH錷%69O6>0p#CӳN@b~&&xLd:,sDMb>M⧇1erl5Y,c9<39ׇtpr+sݹ>r# &}É98b8'T5G䣁8p?KL^=rSTeoZ=GzWruq̏;ϓq#3X6}xǿHHdD\ùjB!fhV&4Vboq IIskˆ4æElJjVyրBʪ g9w-ZJW'C(p}d&c1kk0V3DehL5Ōy蠺Dye;?u8kqfY LќzE#Kx4ƭAKkU>śC=Qi7tsѽaZʜLZ2Gc.1y؉yFӳ#v1b i?w>ym(5þüM|o2hv_d%{v hk |W|nʗTȴmm'NhnGH5 +ԫa#WSga3f#.g_fz89ڙL1pF,9uܮ1.)pt Hq 7Bd34!chڼo&~K)+{(38wvٵ?ub ,JʛK fdx:MIʴkCجΜo.f>V̢ Kq6lq0 k'oɼv٬,}`\;J6ř/&`Fn%KC!JuM΍O^7Wԫxm7Qb'KYbMGWyS,.[#`zXk6fG' ]Mjiw:\V (2i][FOtA4UV"1Y21TKO\כ)}:YEб>?3A7L6邱eqcZÀVθwŎ֯bc"Wefvq ;}P?WsLԢ|T4ی5}uyX':xZ׈!pWC[u,}ߣXRg!B!(1zj2SL֮]/y+8T;QtMX72oae:EԇV"*16YsuW8Acp4]f&oXh}|z &gn#םZseƌdg鱼k׮n:BBBضm3B!,%!!u}m?ή\HL؁kP,kNY4-d|qýo]Wb~oLƷ:C@y\d SMw=+#B!iF]v>r%sy!ޭ/3~v i;n=Y*%]63Zaʋ3t|5+f:^oB!Ba@VTP)z_k"B!ݻBQ #Bh !B!Bm!B!‚$B!B!,H;%c7A|\N砍\) (†AtwܚB!B註vyfpS<^_ Фll&~I-s㋂ yظ#CC- !( 2?B!h&|IN<5t ]8%]Ifw(}^&=@WE\93 1GUnNT񆆍W(3|` ?T rUNBlV&.JVsnP℺ y !B!v4ɼ?nÿ pG뙽3dW6pZ 'r@\-ʣ^Q۾O1kԟ1\Þ%Cm~]i0N!ı?lے [ @oxwZ ' d@;Wk0ub,-Ŭ\{>2]l7=?9IcfYC@͔lY%k\tהqBݐÂoG=aޒϒ ҽvHSoKlslR Y-B,3}UtgL5{Vr| ;UkP7𢥳#큯C>l '/n(?jĮAFD=n`Gik|vSGrh-@S2I<;>ގGӽ={0f$W..Z^ lJ'/< IVڎͧsa'\0Kv^H څAeJG}S(QY~,ecעaQKjLHJΰunh]y#cǒ9/twD(Rn$q_9DC2VFDYb߸6B!B|OWwOS1ٲB/擘U2Ƕ0+Bv_<ؕ9%wkFv6vNy5Ў=_Ʀspgg'xYnUIȶȇh{0vBS\RXq%__IН=.fDZ7orC·~qm XG/gE5y2?#S૓ÊY4a);ΦW͵c߱`8j륻ʛWeKx*WM!"vN8\K[oqX[ez ,dʹ8+NaGW{8 k'R+k>5;Orfɽq5UGr*hֺi(D9B!B{dK\=D|;/ebv[lxf0/>%Vx' *h:#h@aex*B!9iiiDDDt5x7qR6R3bd2&]____}M9B}űrI_c2v7YGjٺق 7aU/n\NS#طyMjt+l IT7kM}]_a.cߩi;:U*JpdhuFq/;w.3f 3ؔ*RRRXn!!!l۶PXqEDD[MWΉgǎtUMBBBl~]ݹ{-9 ƌa[\kD54Qk:Mk q;I[kI ls&qP e~ 6wuF-8ޘB!=oǎxyyI]EXU¢,6)xbn>f+M61{ڎ[qF>v bWRPղ6%]/gB~111OXX^^^f%::҈%-- 777ªRZ'䧟~TpC-B!=k޽}ӧ@賶Imn  NB!aO?t^ !,G7 '22M6UvLll,P2<,,pAn %;Ȳ{yy_DGGWjP*˫G&&&?!!!EdddY % n]E7B!G} _ !,K;RVкϵxLL ^^^UobbbYlXvJn;v0YiG묝N'툿1fMl ؽرcG"Dm$Bqm!j@;>>N`Qw$אxӽ#QQQb4/#ե}6 !66l]`V?cﳨ(ٱcSsx>}0@[!@Ϟ=z-=n?+OQQQeӦTcS6NMKK+{;R%ze7YW[z^6%^6]>}&#Bm5hW֦mɮmѪVH5A;LC7_ji۫6Cjcު { q<ӤZ{J-M:66>}m<911, p j-OwZ7֥?5[w1hu5E֭[_{XXXTX6m#ם/{] -c7A~FEtjℍg,3f>N9 .մ%SKꚨGmSSҌ\ũ03%3A?e~0Kjƿd&j\ٳ\mS+66R_{NDDD#,]^eԺ^w2nnnvp>[\dkwn'Ľ.JuZ4H\Mub+ڀ/W;\o}6YK|;:6Ra/,@nd&?C͜q/y>en2v*]Iq;]/sy5V~|7/>KnYFY.̑s;3ti΅#dҹc8'r1:XQdkD'v`ۙc.o:sW7t ]5|G.߇sjًod(o?,Qe&9V@b9BNѴnDDf*hy'ʫKMGlP)7mTY/=.j3GYqi'8+DƬ,==L$W̹>Ϧ|4+8UQ8{s& a֥`֝N# JɐqӬpb@& bkd^Es '- v*on&b_b]'/u.榭D\u.VS5G4 Qσ6>KWsa]ngtx- yP\w˯@!Zڙ>J9W}Ͽ׷9gGno8q#X3D7PLhj}뽌 *.Oit]3\`Uv:oP uC §{Kzf8vך{z>7Sذf#qgJx0U.UOfPOTue#n3n8$$Y6~O66\s[}[ß[hxkѯBJS@2s͙lܻa\y#cǒ9yE("1߅ K_dQtN]=Bm٨i(]@ml~ӥtYgܴUם`F=z|Tgӿ%V%_\9o"mĦKyC\h_9\".adm^AzJS52 ,]T\*H?@}E*:L ң+ H9}3YQ&96,1NpqoԢgfBB>RR"""HKK#11ld* {fܝ@ڙLɳ\Jgm39zkh~aRMLU(]0h,-s2Q:eQx2m[4>δmҍˍ\4eVnMiR/ P7BjXʨOZ2g.Ú<;u?]b&G/m Uפc]3台C3/Ptu3=4k}S@&?μDY\MYD1~$Y_y~[3~7uaF˾sP^2g`̀/5Nh Q7]rWv*yHHF5wqfBԤh;x6^_jOe~GLʛWeKx̘vBIa%6NTmxO6N߯{m?&$WVQ+fф8N^a6׎}ǂq8iiͩ%g=M;90Q_yX%}?x_,̞:(k`!kmA4sl/B(؋ Xо*׷u;G'UJr.%歷8=Um•rƦʪ3?LYBq >JŨ. ;OeΓ\Ybro6sM7+Qʶ=XC!Jq N=HMM5nqss3koQgݥTt0a}0Ҭ˜ͼ9[9v9k@Q`JENt 3׶ϳ|?fǞӶ3ա!~I:ֹ:fnZSҐ ̓iPҥC볼 Ve#OMF=4o6>d;CU M=*jk zv~P'GW} ׷cg ݨoYfUvZt>_&YVןew  wOZ?0::2#1C>9YX4|jT:#h@aex 1F[!(1zj2SL֮]/ UԇV"*16[inf1H-[WYpp`/R/^W1s{mF<- {NsSvukw5\NИl:MK*;w.3f %%~ ݻT:33u¶m 5X!*Xg΅{]|qýkμU|d݂W~>Jtu?Kq-};3&>k(~J< "W%0$˒\KנI3N臺I8]oq($tU9Qn+>YEy~McV+Y͹C3:j#k/BTAZZG ::HC>} #22Hbcc !h[BQWxX+j24Z}qP]o TzŅՇH5xj9!hժ/^1i7 IDATd"~\Kn[ ArY0]Fӛh*#FMdd$!!!Fqss#22 G՚pDĦ)hPǃ|;Yř8G[`kHn8z T8Z>WzF4C_5hP 2vҟ hԧdLo\s"`gξ%dv3tl_XʁLS'~MP ?O9c^~}Rm;MlPy/mW S;vfȅ#dvkw19*sי[+߽Ndkc:BVnZw.@Wݑ a,Meù}?/e~sx?x*ǃҫe/=IdGKel\KR(PX70.M/BTCDDḹu6iB{jI;|4zbIN:,sDMb~y̜l:Gc8Yzgs~z.Yࢿrorpf] f4ROɠ y7*?2h+^#.c>ioYPY~u4s:yp17meeF?ׅ} čgÚk+/T4Zu:-S8*c[ ZZjնVmGkQo5 ԩ:JQjx!"!䜄\i᜽ZZ{2;~wӕ?P.,\G jT|Z&T! a}FJt_q=S ȸ`"3YZ_Dn6~+8W&DO;AxLǪچ/|˨ͽ7BH?| .|9s' +h4DbQ$(J{Dq@"~"aL<mE1Чw|"ûyգ>=qTVSOEWchOxufaV"!s.2aߒX'g:z«pL" W>npݑك.?" 0Gmvo[Kgc]F`NSpGf-@ܭ+!$. E;.@Tڎop ]T3:W!,)?*ЧU^ T%\/G S>ԍ5j Ưw,~ V ~ א6d^,]m_ zol(f`7[㲋% j5Rf hY8G]G~u{*TlJ|10aS,Ahk؅_$࿫I*(e!.9MX5!B_T/>~6 oDAo7M8|&J nוRp[]p^*09ܰ4q?}JpoHٜ?IgG} CF>(?}>srrDg(ă3ې\(KNR؊KP|~O+΢^]] G{.ah6A< j5 j.| ZhN!:*h* N(>6=J% } v+j$5t#ѿ/zw/T4USp ~jvo[KgC]Jbޛ6uNԡASM?=V`[&| ב8$,ֳ sthc#>ήQC7myS݅u}=5~]C1):/v#Qypa{c xiwL}cvk:AAJFLf2-mhe8GJ{ d]/|I2NQ]/go{({gB_EySxKZrW3D٨"ѿWLP3VCuJX6mu,}6O|p5 \Sj<}+oP̙Sz]A1 _7Ǣww2 H-nj@[P$Ǡ)ݠt٘>c%<@yUM]5S]Rv?ˮ+6a\311~}a~\Gd/ _GD횋>AfTh%  [" >m JE6A2/Nxy=~@WX2ѦM_|TlJN!~k*Q ߼N;kN|+ 1?#gpNƑЩ5WƶHG:ժ5c|dd$DO-w0d9OMdҥ?>ܹcQ2lٲ2 {E\\ZݿQPՐGZZ")ؐo irߜ%`D^2'8Åf}µ;:xi <:$v =y8i*ǯzov5f!-f=_Aab%l(J^ _Ѫh-HDi[qj0/Z}?yDe!:xB/' W vzo"QP}]\' ( j$&&"99wvZBRAKt%$VFsAm 0yɖ1AQՈX,FZZ""" ϙVTGJJ R)&ee᳐3DO )y7q9eX6$ [M~ȸ_+㏴T+a.|AOZP*HKKIϳNII\..@!J% p)FDm[P]Axo;  a5L!NngFɉ:`7WVSAV]*iĸ$ 3&/H~yǯW^/WQn,.{T[@vF3 0.q!z\݅ko |oMcM\|SCb1{a͔hY3,~2k601ഋ=|F g-狾<矑 xذrrZMI%:5'c+bK:aY MMyb݉y(y~ VSk5Cd}nbK916o^I<}2ƚ|nf W3*-!svy(Nţ Dmk^=qTVSOEWchOxufaV"!s.2aߒX'g:z«pL" W>npݑك.?" 0Gmvo[Kgc]F`NSpGf-@ܭ+!$. E;.@Tڎop ]T3:W!,)?*Ч%B\Qx£SWc)qƚg WaZL:z_7H.X14.\Cېyv~1뽱p̛{Bl.\' Z--L/jop@R0."tvU $Tb``æXnְ H_ W%㳓[U M6to;~Q\ţB\sI!F vñk(a[3'C5H5mk^|l mވnpi#@cqMV >ݮ+q 5GڽU7araix~xBb_QlNDۃa3ڊ؋!f# s^ze6cZQ7Q~>srrDg(ă3ې\(KNRV@%(>?gQxz.=| Ub\N^ꫵ'8G:d?xd;B_p!t(8HB G(={t/حGйGiRhm^M!/Ym-Ջ u)9yom8ySjwv`Om&@+-GYn x aY9:4[.:9?ځyà Bxnie+G{.ADQ9R uRRm*''6DXv ag,zZV%;Ÿ`_{ B5j" I݉A[1!_Ŏ. S ys"mi,^#E:٦o[.BAXc  u`yu{*n7tу BطFt .hD Yyu)u0Lz+=&^+/G7QfŵAK7SmK4;05\6unAE&,c  11~}a~\Gd/ _GD횋>AfTh% h5<)e|ї+J$k4(; Ž^z /,egM6!44/b3 BUR:ye!:bvװ!%W|5Ac~*G#;&Sk( mÑ:dcƯVA#[%{7Ld$!zj);&՞|h"K.q UVVb˖-dػw/L-&jZ<:S;99ih4HMMD"\,0-) zrss[lȷ{?4oΒv0Pz/CkB5;x9:6̚^@Jlv_ᤩ 뽩A ZBL&\.w:-T TZQ d@*d2GG- h&0 axZZi@ Q_NN 6 ,, ֭cg͚`yzaa!; 6cǎr#%%̙?GLgAffY߼;۷/\bg ~4-E Қf  hGƴip=^>ѣ֚ĵZ-+WBj|vξ0zQv[բo߾صkc2l\p ?ҍ Zh1ovv Qhd5Alm51zh+//?I&h]ez^x>}vHKK3o)HRڸ`woZ-}Y\pby:-BffU8 IDAT%;#l/A9<8qk~    ܹ:u lرcV/--Ebb"F`) RRRhd F*S^^8\~݆i8^S_KA6AAD a̙~(//2qCZ-֬Yd9>/lXgO/]j7n\z@L`P!]5AAa1k׮m]z.\ݻwD30c MӪ;wn'gXSOml Ih;vTަMl*ϑ\|fˑn3yƖ߹s?i@?⎰|l  Ep5@JJJzJoݺeSɝ;wLݔoR)R)X_^@o1#̎hI4_]"LD{*j !9Z &}v( A-8mb72 * ͥ0Sh4P*f}sQH~(l ‘ 4[l-A8B鯌h4dPżrWUUZEhX M|||3k8̭5VT*RX,RDRR ZTMAvC?>޽[\G@T*HRF͋X,FppɵlIJJBh& T*efDRBlV.=@  D":Vv QOǎMj'=bJnH좧#0wSѯ?׍yꩧlرz6ߨj(JVy>$;A6AAZmu-H(M8< ;^FY"c `Ma 2eJSUry-GBBt#{s Ԍ6A8m"+((r&x֬bDEED30i$ ,h(& ;V mp&b1{9Ț:uju{ܸqUVD0}t5Y6nhp|]*jM=MҫSgO0묶[3Pʑtz݆-}تH>΁}b 6PFhmܹASXX/^l#G"((I20fiDO x7q9eڸ=热/}9D\=\t#eHDD~w 6̢vÆ Cvvv*7&** ǏGΝy@dd$Ο?oGORRgn8q"AAunWṾ*p2- U.Vh6BpiϠ]K(>E\E[qN1 rA[wF\M[ Oچ(4|`Pv1/Apx^ ^~*ʛAԗgW FPm=6{@8h=z)))f@XX6mڄG [ϥKzomۆC6!** wqбcG>}pQd-f̔am/ggQڬAv 7 Ú3fGLlxkëC~rZ>_00@`de!+?aSrL <ň-rJasSq{:VD*O潊]}Vvڬ WQ(bF220l˦Go$^p`Mm9.nx #V`<>CbXS'~4kyB 藄s7N[a fǓg^{pltqУ-$cJvMr1hxeӲ=7qC1}bjus øąquk߾17m6POcqjRރ=F`O!7ppٷ,0q2Dk')) )))ظq#-[ 6 111Xl>Slڴɦ;O;3Z )))X~=._SNaB߾}1qD,[ eee8<ƌ$:Zfɓwz 6 'Nė_~x|g Q4S]3YgD>lEl}yc9>+7Pw;^7Ӡ0/ԂX,;;/"ϯbsmԔ᭸~kMs_ƢؒEAf[qySsg&;HU`f]w ~|Z_$2d"*ĝ1.1恱2y3zi+ ]CSk[xe_}6 6%p}+ @]Xz!cP =zj6<6ݼQi.tlZ+iqѧڠ <{`_cUF ea FrkTH?|KhOj:̙}ѣطo̙ɓ'IMMERRREDD`K/͛7cΜ9ѿ*tu^|z H$rs GHMyҋHQ3\oxW-@x Wl-S5=%'L__7ᝨ/Z.[WjԹ10,l7< O¤up5n0~}>xw`p GPp _oC5\ }6DyC{|OZFnhO:OB}l$YJJ  QBV͖d2쫨sh4O]G~u{7,Epa*a6!SGذ9[ eC!d|9=à_eWЧFR{}VU%򯡄ܝo}k=b6q>/vOFJ\)xwQv/nan^W2m8F oDAo7M8|&J-/xBQ%Ͼ`}vw ,Q/Q1-nQ~@{#R&?@a%نB!]r ?x/g"/A9<8{N e֎RbO7'\TB&q(OXh]4O:d?xd;B_pV ̖?&G1ܳDnE{@ {/yޝ+25ؿ [FkJF/ QS])}T|y.o86 []nq8 7_GvlkXXn7k`(F E^.vd1J]G5CC1q;1DCmV9&LM[ÓTBU H @h4OJ{ d]/|I2Ns6(o.Ǘ7Ľr=W!GBTDO-i)^wQ _eF>^}0}B VX եB<*E?bٴiֱmG/[gd(E8ypQSt '+1tf|e!v~k_ŌiyK0bL ^oEWxe6[T K+{G֌o %xxW$Dߠ3Z;44_kXo՗g?pk\^Exg38NS(oAwS&&C jP~/ہ|Q?p)rݨAhD/ojɸ1l\L&kpl Z?ʹ>@^2lEO>_d~oPtj"m I݉A[1!_Ŏ. S y㉾s"mi,^#EM߶\z1(݅nx/0! ìvb\3f𺇟fEv|6b_9pÔ|a~\Gd/ _GD횋>}6g%DCm5çl\Ok-Uɸ1wٸ6E#Z./NxQ<ɬyIzb f޽LIF;ymQ0 b2 Wg ]e gc㱌d >"gN>lvdgg3 0V7''YbEh$%%񾷠[ III9-֨X۷3۷og܎y-6Iznaf ̋`mBYE sbs[hYĵ;:xi#ϒBFkY|_B y'SK_+섿0ucvLf!IB6Am]2nLk,![6|\,4d  xNJKl%=m+NMsԭ)&Bȋ/( zYQȼbl}E"EV[lK$:0%eza}ڏ֥BTZi\~H$\.a[̌6ADsanc>-՚6Z۸1iq[2Ek܅D%Rh]PMAvv'ZKPdqcZK ezL@jhZ$ PFhXS6>n]ƹh [۸12`P!HMSC6AAhk*7[[P_>³ēAa(Mi]2nLK.!l\ ™q@( =ywu%쁣gz9r,cv#U>'}rGBo(M6R6%;dܘZBq=F8ͅ-:gWĢ'9˹=T1կ l_$2#-JXg=_D(M]2nLK+!ojٸqhA@TvuG+CX SC<s]|3bﲍVYwɉڴ1m8B ˠb:__>U"k_[ W FPm5Yik{ PFhMآl\OK)wqcZR EΌӄ#LyώA"x}vE*k`?yː89 `6[ǔ^;:G'5AvQ{H~0%ԑ{_i"! uݻ3$ `>~2CQGybpW_ݬ P/vԥ%bG[I;@9$E9un/Nέ9 1_ΕP&~凘P_4MĩK?{F=هfJ4,™b~:pR.\ †PFhMآl\OK)wqcZZ $ ~Z$v |fšJh%Cex&RL¼S bDTg<狍n)[qõ!羌E7b%G/$ >DcMv>t73ęɐ9H<'QA"T/~6G0m  8{Ȟ/y*7va8ZP @24J^w54W,\/~뙟bp޷(DƕLD͇>Xtb{֏Qi.tJ-ΕǸ m=0/ӱ*}#a 2js l}z釯T?e/G{.aC(MdYl*8`7is6ڣdѣG6ŧ>UٸL__oxK)'LcҋHQ=3\w׊x+1 o {}6z][eЋMfEnaꪙPឺ e ĬFH~+/b/w*`8ťiK/"M $왁nn yXqOl cq^hY[..~# =xa,܊ Cg{;5ǪCw17W!lS0~TOc3@K5 ]•>}Ʃ hg_|U~|=\M 4At$M5 K/O!>p1.[* Ǽ!xz|O(#y%vq:A4Zmu-Hh'FR!88Z&IV 777̜9&K$HRjj3. HKƷonuzj4z#99T_BV Jev. 2|zUۤ/֧ZM?T-q@R0{7|Epa*a6 UGذ)[ u7"qw"^X&-A~,AgCWqUe!.9ð(I5\~2D_˷z./:K+QQZ-odtĕ);~XF 09ܰ4}Jp1mGD,#LXzwDOeLK3[S}Vň}7<=x* ϣī+!|L[0%<8 I>G0~1뽱KP|~O+bs\x]ˮAk% lGS33a{\.7)J$''C.7)˫RJRj5 Tj D$LBTBP˫I}BlT*$''s DRu!##rzrFnݺ)))M ~>M)A(.\ IDATwEowخB_p BM@cgIB݊@ {/yޝ+`{VB?5Z;˷z.%g1up 'oPQ͠ ME og rđo@V:g^$ezvta Im?qv@>JHKK--Ul߾ӧba>MNNj]>UV ls^!ĺw@<*$zjKrWDZ~*ؐI!`ўHkg(?f~Qo#Dģ>>+fR!U"l4dXl壗k %xxW$Dߠ30bL ^oEWxe6[T HASA1ח;1}Jy򪚺kYx'o6<{.LYꕱ_w}9}-j: Ot;)X 5(@'&0ކGpўK>AZM8+* iiiOꤤ@&YTrřTTZْB?fQ&5 iiidAӔ3zZ}(CZZsT_`O )&saG?`Y#Kɺ́KvqNG_S "-}0$u'mń~;,ĮO%տ'݋᧱`TO{GD|a&uiҋAq.tE/>v{RW]G vCQ=ѝ +}oyaTLg3.hD Yyu)u0Lz+=&^+/G7QfŵAK7Sm|V| iv`jmugH wfgKռ"o15^ q5 +_¢Xk. oLk[aKe\vypO62ڄ3/4X2D"1|mΏVT둭EߖO iSʣ>{lWjjj>56Ӏ>ȶ֧bEFB^!9 xsl&0+ZhxO"otj-n=y89?&)Bt[B&e"Ye`=_D(M8Lvggzmu5m}uJJٌ}d6lkb,}ʕej\>%{A6mũ[Ũ,p#~"XK$:98Ư42xH?!0؄HdT)lLnW{ mPT6 l\)JrYzl˳d2#˛էIII>ާlJx9rA hp牟 ˠ6$ X'4MeJe$E٢?[OsBќO ^PMAv2ڄ3hX7>mͱ]֠M);BjVYTmd ͧJNK 0˧RԤCS}ڔs (& ;@m™00)Jh4F%wYr* ~jO* *uT*5jZRo}J >Tլb)c*#LTT*U> Ї`LSMe)[kO}mO PMAv2ڄ3L0/}VBƿ8VMhpͬq[R TʚݴW^8p@J2^Vl|R Jm5ݘ>؞ZFiScjrV&/0)Pm֧l|*!X,n%A6AAh[iL&g$?>8&H$3nf/ Ll۷-Egչ l4ӴF27՟>#L1>g>6ƓJVΖY7SLz?q׷TEXtFL\Z"86lC,G}" GvuUuñ}8#p:v D+B?ְeʂIMMe]\y)L`T*!Hx1zol>U(2\.Mini)MT,C.#99 >놘SZM4'-?]M<×)nr1K|ѶZ,) bʗ[G N 7~_ jk~ aQظ}SO(M8jh5LWIZ[$ߒr}RMRAZɚ%;Ymҗnk}߸mͧ|Ǎ~ Z/6SqHNNJSE"#/_r)_b<,x\6ӮiG! Ϭꎡgk݃8_taMݚ6L9 )Ǯ_CT,Y pa~uXvJ00կ l_$2"jR*%lӦ{lvq+ eD"iTzl!vسFPfǖ 5F.?o"f J䳫m2g92Y^K*ZrH$|țFs>vw{h -?m p:u '7\x3hL# }s?{e?p3r``@~CPZmRZ,keijiZYٖy͟]tsD]R].rqf.zڍg9s389y9r%J<3sp/&qn],eW`_1[?޳{yԯ-=̇?%uD_4. Ae L_x\mQ9zUx9{hZLW;oTjcj[<74/ ,YRi$Ƥ#Jv[CC3_I+Jh]=i#q(`i%Is/-:3l>R}V QР1MӢ k̲E >?7| F 5Nth=.&ma[if4386ݓs93Q%*UAI)8Jl^=f<-.e&`7}qcCF@}7Pz>`27}΃u,d6D+g=.ش,_KR^~!HVEMS|(G$M.vd"c{[4G&27a_ -Y!7nGQ|>eɧ;W,]Tٹs0ʄ.[ wKRB[P~!W7#ԢC?2!dNIM탢qn~)L4 3-տOy0O&%w6.j렾ޒYYS4jR+oq!*իߘ%>>^Yti[,j%&&Bu7:bbb ?UǸqr7;bLcjo1?c+Enj,t7SԌ<'sQ_k8pRodnJoZ/_&Cs={p*ێvI&^iZx&=߆R9q[whpn΁0Z36NMm-ko\sX( +Nu4i8}W.YAq4-oL6nrŕϐN.%B Fw44vc nj?JǴRRR?~ٛ QUjF@_kpriꐛ|2ه'*i ?״Ϲy-^6]:(%?{,sn;kkY{uMc1cs:a3 (\FO[YR'^vpFu};{3x> }ԍ9Eqir26Yg6'd۴ݽʼԎb8CGij_zK_2M zknkfK& pe[y QAG[d/o߾1dɒK{YxqIgC$$Pz'C5Ns*}MҫZJ-K QAG[!Ti7i#'Uw&CLkx"cBef[Uiф.Eq=D1]=wy꯳//Dm!D[QJa*Y]B!D9ɥB!D%h !$B!D%=B!D%BQ dE[!$B!*h !WOӢ kc㣃^kO]۷qUk?_D_Wl܆ɮX6m!G$ucKѹ59ω횚W S9띙l=M7؛\xꚿnZ4ax6wb&j+Z6m!m"L[,^$aQ'T%ņ1wP)Qk?/!.pm\(ϗ)dsL|#tZt uh]"__w-m5r!_-/ygu ֯6+Ks:xyșo%7ZhRZ$+B!Du'ڎP<ܡ>.FJMz5if1ﳳt#WIN'43?\~_۴b lD2i*:ǹu]5;NnbƐn({Q2plGk}иP?0ɺeDžpYB!j(Il֏ u~%*B>Z{uYpVe:%Is/-:3l>R}V QР1MӢ k̲E >?7| F 5Nth=BzJ4aC:EVbKTFeLwNm<>}.n\_l[g BƾJ뻹T:;Cq7Na9Bvwʱ$~6t b}됾hРPh3b IDATjTʫ/ɊBQ{ՐDHy5.Fo%8̻.a8Ͷ.5a,6oNr#n-!2/+쾍\p ^f3s. cC| _18iC^%æ8h/Dž2*D2j/%Id*#5em5r# 񶵬q0eca?lE,3/OV  {| v殘 |nL(y2=hboFs>=Qo=i='C<Eh2YBǬ7s`Zx9uVrIZJ]fӛYy)76awup׊&|ލ`#w<d3MҢ fOIDzk<'?3yjG^L`"]ko%+jgdVBZx`SɎ8ud[5tkkY{eݛo~B^~94KHRm;Aܶ8aFb෭i x[1Mn5 H=w3W3qkٛqKVdnTcPƮ1S8_IaҺgie@ ޜ?|w$_oizvͿ5c|N$cӧ:~kbJ}㨾:2k?mfkjR+oq!*HVBګf$yNxӣq'-=JSI"T9z+)k |Ma©Nn~:+PӤ~^*'!_{ 9pFK{FɔIbkY{eB),gLH<]qNr iq~+gϰq /|ԏvr)--Z0᷷aDZ^tYt|ψ XZl1]~InStkI5m7x8u ߱x͸D<H{;.i}〾}灵H^tZj @-B^5#vNk ft5p8{na|8qDZe=;{v[97aжن]k҃UgrQ0yvm{gm-ko\i,czc\'l&+u+KS7ıkΨ>ccuG\´uoƟo4r_3gq4(.ʬfMcÙ }6mgzw/o>'] B{WBUNQjץ^ }җFL`;/nEZ\ ~lɄ7.l,\x'rl7|,盝_;j:y(}=U]'fYm}-3P뗋Jyp YB!jhN׵>m}m,n z/xzgOd:݃Ive^X ld>b[l;Ow̝u9ǣ!]בE['[qZ\ In1V .,Y:^A}7Ɓ&ەfAw%k3.4M/yHX~B 4.oUu^=]C~'=烞8A\-6se,0sۘQG5޽ǵBlϔ7X;3 u4$^g<_97Kލ7l_NoL̻#ޱ?^w+lI@+b33:%8ݾM@_n*dE[!4GQ?F <;j/@_!Vacu$KBZ>yEu԰yXo euoORlⱘ6&%<Kzb@W)?=*}r%2 |}x }d_jm_Ȋ';w$<Dp#pv,I#I6sܑD$oeVOGW [Zy[dE[!Ti7i#'Uw&,,12}ˆL hZ򢸞PΘW;ι-0U޺BQ%dE[!>F!g<]4UߴBQEdE[!>V @ㄤB!e-B^U{˕/l\!=ڵkkW wNJJJ%E&BVunZ4amv?^LZB!\q={l-\mVFXB!Uh{We !թ>>fH-Bc?VSɅbatnⅫo IӢ AѠkCLՕt &GB H@k;yX9띙lM*cIUs7`ork5iфٸC=Qڵk$B!-5?!2)oi< ..SKZ>h;QeTbםoCԿbe6m#H;Ţ.Lܵ/&qn],eW}P:Czк=Gs|Y+mk\FdIVH-B>UYNb˴~th~+iWm8X'z2.)'X|O{ihԙabg $;-V,[d!@1 }qǏI,Ov@F:M 32neCʢYOѽעVܔqE:Ȥ(B}./R2uD)ô8 n>\wdOm6'׍ĥT-3S՜?8BZi͎KNƶyz|2{ 1i劳/fJ27F7eUba|ʼϭޫbۇ80Z\<[2UZ^ͥAߡX>d'~p!cvлUovaX?G\xXj&ui4hP(KkIBڧm#qo ոPVJӏX0H4۞Ȓ֔>Ya,6oNr#n-!7'frvF.]v829y!>4!ǒaSAEmufb/-P(^Jތ?75;Prs[Ukvrҵ 乗h~{.xb8CGijezK_2Mk*QxaR8fddRV!կjm ? xhGS[DzY5mg}W>.ԸxL>v}}3h'z-X=uYΆx< n^uds^~j|ۂUJemSj55ۋuy/wp`Zz&?NnY7+cGM=q5#B۸D]'HjmV38cB!ݭnN׵>m}mlln z/xzgOd:ز N(+ǒo`##}iۚex;fdM#y > >/b7[˪ťhqg+)S=烞8,[:Oq[x;.up.n4-XqhzɃG5'G?\م%K+=念y8pDU~:O&_%ؖgv|LTxgJՙ:u} oUQR% p}ļ;~5yW īֶ4NB!~#(ώT#dSЗ_~I`` +0F:%q JӢ :yG݅c]սuj1_؋bf͗%_f^,鱋q+{\COxZk[Jda2UL .dvIܹslذÇsN;X![lj}q.14@^}+OGݝjHrzuҒ^WSƨ9穀O7grO97If{u_^Q_Yj;{ޙ)ˆ^~ù Cߛo75+ݴh|]l܉h W~!TH-B>wBdϡ8W'7Io8 %*UAI!JJj>ſ,K CxW:Dy(Y$k1cB÷-F.KkWpf=׹c/a̵뀾B #gkph}KR+okB$B!Ds'ڕ  xC}\4(7%ukLO?/mF_1v6E]"4t/LD?έ% ur3uG{v/琗d;b\+ƅa4(LmyXBCPP .܆  BQUjLd'eZ?:4{?b h,hՓf=YVW{'ͽx4̰EHCRiMX`-Oل>GȤgf0^`ǬtjCٔ+8h0si-f:.iфʢYOѽz~ouM~ܙ&^8o;Aqw¼# kv\tx@.%o)=y\uunVO?2nS kJԙ(B}LWVĖfʘm`ZzkqlAWiy}7ì:;Cq7˖17x{t?1;ݪ7;br?#.¸X~:E44(~)/j Qݻw'(( 6Dݫ;|!BT1ʳp#Ո!5gT-~N>̀ D!ٹs'm۶W^f˿B!DR\bGR{7sB! b!rٚdS0ի܍ !b!f1{B!B{$B!B!I-B!K3 IDATB8$B!B!I-B!B8P:ݏ ё!B!5BF*|WqWFB!BK r%JA_+[L/^A -֡D %L$!iDZ4a]1H ρ`̿D#*=߿oWU,%{_ aYQnOhTkOB!]FLL v {g mA"F(ѾJMw};*U_zMcXR=ڭQrIJs?/3-CLQL^Տ0L:yi;44'+rS v=W}]IONI`xnAoV!B!j${v[p!_s3pɛ~z3x& 7?B&'>(L&U0ѺzҬG8+2PWfDAS7;Cq7ҳ}nyТÓ|pěAsJua0xueќA菼ϓZexw\Q,TPOsE֦輪M&e6N =z5?imL[K@v@F:M BuOّ&}):jSl'l9 B!BbIFe*xYI $dz¼ BrW NÐc(~IqV }0fSYC<EhPRW]ۣLlJ6~c<6#VrD}&=|fp>{No0E9}?Ǜ_D|8k~Mxϑm1̵jeOQ|(k$V2as`TWo}.jlY_4XsH"k5̍PYѐ}yWK!B@AA]?D(3P&E+CI>+&Pcw<bZȳ3o-O5hK6Tג epv䷟1>ѩ|uF~f !ӟ~c&O VֽSO7~'~-'3mŖy5[aSi;ao̢OKŔ>Fwěr<9yE+JOa~:ӖTӤD;hYz;3'%|#/7xۺ~7?ȗf^liGG^`{I2ZB<4 1_.G:nz׻A*+|TVKP=WP[[-/W-ɹY8hԐAKxzFç?m7C'B!DKZ]h7M 7s[~iN.n8! ڶxx' fV)pb7|yoѸѼD|=q\7z ٹ|e3ٜ|<<1&o9s #CLr_r1_=fB IX лA)_:Y oKt%pӮIV-IQ(Lcu'0^zK9ʊn AkJO!BZl"qõG O5>mAܰeRwil`Ud=:;9K'7q"-vç\=^LmJX3mbJT]0#馯RHٿ]&0aւoI2Mq仕L{M6 dEgEe%յZ6˚WV {x]9/O#x0yD!KSgrw3i1.O?KVl8sKJonB!BLh/Umhtl=|Ol.S0jx}>鍓ɝsdݘpZ m ,zWsl_:+-^Z݋-;xP~WgEygrό.zlh0m ݺk^5m|?Oz/ s10s'kza#mhHu$yk"z5ӷ#W^cݑA !BQ'>>>f8<1Fyvn1&쀞e}E\\0m6 {X oA~oe6Œ?;p oy;RkB!Bx .d\~ݮrlذi4YI!i2w@Ss = LK*sܑēվB!BQug!B!H-CL(B!5$B!B!UG !B!5KRRELVB!BsذaCr-B!B{NF={6׮]aÆvoݶ\:^= #: EV /sF!\$СCj[&,_NFˏ'+9S[_s! UsB!%:T$ڵkWm$`MX] +ο~$0''`쿸^rڱTl=}=@깮9ekKx&Irv9ϽĎƿm]<\3)[yT{u%B!Dm"SEAI"u(QEbღS ?0/@>6cr>&u[)y5;k/cU^5uOQ)ߓQ=ǹK"O?7|LhZlX'z2.%-֡D"ǎU_;_qUXp/aSd2FgRz[ +璴hZveѬ\k0[#s4!ǒQ8̻.a8Ͷ.5$yd%U_!˟^MO0s*0'6WٱP?dijFNr$!z+cK9Vk3>1@^ ea[I4}+%-ߎI=Co>MjZ"uc>Lxױr3j+WJֺ_Z?ojʘ_# cQ|s*qk m%ׯ6ʛ();΋#Ly+-ߌ|zަ{zNʹ_|Տũ5g󰥟B![uheϱS|CzOޙ(%R֡JTbk;>V~M7i8eJnʒ9%/~<8Z9hZ&甲Nk(%L~|ʈU^,>]RSb3ʶB~i7#Tn{S̍x)wʳG(ۍVq%~S;QJh eټc6Ff6{aeB`孄;m{w3sf2uJc*t_3&$F8P`]HKUR9qڒ%s9%e8Vi2}mh}=$zTO[RosO_ '-=K4:<}=vnԏgݻн<"ʖs__cT9eIuSyNxӣ;\<9a:h͜Ҟ$=IT\8[=ג-Nm W8~iS,j:?gDpS|xyߔ^!ec[?B!j{{ h @6zzYEO&=Xu&d0yOIu}Fk?o^%Qϲ?>g/\8\7! ڶx٘h.t@| v>M)9zXp.4l/ϜϿvZ17s_kk}Vʭ17uf] =6\:n+|T9y~zcuf⨙ WKO~Mul/l}o !BVm%c7O/:g^㰹<'Yc]\[-ces]-zZ3! cF|o_ϕ}cy|r3{]=.;UeIOF= y5>7L+8-jρj9U_==C0\v N^;\Am_pw'+ZSq6wڿxq1O}zŪ~g眳kKYGs}; \>ƿ:3(:Ɗ|wG$:~^[B!MH}hkO]M:S|L,/III!n*\!B!k5.J&e}l=zCiuӟ9B!B!մB!B!.qB!B@ȌB!BQdF[!B!C2-B!B!B!B!P.bK= 'J.WQ|y7EPhrϚD!B&1mZϴL3ںʵ;{O,k= LC6؄B!g4m "L&G6!>PFcXG*;y^[uKӤ\kY}p5.BY58_,ƿ=7x7ȈLF}\!"B!D#gGh{_hDQT_<ᄊO¨.`9 œȷs e;?rbB<2;\WXqMyMwpWGB!5g uУqO@[^ 3vr&9ɕxh{2r9C 2ʺ8 +5#ѺDN`Wbye(o1ckxmXkCOG2;;6g xqߊw}.۲g+\BMb0eF%O&LUڐ'yg~c%B!B.1X181O'W$wonu3gǘuLJC ,%ŷ`Ka Pxu0:ʭ>K/ph|l{ش>xm?[_YQs>7 'z3!Nk UFQcZShOp~*oKpo|b#T+>S.T:ș6pۈɼw,Meoy|tk@V.dv R>JTTv0sb3~;>+_ᷱTE?ݎGGpor\>ךV }oMc`k?<3_m[8/<Ygm#tŲB!5gz+֪ .9Agz&܊hw_"h}qW%8owӞW'3|<7ƴӐy鋵̯4Z_wO^ ؕWy5 kxtݘ(9KWO gΦ80]˭ȮdPF}Ő=Aoca8QZ B!JFۻ%״0rɵE%uŧ1y^`+]+1J /i4^3'_ζ#[ }Z'~ʳ|jՎd5,e}f-`ߪOyvJ<#2ma:~#XޓL.Je0yFpSc!b?Ri\z5{glR k֪*/QwE[8WL~F챃 !Bф5mw{9o4w]]?bcfE(r71.MsmI *쭧D%rxg z0wpdLjErnyfx ~ږAAykڳd@n2z{ݦ4|{ӅmV<> Eenޣڻ[24RGӟfk,~UR]i1M~g?e<<\ɶgE1+jo!B!\gq'' 7  W/G]sg@mUL_]w2 χ؇T{RS_23Da d xXG*59B!B4}2]S ePB!BQIYC|FπzMxNIXt_`9LGK֞x,d)i%@q*sn'IW& sI-XqMyMwpWG93'c @$ދ!BF>g>v$ujKUFFӿC楷3 jP `^_N=|5|ޣ͇G2/) (d+x$%w6g`:'1Cd`qjvxKeiJw(_)xEeH _ߟ;smmqy,Y}fv@_LB' ):9~Օi; k 1uӛtѴ|rKls'p8ChP +B*ҋ/ƦV#B!khWb(3yDOmiN{pmֿXw xs#ysl?6>x%-&B Fs["vdSo{Y[kcS{!Bh4{ 2hиi_67of^_'FoȮd~;go\PF}Ő=Aoca8QZN5:H'^!BѨ53Y1%q <(؎h=kޛ+f*Y6gfkG9s ;-0 ),c&3iP4=o&.@e&Rm.vJ&\1v4T,d晄3>{! EaI_LZLpU,ۚwswцQ|71V~>|3,Ayo w];O|Eend9)pxwoksH:^@v<> EenޣڻT) ^~}y3flg19&CsX#O$9r4>Dq |&W|nj^'Wxg￝:*pL}<.Y4AB!htTߜ~}f'Ҡ<|UxQTޙŅKԑO}Z[S㟪]h?ߣ%eWW4kеJcxnzwr/㡼C;1T]\]8jRQmJcU/B]qGjǙ2MWWG*Nn{5#Ř\'j7O뻅) m:Ka>[G+}շUD?jܽUjԖT}Z(f FUi=zGejtc{!B(תnWSN11)#8~IJJ q>(+ }ƞ俛dS9k%3kB!B4|(S*,[ٲ AMMQn2OYo`R?6ĘB!4n|21pS:=|/82I!B!.G؊Zp&{7B!v/[fB!B49M9B!B!D!h !B!uHfB!B:$3 AYB֚g:RG؝.tn46m纝'M_Io8Q`wc87.dB!8GYC|F&<|17/3K0_L_L{)Z5'm\*}`~]V>ޛYkis\EQ3B!hšƌa FʶB<_rSy]f"LE6U/gh_Ye gav&ly~Ѽ}{Qco !م d|}?bGݾl2&0PU2EJLU|^T<( tsBT<֦)&!hZvU\X 9a apfxhlw=BhWCȧLiۅۋ6k .' ƃf RcGh{_UDh`k5b*j5cJͪOӿtō|| kRxBq5PV4߇Yl:;ݵ,ɨ Ғa퇳$xvtWz~?Y^R0g y_7ҫ]L6c_-Y}i ]B}oE߻>fWdT %0`7o>K/~-M6`9ʇp})"u xx%&/ŀ`|< 6W&|T$FO@[^ 3vW1,9ɕxh{2U]%iFum'A2V6_N X }ލgo18I v1>'+^YG0ٵ=y`qǦϥOj  VUx_0JoV:x Cj6y褭UtӇ10{#96ŕih7Ͷ{-V:`z^o;kR._u^Pm?B!\T3 pZ{z:5*##_ɡj[5(rJ0*ǪoW~[EܫUe^FGW_RAO[R_:=QשoQYN~^R'-z[>Qj1CxSu@KZ>sFly*!-Wwoƪ;*U)k5njWUXrzjGL&G;̅﹃UOss;ja2fgǫֽRw1檍ګO5{X+*=UUU7Ծ*S-mcUfe:N}*TE<5 }^~6}J|,VE|[O/P'VoSL|-Wγ.GiTROmvF^'&Z!oq[UujXӕ5Z{!5j'}SS[ftR~U~(Wڪ<;]%l/XAճEG>AwTw<ϕت{/붿П N !5q^ݼy*<*94ۥ1򬏗SO>_ p߁1A 24uGnw;U^QJ~Q8Mm-iZOQeKՀ[rZTT}Uupڒ$ )jZjMǾP};ܦ6ק$;5}6]z6j[hٺZ~OPYyIeխ=*)~RTYKRScڪIo-W[Ҍl7.9'сsV]-8T5bukUV0Tsn)h8UE5jp^!NƅQTj-{MhLP"ԜF6svM:}V8vk,6gu3IZ!U7oVJ`6t<` Nfl*-fSDwf0y<^^{ +V2W3)\n؞0?nBG.wjU_-`zlx)1+='c<hж4ӆ [>rvYQFH>{! EaI_L7+V>g%G9+ g4zhe[v{!3J3֬U_O‡|^>>`䬮Zr*ձt"&wqYs;˧8Ŷw{Sbk •>aU^'d Y|xX/=[%/>N]j}RjfO {Gv$&n5-Lm:{nM_urg}Sv&6}3׷^[*M|ܽi!x Vޘ&3R\Z@ylk<{"K,Kfݛ_asnMW5:ϺFs;#6fQ}!wB8i3Lݧ)*}B\yMIz|c"ޛ>M'(G粧mRx[24RGӟE.#}YGղ2-~5\e]c睭9zNOG5ZGMct>13z5G)6WIM_xENbiH m1Y))ЖpoSyU+5흪gB5iBh36T5`9)'ZMKW;>bLgFӲbįz˗Vf>>b ΁ێ嫐,~xOgMǧadfJ>'Y>},@6?|3qSgTmf%\?g-ᙐL1`hw#[>˷٭[Gu+2v|C}uհJפߪMKt\']:7|C1Y$h'EYqK&6W jw~&T6uBq)j;iA=**INF] -ƋO礃j{_Pf >MO.WZNSxV)T^"G4 Gb 1@M!ąU_݌k'|;IopRC!bx!>ؗ[tWqULL@F |i15nB!.>ej* =M[nKuXUי"Bjh16xB 5=B/β_f_MߛC_4bLB hw 9f-DC0W_ ]Cϥ'C@!%&&`;..]vXu\!B!KMwq!B!\B!B!h !B!uHfYC|Tlb{1mh1\H'zt=_MQm!B!DdF1kۆCMh3v4YO#B!Uht2M:Ж?~g`@ӈbѵ3ڪXjF!B!zWBfOOK9-~%m~FU4B!B@ѶώJsZ`'Kv!Ms^+#ѲdIɣb v1>'+^YG4%/K{*8;R5xeh?cwiV><ﳹ׷73ᕜ,6}Me#D1>b@ %0ȠAqcL"7{ 4@B 5S2+e渡8 +tTiB!\F;/& !~ˎĜ}r-#ϴ7cr ϖx1sK92;agMxw m=1uӟgdcScx8ڝM/}p&cN"=k^^ߌaVfҾʴ/6gr4)3G{GԛXϻY{(AH0*Tv5jHO:[BB}8΃oO! iU\hsX| `*:+W!B!?_&[{|&-,`AyT+>S@~*-9S">;Qy۔ݎGGpor\>Ԃ7o7>x\1|t/aLd_>LG!mc#@k.IoM mX y罏o &J\j8ks.Tȕ4B!BqVBs}`{tip ͺcT\K#4Z_U VRzzziSg0=m{ǡ/އ(9A6{`OnL6lOƏ-OYDwf0|:?Ͻ5kjU7?|HCކ=ԉۼLq'> p4ЯA!B!g;Gw7$3a(, VZ=1&dl2gmPe? g4z@O[]Nŧ1y^@QM /.|7e KN/%\>&3kvgo7g y6jUsli<<)S"mB  g3! 6iJLҢ\I#B!j3ڪ|/?Z ɼ3ؒP|c"ޛ>M'(G=y|2(GwFs;#6fQ}!w ֜yE\ IDATї<:Yn7\Ft`Ro"'1ٴh$ڄ {\C:•!T^Yzdh!^l=ť?ּյyY"쁡+]I#B!4mnzc;M3/_Z w5_z>H=A]bUh{,;;o;Bf M=k τ,`BCYY}5?IOF= y5>7L9'ZMܑ>X6_a+xOU]űXijҊߊ.?AiC~wCtmO AZ!B!p>g5'ܮL)c>&cSFqzPPᗤ7Z^rpk/]+N~nn1\d'f\?f^_tUᮤB!B*$&&j])ZM-Nlz a?:=)+<- : !MۜK2iB! re_mμ-YbB!B&63qqqm=^B!B!DWB!B!ƿB!BрȌB!BQdF6̙\yTJVʯ,\r)kB!%Fv@RKiS΃_70]6s&+|-kUȡÖlJU)Y[~b_Bm'B!vsFa?KqWwBE^gۇ.7M*p#>;]ٿb=[[p/=[s/B! I~CItf!՝6e g)?b9/|ĄYưqvNki뗳H0W0ũYt=Iз'kpT3p`I5 M^LV.Hp;ܥmrH:\XwWX|K8CYF! AL*ꅅܽ6uL~d!}oYO.>據PE9kf:Ʈ{_d--"o= bp=~/XLl[Q}?~9`۷e(E-GB!B4HM9 ~^/˕KlٴXK طc ,X``=k Ɯ"<#ד JpGtcF"ew'0[9՞NFRv<дguH$7z0cwƚ ccM1J/oQzBMPX,mWe]ꏩT)d!t֒{ YGevUYSmqPB#)z=uř++d-B!DQh݌|X>{XFpUĵE̙K)HJ(ԒY]ret oX JsyB뮩2ʠHBCCUmW~.ap:4At?OoɳB!M^{*&=i7٥Bz$JQ6~^BV BzuUj](C]}AV -Z: JsؾU{eu_=9ncG|d[y~ kMbB!M\}>G -TpT7U3O|R׮bf 4Yd%1ldWWl$8\aeۂv+{IͣP|vX,]#Mρ,්A5!sM,ߵ3)atZ=m<9 U`mWrUFyJz($M|ǼBssYd-B!h֪㪈cqkׅ@j`~D?:^ն%sc+6v~6cevDW1(U m? ִ sغ''(|zdcF"e]jWgw*j̙KA)Y)pVo!B!DcT3uvţc(M_I7kp2кK_hr"4At?AF~?vL?i?6Ϊi\65T΃_wMo6m(Kư]Im߬I9F.~ޟ+;~[%B!^}ޣ}A]И]|Bl+RȺ'w$ϛsdꝗ_ՀZqWyu1&Y-[uvAB:n+|9}*N:eϝ&{YXvo?!l!B!D4WLΎ}44xB޴(|{)vS*InkOUl>bD&,3䷲ ײ8k|Xٶ07) `rm()#}+͜[ݻUiБ]ZD>G(džzx\?뺐-(M-W}`o&aANuC|WwFtb3aV]t9~V1&?$b.-v&?2̐~NڜPrUFyJz)6[Ap8w!B!($W槱$a£[OD@5Ϯt*X~u!lcNtu!f,X`*JpGtca[3t4veWFF"cMQb&cvqk1Yi{1ؔCH_h2rMnFlɂRdۉ6c-w\O<; C"ޞBv]4\>Ү:~Qz"m U[](Con9x6JYOꊅ,XCvuЅB!V4,J+6O@-{+ N@cKLgEȴz^INT hRR1XvM`޴0xDG)Zhp4q"/$qL\~]pLutU"?vB6M;VZDssp.knTlxo˗HC Ɛ]]#}8м neɚPt֟v-K9Ժ9;g\ ny%X ޶=5нտ.a+z"z ˓Nn;R\FhmjM::^[l9;s :8o놇_3$P ֟y1x lЄB!m )SqʘɘŔ}T%)))čKnE7b7Gtv!B! Wm (S*,[ٲ AMӐ(]PD B!j76g?%B!k !B! :.B!Bԟ\u\1gqb.)%+W. |ĄYk; `_AҗV99K7ξ#EwC$nCz5f6YGH>wu' 8m~Q˷s͵s"JWF&+H\E~SMt7C|! ^ .6K,Mw!B!DeMkF*LV.X7йz*4P0q:w_"ìޱ^m$eG* ~@F"e] ( ֶ?G3z `)#8q= >G5z~rJib)ڑHn`5m"#[6dA)2Xj3q<ƞFGVMxp*T !BgξkdUHPQrL!F2Hn'髾2}mۘy$BMT(pPZA gή3!q*~?' 7PdѓiUVPd Ot:L(z| u? U#V5aȍQ;n8<3LB!ŵO^fbYVanjv?F/jϬQ.)e"$r2ZhBLV.R s7#gdk"9Arh&ko:82p|Klh: 'DG,g\~l ԝ>\t:@٩5ey Nb`?& !BvG{}ֽ}OG ]zI+Y=;μg1'o_̘F!B!lѶl uKO&o_֓lq&-/{!BY9}.~%Wza}7yJ"+wa/.fyE;-M,bqOcPp:Tm-``nJ2L(3>fV<߇74KW,9J4bh>81 ͳq 7il?y ߝ5Ic|z,]T?ƧCl !B!fe hw}+s{ǝn;\otP-Μo򝤛:{L q,OŌ)ָy  lU*oXE5$RoW09#Ő@vz>8_qVDgZ1ċl U4oO?7xRϣnO#vf;qFrwbYU&HMؖv5$!s– Hqđi :x kԙ}|FW\M)Am }]xO'sG/i)-'98c?9{v.8e.B!^@ 9}!6e[I1'yuN5,6T {űs}IBbȟL)x%$間pOB ugOB2Y%H5zBFƂj݌J0Vlɡ٘HZϘ@`W{Z2&sKU!!F?Zmư>KOE#rng=WsN9i4c5ؽ\nOes:F?&!B!hOyߺIk~W>i%477xә,D$SY !B!fsfc^z0i_d7i|%}X&zB!BLһG[!B!X@ y,B!B,9-B!BDhkQL5RQ+扏|'!B!D-kf;o4?)(m-``nJ23~cyQqOap]+g>1@Un Ysũ./'B!x)=7;f;UGã|XEӵ~VHi[NC' ;*xG<1hf/t|1?{Ε?~#)՘+:edGkJ~󦝇 w0jB!B֎6>46~ޜIХı&=xV_KR+0DGWuIEXnl|W-ؗ?];WWݿQKyEM5-W!^=uDvn^qS{JgBcpJp;[yk2bt~ު\C}SV_b"i% W:Q;#k#c/P=~Q!V+^c3&6ąs7c9[/ )X!BZZ;feTlMaC3j>ϴa)'0Tc>>8@5\j"9F=f kq z@ʲU \^F!W/G5\^r^[DazvSRQJFb碩ENafڬݯ/d<nq'k*e1ж+c~H/l~wq*^\}CҲX(jft&jIڱ8Wt1dn)#Tl2o:B!Ḅ ^7/Ronq|O27aȍvf;q *CbUՓsƮ-{ 1&)طǫ u_Gk*WoR]=r:Zn| a?~/%CۍF3`aKE?qR#sL6t:L(z|X.<#dA5W$=BqUqqj>fwB!/ўÇ1%BuRc 2}?i"m$Hv,w_p+;8u}\9 &: `1 Sq7.?M{W4R/"rIg…3bȂט@cP\h ZH&dFcδ-l w9#94lWՎ=|ܱƙn>'?ǮA]=|th܌OgL)NW$l'1,kϕuB!B1Ѷl uKO&o_֓lq&-/.hkQ<,t0B!B!%z0(oܿ0,uB!B1KB!B![mYh !B!Xrfhφ,D-B2M/jsGOY>LB,BR[h^_S\"jž|W3 D݅[.Lۛ1g_R۳8fwB!ļZZPjA/y:.Ӧ@oWc5::a^feԜP`; $`WF$MV3FYQ POTLON!׮0zW]:63V4b66I͉`< @#go$6"%sq>wWС150&~̴̣7c&I6,$&i۠]G;Oa鼸0eQ54@gQ~_M ?2tܢ㢩ENi% ^?ta{!H9 q#Y6ӫhĨ3"$"ħQߧqd6BE_l~7BY-feTlMaF1&~D;VxUܘ(h!0B!ni=uύhtXg"nAT5đaȍQ;n8LK ƸTPCZ1L@$ov\ٳuFp~C[46;Yuyjgbljqh_U_mVoa1$M Qo$N硯ts<6A♬sl`ZmtPJ5UzzH Zsa>Gi{5rjO!B1pyP|Jq\F n(x]ycL znc/nu2 )oчysɲ5H4HIrs\4!nuf ڎY#4f0q QOЎ ]_nL.^YOp'M?^N?ɫ6f&hd4Vg<q1$~8%ľu+/ V|*+\lx`5v\ns8+֭eIͲ<;]}-J=w6_:ٲd^1wSb#lۋMۑ{"uE+h! _a~ !By9m[B7z&bb}B/>'?ǮA]=|thX=;~zXLڙ'a/Rbν5.!BuGf1Wj/=q}YOJݛ\'O/vm[JsoB!|2_egk$g" !B-=/B[!B!Ē:.B!B,0B!B!h!w0zS<5yPaYmXa|_}^P<~UԜ[42B!B!G@?ЛAJHˆ 7p]|&n'0oq`ŪG#ߌwbH)g"jZ(~{Cz5tG:e1Cɢ\!B!^4 veSnnӾt<7)-g8פ z b,s"W|.:BX]!B!xA-h~:[b01D#_:nbljt𪀯6T۷T "X;R!B!/|xv\MX}gǓ}Drr,nΟ7τ gNqoŪ1CE,cq]2&mR!uNjNȥB!B"O>QݒμoG~5Hmwq{B!B!'|<_bT{äe=+worh !B! O|GGǬB!B%KU E,B!B,Y@`B!B%k!v^ NqRsne =g5~!B!X8NhvZc`[gNyBMlB=<e*m`hYFǭT<ǵv?S+y ~m-``nJ2L(Q=fy\!B!t<;feUGqxg&zu6*KɘhAkS^Uo2~>_}^P<~fH6("=;i/go$v<<ȝNvTx_icc?GB!bƖƎv^QLDu@oJf)!bR*3w𭛤!?OoSI?Id iuo!jOP\_pr;O3ٳنrs Ru=(P}w_+(uݣǎ/P!MT t+5FU]Jkg%-<+=_KqÁB!b X:O۟KI60B;2pũQheǴ/hjuSznRM3W#~*7ޤ^wxVwZoVJ^1 \oSZyy뱚!ZQJSe?wKi8qy$B!BrY:O7(L,I, ('?ǮA]=|th܌O!ĹW5ΛLB!BOV>;׫^z0i}YOJݛ\8C['gӄnc&B!biY6~BG!B!bB[!B!q!B!bX iI͉Z~R|>!B!UU_4M]MIy*o~1(NjNP\1WE|qOc J^oe7ؖ6|t+9v +b^_*\!B!fe!.v`; $ܿ+Bw6ʦ֍ $æFYe)cUGqxg&zu1Xʭi$e&%y{*ךFaB!B{RXO<+Wn%)vSԜծMR.J70{GvH}1nc#oDZ;CmNv_#=u^w /D1=m ݸ@n +aOSLwُbbУ@Z+hi3#fu+NI"d7帩 KIqCwGFs|р }E 6_[qe'014CMGB6 _eCzŤtolB!B̓mUXm q WVC`[{GpZ~ni^]H:!W/G5\X]7Bx>}4”ź(?\JFbBw xMIF]V99REok3>8%XMcǢF(ZkտF(q{X I6L?͛Kp`<R{7֓2B!"\ mCfXim`2điH*f:Q}yX}|&u-OŌ)ָy0oH`>&`'|։nƒk+*YY^4:qh #b{ [B2h:&z=>,J'ŌmUUjbO$=L`=|XL`N֦B!B['Xι$V vn!q}scp)X5n#ZN*%L?0)| V9׏ƔkSQDtyM$g;HM ZJMoFF ŅiIDATΞdJvjo/`gKg;}ٹta٩j q^bYV3G_lN*pg\6L< B!"W?/z0;>)>x`6f xlkf òl6٫0/9 2y @1ڞ>N-J9c:VVnzmy[9B!b?xZ>μ/6*K9= I6/BɅNy>R[9s}-_Qxr )펏{&yNHT=t\M߮jցc@YQ Mf9oO!B1LGرc-|u}>|5ݻShױP1k줟$KvZSH0-L\mƐ@`qP k t+u6l+LzW;܉[ P}vdL06o@tbH+ '5.aNiH}I( ogO_LT'Yq V&|Ւ֐'dW:=ߛ(&|o_°@oJf)!3BVˀodB8CϘHJwoܡL4/Lo.#V]{qAM#ol^q,;Czs"@B!~9C3$cpĮa};P$V99REok3>@XoV/!LiYs`5ލl~DV#s}6wVNϛ[3[?~0ۭ 0=_U Ӽ~@u\C_坼΄m)yF=f kq 3n~/Q=tS}[ +霏i֊XFe*4:3RtxNRŰF直}%[SyL^㘏??~}Ka>T !B!`d=af$)7 ̛R J$dfH ;=1TT/5,JӐOl~$8řeELzz]X a6ʪt5Ss'&hO!BNkힳ>ah܂)e"$r2J0Z(.Pw-$UTcژƂj݌5N?lɡ#PTJ|8>%`X3m [?t$Ƙ@* D~&\8s{+V1Mq< k:OAN5X&:U$;zSi%477x9 JD|MvDRz B!bN|'|=;fXƕs\cñczKO&o_֓lq&-/=b~)Nj ؖ"[!B!!x"F/=b^m7 EmU_(B!/tNZ&Zd-B!bZ{B[!B!ĒߣMe^t|4;օ7l 3oB!ѰўĩSWq ]}yyB GߨIqRss>v7!B,E[ˏVS, mo6ugЇv;~FalguF;!cEw"9y2(,%cO"feUG** D!Bqzz+;gYv6yl̀:󞏔$?fw_+(F;E4DZ_NHc+:$t I͉tbH~G ~lĎ$ZD1=6 'ӥ@Z+_uJp;[yk2bNjN]"-!6l'r7oSWY1b_8 C2SI?Id7.aitD-ï1l|W-ؗ?]{m"Bǰ=1c<_8͹`;REx$ &z=>,J?`܎8E`H ;=@ϕuuZȴ`$3>Z<>PIzѿ@gjH`>&`ԁ>#WPǕUGt|xEhcyj,fM,ƍT5$O8'kϵbZc;B!;/yғsƮ-{ Vc<tc 4R>Fo$}C`qH~P5r{f^W5 @{ٷoXyB!%Ϩ'|2~|gs26.#o#'w0)Sw$sGvQ{M$g;H~u# Mp)X:TJ|8>%`ڊȱ9{Ǖu,Йr:wdy&N;|Bq'h!]=t|oBwF<AN5X,u*Ǿiؤc%ob Cx;X5ҸG1\~{:.\i|􎙷6KןӤ^~L9ưhocm1kmnB!#q_#R?_xGOZ;8t>nw9%i!:2cm$3<|!Glކw g!B!O>?xOرcQ'ۗ$[tܽIcH_w11_r,87֖bKưm4+B!K(ZT̎F~3Xg&ưX$-B!B̡B;>>>b>m!B!b~>}ӧO,B!B,Yh535E|>{I͉Zk-yu"s<̛"B!HBɓ'?KC2x{$B!Kbtj_\ 퀟AdsG㇖ E[ˏVS,ԝA9-vfs2$s}A6*Ks>|j.0ȝNvTx_ic 0YB!H \h㊓gRD-E~47aZ+[ܿwƯpZGWÃj{(e9I3{>RJ0џA9tWtiF~ճ:G# c`ߎ-G`t6ޑtbH~G ~lĎ$ZD1=6 'ӥ@Z+_uJp;[yk2bNjN]"-!6l'r7o3w"[FӍqcwk줟$KvZSuZ}{[q~r6y竖 KIIg'{cΞk< s"Ѕr*Uo5:@:CPyv/!LiYs`5]Tãu5˩ :*t z q~>8Ϋwxsށ3@вݸuZ|QUt{8|p-C?74o/.$ ;!m2z+&J&ow{?orB!L;R;3))FFDZp++ uq[۷.+IсO ^҅-l '_jdyfN'sy]V82-1IL'6Tޤ{$ xP ۇ:P}އt긲a?~//k5ı<53V̦X[F~j赶feUGG霰>׊kE9!;/yғsƮ-{ Vc[xDCR1"a7z#qx¿,|C3zE:޾Ui̻p82Ҏl'.ד{?'{!B1# =7 mvoڃ%>7;Y%)۸>ÜSB0>KO ^F5 h|< \cp)X5~Rc*%L?0xmPH| Xܜ?YK:{LO|w9;2_}p!/g"{SzlC߷e.EPdvvqf3;YzӞ|1[Кϝ۷ʅ_ӿZLY΃^No{Cԣd5_o9FnJnr $BB*$BB*$BB*$BB*$BB*$BB*$BB*$BB*$BB*$F5 %4x]h@A{Ev"mE;vl+PA#;"ۊ6+:Hd[(ىmDmGmv嫝ksw$NN$Bk>wnJ}7mBk(NK|9nc}X/IENDB`ktikz/screenshot_v0.6.jpg0000660000175000017500000022367211455414615020020 0ustar fhackenbergerfhackenbergerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222s&" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?nuy&dew*r7c<٢rt0!b^?J1uA@WWjb4:N?*PVRݗJ 9nӭ"$.őx[}WOfK;ptKYR:dq]f$Ům-&0c1TBM˨~D_XtKnKo\T\OJшi<[XudvnKoG۬/W?s1/k#u[ߥ >c>¸9ӟyΎ_0;Xϥ_u[ߥ ?ӟ=_m~(u[ߥ ?cN?:9Ce>—?m~+ӟyΏ9k#u[ߥ >e>¸9?:?c=_m~(u[ߥ ?cN?:9Ce>—?m~+ӟyΏ9?:9C>c>Xϥ_NΏ9?:9C>c>“_m~+ӟyΏ9k#kyĆ+ v!ȉ~UI6+YXyUaV/O:Ⱥ\Wqq[Ȓ7) Ϻqr+hIY-`˒63!]`W0ti&RK{MMb`'%Y$+:dw3"h8QCiegiFwiJI7srY,|1x$z)dU]:W @Ju\Vy5H+I'ir[m_cc_m~(u[ߥ Ֆ&D"odLjMeISRJ U\Ɂg=y ^/}-I V#C#%Tu'E-a4Qʦm'ŸͬҤQ[ "\{tڔ:DֶdkȮlXw_%' sLmuo [@+Ibǥ>uV񽕰tb<Mu[ߥ =N1ALj aG|R#4Cem9vф]!n8xMSK}}-Sh>kQEgyk`cr`.ukj-3"'ȐIpFIcט;^忷Xϥ_u[ߥ KlEa Cm`%V灒x"jVCi$6[koe{\|;}}-nKoPTdh1ˏ0d-7MAm>Ip;nW:G: O}}-/۬/V,f+yQ.-DYZ2>"M-]{4U@MJr==*M{\u[ߥ |W6JEcn9ª 'ks Il_>nV-po~lJ~u·fek)T)T(Y-`˒63G/Kߴ"=p55̩mrhW%>0V\ZdE.2zi nңRe@h>f3ѯeG$˖1ID}1Vtyn{$@mI;6?APf-MCql'0}f 8N兠F>=N8aeECǩcĩ+9ٷ{5{ ?;iNt7@'Ս%;il}}-'۬/V?J&,[[S4Q/ mv8ͦg{yoghYUb>)jHRNڑy+ԉVcL(WjCco8lS6# OVdӼ#i:G7M0l?*}u.jZ>e>—?m~+* {k8myM8QrzT~.ZƟge0B۔JrIU)&CJ6~c>Xϥ_N?:?c9L_m~(u[ߥ ?cN?:9C>c>“_m~+Ӹӟ=_m~)~c>¸9ӟyΎP;Yϥ__m~+ӟyΏ9k#u[ߥ >c>¸9ӟyΎ_0;Xϥ_u[ߥ ?ӟ=_m~(u[ߥ ?cN?:9Ce>—?m~+ӟyΏ9k#u[ߥ >e>¸9?:?c=_m~(u[ߥ ?cN?:9C۟dKKaicm;RmDerl{YVc}/SgoEf 9_ҹ+kMM})ѝ۬/R}}-V-uRQ#/$.y#J<-?8c}-"ذȴKOs:{ wnwDfl/Q/KcZ~c 'bbvyAZZ&Y%62eq8<&U5os?9-/۬/W3I=:MYs1'Ԛv;s}b1m2__m~+R;7Ec+5?ćpssӎyC"۬/R}}-tS{N\xq>[p9lzgBdF*#5#IFzP8."[r`?ExhMjyy~VTShލY>9MEq"1ڴ,4O1yܳS])]~])E<;kKs$n.w0'$}ZISؙ؁mZFMO~f;Qrv?^}s>rv}}Gǁe?{7 ˓eoA'h˓G{CŧDmm#ŒY;k~9n~n}jPڸ8/D ybqj o(%<>խP=#K spdUac#j]o(}Mdž\z..vL3z"jR}K|#1=+Ѿ֣IoixnFŒ"bԅ X-O믳yo3ڽ}i? <093L%۝zm'9#jOnm潺1A#==ܷѾ֣I;gHf_,p: zJ55)M yqH&mѯ9< =oGxJ$"by~S6M#5Uk$9={>7xnQ,1vk,WS\ݤȘY`9{UKPKh&i%ݪF sɯaFO5V<.^rv}gK3r,nT8 uZtP_Eƒ UF8Z]o_hNlO3nԹb'։έuP91p}}f?W%մ5E*X}:I{tFC+nL;M$Z)ϬQrv?^}s>rv}}Gǁe?{7 ӵmSO\,*d;GLk=KEz7}b?ii7y7$z-!ǝ;e5c q8Jss^㾍,DW_z9-?!?#Կk W}Xo)AI ZmNO5o6Z-%(IBQ'$py{N7(/#:9:-?ݿUf>^߁_QqPJU#FI'S˓VvVHx4wvwp[y>SR#H>o&k}9a;;{e(g`gޫxwhGAZ!ة.m7@|Ӝ t<\E:h V[L/m>ƖL9X/e#/r1~zֽ-k{JY>`_~9#I/iSNehIX s~ y+`63БY\O Уx<)nio^sZ/"ֹYz~0fy.pJ8b=9[~e2;~²>\f֟d-VFxA"HVgzz6`clٕf%?PONs)mpAE j#E @).`ymf#ʦTހ=FF}E-Fpz^uDTv&?gvk/3P]rXy3_ XuhB[1|O?'jӼ0}PBLrZ[i&J<> aj6u+_q}Ss:棧7(K#MC3\I;7`` `%NJ+h ~'Q1*%R!VI95Ѯ(P"ƪ+:)z^ Ut[da#I$s[,LBt9\,A뺴 6qf'*!l';aA$cOOdPd+w\gNitc9v/b8呭E5B3$lێʏ:5}KHi|j7r>'<]KM./Ṱ򐪛=I\JWCԞSϢ]Z ]GѴ\L㎪x;¿׵KKԮ;]#Rc9T#۔b܌FMtzv|u2@ -30IxΟwϦmIo-o * K'1N *eFڣ̰D .-yCIbCIѨ CG= 'GF/= x4]]x4yytytjCIѨ CG= 'GF/= x4]]x4yytytjCIѨ CG= 'GF/= x4]]x4yytytjCIѨ CG= 'GF/= x4]]x4yytytjCIѨ CG= 'GF/= x4]]x4yytytjCIѨ CG= 'GF/= x4]]x4yytytjCIѨ CG= 'GF/= x4]]x4yytytjCIѨ CG= 'GF/= x4]]x4yytytjCIѨ CG= 'GFy!<ǚmE8|IEڊp;IcOC]g?$ "@JɍW?{WYm R\r'YQ$4yQpt12>qJdnR&HPN>em.\-Qp<re诩NXGt' 'zV5+GO^..nc2z~qs+(MկaKҳW4yQp3Y7sjZ #©BIkx6I;3Kʋ?EiO5N" XǶ)r;^еEh4f;^s"Y$W;#'XN9+ gʋ?_2>S+-~ :\Wr=7X'd9 GCMY*iWʋ?њ'C"ѓx3CރgdT_?Ə*/Fk=gv^W#04<T_?Ƴ|}Tۺnqb e`Č}וʋ?њ_(i\=Eh5̶7fk2TH6sPX{#4yQpfWXԌ٤04yQppbWG`B9{ځ!{;8*/G4fT_?Ə*/Ub};)8V8?MO*/G9)X ]Iҝ@T_?Ə*/YZlnV” X.XdN;Pd-e8;H44yQpi-^cG=OX */G"t2( 8;1:@*/G_W=Wl1B˒'EOn J(^ k{r2=m'm 9/yQp<K5S\l61bj[4yQpChAA!|?lZF9q تvC?ʋ?Ej5Ҵ[K®r{S6Ye>E^=ha;ʋ?Ei4ߡG@_(a'ʋ?]GEFORn \C*?H?:W,T_?Ə*/Uu >Lhy+H}*yKx$CE,ړV 4yQp׵U ֟ W3H=x#h?ZOyne9ⵝ]8ք*fʋ?њဵ9,G׵c'ʋ?> I-z~z~hʋ?Ejw/a'22}dfC+$?2{s;LFʋ?V1]Bې`CRʋ?Ek{^Ka}XU$xK.q¦rٓwT_?ƪAc|8'}SY."IBQ)מ뜥\N:/ ^oE5]ў5vKqRcm"/yIԐj.,j2\`qޢktw`4ۇ# 뇀?1hiFtT_?Ə*/Fh=<T_?ƌњ44yQp3Fhʋ?Eh@*/G4f<T_?ƌњ44yQp3Fhʋ?Eh@*/G4f<T_?ƌњ44yQp3Fhʋ?Eh@*/G4f<T_?ƌњ4սje%\ʜ+s-ה_k-ddH9#OETywxRMc{ #:?3[٨)DOqE쬡 gTEq^(/d֟&UsO Üh\ TfjbV qYr7{g$b,w+FXe0~%1$P.ݨ'q4j ڬ:Xu2G`߷PE3TtptKt%K*2v{c&.R bZ+4Qca“ڤ}Niư_9Tf0: )VC\I'$R}M?4Mb?&B&/Kk9'hmm7S V $yY#U;W|3HbFn]lm|d=:{uV@u!|r-q{{<MC8[ðKw~h1p-H # r{U}?Ex $Ty K*2Ny85ޜե\D "~>NGhC2EV9?iRqk!k~3F>Xqc dW;* go#M"|وYm,}kKT/|(PGm㴰u8/+ ܷBq^Nhҿ'e 5ѝ*=3Oֵa(6ʒDm92*Ԟ!o!3DC s9?$<CX@Ԭ?Ɓ `jV@t.śykh#hT$r? mi_? BAau_rW-MKZvo/iew<in"wy=0=6槫j5F"Χ*z_ 3V_Rޥ#M_/DQVxՂD6)%ssd6mӧD }iזSiPym4E*@z8h5 .g++vaO Aim\H6<1k!Iq":b^O7̣t牝E# xxӗ24L7q3Kru"!ǵMqm( P.~띝|yR:إDMNu'j?~:vf9Qogof[w#wֶ5bgNXd"a9ty8AwюJ:\~ȎK`d Ӻo \Jz"V-$h8٥q\L~8Ƿz +* 'd[G7*(q2ltw3]8a\rtxL<`W nrU3s>մv13OY}H<!P .0* pz`4qxF-)f?4f3@fFi4њfh?4f3@fFi4њfh?4f3@fFi4њfh?4f3@y|KyRxFH6/qk ]p-)?µfOsu_udoCh?ofOZW2(̟ EdQ?j,]|2*X ٓ?FdU(w'|TQ`*fOٓ?VU̟ 7'­QE?ofOZW2(̟ EdQ?j,]|2*X ٓ?FdU(w'|TQ`*fOٓ?VU̟ 7'­QE?ofOZW2(̟ EdQ?j,]|2*X ٓ?FdU(w'|TQ`*fOٓ?VU̟ 7'­QE?ofOZW2(̟ EdQ?j,]|2*X ٓ?FdU(w'|TQ`*fOٓ?VU̟ 7'­QE?Z7chy> bq=0X.zk: F=E≲y98qyŰJ$%;*<\q4X $m O%;~Vl/E_EAug}7O-ޕY+=W+sU=i&&t_?qd\^V-Lj[ >Xx $J','*z*>\$z&5`7B2y`jQ7fE_E?qZdz= RH\',ASs&]iiQ}mmg<(Wt{(I9P]_?qd\^W,<_[}ake'ѸHXnq*hSN5/[.^[[4&"$1?0*Qʂ./u~(ȹ[]/o X.lx2Yd7 b1bG9~"lE缂"uG6[Dxa+yG* k"_/"싟 ߸"Ԯb֖;,ʚ[2 67sYkrmN;˔\1G* ȹ"_/"Fn*nȻ7,Su?M}H7K> E!I*wXNxTgEsA{GE_EaM=b +6,QmXaҍg1sE3lmBeVwc2ژe>OTfE_E?qh~).*MӖ@}+$y2F~fX;rRKrkɭt[ְ#bW8+Krȍ@?5.ί"_/"싟 ߸k/N 8/Ifb#'? }5mN}&+H3u3ngHLJ9P]?qd\^VU,n&hͼ4jcl0 J,KI])o3n]•p%qʂȹ"_/" 6IXAmm$Iܘavmb2ŞK&ڄ̳kɱ $iuy@P .Ο"_/"싟 ߸|/[ l,bIb ʄ-v;2ij&B!=I0'ʂ"_/"싟 ߸Gnyo K)6] 2y>"V䱰UgfiE*_ #uǽ.Η"_/"싟 ߸m\MMti:7>K5ߜqU_]QKg;GH:Hz9P]_E_E?q/5˫Wm.c־6qq"t/꺵-E7v|2pr6SNTfE_E?qw=RTVl/v0!ln`em;o_^]ߋ;('[U n-Bb-q839P]E_E?q>{ZyfMHh1%qЂO"Qʂȹ"_/"hٕsA{GE_EjG* +"_/"싟 ߸բTfWE_E?qE.̯싟 ߸{7Hc42G j۪:@4PʗbIcp:#skYRj%?jV5)S[XV(r7ep?ZYrjA]N垩.Ɲukm=B288\$`⨏ʣAUt{F)ʶC|ccjagN=ri&>Kr]J/hP]`|ÎsZ?_ 8c{ykx[ kKqQTMv_ٚ߇տ?Eahq֞ rzXnEۗVo,nsǑ$Ԥ7V/ rjI3وGvzof?v_?5ow4O[~tfje~^Z)?5oݗ.{Iݗ.[~tk4O[~tfje~^Rfje~3V/] 3V/]ٚ߇װh-ٚ߇տ?FAhտ?Gf?v_5 E'f?v_?5oѯ`Z)?5oݗ.{o໩,M7X5 /J۶ݴ ahyiYxݻvٚ߇տ?F٣i`4gRX,p## c\嗁42{ fio@f r>`c<ҵfje~3V/] ?pעmEGo&Pl6W9,Q^HOAJl qogqG %w-r) s|_R1ő.FdNTE*nr\0N>8K,k[X~Ϊ"\:qVMLk/ zޣ[i.fK0L&h:=QqXInshQ@JӥGajhUIBUJӭ~{ X~C«9`duPKNrpuOlEheYGI\z#T t"uVSVd+Ӱ>ct qeo(Eq$Jj6G dSL8N s$K*  zi~W(i~W)]( pBPqz@t넚NdWUF#Qn`d^q:o?:o?RobIjJ$\{q=yTƃ&P`@#Utߕ ?tߕ 9Ôqt3K%320HǡO.e4$V;3D brq=+/'M}_'M}_9Iu iڥЖ$QWxF'min;[fYbld)q+'M}_'M}_9Kcú(AXoٓ2VeӬ3c|@V77Žp/]cyYu+'#gҚMcn@Cgҩd+d+s)q?RM6s|1TɥXYR!Eޥzi~W(i~W(RxcAO:|z&FO4ۭݷ8[Jl-MڮAe@$w"?tߕ ?tߕ 9Ôd}%d*1=Ln1$aHX2.GvqU?tߕ ?tߕ 9ÔԟL3+yLʩ) I*G H$WIC"అre*Tq3>Q>Q;skh~Gv5/D]{TrI<?tߕ ?tߕ 9Ô6\C43ivrEQ>Qt &8UQ-">zM; n[+|d_:o?:o?>eyKinKn4"2?#Y-op\I##ʯpr|q sZ>Q>Q0EmAI1T*VN@OGN@OG8r>`VN@OGN@OG8r>`VN@OGN@OG8r>`VN@OGN@OG8r>`VN@OGN@OG8r>GZ hwAH5C'M}_ŧX +;xteA((_RZay/N)AIYM߸\?OlLĨ$W>>F럣1s9IQA}FXDc|G |>EmNVI4XuA;ȺӺ=WlC/C;+AuTn<DcWȗ7fd>kѫɭԗ'h#,6u d{iR WV+|8 c޺`5XHp,p 5Է'SVniN:sP~4"a'qu4S䏟fr9jWqݾ ay%frrWEC.Ȯ!;O JږQ3T)\V=x裓\RiCLK dXێО&;B[RK"}UrNv`~_J굮cc$ZYۼͺV%C! ry=}h31uK+Y.fc12)^Vc,U"f]*QpAT A9<Øm.;TMFW8^0G)턖uikeb-rK 33&ZdGB44yR ib7;Ppd2}krݼSH&9P2{|GXm~u87cŠ9<Øl;qmC @>r{U;T-{m=Dhgya9S gں  chPPx4ry1̮pZgVi 1<{Udg&ؤI# 8)[Oo ፠+ LTry1c1>[tQ&5Y(Ʊ@o ?EmG's?mg,EabcX}"kVry1c1>[tQ&5Y(Ʊ@o ?EmG's?mg,EabcX}"kVry1c1>[tQ&5Y(Ʊ@o ?EmG's?mg,EabcX}"kVry1c1>[tQ&5Y(Ʊ@o ?EmG's?mg.5;XɬmsI>5U C>O'EICoMCRQYU'mI !Hӵrڿ?EEMj}=\Lq&F_99?KCN#p[u?b8nIQEdQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@=o?+E6W0MOZjOZj^QEfXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVNp$bF[fbuZՋ?V䩛X20caG=7U%ηK D(U˞sNJ? _.os[$j:۬A#p[u:(B(((((((((((((?y\AZ+ u~ڧz5yڧz5yu/SJ3uK1)@wאʟcTu>* Mf*c H#vAA,+o#RZ"^$ oywk >YLzdp=*߄:'XBJ/ßhcҵm M'.q mUr}p8΢𾗧i٭6/0sNO;H|ʤewR# +z>_Ƙ/c$d9!>`AT > .%{|9謼/kky cK~S35>Ӭ#O`xvJeU؁hԭpWfV03+æs2"$6?76ZfgBZXe99ӽiZ=[}vႹ$`Sn|)^iX\ ׵T:A 2w#98 LxF.m- xBvDg,9SF S.cۧl!C3k 幱Ԥu[C)Y \%di{{ֳGI;qįu47nS$ccn6 @W]ZvcfXPFI8OS_;xͲ$wkf$ OqFf`3C}*gY؅* xWW Ƨ7"0I w?  6– -ck333.qp1ɩNj8Dv˩Eg5̱K lH9 Fӊ%@q)f%qFmW+s"i!C%ijAf$# ڟýoQy/ W2Yo+ځIG\nEvhRj>}x,9Lc+ .N~@㳧4kEw|$wQUDG94uOM#$\˞pedvIYumV &+4Dcc#'$w}cxysZ;s>dld>?TZ,=kR6C'Rnnm#uO77Wēx7H"Xt9tFxX P VpR'c\? (cUoWSZM< o&&c" ݷ qg?tm k ɉ `"c([Oj^hdv9.ʂ(6K9}SCc;=.)DFc$3Y?M6 %[FmH&QBGxwztncV^Z#=*'= t:ޗ&VΣ?خFhy/ t221WPKE#HU X S~VJpjW4X[Ca-x4Nk2vr`F.w@ aɭ:(Rΰv'ϴ~gj7:gef9q,*E>]ҷ*djkm8e=Ab} J36kKV.ij3BʼnW=}aVI&qfFkՙd#ydt;%2fP^32T@{7DU^AgˌVѢw:БGo'+1\gN-ĺ n['/4!wD=I\)'>zͶr@"^Vx"UdQҺ Orm)%\gO޵ >K#xv{b!?"`Iʹ0#o oBcv#ctRd -ݬr@A8JaDZu ٷ<`~R1$5kk6ѬPAkUF@(oc0Xo]Rʿ)ɭ[Et-䁹lfdo~yhF^=]$uuur{V9YEqD rT+%tB{i[ݹKr )Sg#y'!&4+NnhP"ǜNX8$/Km2}0--̯0Rd]A,+onxzPk%1=D 66~E#zz7DxÁN9}~QۉII#B7ҧDs\Fia{'(pe\t&Y4Kk,ڒy!%@vCVM%u ,ܼ( FXGQ@A ~J5<2e>h$欼g{Jdi%A.k>͛K0@ 9k&u9t-5 ۈ?I81 iد]B;I"Cy,qmw^zIg& c7L(ı a$sOZ\3e)q% yC(l ;Ee]0u QTCߎrp;VEZMokn<b$gj3k϶H=pa'_:kck~aڜ/u$TM)Tj62z&+WT5 }H=;lxc(T3s6t8}>ܷrG3>`w |`GL14,丙u yTYRyhzk6^Q 1]c0LsZP5n =b&(oe4K}:W袀vQE rVbU}9*g𲣹]J]sY?b8nV?ome * ( ( ( ( ( ( ( ( ( ( ( ( (<{;4Vs_HI% rJg=VZt?gi_Z\zt{ K2ĸPf|jž/t}@B's36O9RKEh-[c(f>U=3֤gIu+[K27 aM^ϓrkQÊ(((((((((((((((((((((((((((((|GX#Ua__NJ,gE~/qRE~/q\sVj:۬A#p[͸#8u2+3A֤y~ Hϙ 8 p7w9bI%X(GEIE:*J(RQE,tTQ`#%X(GEIE:*J(RR7ݢxߍwixG{ ^Hë6>kѫ~>kѫ˫IzSj/C"h=VIҦnE7>n8qdFGPH"huH?x~RCs\Hȍ,dqv*/pka|=ioޛ-<47C780GNuOAZd2BEprxj-X)ib2^Cr*]ż_LŽ[%i–)0)=G|HmUy>MgT5N.Km:kU-ㅓ,I,|3gڪi|7Юᶒhf2W8Qpr@sDm+wu~}CVե`JQ}VWz$6!g"n梸= Ɨ6Y-(H#~AAfk-5گ8/fFە7|`S89'x@kd'H>eOZiY5B8n\D8*<3c϶ҥIҟO-弐]A#wb<+x_6шmdH8OݸsJ9Q-ؿ"7=/-jCI|$ҹfGk!oIeeW_ka2sx~izHC(@ |zhcCNiF"kX `n j-WWkh06}.pp@Q"? i6xt#7*5 W֭.!AsZGˈwr8'(BR3jt$d8὎u#Zv{Z<5wZ+?VO&dAH@~?!ZiFlvq~N+)v3ЀuV}?/aϘ5Y4];-M#§I$p2'ɬwV-%i+ͽ(r7g"cQֹpX-uA%̮,LEBz}+NdI6FnSVn;hMPӮ`^fE}v:R9'R*4RA H0̑\i0 ukA)#c&)Z6RMEf`e>{~qUKHJH2ğ֍J| Z7v66 alQF] 9,DWӦG-# ͉ w+ji`C#kӼ!wjG}WE5jsQgaB.W9<_J,Z AKVG{6!Pn aEtΠV5yT#{R-?P4\\mv?t rs* Q[hKj!X3\udl6E#mF;v0[ MJ@}kofcї\xWORm*U]jeH0r9V;9>m-Vߑ#hv9s]5֟xvfy&?ra\ bP(ԓҀ:j(m#7K%X 2/VhT7wPws #idsUFIVlg{|c^*.~5jZQmJW^M6QS22'q( N+KPltnR0́98Jik^k-VH$ou t1VGp<z}Xu97=ܶpY?|$gV!?#ѷHn|_1 u3Я=Eh*O MnE Epu4-!B#u$#RJ̛X\w$`WPZA9m{R U[I=@'  mndr*)n$ h麻]u =ȯ^7S8*G#x[P4 ]&BepہN4Kjz<I6V 2F1r;e.{AECukA)#c&)Z6R پ_߿?1.^Qt,*_ y :Oii#)@IYV=~ڕwq]Y]Jc+9wF; NAEKi.^F>vǠ>#}.kJƹ鞢hM͔W6pѷ!*猞O&q_c}kYC{e:Om2XU5b|?%P , =<*_%mV/XӒ *;QG!ߋETQG!ߋEW:՚F+7󎶮ay8%sKRmnEb:߮}LCkk A'Ē}I$}IwCu+;AEu]E3(4h+ Vj=t(u=qs,s%V͖@9V9 Kt^Sٜe721jyTvo5<>~`EDP>wD(N?3@4RFY.IDY e 22ǁ"e}/-T`A]x= `{.fI$iT{w Ri>%C1wGցmڦjK c;Yl7Lǽ^&-fqk'-Zkp$YA9ʾ :Zͽ_[ĐL9킂L cZ;k| -{pө<$mڣYdȧr1_P=֯/=0_ir "Ǯ 2zu4V$iyQ'1`6vA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@bU}9+j|G3YQJ? _.J? _.1X uXF+7뢟S)s?+ZA\9 V'AEPEPEPEPEPEPEPEPj%#]_jA~Dj0'`|Iǧzŗ<3F/N?#jbu^?svj^j,c*=9o DGŋ ,."[nrIldei(@8uUxsMm#ľ̚=L}ZkVvXk(-#}y\AZ(?l/Wm0]}WףW0]}WףWW4! *$ "eyV48(}:UI<"[y眪r}FGzwSýJ"`X°uܠB=(F.Џz&vBod y$;Fq n>h XFuQ`;h 0 A\l-5ۍF!,wvSo$=j.Ix6f*'lnӦwDA1: #@8$$T*(Ʃ6ьԟzXiw-^T2ۺ0#v &wxеu:vdmI1@Y]^s4)%ͱNzHGᚔx%2rL@,p gc+aln˟ڹO_\j\gMHm@#mܶr>ф1*ƂG3`3O|dtA"7[ծ5'ڌp!0}}KzU :e6Zئw[=r{騬[fkK*ª'Z4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV/XӒ?iS?_*T_+njA#p[?b8~)2W?x±t{C,EkZtQEQEQEQEQEQEQEQEqg^+GmZՓ vխ@s} sHu lDy`e(k֧EM?UHf28q@*FW[\P_Jh(oKHvI4E+ok '$*}Uku\[Jr*՝"{alUUF] 9,|-u6{H6I>dL8oc]He,N't%by; 3hҴtDk c W9p;-A'V1ϩE,loZ+#mCs0>g꧃-u2f_N| Gk:hZ&G8!N ;Q$d4bO5ݼV}{ %9R,c+w=N8Gu\F$(cTev<8)]otOjz mn%Oqֵ l-m\IoqV4o[ӛTҥA+%g˕Hdo`2;Q|t5Tlr.ߧ޺*A\9 VW?x±hIQEQEQEQEQEQEQEQE1xqW%ht5G*$^y~2Gmj>1bũFHQc;`Gv$rEM: Ư  w xvB9$Ջ [+}:1kh?@=PdP_JkJ`i]mQEiiG{ Gwia:SS]KIu0#rZ/EחW4#=]C+ FA_h߇<= q\Dܻ*<+e1^e9DU7$cϠ'>UE 8j9EKC.|)k5oq xdF:g)wMN=FWWIn!f 2NJ;S9o&eue1j٢j/#Am?5{M`\gwCr p9*=SEְZ"\&.ZFQ^hN$nPr9 rc}|S!ܻOqU ^l7[a?S@>i?;,Cl=۝Zb2Wh?¼[yeEIv =Ss4}/~(QW?SG٢hs4}/~(QW?SG٢hs4}/~(QW?SG٢hs4}/~(QW?SG٢hs4}/~(QW?SG٢hs4}/~(QW?SG٢hs4}/~(QW?SG٢hs4}/~(Vf._޺/E?bH*?ioS?;Eٿvcnϗs׺τd̗7q["6XC]L=Xv貮2@i(WcA#Œ'' G- mky+yc'z88i,͇..~η5p3 INB@vyLPIhkI= ՜>D cQXFN;⺟jkfYŸUPq"L@]ZȎX#m889$($JuVirs:Y|'pcF"iFKB#1VJD:VіpT:\ծ'2c1c(G i NOް5<lSszEm.|Xg_2 j0EmϤK%ZKy($JDymcϡĨ<#**}F;FBglbYF|9mq5τ!ųhl^*>6JaA3cY^Ug 2gY# 7Es;l.-} hչ{wD$MNsS,haUF@Ӷcf5gsb[Sj̰""I(;R}'($I8&g?f#ܐw7I#J܇_j^(uXBPQ#[3:$0á"Ho pGB=:ڤڛ\%vi[$;rhbS1gkkqso|$4Nc{`S0$HqH@`A0񇄒ͷTk5L^F+Aǵszt;GgEt HX+*8"HE5Q` #8yqnbʹc$'ހUv7xٍzgxtjHʟM[E{E\q|ysqR1خ)2W?x±t{C,EkZtQEQEQEKUլ]=D]1g`,Ifޮ9a ƍD7F``p ecN{H1ЩD#ӽn-VPp-P]_-a yo0Pi 7p*]XM"+ǼLYS ~U[۝|?α,E% {d;r:9k V%ܠtǦhVq:n4Վ?>K-E'˱H,e`ZUV;V(7XY3lPIz]:f-dipvKgx 늯e%{5GvʪQO4qMnG-HZ$K7 gu@d 2Fx.]׮|'xw:nO06rB2 cK[x-x@ T46ĖP(h"]N3D`<w'{?{J$nVY#+y=տigkڥV靱DTdrMCvͽ%͂hk# A A gƿ_X^=_Q2ٲ B`V F>LU$я]iV ņRdt8et`Adw$4y]*aku.x'ӊ3jz&ws!,-*EHn7&ό/c!(Vo N":g;O5[m4:eR!S AQZuq`ѽ̲4r"v6F1zb97LVi0S[ifAl_j ѯyIN1N=5<&dPBL[~Hp{Z(kjtP5T[j5w-.֎Wb=w$`m gƿ_W=&Lڻ4KA4$Fz*0AR|:1aT]2~.kηRy=6,I6Ŗ@SX՛amn&yKHվO(w6HR`rG+{EL?>tی}2 r <Ү&6 b/?J{ek[[#V>a9Tfڑde[?p&9z$"l/#tCQ]np@<֔xc@fhz`-Hgn1(ޛ ?$pXjMudI67 G7 Ips^gciۋ{+X-"8c^Cҵ //4Y4SIfR3lǞ\_j:.B[u=V^١Nd dpy^+FJ `Y?Rm H}OM&ov38ϥhP3Qu$c*IݧA$(hkopZ†Eyrs鑓zVAweiyk jMprq@ծ5KFbb1%),k+n,ZM,іc<#Fdžt.KYmIcq%L޲Kvq:=N[ lf-emt J<,4-jIsc [&cN|{ v-;{q%\*ǵ]_;|ӓZJ={L}G8'JL2kQ4CG lFȃcq vI>ؠ-M}hm~'.?tv5Tҭc֧Օ? fX=X]((((((((((((?jiv) F}Tu|UaeTdTǏ0cеׯ'im#1 ၊ڤ:םxszIK9@?uuՇ#ڷaQG6RE=G@mP2[3]Oqӧjk- $]AOǽtUO gc+Z+ Ѷkס*NC^ס*¿:]E}e19$eKpO[ֵm4o=ZF<ROMq(g__Z.5vU * Y V<\/*O xF$oBGyC Ӭȯה?:(#<5Y_u_'(OPwm<%W6ڽN ( Fhm#sOh;4VF_v_^^sv_^^]_Kҟ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( >*M2w\ņ=)|hηyS] \Ku\[Bϧ_oƻ?gv3eN^#]z ~|+s9c1X u^m> gc+Z+ɬie6G& =1jM]N46>(HY7A+I{&3H<_L~҅/H09拯Zˤj\<6:f\08U|B4(bw(~Xu*~UxF:cM\x5 >O4v26 9 <֔+>WQu.5QN!)Hy♿ح `fl0˧k> J9t6r.~F NG͉X+;!E#2`1ON 5"4 C4bgh#yXu?gz[R(MĩeF3pk$xWQMNӓUi:ܻ54!'q8Ə}>k}nuIsųq!8Gx{!w?toou4sCacL Nq~N·Zz ^K[BU@0^j֙ox* 嶷,@V8\gڜoqSOS ҴF/,;ñr9YDh@W%% zk3Mn.k@,)3_"𦣩i^]N[! G1]<99f m*Mn-=Q%_*h<ÿ*v9o^;HYbI0]Clqi퐧h'5|=pVq|&73>`NH'sS{Mpoٴ*ژ '._9 qӭfiZyyZ bHm0g+_§֫wYݽpG=Ccm'֗+F8>7SK9`K2ڮ %l@ o[f6٥&t)TaKUWr P?SMƺ ӹ&Tv**19+`²ĭ\6ΰ;uw$3BA䎵Ǘp19g<عtųP1nw.wUjJ}\5$[h..Bfx `;}^ox6r7v!a9#RMˣi7XKx uIbIcU.|C7XX]ROqܒO$1=1L4;I53l܅r ~ ^i[iwkdA|Wd 9Qd/47ֿi qt (2\`8g#[j`Ӯf/L̲A9$P9I> Kspᷫи?w:@Oi׫g5Ip̪BtB{gjYӜ#ޑrY~5|9K%դo+Mo;]U=p0QW;bP&%rI)}$`FxSҦi_cgL.u ҳ[Fl%͌Mc\\iqW-"]G:X6F8H=H㌀^xQpn] }㚃[;jPPevoAC0im Z97%ڨ@=v{~-ASіQ&;/#4}msusm [YuB FU!{TBP;a_ oy%&#,䨘ANF:cOOW `(V~ZC쿽ټʹ\8-}_;t~b?h^!f?+4rm;2ՙR xuT3/VGC$iPhMųY+ve, Jqx Ex4Yw3I+FXjrt ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( >*M2w\'PN@kJ_^U/C J[軪O]Fq[軪 ?V?ooMi=is?+ZA\9 V'AEP\w~yp dcVKRO+6 ϋ|3eճKk$c@Öto.]܃YIvm ڢ+"]=s?SoҘ((3ß++N<9"^P(3K_֝fiӠ( ?CUS,o;o]j:()7ݠ?y\AZ+ u~ڧz5yڧz5yu/SJ (,wZXEA{p?J`hqy?f-:tӖoWjn1 =/X%Ԛ=ΗTv}·)3-opZ_.?JBeNIʞfk X͒F!º! 8z㷼O& H8S3;s%Op-eLٓSl疛 [5&s(pI^=Zt_-ƕ3B{wup6TS2)9ş`s+$#{K*WRM75}O+#Y[$<3Qtu #!@k;Zac j:ĆCn2@Mc:6f&RDF8%rN@-dI4F$!;Cz3\֔]X JXe*vXR6Lܦ<Ѳ:\pG)B0[AvN7)Vg6r[* I>k7)4KHMf}'aYMPd}:f % _&C@Fic"87J)?v}J#[ҹ%? w[t纾g#S*$  u^URH#u][+2IO, V" a>]'E~/qX&lA#p[?b8~A\9 VW?x±hIQEW|R.oIAVHWe,~zxI'J쐽l4 гo=G'Bί-b@_ :ՋWEK36m?{3UqqlJ+3^t_iQ@Q@_H(Zu@@Q@_u_'3K_֝QEi7Jmzyg*FWEPHvxߍwixG{ ^Hë6>kѫ~>kѫ˫IzSQEc$(y"o`ރw1w2As*[F,A;SYSeik|k;KX,{'r2`oWUkI(-k\@.n@"iluxM"+k%u.e1 '<`Eg|\>rw-"eLǘCeڢku FLW˪jKE Te$2=8H7m-۫V4Gb1:様}N9XGhc`v8 "e^i]cI3ÚsGjgow%䋇% e!0U+vJ#ZhGMo% rv V봐:g-;J@&] RTO#HdUS;u XfK{׍!/20T%p7a5=R Meb7]Wp@T +B; 3χ.1N=cd'2IǨe1ڜ  $g3İ\..ewWBu>oX{j >ǥXBoAm{(>%?Vy`#p~ z W{"!v+<Ѽ)P8t-F}/Gnv|'8AlGA9:RNזom3>hڀ7)L^w'o7c5j[ JmJOMc#c*v8OOi!'{=h{l@!?^21@ks{sg6"u*@9 T ZfsFԃ=:ue<Ljćv{M@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ekVG5CA+Vj)=7 /N}uQE sDۤۑ\|ޕ/מ8PF䷲HFhݻspIWoMy!__ DŦ#F+7c\&qR EўFjң2T[;dMU>ܮgc+Z>h9kBPh9h}Tb\!,6yu1kc!5s7"xWB=BYw0.1^? }t7G!:ﮝ{AG]!:ﮝꦣ_HM5J 3$W#_} +']ӿ!뾺w?~? }t7G!:ﮝGyC ӭ]/6vM&oDX\H*g_[']ӿ!sWANC? }t7@f!oWI:մ{\dX\%O'hWNC讃wNtn)x7Jmzyoh!V.vZMlI}$_}m[ctl?ȴQ\kѫ~kѫ˫IzSQEaEr5@I5]UTq$q5CZ[5 .9GSNLHr#Gr*\oI4:[mٶtb)W'8_%)eDw)v¹O;Λ&m$u?O Mf/)-eyk*$ bHݎy;]^{qy5_O}4v!l9$t#kv/#oʭG1|r'cSO<6дʑD,0Uܚwi|Q{Z[G/e@BO5d> Đi6 iO mo` W4GiiOa"-¬Ȩ?134g<Rx8I*.O=GOZLcC*PFp?*ky%-.-kmpۜIA2gc JkJ+Qi:\\k7 댐S{n=s=#_:={$(d qf3tGW;ڎyᶅT$g$6喣q{~|NˉbC=js:_^(kIm,JǷfA 8/"1Lp+}JdŜ71͸S4@pHrמ͵Ԅn-fͧ.5Wa NgYwp pzi= ɨܲjO6cת1yZv< hIHb#*瓸Vk|JM.VH}eի((((((((((((((((((uXiظSrrQR ҬQOc;Egn n>aI߈'gvx)rG& {UH5uC! bcJr:'J̿߃akyO}J&a˞]@=ԚXuiu-u9'^}%blc\&q`:R =!V?"#ֲ4{M~yoxHl}>h 5'}֣im)$Rhr{<#ր9|5#x*h4(\Zb咙\Rk3\z?󟙼=+#ր9?Ru+j >i% yZ\G$BA8 /=kҮ.{]o<,*GW7>r ֍nn2Y IFGR.n/4[L7S[DP* .##ёFG }b{-rEm(vU9Y# )Jc#ր24B )on1Üd`}\ёFGIiFp6y #FGs ifP,DvBRL[8szֺ*2=h O_jJ-¥곍`Xo_5}p fkq5I{ݷt|Z2=hޯyw"Ǹ/#v93oG=TXD΄*eN>`05zs M,mum-)P:ʑT VZۢ HtUTx Rk3w%WXX0 p$ `a[DZ +G.$I&b1ր/{T f:`D@7 5[ @c-y_cK|_%ϋ{^dU9k4 q,2P(UXaMXùW>/{Tg=2_*QJUϋ{^dUk TQ`*g=2_*KU(׿/G|_%X k >/{Uj;zֶ2F$gK @?{Ӱ\OKQ:;t}V/.WWDk >/{U'uow?v_]]g=2_*KTaտ:;trtG?׿/R}V/.e|_%ϋ{^dUI[~>ëݗG+Dk >/{U'uow?v_]]g=2_*KTaտ:;trtG?׿/R}V/.e|_%ϋ{^dUI[~>ëݗG+Dk >/{U'uow?v_]]g=2_*KTaտbԮ!i ݢI#٘esG+>/{Tg=2_*?֟rI]l/?(`G‹X.G?׿/Va׿/G|_%X k >/{Uj,_KQE|_%ϋ{^dUZW>/{Tg=2_*QE?׿/VUϋ{^dUk TQ`*g=2_*KU(׿/G|_%X k >/{Uj,_KQE|_%ϋ{^dUZW>/{Tg=2_*QE|Vp' `4m⧢?b8nV?omC ((((((((((((((Ǽm#sOh;4V0F_=~? BI,U|=~?ѸέY8ȯVmGh5e5ɥ_I ƑS+\*f\۝mAmŜmclj-Alo l1skxzBNm4>~ם>(BNK-W[V=.eǦaWuK.M4oV $Kc;1|rjz(‹Iip2+ʍer.c@e˹QyZT;}cG?-他˻k7BhbXAR8 #S_[!gy9S2v\8ut5KzO+JҾ[ :qu=kV((,׮8?e=Cc!C[_tIS3=*XRx,G 䊩Y^Y^=Q)l $q}tΩ ŜV np)B0e; FVv2#fFL0d(rc&3!w;O40c2Xv,p~`HxNA-$q K7'5Jvv֗6}:ii<1$Ee6"\Ny[-i^Wp2cQ@Q@Q@Q@Q@Q@Q@Q@cAt|Is\B@C¨%ճX֩?q0?^.~Re ,P: 9 u"o: M.ﮬla_:HW2S,zLcHO,{Xf@NOl.^8Y(5@KVYbdi^@;!`!Jw[A A!ys,vԴks+R-,bD'˹Od$Zȱ>VQ$1Kyo xݶ4 N_Z\Kk'd*K >j / ivqyj1pv/E3{3/Cr7ّ]́I?x~aId`KK b;CC%q1F#A#V֒Ir[˗L1 S#V_j7wdCYU@T ȹ'ׁ@a;RK9rd16blԷ$lM1+d8V ]/AH>۶2DZ76\ g|=a_Eut#h0IT2,Mω-me&0$8,I#/i엢w2 "1m@C1NA |-m V\ҥiaR1 :V"᥸Vx2?(]sq4:_-Hιyfs2k( XpvvH | _RGMbUmA25g8fFx AXbKD eݻ8<jY!gܘ㻞/3F:x66W,d,f6b'% 0994Z(EPQ#p[u?b8nIQEdQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@=o?+E6W0Nh]IRTAeܤd{ ;+#YQ+{3?e=X&Ka,EpFNY՚(((((ܴh v/ӑC?J;zֶ2F$gK @?{ yW!)~ëݗGuowBʼGyA[":;t}V/.H.?+u|CQ^V?v_]aտ < yW!)~ëݗGuow贂O*_?EUn_e[~- ʼGyA[":;t}V/.H.?+u|CQ^V?v_]aտ < yW!)~ëݗGuow贂O*_?EUn_e[~- ʼGyA[":;t}V/.H.?+u|CTQY MJ)c=IëݗQZũ\BEĒG1˟0]NXaXffc,}M'F㔖H4Ra}WC?4Bj*+yx, A<%I9ַc'6Y5F㔖H4Ra}WC?h.MEaͫ^4qF<,ISxaOSo.tW?~Zm^@EU7zr?((K}Nof|EH1bS隗2O ^1Vb$̓_EْR%db(̓_E.($Gdb(atIEG'/?k+9S m!I=d޴r-QP]@<3?iْRXl.IEG'/??$G+ J*??)y|Q'/?9X]QQfIAK/"?)y|Q蒊2O ^1fIAK/"VDU}Zn:KiRAU@U1X uXF+7ԙQVHQEQEQEQEQEQEQEQEQEQEQEQEQE6Qo?+E{_#AJk{ ;+#YP (5 |]M{•DlʎUCKRy ml4c▃7ZWr/"m`2(n[Hq_>T>4- w3õUa邨 xx^QIgG#1*q €𣎹4jneGt{wE$8n-< _sFXempQ3l]W/dO˓.<)\AX{ m$dPk/Fi @S~ap98h7I5 fxU3nC_%$6ĦifRb2rO&C_% p{QEhfQEQEQEQEQEQEQEQEQEZi&r i >{VcZzLh%xWĺFWEK[I*@2HԊ۷9Oc,t7L{|#\_OԱI3[ ^j'E!l~s^xjgͥ+):zؕ` gzu?5wJa,berI RqN(]` ;&\oрQ>=]LH D52IkBbd15Zo S$Noj:$I>Ȅ] ⮶2xF5r$o9ۄsـ}UP\hZͽ,ZG7h\pI z?is6\I[OiQWlU>nU͹oM% ~rx~ub>]$?d\mAP^7|PoP= ¯uhXg )Cݍ+vqm|]j__2}粙"( )y(Qoq7ڊ-Q"° w׼0urb>uc+v<twQIx^KJ{DS0r6Xncp/ ]bT 6+ fH7`bG;##LVbhEՄڄw{8|B#D ={֧E_Ϊ꒫h0?`4N}w_Ω_ѩSyt?rw~-֒YAme1eXۿ$z)9ˮ^QϪ59In^ܬjO?:6T㯮 UoI=2-CMr|#b\ eBLg o`IcxeUݕ, \"†YQg2)dԙ0v>(#*Hx>TX]EZ6H1|8:aoX.{r 'ͷ~NܜUŚfA'ТQnh?*P)GV?om M㭺u&AEUQEQEQEQEQEQEQEQEQEQEQEQEQExwixG{ ^Hë:?RAJkF?(MB(((((ܴh v/ӑC?JʼGyA["yA["*_?EOEab*_?EUn.Un< =]< yW!*z( yW!(?+u|CTQv ?+u|CQ^V,A^VʼSEXʼGyA["yA["*_?EOEab*_?EETԮ,rX=SԚEV.'s~u,0 331ǖ>*7Pn[i3rpC/$4{/9V(bL罗?A H䑷c8SQ@ͧN9ؾ!/NNa4aoo.ooVe}> ,"aK:߳M۶cpg\sexݨh .Υ1[Vl?Xt}|m-XY}>6n_ύQvE_ύmm]_mmE[EadVD[#FDHܿ*I$ڬE *:۬IH#ѣRy z/憎qin)+tVg ֗W_]W2'tVg ֗W_]9YEfkK@/.i{}ẼtVg ֗W_]9YEfkK@/.i{}ẼtVg ֗W_]9YEfkK@/.i{}ẼtVg ֗W_]9YEfkK@/.i{}ẼtVg ֗W_]9YEfkK@/.i{}ẼtVg ֗W_]9YEfkK@/.i{}ẼtVg ֗W_]9Y>6R$64,3gE{X_#7&c?u~?y5>n#;cQU冝'۝UG&,wu&써ݣ<Z<ZN.eJ863;yg+n0VPX}aF071x9lkshkЋBYo2}ᡁO% ] 2(2}Y642p4JYgB<EshkH[Uk°ka2uۑi2o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡3R)N9F>_9&7۸cc:w8soSzݱH]ʑ22 ~n߮iPsoݾLn-p:tqH$p8 WOz{v2qw*G(ʰ+NA~yͿv1#ӿGEJ g Y _?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj(o?֏?֡&hj-O߈D tmQ9x6lpP-Ǯ3!\ggWapnmM昶&9m9ck̼?jWΓqtطkprP_7 9}$kz/W9WMR~bǨn#Op@8t:u2١KWJp$r6ʰ~~]ijEd<;? ʡM1Ըd _jk):v0XT],UCmRO9P'M}!X$9TSԁ?7t_h bQ-5YIPTVJ2{5a72=ɰ" p=*폇c;In.'!EY.y#vT8V>l5НBX cf! Tm9Ӽ5S,:taRFWޟ,]k.$_̸}3'u4:.s 7tP~S-5,ekQ@o)r.UG߱G#?mأAtU>Ӽ gdeLnܹʤmFU,ud9dEj*y4=%K 4I8OG߱G,EO&C-F3 @IdibYZ@o({Gmr.UG߱G#?mأAtU]Ay,X˞MH,c 1AtGEZ{Gm=69dEZ*#?mأQ *Vm~h bYV@o({Gmr.UG߱G#?mأAtU=6?m~ kQ@o(]h_h bG߱G,EZ{Gm=69dEZ*#?mأQ *Vm~h bYV@o({Gmr.UG߱G#?mأAtU=6?m~ kQ@o(]h_h bG߱G,EZ{Gm=69dEZ*#?mأQ *Vm~h bYV@o({Gmr.UG߱G#?mأAtU=6?m~ kQ@o(]h_h bG߱G,EZ{Gm=69dEZ*#?mأQ *Vm~h bYV@o({Gmr.UG߱G#?mأAtU=6?m~ kQ@o(]h_h bG߱G,EZ{Gm=69dEZ*#?mأQ *Vm~h bYV@o({Gmr.gNK-LLH# o=6?m~;H.UG߱G#?mإ <1^QatE J~#v?64W9~7~>k6? u*E OM0P U|#ʻoOZ?i{].aܹ@ {dxk5)˂/" 8eJ>]P4xZ(]o}q<[8FYwzߩ_qJ䍴k}: mKGķspLot$`DET Ic xyn$htd82n8nAyiRh̤MI(?9N[Xᎃ6W@|=,vgf¸yrpcy7Hl-* 3Ni"8˳mՉ'{5:}>-hAf,qM$$^m)彎Wt2ұ ,) NkЈ@8KyQM>c̶ n EfT fq+ƥ>>7h" UTg;H ح8tbOycK_oe 6܃(ϦGCuj<Y"DQ%D(POlP<_&P"4l-m*n",%;JOeI:2eAȁXJR+@8z@] r j֚ojE![o,^7Rw/ 0s1xPK𤗖wQ@c1˼v8o@=FhX͋jJ.ίm p̈5$|P7Av>Eś,x"Yq!q1ٖA9FzPAllAi$?DGרķoՁm/ٌ-; t{ղ|:tڼp89@{_bw:q]]NC>_2.2}ekzjkۙIp pB+1Pw ?XK4IE1˳=q"QXD`2ЃUNMR]D+bXK3)$:Xp=*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExwixG{ ^Hë6>kѫ~>kѫ˫IzSQEaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPxG{ Gwia:SoSֽSֽė?QYQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExwixG{ ^Hë6>kѫ~>kѫ˫IzSQEaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPxG{ Gwia:So 6:1ףWx g9T^9D >zM>W]R^U+ #M}_#M}_cNTnX_o?o?rvi~W(i~W(}VF@OGF@OG;ݢ4ߕ ?4ߕ 9`F>Q>Q*7h/77Žw9QEadi+di+sʍ+ #M}_#M}_TnX_o?o?rvi~W(i~W(}VF@OGF@OG;ݢ4ߕ ?4ߕ 9`F>Q>Q*7h/77Žw9QEadi+di+sʍ+ #M}_#M}_TnX_o?o?rvi~W(i~W(}VF@OGF@OG;ݢ4ߕ ?4ߕ 9`F>Q>Q*7h/77Žw9QEadi+di+sʍ+ #M}_#M}_TnX_o?o?rvi~W(i~W(}VF@OGF@OG;ݢ4ߕ ?4ߕ 9`F>Q>Q*7h/77Žw9QEadi+di+sʍ+ #M}_#M}_TnX_o?o?rvi~W(i~W(}VF@OGF@OG;ݢ4ߕ ?4ߕ 9`F>Q>Q*7h/77Žw9QEadi+di+sʍ+ #M}_#M}_TnX_o?o?rvi~W(i~W(}VF@OGF@OG;ݢ4ߕ ?4ߕ 9`F>Q>Q*7h/77Žw9QEadi+di+sʍ+ #M}_#M}_Ty׍?H(Ѯp?#x?ۢ*%T`o $rn|=~?%@w_ W[^F#64QEbjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEhUC1x+4-]HjRiV/~ate~3q^'"wvf-+=FX$y<Ő/|3n<ڃ^oַ$w>\V3"E*AK>³ H7Դ+Ǐ5źWq@!ԡ]Jf,nΌf 'ʻNxg1=لhaxPԼƒS.۩\Ǒ:Ě>.}&64*dc0v&ML<;v`O8B!BqhFՄlBQtMO0']Շٶ][hkmaҌy͖ $JdXQ> \!B!#˨j'gEQ BfjI L&t:( nM`k> h$\!B!#k, 21T^GӡSU:UU{g;zИz^Šu'z=NOCk&K/&#XGagWbL$t:3@pdڋ+ha51)۟XJ=Õ[70|f-ۊTO#k.7Ѱ/1PJ.ցD!BNfsUupY1m~q%QNž+YK݇k n k.Z>oy%uCy_F\n$SFo4F-ѲHyn{5vm^?c[>cY_{<_p͍ZFry)sd<>$B3ؾB!Ǒ-l/S=ǧq{%]Ś)w*vgP66Am#sK/@Dx33ؤ5ԺˉܡsqՒ9$q:ٹc'oLj<== p9>t>MW ,ST:eyd%Y9:ٴi+++Cn3hWYQؼv l▥_esWrBMacϸS¤\Ҭlmlٶ2?|| @~(<3H;^O:v?gO'Ŭ'Ծ'U5tζV>l+EIOVo`k+>Ǔ̞Wg OHu5x{9k,i?Z\L%*N̼9q:ٽԢ-5vxwBٴ+&5΀={xwa|ǖ] !Br==$&XH3@Sijn_M]CEeJq.)9c8C>gVq C;s{ o2<:d/O?45-.|264o6rK#Sⶫs 5#;FU!lI{80pE7$+絏3KY?oj'9}=1bNuz?<*Nz,:;=k4-|[K.wgٙU㎧ߧm˯:湶_fzn*Np~ xh1^ȢR3O/H]_YDZ$[ozOɎkϟ|Ru9T9!}-ě(7pW/,oO>5kdCS2™i4lZ-Ӿ/I\r"ig`l:f @Q|x\.V ՟NP8uW|8E㽧K;I/۾S̚7r~9P8#>^}ϼFRMe”{rsOo.Voܙ#ngĿ1)v3h8;kJ`J.&B12,&=cI7sx4D|Dqس0G~9d'LoCMsnF?槁ǯ8o>ϼi;@]}s_npPM0q*& 1 xmn.^\F^彝qkfOGQeEO`PKRzm[uYz=6ֻ1Y*εԡ?tD(f> f?r(28UلoFUh6r}99Xy~Th/>OGx64WJj}z?`ÍהeLªj_xyg)H1Xu>Q`T'wRrE½ƣ9B`K<>>OsÃەB!I1 F[;.eFo0Rd-$*4AvjF|ΰ?K<5\OWxgyPPbqpUߚϲumVf̝ 4~V˘pq`DNJ-M\1++8e4c43i$lǶo/&.!XWߝոKSتT15+6s@&ceg0asYx|w0nt}sskj$wj?ߕgM({qĜR,q 59`p$>xnc#I9`Ŷf.6:*22>.vqiYW|gTO@ASV!B!bGo0ëQn, KλɂŭٶG[p{5Z]z &S~myNznorz.Xp;zJQ=/Tɢɹ\q:ر}'гyf q$|.nJmLj͵<\?k!UYy;+pVy.^wgvs K~h),=M5adP0?:Sɜu~TTv<Ɋ?l#ܺ=e*YG҄t~~w:x~tl/_~2f8i86x%c%}/ݛXVf΍릡WR[EpuRy=6g1wElNMoƔ6E4 !B18mb2R®}tz(=60pA.Z[z yٞLTf۱c'9y']Cӕf،A7`M!+# %QG4vp$Rw'>)Og=u:q\z fc05Y!𡑘;i4FcKJrJ*MA_zo0x:9r6\zsII4=5 Wez [4LΣ5сBQ KH&=5 S\B,\8[q [W'nވ9!4,&]#B!Fi^t;T͖uG>Pz0t,K2zUQ%{waH TD9>mCBY TUN*jAQҙUP-)-W߅^oDU׏1bbN7ә`^_Q0E~Ynk۰$sݗZ[(j,o0` LV~ݣJBrJ놫PC@nE3mL&K1bKqzTUE@Й,D$,\RRL8 + zYB!#CQcL 5xP zZOr?ϮLgx|Y9)}'$/C06,(88zhinf͇r'GbRB!"ؑ{SٹsWT;v(']g >P2<}q碡A:;]1$'=Ɉ'!B!DM-qw9$$;057r%Y=; B!8uM X6#`l~-2dO%#> B!| 6]X!B!8%&`1ƴ4 !B!#A 6mDB!B!FZl.$B!Bb !B!8H2,B!#ɰB!BS$B!B!N9 !B!86n_ų.fu{LwB!@@D|/OP!BJpj.."++bV3ֿ(FI,x$ŤƵO|inB>mz_}q}ΉLbm_fJΙ]Ƙ<&k`٪8CW1z,oJ2/B!N1NK{r豿 D|Ksx 3D(B!8QFvos9 '!l9_Gzh=<{S4Lڼb>|\\2p4Whyoc3z7oERG}n?9vsEܿٽc==h]v #`xy7˴s~cۻޤgSOɬ mtn_=KǑ_zg͌Cg+p8|bkQmfZn|nk;w52g?gzgu۶'/vp},s>Kj玿=ۼ!'P!omFl&Ob`cu$ ڵo?O墆mXB!BD`xpޱst;,kSһ87%a>y5w^Ō 3̙,:4˷Χw}1~S-gL{w?YR_CksFZ'SXu?Jfa0e0Mar쀢êvh?p/<~/{"?)O7D3f?Cz)~[1i %3;gs8Vf3˘nœQ,oWIVY%A=C'bk)2͘3gΫ14!B!bkPm<:7VO'd]4b >gRI5~ D!aRwmgx1,D~RH JMk↓{)o].+GƄ&:+yq3vEgEݽIZn3_a08~xMp˹?qɭAÞ5YzXjg')~FH@Ij.^|c*A-c4,!B!ba҆eM71Uc?ɕ>bS[[܁-[ ۃ͡ۆ|.5Qgov|PIM*i0|8R4#ёTq%w?>پNea{#W}L51a!K?ԼA Ӱ3-=_GP߫^-tƒ0]!B2k.ypy4x~S6Z-b._;aSgFTƩ`Q{s2ypA[ίq='}:sݯ`r8xwcS&n,ӂ!FR~-5m«~YgkDbnb.?cw>h:Zw*)64:q6n۞rWX!Bb#؍hmٌ3?xyߡ4VBf$2ǹ)\5s obU5ƅ(Zߖ''3ue=oV@@X[rq&z ,: gPėr͌#EQ ={6:8 z}wUVVErr2{᭷rzY`ATR ??DmmmD瓜z4 EQ|?(1vomp8} IDAT8N\nxxπD%իWSUUF*ƍsΥdND=9|QNg{o0cEQhoogر X(BQ2<ԡ\lI9gʪ7(^Eݖ$'?2 P7ig~@iuwNzzcl6cz-Ʉlj -[Fmm-]w( ?1ɰ Ջ$ijj"--P[[ˬYI=իc Ǵy<%%%?g(R}vfA1$4ڰ(dyHyRhWUUng?YD?&#]Cq2~RQQAUw~ l6F6p!A'ýl G{3vXeoď<{LMğ}cZP%?؊?J20PJƑi|>4M}](V=i._Q@hd2a2ɰyXϟLGD+={8ǵ#Gx>Tb*555=Znn_CMMM5w\Fca+W[nn.~H۰{ *zDZ< ir0ap Xlv=/gyfdxq rgddGiiiRSSرcinnlkk#33TUb`IHHtqN!! uȖSoS\ZL*Y4n3X& (+|84$Npn&ڞ53Gz=zH~t@rm'ېN#55.4MȂRUχ9rAO6GldAu4 :|.qi^ -O+w͢Խ222CYo  #_'2iҤ˨Jee%@Tbb .{~zt:݈ !BlҊNwt|z! BLE:Z>| ߄b8x"Ru~9two!ԗpA72Ï#8 ?h0LTU?'㐼ʟt̤2\jjO>1p\$p86\UUEWWp}|ppL6Gy9oۺ sT\N|^huj5*ę̨UI2< |>G8Hc4>+++ٿ?ǏvرcG+!|ttt^~\r0́!Ԓ !i1Mڷw$: A)NG]ت/XO]V n%:1<4{xvXjzpy?TQ"11tL:˅n`0`24 Ikk+IϰbztL&{2;wp80ǏXLɭ?)NCN5ѿyx,xh NN_Wl.X0*q&QEOũ*=QCAp>w;}3f .k].yyyTWWi&L, z &( قEhmmwBNLgV'C_y?c98C 4'Mkrq&<@ܢ3ЧdjߡGti}z ~Χi8nl$n-[yo"XPFzSt:9p sMFFŁ$1Z4Mcǎ|>N:N_|p)))|ryyy=zTUp`Q$pݔu5B%šu;Zzz2e cH ^gQlg0d5hQ_ւ9i`NGof5O&c14_(޺~۶IUI@ 9[L>=:+Xʏ Y߲kOt{e[q͡0WVF5=yJG`1|WVVw^pݨʤIؿ?]]]=F$%%Gee%N\ۇ(!?}%BJlg63=|!+BM3[P:>3OƂt|}&?os0zdw;ן(GPڵ*pݬ]z8ƍ3f Q9fzj ]d21g"'++F4MbAgg'455®]2eJzwp4b=\;Dyvg0jIp\abbWv9cZ;kN~{ jL}rS}YkLxlsg Ytyvvˈ%±&#Z! s8̙Cbb"l۶:4M#'''cZOY.jnnvF]]cǎ5p:h4x=B!Hl- y7 g=H'/\-rVڿezHx=g؇rr/_ŃB|۶m[nر@䳘z^كW_=gIe߾}۷l,X*um6n7SN\ٌdpx\ ^墮χ` ;;-[ tvvp8HLLvga?ڻǺWHڽN'c2 zUG=Nm5Sy !>keџ~Ģ8,n~pkp*mxZ>\B49O|NZ?b++V=bP0G&3D?nhh13HNNٌbAӑ%<==VbîB1&ތ]:$?b;r θ{PUpqy\4_Yw% ˍw`i L%z=n_^^ڵkWE2iMM vUUim9筷b…Dv=N;~GR{n*++),,ˆo#VXXb(ތF#FcK>jii 7HFӑL]]^xC@SaF=fׯu8Xs9'$bpBVX ٷo_~p&N8#99dyw0 3͆ Hb%%%6m4dz&'Њh0鑊/v_XX@}C,i8].wwOUM]uhv+NZ&{.궿÷\هΚN'm oJii,,᢫J(9vp9>7_|p6Qxߜ.0J>'.wMze뱧|ggUV`>e׳jժ@otfud8--LTUet)Qs;;;fp:ō| B!NM1Mk:q&> ə:]`h40b qG>ehУ*iLǓ[)O|JgLգ⨷[iVG ȟz^ yyya{[-C_NMMMM&g}6}KJJ";;֭[ٽ{w9ڵkYpaD񧤤/UVQWW7uUU%11f, 0X&ٳgn:|>'Oh t_p8HNNzf½8"\9vdS]> z榽(DUz{w1 s:#gVZvv\DMw6֧aRd{VG%Pn~pů3ѝ4E*fKJ Nx3DڟLjh`귲2p`p1̞=;HOOgÊl6sgHee%!cSU1cpia0?qwl EQPU5prCC]]]xި\tf t2Ip(\SIeiiiJtBӁ&3ctyvMEE7os9jyj.LoA9fQ?f)yØ93Twqiv])L{$vvq)4׍dl94NNht1J(?VYf'0N:::?n)ŋ4i. OcƌUVE}gLbb"&2Xnll L̺ĉYv BD*I_?8,#ﮃC 6>-[cz]\=WEUT|* Rdxs>u?[f yyy^>i^I&EIOOg̙۷@|*qQT@Mիb=F[a,6 Xs-%%cƌ>ppi~zf̘1d?i![m+X4t,n_~!^wRp~|;seBqGcn4S~|No/FLk/=^:^!p8p"8V='³gfܸq477xL(OEE7n,x<ֆh |W'r88q:6A1h;Q[ǏȐi!1٤0 um&Iiv./ѣJh{QWGaDW6-0p{;iQ=g8DYY٠/|䑠( SNe$&&F|`$34p8p8tuufމpd8AѻeZ0ϵrSQQڵk1cF`RHx[ƥ[eN wM `g}R;Ǯ3 0fW=Bm+XRn͹\t&0 C^EG‘Gш ;v,mmm\.N'˗/eƍ 7o:'NfB[[Ho󲾉#/06q2f]":+W/|aq !v6 D..|28*3L@oIpFlbx4McÆ zf19U`( }>$''sa9BYYYTΥl.2vpzFj}ff&3g$--{*֭cڴi_NT G"8XVVeƍL&v]æ[֭ | 4Mb#hOp8yfJJJطoaGp\<6<{tyk2DZ!DLl|>_&MXn-vLV2>˭Mh> CzϰGCCQ 76Пz<`9>E0 >|ڐ3qGիWPQQcI㡫@"pm ̨h0R>%%ᠹ*n7SL!'''&͛7c2z=K|>L&niӦqߓYYYTWWc2X,nL&f6f~LK)+Ĩ3h!PLW3j{B!B٤3xck ֶ>1$ln/ _.0TX :N/Pn<^/:t5C]k8ᴴ44M[o LM2dzdt:g$%%%zꢭɓ'Guv 7 p8P9BSS1=ugƌm6n7v}أ_>F0`#Ur^/[ld2NCh4t:2e Q9xZIKK@cc#cǎnst-&}wSȏ;B 8N8)&Bˆ&,AK{q:QMS=\>,̙3@QQѐJv{1< Y%%%ݻ۷c0}~@ Yzu (0nܸϘkt^Z)!!!3}/&H{ϋ/ٴiS:Ӣ3zN{qȑu˃3QTTĸq=B:::,ZZZa̘12 |.8NjkkIJJ ~-Bˆ&=WMhkk`00uj~osNzpۊFqr:YuExPRRXKLLڐH,XÇ{C]IUUimme̛7/D{^%\›oyGQQшld4Za~=F=Μ93g+R.W!*YYYK]ll6c2830^uܸq|'L0!/y/Inn..3wz2K{{;MMMсfrxpX,VXb!..:1dggS\\1d2ȏB!NM#2t~~>M:.3NDB!B!Dl=Im6WjĂB!cܸq^9εwE$B©+8O2O'N8" !õk. ?޼yH%BQ`4 ;od"B!iaa"<'G82!B W}}=ׯgÆ CZoƌ̚5 cx> !B!O_ iSB?/VB!B1jE\ve&KϰB!BQFG蘄B!;^ϟd `aG#MӢE% GmY`ތ*&qr%אT_pd4ۗccB!B|NvV+V5dadyq]-mcY"> I?#2d9:3&o*G߉H!By&'LNhmmRy 3 6gߧ}..{sI8K$c_a31r}4x_O dOyI SOz?=8>_9y~>x=E՟`јe| ;* ࿥-t{MlQK%h,kKb&-j%^ Pc"{@ KQ ys朝Wy {߽H?1(Cp%,ۑCͬ1禮oU׷k㕘Ǵvn J3?c9.c`sQZtdU"h]@  ]NܼݤZ.C~3&̗`iHvN$Ϫzm8?Gñwp^]Snq{~1y2GqbYdW=ӹ!ô|͞0HJ7H\".8B>z-y>(yw:ƍʭLu3o=Y^VqcܛIrڙi2oH}s] g0bB,@ t%788XQ0e,<Ⱦ %yFCk;.n~+4zeSznIINd3j % ji$ڼ$n/Fti ZX@ @KAcp2HNV ɑiʜ kYc;<}8P YZȝmEW sC?LߐF}SKI!/ QYkL*V45LɵYEȉStu 8ȡܲc` ϟL$jI=9e&)f'\@ (ekF;|‹''|7B$SI b׼S܌e F4Es$FplƩCMyl], -@ xa f>4YĖqVv[zŌ? 䐋kk.5& 亦Ծvv0!^Q~# LTsϱe r$/ri L\RKE;6.̉5̄Z +êc'NmACh^?T"Ajg\7`--;b ֿG |Xy1Mĭ|Cj*rQYؖ5Sw5d>c]&2E@ ׷۔u7\6f"qDGCڵڵkR}έa,E.JV|.ЬTn3u a+F@FbTNT_VRן|&54UPÇ9vV{2Wic;L Aa믿,PݦMҾ~zR+ܒOr?]efpii@;&:yތ!6EIS_VỌjF͢м6|}S>K+1юg8[.ro"*1b#",@  FnunEfHX\0)ˤjf܍#HA5#=M)XLTЕ ]T=fi@ mpyfϞ] ,E ji Md?Pܒ](@ BҔ&V~~~/T@  6 LƉ'[@ 7%2,@ (5$&&ү_?= ~aq$FX@ Z€8z(c͚5舟!r @ BR1qD:D-ؾ};-@  %Q8Ws~)U?oPc7<_@ ?7nƆPLI  L*qp>Yxĩ9/IV6)R8Eyleqq ʖ 2 ϠJP&"ҥKL<ݻwS|bH  Gpr(s,_"2+L%I-.YK\fKi0s-4Cyq w ̝p"xfY^QmߥYiyvr.V!GQ֞Öv?|2j[鎓;[ DGG3p@J%ӦMٹEB2l`N&ܻ-m&E܎~tt(ĢL,Z/+na Ǻ3eHPS%owC#L)!}HL:َ6$n^`XwAe4vW#IU/ihyzp":CgXt^Ϣ80@i!0h!EI Ynp?guqy \ŵhtՅAYVC״)22$TuVK ~M11֖7x"Tιh`SIEZx5dsfX4!70YKzM)2 3}>+kdJ2%/:ORMߚsU'q2l5U|; p G9^sUF?a_,ܘ՗qIagb459}<# ބ㽵k#n~8U2uAPv$r0;ױ=;SX{-Gq U]CX%2T-16/3U˪[YtQQ94<IȨo/u@NIIIaOG yВ[2_Pl>iĄF!F4͕86echakDr-r2 966: jbiIu7u7}%އGpi2chՀ@r_q=Jz)2* K $" L51t̼8cܐE+\hS9m-`Q9KҶ 6JհO(D@ Snݻwe…-@ )ZDǾKu|晄 |+IAW^Eag \I6!ld7S5şVc{*˼q_u(dVm9/n/U?+n#3nNM^q=6h|xZ0oe( w݌'S`רs}ceW7$2 RG x͛ȑ#Yf1K$EV+5i<ª22MqX3)*B㜋HV}`v4#C5S|O!Q{,XvܬEYD<ĕXCZiB }5 o Fvl3vڡ:2v,2=s}B˄$i @ߔZv/9EN~6MԳ_gZO9XhQH j|evݻnb| ?̣PnԄ_VI (I&ޏPCwDvפb/&M s ȲO?6F`<_FPԒGs=L$k=&k C/egHJW lڴ@d2ӧO/nq.pkF76$OrY55R3V:r4 em 3x ɈŗJ2FͶ]vJjVSS;,tAGW]e1ێ u z[^kUy͍E r+\zW<);r7FIJB,{2mafsݕ雠GfeX6qGOЭ,72[䓘,ݻed\#-a9vaݤ3~ ~Fb*MCDRb&'|S֑e4\AaϨq!$_e˴-ݣcJ ;>age@PlpΟ?'>˗DGG[E022ƆjժѰaCڴiCN077/,?3#GDGGǏӱcnj{$::-P?%JݻhԨ[OtoٳgEBBHRօP144DP`aa+Wnݺhт-Z_bNJ.5jӧZ711!222^.]m۶y&K ^eX Aʕ+l۶{TBBϞ=ٳgzjѣSNuZu1F$I,]4ғСC0aJ͛PlݺwJTTjՊ#Fо}~|5?#~LQR`ƍ9rreDRRQQQp,e,,,:t(3f̠\rQ AIfᄆ9ԨQ֭[ceeE 4ʕ+ĉsOrOOOGGGjժUs eX ;ݝ9sp…, %..kj $I"99V̤r8Xv-Đ!C$U2qDBBB2#ST|_Sn]tttPT\~>]vgm۶B[/Çg|ܹsΌ3zjr}}}bcn<RRRHNN&>^S7DDDj*:G IDAToΞ={裏Q AIgcccTo 4;v6TV+lGɶm۷/V|WT/\۷oRտL&c֬Y,X`$JqvvÇL8GRRRHHH`ժUYԯ_ &229}4/Yc׮]j*#=&͛a;v,j˹e|ԩN8Ν;ӧϐOGG͛g_ٰaC'N(7o^d톄0`y)&Lȑ#Lbb"۷oR: ..qvbڴi4kLmQQQٓk-҄1 6rVZVcaa_|ݻTSRR:t(Æ ;ߊ0-e˰@ ƍ7ѣ;Kbb3!zppp*U(K P:t`̙zuֱjժVGѳgO.^Eׯq={2eвeK弼aϞ=8::ߴiӌAxx87oE"iʕ+ݛF155QիWY+W====llliӦA?~̒%KزeK򉉉,Z_~%OYŜ(; ˤ +իWܹsܦ CRRRŊ+r4i+;w?ك_F9SNqe̙ ###ߙDX(C犯I^c(1@ .^Hvo߾Oja^ʎ899uJЩSHLLjժi6m$vڕM'9/ʻ&sz www ?fƍja _9N͚5ټy3c=~GM9Q2ٹs';v<>OZ^b111l۶M+޽{ٶm;?ݻKK3\޽;;v|V{syȺ#NyIIq^ևv&<k@nWl5y_eZ.)c bٳgt=c… s&x"y5_Ŋ9qݺuq/sxyye|n׮ƶ}||2J7"0߸q۫_e|8p`mks CVkeAy)={`|́իӦMr-$$DbNLJel+Me̛7KjX3evA^\ #G@/booUے$ȋܕPYD9dIY%.oxHąh )g'WQ=lrei;l9q Pom\<7s'#%-#nxVWhwiWR48Zfԩׯ_ܨQB7~xk׎ZٳgY aòkHȎH/^ 99T*\\\h֬#GԺ-ԩS'ZLL oήܕas5!uni0)vCq=|G+eY׵F_Vd"ƛo=]xSbH<ϬLY+rO&/lNح >|ևAƍ֮ *iӦ\IľhC"_utYFiXq5XF{'3o>:׳(@2{8b vNYTHȐ'sxV7*U\V KZ]ae^:;tMn`tnr: UyL22$TuVK ~M11֖7x"Tιh`SIEZx5dsfX4!70YKzM)2 3}>+kJ2%/:ORMߚsU'q2lYU|. pW8.aQ-e}mm7ׁI mM$e.];`1ww`3kҍ4bm>bn[?d|YmƺQ'*®!T*햞)>t*#^Ly"&yg|-NlF^> G9^sUF?a_,ܘ՗qIagb459}<# ބ㽵k#n~8U2uAPv$r0;ױ=;SX{-Gq=f&1(+T}%WTU;3Vc}FTc -sҁ?!2)[K.D@P*={6YF"f9Ut6ڐ=&.]dX3GbMtڕ2efl޼#Fh Rre3x7믿RJ&O$ѣqQرcy&SL(_CZ~rؐtZsBPѡjժYV6m̚5PO?СC,=Bbb4X%dXs7xwsH>dUk1YTHDrLI`Ĕ4/R OБPTF!54d]N#QU/R,3p{rIa?h+& rDAˮPOI׆l .?Nı1r3̝ŭěl R,17YӀSc[|ZgS"eUmVc=zWC,]VFP*|x +%hnQ-&tU9#ʵe8m'yfܐк1J H||҈ ?}Cl3)8h+q>lː+ֈ2Z2vdjй_TKC]Lspcm,>l%&(Ǐ3>4pUaȞ{όσ ZsBPZɾ50ʰ?36lX) ԩS *dܮ(ܺ wu/[^<ܝx%)ëջX" ~u+ɦ:ھVlS{3qj|O{w5R0+dVm9/n/U?+n#3nNM^qɀ,n3kz e4J e>ZhoJ-y4LHQI,~oq~ 3w5@ /orެYBg|=z4V?3? 8eHMMYD ر#))Wv3yf~V\r֭,jòe2rn۶-%JĜhJb˖-ԬY9sp5bbbPTn:իǾ}n344renٕeńlٲNddd:HiDeؐ^yJJ Oȝ;w2Y[[~zF?m%qN4_ȑ#Y~}֭͛7˗8qB;uhذaBtDDDƹɓeƌ4S2brV>-ݣcJ ;>agqK"\HNNbN:jɓ' 8ooovܙk%fd.x e||<׮]8XbW\aȐ!=8LFv2d~)",bQ*NáY ;::qlbbž={[n}={,րi111VZ=j*pE.T}BA˖-θfFBQ/9Ḹ8r[OMM?} 8P}kz(Qh-N^nTə|cQUD,hMk3SJO}>Y8o۾@ 79w\M]vΝ;bhh5k֤~iӆ:`kk[144$..H %z'Nrk,[R%Νӳ\̙3t((s9ƍC>43]sr -D6߃$C9~xݻS~}$I"!!Ν;Ǻu8p^VT 8CCC͛lRmpȑ,={̵ q}ժUE*WIҥKX[[Sv<# J.j-[СC{󋡡!*Tr-/^_3w"鳴2!(7Ǘ H )B #na-&^c"q6R|f ޵0Amd3&Kφ~3.oxHąyYT8%܍+@@ ЈJرc|(QsMvERR-zf|y%%%e hтʕ+ZȈiӦ_"$h"x!{)nqbŊ֭[=ztU:ĉR Egi&wemMw[B!(HxnyAq.i:Vv-Df_tQ&JYuψ"೛ާjՏ8UA^Xs.hYWumg*_CCAaxAh=zڿpͼW7*a:u*ݯ_?5J7l%,DŽkxҒ8N_JԵQ`dU˯"0ʍY4?U42ƺIn4U 7.O\R}jIE9elgy"ǩVqO 31@ 39 wޠ>HL_zX|C3λ)%'\۔71CSxukz4,\y|:玓yfW\dTGgiΘeTHȲ:M|>ӹb_?L*m8|,kGt۷xhJɐ!*i^@P9x`>}$%d|1c;&sai޽{Z311aر9oݺ5cϳdɯ\믿2*wЁ{%BAjj*۶m>+=+EEE1aƌL6Bj!Dgs˷KfE?_3b#| w>y;=_{՜> ħ#*$' z?4*&qxTow1]O2Y'DA,?UZkVJZ[-(~jREJ $!!d_'d,&Lf5{9=wr{ykǓ|c;w1#w^cSrhhleR?kI= M |8 -m9,x0_n kkp3 ww0l}I㎐`*;<@uw7sW$5G#: F)4"li='INЗJ܏AtkXj*zj9c,Ȋ -OfuOm㮅kUɄe֢`jZccOG34w~6YbC@ 0s?VsμO5b af]zL)0@f$ԫcEtzo")<5+^:hj2.EA\V$;xԷыuˊd~9M.-rk9Wтًi[˺`кYl LįV^|>gZɌۃLX9mӉ&T3X-mc9rƼ>eۈR،]Ir1\dձKi\ۙJКpdDy>)17ºAF/]M[m>k:o ]4zsgBQv>Н[y<'Ű}" .}u5Q`TOœJ%8!!!`m|%`Qa(XXĽ{TKL1bDׯ__kKT*˭{UZnw}'nShӦ -<* &MЪU+.=M_]5kPF {1`S35wr6Wh\BK'97GC.XCNFbnΏ檛;ŶtU /d2dwn| *]YTiD8[Ӏir<4 JK*[2ٕFdm4iM5m!ӫxϋv0ՏScʗb$$:)m-hR .5gd i%xfr=U‡%?M<Kc&Kzm{+ph,..Qj$YmZ35iV5jOɝhoYgyX8{WЄ _dn]ՌU~] 9 j>KNAќNnLgL5֭[\t ӧcnnFY=::$$$$[oaggWa9]t_,s|޼y\pqJň#u;v VX("ݸqc >>| nnne>|u=/Q4 C>0#55]CbM }5S%O^8+'m{)9?u3q=8GU$Mw3Wsf yYd^Kӡ֓}U|לINJ8.K`h][/& VbjBN^lxL֥^JOJUDR 呙/;4mlҥo[f~Գka̭킫MDQ, E_ӂ0q%Q g)K nTBlV9-jSam=r(ѕ1jtF| 5ʇ.-]N-!; c@ W^kWFի[oe2;6mZ*)SĨe+Jڵqqq 22}3fpԩ룟HMMVZFO$0 'Nm۶U6Rh]V (wGCo~9%-ݲWZbt4()ERv'LJԭa7)(Ԇ"mwiImj[$I H T4LUoC͂UF44=)GSH~ UHN=GK!-(Ҋ+xUWR6FRIu֕ ^~eSdr޽+fjsݻ_p?{l&MH7nxlR˖-j_zZ`F-ҢELmɰSa%KKKiʔ)UcرٳUI`I$ITVs-iR$UW-{o~9%\Y=]2E5$UugXzrhX4lhא!sFPf5޳C32FƐQFk 7S>nMpOgVWL֞o)x4@ q?~ ٳ?{=:tPh1ٵkuaΜ9\t:ɓ'0a5kD&B׮]?>믴h-xg7ncǎW(Z0uT:vXez dּ`*Ϭz8As3E]LNh]u8*{\ fߧMMhMIN8ƍ9}4qqqr<<<ӧӦMVZzeaõkP*۷o: L8*Ua:uT=88!CUY|QeBA@vZ֮]ktETj}̙3~!ݺu#44ot222_w;v$99\9/^E̜9ݻsUJ%ѼYLLFmP$ҥKsΙВEe&k>Y|?033ǧtXYY /T@ *‚d;VRZl֭ɉǏ kkkIOO'77HLLW^1{l/^L 033‚7obgguۿ[o$qqqUV@A0T*MlyIeZ@@O]/cӾ}V4i@ gL/^ @޽KΦW 蔳~=CGQlT@cҳgOBCCQ*;w]$bkȰ@ `|||8p KeD6Dΐ!CϏ;OHHmJ:uDڵ~+|^15V_<Iǧr]̝KД[ݮRcR/lK~;g F$5pJ7@P>>>%'GDDh"OZׯz3{^^;v`k_%m r9  GEGG ck&x%&&֭[jjsvtUR&WVf}iMAѾ2E6U`gt?AX1I'Uĕf'?o~5s2I]:>#.iɛ/&333O@@@$o>:t?S^z}v˔G1e^hMh15V_<ehٳ-hb`яQs40l/Qd&Yԍ )/$W`^Y;T@TRD7<8P96||ce@f{]dٱyW*/tvxB&{ƥe69f͚ڵD9… i߾}qyJJ _}^9C ۄuV{=׬Yý{ UAv튷}Q\|05V_<\z&^lҽyM,d6)CKjXCJ!dO˯֠^3:kLRJj}ȎΧ|i5N>ki$m;[YP{d?=-'''^}U>3o>ⲈdӼysFɖ-[ +1͛F033c@ Ll15F_<(J^|/A(2y-6.A_#%: FRCG,p dmh; #e]ggomm"ِ@I f zV-gİ~zA[5W ^=?}Xsnrtٯ%O\ʼwckJxѽzv\Z{{mˀ\츐{хX;ʓ[}Ah~T5Εɐ!Ӥ/4lؐ[n)733c{zz9'%%={beeŬYiРz*I&wAHHH0u֙Ԗ'1Z'o>>>4owww5jİa?ޫjv؁?vvvQ^=_Un]q5kGbI}ڍI*ʗ+X~*54mVn2/ `r3M][˵,n] /K}Lv8ˬ<4m$9 @@x23+j;> !О{s8`8Cn0=t؞l.ˡP^gfq^r/OU4g򀜤9Z7}xb3a'.qxtNyEiS˱̅};21Jg4wcWS6yN}S_H IDAT0uP߉z.%<AaO*>߀]sunf|x2i l UiDdѱrt I3LROÀB(~5UߌX86CAfB0]d2k?^51 kgڿ1Uۿ>Szg, &''>n߾]K.q5ܹÎ;G9JK|F%K4iw%##[r :w̙3UB(1^PM=]i_NIKVX!8p@2̋XVҢeٲ [}_R'&ܨt2a7)X6Ȝz9KnH 9!RooKʶB5~kC"IRFϫGmȻHkt/miؓDZMN$)3T:ؼd:GiH)6T _굕6VUnf4yI?(=R:Çv>ڣKdJx5O,5k:RJ3+Jk Tۡ4iR^Yea(쭐)zc/\&T{%<<\ZbJ ;f LLrrHҐ!C2礤H-Z?*g կ__:|s; 7oCrtt:u$-X@$@\#Hrr('|bjsƸkdoo/i-믿_UVI]tʔeffJ[iZ Ձ H$IܺuKZ`};It^_NI3oz~WzaU9ִ^nݣE2sIE҈q>mqѡG?=L_U1Warf`e^:ɹ9?R`u?ؓ〛=m-:]BKiwmg Z8u? 4rl32Peڞέ\GjkV.8Cz(\BT)ȴ±h%#_Y"1t3{%=x8WyMk )Qr@)ɉ &ХKFRYcV?;vڵk̘1CgBѣGS~}>c4iB^^XNN.\`ĉ5 OOOʝ"MJJ g6~'''fΜ >/Ƹk.]"==;vh-o۶m'Nh=gݺuİo߾2e̟?%Kz IR>x`Vi'#SFZr8Հ}]" 믿fʔ)lذ찶ӓ޽{ƒ%K07מQۛϓʰaèUӿbbbغu+W\UVO壏>A(J>sSD05F_ݻ7m۶eZ㋿뚊-bbb/ItG xy`֓}U|לINJ8.K“z)Y?u3*Q>8ǷSW9yH(^Y-ş%xzT=>YQ`O^JOLC%y2u Ez;X͙u3,2/ĥ8~3Y1q5L!'/Y6~~Dk}/5:/+84+i>r UNM] ]1 C>_E3g΍70+e߳k}o:/F9u ;Y{&^51է[cd)dڧ A2`رcu&jnMpO.9טTrܪĢ ecʏ6CƳNuef5޳C3}-܍!{퍵r}yե;. <S6tr@ u姟~`لآ狘,--d( zEDD&Mb޻?UVL:V ՟g/Ɔq1.UR5ɸUޫ@C>8s<)/[E_|$q6)ڶ'AϞ=Yhyyy 4dSРArs uT*ܹƍ駟` ͛[jՊCac#?`X %s{n_8gO?!Cp- V!˩WFٙիWZmF7n___NcӍo@ a@ Ae׮];X?&=s?WrQ߿wo޼N8믿8qb2ZѣGQ(DFӞ;V i]7)$ڵʊwwwdee}Gyb;xd}P*^}|4nI7Q 091/)++qDz;!ۯ::$sʙrӿnr7j"?dSߪқzKԟbW@ ,>E_I } ~h_G]CGZڱ7sɼű]YdBl,(#:!wbjS%s1 `]]6 [M\Z~tI'oКųҾ&w; ZV`eWvVsV[ds|pDnWO9p_aLoي/ WqKU>V-gŐXs.{?O]쭬pj27\"= D7'rlKU>8f84CabK][UFet.v\tcɭ 4]_*b6D&CZ3p.=@ <2A' gyvcxol# }'/J;%#v e{[̋sX`8L!!t~rh,n] /K1Mv8ˬ<4m$9 @@x23+j;> !P9|0!7S kkyX?r(ԟ׃{6&zIF8Ʀ$кل-ˤPǓ{>tq@Za?3 ww0l}I㎐`*;<@uw7sW$5G#: F)4"li椑"'INЗJ܏AtkXj*zj9SaU f("H\ң ˬExմ 3=hVmf:bc!w.O&(H.=@ 4`8+[7vXdic_Xnâc\ tzg*mtH=ḧ́cX:j2M5(h<ϤEm|xe׷̺6ޙSaҳ _ÆR u:q̂{m,tɸϊ$x'_3v;zY؞BD4Q`@ֲ.%5nV$w¸5oϢ-%C\.9#v{gksy}#3&;bȪcȗҸ3f/u/xdr$:> ]t5mLm:Tg0ly·c :oAPdzE}P`TOEQ.}W"@ 瞪UiD8[J{v %@G,⢩яcf}k8jELRLK'97G]|9i7wnm_OO+d̓ɘT0&r<4 JK*Hp$!wl| 2ϥm!ӫxϋv0ՏScʗb$$:)m-hR .5gd i%xfr=U‡%?M<Kc&If$UU52mp,.,r;ݛWn[Qh1ʛlZFMWHyX8 ] @ T}0l@S4s'SU=&]$ӾLD~:ÊS2{/c+y~I.7_zG2W}롼~*к4ue}tncڃCiKf cwFnD]t/dj-Po-])7gp0%mW4(&2ǩ=ˍká\[Fd=iSQU 5iV5Z?:Z8{WЄ _dn]ՌJ7!'sY ۧyغeX}@ =U z2o>w2I şrފ^JOJUDh*GNZީxfq~>PQgEJ#d*z;X͙u3,2/ĥ8~2Y1q5L!'/Y6~Cpw./RBH!N3UvY詯O@ @Hռ},kvѭ]qj2m64z ,g?п-k])\z}/tuNO'45 좫loҖ=b6</qG#bCf~qN6UOֵl|9=d[ցI$#vT?V,]їkRZA8¸B"cz!ǂz>n-=zEze:STд}3&tMqRԢ \vSku'G̋2CM[>޺N:Q)ύ70+ [2;ˇѾEoN>}|k힉k9~1c)d%k @ z~WzgDR2IKI<9ooozmjیCEƴ,Vtz_ťjQ}8?$8>('% ;+S۳05;:wƺt'.bRU7R.l6^.} /x戈j-wP [&qYp!g&3bl26uuIl3qgj79.[n[UzSOb]2Mn@ <7T`я~eR IDATQ{V0l/Qd&<,cԍ )ᇧ- 9ѥz!~yPٗܐc5^kAm WO^~+ m[6dE{H~ioU(ѥ1ۊ2&76.%,S~]WP@  lҽyM,d6FPiB6ߡYzཐP6>q~:Iu#}O3:kLRJdjّt/ 'yq: Ŀm+̂#Do`t7\ @T"IR>x"a=i^KcWH-NºQ+K;}YzIY~'[a[ۇŧH+!|O=k(kBK;Vr.49׹8+kYԘ㷒Ь넼߉V,ϋO|νKĬ7vu4l5qiZ'M?AkJzX:/ǚe7hY[]] [r*ZmQ ^=?}d1e+/\/ZVe\ZAXCc#Α<*>u©ˌp7FPtݜ4G0˱-UW~*,i܌q{71YE'м'-vmWӹq!ţ {v't~1dzBd2dH5KO}}@  @0I}ڍI*+X~*54mVn2/ `r3M][˵R}jw-p,4=WT,aXN\ f n 9,BppLaz&L"2#5Vcmltb4 ROћ{>R2|xe׷̺6ޙSaҳ _ÆR u:q̂{m,tɸϊ$x'_3v;zY؞BD4Q`@ֲ.%5nV$w¸5oϢ-%C\.9#v{gksy}#3&;bȪcȗҸ3f/PR  0'%&YX7襫igzmQ>+Kxdo~ð_;Ί-#[hN.6O>,i:.G1]]\3i]tO*(6#IA_gti;=KFEAcyW佄GgȗpH ޼ tۊE} &քaRk>@ U [8*ɔ;iŤGII*/;Ѣ8<"԰L垆 X5J^*dyEp͗ѹ̕Gcxz(J4M|Y[ba:`P?kڒyY}Ħ/ "x)n@w}Aߙ=\1v5ttIwU7i+ph,..Qj$YmZTgZ!zFLoo_Sv0i^FܨZ8{WЄ _dn]ՌJ7e5`lebna *@ 8ǷSWe9yThyھ@I^Y'GRr~f*{pH(o`5g&ȼCк^Lfy3,/g٥~.F#3_= 9wNi4."wK<܁{g׀oƙ[W]̉skY 3aJ'S2 nTB]{}icCƅNeZ{7:3ܢ681jtF| 5ʇ.-]_ R!m-F"9vBO}}@  @-cY#nSAl Q"l`9@8|chuM sWu;=Xt(2vXw[?K[O\:otXb[ 9eTy?Z׆3%hm-Zn&G4HMR|q5v˵1Z2SZO}}@  d+3f" )$a7{6m!"cvqveux:N=/R5[˨as>w ]MH)gv Yw;?ցADDDL%wPyyMKԼmVn͛i撚mL~Z)?ͫ&2Ⱦ |<|<|9ss>'|˃n3}RC~o%\E>.k/dvMDDHHHp̈́Bq/^ܹsh̙yõk믙Jm6vAJd=xg3ܨTDkZymcȋ{X؁c;ƑJOܙB@L 5Pߛժ_#Pj]қB!hKHa=]'o&~rcCsQٷږAG%0ʍ!S }Nw7!De~vJonB!k B!BhӤB!B:$B!BH0,B!ő`X!B!D#B!B2pn an68w/ !B! V[X&v!*3s;F$[$W!B!AXnš6a_b !B!g{ hiB!B!0J5~

9J`,0e| ^}s **B!2 N7Vf6 uY&v!*"Y !BQ Cb!zekc,h%!BѢ( Z೺LCR׆ݽB!s$\WWBd)0_^11 !Bzod((Bl2MZ!BM_ ӡoBCBBB}6Fa!Nll,] !CP.M_w7$$wkS6΍!7\ >y 1|RjOdErnM]M=Z"w.5FTv]DQcE4.]жmƮ͂E`C$ ԳgO~mL 7Dpzz:aDZW(ZQ J/)Ɋ"&$6M!XaE~}d'lUd)=T_7)1خ#=N{yGѵkƮBs 6D_@/-G!DDl<Y.ǿM!?yPshͨSC9.7˝{autQ~h U!DekDRr.'!`6_-k` *[T~μ1m9ؗAy|ͨɲC܎~9[ NzzzcWCZsuI@,?~4{ \`-DZ(! l"'6w /GVfUiƠIIGN5-#y`:uz`{ī|ynd},[aM0/SxS/ $ a [W[73ѽ {{rg(Vh[G#Xp-bdGO— ۜ@mZ:~O?~Y:;9ƑUI~=8]Xҙ/'IfAq/d-KPر=Z%i[s;f霱uPcSu/>Urs [{j G+7NDDꢨ7Ȭiu>WnZC(ƞᩍgt,Ƨ2i% gDfł.ȭXӫ,0o?p 33 O'vn{WJog>JK Ps+c O6OBg;\:2Kk1cRz_DfҰʺٺv9ԂڵB}=mCQ2$~bd`vcx?~7=\7JU-4~oǔUaCL\=Nwf&PUgcOrގs3pC^aeyhO5v$~@V~^5/{ $htܪSpحT|r[sp8 gt$m*GM[p[aS vٟg¡;6-aD[p`ǧW5A nn;F[BI%)j85n]Pf&u?s/^ 킫J<<7RPvUŵ~E]}mў)k&v8Ĕ&aÆ}eg6}q3P!`~[)g>WJN=Ph-zYGv37 r Ʈ*sXN}\P2g?[*,T(x+WS)54TRS e4SW1϶fT᫩ͨciŮw@BIJ ԁ}a+α9Қik!\Mᛋ<X5=Vzsﺟ9d\!x8`JA#8p%z.|N喚Ywoj{gK]u ƹGq,Ɋ^c~ tS$jm-9I?BE$%bٳ,ZfӚɲu(:Æ9Mhq&L$B4eM9jjV|YPuc^dIVQ:&:_b{UVVS{{V1)I⻥opƨx">EI6cJ %e: }(OIK/abLЗpUU֧CEKE!nj2O M]39|'O@ougʘ VN]gr(.+]h0~L>wKRAQF{2S_Seך %LYd-!OFo&͛RkX'^=l9'Fho~Ըx}Sn=(R@yNx-!²c95'MU}<mcWDvRNjL>ͣ5ԗemY!tssoMkOٻY?Ж2nNZ򒷓ͥNnц:cU3Bk|?c*_wZ %#>d˓c?i/kPT:2!OXaKau>| c/NE!sˤoVLz%ͦ32]N/KױlwhN3czvU <+>̼ߝԃ})C f1Q_Se֖Jtw,%$B-N8'~m1k0̜|49YXe& Gy#)E<6M17 XpWa IDATqt~ vlK5>i,"i }Cy7O-̖A,Cs!gB.aac|W-J,&Srr2w&""oՁpzz:HHHB4i '#DZx1s%++'NR3\kfSLVk79I-0qh0i{Hv}oQ2$~bd`vcx?~<b|3]EZE@ s 2TB! -Zܹs5]v˺Bv|zBY{*ٿo&o䐙k9Wm?8׽4/'1@s40fl_XOv u.~'e3+i)f%U_qGZ)hvQP@,r.#r>ͥͳӠkϩSd٦]Ș~qƫ[/bxRnF@H&bNsuPilU],{>\\K¬x`Qy7h+Eg~"7 'jT&қ_(wԚGFF}3<˗/oj{-Bܝ>VVCbTg!>}IVf4k)N?Zo. n!3h#<_kmaO?=V;LN|ԇΞ[I6Q7ibm@ȳy(r;3Ū@sj^'4Z0PÔs߮S{m&#Xbny.ZY@K[N;Cvv~dffr}ݩ !xyx)L $78VPCE|P^DNҡ/᪪,CEKE!nj2w'xL ?'sIc's:3eL+39p.VLLlutG?Ж_ JIᅃlxutg2>F#|` . LJɬ6eUIFQYE,cmgme2K7>{SuӗTUhuU8!ssyx=H]/U5}rR²Wsfپ\^ 2m\Uu~1r-ZP⨻ĻvYHo*!MVhhhKKK3g 0iӦիWBf,O{F>_"gEx+ƵNj BwD*R@ya'lsaYױϓæ|E,")Sp)ٻyt1̡-"6R8d{nnӭi>{7cP_\;b#YC @K^vq~؋+sSa2* Eu#D5FDK O_f+m6T M;ucʀz+. yQKoG@Ս"@gW6U7}iLY^<3g11PE A|^W?{Ej%)b}y;Vԥgu܈vľAp!F zG{blݍkЖªxS3TE+tС9r~!h׮?0[#R( SGUixGnτO.i gǹ1^cM^T6{ ns7SIP602[< ঻oM?w -/5F[•YM,vJoNINNfDDDp.]ڵ+n"!!~ÿj jOf$$$}vC53ŋ;w.J_͌gPjY jWR&s;F ൿ&z_ZU6ȨYcȋ{X؁b;ƑJOܙB@L 5Pߛժ_#Pj]қhd-!>~~~ƲuV"FťKp Ms )Onzp!*[$FTJyY֩|B>; @JMPL77"YB}J%FbԨQqrrssYf +Vh !rdXQ"e7)B!O<_|/KͶƫY`X!D# h ߟUVռ˻G!Fzu3Ea!R.]h۶mcWCGaa!'O''',X`V#FBQ_ !hvd-!_O>FYlYZq:dȐh h !hd-!͛7z=rH8p ~iKѲ4pn af>{WCȍ+07$Ut4j?/#p1oeK%I5v]B;'V *|pcwϼ/L]Dz-gUܼ߆*7707`ɯ﹃h6d-!~ .l2L裏طo]v5{ZuCR(]!mjsQ)ȗDKoSlBq %:GX&Տʉ& ]NB<"|mLq+n%?a҃xlQ#:̼Mdzb_u76ԅ}Z8Ϲ#}r o]қhd-! w^~mo%K0m4qvn)'EBԴaK(/r;wo\{isxΓD%cWJp3 Ԍ43ȩ;wRx:7S~?vOʇ?ʵD[ִ ý2lfn-,%aSzkt 22+V0h >3)((+Wp,YB`` s>>>Rg!D+-JV۽~3B+4x䌭#^Mzi NŁtp'KW[1|ӏ_N,qdUpGxO)'};t_Yӡ{q lYѓo}]r9򉇊Ŏ.iL5t!7Y:g,AظVh*9Cc{=Fe֥?v3DO{6s%rD?HcƌM .ΥO}1lf%m?e[ތٟ>'03a>'גQS~!K߄0(So)6xrnt]ObNqV!-$qp^McmU4iQRo`5in]8ĸ>};eeUシ:'2m}ݿw2v毙/Y@h|TTCr\u>W.]B;|ieQ Tg*z9HS>-\۟ov `l0ъVعVG~V)ƾ7h+J5~

7=\7:X-4~oǔUaCL\=ATn an*|GolUup_VNۑVvtxn.{+f"cn?ʯ&au[u AO+g5CqP@bt$m*GIM[p[aS vٟg%sn]cx% vV(:kJLJ nn;F[BI%)j85n]QTQ(QYzsW 8>3Y7igZ[fvaXccO~ŋBNeOUs\~e{c3Ï#}QU/e]ghd-!T1c!  j8]Lp[ۭTttyPҖbt0Lb5}\o$m\[s29.VʙϭRS.Jӳ.qFVnؕAqYe׊xo귗y?ٲP`B^\J{M.?ΐiKs8ul+WjV(PzEpj*eN?׭ d\!x8`JA#8p%rg񾰕sYiʹϐn.Eo ԝ]|N|ɲM3qۻ19W^cu>+'+zMLlcKsNsuhlU],{>\\K¬x`Qy7h+Eg~"7 'jT&қ_8hB܉`ZMW[ ׊-R%Yd9W(]1 dԧxmra_)[een۳)~i3GΕ0_/k>NO.⚛ZMW`>>WR}sY.''LB\r-W1ЩGU~%om"7yFm䟇vpSkm`5Ip xa~ɉs8^u뷂:#&7Y}V̹y0EngfS/hNAAč_k<{vz/ubrooHAG&>؆e^zfOB42.}  ;R>1)I⻥op㥇xFfQ~Og&YTWJʨOU>P^DNҡ/᪪,CEKE!nj2w'xL ?'sIc's:3eL+39p.VLLlutG?Ж_ JIᅃlxutg2>F#|` . LJɬ6eUIFQYE,cmgme2K7>{SuӗTUhuU8!ssyx=H]Kej;@5}rRU9q3lI^/EKEI6zкHIohk  IDAT-e(q]TM7hqd-!'ޭv!nw`-~3Ѽ<,ƛ_x'5=^d_'Rurk qV?uI̼ڭgu܈vľAp!F zG{blݍkЖªxS3TB!j@N) SGUixGnτO.i gǹ1^cM^T6{ ns7SIP602[< ঻kM?w -/5F[•YM,vJoNINNfDDD,k&7FMQa q,^s{W~~>_53Bf.]\I=s*ޛq~MkU=ϳmlyqo;΍!K(9Gʎf(=yrg qa06gC}oV{:CvJonE0M['}'ĝ9Li.!tɍ]!De &_0R*7Nu/0TJ9Q8Uj}e*f/((Ha!nB πQa! ! ZYnےG =SX#[dXSӞ&mKωt¦~bTz/<Ȇtq67m!KjBkcIbz Hu!=I(((zI?ik3|~ɪ<Gc* bS1fop!:!(KN+C:Mh:Ss@zY׎nl-rI:nڹd4 KIococG+ZaCУSXZs X(Y_$y tSRHo*Z%)Ѧn:XCYKɤs#vn=]8Umwɒ툵o$]{;{ dt rcsS;r~3gXdܱ'Y9ooGZyd!2_thguA`V?l +r{v=z:n&v+?oG}5C~ҥ d<4¤툭?o͡͡Jsݺ8fJh\P:uᕼ~v mJKME{+^Ƞ'r*+϶}:.SKUȜ~鋪z.S2>ۅ)Ѧ SPl@n Ѵ5|0\t3mloRѪBJ[2 qk_tpa_F6O9S5V*uErzvY%x-?(.,ZO\P2g?[*,T(x+WS)5t~ҥT։.M[é+ǘg[CT˜~[>CpVmGpJ ԁ}a+α9Қik!\Mᛋ<TϩSd٦]Ș~qƫ[/bxRnF@H&ΧjQu-@Jn1'w weއk [u,#ϡRF7h+Eg~"7 'jT&қ_(h *zf5T lN~ >VVCbTg!>vIVs)c/}`sﶡ׫'#[b1_[Rhpسg|MBB#7 Q;L{q#]Z.dϟ׭*WXX7|ìEb.}||!Sݟ+U܇ 5lﳵ7Lڗ:{•+|ˆ_Fl 05cwpP ߺr?W 2/s-_4x2hm ivN6lu}CyXPB :m= #9~}‰N X;UAWO1Ga%:z\yKn-IM}mNm~sw}*ght9 A0,CѨLҢqt^stm4W_,}PPNXI0,AaQ`cl*P4Mu}?03.A"B!4 ؐ16Ģ-lyc! BH7yVHH["a=%&&jcQ괱XF0&-QM%35cz2k~`\u%yZddX!D#h GSaQ<-([_/m32K z2z)4r~ !4DK8sw+L%XIFVw(./sFcZB!5IuV+JP,5=3pYP8ˮSPfZBݙDK{06,A F-hl;B-rBag2IbQtŊ2ɖl +8_eK۴f!b!!!tD G`QtŊF϶fs?*pbslZBa1@K/-E+@b6.utu:!Ƕ0ZJQ,'B D]hQY:- ZcmoepBN!")c# )Ѣ~iBQx_$D=f`X[̍|/IBag2yy.X4DƂbņ E=g5'ps MjB! EcjWGJ$(maP3KlRBQ[ɳBBBQIJhll:{MQx-!1Z&dhјYIlfMd߻g^q ܯ[$$$]ڻ,B؎UNW0\ {M ԜݵI<=M 0bh,hS]% /9Oéu~?8B{j;,-|t/o9 A w6 -gm] 튟+~0xV|gΑU/o`ׂݶw(./sFc5iii20zs.Agjb( A=e\/k΃ݛ,uʋ)W'{7D7lNBiY}bW\aYh vdWk y3?ٟN<= x+mV8,(e)'B")B6K(`Ö aMn)|7k[p Op]by.?:yIILhϱ~ yѲeM-RN,;e7K\W|]gKmcڕKx0SbQܹ(Z1+/kePƯ?g!3t 1V% 0go%V\z?:INZ=pˎ+5?#Lr4a^rAGs,0Gx͛aAj2&k/HT;ϵs|9e(}pL $εX;rB=>tvٳ=_C^ٿ&ClP;qqfb\DB0\{n[.Z"qqqw&D q(uZ'vf`XC›#x5!5n&"rAʗwէYq0۹m\*˟_wwH "x;mgE53U(M\uĻyg8r:2/WƌK*͵Os5,$~M`q\_ =(:]Cl$L籸Mw(Y{+z Zj0>Qdj*ލ+'Ӷ;έj&~'B>A8yyx[ƞ1 " IDAT3oT=4~-*F,-̺0;7$ʹCѝ^[È|=ao5a/Pϝ LE@d7r#W[m_rxVOL٭9t jvZ{a灿bX|ݜPzuW6i)Vgu䶰5?3}~VT\W8yeRwhA;-1/MؽT,fxK[Lk@_̋lKkB'{wWLV_s:BiSMZTˬj=4)p[Xw޳y\(޹_ӍZ^T~ Rz?e3QdE^*zEbn}w*K9'ӚKkmQx0 449 Iq,u['#aF~̩}0쬦k.qj]J5g޽-Ό'dj5(>5GH9J/p]oeSʊV]OWg5~3b1 ڻ?h~r[ZYMbqKӤ&MOH& } wrxZ XXx|Wy5gL‰\˴ /mӽ-l\nwOTw/:T[u}|jO/\3r\N{6nz2s}p bcR?o6M3nmMk@QG;0eD{h!IG/,᳗>"DuN{U}OgXz!iG|*,HIT8{ |ԴBJo!n槔̧6|2~qyZY& (3dd)_݂hف nl[T`飚R4e Xt+a#8kx&u4tG$.̣qsxZl?px~n՗>dLX,ǹjjbnD!|J>Ưo>llسgw^iii|MBB#7ګd$}nx߭ Edϟϕ+W*WZZ7|ìEb.}||!SQo{ S};!Ua?8H]ݫsA܁Id::G#@g>az ;5˦+Ɩ>sضsb 8[@b2yVWe!D; y{zrmVhx0ting\+91{} ':%?`.+?2mP3K}]NFh<źߍņ +4`X!a& sK$jFGu˫Эpoe ,L%B8@~Y N l=22, @ XQ]S+VN #$B ZO`!9VNW( HB!+IBXæl2Q7Ή%?kM]CN,ù(ѱu?ٵ I\Q[^jׁlOڻ-Bcqqqw&T,c S@Kj텋978M-huHg`%3V>I높lfMd߻^o]m7'p?<[dSh6WzM&r,nV%BX(ɠp! 1CN{:-9ûkxb{ ]>adkfYЦGV5|t/o9 A w1_GM>@Im] 튟+~0xV\^~td~`,7vj\|+^7klճ WsDLu G J7?Ξ%Pp={(k|Ir*0q!{L5oVp}/WW| kOKx0b.?Bim9ʘ3@6nFgN|{fh? j0ԩ{I^[;qqfb\DB~1}߮MB-BIBo:-j> a9v_6 tż3>̊mRY#KF_i~>(BϮl2@y>ns ՟1;Ñ<|0y2f\*_GV1m}D$f1'kSWM`lf'Dﴧe#gB8dnj4SG}!7}YwNQMe 8l$$&&QG1a;^-fs[h>sg (L?>xeOdv%[%WwpBYq'Jz>WXJ;l YJ:UKE16/#ef 7Ie콾w7TIO f-⌦O 'MhoGBΪ_1~4eyc}@&*^"_/ Le-'Intﱥ?}0̺J~2;zדqV׫rg/?=qvkɠggefdI߻1}dtǣ IWCANN,~*G$`\zTYޟL4qkIggᓵѝЮ;έ3ࣩ8Ebr2m[j!fkO~2q[!tlw ߜ/e, 1oT=4~-*FI--̺0;7%Kz[x1 nN(:ث h|v\m1}eY?2m.g- *C_Pr*#y.ǭ^X~lی*uh%LxKl[/= W;\"09.\ njuo71+'|L]Gf??T ]̴`+I՞_ݍjsKnGhvUsǯoC{~ ͆mbMRQG;0eD{Re-Z.$@nIJ>QtEAïK@ܠ}0 #K쥏(;/{5E_-Y9^HaQ>$cz^()Ū?Ӫ.{(c>'5қG)%_UE{=ZȱY빖^HiQNZE=Sp>|4vsh4fmҲLS3VlJyj7MF]uդߵhyzV))r^#^es,勹[x~<;ԟa Bsc‡~s#dr>c%{oQXZ^exiĵケ*cK+L%hdv<̾soq tj[oQ&Nrv Z)LOd߷۸Ib!۵žޡ%S/g3/1IB7:- h'^f{NSξoo ߍ-̡/ @K^2Gѣ^ݳ7O37톾Ƒ.S+pQG[ęvJk<< ƿA؉MķZՍZ0pyp}<U7^lGq mmʘ3nAԄ^4wWѲX>'Q{l)c/}`s+8~z2?q+c8/#XtK`sb1۵ޡ-SՔxsfE&h IBw:-)yNddk)+ n M%o>\yK^RR{!22tB׮]IKK÷k-LJ,1'ǘ+5zگi6dϟϥK*W^^7|ìEb.}||!Sݟv( ^}1kVlf܁IXg@Xt1[AO֌ݕ C0?~jΛ٪C_%Xjl̕~Z#)BJREC !Nifv詜W!NtJeUީ zˆ? [Gw(љ%3_[ZhdڑɱV5xӽf~uɵ^hIJ1]ߌF]PH@\lwHa! n򬐐;~`!Dcg,(6;J\Re5gB4 ]tEnF D !DU5up!Jؚ !hpBBB$D !q6MQb$BI&2MR2:p7M:'p ܺu?IJ?K[]%~(Q[H"h$%Z!jFR~f.-GЫ.=úUX=Î5#SyXd@՛,wߺnN,~.xX{n|mV\\ܝIDS7k !eL}p(M\8v0Jtwڀ M)h2l\wmEeA_YWicѽXFھ$- |5&e\wy.+~x=KZqB.U~dvx۟NYuA`_%:Cŝerhl~+oiA 2K ,3v4;J,ACq`.p9vos6yoiHGq)JYKΥfOP %K7L|y+.TďS;sy _/ Z 7\:#`Г(}b_4 yu D. RHH]vw3NRnItv_ma F*~%GZO&N޸xҶ$kn\s4v^xEIJdYr-G걖Ǝ{DOVhh?e(ħ3m #_@?ljIXҖn7WI8Tij QWs-@%/9wòyiŷu}*=Nϖ*\=<~5LdlK9_pT/Z{t#pQgݳ7+-$[ һhHA*?^fXoe w^mru$yYw #b a>&ږc>Sd㶏yiD0]qlOW鐾k˿ڼ*ۍ'f/\G݇NKj}7t&Nl.ao.t®/g_L~k}P@KeEh'ђh!$u?܇`XC›#x5!5n&"rAwէYq0۹m\*˟_W1d6H"*s&:]Ӽ39S+cƥrud'ADbs&0e[8Aqe{/@ƞfvBϮ!N{ H_6&XMF;ug{dNdݕG:FQf4ޖ-̲ΚF3GńV{p mI/0+㕩?ڑnQ \ wf9PJƑ(4 4$|8m$_Jbw+1de(cT-=Dۼ s5 K'>-ֱ-j?w_u*?\%YѴ16s MpHY+f IDAT61/ :ol(8_eKts6S\B4P-QiC$ />Ofn%S?Ƀ=qɸE+UܳKߟ8dгϪY2F߻1}dtǣ IWCANN,~*G$`\zTYޟL4qkIggᓵѝЮ;έ3ࣩ8Ebr2m[j!fkO~2q[!tlw ߜ/e, 1oT=4~-*FI--̺0;7%Kz[x1 nN(:ث h|v\m1}eY?2m.g- *C+Ⱦ|7q0>36#e,I<2tI)?G{I-OŴѹr׳oؖ`Ŝ˼/W̱yc}U`ެvG~+or4 $%Z!թ2Jl7u \Mf;tWR7${w$~ޡOw眯5N*ځREmIEviY޴'JQiE{ni'~xV/&I~peBbFreJv7}J5jҲ%ٜq9wNNeHܼP,mCx.4.85QФ(H%L3ٴٙOp-'﮶iU\ç^l-fLp:֫O20նZY_/kZV=EJO@כVm3gx|>ǯBEHLͻ_e 0 zyK0y`_(vV5[ES&5̻wřdW(}1j*nMs^4un\sͭ<3ݯjZgbjw2MV*  {hN3pi)A^'z']bK$>Ӆ;9tZȧs,´|>kIR[(PRU.{(c>'5қG)%_UE{=ZȱY빖^HiQNZE=Sp>|4vsh4fmҲLS3VlJyj7MF]uդߵhyzV))r^#^es,勹[x~<;ԟa Bsc‡~s#dr>c%{oQXZ^exiĵケ*cK+L%hdv<0nesxZޓ?@}v3xe|,7oD}4-0/2][ZJQ?Żr6S\khIJB/:Z*z/u4灧A-xw#OtRsݒg Qऀ2h|;Cobkvٶ N0.i6nds'5{N"%h:ǝsD?ϻ-X/s>ּ,-N{X7$ ǣ}"ד9%yhKAf:zTku{f#9?i榢8eje.0[hk8n_is̓7;_rr1}UV>U >S'ƫh7N͵Ps}ٍC2Ћ*Z7"rdq6PѤ*┿䗾~9NwՓ[19x0O c}xo\خ m(ě/73/D=$)BQ8upHIIyc>;yr3qJ&((Ç|cA~XV8qKxE,:`2\f[|CHO$.̣qsxZ7l?px~<]k~KYlc.m17>%o>\yK^RR{!22Y!!!|MBB#7ڭ%AhLw9ECeuڀ5*PjX j_._HԱC4: ^}c'*  @+0b.:H;0i_wf>az FdG֌ݕXcu5YWMN,c AUceI7V}O X!&Vk{e{zz2|m a:m= #9~}‰N *2utxYb~=ce'$$$m4e ]ύZX q |qz47\o# | <",BѸ k4J8~x` /2X}@K!YqѬӆ ذUWۑac$BݙD>YBX=t#Ǐ(֍ #BI73K ,qXFB еkW{7$IBa R( !VHKKsI$%Z!l:]9pN,~.xr!-6l:]G{d; wu9IB!D )B!lN;0™fA4/NAjB!-IBQWj:mxen8ȰB-9'ppbsl5!aIJBz:J#J5W|6Y!$%Z!=X:mxe6Ȱfs?*?`PS քB!)B!ͪz4J\?F D&;]_!D !p$VN@q.h~获Ҧ5 !GRB82S|~ %:L&BрHJBfvT?FepjWiKAf:ztkB!}')B!ZNqG8O.–1 ZIGgmM!$%Z!DC`FmdoN,c A*e/I6ِBq IBQ?~P(}j uߧp C,IUB!炅B4dƂbwSP|^>e^O%B-1*uuЪa!YB4V:maI !-BX1}%a!HJ;X,JO22,BؐD q: YgUl M, 'VcXN,XS%u0+^g(-MЖ֨QOS۴.#3a>S<ґx>T]uDR{ R%8,JQ72D(Fl4~Kxʋ]FXXAɌO6_U{֌`ʯ@f[c9Kmt &TeH8x??'籤D Q1uQY:mxo>#eZBV]#XFLmV46o]Jtmv a>V*#mrbΚHۥs$yo:etIJ?K5h/ۭӭeŗ6[D[{B W,Cw()6:>3֏#i5.#ÉՔoc.(GٓYEg|o]| 8INZxy!Ù"M1,'}X6o!ԸV_e׼RgǯXcArţe/"$˚ᗂT~Ͱ 5w~ꊏyaIb F|S=z^gύ2XA݇NKjײ-6}:XF)|7k[p Opr V nt&tuǢ}6p; Q; )lH"M(ݞvoӛEܝNn7yt3Z2[罠l6}-OH|kh~|LmE?2=:Y<NYv3U+HN|v&~[/8g4EogO`7d|E5ׯ3uiyE&LXO wce}'2\:tP ?E)Pr?Q4Kc @n D]yieF]e#y%!5q7Mf: 3UDv&#!гk8gSKR|qٯl[\ɻ͕wI@21u s mI/0+㕩?e w7TIHsݜgkNO[F4$9WXs&Yl""o+, 􏉬ìo.=(&oqxe噋1tƳZfEѻO}D$f1'kS;'aDEvVXLĂh,ü3>̊mRYʑz$gͺnfG"#1 #fx^ s~L=[p#߬fX:YJܼ[ t.c$UOe #=pWmP?~* L9ւy p}ss؍Va2Ǎ&3;2}&]]IqQ a>]uqBљ,Mc7rbϑ-r\&U'(r6&nJJn-h#?MڣkQنdm 'ށD9f Yh{7xĔU3nAVP(Q9}<oa/,_M?/#uxa灿bX|ݜPzuW6i)Տsfa4|;/Hn_W5iܭd'3y'n~=h}euDŽBM ~!uJ^< S^탧-ګI X=vqn5M(2ޕV-SWM(={ n[K=; ʑEɬ3fWU ̣ٙ/HtjcsZ#?ɣ-C2qt",C磹6X90}~VT\jc[>,,6}.8u(gv&4Iajtg :Cq^YZ2OW>8?ň%6塱$ɅT(pRd,5}w'qQOo'5woedwϽHG]pzPA'Gq03rN>m+.i3/w&L'8^J9w$s\,ʶyMPKrz?{6@ r\Ż_obs8lj|d2@ZzDA8x#|cjgx\:OiTynaM*%țͬyST;&\xW[SN6-#؛־w_)2a/uyrKMN*:]3JNʡvxi62O2Ϯw1OEr$eי Ko_״z&K6t>;jsq؛~z﷫_%O~z,g^jlbc KJ63پL p;idW |@M.se]0̟R?;U S,09 p%>W/47̒U4-ؖK>-e;1ȽM<,j{af`@Q&P)ͽ4MͥlA+SAJ%KzЫX̅,wAa z^ 9=9˫|1nózi-_$\bEILV]X3X4*/X~DEE!4ABI0@ 4aK:>͟pgB" JSEI;!+WGnn[>cʻ7\9q?H{UGfI Dari%p.P~\93&W{瑆k2!s`\Y[l.{bkR\d3K^Ɵ'Syīy|%jʧazPejZvab=2~9V2J*t49]c կ2˘{'Yr͌?FJ,d˩ǂ )O{iwAFw~t#]gXY ̉=`Y|\251l 8Ed9|tKOt%1A4EADwȰK 'Iհ e~C g2H:æ k,k+]< K2NqxR;zM;QBco ;)Pn%)]:"O巿I~~>2s@„ٸ 2bϰi"KlĚNp}Sqj<9yuRd.D=|X͕`naZ%#I#p\cʻ7xNmӸXSQ0u7s`{<ۍIcy.58 3 䎖̤]R#oOs?3i{E_:a]^IYǻ>dm+*^KY2 %qv&b3ȹs֓w6eG 2bz2LEY yX2.wew~ߢM|v oA̅xrZn)6ÏCbIF{/=,gX^*{%M i6ZOz 3٘{6TkZ O4=_Bu(Q 6/5*ۢO*yu, faȜ+VXc`nχeC:~hOh@mIKY,|WT~"*:[xy7si*z@Ug\^߅/hGx-]ჳ 0sfy8nJz3hS޹[1q5?Lm (Wo}~n7%n;\(.;.aeZGJ^дX3(㞩0{ IDAT[QUKV+hۄx3ae fc|ug b&m^; #2Ƈ{cy2f鳤=,k[b~E5@G<3A"ylaoN΃$-pssczc~ "^Kco ;Ɣ|Cabr"IWW`w9{Yrӧ"7ޕ8]CۊLDOG˾M`A]v*>.^  EFFr|}} nIp<oyM4'fQߛ:VrNWpdDDmmD=ild$LnmF?Yq[5mFN*kGs]ƾZ-s`7)a_#$d;=6 =eԉG ካ cQ a|aTi=+2lĜ_R{1~"/jz~m=Tڿ<Vv2hI"!B"x#HDXN37=NI 3|"TM ڿR B1Q1m+m B •#ĂP} RibN+ vky  B%pՈ TŅuqD3,  <DCz|gK]gXAAG Tl:  “@4ުSAx< "2\_&D[ f!x;WtY y\ cg:JFuR*&kVA. 3J'oH8{sKyAxF#V/2eHm)p-O֫̋,Vtg]#s`gӑ}> VQf떜[l۰YK|=Q>AxDcMf"YxU4\|Ƕd1޲X{CU(XTui;{t5nu65 5|< QM.oxV!Giۂ`tV.f}YȭK#R}#Y1KmwD+15 A Y3YKR.#I4%q!ͧOC),&s!V01ezMl19/$V7.Mn )S'kA~54fXsWx#ۅ܁X0//ޫzq,[s+P|VQ %L"컒c,4(. trC݉i҆=GyބhF`{px  ِyogQFrA+ڿ2 &Ű:j(:7VcfSʺ _ E#<^[Yԥ]!p|w[Qڷg +Mh+yg:X2fmq.b^7?O*03$'̋xYEJDu+lԛ[7sʷ\M=̇GfV,p˺Ttnl%3yd%Ԣ wԙnua+7X}r:8E91 qޣYoz_k_`좿Mor[yqf0ZKXVO/BB|nm |;[mDnW m%rk\߿4WNbȹρ/v FxXٴ % A8RC–o867b~]|9p>+\?K9+W]"{+,Z+XA=DL +gM&'ǡ)1>^~oM>vKbsEYs&燯uOnH M 1/ ?8j̣˕RZBayh|ă𼵎i缊l?6ŒKb ˥}d;_ˣ\sfMͯWd݆4'A$ޥ|pN~\%3!Ot.po֝&*wu%tcG$yySdkLSnmS~c'vr).u8Gx1'܋ugv|Rvq]I`7s _M$w ]=k/zɉ(R5{TՓ~߯HS+wTih NV|M|<}'sm/(%mh闥So>dqc}a)쳌O'cnӬct,I U~D/J]|&p]ǖ/ _]" "k ah2IUF:̿Y Q0zIƫtS1Ć> @sW)15ko^_uf\iy={"1*oebǎf_IuUO7/ς z3$ QPjn6i cH ?մl;e[90fpzY6Vez79+QwDK<"¹n X8)M=C39di_L9SL[=JL:Vrsax_:YGHU6uh9/XP;!W貸ۄB,: q%*'AuJ_bUS4]L|:M,[BkZ@{M͙7n 3i,Z)BcmՋ}Ƿ1ͫ%6Rdyqb#s# ]eLj5ܶ-~BGK#Ʀ_L];5Tl؃_LF~( ,ڱӉhb=9Q?KQcCt~9ƏLU?k=Ld]ʄOf4ƨJC$Q149_oRBlt:ҫ_t]; 6A/&#=@BiPb֚E1yVXKSY*u#0yt<X W3f!/}5c(/+G"+OӉKL#+>?9x"}*I~~'dN$D'Al Mbwq3&ۏ2Iwh ~k˜fҚbqQ!;+1a"/(}9}6\ GõL5m˦GO]5]Z$g뽙K5銽R & p"&\ [õL+ԯȅ p=ˊN6v*oR ̐p+C .bEz#t t+ƪkN gi_O{v/ƨJ#eIM8#c+b^u2椐e*yd%ܖNzy,@lKSY*u#'+ aoyQ/+Nmߧ*T8`\I-"RVzL.;xyOL5z%鄲p$Ą񛋜e $>pdיYAj"BO3lѤϩ8r(bt"R>eƒ f Y([2rT,!W*A[cHոjuՄ]|bʸ0 5dՑw7i4Up~^S_F{Ylai?"ݤKTM+.U,p,?$S"w_ $T{‘i8|US4EI;!+WGnn[K\~JD,in\,͙[`Ye&x6cr(ra4AUW%-=^Qf yɹ;4\%wʪ=bw[ʧg,Y2,7<K\3J4M+Bݐieۅ;X(=R+MuT[>[PʴCbN'XA7yA y3Q +39g[y=+8K&6Onɺ$&H3ٿ3r dp9.L M # 6! t9h$+,QH;Iy6vכv0 '^ ߒ۳vRݤKR2uDN_o%|Y-!8vS΋Ԇ8눵7UW hY73 {43sGDQD 啔u|C(fr*%s/ZZҩOgn"*697k=}'`S+=9AF^O (!R7L/[TiܿNᜡM8HW+MZs>.'-'%vkua\rӀ $:.3\zeˈN/_.u\K7n\ީSd P1ν\;k]Sc?HL]=j ꒸xSEڔ{),&s!V01ezg),|vBB/̶ÿvv9Ll19/$օAMرc1믿ĉ!e ek̰6X8՘ &$x4WWwE9ʡ_Nz< (+}-p˺SiCEpL0^/I dk]:$49oZ8΍՘ٔJ$HБWVC0=_ᩳ=k\󳼵1y|3/kyh>!p4Cfnkw9FYwyKW!hkk9)FƖ_2cNVrL-9nNqN͎5LM;/_B[{Vx&[Gut08Z]'1\PWԾpUc)_ToL|˾sws9MK'_D(Vܓx5"JtK։5uŪԫGX2Jtq1ˎH+mJ4%֦z c]8}THrMI`f|on^.ťwG9,K9t.po֝&*wud{~]F`v'MD3rGILAė_~YדbqEܹ۷KAjWd ڜGʸƦs MGks2al\z(ڱrDz4̞zJ(_r޶*eڔlڰh/H 纰o3&*8HPIsI7aԋVe)ižۘs)28g1۹V1i?g V~`1ґ+r(?2ɗ԰5{v"SԴv$F9cAAxyzzҷoߢ߿}g^?QaA*Ej\Lj[>`LF 'WTTMX\"ǚMUr u)/5"Iq4ej\Z$g?|OՎehmsofKV%t C8EZi㕳;.%d1<kpXBrI^ʠWeJWi  6gΜקNPtwE?nq[DNN?oD:ERE4lذwc#Μ?z۷ӧO<<Y-!8)ɟEL;:9:N:b]b-AA0h LL>UxaW\ٳgYtMZZr\nL +2\Zg಩< T{E;,8˔g]E3򎷤rJ.̒1WC$Me. \1dǨ#pho?ѝ%tzWn)/‘?) ^:0ϻ]CR:b?Xe8cKsfIΘC)";}&AAmȘ_(>zh+ ƌ\.'""___/&&c+_ P{T52y 'X3mU;oܥq[tFPj#En 6ubp{Y-AiմiӢקO6FѼy߃=M6#HxgxBBB^t P\dbii1cH}0?S%ӡՔN1KAAZ"ϥKmwrrӓm۶Sl닊*zݸqc%BSʐs{:tC.'  Ҋ^_vH?2ח{/,,7ɥKXdI'i, Fuk6iAApqqqF]#ɓ'yʔ)( ڶm[ӭ[.z.Aj:6  48sLk%ү_?܊~/9XVӣG~JkРAEw]PDdXAAu8Pɩ[lYl0˗>x`+ڵkܹs:   ݻ{.?|nݚ vYt @JJJz-vYˤI*uAj mޯzT+\] !;W5+;8iU2j:-;j^Cͭ jIAPvv6ƍ`ܹTר=z4駟1cv*ڦT*^8nݺaÆJgѢEt VˠAyA=Ȱރ!µ%\Idd^%g2 k$td߼McϯZt2= ֑#G3f NNN9rݻ#iР#Fĉ3o V*(m[*4l̚5ő[}WUR򫢍h~._[ת0< @jXUA>%$)۶mcǎDEEq1Ӊ/$44777OLLgϞ|dffw^+|N:cx9~xuޞ 5f"f֌z֒>]|ʿ_'ͷh7k;a1)$Dl>ng?eDqvBc4$ fU [5lLl19/TSK˯ 5ʲu4o'$'fw(p P .]ñiӦ8::ҰaCf̘QlpF5Z~\uqqСC$&&ҫW/~Aj3,ù+lXya4w&9̋o~ +fCbޞy9a >_gg8gԷ7z@8/(, M/3˼B'iv|wa!xQtl7!<X^;^4C-@B6d^bYz`Dgn4\hɸoåSV-Ejl YwyKW!hkk9y+NcK9Jv:AbEBQmE75Swkܿfmyy4o%3yd%Ԣ w ԭ:LTQEWYox;hG{IڜvʷMܮ7-~`Is&燯uOnH M 1/ ?x78j̣˕RZBayh|ă𼵎#`S,)Fމ\ڗNƾ<5Gx`֔nz% ;n/Kv/)y@.!m8MsB$A]OԫGX2JҪ fݹhxGY' ZB\M䝫zc1;߻PP[ь+4Nܪ'ܛgAT=u̲_J֣be#v,~H&~s ]_^bu>"Ez?ƫtWSkAcggǑ#GtxzzA7`Ν[lrvU~%f̝؁2̭V\M38, 2K^~(drܻwyq\7f\,튋Ҕ&힡4/ѐqM3uDSΤh%?gy~OՋ}ocZؘI)8΍ ./r.!M(k.Ēp98ZRy_.6,ZKiH.t|SSS<==Kp]v\vN]joAKjp6iS\4~ jW33Xst$Db̯h4p%-C2h+!֘sf4W'S""G$Wõl5'<2SwV'UoxfH`2t'H˓n6&rL$;@?5aLJtqQ!;+1a"/j}9}6\ GõL5m˦GO]5]Z$ -s2\2Cx}).e`,mN-ӱfL7ʘCS^ّtBY{vbEw 8rmH=ғj[ߟ '{HUHu9AZDPpj5^^^ܾ}~R):=ȰQq;&xN}#к6(NDj.},hRcI Y([l*t"OvNV[1MNS ,)LM [NmN7.ݒu]ILP)Mf$gݭ%2rR5,,c„n٤ 2ΰi"zA'\a\FzI6#pz( ‰W셝ee*M$+SGW9i܏SpN\0 s9AF6]C J#Ӹ&\_e4sQ2ļG D)6ÏCbIF{/=,7F^<6\i\GkU:2譆#(* cA8;ztٹ iZOv ب dpvn qĞ5<(,;JW\+ܜ499e яL`$s{hYq3 aF>d.ħ! B!mF_>-Zxy8::"wMݤA3 6/5*ۢ*yu, faȜ+VXc`nχeC:~hOh8WmIKY,|WT~"*:[xy7si*˚IўՓsy}꿠yv{Q:pU9 Ô='(^I߮TDz{3t $ - kn޳ش154x~>~we_N eLj¤p,U~5*pgznB}|= HKB7M;6Vّ!}R̴WS|ڞeBk=9ߏiBa[j=.k>j5ˎKGAT|7mmsm*vEeG݂#|lF@{ۧ,=XQէUT2ﮢ8n\CۊuL,8p___mҿ#<<[ ?i&]ɳrΟ?_qo; Gq@2'f&EvIFJʤv4mnN?1C#Z8`~{-CeYZ)'N?iG\نe\$Z <WdĜ%@kx\?=D^Ke˖9#-;f,65wN  PU%2A\lPՔKr? <$j V*(m[K񏥻"Bsge<+c nΙr.GW_g3Q +3Kڼ0oQ'Iweʅw n`sٱ&F TRBG s/׎ZTRk;xwh5[׼݇& </"8I./?1C7~>Syc{ܒ',4ޫX;كq<)i}Eǹ ѐ|+U탘2l=G;Ʋ$(Q.)/R1toR2F+A!-fuI\C)I5\)^z${_b_w^=tW˻pnEY I!!fmp;A IQ;"úSۡ't8KR TFN+&ZF0=D6&ܝ=5s $в;Oh} z\Rzr{mV/4(+Lu>GmGAq-YDi OF$J=uϊ+S.ei榟nZ^;JPN٦ RXrE^i_qἶY>~Vv}vмJZVO,y*'LkD*Q"W2ߪKm/8;I{|1Ƚ`iוăZ,s{;{JU m{ݴTnQ32AX3G_bzcˍYf+V0 I4ƒdX7ȲC IDATb1fueG ZX71 :h3)ܲ6>9sng~0hZFV$v,7x{r2[]Ͽ~_fVnƴ=WP} MkGo5>ɜk4Ͽhf1T=%U\]˗,[k7ۙ ()[ڵ6hWqeao_*Nۊ)FFdaۍ{3g]BΙOnlJ+2my7Mx]M^^W*v+Q䭳;xxؽ{1k,#::#F{}Q+**0 È.0ȇF׍,7z̅F# ixx۞hUǗkU-[ۗBt͔-Jvkw\}"|^WF;@r 렆~ruȥ-ZҊ~_fvew=O;3r}mIJ(8MmnjZdZ.]`N&7֥۱I9UO3|PYQ\}&(xd D#4r62k}*'Amxa%"ۇicQw-@|RWiikx` ٥Utޢx]UsX*.% GD*m-J گ-"mN۹νn5jFcFnxY/5[Y?QI.+u]y&醆/$~Okt*٩֥K别o3O]t/zmcx*蒇}F;1cgkXe'47Ro}ܳDi֛se)zm#w o5vMԖX}Qt𝍅AuU{L6"wuUݯ+w$m=Ha^aĕm TjgEʵ}wa5n_l}M7Ϫd aԧ;aʯf̺Y>[|uѕOic_0޷VOo ߈W&Ku\WP; -}Jȕ,_>S2K_G ޾j}:5H~}Z.W;c5}k{6Х7fqa wPv6:ݽB;o [)>m>Eo$I^u#rMZjpu>9U.bB_żE ¬x]ٯwU['o)уpg_X ~W:>ZazKv--ƃCqkNn{,𻽍f$rZ)N^qr8#݃ƖWj]ʣzDm}{(b:_Wս~`V('P*gHcCcu&!UI qrߧ߿ jN-`g\P".ڰ~*gXBÆ ;ngھ}zqU ,@)5Ý٫* ܣ~U9 JϛԺe׆üx] 6o\hSGw].70)z6ˎmTʺ4=&Fq(mٲT󅆆W^Ra0K Tk8qb:u$骋4i`է,AXZlo2avdhPeNTw]*HI-BVFe#u"кV/JgrssKpda8q"=רnCEG͒Ng^/zahHYԵ<*7GK\^ɗY[e9@%1 gmôLwΟ]E?T'DU2P*2kzP}s:nk!Ʒ#Yg(v C~4W1gh{ kRw֯)LA=t^ޞ nwOБjS۩߈yƦ~z&vت֜VnIo~VahvօUtG۷49ʀ6j{ӳð$YU/$BsO*rwƻn"ukgbi3K?V_}WIR^/8 mr_UO _lz+z ڲZ?rUI:[_Wu'w:whG'cz*IG"5Z=r;:%)y^>JVܞ_;>le:pjf[/C [gV˖#mg8eX}P n)v}||$I>>>%bE}Il|[XgF^iU&LQ֞<XItUcy hũtN-ziʶWniښcczqazTeY=l5/Rܜ7+(#if|(")s0S?<^?^{M;-q"wӔKy_@;M? !:w]SA)gnh YTp>^S=LaT+wzgݎu$8َCtA'VD햺NCk;yu ?<3͟Clz{Q@y^맦Ӽ)2R)pETMYKR2h^:U+WhyN?|IۓKֲYzH/6_a-@܏k#J/E]Og(EC&wc :r?vNWM}ƍ^3'5}%&w#ƀ>Sۡ't86|:ՄFKO\qֵZ{Jqy­zy瓑j%ɫF}Rhnrm7IZ#V ҐS5mrz6mvcm0+5y%X+uhܼ4YwP`1#祟nZ=E9O*-jSdT1{`GQR햾[cׂc +m~:B}O0Ks7O(1cziH7 W CO>W/Iڕ@Pz^rPhΒti@ @Y ֶr 0Yύonk%_{7>7>q"Xd<y8RA6euuwܭ RV>9Jxɻ%z`` (W_>գmUUn'_P=_5u٣uEs?{5ԥƫCk_s{5Хǫe:^yJR[nMt˔pYx~}01:5pZW׼SV7aOG=vqI}v$z|h][ލ.9g> VU8`qk4y5BΘP9uU۾S Ϫ[4ՕSs4;uyPʶ9x=pZl?-hY /wاã;Ku.?6xwմo?{4TƫUJ]K U/?T.C&미ZREK>bGm-h8BBf 1113ktɂJ8m烶aZo}1"2\ 6eӺ7׻oLNd[s7r]u_hdX5󐫋E. nS'fm#7er52Җzԣz>\?kdPoczKTtIgBm(yT@~%9suI_6vիMPܳ[GhWǕx)ixx-%'V=eh0$*.% GD: *էe.dP71چq_5O\}jdYmzY|ڽ{:ruVz]3em^Cq!O0P3Uݤ2zx@':쭬T$7Lsi(+ns+jˉ$e=L},h/u'ɌjVDl7Iʌ8EImlMu]$ܝswU%7vCy9H)}M-nA|hHۨ6S}Elz앩_<uo4~V*K$9<޹{'lפms ۭW>!רa@ye.?l{_sSWBَԗ@ <e(GnswflsmQH—-6WmIռ *t2b~§fkT_#Gy+M~ՂbWQT_9Iw99Iwkb:矚[B$'跘 eOPe Rf:s;'EiZ;V9yg*a/7?y}l~lܦgNёoL5{&&SyyA5#e݊NLռ>TTB2~fĿjƮVEF lSZ2EvQB_h8h+7ӣ)MЬj5^Jzð+Y\6gKI.:Ow&ʐz&~-T(zWܯf̺Y>[|uѕOicl-jmOF}ܯN/F&ɿtXQQ@۴ Z6WOP/35}k{6Х7f_k+Wk{L먱Wт]UW [ïϿ&8yO\;zy`_}S$da֡O5uoM'2݊^| h;r~nB|=JB'7 ݤϫMHQ3Vw^]}:؞n|fٗQh#VjÖG#3 JJk>4tjӊx8MoES%#]7O>DEdsi}ixu"fn^VkH3{j_6,}mV=z|[QGaI-W3z Ct.O9y|pZ7G]ezY4s騭G4wE`j={hŊ6lu?揫f@P^<"lWPԩS5t2ͻxb܌x^VAuuJs)5X7=T!E⮆W:~.٦ s1M6}|E|V"l[M\B&nѡ !z5dh;fuC7S~MսoQmp|Zګ^iQ\[ݛu0za[''P-^JvǕ, imqw r6:LҶ֐:5HnNBU3t/`g[⺪_y:E WdqA;MIzkfN<:e%}/W4,eW\Wyu/ԈJ: Eh8b݄¿隐Ph|p2]R՜hM|q~;1TF߯MӑlC` WV'٤a P qz4ڮh؍$ƞ7$akt@(J;[),BP>y90$@ /[hmsWe,FtFHUF^uWTpfZ@ղpcbb|c-'IjtTYxTNY39MuZ.tNxk/g5G]|;i~^$A_\MPڇ7is3t8]ݜDɧ5T}3ʊWW⹒$w/]*ßbL Vh**~fXI%yg;]_ruwK s.]]RVIf/7+3XgtWnX#f\ExD^Qw_7|::sFvLCM.ֻ׌ɽDenNf}o%6m]W<3MUZuB ^] )ש lq<@?vS湒$zjjIһ)^-BUð֪{H wfeτ\)-FN2Yhvyj,.rؼadehg|.u\PuS$yJX Pp:q#/vt)xxɬP\ +!n{yNwo)7ŗ);U~dsjsNgA}5a`hsekGz`: tĒ<[VŕcER^2 IIPk~[g)4~&G1ۜjNp ԩSK=ŋp|w½@ c'ִɻgf'wO'ݢKJ\,|f=MWM[Ng=Src IDATd[z[ y:Waz^]|5CܶQ~apT|O{7j[~}`}ן٦b ړ>y{ѱMhqfn yZpojx-%I_3]z (ҏ|hd~ݘrݯ\h<(aϰd l}j^"ft0][ݕ~zM8:tHR~r Uvvv7%\?jСZxV0,vR*fw_2AI0iOua|hWQ ƍ%I}QՄz+Z0!8@`L?UPF:Z/ aaaJOOQՄz7ILa;8gUF:Zk^z)55GWc:*JKK+Qva=;g?0t>,v 1fZY4>>>JNN.ǞQva+?0t>g۾}$[n?jc֡UYΦWBBB# L``㊪# 0Uj{YVe=~:&66Z! LozkЊ0\uYgΜQՄzt4uui a`:'OTƍC+0p 1fZh'OV=qt=~8=õ|9Fw^IR+~5=ƬC?_y*a`:e=V·V _tĉ [Mx1ЪᵺoQa`\F:Zk֭[رc?jc֡aZ_~:uZCCI:tPE6jcayRޛ/^~yѱcGIׯ4h͛7gϞ k_~ez~lWЪk=vWK#ՙT%%ĩ}<8p@7tSb iF};7kwH-:)stU2˾SN9,w$//C =8:M@@]y^z}SN9S^%#oSE:!)>}n|,i2gG_jnFc|?IQJ2$EOiwϫ%:d\&~;}#눎YSħ)>ORc(͉Eu7USN9,0 )((HtWa0_h^Iw,IG#3 JJӈ8ؚ^|L9SN9UYnW jZ5_gM^s&}n}=|L=[uS_7Vqm<$IkOovꩫS}\&rbaĮ[Vz5$)ۺ֟r֫$111SN9S^m,Xq)++KvUppbccK,4-rbcc[uE+6* ܣ~- j7 SN9唛! 2]S&R#f|vT&ոq#5NSj$NX]^U!jVS~W[]ƍQ{IJIѡL]\lU\^ňQLLyQN9SNyUc=sLt.:6 P.ѵR)&]Nr)ܜų(XݔkvPTwiU~?>'OԩS: $WWS?Q۵[^ihWqiiEr>_:B-8g?_Ui_hPN9Snr+5[ˬkT^BKRz -ˑR& @e=MzͷѸ } zf|nu4'Ջk/Y/_[<$ SN9S^S԰aCEGG_,11ӤJ;vޢI SR>ᄄW_?N(($Lw=:IR{rMWT`~:uud3NKїWǑjM7=\}.X={f|!i^%TSN9WG^+nޓ'OڝQyQ PMՍ#c5ouP5%>%%弞K0%e&_wکœ?VZߏԜ 0P͝;WC )K.Uhhh-0 @Ui[׸~gJ:}Jq3'.]ZCCCSy" PU\m<4j^ujիW/!2U# L0 0 oذAPڴi}W~^ᐐ*e>10l zPiڶm+VHu*aCaԯ\Fh]b%"q"ZU+c5RM5-^vfyN<:e<|\>|W1}qeŭUJ[/>Lݫ P᠖L$#~xvk,k,R>[nn~ yLw&8;*/m?M..S}:Bk'HNu,X,3z O甡q5HI[UôP CWiEdҚF|IC? RTiҁ!հ m؄n{\}tzmЉlIIo4_z\S=R)(\ l%N|ÿStn[m򲔘#yf;JʱR5Lp@.:U k 0STB }znutj2om|K>UF/PE C5t$]3HU~qܝuQ< 4R҇_A^ jGiwڹԩ/ļYǵԥ|Hq~>վ;u_m;5N~@ZF2 lO?G tBAhkUA]MpO٭Ǯׂ-1ʌ[E=;P/Ż3r |~R$I==\6E+~JRvMYGh^TN 4_hHJ٦ RXrE^i_qôp[x§'ܝ=5s $в;Oh}u0Ȳ8iRA3T_OЙ <9)i*9˭Va%iCu+o2#AN~C'(r?%.Հ}ᩎC7OobKջTW}U/WgLm}7JeQܥeJk}T(m:vZviKIJݧ֘FiWc-䇠}Fj'._0+icO4ToZ뚫u8:M^ͯЃ3*ɸiRf~rj>#ƫUJ^d:g,n9ښO1ҥ Ө{;sy9ϗ ^hzhJ:p^}<+j5ð_6hDj8M.e%HiJ-:ܬ +h|۩X&˵ї_: Mٙ-5(e{F%Ppܤwk'Ț.6G9:кgpofPr$ TzvHv:MO<{[a}4vիMPܳ[GhWUܸrUss_X|jd뼎{g,n9ښ}QuC(ŕ>'rģOD^|S}dC0`O}RNֳVr51˚tydNA_c-o}N;R,XgRKE\rSsRϗ;గuۧzlzzzmX ; 0J5$Y\.x}?sv8ԖwFmӚ6yv*;%E;WmSw/IR^10mJvQ!j1d { |G6F]V_ǿc2Q=ү}@|%Ӄ7gԺcLحo?mɒ|:h<;W?OPfNw|yDQI4fl<埗mߐqi4oO;U$W]?{]]t,zZN-k:I߼SUkW}=H|%[]}k[)ȧ[+SGI5}k{6Х7fqI[S֖~ N-.Ou|L.<_N_zl=Jޔ-a?x1⡱:8SHH?EE\HTb~P8{J_##͠弉paسgVX:TWGюMXA,LZCpBAN NygZ? RIj{g)5\zM utTB ڸ2=01~`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:aCa`:a=6gn+Qv bKQ2IL'DQ\E$N&EM ø `dbMn2?ڍ]t}􏞞<= G P8bp0#(1 @a G P8bp0#(1 @a G P8bp|@MMM֭[+V&[?~@ 755_#YMMMҾb~ Pn3 @ 3 p(WΚ5k{ X}}}0pD֬Y2:d1cp0HՖy 5܃b:")pwIDATW/OSe gNuuuFRܼ4>=SOˬ󿕥mHw݈]cG 売)۷dˆ1лiY~yuucؾ*.0ޚ G:Kb:we^yo~j3u+rK;ҿ<Ҝi:̜<݁_\uf;emќN'|4_o53OsZ7w>!Oߑ7ߒK_ȎZN0P:o,'ONʬ7v5o$ȲǓ?['6s*SV==חRݝzԉc?#m\.fe|Uc4?W9Q:AV=!8Q'#}nږϞ%\2j9_-1rrEO6؝L$vMc*Le?9BUUU%'}f~ LJ'zfnylٲSsyWksLi]?wl?aZ&kq]kڸ-{{) 5jrf_ߜkkKGݖW{<}\sy s/ͧ' Ni(0p2oƞV퇾}RwE㋹vFp<{Q&uթ1/m3xnŴ+~K>Wi5kI==˳hvmjnlɽ?:+ G:}X KVtunK='0yǠ@!Sc}^Xa`!<1 wv0eP!<=bÄaƑpx<3pD:cPpKKK[r0pD0cP@‡|ptun-P$Is{ܱ~8ח_[7܃@)xQ7LkIENDB`ktikz/doc/0000771000175000017500000000000011455415074015121 5ustar fhackenbergerfhackenbergerktikz/doc/index.html0000660000175000017500000022044611455414613017124 0ustar fhackenbergerfhackenbergerThe QTikZ Handbook

The QTikZ Handbook

Glad Deschrijver

0.1

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, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

Abstract

QTikZ is program for Qt for creating TikZ (from the LaTeX pgf package) diagrams.


Chapter1.Introduction

QTikZ is a TikZ/PGF code editor for Qt which allows to preview the code real-time while editing. The editor features syntax highlighting of the TikZ/PGF code, the TikZ/PGF commands can be inserted from a menu or a dock widget, the style of the preview can be changed by setting a template.

Please report any problems or feature requests to the QTikZ author via the bug report dialog. This is accessible from the Help->Report Bug... menu of the application.

Chapter2.QTikZ Interface

QTikZ Main Window

QTikZ main window

The QTikZ main window consists of a (1) menu bar, (2) toolbar, (3) template selector, (4) text editor, (5) preview panel, (6) messages panel and (7) status bar.

The Preview and Messages panels can be shown or hidden in Settings->Sidebars. The visible panels can then be dragged around the QTikZ window by clicking and dragging the panel title.

QTikZ Editor

In the editor the source code of a TikZ picture (everything between “\begin{tikzpicture}” and “\end{tikzpicture}”) can be edited. While editing, a preview of the TikZ picture is generated on the fly in the Preview panel. The TikZ code is highlighted in different colors according to the syntax. Text-completion is provided for TikZ commands: when the user types the first letters of a TikZ command, the commands starting with those letters are listed and can be selected by the user using the arrow keys and pressing Enter. If a TikZ command is selected in this way or if it is selected from the Insert menu, the syntax of the command is shown in the status bar. In the inserted text the options or arguments that must be filled in are marked with •. The first of these symbols is automatically selected and can be overwritten by just typing. You can select the next or previous • by pressing Tab or Shift+Tab.

QTikZ find and replace panel

QTikZ replace current occurrence panel

If the user triggers the Find or Replace action, a “Find & Replace” panel appears at the bottom of the editor. In the Find text field, the text to be searched is entered. In the Replace with text field the text to replace with can be entered. Pressing the Find button will only search for the text, while pressing the Replace button will show a “Replace” bar with the following options: Replace the first occurrence, Replace All occurrences, Don't Replace the current occurrence, or Cancel the replace operation. Checking the Whole words option will cause the find to match only complete words, checking the Case sensitive option will cause the find to match only those occurrences which have exactly the same case (otherwise the find works case insensitive). Two arrow buttons are available which allow the user to specify the direction in which the search should be done (move backwards or forward in the text). Finally there is a Close button which causes the panel to be closed.

QTikZ go to line panel

If the user triggers the Go to Line action, a “Go to Line” panel appears at the bottom of the editor. In the Go to line spin box, the line number to which the cursor should be moved is enterred. Pressing Enter or the Go button closes the panel and moves the cursor in the editor to the specified line. Finally there is a Close button which causes the panel to be closed.

QTikZ Preview Panel

In the Preview panel an image which is the result of compiling the current TikZ code in the editor is shown. If there are errors in the TikZ code, an error message is shown instead. The preview can be enlarged or made smaller by pressing the Zoom In and Zoom out buttons or by changing the zoom percentage. The zoom percentage can also be changed by rolling the mouse wheel while pressing the Ctrl button.

If the TikZ code contains several pictures (enclosed by “\begin{tikzpicture}” and “\end{tikzpicture}”), then the preview will only show one picture. The other images can be shown by pressing the Previous Image and Next Image buttons which become available in this case.

QTikZ Messages Panel

If there are errors in the TikZ code, an error message is shown in the Messages panel. If the error message is not clear enough, then the user can press the View Log button and the complete LaTeX log file will be shown in the Messages panel.

QTikZ Template Selector

QTikZ template selector

The template selector consists of a text field in which the path to a template file is given, a button which opens a file selector dialog in which the template file can be selected, a reload button which can be pressed to regenerate the preview when the template file is edited in an external editor, and an Edit button which opens the template file in an external editor.

See the section on templates for more details on how to use templates in QTikZ.

Chapter3.Using QTikZ

Editing

The source code of a TikZ picture (this is the code between “\begin{tikzpicture}” and “\end{tikzpicture}” that would normally be included in a LaTeX file) is edited in the editor.

Example3.1.Example content of the editor

\begin{tikzpicture}[x=4cm,y=4cm]
  %\tikzstyle{every node}=[font=\small]
  \def\xx{0.3} \def\xy{0.7}

  \draw[color=black,fill=black!30]
    (0,0) node[below left] {$[0,0]$} --
    (1,1) node[right] {$[1,1]$} --
    (0,1) node[left] {$[0,1]$};
  \draw[-latex] (0,0) -- (1.125,0) node[right=3,below] {$x_1$};
  \draw[-latex] (0,0) -- (0,1.125) node[right=-1] {$x_2$};

  \fill[fill=black] (\xx,\xy) circle (.2em)
    node[right=20,above] {$x = [x_1,x_2]$};
  \draw[dashed] (\xx,0) node[below] {$x_1$}
    -- (\xx,\xy)
    -- (0,\xy) node[left] {$x_2$};
\end{tikzpicture}

While editing, a preview of the TikZ picture is generated on the fly in the Preview panel. If an error occurs, the error messages are displayed in the Messages panel. If the error messages are not clear, the complete LaTeX log file can be displayed in the Messages panel by clicking the View Log button.

When the TikZ picture contains function plots which are created externally using gnuplot, the Shell Escape option should be enabled in the toolbar or in the Process menu.

Warning

Note that enabling the Shell Escape option is dangerous, since this can cause malicious software to be run on your computer! So you should check the TikZ code and the LaTeX code in the template file to see which commands are executed.

Templates

QTikZ features a template mechanism. A template file is a skeleton LaTeX file in which all necessary packages and definitions are loaded and in which the style (fonts, ...) is determined. A template file does (usually) not contain any real contents, instead it contains a “replacement string” (which is <> by default) which is replaced by the TikZ code in the editor when the preview is generated.

When the preview is generated, QTikZ internally replaces the “replacement string” in the template file by the TikZ code in the editor and compiles the resulting LaTeX file. The resulting PDF file is then displayed in the Preview panel. If any errors occur during compilation (both errors in the TikZ code and in the template file), they are displayed in the Messages panel.

The user can create template files and specify the full path in the Template text field. If the Template text field is empty while generating the preview, an internal template file is used, so the user is not forced to create a template file.

For example, a template file named ktikz_template.pgs could contain the following:

Example3.2.An example template file

\documentclass{article}
\usepackage{mathptmx}
\usepackage{tikz}
\usepackage{color}
\DeclareSymbolFont{symbolsb}{OMS}{cmsy}{m}{n}
\SetSymbolFont{symbolsb}{bold}{OMS}{cmsy}{b}{n}
\DeclareSymbolFontAlphabet{\mathcal}{symbolsb}
\usepackage[active,pdftex,tightpage]{preview}
\PreviewEnvironment[]{tikzpicture}
\PreviewEnvironment[]{pgfpicture}
\begin{document}
<>
\end{document}

Example3.3.Another example template file

\documentclass[compress]{beamer}
\usetheme{Frankfurt}
\usepackage{amsmath}
\usepackage{booktabs}
\usepackage{tikz}
%\usepackage{color}
\usepackage[active,pdftex,tightpage]{preview}
\PreviewEnvironment[]{tikzpicture}
\input{hulpjes.tex}
\begin{document}
<>
\end{document}

Tips

The following are a number of tips to enhance the experience of using QTikZ.

Using the beamer commands \uncover and \only in PGF pictures

When creating tikzpictures which will be included in slides created with the LaTeX beamer package, one may need the commands \uncover or \only or similar in the tikzpicture itself. Support for these commands is not included in QTikZ by default. However, using an appropriate template it is possible to use these commands and QTikZ will generate several images in the preview which can be browsed using the Previous Image and Next Image buttons. The following example shows a template file which can be used for this purpose.

Example3.4.Example template file which allows to use the beamer commands \uncover and \only

\documentclass[compress]{beamer}
\usetheme{Berlin}
\setbeamercovered{transparent}
\usepackage{tikz}
\begin{document}
\begin{frame}{}
<>
\end{frame}
\end{document}

Using QTikZ for picture packages other than PGF

QTikZ is designed to be used for TikZ or PGF pictures (pictures created using the LaTeX PGF package). But by using the template mechanism in a smart way it is possible to use QTikZ also for other picture packages available in LaTeX. For example, the following template file could be used to be able to draw pspictures (with the pstricks package). Note however that pstricks only supports LaTeX -> PS -> PDF compilation, so you will also have to apply the next tip.

Example3.5.Example template file for pstricks

\documentclass{article}
\usepackage{mathptmx}
\usepackage{pstricks}
\DeclareSymbolFont{symbolsb}{OMS}{cmsy}{m}{n}
\SetSymbolFont{symbolsb}{bold}{OMS}{cmsy}{b}{n}
\DeclareSymbolFontAlphabet{\mathcal}{symbolsb}
\usepackage[active,dvips,tightpage]{preview}
\PreviewEnvironment[]{pspicture}
\begin{document}
<>
\end{document}

Example3.6.Example content of the editor

\psset{unit=.45pt}
\begin{pspicture}*(420, 420)
  \psset{linewidth=.4pt}
  % Frame
  \pspolygon(0, 0)(420, 0)(420, 420)(0, 420)
  % Circumscribed circle and inscribed circle
  \pscircle(206, 222){166.18}
  \pscircle(250, 197){75.42}
  % Adjacent circles
  \pscircle[linestyle=dashed](476, 135){157.68}
  \pscircle[linestyle=dashed](-32, -22){266.53}
  \pscircle[linestyle=dashed](132, 579){315.92}
  % triangle
  \psset{linewidth=1pt}
  \pspolygon(43, 253)(361, 283)(287, 77)
  % nine-points circle (Feuerbach)
  \pscircle[linestyle=dotted](242, 195){83.09}
\end{pspicture}

Using LaTeX -> PS -> PDF compilation

Since QTikZ is designed to be used for TikZ and PGF pictures, the compilation done behind the scenes is done with pdflatex. Using the following shell script (only for Unices) and an appropriate template file, it is however possible to generate the preview by using the latex, dvips, ps2pdf sequence (i.e. first compile to PS and then convert the PS to PDF).

Example3.7.LaTeX -> PS -> PDF compilation shell script

#!/bin/sh

# This shell script compiles a LaTeX file to PDF using the latex, dvips,
# ps2pdf sequence and is supposed to be used in QTikZ only, as a replacement
# for pdflatex.
# Therefore the following assumptions are made in the code of this script:
# - the only options with a value are -output-directory and -interaction
# - the name of the tex file passed to this script always ends on .tex
# - the name of the tex file is the only thing which is not an option or
#   the value of one of the above mentioned options

# Usage:
# - open QTikZ, go to Settings -> Configure QTikZ..., in the "General" tab
#   change the value of PDFLaTeX command to /path/to/ktikzlatex2ps2pdf.sh
# - in the "Template" box change the value to /path/to/ktikzlatex2ps2pdf_template.pgs

options=""
texfile=""

while test x"$1" != x
do
	case $1 in
		-output-directory|-interaction) # add their values to the list of options
			options="$options $1"
			shift
			options="$options $1"
			shift;;
		-*)
			options="$options $1"
			shift;;
		*)
			texfile=$1
			shift;;
	esac
done

texfilebasename=`echo $texfile | sed -e "s/\.tex$//"`

latex $options $texfilebasename.tex
# return when latex fails (otherwise ps2pdf below runs without errors)
latexreturn=$?
if test $latexreturn -ne 0
then
	exit 1
fi

export DVIPSHEADERS=$DVIPSHEADERS:$TEXINPUTS # if a dvips header file is located in the same directory as the template file, then this will make dvips find it
dvips -Ppdf -G0 -o $texfilebasename.ps $texfilebasename.dvi

ps2pdf14 $texfilebasename.ps $texfilebasename.pdf

Example3.8.Example template file for LaTeX -> PS -> PDF compilation

\documentclass{article}
\usepackage{mathptmx}
\usepackage{tikz}
\usepackage{color}
\DeclareSymbolFont{symbolsb}{OMS}{cmsy}{m}{n}
\SetSymbolFont{symbolsb}{bold}{OMS}{cmsy}{b}{n}
\DeclareSymbolFontAlphabet{\mathcal}{symbolsb}
\usepackage[active,dvips,tightpage]{preview}
\PreviewEnvironment[]{tikzpicture}
\PreviewEnvironment[]{pgfpicture}
\begin{document}
<>
\end{document}

In the configuration dialog (Settings->Configure QTikZ...), the PDFLaTeX command should be replaced by the full path to the above shell script (or simply the shell script name if the script is in the PATH). In the main window, the Template should be replaced by the above template (or another template file that is compatible with LaTeX -> PS -> PDF compilation).

Shortcuts

Many of the shortcuts are configurable by way of the Settings menu. By default QTikZ honors the following shortcuts:

Left Arrow

Move the cursor one character to the left.

Right Arrow

Move the cursor one character to the right.

Up Arrow

Move the cursor up one line.

Down Arrow

Move the cursor down one line.

Page Up

Move the cursor up one page.

Page Down

Move the cursor down one page.

Backspace

Delete the character to the left of the cursor.

Home

Move the cursor to the beginning of the line.

End

Move the cursor to the end of the line.

Delete

Delete the character to the right of the cursor (or any selected text).

Shift+Left Arrow

Mark text one character to the left.

Shift+Right Arrow

Mark text one character to the right.

F1

Help

Shift+F1

What's this?

F3

Find Next

Shift+F3

Find Previous

Ctrl+A

Select All

Ctrl+C

Copy the marked text to the clipboard.

Ctrl+D

Comment

Ctrl+Shift+D

Uncomment

Ctrl+F

Find

Ctrl+G

Go to line...

Ctrl+I

Indent selection.

Ctrl+N

New document.

Ctrl+O

Open a document.

Ctrl+Q

Quit - close active copy of editor.

Ctrl+R

Invokes the Replace command.

Ctrl+S

Invokes the Save command.

Ctrl+V

Paste the clipboard text into line edit.

Ctrl+W

Invokes the Close command.

Ctrl+X

Delete the marked text and copy it to the clipboard.

Ctrl+Z

Invokes the Undo command.

Ctrl+Shift+Z

Invokes the Redo command.

Ctrl++

Zoom In

Ctrl+-

Zoom Out

Chapter4.Command Reference

The File Menu

File->New (Ctrl+N)

This starts a new document in a new and independent editor window.

File->Open... (Ctrl+O)

Displays a standard Qt Open File dialog. Use the file view to select the file you want to open, and click on Open to open it. You can find more information about the Qt Open File dialog in the Qt User Guide.

File->Open Recent

This is a shortcut to open recently saved documents. Clicking on this item opens a list to the side of the menu with several of the most recently saved files. Clicking on a specific file will open it in QTikZ - if the file still resides at the same location.

File->Save (Ctrl+S)

This saves the current document. If there has already been a save of the document then this will overwrite the previously saved file without asking for the user's consent. If it is the first save of a new document the save as dialog (described below) will be invoked.

File->Save As...

This allows a document to be saved with a new file name. This is done by means of the file dialog box described above in the Open section of this help file.

File->Export

Exports the current document to different formats, so that the document can be viewed as an image. Currently the document can be exported as Encapsulated PostScript (EPS), Portable Document Format (PDF) and Portable Network Graphics (PNG).

File->Reload (F5)

Reload the current document from disk. If you have made unsaved changes, you will be prompted to save the file before QTikZ reloads it.

File->Close (Ctrl+W)

Close the active file with this command. If you have made unsaved changes, you will be prompted to save the file before QTikZ closes it.

File->Quit (Ctrl+Q)

This will close the editor window, if you have more than one instance of QTikZ running, through the New or Open menu items, those instances will not be closed.

The Edit Menu

Edit->Undo (Ctrl+Z)

This is used to eliminate or reverse the most recent user action or operation.

Edit->Redo (Ctrl+Shift+Z)

This will reverse the most recent change (if any) made using Undo.

Edit->Cut (Ctrl+X)

This command deletes the current selection and places it on the clipboard. The clipboard is a feature of Qt that works invisibly to provide a way to transfer data between applications.

Edit->Copy (Ctrl+C)

This copies the currently selected text to the clipboard so that it may be pasted elsewhere. The clipboard is a feature of Qt that works invisibly to provide a way to transfer data between applications.

Edit->Paste (Ctrl+V)

This will insert the contents of the clipboard at the cursor position. The clipboard is feature of Qt that works invisibly to provide a way to transfer data between applications.

Edit->Select All (Ctrl+A)

This will select the entire document. This could be very useful for copying the entire file to another application.

Tools->Indent (Ctrl+I)

This increases the paragraph's indentation by one step. The size of the step can be selected in the dialog that appears when triggering this action.

Tools->Comment (Ctrl+D)

This adds the LaTeX comment character “%” and one space to the beginning of the line where the text cursor is located or to the beginning of any selected lines.

Tools->Uncomment (Ctrl+Shift+D)

This removes the LaTeX comment character “%” and one space (if any exist) from the beginning of the line where the text cursor is located or from the beginning of any selected lines.

Edit->Find... (Ctrl+F)

This opens the search bar at the bottom of the editor window. On the left side of the bar is an icon to close the bar, followed by a small text box for entering the search pattern.

You have to enter the characters of your search pattern and press the Find button. If there is a match in the text, this is highlighted. Continue to press the Find button to find the next matches. If the search pattern does not match any string in the subsequent text anymore, a dialog asking to start searching from the beginning is shown.

Use the Search Backwards or Search Forward button to direct the search to proceed in an upwardly or downwardly direction.

You can modify the search behaviour by selecting different Options: Checking Whole Words Only prevents the search from stopping on words that contain the searched for pattern. Selecting Case Sensitive will limit finds to entries that match the case (upper or lower) of each of the characters in the search pattern.

Edit->Find Next (F3)

This repeats the last find operation, if any, otherwise starts a new find operation.

Edit->Find Previous (Shift+F3)

This repeats the last find operation, if any, searching backwards instead of forwards through the document.

Edit->Replace... (Ctrl+R)

This opens the search and replace bar at the bottom of the editor window. On the left side of the bar is an icon to close the bar, followed by a small text box for entering the search pattern.

Use the Search Backwards or Search Forward button to direct the search to proceed in an upwardly or downwardly direction.

You can modify the search behaviour by selecting different Options: Checking Whole Words Only prevents the search from stopping on words that contain the searched for pattern. Selecting Case Sensitive will limit finds to entries that match the case (upper or lower) of each of the characters in the search pattern.

Enter the text to be replaced in the text box labeled Find and the text to replace with in the text box labeled Replace, then click the Replace button. The replace bar is replaced by a set of buttons. If there is a match in the text, this is highlighted. Press Replace to replace the currently highlighted text. Continue to press the Replace button to find and replace the next matches. If the search pattern does not match any string in the subsequent text anymore, a dialog asking to start searching from the beginning is shown. Press the Replace All button to replace the search text in the whole document. Press the Don't Replace button to skip the currently highlighted text and find the next match. Press the Cancel button to cancel the replacing.

The View menu

The View menu allows you to manage settings specific to the preview.

View->Zoom In (Ctrl++)

Increase the magnification of the document view.

View->Zoom Out (Ctrl+-)

Decrease the magnification of the document view.

View->Previous Image (Alt+Left)

Show the preview of the previous TikZ picture in the code. This item is only shown when there are multiple TikZ pictures in the code (delimited by “\begin{tikzpicture}” and “\end{tikzpicture}”).

View->Next Image (Alt+Right)

Show the preview of the next TikZ picture in the code. This item is only shown when there are multiple TikZ pictures in the code (delimited by “\begin{tikzpicture}” and “\end{tikzpicture}”).

The Go Menu

Go->Go to Line... (Ctrl+G)

This opens the goto line bar at the bottom of the window which is used to have the cursor jump to a particular line (specified by number) in the document. The line number may be entered directly into the text box or graphically by clicking on the up or down arrow spin controls at the side of the text box. The little up arrow will increase the line number and the down arrow decrease it. Close the bar with a click on the icon on the left side of the bar.

The Process Menu

Process->Stop Process (Esc)

Abort the execution of the currently running process.

Process->View Log

Show the LaTeX log file in the Messages panel.

Process->Shell Escape

Enable LaTeX to run shell commands, this is needed when you want to plot functions using gnuplot within TikZ.

Warning

Enabling this may cause malicious software to be run on your computer! Check the LaTeX code to see which commands are executed.

The Insert Menu

This menu contains a (currently non-exhaustive) list of TikZ commands. By selecting them, you can insert them in the text at the cursor's current position.

The Settings Menu

Settings->Toolbars

This submenu lists the available toolbars, each item toggles the display of the associated toolbar. When checked, each item displays a movable toolbar containing buttons used to initiate frequently used commands. When unchecked the toolbar is hidden.

Settings->Sidebars

This submenu lists the available sidebars, each item toggles the display of the associated sidebar.

Settings->Configure QTikZ...

This menu item opens a dialog whereby several different settings may be adjusted.

The Help Menu

QTikZ has a standard Qt Help as described below, with one addition:

Help->TikZ Manual

Opens the TikZ Manual. This is the full TikZ Manual bundled with the LaTeX PGF package, it contains a tutorial on how to use TikZ and a reference guide of all PGF and TikZ commands.

The standard Qt Help entries are:

Help->QTikZ Handbook (F1)

Invokes the Qt Help system starting at the QTikZ help pages. (this document).

Help->What's This? (Shift+F1)

Changes the mouse cursor to a combination arrow and question mark. Clicking on items within QTikZ will open a help window (if one exists for the particular item) explaining the item's function.

Help->About QTikZ

This will display version and author information.

Help->About Qt

This displays the Qt version and other basic information.

Chapter5.Configure QTikZ

General Configuration

In order to configure QTikZ the user needs to access the QTikZ Configuration dialog. This can be accessed via the menu bar, by selecting Settings->Configure QTikZ....

The QTikZ Configuration dialog consists of three sections; General, Editor and Highlighting. Clicking one of these sections in the vertical list on the left side of the dialog will make those options available accordingly. The options available are displayed to the right of the dialog.

By means of buttons along the bottom of the box the user can control the configuration process. You may invoke the Help system, accept the current settings and close the dialog by means of the OK button, or Cancel the process.

The categories General, Editor and Highlighting are detailed in the following sections.

General

This section of the dialog lets you configure the interface and set the paths to the necessary executables and the documentation.

QTikZ Configuration Window Showing The General Options

Interface
Show TikZ commands in dock instead of menu

If this option is checked, a dock widget is available with a list of TikZ commands which you can insert in your code by clicking on them. If this option is not checked, the TikZ commands will be available in a menu instead. You have to restart QTikZ for this change to take effect.

Preview generation

Specify whether the preview should be generated automatically or manually.

Automatically

If this option is checked, the TikZ code in the editor is compiled while editing.

Manually

If this option is checked, a Build button is available and the TikZ code is only compiled when you press that button.

Commands
PDFLaTeX command

Enter the path of the PDFLaTeX executable here. This executable is used to typeset a LaTeX file containing the TikZ code in order to generate the preview.

Pdftops command

Enter the path to the pdftops executable (part of poppler) here. This executable is used to export the image to EPS (Encapsulated PostScript).

Templates
Replace text

Enter the text which will be replaced by the TikZ code in the template here.

Editor command

Enter the path to the executable of the text editor for the template here.

Help
TikZ documentation

Enter the path to the file containing the TikZ documentation here. An URL to online documentation may also be given.

Search

Press this button to search the file containing the TikZ documentation in the TeX directory structure using kpsewhich.

Editor

This section of the dialog lets you configure the look and feel of the text editor.

QTikZ Configuration Window Showing The Editor Options

Editor
Text font

Select the font of the unhighlighted main text.

Show white spaces

Show white spaces in the text by replacing them with special symbols. These symbols will not be saved on disk.

Use color

Select the color in which the spaces will be shown.

Show tabulators

Show tabulators in the text by replacing them with special symbols. These symbols will not be saved on disk.

Use color

Select the color in which the tabulators will be shown.

Show matching brackets

If the cursor is on a bracket ({[]}), then the corresponding opening/closing bracket will be highlighted.

Use color

Select the color in which the highlighted brackets will be shown.

Use command completion

When the first letters of a TikZ command are typed in the text, a list of possible completions will be shown.

Highlighting

This section of the dialog lets you configure the fonts and colors for the highlighted code in the text editor.

QTikZ Configuration Window Showing The Highlighting Options

Highlighting
Standard

When this option is checked, the default fonts and colors are used in the output.

Custom

When this option is checked, the fonts and colors defined below will be used in the output instead of the default ones.

Change style for

Select in the table the structure appearing in the TikZ code for which you want to change the fonts and colors.

Change font

Select the font in which the structure that you selected in the table above should be displayed.

Change color

Select the text color in which the structure that you selected in the table above should be displayed.

Chapter6.Credits and License

QTikZ

Program copyright 2007-2010 Florian Hackenberger

Program copyright 2007-2010 Glad Deschrijver

Documentation copyright 2010 Glad Deschrijver

This documentation is licensed under the terms of the GNU Free Documentation License.

This program is licensed under the terms of the GNU General Public License.

AppendixA.Installation

How to obtain QTikZ

QTikZ can be found at the official homepage. QTikZ is also available at http://www.kde-apps.org.

Requirements

In order to successfully use QTikZ you need to at least to have Qt 4.4 and poppler 0.6 installed.

Compilation and Installation

In order to compile QTikZ it is necessary to install the development packages for Qt 4.4, poppler 0.6 and gcc.

For detailed information on how to compile and install QTikZ, see the INSTALL file that is provided with the source.

Since Qt uses qmake you should have no trouble compiling QTikZ. Should you run into problems please report them via email to the developers.

ktikz/doc/interface-mainwindow.png0000660000175000017500000053777011455414613021762 0ustar fhackenbergerfhackenbergerPNG  IHDRvsj, pHYs& StEXtDescriptionWindow Class: ktikz<~!tEXtTitlehfst01-relatie.pgf* - KTikZۚ IDATxwƿd})ҫ,I`Elׂ*{PlҶfS&L2ق|l&^fHbb"AkРjvԮ؉SO5 k+{lXNDvjV'RV E-! $mij0JU%P VĂSѠm!Bk31LD))ւ `C6:Ad2e1Yn8EFii)]v[ Hee% h4O5hЂh%LU8a훩/GI(*{5R;_IcAsCmw~[ #UDhQX* 5JENP%a :rbGC[W Q#B[vϫ*ښMћ0::= UW_t!bX(-)a 5t:.[6m"];5qG6XGUN2J檝ZG\(ʵSVi-%,l[RБk#&bQo\^i*v4hPwRr:1Ⱥ:V-Ġ0t :qz8*Y|TTTpg2ӉjnV+I>}8pN3$/ukm p933Ofx 1[m2ٹTBۇ} 4Vh74!7%9D8T i@33fqle؆/pc <,~ mmge/;߆~VI\? Jujcߣ͌V}ACF,5-"A'l%%%QTZKm]=g%Uf;m-t1W'_;8Xkrq1bz}ȆHyy9iij ioHJN*` ]M!o@$9^ <§[Xpuweg PT쁜zm~[ 3 Jt'n1\!/tz GaE[ÚGeL7g?xsx>KYʏ^ =v5˷!em~}fr}HM_]G9^DYDŪQtJ8D66V}P;o[ v,9|CAF0bn J/fR2R rT1*괠h$S->MѠM B8zU;h׾=s{Wظa<;_6wҚԔJku>nCcrr8DΘ08 vh2 83Φf餢va1qa_\**+U턅]%dz=_ygmGhI @H5vݼK5їU%_boY}=E cj 1"WoĮF7H"Hr3 S\|{^:őUo0x <cY3YqnQǐύ ?g=0| `@$7u߀ ^i!?#0%zN~BꛥZTGAR(+wԪ6QIF26JleV؆ 1O S1 RU%a%l){.Hl|硔{.I*(jdCTG6 )Ma`Z)>rXJXbGdR74KcyywqWujOl:fhcNVYKBb2r›Kְ8NEٌ^flYu:f H{1b YĻgTg2g&哟?aL|-/ii'qF7!-eU@&罽_\l|-6Oݧf1bԴy*\ n{>;73>C`ozsWsO9un|t#o|z F u0`HП]˖sV;yK^ez^>􁵐7'?C~:Z]ON'a׾#'d)aԿQ/N$ɼ۲Pz`)w'N #/H"[i#% *+ tR AJ|Vb?ȵUzɱ iIF\I(CJڷ&QG.w ȣUߣhРRO?7ϡ{ r]w(˖/{ͽ?g}Xر# ~Ʋ˹xY3t;PE+@j^GYE|C%۩#rHOI"Ԙ?t8p\8{f t܊_rԁKہxHc3!m%t?/كӰ4w ›nY0Cf\lF.#~4p^|1W5;ب? l(q"2J*){ٗ~"OKwdϯ؆-|f>~ާ^΍kd]ϓ!DSӆuº֐9:f˾yĉG!t)Roݵ[P`0VeD_t[ypy $/af76v*)/+j*(/+ށbh-d܋*Coeg0>LeYeel?zӼss?{X;j)fl{(Iv]TBQGxL Q%!H @^᠐O$7f09F>^?o8ۨ8\iay.mkDX=>MѠmAJSsoyeo^~QE+ //7|'|ş/MƆ 4d2Pty@v܎TTVװrJ vOT;ed%ѵ}zȝ8'aIϥ8n 55^̲a_9`K|v}u|:JM%eҮC7{ƅs$GŸP#mN{笣Z`^g8KF*]GԈO?}7!AtQ"&Г2*Ԝ͜6okZ̞g??|Dތy:y;Me[}ېAhdH7,\0k u9'21籨>\SΨЍlC#1MnG!!ﭥħXq"ξ=/zݒ|uLٛp=dr{;vnjKYrL{Y%tӨ~7SIXlCqTEDAz;5woF7 ܲl=7;xcN6\;)^?6؏2q2-0HC1#Rn%!pJĔ($+ᎄ_H#Wb8?@T/ M(Ҡ! ~{w.|`m#GS>XTK/(,K>}x뭷YHz)>s>#̙|.; NyԚ)cN:uY9ܕ ]:w?Ê)̢1zHEy:O{:x0b)+-h4] !dVuuA3. u58aӶpKyΥ 9Le?;TWR1:.k ֆ<-oϦ]/x {E%6E(7̞0̗.=]|rOTWA\>]C}GK,Tl^=S%ኇફ⧄@08OxoO1 *4NTr _Z^.B4k6=f%Ѷ"J *G"4jAe% $GS3 <>ADh"Or+l*YY5䱦O+CR'J!Gjry[_2>>utD $4ݎ࣏>7ߦZMAg#.pAzce¨?-Z…ѡC,XșgNg+RqHM42[;J*鐙Bn:2x)qiꗇZ\p]:0o5tu0P)?±Խ"w9C85\n=L]lZ7?'?1;ϼqMɏlcsr ʐvF'Mj\NJO{u@;'_OOz8\L,.Jy,\+~$7>7|wۯ$ r+vg"y-P]ώcr uȽ5s&c+-r'[xӖQ'Dqg"5WK/,7==SqIgޅdy$;'dwqw5D3ֶZㇶ DSsF ȲmSůG#i+791y@~5OP~~b_hBAmQ(R(!/م"l-N }| :JDԠAC i 5U8r){w簾Ik)Hq/, 8@DQS<~$ %#3EՒ/qCI{e`]F8%eA#h4mqTUU1g:ڥXzh߾uD}]߉NHLdtԉ,;aAC%HՆ"weDr;>`=ϼn䎼kNSs͗e, JF&}v@GgD~g=DMa;%a&/r[{&b>}: <=Y's;u5Cw@LB?(lKh'\0# '!tC QE*V~TO,>>1҉Ư95QG6PBUUM!zOb6sҡ28s9rl/FC\.!6ǔ3iߩƄ WPVV(o׎P'$о}{JK(U@RR"b ;(/}$$$q9mǏ Ͻ{?Ւ;<z ;8 ֱd| )Lxs|,[qfb= y\t"+X|?mwOYȪoWQ C=˭Si/mΘ]bS}I;].X#/x z'gªB''s{O2)]Qნ; :V{O%@;a/?: xڙA+6]Er% ̘O%p peM*17+6cPmo[OF O$2$ĄwhРAb)4'wEY%%>e(*+ź j%1) Sz󻒓2[%>G'Wt4h1wbRbxatr9 j>\RRSiCjjN%L}[oXϺgp_pZ/ }h⎛P]q"jO~**595QG wbRb1[`0Ajj*Vc9˅N#11Ʉ^@OCkF$I1ˮ[O4Uպ;#Y rK9kxOyGW>@b]'G޳Y_HaH $|C)W#`[ph#Y #Vߑη >3f8@N;+c\#9jjДk68Ӌ 稿~!m%Έ8m;$F1OEKF VU' M %?ps^Wr >|B~=209I}+<Ƒц@{"_3hРA B!C.A!6ml{%1$cȎ#m'K=p  ޅMksސRf/I;Ϙ\Dgؼy)L{)p4̳+~E!ʞB{k 4Oϒxr2X_8"l{qBeo@||s#Siڧ Q f$㊠(+WfƊ J R"VgȗWhРA q 4IKW嶑5ִzFt+QM7!ޏ(2pqBI4Kׅ<ړItOR Ny&}Ģpty> 9P$1]DN?Y1UlBQCj S2}A䛐oU *px$9[Xi\% 9(5AG Gt1 ߴQ\}V3Bʹ5AC(WX xqH wJBnN/^8=/YøYG2TroT#+F,8A5N@  ;";;}_'?Yko^]n_bgxC6`c.;W* #zi).\Z~{~6qW2+Yh̀}> g ?"c=pC.l-? .7=¨}<䳸5Tuݏ5M7s̟2~ՐoA\QCbggs;}u\=t4gS$9Gn儞`BPbpt\'9e]vČa߉l&9 vXUK!$O4 |EeB\1=Ȋ"o/jb p*+ë{װE01GX tę]ui rV s9Lpk*FsRFcq89. N}.%sb5wF=SOz_./丙}h>IJOjyճL.E'NQ^Z5 gĪc=3nI6w]78H5ʋW(z#S}FF~7%8<j?D,1$0cs/_I,":Jk<&A2z5}(HIR!,_˫9vhkbeL?d?fy1*oҶVW#3D儜ʙH U].WDWKaC!+Bm OINQ O GQ y6F%+Wy}UA C4=;{6uWF>7esSi'&jX اqYWΥuq{7^ֹ_dHHWphʅqp9ob܁$I鿬'Y~%vݶ8:]0yK L{V+{V7.V}OD_x9\h.Ir,:ز{P2;xGnٳBe·[H'p9 g>vNXC|Y__f6>s.W= #T.U>+q2o=I}gars3_7ffM'>ǐZ-_/ϵĺU`kP \nZEQ ^%dc浟N~_λe 1f6~>eh=\?IEw3882//{ AuN*!3,Dфfpʊe!Ku!(wvuѠAbIg1f0.BGH|TЗn9^)zt~~Ra[`ݵKshoa|2 rOf#kl#vw9=p|UUSY~[Y7qsTX:jRifcc53?_x70:qͿc^ %N^>F2|.{O=k`e34ݝ-L^ւto?y2 ރ镦C2jVٹ*?e`wX |(CN)9г/C[iStf@tZk8 F !:d0C]*U}XЏn=7g_B>巠}Lt6ѵY)| /^OiUdGT:'O$\H~T U&GKnw)}$!'V4m \x·hPk?Ovr'~ҠA @;::\\ͽGJj%pRnc³@N5f6 DlUMJnb_Oj\Z`18kpb#j2]_fcdz`v71aR /?;Ecw8K;UݐCX@quggY(|JՂpT63=,`jw ?(Å/1HOK@M3,&+Sp 7nd?o,&GJ##zg-!s {%i,a0E_߸/:MGJJT &O9RԉƠzsxi1'432pnDEp/\ Y]g=fEe{)s&olSo#퓛Ǹt:$RP DnzdsN=vq;.Aּz7}_͠P KpmlX(&` s;<]x _7r~F\mARAQP]%I#7^Kt>ma [} *ss{<2pԸHN4=8&$cDa$BLJiUݯ>(}$$8eKi_E՘ن28bNbs<6#~7m=W5hР%l*38˟Ï3k<`Щ7rqjrR{{[G.h1sg3߻Haa$/ BoIמgɈDR'qGr )#5ԨOF2sBW,=2=:&Vs-=OOWAօ!/GgI3{3G݂͐w#Ii:{S=gqc\{T<KA΢宽i'0YGϚ+B|:}oU5Ks:*טmvTXf?{wʤa$uyg"eApgÝUk[N}CsIxfش9<0'H]ȰsZ{Nf 0$Z!V&= ^ϻHsyIo>*W=."Y9Eoϐ _IF 8b"11[yA mBEEXWkРANz1g|x~x $s!TӓBGͤh 1AmBF UxcGAY5Ѡ0n.Bm!$o bȊ 94hРAIIXA G TnYwòwϽNg=H BOPq#Vqb e+/GTEH6ADiuN*sњ'\fZAlKTčEƶ/oU?MРA%rkDk 'W) mep5_K̻& <~;A~PG$n A)aUc \QCS?^!8j+B_ܠ&e#H 򎶡dkafԠ*h;4hРm@A 1g5<7S68[U;d !l+HH cjB 4MҠAVOri)PS~qfOx-&U,+@O"F ;[x/XLMѠAVaGHkРACk tK=KOd$QlHjNj"QK51kk7-,Q3D6yS" &hРAh;4hІbIJG V !t9G3Ń\( լc֖ lQ"md{]ҌӜWA mA m&5OI~\DpM?ҞrN DԘیƣd|]NwBϷśpc0Izq,>rğ [MP`z@VV&Iv؉>}vTe1>OJL•颶Eńh V+Zd&hРA0@ﮢ"/Zڻ9ϱ4&ыv{_Ϣe C7r܎ԩSkc۷^M%N# q Xza\NCnmF4#DQrVv+V@e%qz=:͆#.vt>4tM(p\!N5P[fԨQ7ߐޘoN1#4䭭#ɩud}M)>c=M6>D)lb쓸8I1zш&l۶ ˅^G׷uZ_Qq8t:h`#v;fӉӹu &F1}A G;dϘơ ߦ ;D;@.=9>x:'Ϗ =nj)OIkY3coa!cƎ%>>7 }"4 VXq ;s7cǓk }zxL3kfN'˖/k64f3~}Czr2&Oøq$w :JJ~_|_fs0F>ݻt-Q)--e$$$4 0LجVf3ߟ[SohE0 XVwtr1pADQ$77b:o8 94DhAAAN޽{P]]Mzz:z:55j``nt:ݎ9&ل@+ Zf3%ewIf1zHrHMM z&WXUTWWefzpw@UU[6of!GtI IDAT3oHqI u|f7vPQg%d[n2'F^n;r=$ 4hُu:]ziKq!?'jj{Kk+9]k{_nWǤQ͉Ƒg4<m)\.|Ipb Pe!bΝ8N\l55rU+}FϕWbJMuOM FA wp: Jly}1NС-K@EJJJ8~DϚ!OX,O 2Mi}vÐ!CWZ"%kp8ظq#K~=®x&Lű]<;qv^\S,1h--؄Cc~:NHIIiZ/RRR蔗eݻ;ʒ ;#{ӣsN&Ǒ׎M{b"/z_4h7Š&QGJ]{sxCqSriA CPhe{4rѷO_<8ѽ|lDDĆ1_(b;p:]8NwŎvDQdPb|xH4maЉ:D":IQm3x0eZCmM&zvv# ŮUG3.EYdSPXf!~vyLLg/IOabOkj!7Mԑ?lع/VUgxOFV8=QOzfw#dd5tmWH^n4hР Wku<O}bzGt:Xg.t5?|6S?:Bk zNSlqDoA {N1bp~~ZN| tᘡSu;*q`rp:]m\dNWkwVwc9pĆiX.\Aol_C.]c'\?Wƣ:v<,@}ُiιvg^@i^"\TЛcW^I҅t_?,gk7sƨ^>=72'ԭ↑ymKJJXf Ç tb0t:Ϛ,NAJJ (bZX,ߟ5kRRR"]+'#~>.l|[lQy8Wq{?Z@]?Ual6OHvZ_{flf 8pZ f|9xgZ_N~y/vbK/Ϙ7a[9`ۇu ˎ;l6DQj1͘f멪s~Y,vI߾}CD3-/\;+B[}߿aq^uSa^oDRۥ7E&k:\MzlF}dWCaۃr.OOk,nX s,|;bpn*Aydg12cQ]nYd{<~77|tdcv˓+B>vÇc/^qlDw СT98Ro`#`s©:gݵ#):p@Ag}^xl-f hkaSy@hР!]-PxWxOJH#$ Iǿ_k'?'@633tM 2eD#W?;kz#uff{_ ?=K䮗~iTw_/fMYԁ[q"N q:{>oX jE\ ;[SŎBtIrEptzp!ч`<(Rb9B cy 5h$nb s1NNYn!5rRSS*/g{x"ֱs8Ny+^ }{n>ѱy`\.֮]ˠyVd:udXV\.999撙۱Z@޽Yv-'OuWF/J1O6q2!.֍%oUQ|?^?1yӷ[&>!.\f3NNX'%gW6_/8;p}y%^> |_xL snENF։vn{VWWc2|֬jD\\.S]ոBQ1o\D-b$Vfl-M㓎bUUX۫#*`e;r/9q5~C.)j233eFȜOrV=[]EcSlzrB:{L.`ǼXmϝ?? ܺ ם}w.NNd|. hwQVVJEHO42!3B\"8+ q+qY*;ʝTUU)"9}wέ(נAC)X: u "eyWQ Oz#$RCK@PzU@ؽWػW﵃wDlXMD@z -ew?N!!993sfgfy}[\:pf7)*bK.=#)n)օiLMt2_3G&z쀜? қs"T#4귤( +9t[˧ Z.g?1WG z^J;3TWP([mKZzs ﭱV>qZ6'Yt(loaoW: $I">>fb!::YCmTEЂ0K":K":lYlw`Wyď;? hٷ.3~=~_0_~' wmP%i理؁e;3oLm>)j+ߧ>koʐQ/_W`.{෕ǼsڋůHٳX?rJ`g3uqHŹK& LTZve3[Z&@6a(ZAy3/pA6SSIiݓ?ۅϷo' TRR‡c ͣL|F.6s몌ÇoAsC1MXFY.PLQ`4UvϏ#"ڌ Ha F2UK#<΃zqmw3]mp1sO#5w|Z @&= L +yB.}YҔdڝӝd=( xe|RVڌ~ j;{Z&VAFhJvU\Kv_/OtZ8p0Zu@(Qiq-`"K^?JFDd^yhQ6Ͼq]v[ܧsy3Ŋñ.κddz1u(sVjCYEX@C?nAyD\W1͆d97NR 5esyo;7 ^qT+3 ;ٳsOMKc}QVl۶-lxWѶmjFuˁ[A@-袛…+ؖWz#0rEeI;妱mżD6ݬy5Rݸh\{eU߱p*\vDŚJW.oƍQw=,v噗pq ԄcwMwL!MOlwxdrw"Z|>_ෑeN?A`ܡK:.pHz}жT]؏k:Y;۱"L]Kӑ.}c`;o y[݉З`ڠ)nضk#_ϚR;9gmϴXwҾ~֮[޼<,o>LF#萕b$,s:(BfؗϦٰ͛qc{TU {9{YKP:hKEFZߝW`(Qlyggs'҉'ˬkQk(Ip|v{wmd+haPQ*Os;ܹ]+>H@$|z{/r?Q(w2_O?NByy8ٍ?F-"wPo>7NdRDOp 0u c0?ȥTU֝qM\+Rכe[XBsKl<+ (  }YHD*:5')7}k7%+1gL6Ok kW]ʚg:1F49څO>8hGUh=^Dxxv3>G/]'Ni#DdB|xcndOnw8v9~D3؉']家'IHCC㔠ႝ*:ClDKYB۔x#`w,>0~$ThҌ ukV\;!_-quypLGu:z;21sc>w."; wqnYn~VR3.x5a1wNf,_-~x ZM_d߿W?rߟtڱ b}\0 5Co]4MnlS .Ӎh\?ï?R^O}`nUWf%.\'Wc.0,+ ɸ~\^?ga?./\)"izϳ7 &u'?0@L z"BB02kh}!;`%L_NY1 @LL 111GJ^yAdx0f2Khi H_y^k? ~^f|:f}\Ĵ˲hѲeh36zFD.6lgI6b'o:.:qtѻX23ejkÿKycaHM3UE' [ٳ~+zAE@Q2F@D,1p[}5ec~CǐƗ@f2Kim&(:u$Yfn65@gmQݱY|6}q3\(JH[cHx*'?rMx<'p?CCb}Ux<^|ylJlJ^y%d#/?t&7$~|\QTD" +TW2Q7 c o}oDP}mx5444ةMcP&&Y͔SV>۱bEqC s=a-H$ _.pp%{~neBJ \|ky?Oζ,(lɘVڳ; DA~ͱ" 5Ԣ&+p[EuT:L_F\}Tl+(pH ւ.AGTS /B%XHA x;~zjmǜVDuc1|}Nd| +z?[.;H ǣL.npt?'ǂJa1^TUEo0T? C"(rX(:(JA,= b[QPՂ_C>7TzWnCeI0?0 @nn.ш`@QTTDECqq1a;"k :NFyo~#$ry5*ˁbn9tܐ֘h$>1€5{BBacԀh#ұө/_ooRUJ\[I$yο綒q{!i$С:t`ňAӡM7gp]3$U[`#w=ͷng_h&O8p;FlpDa[ IDATI! CV3:{+hX9N'tjB Er l "Ie^#˸ ); I-&1I뿞1s۞r]Y~O07!yNe;~+}r*rz\.A}Մ:oQYY;2tN[ȜJvTپ& R\ X%@qRa N'e."u܅.T˜b9\%֗Ds _9#:lun*޲,3ZpA kG_vDAKG ojejbŜ5x$JUR(xbgMɜbe~HhvdDGGSVV99$ ٰJLJ$lXhN'ɄSYYSo I̾zk񎬧~Ⓢku7_ϹDMiP[}x>wGF}2%!c6 }T~{>52<݌F=R+aGq8 K\R)U~⽩IRqqcRyk3"_7~̾;j?@j]u>332t1dy&ZK6Iw5+nV6}mͱ')u>.Ml>6rrr{|L8ɸ#''E.]X*DZ%1#5B[PQ?`Nzl6Gөn2D:Տ/4dG4GE÷bQSk'|0vdjh4&C'1?y,mg) rRГҳ3?`}J?2[h5 %;MqaDja19xtXMj aS1@'djҁ ֚RP8v.ywH-1 ./#_E[ƾa*/53xxq׉!Z_һ?>>+b7-YČ\!B.0 ok$I;wF>pB~Ͻ(Ixe,y~^BѦ; 灯sng@Ô!:f>ICyh.]J~6XT]g0s+W%;<%&[~ExT s\FA81uUC|YYYt9}ƍ`4.Pܔ˥Х-B2zs&u76Nhh2i&%6f'aNWb-[ ќ=/ͭzpZW78x=x<Ë}]ϚKe]9olgS[ָΝ;MZZEEE|>|>$tjjZ "##H^/~"5kFN=!^~ɻܴ }j U);<*}*wѡ״o"{ܸ_ƶ~]W[1&kK1 vOWRS`n;>k:I&McJ|wpN8,9tIa}e9mt30,[fi4|373x/'ڴ_o 1{L@¯ D6~W~ī+c09Ƅ~붗Jɶ1;knçVs㗑ӓa`b|ݬ-#3  ̠Ap:B |iѱc u[iV!Ci}nz]aln7F⒒q*ɉůW`'?i)Y7V[x8vXcA! _>܁:&.;X<K2VNiD tG3ORg6(# #H`1Vsϧ77^Gl@E!) t:D=S7 gq῿`MU Zpy߹>>r<-&t2#׉ d6O?ETTa[[gS*\aTK,p DϘxTu XZtJmC&Nz4КZc "QCy]~?Bp ty3BPIADSEH7"m?R dgz*}F 6/k.? ?>0y7}LF .C%`߰7 N0&3i^?,$h&YunڵlܸM61p@bccX,***^W_z3[2`%E m(Y)fBݮû֯>1>biF>ۙOQ8bz49v&Yw~,k>XBǐ OHY<>ZhGD7D-v_fRYC8?Հ_޴q#A$6mDvv6n;JN-: <1e3:OY_Y-zyG Feh\(Afjbv||<,tA@cۑe9 o}γ5V\1Kٓ>n볥(gyaƒS`$fϞ=ݻ TH$If"$2|5}:vG](^v~؋_msfN=}Di?,-K /#i7_ӝ휛z3v\gX!øo&y'wΝO%tm9կ:(EɔΝCr l,T#?? bXšz 641`֭[G~~>vv~2%d\} Ygo㏈H>}Xd -ZDQ OoFTTDGQH[)m{_ߑK ުq8\."""ZH`b_y^nJ'n8~={Ѳרp( Vv30M\1z4V Y?ؑK`25rᙇfQ öL&Yoّ9={ҷO HLL8>upJNo޼l 0Xl)ztF uňW% `1 v J 29NRPHv_95,bSUU\G5C!a; PȍdTl69~< \Rұ0ǂ)*AdpI09MMҷo_@TTxb ڕcΜ9TUfѯ__6mzRʮQ7 cu*BQYp!Ç /Ør}|O<{idG/(f0&7[AzEذ6(t:z}xێdBeRSSٶm;Ze8zAl6cC '55Yg3#FBEEE5xܚ`0G=H]k;$.9šUl :bbcc5444i4ZuhJ8^V[eYYY^SdQP1F0,&sCl1z׉)tM0@@YPVd|~PU,e|^/NFee%6-|x|>dYFQT|~?MHNI>hĪZPbC^(ˡh)mHFx3Ah֬0ZQۇf͚#`;,3<\p\sK#)[unEݜ^R?Jz=(bX$"""!I:.^GQLsѤI.9Ą~6mތ%"Ҳ]SHYii93QdRL=)"C?l oIyyE5O$nc;sUVz<TU?SZRJΝI?:ɀ,v_ nĭ*":@Hr|џOTy.WXyqd6Np]x<+~[e)؁NʰaU!g1Q~,$J AQX RpCwV;ei]$߿)))' \x˙x"҅큚FcbbBmK4DN-[d 8Nz=aYqqqzVRl!<^Vg3S|X Yv-.ng>bc0LHYqݔ㖗 ʎ\fϚŠ;M&MJCCQtRQ%KtX@h(}/e$\c:U"Vt:6 `!|8.7>@~~+/-P}&yi`V **՞@JJ cE FL&z>%aNPGQ766Nǟ}6'xg :d{ndN;*Ҳv bch رIґ$^Xd,_EEE,]>¢"4N5B ab3X,b,''ʮݻ7w.=z v444Y4f}Y)//CcИIr :'oe xS=z_(rqu-x#/*L~e2e , rm:s: jev6e>CȋMEE7#DwɦiB<-T=-Y!,/C=Hƨn&:tӼys VTTPYY JamCnnDGEm:0݋UVtXd ?:%1i!mڴd6+VУG]$ Nbwo^LIiFzzzcm  zrFUՠJۅ0L&FN +4xTUeڵ5vҺukVI*I]^{V^^%)%1!hbbbԶ +"27Z#( B ~#W/@0 |>o劕}c7rvžObO01TlKG<7zV_w wEYGZeޥ$ IDATƧn{eݙ͛DŽ/hpZuJbp޽YiѢ%dGCCCCݳ{%FIt"I"{vCǎhҴ)޴lݧA͟?$T(*, 0&嫨 :4Mh$JTTTc{|nɹ9!O|%ڴEQ N' mSZRsV?TRh .΃w?n"o^w'_5w CÏŌG2 H29yrVN[akto;|hMz63o]p?I/(0L8ӧӫWOwΘ1cx߿/~E(-Iof䲑#ct6(4vQHII=mW44444No/S'8@x>}7Jظ,Si6:ÅZO޼< (""(Vj kȲL\\;rw`Gph #/pð }=ŎE"pC ,]V1e ۃ%4݆ :I%)IZGL{WSіK{ "xttn 9сɗw)#8+RZ0kꙬ*&dacoot)_afoK+! 3wXkMyx30wW&6- I!b2b*)))A|A[Rdθq"}{<Ai#QcYu/a5ۓd҄:'ukVh[؏ٸZ#*^CUU|~ojO?`0#/eD̬;z[v@QUD`o5a@uH$__JL&@l%WRZ^j/6%.}e6Ͽn_."&ej|R8sRY3λb9بa\Zt544449Ѥ|31W_/j`Kx90q3f`ʔ)\=j>"#V]L99u\1<>xƅ}w}Xt;N/1$^Ý[0w[ïlSڿ N2hGўk_G7Mrg͌?Ò&A*淵fvs'xA#̰K~y`b"I(" JN w/JSJP*[i֚JJJ_rb2Of|Ĵp'RJݥ&P:cd(*g _+55 TI!҃G̜9sǯXCHkی^:_9qY ?'v05zuhhhhhF>FЫL:/MctP1L| %I?d`[WϞ| FghpZuqXλ˗|r/])7Lea(lUhz'}njg{߹]_^ uXtY$&ZF'to71QkߔĄxwe#3u|vZ'ēI[?`;gEIM'1='M']O<ۏL~p"-!.EÕZz(_.v O}BJZ_W{8gtM_!Gv$Vn -|Gٞhf>#R3FUU*+*Go0ЧOol FqTVT6h, $~6.͜9sxV]V70 Lt>`@gsڇKy?˂o87|1]ї9]0Eg71rιޅ7׾"wͨ+M;6Vy#ho-DpǓw>'&]@?pa]eF`;џ{*%gu o\ľn:+.dH>pi"Mz[F3;b֤<]/hnOƠ|v3_XʏOfҮL^޵o\*w#oeVHyw2kSY[|e0&es=Sx?hp|aVv~__.>̅_G{:mQe>׵"v.<~8+W<Ŗ kIk.! Q#:DArXՅzsYÓ*3 IGPSG+`Y ůRZ^ʮݻؗϏe}܇ ( ); Fe,ۉ "Xa#t.O*Dp; ƽ>Q/t*[0j +)κu.6 -13ܛ88NF!~]b?A8| 1HtL,(QXPp{8>‚8cbIKoNRR\.(8q˷W1;w%+}ƍiLxٻ&K3;.-]2hd *ʒQDPDPD%" 2,{B=h i|<\}wKr|FݼQf:;~e8ڰWX3eQQ]Ϝ?7 s8MйKXf-WHˠޛIK?z/>aDHCƁI_2Ϟg֭՘M%돓a^rڭ)>~&AxzzP50'fPX"6fkMM/w<= m5'Q&b^j[Ow"G㉂Ė؇ܶ1;2u!ds|.v#XaI>ŦorNxݧs[ҬA(5[CNc'OHZ(M?m Iran;r*i85k@Tjt=Y#PO Z E7Tdܛq􉬁ۍfbo7bH5:-ߛHZYaOsYw&cKM'A]y2eUzr͘Ps$@juz4GBxǨAq?+Ef靠Ty9+/ëtٷvά\e)1Į^5|ꯜ.5[-kcHab[EZGo#q8noMChr`aV)Z~gC?O|hw˪Y}@~5QfwRI_w<3u}?چM¨v4 g/}1d5&Sxmyϟ$]˿,DmgMnV:P%ԍuљ#$^Z˗/3i,XM),H(p({{7kة쀽FQ&Q%{q\Ҹz*v&B[,ˤf`rՑ.?ϡ}84To{;,R"2l& Ո5jy=1fvz%cWAfL ,5aq[:_̭)ç{f|=E7o):ijK¨*u)2# VDGuKA_/%% K$c6WO;*ع9#x^EtaYEgGѡ;PYjsOEƧeb9t ;<3p'!e3ڻ(QxkQĵA?o؎e~QگndoC [+ҏߨ_9kI׉;;uίma8ŜyN$r-)oSױ4ș~8Jb!4~ry6goYCǶ^ _}= \Ʊf^\z egxa'P6ΜžvYY0! fm=뉜m(oMnTI؟Xqଘo-}r <ݟY}Wc71N=CGJ(oE7::TQ@ÜYmB/P%Sb:dd$,aJ=$BV0&klZ1roM+3̙߯X\ 3}xv5Re9+(si1l ̎$ϦșDGEǹWXnXVm2[/^FD7݁?TVvf3pd[Jt1T^L9dDW9rIP¥KX |dId޸ٔ`aY ! [Sv2xQO``gH狙c'i=e+xzf0 >>nM >ːzW.U:b4wsΑlLFrlfUr]meKml{:ïĤ,k%kPƼ#.{~c1 wf[J$ ï҉#t҅.]ٟHGTU@SrƩBVeB+|㭠T.貸nYܚЯ3m[mn!le}M) f +ag#'mBU%z(é,<ΤhB4x׋$̵jOx5iأ8*4n6ѧV~xv?zӕWrhܒf/$Gº…{WMGz7:f|0u.>0%ɼ=L];VǓ xءpgM-Md4/Øj}49'l쩢ueuAK9nt>ɷ| åM|> 2*mX1Z1}J^uӾQu|ú3qf'j3~Q|5Re9+(Ky׌2~܄ENڷ}؉5 Ԣth%nmɘq,yH=~=>ֳ|B$U*meys*>wC.u^Yl^4݃t(ӿfE^7j {n) ;&. @KSh%1?V}K);&z &1^ Xd1OTQ[@wl#h3蜜8hnnn6^"IIIs222$%% i=eRd &Cs௩=IiZ3(J*_)n]^nBpʙɝ+)WxaXnoETVզ}Õk&IxXaS>XL>ƶ[%¸u+֔Kf;EiUz~!A*=yW̡c )ʌ*L^k :3R&~v_ʬ'`BEc;\XpOsx@KDo| /t'Bv)BĖBʔD\rA qi.Xހ>x'A9ITLqY\!}r@)2j ڎz 88qUhpjPەsrݰwgJJӔ5I2ľ0` ،9>k ]!-Da7УNB*>xw1yFЫOwv*}DGGߗ Wcˈgssuv{;Уf&G!҃ 7//[Rn5)s1 o67kۿgśEX9')~N8_'>n_?ɴ8*`\.p!UK6"O#_o]C1+\be`x|=[8~gcib JrIoF~~?>(X؎;qXLt q3"PYzsϤg[mU^ e3n6d%M-VXOC^FGo{y|Oȟ.IFLX]1*BDQci$cEX?9$|iosrkYykYRULKZf?g-n׭D_qx$'^DY='*}1%/K߁}Yϕ3޿Υ9Rͥt6/݉ˉISE xDz|Y7{j^qޤ 4*>2Nj/!+Lg^7WOsΨTcNtؑlzIǎ*ȲVBTD`oy١UK9*Q)hժJ7vJt*%J&ޭ4_B{T!:Rr4ǒb4+LjH(=5y8DF싣*)כȹ~H- ߱;ʎ  wT;Oi iTLμ6} 6:77p0#%;7y^(|Fi7~'YVc6|`%܋u`dWv@u;)@qɹ5br<;K$f~ֈ~>#>́?C5k汫EאNʛZ5<jkf eFW!כw`cU{0CwpF.`p$;^fn< W~LGWєEة ?Ώ?+I;j&t}Gl|rv`'.~''.+s1Ɉǐk9ހg%QL3[_!h˜|?hjӺۿ|T~%e9+|kF[iO7cLFc82YemJ^v8q56q,U ("xi^5No8%[~Y,-o<ӗvs>*ϕcĜ>x_|v+JKE2SE*qk IDATv?z'r5W_$R\x# <$ aSiӦM: Ƥ&ӯS^%YFQUNAOS ?W-Nj5 LO ^:t{J: }MR\5Ƒ7+rEd\V&&zd ,ѓ,99+%?F[&2OG'a  =J-`Pѧ Fn#ܢBvu/!7m@¡`>9 F<:wZ㊾mn)/Γ_8Ӣ}ҴMKۜ/_bd Z?o":ڼW̯˓'jVZ/S4*ޜ0quJ+9o+0 "w_̑|N=_h y77e+ i“=/EhT]zO{cǪ/._4=sA^OWJ`_,EO,5^rkӵ&gTW9l2eeL}_RpSX:&mk h33^o2~L\ׁ(X0Bq3[DBcй=?\@{XG<*'uL\!oyn;+h;gwYEk57W!iQmF'oS[RmV.?_z1/oLnK^ԩ{K$zZ^o__,𥉉ŗfzؚzbkjUx3erU+AY} -`0^>}'9PZ}_TF7f:k1ѐBԫcP'E $ߠA^5%cr"}3gpvvESJI';#)Of3M|psסQ)Lg3۹pڠR!9H{;!%Ukej<4[WprgAĥ]P@$[>!މC̣,tWL$,Lg?c S]\\ ~]Qܕ=G*U*zezMr_G\\"#` y "Z \={@`,]\8b̏[0{LyT刾fYF.)'! #ی.cPBq[}Xٺߖt>|u0NcAAnQ;vɾ5TS~~ir.&߲AJp, !jKEMl, d];3<@$CD-hEjjrήfů?a {GjT>'ǦcYIaGlEq.^X $ZŋH ;v jMm\?˥rIr lJ[G(ţxb=uťg//+l;)&6F! QXj~/}=3iA@F /`ԐNQAٷCtrcS9ZHGĤ,yƿ=l&Ie[}ɮ*}kacԥ899Qv;-L&h4߰%I^ԩSUE*ȉ'V K-Uk4o4^۽u-w~LLN۴߶HOO'1=) wqAAAAJAAAAH    vΤױTlҍ E  Tq6Uekf3WrD  ; IB}aHl)|N,zLFzb{-29 yd^וmښwX_Dh^^kSxAQ/6&$ FfywSN܊,lNdы[zr'm9 .lI>:lY ϜLiӂX%&t R3m(_ftMu_w<@|e"AORTHdu;k6nxAnb^CN+os `[)jځ't/Rϕ8)MU^ڞ4ə Z9٣ <2w1{cX=2 PqECXO#>SKÜfC)'[ps?:Jj4qI,q}1JSπHs;_3_eIgw<=L#؞i 9Sm\BWcnKkgg -7A;aٻvɞ{wH  ܆{QUme֊INAޣ!=fm( p΄&!i'9tC)Ŕ~hQmHvy*Kf_Xc<Rz#6Y$Sʧ<˿>JgPծvS2q(' `buALcc&:} pKѶ%5dzpğXB_77<Q82?96 /A;|6mN:|na!4Bhp^̣0^D lj-c+˨*bʒdCXW|/ u@{p&'EˍcpB.7*:O*ecF:9nZZ͒Yl& pR&(١.\?7#HyҢǗT^Aϳzj(232;v,,_Kw  T½M&ÂNqM}HK~Ѝ7)'1oBO{ҫYz+h-o+&.v_]@Ѱ3;?nAP2</D}5Wxm“,؉a5Γmώ8)Lx_/u6aq5}yr<:4IEUlW\|X ,ҟyk\YHo0쫓mvE{RklYxO?I os䇭4gc9}mhjgo4 6%bSٳp iduF_hMٷo |g-ؾ UƊ#$$%UG1nù:56?ǁy-՘_qa(rmz=#_ !z.{>-)ś*] s"W>}JdW0n1ԷU.O!%;fqdu6uIo]KF|<*sVq(]ql ?ϯ͜$|==@^3ii̷?]'yM2W~dVf,?xV+\ UiX-?ɬ(d/A۶l݊NgǢl6c0ye8Z-[l! P <™LJ66QyVgHTj=LC[3[k>|w ҂V+  [uy|ϚEtQ~2F`rϚ Rҧ/ԓ!^G9D^5Htޝ1n󅴝ؙ EߵvU-{,l=&.<շ K Ytԟ}e&:@BybHn$!],rϐplo1&bjAY<G=Ԓ}Ԏs.Wb5 I+/5ꀎ<f&DRt"sޱs\bJ>jeUjlf\"d&;3,uoL7S Y>[9Lo/*o;"2XԩK[IsK.VQ5SN,aZ'cLKƨsþ5a֧#kqEI tI4+k6?{+^x~9Tg؀ZٻN"RRK=s 珊`6PH }=z#A2,~9} 8m8Tl\=v4S!|p]?=Mo36MnF;3ǷU=(# !3p{`x6_e0c"k~o]ygفV_0݇?ջGލXn+Wfd4>$=fW4{ǃ1'PeTxy ^#G6ߑo)zUqNG%N^~t4pq47]B@kuS9qdGC0喸6[.Zѹ=QA~'&B\ W%C f\X:Im9TF_~X׳yW8 7/J4 G/]6NE!91ר֪ń9+])[\#N7Ų>*&swUςrtBO'DFuF'T6cˀ@ _iԳ6qoɁ]S57jČ' 1q7rU&>\+:Kq[,_ w< ɔ$)w'2  K%ʍaCC裭,}.%&sȕ©>g0mz>t'mOÂ6Ž<؇2tr.zGlmّ+lF.=ěwL[7~e'ݴ]5YAٔN2W*`"Xt =P.Un%NZ:FjmŒ)q4R؊7vNow2u<=ǐIj<3|mW+6YuAjZHY\n\L!g|1|pS2Fz߯HR>]7JS{#EnUT+Lܘ}pO֏NhJտp|9i Vs$@䛯a&N3ŗNJc,;Xۯ8аVU#gq^ې&fqHP zo۱ q߿g!mP3|3!6L"W]BW85 gpHkj=3Oʫo-h`ΫHb|[|XΟo#9 Ն`)[d| }yye\Q9h!=;=XድX:26hFHܲ.senˤqd )Qہ)\T؛au0e*N@6p~;V9`zթZ<ӵM[s-HfbH M1e5#-9>Q٘AIX/Z V3g%[TVE{g3*l&JUv'~~UMDዟ~T݇pGzyZL{߃\͕Մd9GQ% 8Os*fcJ񧃿Cafm,G6Dy78޹dBFEck8,OxҵQ> ; Q۩ CL3\fuNa^y1X¦,{Y:SWJľEAW:]N^KIty.͝9} K2ʗ   Be(k6jJ˃qe66ҹcjۓk;/}F|?]ǨQlUfQɒĒY(߯;ϻ0/ yJ9F}!f„Qwju]c4kwOzQv|;FupŘI+ԕI >31bnAQ?aF-̄l { I)@.yTX3Rfѳh2`:[NE@ρIBw}[9|ZubR]߶  W;{xWGVsʺ5ш1_ȂYdq IDATdJK`x9.$uiƛ<2U"k1ɝO@T_( =m{R灐Eԋmg{w瘪kğ_+~0X/K+uEK{FwAKya5|,$ul(_:[{q RAҸr /gBaD!Q< )لFC`<==_  &v@A`Gq.d罚w}m]Z%0}gfyDs3;-SBwmGA89]*\|1O/AӧOVAU I$(ؑn}^L&R҈]v!bAA* #E u{puKiyqw2"AAhJFOH E.3# C#)Ԃ uO;yigUz-h^08+M8Xbg;\4"BgϝڜÚVߚlC  wTnEZGA. pq)TxO'6k[lTP/F὞f~<޺91Ql?-Z PLVcyAA{K*o!9ψNҖ,8'j$WAd:J۽T hmDf8D(N\!%Jj#kĘR禓䙒X*|Zv}>{c0^)ŗOHvJB r#IYBcAAAAwIG`\*ͩıCgIлRe8Z[뷘q 5N sN:9*-[4KTsxsG }Ƞ&S$niضavJ+kOW$AAA{ZCY%֏wgٓKh#ԭR&K!ᄺ;39-;WxR'Ug5ժ[_ @jyEF m'O gpK8imAAA?&v׎u(GP구}{ط,"h{r+Vі l`Ns !@IMИȸxcICL\4NwfۏՃp'= ћr< AAA?JYvP q|\ӫK;67m6I8ʃBFMDNi[\ȥ:.cEvv{5m㳅=~þs5ZAAAA{;܁dWAɌBB!١VBUVʦp VdcI5ʀ }b(ZF)+Ŗ͹IZ\]L9Wz;{)+LA0g9NR0AAAA>5Q9&։ڐ,݉AP9ޒ"/t4eM`- "]aqRAsMEz(=k;V,;5UyZȻ [8%c2aJ'ҽC:TG8[5EAAAAo=HZ_>֗^Б^OVz}hЮ; ]Wj;xx'Yj*u]:;Mz=I·)>.u3DКjпkAAAawob    wH    #Ýj!u;^Gsc˗v[xN|1L;Hij Cggއ̉,zсzKX9'mq GҸ*>A֝ m^/ּ?Kr3M ;`9ƶW3K"ƄѨL3-)bѥ6}lya=~B-_  p{hivp4{cX=2Uy /l寚~]_ٖ?zw&:^=|K.umOLE\凃8v u츢!,ԧs*wO]tfSh7yzkn5pP\ZGjebS\깒gv0IL\}K\_dL}VGѿ}=QCe,Fu "Ow>Ɵ~oʗ   n|,I|i)26'aJ/R&Ե#4D(o\IH۳U l@OҺ'qhi,B H*$g[Z[ذ'îH^z+\jQPfCpǶ4rwWl 12>̞}v]SX7*~2'9rܱy_2N]z$?3swP\i4[,KYǹ]Y>ŷk3b^n獝#omﻆg҂Ob@+om <<3 UzXeU%  zF4MKybv\V29.Z1'{Sq/!,҇}]%WΥc۶5%HOF~mCk:@42T$H%*CE~ZQX*r_q?ʃC~W>n|}~Sb~/|.K/VH/fJ>#]X;?NL y<%vuƾxw15=LDrbh.z/fr᳐/{mKver.H?Ƕ9q,`&/FszY;fb4QgY ppVO*jpd(D+s-.]A F kX~ kt,|9a$FrBr7Ĭ.î HAFN32Xhnqmv/,;شU6k 6_I+/@I^--vu*鿤sل0 nnQnEyt>.?wٞerC|E%Vk!3AʮiˉLp?ȢMNL1bцWR#Ijۃ#zұ|3fòZ nùlg\z^;}.fk/Ije괳HU*/AcPPRcO5d"R dqQFO? 2ōHR2 eqBAfr!k!ۉKl!MzJ҇ bf lsczk #(jn~d< [KZeoNHpB4 H _f9?_Vȑ8.቎-{Pdq\"0/ٰå ɸ5 (Z}n9*Xc %+;MR M: C-[dxuv\N jTLŻGLQ-sOıaI>/ӭE"5@QS^m`녭Y>;rs/p_NYW9ܛgnԖ,nSYUƵN""jȻWU_&߭5. RtME8rt^?EaS l WK4j6m+Q׈L!2uhql.}#MdHJիuA}uns@f$c{_"AAAJ O>lhkVh\ٴ3Ru8TR4 +l_ƥۍrTAK?]VakmT8Iw< c~&<\}%vx՚8?F*8ŕIm\1Hۺ)qBp^3y\ȑobhF#jNeFXTjtɭ1J n9el[S^zcn9t)TscG`6Q&QÜL_vԄ;Un%\#ۢ9ͭfK:JJU_IU%  z:+xE7nm|d[W9|lŏgA[>a*ټѯ񅱌#yfiT &tn_@W -au`|^^MxqGjcREjhz=<Ծ fm'vn Vܛuk~ۻꅏ9\fIA6ndR2f]p)E˝A;'\~鎝 (apkiecqv8 nxN`Kv %LA!ؔ2pWnd,Ĭ%wQ|q Lqspǽޡ|/ 2)ORhȗ=8Ϋ77WwZyo[ėbbK+U!H\y.C[D׷vSF.=ҔC*jPY]M3oäWؿh+7s8O>ع f/ج8oqY>6te]co$\_v]/,=&qç\YUWS2Z_WgX2N.on.rΙ UƗ   Izzvff|fY2aL4i\>Slv޺Zʀk@7%oQMXر8aN> j v;NI#Q2dǿYnu=L vv>+Ia{OJvsptO[5%gA 9E\`\´,hQ-m˯wT_Ͼ%U?H2>HR$  JQ*mמq5BUP<L ¿HTUn܈ Ѵdget7ՍUi-ŶLdi7&w2S^ʺN,X>5#l~u6'NF6lZNc1SvÔB'O؛ jM^]Sŗ   zH؞7£.=/LۺhvAAz@?     ;y _h|=7AA"vdqa`ogs@g&oqvf { y?=*#YLadvňe\-|SF-g/~3ͽbYɕn.~i{lZ(!A~ $g[Z[^.YD7\_i3KFЩqѵwg"crFnI,P(Yߗ6sUK!ac?7փ7w# U߭IJ(>(m'.n>n/+_Uί`l[ >3i'176΄ n(ZC?mW{4l|=o#  &[=iˉLp?ȢMTV5`Չ?FBS1 S~MÈ9u1t,5< xTcMO8.ڟTT^L^sEhe^ӜݓG.xx %rC|E%&OcW"?y|:j6zlXvc_9JRD Z9!rTߣѐє.AAaa$M:G݃  Fn C@|\z_<RL2u9'6,ՐE0]|T^JqrXfD3H0tT8\B~JWYWѠG]+³n4&x+P"4i^j-#Lb`LVNᣧ2+f~ƺgqj[ミqT^0d/&A9jӣat'15~G>각w⡄"3ABNf*?,1ٕԄ VҵuM㯤hLCTOy5+U/_n  )~tՔK2K`Xt$`X{XH.,¨J1IPt,!4hwʘj*f`&:7i r3s [n7} 61ROw%I_1|}kNowQ)%Έahr0ȳL2š&:AJw~ vd-С*]>0u캑OUi/46!1%W?ߊӿbN-vlL;[cSӮ6Wq$qWyqO ^6oWSH:ױ\?W{9H_[>j뙮aEϋRA6{5N)VxIHR2 ', .VqH0ӥr&)+R%2vd;G.'*[ݣMaͪ`EaS l WK46m+Q׈LLEd0ZƬ=)+/L+Ԣc\r.}s9~a4+xy pj?so^~" Noi\G<6W (TĚ仵:]*J,]Pg_:b2#i[V%P_*ՋG^KuYEl#  R!?;ģdw_H-,vC[4]縘;CcQvp". 5R RCLzC$T $et%G3李Pyl=AA.I ?z;ˏeh'r8fE??_vk@_s{WXSRorl/_cQbe ?̙eRR{mK7ӘʋQO{i=Ju n?ʕ[ɾusk?݈R N8Pk*0MK:J4\MWtcG?P%y#rkWg$??VOOU3<۫PU_Wq@Õ}F,X%AA5^dSCRlqy?TBR.e OlOɞ¢X侌n)bgΟ5b<[m3Mj‹;RKc  ΍_M?+';;<}a_1/TǁIƌ|كWjy&E[)^ p>l7}Zӱs<_Yq5d/",|&m !˞qpII<] 8q#'U<7Gut)"5h4ݪ1sE+H04˷?KYѢ|B{X})V.Pƪ8Ohێy?W6)Y> 膛 n.st^OOU7:۫RU_AA9Izz&3#?_ amM4i=%Kh40\ajC}(L9xn:΂u1m(ZBݎ|jV$_%v7N}SZUKsDOW3|}sa8{2 CCCR)Ipoi!ɃH+P*FTڮ q QP$&&www6 /y 7FPpy6{˭ZAe@aBm}޴LTII{if3uŕ*n I?uXWNN'W/|AA#4@ m\p; |Oa#JQ]FCpCUPCpɃf%*H϶X.̉oAHӔg痌SkkEB-LܒXfy_:풇+=yfn҂Ob@+om <<3 P/N\| ^ZW4d_ض92pGuɹDcZ킛BwOm,!|ğ v#yٮ4s1x)jף`㧦'i_ BHOO+V0h 6 F4RH<///BCCQ(;v7SAŏ52J_ ; )Wʟ@fe۪"#.f<1+y _ȦZ=.:c0WWW\]0.ٰVQ9+3PRUATs&3}ʟtۖo130o=3N:4HjJz%z%r.Ȧ+ϱg`/U6NJCAI/r#4*/cjWUOUhqi_tA+vvvT*bbbѣGmǎ#""$6o\O)AgNaIIĥnbw)[qxbK\|Ḿ!ewK;6xv+yWty>4m:D0> /&#Utjy~}?gOd }póBuAј/{pbW1oäWؿh+ z!ǓOk:v€ 6+NE}Ϥ6?dsט=.HinxPaSd},'7 7W\]h9L NA6ndJV+9ut)"5h4TS+M?KIY_%!j6+ڶ#}g^ϵiIfwpi2}>3XiWJ6 7o(nz, /u_ߋ5ߴ ԶKj*ϟDRM ޽;#B$ǐR85fҠf,>´sq_Wp v2:tE]̀\7 йhU8m{qlS`>+Ia{Ok˟ϲ\@*qQ044D*" ]2YTR$][ OgjfN34jԘ%111Шn3)8ƌC׮]2d7.رc̜9\ҥKabAC܈ˆӴYs>FיKe@aŏR$i0֓`S>:fJ+=P~x);c=TzNN'ԈkOU=jJ?S 7oޜI&В EjrI0q(<(EC]\wu_~ ^ 3SӇJ(AxiG_xxL^B >P4e$fw:'B]% PosdAAAA_ްI\;S,Z%'lqm1*nF_{h5TM~|a3Yx #^aꡬZ?ZE%    ;uɸ=q[RUO7AX8rSAS%wX꤭s?mvԝɫrd oEO薯4[[yvؐP _f}r$N-lU#sʨ%ǧ ER_&*uj2AAAhDNC%1IWyΫKR9˩,7:WTň$\PS2I2M'x<{s=/UG]qİ?aj,Yy w R4'ײg C[X?[c|&?~1GgR`͛⹙pulJ@o ض>Ρg /˓zd7q\5ѩ*܊ɉlZt{ճIL9gke|f¹M%=7wcw9ݫfӑ#/Gǭ%DLe Voԁ!󯓼3Z(ZTIW xʩr"نV*SaC˺,pcܛ/yv=}-xuE"ǻ)|X6_<>௄x5a1n&/FszY;fb4QgY߮D+%^qdgM_êQZ5&s31K/7pih9ci$ǟcۜ8#e&Fae'rzNL5N.ugp***_-PׂXw2 uj+[-x/ ]78C# Sp7俿 fA9nEZĺ2H ~ÆNcbkX6_E[M;FOce$ExYpcj@ nJ'L ,MKM~ o:| ]{hI]ܮ.'7Z.ϯӧ|1ȓ =g[su㛉@zemϽt/ҨHy4wt!fMt(KB~Eu Otl q n%"w턏Ix΅ DPQF8V'<ܛ at[?_GHMO}N%|~ 61ROw%J}';Xa}/& BLڑadaTÓb .PkubI+ nBHp0r Lh5w3N0`\h;T&4F'mZ?O篚Ԣ9a_ ` ?g_IoIrB?7gt}-p_|Ъ6AAA^Z$2% +olPXyQp7S&+;EI-]PhL/P@nl:k' e rCDn,$K5f&];MuX{yqUTGE_ʏMSt.1ICn aU\. f+\k/q,ÅE _XIi2ؓgjD!(bw W'^^ݤ3k([)34VvMvNȌqlY? [ЭjO"lj0?[ՁoӸK] 2('"#.fW<8kz|[/l:0O -?~exuv^Es+ n%RF}~{9%G js~`4)>ͿW$V•no/2{SQfvb KTjS AAA;K:/ˀ2AНةĩ MnpzdRpi#G닡K@;Ʈ9=5 mH}*8g@m5hɹ ;dI}9qʧ,/r-ٓ@Ci}= ue~ѹ`yIGP440<3^b(*ȔN,mܔS.b^v*Ox"#V0Oj#:IUuG[3<)i vcs:_fhOߴ{,c5cԖ&fRk'HwL@q܄\3mM+} \է1k]d#n;`E_%c8nB9V 2)h*̼ ^qbж侌n)bgΟ5b|+ U2#3n#]pqvهA><δ<1GՒؗrN|s"jPYtAhj뙮gm-Bҟϲ\~k L&ؑcahhT*E" JJHt(degT* mZ]~e33s""ب1|bbbpww' qfRm$˼>|8}];/7nX6l`e[/Z7nȈ#Xڦ{Usn;lĹm]qCt%Haŋi֜wF45iws+{ xs-?>ZuJ_h9r oǂr'ok3v xk9 > ;KpRXC܉K_wcǦX7K+P+r񛦴ztÑ:/3[lz6d]?u=iS;C|6숺( hok`*+Z G&6:yoJ/OY  CSN>Z̝k 7s¥<}at(ė+78~|py3IsĎB!Bz5uwרd&mK%-8un"obzV\*6w -fGJ} U]5=vmՀzMagv7ˇR-xQjL[iS[48}Ym~ݝ~G_*C!E%Gée!]ѕa_M3: akם1c.WiQmP4mF}ND X\yoXiA~D9oo5呋2_;3;,5dF;ޡ VGh2.!tl+MWHқye_} kw-ϭ~&Lgo=:VZˌقn\ m[a ̷<ӷ1n fЋl>*K`JϻQ 9*Q?\wBʺ;C1<4[ ] MMH\ǢRIc*Lk@Z숲ȸĺ'hɓ̶k4Ym˓z\tޗkp\[_i_sF2_Ӯ\*=~8\ըk\=] m[|w_UNc 6AIfcٔYloQD^3ylʩϿ&~ޭ0(uV_?B>3ߞGRn?|5"qR@ڍd&GSǫ V+% ɜ\,qwsNP>2+Iy_[2|8gZ֧8״mCڅwi0׸;7]W} Z8>G:RWMy z xi{2mgCDC&_SAƷ#v}8(o+WZ1k|1vcXs?K̿ꭙƓ j돻K=ɘ8|8ƴ@_{5;4'FPL2!~mϹ~kϋSt?z~%o0Vo;[mB[L~!(u뜸@=WS~jJXQ?M}~Ve+(U~!07$r+z:yX"ºIb'=q[ftAb-wQ)K|9e&Q\1j_Oakܹ|q?^ey}M ]r">Cl;u@_9_4nN]wEmʁc}Wj<7`},eY kбEk#\}]X"EՏ8ڵ/o}1fMmN~<`ł,ULV1pm[/L<7X|=Z)-}i[{Tϟcx}c8酮l nnKOQt&8MXɾlXU~C3pDH9ݸpL܅;~~V}~b_ #q+#=]id$! z?B<L8uR(-vY'DU ZvةTT̠^>Y7vio&<ӟzjdְ_{ /v?2rnNcK9x/0jTy4QmKس m^'CS;STȸ@ Ս[?FeK9RIOzݰSq v.a_>C3Z[4J_6E~e.;]y `Ąz Q:0׻:!ꅏTz*'<5?m?XLePh`Kr̔T>P\f̜ W[{|| ~cZEWYhy?yp*|=<>`AZW ￲ϊp׿R|~_Cw2K=B)V'>%!l >3cgr;ltg-h hM9P^- 7osVFEVfi^lhT8ӎ_}+5냛QNR ֩6鉤m&¥s{ $rykLPdI2]h{3~N)$uyp"iw/.O~2,R ,eo)4 #$]F1I_dh=0.kؖsrp p?lg'PRM)wVb4IԭۺZN_eW??s"WCRYb3 ￲ϊp׿R|~ տ]cl}-Ddff}e" >L84)\k!.ǠҚ5kz!}T6"1Y4^8s+7sqMT_t#*u1* *C.4:Ņpa w'Yht".62eVs/syX2}_ 8{;B~|Bcoq`6^mVv́8 e^`^+Ҩ,΃< 7`C74T6ۀ^U.H8sO;M*bhjzu QT)UׯroQ~/{ z0aZi~ ilܭ"??J`u׏{- 3SBf\s@?}tr֩? [kV5;ɻxC3z/#;MzSMڋ??)yPZ1OdOrkwݺԭ[{ySn]ztlz~ Ϗf)djl绗bg'jwzNDA?& myUb9YݜMe>R>CZ["R$M:b?:Y2H=gK?Ǝ/}&tz0Цkf0.l9ǺIȌ;\!0y6Ui| gG%տ\%ՏBJi3L q*=pl7pjc" zV_ kMc."ra aͪfbGJtD4WҍXERc~x);hC]w7w cDH_-ӇR\h_3%δ8M<}oؐ ð 9֑{/)Kyc)?0zjgѳhϓ{}dOmTm>׎n=z2h ;en "c_̣} \g.`ڧ ^Ucb?fno#y77>uiQJbf#*uQTz/t"TDz6 A_く~nhɺ+϶`#M0a| ;u-/VZħ/m?Ff25\;3]+fP{({l^d{h4WYM~$wi3_ÔYIW,q;{&N?|-)zsxQ>^{ &O۷C!t櫢Ni4eH6z`Wyf߿NgHOȷpx&wt੡!vۻx+~_=ٺF-Ys:vt*r2ǯ=;`8ګTIK+xZ)^meAq+HU_%IWr05{?c4= FaQ ;;;j5*[˷Ju 9% :tHVVvvkT'Q&ddh חFT QQvA֭;n߆Ma^Ϳ~v0cL߾k)2t IDAT-ZTsޟ2\Qt[Շ4'.;__ i:8XrN+wi^?ժUhIRRb:]\Nzjv坭iWeڵ/[ol0}ۈﺀgQP$ocQ_ hj/MQuWyIR*T?Le(<3Mfqmu\x9' 4|Ҫgqݺvoco,Wߔy~~ΜV^GGuYƌS!aQj J¼7ΟQm|x\l%S1sjk\m 41j|G=&QΣ>=B!䷝oKӕyF#7EsO];c{{ Ԭ M*k4JB^IL̦uVڥV+h>r,] ӧί\FZqF}oƕ)44CLL[!Cn@}_m3oAyV AhS.6LlrG!0BT''ep䧟.}V)ev -[Х)\`BY'o ^_^^^ؽǻעo-"[JG!GKqeR&2pYt(-u 2ۼ)>j-B!Q7U,؜Λnħ&zZo-v@I̠%vjr%G"0܉RדY;~jNs:Q!^ѥMܝ{IKH"G!%8ARW) ^G}p--ux!Bܥ=s-B] N 5!D3SH9kKi#Lbٯ>VTږz|izXB!mng䐤BOR87[ɑtw;&vrPxjLڐM'B-t¬rfò^١!`;E%p yb`gvAؕ !Z!Dz5〈T*UƎ[h|똺PT*A~n-tBsMzϤ`҉Rڻ^<&V2NPOm=u9bzJeƳ䘚G'4d>իJ'IMR'Rc QĄB!BqO)in8!ݐŚƔ1qN5ibȾf5>+i,tu;1]x>g櫓s׿f; !BJb(p_+jƍرc+;rAܫ ;V7.1/VZ B!:tʘ66Vy9-A++)l-yE}&s Y:B!B!K~ MQ*.hH#El[r| A!Uҍ'*;!Tu!44{9}F%-xD3A!B!`رTbo@Xn"_fܸqׯOR*.ru,nRvM%(xJ^t\]&n$V*;]$a8 @&d/'!B{[hh(P:b0Pof]?ιshѢwf\ĽB[hh߫'Xخ5/IȐJŐE2dr˙ _7W[.֜73h]9'yZX=w$ݛm`ҭh,(shrB!*JIIa޽cǎѥKI*4wv6}zsy| iBgz\f1ndoĤ {V 6FS,Ydʊѩ$k\" SFWm0];˾ǡf/ ˮVPNfr$B!D%#F&vl]ө{"uɰ.oLxF2iByg<<h7%oߙ=(C|Bކyx {E mb4Ns.6g,[odr@\ D=cs%NEӀ,:\NgFdn! @{%}}i9k z;`P88--1o죬ƘI'=3sV4pkddwcDvYXK!,'ǎֳ ="w0sIWZe 2P!B!DEUb|$nʶ+c;f6{}‘hNf_fӧr`3q?Gph4DL\4gHG=*j_o˂sl9nq6I}<~߀6*8ʳ6gnCv -1G~9H7t:+:ٙFSx/eKDϕ|/~4 >©xKіzC"b%/fdzsJўzm}(!"IɿЄZ겼FcrՊ>B!B)mb(t@uӞysm^M4~j\A*uMBjlqm79l9"逍g'z^#^=ґM<ƦUxdbSmQ>^Z.zA!es\:3K挢cy^` ^ly^p?;/y4϶p4jOƟ3qGȢǨz;ӤY[_wFocPݥ:$ \Z r'|1fI"YS9%ƂdwL7\ B!rGhh(Ǐ硇Z`]UMڌ چ+$971p{AΉR8FvmJ?]GjVޏ^]8) `jEʎ=QN 026ƁZղHM{ѫ'94g,4M=.t:KdƦSe 08{q95J)bTm#)Dnya,9F=iZ^BPOtnןdcˌ")+_ʤ-oЭQb,B!P$n^Hy,XRRJo-e߾}9sr [;U.T0&߳;VMm_ӢIMYOZl,i}d\isv …0횧OukEk4&ht'~~-Xzurr&| witoL|qb3 diSd'd>0?7K1kiFw $l~n/E\;Lcyu+/Z9{7E[βJ ȥ3#c 5`YYCqVo2hIQv*Ȉȧ;s@V7[D]%|HXrUU#c/1ƄG\:gh4 ͻaY)m9yU˗훁4y6( Yhh3`СMעNevxsFN]:ĆcdG_k|p[bpfZl{Y>z΀eeWGq,8Kϒy_ǣw,Z-ڌ,)'ƈrZ;]yW-w& CpnUkɋ_:tC"83}3!z[ y :Ңvmσ @W/5qCd\L 'v[6^)V}6 y=Ĺ?A/ EڋWu[ϥ3TU~9eŘ3FcTRB!œJ矃3gP&+A׮YV-:TU̙3#c8uÉx1!ムXD5yw{,жON2؎Fs;Ԯb/,~P;=ɠgxnbg/[ڵ/>g--/-jkBK1.Z)`+F},zD;cݩɒgܔbUbSB!wxKHLϧºuJ&0FUщWW-w={n݂A7`<ҪUxyꩧǧ<+L쀭0?c&M5)D{Uwd?ʱ-_.c.Ut~{ <,TX9;n!BQ}))c\ e2V%sx~II,\t˲  h~Un>ps˿^H<$+ŋs.]J͚56m3f7߬Ȗ}fS;J3]b| Qա~|q³Nea!2V<4)ۤ]%Sagr*('!fd(<+i7!!XΝSZ[ooAеDͤI0~< #0}P.]'NJ}`^1밧',Yz饗P8;;xH2Ύ0cͭ06M~wERWv$RNB!l ?ξ}p^Rt2]z:Tn|_'N( eKX^zzj5)]*JZ=򪸃 GsRUۈd2!B!\8-LOnA--Wt~uPRDV;Sm}Cʵ}ʮP*WW?DWHV môqXer2 )df3KHBQzӰy`Oܽ2E IDATy3y7yiWOgPGgX2y'*ɤו{_UQwS1  ۵#O)ޢHywrZ}9!ݚ{˅0\fƗsrO8eX9i/zH7+0b.[ј挱>/ma|6\shrB!ȫcGeRQuNr2|2xo(-lڶW^Qf3e `&eY搖c^e,,;~[i14q23WcǠiSBkgT' 4Đb?Ys 0iScI1% :#mY$]CkAezktR.)#6].Νe3eY+('3X%IUⷣx=_2Z3VQNfr$BQث*-dz >DIÌJW(OOeիV6/O?l;z2?Bv2{{eV@Z)3hEE)jpqQZyٴ F a'Mu!}f3rH;=A@q,9xGKH6 [c(Xhwv/atzs}>cz u ]P%rx{Ƕ/yur/`Ir:3b%#xtc Y,KY;HQ4&EH]#moяo}deee4L?A۬ jHT4֏?/PS9farj84LJ]"&.3O$}٣ٞ5[/7eA98Ϥ>]o@j]Ł3xP#?Qt Ih:]~YAgv?;Ј|w Lc=p)8;?<ُ&a[8oN1Ro4ZDd6Sxv.AaSiS1S%Vg)"IɿЄZ겼FcU-'WV&n<♨)dnVUNRtI=͍+^6fNvş]Q8ϧft~<{<[m9, nQiUBaN:(I%KJ=%R{u}Mv adX~= ~z?ƴgܾx۫7g@5-A'%]R$dy;vSϖC.xv~=rpx#9G8cl:N^ J&6Ն5칓raճ jG9T/ 7ҡY2gUkeCҀܑ|NƙFYu6\/᥉QwէIٿ /UT$DUNv12&Ѭ; k*'XUɆd}qo|ȴWwr3')ld-SNڳ| ߝD+W[T*{ukEQnt/iHJ&dnX8KQOZơP-++32#rʊW2iK{tmmTdn9i\SݦH\) ASd-SNvlM#bί #q,Lpf7oFssfBa4xqpt4}__3r1 QXWb:IcShrGS֓K>6<)2.|9iNsBߍvʧ:"s5 h{A4?|hdy]]Zp=:C@[9sn4:7|8I=ƒp|˛,ү%s%!! ^e&fI@7TO7Ǔw 琁EfAofKUlQZќ{)0F=2O75oK9u>z}qFM! kg,?;b_G4 Y2sxt{[>?VEe=ddH>ƪp("\9+/nBsJX#+'Fcx7^ZűL0hqr?nf{~%naB^^Ymvm;H2B!DS!qWwɵU%/~#>z}:\L~&ygB&olG^AtrUBڞn_:k@N>uŸ:@׃OlRՅ :m{{s̓^ /0m/x`;f֓kzSח#3jx%Ro' ?߾q+"҈WxmPT GO&y >ל*b!wln.8ʐ,WNQүajzVn=f Tcf9Effrm뛌Ԉyh?eI9c`97uL{^Wp*%'^E=F#\I_0n42%b%BQ52w\:lڵY7we"]Agon3 o] Czz=:NGrR"ÖhgG\hp߻>5G GM^G^f]Lk]F 1t4k; >_&?}~.7)'rr2 e >K7`ſ)lxGؠhh4jj5*-GM>pU2X3Ih>jpzdfdBFFm۵%+XWε ;NPP#ҵDCf ! KNNfÆ ,Z_aÆФI-[F+9’ zB,}تm^I T)yAY>X!S'Op5* ??Ww4 !u+$Ø 4Դ z'6f6KTeޑ+!VHP9-Pr2 )')U BĄ oQW\!...]TrtQ<1VMg0R2sR2Q{ Hb)3]a<_/!:"0'eTp(L%_ r7V7`*3K4cIe۾ޒZ*{˅"WW?D[>.UC0msf}M3> ,~ l,h@ŲBWo;v>攔"""*'8I8A`%G`k6 5i6wEpB*~sc,lךWl<űÄ '9u\JJ kO6U'}&,,Ʈ \L6$E f}h9Ltk[IŌ12|nW ye3Uj:x1V+s@{sGҽi\q߆ 6p)݊2RBq cŊ/L4>ͫLt:\3(`$} 九S1zVmZVm'u('빜bPOnb N!{Ҥ>i "@QEA@(EP]z =!@H#u#=n'w̙3gfgΝB1e]jhˏ9U?f~ǀM/fG/ @x=ZЄ =PgV́/_ ..x$qxF$sZT }\Y ߖKX%1oA..~4bEԧx?.N6Ϊ,* =wt۷yTo9ϻ&"ӂ}:+FvhBl\1Ze( P>aeirzTٙѳsnE-a2[%tR Гz}ZfAu*e.1T^̳D[`B$a[rQ<4m0o(F"hFK Qu#̞@φ9:j4S{8y,xv1_(iMܚ.䎰@>_-Zի1c"QY+}]ֿNP*33p?)KWh4pʋB@ 2}iGf.1g WtfK̟0fi.^=Xia[|E:{j!{.Q\ϰpf}l+&IS]vnHM/oM5y疷jQ _] GVĪH]ɲX%Ox,V2tVǯOPtY\8NCmҥpnwlE @̙=l=K%>7S>`& Kó7 ݃T8;8m[cڻ (#ru>kwQ>.mnx axEPZ՝/qMiC(i6/~8€!հVyc#j2mK[WcdT6ojp%F0TvM% R a{ŗQG3%X@$Ѧ !OGۚ_mgV|*W_nrnIДڵ _u:2ygLe}n>%sOyK6)r0܋:R]}DvNXRk_=.X3*f4~2Ѫ<r,Eݱ7>>dB'Yv,̀Q¯nfэ\ 'W|<u`\ /-mRQ)Y;(,}뱡8Ly(d}5^X QGif@-}4GƂml h]gy+@X2x:e2cV擱+5Ǔ,t4@|5%o:'z3Ren8#*|! v|g=R}-z_`HSO%Ab G2Hpo p)qcnp/EO?+1j@iG>S M;̙ _w3YlH:BfTt7#vPݼ4 ) ,s9POubqJli1xv__x}3Qտ-sfP 5EڕKX?+'qBUTT@ADdlٟyedc( IDATۂmeL|,@+9eNjhЧ:mQ/ݝNC ”G}狏-a-Y4Hi>3#ǂ_ҶRR-;@h ͓ĤEFnOdbXNے<7$.4K|.L0jGܩߢ v;26.i؅s;5SE8mO# H\h 91:݄WeXT":SIyAlx1^q載aJ'1NF|i W]AH~ ^Ei2ؚC=*o?êrf9 E|9Hp47yY£.=ץq{@ӿ0j;G K9o)q?mihF<\q9gﹹԵo)'>'R{nL,E=5?v}۔XѰsͲ6oé_;Fl:qtrQmAQzQ`=(L- ҇i5|Deev3/A^;PcyI#uɎ.3=4ًo"CW{9뾏ߋNQLL>ɓ\7y L]dkzKӡh4h4kcF4fk5ũ]N1Z?E" S[\[|ϟ?v±3 r& 'Iȴ= ښwv_,Qlbo.?Cx& d)c6Jj82Vþ*QƗ b^a܁^cMvvڮ ff|~oQ:/#ף"y`@%wkT2{{NeK]@' JiD~W+wuM[.& @%*-b!8u^VJű _MD"tTtdfc& PtD" H"龳1OR"TmtN^UkE#8u^f]4N0z.C~#6OE뼾;|m9a$[UKIvij *u*!`.%\BˉWxoB֠R+{oKZݿ{OչoӶRBS/:[Gs6,;Wطb]ZIfwq<ǎfU#=/(ƕwSZ2֯9K̗}iժmE=vRo;ͷ1o{xUuI6 i7,W]-/ΡG9`8k?1M+Z‚y_ۈL3O6s[M^)l;g"*_;l:/* 1|~e>K#KXZZGIvrc:N_* 6PN~D:/;>p䜹Un~ŐQ^H$M-b\+8bPqsřE2r  GK9+c}xB.4zYRr9tGs_Mq52n(2"$\u/ 1bUtJS&G ٚ@NA\TTK Od؋@"CP]ɱgN '蓉:>Whԯ2 Syp1pP(PS)HsTR^n5VHE:"7%V(:~j^~ȧzz*0,KEM=KűRNe";NMWBg!9xquaξ1\~\ٝyi13{4Il*썈f\Jt Eާ[ޤ,h0}Δafo>FtRKڡXq/I,CWԭ)Q(PdEݻx4r/AMA-@ ^'-gmzKUt%^![ic-ý9Y+΢a ArWw Oe>^=87 ʂ~ c~Qd"d%R)s~@N@@@@h:N]hՎw˰{- J#*PjD"QR_b1 gg3@ΗzkdL%1:LLZb{9Ҍ9wϏ=EQU1s;ER9=p&N`۸.\gߥDt.[ːeF&׃D^VƤ ʑd;"go,0j2ڕߡT;a 'Y'E&ZE\6+/뤺IPUsOT 2Gp;L\kh=?`췩Pː["=d_wܷ3O]fi<"ȧN$N掯EUKwHye[ 7p7bEv^I3Lmi#t퍏 Y^ T7>"uј~͗4O88w?PPd"! _iTfc&FۏbAb N䞵c`@D&g9u6tSTv?Kp*۱ӁY:ygd^ֱx%X(>  F/$c+T^/B/,˥Rz.^4LԋЉ$Hd2l<)eN\fRe>9:,yec'$R#t9(װd>?HE qq{bU m]6c:F{k/o+Eu] Vpc0EZJdMd/x"eK{; ƸZ#.tͽڕuD״Νb,=x?}z^ԫ z74f+v&DRR)RH%beˑkv|fOT;" A""uN pN-tmt;R)|"ы5. Ib6Ú}HNgM:R)Riu̟ߤz;l.^޼wvۅoJ Uڏiu-]L4B6bwPis}b f*>{#]$?Gs_*YIJ ܳEmg R 3,HƒaQ}=GniTcC>-q9I9Uz1"-?'ꍯ Ye/MۦXߜ߬pA#Eb]^_)"rOj끏qS΋7] ?eAxf Vqtɸ-pjLPxԥULnR.*#Ks(J=gq!TL74]}P5ym tȐuD|u4=ŐgIlՁrˈ,dԩt>* ?OXzH3XuXCG#?3V~퇥t "ĒzR13v A&0_7mq~z83ஃ7״JSѼ`(} kOqgǐGpxŕ7zU&1iф^f]%,]!8u^5D11'Oro43w";cGgKxGF#9Ы\򨾻}iBqkas=^sw9;L+ƫ_I}9-g8p蟝bzZ1fob\(^rL)50t40E,-|:3v"݋Y駸-mr:nbq.GO^eXcg;bhӧNckk\.vXuVHJNFRQ^]ZzJA(R{7oo/UYblDi{$37-rC3TdPi"8u^&B^ameMX5&!>.+k+66y;7LdWOk4RDK􌮢# K_PZ?HlɌg+|h8a 'N]ri:05aƶeH$eI -Gm7GWl$y۽NN;ug5ɗu*(ct駸$}sg=TqQ82a NGMD11@Qicb<l-@(_j#YwdaN?'y̧3~KEIŋOqyy[]je̩#% | BhevvE#*S+wy/s)pR@Q1A! ({a NWT;ut<1>" lݺիTqGFFralVM2?]]Ȥz_ӰJjj*/_Ս~:y/@lxJHrXx} ƫ9fWMUhO g{QqY ꪸNóOQ~F{K쉮qi84F}mhM:jRkx+Jzͤg*Uk畅|_?С^4<].eJb_4:$ó2XJJ/ 'ū%E#5|+-;ӿCH(?T1#_ s)VZZZ9vq"Ǔusƿϯkف=F{{3K*e?!YݱW_Zj̐Z2tc42\ ~zgq ?P_s[[OH{hmzilNȣ+} G6Zw)Ҏr#iz8LڕoIֳC?ci"3yJu:I4j(+eLbɒ]=t2Ւtq4ϻhѣX{?{@Tx':wy@w6y\zV`Х$B7ƣ3^~UMt2(~!zeboTq(@ܚp~Sڃ#>?NP`͸K}ow n>u;kOq\]WܚC Ͱ奾&^hC;5^` _$B{[P7*t5ׂ)悻BV::ځpNXL(S_X7Wڬ`JK!iTlWg «~ږW䨷"26n4q!S-,e¾[>xVen}OVVFO ̵u-8l*Ὥ혲v9k#[GP5g}+FjV;kf|o1/=Hȸ߯Q;6>"D"=zɘ)IY8z͍ IDATܾ W=II!.Tʷ.H=owH K[g||cQp5ʣ@{lyC~uq_n656Rq)!?,+}舘O!3TE;scowq!-ue*7.7wpf?Fe`vly^f&˫Nϐ[ S+7n^dM7Yb}ُ黎sz\f@iFc^]C S8B gfO9ǑI;$ 9`o^Vo?$7smNrx{z9L2wVp/X6F'@z+uN]'.\"ZcNŧ *n=m,&pm(榌aմ&؋̱/OGOBh Dsgtpe_yWf/"˫4(!7rWpn "Td{<YE31҈j=6+6>^$րb˟>uJƶv4lS1W;vtz[":Ҩ/ryF[Hn'Jb>A r7uB #r)R;ai^ d On쮳Μ@p vnJuuMiԇp+RTj3T5.T.3FD K0-*t_ EXX!ѩѩG7eNA nY/ 1"?!h3D$ ؇k!@dv=n^"'|ic>aV^Ô5\Fv=p}tUSoP"¶!vOy$s|\05/h rDG[sR.mN5O'GuW!*ue_LoyySckTTȮ:5F6#}S#v|y1*vN ^0; ~Hd"ѷJbOFM2ڗ0^:30͗,g DdO9Y/_ SqXXRLzvDLEO^zAn^̰ۆՕ~?8ORҼrl^f^M9ۗb7}$  j6!wWȨhʐ`[ y̶O]fy]*6sh4wW7/jt ϯkNXTXu&ǐ56%֎(RI2d7UL?3q<w*TE# _"..<==5k֌ckkuW^ս{wڵkG/y3f YaDFF{?21o~ƈ_l#_#R~]:]" 2{+" A,WO?{R䈃<#9~ПB!OxR4} GgKOoH QՉNd`Abg6;޼@L*Jm状2Cat>ˣTEqR.RD$r,>ݲP鴤%HqXLJz?jhmvRMꖓz/KAM0>&0 {it)!󦗷{Q 2J0V&y1Wr-_,87%Mn&±D(zIlN>R_3[.>eu@ I:6&;~'ouIƿZu^766u懬n Hыj>9=_`WCgo<3ۻ ~ނȏľw|ys|elx \N_̗VXKM/{:uUHEba_:Y>t2HS'֎XLL.jrXJ ؽQ _b匿 _*P>:iiS*rD xlg}fVǸ{&夤K9(\#8u\;>X5x*5᱈ʹ#64=؉@HRbD?Viuy?\J_*7.=+8%ҙ@A9ȚAo+:cƎChXhя`d|ܒr" ̚{.0vܨ=3³Rp6fڲ.j^GaIF@(t)`yisǢ6qn5`WJf-/76?VTeixm U M+2;w!^"Wl$g1@(f:dӌaK0zvF%O 6Ϻvfm[[}žoL}P+I|ڝ Y5UQ5o.\`\Lj"'IȦ)Oɔ}|<`Ӹv8uOd޺,ƍٗ_g7ߏ%Kd}"B$6˂믖qhG`! NK߿K"1U'S;50)( /NGɯ5,<,x$-$qMcXD0Xbn&O'r(Q* e d|zp""" >jai{[9`Klx'a N2靬y roMjz'i:ԡ9K^a)IרusE.^@ߗzϳMD'hA$%oBDr#9!%蓄R^KXW5>$?Zzn<8nr)Fd.'4A56Y"߰z -%'uz8!r|h=w_l]a̙%q1@[uMBȿĸ$4xrK"޷>N7cT:6ǎn|R![gIpoI&iX")r h5:# ?{*7"qmN]{J)70o3Ld<̭D3e{f̚GLAvC$[{IhT ˱R(z$ہK^hV&PgM~>hr0$X.GU{aNǚ)>7re.NByG +F1vV,zOmViVT2CTz=ʇ}T¾ܪ⭼Ф\y3}X\FQG7^*c!srBxUğlmyfۧ^F RdM=ƾq>Dz=ytrɟsƨ`8sg*%7a r tqI^p7$1ͪ_fH?ƆG%wɓ';Ve޼yY={FJJ ۶mcРA?~ZoUf:9OIfܫF6BpJ9vT=f_OyZ%6[JM~p gGY vlvWv؊]?vTwNէq,֗ E[+\_pE,IҚc8vw9ط+2җav|?6;1-Tuur{dj;lN$H)%5{~NIZ6Fc=11gP 8q#D@ vHAʘ`9YQaѷ>@!iܼx5p4dR/:vnK܊ lS~Ɵv)D"$써 bۀqoܭDk\SiBVߐ,2<:1eTϯjs*0|Z7xSo>T +y?Δo/FVzZR)#pT HA[y4O88xzOu&7Xv& ͬԜzd~YikLo_N||ؗ۷nedIm\+eaWGO [+>v>43GsElU#cLT޾i_b̚ZmMmI r*I>xVƱsYNP+FÞ|L#C_}|E,S1lįtL96VTa_N>B.wCײӊ߈uie 5F7~_ } p xbVVVo899˱s LoƍWtڕOҥKTZ4: Ow,mi# (&&ZI<r&zQZDnJI[X?rDwUk1N lp|Z5&F6E<{P2AFUkmW$rc'v0`t10tzYu, (}_gAK-Q**&jCL׳|[P_~}Q&{y?̵p6/kfZ뗩KmYwFơ黆I$N: rXqq%9]RT$%'R[.Z9v\B iܽժ4^@@D|%KpQ6mڔuOVH$gϞ>777 }_\owygggf̘gXi7m}s:B^ameMX5&!>.+ȁ>[^l^fVZmN-ٿeP&/zRcq#7ͬz0Jl__6ڰG,פezwR[~{#eiA%) *f"^̨WEFA KX2,'v?fvwB,YktWթSk>u|}~6Y3u 7rünAp:W0P%.9w"xu㿯{{|)rf'v'a%.xlx_bMn,GW. X-4Z6Iq)/`}@,#Rթ+ dDI?)6DDDuS-y6*k[6/!'z < )?ÏĎ$lߴ s715|[^Hp'8v&$UVVdFׁ`hs£E*:lAE$fBDD'wDqdRDhUp(x375O\r/^tJ+*ɾ1<Gs;~KV\~~@svUkiBBQ܈鴠: 8ԵA(R KqCpFB&IؽxQmu AVDQQFzQG ꉟ2|E I{iRJ}1OjDvY6(6'o*(SGqˮB̸|i"͛G)zx4} ~蟌,+G֐1x&;(>ydEG*qrz8wn2(*h|[>uHwCcičOk\>iRGMgر䯧E3~m+;X2<*h|\#6*^/_6T7I:mnbmP#{X]C7+I"l35|OEtoUV;|m_˾WfDZl(eʻU_FLή.%ky$GGMon,_GƸi70.&lo?{MA/mOVzMiV>4#W4G9m}n_9_6a'FJ+!e:txc 'y_'eɞÏ2R,!nE5٭m!/0j&°׸nY18x&+㞗 0j!A1ȸ)3?KW L3r]Te+Kx{`C_zt}4Rڏcǚ [NO(b1/8PrkTb4i֔䮒-Gґ09iGHa`(s}kvFAxsAtd` l IDAToN?jv…W QYJKzWu#ogum!qd\""\|ďe)\q?FԘ4ZE·Yč$als[!M,ߌa[D7rӕCh8iBLm2?H֕Ah Sfk¾Uw1||$W]GE6dPKpq,\af4;..[O2FTΩ_ֽǏLFI1/~GAFWv羧2g b"4n*צi1ߖ-VoJWDGѦW_ڄxڿMë}H:Kfz,Q$$iaЉ>%?'=C~dSkŅPϧxܮ+j4GAM}*ل&c4W-׫.kī^4{~jl2aZ1ڌXe+:I#=n.6S u5()hWW=akmP.y_|z?pcZ䱮_MLxy9F[8EizVEv{G2kT"ٽyuX掍&o:nwr]4R#E+b*.dEMfޜ_ﺚ)Ͼ&'Cf%|}O{ hZCˮb"_/7 :t @Yo=xkA%_PctXߕMiaKE0;0=k0mS[kAEkvq 8/2,^uJ>QBp7ٹ)/h_,7ꈆPU9Ipɭ\/Lgi]ܵ3r[n"D@wIZ:Bڷjl&8Nm[V6gOߖ-Zmf[uC(brԅݾMq4Z$Ɛ!FDFɓ_N+V0>.6S֞ÏNک?ި6+>N=<|3]l+RD,_1SwϺ,&Ӆ#K0/QZ=)#aBz*6Ě#"d}}_5kt&n: W`./I#+U  GXɇ,^s M1לLr3)0} Ԉ1KJ.>ix LYx zm\SJq;lüe2W=Ȅ9=<+U7þ)׬;K^AkOq|9mHlL˸{?S**܍=WQ5_6ԫ8]WDѱVޞ(v/_t^Esw}=gc6SrkD969yG=t }[?{WTPܔf~cqN;-LJVvodʌ(@J0 G"9QIۼ^1K2c?T-̊"cd԰WG:wS&+ۮ.-Ŗ]riWvU,UכlTjH qԥ$=]Psgn$pr9;ܿ-.ԏt=Dd|;'D= $o:|2a>G҅W̔|  ]1ݟh'^3,cyiwVʊjI$~ahN6'hJX.W=KԪس- XŽf1Mq(Bm_B[ZKwdV >o{ggdZMƿ'6>'!zkK;ZҚ_贏~,^874 j&!H7s&0!c+>i痲Y9) _ne:q.6cVJX[YȶyZ{o=,y|u(>W/%ǡOЇ` @D R8N615_c0bu ~m?Mx0Hi JoMW@M|H47?S+:s[bpiP^}멶?,AyqEp,3=S)3(/4Ks8'漵,˲/(dʊ BBC\ҭ+ZCBUeӶOA(NQ]ۜZ4ւ$ʳ?Uŷt\qNTq^ٛ+.g~ Aɤmx_'"vcXRYNj[X;ǖڝo@&i&{ RH$?T1mfrϤ/D_tꥌHm&BUq vecL|{d~~+[IauqRm!ѐ9> =2iϳ=;CԅadꖫᗵkgsxR] Ai'KTzjgI5{Alu&2$-}d>"ca߲1tycA,'&DςdXۂooPp9}`[C7zFzC>O<|[ RŐޛʟ9T%i樍ͤ-jJg }["|]umb13|_,*ߋ\Jɮ'6X9`N3c7U+pd}t+1bړ(!8qS9ۄU=v) 8tШ}!HcfY~i63fsVwZZFX LUt։d4;BzR@NMUd;ch%5X$#8Ui_Jh$C_ՑMJ}!j޹r}YH66* I3QC>U4؇Zwwhœ]4kMw7RG:~#Ojج -(-.(@w`+xa&fMQ3=HeP\:D=@S!>B-lÀ L,e.+I$ 6m,2y/]aD_X̀.Mr1P_>W "m>g3⡷wtQYZRFl6V;X=NdEGKj;T2$% KET'|fR5GIԇA,[;ºi6-].-l-6RMWD8d-f #p о)iI5??ac\Y#[0,2(VLF&ĩj5wee2M8/o`5>VNuQpmڻMҿ,Zc:+]Yi: ȉ})jkGtجא.m#blKkBHO&l.7Sns6D2vS?>KVLOX.AQ\ʟˏb ՈEj9^ë}|ܿ>xfZk̘L&V^f^0^s*~L{_)cx%o9͹TVcg@e\f_ht9T??ÏfTWF~[zϽB/#%F#/^ʒ'ݗ^c_[1[9*x8_W kZFQDIe0uqqɬ˃!(6rN'0YXj4"zEQ hujkkV/WC6nBm-"hxs9W ˞!2TK=u\wi8g-s |厝{ Ypoژ e[!2 C7tMn߬')]O,@#[ӫ=HN&m~s:dz^w00N?1b߽>}0ݴVc,y>PeF=i5L@|ٺ 1DOh"B+ Sr`EQAi}O'` _|MD]ZK(7\;UZZh|tw̙Қwd81$J;Fڬe*8ڷAk_ޯpj&0R܏x+ǓBb{I$\CB]IK!r33[ު 3%i:Jwa:t"R[7 HKN n% suG` /r!JfG<-Vχo=ʷo!xdxlIg{̝W{ J #"b_ۉ!J|QINJ$9)3NнGf Ɛe*1|ߦwžh#߫--[v`?hg5.ޕ$f_Nq|9m??98 ك꬗>M.9Qȝ \ц-0%Pܒdg9+czf syywq(5 hZ @Ex+^b8xɍ26KfE/$`$IB%$Q#UӇd:2dw`xKG+k7vO( ͍ءNܔS8GC(.>8~ *[ǽw?+Uɾn R Bz.`P@,]\G78 ˾ .f{s|o~V_۬7L@RWE|_ ⛬|*al-/AyW)W^;N`<~yI'r*=UZ4mҾML~&>'C$ l $$N(}9贤yylL=ԣc6ڴmXHNN"c3H?gE%;%o⇷ާWm5}cQh)Pn2aȂDAOPpqj6 Zs]YeI ]s\ ׫<> *f*[u.E{!لNlү$+5&BiSQIW%@?Y=] !?ϯR]sY~ZZWWf@nZa奏lgr f3'oSũOc;pδ?,`V"6,F ETˠ`FP@0l+){% ) JM&g)txqɡn x{X5|it)IA t RIӐMS`6NkxjkAR2+%Y%tdRǏ>)"iU\ٷ)iϟ~ď "f* I+ A$bDHA(GhSdwJJBV-ӼǮYg < p\(.i thSd6#bCDmгK;PG(6}Wj::$_oy<}I$uG???Ԑ{{^HQ AЉ"A :4H$ Q(aun\>XktZ0J.'s.1Ws|efjK%Ֆ*P R 4ƥscEQ- zkZqAU^m()huA=ǛMu ϝQ[_(dKžۙ'仈:~:Ď~~~&始0eSR f$JhD`D@``AAH( =&F#'5*cEz]\gGK)@8=.DGc2WRed3" Ajшښ?N!@O.Pg T۷44؅~r"sB8k.gn}ZNن"JDM ͂b5ov?N5c>3AYͻ_$+:V{C)bdkF+p}4$]y˞TR殯N~52_ʅ|85gs?Mez!ZR_\MSUOpIT ్:CVؗwIC)g==^լڃVt?MU*i/ oO(bowSy.?6gSOFSj@QAà  V }Қj-.m~ĉ" 5 G풢4-fTA m= 3+rښ65 ө[3RQǥ^2EUG?tK9Y>mÏY%v,u_[{xgL>;b5a|qب,z{ @xLTB{Rޜ$unKPEoCc>=ğDY)~ LZt1]`;c|:,h#f~j"k\ w3>g ;@)W]8l/}O#rgWrZ^QĤfqӛ[}]iŵOO~3&Q/8C? ?þ~PVD$Qm4 ';`%  !cl\#  " ׏!ѕl޴zwe]ϜWEAhE#j %@(HNbԉOq'~eqܟs4/{ަI Rk¾5Q\&3Hi%DCuxc 'yS!_'eɞtGJ^iyPjхEEByy><>?-Sy݉I#!6j_(T;%[g$j7Fj}QTfrd^ԗGJX@Xf+bx^\/J65Ѿ3lRq8K.{0goè^eŸ;LZN{^F3x&¨sL>"㲧D,-_W'd02qL"u]rRf2/mI }_ҕHi?k&lk;?m㣈o@}#˭}SNӘYSr2Jr%KGgM[{{g=ƎEOZ)phĄSΘi|^vgUdW^w$F%.J۟Weh6y)E?Js)Z?RľR+BYdg$_i7{ ;bo30RAOy[Y8;2dCLzm}7f҄q'*8IJ[ L5Wc4Oycxl8 rZX9O jk_Ϻ+|w0{3qbZY]W39$$b2 ,dOӢ}YMwhU^$X![Y߃.\1+͡o-( xNZ )9̱vs}gFg mj :]x->]b܂B&.L'KyWkԾMv.='Ci}z .!:!)%Tɸwd&\r+% әDZh*w 9t3]l+RD,_1SwϺ,&Ӆ#K0/QZ=)#aBz*6XOͤ!HCZ:=+!Yv>Ly6iBI N`av1"><`z<_O?gF԰1Z@p|5ЄX,sͩ| nɤk۩.7#לJDx9RZp铆wTiy&ox׬;K^Ak9oԾg86JA$Ne\~?‚cHZ `}XSIOKudfstОiۺ%mZMiقV-iJjr)I$'%GPP VjD+6Ŏ!j\uimЅĴ5UE@ӢthD$z^b#zmߓ>汦Η[ T޺C{{q.Er#:=fk96bؓrݠ \2vkOo3bDe\ڕgY 752* ƑKIzTH rv'[\|{=&RmwlO{cU1ٝIVMud|0 E) ob?eNg*XL 2ՒIx ќlLIOҝf]@{8Ug[>q"h ͞'*4LQ $7(^ٝɬ|,jɴ4F''Nl}NBr֖&3.Y-՛}5i iqYq"os# Acm2)B Tiz3gk>`b B1=潼2v~)Z/Xd3V` @MoU/Elw)5:we=x)ڐhCyZљ7.PќoԾ՝3y4L#di*IArԟWߪ~qna4j )HxD8ёh4Irla< !]eG0@UBJeeU=_cY+)NZ5^ܟ^Gҍp53 w-,|y{-gdXkrYtD&_2M0ܵj.H&s*s,cj,I$|-m;O)\o_bSϋd8 y)\h"C(R˟o`bےE̪).ײq9,v9E ܩ>TMFkG-˿\B =sO_W$8I"̿Ϻ'2˕l1WQIŶoyw?$ZuT|/tE¤ h,;=ak_ 2%^eՍ慛6I`W>;^W$8X-RYNJqKngнaI$RrrYiˬI zNNTpζ;ض}wrG),P[&`axUs],ƘHd~~+[IauqRm!ѐ) =25iϳ<ُ%e/x>SualYn*\sMg)G. Ljm-YR͞<:ev (9^D|ՇEG,Z6vW~LEg%DР׀lΰk[p_qQFg}Nb:VqЍQjt^ͮ=7&r'}ml&tl92T*ٟ}mwյ?9Qd?~iNJgQ9n+%cJEڸb)"瀕cfRuT&\&=d%aZS " rO}&tK ~N4Κ9~K"fIѾMIAӢiiFE!0P ' (C`(zCaEhX4Z{ ʬ2VzU/13DTϫ6B_?H/yW>9abPK=kv~ǂϹcG`61YdP&LfSjdpmXd S]~??s#oӽb=mEcyJWgVkھrbF/"~63A6{Y5!'q|6)Y79";uשƟ|_y,q(T.Gh1njď"cF/Aߡn_V^' Vh=՛}Òy|b*+}3Y [{?_)c)r{ϟ~BLl 6~g(,`2)+.*ʩ*qTWQYVIEi9TSYZFEY(bf3d! u֜Wy3y3}7tRGF${B`4}bcQlN᰽"\&-~FRY$8c(}'y)} '4 -ys3nts7a _}?M`d ^L2ʌ w4CO^xmEJ(vmA8ԋ |:f&?35 Af60Pnv(12WkihJ? ;yLҚ iH HVIbȡ})[f"B)9i[׾_9>M`Prt 7׹@DgS!^ĮmE̻˘s<F E*pGqp'n}7жHJ:+dc.k12VD rQP ZkR x7WWA"srK߻LE/ֿeFłhD AZ 8+(TbH3YI 2fLr|TH2Hw(m?&E `Eγ6ԔL ^^Z!Kg xv%_Kϕ_!?wgV(_޵ukϬ?񰷝2֔|v5|ÇD~gug%u3M$(AE 2dQζd$S@ph5 T|M)K$~:?F2ѯ8ڧ?~r1y$Lhׂ/^OzU8qɷ# b5ӕĦd6vGw_PWMFHCfsm9WͷM!8>9D>S[g՝ +}~t{fWu..4lLP=dk%$|[xqpK2s7,a>/asG y k.% @ux=Ko)pIҬv$5C_|y;r$3iA&S}IG8? -WxaY_H@_i':v͆0'nmE-qBCr%;EOGü÷(nJS1_ OS+z223jB)"JqqFErP Luu _Ge ,`AL3r;UYm|LI2y_BnYձ !ڏ:h0^ɘN){3}zBgy̤~L|d~ k'Sh`'۫x޲rɵ *lrOݐO ;OQkTH-YFW7\m9olǥ"VXe14gZx*l6"%oچeюDy!K]XXKu7^[ts2bχ^ak:qw0z1eq IDAT}it,[p\'V-d7S(Efg{([41tOlVq|n]ڻ{aZ:Be0n2Hz߉'6Si؎>6t ;oES++w++PI2YT^-[Ve+Vl +[Zm&gϢFW$aTs v P ,cEMzLVb[{!WϐeŎUk;U(+kk OOw;-)L~=NWg/1{/>鉛o4mH=͌du}y4n@Sv'2?ͭo3f2E5/o˄Ǜt-)HcG@3fLmE!9G0-dh~6ߡ]jƷo!4`Ɵ_WGv:t,&BDI6z -yN[M+RS]lTFI[ ~b2S{<|kbD>`P4ۀ|D3IL yGN-p.6-Sc3&(ŽBBb ~E[kHs)((((((((T&;}FVM6%Ibdfӵ (s ;2F}{Ivm ;=r:u19AD7l|'YR3VZ7+^^D 09 2"߬Պ}ɖ$,y2exH$&My;oݖ> _R ~\P(iܾǔ$Y"ڢgHVTdI动quDZ>1 BjPԏQ[lM i7LS" /l3V1_%\vRDNwVV&ToIPUTs+ 眥R9!XZb|*wT1%2pwvrepSztc8ZVѼ1vnЮNb!ak|o^K;WjQx)7X3'5y))qrc>7+Kk8}Wo^e-,(Jބ RE*~QLOU?- :BeDEBj2`@oH&KTh%WQ`y 99e3fhIJMAz777a dxdf^-+l1dd8ynٔŘnsҹ(/۝Ր @D %pGu@c^(~Y,؇TR`<ן&5pZ7fNQ1y ֨썿YNNr <o fx.CաYk'\w_\h>.'@ܩEtC95u^dG~|+{{cX|C Ddu&6 d=.x<ʣ(9cW l\@H9 9i@3{S!V=U&/hdb#[rbpMΦTnG. Bzd`s*?N[U ji֬!?B$ j*pWeqedx"#\5IBŵ$ɑC kgp,82)~ۢuYؒo_9S$t..V`5ec1g#tj7dr^ʩŔQS Νu\xVɜ>8:}>C6%y>13=3c*f&Be,fYώ%+ 1oS-|w 3w.t9s5$dϿ.=&}͹RX8X~4}LBm*8i֜our &̻toATdFp6m@0{{G|"gS|5mՇQχ!4yho!a4MbeoJ["B  %<4?_:/!9_G`ݸS[ Q#%2͜qRqIV xTGΙEb-*.&9dujӣ 22lVV̌>;J/hYeԔu29W:g!A0Ld5n;`5fc5e#J.*hl`5cm[qǟ޺Lk/NrФ̔px'}zc8mM='z)iׁ&e^__ɰIx!/&l6p&gr$sw݅.pl)SO&I'qi4 ҟٜ=) >+|p/Mչ+\8|~ocQ2[Et:XYo뷛=6^%cmUr/ҵs<[fPTLRg<Ϝךs,,߇_7薍b7 >+\%~:v%e;3a|­aظK;=vY{{x`W\"n̻JZ?gS5;!8s"/cG nqs8lYp-v5TuOC_HdyͺAF˃ _7`_{|X]㹯Y[b/\폏<e&5,|7ԉ w.'2X~ω&Љjj-}" 7NFQCB/ e&RQ?dwj]jTMLݧ.c|t 4t֗W 0^`e!v?X M &ήkG7 KX^tv?S<{iQK5h*!IQI37*U ;5\1 h]!YMXLXrcztC;ͤ\/ds j4_NeFgϢ8%O?@)/k=ъT3w>R˝CC'!1\8~/ gZp '/&blGm6݄G-̆E2zq_lǵ_x㱑{'~{QWAO5sI 3:wt}&/\J 7`GvgKS\!P)9=mZ8e4s;3?˖AE͑/Ropツ%EDI@6!kjϼ.j\¼w_huj?o[MgxlWƅ + ϼWaR^:oW zHI2A0}! g0Zq2 `I'#ɐ[jc+~512qD, l%+*wTsgo㜮-}]0f86'{*I,We:vqvβa턟h%ѩs?`N@59fI`ogu_7j@g9Ϸ_䱧cYg&^/g3o=czx kˮ՝k:?Mβ7ŦMy<ˊ(ޝ<ϑW,{Z;ܨYӏ0bbbZQ$j5:-$U`yqf قƭh5D;_NKZjkbU>QGZ1Mhu#fVS-˖фZVb)TIY+P;w^{Q׀5?I,7KQ(k :6A}} :g@`2Nq "&"v0aEOS_M45l8¶_.> WsᏣ`WedX|s', H<;~\x1eQ'>}z]|u.zeC ΃5NPzU~|a^<=/?Eʈ`h. qm+U#L: ,co7^%^'zzKFK9j$M.aMfO J7גwrZ*q[>wz@zun+y6u?YLg7 ?їH[1_ŎR z-.H}tןǂJueҲ~}u57Rmo-b9رٔ/3GH+|VkSYv%f37'~"C9}CO5‚^sr%.^X/#vO.O8X᨝>>GZf7صfSz3hnv˘.I8?eEPb:O${Owۙ"H |O\2X:-sץb`K Iqq遟~~ ((Z0SÙbERrɉE?w F ,FCѻJueX7J"NJ̌"uΤ[WřrE\|2ddd_F2Y:QSJMzz? 'Gjvv IDATy`Rl:9_Lh@ 3j!U}kٷ&A-ʅjCHOZ o=h%:"l=ϟ-D{7_b]Pj]nV:N{fۇѪe'zbK&ϣwd i9=~^hbg۪Ud6([D<˟QzgS!]@"ˍ[q}ҫn0Ab5r馾Cُkc%0z$[j̗tqQ^ļx8"@h]0f8٘kPrU;ڄE4z|w;tωaNmF9YQ㣮C믗R E31< q5ӷoq'o̒ 𭕯HZoXGwXbXzW3)&#E"  u̥|52G#ؙ ǣֳ9}> m GϮ$/[/Bgm"9gTj\ /~5&{ds.^M@.no@mr]s ǘArK)+$#[3lΞ|>]xA~v~Wspm>Ic0hx9q|r3\__BF}̶9^QMyj{ :2C\c.R.-gh@ Mq6a{"8E~h5xxX4ڢ^^](V{R:nEK,H"XWrIu˭^GT~+DԸʼnF&;fOQP(!1|?"5Lxy\8˰!+ z70OsM_OW <:?om78 a 6q9uAX 80 / zR~wۿejOYrwϟJNmxc kh;5yWP;}FVp@$vmIZzC -5Ye+V cY˛o֬ۛ6bط9tDթA"a;y 0uv3*jKNu7-v1 U6XJO!;Z2^QXBj%5%O/;p-$Z P(%GOXX\9qэ_c'-&weib&V|*;&r?w 7l!4&I>6dB<:+Iig n1>er>*9ru픩DU[xeѷtѧ3?ω)q/ wQp.xX((T8(`XvêP*c^ScXPy4ffQXH1mn..ՐT&łK5brld2sm#. ']~ xFT1$nлݎxR﷬?<TAT-+Ue|sϟaɶ1%v #mR ܊C)dQP0 z*IBR0T@`GȰ6U0e!cEz(bBel6[BVfu(z}6Z5'fL#fv1x7E\P%IKv VPPPPPPPr⇔(`* QƠףK{+ErO6X֢VNl`Zѹ BQk5HTM&uAQZ/@VPPPPPPPqv(c1%*jXQܯra5f "i,;t%Yh9)red #ɴ%(Y&e3LV4m]xm1nXI5 !4#M ]9d- 9(|G,/WPPPPPPbTQbD͈ZbgAp,X[xދٖiKc'+,Zd~z[w󿧻ܷيVb íit=_6 $Fx]ڇfe|6mK؛s8]Qr ~F\?#/<ڭyl& C&{BNd\3&v dھίWPPPPPP(Jnӝ+{$`5e!Hw"FY nnUl1V1Ͷ;Vd1ʂB,F]ԂJZ;DAlNؑS}H>*o þw ZK˫cpg8,ȀH&8¼%G7(`Փ^kM mq\?E`Ϭ'W*\?s&!OLFʽ=MЏO')˾簼˹ g W}/>%}R_T^Մ"xp~9] ¡BIwPpn7R`0n2L6DRAjred&8)&[2SQKXA@~f6QT j6, NKAPy^fާ2?Ȝ'q%3 \u-@)1̙ F|@|ez<ߓ~$G/<õ4v>HCӑz<289_ձ7~z4jhʀV>~S//4p34̭N?l50Y}ЂmHLm3om_/'/Ě<,uWEq|p~9]J`d0i5]n?:=Dnp䜿ͥroQ;Mv* T7gOf̨&w#M6F]2gZjUiiiW^O>?$.. cǎcal۶ 777HAPyޔQ%<&}q?r R5o\$1Ӂޝ'1L6]%L\e9†'4] Q5*p*puCF%`1L߈:lʨ_1-jIu9%*ix^^!ȭBT!"jIDRI`5+>%nG=2g݉6Sw]z|,VgVqVNo<ܶ4w"RGާ$Y]J(/r~|~ ]iۮp⬋⊥pop΅ *M  6pȑE¢+W^eҤIdff2p":tNu$e0hPՠ7&w@>qF|?v^؄QؐsqPeMģT;JB.N:KA,:Ө^RLJ'|hIXv-~!'-YXBej}⤨ßeg5=۩211wzLyn7읒ysqi3+i0{f)spg `ӹBD74\;p4k(9&rN(ӓ n1'zrXD+MqmPN-)";r_ۛÚߨҏIkU*+wRgл2AAqg]xav2=G XG^3gȦD >13=3c*f&Be,fYώ%+ 1oS-|w 3w.>Z wX),fCMJzYdIɼ]zLsy!q3no$]gG^c8͔ujӷWt7 ;#:^> [A'x>lѴQ8&Ne>s?~Lz$U;L$?׻F!=>ZVMDoƟKEӗm= gŎB*_˘f23((x]xK5f'RheJ8s<ۓ>=CI|16̞ГYIG2/d؂jI6H|3f W9c@Q]uɱ38]:y`:X`~ s2'l>|0|Gĕ lzZϖ DMp qk=cl 6rh<%{ޞ@?[M!uj?].ŽQh2o&8IXIۛpf08Y%WMFHgvr)5R'vV uBit`f}BEDqNI…%O CsE RPPQP(N_~̚5Kx*w>x##Sm,Tp6r8zb־\^Q=iZW&m1zSc5u O_&Bt+\K :M.AZRLn%j h7D45"*bK¬4pPa&\ް8Ħ<;>j-KLGfI<g,I޻[,AAp(* ~DE( *Y*2A@vR2 Ж6ihKiB={$}rsB|i< d5$tnyXصw'$np4LlN%drMKrem ;l 23[ߘLFv$ [3%m3lZ-cj;73^V We@q X&d3ފc;#3bpmE̿QW3޶UzB!s$BT%y%SXYYdf͚xDvW?rFHlL@`367~نLى\|NBc.gS.ף3YQ+\LӜF}4;ɴgQ -EscIGe4F!PiCj=zx*'nkkNZ@wOP>mKx,/}ƣ;9?g%J*_-F/s,W@amå ?ѐQJsg9:!5Ez|) ֧*-nX;kFڹen' ®X#DνޞJ:P$$8x~*Zj3iܔSC~"bK½"Awz}J__⧫Ut:e3Tu9Ǚ>p7ĿY'6[Ġe> f&e,ws}V^Ͻ} !M_΢}: w@Vch4o0a ̝ڴ`( G#Z69YOXyB.(K Ξc5hDʵxzzUR5CzH2i*o >hzHnU-TvpBTY1L̞=sޘv> mĉyHIIh42qD.]Zm((zuvDD,+Q*5cG!B?' sdQ9Ǝ޽+g߿ [lƴ9sSame˖lܸ_~\VZàAx7֭/W^E,DyB!˨XBT<+ M61|pL&'Nd…L2JU8< 啣$V ݉hN@0ώ)sLWY+3qug9[d棎m eMڜ3NQ@Uz}1%p=ES[:[>$pJtY=#gߗZ361ln(3#>*d`sIF .=III( 4(֢E uмys6l(AQ)*_CnSo֭W5}(GVX:7Ϛ`[f"?̨Ʒ)Q{y5Bl5g,}Ű.4q.1_܌wen?LCx$d#3ldMP;7#sCq}g-JԨ\7 pdzDh#ٓO[R~:wgOW9[̥ %Z+*x%cGRbb"_0`JJti4iii$&&UM h|2_]3,aƫl8``jg<9)?MƂ=/ f8.AԤLړ^MJg_'7ècW&?#w8۠o5H6Ne].r!uwsSϷ\>U@Xx,d#R?=6w R9_Zʩ=^o-U?㬋pF[&nww4LNԴ͔J~g.lAd#}))) Vŋ1L 0Be9 ...DFFr…*|2& m۶a2pBe7Mg*6OLۓ-9i'U= KYQ< 7«_`yJ̾lS6\LG>D< Tm^1BY?< OΒ}3/m1}G~>jLOy9LўZ>xԦǸ圹q&#\ <=|iGH2vW%'G2y"^ ?7*:ZPg$ʳY;!, WwqbUͰiXQG׷Fye-8\(na2}gV͛mu,tԞñ;I!v}2×ۼn42~b(jX[[cm!}׏G:6|U c|} 1XΏI!,|g7G&taE]G&)L$|0]ʎGFaƛ9/,&ɢ.K1v_|Յ: 3x/kESAYЌ ΅aLzy}.6ήikRhO3yMIUOT:sW,K2v&!DO?[nвe wzz:Zbٲetڕݻ3h [ O6]ҥKtºu5j6664q6՚^,?Bgp`6"69mnlL/>퇋t8{|F? .C֕~|6\=_tr.9+9cDڟXBG7c7 f>ǚ \:.dČ(s>G\BԥX=ͦ貪!Xx` }QZ_ٳwr1P[9L){8y0AꅐMT$śZʌne'%ZKklwȃ$[_+n}o qӧ^^Q6 j>2}(/{}o2$fo͛ߩ[N9ɍ㏙;p{bnmv7'tv11Q3|nJ2ҟb% hU/YlT}9'𫹌^bgG)0dqp4Yx6_%}!io΀n/s8R`Ë{2psSfx*qƭl\ 9kO'bU6HfOx$8nU~KҷѠBn,NEDO:$l{?c9qFѿݬpM,k>KL sgo\oJ.6=N ~sCbK3A1 ^KZҪFUOT ;RcG?]Z'ޞ۷^/`Ν5Tk֬nݺ̙3즉LWvR91`xClc#עs4cfuqvB{ג/? /xbKl3Sdis`KX=\H̥#<2[N>Ù6% |-9BAU@{2/J='5Vj#ί=bֳ.>_hƚ2,j0X{>s#wEGxSS/'}̲J1KIBg]ǔnSY$3?kdԞxOfTL68(ٴd+w\Sɶ{lq3ȎdaxkfĹ_uM%Lmu͓͂9siY7eAwf9GTgh_cspQ34S ۏbBSw(p]dQqh;#vk~f5n~>¾h3x;Qy͸l)e՟gϙ,j<M0lb#O nCP)u#W\a_0K{KZdp2n]a[9匍 n [9؊FNzWA-¯,Rq=MyڋV-j$!uso-0/o?Kee! %P0{?EW2VV~tX#WCmcПwYrczTzU|Y%D尸xdq_rrrBղzjƌSV9ZF!''ɢRTJeGvv?ʻ56I  uP{{qN ;7 %5tLVTo k/q)NqgƆ /ۖ;ŗ[i?~J6V-v"9`ㄍŭX;b m\ ~ٰ4(bNEomI?uQloX-'u/ 7X}}}yTo>xwk,"\7RtBj4ζy[J`ҙCƔ(nܨߢ6ӿ IH ;n7gM(t aϗ4ievuI!<޹M 6rhkxOfD/c҉ 4LTY\W]g<,R:'\Ļ~o\8ADHws5Gn-XZ_O#1G;eH8Z5\X}ڐߐAH݀pơ-/揔|;\R\@\ՠ:amqؗ|C9w3i:Gp+K *@9 rzѧtMʮupCPSyu.ƻ[7s?~Drs]n+wO5K RA)"kC{ܾ~O쇓$9&pTNBzɾ@).ٶepL ޾,u~=Ś~ؔaTm!6HOFҎo<s'O^NEmjlˋ'kC;ExQC{CYPS 4#P<ֳvj|F݂sI&'`8A%~C(J;z}s/vü?vR"v.8\;P9amJZ=YI(>hՠr pl8)`H#=fʐڣ:vaZʼnTrH5Ghqq&2²HbX:~4o~Բ9?ǭ<;ߙzew)J7Ucr51uoD\*Пѭ:1q9M$-2'3iBGzTplZtSt$ɴn^pT۵Zd=^L#m[vnm hLfT *kyy]_r>v yV:rrrA(-nL|'?(>vS~Z%l9'[c Cn~>ypzw)WR̟/G7qt2cZ.xvʫS4CjCx?RΫX6Cv y-5kXv5 heeL@{&rJ6vN4qk2^X1d7)rtY.E_&R\ ~;t]/_<Р902:@͎+/7NZf֞Mϯǯ{ˆž|6 k@e g0a իAn, m-?;'KQZʕ+/֭[e7GQJڇW mYE۔c;̈́[9\%ؤGv48ZobAk/wztEs5pOq4xfB&OoM/<=h>x*'}÷nkkNZ@wOP>mKVƣ;9?g%J!u]z6)ݨNLc9w52p jQyw)+Ayƺ-O _j?вP%۴U>_-F/s,W@Uå ?ѐQT͢t} W63}q,лv~l^b@ځCeȢvԢyԍ~m|x9̀ay]lqdȌ q1<@SkV$Y1IeWOt|Y&p ='[#Fq {/mPwf߾92y;bӆ0`$^;Q+͐3-h/iO^]I]伋heMW _^7AnD _?>;z#|.?EE_Y8k'.<ޜ͠y㶵X>XwVԉ1aYkCq5jtWP ck^tQsw<<cis藗.:;xKcfe߉?%]B.%1JBB21M<5'"'܋,bZtgзz,~Z>OOSh^>mP6C}_s0; zSغIK`Jθn\-O,)wO+YlzI{}s7*-=_סODO|,OG9+L_΢}: 7T$ IDATj5;AjZ*'33#/3ǘ/Lj&`2akg pssU E:9p4jELL,oX,B ..쉊:FXF\KW%ɣ8Tc]Aѝ,Pf5GJڻ{6=ƴ(뺌 w[^qnϔ?o|~ʝ/fOܿ޸>w|> $FKؐv[جɩmTP*>h۝(B{Mv@Epv_b]GnGqn~xW~s;}|+_r}=q2pA_U86cL[ՆҮKJd2xBW+yI`G!Tr`G!ĽφOm'nv񚛁 N'33f͚l2F#= Bt~B!DŽP"BΊ+X~=Ν1ϯ[&2c$iDDphw˥ѹ'>4{R8 SS`ں-~df iWǬ|Ա dlڜ3N}J>!)RdBO Q6l>>>8::p9^Jv*uB{M;kr|ݱ)֗Aᆜ(~O#)ͱ-UCvƩr#?t~i?hAn}TiW<6i >8SNns/ ysC=l<#oOop};tŧ9{3(:bh|hĚϢ}Wޡ1W2ډV]j`CⱍqP@ڞ~Iԃ˾2aJ7Do9DRI1;9FK1FZyѤ;qS j>-<Ŵԍ v'ZB! n兗>>_;ڒ !JΎO>Znu˗/g:!Ľ vgE4! z3mݐ+1Y5ٻl)[FK'QtK+-qge^x0|0zNj[1F_ yQ.F!iNMDvF.f!/~S!ZG3| 6bw[Y:(fO|ʶgO/?) aOʈV廫:i?eACǢl(lB b~vvDF +n+}TaB5EQj888憻;7^xxxV:BTHΝΈ# eܸq7NvwTF{_:r:_/*riOYu񔤊!5T\ rM5Sr[FMށR+_XQ|٧1 Ѡ~}:yTdh>a[-'ҮRyLl$>)zܨSrj3_owt%}ňpVyk%"X:ʑ_/!A,t]ǕĶq93+hN%sb$39ܰ/cNEomwPja6NhbdB!IÃ>X`ˉ'>>^vwTm@Gzdu2nz<3>pA N$s.zzI.Q\pP?-%`r۷rݡ=ӶGr$(G"y,1*myajGqzXWi7Ґ7Cu-ؿpח1otlw@[_xl[vpG݉\j~5¿W9~&ZGsl#6Nn$ڸMN@ ny+}B!mϞ=̘1y+@y=[W^!bV \m'jIߴLqګk_dW9c$ \JAqVNYb۾&#FG8jSQy5n9wKǀ k[kT*-v֖^=ǫ{ݷC*(~_`코ġQ(Cs^zQnw?w`ԣ&GoS.99 c2k+M!!mpwzzbݡj&= 0m4GgԋM˿1}S'|WLŰth(E/!B!a^>:Pv/_Ώ?W_}+شiSe4Uq(e`GA-yy655xn }wsx^Fq7}q-#U?0eݾ,Z酧gOcVq^T~ |ˤYL|5?LAX4F 7wr"?[tRbui5ԦspH^ǷY䝢!7鑹hy)KH4@~}wG@\(88FTo7lu]z6)8@1Ʒ ^O۫W0Nt'å ?ѐQP f+}8-Y’o-@.B!yAAAlٲ{u2Ȑ!ƿ۵kWBxt%!SR˘MoZ[5Ewfr3&ex/L$>INrؾeOiƯ⩶_[}ߙR3o`lS$|B^QbM f_qӟN6?|ú !L_΢}: w@Vw^"T*EAQP<NGzF:f͛a0 G#Z69YOX{B܇E)B{ Ξc5hDʵxzzvZ펏UWxT<*pl _zUײ2r3vDRx탉s{l!%࣡ƋYnuϒgcL !B!3)]q ,gMcUJmNrۺOI Z7?K >.U}j|#jh&B!>TƝ`B!B!DEB!B!=J;B!B!RB!B!=$[AF4ި讝űƃ7xD[$#B!⾡qã鳜*_ڵ:ى'96!{/j& Q"K!B!}%;jkg]`^ ki+eBvB!BW"npUv pշ[&DIW,!B!)kȼtR%g%֫>)'גMƅ= +;Jj'!B!,>C+ɺQ`Snuεrz=P(*y<&sB!BSpj쟅>=tiZ` )^^Oqo4c5<!ʌvB!BTyY G>=_ߘV0εKH~cKW}TZB8ꋭWr?!ʚvB!BTIF}W#~9^^51[ݱTʉ_nJc_`zVB$G?lp{Į%KS~$D9B!B*Ew- u"`Ss33H='fqa7wM po4pĮN`XٺA QN$#B!J]%wINl1 +;myt;&TSn΍Vn4|-Ս!ЅWH`G!B!D238H"FC?R-ݨ,u5|6NջR7[cWhTI`G!B!JhJ_j׶ly~Fk◿_$]N̪9CǻRtu9!U3$#B!aNpw''ʂkנ^=:||eúupT99> \vJXV*8`07:|^Z`h\\[\នpUOu9 ~x]tK<u4,!$#B!\]Wq 5OOIɓ;n2u`̜9OiAnpiכ+{wR, 0jJe͞ СCe~ 1+h|7*[em>['iR*rg)ǯ\'Sȭȝ !BG4w7\ݮ/DƂFիߜ SB&Siӛ~A6' ]79'047ހ޽A0wZ4[Qa 3d(r˫%Kܲ̒%K[-Lll- kKYl̞:V`ylXՃ-FwϨ){Ni֋}Olv/Bq?R1QZ̜@^n/qdZ BBnN[obsu[oGsOBB1g &SWaC e1K,eܲLQAn+GUC[?F}'*J< L: j-VŎ*g vDr݌vM Q3αN^ĠXaY6ʲDsЦthY '5`L%? j<ɩݐ"ڄBQXi4(Exy?NG B!(Ju3cee~U2 j ǕS…[{Y[gxUg6tBBRKBA,b UOQ,4k BK4Bc6m )׵)3sΜ9;;)4^CU/୷,(THf? <1!Ej֬eAbŊ;gdg{kN/_廽Yf{vaۧɼgrw6F!c2/bQa9w4))ڸ;߹rӃ-wrJsu{h;!*i#Bqټy3GUtڵ#DԷoR IDAT^3e)Kg*`}ƥ!* i#Bqٻ:#СCe]$!DsQf(ׁ+iyADbɔ>~x|q%[lz?8MJ] [u_mTw$;o! >ހZ>nxt+"%:ϔC E̠x%ݿ8[~K,xEsc*D;~)H99rs3cSn9c 3~GQ _xvkA4?÷e\ɓ'پ}; 6d{U7o̙y1\qn4z'/jU0 j`'5l~@KFv,>5їxv4.w"-f]o޵U~o亱T)mxm)~|E:]1CstQp7p?w7Ps_ Sf^jRgVi7)YhmZOK `$짧hZ~nʥ+DuLz1<ܨUfr8Ѳ)>Gڴx~/>[ԭӔao'fТF_Vhpkhθcn oO=/7<}/\ cmaZmJ!fNomCo K7ѴbG/z(~_z,kʃ{xq=F%yoA}4?˨j^œn% kȡ9G5M1F ߰ѝߔ`v5cWM83ggj` |xWQaoovzH%|V5 Ŗ9&W'^aޓ@T'GA ?P1LzAI~nVV=R] >[57wQώfʔ$'a2iшѐw0l\ݎ#.V)TQ]}4SIBRcǮfKiȒZ԰ ]ӣQ%$|J3>~3{j |z_u'?<0XW@H ]ɹhɑ9P72^8\{~!yۃta|L0@^dכ%Qt5ĝU=uF!N4|,aøLefkA{?ϣ(:=ƈVV?fnP$y1ɀ/]ZJq.EbUmœCksjFB Fen'KFIKChl[FҔ+njE}Jթ8bR~O{%=w#0}|iS-U;+l^ջo`]nʡ .w_SB4I'p[?%`k s2G˹%gKS8nXVlMS@VN[bCp:sHTxwCqRϛqmkxVBގo Z(Q矲x$\V*G+ye0_o;?Kfڛf:Oz'_-lO?jyڗDRSS1ktBd$<6+VܒǒmGI-DER&eX3ϖ_$&11I@==#*ZsLԤH~-]f`l* 5՚Z]!O㬵-Vϱ'8kwxX:$K`ȃWu4c_qR4&QQ8h9u gf|Ȅ_It}AT3F疱J2QO jhgQjCE"Sh380o-JˑީIH-ϔm1qB-j eHhX -4t3J[3X&B\29cdLE+} E{|+Y/h}_Ŷv4s޿N_p0٤۫O-Vhy+ }e{sWJAM^A0*TIycuyһQ=Fx< A__Ń%i~珲>u?G/8Ճ<>;3snd7y/P볔彖"l16MjN +")5>N32dHyYMQ(H 7}KvEEk5u#T 5.%O[!J_VArW_OҠ́~ć3eqn"WC=} δˏ:J"&ШCCDkZpkJ#^Q#H>{3$svh& |vI۰ocD-: : kE\nL<\_4OK>Ɏӷkex̚nAM&2xuDǘэGeQ G4.^j@i܉kwߍXcr`?Jd9%_emS%úGK8B? }5#hlB;Uʳ~[tT|%H%?_xf#p?^{ g#cBrr2)l~\d" vmWvXS|] <ߓ~""V{$m&h% +?SwoP58z?kIsn`2wG+/0j`k}o޿%]iT8(:BWv]mxi?Fs,ws{uS1UBdv:[Gl˴^qpmU7zqUKm X4Ƃ`>|ɕE=ZѡSgzO:A@'s3=냟-zX^W_ֿ,ފfRo_ǫe]!D6Jdden1 >}UF,7E|:tgULy=`Gy"@ĮSß_,zn磶NngQ,HRޕ_[6/ٻUr|n43كyN/A>iM޿N0bs룣WW뢢t\.wD7ޤ݋iӠ O̬,+80WxvȈMj=6Jq߿""">|oތ以KeʰBʔϭ QmoIP$/y!Aq)ѡ˶܍Ϯ_xح<_+Tk y }=K@wԯTC1&-l[Ҭ{=#l)emSl\~g {GYr%O}Δty!n݊-" !ʱ[7wnXBcv깙.jS齛0ڥǹPW 6T1]bK/ N0;ޙ+Ha[4bkτ;30c_i~hO0f xv3}(e~tM>b BF9|f-b!DFFYȴMtU.B!ʳh#MeV=Eo3k).B!w  5jbB!H`G<$%%w+߿υBw٦yDBT$B!BQbj֬Y"5[D;B!B!Tӝ;88b4q۷1(NC V) ** V(::P::L.m;EAQ* T~t L P1(*ZZaT@KCI+UMwZӒ`.j^LGżm}22m*Vd\eAV|U;FPv^_Y| X*J,O?ɲ?5*+@3zA(YӐV'iuL(( |^ζ4|d"sYo͛2-%h>+2mS5S^Zfiy8ͥIɲlZQϏNTP2Ӗe+=uD\i%i'J ,e.#ug.@'/HvȴLr}3PA(&gObJ{*C1AgSͯդ\vU5]ׅj"үOLVI&TҮ%L*ΜIK(: !Da#.c=i׮]YG&/jk|q])j2vCZNHhӮKTLF6i7Yd)m;m9 (TTSpIE)ir^{$5f]+.G.B3m6Sk.Dz`OeJFfd?eM+f4Xd?~fWr&e%c*J4P9Yo؄:jWIU53#d:f,Gr9]X%=U}eJe9e|yY9ea22GMvYK,yxٖed.gBu,3y*:EdJfQ_,YY_276HA52]?}̇KR\eiM0$'%u !!ԪUކBdȜ9shҤ M4a…e*G`GoʥK8:U׏doa2ʢ|B!So?PB^_r IDAT;Ba,pde.+ҨzqqڷoO׮]ٲeߧ1Ǝ5 x{HJruB!bLrR"U=HO:Bb %_>m#$ vgy,_^}/tǏ3<<3gٸqc鿀0sd4"BqO3 )_%/ΪB,b,mWE)q|r\`(CB!(cɐ6dB5*XY9 wVy !D R߳Of΄ƍ6n(Qnnsc @ݙO\M;~Nnt)B!R Ft+}%.8bwZ_ +]*`,r^VEK!aĈ\Vk:%`* `mm-AQ.6!k.Pi+Ba)Pl6m}ٺuCU+'w7/[f IIIkv͡ Bݞ=Щ8:ԩklP2;ܶ <C|ifd5=10D_!:$xL)ܶV }!7>ScԠ3O{A*N&K>q;o$!6]SPӭ$8xn!]{◫hQ0!B *Ntؑ~!C0`@~e%+W$0!v'$XWbB27ɤj*͛aߢY )"Xqb4i9N[oio,emͬ5b6;Vfqc_TвeK4iN'w+Z<Ö>Bӷ'mMue\Z1n't[34Gzz):7}M'`z7V1t>j^I{lE LVNLܾNJ ȵ%BCbb"UܪHY|9Ceʕ4 @UUl퉌8/8[ޛ>+WI@V\ɀߙ8qEy !4i\7NbLׯg,3,Hh6`|yF^e4SU\\ӭ[2)#z̟7wȦ֣;oL0¡AD!5tێ^t6θUJQPO]+wŐ֛Ҷf7:e4\wߟƨ\B!%IUU#Ύ6mZMfM˛L˯Zu]FfM};[1l'3⼄ZpƢZhr[Nf?(Ynܸ|St@W>MVx~0W9?%ۖ~=[K!$'sENÓ[\h,T^/PO}1 "fDB 7ڀȡlz,lQKĜ9s8p ,rʌ=c2k֬2)w)jDxx.E@Y>=<ލ 7Q1xoS:B!B!JKzPK:L*Ѿ}ݽ{W S2TW&4рʃƏїQB!BIjղ.B;e) +><.r!B!(Q6i%Ws}D+<,(g2JB$B!P.\ 9mrE.]`4) umDGC%0A {wHM뒓o_7/#Z0(<<=##^˫{m[VRD"!B!8|X :wNKo{Ν`4Zת矇)z>Tue]Z0e {3#…͜ \rQ$#B!" kY{:թ/POgBN:ټ9c̙񿝝KjRgΝڵKcGx-0f ԭ SJQaة7g^iC!BaSup)Df'OK/e~=ԩ+ܞ=徯r.oNKspF`Sc&ׯpeXbV|>Z0H NXDnnYSB!,'yF#ݺS ;x'Nh-hj<;:tKUJJ}L'! g-[ysh0r;QζN %BqrT XwiB{AÆZf/'3Z<xyMw۾re0hd}y(U|6D[l-N!BTDz=66e] !D9׬m`ï },(hAҦZ腫^]˹\~uܛɓd*Z_ k3l6~εkZD*5U{88>Nk״jM\W^Ǽu9@8Zgd,lUв {*4?7.!BQ>j&EQ7 Q~=y϶0ge(fvֶ4ߛ&0pD4q.Uh\C+ױ%c=Y6"F3g>փgv2pz8`C2_OY+)ybRph[=C{h0?pp! rϫBJcaڟ=ކɝzJT0YF!BQlY(%%bRj"|+ZtX`q$xi `1=:UOQ/;Xs_]V8[:$0n xV*wcI.3a>Weehyl]J-,sva[`H[p4X Xi< l=䵐+ǡn5Hrj#m} :-?;&I,x1=Ugo[u? -\*e'voZe4-k,}|=*B!;$ΝSiлud oKW弾7jE^}`9SW]'E3|)7/ox:\kяm \e]6 , 0stx d= UGxs ?_XmC&A+ctz'dM^P}`i޿6/%uoIw@ !á' cPaO'`l'8˞?D8}jwfQ0:͵-WABWߣB!Bq$v^l`HN%)15N/)Uo򨭻 PKEe Mζ<38mĖ2r07H `pp K?x G%0l&VDZGM>`cAxդXE^Ǻk>/f`1sBZP? #k6>q~eNepg~RR Xw7}vʟ2&ςߗjv Sj0(*^&9^Tj5FO`;kϓUر|Uhgǹճ|X|=*B!;jb+^ˮr5ۀI 40}6LYIա7KQ O&X}v, /)&;N[MmL_O<& = vMc,:` AT*T~K6\B7g@ߣjxvy|^kY^_ T1ѯ,L^V_zJ5)B!%;*Wٯb:'?gɸ˓ךACM>dji`09c&gжռ>.;Aܐ)3a* P3Pd|~Nq{x}rn > \P៽la9a_\3|:V+f):*ثpbmY*N[R쬡oM:zmU{8Ě1ק7T[P~Eo J߅oï!{Nw0{_: ?QFɠh= ‘3YZI6/ׁW$ش Œд74Rp] !B!D oV?ƒik0pu <*]3CCSgwqv,'^`_^RYI04t z{`GW&+D \nkgCe8*o?Ws*|꣰,ٗ%e-߷f|k ??[VMZ!o:X\m(WIw0,p첶rPu :tFXu8~B] 8^ ?%Zd?- L<$!B!D+M$D'p3*%}t [GY8*Ήyo|x*C[7ť&_~㓙ۙ5G FF`Xe=#W1P* Dߌ'2X~3ezܴg7qw믳KXerc]}NNT)vCqsgn<#z"7kB:órMyz6e Oи 1ѹnvX^} /%8)Bq :yPqtp$8f|ZXvUyc LPiZMeG_)m喹7B!B!DQM,LiS]xa.B!B!D;BQDf2H7,!B!( !B!BTPE$Q+?V Ί,ΡIJ.B!B!D;\Z7kO#z>JRԸt. 1jG,B!Bq*2Uz9#uq !'V7S9kkEܕm=zwVy$ۢ1VXK4!B!BTw.r>|55]ٜNmg,&nl©Sv$m@HJ23+xsm<ݫR>?:(Vi<` 5G!B! 옢%ĉZqx<wo'og WIw)rT]+漏 m#9I~SB&p`]'3] B!BQX`xqh2s]쀝2{T S _:3[ Ԕ-"P @_X{5x[v}yk|̉4i,W:/$B!BQX`Ggk[Xw&_1a7큇ULLM [F0D_&ι6 Zqʼ/-n2B!B!*;ӰrmD3L&bPf^iUj~0*!#a .m*vGvsu֛H є5"tB!BQA``'3f2Hou8`/%aJ̦Orܭ;};'Nra:qj'[w0S{Da`}?GHQ F!B!B(N !VIDATXĢ_C4z'<䶾x捓2w,w+U==L{TqJgkժퟬNk[gR'iӦ#]͎\ݾB!B!"mfZP?]zmjuy["NOՋ 2,[|n_xP;8N FSE@mQѪxUUQ`U^g=ZoU+X"S* r%$f136 |< ~;FS>*yC:i%G{""""""""1?G~z'}(%vDDDDDDDDR;"""""""")JĎHRbGDDDDDDD$E)#"""""""IQJ숈(%vDDDDDDDDR;"""""""")JĎHRbGDDDDDDD$E)#"""""""IQJ숈'vVse0)ϴ] س p:L`NXV 000%AO=̼ ӡ;#"""""0 N,^|hg M~=%um hHTk)ߦc٥27m#w,/Ioם_>.ɫO9ɸ_ oipL/8O>TOKCŗuJ\MT}bhsYGo's39z .w_8-,pUY܍3.r)_׿~m8]縿2b؝vX-:ʨ3M~.7HSv:ՕN=1""""""?B{;m0`$>;IQj@v;8sen2w5}q!^88.0リwG@f^pN*ΟKI0zvmo{>?codž> =\W[i$ ߨhe{ WIx<F ^Bߚp Wqq1r {;axq,7|4`5£oa rtp^};mõAHX\ ̽Jqg!p Oa ah$mv P 0m ,KSa\2. CCCj.uLi#';`Y6`ki Wa'pąp$7{p9=K?u@ӠOϨESt8tX AdII- 2#nN?t< znf֣OwD3ݵ;Ymydp1mMf շMkxv^0FiS'k OO AÏVfOaG&m`V&, wԇ/9g臡6হ+0~jyp:~̂_a a[93|"u"5L˜'@ 0c"ʪ{EQ:>B@i /E܍J #s{݇M8ȁ)8Aç3'=SRp1' pn8 < մYUjl47| theQCm3}3nR 3lxi^-+#"""""k'vm~?gZVoxgy\l/b[.xuY_qX7nw|_́{딝<轟kn hrX}]/&ںy͎Mav دt8R8.u,|( AUu+s/8(X8V́Aq-}1eŋ_O*a̝Юk&Hp:֭I-qq`20@BmsH[Cm+wY7 ֕^eQ'YV{h1D2S8Վkt>ۖC^U([.oZ>oYDDDDDqQ8jJF͹Ǟ+}#5׾}+xqJϕofg,l;/:T^ݮ 3糉\:fѺp/0h$X7Ft~]`= Z['Lpa=_ Eou?xbdk͝p懵LKvÿ#_yb8i-D,Qcf&f}|Q k{)7׮nv)~)pYS8n- '/ȣpd|yAp_'5,ip\|#\}ؔ.:>ni ر)^̖mY4mA| Y_B'ىosyhz à^yl~f 쁴yϿ?gV&zwb-"gs(ψ}t9W_!W,eΝolI h[~0}hXM pauOv}~~mPQ-xkMh}ӣjwOppplj. .|>^ C{^ˇ`jS74;f 7 |ˀ=u{]mjz̞ ·pSKd3Q{a[w Zڍksa`STx;*;Tq+"""""")lݺټiS i OnXq#Z$kʎ0zi/j}Edt9-~"F 2'-tȏ߮id(9,DD9W_[СM}7-g(ܱxnS.aU{zZۇ2H2 uѹsgrsrYx!={0?jz7jm/:&gwNzWRG`{>1RIIYOegУ;;!"'y{!"""""[rGه(#"""""""IQJ숈(%vDDDDDDDDR;"""""""")JĎHRbGDDDDDDD$E)#"""""""IQJ숈(%vDDDDDDDDR;"""""""")JĎHRbGDDDDDDD$E)#"""""""IQI;썾H#P333m{$"""mtd+.-%}P,cs""""opi)MԻf͚QRR¢`Y:!\DDdwٶMqq1͚5KnNfFa""""o(F$#=iXX,1툈+Z^NNNI׭4(lݲ^YF([犈Hjزu yyW/nۺ":]\DDD&==ݝs֭͛6 B B,_&Mo88ώȏ1t҅%T~,^\c DQ.iƘ;vХKJsV+'vsrpl 6P.a6Ʋp,c;Y` c7kXzo0/01nRX%9~u1Z`al/p:nێo 'Xp{m82+88& 0/#__o^H\/~8&OQ$t<'Ֆw(64 sN+6v[qhrxK&vdLb1Ƕ%,E.9b瑉Ou9bylK@[nc~[X +{*-,(> &^˂mwz~s?Lz>;')ƉHB9űЉD^Mۋ[;ϟ8۔bX{Ͷcs[?.p}77e4rshݦ-().&99Q͛7QR\-w!`c;XiX|?6,BC0̏Xx,w|{oYOq!0cC["519ϏAoN!y_cM*~VFƟO1H m8!`Ͻm|O)9`66Y7o`' xex +=y$۱m7fHOO#+;V[cYV@F{:1V,Yܱ==+8I 'vP&q:M-^َ8Nm-'{$l1fWT|'xabpZUX/VIJ_e,('LM2*w3_W TU9?`{&gWy0HUjv'gġRUǩO|o;[ezT?z NL<\EP9xXdj֋ewBYK8T*|80ٶYdb`+޾|dpl`c߄>xg\[ځuzVl,&\3u*" ";; ~l% ǃ~ؕc@?'}?!֋x0 D<WJhBUaݪc`lH<=WC3S) sU*&0.S"OT[X|B1ϊ=yrC`Xi 4&1|)-VZWHHr%04=RDDDDDDD$E)#"""""""IQJ숈(%vDDDDDDD4nY=qj%"""""""!qW];'b] ϐ8ӗO[Byi<=]ƪ{_hJ d鶗W26~&Ͻ>^0ݶ'ǟ}C/=v5="#-P z |'v'slmw)#""""""Y8㼽ܟ؎:Q]l(yw]я^תe{DžzͭS73-.yr4o.f(7oԇә1yOreǼ7a ~͏wY  n׽c/ed/mӡdj@)2mRM=:$gYZaoTUqQ>!&ʍ~c7=ܢ}/n; d_@d2EP} #!9!;® P;8~5iV%WհZaм T{r6Cf~ͶR꘸2 8JN?4gC"c:ɶmңQ#""""""/Koڎcnt7eoevSFݳj48eu:|})vd3Gʒ8uxbEm%vDDDDDDD(\M1бť,9 KTikZ"> poppler"> Qt"> ]> The &ktikz; Handbook Glad Deschrijver
glad.deschrijver@gmail.com
2010 Glad Deschrijver &FDLNotice; 2010-07-15 0.1 &ktikz; is program for &kde; for creating TikZ (from the LaTeX pgf package) diagrams. KDE KTikZ Editor PGF LaTeX
Introduction &ktikz; is a TikZ/PGF code editor for &kde; which allows to preview the code real-time while editing. The editor features syntax highlighting of the TikZ/PGF code, the TikZ/PGF commands can be inserted from a menu or a dock widget, the style of the preview can be changed by setting a template. Please report any problems or feature requests to the &ktikz; author via the bug report dialog. This is accessible from the HelpReport Bug... menu of the application. &ktikz-interface; &ktikz-usage; &ktikz-commands; &ktikz-configuration; Credits and License &ktikz; Program copyright 2007-2010 Florian Hackenberger florian@hackenberger.at Program copyright 2007-2010 Glad Deschrijver glad.deschrijver@gmail.com Documentation copyright 2010 Glad Deschrijver glad.deschrijver@gmail.com &underFDL; &underGPL; Installation How to obtain &ktikz; &ktikz; can be found at the official homepage. &ktikz; is also available at http://www.kde-apps.org. Requirements In order to successfully use &ktikz; you need to at least to have kdebase and kdelibs from &kde; 4.3, and &poppler; 0.6 installed. Compilation and Installation In order to compile &ktikz; it is necessary to install the development packages for &qt; 4.4, kdebase and kdelibs from &kde; 4.3, &poppler; 0.6 and &gcc;. For detailed information on how to compile and install &ktikz;, see the INSTALL file that is provided with the source. Since &kde; uses cmake you should have no trouble compiling &ktikz;. Should you run into problems please report them via email to the developers. &documentation.index;
ktikz/doc/configuration-general.png0000660000175000017500000021532311455414613022115 0ustar fhackenbergerfhackenbergerPNG  IHDRN1-7sRGBbKGDQ:>6E pHYs& StIME8' IDATxw|ݽ.dYŶlc1`JkBB1$B@RHBKC :.T"ɲ۝nJ'ϗ!K7Ͼ"t00 IJ\ữYopjWJ6[D6^݆jm}c߆ݾ)UUQUp8jp@T6 5U>rd$Zo?ojkD1 WJmvMK3` 3,4)^HL,g !MOv&M& /ύb'CkKKg)"栀z*IRڎېt;ԛDj+Um,feD?v[*ڀO)[iG*Rb+O1zGMB>@w8y=m=zP(i ~0l|;vOvjT8zX,¡`˅bW~Nw@V"m|'A0 2S < <=(D1 J @ΐLG:LB_&{xjK8lh p9rr"~5hS8zlh pP0"' Nnn;v0 </ᰎP(ܧֶ6jC!TUŦ(vNggҥ|W8) 1~x&LHEQBDeEl HP",~3~jcrIZ*g0 Cb h琒ܨdsB l 9hJV<`GWvKSjjj7~̙.;.؇9s%5h%'[/9{.W. ~3wg%ެp{ ^ԙD}ʚ,ףlE`Dq4Iȡ%@t)%tL YBP02W_?c?yWNg-Ѐa;vF}MߏE:l p /EgGy+Wpɡ⢢~_psU* 8}D܇p, 7orpx:vG-]ijjb.L%ΘR֭]KaaaWR[Tѩ}&ν5jB96.{疜I)! Q6_C7P.7 iP/NNHhXx)2 XTDx|. =c=uV<ye  c&QSգkE{ :b:{^C:^Qe]& > }W_s5>z<k46ˮvھ_pyCa.B}{9|!¡SZZʚ5kYPЯ=^/_o<˕%8]d{7?c̩4 χx>777. _oЊ:3%M.{ Рm=˷8Ѐi :b N-Z@ ./]}6l[nݼt1aMޖbߗXc;Y4\/o{qNz/.Nܕ5ƕ+[ߪ\ătFHߍzK-7v O¸3o_=9y;ܾG/-<řA3ǃ }Y'J`Oq/'T)%Pfl( ݒDLT6iQE+}J";#63eNWQj(_U7_OQ꬀?m 九l(,J}c3Ͼ&kMt+&ߝ〇a0a|}@A}ہNFߺ0:]finjYnrQZE<@? Ʒn_>hX?| }8rJc~l ?-O=TjQ0?֋^q8l{D=:KEkO ,JCCS~5Er1?K{w =Ng?;]śҗk+#U>M x=x<<^?tD 3/\n۞bW2oQֶ/q0/{OLeW\ʛ 06QbM `߼X3 g\'SyIώ& &r\fs8&e3P/&ӆл=z8DPGiׯBQ/?g_}5xڸq뭷b+7tSl/ο^!0kl777t9zBV\2`M=l铘dXURĔ%RCS[b{ֳ.-}RU&.WF0j%^Q(J9zz"i9L3u?DPؠeǧǓ9Pڣ|3~]-C./e3/'3"8?\Z\vwz_={-=n]wQ_{Rw%g.O_ン?;!pۥyt@e̦:2Qx泹&]39Bt\+x].;w.a'^8A*"%-  1}] [Wb95^P1XJ#D %e70dq]˯?p>v-1jf[ߏip9PQQc?*ڎʧ~mf5bM)j9}m -)1QX<8l Ͼ ` i6ƆFTMNUU}BdP׀}!!( Kp^jYW13Db3F ޕb>fQώ0t棹2Ձ!'Ц}>M5x= _ۅcmU+5/6OF"Q^ZǮ Cgu02ǃ0|# 'm>Sm=)ꫩ}|W̧P5<Ӯ}@>H&At#W~k8< v1DOb^m4X<9Cpm6k;6}N%tF߇%;ŗDNlR tN%;uAïN2jt=ӯ7b;j4a{Baȣ{w>anjZkiW30VYaUL2/[4<5^z%^`6_,]F=RBhw>7]'Ѻo˽/c[ mjj-=\jtDaUܥőRlaV턦Hnk @@@#c_su|{~ w /9w Ǹq``csɧ7/=[?L-,{=:}VHBSn)Dx˚H0N 4ug)RdNfNѡ"?DRY0D2ez=Z_]~z~_]d)\TUT>>;ximn^v⁊-[زG[*KX'/ref੧fI=$ç+b74FRa"B06Ị`t{i2jh6nȸczrf:ƍKQa@ξ\uq|}+ԬySv/f"N.gj/* Px"W4O5gptǼҼߟ{,d/c߉V^r7ĸ"й)>xbw,vo5oG4`t1y~?;TkC]'[w޶gy>9[#:^ͩyQiv#wbw1"K@ww DRMh/ cLf#U8cHfPI&'Jb뤣cJAuJO)~o ܃/O߃ю6}tΜ_ؓ N޶yOpOcԵU\reTbr>RO:7Fe`WT6oi> ظqcg*ugm2(DbEv Ŋ%- TޓDsv?S6!Q~Xe%aw-TQ&N'G_ݼ_mnjtƬn۴nldQ8vmvnMM@oh:jkkYn 2a[ijl/n,)s l߾JV\ɜ9s())FU#s;Yl93f`3&)'v^z(( gN~'{zPGcSBŒÈNTB6 -4܂]fwᲩA8` NxF􈎉HE^#c(&#&ԓL}qE9XiGRIAxIѣC14(x}۷SQQ+g}/-g̙]~5,No]Q+e˙7..U^ݓ=k,[3f0΄mW+68麎ah/) pjjjhmmsбcv)))!///7"wS-SgpK4{4Zr߯hDcϫ_柧BJZޣ/|$M4HdD:M( ,ԟ_mii ߏᠴw^^įq[[ڶg;77aݛUU"KKh}>).6e8Oǫꡁ@׋ancXn]˕a@#+ձe%]@e DSԙj0K[i1SKFZW)|l?QLRzU]Q5-W۟K:r:?me S NTǎE.79:m9zߋY(QaQRIZ"L6 (S'i@Ż Rh\ۚLQ֒J@lmW Kǜ;mDLgdf-Ecj6)ZKqg(OXSr>p 4zZά~ (鞔]3^)z]K:yTۦ,% 3I 9gOtkJ,JmhD(Voް)'CGB(}NsJ/yJ =V ݢni_ ڿ/^E>财vW6YmGڛ}s{:}]=%Dw񵯝$ uHJ6? 8)Btniw@t#ݎgS{^|wZq))dS {*t7::UǣαEt&iS ]mé)({U_E~CB]Q"ۮvΔn~݆?ȸXG^_}zѭJۏսnt;qDoi︾Re-k~C\)E9al)};Sz;@6:}t-~^Mə]+nmُ=뻾J}J‹IJ@ (Nu`Jc2I_DW?6}oE骩TUR}1=}oEqFgwG/7}, }'۽ :cU*GP{_=Q=!D[aY m6%. nIڋk܈׶JG1?*d~ۘ&Xi̯O'sgЩ*9!V11 sMd;H1 s WdݻSLH&R{ij>F}4YDc#F:0/PJ*╌͡]J0})"5QtGEj3Up% QHill6OZZZo(,*"777;;!]e~k[uu̚5ġ *{J5}oyΕMR7yQC0 jVa@IRڔ|i͌/+c߹p5_PG*d,5 )aeff͞H&{ GD7Ĥ#% p^zp{g,L!a'M9r$~P0sgOfUefB![wj8j\!mmm Lł$>٤ia$R- N8!/٘,^1HA'r88N\S֦NF- Jx덜4-˕)R5Eʜ^6D}R*ѥ DT9KO RzaH J: 4@HlU 6MS}UTqB,@IXth%]ddii%*t;ߌ>d`#AiSG_g%%Wo@ R x+jjL2d=r:L0$ Jd98 @ "*3`5X$[_`>7* `yơL:LHi!IA0ƨJ-C~nk{$ E(OjBD(D]vG1,0]8;_uoyT者qp/Nf\t*}O"QJ*-R2y]ACz"%PmHLewH!lVa p:v0@mUL;O8KkyinN.¸,B p;v0atfu(:shW:PZ~݀Co(gQSËOnz@{-ө}:~|+ MH|T1qO}ű]ͯOޕ\|o;O{{1ll6`~?p(Qͱ]ůO٭Ρxdޯü%<&?v%~ZNm[d +W^yU\qmSٗ+ғL BEѭ EC $ s#& UUU%;,8eʼn Y,E)XYYII #zΩa e>nثgZdTg)ڶr!'r <2*xN$8c9Lw7;=Iv:'ҽI.F[ز`?䄲\[>׾ś/D5tB\H1_4\ bx:8jR# lcG?=}z)D "'#$SUU0[:sz 4%v+87񴗙WoCp皛~yF?aɿ^_0[&_rw3&>? <ŷ| azor@x`@p!c6kJ{Mkf"-ER,C>_Y Cup4T)oA4|&l,']7Rbiҥ̞= gqGUS>>i&1F-k*0 s83^Y¿ o>绑?i;'puFzsGׯ֡q=qF %߇cΖ-]7ذa2z}d8eOrx؈rvOZ1țyn9yot>_mS\lݺɓ'1S?2AJT3Y"''}{1˞O\wn5ބڴiF2 MwٱUCNR $|I'5ΉeYz5qҚqҒ C '!_5G}t\L 0Dڞc#M:|7RCEO?4wq))"tRf͚3('rg %II }׸nJKKou}5aN@ z6GFQ`!,#z_ Z4)@ESQỲx]nV!Bz􂩐[J (|NJJJJJJS%ZNt$%%%%%508$߸"qEzaMBdt2 N)sY2U'518e+WbC)))))) 8%/|mOy2N(Wa.m+%ͭ;ng魄 4FuAk9ނe[Pm!EMRRRRRRx. hLphZ= %Z\n%W5\;#UAyg ք  \ h@N\vk7bQnl R)'@u᰼¤25 (J ,5,rMFlj|Js8"B-aذ(>nGQXRȝ?AZ SGt@hZ[m.8moUZLb7_5l} $e(]ا59<']xژ:m:`FyKIIIIeL &~:ܹhj/?.]SŢF?ޯvFKʛyem?OURwpNR@Txߺ@$2 Z:_B v 3og˺ޭ.mArJKF& y,%%%%Q|^P%???u( %a唕57affwՖV:֊ &Odj;]پc{7-aΔʸTU%םW_}ɘѣSurST]-SOA0 Nبnv_x$G9PP0\wn!63vߞN.{1-_3Yɩ:)))ɝgUo#lQf |m_;nW -dZ|NAYe~})[Z0ѴVDʢ$DŬ9]'%%)փngر\h"N()zYFgd\.>(\?2J.O𛛖ggble>;(V9{Wdy彾I^p8GEAUUV+.P(ī7n7|?|hO5{l{B&K #u;{> Bͥ8WAX۔9qK8v+P 4w8Dv_ )FboȻGM9S&<ɝxiם:uW8j&b/NRi`!s(@uu5UUUTVVR__O0DQv;ÁfCQrssjruIک N=s&.6ι~z'3gbމz&ڧkN q 9p-0qBlSYtPޓ+bHARRR) %a唕1yʔ$C(MX,h(~n.R֮]˕W^Iyy9Gqeee!P oHEE&M2U>uV^ÐݑQ\99,_2,e%wZ|>a`iZPPUG a`,A^^o| tI+uږ#1Q* pp8 B ixAQ),*fwe{q C1|ϟBB֘1c0N6z8L0rֆ4Uj?Ӂբ/PYYASS3`?򬒒Ex IDAT4R(*P66+64MCxA^o6lڴ>?`@fy %%%%53 N;!-Z"bQ۟ lv[uiimjRm۶wI^ߏfɕ¥$8 _٬VJ0%@ B@AN w~# (߸^/TWWsײQ_WK^^~,RRRRRR4M#cOdfCqRQ:,XQG/d În RRRRRR:v;`ӅpNc> 999<{f^pѯ]:]t8hp8RRRRR:@,EhBkK >?nh8[{B]]]vG@0 Cq8u RRRRRR򨪪BQBa7cGUrs\6~wx< `fѢEAta0 V+3+N(2j| Ku!@ʔۗ P:_xb^uhmm/6TU휎 4Mg A h_ϽadLK4NMUoo|938#zhZ, 0 "&O)S hkk5fl6[Oۍ"UJJJJ*)D۱֒f#D^%˯dGu5SVVW\EP0롾Mhjiij=ꒊFQq1PP00O0$ 1O[L))))) NPqχ(JMhcŦM8sp\lڼʪ/kF: K0CinnQTdj#F   YP@K[kd~\.xWp3E vf_\n[a0ے̹Ǭc~N?=gb,/4hc=ҌZܲӎ89cN8m؜yX4|͂բaZPUUA(d`hȳBPR+!h ޛ:}R#+v, ( [߬JpzN0vsX[>sla{m3X\?q22iS&2q( rȱl,餡AaFĒu~;r/<T_,?=^ZW޸_oX ;>j lTR)#zE.VlPD,={(*> #E ]@z!lcВl܏rιwΜeS{q ]"e_,c} ,H ,-з8ͽw^;.OC쉱b?1cy+^ZٻwL m4ӗn`?Y54KA|\fk>D߷c꯸|S~s?=߂5<ǯYZZO]Ŧ6|Hc"_oٴz,bi09&2F$}\[B1~[3SF~M_EBp 9N=34DEEruE1vɛRz,dAQ^=ڵI}R ֈFl$Vr:Ul FRS9pPzo"O$'䴉 JӽMiʽy$3эhsZ d{#^]M¸Q- 7:V|9W U 0יd-"DF4Ձ"ZIL;&s&k\(T`Af{n]*JXm5,UG題OsuYz*Ma=**#ӔS0TAc]7qkAuLNW `V ZrEe<(u1N$NY>vB-dIjȁi f~"770 jՊu NHxgn4AV|{fs: m+~"M6 j~ pa/U[p:<:kѵyPyﵵ첓m6RS.6)r{sU},'JOpG*7|5nTmuzu6de-jOXQA/lEםM^/lIs"Gsud",D$ Y! BPVT~:5)m3'qŃل5MSvk8Ly& e &&μ?{ٞM4o%W@S=*l Q;.D"_&jd]: Nтh怒|\.>GXXM4!44T8J iU8TXkd[-0&mgmXZ+lyIOIs+)$h?mL Թ|6Vu>b3>b0I.=>{kNhpхFBЇ\Y$&=8; e &TM2d$s|!zFԢ3SO_RiPU]Vԏ`$Aū -UxNr|>yyywvIJJ v4iBRR:tI&;MbE*{|+NǪ]G)xsSXߙE:~47A1:Wy4|GW2X]Cj!QhS}Z"6oVf;D~K}Fޜ[}84n3;uԣ?3(*)>|%`(#lf[t;7Z:K4O>c4 V$O|kcJY Xot||r.WA6aCA:'A`e &TM-eH !6DhJ&zgd7lݬYl5NLe{עMBAwn%n Jl5yqZB>s& Áiő$F` <[c0٨7tO<'Ԕ;?/quhqգP{Bu"U6I&HLz-VXDxuEe\?c{o;]<~`x:5x9\_,:m^a|ϧi-hΧL?>M/ؔojxxF_ɇ1ث5M(6RufnƝSG3xN1$vjK5?'ߓq/AS~> eAd]̥لJ= ֣LK W3iNXiV7n>W `O&Lr4N)'O/( Y6)0Xq-$Z=uiKwOpelҋV>Mv4ltъ5;;V+DTGRc]R^r9p ;%~ڷo#qFQ9Ym]:u~@pc#I69ڵ*>.8TVjժUX1( ))Q:^o31߿E+ #'y} Z,ڵjLf|>o7MnvI $jU6oB$GQB ce4j؈Z }޽{ٵ{7qqp8 b!.6I؛Ukv;qbX0@  s$ZEҋ/v}y95Ʒ! 6>.?dY&,< DHܞsv,xM'8U*<ٱ7S5߱iZʵJf4ɉ^a>В7A`0 ;$aZX,Y'Ip@ sNH] )\S!A(cM+xseoިjLUpp@pQ%VC~Z˖tf3y.uN[xCKe9s[(b05<>mbgjFG#RMi(b7>SJ`/sKZ$_na@ \Tӑ/n {BWb';ZO?1=J&GjrKKHõchlbDb{ z>MN/FY` ?qYߞ}N(Zu@8N^A"&WtE=/77Rc0MPk#42Ld/ɗi,˨8ȸ|-Wo?vD[eK >@  UUݸ_H"#3L_<ذ2͢Hlb3"*cՂF2 ֨qj:r|'o͠UiRI3YyڳtaJhDǻ;0n_-,;mzǯt%?RN\ .I0ka~%.F@"u)֌:02 3 ׎yZ [HPiu%l.QbdRP'.8`o9>tm.Q]IlՊWManw`w`X$jEbL,AџzBYW>@Ϟ5|tHz&"1 W=䜒֮(`'2U{\j Rk= =eCbskii ?܉2)0G^bS2sRRnxen$ïKQ0o+v),[:=y|T7ZI3c=_R;]h*7-o׊y`nsXrP&/#[m]VJffƽ#ٺ>e.o'ƾ;=q )绝a<յXƋû1%WA|u{n\{^=[:?Vӻ?uf܊'7k:~Rm'T228q>/{{3Ha@H>ڟEFU%l-ufGl<<U͚;->¦^Z(\0@́4u.nzX/CKLQ~u_H'iiƿLzkEW~f}܅q#[a0R0ڛRpT峩wt?4GG-,3LaKȷ0%̳,gǯl"2Z l;[_r ?/e70MumxD-yd{65x赾#_GKrS?%'ǟ]v9LnGLy7W>CXx.I e8;)C?uLDƅNceD4XR#\~'Oіk$V#xŠzjوŠgoS9ҕ? y:U* HFBLHM(FPk_笝I]53亓=>E/=*Z'XAu^rp #'O K; xk?WhrjVv 4Z~̱D%L 7#}FMsx]4&źqxp6:9bަi0g # ԈD;1wYM!X}KK感 AB\Lzhm=F+2e(nŝ2RS{HO#ٟozdYч!:!{pJ*#8O,<+s/M<Y0fRm*xG<[өB3iOI9q>z} -RpFu` :/oڨ)Q)+.# '4a0?g^1(`lb%h2V1X 0դMBAwkpayc_7ރ?ْN\}K kØ? 4`ԀsጪW_9P,LvIߕPb*)o9Vo2~^{|ds8QVw e*LS3:'e֥'ݟLn4_&|6C2qɡ`07j2:KyVTl2 :ߺ27:xl!sFvS+ ~ig.fGέ>gSp*\3yi=~ZjdzDg|Wh{A@Tt(Kt&]5:)]SԌ;?CϽ/3}>CX>~/M28֩m`Jl}gnx1~uf괍 U|~-Gw2-'V |oNeK۶pVfɢr,}' 0ڵjMɿSOr靔HbRnŸ2#Q7@Yen5umۗ);ZJ>an]o?L?ЯMz[@ЎʅA iD]yl<6UVZBW\_ڒؙ΂Jje;N/D;?v)Ys3!MzCy̆QK?oۗ#h EIeRvv~,7o{SR@F ob^:s 5:GJze̛:YXr|?mlBų#?1ZEȼ̛s K$Z?Ȼë8L$BBHN^C S^xDxU'8?f TꢏX11ͅ$xn[gc ׾jVN@TpNBh'9:*0E[r0Rsn~&n ɤhXZ}7(D#t*8ȸ {҃wVmr[yU@/BSЩ\Wu@ DD`/9*U+h,ػj,ӈ2&Ԭ&&%8zc;(Y^v{?Xalݬn|/[d38L:蚎XA Kq* -rxǪIX TUwkvnpQ)&ulߜE躎,OKl@ %D͟GbQ:b4P=ʈĐ.*b4dIX\3,rzp: pEdT7HߑKD q#p@ O`e8p !"۵cD/B [q5H`Ze7O&1j44 ?wYxC#:LD@ DcNw/NL&dpL"mDTARNO`cM0 t]GT㫓oϩb 3a($S ?*q C@>FYFWUUaqXB1-j4 Ʉ Z~ȡ2_C6<~ =TRdN4.@ \zTو"H=kTǠf͆[˅Ӊ*~EQptؑk`iqUMf&܅O4PulbPBŎG@ "cF ̚I1gndDةSޫɄȺ~4b8jCP5d^q={G/\OtfVbP$Ed8VbCf F 1b o++ǃTU5.?]/+h aU(?˯84hI#[$x|dY~8UU2xjZM":nFz%ŎSUcJnv;#B$l[K+t~yIٌ 2,-8B/'syȦj"j܆t . %DBzT.z/F&uёDawKV2hM˜FfxtZu' 4Mv:^j5vXe\`ΫMh" N%ZqwJ「PY|uG}$$𺊪+(gᴸrd&/ǃ(X,fӝχx,UEHH(H2^zff _ggrn]ͳڽ@p>YU';Wd6$EYI* ipn,B->2wBuyAu +fЖp-㜻Ću0G4uWQ˳->l;37Hޏ&g]Չ-=~-=-Ea{:n,ftO{-;'Fm6tn}p=<_`RX.2]a8Cװj8Siޫ} *z@LNVMD=xO'G^r:nMR~7q,Jxmr*RuELLlaxHZ̘?G~~xrU*埳|<<#(s-x!z_ <Ȱ\2~##ѦunzGء5Iy)xJѣ'?^mZԺ-=G<ʢ4]CџzB} lTU-ޖ%GBK}'&{ cV>gy9Q݇PGмYh] G2$-&mOp𠰸~ÆZ4.h.67~ <泻&1x3cϹ<Fp<~LH SѴH)#-}H8 *t,-MKPOKO}ۘ6EtxCiɷ3ri 3vxf1jy?EnMX9+Xq-KŃ<";-lty{-_;rw>ocIZmxC/G~n#c 5Mr;i|…ضmeV_I}~q\eY 7۶/q)2,>D7~!ylne.Snwժ5|l _{߲49{=z߉RŴ_ײ~*~a4٤ @<*.?kNop.^ 1;FB9*'ԩ$=UBU$IF81AA11M<~a|tT_ aV3{$,g{oۓ[P?Z.[|m">ӄI_EPV'@ܦ?GX0/ebP.ބS_x݆uk>Cr㮴T/XDG.dQnషן"7I c 2qeSS= Y|wMG-)+l-TFL~`]ze ^}ҹ[m$zˌ8y-dΎh.1kS g뗋9;s.t#-MOސW5@pLwJ;S {Ry044 If/kMpӗczr}ln '`GՍ($#(JW@OYz^t`8eLIM085Hu M.gv@2f.ޕG2P|Z9?EnN|6~ [A SSC8ln[9.ady@QFMqǧv&D6__|^RRE)>G$nVV͎yI> rj. vMl`ud&Jh5b ''X ^IzL%Zַ:H:^ szc%Ft= t)FjЋ`$2,ŝMtj9tf3EQR{R b0Ta<2aڱfT c(."(0v ?>߲`Ftt4u'3"މMoDɒ8Nz4j' # oд4K}z: 4Zþ?/~mAH2:X$@qN-|y/'ͷKz.^fVhLO\} \F^vh` Gg%|nX$ #D/t]gĈ(¦IJJb'CҎ`0(ůOñً3 n1Mݜ--vIx ѥʰeV)zH Ե6V!7LfΚ!ԛ{&cPS,%ĩcZ06Mi50^y iևzG0ss,"6O|!mJtz /b=>L'7f|pL=].x&k^C4Fbtrc^1x%2Vc;f?GOU+ lH|aayD>2:XUrVG3EpB.Z4ϳXwLS jv\KɬR`ko헾\n2wnd15xϖƌ*/<I\3Y"$JNqJI`-Xڀ|4"""رcx<'!5YE1X@fM#?^WsY9k#?: 73v[fb$nKi9濓lq 3NKLWP&J%nhԦGȒ9~v-Ww T6S: Nz1Cyf괍xG C0|4󞕜6 ܔ;})0c[: 7Z>Zu-US͆"a@ gegep䓝)`0r80N V+j˾XxnGtttOӡ|2 MecdD_9kƿϱm ːYԀ[hu6')+#.<5R I}]c3Pp#egg99g@JJ 4E@ב$T Nل7hfDDDOtt4p+qz$ yxdxq5p43Q_|vAԫ[\~RSSб#yyʹ᥈Ƒy72t̝}# I;ơÇh*e4d=¦QfMר.^9_}i 4ao~ÿ؄@ޱ$"H^' DDFPe$dٌn4bꚆbf͚=zLrrrqKڕȺY"܃mEߎå{ҵKQݶGɓ9/8 PvIFh"bcvVZ@`w]4)0 'I Kqbܔ&MiҤ|)RDyu{@ *Gѫ:NA44M#!a0@ 8_I )j6f`0ql6@8NxԮ]Ʉvf4UM&݊@ 8\|mrnELtƭ(kN=\s..ATUtѰeH8x^TUEӴi=8ȲDp:]zt_%UqlQDG [+}PBԌ&͓z*0 ԩӫ;M(p8].>s"O(p8NZ$6x/F!)w<6 IFP@ (/mM+xRB'zȊŌQ"$$dNjj)ZĚ/WeQ2?O_Z@Pjqq+-M3׭1Q| oLK(bFSމwmDLt5\y%Ϝ?x\ܿ)p֞;S3:^[ګZ 9nV2WLŁ\.bbc #MzMLL,.W`T(;fh :MY.\6xǨݻ޻#IImHz5wYE-6^ԍ[OG2_vڨs-K[<9;xcΩ5^zu^ehɫ/+C -.s$\,'ϋ,K違>o ڮ;fof35r9M/O8 2"[b|/#[V8$H;v$; {'$u<ˑ~Y|`7@X22,”s?nS_H~!)1HuR?x4\ŴqꘖM/vV=`8BçeǮ|*ZaT[$6 _*Zs$I Oz@P㤩*.p^!;t]hb'pok6>l 룇1Y}+`\A-L_Hh t=ǧ',,?jI?p^(}g)vylf{cmPPur $]SP2fWJx.q1(Bd ,A N2<ت,vq]'+ G/,+AV@/qous 63$?T7d?_HyM4& ('b::$cR4~{_A-sZ~'^C?>Z3z0b#AB s7IwU1?wwƏ-Y埛bzu+lt|1 =bJZ VG$t] h3M߿ظ /SbG*L<Ի5>hG|b ~<b0UY`paN'vۯ!uiӱ5,7Sxpi e71ſӦr7X?r7!CF2f ulC\IR>:D}U]ӑe霼33N %%.kHÝa/|eכq$?KbQ;ԭ[|%4222iܸ1|< ٻ(㟙즇PҋAz +]A"@"MPދRT X޻H =! %!G H !!;=3;3gΜ>uNrGv_Bo0x] bEW(z􊖶{Lo*GS_$$$Xx+<./b4]z.<i4jn.*w5!INO@@-۶RjUThm ((:őÇ8vʕ' N?ůeE7<%d^UK-׭ox]# |0]&5q_W, ˕CQ=#G !\9&3$π| b\u7.2l۶lRzFtz@5l7B߁P[R( ETrʑdge*'QL;,RHII!==-u:łf# ?Z"m`6[9K@\eW8 EjDq)cl6gr:p:]x5/b21̘ͦ˶'?D^R"m9`"Yn t}Vrz5r{$~QJŢlU0yRNB.b(H( 5OͫiQ2; E2!(SyRq$MAp49 !(TP#]":)aQe:!r]R@K((B$82.!t)Gjti$D1'B! (ɆR$/5W[!TNKq'Q<^QPU+BQ/k%($BztҴ;&ٍ;q% 6NB!D'R$B!I!BB!'!B NB!I;Mx+wE~&=8{?Jh&}N_< _ݯvHFMeBw|-]em?Z7#P`GƕD'%jm̓_(h8㦰`{ /Mfǯ΢$dk,sT Q=IjxlM. B 8+WWk"OLNFyFۗ_زn>XAYV~8mb>]V^tٶc +fı` oKpXвسVǀahND/<'MdG ,۴ftכH[gg۷q'<2lBHpByP`rOex.O=݁p\KhI+(@G}:Vū4^)ߢ;wb}u6jݑz̨ /ok`XKiC 6EG~䗳y򱖔3;yKћѹ9}l/z{n $#År47.;'$>To*C*9>b?RpFj0aOރӝVc|-fzwZ:]tM7c+z;dVhU*U'o^ƨAl:1`h/gB\"Bә=˻:{E|8u'bgR,%]N염vj8_׮a5]!ou$Z8qՇŴq(}UD%˷1O=ߚsbg8ӑJ2k܋,uwaǫHpzq%m7`n/jZ.m~^ufS%2΄bu +LOX^:bβc8oV4_-}gZV#ɟ@+:Eߴ$|ymq`Pd=j8O_-^}/2sTcl7'c~s g!~֢QjZ 2w^y#Bwk^\9Pnddf#WBFQTl6oFDDz}˥:!B’$BQHz{~^MvU/( B|REjB!$8 !BHpB!$B!I!+ԍ49[nMy!B񫸏G8 !B'!BBW= != qB!($qB!D4 ǃ.Z`t("I!.T>it:( e(Û<4 wN~~~~-nrnʗn/ --S_$8 !ʤ4ක5k-(ڢS'8}$"8pj^xx<\NHLLDF{$EQ %""BՉ޿t:'!{5ԦJXV)!Jі km4r\Y=jsD,uԹg332(NVwjޫW&,, ZNb/* NB2IfIaQܽ ̢n4M%"<%=#8]N}x[?pFc4ѩ**EmLy9z>6:&w !JTֶt]:sfXBS!Vw4;s}FBH0Ar:rd] Dl,y3düqβb95~v,5y8].4M#ǭ1gHh`0  eYq&o98].4TFjI`L>{<8|C[` JfѾnBtroG̀^|f>_ ̣_aϕFw_%2ӵLj`ck}y9q( fp!N?}t/4- }Llq:٥8-,Y̞-멤 jj;CDN<Ӕ+W 9Orq NCUQrk mK.!5DIpa豪鱬9q/mOwxt;?~6OxtC/ G:FNi>iF 7/p6O}Masyscj _CBSCo_'!Ŷo1xDDVBeA5ϦG5СcFEiYN/Vt:(JAwje3( e"8_/[!\߶Ppf(:T5p1&:*Ȑw>aD}̚sދ3b0^)tI㦴<{4'N9'fƣߟɝ;E`*ye_#^cUXr2ӈAdjWGN63,_k ʟυwΫIk\M(~C|sIoV>Th۵}qȞU+ٲmx±>Ήa|ǿma9 2}W&1X2lk/W+Vh3|bϛغu-_/?ϾXn }:Qb'i7'6G`YXf?Ŏ*|=YYE,Y=ZG3pF3k[:?l/ӻpM|ù߱54xgf,x dz=p}GGJ8{?{%罀Ľodv"\ƾ#{#L]}3gOa<ΡKx6҇vsvsv|_a>݇a,=șn/S0T)-X?IĤLhKE)gf$kNԳId$qt:Zʳ戉j F7T|L*vv VT֩*VeIb={CЮUK7E*]_K`ҳK^:| ދӗ͛Ӽysy9Wh]:R'ԌFϾ'p\pΓMEV~ 1Ө?=[r98}ϒyztOjA1T>*cL]x=afCh }%ٿ/a_v޲i Jp35Uū6gpFʵvt]('#E-MRu#|vl} mIQޑ@ͯ-cWڦz?5F~*`i= e8K4a hR1WΘv_QgwWb `Fc`ǯGRv̎Ǹ7POScֹlJ'}_FE*&33% 3kH~YBꤊEG [СXlvO```j.N =i 9Q}t=B y_ti/ NE8i!n"NgCU0|[]!#1Q/}3s@6HlAk,-ɔy+:wz:.NV>wןLЕuB 3ܟ]L7CcKIFa 5=sh$~]shF,g=EYίW SN=>荨 xROqEThHPE"c :[t{5" f#j%| ۞I$z^As>}+o'9IG8EH6gz Xj -I$u]&RkNG 1x) IDATgSQ4/F܊FUOtJ2+~[p}qnZUSq1 6g3\ *>* "L4 _m7Z nz.[ kԭ|֝eG0D)"'rB/sNϕ%cNis`J6vU$ڄMrM‡.'!YRS.aزᡁt~:,L%Bթ]̯okӕ8~Яd5'^r63Í&)=tsgysQu>oGn"r`[,=uS`}X0x71}K{3c B75gنrc/|67g'5PͼBL8FuZ*̇<7v(^^pTF x'])nI׃ߢuWMEq2 *zFE/E٨ǠW1 0{mfmуu%S1!ϹOLeF=0dNր4lך }4 Rܹާx0ae8OыJ<'V2pT/z~ON<<Na֙QSkec_dl5>f݄&1ƨE+|<>9}iz-#7Ms) 6xMQ,Wgaы7N?E qؿ-d9wz5fZ|CҬy[ B??Ӝ4Yyy(c^:p6LAWyesԵGL]ۚO/ۍ7[z8Oj#M{zu'd$f$,E|:E#,L͈dD~pRjg<éUl$>!ʑvGFMIKO-gh6n5A?A"Dq8q͞΍in U?ͦMR5 qqq4oނts'Dr.,i(xdb#0(e#llڴnc֭_~  '!Dٕ48 !]J$CŊ UӔ]y|,Y.܇NyAKS6-I&W|o붭R@3&$쨪t-DIl񐜜\&*V(Ď)^U EQ`sT -Cѭ%00 N8App0x>:!؉ԮS*UbZ@(E[6qeѶHj֮M\L Ծg332ǝ ==V*ԼW^MXXX^r*rI~R) NB2IUU#±lRB?wd7jwMS '>5?zI IOp8N}݈xF#:UEUUUE >>ւ)CPP拪{:qK2޼gIzWChެ퇯&MEaYfl?\7fG9qLIU$_e1oƛl7`YV9G@&oPݎb)TprsrH5 {0 vKK@I{2,87\.'޼ګMjD+n< ,ؓ)G`ܒ?CZ2\#_}o~cgGg[_ƴnp_犏O_gi>݋r}L:ee L,Y=[SI9< Xw(x)W\qZ!~]iǓ\<@ӡjPUܚC[ҥK}{Dz~L-OaԠu xGsnlל͚Ѣmw+|OVfGMiڴOs஽xr\^ׁfM)?}ӆѵUSՋqKcr}k5]ZѴiSňY[8Oaf1npzuLDz+oN2ݱq#q ԚբNa|?`هlj jLߞ̏7qWjGURdfTak1K{}"X{F, :K+2xX9_4BHH0"k>ei__KNf"R *7X;etC^ h( o~_I}Ղ?#fWn~օS7?m]{wR,~\5?0 +~c&XYSĺ%㨳mߩ7}k >,afDfɟY<8w?_͛YLjtˈ3oHdؼy5&6 Y-ߞ{ٰj.1CF3_^ŎiXvg| Ulڲ?|Ǣq!B7?[>ȇB{EmbYuwtI&L+4E앜J~wۉxrD ݜ>r ~>3?(9Q&|Ǎk)Ϛ#&55jppRP1}-XL&SA[Z'V(<Chټ}븱tVqcؐULr[ωud{* y+?܈MLTagdތ>'cEo f,]`iL ݓZzHpT[@AChnFg}UԳ6~z#8U5:wn=u{2O\1Q ؋Z>*(Vu'q9~ϦE(r K=J#?0SNqg0NT4+wg̈zc[pDⓍT+vdԄd}2 ނΙHhNey0WA`iP*ʔL,Ϭ#e *5,*ؿn nCc׿?7N{st]%z|Ǘ^^=D9=i 'Oŗ$e7|i|22&~v ZܬSdVE-8WuxRONkL!؝9 (FB}/mdr<͍ü3sGl5;_NIV"W-rF,5X |a]6f;Z:ײ8#_Ł)uv]ܦٌW+z#'bXפ hJTs|n Ո(Vh(X*T'$W_cy7xh2~ ĄyJ5B];w>] ?y1*V4zSYʅcu4 ^Ϙ^u8à{ks6˕Li|>*DTfh@n'L߅WבDjN_8q\\lY κpșt4SiNcRʒ8C\ 6=>T6v7^/s ?[VVU(A9_39?+~`})ҺSϒ? -+D`>9g'%-=38usB5F~o`~Nlcfh7,ʎJ«5)Cy_  !.C xntܹk NVԬvdp^W8nṔ A" QSJ5g@?;9MHqkO[bh*>\+Nf^%W٨`^e0}*fBw^j^<^/zw^$^6QlIU n75xgxs{>mW:X;5C}9CcTzK>Zw?wbݩxDԳ+0߿&H%GcҒGnB1V)}:.^x~r-k\{9J17x7a A)uܮX@w_S7ՇG_-=F/\:M|0f^xM? $^ƭ[`J{t}iNk,b缎 KGpBwY])^}|19K1p{gFC#DR^=F4Sp>jrA}7p`{'d$f$,E| :E#,L͈d E" 4U\INNҒ 8$$TjD1%pEAU@vk}A~]U:!RJ|ybŊiDӮݯ]ϴX>\<-/ӽ54^/ȥ:QӅ>6b[6n)I.g6H:1 !f&CRbfCErx *gbbccTQ"##1l?^UQ?m(%sN(6>tQ+Z6\o繥޼ IOO#QBBaAon?bJ9ѕen23IL5L)!L`h4^s\^ݎ5#N5Q?v nG|5'7NJޭR##dd2JAQ&n_o6 FUs"jLppfӕtR=)8ɿS_B(  8E{dbb2rOԯrѸE'QfT墻RB l`2fpw߭6N(TUūy6Z!hFhxJw rV8ItBQ*G#4[bYuX$4&w !(5ZT͖'QxVBqQtJ08ɥ:QlI˽AB=Q!(Q^g:qe>>t: N$\9NGBʑh|6 ^Xx^222p9R B!J$ %0 N؂"''G C!Dqp\B!JqN44MBQ*Ǡ$5NBQi6<6CB2Dj"L5vy=W!jK!LWu{eLo++S NBQN|;/gIR#ǠrL. !EDшhh2WArhD_OMiҴ=5)yw80[;;viftk Yl}c'dtЉn% `Ε{M?mӤi3Ss.BBYN ׺|&6#ż/$e㻓{9Wa#Y^^kc$V.]gXd uOd33r U+ؼuxq> +M^a-Nh<8w#sWef0[!jBHpB:neSQ2/{egj^fΠ! 7Fѩkj3Hs!?NATD{qJL']:P7Ԍ=FϾ 'pq]N2ǢEof NB\qBBp ŵQ)7t}eҳ`T#A3RـV[~Q ^ ({ G9K&]-c?b:wz:.E\fcyw⁗S@grV-'!_&3`ZK߲7=!dblYO%,WP+Tcݡ"v⩧\ryKtG n1:e[%6?W&*+ESʼYI_O) }vޞ8Y }p!?F:tDXX$n9CcEN8{M/ Kf4mցG}ƎoS5h}{uh6=k5]if4m/F¹2'ysf4mڒ}_ӅXKd͑Mfر3kLÝؕg2wP;{M<$/S?NJqLw ѿVնϙF6_hDz0/X{<lBhիxձdY)*Rxlg~iNp$ ˂M+gy1/ IA;zNoafDf?.sn<76mYeݐ\Ǚ7|$_y{2l޼EzqU-ܲ<f;KYWoЇu統 1q'q/_\[:z!e|2n$8iNG?H(:s1g6kbɗvsþDf/''+-.>>3?(9Q&|Ǎk)Ϛ#&55jHpxݟ6y^Zǰܮ:nMEF>]uJ:j7um*`=8s%ˏ8.QsꆚQPCٻNuP+@ ^jvruמJH1=Mxү"& _0v*L@sz@s!.J_*9_1:cT5^tðe%>K˥Iel]idd qՉ '1s[=^lb oz7Bq16|si'obx95'w/YbVҪW?o4V,ĭRd$*l?HJV*nUA{Eq;-nz{ޤ* Ŏ ԫ` XA*4$BH:sHdg5>~;3 >ߢ-ǎsΘL5zh9U'kz#s.__FN3f|#E=rgfmf}ZM ~HuyX3w6d`;'<\pŇaV8t܃W_/n_G5 %'S5LcכؽqwwA4ߛg7t/{/ny7ױh(I683{qư$EtU'۫JØ;vC5yT+F$l t5Mi}䞡^fQc'p[ovԔ>fN S& J"v`W-Ds sGѵC'ܻC#;2[Ku.ic__?qx,j rLR=C'fOO3 ^cUV7]ڊ,Bnݚ{/ fui^.|$7| 5'ݲ:gfdTx)){Eֲ4GlDzz: ~}F ړ7qm+')PHNNKnXR !D2w֯JgL8~ի[U- Xy"#b )SH9:up‚jn NѡC5J*@VfG0A "}|>YX, NBT3FfLG)B#55HV[6 !D KaaYU}dK'(E! B6s^I"IQ!ڛ̅B8~n^U'U%B!'!B NB!B!$8 !BHpB!$B!A$B*:>[b4b0PEܓΝɄ`@uEwy(x@iԸQ'&#ۜ1 lL NBr;KRR͚$88X "ĿhtGxhڴ|>N'[vػw/e[QfҨIS [ Iqn؛J_>6M "yn/+Ùxz2[dOJ2-Z(z4 \v׸/_NLLLi}ij$Vj .6.<w5ًƱ75jFn^!.|@MKl6cPUTUEQU0h+m40vH"((U=׸Uu*\Ogp+z1iej\yȴ6uʝHW]o ,Iݳe+OiDX0 .M68:λks!fL&FɄhh4b20L 3vK[6iqg/^͘< o;iR]>F&Ɍ.AR}{͊7Ү-] 5K(\9^j!D[v-94/q  ۍ@z[רBSpd00'EQJo7PrH0}3)iKy؉1]XҐKWg <;\'L̽ ;wcǮ_=PttU{s<zgɡLZ!T,b/u|OO}do/I"Nyv HӋQ7[dpK6l⛤i؞ eolܼǬ#!^nd]{A̾z$s7x{S~஀wg$)1՗ltujV&y|^\.5,4h׍MqpRP 8p8lV,Ki_V 8YTTE$m|CZ9\;~jM;eVMP˱v/Ọ|K/bTQm%2|H-gՂ1+>Ε{)QX}k 9,wL2?&:_w&.:N:N:w|ȜL{|$̓ >6ٺzBC~~>|S'E$.Y 48wncx.v؉`5v)}WO_̕.cO0 kHk(gJWO_þiIۨD_\O@98j[:jc+G'Ct,8\9fB#K/cE<Gm s@pL%0Ki8m 1${f5ZoUǓ)>/vB6<>}Po5s>cxϽfVvxXgdbs" l|yo KDPO] YՄ(C|BzA6*^UA2 }-QE[FGΝKo p`&ú܋+4%i.ݠ:^L'{ M~;텮M*aAF 6@_6BXQ%l:v#L|U@`iqTrSouwߢnmԔObwq"!A-AKO'Fw΢g;2i8ɨ^h>`23nO뎩׾sjp ihr?W1yL"6m06;j/WCnGV)-a9CGY᝴  w__:FI>1֩O2a}N<rG߇I,@!jy;Y7U%n q2[1k lB(;n0t$ik:3v31[UNf,ft͏'oREwW332*<=ТekY #[6o"==>Ƞq&ݽw)t*9sX*0aDBBBNBn#^/{ѭ[wrssnCY)3蚆#8fCYgb1OlQ-ۓԇGFFI(Ru|WXX I@||M%g,K}u0S];'dgϞrV@Q0$ƠƭlZ>*HpFU'.ͿXPKBBB=J]DEEc y- !I!%}i܋||G@?saIm]x[g֒~G2Њ"JIBT'O 9O xl- <ՕZ!6rh"^+S^d2 IDATO9''!8wH{ztBW)ǝ w7ֻ.]Eեͣ9sNuu\Ek X{8.vjrN!4꙼:&sɟk^*7;lf^v0jru- $Ū :vk 5^)\` VZǂS^(ǵc]̝ fpIIz(O2XEFJ6.y\v٤ QCB! /}#^@Ý[:ߧ:7|ɉyBerN!BB!DSuBq.4c~:QMI!BB!'!B NB!B!$8 !BHpB!B!*Fn)*.BQ-$-NB!~'!BT9]|xފ(rrrرs' & (".~,h4jܘ`]Gp Gsr8?шX}E9z4mI4mނ`)5htGx%ѬYS~'χI-|.KFFFE!**86+ 7e?0  uo*[~l6)l/+Ùxz2[ 5%-[|by4 \v׸/_NLLLquؿ/GZj!IQTqqv)ύ7pk]W#m2iyyr^lb7- ٌAUQUEUQL`eJ|cvAٿM5{7om+ߵ/͔U6ʂolqJ'gQ@j&ǽ4vd 첎WNq{YWXJ⹋bf)omkT.Q={X\̟F!bڴmj +8.<^;6_ld2a41L/L&L&Co,.`0<.֫MZYqCl:?6E]FwҸ{W"q{0kɳt7qbH?fv w~ϓsgx`JJȄTTP2EsҷdK|Qsƿk{JO=,ZMkWhRG(;<ĵm&QV ]W3;`0j黪(E-OŝnDq@ Nxmt>~ ü1(FL&K5ʿix/ausʱJ+ꠅ!#84$Kޟ6l0ǚ| JgPU]ۓ_y}֮];oK\B<+i'v#9}5])pi8zip2 Ó((9 w$GFEF'9U' ٌll1cT@1llRQ8-Ld辌|vwfLt' q|cҩCg.q/7q|r-[ҽCG:tOc+̹uH]3Bz0[\-X 6ŧ/yht:vDgx`??ϼA];ҡL[wuwHꞹ.Z6^7&Ӯň{4Dߞ̼B~}c#S񍻸7:tHWpk8Iiktxo-~שӈNc^ hw.#5/+߬q{ 62M^MA>-% up"c.d{;qf\'~sѢak<~RϬSCՀZQԿfM+e1S/oC\D8usTpތ8‰E7ޒvWѥqm"#‰L,#NJ;F2kO>ƷQÆyy/+uIt8u62MƘvasZ~ԣ6y+h^QG΍Lkgfb\ܺ;]ǜmEӗMZscWNI۩lt18ϩS.exxGBkM=8s/~+kX3_9fNga <{)|jk߭bOs̒-Vȟ+UF}ݓxl\,]=X&o_ytNjXFN;]E){x6Ni;pWی3TZ^}3wʇ)٬}:ۏ$L<2hV,N2Q|(ck}|ebq~Ŗ]?4չW=!f<;j2.z đvsW’ro&kgɌQV\57|$>A:qf,$-cGܑHw7s.ֽރ Nf_=9ƛY=)?vuߚ}rV]k56(ӣc}cA}6F />(T}VF}K|~_b ,}>6Ye,StYZs^}fM'Zwfew( rYYBvhڴ'@J#Êfbu*m*@#EEUT NB9q;p̼5vad;Sxb]xO}7Y_CVknؙ(%77oZXhͷ"6@Չwvl-wXҔFP#b&Qk8 N&ZNl 3ځ Ûl4i0RcwW,ݘ[,vՖ@F 6Ob#hbA>שt;MUT*FB[F6'snUL;`GG'5!çB:[ D_"1@y?\Tx9u*:}>|9 l#ώ] EPeN׉?<6ÇpQ+*&/{/58u 2'5I`j`r10Xht]t[ q&}Yx^D,q]0fV/׼︎ *(A4 դT`4)cW~~>|S'E$.Y 48wncx.v؉`5v)}WO_̕.cO0 kHk(gJWO_þiIӯelxj­̻.E>2~x|za.>;8j1#6O^` K[, 8\9I'G\P5T3!#Մ)vñ`pzuyd7y7u9Zhn)ghAO]_K,c'jT:vڢhnr9#at8:9Cmz\uBX fSp̱~ Gd&o)2Vfh@\{8Au[\MSs( 69OGЫcCZ!*0Np~׆yi!خfNHR!.{X&6lxt]h4rߛ„Zq':Df 2gi5Dͥgiz=} @`<;Mmܖ9EYCq^(Р8\2S9j$̢` ^<'ŀ;?T~..-b+epBlsׇ/+$̟^m`<{>as>]^hY)dc9Qe۰acȥ `֭?|3o::<ښ@0.ZffREͣxAqtEv@m"L_KQbG/Gzt[_dIv͸q~sW\9qA(=biʍ3kK\ս3]> +>fN S& J"vF?d v5Lz; WT133 wJ=j*onA玢kNw5#gc` ۅa:wNhY5#89 B?WծC.2/>7|CsL51k"wOZ@L0W|Fz뫹0XrQtНC"{g%4 JHbʯeVju'r-hMdd<]o|g3c=<"]қ!YKN敱NDDڥZ0U-vǓLHԩӜ뗵@ڎn^VX̄ĄlUieA_L[UbB ѵNʡCzfFFZl-{Ȗ͛HOO'!!#v4]ОqT ]tҍY)vOugDڣɳ9Ns#: %??^?:=W៏]39sX*0aDBBBNBVJnݺeK.]eGeq4'G蚆#8fCYK"qqq'8RU- {TTddqBL³.zW}9㪲qx2vEtX3-${YL2#SGw/,,иVMDkݍ%8C5k~"RKY8r2xzags\U6=:}ƐRgIMN'UU_T}|>YX,=I5HNNvh͞={}VBQ0$rNtr %""VBzAvv6V8u}ХsfO:%L&\n$$N#Oz`%:(BΑ#IAaja1h0k㧟ҤI3*4ݻپ=pAU} Du]Z+ynaXEa$6lX_mDDFb9z#I!UFUU;fАNW`faX*6 BQ(B@@i[Fu& NB!8&3!wB!$B!I!BB!'!B\U't]zip_$'!"^Gu-rrr8/ BBtҼEK|> fQls@[=K!IQӤ CtKpHA$iyyra%ucǎ$PUG"kF'ˍAsUuns+exˍI+.|Y?{wyzԯ_0_8쫎Ee3݀A=(}#CZ5:8ruzm_QMv괸+`3ެ̞44a6V C'4l؀/V-9ǻƁ=eӷH[/ hذ1/ӊO5SԎ Ъ$^&-NBHpB NZ^:zyKV5?Ŝ7ql#iBn)_pk#xꋵ$ʯs<0Z0 ΄߳" iʛzm.VC_߫ !$8 !iS9[d/s=s+Cz]HΣxsB>ٌ]Ec]^ ek芝жVn (&6Y2\: hwsyjZ3Mء}^7;P׊jC{`߳B IQSy;3Ό$uDtu(C<9/2jnSCuxs ޣG1tZCaEutQ[]Zcd=W0HrB8(h@44M>B4MC+>-u}{k,Ǝn1av?_I=]C7>cEB>Їǵj ǦRht9X'ÚcBS00rNT޲b8s=U/ &!ނJX3O/fayh'.!ϕIq~=vESVøf^xS6g{5'I~{EWsUxTIT^ WTtM; Q#c,{ 5u12΀N}{5'8Kh}_~7Ov17iWNfT0a-i> [dL ƫh?]Q@p˘:'~AA/!N:R5I9t(SȨRRCeNGlDzz: ~}^4233hب1y'CTe4uNnnnqdrb41>R ZN"#*EQ$*qaU +IT0j 99WIDATѸ. `2IIލA5q͈VO D%+hZi ٲ ٺu af_kѢi}˖-hh2tؼy ujGϓeīj՜Ӗ$*ua=(?HA`nK\J͉[m;/k{w2۶m#<< A6B^|A8s 8)Zqpӱ DTd8ےnu=l6""ˆb1n QAWɭ$8K^|駎X&А`w?͆btT%8JcPM.xqFnjX,V (Ji`c!YgNwUUt$"4!?t])z⑪VCĝ\ѩ:]E$zFVe+R[tT!zs"Z$ϪBQ"tTTd0%qMғBjPt3f A8T4M+^P%9 !8J-}9PtyBj@hRUU3#ZNPHk8!JT3NMvMӰX,NB!DM9 g|.44Bm݌J  b!P| F2u>yl6fC!`X}ZG!\#քB!$8 !BHpB!$BQepBsh:hڿ) *E-$'tj[pu Ȭb*']|x^lY71 rm!04:ؕ%#$ QFj; DU,Fů$ݦKϽ}m'׋Oӈ#88DVr!=m/A(7j4ej8@3q;lşP?oxފ4UK4ٶm+AAd!ʵ)G@po4Z觼L̶YwV[=Hn6BԠ T[zxq2_*y_[)vzu @0lv+//lmidžc6EiݽۃkJFyqh&I l|W폿>OmePvm5;m+ҙnv(,f\qح/N ٦WVS|և"vu Aj( yd]:lj5_pU澶R% @y^Z"$6AhP ܄_#^ 7u:sQDለ!*H9p{3!=_܎[q|?0]շ畞yg/Ν/|FnˏH[:wYzԯ׌f;ٷp ﳳ@;+۔[JF ^nz={ ~~7USQޅL=m+:0j"۵%-1ufs#a[Qg@6L9\^]hYգe1jUV1*Si^/U%$}_!/ΓRIp2cBSlXOQ`YxjJ&8{g)cuMzޞyٷho}ȋ,ٰ-~y3~(F1.~2)Pƒׅo\wë|G*əź(8{ڗs@؆AԀ~{!Ye.&1w?ߵijNg6ΫT{4͇``ŵU,& gbop&ѯaBفʛٷ hذ }o|Շ|p 7xזx n6K{uӠY&Is28-i-7=)}o<|=DܢmqƋO,%춷>#qvtq3픗_Ᏻw[,|Rjk~Ǜ?I6cøkPtK${yGQqS'B$@Bl'^@q'((=]Aqۃ%,-'dS_AȄx/mí,M7g0*FA׊ҭ-qu${oNgB-+]o~i{Oqەӵc|QiTESgIE|1ݙ.0 };2=Nj={OA>R~1ּq=Wss̘+?<:N $\ji-lM+`R»TR^-vkfY,f&u1200)Y,t+ͳWRt6M宻C! &]KtxZob}(g*zs>scÁ¢8xukc{mNg/se]_f$"NБ 01w8o}CN٨"+$>25N $V-z^X]韲0=L|C#lGTC))%aƳMߙI+#p8]\Law?sFrs jՇczK)5<|h(%SS%[pԓ[`*cc|kۖB~ZA=(蔜%P >ӱ1߸?gajIC`6'2 v:h5] QW'q:ޜ)C|8#*#fp;`!lN^N=LqFF1}ٔ }%s..s!1r՘;`3cʾ=rϟP;xˀm">P_=nZS}j(2Vw_̊=eJub5+kN叧Y}56Ġ |/Ŵ* )Qb)vU=bUf 0 #UD%f2yus.[SZbGj-#X,&5uFhнnmжemH*7UZ):An'8!s7IX ^QbtkΜGrkɿܾ@$Ijau6io޻7PVXԸ=AV=Tupi4{vg@6-)AP^T@cedOSI-kmKI5b6vDd+ѪQ'FfNL v-Og>?2Tu/z9ه3rn0eh/^3nrJٙ #h:VM17ѳ|~sƷ .7s}r:C-ԝ<}x>|=BS~M>=vӽGsU-,r?cݩvK`I(͈Whƅ w2j5?G{{E C]ti!9jz}oH}#PC` ֗B3h1t(G"XzLL1GE|!F=]ތ}n}_a N<ݗ_}U+p$GW^uǍXk/kU%(8TD[}܇lf5aZL( wr{V^yy <W^:V THOpsdl ۘP@p.F݂d&-c.6f=;ypXE>C;܍d*>̺Y7ÀgƐ`:G(W뢿8| ټ(l//,Eά-~$4_|oHayY{&}e˖e||?H)TN?>8O&% 譺oopqs10@7f5t(\漇ȁM|q=x7h&SdCn|R\JQ)Vu ڙcj^=tEmyW/q/Qeٌd^TEXhf2b3(?n :ga{czu 1=o{YJ Vر'l~@ЈS$,#;@5zY:&'%>dΧ3}ztKA<{"ȑ$SyGXt;hʅ퍑Ӱ*]q13G9ScyrX5oJ߱ Nihʥ C҇IYWϫ *1 :u3pA9=gɗ` 1=@3[SдgO> 8F&0Y?q%g܅ys+]\Ȉȍdq#yf73ppFcg_ϭU57?/-`uHLmVVzX'z;v^{SZZ^9Nd΢{isӃwFwn ?{/S+Fst u]$avZZ4OYYsw`9|,QsM֗TN$I"IcDUM 7b^epy{_>3.1]GzZw5uO]{MUx&S*)YC*pDeKV+6$ ȸ\Wn3} k*bը$ !ά| pi0|Nz\MHZ֟gzERd~5Iiod:!9 S (%h:F]aMӧ\֦鷠A$KdddмYszESa* 5ݾg}={5$9:K`R Ģsdvs t[1GU9GEǤ|/QI}}>VuU5ZOn^.9}ؼw/ǑdK%&`Ʈ6: \k/xQOvInTS/#R>Z<%U15$FK{gEUq=]f"˲AmGR/U oGV:Y4.OTtiՄ_oMW79.p6,,$+$$$rE+CLBdds,H@PtヌTݒЀ29Y}KADXQ%0n_.i3Nq| 8pJHhav$I unGrNqD ^eC:W)5$:†(#n_.i3NPqGJyy9NWy8Z~0LXVL&x@p!)(qWuyy*MX mbB4 ݾ84]ҫ j";`0$4|:e?,W:SWiݸ.ڰpͧ_;)uN\Y1 -/t I}"@ OG5@ Hq@ 4Mt9 @ 5N> Iĕ@ ~!41T'@]בtqu@ _4]w @ tk:&@ j4Mvp`H?x@9@ $G @PN\qW]|ܕȲ,"@pYkn^/qq)@ Ӵkn:ulоC' -=GdM eb >.y O_IENDB`ktikz/doc/qtikz.qhp0000660000175000017500000000127511455414613017000 0ustar fhackenbergerfhackenberger hackenberger.qtikz doc
index.html index.css configuration-editor.png configuration-general.png configuration-highlighting.png interface-gotolinewidget.png interface-mainwindow.png interface-replacecurrentwidget.png interface-replacewidget.png interface-templatewidget.png
ktikz/doc/configuration.docbook0000660000175000017500000002330011455414613021326 0ustar fhackenbergerfhackenberger Configure &kappname; General Configuration In order to configure &ktikz; the user needs to access the &ktikz; Configuration dialog. This can be accessed via the menu bar, by selecting SettingsConfigure &ktikz;.... The &ktikz; Configuration dialog consists of three sections; General, Editor and Highlighting. Clicking one of these sections in the vertical list on the left side of the dialog will make those options available accordingly. The options available are displayed to the right of the dialog. By means of buttons along the bottom of the box the user can control the configuration process. You may invoke the Help system, accept the current settings and close the dialog by means of the OK button, or Cancel the process. The categories General, Editor and Highlighting are detailed in the following sections. General Editor Highlighting General This section of the dialog lets you configure the interface and set the paths to the necessary executables and the documentation. &ktikz; configuration dialog - General &ktikz; Configuration Window Showing The General Options Interface Show TikZ commands in dock instead of menu If this option is checked, a dock widget is available with a list of TikZ commands which you can insert in your code by clicking on them. If this option is not checked, the TikZ commands will be available in a menu instead. You have to restart &ktikz; for this change to take effect. Preview generation Specify whether the preview should be generated automatically or manually. Automatically If this option is checked, the TikZ code in the editor is compiled while editing. Manually If this option is checked, a Build button is available and the TikZ code is only compiled when you press that button. Commands PDFLaTeX command Enter the path of the PDFLaTeX executable here. This executable is used to typeset a LaTeX file containing the TikZ code in order to generate the preview. Pdftops command Enter the path to the pdftops executable (part of poppler) here. This executable is used to export the image to EPS (Encapsulated PostScript). Templates Replace text Enter the text which will be replaced by the TikZ code in the template here. Editor command Enter the path to the executable of the text editor for the template here. Help TikZ documentation Enter the path to the file containing the TikZ documentation here. An URL to online documentation may also be given. Search Press this button to search the file containing the TikZ documentation in the TeX directory structure using kpsewhich. Editor This section of the dialog lets you configure the look and feel of the text editor. &ktikz; configuration dialog - Editor &ktikz; Configuration Window Showing The Editor Options Editor Text font Select the font of the unhighlighted main text. Show white spaces Show white spaces in the text by replacing them with special symbols. These symbols will not be saved on disk. Use color Select the color in which the spaces will be shown. Show tabulators Show tabulators in the text by replacing them with special symbols. These symbols will not be saved on disk. Use color Select the color in which the tabulators will be shown. Show matching brackets If the cursor is on a bracket ({[]}), then the corresponding opening/closing bracket will be highlighted. Use color Select the color in which the highlighted brackets will be shown. Use command completion When the first letters of a TikZ command are typed in the text, a list of possible completions will be shown. Highlighting This section of the dialog lets you configure the fonts and colors for the highlighted code in the text editor. &ktikz; configuration dialog - Highlighting &ktikz; Configuration Window Showing The Highlighting Options Highlighting Standard When this option is checked, the default fonts and colors are used in the output. Custom When this option is checked, the fonts and colors defined below will be used in the output instead of the default ones. Change style for Select in the table the structure appearing in the TikZ code for which you want to change the fonts and colors. Change font Select the font in which the structure that you selected in the table above should be displayed. Change color Select the text color in which the structure that you selected in the table above should be displayed. ktikz/doc/generate-qt-doc.sh0000770000175000017500000000434511455414613020442 0ustar fhackenbergerfhackenberger#!/bin/sh inputfile="index.docbook" outputfile="index.html" #qhpfile="qtikz.qhp" qchfile="qtikz.qch" qhcpfile="qtikz.qhcp" qhcfile="qtikz.qhc" usage() { progname=`echo $0 | sed -e "s/[^\/]*\///g"` cat << EOF Usage: $progname [OPTIONS] Options: -c|--clean remove ${qchfile} and ${qhcfile} --qhc generate ${qhcfile}; without this option, only ${outputfile} is generated EOF } cleanup() { rm ${outputfile} ${qchfile} ${qhcfile} } generate_html() { ksgmltoolsdir="`kde4-config --install data --expandvars`/ksgmltools2" dtddir="${ksgmltoolsdir}/customization/dtd" xslfile="${ksgmltoolsdir}/docbook/xsl/html/docbook.xsl" xsltproc --path ${dtddir} -o ${outputfile} ${xslfile} ${inputfile} sed -e "s///" \ -e "s/KTikZ/QTikZ/g" \ -e "s/cmake/qmake/g" \ -e "s/KDE/Qt/g" \ -e "s/kdebase and kdelibs from [^,]*,/Qt<\/span> 4.4/g" \ ${outputfile} > ${outputfile}_temp # Remove information about "Report Bug" and "Switch Application Language" items in the Help menu which do not exist in the Qt-only version sed -e ":a;s/
Help<\/span>->Report Bug.*for this application\.<\/p><\/dd>//;/ ${outputfile} # Remove duplicate "Qt 4.4" in the "Compilation and Installation" section # Remove instructions about "Show Statusbar", "Configure Shortcuts" and "Configure Toolbars" which do not exist in the Qt-only version sed -e "s/Qt<\/span> 4.4 <\/dd>/d" \ ${outputfile} > ${outputfile}_temp mv ${outputfile}_temp ${outputfile} } generate_qhc() { generate_html #qhelpgenerator ${qhpfile} -o ${qchfile} # this is already done in the following step (see in ${qhcpfile}) qcollectiongenerator ${qhcpfile} -o ${qhcfile} } while test x"$1" != x do case $1 in -h|--help) usage exit 0;; -c|--clean) cleanup exit 0;; --qhc) generate_qhc exit 0;; *) shift;; esac done generate_html ktikz/doc/interface-replacecurrentwidget.png0000660000175000017500000001625511455414613024016 0ustar fhackenbergerfhackenbergerPNG  IHDR2N3sRGBbKGD pHYs& StIME 8RZtEXtCommentCreated with GIMPWIDATxyXU?gap4Ĝ-5<ϖeY״2YݟenZJ-Jmrr4EEp`ϸPPሦ~gp}~޵F NEAAJ AA1  CAAA  Pe##{_dR wH!oZ_lg<ǵɋ+u#oK(zO~pIHAl#wW^!TGp~w狋T}U-v~5&rSw`Kr1`.ՂC&m|# #AA!61I3ti/DZ_>Tr#IƱ,.VT+C{7Rj͠b-?1ޘTE:  4Zzw}:Nҝ(X<EG՛Q}ʮb`gm{#3聙|sJMTۯ+QD?Fi/*=5*yxаm~Lܗc=KTd4FNcI\>]ܖG{cF0t,8&^'O9cDvoE|be&C25ё=lޜb,XV4[{ ݴSfӿc\N}1}ҧO_zw"T; }Cii%OA*)ln)m1xz*+tÙz#~ *H,^y-,Gh?}~b["ol.2|6YTw1l޼%/&S[XJanԓVyRl*%ѳfuL Ω-YJf9o)+V-x5x7D؛(1bS,zNM)kV-d$__I/+yA<>z#"&Z%_mǣPziƗN3+ҋ:#Ƿ??fx\! enxCKFH`﹨5@= /_s(d0o)c_UYn'iody֑  <ƐsFɣNq/˒my7?vL\}˨يI=^zS4vxШ[qYǺ3kHф.ctl'j*|% H.(ɛ0cŎ>4XDQ] _}ïyo`# Վ }C1ol$Ay?r0 (3ٹ%sA#$+#m҉>զhP 8RbX9 z?;8cÊrAZѳ1~ڝ!']}ǣ >߇͢K 8W$x,$c)*Cbm v.힥>lyubXWg˥Ar!kNA&6hkC!ˏe0Su!22ޣgٮ̒4fZgӹ`^ֈ';2Lgp`#=vgQI9}oL߅Ȩ.Tұ\55Cy&3xl E5'jue -hkвc-B_טi5( OsALҐ'˛[ &$wύyU3[fن8 BC l̽gS^U7a/?K45w+>-ej+sm  mxݮOmy yb&jNAAVt~׍sV,[4MHi;AA.\dAACE'  1AA  p't(܍ek@Q4h5WAAFЩ؝QoS$cn2i7C: P SQɷ$f_ʆeSKWǎ%ljFFRx$wK׶? PòLe]x@g^N(HSzaQV-*7߲cӝo6J[x^*j0N|=*0GY0p3b8{žIoCbXiS ='Gdf>al9FH_>o?S(@ÿVj䶒t0Eht:>DO}Qڋ Ҷ~kFxVxO[efTs2O׎tKQʺ)lAz0[v塷6,5=qWޙЗaGЦS*>J^p{~#~3 e!\*ُV}g潶tW8=7*a7]ӿ`RJOE69% t+ 0ߦ>6OD6yI?tcc uv<&w) af#~$/d "e$mOBn~=^jb/86G?| ^wѮtO& ǪUYs>C# j>捝zxb7Bs̭} cKv(5TWQS]v''#~$/d "v'Y闢co9TQmX0v{h7G Ta>4%X-_&LSsJPbx~vqiAۺLe|z+>;Ԅ &[JIRgre]Tt4{>ZykPUcO/(%#R7um4ab7{~9Bb=_i/y `$mDh+˕U:vd%Ih°~[G+ _W9(kt*V<5<4jGh E#?|-4xҨk{,vdSQ5^DO _^[ݳqtz҈9j^; 3IGNLtOW)4~yE=FnWX˱$T#.VJ>@]JdAa6O]?a?+Wޙ.ʰv#(ݼ28gb'GFv SgO2z_xW褮RjAֲͬt99PTWqr<P[{Q;2)*/@!~ɱA 7xHj~/٦8oy/[/*5v?\ <*drQSsnZZwVzc,٧ΈΙuٹ,:8Zlizq )NPٚOoR+:@{5lj@9KZ9Y װ/Tۊ+q,K 7Z%i1Z苵 9?^ar W%*ư<)es֐:WW?Áݤ9C : [{0V-&a j`@v'>ސ=2/t*VRw^X*_[.9,_5kXf k֮gdYĶ,z]R'N{a'cx` &<݉S͜yH*ta?w؄G43sSq/ZiqqH*vMwK=׎ݞ)͊t~s!ÆaMM%k|\YhU4p_K{&MB;1yA X 39ޙ2EG츬 ^5ưEZ܍+JH;_+'2,71߹?IopcHEit0HqnÓ4`݄hZfo{Shmx1|4v0gXu7cfA g6qk Ei x UTCKRɯ3,ڂc nZ6Mч_i};[>χ  LEư' F?6MJ?{+eoQ3^ ]߈3]M?MN`CwGw2j9%j دwGߌjmudOI H::zho18%9wܜo+wi6 xf) y*X ujA&0|{:L&@E=1߮븝9mٚl| 5?DK_rZ->~yO&E/-N'Mnn:ei&BB˾UUie~` 6?On 4/Z=^z:mF)v;zk.Mx ]A䊡V& A.Ofa$S`0r8% o& Z7RkuZ%YDKen&.Mηnᨷ`J-\aΛ P5(s8Ө Ja޽FGD-:hh.vV͚5;u\\\H䥕) &j0L쏋#фa\mY\-#V8v 28**ҦtWj^z@PN+͆aά2(HNFa[M1Wh_͛7{bcco Pi]rNeM%+աlcc|. (K2fNWK46aР-SXXHJI233hҤ)ד$V"ǏgTͧ"#=SU4@v:$ 6mHP$1P!ӥgS؟OBvq(sCmO;kh^L`/=t*B~^dg_P ID<=f@^ Z*us.9PYshs[9c''_F2PHPz- QUFaAVMXxL==1L n>e@P5 BѴKKEG E`ii)w؝gxU7n.e@P5j \}.,FVtԪjRKz{xx`2d@ }Jnnc( y@nAA  %?+IENDB`ktikz/doc/ktikz.10000660000175000017500000000311111455414613016331 0ustar fhackenbergerfhackenberger.\" Hey, EMACS: -*- nroff -*- .TH KTIKZ 1 "May 12, 2010" .\" Please adjust this date whenever revising the manpage. .SH NAME ktikz \- editor for the TikZ language .SH SYNOPSIS .BR ktikz [Qt\-options] [KDE\-options] [url | file] .SH DESCRIPTION KTikZ is a small application to assist in the creation of diagrams and drawings using the TikZ macros from the LaTeX package "pgf". It consists of a text editor pane in which the TikZ code for the drawing is edited and a preview pane showing the drawing as rendered by latex. The preview pane can be updated in real-time. Common drawing tools, options and styles are available from the menus to assist the coding process. .SH OPTIONS .SS Generic options: .TP .B \-\-help Show help about options .TP .B \-\-help\-qt Show Qt specific options .TP .B \-\-help\-kde Show KDE specific options .TP .B \-\-help\-all Show all options .TP .B \-\-author Show author information .TP .B \-v, \-\-version Show version information .TP .B \-\-license Show license information .SH SEE ALSO Full user documentation is available through the KDE Help Center. You can also enter the URL .BR help:/ktikz/ directly into konqueror or you can run .BR "`khelpcenter help:/ktikz/'" from the command-line. .BR .SH AUTHOR \fBktikz\fP was written by Florian Hackenberger and Glad Deschrijver . .PP This manual page was written by Agustin Martin Domingo and Stuart Prescott for the Debian project (but may be used by others). ktikz/doc/doc.pri0000660000175000017500000000310211455414613016374 0ustar fhackenbergerfhackenberger# included by ../app/app.pro include(../conf.pri) include(../defaults.pri) DOCUMENTATION_SOURCE_DIR = $${_PRO_FILE_PWD_}/../doc DOCUMENTATION_INSTALL_DIR = $${RESOURCESDIR}/documentation DEFINES += KTIKZ_DOCUMENTATION_INSTALL_DIR=\\\"$${DOCUMENTATION_INSTALL_DIR}\\\" ### Generate and install qhc file QHCPFILES = $${DOCUMENTATION_SOURCE_DIR}/qtikz.qhcp updateqhc.name = qcollectiongenerator ${QMAKE_FILE_IN} updateqhc.input = QHCPFILES updateqhc.output = $${DOCUMENTATION_SOURCE_DIR}/${QMAKE_FILE_BASE}.qhc updateqhc.commands = $${QCOLLECTIONGENERATORCOMMAND} ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} updateqhc.CONFIG = no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqhc documentation.path = $${DOCUMENTATION_INSTALL_DIR} documentation.files += $${DOCUMENTATION_SOURCE_DIR}/qtikz.qch $${DOCUMENTATION_SOURCE_DIR}/qtikz.qhc documentation.CONFIG += no_check_exist INSTALLS += documentation QMAKE_CLEAN += $${DOCUMENTATION_SOURCE_DIR}/qtikz.qch ### Create and install man page unix:!macx { DOCUMENTATIONDIR = "$$replace(DOCUMENTATION_INSTALL_DIR, "/", "\\/")" MANFILETEMPLATES = $${DOCUMENTATION_SOURCE_DIR}/qtikz.1.template createman.name = create man page createman.input = MANFILETEMPLATES createman.output = ${QMAKE_FILE_BASE} createman.commands = sed -e \"s/assistant\\ -collectionFile/assistant\\ -collectionFile\\ $${DOCUMENTATIONDIR}\\/qtikz.qhc/\" ${QMAKE_FILE_IN} > ${QMAKE_FILE_OUT} createman.CONFIG = no_link target_predeps QMAKE_EXTRA_COMPILERS += createman man.path = $${MANDIR}/man1 man.files += $${OUT_PWD}/qtikz.1 man.CONFIG += no_check_exist INSTALLS += man } ktikz/doc/configuration-highlighting.png0000660000175000017500000013420111455414613023140 0ustar fhackenbergerfhackenbergerPNG  IHDRN1-7sRGBbKGDQ:>6E pHYs& StIME;iAQ IDATxwŵ=yv6hV9#i" l0 L~dL2?# 6A %$P^m3ywf'ocfnݮ{jE!hGXT00 %=avlH+e8-b8^]S_x?%cqǚ TUEUUºdopf@'tNH$U>pT$nq$Zf:Q$WJmq].K%MkoOZ&A[K̰8H[>1Hml*u^@ldggcj'O&CkKKʔ NIsPz: \IG>G<[Fmk Sg~S.![qh@EВQ+iJEZlО")B_`(I#t455`O(: !BB B nS]] 'k x^^/D8" p8p8,/#SU$L*T:[Ӡ+Oi.,iMVDm* x<|> C!v;-&6C!<^/>łf2 cvǗ0H8umma=ٌj(ihuQB PU`Z~U+Wŗ_bq`0H}}=&L`ɝN*&*v젰FR0T;j^>F,2^<VC Q. >%W.)Li!U*%B%lҔilu%Ҕ!jkk?a&NWbI}m751; Y>L8SDcpjEinnVOuud94M0͘4 MSԶ)EQزn0X|yj@钾~jkk;w.( "B25k(..f Sj _ ))(OI)Pi."570Dƒ(;iHSFsF`tjv=;f\]n]ϸ9qukP\Rү펣Gmuuuq.**ɦ3ˉ*'%&tLŤb5XN'橧E1w܈dsNf͜BPO @:3gdΝ]JCf"s?f93g6{};,͜9e,5I;w(<dOgr. OM4O/ϼ~1yEi3 cO Tn?8},@Ӵ~%31PBlp@QQQrU0h] /_KG){S.P# |EIlLi%y>dzObf95$W:n98k˱uә,~b3(3]PyeTislf535[EEk[AUz\9]QlN^LI.ۉ H?Kh}EQLD*MKiJ e$~ԟ$)$%h2yT@K&9; u)- S&lfި"M YBv"++ CBF,Y=C=^Wmv{Imjhhr+f#>jSh|p8bhjSm~k(*.K/,7pkt@aAA>J].\* 8G0d}C;?ȦMy7ٿ|d<-=yKu9k~/,x][Zʆ'??+-"ѩyۗP T|;X9}v6'G"NI ukGrɯƮ?WaO+ްH stBYK<)WƵss`,6rܥfۺmr0{]h\wF^c5Ƃy54]uz\̘un">A0)$Dv!Fr$Q=|HE$Fh!ѥtTP!8va)E2QҤ)弎:mqu,]z @=s-KYxqW\;6n슫NSc#3fаBa4552fL~6}~Xr cѸFc#vۭ%\Y8 =K/eOOuR֯_ϘM}x|T aE7_cwda;Fo~ GXμQmCSU~ߛכhE :#^FԲKy+Xh[@}_z7O= aPfpȉqG0 xs췞Z?n[9s<<{ڏXݖOkxg,k?xO='Ólѳ{/8 sYgq橇3=h&<(ʚYv[=mʏbBk?&S{b?ydBCD>>O܏ *͵Enup3Zy6<^}4 @'xxt DҜ֋7KN4a ^|:?,AW-!bZ6|~ʊDu/|yA#Y'bR~DkH$/)^mFI!D9L"ʦd3xM\Kv!e=nDPA9P(bPz%KnꫯvsױuVn^zKlݎ/yna {}_Ï׿K/ԇt'vssN3k? v8J$N&M(böZATV}]6YvK6{,rW crL*ɋ+'#1I몫FQ%cc`Sm3= }0Ay0/<w<A>mu?e<%cql]ŎymyL9t7]+dw O@݇_|4/,;ܒ_;=} *~8*>jn g9vJPO(||F_+O]L%Dʥp^«@} Oܵ"#p2In4JL%-lABD5Q$bDRIX HcdUDUIVUo۱!gAkkK̸ڻ?#0˖=M)¶mxgQ55HۓD]YQ~,؛m۶2k,yQjj{ڦ tws=˲棏?nkZSE}xܾ5 --̥ r'ŔN{_s04MbЈ}މWUYG"4yE`-, xe}JW>ikSb gSJ+VtE|@^OeKl̘iPrpz]>o13<:fW{[sy>}|צ::]#ʄkcO/aEѳha%zޓRPe$DNx̒HNz@߇8Ku/eL-&\Ku,#Yj:} jjjpϸW#4 v("Nvn_mZQ5-na^;+*8AU%3fΠlY-V\EVB`K<̗-zejW?xȞXn-Z6i Z1sM=Bm&bqEmmկcSv]'ij1cږ~FfNϥկĥii&Əw70~8 edu._zrցO3c$j6~_Iů/yS9|P N8svW k9/4A|gm/iMhk,*jKvw!''>{z|]p#=_uFxWpܕo 9%xOhJ-J|*",L:n/5G߸;#O{=z`SȮ幋慮AKҲ./JwwIPiWbԉh*NI6F~Ux~IR*T )+P)`:6\U4$\Lo&i-e͌+-W>*vW7ld„ JU%cnnnU ?~<hM(ϧ͛61.> 7| ٱ1t)m_b`213v~r"Mbwa9hhia.b{.S_WϦ6t:Ik pfeaF())ne7G3ֶ_כ|p:Zjߋ^z܍OxՏ>K7-Wrܥ`gbŒcʱ|<.yus9iXc 嵻z2Nݬg 1sP9^֎*6mzAOo;8)ZKWUS%-RA]J))DxqوC&T%j?Q%6޲IE*L.%J%2ifSRR®]}-榦ݽmm)).nJJw6a;>Лk4E]]m ꩫ hlh8JScDKCC_٩,)sTUUkְ` QնVZܹs0acǎŁɆij6Ѷ xftb?&t~/^o]ט, ܀;$PLNrshmh!(,cpAZhrl, Zh SZCS5wn33ˁY T6nƄ3DžYZtJmbڙÄ>A#ǖªt-iN!o-_KѰ(`<z7=ˁIn| Ձâ` 0"+:q(i{LDS1ITKH J1hԦ!:K) ^"Q. ”q]UUŎ;{/Vfy]q5*Nc߭YÂWZܲ2&Pn{ڵm\ŜTl5V\ܹsm8麎ah)INpjkkimmߏfcܸq\.N4E)khRj0oȩ%"%J>ȻDiTd*UB4N/iDi"JBF1aW[ZZc(--ŕW]jۭTKǍÕtvVVl"I}RXS|ն{h bp8ZLm'Gtm7֧} a@#w?p)&+J95LHTډTT*meLaj)CKFFի4>ijRʄ)"FB;꺎imqt찮ikz@pTT TǁE.w fse vB{-JV!JV)$jT*$# @M#UeJA}q*zLY)=nK{<ś8-*.ITl;LshuDOLgd TfZ1$F:i^K է^'D,)dx6)MNrOڮd4%< lLD%3) 3ϧtGI(cfl:;9nѽE{ٮ$ :j{[NBݽ~Ym0v@mر1PW訯t֎ڊ Jﻏ[Jt;nUtn@ t{M6g:h[Jht%N+DtJW:]/ ?Gt;=w>{7_KHH _D ^:]DŽa5#νJW3\wnDEM vl'vCҍ(ݾhs`DZD:nJQ:bo}'cVutL[Jo~٬=kwVJGh"-ޘ" ZL,6]Gb[n׀hS9zw8ߔcGyi~b2B_vUGX(_EY2gl "EOPF۲(@|7B""b2JD^wє/巾_(ZFKFi"֫zCiIQDo"}D !_"15ފS<X$t*}Ȗ.{QW$^>vx3U\Ӥ錻^\?+ FP=b"#c5"L=LXpEȜvbO6"=!9'ۙADs:yE:BL!.*U;WWEI"\{E%R}FXDdQ`7"1+uXP.8%yHI"$ W "5隆ӞA YIn>Di|$VD IDAT!H”q-r(ҕݓmFH윈_t[oZ:ƟNڗ$u&{b%:)RD( ) ɉP 2%'~'x,zfr%wJ/}IbGqgqN i{"/w%W\u{<ɴ{>z~dD#tz2.Bij]AO%p1d-2ԆH> "uP'K 7"C~54$SJ !NzNi DLDK28'nL$X/|i HM1P I Ywd)S6*Y)RY*6F!(uSRR!RH&T)DU~M+J1iމ7$+iIR1PFM]){T2`sȐTF%ER!S!u?ҒJ$B%Y{e DS%ynDe`$gÕ,_#0 ;ӮB%B xBsd ֝20JTD X=LaBǣ1 TIJG@j$ɒ$N#Dn.5*Q"^7J%E"BxP2$($ZQʓHIAd3U64HDi0;҈!NNHZ7b7-ZLJJJ&TITP" O'4F.0ɋcW:ԘT`?PDiDFqtʴtI_!LPT%BRY3 Bh'c"U;#*]&aj{$MDdvD*Y2pQML [c&J☐MNRPըD'5SkaC2Mf2`_ -/_O qjjjbux=N")tEp0g\rssJP%Rxbs(Kf_ʈPCʴ*Q"7Ä$ Rf466ۓk \t+FdfW}=$O 鲧_ڷ&gh45iH̋*TxT:F$YY[2aD?$F۶n|EcrJ:=r9H$Lb2rY1&|1 A$iڐd/R&N1fٓ# &TsbD?>դi'HWrHdU ~"CA:(I7l6v]np%pt-Q3gxTtd^^C$ @C V8)Di e1x`۶mLï(q1y*P1w~zD ]ʀ>+4cӦM0s?3E21b",HCd!""3T31(ɝAG߲8?EIA@? m hۄtC׽420¬dbK3[)̘yNQ{(D?@Vrrr">˻}DG'³.Ǽyr o|Yo1oB\r~OrrO7"Wr.ߧ\ۧh>Q7j?=Q󘩏3PdZy">Ȭq:>Mg֏G8OF*jUT|W= 0{vpNʦZCWErLi`$"{5ae3g2aq{=~ V@Ǽ򽰘x<8 x4lvS8@0QT'0 P݁!: „Bn 6k_Jc)Gpn?<ǵļyثG kJmq9oNzʖ} 1lo\~++c#/ߴ5Op WV>?~^%Fm>Wf+&LĉQP@jof b2uT]=vA5Diy=2QnI0=fO45WBIr Gbbq~>Ky}9dV#Oߺȫ^>\z7.gFlwIy<E j!7wsvDvn{gF֊v}xv?8v%ru#8,Y8P#8qxinL|ȍӧCg5<Ħ4hT"r(:L1tqդ>jOWhn h!Q 1rr(5}ݎ1ow7X f^DHCR9*! GZ^#߿2 WA)[>_7ESѵѦOv b(?oYŁw<}_ol5*COߎ!0JyK9v9PK|J~|U{gEԹ}eǝgO"y}wyEP1T~t}H[5f< b&p}6?B4 BaE|=s>aְ< 2\3 3gAVTLjwJ`bCvz7i ҭ:m{ UӮ ln)+EIbī?\I$ACXsgTUZ֙]eev%sb40PL/0Wh ;c~ƢyU,S&!N+WdGt[Vs/n!~oCrwo4[VsYyv>q5EE6Xg?s}TJ9_챷ty}}j"~JHyIr\ͺIJm *10PTamJ 3d+5 @466w;i6ofĉL2eؐug)%tALvwwyânۙ:u\N?l(a`c=eW&dL8 M E Yp7W_ʸi(Xb+%Ժ?PT8 ,Whݎ@O-[(..47'1n/_V_ h;LD^J<7K u{scQ)?Df ||}so6tIiIBy|EUh*P]S˕M~~>xԆ`y= u[QBadc_/O99NI\_}?OwۋBwX5'a@%gBN>.Z4Q'6ebn31olg_N>b~O;?>M”t o$2BJZ-)a|bÁao{]Kњ?d4rxl=g͒_̠>k7#;9R)yrJF&⇅iggez73;ÿ%ZC(,L;.^8kz_CI$$01}( CUc`#,X(' .9{1KuB^_̧ k׮N%v躎j JHHHHH so|G@UTEi[t4 P@UTz-=ɭ A_s~R+G$Na-Ǿx8Ѷ,t0fNrL+I 6Oz]ЪAP8 IZ[[iiif{3 @Qc/_A~vV,%7Mqj7U| ErIHHHHHH4d"*-f4ҍ ضY[B&&S!( ػM{#9$$$$$$$q>ki!?.)0h],>(^LaA>%|*u$$$$$$$R؎ L+sOl&Ϣ/x^=4̃4LX^q H27ݲUD'p:_|*w-ˏo#ên}'qt7$A;^޻V.qsF ৰ;Z(=މwL3>Ed|] gmW`/Xೇo[Jf?Fr˦W폽Ú*?-hGulԌ+Jb݄ TΚXy=}B^%M ! 8Ii55ըRjTUUiZ18v؆Wжe\U̽IC>x <89){,Y:;%-C~#Jbٔ7 IDATIbjmvU>PQ5.Xz{w|C-Ay+<1eQnK}狖ETc(xkx#rW6w=>!X6%$$$$6RDZiNZ*+).)& Ŭg6[QRT+-Ǹelk &/n'b~X^\r" dz7vWjrq+Wa:Ik{WҞ eukװzj3F& d$ߏFu<VqƱd9s_v;cKQؼe+7mblV:jjQU%cRR\s~/䠔$RHLx2j$K8|(lp x׸뮻p\lvƌ) //ܜ_WBBBBB"Q*N}x::!$M8 o;;v`F'T=& p8huj-VrrmMN'}455 娒idrzSqun(*(*fd!//͊fԮDOillŋ3sLD'!!!!!1rS’C@XE* Ղbb1a6i|>pۍ' x뭷`˖-r!,^`&1,ϭD(/BaZZݘf ϳ~zmۆKCkk+.K, IFV+p͆*NCS3&`(0Y8Xf sT_ϧ|[رc;K_ܹs5*o'pCTEA3:Ri;wiA0hfbsgf`Z0i*Dў0#e˞fݺ^//d׮]4N0j_Pd2x<4څbʭ $$$$$$qp\aTUŤ .VK&6Z= iu{9ҋ|gܹ,wqN~b`4# 4y `0T, &M"}6,|$N٤ hi ?lt:p1&/͛6^Zw!i#bz~V͞C(nX& `Z>c&ׯpHIBBBBB MX,|!@\lOY-7wɎ۩㨟70qجXQ nS  `S2e*[6@#)H'o8踳3Κhp#xz%g I륻V`0@PfD昡 w4.tn)`fQ__?*C Ɍfv=l6BLA6[:կ^iKäjNlWDF1k 2LݢbZ[ZcGE%vd{e--?W{d2E]đa&/ۉԶlNe4&!^¢6%IOuU\s5<=SXT狞#^ٻ()ۓM$!MREk׮W(z^۵r H/BH!3) ޾浲;wϜ=ÓI%OEኡ]pF{p-]_na섇YJvp upT6?av&W½3gjx"ns3CpWܕbFkyo/_.{x> i?яLeެ79y굼3k._ݓ>*S!0 ,v3鐕FjRq^N;o6_}. 4꫉# mjiizdӭVNΖePUp+Wl1G›1-EQBXֶY_FCw.+-Tڕk)Lztc{{+s,W%ébOX8^^˜ '3퀩 “{Iv<lYT$mNB!4P8æk( @UUJKKMLL viuQ|>4MGQ4M0 "pPS__էi;45'm6|C״M(4u2ʨQIDYuEv|NM?P<6^[Pj ͽcL&&XFUIAlآSnLc n0B!Ͷ4v;`ƽ87QRZadeeq7[W|TVV.75u~ ӤtmBNii n g'|2 f1x`N8-.թFqqɦ0-Μ o_²EáZHcHe ?);vOp>YJp4dft%>.Ci Vj>Nnϫ%x;{. 1Lɓ81 #ù&?̤a79&a$%ҪuʢCNm/_NΝaRUUEm5)6.0p`0s$, G0Ʀi^ mƺSPP@NNN/D().fCq%!1Hd}ttR+B!,( PA(bJV\~ }; uQ]]CTT4 h66M4" @T3 y/t!'6hA!~_/I!;Xx}>n7ѪwI,8S^QIl|"ሁHlb Q4U4>6X\.UUUUpp\n].k׮%91'`rPTtRSqvih 'Z!^N֖$gU6vNHH˲4_/rĻ(,nӱ 1x=v~AaDaYzj^i]W'TMuUU5u1LtMt@\|<^/.EQvTBvnTCii)0zdef* .MUhiL44:t]wdggoxp8xA e6NA9XBK:ԩ0Lelj0EB466R__'zt֍.(mix<nwS=*M%5 u$BSp8Lcc#|>B42xll,۷nxyno֯, !8ӞviK6NCCinjI Đ_}m~hrJ!B-NM\\\.bccӟxAI!vB||<BqP B!$8 !B*T'ZeY !jtMjw N[t}}jmoq\D>m)yaG*i"`7֕ ((({먮nw);?{g0;-zЭ:h "^׋7`a444ӡp:!]FW<8Z>9jvfՏ>mA+͊2u $&& BO~">!*bbbZ}E3^䛙31s&3fNzgpX{h?|n!~ $%~AMMkJFDAB_=-R{ ?299HIIkIiP7&`0(^!Qx KCC=FmZATiNQ #?ԃY OOkVHK`3wLq8;S?[9׋Am?,x:_?z KiE>Cd:c;GlcBYI0" ˧V!_e Lm#:8. Xr?j PS8g`пnR9(~ 2n'v1/(?^<c9ѹyU|-h !mq( >: HM ܧy%:1*ܛ-[bKBB!Јn z=E`R_X 6J'&+i]lZK)RȎX]$^\CG {cpɌFwsa ۗOV(!>Nt7>2ء1;OqEӞi\Ϻ5E]`b;7x!Ww8[]O<7}ӇEo?q0ux59ڄW+Y<-\YIPNng=oʢzmymf ù7x߱.+G^ _g,rs!ZAg+ޢaM48u3HF3؞ MaJ-R]Ui~udeeұSgPPP@NNDϧO1KrKYy.Cl:kcY JhM5g]Nʧzq#wsJ''U§o~&& ,Fu+/JFӥH+ʫs抇"n (_n93&y,Vz9W}7}yv F1*m< }+=c-'rٗhH9xԛwݬr9yYpXx4BejSyz)A\D{c𯷸|Q>_LЖHWq?Ki Y2TfOcUx3J\x`J`(\NVA#7BM.c*4(lUa_s!]_RZN~do ٓ OUy<7o34~C>%OZ#,+c:!ӟ?)sW\ɻ0s! Ʌw-_Qt+_oį1o\3" C&?n=5?/Nq{|j.k5ޞݡv,J,GGEv+|7k*^sv_;n/4l,>:U g˨R!I&e+1yۤeW0.ۍHcĤD,dCP1~}R9KGX2+Mø*v*Dx695Wݯ)%wF9mD$vN\kӷDB7ck߱$Bm|hD^;ʦpcG3-ӎMjDnX*b:}Olj SP7aHd|/_ͱ7U9n;Y2ɴ'`p*^5> ʳ7rÛS6?g It̎ DZaG."l,s/,k'1)W~VVG2 V癋q|;?b]hbj4u[.ƤpdWޟ3KBFw,[$4 S0 f{ =\۫+1+>>YԪ-NeL]Z?dHh1|TTh4&>̻sp%WZoFp!W7Gyҍsq'$hzr7Ss ON?~5wNw༧r\~TEׁ^]÷qܺ0.rz8{D߉ z;IzlL<fÑ70$n;v,\x\OHOco.*|?8́qW!?JUUU[S+XKVf&_İ0Bmr- MV0Z ޹_O>d8q2(lh>x!A qpdb `(N~W2[w8kq}:A!f[:g%բϔ+sY?>6h7ߤ! |bOZ5`XBS[ ] d !vN 3 L='ţvݷoZĩC^EbN Nm=!vFd_u GBd5M+j(Z[ͮбW NmkB^0ǩرBnu$`w1"JEinٰ:XiFo%hˆeXhscLJvB}ҥ:a+X89XA8" Fd&va`ח96Hq44%l4ҠtBiQp2ebKA G87's=Mi|~B a4] :di8\6[f(b✘QM/HHlB!/յ>N*(Ij2alL aDMm IJPNp,zð1"aF~t?&e MXc:bٵFssB!> Nm;A_Kћ3n|5kYUYACCp͆vbKIӾ=v*;vdͦ!;BFHYQjZtH +VklnƸqyGyGy=nzALLHޗɏzEqf`1_) >_65χn4 4ˇC-'3 '2,M!0€KH2_LN"ŊDB!L8^,7#Ȩ!Y)tq`a7K񔔔0jX !e3O#>>ƿ&mȰgڍ[<{S꞉qRtM QiĴ;$'ձ# #u8 "p04݉Y>;`?l `4,Ð)ulbZHgc,kcZ6 r* q1ӱ)D4=P=ph Qmq͑9D")?dΌ$wMu\*$BHp|m-KB ALO4+[UͦkZ`Y f {ұ|D(/:8{̓h3hgC6>Sn".]rBF[ߓ+z-ބ_ 0n"(5Rnkܼ55|[(X(Ybu MaىWQUQDq_a)f ˙è8Xπ_#iτ ~(W/R*S!8>djf Em&Xsb9$˅np`Y*X&Jpfwaa\4S]ClhNBRqRүZ ¬nW+ӊBG13tBq0=U%I3Bb49hU4z☕WAlt56nd(B tjmL#YGE.NˁafƲ,=F`*jf#ؗ[,c߻j\؅Ժ"~Z^G NB!F~U~4TwKU`\Im!Ʋ,&ЫӉn':: P,ՙz Z."0{2)T8LTXubqB¨.ܾ.__i Mgs%FŠ$Dư7<<r0fQxqwrl~{)~b,.$[RҎ^I`pg59-Gp| \N:9ե07<T ̊?䧗"'g*V,Ņ ܩ7=p'+H!ژV&:9YS^8P 40j(affJjjk l.5<ꋮhT'^Wb7ϣ,26Q7_7y@T'.naT:`5>晥O%BL=|uۋ\YC]OYu;bՒ*c'׹t.-Y_H~PMEAS@U5 _"J h`& 5, sSYM˥ruX\z#z̾q"I!}d6\1L99BDMϗ,2j A!PU`GlXVT)nhhhdrEڜXfer%qdаxʲ< ^<@:aIG!Т|\uy򮳘v'*ցT Z'}ؑvj޾OoZ>*% nqX& `)=M꽘¢TҋWaif01g4;+R{7J~UAV\N,ˤc}x9;M^>Ū!I/d1qZ ^N}B>Aα5{AQQOJ;FHY vAYTHNT!\MgUNe7կnkڮB6d٢wL9\if(DkJ*J 9YXY@ #B!bbbP0F,( ׳l"f%ll66s sjqB'Q\"f[a{''9ig&%㐿?Byv#GTUUZ5U\233C8Ww^ǀC{UhfX3U~1mMȏtH%.>x.'eaD |VUEfC]Ys5 ީ";q֭[GVVy5f|Bӧ>':tcQ<.\@ffzb>s}}}:Dao|`ӮpDŽC|Wz>3GOEK$6&EuAAuz37)*Uj:fC4-t !i&al؀KQpzxSpSэ5Y}X5,P !,6'̓eF0 W惦ڜh6'݅7“'!b0r¿ò1r1 (xQqnOwP$9hAJ$ڴ"l꺴MJ7:dB!DN{r⾾((ґ;Gk8#ڼ_wNҠ%Ω֟Z=j3q, !ʛC!BԦn"ӧIU !8ȃӾhqTFL~$ YfyJ{g;{cVއ$-~Z\xf;NE\8+H9LTnV,`X&Ee!E vdrUlWeM_%B#85^voh+oBB^o[ϳbuw7\iB!UpKuV[qm3f2sJcxW T7RGz||1Z?1.Y#\K׀eaٜ sto;>sUzvj\IBN4=lm9f1yA[Fp7zgdB!^ N*pA;/n0M}FdҚބ/zB4 &X@T@{۱}Yr7/,pVF5ߩ2Y/Bm{Ꮃ{zyhg\Cbvhz->پKhDR]kngSg﵉i]-܅2e:!5{~ܼ-N-ײ÷]}anF;\pjCzttlT<܎j1 *LHQi;BTFgu\vuWX;;w c<&v$!O@ُ>(qH!FmqjyG]zۺ3v ƍ2mloyv ϭ`nn7ceB'ֺvL:ދV5pKl飏d|Bw jWKff&~fү}4p8U"-98WF8_)cumm,SL7q*dggrH|׸͖u֑EF7S?c !˼L}i6:~Oya*Bakә7Mer}' .'c#<-JR'uӹh;x_ƒyuܣWW j㼨D|N;)iwz?X0ٞk椻!J?0BfLFl 萓`(x<,\0,tŷ궺Ot˜n,/fmJז9)o|"#t)~[}zGa!J,è/Хw"ʗ`Y|:xgҕNb67ֱ~F9; MZqa6]xKu5|ʹ,WM;OK|0T>꺒د.7 !hTm#&5"Ctje$HjkװŻWIhyjĜ;~Q- 1IR7T /o8SRWe~jNXD^e!_2%K2 :U~&#O^SpKrB N⴩#&./d÷`;?(䶫"&] ߓAl[4ىꑺwEA~:\"N԰p>6X7e6u9P>=fmA%x[36\qXsJuB!i[5ud':k5- ua&߹sR6+=pV}A*xywfqqJ gEs˙yɍנ]:ʊ/W ]ucZIaUQStƿ %.&ǔBiOm!eRP/Wx@mCW;F]]ygaEBJVL_ڇo ƶ3 RRH靁@d̛ـչy^tY7ky6OZZW*jM68%u49B'}YoCq!+9Tv9كȢ[tU1\9&U5%La*Q1cM9otXg~Nǖ:>TlAKݨ$Bcv xĤc]*}6x>jAqƓ"89 l]+T}5ONòg9L. ªv.yYrn Gп@w<A~B]1c4gSPP@v#`^ >UvB!Α$B!I!BB!'!B NB!!K̘>M*A!D[ N{:~ZLz lo8NB!vQNv\B!$B!I!BB!'!B NB!850$2O*C!'_LͯAٯry1(9DviAܙ[>f傔?'%{I!Ldx;;ik5wqM4x_ JX]lo%.-GBQ;q֟%s? y>s$əG^EM191 :/sb = so xc)I, 7o#Bxehޫ*,Bs<޷[v Ǎ'N pasY/ːI QRw#IyjN> 45t Bߨ@?fޫ,8'aqP9<^zAd !'!ZS),ֆpRgLj7,ӕ(ub#cP֢pyCն뗮Fm?&0_ˡ׼U]tFJSzQiݼh9 5L| ,gFuG+h=!֯'؟gSV- f-$qBzxUCy.ѝI7pbc;X>]pMSgKi0D-L4 \u&wʪgՒ"RFtsp;wu5 ^J){W!$8 LDyq6s2Q$(?9hLd1}"bL}ZYx)^Z~(Яk"u֓Ivl,@NG_4Ff6w9ڳ)r8颏AwW6e !'!Z.૜^Nwp P:U LZӮe}o)T<1n19ݖ8.0OVT3s8:' PKz10)EjG>NE=*㧥qσ0.Z<BUUYaUVV rsדA=6 +W,pwjH$BAA k{[KVV&3v'c#]9Xu-& !88͘>̬, cQU/dffw >!QZ~̬d2zdB$_PK9PBF! "/B!I!BB!_B8ČӤBHpbg8NB![. !B$1Nɲ6O;=!bNR;8X[($B!I!BB!'!j!J!'!v_m"9~hB{qړS;V΄72լ=`tɞsa~q>iT 8G']=veLP8,H{4b[=ԕcwԴB=9]IBZ'xv"/4=s[4>S'ĿG>Ls>.6w^ǮL=\9%=1w(V?E2\zЕ(ѯB oo\>dc~wX8y%u.?yɴ2U4,]߇?S=D~k'_r/CmB;>e2Rb:7)>i%B N*^]11 `|A#y,/% JB($ޗ4RBk\0$F&#qs13/==.L'Vv=׎gf[b8 18i6z2֋\ǺfUYKG}sp}Q#/^MwKϏ:# `_yiyy -W4g)>$CIV̮9ϑѿ̒fdYrva>54;)}oM媒tDVJ2RԷ%*h޶O 0 9Lt2LI*[WOMVv|J/8ֿ/c7k鼎L8 SO~X3_\ʯ,CiDFçT sJhhrR-,)=U.IvC rJj}8=;1E~DG[SĻmLƝFl&}G_GKZMt>.ʌ^/0Wmj'S-z* jA@y!{hHVQCtNez7u:.VoUHRةÏVk_鹶}5Tjg͊s-vJI_ZU:$B[5iZѻSE&Y9ݦ8Z'T㤞 Nrh9"I}(yx4-uKJ jHF\Mt9/gBQo+n+KFfF7=;sҮ7$3ZkC{-tf$ir&\=Z!In2\])(*jm-Ylٛ<,[X6Sq=?jYZW|$- h\@Mj- 5Li)CH@s?_AYagH_1%*vfgFVTRcu4KjLՑcj3 c6kU7U)jemּM#~vVW}7Ԙq]w8TgKiGVQya&3SRS~z NhoK%;RDNy5-/mhRrvZPp,$%J9OM'Aaf}zܪ*"zVӖRtfUJP,I*ٴ$3Il}[NIa%0d*TZ[,@4 '8 lN\*ktXr)SCTTĶ$Ð!4$ìYa[>BU YZ4-݈JTEm篆.SF Cֿ= 8H[ySV4V뼞>hظ48TVjYO. *dI>SRLe{,{?nz|PuaerogxRsQ)[ⵚ" Y|%ՙ5{k`ځ]ϲI;MUh~AVL-ZB12|iM jͪYhᚨZȽیϮ_7۩[J_҈%)`il4=^9e* [<UMR-4d;baaaa~؋eלVKD@S=$1P'YYZ%Wr TgْWa}TRwMt=ix|L>_!ې+:q9O?R ܒl/SEĖ]'9@Pw.33SFQQ]e~l͚n^R%@;vhT6lА!GL!󕓓 4rɎP.ɮ֌YK>;[7lPnN=4M%''oQvvƙ#  \4th:^o͉'8p 8O8ApaʎJY| ~Ш7L )+Y1QdO3f̡- ?'m'BvhqfocAdR' @p 8@p 8N'N' @p @p 8N'N' @p @p 8N؁"@ckx3Xs01@p 8N'N' @p 8@p 8p8x_q2l[ϳI!ũ i_bxzѣQ hẸ]2DT_#rl~mՌ??~u vL1!!zLCuRkҮy^~y|yp&:k'[_P^^9jZm˶4灋u뢼'?SaB9yA]{u :iۖWߍy]ezt_]{ml=v EyGӉ~DX\y~3LϞ_PS.qZYmű}Kj}vp 4P#o\ z;Ds=r4kuՠSo7 }~`[g^]>f{[h6qV˲\+nےj_vfReo}ѽMQKeɓ7A;WW.WϝŲj%ZN3tkzz ewhh֒*|sY'ez9Q^߽+,8g-HR1 ۡQ.-Zn y`Ȗ_Gpk_X>*~}2;kM9WoI _\~)^3} ۶X_7xr\m骛G(ZXUt'SSo=QT$ZwfmfvAmFN" neֶ88SL%XJ%ӣ C."EblZ~'Z)(9 E=$cK[I 9rD+ي2![nĬ;jQQh?BZa;:&;m׋vy}@ 9j7;3Ws5`NO|aSQu*wR$s 8kK]fLR[P6ͨ=,!ӡX,lCpK7zsGkh+z՚xeWyv !nqeWF=!?5]fz39KUǀ%kH|fUZKhct{OTcvLnXC?Fu>ooþޓz:RrT@cR3Nq/G[G~U JnzkAEN'5S:*tfKTd+c=7X]{Թ,G_Qyy{l;`*}5}8QqY|=4ib oQ/_gHiB?޸_|{~ֻ:bZ\mU[("mFm{71 Nhd;i]J[L;yN>X7MV~i:cY]gayԟΎ 괳;Ӡt=ϊ6kGFG]R$Ө .κGun%]6z쭡S_oUdMߞ{4{5v`o{JTgfj|b쥡WR)/)d۲%zwuѯ΋K뫞k_Պx.kpiPLD.ܲeWfZegW}I%@;vepu롊 fdѨ֯ߠaÆմϲ6~Ƽry"u8N0MSIIϔ-I;q0˗+##Qo˒Ɍ1OB4l[5r\-r,Y-K5W(ajw.[kWi׻z?dۃPs 3[Aq:Ј{Fͽ89Mh%JOKQ$nI }O]zUGe9hwiyryz%K xRoVٷlTnE#fYv]-YQPt Lyp Ɲq&p:,eN{(CNKQqq˖غ\z-_t%$'tYӚ]SY8ۃU{3NhɐmY߄&ZaheyJ ѺZN[wڃ$ '4cvO?wД!>11Q.K) (=x<5;f+;aۘ!8r?P>y<^| ÆPC5#pp{6MSm6ZrٶdYL<(mF̺; 4 Hmùu϶l~Qh2u7>X3'4jp4qtbpP-495`0'~b8ه'SVݯX8Zhu'd[4Xġ:4j/۶%]'4nʷ, д rF Nc @p 8N'N' @p @p 8N 8N'  @p 8N 8N' ' @p 8@p 8N'N' @p 8@p 8N'N' @p @p 8N'N'  @p 8N 8N'  @p 8@p 8N' ' @p 8eY!Ʋ,y< 8t ZtL C%4UWW+551aDhT~_n1$y0\IDAT<CN'@sxm+eنbalHÖa4 @pE-[ᨴVqVU oTOj(Ax}pm[XLhN9Bm1F NLѥmM')76ZpFYsԪU URlX/aɅC욙b[_,ò<6WVqUHG]3$>o7mṈ(** l9b1AOmV}o2M-/'A Z\nVe=Eeۇ猓ar8\:"5.keʵYm-+SiݧXMfp4X83NUU)WX7{4T;Bz_s/ Z|uڶsaZ%%'ӾlC[ׄԯ* 7m[w~RumRFr4~=HٶwQYփhԱeYRZjBPg~X^#Go70sf*ѵeYJOOײeKMRe0uRa?mYl,<(6Oooݪ%U˗ɮLLv˟^w)wK#"шlnph-YVvbw"1KњDF4_J=|x}s褃XTp͞2 h KhxX\OY(߼=x_eqv6_OT/ U^yUKoM'(MBm;WSwީXw9֚݉5tӧRZSQ4Q'UVsL7yё/_տ:FCzuRBJ[WfFS4 ta>˪8Ok>~}xMij>;1]*Cq. SUR\ucθNY}SwӐ^Ҫj'SVٲFD&?A8_[/oι9U]ͯOYʫZs16|M%O>Eַƍw7ޠuzC*o]ꝛι}ܙ)ZZuט<8hTTJ[wuCw{)`5̾d~cq|f.{I鎧>uQm|jU٧?[%׽'Uꙋ)OY ||y|u EtƓ.!5cuVznJHUoTj>`Vͻ63Uoޤo^xANQS>য়Te,)4,Zo-xjyU^r/HGS7D88XRXVLCl#۔用m['KkR*ujt~:G4(X; ܥS?ZGA,EpZdpzӹoWgO4fD?$or^聻*uC䒻U'wCz|Cv짢*.9N޼Ts6'=5όUhM-NJfW4{mgϿ+%S?wr +/Ie+ȗݶkפF{__+ekNV}Qt{|~jyfmSJO+_K;FfxjzqS*П^S ]ُ:tiUnQ{Q#*锳5dd8zjkH_L\1oB-+LO׿u[_(WAnҒ3y2))*Yba,1i˶ly=U(ܵ}zɶ`$ZN5uhʬzz)jғ\yzf2X@>p%h~IpZ=3H%ɖ$&Կ>Q?[]r8 ɎiݿǪ_Y \_Dm5MgUdjukLdȶ==:#4]lگ ֩mT*'+U%zթwԿWDϘ[&T^v>-߬ #YwmlThsYT>oV{S)A-Pы_5Gkކ"۽JunYKO?J[UJ6uK+Rߎ}]owesF7y=5-Zn@\t3xM[[s!-]-X~STRMר,?댕mV$ޟg$טSԿWPjuhL_5'-u7^wC[ Tds&k+ @{[s:{;=R5uq/ u\r}j<.|J_YX~{= >5_Eế.BZa;:&;nF.I2Jk()jٶۭMtnյC|>uewl%'(dG˅#սCzLl${6FevXtDe Nr(҇t;t9^Nv@)?I ~F?nՑ=kU>1Z%;Ro?W-}u:]mK8UyEo.}/ͯh㹺k?۟}e*HJߠ*x1B{PeI,g>HTe鮽ll~hcPr96T;TSIqX#GBH:;C۶4xgߡ^>fN3=ke*N??E/WKmʟѹGXaeY+x}>K.)q:ywx4S\)Lá^ G%o JIN}Q!zpO>+Öix;W56k(?Y+zm=6$Cn#5=]HQR+iw^ pm689].*ٶtiQAL~W ~|n}9FU;o~qvZZmܺJ_MSU<줓4Cu@3N ]~7d=^_*6t%MP jYw^VLk?REF~֕,[ϟQW?]])WN t۹7fr}SIvO͙^EתnԀ6zzBSKLE_N֔'|MoM7V|}p=ɚqm\8XQ3[Ռ?[W%+ Ҵ4Iʞ0AB>b2m)[}7(]KuӵJ@Pt&+PЙ.R咭кܴA1zw3uvź׵$" pZQݿ8ɲ~)+dzmq9]Pbv+V+-Yz:]];.yQ~I =ziW[zd5\Mb[I~}~M.h|f֮$Qs]q 9nzs[=u_| 5*]GL9:}@OЧH=p;{jɔ~_ǧӤ_P_WGMK9G]=ڨuzڥzqF3MYX}p}ncKW> M1L~v*r/ͭhA}4?СZēZuX96HnmvҰngڝz|yE_P~i:C #zStڄ5iP\Ο߶w.yt}Գ +ZQqS|h4  4|UTTn=~Y55d/l{,+"R4tmhqFO3oc/;%xj5M%&%jYnhwnUa[߮ 롙!ͻo+1١56jStt-LLTr ;]?£Jpo'U0D鱛ӀMgm Y2(eonN[Ժ8"%8Ta:t)a,V.-h؃Ǚg}Ecvp: V鬹#eG~*鱙5io:va/0to-ИT,5N|f,guTnfa{)Nɽ-f{y,IuIPP{rKZHNx:4 @L|kNph?{-SPPp&HI*(qiCP8S9ػwrMZ.K2ܣhpcH~7M+?;q:qacb{ Aw0׆v4aST?.;>}{U8ޯu.YD2ڵSFϞmʗvʫ{ :<X,"mq7L.[H$׿k{*ؼUm{V{ U6ƴ;>;].͚5SYm(-=]w jic+§Ih/٠ v,]5y$5{ڧ:rn[ôܚOmtR^.#7fddxp@ 7X=zTNj֮e˔v| m+ +Tm$+uaY[ujeThD$ne4 fاS-smdY*+UXTbUUWS[Ht%$&49\4T4f2diiA h~veV̘zwg%yב )96Zpj~ V0xxd\A8XʫC .Mv+++T6}>i'Zi]n0p:Ϗ¢ǎ+a=ȼ}y|[J ĥkIub`wU K`ݼbc<a+8=(8jeٸ\s+LqqƖ} |'&3$Rd =؎'w -ܷ0{#[?hGz^>amo"00Vva*Tps2Ll$:ٔ)8=<Ͷ"o)2~γN32{Fҭap/8>ş/݃IL(t-r|= Ic$g/BBBD]fF׾#>ob_4 ʖ B|O@P`8?Hc`v مSPJ6?8y&^O3>S@aK4s[N٘ƅt/lИ; D<671@j54g^j)SA }|̻0bPn=eXtWU)4AD$Hմg ON޽i"dffSNU{ٰ&pipfa-cp|1,t.$,9^J^ߏ8z0-wM8b{ Vd|}\;Gl\_F==Bыd9d/bA1~wr a=ȼ>n8ɂ#+@WLaXxbvZ#E;pF'b7y"ch"|T:k$}{msG,"r i|nfӷӯ_>28Hj %qmEϳv[eTZP(rqnoFC@[+;_J"TFJ C.2fm1w1_/7bkrC|j4߯]Oszrjv ]aޞ|!0,ct_)gn-{xu6w|]iRv*ovvgZGfq$vh3N;|{5i` ToJ 8Gjj* }AlE:EQi\NV>uGDiӦnGYddd<==Yfh4UU!H898d o$A:-tj5r }D疱1#f7#d ֬c7iu*e?׏MgrWc2VÓQGVGjQXX@aao9!bЍ4 pvfn8A1@/vSxh' )sj6n74At3q$g~lt'D'י tǏ,g*'5i yp?_'`!Oכq}ۚ0Oҹ?"f0ZI*JҞCҡ$,.T4vK^M? (Vxqd"gZ!»@&Ʃٿ9km_uJ|Pz n_m|˃6AYv(7.8\9tt1H޺Ƕn+{76= 4D779*L|}Ʌ@CsnR,gIJsez Nr퇵&?8uxs)$x֦J|cЦ@; _?3R͠R`G5Z:mM7l>Nt¶ޘtar#@ڹ% ޣG/ BBϠ`n6kVG`((ˎ&3\ޜ3)S9s⡇!222W%m;BAGmxehD?FlןfIjJgNi?I! t.c Ӻ\Gn }̛0~eHِ .`:ӺFq=t^ĢwwvQ[1*TsO0|;*FyQ xhڃad 3EWӏBF|/3P6C2,T(,Bӆ\A*jeN7/]f;+9:n2~׏ipdtWjt:Lqq~өPƴezFO;Gsx{십AAxn]@e#^;{~.Ai KNV.+C; #f"6feOX}MYY].M>wMHoE@4Ln8yt؟\Dٌ[>/= D' `{!H8$KAIJF0j8vZ]Iڵcر,S=6ƍOvj3R^Pva)k7l ҔB5P}c=NYc%4SS1QݙL\V Z| БɟAw/wN#")[V&CӨYۯX'u .P(;>{>7Si=?~_ #&4Bs$e̜7>6~v8g]m+ez͕ 'a̯SDp[gWC* FRaφs_ep Ekp1ymC܍F9W@ћdql>_\dmZ̻_"_1 HW6>w[r4ƭ[!,\Oن nՁDGQO* 'x@/#z!y.,m RaΔǦa au$ȒLCfc/_iQx$$$PRR€[n!!g/<'.v.qDK3~ڣ߱Nҥm>Kd9iua?Oߊ@sêi4Bw.lI9nFÌ,IG|GSdO' IQziX;"'HO( GS;yFrNa֒1c䓞; gd;ʏ>`O_7ŕ+>ɲ*Svy"+.WxbpkyNDp[X׊3:Ptィy2-@_6B-( Š֍1cQ(-ZkʤW`S?;ya'ުam/X&({@pfyo/i/~AtW+c'x Ж]va SIӪU+=9sD`Ԙ1x%ƎOl\<5W5w&G o=@X̠& ջ+!Lz),/gT3UyinȨ9x2x7M{yen[\i#C.p헸wl=܈⣬x%K.Pٰ+cgM$,2Thx̙֙00DӺ/{qmQMU/VztЏ/Aw#5>WޤF Gsdy@efJv8߭g6,,,$e|. nX4(Ago@ٷw@ I0yXn=!Au0(ݛ+x}Vfl^^A] 99E sF˄;<<-*/]Y^G4r$I^ĎZDR bRomǕ Z5}1Ln=6IPl ČU(?d.ΔSI1VR"))W~WiJIRRR &BAˈ^Od|<ˣ$'txyya4Q*/ZݣVNQi`r.MB/0Ǐai96a0Πţ^# Px dz8Kc zjp8nKRaXٷ/&bc*ݎ7.&uɏo %;Nr9I\ljJw * (e^}juH,. ¡\~;d~jTml&=$94#,KZP\pe_ \UO`E| l|ӬٛO nӺF^_|;˅fx咙p' 5xx{ji׿-xYq8s+iu:z=eqJX,X,gޝ6eh*Fe=1eoLϰ);_%׶NЙη3wj-puWyd"5g1C,gNW㵩ub'`[۞[9,ƞ!*r#S"/Ԛ \l){m$\qNՓpNX^<0y2^ϳBXā J0h۪_~3e5p?s:%\v\^̢[¡Y¼fD[z~Jv.f SW_kg˵W:6$xG,$Oٯz^Mɓf}n:hpK~:mKJd3: 3#-ȁLY -v' JH#xy4Fz"$$NC)|/7jq`ȀG`9DѤQu/d" e3SS CYFFIؽƜI)Pi(KU}v-!axfʇ,Jfܻ4[)H>ouNm)$%* G8]nI##٥{rw3-ظzb1;Τ7w6ϘmxROZ.bG1Mk$} _Μ,1qqvߘu肒G3z1Ely T yz?; K4>O7ׯ?CAə2W~sLsN27,%WLA7beI6@fո.]GhIH"8;,i0Z^ "Vjڳ'p/@ffԩSdeeXeb\IF&c6;5zZibnU'˷v˴,mi)b  حŴ$-Oyi̞ݹh}J5K8¼Ysf8ӼZ2|[<4 i{2KedE~k;D5M|\Z&v>c3DAgVis1:ƭu;lv\` yԟ~7uˀG`[e2+?ߜ@M$MLzkY v377ӡI$QQMhQ~HW\d:s~'Ԍ6jǦL9+ױ]SFY$[ؿQ70Lޟ_1tyr*o\ˊn,؜_Tq8߹eÆ_Y2k QɽxğIDAT.g!A#O+7f 2{N 酥^fv Itzn3bvkΜIޞ|!8kl1N+5 ?n^zv ѣn'"F הT6 يt:ӸV+.}jlGӦM*>ٳ(yzz:fdѢ5* }5'SVbw)+tp<%|y4IՅ,{y5gS@TD 7thBAңTT:c4?_O :L;.z*a &|֭D^}GN:\̻i}?%}|׵mKUm(:oWњ꫐mGYx],Qm8k)i??rq֖fE?r>v~B5~ٺh8Ob\ z3>ټCvj([uvcIڧG|LߚNgOXԘ{KIB7] ؓG$z0I}оx-L2ݳ-Pb ߜ%76bU(Z)Y(?u }ތg4lŇY—mqݠf&qSID:cJC @C߳a(B:QԚqMb?y)..fW_SSHe $+z%M#ؿaÇdU#Zk.+,,7t82?oLdOa$lY9v2sdSP YA@p#>r%007W;n!i阭2Nd z*r$摒ư~_1'Bfh֬GIlsevwQ7utb)VYՎG'P@ևGm. Gm6M6{E/ #KH SH >L hl-2JO dYKĭХg,91 K@ YOLNP02Kf<6s8-|4ܨձsc2~!Klv>1oɀhsSȵcބ!|pVκl)R`qQJS`ƛs搕C?Bdd' J)͹9ȶ"^VA!fg7BtM PTe2}LMQDӣ(TV(訲YB.1?#>بtBWd/ePhԜԠtbwʥԐ`L%<Ã1(CE%xu+ęw 0tɶŁݘsA|/PF_D67Єt֖*/ EͳڪK8^W>yFko%8s)04$C-⫼*vJ:s34qKu` t*a-WVr.FTl$@ǥƳ'/e朝Ľ Cš83gNɜHZֺPUQ].AGD\Ss㷬L"4§Q7"_FO&B [_(ޝ3u2"Hf6 ob@_CR d8iԼ Ǝk׮Օ[[ٮ];ƌO?ecS)))ak׮Ki8$; J5o рGVV |Ze4gQWy|L̝}/Mta2 I .vtlnϬ L[|-XY.+V.к,#yc$ku.̧d.,Qǃ/`lW ؕ?-ϥ] [9O6ng$IF=T19<hfv<ٓmWzQ'/ʊR)s 4K!?.XGAppaM͉:ǬIg0/l+ƪaj͆sLq3䃹ǡ|6rX M#wRct7fdIb=c<<- K~:IxhLKɈٸI֦ż.A|2aے#vj[3iX}BXj%$٘m Rփn _Si38u{ޘ^嬒D[,01bDZO#WG 67w RIaQ1$lZ|͵$a0~zBCCP.?jsXex,76$Ib6XJhHpN'h5jWpM.lF#EQjruAI}Bq'44vPVZJnN6Ah4222~DUTLf3]Q^:^OuքQ/ɽ.SCGUU:^ߧˍ<sB44Փุwj0wl6 \PQQAzA; ϡi8nZ]MEQ0H}B3r:i֢%>Mïk{.v=?%KiێDTbĉDC3p|FGixrp!K$ΔCǎhnYgNEqbKv( defҮ}nZ]= R߅B\F梨IDx&C*,nZ\̍Ӟ Y3~>*q /f{tZS^dd$'(8U9/JUUki@f~?95kƑZUS=z-9fw! 48Wcz֪kƆilo#G9Cu&/gZu[xs2|b+W9 f*0e]lKB!~j5+YuW};m݈[}q,GQ4RƑ':15kz:dL){,^{r!$IR繞, U3DmôN0ף[&L*QF,z?kf\ĠI(>C6oތ`uĐ; eu|) b,}`kA^1b_†B!N8oĦ:qxkTLaUTGckOS)y8r}4&EQQyc6nZꅏ0 6P]oZG^L_vg䩼<~sO.SzC۷ɪUҾ}{fBBBo._ή]~`,7[LaGXy'{~϶ΠXI&PP!lCgQ{wݖʗ/O5/ã oݎOA3`9Z^`5Yg3cD/ņ`٢ 3T~ΛyIr$p+^̪ŷ3<7LnW8_v%{ҙwkC|-|f6do>1[z&=<];)GCŬMPtډ€s @Eڿ?K/&..q'`ۙ4y2,\0KV|h) cPl`sX0-Ve}ij$ѡu]ϝC.B!$0<#0â-(%vd짱&}o`w2sh% ܼZ5m|[Oͱꆇxmslm7mw#q,Eu,4qsnǬz+:Qۨ;/T]۫WRC,B?PScaoaWjYg7=>JwĻRyI)Ab>9 f͚l6&NT3[a#bXX:- |Yڂ[am{I1Mtm;5ӿ~u] !C ̀J:5۵k` LhU`sRq( j2^~ɽIN-crl8QhjU151ݨ?HwQƙLtVijrvO& #!XE5wCv這+~m+!R<lD#;QF3}sDEE>&&gΈ 0*P'yH6vDN}oaLԗx)&1Ľ~%{1XB4L|bmݎ] KHL.z53viF|eMJCPz&}&Z Na*3T|e8MhlWk_fxP~( `f"bh~J)c;x.^* -(!!49C5m>ơiZ@SnZ58~z 00l1 "sPms:ZI.Aڕ͍ZZ-~E$:B*chZ NJ«q$1j5K ^5[hF̠\`jܘ:HzCii5!GY6S=HƚK;]M%9p_P}6!~->XsbY1/Kf ]~([W]x1<㩧7^X`X2n]#U'שp":Qt]G iÕM^泞Lʬ1DZ_I !CHȑF৹/{(J2/nQ#1[,uL[TUWQwK9ii՗>i,Z|;X_cy+mmg; |*\2.Uu*?ޒLvnOe,XeSQŬpbQN RCƦ].ƻ7fHEE9̙OӸ;/y`]˸npp{ܔfaGZ1>NpsMHۇ` _ڊ$dBߏw%u!kW*G8>e:- ZAQT =i?D mN3':=c^{LwI?Oc@0u3(BJI?vF+i99ٓ oo ;5ë(ƩV a___xhEAUUlݲF觟ѳ6_Jr?ۼy˖.nrذ>vm7o坫.gR߅B4TuM9ZN|(4FnvBNXnRZsؒ{|YsP *qL&3yGBx8q,^ff#G^Kii)b4QQt TԠݓN/fb9VP@XXx@f' ݓzЪU( QTikZ Handbook. You can also run .BR "`assistant -collectionFile'" from the command-line. .BR .SH AUTHOR \fBqtikz\fP was written by Florian Hackenberger and Glad Deschrijver . .PP This manual page was written by Agustin Martin Domingo and Stuart Prescott for the Debian project (but may be used by others). ktikz/doc/commands.docbook0000660000175000017500000006055411455414613020274 0ustar fhackenbergerfhackenberger Command Reference The <guimenu>File</guimenu> Menu &Ctrl;N File New This starts a new document in a new and independent editor window. &Ctrl;O File Open... Displays a standard &kde; Open File dialog. Use the file view to select the file you want to open, and click on Open to open it. You can find more information about the &kde; Open File dialog in the &kde; User Guide. File Open Recent This is a shortcut to open recently saved documents. Clicking on this item opens a list to the side of the menu with several of the most recently saved files. Clicking on a specific file will open it in &kappname; - if the file still resides at the same location. &Ctrl;S File Save This saves the current document. If there has already been a save of the document then this will overwrite the previously saved file without asking for the user's consent. If it is the first save of a new document the save as dialog (described below) will be invoked. File Save As... This allows a document to be saved with a new file name. This is done by means of the file dialog box described above in the Open section of this help file. File Export Exports the current document to different formats, so that the document can be viewed as an image. Currently the document can be exported as Encapsulated PostScript (EPS), Portable Document Format (PDF) and Portable Network Graphics (PNG). F5 File Reload Reload the current document from disk. If you have made unsaved changes, you will be prompted to save the file before &kappname; reloads it. &Ctrl;W File Close Close the active file with this command. If you have made unsaved changes, you will be prompted to save the file before &kappname; closes it. &Ctrl;Q File Quit This will close the editor window, if you have more than one instance of &kappname; running, through the New or Open menu items, those instances will not be closed. The <guimenu>Edit</guimenu> Menu &Ctrl;Z Edit Undo This is used to eliminate or reverse the most recent user action or operation. &Ctrl;&Shift;Z Edit Redo This will reverse the most recent change (if any) made using Undo. &Ctrl;X Edit Cut This command deletes the current selection and places it on the clipboard. The clipboard is a feature of &kde; that works invisibly to provide a way to transfer data between applications. &Ctrl;C Edit Copy This copies the currently selected text to the clipboard so that it may be pasted elsewhere. The clipboard is a feature of &kde; that works invisibly to provide a way to transfer data between applications. &Ctrl;V Edit Paste This will insert the contents of the clipboard at the cursor position. The clipboard is feature of &kde; that works invisibly to provide a way to transfer data between applications. &Ctrl;A Edit Select All This will select the entire document. This could be very useful for copying the entire file to another application. &Ctrl;I Tools Indent This increases the paragraph's indentation by one step. The size of the step can be selected in the dialog that appears when triggering this action. &Ctrl;D Tools Comment This adds the LaTeX comment character % and one space to the beginning of the line where the text cursor is located or to the beginning of any selected lines. &Ctrl;&Shift;D Tools Uncomment This removes the LaTeX comment character % and one space (if any exist) from the beginning of the line where the text cursor is located or from the beginning of any selected lines. &Ctrl;F Edit Find... This opens the search bar at the bottom of the editor window. On the left side of the bar is an icon to close the bar, followed by a small text box for entering the search pattern. You have to enter the characters of your search pattern and press the Find button. If there is a match in the text, this is highlighted. Continue to press the Find button to find the next matches. If the search pattern does not match any string in the subsequent text anymore, a dialog asking to start searching from the beginning is shown. Use the Search Backwards or Search Forward button to direct the search to proceed in an upwardly or downwardly direction. You can modify the search behaviour by selecting different Options: Checking Whole Words Only prevents the search from stopping on words that contain the searched for pattern. Selecting Case Sensitive will limit finds to entries that match the case (upper or lower) of each of the characters in the search pattern. F3 Edit Find Next This repeats the last find operation, if any, otherwise starts a new find operation. &Shift;F3 Edit Find Previous This repeats the last find operation, if any, searching backwards instead of forwards through the document. &Ctrl;R Edit Replace... This opens the search and replace bar at the bottom of the editor window. On the left side of the bar is an icon to close the bar, followed by a small text box for entering the search pattern. Use the Search Backwards or Search Forward button to direct the search to proceed in an upwardly or downwardly direction. You can modify the search behaviour by selecting different Options: Checking Whole Words Only prevents the search from stopping on words that contain the searched for pattern. Selecting Case Sensitive will limit finds to entries that match the case (upper or lower) of each of the characters in the search pattern. Enter the text to be replaced in the text box labeled Find and the text to replace with in the text box labeled Replace, then click the Replace button. The replace bar is replaced by a set of buttons. If there is a match in the text, this is highlighted. Press Replace to replace the currently highlighted text. Continue to press the Replace button to find and replace the next matches. If the search pattern does not match any string in the subsequent text anymore, a dialog asking to start searching from the beginning is shown. Press the Replace All button to replace the search text in the whole document. Press the Don't Replace button to skip the currently highlighted text and find the next match. Press the Cancel button to cancel the replacing. The <guimenu>View</guimenu> menu The View menu allows you to manage settings specific to the preview. &Ctrl;+ View Zoom In Increase the magnification of the document view. &Ctrl;- View Zoom Out Decrease the magnification of the document view. &Alt;Left View Previous Image Show the preview of the previous TikZ picture in the code. This item is only shown when there are multiple TikZ pictures in the code (delimited by \begin{tikzpicture} and \end{tikzpicture}). &Alt;Right View Next Image Show the preview of the next TikZ picture in the code. This item is only shown when there are multiple TikZ pictures in the code (delimited by \begin{tikzpicture} and \end{tikzpicture}). The <guimenu>Go</guimenu> Menu &Ctrl;G Go Go to Line... This opens the goto line bar at the bottom of the window which is used to have the cursor jump to a particular line (specified by number) in the document. The line number may be entered directly into the text box or graphically by clicking on the up or down arrow spin controls at the side of the text box. The little up arrow will increase the line number and the down arrow decrease it. Close the bar with a click on the icon on the left side of the bar. The <guimenu>Process</guimenu> Menu Esc Process Stop Process Abort the execution of the currently running process. Process View Log Show the LaTeX log file in the Messages panel. Process Shell Escape Enable LaTeX to run shell commands, this is needed when you want to plot functions using gnuplot within TikZ. Enabling this may cause malicious software to be run on your computer! Check the LaTeX code to see which commands are executed. The <guimenu>Insert</guimenu> Menu This menu contains a (currently non-exhaustive) list of TikZ commands. By selecting them, you can insert them in the text at the cursor's current position. The <guimenu>Settings</guimenu> Menu Settings Toolbars This submenu lists the available toolbars, each item toggles the display of the associated toolbar. When checked, each item displays a movable toolbar containing buttons used to initiate frequently used commands. When unchecked the toolbar is hidden. Settings Sidebars This submenu lists the available sidebars, each item toggles the display of the associated sidebar. Settings Show Statusbar When checked, this displays a small bar at the bottom of the editor containing information about the status of the current document. When unchecked the status bar is hidden. Settings Configure Shortcuts... This command opens a dialog box whereby the shortcuts may be changed. A display window shows the list of commands (actions) and their assigned shortcuts, alternates and global shortcuts. The Search line above the list window is used to filter the shortcut list. Selecting an action with a &LMB; click (either on the action name or shortcut cell for the default shortcut or on the alternate cell for an alternative) displays the Default and Custom radio buttons below the selected action. To assign or change a shortcut click on the None button. Its label changes then to Input, now press the new key combination for the action. For example, with the About &kde; action selected in the display window, press the &Ctrl;, &Alt; and the K key on the keyboard. This would mean that anytime you hold down the &Ctrl; and &Alt; buttons and pressed K (while using &kappname;) the About &kde; display box would be called. Use the buttons at the bottom of the dialog to set all shortcuts back to their defaults, print the shortcut list or cancel all changes. Click the OK button to close the dialog and accept all changes. Settings Configure Toolbars... This will open the dialog whereby the toolbar configuration may be changed. The user can choose which shortcut buttons should appear on the toolbar. A display window on the left lists the commands available to placed on the toolbar. A display on the right lists those commands already on the toolbar. A set of four arrow buttons between the two displays manipulates the selections. The right pointing arrow places any command selected in the left pane onto the right pane, i.e., it is added to the toolbar. The left arrow does just the opposite, removing any action selected in the right window from the toolbar. The up and down pointing arrows change the position of an action selected in the right window which changes the position of its button in the toolbar. Settings Configure &kappname;... This menu item opens a dialog whereby several different settings may be adjusted. The <guimenu>Help</guimenu> Menu &ktikz; has a standard &kde; Help as described below, with one addition: Help TikZ Manual Opens the TikZ Manual. This is the full TikZ Manual bundled with the LaTeX PGF package, it contains a tutorial on how to use TikZ and a reference guide of all PGF and TikZ commands. The standard &kde; Help entries are: &help.menu.documentation; ktikz/doc/configuration-editor.png0000660000175000017500000014412411455414613021766 0ustar fhackenbergerfhackenbergerPNG  IHDRN1-7sRGBbKGDQ:>6E pHYs& StIME:-&@ IDATxw`?[J'Vfz/0j~@h1%L I(I( -B(!bܰ\$Vovu']Norfݝ<;! b&i3II2r5MIJv {ν-$o#n_J0z]ikm%pMaKJ{lDٸ'R6Q>6dq)N8JI8ݸeD< ^h\G}"2 \erVc, [>s0INsTɦǁe)((@'eJ'9$N'1}|._ΤW6rR)O>i''V"󽧍X6Z(w;?kIZԠ)fn{Q}Q..jw8hѦ&\.W/ۃlG/a;x^N<+i[@rʮr<0_<(-)'1:|[MX ͂Yy8xA6nqN0X- àfʂ7 ڢA7rO_@)aSUyz "u\p&s*{E0A 2-QxR:]Cڒ3X|5 X\}n> 0lY7@vDEb 1)K] ]X8xWcŌiE& w&u<,t@CÊNT Xy?ϼ MaPG/㺋b |U^;\(xIC7wrlϝ~8Bkr|H>o=8ͅ7η*>N6`P @c3#I;OxaO6%iQ4E+}J!;+6eIWQj(_Sƣ>ƢNzB>_^ZZZ;X,B λiX6[on7a;.jRk{رRN:DKequ |46Kk*ƍeR ]yp8L80MPO=A0a:d8mJkKmXNGm_u) -ēcR~rμZMW0;MS V~$|t6vT[[[s:8qGQR<֖^1dPpuM(c:ZATJK[;oYfVP<&5Ht^8IZ\s-aD͏([<#XBP3L MZ? Kk_w1^x@ÿGͽg.yG~q "\WRp1k9w^$pߋsM?faA P<_Mw9KyGƿvq$=Zn.`|we_ȢI*A#]pqzj1s!:g.K?r^ney)3;,Tʰ%iJI~J=}⾮-H(mM`И,e2 L"咍2%J̯rȡq晴 Wg4ۆ駟Ne˖-3<J!NcA33AzDg0q6v5gQHԩυֹB1\;1<iZK_.;hEw|CCfZc=)%cvPPPJAYS-5^~t,S FZ_kS-ӆ~y@L%3hCLۃl/;)$TRi{L<5)4$rNe@WϘAmm-Wl]~5}MӰllB!B0d[uu 0c ΛG-hFcCSdF>,˖-2fN<;/nf8̝R>'aT11x;r+Tvssbg+lC^P0;'+Vr ԁ8v4]EэLm[`_v38WS3H %6+հ]ͱ`"p~Ӱfk+(X8O>yr/zo?`?.ഛCmx;^w<+ N:BZ%?0VV\oh Q&VHBSniDD;otj#N)Euw/^۱$I$P^i0%3-(SSh~?WvO?]+?UUcCgQc/ 6Z[zOWa;>J~ڲ-[{z++۽b%Ax k7.#??-7*˖iz L1]uQyh;mg/dB0V)@kk+L/bLkiS^>72~8ϼ;N}QR\< 7}"_Y>Ìypw̲/x#;"ޝ %']E x{^ɭ<+|p]|>AI7>o}z WQ$ڵߥ2=>XͳJnսBg♏NT={)_KUʤs/> ~oOrf~Ǝ3/;g%GWh2]QGfhʼn5Qx#U8cHFRL(O9 )Gr5j<ҟeD4M1c+d\EE/zqQ]Uۯ ())JmPII cnjgWo`񔔔 QR\̘1Tnȸ8x`77nŃ@48~">;oS'Պn`*q8|)7 ÅnwNSc#r .;)/n$//蕴|o@sK cƌp ~#~[EGg mQqwhcOnz1 5#/}ogѕs?nvC|ʇqMGSA∿'qnS'\qxFǞ?X~G~>*k9,:nAFdO ╜rR]w 1٨|ˣۗ}A{gv6n:H`wq%R6h`*qF%-R!RS Z ҾD'lѢd#LN%J4}1chlhW7oW[[Z"{;nnfLy9=>3(g{zZ:m}Y^inj<JKs @x@g^6NKSSd/?/+(ʠU8fTUWfj.\HYY)Q[g+?cΜ9L0c@Es`Da41BA@Ѭ8[;^A7!łkt!VEhm(zEETB7 ւѸ, mCB ڛhPXQSSQwoիe7/߉Ea TlvEqzW¢BxzF2ZFP?hFcq.l*A7n_dO:sXP#ZݕU30z tNtEZVlNV0 '!/ހ=G"m(qFL'sh0:+%RhHw}ԓGctiH"LG*۷oUV^{󫟯9ufq*V^(?[se 잶WYNrJ̙8l;󜃃ai1HIr ôQWWG{{;555~v;ƍrQVVFAAABkpN[zO;rh;>aٲhBgϛoA9G/QHvD&0JMTa*UJ|r1&NLԛ&PXډ)_mkkߏnWAAį\ ^۩ٶgW+??iݗ"+*Rh}>)-v\x$9^EV x^LDUUN'6 ]דnO]x Ma@h|@HVLs2#vLRg,cL.^LG K)S2 F W @մ_xb,]>;lh^~THv8N+8 P;͎,fwﰢu"G-J6Bl`D@T*@S6M#5ʔBIdn#Pn7Ġs4 )5nK{=śF?-z*.*yN9wbmDLWd*]N?mb>$YGmҾ]k-%XW<&O%[Nh ixĀd{v${Mu-\i"PniPA,̤6T|q>]`ӣ=J:X36e[슞p2g =:<#HݿO=%;fJ :Wkgmbg@-繩{GBEO=VBzO[MHcXGhhof)Q_E Ö>t}t/lDgk{E;]I7 *O=އ)zԉ ]v쀋;HA4J/:s:|swRNi_==h9~+stLF׷U٭J>8&Jφ*^v8ߔ^bӨG-Q3Zsݟ>(+QS_}wsDwұ"_"o1qku{1n̕{.>!6(mo"}fs2Wg14&7 ,YsJ:#`KI m$^>zxv3U\vPJ܇3YIt R:Uw^o1ۃU"6D2Vא ;YDigiZC^]TmEDhwJ|{1Y]WA10T ?)I8x$pp)I̤H0D3 + IDATla%mpiaKy$!H`Ji˳~E{Hf@ ΉK㏻b0PMgKO'9"z~=${S" É(>æy&&`/ Kl$,ެO3ٮAlӰ8ey,$mO׶=ݟd;_v}ph,Gɸ8 rq>MM$k:D4HdDtpLP;0 KpQi H:9D/DT&`* %EĻx"I4KG:/eDml-K4Եmڙ)=8EaʰʹAT"ұmJѨT@ja*aJhVJtz; HC Ii6K`UXJݝ-i( 6JDT`*U3]Z$JַK؈4˘,YR*5))Z=  xwdHHN!20P% U)Uիh}sJ(EErJ$8|Jݾ'tQT}A*K ;d (II#O"g&ۓ@NT!'m4DuXK#. a7݀yTRT@$T@Dxm{BξJ{yvd ITlRHNP.ATmhCH%2.J#T%@L +0bƝ!Wz2IG;D&GmDX4Tnɤ@*YJ8(& S!1ҘUR. _jƨDmkk#P9I Y8wZZZXv-^ R/TQN'̡hT@@*W*6Ct)sPD2ɨtM@R6`FF2#Ixܞ GqI Hw(Kn?>CA1]4kZ6d +#-4o(a*.)$&t@&*QJd%0=<Qʕqsv(#K#dIH$8I|gꩳxtCU<`5X(&} Y/ YPy֡LR6Id؉8Ce&O<t؊q(Ûg'w-bJW$%LKNàv eg!臡|>Pak:/"| _wfҥ7RRRs_}3CZ 2Z&VɷQ :& %~H j&&%=x45S$]p"HYlPI@4PU ]q8Zhi|a@O?]oiih&)N`0H{{;ӦMj_٩^*ء)K8-Eݏ>3(?l7݂C[Q]W;'K;9'&0c)Q:95ޡ6ŏûW Z LEQPU5T$hx}>TUB`ڰ;((p|Z~3mhN N4͎yTÉAQԨmnFE7~ ޠ<:1קJO''Oǔ8dg'\}?<_#"?my|^{4Jj呻~CSԢ|e\{u:|upXW7̱e^AHO2)|^E3 '84l6PՆ?Bbfwb۰Z,hk~?O/=\Evjp2Mkgڬ"VS}-ΝDS?qv8<.3l~~|i.i <}Ųb/lűs O)wu~|oª>G`UYzvLJ)NؔHs)")*$Fn᳏C=&)=*** Mu,֕n+'jvj^yUmƋ/.(fp#1+0q:iyUaMlIICmrc.n1IgOv@YMq.=Z)jy/#. bAE,C[ \1._+ASsAc55M:p|pYxT_iT¡0]#4aXX,lN qM%{gÑGUYoNqJVZ̙3Gx3=U/=I^vN:퍄weƨg3(:ۀŢmu[%\ Oمbݬ5 em;lV4%{޹㥥2D΁N@"h(| hNyY)VK$10 ~ nNg,]Yf_܆zJ9;@勱?zc#VEO&50;ۡ(j\6#bk74L({/X4%# >~9o:ؑqd8iRELaol6Bљ0a7WOsV IKKK}Nq2ӊ+X`Aw9~ :_SNEW%Si7kb0>9IY/v*{Åâ)7{)SYGǞ> |WCqjdF$>*%V\;`HiF8DjSXT*(DZﺋ|YJKaa!v0t.upjnnFA^^Go;6fBBM'}9Xr<1%q跿ꕼJı1ra{J(S9K(R3" t7;)%h䨠 @U'6hjj" cr~w}̝7뮽х6h0c$ ldĉL2%gio:urJ᯾*t{մ . 'iMlݺSy[FŠ;תR($Iůֶ6L?h(͊n/SOCh"tѱJ |WqJ-i&&y't8I:/y À ߎ(J șgɢE|X,:>!v#QYN9NI\_~%w7v2\\l9 h˾( yj%lXTW_}.K0& ,d().Ib ϟ3ҥ3g 5!%MiZdep˅祡Rg-7^8 ϦlMMբ簣DA{{;%YMuK9L[Cvl%b&aCyۃD,xYmoBx잖S: 4R)4 ¤(w?Ą])Rc;Rhk*`UQp:X묎K4@6p~M w NY멨bI>l')))))~7f*^Ѹ>mm|>pdQF1jԨ!ms8rG9ߢ%`r))t sCJJJJJj3yyN*7njV #n7uF‡"`8%:p”8IIIIIIEfbl5t>uB}. fN:$ڒGal|"JJJJJJ*ǵ8}z6UQQ%2h|58I2u~UMNqRRRRRRrGiF|?@SNd`Q-IDK K 2yl$#NRRRRRRRR$8l&SZ2 n~_ {M/Ғ1(κqn:RRRRRRRk,Gfǿs̹ϰ &ϟEy^t,CL&hXRRRRRR9874)g׮g[;98B+cvE1%LXz+c]d9_rS(-)fgۺN.g+O'v*|*󙤤r|NhA9ٵgKqw<7>8oBJWs蒯'payL#~3ߧw%%$fgy/RLC'3aܰBpX9)%%%%%%)3R!PǺAjRq8g^am L7xYl_EmfwK.˱sN2ô&dߝ&@+y j7 )uB +LJJJJ*{Phd97TM<zjv޽y_anMuq{'l LS;:W&dGǪwnoR+0pCWqoFȃp`0Hii)}(+ʿ+f/noՊ߹2^_}$yv.f1Q]9m;}P0@kkʚ6&MbÆ\.4-ݏNʼnC7콯Xy#`xھy8X pǫO2;kO'Zq¢ƒRUE<X32NXMYY9@'`)))) 444PXX:&֖J&NȔATUUL2%a}vmw\_AJJJJ*RUBsƎ֨%_" !CSRRRRRRG`` Ȁ?$%%%%%%%%IJJJJJJJJTp|⼷ݲc$8IIIIp<~\9jK9k8sfsw\))ᦴ-G6xW5 gsPV]{Gsɡe3 ⹋xu=j!?%?Sga[0E^P䳭;x:,CJ*Q)坓2nn^\9~tboyᯇ),_r1T{1yu ئJd뎠m9؏|9IItDF"NUD$ /0\&]*.UGl(Dh|ƘrО6sMvm(F#C'̊JNՏ~W2~SnB{Ѯ2'0s't ;Aa䒇~;Y*z1󎿁?_7.yJIe!D[k[*++8q"/s3YWo0I%0y\ BYӦiZ$)@ B\.. puJS!dB΁.*o|GNSUUŔ)S.uVs/啒3/>'q"r[( 2e˜|(vMPU$tUET4UDt Ӥ^{HCc'x"'q1MEQs+n.GJJJJJ*v𐧙RZ$ 0L* p&$p JqI)V-v0}O?P` PԜMRRRRRRYYCV:]&)еHIӴH4) p:iwjX6 q8Xt<'*Z[[i9_D? | 2NֺcM`&aÌL)*U2j(vv+e{Lss3u1ssNbT(^rcqUJJJJJjj{9h|UU0MVt`(V'v?naä^\ٶm. |~tq.o; DbT)ᬎjѰ*@@,V;yyN\=j7ʿ_Z,Y¾CcC=.W!2ʆËHt 8҃U5-V+ "O٬VT{^a1߬Swg1AʍnqMRRRRRR\X@t$m7tƕ:1i!|Axy뭷B*_v9c*&`!v;ݵhL2IJJJJJ*;DLաDک8GQcҘb4Mk mm~|iaz:|At]<@X10Ai"k/Wԗ')))))S$;<'vbgkS  a[X yNv+7^ 4c=8 ˦aX,*EWxIrTzU!0 P($;#mD^639xnw~gxeCa Pf0m%LDUUz)^}UJJJhoogŌ5 ۍ!P!4MtbSuRu0a4MCմ+ʿii}a %\.9ilhjC~NSjPÁt7hFmm-~;rsGzѴ+YTU% a&IVU .s2ֶ6VZŴ3(L`𕒒ok+Wbܹq]a0mt $NLAv'\6"N"'rz:*M~&a z=obJKۍa0;^[igRI1ׁ%̦=_RL}8/iu?N}l{A8NԩS{I, HJq5 N;A-a ( m vga7nkn۶Uaؼul05x~L$?A w\d b%+Wde\5Mcϰ`9Ӵ htTgOؼU~y~uXNݛMYsi5qxK%\Wٶ}|B QhS-^bid?{_E=5BHJBW (EqVEee^Pw\]ؐPtBTB䵼63? h o>󒼹3=s%wZ{G.E޾?/(,:^(?,f'xw*mYq R\B d)|Eʇ{Dɢx#f\G3 7=p"䛏6TږXODye` !!k$_zRuסP_NZZ*]/Owx->.i}.Kvz92pgFnv6i+yHzwJ%-= ny3Dq:^ k?QS\uGht^Iκ=˩ @JjGRRR#ݻ>>0Z)A JXVtz=9/܍jo3Mɦ~s yˁ ;uV||J$$ߏb#b6Μ›{qѓopc~/ҥKs07|/V_.y096fct[YoVdk9|7 0-(Ǹ{o,+y#x3voG Y?gl?z=ů;rYEFe6eeOnaΌdd[J:ʰK:r<ܤt1)-_Znv{v9kbH<^V{ _<̲=Ĝ>q{E|s0y nobeq&cFnroԣY[Ot 8'TxyHwRWiJ:En˓5)O9( d+m"w]};RWoOSnv6Y'VvL;ش#FQ9>^ǿoc OA߷cG}:643-q!P/g} ѿOE:٨"+H$Ixjkٖ_ͤ0ᵥdcHlMǗ;s{.%ݦA40kkk@C3|_w̭N7KBv%,dI\fO%n _dz*2}pw&EY.H&\ DD,pCo RB ./7z`dO3}\g^3sB{f@O׫Gjޅ;)VvsNWÎ RG;}K2iØK}u \CZT+sd1w?Xjj׼G:UX"~f/-Ak3tT6cqq !4GEGmw1 Qy;[| ,9"qy.lwӟ Z#Z6b'ƞDNawWu6CG`Ja]_VU'txWѶ' SEd̠~}?{SbօcT;\Ԑɮ[TKf&$Aܦd7XY@o#m/連V4 F3-*ekqk!:Z*|J]"N(9 g"9TҨ,1}4k`QtQV; != 9EV{ʌG0L!H~\`k_-WYV# Sz=_ ۫ǘڏA?esHqrAIa]fXR(ʪR\7&c,/.m^ܸ!ETN3ũ٭UgoM%BwZ4eBP t& B%8pBk(\>WwneJ]s}rC0T6Ԙx@=84x$Q ~P={?$ 8]: M~Nkm譑"ژن_n6<04p˹3{&Ž m 7O,<7nZeV6e0յxi5h" ,/)XeemD{"I_psd_Q2>c?-^o^w`AVSxNŏ6ʯ%pnT>L%M)4܊DͦqԽ<2rmA]2WWbU5AvW!FcM(M?FtѝIcCA-Aq]iPi1e?q\6WP A{ZPy%kѾ|j1DhsEi9bVuM~^?>Y! [q7osa#CN㱱@Џ\{TV+RRdݎ"ZXo΍l*xvץ@x z{$r֤qa6As댂!m,'汽*H*sXd#5NթY\hDi~>/}#62)IʖKavG W R-^pURk>(RwV8om Gs<v8$P|Tl_ļ-(221 ˝;܇b$.O%ݗ+{rBEpV[p(/Ϭ%Ԭ१gюrj~w;ruB;*^r˪.$D &l8>M@vǯngW4AN|B ydP>|z]g?`}opF_EWNb}tv3^Ď27*vokL<sEJ9Ro0]QxՅJK~8ot65o/,XU# C5>2H^粵2Hx+vr* %xzgnsZ>ΝX?߄SlN:ohI}N: T0ssЇ !=/'HT.ys#8˨1Og{2~m].[֜L3{S+>Y{b+VCXH{)}ϪcRq3KA,bMɥfR3s޼)=X9K3h,<>38'лW:CVuV 1{tQt1>y_]95+GQ]n& =n~9Nj.ߟAmӧMHx.3֮yǚp8k62"M,~DmO~RoJeCp3+ bfZطč~aǹxS|&珛qìK,N 5Cwoj|Q=&Fy>Xiss;S ZBRs3waPPoԳL8_KSO0Н>Ǩ 7')) 1M{}j+it7rgSTTDJJJ`ݻݫ'nY=^QrssջF۹ot3-jpetС>^{p8˪(bXf hbe͚5$%%6zMkC~CbH I!m(I#FXED58 j4Uw  jNT2+̳Oi~ F#5X6D86 'mw~6u7 Aej1hd׮]a0tuܹklr)Mz^;vp6`T\!NG"q\'$$pl{2yxU)WE!I>*\.'Mh4vlvK,!--Ąf=om!//cw6_dq6J-UneNׯw3}_\1TdBqC1TT@ٌ<'BHlt Ǧ͛T!OQN'4zn5ŵcY+ΊR?F~@2b|"=ܶ&@P*-Q΍SUTTN(b7  ֧n:bh4e8| a> J}l* Ii܍]9!( bi< Ŧrldh4>AiXصm%р& g`JĿngNf77WҶȷ}ro U W gdPZ?T*7%@^kWT=;s[ԆUN3ũgͩX^K#h/L@euQM ((Ans =\R"X.RaQ tJ7sNX:Y=8KuJ,xzMEEEEEE*N~NKRMU|ZBoWt $ "RldDCin%3V x.r-}'̈́FK `ܲiV!TIEEEEE$)NծG~,VM^;lG3Ip\$%G%jkShߎ‚|C~:@PƤe f?(cЊ'nEi>?(MeyTTTN.аpdI"9~?:аp5Մ1)N#tF-Fv 'dp:I ժeAOxXyX8|[x =#3[Oh*\f;w[Պr.n#;a$ Ar-q'44=v 8Vũnu3B68>_P]k"#qs-:.rR4 >@0pL|^@1GcWwy[[GΉy}M'{q8iE;rXF4O>ARo]#W#4g+vC2rQ9TQq9+ZZt*Ŵlt=\rmeǸ1Y6yj>/flYʂo0{l|@1+2vΝ9ܮ+\?oZnO@*7g6}Ϣu8 KUlko0/l Ro;)믔VTk۔89__MK|>|%p5;:SYyu/kxHo3oƢ^=JOgWR] +%x8v~ɭ 0+!᳤;Z9ƍ f=~>K OuWu_6 _0i6;v_Md Z6w:dkٴX o~o^e6z a ~ֲxexg˓U+zy|pD>kٰ~sfgR9iH;Xq1f@ɮe4j.=N\V.F+;رl90\6n4@VmVҕ FcE= XoeX3R^k<*TYiK)WUqRicfr-x7%u7߼x7W\<îgY*]'h q | ֢u-K1q0"2y d4=Y[W84kD0WtYlQ9ܳkʥ4Fq51gBF rPZ+'ѹcX!M fD#.$3ƈ+uM|sl&=p9ôYhgR9YAvPTuVB , JɄČtL7Rg%G0dv !$G!kܹh쮱 6v\/N^8XC^̸aVTrU'n*tǞ5@ai9?z"MgބV$(Cz/.s"qo>, e_vP w8[/eOlD}#jA9ZCJ_6^y!+NM ?Dv#/aï21Ƴh 5 Z }uEHJ+  Z՜3PڇF0~D6"LY7ϣ˨6ㆨǬ2ADuŀI'#$9ə(A;|V"/NAMahoFu5XI ]ЛLu16-7z\gD mSR]ͷUkxRJ*f {F_a;lYUO dE LoJ~ፙYw@_?dIjz5bDFf >@r~7C\?g ym mŴtk(DY~AC8'f{uUl*q-a8% !D _gA9PΊw_eu(v4"Qth^|P^R0.i+<3AP||6/3XidÓZ$E!.aǦ"d>]4zrZAvv~P|JW6|'ZŦTe@[SA_AcO"Xɖ{qK m@{=PlS bp2l#Bz A$r^֑}pZS4CoK \ s۰G !=F{sx ZB: bӷaN^细P SO ]O+/ὨP,7קrWQz[̛,t:Z- q+c;9<&9 \:OxUUg&];w`h:Zw٬6nب*'sf7ye.;#'zPq8}eyZ3FS:y>c3@'(Ȅvh7OTe^$IhZwϪL"D䠌 +}':!ݎ`Ťw$!1صk16guj 3S,W+_3Q)ja4(#4$ɄߧƬ? F^ HJL>e3Vq 8VsAt4x$| zx$`0Fҷo_ (>\Ҏ/`#"FLzH]#T|lh$&&AcӦMNkX%:* QVQQ9=NHH+W 9%L9|' ),($6&)}}4HB}c[Ĥ>̽tj琯`h ¤rR'z!v;p|ZU(ф4m*=q9KEZ%vnZzl& rn#s{#~.q=JSlJJ +WVKdd$ZQ\cDHfDAԡ1ik()-%FC8tCp:DҡRO $d"4-k5Ky9YGOi:V4?)+!)4* Fl>\ۦ E@DӡX S1k׎R˩" -)BP𑈊QcBXZj{WD0_j t0 Q^${w11իYIfԕf@qdڠ{AUW?i8}=k:3YՏ;,tY}b H*˪{<,giV{MVVY.7VP!./Ozep5;:[f9輖O◄|r{gWR] +%h8vւ\IҕvX nH0%|X0vã_ƺ kX4roՇa BVYWNG~xTyc-ًwf/Uœ_`D4ϧwN ռx-}M/(mL1L?ay :&_cky;CKy|VTTIUxIeCF]Z  '=-ٿ?ˍ7*ى2!K؛WeȐ!T6ŀrXhn0kӲeuZ-~fܚfK/MnIͷ/NoװC!۹!Zb?rc~i7&NFQDӟ[&vl&# y_ 6/fH3sm㗂YeE#. 3ƈ:XǦ XgDoIFDm$}o΅|ۊߜa\jBuhr֢ֈ_N\Jk%D2:ḥ/k=S.!ݦA40⎫85J#uj_Ť.sA01M3۱OgO^9דԤ6(r^*M mSCc[` A@hZf3))l߹}!I~d E@'gfSҥAm*MJ ˶GJw~[f ~-k֬nbm6͝ xMkO hQ}zZ_d0Iٟq}H6#h B98p}`iG^FfYpuA\}wKEv xv}[{A#t8ь!N0>`"&&p+IsVpX5R][@Td=l>TĪ~:Û3g2v8f}),3zvrx9 @4'0kރ/s}\"$g;2li!C40:83_RJڕ鄧 !S/w=ϙj^^eC#POT|F‚P|e,۵ h0h$ҡ|JDoǦq7e{k74ڡ !. e+ڵ XBÔ^cXh}64[&dz?ZutŪt)NTwYzs&^s= .9T 3gaŮRu>?M'uQ f(ʖK1OFNlJy?;;m ~X5V-A9~>m$ ,O̮gc%X_cet4=ܬ5Z|#6Fy-)h!"̌FP)D.Ձ}JJ=y1s#ģ!m 'a{uUl*q2沤VAQs#j׷O(]/}j9*N-i 3dc0x1 F mt4ݎ{7.@׮A7jFYY>Q1LF w&??Ndd2a6ZX,V+& QTh78ɒ(*Lr?(DpWSq7 1O>i \\ɭ]>cރ_AQ3sjol#ɐ-GE$r^|y41 R>|_R/\O+/彨,tMfێƃ.ùId_Xz!GR x^cy|S1w2GVPC@a7?}4EO 3x4/s/(acӀeځ_a>Q*`KǨxMTn2S/p됧pB҆sk]H9epv'X;O^MvSt:PYYTWU$&&6SXe۷f3bDDٌ12h, no}p,(,F9j4MSvNў=o߬ EEEӁHO>(HĜs|e(Ш$"fիVrBh_9V9%Gj#pUDQbu -ի'11aaucQNY:,jg2H-(Q|5H~~!qqqL?,hp9Gt:-hDKPQQiKwY&M1Z;w$:: ͆FӶ6JJ[L `2 ~ZN!:{p|vIh4(䐽qcZ,bchTUTTN߉wUT3^ "Ei *v/cW삽aD^B3PB |ydꚙYӤ$'U/8eV$'A.Sgip[ILl,nx|zX"ROUrO<j]j {Ú>h"NG ڵ$ƴyĴ30h|\f4esGj*0zx<p}9~'寲%<1 `ÝX/>=<û%eY&9F4M*WYN+]ppzw)ݺr7m =V7z;-hН3[ʸ(t~GE }{xP\cU /cLPaVD%|.-sٖIDDDl˖-cيM&c |{}Mc4s~#>{+bU^I UN 1wrAaGx;bDcGyA]/e֕߱~Gw}-0Y凫4KpN4ZGr©5 D􄚸Gd|~  Ze]&9S8WTVd LeWtFjeR{y{㩁c]-2ȡr*a:LϘ g 6}E{^QQʶv>'""IY۱RL8?Hx||6?x0>K㫵y$0ʻewm0P;Ӊ+ DWR*K`wV^MiڬE/#g\`t9ԹO[OUOXa;R  X~=ND]X\ BAjԬELLL)++[rp: 9 W+0#߲a[-y~~^' ߪcݸqKTƟy倓/ͧ/S0߬9`Rq9Qc^JtttȯT-+ U((""RGAprئ%?`OAA|\~]qIϙTTe*^Nv65j& 4n  FMvlJl5=?(" ÄuYa î6Eo0-0ر#H5*Χ/SgoW# b dfgnAKyS5'تuJZJ U?fW8i!U8¶m*/z'*l CNNDFF ż"w?~?Ԅvo'= I+9%jD]5fMv՞F2YRFK^nA[rpӡ۶m|Fٶma.d`矟ºuq8teĊϮ7qV}&t'9϶owl})zF5Z5Cz"l8#4C)*q1[َC]RWWzM JZ)EUv'̊Y0MʺuQ&))):,Ax7w [/aVv}t|+m?}ܡ=O>aʼZtWsY1]he2Byտ}1bqީtЁ-9ܞrkY,|C{w}?e OKï+s{s?z+9@8W^ {!SG㬇Y+Y:ctcz|O^K߷+M 欳.e;)ݽ"Ů>x J˷O>y;Jc3#9ڧt)}c/< Wv++ ۯus<|vZ$vXO?e%0zh\nWjwc=$o7囲W3j2tyK{[-d1cFyo~.,/ 6mՋ[g(jf.sQ۽ɟPWk;n074|;?b!Yp?3OO1n$3f GuO3 f4,y)|yetT&޷gG?/<";[K__h}"/ړ^a.`k\y%ֹ۬x.}6 ,dqCDg;ŭ,,݊= ]?pjb碏x닥d)8)8)8IUqfdg4{lf#NkIdde(#*[_{t.<;'q9|@Fbkmh7b/b+?˭mkveč}#=,,7?go $е}R 6W\Ez^sfFXFg;5՜njuDk o C>sBM/&NO8=\,y-E=X1nΨ[ϡUpDj+z *#&;v\{$ uz2V8⫝̸_˙ D: N=]TNZ( J^_E/p/y'k\wcĘKt~(| G`+d[3>-3/kyJ:J5n% Fgi+~rtn mZ`~) ,k!**T>C +n:e~u\|\ X;XjxaM|b33NȆЮMdEէ^ oRC!.;x>c9!;'.d+XjϰEHkwi} ^g_;M׾gf8 BY8)fl +!c"_z>Xޛ G(;27Y$7EשIdICR}a&Q?*UB2v:fxo2{5s?YLڛd9̳M3VL̀;vt.} wTeYnv_/<%e> {F{bOUpcǩ[n,Z6l` 27^˲8hmZ/b@3#q,Nu]\vU:vyjPk4ޒc_m4>xЋ(mn{h=&<~?c!WܿXo[[Ul'[ '33YEX2J_%E{71f/?zMjuĘww\!qeE7䀛672ɴvx茥v5XrA.}%;8j8tJ*]n%AS N.1t93&ի͛ynd|>;w332e:sFN"k ?Nbӱ~ɏ{?yf 6-S?ZFݢ[>敿jгU fLKzZ+7ѰW bgs&0̝rDbRFp)]!vYg_!晼ŮŊv;Wר^?{PeP5Z2l \o|6ƃwSe@J6a-\OVLO5"qGŗ]9o#6$,ڊ qLv8YXJsx-`۬8mǩBS˴zB{pӴ3&w=dddPFM.rs oU6#8oҕKyPW<-{;]n&N~M"3-=ŸnK0Lnt?1\H_̭Cn塋JR5"ZҮ}u~jk>:M?ѕOOz 92-䖧ZӤ{E923^%^W.p1Ӌ97"i7^:em܇1OH .%q׈lE^qd6i"ƣ{H;>.WG͝kw46:+ޣtIL>ēc2!gugnDms[FŗfWvVW㵰^bE)ĕjTNO;6kB{Qdɝ:+B!֭[I'w"';g4MVLsbF!4M""˯4h@T,~p)9wi +X_egeMӦN{жme4Mm àZ\z>򛐠'9L5kRvm>iYa/NvVVd5oJK&!\~/M!j9zF8ccUEkqr-u(۝Ev!x^/_FB|<{p]"#u2׫ah߫_^}#BX8n4޸վCb…**ܶ6?ѫU W)خ֮]0iۣrN" &&hfΜAӦMW~_jDbbbpש(5<ȇ}J7hܶa=s{<m r}.]bPp#RF L?(QQQԬQIx^T=)WWg'9L$&6CB|y>ǍzTؙDO*Fe9yVp#0 ^/2gT=)YI*4@)x'Go$""=)%}rEDDDDIDDD|99oUoI9۳]Km [9XiIDDDDIDDD|:m BYNl'9vB! 5k"&&eefm.Nv]Qp\8&/7[ .nMXh}WDD8$GTNv65k& -Կ` H0 f-rU""$Gp"+;8 A/ R=!laKZrNf/h`% ?fW4D䨲Rݡ@o9:ٔmطض]ȋ3,+' iґH > c({]۾33Dx[\2mNy=m&>=clrإY = RoIݢ͑H+дtgK{'6-% <֭[K.*<9rXZr}Ղ@*&9%pצMeݺԨY{Μgc'ұ#Nϵ x 9S )3tK,Yp<^zBJJ'z7/6j!ƏOהR:a*ozxSzT<S:{e?NA.)t/[YX4=3))):BU=+cp:6[o'^ra_YF#[p's酜7}.\k.7W72ի#7wY.Օf.OQp9T'~KaѸܮrk|^a?1|f6&Qyy!SǼr]n NUL~4o[C/̟ML/bfQ<|<6 ۛ˂7e\rh>5fdG'ex0[ >=ϻ \M.~m>S:uO>{]<7Ap/o&agU IDATs,*Cc,'>~1Sm'Wn!Vv䤻䲺t~S~>$"j,OQp9lfΘ\ަٳg3q:\sH"##-.UN/@d{3>-?ycĘqSYa>a\PZ;1 7M$ĿsچkG] ݕ?`iޞ)hszla|h+925)PZy'b$s߻n;VQ&4BEl|-^ٕnOӸfxsLtAKp\᜔=;˺] ܥZSD>$`>S,X\CTT|W\Aݺue;#0l- wxϾ:w$i\2f.iG(}避x~< H&g?*ԏyHx&Q;r 5R;i>M\g1 n2˪Ϟ~`8 BY8 t 117N7f(9 ,Iu*ZG,p_#z597җ]KޯJE(87$?}TؽHvvӭ[7- 60edeY 46[8U/DQqR+AЎgsm+IQ+gac61)V%>7$"֣AT1!+L;y&:w9[r°oI[>v^9 >Vkᶇט>o]ozD6`KKg%0~g4B]#qvVfGR;q6Βkl(:u|fnp:]T'3Fr_GPԯ`d؛W7o)|tܙO?_Mv֥wd,J^8D9WI n:2C6 "p4'e;vJiϕܟA R4Cf-?;V]a܍rf_<;e}aҤx{w4 Y=|_-~g" qa=oI޾ߝ܇1Ul+gO]68ea)|6p`;s_~yQ=ijwz{EbTkv/=8uW~w~)F=NRzLW}^9Ӵ3&w=dddPFM.rs1~46Gt~[$67'} ;8]] Mz -RS4,] dؖiR OLTpv:7+8I'5H'[IDDD)8(8/'wSգRWmEDD RHCIo9 ڶ"""P(8(8yyy N"""" M'>OIDDD8ж-^WIDDDDv[DDDDKu""""TR>>rm@VDD$]luNDDDX/9aw¡0ї)}CDDjҶ zNDDD4^/Ku""""$"""$"""$"""$"""$"""$"""$"""" 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"""" 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"""" 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"""" 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""""$"""$"""$"""$"""$"""$"""$"""" N"""" N"""" N"""" N"""" N"""" N""""$"""$"""$"""$"""$"""$"""$"""" N"""" N"""" N"""" N"""" N"""" N""""$"""rƲ,QƲ,< BDDN >>8ٶM8& dK*xÁ3CC M9~6o kҏt\I.tQ҅'[^[[n) ,իOjqZ%ؕ 1&N8T,;iu/ yxyL\ng9~C$0Mlzbtlkmi"pG6m0mkkTi:߉pPD ؒi vx!lq2 -'']UDu̖[i 8ަøep8ʯMJQ>=N9948.p8TAp*yyy8Z_\8\ܖQC;Ti6ugj)6Hϳ& W5% m;_XJZ.b(z[ #muZQm!'˲!!>_ަkӣirC~b'7ZeQzuRS$A؆l_uP+.?,zգX_6mz[N/;eعyјn7ɴ>܉.֖Kp CAl.P,IMܾ= ''%о鸝&P~"$É'ļ7N9,Cg N"easLSZ[3aRڎ]+CKkCF>CFLDLN%˫׽6KǍ#};jEt͚AXo;LT]yfyWbeiӆڤKο~'69Ⱥ.tl tur2im7<-kVfGbە N+aE&,ߔǤ6ucDz\x\Ng.)cS29r`k.{;.߅9—%b8{E,YK oW=e[0h4Sç/*6m` /GSzFW.zRkoԫ×#: unN;X8n%wfMJgoHy%X7bYP,7%_G_%ݼ3OϟF|wmUiXVj6x..I87tjPr ش1MO37-{'ukg~ճ3[rDdpz\{<}{z& %..]Yuye#a䋌~2c\G2LaI^z*DS|}?po=-;M`FIbtjFĒ-tCl%f{枻2v:4u:=ȚӦK Eƌt8&fU_0nIp8,y6g΢ׂʛo\1ڼ` HDR ƍ+~sw$*OMx"Q~\?)%;]b8g4I4iӋ+&Pӆ'N!gһk:~/[m?}I91M7Chw(+S{q2xwnrһM<nGhw {XJ^J^w^ƴyX\}k|–оoy<|kn[HU Nӿ_ >~Ly/?kF.QF^?ﵩs9-W^fӾR%}:;{֥\}5i?NsrXB\u5`%Ӫ ,Y2G,OŌcN3wٕ̠~vؖ9{0 Y^<1aXLj+[3-nYr!a=ӟ-Zrϯfշ}Xт1iLQQw*eM upWI=vR<&OdVߵz5A${.;XrKY`}|vyv^]4ûmQ'QpF Ě^ Aqi.øi兴2ޝ^;~Vtwniypqɕ/79"zqx[͌<"Y} zy#N1{7 |pow&; |_6a߿)cbݻa" #38ĘZ2Vxp3ix\n#hI 6‹g3:Zj NY x}鈫OBTnΈwځݓۋeg˪GMΌNn.Uȑz*+֬qF\4>Y~22#u7\Џ֍j^\5>.9^^K'_t7-q }m"oK^y_r{;&~;Ѿe]^uT~^56l[g-OAK\pkuGot$4up?N]™kxc`WՐ[L{a_^>q2; zOxC嗉pD: bmt'Ǿ_bȦxգkZ=B3cn#`7pY=u'&eW lk+=NNx"<{ kD0^/Q"DFxp:]TPk Ʒcb'|u6~<1g0WD*Ap*ag|R,"h>)4R={5:uvp 2)W=<6wqUJsK#ni[/ٿD<^5moh*&m4n}7||~ǻc[4eXKۜ2qL۞z$VUn7 ldzÇ x`IDAT) ov2^~pF. ͚?N';1`|y;Y<=v4V9h|\<.l`95C8<~,Ķ|l_3B8Yvp.64DyDyDz8ΒB:)F\ܳ\x+OmC8QEL# S9S3Mˉ^_D*~DQ];1!~3 G8=Mc}t;]U$y=]Q~{(')RnO\8Ζ,G&'ҳz[GOĆmK?VfL5 jQꉻh1z~NupuΧU]/8H)"Q78<|x$|2{DZy#Ļ)*a&Lg/ݽ\pJڵ̠1SY<\ʝ8˰q_>6=Å׹kZ7k+=B!6lȩݻ]o8fMtɲ`4&sLá\0Yz5k&deA ظņ@xAKغuRrZ.իWc::2;Dz ĄY9_Ogz!M"Mԉ 10\oУe*1 }\.w}_@ pPj7%Kݸ vmZT^M-2s[{ȗ0iilٺS& zyi|-;4; !ZքU/>;]. fHZ5I^áP!M3e&+.,SsT\-8G1ԍwr%n1ZnQt Te8]&%8ǦMٹ3-ZRA}m[TOHNDDDPDm|A,\#ϪNĨc<6ϷSȢ{Zuz*֖[p,lNNnV "#I@RDEGc\'RVMbm溏ɲaZ7e(b2zbtlk-8A)~\|~V x< Co9lJ%3@fαy#6EX7u{:MJs;튭UU-TpGЋKfH9lu4 \IToW:]_uڤ8]RD` ZToN,L$DDDDJ NaӶT""""%1m8Ȳ˜.'S Using &ktikz; Editing The source code of a TikZ picture (this is the code between \begin{tikzpicture} and \end{tikzpicture} that would normally be included in a LaTeX file) is edited in the editor. Example content of the editor \begin{tikzpicture}[x=4cm,y=4cm] %\tikzstyle{every node}=[font=\small] \def\xx{0.3} \def\xy{0.7} \draw[color=black,fill=black!30] (0,0) node[below left] {$[0,0]$} -- (1,1) node[right] {$[1,1]$} -- (0,1) node[left] {$[0,1]$}; \draw[-latex] (0,0) -- (1.125,0) node[right=3,below] {$x_1$}; \draw[-latex] (0,0) -- (0,1.125) node[right=-1] {$x_2$}; \fill[fill=black] (\xx,\xy) circle (.2em) node[right=20,above] {$x = [x_1,x_2]$}; \draw[dashed] (\xx,0) node[below] {$x_1$} -- (\xx,\xy) -- (0,\xy) node[left] {$x_2$}; \end{tikzpicture} While editing, a preview of the TikZ picture is generated on the fly in the Preview panel. If an error occurs, the error messages are displayed in the Messages panel. If the error messages are not clear, the complete LaTeX log file can be displayed in the Messages panel by clicking the View Log button. When the TikZ picture contains function plots which are created externally using gnuplot, the Shell Escape option should be enabled in the toolbar or in the Process menu. Note that enabling the Shell Escape option is dangerous, since this can cause malicious software to be run on your computer! So you should check the TikZ code and the LaTeX code in the template file to see which commands are executed. Templates &ktikz; features a template mechanism. A template file is a skeleton LaTeX file in which all necessary packages and definitions are loaded and in which the style (fonts, ...) is determined. A template file does (usually) not contain any real contents, instead it contains a replacement string (which is <> by default) which is replaced by the TikZ code in the editor when the preview is generated. When the preview is generated, &ktikz; internally replaces the replacement string in the template file by the TikZ code in the editor and compiles the resulting LaTeX file. The resulting PDF file is then displayed in the Preview panel. If any errors occur during compilation (both errors in the TikZ code and in the template file), they are displayed in the Messages panel. The user can create template files and specify the full path in the Template text field. If the Template text field is empty while generating the preview, an internal template file is used, so the user is not forced to create a template file. For example, a template file named ktikz_template.pgs could contain the following: An example template file \documentclass{article} \usepackage{mathptmx} \usepackage{tikz} \usepackage{color} \DeclareSymbolFont{symbolsb}{OMS}{cmsy}{m}{n} \SetSymbolFont{symbolsb}{bold}{OMS}{cmsy}{b}{n} \DeclareSymbolFontAlphabet{\mathcal}{symbolsb} \usepackage[active,pdftex,tightpage]{preview} \PreviewEnvironment[]{tikzpicture} \PreviewEnvironment[]{pgfpicture} \begin{document} <> \end{document} Another example template file \documentclass[compress]{beamer} \usetheme{Frankfurt} \usepackage{amsmath} \usepackage{booktabs} \usepackage{tikz} %\usepackage{color} \usepackage[active,pdftex,tightpage]{preview} \PreviewEnvironment[]{tikzpicture} \input{hulpjes.tex} \begin{document} <> \end{document} Tips The following are a number of tips to enhance the experience of using &ktikz;. Using the beamer commands \uncover and \only in PGF pictures When creating tikzpictures which will be included in slides created with the LaTeX beamer package, one may need the commands \uncover or \only or similar in the tikzpicture itself. Support for these commands is not included in &ktikz; by default. However, using an appropriate template it is possible to use these commands and &ktikz; will generate several images in the preview which can be browsed using the Previous Image and Next Image buttons. The following example shows a template file which can be used for this purpose. Example template file which allows to use the beamer commands \uncover and \only \documentclass[compress]{beamer} \usetheme{Berlin} \setbeamercovered{transparent} \usepackage{tikz} \begin{document} \begin{frame}{} <> \end{frame} \end{document} Using &ktikz; for picture packages other than PGF &ktikz; is designed to be used for TikZ or PGF pictures (pictures created using the LaTeX PGF package). But by using the template mechanism in a smart way it is possible to use &ktikz; also for other picture packages available in LaTeX. For example, the following template file could be used to be able to draw pspictures (with the pstricks package). Note however that pstricks only supports LaTeX -> PS -> PDF compilation, so you will also have to apply the next tip. Example template file for pstricks \documentclass{article} \usepackage{mathptmx} \usepackage{pstricks} \DeclareSymbolFont{symbolsb}{OMS}{cmsy}{m}{n} \SetSymbolFont{symbolsb}{bold}{OMS}{cmsy}{b}{n} \DeclareSymbolFontAlphabet{\mathcal}{symbolsb} \usepackage[active,dvips,tightpage]{preview} \PreviewEnvironment[]{pspicture} \begin{document} <> \end{document} Example content of the editor \psset{unit=.45pt} \begin{pspicture}*(420, 420) \psset{linewidth=.4pt} % Frame \pspolygon(0, 0)(420, 0)(420, 420)(0, 420) % Circumscribed circle and inscribed circle \pscircle(206, 222){166.18} \pscircle(250, 197){75.42} % Adjacent circles \pscircle[linestyle=dashed](476, 135){157.68} \pscircle[linestyle=dashed](-32, -22){266.53} \pscircle[linestyle=dashed](132, 579){315.92} % triangle \psset{linewidth=1pt} \pspolygon(43, 253)(361, 283)(287, 77) % nine-points circle (Feuerbach) \pscircle[linestyle=dotted](242, 195){83.09} \end{pspicture} Using LaTeX -> PS -> PDF compilation Since &ktikz; is designed to be used for TikZ and PGF pictures, the compilation done behind the scenes is done with pdflatex. Using the following shell script (only for Unices) and an appropriate template file, it is however possible to generate the preview by using the latex, dvips, ps2pdf sequence (i.e. first compile to PS and then convert the PS to PDF). LaTeX -> PS -> PDF compilation shell script #!/bin/sh # This shell script compiles a LaTeX file to PDF using the latex, dvips, # ps2pdf sequence and is supposed to be used in KTikZ only, as a replacement # for pdflatex. # Therefore the following assumptions are made in the code of this script: # - the only options with a value are -output-directory and -interaction # - the name of the tex file passed to this script always ends on .tex # - the name of the tex file is the only thing which is not an option or # the value of one of the above mentioned options # Usage: # - open KTikZ, go to Settings -> Configure KTikZ..., in the "General" tab # change the value of PDFLaTeX command to /path/to/ktikzlatex2ps2pdf.sh # - in the "Template" box change the value to /path/to/ktikzlatex2ps2pdf_template.pgs options="" texfile="" while test x"$1" != x do case $1 in -output-directory|-interaction) # add their values to the list of options options="$options $1" shift options="$options $1" shift;; -*) options="$options $1" shift;; *) texfile=$1 shift;; esac done texfilebasename=`echo $texfile | sed -e "s/\.tex$//"` latex $options $texfilebasename.tex # return when latex fails (otherwise ps2pdf below runs without errors) latexreturn=$? if test $latexreturn -ne 0 then exit 1 fi export DVIPSHEADERS=$DVIPSHEADERS:$TEXINPUTS # if a dvips header file is located in the same directory as the template file, then this will make dvips find it dvips -Ppdf -G0 -o $texfilebasename.ps $texfilebasename.dvi ps2pdf14 $texfilebasename.ps $texfilebasename.pdf Example template file for LaTeX -> PS -> PDF compilation \documentclass{article} \usepackage{mathptmx} \usepackage{tikz} \usepackage{color} \DeclareSymbolFont{symbolsb}{OMS}{cmsy}{m}{n} \SetSymbolFont{symbolsb}{bold}{OMS}{cmsy}{b}{n} \DeclareSymbolFontAlphabet{\mathcal}{symbolsb} \usepackage[active,dvips,tightpage]{preview} \PreviewEnvironment[]{tikzpicture} \PreviewEnvironment[]{pgfpicture} \begin{document} <> \end{document} In the configuration dialog (SettingsConfigure &ktikz;...), the PDFLaTeX command should be replaced by the full path to the above shell script (or simply the shell script name if the script is in the PATH). In the main window, the Template should be replaced by the above template (or another template file that is compatible with LaTeX -> PS -> PDF compilation). Shortcuts Many of the shortcuts are configurable by way of the Settings menu. By default &kappname; honors the following shortcuts: Left Arrow Move the cursor one character to the left. Right Arrow Move the cursor one character to the right. Up Arrow Move the cursor up one line. Down Arrow Move the cursor down one line. Page Up Move the cursor up one page. Page Down Move the cursor down one page. Backspace Delete the character to the left of the cursor. Home Move the cursor to the beginning of the line. End Move the cursor to the end of the line. Delete Delete the character to the right of the cursor (or any selected text). &Shift;Left Arrow Mark text one character to the left. &Shift;Right Arrow Mark text one character to the right. F1 Help &Shift;F1 What's this? F3 Find Next &Shift;F3 Find Previous &Ctrl;A Select All &Ctrl;C Copy the marked text to the clipboard. &Ctrl;D Comment &Ctrl;&Shift;D Uncomment &Ctrl;F Find &Ctrl;G Go to line... &Ctrl;I Indent selection. &Ctrl;N New document. &Ctrl;O Open a document. &Ctrl;Q Quit - close active copy of editor. &Ctrl;R Invokes the Replace command. &Ctrl;S Invokes the Save command. &Ctrl;V Paste the clipboard text into line edit. &Ctrl;W Invokes the Close command. &Ctrl;X Delete the marked text and copy it to the clipboard. &Ctrl;Z Invokes the Undo command. &Ctrl;&Shift;Z Invokes the Redo command. &Ctrl;+ Zoom In &Ctrl;- Zoom Out ktikz/doc/interface-templatewidget.png0000660000175000017500000002226011455414613022604 0ustar fhackenbergerfhackenbergerPNG  IHDR lY-sRGBbKGD pHYs& StIME()LbtEXtCommentCreated with GIMPW IDATxwx?5d PB@#(Mޑ^ *V"H"" b^%dw#&Dg9sӿ3BTdD1dRHHHHHHHHHHBQBBBBBBBBBPPHE !!!!!!8dh4VL(rAx&ҕERSS~ٌ\.G.#" Hҧ)}J3i20L:8::Z=FrssDVhN >.RBxӭ _9 F:uՙ$$$$$$fҸy&,jթd,&>>Q,[^2׮aoo\./w܉ö %͘3JF v^&b{հ:OdH:DFFT/ DBBBBEE"A+2"#sJL&#&Pnƪ>f !> N5fVsδjъ*nU䤥qm|Օq!h\# & Z~tM&9YԪl`?GF _jQ KK@&Sx9q0,àa.mڶjZVݻ5LgfΠ_{;JB.!d2dE:-$P-,`R zQ!!o! ˛|ճ5C3BPy.07:C~ϰ>6+KI4 Q9ugE]VJۗ(;6-Z[BTd$;湸d0ۗP 'j@.#ɐ?8!Q(Rmmg+$DQ| }kDRR϶rq:}M;7}vII&YLJf 2Afu% Կ3dBr>[D_gY >^iX#kNĉr|FoᏂ G. O 'g}̘6%_@ۖwr trM0Dֳ]yr-. nWkLw~AyJj@p)+n{ѕ5zLfTi`_O5L\\V >dK:' k۷s˗]ogzϗ۳ŝ_ rOnj:2yxzz>BQD$[oFg \.G.[&!BPL2iDP~tvdHIMs=훴Ep+v{{SHIBw[`d}wj(zxi\FVvq5)** \J",f cB7q:%_aq֌۴981F,&]/C!ۻ"0· 7_d\ Sѩ X|I||%> " LbPllINM&"2ؘh4{ [meVY>x4 .RO G&CBQ;?|˅azr(" 4=UE׉g.XT͕]ǰU^Xa|8X$ E ӥԢv"viXПkxɚ0p!J܂K[IxK=0ځ8ZvYlt[x^Cp4Tr\[ii^O7j.DL<zw64xwdi'-7/wk3q*ލ3jΗ>Ms,^Hюj1exKY "u](Ԏwc渔4 <ҞDrn|tx[3 }43+8CD7ZX-3?%ŶV )y} _DfqhdCjլI Gȴv-Hmh=M*!} ˲ʭioռPw,m~fjrƷ͍?&+>Mf^{ȯne mi$&Jv)ƥ \6\̔v:K^VrQ9z7ܬtR?'Ĩs,ҁKyOZúky=ݻw7=6lX_9KȰSprAZ]B/cG[\Kӽ)4㐛d4 DQ$5+6=8=WpY\5CB1/^Q[^P "h&B횵ii_OGD,Ta#k&tJ[7d>MBp?Ȕ=!NIC# \T^OǪ6jѵg BKƼZG V}h=Cu "X+Ti4Ͳ~%ɴ Qz@$tU:~sXO{k'w -s6?Ba b]GtY@nW±PZƋvX'sʙ(.gk_`:CXvqs_cp%~} b#;n׊9?1EQV0 t=LYLj g*%ohy]dwk4 7xڭ_= "" )5K V>VN,ޫYHMV>v%,*tzE α+9{oY}FwOMdoN rN9GxTG]v[+}׫an޺ٯaoZ*R۶H΍oe*{/g/}Z+Ejv\Xcb':8q4/x6W,o w#}۫~Ȼ_wg'\Xwg)0gӰ|8d8(}\z SM9X0hڮ8D–C ňaW_xzd d&%b65^&QB׳OȻHK0j{1 X|z!#>? AlGC X|b*, QM!A ]j؆orqu=‘G%λW0]s@)rbw8S]7=JAZrZC>}[b[6E/N׮]ڵ+/XHzN~‚ 'FR뉶gȔ(Mr=tK&b1ۻ1_ڵnKydrrbS7l sk6ta}76 fޢ4rU"j<7'9@Dk!Wy 89N :.|Y`6S'OTnm0^Tm0{:s~. Ef&D+nm!s$4 Ck۔]OՕٶ*:t>a/n|k @jʜx)by{0'G#0o>0礒-NòrH-Ww5^3wMc@9VPMc>Y>cpl؛.`R+WrI ߱L]PP5bǭ>r_L K6; l6GGua J5rSzb׶}Ȼ_P䦦x.sșSeZ.bE-5*yepDidl MQ,`>L/3jo3Vm"4NؒCZɛti)>m&H+A`כ]lxg12Rgg"88OOLECv۾:+oU,HoGMZ8뎓>S;Kv[mp=KHnϭY{ֿ6_e78FlS}k~]xzU*>8q*Lqz;۾:+Kc}FCV$1"Ŧ 6B},m ~ 3IGV'!vgq9Μy Hݽc)O'GIny=b7~M]z>ЉoOcu\KwBn2 {g+r3k?CxހܻVw^;Є> ^`X&{Օ??Y{z |4/O%쟄Ť~K?}w8Ktk :fuzzU񋗑-CWi0aHɾayM`zm\ھ:+K>cSwxf=Dd1vKvoxi݌`,#mPg4dݼiXH!KLԁ;7r'5mcN G& 乢+̆88d`}Mǥ ٬EJ&=]`arE{Yy幡P(1}L>nQ&b9`K}m۶B"#F2ׯ9YFUGZJK<8jd8UaV! [˫&otc-6 %;mm%ٮzR8 QωfծDދD4KBO=hң=FfO9eOEYٺK@4q7'Գu{ 4C~ҔQgT1coCzM{hY7%cǗd+cϴ'aZsNY6n`鸉0炍_k-ûJ]6}|r\ݑ]͏x_hƚ⛈-VF2 6wV> (q o1_iy!|Ȭ}iW>R}J3c9ϡeՑ_mp,݂eMY2%>Doe_r|m?t/mW[~F1}G_W{gN%݆*||T-ejPT AfG538ocؗO3G6Y*d=Xehƛ렶deFSJ;3fP[7 |l[\&CKapppxAޓXrZ܋Sd2 "L /\\5 ((xaA# J49v.vռC&|"&bym/L bʊ|8{ ݷ9bAMGAAI}5'8t\Ł/`_~w[shS2bUO9/e^Aq% dNߝY渧*oO%RI,}Xz-ϨM&b7uźWdb;v]1jtm`|Tc,WI'Q]P3D&uRW12}V6ߊe%or={\eߊ+ex~:Q:$7 Kq"MT4]Od'|2 Fp`?Ey{JH7q˭5Mȹ_ڈT`ϏoEx{{W'\B1'ǪXAɉtN!22{AZjTZ"##drBW<]^Wx:kps%"ԡWͦx{8]OR=V**ڪ|\邰4A5)\ZMrRdO~H95=bg1Է=&~8 4bʦUWF~JTgr#a@\zdp^E!՛T'OyDdbWِ/4Vk{+UL$''V[AƆׯ쌻G=J +Z_)J&`/3{}իW˗/Wj=[g]##"Dn+3...h4ox0LrrHNN&99[[[bvv6$&&PvVPQ\qww|||NIS|KB1Ģ`(uM_BBBBBYh4Vf̌ HLJ"++Bꊇ;Zպg='My- E #"z,rt۷Z]2JO["++! X-}Ҕ'Һ?*>tmE }uIHHHHHHHHHBQBBBBBBBBzVCd7_IENDB`ktikz/doc/interface.docbook0000660000175000017500000001663111455414613020430 0ustar fhackenbergerfhackenberger &ktikz; Interface &ktikz; Main Window Screenshot of &ktikz; main window &ktikz; main window The &ktikz; main window consists of a (1) menu bar, (2) toolbar, (3) template selector, (4) text editor, (5) preview panel, (6) messages panel and (7) status bar. The Preview and Messages panels can be shown or hidden in SettingsSidebars. The visible panels can then be dragged around the &ktikz; window by clicking and dragging the panel title. &ktikz; Editor In the editor the source code of a TikZ picture (everything between \begin{tikzpicture} and \end{tikzpicture}) can be edited. While editing, a preview of the TikZ picture is generated on the fly in the Preview panel. The TikZ code is highlighted in different colors according to the syntax. Text-completion is provided for TikZ commands: when the user types the first letters of a TikZ command, the commands starting with those letters are listed and can be selected by the user using the arrow keys and pressing Enter. If a TikZ command is selected in this way or if it is selected from the Insert menu, the syntax of the command is shown in the status bar. In the inserted text the options or arguments that must be filled in are marked with •. The first of these symbols is automatically selected and can be overwritten by just typing. You can select the next or previous • by pressing Tab or &Shift;Tab. Screenshot of &ktikz; find and replace panel &ktikz; find and replace panel Screenshot of &ktikz; replace current occurrence panel &ktikz; replace current occurrence panel If the user triggers the Find or Replace action, a Find & Replace panel appears at the bottom of the editor. In the Find text field, the text to be searched is entered. In the Replace with text field the text to replace with can be entered. Pressing the Find button will only search for the text, while pressing the Replace button will show a Replace bar with the following options: Replace the first occurrence, Replace All occurrences, Don't Replace the current occurrence, or Cancel the replace operation. Checking the Whole words option will cause the find to match only complete words, checking the Case sensitive option will cause the find to match only those occurrences which have exactly the same case (otherwise the find works case insensitive). Two arrow buttons are available which allow the user to specify the direction in which the search should be done (move backwards or forward in the text). Finally there is a Close button which causes the panel to be closed. Screenshot of &ktikz; go to line panel &ktikz; go to line panel If the user triggers the Go to Line action, a Go to Line panel appears at the bottom of the editor. In the Go to line spin box, the line number to which the cursor should be moved is enterred. Pressing Enter or the Go button closes the panel and moves the cursor in the editor to the specified line. Finally there is a Close button which causes the panel to be closed. &ktikz; Preview Panel In the Preview panel an image which is the result of compiling the current TikZ code in the editor is shown. If there are errors in the TikZ code, an error message is shown instead. The preview can be enlarged or made smaller by pressing the Zoom In and Zoom out buttons or by changing the zoom percentage. The zoom percentage can also be changed by rolling the mouse wheel while pressing the &Ctrl; button. If the TikZ code contains several pictures (enclosed by \begin{tikzpicture} and \end{tikzpicture}), then the preview will only show one picture. The other images can be shown by pressing the Previous Image and Next Image buttons which become available in this case. &ktikz; Messages Panel If there are errors in the TikZ code, an error message is shown in the Messages panel. If the error message is not clear enough, then the user can press the View Log button and the complete LaTeX log file will be shown in the Messages panel. &ktikz; Template Selector Screenshot of &ktikz; template selector &ktikz; template selector The template selector consists of a text field in which the path to a template file is given, a button which opens a file selector dialog in which the template file can be selected, a reload button which can be pressed to regenerate the preview when the template file is edited in an external editor, and an Edit button which opens the template file in an external editor. See the section on templates for more details on how to use templates in &ktikz;. ktikz/doc/qtikz.qhcp0000660000175000017500000000131211455414613017133 0ustar fhackenbergerfhackenberger QTikZ Help Florian_Hackenberger/QTikZ qthelp://hackenberger.qtikz/doc/index.html qthelp://hackenberger.qtikz/doc/index.html false false false qtikz.qhp qtikz.qch qtikz.qch ktikz/INSTALL.Windows0000660000175000017500000000470611455414614017044 0ustar fhackenbergerfhackenbergerThe following instructions describe how I (Glad Deschrijver) managed to compile QTikZ under Windows. Install dependencies: --------------------- 1. First download the LGPL version of the "Qt SDK for Windows" at http://qt.nokia.com/downloads Install the Qt SDK by running the downloaded file. Select MinGW gcc as the compiler. 2. Download "KDE for Windows" at http://windows.kde.org/download.php and follow the installation instructions at http://techbase.kde.org/Projects/KDE_on_Windows/Installation Select the "End User" install mode and the "MinGW" compiler mode. In the "Package Selection" select to install "okular" (its dependencies including the poppler libs will be included automatically). 3. Copy the DLL files of poppler and its dependencies from the bin directory inside the "KDE for Windows" installation directory to the poppler-win32 directory in the qtikz source directory. The following DLL files must be copied: iconv.dll jpeg62.dll libfontconfig.dll libfreetype.dll liblcms-1.dll libopenjpeg.dll libpng12.dll libpoppler.dll libpoppler-qt4.dll libxml2.dll zlib1.dll After this stage, "KDE for Windows" can be uninstalled as it is not needed for compiling or running qtikz. 4. Download the poppler source code from http://poppler.freedesktop.org/ and extract the following header files from the downloaded .tar.gz file and put them also in the poppler-win32 directory: poppler-annotation.h poppler-export.h poppler-link.h poppler-optcontent.h poppler-page-transition.h poppler-qt4.h Compile qtikz: -------------- Open Qt Creator, select in the "File" menu "Open File or Project" and click on qtikz.pro in the qtikz source directory. In the Qt Creator main window select "Projects", in the "Build Steps" click on "Add build step" -> "Make" and change the "Make arguments" to "install" (without the quotes). Then push the "Build All" button to install qtikz. You will find the qtikz.exe executable in the directory specified in the PREFIX variable in defaults.pri (in the win32 section of that file) or conf.pri. Alternatively, launch the "Qt command prompt" in the Qt submenu of the Windows Start menu and in the qtikz source directory run the following commands: qmake qtikz.pro mingw32-make mingw32-make install Create installer: ----------------- Download NSIS (Nullsoft Scriptable Install System) from http://nsis.sourceforge.net/Download Run the qtikz.nsi script in the installation directory to create the Windows installer. ktikz/examples/0000771000175000017500000000000011455415074016172 5ustar fhackenbergerfhackenbergerktikz/examples/pst-example.pgf0000660000175000017500000000107611455414614021132 0ustar fhackenbergerfhackenberger\psset{unit=.45pt} \begin{pspicture}*(420, 420) \psset{linewidth=.4pt} % Frame \pspolygon(0, 0)(420, 0)(420, 420)(0, 420) % Circumscribed circle and inscribed circle \pscircle(206, 222){166.18} \pscircle(250, 197){75.42} % Adjacent circles \pscircle[linestyle=dashed](476, 135){157.68} \pscircle[linestyle=dashed](-32, -22){266.53} \pscircle[linestyle=dashed](132, 579){315.92} % triangle \psset{linewidth=1pt} \pspolygon(43, 253)(361, 283)(287, 77) % nine-points circle (Feuerbach) \pscircle[linestyle=dotted](242, 195){83.09} \end{pspicture} ktikz/examples/pst-example-template.pgs0000660000175000017500000000050211455414614022751 0ustar fhackenbergerfhackenberger\documentclass{article} \usepackage{mathptmx} \usepackage{pstricks} \DeclareSymbolFont{symbolsb}{OMS}{cmsy}{m}{n} \SetSymbolFont{symbolsb}{bold}{OMS}{cmsy}{b}{n} \DeclareSymbolFontAlphabet{\mathcal}{symbolsb} \usepackage[active,dvips,tightpage]{preview} \PreviewEnvironment[]{pspicture} \begin{document} <> \end{document} ktikz/examples/ktikzlatex2ps2pdf_template.pgs0000660000175000017500000000056511455414614024200 0ustar fhackenbergerfhackenberger\documentclass{article} \usepackage{mathptmx} \usepackage{tikz} \usepackage{color} \DeclareSymbolFont{symbolsb}{OMS}{cmsy}{m}{n} \SetSymbolFont{symbolsb}{bold}{OMS}{cmsy}{b}{n} \DeclareSymbolFontAlphabet{\mathcal}{symbolsb} \usepackage[active,dvips,tightpage]{preview} \PreviewEnvironment[]{tikzpicture} \PreviewEnvironment[]{pgfpicture} \begin{document} <> \end{document} ktikz/examples/template_example2.pgs0000660000175000017500000000116411455414614022316 0ustar fhackenbergerfhackenberger% PGF style template to be used in the ktikz program \documentclass[a4paper,twoside,11pt]{book} \usepackage{amsmath} \usepackage[charter]{mathdesign} \DeclareFontFamily{OMS}{mdbch}{\skewchar\font=48} \DeclareFontShape{OMS}{mdbch}{m}{n}{<->s*[0.96] mdbchr7y}{} \DeclareFontShape{OMS}{mdbch}{m}{it}{<->ssub * mdbch/m/n}{} \DeclareFontShape{OMS}{mdbch}{b}{n}{<->s*[0.96] mdbchb7y}{} \DeclareFontShape{OMS}{mdbch}{bx}{n}{<->ssub * mdbch/b/n}{} \usepackage{tikz} %\usepackage{color} \usepackage[active,pdftex,tightpage]{preview} \PreviewEnvironment[]{tikzpicture} \PreviewEnvironment[]{pgfpicture} \begin{document} <> \end{document} ktikz/examples/backup_diagram.tikz0000660000175000017500000000171311455414614022027 0ustar fhackenbergerfhackenberger\begin{tikzpicture} \tikzstyle{level 1}=[sibling distance=25mm] \tikzstyle{level 2}=[sibling distance=10mm] \node[circle,draw](state){$s$} child {node[circle,fill,text=white,draw](action1){$a_1$} child{node[circle,draw](state11){$s_{11}$}} child{node[circle,draw](state12){$s_{12}$}} } child {node[circle,fill,text=white,draw](action2){$a_2$} child{node[circle,draw](state21){$s_{21}$}} child{node[circle,draw](state22){$s_{22}$}} child{node[circle,draw](state23){$s_{23}$}} } child {node[circle,fill,text=white,draw](action3){$a_3$} child {node[circle,draw](state31){$s_{31}$}} child {node[circle,draw](state32){$s_{32}$}} }; \path[draw=red] (state) edge [curve to,bend left=3] (action3); \path[draw=red] (action3) edge [curve to,bend left=5] node [right] {r} (state32); \path[draw=red] (-2.3,1) -- +(1,0) node[right] {$\mathcal{P}^{a_3}_{ss'_1}\left(\mathcal{R}^{a_3}_{ss'_{32}}+\gamma V^\pi (s'_{32})\right)$}; \end{tikzpicture}ktikz/examples/template_example.pgs0000660000175000017500000000056711455414614022242 0ustar fhackenbergerfhackenberger\documentclass{article} \usepackage{mathptmx} \usepackage{tikz} %\usepackage{color} \usepackage[active,pdftex,tightpage]{preview} \PreviewEnvironment[]{tikzpicture} \PreviewEnvironment[]{pgfpicture} \DeclareSymbolFont{symbolsb}{OMS}{cmsy}{m}{n} \SetSymbolFont{symbolsb}{bold}{OMS}{cmsy}{b}{n} \DeclareSymbolFontAlphabet{\mathcal}{symbolsb} \begin{document} <> \end{document} ktikz/examples/hfst11-meetkinterpretatie3.pgf0000660000175000017500000000352211455414614023765 0ustar fhackenbergerfhackenberger\begin{tikzpicture}[x=1cm,y=1cm] \tikzstyle{every node}+=[font=\small] \definecolor{darkergreen}{rgb}{.1,.4,0} \definecolor{darkeryellow}{rgb}{.4,.4,0} \definecolor{lightgreen}{rgb}{.4,.7,.2} \definecolor{lightyellow}{rgb}{.8,.8,.3} \definecolor{darkblue}{rgb}{0,0,.6} \def\ax{-.2} \def\ay{.5} \def\bx{.6} \def\by{1.5} \def\cx{2.4} \def\cy{-1.1} \def\dx{3.4} \def\dy{.9} \def\ex{5} \def\ey{-.9} \def\fx{5.6} \def\fy{.8} % oppervlaktes \begin{scope} \clip (0,0) rectangle (5.6,1.7); \fill[lightgreen] (\bx,0) -- (\bx,\by) .. controls +(.6,0) and +(-.35,0) .. (\cx,\cy) .. controls +(.5,0) and +(-.5,0) .. (\dx,\dy) .. controls +(.5,0) and +(-.5,0) .. (\ex,\ey) -- (\ex,0) -- cycle; \end{scope} \begin{scope} \clip (0,0) rectangle (5.6,-1.2); \fill[lightyellow] (\bx,0) -- (\bx,\by) .. controls +(.6,0) and +(-.35,0) .. (\cx,\cy) .. controls +(.5,0) and +(-.5,0) .. (\dx,\dy) .. controls +(.5,0) and +(-.5,0) .. (\ex,\ey) -- (\ex,0) -- cycle; \end{scope} % hulplijnen \draw[darkergreen] (\bx,0) -- (\bx,\by); \draw[darkeryellow] (\ex,0) -- (\ex,\ey); \node[below=-1] at (\bx,0) {$a$\strut}; \node[above=-1] at (\ex,0) {$b$\strut}; \node at (\bx+.45,.35) {$S_1$}; \node at (\cx,-.35) {$S_2$}; \node at (\dx+.1,.35) {$S_3$}; \node at (\ex-.22,-.35) {$S_4$}; % functie \draw[thick,darkblue] (\ax,\ay) .. controls +(.3,.6) and +(-.3,0) .. (\bx,\by) .. controls +(.6,0) and +(-.35,0) .. (\cx,\cy) .. controls +(.5,0) and +(-.5,0) .. (\dx,\dy) .. controls +(.5,0) and +(-.5,0) .. (\ex,\ey) .. controls +(.2,0) and +(-.2,-1) .. (\fx,\fy); \node[darkblue] at (\fx,\fy) [above] {$f(x)$}; % assen \draw[-stealth] (-.5,0) -- (6,0) node[below] {$x$}; \draw[-stealth] (0,-1.5) -- (0,2) node[left=-2] {$y$}; \end{tikzpicture} ktikz/examples/beamer-example-template.pgs0000660000175000017500000000025011455414614023376 0ustar fhackenbergerfhackenberger\documentclass[compress]{beamer} \usetheme{Berlin} \setbeamercovered{transparent} \usepackage{tikz} \begin{document} \begin{frame}{} <> \end{frame} \end{document} ktikz/examples/ktikzlatex2ps2pdf.sh0000770000175000017500000000301411455414614022120 0ustar fhackenbergerfhackenberger#!/bin/sh # This shell script compiles a LaTeX file to PDF using the latex, dvips, # ps2pdf sequence and is supposed to be used in KTikZ only, as a replacement # for pdflatex. # Therefore the following assumptions are made in the code of this script: # - the only options with a value are -output-directory and -interaction # - the name of the tex file passed to this script always ends on .tex # - the name of the tex file is the only thing which is not an option or # the value of one of the above mentioned options # Usage: # - open KTikZ, go to Settings -> Configure KTikZ..., in the "General" tab # change the value of PDFLaTeX command to /path/to/ktikzlatex2ps2pdf.sh # - in the "Template" box change the value to /path/to/ktikzlatex2ps2pdf_template.pgs options="" texfile="" while test x"$1" != x do case $1 in -output-directory|-interaction) # add their values to the list of options options="$options $1" shift options="$options $1" shift;; -*) options="$options $1" shift;; *) texfile=$1 shift;; esac done texfilebasename=`echo $texfile | sed -e "s/\.tex$//"` latex $options $texfilebasename.tex # return when latex fails (otherwise ps2pdf below runs without errors) latexreturn=$? if test $latexreturn -ne 0 then exit 1 fi export DVIPSHEADERS=$DVIPSHEADERS:$TEXINPUTS # if a dvips header file is located in the same directory as the template file, then this will make dvips find it dvips -Ppdf -G0 -o $texfilebasename.ps $texfilebasename.dvi ps2pdf14 $texfilebasename.ps $texfilebasename.pdf ktikz/examples/adaptive_hopf_structure.tikz0000660000175000017500000000437711455414614024040 0ustar fhackenbergerfhackenberger\begin{tikzpicture} \draw node[draw=orange] (minus){$-$}; \draw (minus) +(2,3) node[draw,circle,text width=0.8cm,after node path={(\tikzlastnode) ++(-0.3,0) sin +(0.15,0.15) cos +(0.15,-0.15) sin +(0.15,-0.15) cos +(0.15,0.15)}](osci0){}; \draw (minus) +(2,1.5) node[draw,circle,text width=0.8cm,after node path={(\tikzlastnode) ++(-0.3,0) sin +(0.15,0.15) cos +(0.15,-0.15) sin +(0.15,-0.15) cos +(0.15,0.15)}](osci1){}; \draw (minus) +(2,0) node[draw,circle,text width=0.8cm,after node path={(\tikzlastnode) ++(-0.3,0) sin +(0.15,0.15) cos +(0.15,-0.15) sin +(0.15,-0.15) cos +(0.15,0.15)}](osci2){}; \draw (minus) +(2,-2) node[draw,circle,text width=0.8cm,after node path={(\tikzlastnode) ++(-0.3,0) sin +(0.15,0.15) cos +(0.15,-0.15) sin +(0.15,-0.15) cos +(0.15,0.15)}](osciN){}; \draw (minus) +(7,0) node[draw=orange](sum){$\sum \alpha_i\cos(\phi_i)$}; \draw (minus) +(2,-0.9) node(point){.}; \draw (minus) +(2,-1) node(point2){.}; \draw (minus) +(2,-1.1) node(point3){.}; \path[draw=orange,arrows=-latex] (minus) edge [curve to,bend left=10] (osci0.west); \path[draw=orange,arrows=-latex] (minus) edge [curve to,bend left=10] (osci1.west); \path[draw=orange,arrows=-latex] (minus) edge (osci2.west); \path[draw=orange,arrows=-latex] (minus) edge [curve to,bend right=10] (osciN.west); \path[draw=orange,arrows=-latex] (osci0.east) to [curve to,bend left=10] node[above,sloped] {$\alpha_0\cos\phi_0$} (sum.160); \path[draw=orange,arrows=-latex] (osci1.east) to [curve to,bend left=10] node[below,sloped] {} (sum.170); \path[draw=orange,arrows=-latex] (osci2.east) to node[below,sloped] {} (sum); \path[draw=orange,arrows=-latex] (osciN.east) to [curve to,bend right=10] node[below,sloped] {$\alpha_N\cos\phi_N$} (sum.200); \path[draw=orange,arrows=-latex] (osci0.east) to [curve to,bend left=30] node[] {} (osci1.east); \path[draw=orange,arrows=-latex] (osci0.east) to [curve to,bend left=30] node[] {} (osci2.east); \path[draw=orange,arrows=-latex] (osci0.east) to [curve to,bend left=30] node[right] {$\tau P_N$} (osciN.east); \path[draw=orange,arrows=-latex] (sum) to node[above] {$Q_{learned}(t)$} (11,0); \path[draw=orange,arrows=-latex] (9.5,0) -- +(0,-3.5) -- (0,-3.5) -- (minus.south); \path[draw=orange,arrows=-latex] (-2,0) to node[above] {$P_{teach}(t)$} (minus); \end{tikzpicture}ktikz/screenshot_v0.8.png0000660000175000017500000027614511455414615020031 0ustar fhackenbergerfhackenbergerPNG  IHDRTy&FV pHYs+ IDATxw`̶kKew^ދMo! $$@ @ T 1VNwwf~8 ,YOݙ7ofw!sbl0n*p8ɏլ  F0{U%".-o|LbvjzN?Yws/߆p8[G>eeP,Q 0cE[,&pbRRG*(F@%SO=RA4HcƔ1P0FAqD0FPjh#T @s+/=;i]mG&1 JJJ<@( ya7r>ȯ{(H+ΫZ%jJȊO+T%Z9a+?͔p8} !t㷟"?Fۜ5gm:bp#D%a,0L( !jJK5m׬ +BX6މ1ˮ~xa씳 F,}{\tm=SZ,w=6ڶ~>ݨ}A{bqz?|P]Pz¼ĕ\y6N(t毮ϗ y~1X `W {YpBEDkzx$FGZғғcHՉ_ӽ~xrB${|آԄ(E[Z!ao'br9RXi W-Fc{}>)(6y{w6eՆF->/>o;捘#@Mwz?+Or_| Qo9/'=tVmm&Ba5~81FJ=Ի ]q O~C/+]򝮇Dhgg6RHpۢFWk;em楇7^aysy`ބꧻTtag() ѿ/o>.t _\y*;|nRt\y7| &ʔiv>>lNOЏIԄVʱ2SB"A1iVoÝ~kIJbDUiuz\nB:0?FNbP@2ǀlJ(%_l~1}ԩv(.yeЈ/e,ko۞\91^`昑C2/o( $dFP9qTY3G ,rް z\cWIߕh3F0V")/}ua%];C -/}ܡ̟:Yuw#w\xM,aw6jNOmѼVo[~FPSo 1ܿvg09~^Y# S5=Ka'}/q%We'#:i7F{\q7~Wl %?+);=V-%12/;I@`1)a,%E MFc#4!I⢭I) Nf!d6Ibl# RT45>0 $̃/9\RX=id,*l63ƈz?dwdFUzշc(Ys/^6 a!dxS026n@0!hЦ76\91HIrBTBL#AerBק7Rra5姙~&:²p֘QY8'lHn*j:Yz9)JNI68CciIq[=>C*KKJ[\YSo`ei9khÌCeuN7xqVj|qY-RZ&Ai q{U7m_"EaHNJRBvga3WT7f&ir"K*dT674ͬDGY+k󲒼^B~VRrBCuMĸȅFeh3d'd%h:ٹ6LjWQ۬B)b$hwl竷7 ^~sƆ{\0udafyuSCskd%d)poQ F7]1%5wmѼ;)1 S0P#5DT(5)esSbwkrU<|pz]XX/-襨sy?RE9YiW5:VSt1/+ٯj5M~mrWJ1Fɑݫϻ˿`ܰ #ό+l(!ƚ ˾Qt)+%&1gj[u]M1:1.BɡҺ̗HMV\@ |+o_WU(e +[1 07uw_so9wqsodVYuG<~)ї.W=p97\<391zek1}[[A]DZG Zr;62'#OtHuyuӃLTUw{a5|g}y S ZRQ [.+K…',95.7ɣ#[kC?}{ʪAG̅R|$.7ï60B]{)cr̉E&.zqq{|9IleZMđnt ~Y5ѹ'^~pɬ-ڒD&͜PF:P`ŏ.yzpw,>c͆=266!;-!7#RUƇ_𣿸hӶ-P,ŬdQ[ ܴؐbV1<y{ M5hKxOWI}cMlL 8V wlڹ9o~MׂDEɣɺ.}f[k IOX|5aӟ  z/7cK^1q肙\EMCêl@\\9$г~2:K};+7[9 % rԢsԢ-O@Șc Z>O#.:o1˅y?l?\V78~Uleǃ>Jt,H;w o¸ђbѽ-XUB9.+V}v֐ ƋƧdO֝Kj2jjvNHv{xOj0 N^>N,d72a5 kaz~]E0rSJPFIANryu(&קG$gG`Leڬ]mOIvz,8$E6؛ZPYۄ "D fG)?[1lwRS-͛:\4TӉ͔1%#l%.| -L,@YUݯ;ݷMe2lwA)+nq"h(1j_?wt#mwS,0/'X@4FuztXb#AYz`cft7d=igqUm#T6TzRGĦgyU=:P"B^VbX k+Oeg1QJ7+N/fWe],e˒XUooiuw&s.[8_[W]gulRL)EadTUouyYZLeM)q&4UtN?6f%3 fgeedM0d+cj wJW>UYpD@jk08vx W-/_kyU6Ktk\Wy}%HcO}7;}Рg!3-)*̴\xwņ Qj m_̯s|5 m5Vٵmr=ځ-4a(%YHw޸h[R#KvGt|tC7:n* 8 c$PvcT  kKC%5a-'t>ξg~s7s E5.wɯ_b7a*.FnLAYI 3T4^>׳&N?xe5 _'Kv68V|k FԴtA",W`u9]#+vyN۟-߯ʕ94lgG”!d,ePjr@)*]_xk*D YRQy&s㹻~<7iXi Vd9(t{|G! Ƙ `nyKdBK'`[mJ ;]vTDF ѶP818\5X"#|1O(0줔#PȈQbx ySL7k~WUJiVZBaJJt K!lH!q65fۼNwb\dejmgQd%ؖc,1C(mq=w_pCc"ϾyYK6|Ӄ/sk 0̨McRcn_?ُQ}}q婤Cx(:#?:ux4;\jnq>7#1+=ddEktTۍ?Ʋ&(4^lP:s`_`&²5 c]?ÿ{}_ߜ*=UJt RJь e!kr))J$h <۔d0FNFD˒T2ƌ/h~t:]NPJ%у!_լfRsirBh"2Fw+IN^I)ehF$IPd͸MP6 Ry,^ +aмTJI(YQ49> c ¼6*nh JE9^Rπ6r+cDWOtB@O }9 U#vIűEهJʫ.OwGT)3VlmھjM'M5̈́0B:M&JJ+vگ(rUMoر`˫k{}>䇊9Aoւ+W/{+cd7APbGGm+16jd_vw^e}o)eNۮ>+>:2M+}b3~GZܺxBնa_ѩ#c:!ƮNa.ꛯ?>y瓵O&_uöaGṯx0pU6] M{' B(F۴pYc^3D?l'kyƐi`0(W&3\`|t"(hUO~UWd-<<)uMJHdl]JB͗Wdi#K~Y9G*`܏_y(h*%dqnvc#@`?V_p-mζ] Mx۽j1.==4WOoq?uUg\qt=vRxHϽCԷ$G߿􍺆BiZεɕ'2DLcZpG~@1NcH258fəPQp{^MU;/G1ZZ@tlw#̾`c`N8 Me98 kfG(JW;V0B㰏]1{Cv賎Rbۆ_X#nRURwZ!Amo9w=*FtjM M1B(̽=&EVU1œӾdItdYM eh~X2aa6(~#( Gz'D u2pM<,d@g/\yʓ70ƲV5P.2[Lrb\f_4ٱ]"FQTH"f]!2x:_98s06_9{U+}DY`_b~<%2fO$"ֱPo|i'Q P; IDATB;1%HI&u'ͮ-7OK!%bѶ)tVyISp& OmEYZ 4 >ME,Z`9Kd^nuAgFu?ꎗ~2MJ)cʁ0zȌUoi @m_ -2|Йkzs1iGH`N"ƎVRTuZ'a_9Om=B~B|c3j\?\ɕcXv@ۉ6L5ބ*#m^~dm~J=CO/`'#8Vc zJþ^!4n򜕟?Q=mr$SL(FSLQdpDgfܜclm]^MNʓG9g_sE~6۾^`q塍k{ l B+O߯z}o'j4 9566;ZZUMvr%W,JCg.8N"x !4z¬՟1xb>^~ilVShA~wjC떿 ,[}߻]>&"οOm߹OY˾48/;̌#e\{|#Iy;{P|5jx/7;,[vkFQ Kʪe?=?bh]FL >2yŋ.;l}O=E89 8t>Ss3R uƉF55ϼƺ4p™7^}qnvOt3q{~~Ż6OHt( 8uҘ'{nY%+o=|_ܺ84/}#N;gEg͟*.tΛ}1 52&  /{H~nCcӲ_~öK/xÏz[_87.&3 sl۵*r3zPqΞ1i9oyуYںƏ. M9l7KQQU/?+JYѤ\5BuL*-싕޾Œ(0Jl40ܬ c?>;y3p8N1`=!.c$3#`d3ru%W^i5ˌ(!zXc}Iܳf>蓛NohlYl{Y8g>zhA'V1g'Vܵd_~K #f%I<~02(;cT;jÿ;w(i09)=.+O?:a̰G>oۯ K9l7&#ANfZ}}CX] P0whEAPdQxGJ :&p8s d5~$ ^vAj ct$%%^ qsDBNx,K\rޙw=tw_K0;#:i\=s˵x磏,}[IwfBe !$`BBum}:!8i_SIEtXްvo_ vŅg߸cێ}}ظr͜:2!$th:1$J {$feCq8sQOx|P!1p{NͿ ?7%)g~i&_nھ[iSƟ1gꌳ9u"K׬۾M͒r3_~y?sތE$d6"-R6:^R3^FiyuǞؠfJ^_П=(Jٗ/,-KRRRRgrnKշ?.ڬ{III +WC 'N`M7oʳ~v@9r}a/+I76@b|'U]Si+jSSC aUT$v]PN]'q~~WϯWV}vi5i)5JvcϊO)Z-a|Lf6΍w zէڗ3sY|͋G(HK9e89H*9dZuk2)!Wc##=5# +#gFGEui{MiH~T۳|@̣ތڍ=+ ger3zVW5nx7utJI8958aߨ:v5}x׹Q^]ۧyu ^4f ~7?\Wk]^p:a]kR ,/p8~!aД79#q83p8ψ,p89I=p8?#xp83௱d󉷃p8s wɉp8Ao9!p8pN4p8NeזYV8g Vp8}H;Vp8g@R{mo!'=k80^t-a{o+8>?{8Gsq8+,?ԥqC}a|}DDQӹ ~1& $CjFtSllTA)&_,C!}\Nr """2"- b5Moi74777@LtLLLLtLtRR"˝ǜ;TUg=Br5ȟg_'Ks s5V0mk0MQ>GeƱRV^YV^хA[h|() $xȻ%k(AAݧ~ w466aO=MJa=!Lj7s; =vj_$X4U%7a :L,[oEEEYi9h,uŇ&l2YE@S5x|~-??/>!%7oUdjFGEFHZv=jtfV EEC ޅ1F)`!Q|eal6)&lRdEeY$Q1cF)cB(uU}7k{"{OX) G`t=;F?>;\1h`aTUs8}~2@$(d~":(sc;>`:2lX)+:z !l܅BL3Wm{~ p׺%zuw8|hiɄ(@86H௹YL cj({ߗ5woǿm $OjUa˖O?]{yi#%y5u۷mX-n3#-j1˲,"pUUuŇ$׊ ߿eֺŢ((.bbB\TdٹsGEee.K7oYP ֮Yl1lV,˒jntM41%9$}^X 3AEm#p**ZAWV?ro/Gݻo}} =%u7UԻ5FNL9݁1V^U_YÑZ~"LIJ7āOK} cC/%#FV: ٳ7;7?w_Ӭ_תu]oeIBa_͆1֧+PF^mrbclptz]}Cߢ?_˫n}_DF"p:@F(uܸ1c*/qy-yܘcX^BiII v0) PJUU U%KRcS͛Ǎۧ|IdJD)z}eV%/7)fjnD?KwށRZ]Sjgl6H_۽lʹsf7AǍ媪4 & D^a('AWN6fiŽ1#i1'&{}} {>\ud{[9iaJmG޸څFf&AclG~|P5gK?gT)c_q/~W7za?`f˚4 꽰*Ͳ(+iΙ|PE45Pʌ^#%](燞w&u+oFʻbuj>'(``</|[o}y-8:;[Rrtt$X]jIQ䄄8ZxaEE=˱;lڲդȉ :!:!ahpׯ`thFqo#[bՂg@)m cfM=Ĥ'l6:Ah. !BHEemu]@xjs,9nfˊr`ֈXkRbjj-+--L-?xMSoY98ߞ}z h~˞O;l7<{QYkɨ~S%pŏ5792֋rÁҭ{^]V;Q' ͈LxxwU;,b3Xfb4/,::5jׅ^Ϩ!v{wTGtJYrb}{wAES4 }؟Hc|32fO6Gܿ]0f@5ua#[G*޶m͝[|+K c8['^HQȈFWTV%%%)SVVVSSy^vQE&SLtSЈbW|{0ƪkrin|F5]LUiNOOK=]`@nRL~b0TM+&S ZTTdB\\=[o%a3cbcBim~JIMMNINS)d'K`eE2⢕.9_NΌ_[!)'h cwCkg ZF!6l#5mN*Jo{ 3}iF 8kMla0D[`qd՟( aa]܄!0Yc:e2jv +>l>RȯtENg2v|%W'Ecc櫤juKa\483–-k/] 0wZo0T'NtSWx$IWNN0B1чT˥|[nOMNz}>^EĴM&C4-j_͘2AuoR]UM4-&:Q#byeelI1%:iUPt:}~x5555uUUC%c$$I qq1Bz@O(Fqz~׆&ZUUtзVu~%pp_фI k*NلI:!I(Q]UT4;zX4>WP$A# 7PDEHʊKI9T)wkEb2}-Eé`[o-.".J7!r/ Ȏ!BA^맡mJW WQ]׳23B? ,йwVucΆ9AljI-FLPŞ9%cKzsKsddydϙpzİV'Չ10VQ"##^_}Cc|\$ #boILHqpj6"#bn$xa0ZRSE+' ^/*2"gP.{i=hPRR>ڑ /_y5WDP]:%a;.ۣ("L&YeY6fڬB)cL'6X%X?a|J,v]uEQOc>cM)|vnq'>ZNumے{us2cĄ駉VOw9θ^:ߕ]GN:wӬkhlqiS_Bd,UKek>/ ձѻY],la88"&Idޔ -@5,>z O*@F~aOFЇc22AMm]ʤċsNtG)Z6ˈ[آg))fo]ca͗Ŕ hi4|^SJGo4.zRJ1J1ƪ 1V5L?^円CQ.pZDI^l6~M(FFD45;&#=}bS2Ft"fBk1ApJJ2`eyXQ;b KddlLtEe el2U_ջPJTM3V$WM-("Et L&cj(D 0^+l:VEQEk/6vz)'Nw!D6R%*VܠUTdb,ysue{M<㺾HXVOtUzNE3TU,Fd$b!I٧jdQfMTU?oi@苴aB_|^Zb+P^$>E_7<^Xbsg7O0Ah1t⛘NsA @2bNʋV2i5 IDAT)/wN>t8Z޿M*H Nge˾JMdeɤ&E U"8x`ĈIѡ#"l{. T$Ub[-ˍAEQFǍLM(b^!T׉if z[= Gmcٻv9daY7f-*yBtJƘ18B?UU.Wtt4XY5UE&bfcQx2L^{׷/KcniLSUՈk-`IHH]].NH͊зurO/"GY0elμ\ F``Ǜ<94Z3K"RGوMǎhJ{+^3W?-؋;?JBfD@x?e.<:ilh6>oN^sL4ѣY/lnҺ9/A~ !z,P)sޕX0鉺x){|!.K'{$2Q{92  bVG4ysC!y/]s`Кt= 16ͽz&$I4MDQ@ 6[CsQRJeEA Xucdw:{- q$ʲ,"{}XzZƺ'x>_v&ҝ`1iQ#N6m>vKddhWVQeeIx}.u>e`ȲzXTTtSSSrR`Xnl&|^jfIVL+l_X+`Md9%%B)EB*([k01&@jjZC5 U#:^^) VTE"D$(WˊBV$j4^OFjC~B)ŀdd(5jopKiIjz7ئqvF~ƿIJҶ1۞x] V*^qI5KOae2) jx-.p۫b,:={8e7t";-SdYӁQ py xݽ+j@ 4>_zrTDA6dF1WI$B %T'/I!4M%I%A0Bn``zGQ&3zpJ?d6EVYȶou5U)?.!Q,`(6!A0Y1)̈́ŢlXL;-Y KP~3Kz-iveKGNj*d&GX6ǃ2!#.ʦLGccM dTc^55 "wgeݡ<{C7zFX~U{Y|{&8j6 c LIAXL}3eb߱16''iuh^@^1YPWoZZ@$A͚ƅ\GQ ͚nٶ 4 DE$A$IP$!Db~_z$(RTRT"h۹bO{ikQQTUB9L5jZѸ6m6o/? ^FoEv!BSF秗r=}IcY$+kS  ڴhtxG{w Pgl/ґB=N,sѨ9wRKÜk_}*:9Q ='`f= UrTJRJ.J.2J!RJ!/ TRa'Rx^V]^$Aa BIדf HҠ*:Iϋ_wͻ7v?{C  8Zºf6a e씔D(D(U,:D,drD&H$K Fa~FO],k9*!q6qlCqvrq065rjEb^GhX9h饌iV}9c\!($@dQQaYY#caeݽ>LhrT*CI[V)lV !\2y9l]qTՄ{SN:{zԽy|Ld ">cũuH,Z^.gp?{NVCM}f/rM:,U<ڛIխ{5Aa$G\':si`0TzN&%E`g-;Μ6m$Ao,5-=9&f܎HuY) Wj C nB^]4͟Zq :ӥshe2g{(N[ݺ֮5W*[L]XPZNM+Ľ;'6K>}#fz|vtc[?k7hfCr+j)m֯:lX2G{ῗ|L&ݹ7W]?{/ yWV?xpOk[jq'nVvV8::ls1>׭\MI{W*dm2 eRwR!`¸?oڱwڥef{tMzt\5Lv 0sܺuiӦ1>}ꤓD<($$M9N.0` bT~ [q<Øias{,k\2,/`|drۓ]m1nIR(5%BZSŗԁ!Ƿ'9x{uX{+!WWfR 09 @ aL\IPTg[6̦($)BAD"!,\.$gsVu.'Gb#4Moںt@ށAPXcDJ4IN+..V<;_}Hs#l*é%xOFFfLP]mlk-J%jVU*$ID"\0 I,˲@nk**d2c3)Wy7''ɾhjc/ʟ֯( \\ aw)0ᢏ_|y|ʭK_⏗O:͵6b`]lItptppt0M Qo}Uee=z| δɳ Gc8/;w 4u@ R&A&A//¸L@;ݾ&g=08e 4|1,{>:sEExDh>xW4c>׫@ tN V)F Lg%x`ߑ"~k $HR Ha9Ev6ʦ\&78 v\>kֶZ!ؿ]+: (pA1m Ɯ`(wrvV9;9hCaAL&jnnnzYݥ] s-wyPWL&Mii6NİuEr/\#ԝ|BH@*,}/֖֝oޞnc_o٪UttTN~M7m 0sk_u~7载7'-Z,nJxXnj)[&6?qL]J j2 >IvJ۷mջR/WXT\TJ߶M5O8NcϞ=m(m4J[iH92,@N^A5D@P7{mh2a 4CaLl>㰁yaXV[(JzwO~R負4 1@ $}ޙbTϤUNc" Qm9bX# &V ($(pЀ[quq9H;nU*uHHA$A*JR2͛7h@2ʶ9*ODUD,JeRL&d \.ۻP9F$-˻^$Uk 3Ql@O4 "s0"]]& 1Ǹzz]Qj gYivzu+u ''g())vd3M@.ؙe3&ʷ;F m߮u։oܺ|ZFϜ :x舽]&- !ɤvv57ĦEiJj*In={Kf .)yہo:j[ Y5&(*A6ضHb͛VgΜ[BbI$N 4DL*H%"?#uR{*-B$˾*! 7zAzV:N,ˊ"X-yrttp m%J2Fz: V/)SiH7/ ^n)]"vگ&ZD[5>}Z\T6'a5Z- |JrڍoW}ɒ~q /]6nRTTغF2{„Je@ȼ2?߬YdlWyWա$wK{չwx-Llx^jt/;[rL).-*AXRW`ttP)dyp*o"XTB?_ㄊҲʦXK${uRkZPzF\7J phنwzG\<ҭ^@]^-GCXˤr䴾) ( RaRѢ{#*gh٣Nl!\\Bt+\uwSW4gDտjpM>;9mp 7uk/f?:`|[ea.ej_:DZׄg_i"a?4sJ3|{Wlܲk*a~gȘfm{u>ʵ (}-[wX-Vc._ѥFޤu߶ZXTT'w0C!vVRIoͽu'nSe]ɗ_8(U0w).z$ BnDR=fݴLqqvld/-q1fX:ԲJNb;*s@oxBcNO""65΅vqMM>MN?m$e<5m|wSR̈́7fXc+޾Qӄi3kשϿIPR c9֤Yjו>uZSfO˴I3._iI%[x=Ib3 -ð}Y>|Ü%kFL\0ÕPxWqSA~E%*,W=sһW_Ը 4ofϫm[%tJYzZ~h`ZlO|ط2Co076;y6yV2s<-Bm[' }i= T8ߤQ9cѓg/<;o?w_=[7LS36HD.`V\n{oоK/z/>ޖ޼}U]_~Rðw>|HMXZ^aa)$4oҦeM[LwެiM/]qL5K_PO< IDATѹO|yI%b|_7miҕ?~yȢ. ݽO}l7$B29@fmlmXԦ y)eff,^}.\"!~>p;ޑO::M}ФI<Iw? >|9f0oϚXD ` P{ SϞǬԃ<5ӭe=OM{pGW,YʙWt7f 7ile)'Kl~e_ԙ "IIN;#W>̜:U;;>5Z햭]ݸJ;魻[ ؼɟ5iЮ´-@"׷li3z#"4xKʏJk=w9u' i:ɑV,4#M[w:{±|[ɭ:lɣoˣD|YY9^աmKk~#Zߺn㾨~l @l]'z/f}Ge懿w~3*"tg+6nq̾3rc'z{r6Uz_7Q3>hޤ ݿIbŊgi&ɢ9͓]ѯg{~hH`IiYu}E'G/w>  ;^;2"e&_,}Sޙ߷gRQQQQayytu @otdĒ%%u#= C { zܖ-[;tLؿK,В.RF_ϛ73'u Ξ,(oscH*/`ⴹˤ3-8mmܿsVyrν6J%t UETubZG.?7A^^NogǼZsΙi}f pLqysg]δSLrHJRR\fVĠ<5֭e=8?_w-tsuk1*х釦Z Vc]3n.ef,V4)ߝ3# 43}^tN9h;9`K8PUߟ&Bh[ޞ*`0&GE=+hf~7׎si/;98XyZ9S](:yO Sd._c?},lysyEqQ!+HB&ɤ3[ϬdVhmhwFuK(5ia3з!=Rdv#Ջ`#|?oLJrlM>EFTjMiZ,zbx8pL&#_Ojy&.3?vZX?D<˺Q=ײe:QcL&I",4 E0&7n%9j R1q;_]v@ℙ`^R[\ʘXN=:p [Sݚs~:ݸ\$(ML" $E)+-Ҫx`$IBϺpe7ow 6 ݻf ޾{_AkV.v>v6r[~=f+AyMŘڿA=+l3X +,QDM1aw&HQ$ zaGN^:wcs Wmzp4Mw{e>~^7u#Rw6;wq5yT\ J-]spJl"#u}qPO]Zl!=Ã7Z2gGg-ZѳsRUXRNjzޒ__aU)$bDȈP Bi5i?^OgjV)+懽 $RÁ\3kþfc8GkKʼ<4τ^Pȇ _ Nh/_$.XMMKoѼ1Fр#B@\&PBeycnOEZ5/JtiU75o֘ (6rm۴En)rk)RH?qOܡxǪ¢b> {H"EşH3_T7T#CGg@E8:1T^Xh1,MQ9`Oh50f9Ø^8Jb$DR9AW&5=TJuR&p>zUi 2Jq\4JsasMX~0H4]e 5J|񍙣`34~>[~Y_͸.gdKW@V EE%3-3[߻3ƩؼiHpK&ϸȖ %I ݸW,rZ}M).)eXܝ"J$wpz#=|GB*-ڴi {{K-1r2޹vsX36|geciUb;))p៫{tY9a!AW/8W73V 4?O:1TI-kwx`$`s' wi%% =B((?++;'7]tM(,ЦX5e>w}=Pף픙Sae#8qg*ĵ6ؑ6}WK,g𣺥jɣ=U C!C;\r"C_%Y, r`WrK3\h4#̜d D"$IB&V(S-qP5oΘ?wd~* v BOxĖHY{ĖQ빦>Ê\vN\v(**eR? NRzDo5eҲ2>¦q?/[&41_b!^n߯0HbP^l8LJNI:Z/Iu_;kQ!,K!ZϝpyO*e9F cZmqaVA&1<$u~$$#~60#"v<. KH`{vѣk5 l\I3٢yJ=m8>j&&2l#_:d@k7n/_<0.*,~k?~ҐK&9Nk9i@Sz աMn%/^.;'GNN^tZ3 ˲11Q?\H{4.| ";^~1ŖTJ<5n/,=#k}wܼIGO?ڲ*|7H?a\Z&U\SaխkSߍZv/#^a/wh8z[akW~h#>}eY5kyFp?aDX0Au(˲LNk^oMn)@dv2TaGk iu#EJO*˶sźZ[̰L^Oԃ)RҺ2 ZaqzAaNo0h:++8kz7W"H-V h/ &"•[ g Xʩ]NzkeU)Pب8*4? =#E"I%B1NRWK}][G>;uΕN4uc'ֱa HXL,@s,"(9~"H [RW"Uν@8c"> $ xk;,䩽n9q,kr.껾ErK*@3A D[^ nC6%%GO}r߾,ɝ+q8#;^!Y yX#|oO7-?Li>N)JĽF5a̠1a^ b#ɕS*f_NTzƨ%d`=LpVqy°lK0,ڋ56X[x"u:`;yj[4OʩT*!ZZ~1{Zh,麐aiߺ=3$srZzx >HTkHwת&ZE,>2f q'H̞$z)m Jts?񯌔9КBA[~^q\B*~֌gG}{5ߊN׋Ngڵ!\\BV[xѕ6xeד'XX,_ZԭS< jFxsxUhgWC@yAC7  sYU3P{myM@yҳ}šs|[vZұ~aͅOk=q|ÛKǶ6 _X3> -- `Z :8V! PT`$ֿqjMC ҭ^}Ɵ!N.]F3LCK! !l" lѹf=KJJ~8q\L6㽕_,[Wh3u' lֵK~X=jĐ7= 4 ;Xt8N>}`&WY`5{P@y/LD0-rIЧg׻)ǥܻlOu7|1'M29wܗࡣ3O6K!{/8s+ P 70`M;#}-0~t[w   x=Hf4ۼWF-YnVIoގP5]t heۮ{CKTݺoؼ YrP1~ô:Â' Pߤ8vDCKa[Dٳ;P~3S"w؆$ɠ@-va?YB73дT*׫]b"vXtY+w9нk{Oڞ}|I@@?_x +I7*Kr#Џ@?@Iϛ5ԓe9w7W]ZV1):ƌ|H)W_R(ZW/ `_S:sL; G/cZۢp =󜧲*N8/}Y-Iujfqf c"|aFWFfv~AA㸘-K} 4MJ9>Ȱ&e& Es}~_[~! -t:)7Jk)usªJaYV[2r.Dx>"q`4 ӦU +6= xQgU4a_uhQYڑj+_*J$⧈c$`SKG, D" Az7sg O|v0 "!Tz^"Z$JF9Zq:y{WE6pI+~0Us _֣XxN5|_{,    -(jSu(j/N˱t}Xw* P<]_R2DOKoެݻfOدW +,,}TuKY78FUP$U@"薔_Pآ"BC{?[ݸQa#Vt?{wn z,$?e(J2~2F+Iz,=1zA* c\i6-&F9g]XXTr/5"=,\ZHO㧉qD,Q߉ZheM3FO0 cr"IJwLzO?m*Ik`0<Lm6z>Y8)M&0y0ƥe"H!=KJJ93 cDJT` <;y?wpuqi;ёT]fU'f1Xm29{UnNjxN2ܺܳ}5:y,BϿ=b1zcq݇ IDAT'0hh+r^~3~V9+:>$B1fkwxDQL&=.9}pqK}Z,uJ>YLJPQ1k#ܹ gm۴oغyvmwБ4x"`1^c@AA$2QBSUϱu~0C>qiiF1E&uj_N~kwl!e= Qa@I Q!A?oc)}~݅pmgҥ !Mߞ5ڟ[w jtI;oX?vH%E|E>þ+9wo&kZ0K\~S:t2mkcr40ʩ=~?A5u1TjMµ̻eqԻv5s>f5Nњ&dr{4mѾπa[uJh2R*Kv±̂ş=~Ti[ 4 5' wde|sg _ ?{g}Ǎ;vlߚm٢ٗmcקT""}if1#cc>[2?i S 3Ɍi]]w=GgG&1n7ضsYٟ.ʅ5ek!/^-)AEKsp֛B^r);;7ossu]pްO6ʅvvʵQ"@c;ph+ɢ計/9~0~ZHpPLtZ oÏbyϿnJ%CW_=~z{ǿb[hH\[`)Q$+*j؜ PP`񓧽7'-Z,nJFfg^^X@5楑W6N{o[a0ݻvnٮ댷,|]01El[eknʽf8qs&0^mT]BxPx㭧%I]H俣A"^Qy1!<y+$U,6빶a-0NrʨC7mP~Jק$55S"gfe幻y{{^q .s%'75uqq2fR0S9֭5g7wl&o>e͊L+Wm(e-i,i(_VfӨ*,%& pA'LM+UeE[RRjp,f?M^||>^Xzx{ зK{v|7sroݾțqU̻yr"L|Y&m;u;92",,*,\˼iqi40u|4&uش-Cs ?]XbURY/q0k2\**QUXYAf TiI;,[\\cǎɓ'yٰaÕ+WZOe)L=TN2U1I$"[쉰> _~ !\>쯔cq(1Ed0$5ЂK8w kbaFQs/I0#+//i8eO)8e9w-o O0vCK: Ka Spw"3ok qؙs7aFnnZi  ˣG=v칋{wnvuu ?s|vN;Ə<Ȍڙ?zd.Ϛ{NrDxa&!`* /@VAM-M2aafYϵe qіb"YQ'1MDh:[\k(aa~>z_׫L:b͛5ݓzvO2ַ*c\W豓Y.qXLwa,>e=&$$ׯ`0:th׮]V]D3Rx9$ݕ=UITDȬRBDQ$b,-?[T9 j=I3%Q t2#17[\Rqaay)VG$53ꆤ1nxҿþ򕃭6yna^^|,+30:~O`շ N7 RRRmZ'~qX\|o/7|W+۴JJOXRq o/NգYb.%ɞ/\G$M2=0?_2jf-;DGx[>iJSZZ,R=-iڴoӼZzpK} w~_c_2z+Rl^Vov?![~%  .^UcbB!OzQ8H3Zmeuh0:urGP; E@{o8p!(Eܸnu:?jjU*jݠ@P%(8{oBd|\$Āa(I=sN@ߜs9,^?\Tя7D?ʪ{v9=<ϳlmq=ľҼwgO.%^~@":4<"2ϳDžufX_߷7&x8ee墝֨iP1 ͛ ƛo7oٜM 1Y1=*b:>đڪtE(+d2 $/9\2Z[נJ FE’mm,wVTR:PC=L+DryB3 ѕ=#'ce4і1Q-YĈ,^KKDUUEIQQ dehW'o$4`5=+CM!%j_ww= yR^Qy@Nn:cldH&sME(\<_WUU]__UXTTem%HvS]$TtQbiiټjjj<{kǖ}dĒd'l"ۨ qK "IfV1*NQ DըVn=HyR+**555$+#;ȓ1Q(Tn.K,=qDuusžJx]_S4*} 5kuk/4d:@%(~<\j.D"U +U5pV~+٫* WżL03Q;6xݳqTOAA?JEiiY~Aa7ga5$b2Uռ$ H"--M%jii^|XKSCAA$TF$D4& b, џ!YIP/)܏+**JHy HRH&555$+ ۾#gge9;QѮ}Umddɍ/GZL8g-3|YEL鯡_P\HPdk4C-7 ՘J9$29//_4GG[ESi^i.؂B]IK-q9O }, 1tYCF0C}9:'\UnK`7 B_׺N"uxjV>!HTP`6~AS%n|p!N\ASeojKO-_7D|4;BIDѬ8rZ5Ǿv!\Q^e_0CB!B!B!B!B!B!B!B!BE33۸*!:\%!#"3ھ6!xQ?!ڞ௧ C BQR)#bk֞3+1C޾!>yUzSט6BH2EEUU6Vffegd@^=Ry}Ddz2%1mMM{/7)l*O>f6(Y:! 3)sƎv9P8L)TFל_O-%}yzj)E}F͔W#N=bҴEDBϋu qvcGqܹwkf2e>9%ѓ42CMQǍIe00v􈱣G 6ν'kϨ2*++jp ;w:$IA!E3z_2mB~ØxhbTt'O D1Z'ԚVDd4L4^JN RRR7fdM w( 0Z6v;J UJOÞgfe+(&/( yDE1z)Lع{ߋı,BiZȊiZ "v6F&Xa:Z|>_{+vsuדŪej_]Jj _\RZTqdL*-!6._ײsr5ʲ6d%D[wcb_Ji,jjX4ڇ EIQ1&6YB4{iB19?/|#׮7g7 %%voCXXEq^owo."́CG銊tZ[˖̦NvU˺s㊝܅Kx*@FE@l\y3|}KgI$R :!B]sNI;}rܽc>qo_.'=m(*.f2w())eȲ:I2e?ՋaM}}}zF&Ukog+IZz /t3 vS͔}>FX7CB=g5ICi|j9Ս ؅;#$G|=ʑΛJ[.VٹJ_qhq@I[QZ-.SәLՠW?ts1F(jێ=1q,{.|.Y|f6뢢EZ!ΌLU"SEkm[gLq'ٰve Jnf*))vq*eiZ!N+BH&Vbfjbfj޵@ƺyD":* IDATI$E$29)B@!B!B!B+,*x43+;=#z)7oGDFiii˩H)S4%&q&[k>RvuqR!2!BFxZʉQHTPX4u|/޸uH!6~ch߷{Ǐ?ڷO/g'[vH/ν^C.7 45ԥ(2'|dH mmy_/151;z# u5ug!]xf9uN]]Mƶ#BÒݪLP<.0&6^A?{GE>z`Lp^JNIaEDFI%)1gXxDFf1#kjX߼CP`ֲy/Lܽk:bղX/\Nz.%5/\.)-XfS9=o@ /% dRyEhb/u-;'WJs޾K.(,]bVW X[Yv).)>{aqI)֝ؗR:D }̹ +lXhp9ێBIηr9x#iz55k7@II%Ąx|܅;&m?XQYRinfzn}߸u7=#swK̚Y9"v{O455-㻕/feRPXH&o?Wze݈S&_LM<Ў֣}5!3؉3k7lQ!Kowظxml\hWI ko?uBA l3G^Gvdޜ9,-& X~sJjiT߶yM=GpEx;keeoY8oֱg eB{[bVbkhh2l䖍_F gpZzmG!P$a+' ӅjL&D:~2>R 2yҿ_/XZC~ٵ^nh?:*.Ύ**4֖%vU~dC2V-;dD?lx镀_ϟC$JQeeF_ϸy\Geo;B!:/{bsQqɻ|>v\]l:HWThZe6% V-΍+v6s.x*VQѱԻ8;q/|F_rxkhѯwۨ؁ )..p;r0S'롔ta%vx54+Je㉎VvBu4H$Ҋ;f_ڻk@цdkIo |^t?*SbΝ=[;[_<~X%#3KCC]SSCXZYY [Vi9gN64'KB=<}SmN/rF}B$z#70umhTKRׯY84x#q3mm-c#Y2edݾzs!Rlmwse:*(m۱UY]:WTeif_ ڎB1mR)[|amXg}())vq*Ҳ#BEھXf&f&] Bu,2B!:& B!: B!: B!: B!: B!: B!: B!: B!: B!: B!: B!: B!: B!: B!: B!: B!: B!: B!: B!:j{Wxrⵆ*TNzBϋ܂VBb!U;;X˫|y%.OO'ScrְءA!"PdYZG-{hdCQ_'*HA Rs4Ӧ+H{dXʿ~!yOlnvMB-cij0LF ]PTjeaDI+<'dfb@kXUUrSc=DҊR*jaj@+UVV~N^Q-԰Ūe$sSCv'J45W_ߐ_XRY#= uU!.SZt*ViYeVA" 4$V81=3]@RRCG#P\.\.L&o EDeD*-0319<2!95[G[*09QR3rkX;8M%~x¸\x_Eeq>Yi .[TZV)Je:</FG+*Iaղʫ2r2 04R_WiLK!BHn6׫㫤.ߤ8u-RPP~U5+%-{Xo:]A_W͇مf EJ&X\Rooc.haj~WԘ C}BsSC5ʳ F:6V&EUf&Z<NsSwvPgd*#!1QP\{[kv[w7aLN*UTV[YjN^]B_2$AHN0t)T꽦}J搁sWT Gh*UfOiʵF|>?"]aWgY~`oYV^d9q$y+/~JWPٽ7Unvѯ^%%XYK)!BmsnJZ=3yt JeBx|xL_`HQзB2T,̌fdZ5ٮY-C,͍fĿNvqidfoafXPT[xCij0*!B s痯]mH$/1, H%P_PV^e%))02ЕTcyN)2L"nJX&Ix74p8 zZP\R.zHYIǫwjzWd2p8 *IR utRc2jXRz!B m䯴D-M547P_Dh}E$hU8;X }CYJSC>~Ȯsw)*^PVӾ>Ǯ=V-;u,+csSC 3#UU՘*ƪeK25r/YyE=PyTBiyʫ/B:Dy/TKSi`'E!j{r tnvk{K{K) u k%Epj*MTUa ڗéJtnk-yVWS9sp[%E` w"۝]ǡQT*OO'"QXh!F:<>_YT`~\.Q)H|!Bf'ɢxb2ߢ$& O))6<:&)qT ׵B!PG!{>ֿB+W=x[RR䔙پBQ*-M5~&"䪪` bf!2BɈdN>]]o߾=f̘vB2BLNNN@@@TTT{W! _ѱ?BڃՍ;VteٌB܂gEv+z^)84'U짰Xܘآ'lvg#_He!PX#F;VШQ۫bupr f`_~}؉r }u0 1:2t5R۶#r;z&wnߚ 711f׻ -ZԎuC#[g5Jni7y](M}fN*c7Rl^h rI ܽ9:eeo۷&!?|@0x<|UYaBi߾}?/%$$Bi_}K>,"_<n0"" q6zvhh_>#HְW,QSpN1#Afq1I!4,F}kQ s5Ȭr)L}355RYU{W%a}z'}7=M A^A.(-c4XZ/ Oo}]7~foScmaݧ@cC*\(>>~n*//2ePxxxQQJw*~ƭT17npn:pcoNX\\{knNx%=KtNN B}7֝鳃v|nA1Ǝ]/'}t բ}cGUUÆ]b:͞yÆ_5~i){HpvAߓ]nsPr o?_Ч?ߕ+WRRR`ϟꕼ.C~Mu?xFD?ݾ랁 wktI _c\K7zߞ#[WpF*aJ^0 4438oޖ y$]Yix=Ο6i-Bߟ:c[Gn{Gο yms=?OjZm0{Ff^In`;DB_6URR =|3nqrrrrru2yE kkg%5J4ihi)e@س<ؼ-ұC}RPRhj*/`)+41=TUDYV^mG7S'13ef^ۋ}C}eEqhcHq1"^{O=pG&G䷠]:lkLl푯^7eyz{?{+ }m!@;|锭1|d{EEJq54HUbL&?3| uߩTC[V#CFأ w39dH+9g}NsIe `P@n^MrT4`B EȬulӲv!PG&qڗB&TMj+_yd;MMD+*9 &4Z[ BsqRz|%['o \.}[ b6TV֋Vf?޵J0eBڰYTt!KK<?ΞOSo۲v@m-W v^t!ZC[>j1d2iӦ/_ <q'7ƦY~+ӧ~,(/ g|\h\xXJcTd3if'`غEȣao=rDQqE%ZCgSi9VD֫~|>wIs@Gy^;E؜W~c7.-kڨ+*Rb!pς} _ 3sqٹ;z 8˸\~^>K]d;g:uv|@G[QA^^^[6 1Je׊x:QZ<2$`L 3WXVaЈZ¨FXu<m%yNg:tu3by]ei<~S!i_:֊BvH6GDKT*DUbN[QYZZw% >4,WGGiTYt~M/EEjˢ"W.Si4+f]%6Qd˲%\!:x pͽ<BB zݼ6'|0#iNUuUn_ 3Tk. |3v!Ń\<5jBD-qNNk<B /B@!9Ӿ}0C!$/B BM!Bu"GxbQ?|_TUt=*W9-kb,'9 t(u|:N΋(n.ZK'l gB}v;f`Un8lÙgW]]}E;mzygiŏR3XJ***=)3|ݽ˙oܺ9NxĜcFusu8dk]?n`OZ̐Kit5Ǫ܅"ޟY4uܘK?2=z'CohkkziVVxǡa;w-*:[)QVRDvVPPB?Mcp2,| %r+Y*V}6tX%VD14ݖ#(&hi=N`Gfwׯ0RIIMܩ#0j~q1'Jinf+VoǾ,~K_?F@cӟx76CgTPX򸛫CW{%#:\1ttD.Bk>~.g|``R깗})ToGߊH+haiwMq率[*vdpY4.ykbla41E;*ѓ|i8=oQΜg{\k̭;׳U /yaD s3- @u^~…˕9.\~u)(oMj`ZweoJ<3ޅ ݺEv$9F$cb/u-;'Wʉo%._voktu'oyĤ޺(K/Uxx)]\Hc=%L"/>z*(qς+uȷ>ݟ IDATRʥu_qy+EgzV۔nT9yv”r55濵eK0b]GFx>Ns8'mگwƓC95E%AcRFhyeV1A^}ͮ1rr骪MX$^2'XYZXYZv5`VҨ4>m{;s•#}Y3|@Зիia_X~󽝪ZWX]^SG]8IP [GQtTO{E 0T-5@u\ Ujtui4Zaa)ҵ}Vv6˥R3](P]kM3@"}?FgTWQya#lqԱߪY:4S޶'xvw-Hx=܉fU)QE&1n(Tc2Ps`-B_.}ˍeSիa7vv8xMcPGӞSi*GiG!6yK+< q}-%*Xچ÷j R|@AAaG0eM{024s>%J>2g+>"_hh7IR}'m;CGt"B6ԲLUAnШuĺJvYY~@"DFIVNd{l0].ͪRS7*:b9za4OC}~$FObNQȟx/~g$B/{7Fo얝=ekgr5f5 eɒSB\~kW!hG$ιS7ICNO~Zz (d@']^g:-#?ZpwSRR2飳- x{7k!NF}'gT>߮c͚?FbdO(++_aK7Wo9sp2Hx;9Bk+p]c>x*/?@{ L/Ih8Ϸ0gB/޹+aB:2E0dCY~A#@JsJ[{]`𪫽ORRftԔ~_sɥ/Π3>~b9 e{lan&s΂cF#LY]]edf]|{HԖrT H)-.x*z ᨊĝ5 ** *M.qwv*eם2mRE [%g}}}zF&Ukog$\.VSS =)|FBE?z r<.\.d2L!PTʁn}WW7*$4`WO^$uS'p!i_$\3jK>::ͮ1B>r,mC؇ oK0E[MDGe ~ZYS/c6oX?,LQVV({"[4Q<789vvO=LY[il(RV׃>UG~_N`JPpoGr,lA$jԟ v6ݻ|4*(󟢩HBuL\._y"G+ur!BWtջylW&?MY& 2#}]mEM:Ynд(Hx]]PfbML'ۈ,);{^vM}FrBc"f{Q&/jK etc 'w o.1m矞n`/5s^.]l&&=x0\!P^@<;es7}3Ѓ9WGN 3ۇNomf_BGP H[VC(.en]kmߵǔVCr iPQŋ)Jnn:*?Brxv{W\m}} lI9K@nZYF'[ٳǏit!TS]ݼD"$Ykb;ȑ7 eaa#`5=*=n) m]dVKk{ +jd(o_ x^"Laq'dI'N|84qhXFfqCJJJe~E~AONyVVVF2E#>BuK/]6Cqd`; 5?'ʪ4)$7lهIӫ66Yn͚ '6oRZ;ؔ"Yg~:q5,?ct?xÄ9*j7y3 6n;q\DdtNNp8 Sf7ڑ N~ngd?EtlMo#OuA/Jju^?%ć?'25UYQS X +)SSS}ԃio_O iv4a< ŏP]{hKz꣐[g2PgiEKh*]hcGԘkV-3. a'-ü1Z󓝭93J,-֬Z+muꀈ ߄6^~Eĉxoޔ늦44=KSKgZCg|LN ^Qy]. JY%uv5TdߊHs=t,V\V ֕EfUUU>7fEEEw1/kjHMVo޾1˟?6*:ѓ c^n"*}rρIoWoAKqqݒ%'[;9iջKf1f\`z4ba6Z͛=T/N$lcHtQ71QiYnr~*Z{yܹ{ԙ{+vsuדŪm*U|L! E+2%D__z7֏y]* _5 w~@] TVX?׺#z[Rbrfߏ7H<>]ʥu_qy+ۦz )`ێ=g/ N&\ޏ=d0qko*,*7+*.vjf8mXRv6^09G}tObl >s{A'NPVntu]-BejE LE+],b3vuSR\/.Ҩ3HMj4tmn/.f~}HGG)1lD'~FbQhqg'<c5jj̜\AC=_o~=yаf&P~AaVvΫ$DٯBS]yf uvlz`ʻ`۩Sz{/ jUhL*+SKᅬSpjUX-([g]w:|p#bob>{twOx}܉V:]$H߯OHQ^'-!Z9򦠠QQxsy|&= uA"oo#t__Ӈ_XHⅾrq ~[bi!vn|N .OL]Il.O%57EDF:g֟HLQ+#d?tEE:FeKLKBg{[iڗy~Io%&J:B}ZuwPh<$2u˶2uCuAjUUՇ 1:w.YW=\,tv^y^??w A2ёTj^o3ft;j׊ 9`5 sEӽϥHӾ\.?:~dsƋps>|Xb戈C@ddd@@XׯK<+===$$dC"C&&&|ͦM& Νps7Eln7o€{ `8peDwڗ۾<֦zxK,S4ozϕekǤXի206f|4g]zO4044Q_پpرSN@ ؿMMKobccG>}ZPк޻I{3e/dť'$$3{zBT;ﰦOBB EzSD"Ղ)*E&bw *+b_Q_+EAAPBY~! )ϓLJ;g7H&@eeo@ 0G0 ׿b?74ABs( LLpۃ2mmmիW8qQGG4h-,,.^˗+WΛ7(22Uē/w*D3W/f ¹ PY ½MmN2ԔJJuu5kXAB~1@t}Pgyӎ<h09S@;o{GbcKƏWgo@TT}MMMm-,, TZZ 'O\zuVV֬Y"..NIBBmQQQl G(w>86r@½Nٜ?~XXy@  e_ w0"L?lW>8ݵ_6/88'̞C0-,S#***ĊA`^N{9/^XXX$%%566JJJrEWW`(..=z4զGMM$U8|]99 "MOO;v$$$ܻwo>v_9P}N~ZU' ͵I˲qZU28rzJY)Qii?U8O{@#o޼iCNNN~>ߋTGGGxAcck׆ n:Vӧ߹s{:j(55h əSLauNNN500ݱ aHKBNٔ6mڙ3grss vdd@G7@ BYPI}zڏ̙O="!,#fymEw<t:@i^ŋ4[/_~iVˆ O>y䠠 ]]Ǐ6 tuu޽;m4gMM˗/O8k׮;wΝ;w߾}:uԪUDDD6̓[ޮRo4`53}w@j{pi? im?>Suo'1QY,\x[|fF<ٳ?ƍpÇzzz=zJAAӧOT*JIIILL ԀiӦM6.9s&0aEGG644ox<~}0q"֭+BM>mbڶ !4x3G7@ ~V\O~cbءCfĔ$ e4OٓĈ-g1{dɒ[nW^aO%$$6|FvvCF cccV?>| {cr1M½M>m;vڰ?C B@e4!!KÎ/˕+0"cJ ?**hee& Ø0a„ ڷt;6}.KKۦ۞< ^ g^ZM~ז}ߴGp-[^NUy IDAT`?jw _a +) TU r|G8 8pɓ'Ol~@ ˾oOyC$3'rO+ "L 1r3ߛRRoA(C D ϵohvzku{E Y_lLL޽=Vrn.u !Tj: +~"˾w!֔?KtYuq C:u9^i(1dBBj)(FLLإ)|PLMB#׏_3EGt\ C D!ھfԮ#e7} {*~&x)tzжHPĴ\Zb@^[VVѣ]v =n(.h4أJ@kEPN&go9:TVNn^X 1iv9C^~v<> ?9B۫(NEz06 %$ ջZU|e`׿BBDDD|Q(23k@Ww௻o$e;rl'_'O[wԴt.&Ot>c]z!6NnK_|5ijYy:D7?I/_{x~vn ^mAini>$?Xwn`ߖ.k=Qa)0viX%E[[,,,bɓ"UUNgF_l ~•.\(++qmƵrnOmmD[7u5ձV"2m6azvH.yގ`ibzUvGny\_<7g/֘_PH$fxas>D[ Xe_uSiO 1[fy|fF}xxY: B`rVU/YMMMVyɄ X>|4:` wuL&iz{}>+O)yiR[[K#C,'~x{ 1¢b9VcƘGZ؏cl\7wӽw~UwnStu'$HHOtkhܹPDDd֌e߶ J$ҲcO)**e44Ըuӥ EE>ޞeb⤤HnS@kf.::ؐu~>({dlKE=;ddڪpo//O#r;MmH)6SWޯz6+4:BJIt7g8ɿu||Yө5_.f3:Y qC%;4aN׿:vF :cllK./c' #-z?&k3h pjq2xuyJjKSS۸u 3=4,<(CzXxDo NlQO=|¥0n69='9Äq ?,<-|5<"ƱLO8uL/è^{>.+'( dU}}2|TQY9wYſ?z{o/gq%.Ya9J0q*Nol ޹OIQw|w0zWVN޳KNIN}C}9~   DX/,LʦFQ)FS禝lǓ7o~O( FkLL鐱PV3A7b%K333utt×,YrС.;VSW癿M[O; zPvKWEي lFy0Nj$)i0\;dAz CS-0GY|I ̍OH%M^̜?wX(-SSS[RZ^w󆵿h?mp}=WyK"o^5pܼ .L7aP(A$8++/;ػk{MMw#F*.IR@MU⹓jRRj\o 051":ô?H53ęoj* M[Edcm^d&I45%!!έ<`9*X{( *~¬)9CFUk栁aB.sfܼ|In6?qh"ں;$H_OrTW<\ӥe=RRӆJJϾ@111,6H\r$ 6޸J j|_SdKIҲrLdփe'oH?q@{ӽn^m!9_y}Õ>!E<[WB+ԀLk]9f^'r|1Y ۙR{域TމjxXr9>.^XRRlիrGGF9"p8[IFoNNZ^}4:)#JD"Mx?+(|? ,u[l.jtw/S߽:Mw/wohdذ=>yKfxɱq/ߥ%~iۇNisYH'YEGa}sRd˾|w Mdu5ULdփmB-7ھjjb$%E=?~ ]d~A,/+ItU* v9^ pTk'T j䪬j$8I䆼Vञ*|?^bEM]ckW} KIMstq3F6dd>zh4:ɴ0o&@MMmrGq<ZtʦĔCO/STTf,41.Nd}ck/)-{>y"܊Ki<{SOWg2?TWSy{}8[k=;$9gߏ551jrrR[WW]]cgk7HbcrE嗬֝{:NSdK a!Z`oKJtzK~ m" a}Kxԟmv N6yo+Ɍ>=WQA(o8KxLm9Z `i]xd0Ξ=~vT;c௪Yl[ı=ϟkh6qʈ1tz|Z}[`Sg%(zIMMM.b4-XqYN&;z;zs歿@DDdUf sqv'OROEp9jYb; ?xw*=]0gD7V6ݳN;r stiϙ5mϢb5.[ѓ"9qqv[(־_j(%1صʐ{uR[ї6i_STKfGIIQMU}"8Xs?I"IOC_N <=@ E~>gqХ_8RS[vνF7qOJJwI$$ 뙍Ɋ@TTTOWgHSȏ)#t ѲSvN٩ۅ Nꋓ]Km[y-n*]n X ,~07o~څ ?D/!0%5 LMmR $[?黓&&!'nXa]\4{ڗQQASVsn391Xs`A=R $H/;KO}' DKX:jzvIm0uw0f  = e.@gԇ&n* =W"qk>ׄ/|cv(0 :&)Ml_ [nkVi̇3a=***9vܥ׉oͭx2ť/^4wOE&?Ed~\>9z9A@˾]# [v=4+0-Z>OX<%ݵQp n\q\G}KƵ:V.B"0 {H + dc[D&Ed~\>[ x}L6 q)~CLEy%q=HA1a0\e0̇gh...22?%|=tHmm/S p807{sx>zZ\R&7(ƈ?# XYc+WӾGZ؏cl\7wkRf|Bb^~4Oʝ{EDDf͘u3x+H-po/w}weBQQgiY8))nu;<y%+Nq616aFǼO *=BgDf[d>Pd6Yp~}Ho8. %B)II-i7"0i'"uq4ޑ-Mywݿ9-\\ - nVKsCO^P\RQPXHDXN_|tAAQC%hˆ6EEE9=GOwgaQE< 8sH=]1ͣOKKIMtc2{;oQA~!ȱVlE>ӥyNq僮61 ^KJxS]jg1q&N, 8*͢jjk;IEh|"]\d1z!A<`KjD#ܷl397/~=k2c߿-$7Ҳ Ξ )iuj׊a)7Dҕk&] q)T:ŧlq@$"t=y'At:+$!$dThK RS"992})V5K;(hTM 5kП?) ֵm$$i4)NpNZ^}4:)C:JD"M~xl^'fLJ}2KC?K}rgHJ+.ӥY3ظgҒE}NiqO'YEGaEa0m>EaMdu5ULd֣$7 27Yp'oz ޠӾ0zڗ/2 @Fܹqp@V7QQA++k4i F@𗒚qfdlHۏ;|I@љL96 jjjS>8ڏaH$Բ.اS6\<%%%Lz򈾞N^>Pv6c9qqv%[n[w)wo,Z{]R2$|ӛLM%Irά=2{9lmpo񸗑#L_[[[wOA$UUW?c 86rt 9N1ƖNovUKV;8o 07;~l98z`\]C_sp?)Es`ނeήؼGdwQq=]o DDDLF[.Y>m0g'oy*֎֮>t8Uz:`0\/Hn˷oD$vzVWl ڹ1p9 /?,*f ѡKXž=i!Бq*3}&x9<57s|kn\i[l9(x77m=mvYdn~rkHwٳ +8yomkPcc͛ 'OTU%VҗNLBfʒ/Oή4_N]ON ***--*ʬ%e*VRRZߦ 455S(zۤ.]:u3%|qv8}e{ nG\c\ZJJJs>+*deyo;eK,8ݡggmfpxg' IDAT>Cї6yob;ց1N,'9bvJuv~gA lٗ;OӅӾ8ِycL?LSkQTKfGIIQMUmA$kSG^^À$$h '!A~˯^`k'gMA5Ҕ-(9K\\e.}ڶHw=462y`5U~"?PVR?JSNEn" }E@ ɿ>ᏅAh^IDǽ.bK/(LIMS!Z}Df c4'poe+ߍR3'Nd%44,$Jm?C6k9 @f%yFt$s1{ +TƱct=Iǂ@_0aʔ( >h-/fSJJ55Iw>'w9:jXE D/,/CpUUU=gH$BH~CC{ ֪ -b?hbin[KKG_b&h.P(bww-M@ =F?Ǐ(((G\vmڵ/]ʙ5kQ\QN~+@_ז?}󦢡1r_Iݜז1C(C 3t:}߾}+WO+/lM=yѵ {5XUU )js'1QIEEe㈒8/>z*zSmÆuOF"{TV LPXT drvWn} h4.[Ze{rgGApOdt}TD_ɓ'Çe0gΜ?~|O{ɓûpрK_ޝaOrvN7f"2{G3_" z+ b NO|&g/ǂ|-7~@KK>K_|5ijYyyc2_XJwu[skp /p}"ss .іp޽J;;^{Lgl1?7 s_?X 㺋PS#ZU%{ď~Hܾ=~\* I|ljrrU`9S-xzjur6Pp n\q\׋Mt پ%pZPWSkeq+.cXl>^؃D]Op<]oG\Yh凴{v>E("Cܞgѧ勂BdddUUU=B?QQΟS_QA I**u8#c\%}Csrxeɉyxh5r&W+t`ĔVWwqi`]cƧ1 `$`2?MK4]\\Y_ed~JN0M{ں_'74p`an>9,tw}S]MMnP(F 3ƌ!}Xw͍.X6c:{1?~ߟ_ !!>ӭrCY3an H`3po/w}weBQQgiY8))nu;<y%+Nq616q.)96%D[d>Pd6Yp~}HDF]].\(,,$UUU=T`uỉYꓺ: KP0@TV(5wAJLTRQ^ϞjÇ.֒Ticˀm%&VXY)geӵO\ƈ@Μ]?xnj!Zuu-\k\.^kef6n] Gg(.) ((,J~v9NlQO=|¥0n69='9Äq X`GEz:5ԣcm sBkk+'N&?jiiHNũREe~\`b?_nj"_ǏCW4 ߂jTƽ{+W~Q[$-MbЕ^]V3k?n|!OwWs^N.VTTgk=D4΃>^$IIQN&#WT_Fmـ=jk&Or\`n|B/Ylr*c3l@iOڒ2=] 7uG?N)@ٴ%l-#o^5pܼ .L7aP(A$8ORZY! _۰uyʏK^SFRRYYuIu5U))njLDa{nlknf]@++mߝ>A_Oa¥+?l/2j "27Y@' D@ vΜf'V&fΌ 'NTg`aTVҾ}׎ӝ` /A;ã`ذ޽=Āb~~C|_ ȨVNJH bkB[F_Y9lHiإ1SAA^QQp8n ,P0H$hj D'{srMOte,CP@T=͒YSsSrʇQ#M 9僒*1A.zeϴ@ܼ|In8uG:[B2yHs;/ô~ӥe8|l:ԴlmİؔD"qʵE--ƥq#|mjiYyAapmz[S~ PDdn. (]O Ag w:׉CqqUկ6G-/_{۷`-޹Ӷްa2.ٴtڴ;w;5p|R$kH"Ih4S&))hN:kwl{[:Mx6”ܸ"H,/'k f?0)c7N㳭rF?zBi$$gLHzĶIIsKti Aq/okm/鵵ujtIn{wzACn!H{YVFÝ;qD;l".%AD{/S3'&5UnĈAL1gfHH3ũ:8 ^ׂ-r}n={;쯥% IIYgXuj8B󗒚qfdlHۏ;|ht&iea߼MvZtʦĔCO/STTf,41.Nd}#L_[[[w9s+.M=]Ex#psoKJtzD"IΙ5'srrY1޼}/'7-uu5v8.;mt)Sc}=c'CňDBc#zTdn. "2ݦg @Q||o"C2`ƌ XY=*(hљJyVCJ/['3ژƄrǽpg/௪Yl[ı=ϟkh6qʈ1tz|Z}[`Sg%(zIMMM.b4-X!8,']]w9}_ ""b2w*iuu8;FS4vv#@kk,mFָw?xw*=]0gD7۷mbMpӳfK΍gYx)֦(gQ1]º-[ѓk⇎߸ޏ8PQV5it,Yc.E^& GXed~-r{+2Gn]9z D@_0!'G&5 086vғ'N^vԔ2qcjCk-jj*gh8`&G:Qb&5_IȌ_XY{ٕc˩ qҢ+2ee~>khtz[I4+*de;.;9ù3 JJ@s%r)F}=mR tw:ř>]rt{;W_=y#t1\ZV.-%%%9^[:%"@eeFPWPp$ȂziA~^f`8~c;.8}i&6#/n4_NBpp8 *0,E$Cee ~X=NEǎ隼g> uaBBͽ4occ.omF_o(%\3ŠH$gd //a@mHC WEm_cOΨlAɧYb',;t}ֶ@sAͫ|q| j%a%EA zӧDG ƍ+W WPRp[ui;ޫJv-O1%=Nǀfz3&&rK,\rrgfmOڹ3)88.=WQASVr]L-mABk9 @ 9r=:Zٹ|>ٺuԋ7߸+''QOg'~e_@ ~Zg Ev>[hB@_D HXa`t.{3ӧ3gIs~w@ { ,Lɑ1π992ka͛l!,mA@ --P=ZwsVv[stbRML~' LcF,+'tܯGay/GceUO@ n! NM5߶̞=,$dTh^DҪOP,N(oҷ<[׮ --f =&]xdO7Y9_aߚ[;u׏N/zT&پ 3 @"]DCIMi|۲}re|_mmD[7u5ձV" w svz;ʂE+?}pBDLVfZk%@ FF\ƟQQi|6]=*i?}XojٸБ{KJ>pgWVV@|BbXJX9ۣ.8GKZ5֭$b' ĿN q/h(+O C=yPpwgη].+'dB D_@93A9T'O4V4|YxA?uѢ:?C޶EOWgzt?vÖ#Lh4ژJ#=~ĩsd2vo%!'7{jjb{֫^bJJ˄z[Ck3+ t5P*+] ڲF&rɍWڰEm F;7־҈Ȝè@t֪fi9b$Ĵ/qqb uQQ̙OeewN&0zwg&ߘ(!94rTSS[RZ˾ a󆵿h?{ZYYm z:N.] gͫfVas9R]SӶVtuiTH32ֈ6o r쐾+dFSGlR@JUI=9XYlt:LH' xQr@ X++ݽtϞd~]JOW Ei?{HWU],6{l<b-z8ǡ9q]Bɚܼfcwlo֣'F>^^9'G&>~'ZZׯ;?ퟸ҄oBB1~,~7lwH" ¶/Y- jsSFII#LXܹ n%E)UVW%;Zmmm~l** #A {jUѣ`v256C: D06_u'&s~p?$'INϝkuO;aysft J+mHfo>@ cc`!ѣUUIIYYAz @jnEڵw.r7n 1SVS,"{w̙jj⶧Ftb[Q !3ķmJA‘T3'^y];@ ώx|۷JsqXF]])=}&*֧A@ Vwɑ9s\T_C F9:''OG__Gh>^&̹ZhiaL(]9u5Ba|Rl>FUBGPƫץ""8M[~w~EXE|΀ið4Z[Yyֳ% yȳi;~V')I04wr*]^"iQ#,UQnju5D`cd@<QdefgjjCC!U@ 3߼KV͝{_62n^.h<F}˭r>9T5R[ƎXBN|S6he(.굱ӔlҔ;tz 2-6ZA1")45LׂO15 ++o{}2kcW{t\cP`*n@ o OFFt[_ZZ}rw=*+& ''G^LI=pZP-QO/_TV4/J0:Ҥ>""8uRƾk}$}z[;dl]v.dw"7YYIg3x1\_XQTX@ ћe&KW2Y-J dW'Dnj*֫NDyyqBƤd2XUg\]C۽͝{_gL)~#߾+S<7/Owm"_w;g@2fUx $zr E /&&zdo?V &@ D#ھbb"vkœY" !.׏6qPpCC(*o] <ܴY/-\`0}ڰs/]ɜ1籊2iI% lHDPd2ٳY2@1:?/ˣ f?@  9ŏLxppjDIAAKV 2~#Б1;v%1**PW?9*(ny` TUS`L=\PwItz˷ܺW?ip9,no]:z}}дfW!uhe%JkQR`bc_ KJ)Jl5B֎ZzY1ւ9b j &Č@ 鮨~{P-JM߸%ph..NHI%O&0U74P%km[ΜK;2@stKL[i7B tWg6Z^J"Y,̟3ٻ(6U8zo*X"h ^b٢K45X7\Xs^8hٹٹfX ȁ5B(B!! & B!^bgtKBaBH(Y\*"TDDTL,6,p߽ !Tt?B!To,Ua) : M)OV.BkS:iCݼ~':#'nBLg/&hߟ?[d+r9I#FjY܅$Kz[$2/o¶jFne{uݻPo"&GFz./b+7GN.+_٭*pt9{r@⫉^mKB9M96P>lmgMo1qdաj ܉θz=}[[h]xsA)Vﮮ,R|&ޠLV"̙ժDzL4u2~ӎ YKGz xԹ1I*1SdD' پ>f]?u"w=ys=2Pbbkܪ};gc^ r؊r- rJJ.!Tߙ6m&RWmMIA4F ƾ?~2^ <;>}6d2ߠǟ.ݲ_0qƝ6J^hW|/%"K$&:8f…+j>s6q̄ G;CQ} leʍ3ĴYW$dt}\,EѓllHvP/D"ssVp' 0,#NN3ˆ1/HK@@]9BCR!T232.^fѷQr9]!ccޛW m| {Ǟ>~] v>wj@NNP(;|4n@_ׅ_ kgp7']|E|zUжM+iu@a/._I^úPbm0֧J2ofq|3LBCk96:W_v)9A `{y%@4X_=zgs@OefOK4g!̌L虗/Z>swr4R./xU`+kC^<fd3G?MO+V.Brc:}zmr֮ye0r'E,YvLXXk l #i~@i!//:BFKw#IbG;f`ltӖ$I5kz dgG#}vCO+nF6ܜ@`gs cjno'HI<`f^2ُ&,hgasKJ2mȁ>F X,Sø1Al7eޢg%sn5m_ny#BiF۳S@35?VִxLF MyFFLG53=hK >rvQ/ 53Uu0EZ>,,^83@"gf8u%'L$SL[Ol8ߴtj9cZsm ._I~@&)fl=zDխB~Zəh&-ik07Wtp\azdޘQ?Ml6|>ᣬXuq&jWPNi-Oqc|Z6>eӿ 9]F |nBH+5>y_5VœoK|س{SA20,[Ҷګk0v73Uȁ5B'צƈչ8iiZ׭~!ɥ"J*KELDI4M,b,,Ȯ}B!PB!P#B!P#RC!pqZuE=Ow76$YHvU63;[(?Jpij~$6qY,V28%.ַ0\^3]giOBGqflPRӾ_L%\YKv\'%ܣrR_U oܻ_0~W]{7h +-yvtO\񁭪}r8ν;jS?oD2|/;;Gú{n l*mDxS<|Lsɥ+~sw q:p8NJtR!T1|Osm"*S^>"ɕڻښ|H ]:09c'~ٲEέ8uG!xjU[r`>-wɣ>m`[ˉcuRب7}ծD?&s8]Q T-;ڴ擿mc-{z䚵۵ {AV HccCG4"9Im>q}D6mS~]7!T^f-2ס>I̹4P(11tjcSQ=Bɩ m9.O.(kj.ʯ>IimҬk VO8{^s{١CdS'9_O3oIm7엯} 4{ C*^d2Ko/^E9qiKJ|}0!jѻu3Իs]tʊy~. )>?|Lm(.*⛚M&iӟ _!kX rkvlbUu9#DFU>f9t@cc#ݳPX:>u`K |Es_/ۃP#XPͩ} M?~3^9INuH";p-v5TR\&9}'1k/=[ c^\'Wç$jnOؾqIMMMߍ&݉VUs!_r--=Cæb _닗^|3 n܅e"і]RxkL:2 ҟ;P}sKI6Ҳ]Mo:O1OƸL+@U$-&jXel\Ffլ9 '|k++ 5iZsW0W TgcLԙk B!TپF#,շ $W^m|ݔ9[_~EC%,)SRΟSO{L.|_i\Q=in|fL]k ծ;[㗶-{r[G4'USGYx|ɣ^3EzoXտ=>^~q6BUT`ᘹX󳴴̾u+W˅YYx c^gdv_AL~e.~jTj@v9v|›.5c93ծIw߯aCF9q [!4-oǯƉoSϚ FFoЬxgͫZ?B!T٥^۱;/L\}A>lesծjbjn]wE"bQ,+Gx*-bIu9{s%/^SY.ظϽzt-P'zؑVP{aXYN>A(zu8:,5 iId`XYZp8̬NLdLfmrжG4vU8j xFF@o4%R QAa]}ݷ7QoE%-<Ϛ5]O ޽JMj* 30ĽNP݊ͣtNظCFݵYupxiƖ[Nu+PiBH1_?p¿kȯG~uTK^g)!t_2qn5tWht]7Ւ%_}(TUBH< 4%y;j$h9}Bեj꾽d"qABbq\|ɛ$Z&׳1p7vw~p#xo'BuK7#EoSbʾvSΞd >۶G5vefA袵H$R] ME4bEXҴoEr_?:o s[,KxNGw0)Ŭ|zAҬS'7͏mڷG|9MM%mCzmJαP, 3,()޻pԈV,]:ޯE:3Czt2CĮ.N==qpx]B\䙖˘?TpBik7Gqp̐-*$%ڳ4ag{X\XXQCfڴܵe峇LM )I"y7_&,-O{h؝z_7n)O=~`2Y,@9ʫc'N--ѻcPH[ ة_OHeUOӧdeD.u›g:<{(j+@m WStʵ#o+0O(=5[jQ2$##bX1$MQfy,[ȍ,VΕ 5TN$!1ڍ[1/_;xoٱ^9>{S>Za~ 0!_^}z'O{odos݉?|d##3f/ZK.EEKSR*iG7WV-]wWg_oO& N=b,2ubC]_yʵ7w ty4FQ!GLgИ vNeLz>ä:w5'Z4޼=,Gx~~)3}SۍR IDAT^qRU{srܴc٢9`j^]W(//?8_g֝6^CVZXcw>Xe~3iZiY"_i:'=knBNg^'YNil20v9qLsVIھ,)Sҋψ}zcNg'o/ai{vvN' (((r=sz2KV5)Z9?~קg֭lmEfY:sn 6v\.u\.wԩ5k JE^ S1_%M!ٚзǩs@$MNQ_o Ag ۲QrƼ ?ڵeC_xJMa8s,lc o7nͲ¢_@>ݟ>E=uQ[n\:Ծ;mia|[UUOν6۱} cZ6YoީxXiaR|mlC_OO4 ž>*PCA#Ғ(*fs/8j}M< fm WGrqf6#@@Qտg?$rvЖ w7g桋y;q4'Jku$O;]vYT"P4܀l۱ḡnA-_<%%ۗ痔L2PȟLgڴrJZSy}{<~ T˖Ņ'O$IM;w|ɫW, Rx܃y hn A4]=ẕS-G (xK'vl6 E,]8 OY8tT^^@0~̰CGOX[WT,uxg=E\KVuuiJQԍyNt+ɩiL\;Pª-+-S_-ڧ9¯&ƭIMHZ+V\L&W^H$14\ۣ(<{ 4 wkLN)8(26RThf T˖illQ~ 痙ah YIw'-h%/#lDjkc=_ϰGD"X"9E1_ƽz>ӳ+sy?hD};~rJ?|悃Yb]B.ZÔIc4,}{/'Eތ۪3;{|C[ 6uKSr܁V`Tgs"yf_PӊjЪsů^}[[o׉y^ށi7\^eB'l߾' T4쿿Me2\NMӥeeRSpݻܧK<.+=p#d~ lNZdw"RT1# }>i؉Se2M+V/^o4//߭xIJJJE5*yo8*x{ʭ jؐ?7_U.P~i4_ g>}u+%KKzut䰁Aݼn 90G &AcXCl%Loޥg "SвD-*v6Fr9 NO?YxOkS:N!AW/7mdddemp?R",{,uUGxnW3[ki 5T9>񸊐)G~P}sNM*]CT{--͕ TTXZ Ԯ4i!PCTO=c#)cxGNS% @J'# Λfdoь6~>?mܿۂ4oug#G\oTbGi7hЃ5)gִҚ5 7^RP}A# cKK)٭N_,}'+imhdOCL-1Ӟ~srluk$3uQh !qБ? LMu)iݲ$%U_HSHʂ˩Gw7Gp!rfVfV$>f:C!z#P5!PLwkI3'M.p_%|,'kBƨjOPY?[놠Z}|BHA*!BvTy6B :B!Ԉ`B!Ԉ`B!Ԉ`B!Ԉ`B!ԈT"!bb5Kõ#u1|QC]TeؽBaPW8UrEgC QyD}w!T>O,xTUiW3 q䛴Ñi4FRvըz!cp!j仏CO:>UPa[vmϗOhk챽AmkUA ,J7`q3u7pZ摿=?]nZtݺvBP l,}}A^Ɨ.M>~~tMLzɦha-.IPNNn-WͅF){ۂW.OP \:xy᱆zX,طf-($ɰG^"oe 78n'}==EƽN\fGO4UKjPGS5x_nAw&bT*MSl٘=T!{R_~%r|Ѳ¬K:-=Hec6HB,h9E||.!T&qER:_(/+@YiiaA1I)(!KB_cec6'4ǥ)1$$i{6Xv7$f>FFeG'>1CaOHzϫߝYa?3}0j\|c΃Ə8shY:uV?]Hzgp-W^$n Jf3G? ^'x1cff̠DȄW2hǏ:Z?_'4:v\ON$I.˴VyE$['ՙɡi:'7O"xǡB+̥jը 2Oxm*$ @)e.÷.&=5ղri߸ )BK(420g/' ?:)Ҳr+J2icû}iog4d[L:ň2|<,Yu SCEu*/pŴ/'x|e?̝D"Q٘WP2f!H@NQ23+ʲvzN*V>ICzr|^fy֟I@Yoc(ogR"\Ց?s#]m?gjTqd@ JEyŹ_vuPsu uĐފLp( I$ H9EdrVks,ڹ6Jr$Kv6| >O$"I}}=$ ߦMߢ{@0]Q\"KQ['BQ?9%Dj[wMb?6600M ;#oމpߘui.--$$w nc? 1t`}mwlZ֩f{Z@>_%("ɤ2)t0jT77swuiZ(2eiHn$ 2MK416KIͰ͙m)$҉L5KΙ V?QCvtk3 dKϠiZQ:BceGAaSQ"0KOM..gRܜ9K'CVofYnڷp&`YZ޴nw܁M cVFcPcvu]MD>`q9.}Y5&=| i`hɪ~vO587[}vœ9:-k"aaRLTRLT%i;>>#juq5P?!P?(]NV/ȧoǮUNcCA`ϊs &uw05&t{EqFk U}ލU`".cWk.FݙݣgoX :O`Ts/sLJ7Eo<xh]_#JQ|f2pO{D 2@Ӿ/o /r֞uv4c^6U#+8zVIDATZs$x4֍yDIŊi6 x̟j2.^D]7!Ѵ^ޚ_o5H5ˡFUZik];̹j&6ETMiI'˻җLӦmok- Bu{70 2SOڃZneiO'˻򗽺LBzT2yQc#rKbAnNIuc]W]^%C!Ԡ(Έ1!ԍv0ĤdǴI -dOeҶ0C!Tj ԗ0EkeiOӾ  WTF B;jbUҍVǐ.v6̕+Muc tRX!ꑪ^ @_1=MiI'7-*-ZK!Gr)5*uJ~ҦK `B^p {iwumVtCzekM5d;:!PnoܺnB0C!T_xq+7/^9yȷɩ~m}O:I$kSB!jq"9Sfhvigvpl6KNQp-W~i2@" lm#&I33rffGOi4"b8;eeTZgB!Ԩ(>-ӡ)+-9GmVPP_XbR),]8 O{Y@sA"-'ХWS_.s¢.*{!B+{|T 58'٬#gg玟2sܨ@ӴX,?S %5ᣧin.>I7-?tuˀiS'4e1$V{OennViB!GC8OH4W\"t9탢Rh6p䰁Aݼ}{;d.g;{hz6x5=q%bnxm(9m9w!i >}Nz­uoԻ;W ៰m}䙆"\s~Ax=fV5`ߖ-!UuwsS$j!҆Ӿl6jQf%)bOި/>[7v7sZs桼QV1JӴHo4}#Ϸ444PQ 2LQh(B!DՎ㿿4L|Gm[?QUK+ Ix<[Yu}ElPf~ ).]pc⨝[D[,  5EQ^9i{]WլͣOOУϐ/}:3+ v?|nΜG_64o26ܢr^}z'O{od1/7i >!мɕk7TkcX^w˜yK5 #?toO9Fjoފ7{~ۊ{ڍ'OO>{+((G]pWfcz B!PP K,1_ףjɧr.zpE=~a{jآb0鳘AHpwwNdx⛤IS<7sI_LjvvY܏244ضcIK OGI$R{gr)ŪK}6cʋmm4h6"(U _^qaK(,U Xt#܅Kc&|UM2734e ,[%?\^Vпo k[ՍwtKH|ܴDاw*B!Tc6bss5ǐ))%@Qre܅D W3"-w[dc_UrEQg]լ[C׽,GG}}=;zҋWZ4744IƘ^z+,]C]v8\,[, }\K.܁ 7'\jm$InՒ wWj_4rP؈ L: @U7trبOOM;JBQKDFz.A).dwem]ۺݽ9|_{/ĩ]|*_SHg߻k )mltIPqz!fYE.8RXXdogݲEkW8w갏g:tqbf4ȋD*r9L3*BDf&I 6)/?_Q\.W=NNZ"Iة # hU4C$234BZSiXT݌; 0PqdK>lL>~-vuGXDP(RL&S 8u j"6Uܽ^<OLfrJn޾69E϶Yӧ^qb-JRŹ }r|(D"%IR6 bZMs^FfӍQV.gdOPLuuRT$~e:A"*'zveE˧NF!P-14 ivŎM /|vkk G݃!ݙtŭuo`pp_#۶ I|7myzlb^j7*De%%B&gἯ 3|'O'~auv ۹YO?f԰f-;x{چ:s:9F{gƼ|r[dyF(RT*cQZZ4*M6iʒ"*)` "qA EjG\AAQJ$4iwZӴm*ߧq{o'oRz<^M"##5M4lRSNɓH)d-f3V ڽgƅ˨>CsƎĂES&O4L -2ybӿ?TJYVVfxaGi/+^n wz@3Y[dds~4݁ _cb|ڷk6 "Nymǜ{TLL)tz50O>*(f? "1!1SJ6.rĸѵr).IJLX,$!DёX#&Ąx[ZpQ۸6V*lV~!huXZ;zBOpM+^99/95iu_MĈQV>gY{!(oA?[E\ܛOo-ZXџvi! G^i_ !B(P@!B? !B(P@!B? !B(P@!B? !B(P@!B? !B(P@!B? !B(P@!B? !B(P@!B? !B(P@!B? !B(PKV b)iYB?c]h)iYF  (P@!PWEnM@Ց]_h6>V˧../7o r? 羇L4}>sՂRWT}κu}ŗ\wq/_&a:vHyexP MIN|ẨH!ϧ/<@ Ӵh9?*dKmsW?~"6ֱ,lJl6[i#oF!e;L`:ONJ0N'#""fݴ ̻?X:OxI*?X"Bn^=2{g!f)IB6mqlwWCԕ-6 5NGFFOdܩQOsz܅34MJ*ucuBXQ%G9BJKk. N*iZЭ$%&أF\/<!q !8qX"1hmԙ-6es*|%"BO,4.;qf͘RVDJK]ѣW |9<Ԫ_睫;rTƎ͛Y,KEa&]%^Zy!kˆ7ò:1ʯibr^G|t]7^B|>@=0>R_㥟mg !'3i_K 6དȞ=ôPzHO ;qc7|!!Į½_n\)|"-uK2{#ntiVf˖-·? u};G3{Bh~ׄzRJ׫iK2{8^Y fGRS;WTiWQ^Qzn>bUaoL&W^.n|QQQ秥{}ۼyw' ܕ+hnf#NB,}qń[o/U/5&ktq⯍ 7x߇sO%kx{$!}M?>yz+cg}dМaZeRכ_yci"Fjߠ퟽gd$>X6yɩYƧ޲@cNWX㩁w4GBzPqf]۸^B_#VS? ?lU{ * * * * 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 . * ***************************************************************************/ #include "configgeneralwidget.h" #include PartConfigGeneralWidget::PartConfigGeneralWidget(QWidget *parent) : QWidget(parent) { ui.setupUi(this); ui.verticalLayout->setContentsMargins(0, 0, 0, 0); } void PartConfigGeneralWidget::setDefaults() { ui.latexUrlRequester->setText("pdflatex"); ui.pdftopsUrlRequester->setText("pdftops"); ui.editorUrlRequester->setText("kwrite"); ui.replaceEdit->setText("<>"); } void PartConfigGeneralWidget::readSettings(const QString &settingsGroup) { QSettings settings(ORGNAME, APPNAME); settings.beginGroup(settingsGroup); ui.latexUrlRequester->setText(settings.value("LatexCommand", "pdflatex").toString()); ui.pdftopsUrlRequester->setText(settings.value("PdftopsCommand", "pdftops").toString()); ui.editorUrlRequester->setText(settings.value("TemplateEditor", "kwrite").toString()); ui.replaceEdit->setText(settings.value("TemplateReplaceText", "<>").toString()); settings.endGroup(); connect(ui.latexUrlRequester, SIGNAL(textChanged(QString)), this, SLOT(setModified())); connect(ui.pdftopsUrlRequester, SIGNAL(textChanged(QString)), this, SLOT(setModified())); connect(ui.editorUrlRequester, SIGNAL(textChanged(QString)), this, SLOT(setModified())); connect(ui.replaceEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified())); } void PartConfigGeneralWidget::setModified() { QWidget *sendingWidget = qobject_cast(sender()); QSettings settings(ORGNAME, APPNAME); if (sendingWidget->objectName() == QLatin1String("latexUrlRequester")) emit changed(ui.latexUrlRequester->text() != settings.value("LatexCommand", "pdflatex").toString()); else if (sendingWidget->objectName() == QLatin1String("pdftopsUrlRequester")) emit changed(ui.pdftopsUrlRequester->text() != settings.value("PdftopsCommand", "pdftops").toString()); else if (sendingWidget->objectName() == QLatin1String("editorUrlRequester")) emit changed(ui.editorUrlRequester->text() != settings.value("TemplateEditor", "kwrite").toString()); else if (sendingWidget->objectName() == QLatin1String("replaceEdit")) emit changed(ui.replaceEdit->text() != settings.value("TemplateReplaceText", "<>").toString()); } void PartConfigGeneralWidget::writeSettings(const QString &settingsGroup) { QSettings settings(ORGNAME, APPNAME); settings.beginGroup(settingsGroup); settings.setValue("LatexCommand", ui.latexUrlRequester->text()); settings.setValue("PdftopsCommand", ui.pdftopsUrlRequester->text()); settings.setValue("TemplateEditor", ui.editorUrlRequester->text()); settings.setValue("TemplateReplaceText", ui.replaceEdit->text()); settings.endGroup(); } ktikz/part/ktikzpart.desktop0000660000175000017500000000040411455417212020732 0ustar fhackenbergerfhackenberger[Desktop Entry] Type=Service Name=KTikZ - TikZ File Viewer Name[es]=Visor de ficheros TikZ - KTikZ Name[fr]=Visionneuse de fichiers TikZ - KTikZ MimeType=text/x-pgf X-KDE-ServiceTypes=KParts/ReadOnlyPart X-KDE-Library=ktikzpart InitialPreference=12 Icon=ktikz ktikz/part/ktikzpart.rc0000660000175000017500000000211411455414614017670 0ustar fhackenbergerfhackenberger &File &View &Process &Settings Main Toolbar ktikz/part/part.h0000660000175000017500000000467211455414614016451 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_PART_H #define KTIKZ_PART_H #include "../common/mainwidget.h" #include class KAboutData; class KAction; class KDirWatch; class PartConfigDialog; class TikzPreviewController; /** Provides a kpart for viewing TikZ graphics * @author Florian Hackenberger, Glad Deschrijver */ class Part : public KParts::ReadOnlyPart, public MainWidget { Q_OBJECT public: Part(QWidget *parentWidget, QObject *parent, const QVariantList &args); virtual ~Part(); static KAboutData *createAboutData(); virtual QWidget *widget(); QString tikzCode() const; Url url() const; protected: virtual bool openFile(); bool closeUrl(); private slots: void saveAs(); // void showJobError(KJob *job); // void slotReload(); void slotFileDirty(const QString &path); void slotDoFileDirty(); void applySettings(); void configure(); private: void createActions(); TikzPreviewController *m_tikzPreviewController; PartConfigDialog *m_configDialog; KAction *m_saveAsAction; // KAction *m_reloadAction; QString m_tikzCode; // document watcher (and reloader) variables KDirWatch *m_watcher; QTimer *m_dirtyHandler; bool m_fileWasRemoved; }; #endif ktikz/part/configdialog.cpp0000660000175000017500000000750211455414614020456 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "configdialog.h" #include #include #include "configgeneralwidget.h" PartConfigDialog::PartConfigDialog(QWidget *parent) : KDialog(parent) { setCaption(i18nc("@title:window", "Configure KTikZ Viewer")); setButtons(KDialog::Ok | KDialog::Cancel | KDialog::Apply | KDialog::Default); showButtonSeparator(true); QWidget *mainWidget = new QWidget(this); QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget); m_configGeneralWidget = new PartConfigGeneralWidget(this); mainLayout->addWidget(viewerWidget()); mainLayout->addWidget(m_configGeneralWidget); setMainWidget(mainWidget); connect(this, SIGNAL(applyClicked()), this, SLOT(writeSettings())); connect(this, SIGNAL(okClicked()), this, SLOT(writeSettings())); connect(this, SIGNAL(defaultClicked()), this, SLOT(setDefaults())); connect(m_configGeneralWidget, SIGNAL(changed(bool)), this, SLOT(enableButtonApply(bool))); enableButtonApply(false); } PartConfigDialog::~PartConfigDialog() { } QWidget *PartConfigDialog::viewerWidget() { QGroupBox *viewerGroupBox = new QGroupBox(i18nc("@title:group", "Viewer")); QVBoxLayout *viewerLayout = new QVBoxLayout(viewerGroupBox); m_watchFileCheckBox = new QCheckBox(i18nc("@option:check", "&Reload document on file change")); m_watchFileCheckBox->setObjectName("watchFileCheckBox"); m_watchFileCheckBox->setWhatsThis(i18nc("@info:whatsthis", "When this option is checked, " "the TikZ image will be reloaded each time that the file is modified " "by another program.")); viewerLayout->addWidget(m_watchFileCheckBox); connect(m_watchFileCheckBox, SIGNAL(toggled(bool)), this, SLOT(setModified())); return viewerGroupBox; } void PartConfigDialog::setDefaults() { m_configGeneralWidget->setDefaults(); m_watchFileCheckBox->setChecked(true); } void PartConfigDialog::readSettings() { m_configGeneralWidget->readSettings(); QSettings settings(ORGNAME, APPNAME); m_watchFileCheckBox->setChecked(settings.value("WatchFile", true).toBool()); } void PartConfigDialog::setModified() { QWidget *sendingWidget = qobject_cast(sender()); QSettings settings(ORGNAME, APPNAME); if (sendingWidget->objectName() == QLatin1String("watchFileCheckBox")) enableButtonApply(m_watchFileCheckBox->isChecked() != settings.value("WatchFile", true).toBool()); } void PartConfigDialog::writeSettings() { m_configGeneralWidget->writeSettings(); QSettings settings(ORGNAME, APPNAME); settings.setValue("WatchFile", m_watchFileCheckBox->isChecked()); enableButtonApply(false); emit settingsChanged("preferences"); } ktikz/part/CMakeLists.txt0000660000175000017500000000266011455414614020065 0ustar fhackenbergerfhackenbergerset(KTIKZPART_DATA_INSTALL_DIR ${DATA_INSTALL_DIR}/ktikzpart) #add_definitions(-DORGNAME=\\\"Florian_Hackenberger\\\" -DAPPNAME=\\\"ktikz\\\") #add_definitions(-DKTIKZ_USE_KDE) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../common ) set(ktikzpart_SRCS configdialog.cpp configgeneralwidget.cpp part.cpp ../common/templatewidget.cpp ../common/tikzpreview.cpp ../common/tikzpreviewthread.cpp ../common/tikzpreviewcontroller.cpp ../common/tikzpreviewgenerator.cpp ../common/utils/action.cpp ../common/utils/filedialog.cpp ../common/utils/lineedit.cpp ../common/utils/recentfilesaction.cpp ../common/utils/selectaction.cpp ../common/utils/standardaction.cpp ../common/utils/toggleaction.cpp ../common/utils/url.cpp ) kde4_add_ui_files(ktikzpart_SRCS configgeneralwidget.ui ../common/templatewidget.ui ) kde4_add_kcfg_files(ktikzpart_SRCS ../common/settings.kcfgc) kde4_add_plugin(ktikzpart ${ktikzpart_SRCS}) target_link_libraries(ktikzpart ${KDE4_KPARTS_LIBS} ${POPPLER_QT4_LIBRARIES}) install(TARGETS ktikzpart DESTINATION ${PLUGIN_INSTALL_DIR}) install(FILES ktikzpart.rc DESTINATION ${KTIKZPART_DATA_INSTALL_DIR}) install(FILES ktikzpart.desktop DESTINATION ${SERVICES_INSTALL_DIR}) add_custom_target(uninstalldirs_part) add_custom_command(TARGET uninstalldirs_part POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove_directory ${KTIKZPART_DATA_INSTALL_DIR} COMMENT "Removing directory ${KTIKZPART_DATA_INSTALL_DIR}" VERBATIM) ktikz/part/configdialog.h0000660000175000017500000000352611455414614020125 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_PART_CONFIGDIALOG_H #define KTIKZ_PART_CONFIGDIALOG_H #include class PartConfigGeneralWidget; class QCheckBox; class PartConfigDialog : public KDialog { Q_OBJECT public: PartConfigDialog(QWidget *parent); ~PartConfigDialog(); void readSettings(); public slots: void setDefaults(); void writeSettings(); signals: void settingsChanged(const QString &dialogName); private slots: void setModified(); private: QWidget *viewerWidget(); PartConfigGeneralWidget *m_configGeneralWidget; QCheckBox *m_watchFileCheckBox; }; #endif ktikz/part/part.cpp0000660000175000017500000002453511455414614017004 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * Document watcher and reloader code copied from Okular KPart code * * which is copyrighted as follows: * * Copyright (C) 2002 by Wilco Greven * * Copyright (C) 2002 by Chris Cheney * * Copyright (C) 2002 by Malcolm Hunter * * Copyright (C) 2003-2004 by Christophe Devriese * * * * Copyright (C) 2003 by Daniel Molkentin * * Copyright (C) 2003 by Andy Goossens * * Copyright (C) 2003 by Dirk Mueller * * Copyright (C) 2003 by Laurent Montel * * Copyright (C) 2004 by Dominique Devriese * * Copyright (C) 2004 by Christoph Cullmann * * Copyright (C) 2004 by Henrique Pinto * * Copyright (C) 2004 by Waldo Bastian * * Copyright (C) 2004-2008 by Albert Astals Cid * * Copyright (C) 2004 by Antti Markus * * licensed under GPL v2 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 . * ***************************************************************************/ #include "part.h" #include #include #include #include #include #include #include //#include #include #include #include #include #include "configdialog.h" #include "settings.h" #include "../common/templatewidget.h" #include "../common/tikzpreview.h" #include "../common/tikzpreviewcontroller.h" #include "../common/utils/action.h" K_PLUGIN_FACTORY(ktikzPartFactory, registerPlugin();) K_EXPORT_PLUGIN(ktikzPartFactory("ktikz","ktikz") ) Part::Part(QWidget *parentWidget, QObject *parent, const QVariantList &args) : KParts::ReadOnlyPart(parent) { Q_UNUSED(args); m_configDialog = 0; // setObjectName("ktikz#"); Action::setActionCollection(actionCollection()); m_tikzPreviewController = new TikzPreviewController(this); QWidget *mainWidget = new QWidget(parentWidget); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->setSpacing(0); mainLayout->setMargin(0); mainLayout->addWidget(m_tikzPreviewController->templateWidget()); mainLayout->addWidget(m_tikzPreviewController->tikzPreview()); mainWidget->setLayout(mainLayout); setWidget(mainWidget); createActions(); // document watcher and reloader m_watcher = new KDirWatch(this); connect(m_watcher, SIGNAL(dirty(const QString&)), this, SLOT(slotFileDirty(const QString&))); m_dirtyHandler = new QTimer(this); m_dirtyHandler->setSingleShot(true); connect(m_dirtyHandler, SIGNAL(timeout()),this, SLOT(slotDoFileDirty())); setXMLFile("ktikzpart/ktikzpart.rc"); applySettings(); } Part::~Part() { delete m_tikzPreviewController; } QWidget *Part::widget() { return KParts::ReadOnlyPart::widget(); } KAboutData *Part::createAboutData() { KAboutData *aboutData = new KAboutData("ktikzpart", "ktikz", ki18n("KTikZ KPart"), APPVERSION); aboutData->setShortDescription(ki18n("A TikZ Viewer")); aboutData->setLicense(KAboutData::License_GPL_V2); aboutData->setCopyrightStatement(ki18n("Copyright 2007-2010 Florian Hackenberger, Glad Deschrijver")); aboutData->setOtherText(ki18n("This is a plugin for viewing TikZ (from the LaTeX pgf package) diagrams.")); aboutData->setBugAddress("florian@hackenberger.at"); aboutData->addAuthor(ki18n("Florian Hackenberger"), ki18n("Maintainer"), "florian@hackenberger.at"); aboutData->addAuthor(ki18n("Glad Deschrijver"), ki18n("Developer"), "glad.deschrijver@gmail.com"); return aboutData; } void Part::createActions() { // File m_saveAsAction = actionCollection()->addAction(KStandardAction::SaveAs, this, SLOT(saveAs())); m_saveAsAction->setWhatsThis(i18nc("@info:whatsthis", "Save the document under a new name.")); /* KAction *reloadAction = actionCollection()->add("file_reload"); reloadAction->setText(i18nc("@action", "Reloa&d")); reloadAction->setIcon(KIcon("view-refresh")); reloadAction->setWhatsThis(i18nc("@info:whatsthis", "Reload the current document from disk.")); connect(reloadAction, SIGNAL(triggered()), this, SLOT(slotReload())); reloadAction->setShortcut(KStandardShortcut::reload()); m_reloadAction = reloadAction; */ // Configure KAction *action = KStandardAction::preferences(this, SLOT(configure()), actionCollection()); action->setText(i18nc("@action", "Configure KTikZ Viewer...")); } /***************************************************************************/ bool Part::openFile() { const QString fileName = localFilePath(); QFile file(fileName); if (!file.open(QFile::ReadOnly | QFile::Text)) { KMessageBox::error(widget(), i18nc("@info", "Cannot read file %1:%2", fileName, file.errorString()), i18nc("@title:window", "File Read Error")); return false; } QTextStream in(&file); m_tikzCode = in.readAll(); m_tikzPreviewController->generatePreview(); // set the file to the fileWatcher if (url().isLocalFile()) { if (!m_watcher->contains(localFilePath())) m_watcher->addFile(localFilePath()); QFileInfo fi(localFilePath()); if (!m_watcher->contains(fi.absolutePath())) m_watcher->addDir(fi.absolutePath()); } m_fileWasRemoved = false; // setStatusBarText(i18nc("@info:status", "File loaded")); return true; } void Part::saveAs() { const KUrl srcUrl = url(); const KMimeType::Ptr mimeType = KMimeType::mimeType("text/x-pgf"); const QString tikzFilter = (mimeType) ? mimeType->patterns().join(" ") + '|' + mimeType->comment() : "*.pgf *.tikz *.tex|" + i18nc("@item:inlistbox filter", "TikZ files"); const KUrl dstUrl = KFileDialog::getSaveUrl(srcUrl, tikzFilter + "\n*|" + i18nc("@item:inlistbox filter", "All files"), widget(), i18nc("@title:window", "Save TikZ Source File As"), KFileDialog::ConfirmOverwrite); if (!dstUrl.isValid()) return; KIO::Job *job = KIO::file_copy(srcUrl, dstUrl, -1, KIO::Overwrite | KIO::HideProgressInfo); connect(job, SIGNAL(result(KJob*)), m_tikzPreviewController, SLOT(showJobError(KJob*))); } bool Part::closeUrl() { if (url().isLocalFile()) { m_watcher->removeFile(localFilePath()); QFileInfo fi(localFilePath()); m_watcher->removeDir(fi.absolutePath()); } m_fileWasRemoved = false; return KParts::ReadOnlyPart::closeUrl(); } /* void Part::showJobError(KJob *job) { if (job->error() != 0) { KIO::JobUiDelegate *ui = static_cast(job)->ui(); if (!ui) { kError() << "Saving failed; job->ui() is null."; return; } ui->setWindow(widget()); ui->showErrorMessage(); } } */ /* void Part::slotReload() { // stop the dirty handler timer, otherwise we may conflict with the // auto-refresh system m_dirtyHandler->stop(); slotDoFileDirty(); } */ QString Part::tikzCode() const { return m_tikzCode; } Url Part::url() const { return KParts::ReadOnlyPart::url(); } /***************************************************************************/ void Part::slotFileDirty(const QString &path) { // The beauty of this is that each start cancels the previous one. // This means that timeout() is only fired when there have // no changes to the file for the last 750 milisecs. // This ensures that we don't update on every other byte that gets // written to the file. if (path == localFilePath()) { m_dirtyHandler->start(750); } else { QFileInfo fi(localFilePath()); if (fi.absolutePath() == path) { // Our parent has been dirtified if (!QFile::exists(localFilePath())) { m_fileWasRemoved = true; } else if (m_fileWasRemoved && QFile::exists(localFilePath())) { // we need to watch the new file m_watcher->removeFile(localFilePath()); m_watcher->addFile(localFilePath()); m_dirtyHandler->start(750); } } } } void Part::slotDoFileDirty() { m_tikzPreviewController->tikzPreview()->showErrorMessage(i18nc("@info:status", "Reloading the document...")); // close and (try to) reopen the document if (!KParts::ReadOnlyPart::openUrl(url())) { // start watching the file again (since we dropped it on close) m_watcher->addFile(localFilePath()); m_dirtyHandler->start(750); } } /***************************************************************************/ void Part::applySettings() { m_tikzPreviewController->applySettings(); // Watch File QSettings settings(ORGNAME, APPNAME); bool watchFile = settings.value("WatchFile", true).toBool(); if (watchFile && m_watcher->isStopped()) m_watcher->startScan(); if (!watchFile && !m_watcher->isStopped()) { m_dirtyHandler->stop(); m_watcher->stopScan(); } } void Part::configure() { if (m_configDialog == 0) { m_configDialog = new PartConfigDialog(widget()); connect(m_configDialog, SIGNAL(settingsChanged(QString)), this, SLOT(applySettings())); } m_configDialog->readSettings(); m_configDialog->show(); } ktikz/part/configgeneralwidget.h0000660000175000017500000000346611455414614021512 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_PART_CONFIGGENERALWIDGET_H #define KTIKZ_PART_CONFIGGENERALWIDGET_H #include #include "ui_configgeneralwidget.h" class PartConfigGeneralWidget : public QWidget { Q_OBJECT public: PartConfigGeneralWidget(QWidget *parent = 0); void setDefaults(); void readSettings(const QString &settingsGroup = QString()); void writeSettings(const QString &settingsGroup = QString()); signals: void changed(bool isChanged); protected: Ui::PartConfigGeneralWidget ui; private slots: void setModified(); }; #endif ktikz/part/configgeneralwidget.ui0000660000175000017500000000677511455414614021706 0ustar fhackenbergerfhackenberger PartConfigGeneralWidget Configure KTikZ Viewer Commands PDF&LaTeX command: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter latexUrlRequester &Pdftops command: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter pdftopsUrlRequester Templates &Replace text: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter replaceEdit true <para>Enter the text which will be replaced by the TikZ code in the template here.</para> &Editor command: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter editorUrlRequester KUrlRequester QFrame
kurlrequester.h
KLineEdit QLineEdit
klineedit.h
ktikz/TODO0000660000175000017500000000252511455414615015050 0ustar fhackenbergerfhackenberger- Print image - In multiple image mode, allow to save and export only the current image - Clicking an item in the TikZ commands dock widget should not insert it, but only select it. Pressing an Insert button would then do the actual insertion. There should also be a Help button which opens the TikZ manual at the page where the selected item is explained. - Make a graphical tool for editing the XML file containing the TikZ commands similar to keditbookmarks - Create a new process for each window opened by the "New" action. - Remove bug in KDE version in which the template is not loaded if the contents do not start with \documentclass (the mimetype is then not recognized as text/plain). - Check whether the file has changed when ktikz gets the focus, and also when saving or closing (similar to kwrite). - Download files which are \included or \inputted in remote template files or remote pgf files to the temporary directory (could be dangerous when the user is still editing the \input command). - Add the directory in which the pgf file is located to TEXINPUTS - Complete tikzcommands.xml: The following sections of the TikZ manual are implemented: Section 13 complete (except \pgfextra) Section 14 almost complete (except preaction=, postaction=, decorate, decoration=) Section 15 partially ktikz/CMakeLists.txt0000660000175000017500000001013111455414615017110 0ustar fhackenbergerfhackenbergerproject(ktikz) cmake_minimum_required(VERSION 2.6) set(KTIKZ_VERSION "0.10") add_definitions(-DORGNAME=\"Florian_Hackenberger\" -DAPPNAME=\"ktikz\") add_definitions(-DAPPVERSION=\"${KTIKZ_VERSION}\") add_definitions(-DKTIKZ_USE_KDE) add_definitions(-DKTIKZ_TIKZ_DOCUMENTATION_DEFAULT=\"/usr/share/doc/texmf/pgf/pgfmanual.pdf.gz\") if(WIN32 AND NOT UNIX) add_definitions(-DKTIKZ_TEMPLATE_EDITOR_DEFAULT=\"notepad\") else(WIN32 AND NOT UNIX) add_definitions(-DKTIKZ_TEMPLATE_EDITOR_DEFAULT=\"kwrite\") endif(WIN32 AND NOT UNIX) find_package(Qt4 4.4.0 COMPONENTS QtCore QtGui QtXml REQUIRED) find_package(KDE4 4.3.0 REQUIRED) find_package(PopplerQt4 0.6 REQUIRED) # Warning: this is part of the kdelibs development package include(KDE4Defaults) add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS} ${POPPLER_QT4_DEFINITIONS}) include_directories(${KDE4_INCLUDES} ${POPPLER_QT4_INCLUDE_DIR}) add_subdirectory(app) add_subdirectory(part) add_subdirectory(doc) add_subdirectory(po) # Install text/x-pgf mimetype find_package(SharedMimeInfo) install(FILES common/qtikz.xml DESTINATION ${XDG_MIME_INSTALL_DIR} RENAME ktikz.xml) update_xdg_mimetypes(${XDG_MIME_INSTALL_DIR}) # Remove directories add_custom_target(uninstalldirs) add_dependencies(uninstalldirs uninstalldirs_app uninstalldirs_part uninstalldirs_doc) # Make packages include(InstallRequiredSystemLibraries) #set(CPACK_PACKAGE_NAME "KTikZ") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "KTikZ is a program for making pictures using TikZ") set(CPACK_PACKAGE_VENDOR "Florian Hackenberger") set(CPACK_PACKAGE_VERSION ${KTIKZ_VERSION}) #set(CPACK_PACKAGE_VERSION_MAJOR "0") #set(CPACK_PACKAGE_VERSION_MINOR "10") #set(CPACK_PACKAGE_VERSION_PATCH "0") string(REGEX REPLACE "\\..*" "" CPACK_PACKAGE_VERSION_MAJOR ${KTIKZ_VERSION}) string(REGEX REPLACE "([0-9]*)\\.([0-9]*)(\\.([0-9]*))?" "\\2" CPACK_PACKAGE_VERSION_MINOR ${KTIKZ_VERSION}) string(REGEX REPLACE "([0-9]*)\\.([0-9]*)(\\.)?" "" CPACK_PACKAGE_VERSION_PATCH ${KTIKZ_VERSION}) if("${CPACK_PACKAGE_VERSION_PATCH}" STREQUAL "") # if ${KTIKZ_VERSION} is of the form 0.10 instead of 0.10.3 set(CPACK_PACKAGE_VERSION_PATCH "0") endif("${CPACK_PACKAGE_VERSION_PATCH}" STREQUAL "") set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README") set(CPACK_PACKAGE_INSTALL_DIRECTORY "KTikZ ${KTIKZ_VERSION}") set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.GPL2") set(CPACK_SOURCE_GENERATOR "TBZ2") set(CPACK_SOURCE_IGNORE_FILES "/.svn/;/build*/*;/templates/;Makefile;~$;.qch$;.qhc$;/debian/") set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${KTIKZ_VERSION}") set(CPACK_SET_DESTDIR TRUE) if(WIN32 AND NOT UNIX) # There is a bug in NSI that does not handle full unix paths properly. Make # sure there is at least one set of four (4) backslashes. # set(CPACK_PACKAGE_ICON "${CMake_SOURCE_DIR}/Utilities/Release\\\\InstallIcon.bmp") set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "KTikZ ${KTIKZ_VERSION}") set(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\ktikz.exe") set(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} KTikZ") set(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.hackenberger.at/ktikz-editor-for-the-tikz-language") set(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.hackenberger.at/ktikz-editor-for-the-tikz-language") set(CPACK_NSIS_CONTACT "florian@hackenberger.at") set(CPACK_NSIS_MODIFY_PATH ON) else(WIN32 AND NOT UNIX) set(CPACK_STRIP_FILES "bin/ktikz") set(CPACK_SOURCE_STRIP_FILES "") endif(WIN32 AND NOT UNIX) set(CPACK_PACKAGE_EXECUTABLES "ktikz;KTikZ") #execute_process(COMMAND dpkg --print-architecture OUTPUT_VARIABLE DEBIAN_PACKAGE_ARCHITECTURE) #set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${DEBIAN_PACKAGE_ARCHITECTURE}) set(CPACK_DEBIAN_PACKAGE_DEPENDS "kdelibs5 (>=4.3.0), libpoppler-qt4-3 (>=0.6), poppler-utils (>=0.6), pgf") set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "khelpcenter4") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Florian Hackenberger ") set(CPACK_DEBIAN_PACKAGE_SECTION "graphics") #set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") include(CPack) add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source) ktikz/Changelog0000660000175000017500000003240111455414614016165 0ustar fhackenbergerfhackenbergerversion 0.10 (2010-08-26): - KDE integration (the possibility to compile Qt-only still exists) - template files on remote machines can be used using KIO (only in the KDE version) - TikZ source files on remote machines can be loaded, saved and exported using KIO (only in the KDE version) - error messages while generating the preview are shown in the preview window itself - zooming is done in a separate thread now, so the interface is not blocked when zooming at large sizes - a kpart is available that can be used to view TikZ source files in konqueror (the kpart opens files having the text/x-pgf mimetype) - update list of tikz commands - remove bug which causes ktikz to hang (since Qt 4.6) when typesetting a picture - remove bug: cannot find TikZ documentation when selecting "TikZ Manual" in the Help menu, even if configured correctly - display description of a newly inserted tikz command (using command completion or menu) in the statusbar, so that the user still sees the usage of a command after it is inserted - add option to compile the TikZ code only when pushing a "Build" button - add reload button - add shell script and ktikz template to the examples directory which can be used to generate the preview with the latex; dvips; ps2pdf sequence instead of pdflatex (the usage is described in the shell script code) - check whether the file has changed when ktikz gets the focus (similar to kwrite) - in the kpart check for file changes and reload if there are any (similar as in okular) - the zoom percentage field is now displayed and edited in the user's locale - added documentation - remove bug: when the error box is larger than the preview and the next compilation does not give errors, the error box is still visible outside the area covered by the preview - try to find or use the default hard-coded (configurable in conf.pri and CMakeLists.txt) path to the TikZ documentation when an empty path is stored in the local settings (this is the case e.g. when ktikz is run for the first time) - when inserting code using code-completion, the arguments and options that must be filled in are marked by a bullet, the bullets can be browsed with the Tab-key - now also an URL to an online version of the TikZ documentation can be specified in the configuration dialog - an icon for Windows and an NSIS Windows Installer script are now available - the "Insert" menu is now also translated version 0.9 (2009-09-10): - remove bug that on startup the item selected in the template combobox did not correspond to the text in the lineedit of the combobox - correct the height of the lineedits in the configuration dialog - the path to the TikZ documentation must now be set in the configuration dialog - don't wait one second before generating the preview when a file is loaded, the template is changed or shell escaping is toggled - only files are used now as a template file (previously directories and everything with a valid path was used), otherwise the default template is used - if the replacement text is empty, then the default template is used instead of giving non-informative errors - when the commands dock is visible (instead of the menu), the code that will be inserted is visible in the status bar on hovering the item in the list - clicking on an item in the commands dock only includes the corresponding code once (instead of twice) - added file name completion to the template line edit and the line edits in the configuration dialog - space and tab markers resize according to the font size of the main text - the color of the space and tab markers can be changed in the configuration dialog - white space and tabulator settings are separate now - scrolling in the text edit with the arrow keys is faster now - better completion of \begin{... and \end{... - allow to use the icons set in KDE4 when the appropriate variable in conf.pri is set - remove bug that the "Next Image" and "Previous Image" buttons remained visible when emptying the code text area - remove bug: statustip of the toggle view actions in the Settings menu is not shown when a toolbar or sidebar is hidden on startup - add support for session management (open windows will be reopened after logging out and logging in again) - added option in the config dialog to enable/disable completion of the tikz commands - trying to open a file from the "Open Recent" menu that does not exist anymore does not cause an empty window to be opened anymore, furthermore the file is removed from the "Open Recent" list Version 0.8 (2009-05-25): - allow text under icons in toolbar - remove bug: when a second ktikz window is closed while typesetting, the cursor is not restored from busy to normal - remove bug: when the document is untitled and not yet saved, then opening a file opens the file in the current window, destroying the unsaved text - added some tikz commands to the list of commands - disable "Save" and "Save As" actions when the file in the text editor is the same as on disk - replace the "Replace this occurrence" dialog by a widget shown at the bottom of the text editor - added filter "PGF files" in "Open File" dialog - the previously selected templates can now be selected from a combobox - added "Clear" button to each line edit - remove bug: the size of the default font did not change after setting a new font size in the config dialog - new way of writing the temporary latex and pgf files, this also solves the bug in which the line numbers in the log window did not correspond to the line numbers in the editor - each time the template is changed a new QTemporaryFile is used, this avoids the bug that if the template contains less characters, then the bottom of the old template is still there in the file (luckily latex stops parsing at the first \end{document}, so this bug was not visible) - allow to use KDE4 file dialogs when the appropriate variable in conf.pri is set - remove bug (I hope) that caused ktikz to crash when zooming while ktikz is typesetting Version 0.7 (2008-08-26): - disable previous image button if the first image is shown, disable next image button if the last image is shown - the first time that the End button is pressed the cursor is moved to the end of the line (on screen), the second time the cursor is moved to the end of the block (end of the line in the file) - don't run latex on startup when no document is loaded from the command line - adjust size of the viewport in which the preview is displayed when new items are added to the tikz picture - added completion of the tikz commands - the tikz commands are now loaded from an XML file - corrected the size of the colored background around the highlighted brackets - remove bug in ConfigDialog::selectFont() (replace "if (&ok)" by "if (ok)") - the command "New" in the "File" menu now opens a new empty window, the commands "Open" and "Open Recent" open the selected file in a new window, a "Close" command is added which empties the current window - the (empty) document is not typesetted anymore when the "Close" command (which has the same behavior as the old "New" command) is executed - add the directory in which the template file is located to the $TEXINPUTS environment variable (useful if the template \inputs other files) - layout changes in the configuration dialog Version 0.6 (2008-02-25): - added find and replace - added go to line - added indent selected paragraph - remove crash when first character of the document is '\' - allow usage of -shell-escape, so that functions can be plotted using gnuplot from within tikz - added highlighting of the current line in code editor - added show white spaces - added show matching brackets - allow scrolling of code editor without moving the cursor with Ctrl+Up and Ctrl+Down - added template support for the LaTeX file in which the PGF picture is included - updated the icons to the latest version of Oxygen (now available at svn://anonsvn.kde.org/home/kde/trunk/KDE/kdebase/runtime/pics/oxygen/) Version 0.5 (2007-10-02): - removed memory leaks - added Qt logo to the "About Qt" item in the Help menu - zooming now keeps the same object in the center of the visible area that was previously in the center (instead of scrolling to position (0,0)) - the tikz commands can be inserted from either a menu or a dockwidget - more tikz commands are added to the menu/dockwidget - put the preview area in a dock widget which allows more flexibility than a splitter - added an item in the "Help" menu for opening the file pgfmanual.pdf in the PDF viewer configured in the system (if that file is located somewhere in the LaTeX texmf tree) - switched to poppler version 0.6 - removed bug in the config dialog which caused the table items to not be shown as disabled upon opening the config dialog when the highlighting is set to standard - added a What's This button in the configuration dialog - remove crash when zooming at startup before loading or editing tikz code - ktikz now remembers the zoom factor from the previous session - the application icon is now also installed and is referred to in the desktop file (so the icon also appears in the KMenu) - the build files (*.o *.ui moc_* qrc_*) are now put in a separate build directory (when building), leaving the source directory clean Version 0.4 (2007-08-13): - added German translation - show status tip for the "Open Recent" and "Export" submenus - it is now possible to have more than one image in one document: just put the different tikzpictures one below the other in the code and then press the "Show previous image" and "Show next image" button to browse between the previews (but it is not possible to save or export them separately) - the previous picture is not displayed anymore in the preview when the text edit becomes empty (or when the user starts a new document) - the document modification status is shown correctly now in the title bar - the preview can be scrolled by dragging the image - added undo, redo and select all to the Edit menu and to the toolbar - added comment/uncomment of the current line or selection - the scrollbars will disappear if the image becomes smaller than the view when zooming out - added a menu with tikz commands - a better highlighting of the tikz code is implemented based on the contents of the tikz commands menu - made an application icon (I just took the kate icon from oxygen and added the text "KTikZ", the text in the icon is in the Fertigo font from http://www.josbuivenga.demon.nl/fertigo.html) - added What's This texts for most widgets and icons - added a configuration dialog (the highlighting colors and fonts, the number of entries in the "Open Recent" menu and the path to pdflatex and pdftops can be set) - messages on standard output are only shown when compiled in debug mode - in the log box short messages are shown instead of the contents of the log file; the contents of the log file can be viewed by pressing the "View Log" button - added an "Abort typesetting" button; for example, typesetting the following code never exits: \begin{tikzpicture}[x=1cm,y=1cm % note the missing ] \draw[->] (0,0) -- (4,0); \end{tikzpicture} - added a context menu to the preview area - more sensible default sizes for the different widgets in the main window on first startup Version 0.3 (2007-08-06): - show in the statusbar the position of the cursor in the text edit - the preview image (in PDF format) is displayed using poppler instead of converting the PDF file to PNG first and displaying the PNG file (poppler version 0.5.4 is used) - added zooming of the image (using poppler) - export to PNG is done directly in Qt now; as a consequence (of this and of using poppler to display the preview image) ktikz no longer depends on ImageMagick - added "Open Recent" menu - if ktikz is run on the command line, then it loads the first argument (if it is a valid file name) - the open/save file dialog remembers the last directory in which a PGF source file was opened/saved - loading of translations if available - added French translation - changed qmake files so that the files will be installed in the correct place (the installation prefix can be configured in the file conf.pri) - the wait cursor is displayed while typesetting the PGF picture to PDF Version 0.2 (2007-08-02): - replaced the icons in XPM format by icons in PNG format from KDE4's Oxygen theme (obtained from svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs/pics/oxygen) - placed the text edit and the preview area in a splitter so that their relative width can be changed by the user - placed the log text edit in a dockwidget (which can be hidden) - temporary files are now put in QDir::tempPath() + "/ktikz" (on Linux this is /tmp/ktikz), so your working directory remains clean - closing the application now removes all temporary files and stops the thread - the first time that the thread (generating the output image) is executed is not on startup anymore, but when the user actually changes the text or loads a file - images can now be exported to EPS, PDF and PNG - for some standard actions, the standard key sequence is used (e.g. QKeySequence::Open instead of Ctrl+O) - the toolbars can be hidden - corrected typo "TiKz" to "TikZ" - a function runProcess is used which makes the code of generatePdfFile and generatePngFile easier (in tikzpngpreviewer.cpp) - made a better about dialog ktikz/README0000660000175000017500000000372211455414614015237 0ustar fhackenbergerfhackenbergerKTikZ is a program for making pictures using tikz. Usage ----- You write the tikz code in the editor and KTikZ automatically generates the image in a preview panel. The complete description of the usage is available in the application itself, under Help -> KTikZ Manual. Installation ------------ See the INSTALL file. License ------- Copyright (C) 2007-2010 Florian Hackenberger 2007-2010 Glad Deschrijver Portions are copyrighted also by other people (see app/tikzeditor.cpp, common/utils/lineedit.cpp and part/part.cpp). 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 links to poppler which is based on xpdf code, which currently is released under the GPL version 2 only. As long as xpdf is not released under the GPL version 2 or later, this program cannot be released under the GPL version 3. Currently there are no other restrictions for this move. 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. The icons are copied or derived from KDE's Oxygen icon set which is released under the LGPL (see http://www.oxygen-icons.org/?page_id=4). The font used in the qtikz and ktikz icons is Prociono and is released under the following license: This font has been released into the public domain by its author, Barry Schwartz. This applies worldwide. In some countries this may not be legally possible; if so: Barry Schwartz grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law. The Qt logo icon comes from Qt which is released under the LGPL. ktikz/screenshot_v0.3.png0000660000175000017500000034112311455414615020011 0ustar fhackenbergerfhackenbergerPNG  IHDRq IDATxwx[ՖG'Nlg9;Aej٣@iˆBV# d38ں?l),yJs{5WQUΟB!B!EU@+= !B!8*v<(w:kkh:1 !B!8 mߺ+~hAZ2!B!Gv k{|8rB!BD/Al>66P_{|7`>B!B;| *ꃆ: 17b9B!Bk $Jq¦gа1Sysh8fi×* (mí\!B!0|4vZ̙gV壏?҃o6m*ţ*NWvPB!B0̤e?Ťc!?/Gt/1m/ٲ ^%~0b:uIP;(W!B!DĔtb Ɔ_3niuI5ƨNjZ}( egʻYsymOw.ouegW[ }\snuq8{8*Bq2rd󚕾}=ز'{xz.cy?0{Q^3㎳FಕHvyB!&z O(lKek ot,xlg; )3D2رtܮnyCɜS%=΄M7V$N沩Ifc_>q 5nշOv^>Segck`u|*93#f2Tɭsp~dGy/a+3F -2 1_ ɢ7珗C/hCΈLIRL:Y H0x;UcXIh᧟J„5Tc*U8ց8jgwe :&ն!F^Ug ,7%,G^Cјq9 %*$G75eVZ[WW;<۷=M@a&祑mr><-{w_ !BKL&o4˃ޤgAԭ2<g{ӉS%\ю¶ jߘu7o&{ 9{1>⃱e'Vwvm Kp{x;+B wL uVgaMS΢j/I͚;3sxxŗ|sY͓UUe {lc2f/ eM!c%y~=1m˸E;͜۹!߾i =1ڢה9͜zѥ!cc9;awz>u{=o <Cjڿ7=oniYH<C͇/?h'͗co|n]W%3rШvs|Aʠ|:F3~f4/9?LS g L}ϿMfo}-dHv~Xq`/Bq).D鮍$ip`qWMjV{Q&':䴩qacEAD(AD]-\&c614$dfsaEaNG26lHMǤc4P@98_E,z러QH'JC SAm jT#zNa=xdu/7 ^}%`40uDm=8uMAɘ F4S@g1uxOUP0OF՛:@i=6Z ;ϫ2;ה؟OÀ^~/w6<0Xyg[;3eT)#}{n2&U{1 [n#}W)!BdӊQu&= j]SvQ1q]*˫^Iao}ԷS'Kv; n;r x*ߤæ`4pYw YHi+/զ}8U/?v[pzsz`0ܬQ`4( Vxu8>˜4Ziѵ\VK(ŬB'cXўCCACI]h27&[A`0tmm>ʬ`i).ݘۣI%-CGCB :xECňcVSpISYb=[Jj1%3uFV&Pՙs;3ۂ퓚٦b7<7/p]Wf8pۙ 1i*(EEGk4~'sjcBSA6_3X0t֏B!Ѩx' u 3 C7k`p:0tl@EmK##uؕ{$@saMhw`ygqdcsRI*-!&c( Qƅ^J!BS~jl|"6mKҷq&bQ+H쿗}:+gP^WJv(: FCH3`0G$B!"djj2q$&.WV3CY[UA|R9*Fd!B!!d `vbOn >dN_t B!B#C*B!B!DƷj5>ߟ9B!B!?Uf_SSS$B!BhuB!B!H*B!U!B!D B!B>AT!B!}$B!B!&u̞0º{rl#B! z8~?1*Gu !B!~ZWTRS~fS].Sbewbә'/0&M痓V K>jpuOs 'ML˯.RZ V{ڻ$B!"zփ;wRZ&x 9o%\ͧNQ c \yy>?G6pߙ_XpB!Bzws?=tG $k(NEV{B0uox cr1yO-2; =hviT?[ԯ < Yzm3ydy?zi=u-m3sl f^>ܕ7˄t:I9?gAuA0T+uw"?u#BV F^ЈVmןho8zIqQde; n~}= s{_' =v&i.Ӈg3_ݸmtO !BqU|mly0|k51op=} V4Xټl;=-1`![zckλkR>*9)Q~x#dhY1UUg<ì.*Zsdz)S2}m5N0ڸ6װh9U37n'@#kOחe㵃mظ;c̞u%]궩;dDai7@I"cڴ619gœ2\INOҥqS(zqldK83Hn=YtnunAuÅ6:'3op]&޸L>'q} YSD=8e8ww 317g@"Xin&.B$1^`s˱MmN[1fw?ȨTF`Vj*~]SW>0 )&L){~ !Bq`Yֲ<)6+S IX|1ճé z&}( ߄Q}h/5Ȅh~zE_?I%ۭ'{j2=<>{KJÈ8sFe|½̝ ȈT[j-dFlyv5m8Wo,ùr(<˽gdB[u̞H։!Q~!q41w !Bq!o?ZE~!#] 9zU;}{ۊa,ιuR>l5n=`S |M>֟ٓxgŧl5ܤ3k8F^=W]4lo~m%n%<Ƨa3KZ??ĆaܑQp?8gB!Bz/A5aޙ*EYe| N!=*ρ/<'Krġ~̽g_&' %k'؛zN{Z.+/[z`֯;gѶj.OЁ߶" VUرW{^>"rT!Bzq$y׽ţs'2dpf-j&HkW1_?7}<򢂔csy!t_\׏wn^Ƞ|:'=鳦cY)Г~Ť03}VZχFGR}\0u(3WVsPW\y(B!BqkN6P!B!(oZo655Z0B!B!AB!B'H*B!OtrJY@&{dB!.2H"1i#B!,ʄ L&+B!NPʀJ0aB#MW!Bu]JPy zKuz4(Z-O{e!jCU=]:FQ4wΜ9TWWc4x<(™gĉjDEE際h֭466϶mp8n;եjkk'+++qtEee%%%%:6++0GԚpxx~ҤIvߡhG!BV%;66'|=Q5N1`%?ee445eiޠxTKOmuLrrrc())d2aZq/FɄbA0|JJJ+)++EQP~: jwQVVFee%IIIa+JJJ0aOs{yPɟ煅OP_xkoVKFFW_}uD+vٵ{7Vj&; IDATՌEh¬4"6BbbBXb&'OKy}]QQV;S[?&ݎB!5pX`g{NVʉn^"zh&Bo$1 9@Q|[xqX:;(TU*u (iDH!|EQPUEQ0 FF/A~}y'<խ ömY(//g>j4ӪN322z| +V^l>3hZ :ujﯻvzn={Q& : :X]1쯴1zy)SA~~>jv.⭷0AvB!.vuاѠ[f%Ek$>/t)č$Qy0o_k~FY"ݛЙckGQ!"Hq!J|1M,;(иˈ)%tq}sp9XN<'dUUUU G]$'Tҙy᮫ MMMUU1׏͛73rȰd4X\p&.7gػ GUQ `mKgeP138FT޿XِYQ`ֹ簇-V⦳ZmNT36?vV;ߙNO_ʼs`;3:ƅ\ ^[.=Ky˸荱|~a=O!lf!qO1=or=[{-9P5vB!ȮQad'1ʨ1SjKp\m%JϠtr[l=N70 {gV,׳bŊ=[;pp<z4k׮%==VmlZihhfK\\\stV^ wVM c@wWՑb2HS5 :2b F^ շt}}x*@'^Gr?C4f&ffFs3uV6q1YdqiMORi4ywSs4kPh+ юB!-"/:ĵKiP_ık '\&1djs8qxTOp;Éz%NUURRR} y{Snwס5j˗/C4*yx`MM վy 8L&Zx8&::{RSSCvvv3i{iV˅NkӃ( FKTEw[0r${MH"ޢ`{ԦJuC T#'gPcPT +剗3_KS:l9zŵI;0!O!?3g)彟3J$|Rjo.#=ѤW0ꕾюB!-"jg:ڏN zڴaV$Sd **m{*=j7YG Gjj466RRRKbez_'$$u5ߞo0Ǔ_|^g455p8| zSS$$$ի{Bd4pH n@4Ijww,ǜݡpyXsŒTk%Vk#Cro28x) Î9Tx:cʩ'7ۘUݐǍ;25{a7|y ߽jrk񷓒i] ߾}Jv4ꔾӎB!-"[exE!jShaKz$F+UـACѐx0T6GaZEՌGUIغ7tz233CE>o4\۾1L8+Vx1bМm߾Rn76ϛz_{ 54ӾǍe-')(zVuRWUʾ{h`׮]8#v m80{)C2uW]2_DJYW%aH9I Kl.˶O|毹:k7Poy˦?0Sd.#Mdeeٯ݅B(B"R./[̘ZN>LVވ[MIg'LM.Nyvfx7f}ѿJJJ6loe^^466vF29z:۾0|Pkػs+ZL݆$$3n lرcYf G5д֫Nz+YM3ƌJ>yi14J6l~z.Oncѕ1Z㧦tnWJ^{O!to]B~?PEB!:!%nje޽_UU.~*u ׸QU7G jn%Abhx{Pu:]띳/PZZb!:::"  AEEQZZڦ;BZ {D7DCS==߿?r k׮e 4˗3vX:. sPR~)~})φ:ސY|Y(2{V 0?5"oWEB!:WV&A^oٲ1c_~DNNVinDxp8|= =R4p[_^7Z\n7vbĈݕޤ0>>}~ aFUUv;֯g1UUٵ{{0hPJIIa$%%}v4 +V`$$$DH=;Bq*z]}}=kŊXVF BCJJJ9Oaa={;vl}WEcc#Taž?vZ\NF#RT20/!!^f"N'#G$==="!;;t:Z= q+C|I; !*B ~/, - W koӿ=Xz=]kZyWp\\pa-RAsssپ};6l@x^qG @aaa_E!!!=lhhf-t8IIIaÆ\yUw#p_駟? ի}T/iG!B^Yŷ UU^OAN8:ٴi|=/׊OՒIAAA*|-bcc9A/gݺuz{iKLt^.wYXh`t:s| z*ٽrQ_MPAQ!WV߿?y8p`Ӈp'b}V+V͆`0`41͘L&f3Fl6麝h͙3'#Nz{sN'NӷrtUUV^o0 z4M/p's'7]_'UUUDT KN+1=btlcbbZ}# B:cЅ{9*xӟI*sKK\V{}?B$ | Eo~rF O.gbߐ!q/'>ġc1 7VLx%8Ż3#^AIh knţ=3\E}f&((ߏF)H`b^aSz~Pm;y疓9i$>.翭v 3;ÄX -żiFa`OӶMc.&A?U!RA54;߽PN]dzʋ15,emO.[ֱ ||9|䌧rMk)3%{ne73[kڜ0r6,iVrlibw )]8n:v-f,QQr:(~zfAO~ǿoGLtUZ™u 9o\xv ^\[IͶs?qݫi;r5kf̊R.Cׅ5l慽'2UgeCgpÚ<}-E.jQ],bnB!DOyϲ? !ѩE,=)%?>3sm Rtә)m,}j۬/Δ5w䓛ŤMeϭ󏧊6&s#8&U)%=: J;ɍ#hGe k03)A~?UzV=uq'}o1Oj7_s_̡[7yLN3cNO'/)m𡎫Yј }06]q)&9 W?u-Gc{$fQ#\ [LJ!&YW!D(XWO+wG f Ƨ`Guaccʸeȃ(ʟЦÏu.eun0WVB 3trb/Ch*~݂qOd/։2YxO\5!6T6 /w~h{;Xv;fcbCKn#n5l:rȺ̋YZ۶S8uԔGx(!G%IPBҩDcVb_VzZ ԐB0t^s7zSy1eU6']_H3̫nZJyTZPۛo5Ǿ|oُL߾}5 ȦU\uU3!Vz7XYdo47ݍ{$BK^D2$SM^\uáB0U!D({jL20QjZ+yT^y7(dıO$ LOP/WqﳼeHWkXUV^k9p8l(thiͤjYrT yzt <};G*o7Ok[-<~,+a+[ 7)8lْg8yY{f}vVׇϜI xdRJ.[ \%?k5]M{VBG,u,"B$ABJT"xs1>;?NRܼ,ze_0%aLR)A[RsTMaǩnPHz*"vyCBч)w:kiΚ5kvTkvq{9kSo񣿦h4Vɰgwi".aoa6Sup`m̼?خ.(%BO>aժU:vܸqYN|Q}|Mʩړ0B-[GN%6>=;vTҸzgWWH~;;yluFql8j(7_?v{b\3C%9B!B/8[hoc7qǼdC#Ns wsY+=f~ŽV⮻ֱ> Ff9"!}MXU3yu$7E;(B>Imwv@B9YH!B!!IPB!B !B!$AB!B'?A]A1.ጡ/[Out B!H6ѳp{VjwQQoǿ K]XD (b0{M15{^bM|S4jv KQ09Nyށܙ;4XUGI*9)#C&!+c9(U AW$@? GԔLא^~תۼ _ۀ"K6P(I=;>IɭKTl=b 8Go@VJ%FuKy WZodIVDw|b$X_+/ ([þՌyfv>u.s/ـ/ڱr紫a5d{\. &p5y GAA4ʰ7/= ɀ%R:|g=89Xy1 (IHR 7wb $^bx/~s ]L klU>^؆sFJV}ZR.⽲Jڢd}B  YLٽ<0qF|.+\ c0ҳӧkޟGQTr%&w6qYکh[Fp7=r9/>z5f_Bk҄g?dMH>,;qD]F \OUX{1iݎ%2h iO_~gĝ8L8̵g)>cUCoƏ:I}|ےDМ.L `_1+I:OTnT|Qyz;YbbjE9v|WkdIƚ Yt*.-u9!6.G?d턥!   w$csݷ P:}i;!OGeLs$Pub*}a@29 cny6 _*aj6w3T@L?ל%êc49^0j8ܫXafF93){nVi<8<UhW~e%+i2?r%E@V4e䤆XGqPedWtFѓ-?vXdQ`EVZ=_oΪ> Wu+LrdcQ ]>f̱(ߜa'fjΘU#hQ -z5-66=537Fn‡fS)x/Ym̯-!lEΨh_ sz|IYK>m9,˛quVnj̪a DW|Rİ8CmF-W}VLژTMP&>C[b ZgS&W`,eLNe^kj;ӼOHFvco%mA*b^`w7[bl$è\7>yHru̯-Ь`^IQ;.}v5ϓB&Wؠku%O;,hk[ً GAA^053TьzN뻢!+O~K*D?G{h9i0m>s+"+\NU0D/VawX6&c1QRӱs6O6jy˒;ivsn,:ăp.{@GEr!*#yTK|\G9:x(\[S,r/k)Wj+@ 0sFLG'a<* Փ6pfGidHca{G><fjSk=2TPAATEO{T`lNfJ-Y1X2 F?>gR5r2uKoY2l[Lw:y-f嗌mQ8F"9Vuo~&`VM?OSI}'n 0\u-5•MbJ l`]ˆ ʆ{~I$d[YTI7[L!PX2kHɑEӹ>R먎^ϊcoG{%C?cƮDNo֎Ӗ#qӵ] 4@)0cv]CRfҀ|c=3oUԷ]'.!'rXfL^[E9ZLMihc 3] {YPgq6,Gۈn腳G4%2yqAFU`fӚ#O`]/Em@,n"s|ӻWAAASҠ㈌M">6&((&]wh$ |t:v4ߕ_td`_*K dD~XnaGLKۻPy3 ϑ LŒ Np.wbZD˞鷚z6?,oHh,XYP `{ؽ{7?\!SvEZԩSq+ B?~UWvܻe A{v<Ҳ:? gOXa1 NeC|Mb'bO}i$je26ڒpp5:'mf=,o6͕%  Pt37s\*C)x:2uh"mbA{ ]\F6D*rbJ> >*Auq9юݧgac2  %jR\1a؝Yґ  PAAARA PAAAR\+ KTAE̠   BPN\¯')^W{Jy+*}m(6ί   _Jʊ^w|)Vse z*뽔2߃Zk/  jPS2^CN{/6nj|mk,LC$EJ5P 3̗ilL"hOnm^ʵ"goc9(}8~86}\˘aVƕ̣Ab}}u  NTjnʯd_BcDVhHbԟKO{PL([cRT%PZ;|lMM>xð  PR,D'J'||՘9Ӥ&o9mM 13:3;<+֯m< gSt;qXF&ڹx:g863+0H~kϕ@R#!CTGY'^|P#"r UO #7e ~طQ3t:jᇹ+L und k̂+gueZ}ZwjMXh(o;`fjEfXHVN)*k|V=)%`-~YbTZ.HPt8s=rs{>'/זPL:XؿE#_6?sD<+)V{h/gQ_ciWK3k*4S ޫ]Mj&   h3@aSowq=^z>#拇K@t{p^s.bFGno[?H^T4ﻘ?"Rg٪| |ˍb뵤]{e5µE]:0M&N:{y`↍Η.+\ c0ҳӧkޟGa5Q~ҍ*ɕ<`p5qZn hIkmq `(bC} +J}Hb~C6s7 3$nGuyC6p=AWaI9t;Ƞ-__=}A w00מ̏U ?$EmKAs0)ȃu~K/&޾Z) qttRdp}/S5q!NwXۥ%N1;H,"AAnd\9}lnvjT'/m'Q_i*NL676lH@&Ga"m"1چKZ[2l[fnf H皳dXu4& F{+l5g&em9;Gq:5-+YIܾ+/'r)#'5ʐ8 "xi5NaAT3uXQ]9EFO67{ִ Ƣ&VU ,*bј3YgbyyZs4J{ jc~mIa/rF@jVyidZIFt f/cEZ@۪>VMh1`2ne*3{HVļ-N)W! 9:A;k;LpzrϢ5#*sU"|;}QE}4{ۤ".zISg.hε9r=1ﯶ`2kږդXn<4W&yGR֒OwN=f\]ۺ,Cxg"Q驅U{6T51,TDΣKi]&I͖h ϊi\3{ۙj ʴ{XAU+ ISҠrMbg2 ISN3}cʹ-hCE߫Fy+Sd'Iκ%#4LagAT(2dY]Ja   fƜ=~Yɀ|oh*4ݝ^IH3_~F~`#X{<""ϘD]ua Cb]~e{B%5!,=Xu7ܖFQ-NfJ-Y1X2 F?>gR5r2uKoY2l[Lw:y-f嗌mQ8PsqU/g1#L3+I"9Vuih~&`VM?OSI}'n 0\u-5•MbJ l`]ˆ ʆ{~I$d[YTI7[L!PX2kHɑEӹ>RK|M*ex|&a2INjûP(7AA ʔuP1!)j3i@Ymi*}t[jԃ߂nqdfg}k3Vu-ަ4tiPV,38[_b{ZmDy3a,edx[zQI^$2yqAFU`ulZsi d[r6Һy32(]za67Bcb/*I]Y}lLut`+twRbWsNCm繠ΪKWtf5WPjYV$:`[{-zᬀ"mf\mFlBՁY_ kKk=JU  :, 1$cmhuF 7MoGs ]P=@7Ovpϑ@F4&zT4 R:O|92=iTQai<cޥbz~I=o5m~$Yސ~'B,XYfQ7.?xݻw3Jȥ->՚n׮]ԪUN:G +QqEikǽ\۰T0g'/-;op=@QI_6ķp/v"vԗ_NVQ,cs϶ :WHyۦm&ٳ?bpfӜ-`AA󍟹ҕWJĝ].C]l jK*5q'`wuS WQU 3ˉv4>= m)MWJ:FAjR\1a؝Yґ  WAAA^-1@AAΝ;|'j駟WZ6K PAA5cܸq|wT*o=z4*JV  k2i$̙CٲeK:?Ņ=zvڒE+1@-x:+XI8w̒_L7I-XAAə3gP(lٲCzͅ xQIGƅYkdev>hzw蠰8?3QθU=p,-{:rp&Z˳RWV5}q7ŪB=z.LxC  dfϞ]a3f`%FPS#SkzFX )w=im 5 ݿŋMJxf}Rjf2 3/Sr d٩gYt%~(H-װ(7tq'2=y)ג Q <jA~I* IDAT… 8;;^޽ӠA?~Ltt+ qks2_">.[Qͥz **),C}L ' ?C1NL([cRJ3  R۷ogС%dff2{l"## /113gΐ^躧LÇ J۷o2.=9pǦi/?ZkV{airu3^I0\ba;[| *T[s]ba of$^ٙpw[l!eY<7)r`)-@3eqڐE3?ie%v?י7ٙzYUI56\J[R ,1Y'Mk,jgn8Z"7)טZnxZ3~{ԛsiPoRlq<+֯m 1t7[e+!eP>cHȐ4>K fqXhS On+wGPv ɫQL /  Nblܸӧӭ[b#336lXekرcٰa/f͚v3gx<00N:ӧ7~ ]׫w¥*qv341߆8nz[,7R2|7=Il^܌Cql~:-| 4*aM)qYsP5{< vғ08>&-w\ْӅIA ^z%xqWěl߁-OIм)\[ԕA Ӕ[?AbgbKdܯf{s9ޏÄ\{B3?V5fDUO NE&0sj 'hއjZBɈ'8ْڶ&u_bx/~s ]L 拇Seqf#Ħ6`5oB ?&nh>3õrt[Ys0ܮM;aha]IUj#Wj}gI.AwU&MD |ƋcccV'|OgϞeԩ,]QFRXb@ V&##///郳39cffF hӦ .$!!!OϞ=CL4ѣGS~}166.vvk׮ud2*WyYt=ʕʊ>c޸amm eʔ{{{飵?4ZjUhݺ5ʕ+p, >qMkkkKJJ _iiǠ bN_fE9ftUiBodQJش) e ՔVՒZ\ϭd % > ̞KҴsG-m*%onnQkFFB$9O}5+4֒VQY иDC& F{+l5g&em>-)3fZBKF@MŦ GbG ̍[T Kh;xx){>u8jBy1{ HƼj/]CcmLol:iLƝ^sϣNA]FY盱XѢ.?ط}?! gku9ٕ=Q AA#11/GҫW/ƌCJJ ˗/e\]]ٷo۷gΜ99ʘ4i#G }{?~__Bz97oo .G̙3yHMMۛ۷ođ#G a֬Y;O9˗/y8;;km7{_~СCnӛ/d׮] >;v'ݐ!Cҥ ߿?܅˗/xb8~8[n%** //X(.0ޜY&q#Nc͵>K~mR{O{=@*b+9ˈN6Y6zM͸z+5A#SPw1n’oc' *h?$X.}y5ٲͷ\!h-AA(E222ԩ5j`֬YٳdviҤ Cۛ70|HIIϏwyToݳgvI޽\2۷o/t/_A:о}{-[ƠAhԨIIڷlْիS~}>C,X 011;OYgΜngv6l@Νi֬Yyy _UbddDXX4ΝwޡVZ9>\23ǧʔ)N toꊣc+eFFF 6 M[oq"Y\ ʭ19C4:7/QCi Mx23!L0)|aj|`|Bzl1#"Ss޲5+Gݛ$QG AfG^ 5QRӱs8>}"WjOƨ:=:0 ;G,IW9d##0tAZZ?9i'Ak Mп`nc繣\)ӏ&et\fJ_1?nr fm=v[\Y߈gYf\Ħ5ALM?܁EnKn|gZ.]-}.a> I?jb?Fi\H.ur.1Aٷo 2$w'ȑ#iӦ @1r++đ#GpqqATw^ߏ1-Z(G!!!899<~I~jԨٝ;wpvv2OjժHݺunݻw9w3GG3KA7 **V?rKKKСC|yrr€RSSͲczQX111ڇ [n8q'O䛮zܼyX,j]a<wt-ҎaɪKHM N6Դ,5iQ~2I|̎#XsnVg,bTd$&rdSギ-]5_|IȢ\ʻ\y-W͊qkv,iD\eGL WuLem=K%N^Mp~U$I%BN2e Yh53c9Sd&$#*O]'"1 5n zIɧ]hV$+s҂ kf۷/N*7obooO^:ك:֭[ǼyX~=$Q|y-[tJ_ŨQ oddd3ӦMxʕٳiiikM{K.ʫMJpvv:Ӟ;ݣGޢ2"f^ '!캫gl&ԛӏ`q 2kǔ_1.c>w+-J?ܪ rYؼԙqͭ/1=gl-p6}AmkDWE56vI]9Uk utj]>eTn75F(J"*#::"DŽ݆Q%}Po85;Sip~ }1k]1-{Mlh16.ͤe Y;M[ CwV#w #2eb]Y*࿼Mvl9z<,;<7|ڥ/ . dڗL Zd=3ҥK4iD@CVsEF%ndɒ%3~2k,*Vș3gh߾=FFF4k m;N&##CIBCCEy2b͛uƍm6Fɰa8x SL}@RR*TqKGqƘR^>>XZZҲeKj5燃7n,&˽h>j5'Ncǎr Ç !**H; t?3ĚVX)Srl$ellܹs߿? .ܹsZ_Hӧg&C$&&LիGΝiРN*84)}f͚ 6իcǎW <ᡯ%''p  PxoݺEpp03g>c᯴ÇSFW 85~ag[?_eÆ ̞=;GMn-Ym܌qqq:/ۣP({.ZBT{VVV$'ʓVZѪU+={Ù;w. ""9{'OS ɓ'e'¶v4ըQ;RRWC:uHIIѣGyf-ׯٳg$%%fϞcP(ٳtԉg߳[Rgl|23g7 :uT2v54Ξ+)u(md)R\*}Ҷv,JC{J4Tn.hs<,Qcus›t, +gƍG Ν; 2 6k׮Kpu VZ?Mcǎi999qU233 dZm%-<<B+Vh.N{9sF-[ү_?Ǝ˴iXzuYUxwe߾}:o:tnݺ|!yHf)%Kĕh})DŝƳ L1`%>{fJ=HR0p+ J83QθU=p|k*^;s8?L:AxڛbU=_&IvAȶb Bm4c :uѣ9y$={l͔)Su5mڔ/Vk+:VPʕ+N>MÆ ̢8p G-RTX]R|y~>#IX)BI,沋X )ƀ^y1Dc^Q܃08<!z.\)A*z/%l8Ëzn `[ N=C;zJW6D&v'6/ZR1&VB DNر#oA Ԕڵksڵmٶ(Ν;G6m̢ܹ3!!!<}P~m֯_oGG<ϵÒ%KHMM|ZfΝ;6~Ww^X_&Ih_,&{N'.̊C&b vѭ(5:`dOQ.@lF$RB1G3:p& \Ӳx;NjQg,e&剃1)yF݂ Ba^_VZ1h \bб8p ?C1n[I ݽ&Yx1K.-T~SS;g;%%///ڴi۷9tW>|''|۵k/TJ|%RC90S`a}V^ .k: fVTj6uAHl|mkYb b&|si<5a"qR [sm]p#7_~3OL ̬*Ҥ_ơ~޳jCx64sиNO//f{ ] ߰eh*?lGm5L%d[?ڍZA]"S5`%g>o/ⲦޜKzӸa~!ڧCI5Wt8s=nL ۩񅔇xdɧ'ykg(m!5ŽbM6?ź~A G[#L X+PdOmۖ3gRN+w}n(Jm%vڥjy*ᅬAi&>|w}ǜ9sիnjÈ#pss͍A 22y_nn899>P $taR"^ ^Zp5WCp,8X", IDAT~} ?&n~.8уyzf 7[lz|@ApmQWy?>LSn >oo~<%-wC .w||pzYgJed/g'#{_{3|=ҥtNMشri+OsɤE54?Qd3w\2<}f,D^wk9ޏÄ\{B3?V5fDN -dlIm[K<~OhfĦ6`57}!#kIa]5v}?Bw>@_ݚՖ+q5y$GJZ޽`۶m|7,^ *=vYԩC5)PFFFL<3k*lۼٻw/ Q޽{:t(?+J[|x}J2G5kְ~zt֣V;w~KD%/i㡳Ǥ$%J#k5=+yTi&|:Igb_w|swb4V#iiHZv%R]ǵ5i%}wMߵWWvߤv.qiu}P'JWWu\֐Zu+]+I>̼E=oN6we5|I$)))@?wޕϟ//e"""XB:~x R/h׮tԩSTRWUS?~,;9uE$IJ"<ڵKZxqpMiŊǤJ3o:,}5#41B7VPC2c)|'2 IS-v}l9,˛quVn~D~qd&p7݆v/+0oM2 '#O.1,{O^i#kYIU1ch*L̈_bt*_PH^Ew _yʁUX/CwkW3ݍV0*׍O*@;s+qLF\uQz~נh⅌$Ya51q3 |;yQA־ As>BoiSoe5oBR `0###n_|A\\qСCxxxȻロ? QFI'`9ɓK:>@5QR,bWx_K$Z?ܖFQ-< ӸE]$ެ:r1QRӱsLOY9C&b rD5 |يly(WI }ؿs\+ӑ xOJB -ӢW<*}'4]ӍoE 2 m]~ź"AE@DDe WP #@*ZJۤ- %MڴI~x4=9slOݺS.)vs!JН؎zĥN][_~l`&ܖ~0!5ZhҥK;vl=vV/_f͚5|_Qt:Xjjk^PT=A |R빑spD~Qk4a`>NZII}ۨPSdǂ*-/ޟ'>@z>iY>Sx0 g_/QK?0XuJٺ-q9eyDХ[@!FzSsI1/ϸ*L}Top_L݀ ChےǟSWS<!hm}TPX5yeorظ+NU =FoOT\R:>;Mˑ 0llAw#&Ů]/@ W&4UT W'BZK.|ԫK^q&ׯ_Yd Nrbٸqc<pVh:3/w !a!JAu~]g˶*TPlWGya{Mf7ncE#L @t]EfW`1*e 'e3-bhcOPo6`indZ*?NɗCM!0͟2W=\۷+hॡy7vUvtM~6e3?5Gͯ\9tg!$3~mL₧4gxGy7O}BJuc(B!jĵkXz5gΜa֭v/䪼?>?#k׮G垏:x`-[F^Xh#wՠ5l=L^IIIgV9Ì>W&m&3}cX5~uDumc>s`mNלal˼^?/.+}?dBTsZ݆ĿE\9m͙38&--I4Cm"i[f 4 !F)))l۶aqt |)j&7^#GK$٥#'Fޒw&˨\ϩL"<6UMxbk*OXz_#&z?^7.ɩB!갺M8F<9v5Ym'Lg+]Ȏ\(Kf?Sx0Zy PGJM> inss~D:3j]aJl~Ծ{@4)LtfqLߐGGӾWP+"_ѻ~uQ_`޳gv+lTB!py՟dj|2{[ܙ'g._]xo(ݫ}Dhv.E3ҟhyӸOibM :XC-MJ'M2ի?;d44Ƨq_-O+K/=Ɋ0D3=1L/,' JdJӉbЫt4m˖~K@?Y+Qm rC׆ޘNujv tmsft :o!-wqشܭH*5bϝLZ.^-%0gYئ2L+]xf,݉OD9'sJa_L)7ĴIalƸR}!Bᒪ?A-qFxMCK_ X(q?݃n-ԃ`*"u5ߗ⿋?TgxX(Ugp/ $Ȇ 9qoy.Rns-O mٺqc_|d{zVOEC{"*;=K9yuyu3dKTЂg;N-_O{='^tჵ 9=& /`yZlJ*>ާ=bkǯJC[IN+AB%m{ù!r|J獣bGǸ{QV+ˠRB!UO;On8L?a:g޺.<0)pF&5]֦ u`\ ,z|?Z@7_@Ӂ7bOnyb3-@ +_9tg!ܚtndL\lc̃ݘy*C,7UlMbPέ./B!j-E Qש ܨddeg}HJJ8;6fTYϼxyM Lfq{ ϱj#q[?c:ZYMM@$ʟ.m-_!p2Ĵ2*&2*; AB !.Ii*I $AB!T׈`TQ'H*B%NW]i*DmUIB!jjtSP$B!B!\sTmѡ6>BU]%˩'yNBlr3EY?$%XILL$11aH0v=dȠ4Uj|Χ砺j[],OIV3~cu9C?wؓYr:~^m6JW|!DӶm[6l0Yɩ܏*j+NP"O5}6c%.}Fr(vg0d#6){!{7QI9Ćz(Q?XK34hBs;GXfW,[/,[ŶI|3[NJy[R|!DAvBr\½.?"^l:OՎZ u$f~y.qJ)u<3+}^0}ǴܪCdWk z<֋֭>MgwďΛ@NhB/W.#]}!DNzz~&MG}ŋy),,TЄڨF. |;i j ><8Do䯭YX%]VG 'XbyӨ 1sebPMmѭzhz_O@/9v5ɹ/iӹOߦ|j ufpOM e7N{xnMvۘ1 M:wODjN#?QkgaJKkJvpZ ϭW:MAg0c<:< G=Z8,]7h+j/~YrRW*_2 ],ED]駟ҵkWջu`BBB5ܓA͘O&ro+_;t+{߷ -E{5s%shF|w#o|a≴3Ml DkS餩Pz'|7㖌4˸cieER'Y|4x'i4$ALi:^,=z&ںqc ǖ=kx%-A^ni\ an:PM_r,ޕNAZ:Ķ0NQѸ}grjُ->S6ٗ~d1OUʽ&Õ֎_.J3D'fq"9/GUӉi24q&v)m,< IDAToB:CIuQ-={6fΜ9رkЄv՟8y#^ <Ϳ說?Uj nBz8yßAAi캚{şs3<[z*3SdCٜr=|=p^!rb<ú?%m*^hL𖯧Z{/4]`dwbxϦf X|Jݙg?v=cü*TsO{Wĭ$ u!ג6ֽ?9> m +?:+}lZ]B9HϟϬYHOOg 0>}/ݟv:p\j{oG[Ev{Tخ+m?zu  $ݓlj6צ8u+a4[*2JVlV).9)lC+[ioW-{KCov{lhdԃMPN!/ l'tM~eC~mG!'t,qE^mc˾4>4*948wz;iW6MXЗK35; ~mL₧4gxGy7O}~mP *ӹ奰RB:GIuQQQ]t)Ν;i޼9wRTBՠ5l=L^IIIgÌ>Wb&m&3ؽqX5~οIӗopԅEӗy~b_\8ݭtfBTc:CW"zt.^Aws?Xk/p9sg}t|LzjCO j۶mi׮Yp T a"1ŝI8$L"<N ZT[]uhD%MʩCI57g*R|!S9r4GHBHP$B!FڨIB!(o߾}۷͑EDm`+$B!pzȮi۶܇*2v*j#+B׷o_mY$I&5=8jk0T_QKH*BZKIfX|MaITEm# B!jҾ}ibjTG8ij04QdU ܃M :Ɲwr !BAUAE+2&њIVap"De8&A $>Cϙ-Cc<RB! =CVV yk[#$ WRl!$ՖWDUDUMU <;T!Bd$ MUb:bʯSo[L.T0P"ǶB! =cߖ"I™rOmY(lUb(W,$\c'%ġ% !qsPp[ڢܴ[3L3gܮ1ȴ_jj:1mR[ &A҅BQG1osd$Q*&dpVGݦS}%QN5+?:+}5.BQ,$jJu%t4DUUQ{ d# ' !G܃*$Ōj ;/Ds*P.!Mgɯ3㵱n; £ )LmYw6Y$ILmdگ!T4 5xa@k]WOFxzҬW,˒cz͸%7>2n<ZI dFx"[Оw`WLi:^,=zrٺme q|:ڙ;) |־FG _H{)-]L4v@:C6}9xW:7j T8}e^jKj6~ӻoc{Ju)O+k6u|v? _d%NlG|MMVp?t?b]gtrVnZLr[2 LId:GqگӪB>{u) NS8t50^z0O'|Ť0N"ҴsdH'?m?'~J/!^KT67rIKBU7[%.Gyj.9<Pop_L݀ ChےǟSWS<!^W}QeoCb^~koa>l;Uقӟu?R]֎?scJ\SRE1Diyy3/k4-Gv'~?0rdu(!j2;D3**]nڲ"B$$}WdNr"I';BkcbJgohk:Ȯqt7Tخ1?zu  $ݓlj6צx8u+a4[*2J1WlV).9)lC+kM24x#Kvs$J>WqxN-Gקj OQoDA֒Q6A;͇DK><0)v?J߾]p0_E/ cLʶӍMkM-.+ǟ1t)9̤ǹӛIC=y@_O/Ͱ R0L7۟d3qI\>3vc橴oUWnәˆbP-LId:0/HZ ܨddeg}HJJ8;fTYϼx1M Lfq ϱj#*w2:Wێ|)4&yhe6e^W~!{rƹjnCW"zt.^A*(̙38222.''I4Cm"i[f 4 '0& "zyf4qFJJ ۶m~A;6_ ׺Ĉ04"Iav! bɽ%/LEgQ׹JS FEx!RCT3G(-խM :~oo \S!n2.H#H"&lazotگC^KPu8L3)SqC`4ѶgV?FY; _sdb\$I^2j*eCϙ-Cc<-o]JZBj!peV #q8{;6]ː͡Ui3Q/e:\!3埼g}ʲϘMM 6[u=7{;)u9mcxYqM`^G@NhB/W.#]}!Dxs$\2Wh˨K}C~*NHdž°5f,'#k<=|i+eI1!C V؇~4Bܽd5`@Ux&ݪ'Z0O + cW{KW l0imJϧpPgf -d[vc'hGPVؔqYmXJCW0NaەB;]\ve%~\zmY'Ϡk8g&pnB.64ӓп#d%:gvh:g%6m̿7__̘ezu3huv3rn8۹Xޏs؞~5qFq˙$X뇟rik JLcۥRB:IIr.+j+~S@'Gx#)ec199mzs%G{`Edӓ NX/fSd$$2TXI.g{{*޳h$N}b:9 IcoMql`&$E,1 x_ɈL'SדYq~+s#3[7.b,ccWȿzEv2adxb݅5 d,3wP u!ݤ#L&p>:wODjN#?Qkgak7pZX׷s&7O,h7 jEXI IDAT+z׳/Nwv8 sg5&JW^|!D#$9$.TS jIVf'/^yrۅo _ܽIfm璹Q4#I>ыqFѻ7>0zDڙ&65BtT(Z|ÛqKFsOco|e1x"_ܓc>Od _<4rO4{/ JGm޸l犱c˞5Ֆ /7~mx4KYGjh7@g(ܦ/9aJؠF-bRqW`*5bϝLZ.^-%0gYƮ>3pb~=1"vvWw'>1Xv)~1t8NLƖh0)Ki{{Buq$Ų?g'YϮۦ:i4R j7nZSf(G7tkVɮY]9*>ZE9.GЭ={P'9E6_͉+Gx+恤ns-O mٺqc_|d{zVOEC{"*;=K9yuyu3dKTЂg;N-_O{='^tჵ 9=& /`yZlUb2w"jzƆyY|5'Y;~U:MJr|_ Rr-iocoP:oVOcܽ(WFeP^|!pa V[=jþS[ͣoW ?u|v??;Ot'k>&N][_~l{z(^oUj,&-Hۦ[nmN $9"/V%1u ߮[8d1&\kɨƝC^%O8u}.kSˆp:0=ڎ@MCzO>-/ X'7㊼JFr3iq&FwP+f@_O/ˤ 4JpAѝFEf_6&qSDt޳x#<؍>JLhMbPέ./B9qj2zԾ++(7 wAß7<7j<ztٙ~)9Ύ1)|3/1ϴ Dw#.vo\9V |_/o|)4&uafe6e^mws*Y=f9XP7W܏0ڥ- !bΜ9őfv|LzjCOܚ5kgРAqXRFLGm2>4&6FW)))l۶aqt fTpxGjVFŽ%/LbSQl7;D:TKNAQ:oV {z7^{pKɣv)mokBQÜujϨL>qM-}Aq4+nFu2 oڍ]ΎD@$Yo 70hۊ&ݺbo,'gLG+ $>Psڥ !IN:WH,7*$_~tpfjڸ%AB!DQ+Wu U5~D6roK*B %W9KP@S!KDԦ$/$BQ\"$9 ]5DίU!Rbbͅ$I^ҿw6W)&Cm|g):8~KSۙO"g_ .~H(=K&ٱ!D-d\$ɕԖ@qgS:AuD2dsta ]*A5>SesP]5.$sW:ԡG;,}gU6`|wf; Fi/U"""h׮B@Gq5 Tg3V,ORgT,G bwC 19jǡwh|H NlrI+!;0f@'i<ф>dwFmmbkR\|㷺~0WJ@$zl+qLo~KRuFzzK/dc2g&L>7|Clll%գ{ǔ)S4i9y$mڴqpw},^^{)S+jժj6:BqCc]K Zu6c+9I,]&ȕ2S!xfW+}zӆs]qk z<֋֭>MgwĨzV; £ )L^vY\???Xd ZϏ~> r}q]wqj6$)w~W_}7|>իW{q g45roOIPw_ٌ%:~d$m/zŲ,:::d=F],s (wjnՓEs- 'rtz؆ȱIνuXN{΍4x6SK833Ӗ~2m-1wړD4#u}lθl,%ƌ!]h+J!crL.m%~\zmY'Ϡk8g&pnB.64ӓп#d%:gvh:MJlZK(oZ1K gf>8۹Xޏs؞~5qFq˙$X뇟rik JLiv)lTqE*ssovIHHpdx}?_._Lrrrp'̨̹Q(**qFqq}@'Gx#)ec199mzs%G{`Edӓ NX/fSd$$2TXI.g{ޙEY=0&;(@eZ]6+fni{eZgiWk]h( "pyf`~x)s9g89˃g=z˽ym0IďIT~.qpO&z$S?;w)sAJ(šTXF6wiY1wm\ UNY?jĩKᴪv8{7sY[]h@A56BNi,C&\j$ɨ}X!I`ooٳYfM9?PZjkƪU]ljQj??֭[e{1DjVr.rDc7}tt/֎y t{c"MrC,Z) EZzx<-5h}T4S RUC_ ݅KFz.F۪|s.r+r ~n8ybӨ}x AO>/:g Mk]-=qog{xvG4LDbdn;GOҶu$)IYݚIT*ir}Iޝ`m>MG|&qb^}?Qkޠ5y~1 Y5/\Zn!B=E~c* M `ǠJa%ޘ&CuFF_] =%kQt~H j/W\ٳe տƍgʕm888kϟ'99>}3dLB+]/6ZŅ{t 7_JRz'= pσqGPNx5+nWna6= ~Og<"Ѐ 28wSDPl$ԺIS[5.C\H?7C[Q{;vupurxխ\N̦]vs#3zrUs.Sc3mϾYfἷ'VU5~/F؆͌ p~l} 2΢vmgi *TI|.>{x+ )OԜd wU_e2nVd/l~HRVqW\)V۷__߲{͚5c̘1n@s a0V~2ld?K$ɻϾjK\=~1Bk(q3/_^W,0nԩSeoggǤIpuu%>>ʞOMMW^;L49sXtS $h?_|W2U6m|7M{+Ȩ՝f&^ «+lk8ퟆfP.OQx֡Cz}UiNN`S n홿?gLmgzNHiا; >Jh4pW~é=uLlH,uoX|KTu:"/|n5"jU7OKO䕳M[9e0qί$]ƈ v%ˀ%X>swd?[Kuoz_0NA}9x0/tc|TZh)Zː@a_~9.gr o0|päIpqqڵkf)[*׿_ĉ8q"mڴ^@POk:ٰaC5[,0%C a„ 3Sw1uTx ^umVGqqMϞ+1fH'/KH,miP0">"cVQۗ0tɥ7$@`ΝӹyQظq#_kRJ'ղ{iJJ ?פvCu--..#F:ё?9spΝJ#ߴTy:_[K'$${njMҥN;T=A(@&@:3C6-?oehk)PxyÙ'Ia#)>/L䤶ۯf oJN x5&+xԥK. bCc`ܹs{޽{v7oޤaÆ88<VzpMČxn\X%?ȴ_p" *3&|ˆ9[i~JdZstɥ74@ j ?8z(u֥ytԉ?f Do !22<@ D/l:udaK IY0ojf4M |ܳe,].LmEu?7p囁›lДyY@ a?~$kCkDKc>f4TSC3 Ӯ;|* |Bz%c b o?@Z-~Unf4>kˠQ9) jA-=$I`5eZ~X5MZwJd+:V$ωS) #*CBJ7&S&Q:)#0ҋEOlGD4uϣ2A}eHy\} #{QW7Ԓ)^)K~ƛ-qqէ9݇eύ,E0U MQگV Jd;q~|:ץK. SNlf& hՇuհrȗ'AYH\sfFmkjٱ\wv7qV6i }M$٧u:NḒ,2DIHF ZΥҸ·#$?ϴ_ ``g4́+ݬ9׿_!5V-In@]:x_ )))VyPR)4P&[mCOЦ xdf,IJa'Nn4ػHwvH9ǚ ׺Aҵ Fb$;P+3!,DG>Ǻ=i匳W3BG'>AʖӞm]Nn cYZp'M?dF߁OBF8z߿ǚi^Zm)Fnf hG}wG> jG IDATo@n۶gf|n%n͋ASbHu~I@Te7w}Hv pwr«㼻ф7 #ra^˄ؖ+<Ōs?O'̜|1U] p&9³Eԁ̼6o`@G $w *?O^l8K'u=):PY0f4ʫYu2{izX sE[87;~;qsɻ}E?Huj̋] w( mgƒ7($ty.ZL)"!Ǖ^eb{[\N빠 %raM*,c4F;Ƕpo~Zƥ$LՃQ$y[NϿNawc:=7śU_1V8\c+r$IK-]oֽԜ ܥd< g2sKcts.ޘHt-3./z3 k]\uc l2 Qt&O%Y_ ݅KFz.F۪|s.r+r ~n8ybӨ}x AO>/:g Mk]-=qog{xvG4LDbdn;GOҶu$)IYݚIT*irLDe_DFE.'߃w/!Xdmӑ(I=WOgԚ7hKdڐs +4z(S^Wuk6da u=3:<9yW__nUfFk2bݺ Ko}@`3X!I0Q'֋G k/_}Uͽx~NU/j y&pvy)GY=q1 Zi*QRQUjOlj䑗|㗓Tڊ/ps1{9$Fq?.ⷸr P< pKm7 ZoQ gI[D1y6Um/\Sh-C%nGkrI/@ LԚ٪lBaB!Y+^mW!I*w;E6 νmq6>xm=v PdTyLK^x|m g *߅6Sw)>/:tXCZϱֹ*~24] ILcWCtj=QIi1RC# BuǟGCo8Γi? E[35=/UN _.j̈́|ylӖFg1L+I1"H]2`gw~I)֌ʪuQQ|}k0~~lf~=ߑOb_Qޖ8`ra^ޏ:R !¾rn9]26GM9$Iz0o+5 SҴV/)1| j2xɋ;Kf1 HFфwSV7 5}qlV!??;^-,,ɖݙ7OĹ}‚1mɜFVGcJ:jF./,ܹs>}:׮]3*]AA7ndk QJ餹 P[hA˖-III~ 00}|-x)IgtX֕YPcӋa+ ؽ{7E&RZU u jhu晡}Ųi) 024o88$;l$8P坉|5,M)Fautɥ74@`ԴC*rgfP`Q+3&FQ2׃ -Gm"fРS4i^D&Uf4M*uYsL3ȴtKohfi$ =L@`@* "(e:1YHR] _+&CL-/XCp(ڇbu+T@ 5-ZPNK!<5GYT@,@PjީS FPև݈U AEtXX&F%@ A@P5LfF[ Zp@ LM?$I2VթiDcW'Nm\@ "Iz>,OM>>tO?$| 9&Y @ Xi-0Vl,-o PUALAMQi@ &&6 P.8:CHB=M@ AG4kA̢V/ 6@Fkiw @  @Շ ڋPeքiT$ QP3!@ -Aaa!EE sJEG@ #5"N5?o,rO<_|cHLLȑ#lْ?zmԂT)['wqKwW büآoE `6nƍ21M(Mxӧ8}@Ir@`&@ %2$Y @ ""X;b<I@ XtV(|ji"@@ dxS@ &!fQM#T@ EQ 2D۩@ @G185lyh›igɫ:6{J]EEN.{WC3_k^YAEm#~n0Mlf%7!7<)ɳ-@Pp5< g _9,;jAQфRP(P2&K+WqxHBhih1R4/z>ۏ9V}k|#3pGeЂӨ9 IQ?!# ~j25,zI Tي9u ^aDeHHdBM|;+kk5` TP"%(¼J/o>Աeh)۳˥_?Ж8ӜCF~#"*ߦbzSׯʖJd;q~|&M zA|mojQ.7|yMmjFXd TR'\٨Q&|dfַ8q1ȼ'#5h9Jc>;lFҚdTWh|ȽvIr͚m{|26 Ƿ&EA3qDc!OЦ xd+IJa'Nn4ػHwB9ǚ ׺A IH(AMx}@Rc݈4r٫QړӞm]Nn cYZⷊ=;ɴWǒz}veF$(¼J$BQKLˎ;ד!k.jš!38&m oSdTk^ ڷB\ӫЧIkk73#JgZݷ יG'}=xeUj?޾&W=ݶ/O'6{Q6}𸾗5k|K:wңqva\Z7lyD^ٲ5R(P Q, o?F&k9X*e5ԋAhcAM&P~܏ a,=LM ʥehq,9‚׹^V>БgG2/fгK9/ PÕ ϊ{qS2`6Ƨ1Ó5Ȟ\>{,=LHxbCeA~n<+fEihZ# %raMJ"K@<ʖ3·?]A-/IK$m| 4Rj) \b~ kۙdM+ I=]^\(ֿbsonwvnw:㽑dN-dJk/2U|~O?5뢄ܛٸ䀗izp54}PNϿNawc:=7ś$y^=4+=pW1\@Py* 3[fPŚj]fN-ՍbZĮ[9XKey>mye:wkǼ熃s]1隳ZP_`gF/N׺.ƈim]Jf4>*A*gwa 38 jɹʭ01يOWo>/:i+c9Cچfb?Dg6QRW* TD&s9|#OHLZG@k{Cw:?ϰx;ۣtoƳ>a&sY;,kڴk`X]|Iaڐs +4z'Eu}>c?k_Ź$6Bԅ{Xa+[U&cPST5'`{`0XZcZCYԚEҢR <\I}{n65**Nfq" etN̟Ws;&Qͥ|O.4 :ŔS6Hrj]˒҃ѷi+c90e>Ly͎] ~C,5q <^V.]ff.}eOx=dikeکaHX~h1o#v "JZ9Y``Yv.($U$j̰dE O|P]|Vp'v S9'ɖda-[#2.ΐqۊlbɀHhэ.-1{j.-GSYNMעТRNYs攠 )#. ҋ#isƘtcf9ASsܕAY~9\=4oڂi+c PPaFN?0l]c4#X{ ] ^Ulw`h7y1o ZCe|0^_ l\}io}-E~Dѭmtsӥ!O7bo|V~lC)]ʏзͰun/YzY.@z>u=3:<9"*۫r4ǟŠ*qm藊Y8f OQ8̪дejhaB}e&'o<;3ˌ׷uƿ0h!p<[ҞK|/=v\@#7^xVN]OQ;Я|T-.R掇JIC4:Nȃrek\_#R),@}?/Õw-yxUuaC'vY QLxdU[j*ʕD!J@緎sܘ{–hcnʕcnʕcṋ$h?_|W2 6q6>xm!{P`"Ɲf&^ «+lk8ퟆf=.OQx֡CzN7C%44v}è5"jU7Of2z=pݟ4v(;k?OTgm# BuǟGCi>~Dvk9~gj;hsGZh_iO''>~6Jʖi&r}M֌ʪuQQ|}k0~~%\~=ߑO|>ezD=/Brc|}*j ʕ1T {KA1l.15-ձܶ"B~#ȣқǐ&+#Hll,!3yaՂ:Cp]z8Zh.33y$O?:"[|P{#~nw9D|&[wg~8<=>CXTEZsS-@ j!887V:-$ @ X"@@P-ԭ[ӧB:u7/*otAhNDhY!I@ J'NBu'Z:Z T@ ‰'*RmiAhNDhyX6@͌&]{֘kSeQy -,Df&4%x^kˠQ\/LfPmiAhNDhXwJd4uHQ8FTnM5S*)#0ҋEOlGD4uϣ2A}eH\3 m>>d.{nW"*ߦbr\_^h+Z %2U8r>qj%A fP51e-Ieʼrȗw6D䚫47j[,٧uB&nbVǨo¡eo 7xfG6cғd ~vJ^¬_9 W3 ݬ9zcӫ1Um5V-:Hn@]:/'NT:H !/tYTTĒ%KΦVZS^="""|0KmI ]Ϗb8q"&zZT^K䧉}hSGcQ2KW/gqb0'G7v`i]$;$chkv >b$ 3 o¢OtHsѓf^8{5#tzs|ړӞm]Nn cYZp7MdF߁OBF8z߿i^Zm)Fnf hG}wG>o@n۶gf|n%n͋ASbHu~I@Te7w}Hv pwr«㼻ф7 #ra^3yzlԕFg]n׌n~ЦC+vx\F[K:wңqva\Z7l~5 Hk]duɤ_ T;AL`P(9s&ƍcҤIܾ}[nUSkٻw/֭?gܸq?^z/JZscKZ T5cBlK%~~rt]vK΄ufŶW3\ןgG2/fгK9/ PÕ ϊszym0IďIdO.qpO&z$SDb3D&sdKu$)z[3i=Zcr_&)H:=Lֶg\C}V:@Y)8 mӕگ[;f!CҒؼv Rgy<{}~CߘJ*i2)BI.FBUgPi\ǀxر#?8ϟ/L&M۷/˗/'++ ww{Νo߾?[U-[nʕ+ܾ}4,YJe7UϏ9spItB.]ذaCǎc߾}p>S7?zz),,dÆ (J.\رcJ-111ĠT*ˋW^y0]3ŲjӴJiқ}'o~>(_S*t|kȈlS{QRX0)*C5lZ>;K=+Ut̚g%6ӥءOJцؓ-=子r?Zk3o%LLZJ+S-R7z$;E2RvJۿ+HMt%t~\֮3HXic!Ң+++J{0iOW{hz1gwOIMt^ZmϽ_H!'ypMg-!9)Rko?J]5fʭVI$)7N_znݟRF Ko}@P-?~\$IJNNԿWI,\Pڽ{w2#))I5jcI ;Z,/]f~7jxߗHSL1ڎPj4gk׮HRF?.EEEٳ˞-u|Z/dy-T/Gy晲Iϯk$Ize|jB$Z4.\(_Sk/)-8~TzELڃui1] AF81GN3rݻs,+ ;r>$=c 44vr0op׳/(nE?bОob?3RKGui UO2/w|r*guSqn]TqMk#}f#q4k,&^ ,HgGsFCg^??i-^*GsѯCˈu2,AAPSNcٲe9sL̙իrJ9ͳZnݺŮ]~ %::J6UWWWOΑ#GHOOgűc Xn]9[q Ǡ&Zl^_x-[V|ttcnn...Yjd3 fWD_Us/#_>SrE gX>q n瑗r#TB$G5kOlj䑗|㗓Tڊ/ps1{9$FqrI/@ vj j:u:D/`֬YWL%??72c Sh0k׮ܵ}ѨQ#z5͗_~ŋc Z-ԋ ݺu駟\xѬvk-͚5#44 lRfTwS}McHPO^$66ɧc<5XK9RĚ>86+zxZ~p۝gm/Qndr7?cے9ϭ)ǘt6fҧK.! j*ASyIߢIsyUk?۷욱s?3gpmrssIII]vBz@dd$'NRpi%̟?ptb%99cǎq-j58::{i=xϞ=ܼyaÆ=tbJ-`;R?ظqUk(..yݻܲiӶ1Mؽ{7E&RS| U u:D+ 3.f=':X޶e^a7 ~Dj$3uݗk%4WɌ&Sw~>BQ./po˖--"U=ӔZCiݺ5O~hvԭ[{ΠgO6l'(35[iӦqŲ/$0D۷ d߾}t;;;ի˗sLm̺kˠQ%\/LfPkRhNDhuPq|"NDjE #*|/L{P3*XDʾ~DDSG<*W&˥_?Ж8ӜCF~b$hvF3^';=Gۺ*2d Dz,4o~Ɍ&ܿL{N<nWyw)ӣ oF(¼4 -SWytm_3_N8:lr#o7/fde:y3h|e;I9:h{^Q'u.{G<n&:ɗk%(((,%^.@P=@ T5cBlK;8ցaW5q+LR[ܲ),zlѬ3_jK)"b* Ⱦs0}^*Ͻ9=sν7cSvهXr w^ '$qF`0^OXNζ ՜w Eq=~^=?UЄ9r 9vœϡ2@KȺܟכxd Ӷc5ˎz7]| .eQoLV ]/RW@ )P{8<̄RU|w'm\;m*S(*Y6C)2Zdfa{물JQ7꯼w,ޔ(BVm\Qv3j~fۯ>G{ѽJF[D)m ~l;ت[Ae-S^6H Ttun\r!D}VEQj3)ŧU~yeÆ v8TQx,W^ Ro{%4xwQ|̅+#*W~8>jf~ /brdqPKwʗoaDr:qşp7.Yl* ?cO]L5x{(wCgMj97(+'X!z/?Hj[Rllo+!Dk#J눃ʐT\R|EK,S ZK[*f[yDZrMQ{5 Sohд.BQ>m[i5zKAf kEQBi:n.kN=xXwXηw, VŮ9=|-4Q,YT zvs,)tgYT9olfv֙%㞥EϜxӫn}-3zzzl&l_P}'5rW9{ϛڕհZ {0SiĖev-Bԋ jCsMű,IYKbٕzԽ|8KaF<X[ϋZ A|8m{/PO-WPxU=Oܙ>aOrI$; a=LY¯'2(,#)'ޞ4, Kٻ=q6[FM?Y>}: >qCiăe3WRzXLt?ޒS&0ܞ)JAwRv=h$b^屷mlY>~f%WRLX/|3͇IK #rv&Oo=OB}*>:Eљ\o̶߬=<>jn=LRN1 z .Ht7J~Q %2~rVBzאFP ͝o,!eLR%I;nᩰt톳cm̾D<>ZMXwe=/w;3nٴگwfnBGy0;!7IHz:RP9Wm\65T]}:ԅ>Rړؙc1㧐KVFq!w?m,׆pǚWy5=W|w||տVOϋ`PKZ7͒K^5;jOkj/ :-]F)"qۋDMnKk岵= !M]FP;ġVIټKBCCؖ JcD8toB!B[A-8{A2.oB!*B[A-LaO^tGМBqT!8B j\TI$!B #B!lslU)3*4P9;;7,Bk !q}FĘHTûbzBz3{-Ϥ !7,ABac:;=L{NsG1nٙB!E2*Ǽ'mi]t<{*O;d'B!۷֝=zPp6jA!& !^B[*Bz!Ϡ !E:B!2* !^B[$!BZl?LLLL gϞhP\B!Wy5vo֪\ϋ`ٵ~$MB (7"xFv^r5>kO)i;^ac#&46ںR籸DGGٳkݼy+BN;* QA"[30wi#u%Sc#;ᆧ;"ʖ_sedFmk<WEiii>B!n;:ߛݨ7%h;5s'"&2ԗ!ƥUCrL~qO[,2lg~mLzCN޼,|>cO<vBKli3*Ygdè',}o3wwyo7mc#=g>Z\mw<=JY>W=8M?T}!qmxA`ݚoy%+nx6ʰ;+cATPg=DZ\ؑ'^ڕޮ !3tK.d|ĿB./r(ߞPtfCܼ%ͪ*g\ȿ/}6K?̽]憮m47,:aA56 NH@ 71=d1?ef&t7ѻ 'U=k2,x%MK[;DNZI|Eiϻ.y'>bAT,8h탛{f 9ԩ[ڷiuB;7 A.^-|.o梽磕6f|5iwVcWMΐ-sP777 ! Gn nRe2]ě4ߞq;Ӿ2D(eJ7Nntz GWn yb1eStٞ JcUe_psį xsx9x=yOdr`9r8hxd Ӷ.F]Csrr>(7NB[+.旿R)+K^iz[(=VEFϜϡ2@KȺܟa;eKqGٝɋӧMnfaggf1@ [/y_{ܝQ{j4H#d)E]gɔ*Y^I9S,|LoMc;β0)D'aE]rLw`Tj4Υd=<܃nKպ yت|O/|^x4͓ 'ij61Z)Oj&~ݿ ҔqPi1c%AC!{?~ʄrDu2ynig&?-сO&x4'ra_zuw JϷZK*+28#V1bn>Igɞrٱ\dVNDӕosѣm<VW6UK-U?%ٜ,xyUY/W#&m­8^h o=[sx81dsȇpx{StlK_nձ'*ƾ5yU^3Tj J1z[wD}Fy$ [+,~l9 >j|u~եs;l<әNBܠz5WH8?iT('o :W 7JdҊ^A0ɴDeG7P%-iF#frX%܃s!Ru]o?hF|{>B_ZMM{*6e#v*,YT־3yKJ4sqv*LFxlԕml =YG6bb]GM;,/\nW6hEtjNJ-s:OUڄ)=3dN$NqQ{5J#˭ޖF L8,h]jSui㎨:Luִ$rܳH>j|u~Ymcfd6 eq QLNNBܘ{ww#NXNOOݗbwDyW (H'stbR^h5joS5xJ ',{o%@M a=LY¯'2(,#)'ޞ4Z˔JG-9ـh&OYT J3fg3WymmclTv}tǻ3=D]GwtgD/_1}Qr{b3-ggǹ\ 3nKf{+wTXBɴ+py7Y&u]掋=Oܙ>aOrI$g M_E/, bR8I=Pui㎨xEl֖y\7s/i(V>&SQ !Uݴ?rvE WKqR*QV9.OCgN)\ _T\JTbU(4K[/5묭i^ ][Mlb6iG<:?-.Á[gFFFe2W!n`6|i3*Ygdè',}o3wwyo7mc#=g>Z\mw<=JY>W=8M?T}!qmxA`ݚo[%+nx6ʰ;+cATPg=DZ\ؑ'^ڕޮ !3tnJ.dq.n]^P=m-u‚F/lou^ƨے&z 4q-CocjNiϻ.y'>bNaiߦu{+Qf}յMƝ368YLQ(PwN-] T*T(u^g۵nnSǒm:jl֎멶f1ͯ#xVgl&:̀2퀦*Ϡ ! m1I!;]&tavoш~{v VO?ʠbfq.Sutr;M8r3MH ͻN)kWP:}=&Opb0sz(֟ r"/,xd Ӷ.F]Csrr>(7NB[+.旿R)+K^iz[(=VEfYg.|ͿXDօm]Ψ, Q.[8IGKeZ{_Cx@?M"je:mӯ}9DϼWcU|:i_14aCN=Ē=X9Y'Y[V9BjDݫ<֚thee$u[cd&q+Fmo ulu㶔%Yt9H _^e@"t8A|?ǥq|-#2lN,֡vRsʾ&3fܴ]k~nl퉋!}ytϜ7ޭZrD5N[eJ=ؠ՜w jfej-.f,]gsb1u-A\v綿Iτtv]T7KS5HݻԖCiYjzk?sdyIB;^ǘw#ßi ƽQS{3v7Ð7Q1gZ"[z°, IDAT͢ѮO9kgl):_1YZ~R3總]xՅtc&/-MOۣ.u UےJK(=zy W&#縚s'rK<œpy9 mVLI] GGM}Hs9=$9lϝ5٪kV}9N5ΘV"sQ<=3fٴsf-nMgfM ڠb%sYs)gOp:)[yj-㶮{캞*.ϧ3iZ.//O+b_! (5GMztu._W(JO&@!]|i.*/ؑy7GJ[0UN8@QɕdqPKwʗSf`_R\{)p(;/WB1Z[Ӭƅg>JϷZK#+28#V1n>Igɞrٱ\d%Z+;PBz5Ɏʕdsȇpm{Stl÷*ېJY)Dy$ [+,~l9 FM80!TZB-|QQ:jmɭ8^h o=[sx81s\MnTn= bNrn8>jIд5|~y#ͰZ6rTTu^*c]Dr:qşp7S]pd\0rk:[_ QL]{6{l\O2&*^~ylOU@/'o :W 7JdҊ^A0ɴDeG7P%-iFfr'P%܃s!Ru]o?hF|{>B_O3EKtQ}ֲ ;eGsjgl-ܲN-4 cjoںfV0uYnO/8kZ9YZ$Q=YG6blTzU{-c+V 7U)%\{ZGJ[R7egXỷߩvV;Ƶ9i&uC[{.ZrTJq;l[6]%yeOXVЉe3Ÿ SؓĄ!O 60w]n%pl9 eu]6M i!W' [f6Iq !ľw z7~$oT})}K)LM䋙8ZNg{OS(Uosi6⌧ ;i졂_v!M0O*i+{=|2m1GM'VJ-UV&ܟ,>8zo \縡 ²+)Vl9!L)KD%y$ۓ&UrR%>]|e {q.ŒxـMՙ\3siwOؓ\@An>~C?IgLdgP2y%^e9|(ATv}tǻ3wSYzĝ,WL_TVV{+wTXBɴ+nlSf/oLQxc{˝\@A_,{C =I.#&~V4~;D^I')|B9'aت/Gi18lu5%5^5^^k:)JA|Roseu]6fzbߢaD1 ց/IB;_FZx/OnK$33rMW_><@Ә7WƐ,c1ͺ}{eKS%;̫Vu9 N{9|/khw:Oc64Mj5E ->I (AX˜my6zi})ƙ;f-52Yv TXvY16@ӑF7}p6;JM:tb]WxjWGܚQ] 8l$Ng럨x&(KΌp6I]ՋoeSq~m$>'a]giAzy4b* mށSu|=y]fyhO 5{mWߒr _$xwdro<~/ڶ*`^!uXsQޝxo+Fw#ÛϳlN$rDyeC]*U}j/T60s>Yt_t@8-$BYl]͖qu=ϴ1' K.iW(ޛ Ù7o^ *̪UvB!=#*cO!%#4ǽWYQ8_7I^cPl5OWy5V~G:) ~^_b׺4TkEFv3Vxl>7?p/.KM^R7F->ˊC;w>էgk8(:W'w?m,W[ U)"qۋDMnu:T*l\Msۇj{NNN&::><<={-?J:i4ޗ_~Ihh(QB!ѣGٰahu~=uVNK[)JTW;f!B j%BF]k.N<=Sϑ ! 6Ю];9UV^75ՈS!,kSe6lBRv툈؆UNvPeB!BA:B!B! !B!hW;!B!W_tt4111vNϞ=1 !B! :u]/Y={i[S2W!DÒCBEJ,Гs2agWUM!N`z{{9bĴ&SmMYFGG-..tѧ3J+>˚7wyvB!(kXJ7tb1Mj+~4Z%]%]%QVi:D?Y[2I~KhlO";E5dz$2ҶE { M2=yg~tiۂf-Crxw/[܏q/F#˼KK_@FFFaKjhڊ,mk`ڳgO:t ..t<0RdPodЄx ptɣ;7ԁoDxmOx;'$ ; l,goy .;#X -?XⲢ} ..G)EQtt:tFPE!==ʶ6GfTGUƌBJF.Yif+zܦJKK%]BoYFʤxYܿ ;"\]SX\(M\w/эLc9dݽ mйͳ %u3W7@ z_ndr>~͝u MErrKKK /_ԩS)**:Jjj*k֬ᩧ1C>1lrn:?Ξ:J?kۗtItI#,=Cx.@gřK>۷Y4mڄaO}%g'f8T?^(%c2/mZдIctzݗ/W PM.D?$''W%..^tSΔ*pAUJ'߮g[omh$]%]%HL)^ cJ*.޴kܕ7K\Hbb"G%B OGFw(ouaor(Ʋ#̟cr$/%qДAU{-+S:eKK_P|񳨆4C'3zFUYQFU)B!D0L]yҲ;Qakr']+z0by]uo1rVl]J2byI53h*9ޚĬfwDhs՟qwrU/<ʿמF1.pSa/..^t4ݼ<7nLRRRmL233M5l ސn_5B!5ɝ|ŻFt<˄xt>?;]OƻtetfΫxt{n z1:h~-߯n/3/Msl#GiIuN7...HTC2k^t캖MBQGE'0hl*K7NGBQsQlɩ6ZmeU!ß6EY5s"CtNB\Yd #Gk5k^mMIU!)緌MpN'Ѭ`BѠ~n͚5v^M]5%T!R~y|ՎD!p={+B!BqHU!B!D T!B! gPwɓ';!B!7vQ-Z9 B!BXjTCtsSJɽ˖mP0 ~ qOwl%-NzM~#ކ}%8†Ic*?G{0Of{hz]rM;2̾&Mz4נVYnqQeӶ$nԕct]PUwln|"[;iZ^Tj JemQP F#~q7>}k#Tf|c6!Nuig}O&w'MI:^ymq[2mTOnFm1[MʽO@)έ{2 <ͯ'B!_DGGS ?1Ӿ}{6lUgfټ~ ENx5}Lp 6#:UG #^x񴫓GZk\8N *ͬK,q(t} ь?Vwm!]ͬMf8ݲ- ZCk]ۿovm[_-@z/zsow 7nle-@|vW>Nq+vA۪Zn.w7:98ު*I==`AI]}2BblZ+wo!&e&I'U!B9={v7oP6c1㧐KVFm^)EltnUGAoȍZn!B!5a޼y5$$$j*Ά ( F쩣#WRQ2݁cl.B!*--uh~ ȀWOvՉjQ-B!\T!B!sTOOOjtPB!BԊi(fgg8?;ޭ+)Jf_I*ځеQBځ-R$iB! Biii95ܞA->ϛ.{h[f>%Pdn6y Nhl! b1R#H›i ۆQM[ǯ?el݃۳i֕q8plhv\=T]n|amsono".pB)awU5>s'npmawK5m.g ~1W7Q?6Ԯgw=!Bܠ Nu:vWRHbL<%sݜTua`\n㪽54}.'CsM'pwGm`.o[\(@O~b%խi9G~aKJ0>Ԋ3=E16n#mOrSyIٴit hxSQ2 /zI}K-Uu5ilڒɗ݁-9k=:gm޵ٟyTцrmgoڝ/WB!nPjrruQjiqbp6 'p*CM;Vt(XAH'y~8y.}3Wj1S4EdG-fVurRp"+VIK}> Vsy;w|trEo*pRQF.Ƿo%\Ej\^?UiEie땏$'ۮwҌٺ,0`HW@O86IK_⋋!u!nŜ# oZG^ũߍbҕM(*6b= &۷Lq3;-RMchǯ6F24ٿD?H*jZP|kAq}г[|{d\K~6ΏZmqGFmXM+~:H)Bqr[|k6&paI:thOQ(޿W}Ǧ}`ucjcK:Y'9IlZ+I4p;lhOaB<:{5y]N ϵ1etn=|qŸk./J0ȀfA#@OӔ4j.Ji xpԎ}Sq1iG`_YNjP5dwr\l )FYBOd|]9UbU>YXoLe15㱕1vRnsyTPDz~ ڳK岗NN̵]W Y;?꒷ԝb efoB!8Z)() =mwѸc:CQҒ)h֝?~ /?31@u4No$/w47>j4RGM5f-oo\صixСޮ|LIIg[9`Oekwơ [H,vAٻYa;KL.HhI\ԟGSNJTT\0."](,A0u7suwsX_5£Ȱql5Tx6M.Lvmw_Ѡ|)xɤ%j\8-q.£nFbI?DNWhÝc}\݁c[giKD+fgtu#ӽS: ~A9hk4 6?wfGS{)2=B![[|u%IK(Î mRRRܗ%>g,Z^XoCV:WkB!B/O?… xⳉ$BcdY6:WkB!B|N{X]8'cB!B`_nj.W'B!bA 8,PB!B,H}}vU!B!ĂjugPןcћ"n~#\zXMWl}Jf"07t[<B!"H-((X3fŧOu& IDAT3zĐ{]1vF?fm7cy,;)8{Yˌ*) iRH۾拝Ξw3bH A7ՓLÈ>;il$71uMQ"R}7C$Q&ѦNB!BPAv]"\g|ׅchSbYYKwsohRkhb=x' Is1uAC2v3s;֤IJOg!B!"-u5:::`K~IWD_NO]^@ hp~)ىŠCc*u4B!B!g׷Sſ {0H\iT_9vm$6< V!'.Qs^GS-Kw_o/wg_B!BgPu%IK(Î mRRRB!BV,TJKK .\M%wPB!B,LvPe*B!bAV3B!B!~dU!B!Ī ;(knWkB!BPT NeycdwicTWы>դћ"n~#\zXMKߵL~O5P~FJ~hw (mr&?ل !B!X[| hii vPVN[NL~ABg[m>odCcwe݌S?4[)vw`èHٯybH`ĽǼ!B![muj: hz3Jgu4H۾拝ΑZoRsabH?{IWy.z>q7Wzgw\Eb&)]R}7Cx TWSo^N07PcrN`N7(.M~߹);qV*lN$D*8u{̳ӷB!"B>O4QH*n.U8E[|d"*gp}6:"wOٮ*<`0=y1nڛql3 贷tcJL#+k y= &PG_ r+8d!B!XKAf+EOOz$i *8>T3#.feGٵ5K}EJȰql5|.(;8-Xϥkpr%h"k9B!By?_xe1a\JJJV;*WG^!B!-ej… gkIƺowP)vm@!w˘B!B,P[J%&B!BeW__3} T!B!!%;B!B!VARTWӧ,ϒU|E!B4A]kT&7PSJ? _\;+r+Jp!7I4ߟ|ݿd +.r#'K?7 v[^!B!j.l;J{}QJ@$Ot0]AV~uiBvF=Fb~]nRTVH~˩70 p]`J{}$g:O`}\~!B!:vP=Nz6'EF"V-Ly;n`3FL! X1&wagDAWMbqwK]>qҬW$=VR}CF00~}wzQ $Pҝ4T6Ws##Ӗ%Mj0L y/cjGdFd[~j -v*Gqi>[_K3^`ƨ< 1;[x)ZzՅ.,ysB!ղ:18|ow3BMݭ &-POY8UoCյb̍=F_{3G.5'wW;yw|&\81%u~O@G;~#4@Z&0 hQOiz[桥3/P?zʞ\bXkOÕfTü8ޣ0YFB!BcAI׋1bl#a xhp~9j 5}[̦p'DLSTUE5D{8Da~^us<:u>@>\};ť´Lَi5^m=2NpCÄ ӍE:+X,J8{SyI&x21n>,&@u1=ȖxyT!B,T; [)*Xϥkpr%z=Xc 9P{7l8M<\-gF\x6ˎ+7ә1sey>P>;i8_EDlzQdXƸ|w.i[*XotoEDSD<ؖY3?o*$cIGN~י]]lnu RO ԝ:sOهB!buZjttt|u%IK(Î mRRRMB!B,ej… gkIƺk;B!B!ޘP=* T!B! R__3U!B!ĂB!BU絃ة,OYhB7Ť}H,R!BԩO`}fdZf!<|m-6OMX7ˑz.=u,K&`O`^cb9KG;bBVit#ظϊFS!BRyq9ڴF=Fb͋VTo$-X,%feljnG n}]񴱖q$\bԾZH`TtޤCd`ցb@ǀӟ^T^o`0B!XBԅ-PgZt OdM?bSMj0L y/csIL6ޭ&5aH^;JKF1ovFҧ@oyߵ^r]x3ʹv|PQ^=uqn&A*agā DL;nlg>tOp:Oѝ.3[D&f3i Wn1?L.T,x؛8Ugu4G4_dĽuAϧة5".zvpif)s=BHM\꟨d{RK|u^` B!LvPTC6/O~h?|3"ՖNp;hhrQx lϠP=x7Sy:Bvѯ9+T14)1$4){>*$9:v^ko#|A(iRr87iAhkb=x'ne~UEsS'0C=?eTvqߌ5wYBgmF yDMٯ-9xm VT8?`}>-J#rWeEy`~iZf+@pݻ?8KE}/&+E=ߕQ/3pH8s19B!oxuVFb2\Ƽ]6\AtB4+CIpN;0Z[ZJf.߾s&MQ  rR}YN'PQ7C1ɿy,>GQ٘ߢ)<lasFa˫ ۈ6[|}tPt(8=Sg5q_h9W` DpevXMzz_~VN{%?!B!V љF)n"Mn=QȊ6ZnFbI?DQ(5Ʊ+7ә16*e"6XmmoZ+/Ho93kRIO^yp.R 3Faj ?ܩICN*^< X֌'_3{ۧH&#Dwf,BboToĒɻӈԽ\xؖY3T*WX#fOsJ3S\JE֞j.m{Xv*Tѫ1E#zL!<}ęoB!%TϠJ>?Qͥd(Ls,EUB!BjZiii… xⳉ$BcUT17NWp,NB!kBAZeRO`e9$~V۟B!BjZN=,PB!B, !B!X~^;\u ܯ/Woekf,7xY1B!cz ;wgeӮ2C4wy;ylE|Ֆ/wة<?3}!}>wܺq<ƹ<=gЍ+C!B̴ vPU^:oQ]q e3Ԥ4 mR. OvmF=Fb~akhQ;H肔;Y AV I`Z>U>؟BN$&h'qǻ'1;w@oy5SoU&\ԮZgeܣD>I!=0eQ}6 6==cZQ^M~r=FW_a@1d?K^/G9%6=)v\'w]Tw9K5qF*ow2_7h֛\f$^}s‚ŧ͏≶~o@o]w*v*ic'JMҝ3%܁K&FуwV]nzb̍=F_{3#%NE&z׶ [4)9ٛBSUEsS'0C=?eTv?R+Mni-o$t? uymihrQx lϠ/~?>^Wx{MFiitAPuD*h#08߆fvf|fFyXYxLƙmtiដ_? !OP rvK\=XHmڞ#MUYhWU[wj!B7`}lؾeݴq G'#I Ӂ[ Aҋ---%oe}N0Dw봺@Ej HkYsT6AoԬBj/ɑ q-³m2xtR2lFo$'CxR0h|N]>w ->j'wd)rr=p82v̩'9άI){^[!BLԹ0ǥ+]n;0gqlKSs,m陓0SLĦ47?iN[rR9o49:c<\-gF\xV0_1.Աwғ}\Kԙ׬e(beDieYnFbI?D9{>IxFQ8LFXL.:u*c ׃mQ,13X+mG0?ㄯҌՔ7xɤ%j\8-Ӵ66n-˥ᄁAg&bp~UcN3}ſh xTO^;Kܦfo!BKA?_xe1a\JJJfg oY[Pv5RBٖV\h! aL>t!o}mq[Ed~ !BY,ej… gkIƺ Ac9HX)lly+v*wK!֥n7цU4n3MB!EvP@o?~:Xى7SԆb1u[kB!o7_!B!bJ+ T!B! R__j0X_ŗ_Vӧ}yS.#Ne_[j?kq2bfO>B!X7Cc}kspL,,O~(v*|L1,R6{T||Uύ \ u2[^!b%TQXߥs,jسgIiD낔;YYB֔F~z@;J{}QJ@$Ot0❫s+jaW2KG-+aW`/yZ2Z^!bejՐmظq'֭[GNN_Q:Zl4KsN =uTUrcusv86'O3mtԎTV}O]̩qPu \ϓ1׾.3JvvRrR7=V;)YM$MҼԜ˾Vx c*iI&k`aCj F(}$OFa62#xKM> n:[H747򏓅 zjڑe9qܪSw,.kCfz_=T|wM&cvk*/@n UN Aҋ SwHNa KM=_<&3SjڏPʼ_y/BwP@2 VSx\-gF\x6?>0y+$e8yH|-mPSUN#"蜽N|.=y:iu?-"(ݹSk_lb R_ TWS\v1NǶ4=5Җ9sg^Dlzɤ%j\8-Ӵ6haX.} :+ť;gXŦ Ԇ@}Jw؝f"`=}Y=h䕞6[<f3:q)dJ!ki WSjɴ?iNrR9o491}oxVø}[B!ěvPWgP҈^vT'ݵ7R<>C01kb+jao_N2KG-+aW`Uɿ OvuEiڢ?\fdRTVH򴱹}>`ܾ5X! !g۳qN[+jW[ߌGa•wO.^~d[y^v];t g֤`}lؾeݴq }bkON0Dw봺@Ej H_<'3Je@x z&kYsT63?~~isC T^็m7Nzkg !Br89ɝc<\-gF\x6Kwp^b?IKԸqd["d2Ltnbt399#p`kk,ҝTLxiy}{znQdIY]aضkt*c ׃mQ,Ɖs\ YRZILr6m41Bs<ްiu3{5"2:6ڂNzkuI(F6oүy,B-u5:::`ca6rss))) m;+Z):Hq oYW%ObRT ePMRBٖ_o?Vf-c!BUb);V.\'>XKݝ-4]_rRT~}Baq|a iUUd)m]82VJ(2[9TmB!۷*B!bM *B!B ToB!B_t-nة,O7*r]FxfM(hÚ+B!mz ;wG2C4wy;y,oyՖ/wة<?3J|,!këEk?^ʣ!s X\Z2ޢ9.BZT/cϞ&%h`ac$v{i.Hli?Wc)aVN`9hhfc)>+C#5ǘP^p<v.-*p/]U@eB!TCζg?c.&ƝXn999WxGiRwpNh1ɵ[]0mdFO.FoG;jdbQ\v*77=CuKg{BlK m n:[H74 bdaC~9qܪSw,.kCfz_=T|wMud'bҮ &sʓ7d~:ؘLZESʕc1Fo_l;|ɈDXL ܹ}~66mBr &$s<s|:B!˫E-R淋5"{3T 84`TM(V^NDe1NŘ{O>܁K&FуwV]nzb̍=F_{3#tG:m6{uku-CM!Lk9ʩ[qd;{)&O|7W:KY]ȟ| 1tA_~|>;"L#? !/(=UDY&F>`pܿ 8j;l1`(/~/98 .M=S+OLNϻ28<bK/9sb(ص=cG~3NIxUuڿU ݫkgrB!2A5YR2p]֧CIx00]A% #Au $2r*j&gj&q މ¨2\ËKPg\*/+Ԃp$`6>!boj4[):ߊ}ֲ:..G紶YOմ߯_#A'*=- 7Pyw{c6_aBaƢ/?nF"p24<'% c6_jwsӪ<}AK+/ӿ I׈@gW]׎95$Ǚ5)#ذ}Eq7uD?Eg"s< B!XԂZZZ;uV8b_pS|u]--Tx6|O~A*Wo}˙^6.Eeg)XW¼MmB!RvPV+---\pO|6;[h>` q|4"vVʶ̖b+xb]V< mXB=ަ15Kiy"B1P.~*~:Xى7SԆnB!zU>'B!bAB_Y !B!XE-NvPy{j9-5ϟ-7jF@\Li⺢u}S.#B!+fz ;wg2TTqY#m7*{CcU(#q U[&\B!oտ:NgP҈,ӎJQY!~Lky_yXJ=B܆@q^CԁR>>ɓ;x窦QXs!rE 7;y> UQ{hEu5 \cyZA:Nޢv4mџ .SB!,T;xZoRsabH?{cTMMOG1;w@Ey5`% mznvN]}ث0rOc2[%BW;\_1.G0)8nc0\'wL}g~e}MӎҝF*ow2_7h1K DQN.&1@{8;%}.w89DaAGD[@`33^qҫD9)H6l!F9M؉=} WO?[[ɓO]=cV6fs;D&Zz$%=t~}J֫x';M\A F(mW;NP36=V.;UÈω0~314ӌ2SO#w6v#\v*C<-TeAEzͷ.hdG|,s~+fK,B449(W$G&T]81% xQd%NL]MFiitAPuD*h#08^];/xc7pͬ:+b={;g11 &@yXYxLƙmti*~eorr秬c*َ!OP$e3|GsX4?UUūzU@^];ye _ڀilw3BMݭ ^ɩܛ>&Gei#|A(iRr87x{#|7W:KY]ȟ|uȜ_9B!AҬ8 Z0TtxqR2p]#͌o$1L.uJ|M|` C Tj&q މ8uAsZ9 aBaƢ/æiԝ7q<)aRS[n}|8f0Y17Oq ->j'7P"H6;z1F]mDMqyeuS/OrY2 a^^wZWOX}O~ck}N0Dw봺@YMN/#Gm 8g j _]ؖY3'wpM/ 8y#t^DG%b7z-˥ᄁAg2bVPM}F.z9\ gI ^["gqE9.])dp?-v)@'I6urR9o49c{ƃc3-X'q/V3oQY˲Qʈ|yUB!kRwPg UT~}BZG94 Kra975B!m9/Boۢ瓙\wPB!BU׿ui?7*B!xt}wwe*B!bQe$b_ŗ_V7b>eToLMR}͌Œy,B6z kq4p= ۽NSy ~F#o<Ȝ߬w!eRڹ,1ze0jq 4vCQ"qOhH.C!b<^ƞ=CMJ#z)_P0[)*+$w#0|\01kRu+jao[ xkXZ;)F-ݜ`qkhQ;K8+ ƭAC0 OYa_{w{]P;Ђ" Z`\1j'jt&3IOt8}gsg9Nw:6:QԸ@HS IDATE%(T(kP`QTlu'>7h4%G+ B9ݧ E~ ҽm 5"0b%Lq#/vi+z.GeV2 xC>?3iZڕpUN\,sv5T}gf,gɴ\I IDy? 0ݸ"uۍ˴n[M;v’&dİm['}ϓynxit\UX6jϔspݣMvZ;hR -I+'JϽHČLܖ@F _ϒ\ʛXPӖ񵖗 'P~O{]; 22Ti+333~}Pl`gS=?vCԐLr3lC}g ɟ˘8}~""""aA[1p8,IZB&1E7qhDw5NOW"w$!1z^”pcM^)#0)&LU\(=N06f[ mNhfdV}ƾeuU~Z"I5c$ո퍔_n#uϳco/; wh ˖?>l5a.nwsݶ[Ts pAWv:y^wg]вz;.TXs{續2ӳ1lVcp+O| n85KH7!F"ip~=8H6GˬdXO.ؾ8w0o G`ŷAFL" ̌'س4${!QϒB'iAw)5a٪ٹ,0i=Y{5NRf-l=_Q,^0ŏ#k8ftNv3ub{nbzfLgaĥs>}y _ʗ_worz&k= eʕla1=!7>H;F: lKoyط<9H^6Gx&7ndÆ 466+]}}=6mbl۶ gB6qDt^fPCa >zP%X޶:JߏkJ!NC9CGFnEDDD0/ad{vk!S2˿g׆""""gwt""""""2j=^3""""""2j v>CA]njm;lugckoDDDDDq\כ PTT:ҡ}z-[N`7vQ&~Nhǐ3nw_|7SDDDDav7C1rri$S|oe ..Zo=f"1LOd+dlȫݝA1m'%OߙYʫ|_i8E2Nlطc/M_<&;@ jf6QuKy}ܱiN .q))VG-GIʥv%kmfN'u6)M:ވօv:G*w QW&bI,b~F+%1%խ꺣x7EktdǪS(Z;wŧ۽yEj;̇ܲm$q2k pw沤`=vAq{`ň\mTʞ|2W~tOsYbcv\}~O_Yӆ ^p|{W{3ub{nbzf,1!p03v7gq&Wa}!&֭ a438%' ɞei:д`[=K [ߥ4efrfג@xT_޷Z$_s;1afyú8**R 3[t /QRܹH.Zo=f1:J~ {w|=L,UE{gً>k9]iTT41p-\`4LxbAif;4gQkBJ~>̚C#\6Lgehznof.{MY~ߧLfXHP*"""HBeK|'TIskvxf;wwl$q2k 2ٽ5H@HٶYh޿,ZOV쬣dQ|Bv y.%1VrfbL\䅲$p؜$c 4_8޲j%ݲ$⧷Q>jQƆrsIo,Z[Gy~5veňpiJV>e;ΙN/Iv2$:HoxXa m@xgLj겍1s̄; ;2 1o?DVG_ndOMAv%t$p9u6cNV{iF_Z[VZG8 sxv8US0y/ZW߸Z(I_6+8+$@&\mTʞv@ŇiWĬ|x2s vOYxǪ=?* _M<QQQ([kՅru'r3}HMFkgNs' FZ9u wJ:1_tN\ |^Zu^yX9Qz[\Vj/U`n7ej: usX9Yn%p-/NTG݃q߫r{4YcRYηr)9NsR֮lG>Tדns)bѴL|}^naq8X&9'E>D3S\/*.Dgپbɝ˘/+O%pcw[9u/ 5assemԞ).!G}Z9}._`E^8;Ɠ1P>t Olg6x ~ ӇIvc4RSq$Z{kc;aIy2Bbwq1)8yd9n X_f[{A5ƐJۤ<Gӥ}hKoZ{}>?IvBtz6SR͊p ^) ej2>c22p`Z[_`BfQ*""""zbvj4ac2ꙹkkhLqY'g\iLƣ?֭/V8|z0Vn"ƭWɾW_ 9|_ô'[_""""""2jUDDDDDD@S>VDDDDDF[o5ՐGb x?oɏ^#<*@~/""""""8s"@>=fP;ON]jՕ#Yyn7~+<~/cj jIENDB`ktikz/common/0000771000175000017500000000000011455415074015644 5ustar fhackenbergerfhackenbergerktikz/common/qtikz.xml0000660000175000017500000000500411455414612017524 0ustar fhackenbergerfhackenberger PGF document Dakument PGF Документ — PGF document PGF Dokument PGF PGF-dokument PGF-Dokument έγγραφο PGF PGF document PGF-dokumento documento PGF PGF dokumentua PGF-asiakirja document PGF cáipéis PGF PGF-dokumentum Dokumen PGF Documento PGF PGF ドキュメント PGF 문서 PGF dokumentas Dokumen PGF PGF-dokument PGF-document PGF-dokument Dokument PGF documento PGF Documento PGF документ PGF Dokument PGF PGF документ PGF-dokument Документ PGF Tài liệu PGF PGF 文档 PGF 文件 PGF Portable Graphics Format ktikz/common/tikzpreviewgenerator.cpp0000660000175000017500000004272511455414612022651 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * * * Copyright (C) 2007, 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "tikzpreviewgenerator.h" #ifdef KTIKZ_USE_KDE #include #include #else #include #endif #include #include #include #include #include #include #include #include "tikzpreviewcontroller.h" const QTime s_standardMinUpdateInterval(0, 0, 1 /*sec*/, 0); TikzPreviewGenerator::TikzPreviewGenerator(TikzPreviewController *parent) : m_minUpdateInterval(s_standardMinUpdateInterval) { m_parent = parent; m_tikzPdfDoc = 0; m_updateScheduled = false; m_runFailed = false; m_keepRunning = true; m_process = 0; m_templateChanged = true; // m_latexCommand = "pdflatex"; // m_pdftopsCommand = "pdftops"; // m_useShellEscaping = false; start(); } TikzPreviewGenerator::~TikzPreviewGenerator() { // stop the thread before destroying this object m_keepRunning = false; m_updateRequested.wakeAll(); wait(); emit processRunning(false); if (m_tikzPdfDoc) delete m_tikzPdfDoc; } /***************************************************************************/ void TikzPreviewGenerator::setTikzFileBaseName(const QString &name) { m_tikzFileBaseName = name; } void TikzPreviewGenerator::setLatexCommand(const QString &command) { m_latexCommand = command; } void TikzPreviewGenerator::setPdftopsCommand(const QString &command) { m_pdftopsCommand = command; } void TikzPreviewGenerator::setShellEscaping(bool useShellEscaping) { m_useShellEscaping = useShellEscaping; if (m_useShellEscaping) { QProcess *m_checkGnuplotExecutable = new QProcess(this); m_checkGnuplotExecutable->start("gnuplot", QStringList() << "--version"); connect(m_checkGnuplotExecutable, SIGNAL(error(QProcess::ProcessError)), this, SLOT(displayGnuplotNotExecutable())); } } void TikzPreviewGenerator::displayGnuplotNotExecutable() { emit showErrorMessage(tr("Gnuplot cannot be executed. Either Gnuplot is not installed " "or it is not available in the system PATH or you may have insufficient " "permissions to invoke the program.")); // m_checkGnuplotExecutable->deleteLater(); } void TikzPreviewGenerator::setTemplateFile(const QString &fileName) { m_templateFileName = fileName; } void TikzPreviewGenerator::setReplaceText(const QString &replace) { m_tikzReplaceText = replace; } void TikzPreviewGenerator::setMinUpdateInterval(const QTime &interval) { m_minUpdateInterval = interval; } /***************************************************************************/ QString TikzPreviewGenerator::getLogText() const { const QMutexLocker lock(&m_memberLock); return m_logText; } QString TikzPreviewGenerator::getParsedLogText(QTextStream *logStream) const { QString logText; QList keywordPatterns; keywordPatterns << QRegExp("(\\S*):(\\d+): (.*$)") << QRegExp("Undefined control sequence") << QRegExp("LaTeX Warning:") << QRegExp("LaTeX Error:") << QRegExp("Runaway argument?") << QRegExp("Missing character: .*!") << QRegExp("Error:"); QString logLine; while (!logStream->atEnd()) { logLine = logStream->readLine(); if (keywordPatterns.at(0).indexIn(logLine) > -1) { // show error message and correct line number // QString lineNum = QString::number(keywordPatterns[0].cap(2).toInt() - m_templateStartLineNumber); QString lineNum = QString::number(keywordPatterns[0].cap(2).toInt()); const QString errorMsg = keywordPatterns[0].cap(3); logText += "[LaTeX] Line " + lineNum + ": " + errorMsg; // while we don't get a line starting with "l. ...", we have to add the line to the first error message QRegExp rx("^l\\.(\\d+)(.*)"); logLine = logStream->readLine(); while (rx.indexIn(logLine) < 0 && !logStream->atEnd()) { if (logLine.isEmpty()) logText += "\n[LaTeX] Line " + lineNum + ": "; if (!logLine.startsWith(QLatin1String("Type"))) // don't add lines that invite the user to type a command, since we are not in the console logText += logLine; logLine = logStream->readLine(); } logText += '\n'; if (logStream->atEnd()) break; // add the line starting with "l. ..." and the next line lineNum = QString::number(rx.cap(1).toInt() - 7); logLine = "l." + lineNum + rx.cap(2); logText += logLine + '\n'; logText += logStream->readLine() + '\n'; } else { for (int i = 1; i < keywordPatterns.size(); ++i) { if (logLine.contains(keywordPatterns.at(i))) { logText += logLine + '\n'; logText += logStream->readLine() + '\n'; logText += logStream->readLine() + '\n'; break; } } } } return logText; } void TikzPreviewGenerator::parseLogFile() { const QFileInfo latexLogFileInfo = QFileInfo(m_tikzFileBaseName + ".log"); QFile latexLogFile(latexLogFileInfo.absoluteFilePath()); if (!latexLogFile.open(QFile::ReadOnly | QIODevice::Text)) { if (!m_tikzCode.isEmpty()) { m_shortLogText += "\n[LaTeX] " + tr("Warning: could not load LaTeX logfile."); emit showErrorMessage(m_shortLogText); qWarning() << "Warning: could not load latex logfile:" << qPrintable(latexLogFileInfo.absoluteFilePath()); } else { m_shortLogText = ""; m_logText = ""; } } else { m_memberLock.lock(); QTextStream latexLog(&latexLogFile); if (m_runFailed && !m_shortLogText.contains(tr("Process aborted."))) m_shortLogText = getParsedLogText(&latexLog); latexLog.seek(0); m_logText += latexLog.readAll(); latexLogFile.close(); m_memberLock.unlock(); } emit shortLogUpdated(m_shortLogText, m_runFailed); // emit logUpdated(m_runFailed); } /***************************************************************************/ void TikzPreviewGenerator::createPreview() { emit setExportActionsEnabled(false); createTempTikzFile(); m_logText = ""; if (generatePdfFile()) { const QFileInfo tikzPdfFileInfo(m_tikzFileBaseName + ".pdf"); if (!tikzPdfFileInfo.exists()) qWarning() << "Error:" << qPrintable(tikzPdfFileInfo.absoluteFilePath()) << "does not exists"; else { // Update widget if (m_tikzPdfDoc) delete m_tikzPdfDoc; m_tikzPdfDoc = Poppler::Document::load(tikzPdfFileInfo.absoluteFilePath()); if (m_tikzPdfDoc) { m_shortLogText = "[LaTeX] " + tr("Process finished successfully."); emit pixmapUpdated(m_tikzPdfDoc); emit setExportActionsEnabled(true); } else { m_shortLogText = "[LaTeX] " + tr("Error: loading PDF failed, the file is probably corrupted."); emit showErrorMessage(m_shortLogText); qWarning() << "Error: loading PDF failed, the file is probably corrupted:" << qPrintable(tikzPdfFileInfo.absoluteFilePath()); } } } parseLogFile(); } /***************************************************************************/ bool TikzPreviewGenerator::hasRunFailed() { const QMutexLocker lock(&m_memberLock); return m_runFailed; } void TikzPreviewGenerator::run() { while (m_keepRunning) { m_memberLock.lock(); if (m_updateScheduled) // We shall update the picture { const long int msecUpdateInterval = m_minUpdateInterval.minute() * 60000 + m_minUpdateInterval.second() * 1000; // We ignore hours if (m_updateTimer.isValid() && m_updateTimer.elapsed() < msecUpdateInterval) { // Our m_minUpdateInterval has not elapsed yet, sleep const int msecsToSleep = msecUpdateInterval - m_updateTimer.elapsed(); m_memberLock.unlock(); msleep(msecsToSleep); continue; } m_tikzCode = m_parent->tikzCode(); m_runFailed = false; m_updateScheduled = false; m_memberLock.unlock(); createPreview(); m_memberLock.lock(); setMinUpdateInterval(s_standardMinUpdateInterval); } else m_updateRequested.wait(&m_memberLock); m_memberLock.unlock(); } } void TikzPreviewGenerator::regeneratePreview() { const QMutexLocker locker(&m_memberLock); m_updateScheduled = true; m_updateTimer.start(); m_updateRequested.wakeAll(); } void TikzPreviewGenerator::generatePreview(bool templateChanged) { m_templateChanged = templateChanged; setMinUpdateInterval(QTime(0, 0, 0, 0)); regeneratePreview(); } /***************************************************************************/ void TikzPreviewGenerator::createTempLatexFile() { const QString inputTikzCode = "\\input{" + m_tikzFileBaseName + ".pgf}"; #ifdef KTIKZ_USE_KDE KSaveFile tikzTexFile(m_tikzFileBaseName + ".tex"); if (!tikzTexFile.open()) #else QFile tikzTexFile(m_tikzFileBaseName + ".tex"); if (!tikzTexFile.open(QIODevice::WriteOnly | QIODevice::Text)) #endif { // KMessageBox::error(this, i18nc("@info", "Cannot write file %1:%2", fileName, file.errorString()), i18nc("@title:window", "File Save Error")); qDebug() << "Cannot write file " + m_tikzFileBaseName + ".tex (" + qPrintable(QFileInfo(tikzTexFile).absoluteFilePath()) + "):\n" + tikzTexFile.errorString(); return; } QTextStream tikzStream(&tikzTexFile); QFile templateFile(m_templateFileName); #ifdef KTIKZ_USE_KDE KFileItem templateFileItem(KFileItem::Unknown, KFileItem::Unknown, KUrl::fromPath(m_templateFileName)); if (templateFileItem.determineMimeType()->parentMimeTypes().contains("text/plain") #else if (QFileInfo(templateFile).isFile() #endif && templateFile.open(QIODevice::ReadOnly | QIODevice::Text) // if user-specified template file is readable && !m_tikzReplaceText.isEmpty()) { QTextStream templateFileStream(&templateFile); QString templateLine; for (int i = 1; !templateFileStream.atEnd(); ++i) { templateLine = templateFileStream.readLine(); if (templateLine.indexOf(m_tikzReplaceText) >= 0) { templateLine.replace(m_tikzReplaceText, inputTikzCode); // m_templateStartLineNumber = i; } tikzStream << templateLine << '\n'; } } else // use our own template { tikzStream << "\\documentclass[12pt]{article}\n" "\\usepackage{tikz}\n" "\\usepackage{pgf}\n" "\\usepackage[active,pdftex,tightpage]{preview}\n" "\\PreviewEnvironment[]{tikzpicture}\n" "\\PreviewEnvironment[]{pgfpicture}\n" "\\begin{document}\n" + inputTikzCode + "\n" "\\end{document}\n"; // m_templateStartLineNumber = 7; } tikzStream.flush(); #ifdef KTIKZ_USE_KDE if (!tikzTexFile.finalize()) { // KMessageBox::error(this, i18nc("@info", "Cannot write file %1:%2", fileName, file.errorString()), i18nc("@title:window", "File Save Error")); qDebug() << "Cannot write file " + m_tikzFileBaseName + ".tex (" + qPrintable(QFileInfo(tikzTexFile).absoluteFilePath()) + "):\n" + tikzTexFile.errorString(); } #endif tikzTexFile.close(); qDebug() << "latex code written to:" << m_tikzFileBaseName + ".tex"; } void TikzPreviewGenerator::createTempTikzFile() { if (m_tikzCode.isEmpty()) // avoid that the previous picture is still displayed return; if (m_templateChanged) { createTempLatexFile(); m_templateChanged = false; } #ifdef KTIKZ_USE_KDE KSaveFile tikzFile(m_tikzFileBaseName + ".pgf"); if (!tikzFile.open()) #else QFile tikzFile(m_tikzFileBaseName + ".pgf"); if (!tikzFile.open(QIODevice::WriteOnly | QIODevice::Text)) #endif { // KMessageBox::error(this, i18nc("@info", "Cannot write file %1:%2", fileName, file.errorString()), i18nc("@title:window", "File Save Error")); qDebug() << "Cannot write file " + m_tikzFileBaseName + ".pgf (" + qPrintable(QFileInfo(tikzFile).absoluteFilePath()) + "):\n" + tikzFile.errorString(); return; } QTextStream tikzStream(&tikzFile); tikzStream << m_tikzCode << endl; tikzStream.flush(); #ifdef KTIKZ_USE_KDE if (!tikzFile.finalize()) { // KMessageBox::error(this, i18nc("@info", "Cannot write file %1:%2", fileName, file.errorString()), i18nc("@title:window", "File Save Error")); qDebug() << "Cannot write file " + m_tikzFileBaseName + ".pgf (" + qPrintable(QFileInfo(tikzFile).absoluteFilePath()) + "):\n" + tikzFile.errorString(); } #endif tikzFile.close(); qDebug() << "tikz code written to:" << m_tikzFileBaseName + ".pgf"; } /***************************************************************************/ void TikzPreviewGenerator::addToLatexSearchPath(const QString &path) { #ifdef Q_OS_WIN const QChar pathSeparator = ';'; #else const QChar pathSeparator = ':'; #endif #if QT_VERSION >= 0x040600 m_processEnvironment = QProcessEnvironment::systemEnvironment(); m_processEnvironment.insert("TEXINPUTS", path + pathSeparator + m_processEnvironment.value("TEXINPUTS")); #else m_processEnvironment = QProcess::systemEnvironment(); QRegExp rx("^TEXINPUTS=(.*)", Qt::CaseInsensitive); const int num = m_processEnvironment.indexOf(rx); if (num >= 0) m_processEnvironment[num].replace(rx, "TEXINPUTS=" + path + pathSeparator + "\\1"); else m_processEnvironment << "TEXINPUTS=" + path + pathSeparator; #endif } bool TikzPreviewGenerator::runProcess(const QString &name, const QString &command, const QStringList &arguments, const QString &workingDir) { m_memberLock.lock(); m_process = new QProcess; m_processAborted = false; if (!workingDir.isEmpty()) m_process->setWorkingDirectory(workingDir); if (!m_templateFileName.isEmpty()) { const QFileInfo templateFileInfo(m_templateFileName); addToLatexSearchPath(templateFileInfo.absolutePath()); #if QT_VERSION >= 0x040600 m_process->setProcessEnvironment(m_processEnvironment); #else m_process->setEnvironment(m_processEnvironment); #endif } m_process->start(command, arguments); m_memberLock.unlock(); // we must unlock here so that the signal emitted above can reach the main thread emit processRunning(true); if (!m_process->waitForStarted(1000)) m_runFailed = true; qDebug() << "starting" << command + ' ' + arguments.join(" "); QByteArray buffer; QTextStream log(&buffer); while (m_process->state() != QProcess::NotRunning) { // still running or starting if (m_process->bytesAvailable()) // log << m_process->readLine(m_process->bytesAvailable()); // XXX I don't know why this doesn't work anymore since Qt 4.6 log << m_process->readLine(); else m_process->waitForFinished(100 /*msec*/); } // Process finished emit processRunning(false); if (m_process->bytesAvailable()) log << m_process->readLine(m_process->bytesAvailable()); log.seek(0); if (m_processAborted) { m_shortLogText = '[' + name + "] " + tr("Process aborted."); emit showErrorMessage(m_shortLogText); m_runFailed = true; } else if (m_process->exitCode() == 0) { m_shortLogText = '[' + name + "] " + tr("Process finished successfully."); m_runFailed = false; } else { m_shortLogText = '[' + name + "] " + tr("Error: run failed.", "info process"); emit showErrorMessage(m_shortLogText); qWarning() << "Error:" << qPrintable(command) << "run failed with exit code:" << m_process->exitCode(); m_memberLock.lock(); m_logText = log.readAll(); m_memberLock.unlock(); m_runFailed = true; } delete m_process; m_process = 0; emit shortLogUpdated(m_shortLogText, m_runFailed); return !m_runFailed; } void TikzPreviewGenerator::abortProcess() { if (m_process) { m_process->kill(); m_processAborted = true; } } /***************************************************************************/ bool TikzPreviewGenerator::generateEpsFile() { QStringList pdftopsArguments; pdftopsArguments << "-eps" << m_tikzFileBaseName + ".pdf" << m_tikzFileBaseName + ".eps"; return runProcess("pdftops", m_pdftopsCommand, pdftopsArguments); } bool TikzPreviewGenerator::generatePdfFile() { // remove log file before running pdflatex again QDir::root().remove(m_tikzFileBaseName + ".log"); if (m_tikzCode.isEmpty()) // if the text edit is empty, then clean up files and preview { QDir::root().remove(m_tikzFileBaseName + ".pdf"); if (m_tikzPdfDoc) delete m_tikzPdfDoc; m_tikzPdfDoc = 0; emit pixmapUpdated(0); return false; } QStringList latexArguments; if (m_useShellEscaping) latexArguments << "-shell-escape"; latexArguments << "-halt-on-error" << "-file-line-error" << "-interaction" << "nonstopmode" << "-output-directory" << QFileInfo(m_tikzFileBaseName + ".tex").absolutePath() << m_tikzFileBaseName + ".tex"; m_shortLogText = "[LaTeX] " + tr("Running..."); emit shortLogUpdated(m_shortLogText, m_runFailed); return runProcess("LaTeX", m_latexCommand, latexArguments, QFileInfo(m_tikzFileBaseName).absolutePath()); } ktikz/common/ktikz.kcfg0000660000175000017500000000736111455414612017640 0ustar fhackenbergerfhackenberger kglobalsettings.h false true true pdflatex pdftops false <> kwrite KGlobalSettings::fixedFont() false false true 0xB0B0B0 0xB0B0B0 0xC8C800 true Standard 1.0 0.1 6.0 ktikz/common/tikzpreviewcontroller.cpp0000660000175000017500000004523111455414612023041 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "tikzpreviewcontroller.h" #ifdef KTIKZ_USE_KDE #include #include #include #include #include #include #include #else #include #include #include #include #include #include #include #endif #include #include #include #include "templatewidget.h" #include "tikzpreview.h" #include "tikzpreviewgenerator.h" #include "mainwidget.h" #include "utils/action.h" #include "utils/icon.h" #include "utils/toggleaction.h" TikzPreviewController::TikzPreviewController(MainWidget *mainWidget) { m_mainWidget = mainWidget; m_parentWidget = m_mainWidget->widget(); m_templateWidget = new TemplateWidget(m_parentWidget); m_tikzPreview = new TikzPreview(m_parentWidget); m_tikzPreviewGenerator = new TikzPreviewGenerator(this); createActions(); connect(m_tikzPreviewGenerator, SIGNAL(pixmapUpdated(Poppler::Document*)), m_tikzPreview, SLOT(pixmapUpdated(Poppler::Document*))); connect(m_tikzPreviewGenerator, SIGNAL(showErrorMessage(QString)), m_tikzPreview, SLOT(showErrorMessage(QString))); connect(m_tikzPreviewGenerator, SIGNAL(setExportActionsEnabled(bool)), this, SLOT(setExportActionsEnabled(bool))); connect(m_tikzPreviewGenerator, SIGNAL(shortLogUpdated(QString,bool)), this, SIGNAL(logUpdated(QString,bool))); connect(m_templateWidget, SIGNAL(fileNameChanged(QString)), this, SLOT(setTemplateFileAndRegenerate(QString))); // connect(m_templateWidget, SIGNAL(replaceTextChanged(QString)), // this, SLOT(setReplaceTextAndRegenerate(QString))); createTempDir(); // applySettings(); // must be done after creation of m_tempDir } TikzPreviewController::~TikzPreviewController() { delete m_tikzPreviewGenerator; removeTempDir(); } /***************************************************************************/ void TikzPreviewController::createTempDir() { #ifdef KTIKZ_USE_KDE m_tempDir = new KTempDir(); m_tempDir->setAutoRemove(true); m_tempTikzFileBaseName = m_tempDir->name() + "temptikzcode"; #else QDir tempDir(QDir::tempPath() + "/ktikz"); if (!tempDir.exists()) QDir::temp().mkdir("ktikz"); QTemporaryFile *tempFile = new QTemporaryFile(QDir::tempPath() + "/ktikz/temptikzcodeXXXXXX.tex"); if (tempFile->open()) { const QFileInfo tempFileInfo = QFileInfo(*tempFile); m_tempTikzFileBaseName = tempFileInfo.absolutePath() + '/' + tempFileInfo.completeBaseName(); } else qCritical() << "Error: could not create temporary file in" << QDir::toNativeSeparators(QDir::tempPath() + "/ktikz/"); delete tempFile; // m_tempTikzFileBaseName = QDir::tempPath() + "/ktikz/temptikzcode"; #endif m_tikzPreviewGenerator->setTikzFileBaseName(m_tempTikzFileBaseName); } void TikzPreviewController::removeTempDir() { #ifdef KTIKZ_USE_KDE delete m_tempDir; #else // removing all temporary files qDebug("removing tempfiles"); if (!m_tempTikzFileBaseName.isEmpty() && !cleanUp()) qCritical("Error: removing tempfiles failed"); // remove temp dir if empty QDir tempDir(QDir::tempPath() + "/ktikz"); if (tempDir.exists()) QDir::temp().rmdir("ktikz"); #endif } const QString TikzPreviewController::tempDir() const { #ifdef KTIKZ_USE_KDE return m_tempDir->name(); #else return QDir::tempPath() + "/ktikz"; #endif } /***************************************************************************/ TemplateWidget *TikzPreviewController::templateWidget() const { return m_templateWidget; } TikzPreview *TikzPreviewController::tikzPreview() const { return m_tikzPreview; } /***************************************************************************/ void TikzPreviewController::createActions() { // File m_exportAction = new Action(Icon("document-export"), tr("E&xport"), m_parentWidget, "file_export_as"); m_exportAction->setStatusTip(tr("Export image to various formats")); m_exportAction->setWhatsThis(tr("

Export image to various formats.

")); QMenu *exportMenu = new QMenu(m_parentWidget); m_exportAction->setMenu(exportMenu); Action *exportEpsAction = new Action(Icon("image-x-eps"), tr("&Encapsulated PostScript (EPS)"), m_parentWidget, "file_export_eps"); exportEpsAction->setData("image/x-eps"); exportEpsAction->setStatusTip(tr("Export to EPS")); exportEpsAction->setWhatsThis(tr("

Export to EPS.

")); connect(exportEpsAction, SIGNAL(triggered()), this, SLOT(exportImage())); exportMenu->addAction(exportEpsAction); Action *exportPdfAction = new Action(Icon("application-pdf"), tr("&Portable Document Format (PDF)"), m_parentWidget, "file_export_pdf"); exportPdfAction->setData("application/pdf"); exportPdfAction->setStatusTip(tr("Export to PDF")); exportPdfAction->setWhatsThis(tr("

Export to PDF.

")); connect(exportPdfAction, SIGNAL(triggered()), this, SLOT(exportImage())); exportMenu->addAction(exportPdfAction); Action *exportPngAction = new Action(Icon("image-png"), tr("Portable Network &Graphics (PNG)"), m_parentWidget, "file_export_png"); exportPngAction->setData("image/png"); exportPngAction->setStatusTip(tr("Export to PNG")); exportPngAction->setWhatsThis(tr("

Export to PNG.

")); connect(exportPngAction, SIGNAL(triggered()), this, SLOT(exportImage())); exportMenu->addAction(exportPngAction); setExportActionsEnabled(false); // View m_procStopAction = new Action(Icon("process-stop"), tr("&Stop Process"), m_parentWidget, "stop_process"); m_procStopAction->setShortcut(tr("Escape", "View|Stop Process")); m_procStopAction->setStatusTip(tr("Abort current process")); m_procStopAction->setWhatsThis(tr("

Abort the execution of the currently running process.

")); m_procStopAction->setEnabled(false); connect(m_procStopAction, SIGNAL(triggered()), m_tikzPreviewGenerator, SLOT(abortProcess())); m_shellEscapeAction = new ToggleAction(Icon("application-x-executable"), tr("S&hell Escape"), m_parentWidget, "shell_escape"); m_shellEscapeAction->setStatusTip(tr("Enable the \\write18{shell-command} feature")); m_shellEscapeAction->setWhatsThis(tr("

Enable LaTeX to run shell commands, this is needed when you want to plot functions using gnuplot within TikZ." "

Warning: Enabling this may cause malicious software to be run on your computer! Check the LaTeX code to see which commands are executed.

")); connect(m_shellEscapeAction, SIGNAL(toggled(bool)), this, SLOT(toggleShellEscaping(bool))); connect(m_tikzPreviewGenerator, SIGNAL(processRunning(bool)), this, SLOT(setProcessRunning(bool))); } #ifndef KTIKZ_USE_KDE QAction *TikzPreviewController::exportAction() { return m_exportAction; } QMenu *TikzPreviewController::menu() { QMenu *viewMenu = new QMenu(tr("&View"), m_parentWidget); viewMenu->addActions(m_tikzPreview->actions()); viewMenu->addSeparator(); viewMenu->addAction(m_procStopAction); viewMenu->addAction(m_shellEscapeAction); return viewMenu; } QList TikzPreviewController::toolBars() { QToolBar *toolBar = new QToolBar(tr("Run"), m_parentWidget); toolBar->setObjectName("RunToolBar"); toolBar->addAction(m_procStopAction); m_shellEscapeButton = new QToolButton(m_parentWidget); m_shellEscapeButton->setDefaultAction(m_shellEscapeAction); m_shellEscapeButton->setCheckable(true); toolBar->addWidget(m_shellEscapeButton); m_toolBars << m_tikzPreview->toolBar() << toolBar; return m_toolBars; } void TikzPreviewController::setToolBarStyle(const Qt::ToolButtonStyle &style) { for (int i = 0; i < m_toolBars.size(); ++i) m_toolBars.at(i)->setToolButtonStyle(style); m_shellEscapeButton->setToolButtonStyle(style); } #endif /***************************************************************************/ #ifdef KTIKZ_USE_KDE void TikzPreviewController::showJobError(KJob *job) { if (job->error() != 0) { KIO::JobUiDelegate *ui = static_cast(job)->ui(); if (!ui) { kError() << "Saving failed; job->ui() is null."; return; } ui->setWindow(m_parentWidget); ui->showErrorMessage(); } } KUrl TikzPreviewController::getExportUrl(const KUrl &url, const QString &mimeType) const { KMimeType::Ptr mimeTypePtr = KMimeType::mimeType(mimeType); const QString exportUrlExtension = KMimeType::extractKnownExtension(url.path()); const KUrl exportUrl = KUrl(url.url().left(url.url().length() - (exportUrlExtension.isEmpty() ? 0 : exportUrlExtension.length() + 1)) // the extension is empty when the text/x-pgf mimetype is not correctly installed or when the file does not have a correct extension + mimeTypePtr->patterns().at(0).mid(1)); // first extension in the list of possible extensions (without *) return KFileDialog::getSaveUrl(exportUrl, mimeTypePtr->patterns().join(" ") + '|' // + mimeTypePtr->comment() + "\n*|" + i18nc("@item:inlistbox filter", "All files"), + mimeTypePtr->comment() + "\n*|" + tr("All files"), m_parentWidget, // i18nc("@title:window", "Export Image"), tr("Export Image"), KFileDialog::ConfirmOverwrite); } #else QString TikzPreviewController::getExportFileName(const QString &fileName, const QString &mimeType) const { QString currentFile; const QString extension = (mimeType == QLatin1String("image/x-eps")) ? "eps" : ((mimeType == QLatin1String("application/pdf")) ? "pdf" : "png"); const QString mimeTypeName = (mimeType == QLatin1String("image/x-eps")) ? tr("EPS image") : ((mimeType == QLatin1String("application/pdf")) ? tr("PDF document") : tr("PNG image")); if (!fileName.isEmpty()) { QFileInfo currentFileInfo(fileName); currentFile = currentFileInfo.absolutePath() + '/' + currentFileInfo.completeBaseName() + '.' + extension; } const QString filter = QString("%1 (*.%2);;%3 (*.*)") .arg(mimeTypeName) .arg(extension) .arg(tr("All files")); return QFileDialog::getSaveFileName(m_parentWidget, tr("Export image"), currentFile, filter); } #endif void TikzPreviewController::exportImage() { QAction *action = qobject_cast(sender()); const QString mimeType = action->data().toString(); const QPixmap tikzImage = m_tikzPreview->pixmap(); if (tikzImage.isNull()) return; #ifdef KTIKZ_USE_KDE const KUrl exportUrl = getExportUrl(m_mainWidget->url(), mimeType); if (!exportUrl.isValid()) return; #else const QString exportFileName = getExportFileName(m_mainWidget->url().path(), mimeType); if (exportFileName.isEmpty()) return; QFileInfo exportFileInfo(exportFileName); if (exportFileInfo.exists()) { QPointer warningBox = new QMessageBox(m_parentWidget); warningBox->setWindowTitle(QCoreApplication::applicationName()); warningBox->setText(tr("A file named \"%1\" already exists. " "Are you sure you want to overwrite it?").arg(exportFileInfo.fileName())); warningBox->setIcon(QMessageBox::Warning); QPushButton *overwriteButton = warningBox->addButton(tr("&Overwrite", "Do you want to overwrite an existing file - warning box"), QMessageBox::AcceptRole); QPushButton *cancelButton = warningBox->addButton(tr("&Cancel", "Do you want to overwrite an existing file - warning box"), QMessageBox::RejectRole); Q_UNUSED(overwriteButton) warningBox->exec(); if (!warningBox || warningBox->clickedButton() == cancelButton) { delete warningBox; return; } else if (!QFile::remove(exportFileName)) { QMessageBox::critical(m_parentWidget, QCoreApplication::applicationName(), tr("The file \"%1\" could not be overwritten.").arg(exportFileName)); delete warningBox; return; } delete warningBox; } #endif QString extension; if (mimeType == QLatin1String("application/pdf")) { extension = ".pdf"; } else if (mimeType == QLatin1String("image/x-eps")) { if (!m_tikzPreviewGenerator->generateEpsFile()) return; extension = ".eps"; } else if (mimeType == QLatin1String("image/png")) { extension = ".png"; tikzImage.save(m_tempTikzFileBaseName + extension); } #ifdef KTIKZ_USE_KDE KIO::Job *job = KIO::file_copy(KUrl::fromPath(m_tempTikzFileBaseName + extension), exportUrl, -1, KIO::Overwrite | KIO::HideProgressInfo); connect(job, SIGNAL(result(KJob*)), this, SLOT(showJobError(KJob*))); #else if (!QFile::copy(m_tempTikzFileBaseName + extension, exportFileName)) QMessageBox::critical(m_parentWidget, QCoreApplication::applicationName(), tr("The image could not be exported to the file \"%1\".").arg(exportFileName)); #endif } /***************************************************************************/ bool TikzPreviewController::setTemplateFile(const QString &path) { #ifdef KTIKZ_USE_KDE const KUrl url(path); const KUrl localUrl = KUrl::fromPath(m_tempDir->name() + "tikztemplate.tex"); if (url.isValid() && !url.isLocalFile() && KIO::NetAccess::exists(url, KIO::NetAccess::SourceSide, m_parentWidget)) { KIO::Job *job = KIO::file_copy(url, localUrl, -1, KIO::Overwrite | KIO::HideProgressInfo); if (!KIO::NetAccess::synchronousRun(job, m_parentWidget)) { // KMessageBox::information(m_parentWidget, i18nc("@info", "Template file could not be copied to a temporary file %1.", localUrl.prettyUrl())); KMessageBox::information(m_parentWidget, tr("Template file could not be copied to a temporary file \"%1\".").arg(localUrl.prettyUrl())); return false; } m_tikzPreviewGenerator->setTemplateFile(localUrl.path()); } else #endif m_tikzPreviewGenerator->setTemplateFile(path); return true; } void TikzPreviewController::setTemplateFileAndRegenerate(const QString &path) { if (setTemplateFile(path)) generatePreview(true); } void TikzPreviewController::setReplaceTextAndRegenerate(const QString &replace) { m_tikzPreviewGenerator->setReplaceText(replace); generatePreview(true); } /***************************************************************************/ QString TikzPreviewController::tikzCode() const { return m_mainWidget->tikzCode(); } QString TikzPreviewController::getLogText() { return m_tikzPreviewGenerator->getLogText(); } void TikzPreviewController::generatePreview() { QAction *action = qobject_cast(sender()); bool templateChanged = (action == 0) ? true : false; // XXX dirty hack: the template hasn't changed when the Build button in the app has been pressed (if available), the other cases in which this function is called is when a file is opened, in which case everything should be cleaned up and regenerated generatePreview(templateChanged); } void TikzPreviewController::generatePreview(bool templateChanged) { if (templateChanged) // old aux files may contain commands available in the old template, but not anymore in the new template cleanUp(); // TODO: m_tikzPreviewGenerator->addToTexinputs(QFileInfo(m_mainWidget->url().path()).absolutePath()); // m_tikzPreviewGenerator->setTikzFilePath(m_mainWidget->url().path()); // the directory in which the pgf file is located is added to TEXINPUTS before running latex m_tikzPreviewGenerator->generatePreview(templateChanged); } void TikzPreviewController::regeneratePreview() { // m_tikzPreviewGenerator->setTikzFilePath(m_mainWidget->url().path()); // the directory in which the pgf file is located is added to TEXINPUTS before running latex m_tikzPreviewGenerator->regeneratePreview(); } void TikzPreviewController::emptyPreview() { setExportActionsEnabled(false); m_tikzPreviewGenerator->abortProcess(); // abort still running processes m_tikzPreview->emptyPreview(); } /***************************************************************************/ void TikzPreviewController::applySettings() { QSettings settings(ORGNAME, APPNAME); m_tikzPreviewGenerator->setLatexCommand(settings.value("LatexCommand", "pdflatex").toString()); m_tikzPreviewGenerator->setPdftopsCommand(settings.value("PdftopsCommand", "pdftops").toString()); const bool useShellEscaping = settings.value("UseShellEscaping", false).toBool(); disconnect(m_shellEscapeAction, SIGNAL(toggled(bool)), this, SLOT(toggleShellEscaping(bool))); m_shellEscapeAction->setChecked(useShellEscaping); m_tikzPreviewGenerator->setShellEscaping(useShellEscaping); connect(m_shellEscapeAction, SIGNAL(toggled(bool)), this, SLOT(toggleShellEscaping(bool))); setTemplateFile(settings.value("TemplateFile").toString()); const QString replaceText = settings.value("TemplateReplaceText", "<>").toString(); m_tikzPreviewGenerator->setReplaceText(replaceText); m_templateWidget->setReplaceText(replaceText); m_templateWidget->setEditor(settings.value("TemplateEditor", KTIKZ_TEMPLATE_EDITOR_DEFAULT).toString()); } void TikzPreviewController::setExportActionsEnabled(bool enabled) { m_exportAction->setEnabled(enabled); } void TikzPreviewController::setProcessRunning(bool isRunning) { m_procStopAction->setEnabled(isRunning); if (isRunning) QApplication::setOverrideCursor(Qt::BusyCursor); else QApplication::restoreOverrideCursor(); m_tikzPreview->setProcessRunning(isRunning); } void TikzPreviewController::toggleShellEscaping(bool useShellEscaping) { #ifndef KTIKZ_USE_KDE m_shellEscapeButton->setChecked(useShellEscaping); #endif QSettings settings(ORGNAME, APPNAME); settings.setValue("UseShellEscaping", useShellEscaping); m_tikzPreviewGenerator->setShellEscaping(useShellEscaping); generatePreview(false); } /***************************************************************************/ bool TikzPreviewController::cleanUp() { bool success = true; const QFileInfo tempTikzFileInfo(m_tempTikzFileBaseName + ".tex"); QDir tempTikzDir(tempTikzFileInfo.absolutePath()); QStringList filters; filters << tempTikzFileInfo.completeBaseName() + ".*"; foreach (const QString &fileName, tempTikzDir.entryList(filters)) success = success && tempTikzDir.remove(fileName); return success; } ktikz/common/tikzpreviewcontroller.h0000660000175000017500000000704111455414612022503 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_TIKZPREVIEWCONTROLLER_H #define KTIKZ_TIKZPREVIEWCONTROLLER_H #include #ifdef KTIKZ_USE_KDE #include class KAction; class KActionCollection; class KJob; class KTempDir; class KToggleAction; #else class QAction; class QMenu; class QToolBar; class QToolButton; #endif class TemplateWidget; class TikzPreview; class TikzPreviewGenerator; class MainWidget; class TikzPreviewController : public QObject { Q_OBJECT public: TikzPreviewController(MainWidget *mainWidget); virtual ~TikzPreviewController(); const QString tempDir() const; TemplateWidget *templateWidget() const; TikzPreview *tikzPreview() const; #ifndef KTIKZ_USE_KDE QAction *exportAction(); QMenu *menu(); QList toolBars(); void setToolBarStyle(const Qt::ToolButtonStyle &style); #endif QString tikzCode() const; QString getLogText(); void emptyPreview(); void applySettings(); public slots: void generatePreview(); void regeneratePreview(); private slots: #ifdef KTIKZ_USE_KDE void showJobError(KJob *job); #endif void setTemplateFileAndRegenerate(const QString &path); void setReplaceTextAndRegenerate(const QString &replace); void exportImage(); void setExportActionsEnabled(bool enabled); void setProcessRunning(bool isRunning); void toggleShellEscaping(bool useShellEscaping); signals: void logUpdated(const QString &logText, bool runFailed); private: void createTempDir(); void removeTempDir(); void createActions(); bool setTemplateFile(const QString &path); #ifdef KTIKZ_USE_KDE KUrl getExportUrl(const KUrl &url, const QString &mimeType) const; #else QString getExportFileName(const QString &fileName, const QString &mimeType) const; #endif void generatePreview(bool templateChanged); bool cleanUp(); MainWidget *m_mainWidget; QWidget *m_parentWidget; TemplateWidget *m_templateWidget; TikzPreview *m_tikzPreview; TikzPreviewGenerator *m_tikzPreviewGenerator; #ifdef KTIKZ_USE_KDE KActionCollection *m_actionCollection; KAction *m_exportAction; KAction *m_procStopAction; KToggleAction *m_shellEscapeAction; KTempDir *m_tempDir; #else QAction *m_exportAction; QAction *m_procStopAction; QAction *m_shellEscapeAction; QToolButton *m_shellEscapeButton; QList m_toolBars; #endif QString m_tempTikzFileBaseName; }; #endif ktikz/common/tikzpreviewthread.h0000660000175000017500000000366711455414612021601 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008, 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_TIKZPREVIEWTHREAD_H #define KTIKZ_TIKZPREVIEWTHREAD_H #include #include #include class QImage; namespace Poppler { class Document; } class TikzPreviewThread : public QThread { Q_OBJECT public: TikzPreviewThread(QObject *parent = 0); ~TikzPreviewThread(); void generatePreview(Poppler::Document *tikzPdfDoc, qreal zoomFactor = 1.0, int currentPage = 0); signals: void showPreview(const QImage &image); protected: void run(); private: QMutex m_mutex; QWaitCondition m_condition; bool m_restart; bool m_abort; Poppler::Document *m_tikzPdfDoc; qreal m_zoomFactor; int m_currentPage; }; #endif ktikz/common/templatewidget.cpp0000660000175000017500000001450011455414612021364 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "templatewidget.h" #include #include #include #include #include #include #include #include #include #include "utils/filedialog.h" #include "utils/icon.h" #include "utils/lineedit.h" #include "utils/url.h" TemplateWidget::TemplateWidget(QWidget *parent) : QWidget(parent) { ui.setupUi(this); ui.templateCombo->setLineEdit(new LineEdit(this)); ui.templateCombo->setMinimumContentsLength(20); ui.templateChooseButton->setIcon(Icon("document-open")); ui.templateReloadButton->setIcon(Icon("view-refresh")); QCompleter *completer = new QCompleter(this); completer->setModel(new QDirModel(completer)); completer->setCompletionMode(QCompleter::PopupCompletion); ui.templateCombo->setCompleter(completer); connect(ui.templateChooseButton, SIGNAL(clicked()), this, SLOT(setTemplateFile())); connect(ui.templateEditButton, SIGNAL(clicked()), this, SLOT(editTemplateFile())); connect(ui.templateReloadButton, SIGNAL(clicked()), this, SLOT(reloadTemplateFile())); connect(ui.templateCombo->lineEdit(), SIGNAL(textChanged(QString)), this, SIGNAL(fileNameChanged(QString))); readRecentTemplates(); } TemplateWidget::~TemplateWidget() { saveRecentTemplates(); } void TemplateWidget::readRecentTemplates() { QSettings settings(ORGNAME, APPNAME); ui.templateCombo->setMaxCount(settings.value("TemplateRecentNumber", 10).toInt()); const QStringList templateRecentList = settings.value("TemplateRecent").toStringList(); ui.templateCombo->addItems(templateRecentList); const int index = templateRecentList.indexOf(settings.value("TemplateFile").toString()); ui.templateCombo->setCurrentIndex((index >= 0) ? index : 0); } void TemplateWidget::saveRecentTemplates() { QSettings settings(ORGNAME, APPNAME); QStringList recentTemplates; for (int i = 0; i < ui.templateCombo->count(); ++i) recentTemplates << ui.templateCombo->itemText(i); settings.setValue("TemplateRecent", recentTemplates); settings.setValue("TemplateFile", ui.templateCombo->lineEdit()->text()); } void TemplateWidget::setFileName(const QString &fileName) { disconnect(ui.templateCombo->lineEdit(), SIGNAL(textChanged(QString)), this, SIGNAL(fileNameChanged(QString))); const int index = ui.templateCombo->findText(fileName); if (index >= 0) // then remove item in order to re-add it at the top ui.templateCombo->removeItem(index); ui.templateCombo->insertItem(0, fileName); ui.templateCombo->lineEdit()->setText(""); connect(ui.templateCombo->lineEdit(), SIGNAL(textChanged(QString)), this, SIGNAL(fileNameChanged(QString))); ui.templateCombo->setCurrentIndex(0); } void TemplateWidget::setReplaceText(const QString &replace) { QString replaceText = replace; replaceText.replace('&', QLatin1String("&")); replaceText.replace('<', QLatin1String("<")); replaceText.replace('>', QLatin1String(">")); const QString templateDescription(tr("

The template contains the code " "of a complete LaTeX document in which the TikZ picture will be " "included and which will be typesetted to produce the preview " "image. The string %1 in the template will be replaced by the " "TikZ code.

").arg(replaceText)); ui.templateCombo->setWhatsThis(tr("

Give the file name of the LaTeX " "template. If this input field is empty or contains an invalid " "file name, an internal default template will be used.

") + templateDescription); ui.templateLabel->setWhatsThis(ui.templateCombo->whatsThis()); ui.templateEditButton->setWhatsThis(tr("

Edit this template with " "an external editor specified in the \"Configure\" dialog.

") + templateDescription); } void TemplateWidget::setEditor(const QString &editor) { m_editor = editor; } QString TemplateWidget::fileName() const { return ui.templateCombo->currentText(); } void TemplateWidget::setTemplateFile() { QString currentFileName = ui.templateCombo->currentText(); #ifdef KTIKZ_TEMPLATES_INSTALL_DIR if (currentFileName.isEmpty() && QFileInfo(KTIKZ_TEMPLATES_INSTALL_DIR).isDir()) currentFileName = KTIKZ_TEMPLATES_INSTALL_DIR; #endif const Url url = FileDialog::getOpenUrl(this, tr("Select a template file"), Url(currentFileName), QString("*.pgs *.tex|%1\n*|%2") .arg(tr("%1 template files").arg(APPNAME)) .arg(tr("All files"))); if (url.isValid()) setFileName(url.pathOrUrl()); } void TemplateWidget::editTemplateFile() { QApplication::setOverrideCursor(Qt::WaitCursor); QStringList editorArguments; editorArguments << ui.templateCombo->currentText(); QProcess process; process.startDetached(m_editor, editorArguments); QApplication::restoreOverrideCursor(); // reloadTemplateFile(); } void TemplateWidget::reloadTemplateFile() { setFileName(fileName()); } void TemplateWidget::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Return) setFileName(ui.templateCombo->currentText()); if (event->key() == Qt::Key_Escape || event->key() == Qt::Key_Return) emit focusEditor(); QWidget::keyPressEvent(event); } ktikz/common/tikzpreviewthread.cpp0000660000175000017500000000504111455414612022120 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008, 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "tikzpreviewthread.h" #include #include TikzPreviewThread::TikzPreviewThread(QObject *parent) : QThread(parent) { m_restart = false; m_abort = false; setTerminationEnabled(true); } TikzPreviewThread::~TikzPreviewThread() { m_mutex.lock(); m_abort = true; m_condition.wakeOne(); m_mutex.unlock(); wait(); } void TikzPreviewThread::generatePreview(Poppler::Document *tikzPdfDoc, qreal zoomFactor, int currentPage) { QMutexLocker locker(&m_mutex); m_tikzPdfDoc = tikzPdfDoc; m_zoomFactor = zoomFactor; m_currentPage = currentPage; if (!isRunning()) { start(LowPriority); } else { // m_restart = true; // m_condition.wakeOne(); m_abort = true; m_condition.wakeAll(); m_abort = false; m_restart = true; // start(LowPriority); } } void TikzPreviewThread::run() { while (true) { if (m_abort) return; m_mutex.lock(); Poppler::Page *pdfPage = m_tikzPdfDoc->page(m_currentPage); const qreal zoomFactor = m_zoomFactor; m_mutex.unlock(); const QImage tikzImage = pdfPage->renderToImage(zoomFactor * 72, zoomFactor * 72); delete pdfPage; emit showPreview(tikzImage); // sleep m_mutex.lock(); if (!m_restart) m_condition.wait(&m_mutex); m_restart = false; m_mutex.unlock(); } } ktikz/common/mainwidget.h0000660000175000017500000000317411455414612020147 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008, 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_MAIN_WIDGET_H #define KTIKZ_MAIN_WIDGET_H #include #include #include "utils/url.h" class MainWidget { public: virtual ~MainWidget() {} virtual QWidget *widget() { return new QWidget(); } virtual QString tikzCode() const { return QString(); } virtual Url url() const { return Url(); } }; #endif ktikz/common/templatewidget.ui0000660000175000017500000000600411455414612021217 0ustar fhackenbergerfhackenberger TemplateWidget Choose Template <p>Give the file name of the LaTeX template. If this input field is empty or contains an invalid file name, an internal default template will be used.</p> &Template: templateCombo 0 0 <p>Give the file name of the LaTeX template. If this input field is empty or contains an invalid file name, an internal default template will be used.</p> true <p>Select template file</p> <p>Browse to an existing template file.</p> :/icons/document-open.png:/icons/document-open.png <p>Reload template file</p> <p>Reload current template file.</p> :/icons/view-refresh.png:/icons/view-refresh.png <p>Edit template file</p> <p>Edit this template with an external editor specified in the "Configure" dialog.</p> Edit ktikz/common/tikzpreview.h0000660000175000017500000000623311455414612020401 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_TIKZPREVIEW_H #define KTIKZ_TIKZPREVIEW_H #include class QComboBox; class QImage; class QLabel; class QToolBar; namespace Poppler { class Document; } class Action; class SelectAction; class TikzPreviewThread; class TikzPreview : public QGraphicsView { Q_OBJECT public: TikzPreview(QWidget *parent = 0); ~TikzPreview(); virtual QSize sizeHint() const; QList actions(); QToolBar *toolBar(); QPixmap pixmap() const; void emptyPreview(); void setProcessRunning(bool isRunning); public slots: void showPreview(const QImage &tikzImage); void pixmapUpdated(Poppler::Document *tikzPdfDoc); void showErrorMessage(const QString &message); protected: void contextMenuEvent(QContextMenuEvent *event); void paintEvent(QPaintEvent *event); void wheelEvent(QWheelEvent *event); private slots: void setZoomFactor(const QString &zoomFactorText); void zoomIn(); void zoomOut(); void showPreviousPage(); void showNextPage(); private: void createInformationLabel(); void centerView(); void setZoomFactor(qreal zoomFactor); void createActions(); void showPdfPage(); void centerInfoLabel(); void setInfoLabelText(const QString &message, bool isPixmapVisible); QString formatZoomFactor(qreal zoomFactor) const; void createZoomFactorList(qreal newZoomFactor = 0); QGraphicsScene *m_tikzScene; QGraphicsPixmapItem *m_tikzPixmapItem; TikzPreviewThread *m_tikzPreviewThread; // QPoint m_centerPoint; bool m_processRunning; QAction *m_zoomInAction; QAction *m_zoomOutAction; SelectAction *m_zoomToAction; QAction *m_pageSeparator; Action *m_previousPageAction; Action *m_nextPageAction; QFrame *m_infoWidget; QGraphicsItem *m_infoProxyWidget; QLabel *m_infoPixmapLabel; QLabel *m_infoLabel; bool m_infoWidgetAdded; Poppler::Document *m_tikzPdfDoc; int m_currentPage; qreal m_zoomFactor; qreal m_oldZoomFactor; bool m_hasZoomed; }; #endif ktikz/common/settings.kcfgc0000660000175000017500000000012011455414612020471 0ustar fhackenbergerfhackenbergerFile=ktikz.kcfg ClassName=Settings Namespace=KTikZ Singleton=true Mutators=true ktikz/common/tikzpreviewgenerator.h0000660000175000017500000000776011455414612022316 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * * * Copyright (C) 2007, 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_TIKZPREVIEWGENERATOR_H #define KTIKZ_TIKZPREVIEWGENERATOR_H #include #if QT_VERSION >= 0x040600 #include #else #include #endif #include #include #include class QPixmap; class QProcess; class QPlainTextEdit; class QTextStream; namespace Poppler { class Document; } class TikzPreviewController; /** * @author Florian Hackenberger */ class TikzPreviewGenerator : public QThread { Q_OBJECT public: TikzPreviewGenerator(TikzPreviewController *parent); ~TikzPreviewGenerator(); void setTikzFileBaseName(const QString &name); void setLatexCommand(const QString &command); void setPdftopsCommand(const QString &command); void setShellEscaping(bool useShellEscaping); QString getLogText() const; bool hasRunFailed(); void generatePreview(bool templateChanged = false); void addToLatexSearchPath(const QString &path); bool generateEpsFile(); public slots: void setTemplateFile(const QString &fileName); void setReplaceText(const QString &replace); void abortProcess(); void regeneratePreview(); signals: void pixmapUpdated(Poppler::Document *tikzPdfDoc); void setExportActionsEnabled(bool enabled); void showErrorMessage(const QString &message); void shortLogUpdated(const QString &logText, bool runFailed); // void logUpdated(bool runFailed); void processRunning(bool isRunning); private slots: void displayGnuplotNotExecutable(); protected: void setMinUpdateInterval(const QTime &interval); QString getParsedLogText(QTextStream *logStream) const; void parseLogFile(); void createPreview(); void run(); void createTempLatexFile(); void createTempTikzFile(); bool runProcess(const QString &name, const QString &command, const QStringList &arguments, const QString &workingDir = 0); bool generatePdfFile(); TikzPreviewController *m_parent; Poppler::Document *m_tikzPdfDoc; QString m_tikzCode; QProcess *m_process; mutable QMutex m_memberLock; bool m_updateScheduled; QWaitCondition m_updateRequested; QTime m_minUpdateInterval; QTime m_updateTimer; bool m_processAborted; bool m_runFailed; bool m_keepRunning; #if QT_VERSION >= 0x040600 QProcessEnvironment m_processEnvironment; #else QStringList m_processEnvironment; #endif QString m_tikzFileBaseName; QString m_templateFileName; QString m_tikzReplaceText; // int m_templateStartLineNumber; bool m_templateChanged; QString m_latexCommand; QString m_pdftopsCommand; QString m_shortLogText; QString m_logText; bool m_useShellEscaping; QProcess *m_checkGnuplotExecutable; }; #endif ktikz/common/templatewidget.h0000660000175000017500000000374111455414612021036 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2008 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef TEMPLATEWIDGET_H #define TEMPLATEWIDGET_H #include "ui_templatewidget.h" class TemplateWidget : public QWidget { Q_OBJECT public: TemplateWidget(QWidget *parent = 0); ~TemplateWidget(); void setFileName(const QString &fileName); void setReplaceText(const QString &replace); void setEditor(const QString &editor); QString fileName() const; signals: void fileNameChanged(const QString &fileName); void focusEditor(); protected: void keyPressEvent(QKeyEvent *event); private slots: void setTemplateFile(); void editTemplateFile(); void reloadTemplateFile(); private: void readRecentTemplates(); void saveRecentTemplates(); Ui::TemplateWidget ui; QString m_editor; }; #endif ktikz/common/tikzpreview.cpp0000660000175000017500000004243511455414612020740 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007, 2008, 2009, 2010 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "tikzpreview.h" #ifdef KTIKZ_USE_KDE #include #else #include #endif #include #include #include #include #include #include #include #include #include #include #include #include "tikzpreviewthread.h" #include "utils/action.h" #include "utils/icon.h" #include "utils/selectaction.h" #include "utils/standardaction.h" static const qreal s_minZoomFactor = 0.1; static const qreal s_maxZoomFactor = 6; TikzPreview::TikzPreview(QWidget *parent) : QGraphicsView(parent) { m_tikzScene = new QGraphicsScene(this); m_tikzPixmapItem = m_tikzScene->addPixmap(QPixmap()); setScene(m_tikzScene); setDragMode(QGraphicsView::ScrollHandDrag); setWhatsThis(tr("

Here the preview image of " "your TikZ code is shown. You can zoom in and out, and you " "can scroll the image by dragging it.

")); m_tikzPdfDoc = 0; m_currentPage = 0; // m_centerPoint = QPoint(0, 0); m_processRunning = false; m_pageSeparator = 0; QSettings settings(ORGNAME, APPNAME); settings.beginGroup("Preview"); m_zoomFactor = settings.value("ZoomFactor", 1).toDouble(); settings.endGroup(); m_oldZoomFactor = -1; m_hasZoomed = false; createActions(); createInformationLabel(); setZoomFactor(m_zoomFactor); m_tikzPreviewThread = new TikzPreviewThread(); connect(m_tikzPreviewThread, SIGNAL(showPreview(QImage)), this, SLOT(showPreview(QImage))); } TikzPreview::~TikzPreview() { delete m_infoProxyWidget; delete m_tikzPreviewThread; QSettings settings(ORGNAME, APPNAME); settings.beginGroup("Preview"); settings.setValue("ZoomFactor", m_zoomFactor); settings.endGroup(); } void TikzPreview::contextMenuEvent(QContextMenuEvent *event) { QMenu *menu = new QMenu(this); menu->addActions(actions()); menu->exec(event->globalPos()); menu->deleteLater(); } QSize TikzPreview::sizeHint() const { return QSize(250, 200); } /***************************************************************************/ void TikzPreview::createActions() { m_zoomInAction = StandardAction::zoomIn(this, SLOT(zoomIn()), this); m_zoomOutAction = StandardAction::zoomOut(this, SLOT(zoomOut()), this); m_zoomInAction->setStatusTip(tr("Zoom preview in")); m_zoomOutAction->setStatusTip(tr("Zoom preview out")); m_zoomInAction->setWhatsThis(tr("

Zoom preview in by a predetermined factor.

")); m_zoomOutAction->setWhatsThis(tr("

Zoom preview out by a predetermined factor.

")); m_zoomToAction = new SelectAction(Icon("zoom-original"), tr("&Zoom"), this, "zoom_to"); m_zoomToAction->setEditable(true); m_zoomToAction->setToolTip(tr("Select or insert zoom factor here")); m_zoomToAction->setWhatsThis(tr("

Select the zoom factor here. " "Alternatively, you can also introduce a zoom factor and " "press Enter.

")); connect(m_zoomToAction, SIGNAL(triggered(QString)), this, SLOT(setZoomFactor(QString))); // createZoomFactorList(); m_previousPageAction = new Action(Icon("go-previous"), tr("&Previous image"), this, "view_previous_image"); m_previousPageAction->setShortcut(tr("Alt+Left", "View|Go to previous page")); m_previousPageAction->setStatusTip(tr("Show previous image in preview")); m_previousPageAction->setWhatsThis(tr("

Show the preview of the previous tikzpicture in the TikZ code.

")); connect(m_previousPageAction, SIGNAL(triggered()), this, SLOT(showPreviousPage())); m_nextPageAction = new Action(Icon("go-next"), tr("&Next image"), this, "view_next_image"); m_nextPageAction->setShortcut(tr("Alt+Right", "View|Go to next page")); m_nextPageAction->setStatusTip(tr("Show next image in preview")); m_nextPageAction->setWhatsThis(tr("

Show the preview of the next tikzpicture in the TikZ code.

")); connect(m_nextPageAction, SIGNAL(triggered()), this, SLOT(showNextPage())); m_previousPageAction->setVisible(false); m_previousPageAction->setEnabled(false); m_nextPageAction->setVisible(false); m_nextPageAction->setEnabled(true); } QList TikzPreview::actions() { QList actions; actions << m_zoomInAction << m_zoomOutAction; QAction *action = new QAction(this); action->setSeparator(true); actions << action; actions << m_previousPageAction << m_nextPageAction; return actions; } QToolBar *TikzPreview::toolBar() { QToolBar *viewToolBar = new QToolBar(tr("View"), this); viewToolBar->setObjectName("ViewToolBar"); viewToolBar->addAction(m_zoomInAction); viewToolBar->addAction(m_zoomToAction); viewToolBar->addAction(m_zoomOutAction); m_pageSeparator = viewToolBar->addSeparator(); m_pageSeparator->setVisible(false); viewToolBar->addAction(m_previousPageAction); viewToolBar->addAction(m_nextPageAction); return viewToolBar; } /***************************************************************************/ void TikzPreview::createInformationLabel() { #ifdef KTIKZ_USE_KDE const QPixmap infoPixmap = KIconLoader::global()->loadIcon("dialog-error", KIconLoader::Dialog, KIconLoader::SizeMedium); #else const QPixmap infoPixmap = Icon("dialog-error").pixmap(QSize(32, 32)); #endif m_infoPixmapLabel = new QLabel; m_infoPixmapLabel->setPixmap(infoPixmap); m_infoLabel = new QLabel; m_infoWidget = new QFrame; m_infoWidget->setObjectName("infoWidget"); /* m_infoWidget->setStyleSheet( "#infoWidget {" " background-color: palette(window);" " border: 1px solid palette(dark);" " padding: 6px;" "}" ); */ m_infoWidget->setFrameShape(QFrame::Box); m_infoWidget->setAutoFillBackground(true); QPalette palette = qApp->palette(); QColor backgroundColor = palette.window().color(); QColor foregroundColor = palette.color(QPalette::Dark); backgroundColor.setAlpha(150); foregroundColor.setAlpha(150); palette.setBrush(QPalette::Window, backgroundColor); palette.setBrush(QPalette::WindowText, foregroundColor); m_infoWidget->setPalette(palette); palette = m_infoLabel->palette(); foregroundColor = palette.windowText().color(); palette.setBrush(QPalette::WindowText, foregroundColor); m_infoLabel->setPalette(palette); QHBoxLayout *infoLayout = new QHBoxLayout(m_infoWidget); infoLayout->setMargin(10); infoLayout->addWidget(m_infoPixmapLabel); infoLayout->addWidget(m_infoLabel); m_infoProxyWidget = m_tikzScene->addWidget(m_infoWidget); m_infoProxyWidget->setZValue(1); // m_infoProxyWidget->setVisible(false); m_tikzScene->removeItem(m_infoProxyWidget); m_infoWidgetAdded = false; m_infoPixmapLabel->setVisible(false); } /***************************************************************************/ void TikzPreview::centerView() { m_hasZoomed = true; } void TikzPreview::paintEvent(QPaintEvent *event) { // when m_infoWidget is visible, then it must be resized and // repositioned, this must be done here to do it successfully if (m_infoWidgetAdded && m_infoWidget->isVisible()) { m_infoWidget->resize(0, 0); centerInfoLabel(); m_infoWidgetAdded = false; } /* setSceneRect(m_tikzScene->itemsBoundingRect()); if (m_hasZoomed) { // center the viewport on the same object in the image // that was previously the center (in order to avoid // flicker, this must be done here) // setSceneRect(m_tikzScene->itemsBoundingRect()); if (!m_centerPoint.isNull()) centerOn(m_centerPoint); m_hasZoomed = false; } */ if (m_hasZoomed) { // center the viewport on the same object in the image // that was previously the center (in order to avoid // flicker, this must be done here) const qreal zoomFraction = (m_oldZoomFactor > 0) ? m_zoomFactor / m_oldZoomFactor : 1; setSceneRect(m_tikzScene->itemsBoundingRect()); centerOn((horizontalScrollBar()->value() + viewport()->width() / 2) * zoomFraction, (verticalScrollBar()->value() + viewport()->height() / 2) * zoomFraction); m_oldZoomFactor = m_zoomFactor; // m_oldZoomFactor must be set here and not in the zoom functions below in order to avoid skipping some steps when the user zooms fast m_hasZoomed = false; } QGraphicsView::paintEvent(event); } /***************************************************************************/ QString TikzPreview::formatZoomFactor(qreal zoomFactor) const { #ifdef KTIKZ_USE_KDE QString zoomFactorText = KGlobal::locale()->formatNumber(zoomFactor, 2); zoomFactorText.remove(KGlobal::locale()->decimalSymbol() + "00"); // remove trailing zero in numbers like 12.30 if (zoomFactorText.endsWith('0') && zoomFactorText.indexOf(KGlobal::locale()->decimalSymbol()) >= 0) zoomFactorText.chop(1); zoomFactorText += '%'; return zoomFactorText; #else return QLocale::system().toString(zoomFactor) + '%'; #endif } void TikzPreview::createZoomFactorList(qreal newZoomFactor) { const qreal zoomFactorArray[] = {12.50, 25, 50, 75, 100, 125, 150, 200, 250, 300}; const int zoomFactorNumber = 10; QStringList zoomFactorList; int newZoomFactorPosition = -1; bool addNewZoomFactor = true; if (newZoomFactor < s_minZoomFactor || newZoomFactor > s_maxZoomFactor) addNewZoomFactor = false; newZoomFactor *= 100; for (int i = 0; i < zoomFactorNumber; ++i) { if (addNewZoomFactor && newZoomFactor < zoomFactorArray[i]) { zoomFactorList << formatZoomFactor(newZoomFactor); newZoomFactorPosition = i; addNewZoomFactor = false; } else if (newZoomFactor == zoomFactorArray[i]) { newZoomFactorPosition = i; addNewZoomFactor = false; } zoomFactorList << formatZoomFactor(zoomFactorArray[i]); } if (addNewZoomFactor) { zoomFactorList << formatZoomFactor(newZoomFactor); newZoomFactorPosition = zoomFactorNumber; } disconnect(m_zoomToAction, SIGNAL(triggered(QString)), this, SLOT(setZoomFactor(QString))); m_zoomToAction->removeAllActions(); m_zoomToAction->setItems(zoomFactorList); if (newZoomFactorPosition >= 0) m_zoomToAction->setCurrentItem(newZoomFactorPosition); connect(m_zoomToAction, SIGNAL(triggered(QString)), this, SLOT(setZoomFactor(QString))); } /***************************************************************************/ void TikzPreview::setZoomFactor(qreal zoomFactor) { // m_oldZoomFactor = m_zoomFactor; m_zoomFactor = zoomFactor; if (m_zoomFactor == m_oldZoomFactor) return; // adjust zoom factor m_zoomFactor = qBound(s_minZoomFactor, m_zoomFactor, s_maxZoomFactor); // add current zoom factor to the list of zoom factors const QString zoomFactorString = formatZoomFactor(m_zoomFactor * 100); const int zoomFactorIndex = m_zoomToAction->items().indexOf(zoomFactorString); if (zoomFactorIndex >= 0) m_zoomToAction->setCurrentItem(zoomFactorIndex); else createZoomFactorList(m_zoomFactor); m_zoomInAction->setEnabled(m_zoomFactor < s_maxZoomFactor); m_zoomOutAction->setEnabled(m_zoomFactor > s_minZoomFactor); showPdfPage(); } void TikzPreview::setZoomFactor(const QString &zoomFactorText) { #ifdef KTIKZ_USE_KDE setZoomFactor(KGlobal::locale()->readNumber(QString(zoomFactorText).remove('&').remove('%')) / 100.0); #else setZoomFactor(QString(zoomFactorText).remove(QRegExp(QString("[^\\d\\%1]*").arg(QLocale::system().decimalPoint()))).toDouble() / 100); #endif } void TikzPreview::zoomIn() { setZoomFactor(m_zoomFactor + ((m_zoomFactor > 0.99) ? (m_zoomFactor > 1.99 ? 0.5 : 0.2) : 0.1)); } void TikzPreview::zoomOut() { setZoomFactor(m_zoomFactor - ((m_zoomFactor > 1.01) ? (m_zoomFactor > 2.01 ? 0.5 : 0.2) : 0.1)); } /***************************************************************************/ void TikzPreview::showPreviousPage() { if (m_currentPage > 0) --m_currentPage; m_previousPageAction->setEnabled(m_currentPage > 0); m_nextPageAction->setEnabled(m_currentPage < m_tikzPdfDoc->numPages() - 1); showPdfPage(); } void TikzPreview::showNextPage() { if (m_currentPage < m_tikzPdfDoc->numPages() - 1) ++m_currentPage; m_previousPageAction->setEnabled(m_currentPage > 0); m_nextPageAction->setEnabled(m_currentPage < m_tikzPdfDoc->numPages() - 1); showPdfPage(); } void TikzPreview::showPreview(const QImage &tikzImage) { m_tikzPixmapItem->setPixmap(QPixmap::fromImage(tikzImage)); m_tikzPixmapItem->update(); centerView(); // adjust viewport when new objects are added to the tikz picture or when zooming } void TikzPreview::showPdfPage() { if (!m_tikzPdfDoc || m_tikzPdfDoc->numPages() < 1) return; // m_centerPoint = QPoint(horizontalScrollBar()->value() + viewport()->width() / 2, // verticalScrollBar()->value() + viewport()->height() / 2); // get current center of the viewport and use it in paintEvent if (!m_processRunning) m_tikzPreviewThread->generatePreview(m_tikzPdfDoc, m_zoomFactor, m_currentPage); /* if (!m_processRunning) { Poppler::Page *pdfPage = m_tikzPdfDoc->page(m_currentPage); m_tikzPixmapItem->setPixmap(QPixmap::fromImage(pdfPage->renderToImage(m_zoomFactor * 72, m_zoomFactor * 72))); m_tikzPixmapItem->update(); centerView(); // adjust viewport when new objects are added to the tikz picture delete pdfPage; } */ } void TikzPreview::emptyPreview() { m_tikzPdfDoc = 0; m_tikzPixmapItem->setPixmap(QPixmap()); m_tikzPixmapItem->update(); // m_infoWidget->setVisible(false); if (m_infoProxyWidget->scene() != 0) // remove error messages from view m_tikzScene->removeItem(m_infoProxyWidget); m_tikzScene->setSceneRect(0, 0, 1, 1); // remove scrollbars from view if (m_pageSeparator) m_pageSeparator->setVisible(false); m_previousPageAction->setVisible(false); m_nextPageAction->setVisible(false); } void TikzPreview::pixmapUpdated(Poppler::Document *tikzPdfDoc) { m_tikzPdfDoc = tikzPdfDoc; if (!m_tikzPdfDoc) { emptyPreview(); return; } m_tikzPdfDoc->setRenderBackend(Poppler::Document::SplashBackend); // m_tikzPdfDoc->setRenderBackend(Poppler::Document::ArthurBackend); m_tikzPdfDoc->setRenderHint(Poppler::Document::Antialiasing, true); m_tikzPdfDoc->setRenderHint(Poppler::Document::TextAntialiasing, true); const int numOfPages = m_tikzPdfDoc->numPages(); const bool visible = (numOfPages > 1); if (m_pageSeparator) m_pageSeparator->setVisible(visible); m_previousPageAction->setVisible(visible); m_nextPageAction->setVisible(visible); if (m_currentPage >= numOfPages) // if the new tikz code has fewer tikzpictures than the previous one (this may happen if a new PGF file is opened in the same window), then we must reset m_currentPage { m_currentPage = 0; m_previousPageAction->setEnabled(false); m_nextPageAction->setEnabled(true); } showPdfPage(); } /***************************************************************************/ QPixmap TikzPreview::pixmap() const { return m_tikzPixmapItem->pixmap(); } /***************************************************************************/ void TikzPreview::centerInfoLabel() { qreal posX = (sceneRect().width() - m_infoWidget->width()) / 2; qreal posY = (sceneRect().height() - m_infoWidget->height()) / 2; if (sceneRect().width() > viewport()->width()) posX += horizontalScrollBar()->value(); if (sceneRect().height() > viewport()->height()) posY += verticalScrollBar()->value(); m_infoWidget->move(posX, posY); } void TikzPreview::setInfoLabelText(const QString &message, bool isPixmapVisible) { m_infoPixmapLabel->setVisible(isPixmapVisible); m_infoLabel->setText(message); // m_infoWidget->setVisible(false); // m_infoWidget->setVisible(true); if (m_infoProxyWidget->scene() != 0) // only remove if the widget is still attached to m_tikzScene m_tikzScene->removeItem(m_infoProxyWidget); // make sure that any previous messages are not visible anymore m_tikzScene->addItem(m_infoProxyWidget); m_infoWidgetAdded = true; } void TikzPreview::showErrorMessage(const QString &message) { setInfoLabelText(message, true); } void TikzPreview::setProcessRunning(bool isRunning) { m_processRunning = isRunning; if (isRunning) setInfoLabelText(tr("Generating image", "tikz preview status"), false); // else // m_infoWidget->setVisible(false); else if (m_infoProxyWidget->scene() != 0) // only remove if the widget is still attached to m_tikzScene m_tikzScene->removeItem(m_infoProxyWidget); } /***************************************************************************/ void TikzPreview::wheelEvent(QWheelEvent *event) { if (event->modifiers() == Qt::ControlModifier) { if (event->delta() > 0) zoomIn(); else zoomOut(); } else QGraphicsView::wheelEvent(event); } ktikz/common/utils/0000771000175000017500000000000011455415074017004 5ustar fhackenbergerfhackenbergerktikz/common/utils/filedialog.cpp0000660000175000017500000000645411455414612021615 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "filedialog.h" #ifdef KTIKZ_USE_KDE #include #include Url FileDialog::getOpenUrl(QWidget *parent, const QString &caption, const Url &dir, const QString &filter) { return KFileDialog::getOpenUrl(dir, filter, parent, caption); } Url FileDialog::getSaveUrl(QWidget *parent, const QString &caption, const Url &dir, const QString &filter) { return KFileDialog::getSaveUrl(dir, filter, parent, caption, KFileDialog::ConfirmOverwrite); } #else #include #include Url FileDialog::getOpenUrl(QWidget *parent, const QString &caption, const Url &dir, const QString &filter) { const QStringList filterList = filter.split('\n'); QString parsedFilter; for (int i = 0; i < filterList.size(); ++i) { const QStringList filterItems = filterList.at(i).split('|'); if (i > 0) parsedFilter += ";;"; parsedFilter += filterItems.at(1) + " (" + filterItems.at(0) + ')'; } const QString openFileName = QFileDialog::getOpenFileName(parent, caption, dir.path(), parsedFilter); if (openFileName.isEmpty()) return Url(); return Url(openFileName); } Url FileDialog::getSaveUrl(QWidget *parent, const QString &caption, const Url &dir, const QString &filter) { const QStringList filterList = filter.split('\n'); QString parsedFilter; for (int i = 0; i < filterList.size(); ++i) { const QStringList filterItems = filterList.at(i).split('|'); if (i > 0) parsedFilter += ";;"; parsedFilter += filterItems.at(1) + " (" + filterItems.at(0) + ')'; } const QString saveAsFileName = QFileDialog::getSaveFileName(parent, caption, dir.path(), parsedFilter); if (saveAsFileName.isEmpty()) return Url(); if (QFile::exists(saveAsFileName)) { if (QMessageBox::warning(parent, QCoreApplication::applicationName(), tr("File \"%1\" already exists.\nDo you want to overwrite it?").arg(saveAsFileName), QMessageBox::Save | QMessageBox::Default, QMessageBox::Discard | QMessageBox::Escape) == QMessageBox::Discard) return Url(); } return Url(saveAsFileName); } #endif ktikz/common/utils/lineedit.cpp0000660000175000017500000000507611455414612021312 0ustar fhackenbergerfhackenberger/**************************************************************************** ** ** Copyright (c) 2007 Trolltech ASA ** Modified (c) 2009 by Glad Deschrijver ** ** Use, modification and distribution is allowed without limitation, ** warranty, liability or support of any kind. ** ****************************************************************************/ #include "lineedit.h" #ifdef KTIKZ_USE_KDE LineEdit::LineEdit(const QString &text, QWidget *parent) : KLineEdit(text, parent) { setClearButtonShown(true); } LineEdit::LineEdit(QWidget *parent) : KLineEdit(parent) { setClearButtonShown(true); } #else #include #include LineEdit::LineEdit(const QString &text, QWidget *parent) : QLineEdit(parent) { init(); setText(text); } LineEdit::LineEdit(QWidget *parent) : QLineEdit(parent) { init(); } void LineEdit::init() { m_clearButton = new QToolButton(this); const QPixmap pixmap(":/icons/edit-clear-locationbar-rtl.png"); m_clearButton->setIcon(QIcon(pixmap)); m_clearButton->setIconSize(pixmap.size()); m_clearButton->setCursor(Qt::ArrowCursor); m_clearButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); m_clearButton->setToolTip(tr("Clear input field")); m_clearButton->hide(); connect(m_clearButton, SIGNAL(clicked()), this, SLOT(clear())); connect(this, SIGNAL(textChanged(QString)), this, SLOT(updateClearButton(QString))); // const int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); // setStyleSheet(QString("QLineEdit { padding-right: %1px; width: %2px; height: %3px; }") // .arg(m_clearButton->sizeHint().width() + frameWidth + 1) // .arg(sizeHint().width()) // .arg(sizeHint().height())); setStyleSheet(QString("QLineEdit { padding-right: %1px; }") .arg(m_clearButton->sizeHint().width() + style()->pixelMetric(QStyle::PM_DefaultFrameWidth) + 1)); } QSize LineEdit::sizeHint() const { const QSize msz = QLineEdit::sizeHint(); const int minimumHeight = m_clearButton->sizeHint().height() + style()->pixelMetric(QStyle::PM_DefaultFrameWidth) * 2; return QSize(qMax(msz.width(), minimumHeight + 2), qMax(msz.height(), minimumHeight)); } void LineEdit::resizeEvent(QResizeEvent *event) { const QSize sz = m_clearButton->sizeHint(); m_clearButton->move(rect().right() - style()->pixelMetric(QStyle::PM_DefaultFrameWidth) - sz.width(), (rect().bottom() + 1 - sz.height()) / 2); QLineEdit::resizeEvent(event); } void LineEdit::updateClearButton(const QString &text) { m_clearButton->setVisible(!text.isEmpty()); } #endif ktikz/common/utils/fontdialog.h0000660000175000017500000000414511455414612021304 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_FONTDIALOG_H #define KTIKZ_FONTDIALOG_H #ifdef KTIKZ_USE_KDE #include class FontDialog : public KFontDialog { public: FontDialog(QWidget *parent) : KFontDialog(parent) {} static QFont getFont(bool *ok, const QFont &font, QWidget *parent) { Q_UNUSED(parent); QFont newFont = font; const int result = KFontDialog::getFont(newFont); *ok = (result == KFontDialog::Accepted); return newFont; } }; #else #include class FontDialog : public QFontDialog { public: // Commented out for Qt 4.5 compatibility (should not be required, // as we don't instantiate FontDialog directly anyway). //FontDialog(QWidget *parent) : QFontDialog(parent) {} static QFont getFont(bool *ok, const QFont &font, QWidget *parent) { return QFontDialog::getFont(ok, font, parent); } }; #endif #endif ktikz/common/utils/recentfilesaction.cpp0000660000175000017500000001302411455414612023206 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "recentfilesaction.h" #include "action.h" #include "icon.h" #include "url.h" #ifdef KTIKZ_USE_KDE #include #include RecentFilesAction::RecentFilesAction(QObject *parent) : KRecentFilesAction(parent) { Action::actionCollection()->addAction("file_open_recent", this); connect(this, SIGNAL(urlSelected(KUrl)), this, SLOT(selectUrl(KUrl))); } RecentFilesAction::RecentFilesAction(const QString &text, QObject *parent) : KRecentFilesAction(text, parent) { Action::actionCollection()->addAction("file_open_recent", this); connect(this, SIGNAL(urlSelected(KUrl)), this, SLOT(selectUrl(KUrl))); } RecentFilesAction::RecentFilesAction(const Icon &icon, const QString &text, QObject *parent) : KRecentFilesAction(icon, text, parent) { Action::actionCollection()->addAction("file_open_recent", this); connect(this, SIGNAL(urlSelected(KUrl)), this, SLOT(selectUrl(KUrl))); } void RecentFilesAction::loadEntries() { KRecentFilesAction::loadEntries(KGlobal::config()->group("Recent Files")); setEnabled(true); } void RecentFilesAction::saveEntries() { KRecentFilesAction::saveEntries(KGlobal::config()->group("Recent Files")); KGlobal::config()->sync(); } void RecentFilesAction::selectUrl(const KUrl &url) { emit urlSelected(Url(url)); } void RecentFilesAction::addUrl(const Url &url, const QString &name) { KRecentFilesAction::addUrl(url, name); } void RecentFilesAction::removeUrl(const Url &url) { KRecentFilesAction::removeUrl(url); } #else #include #include RecentFilesAction::RecentFilesAction(QObject *parent) : Action(parent) { createMenu(); } RecentFilesAction::RecentFilesAction(const QString &text, QObject *parent) : Action(text, parent) { createMenu(); } RecentFilesAction::RecentFilesAction(const Icon &icon, const QString &text, QObject *parent) : Action(icon, text, parent) { createMenu(); } RecentFilesAction::~RecentFilesAction() { delete m_recentMenu; } void RecentFilesAction::createMenu() { setObjectName("file_open_recent"); setText(tr("Open &Recent")); setIcon(Icon("document-open-recent")); m_recentMenu = new QMenu(); setMenu(m_recentMenu); } void RecentFilesAction::openRecentFile() { QAction *action = qobject_cast(sender()); if (action) emit urlSelected(Url("file://" + action->data().toString())); } void RecentFilesAction::createRecentFilesList() { m_recentFileActions.clear(); QAction *action; for (int i = 0; i < m_numOfRecentFiles; ++i) { action = new QAction(this); action->setVisible(false); connect(action, SIGNAL(triggered()), this, SLOT(openRecentFile())); m_recentFileActions.append(action); } // when the user has decreased the maximum number of recent files, then we must remove the superfluous entries while (m_recentFilesList.size() > m_numOfRecentFiles) m_recentFilesList.removeLast(); updateRecentFilesList(); m_recentMenu->clear(); m_recentMenu->addActions(m_recentFileActions); } void RecentFilesAction::loadEntries() { QSettings settings; m_numOfRecentFiles = settings.value("RecentFilesNumber", 5).toInt(); m_recentFilesList = settings.value("RecentFiles").toStringList(); setEnabled(true); } void RecentFilesAction::saveEntries() { QSettings settings; if (m_recentFilesList.size() > 0) settings.setValue("RecentFiles", m_recentFilesList); } void RecentFilesAction::updateRecentFilesList() { m_recentMenu->setEnabled(m_recentFilesList.count() > 0); for (int i = 0; i < m_recentFilesList.count(); ++i) { m_recentFileActions[i]->setText(m_recentFilesList.at(i)); m_recentFileActions[i]->setData(m_recentFilesList.at(i)); m_recentFileActions[i]->setVisible(true); } for (int i = m_recentFilesList.count(); i < m_numOfRecentFiles; ++i) m_recentFileActions[i]->setVisible(false); } void RecentFilesAction::addUrl(const QUrl &url, const QString &name) { Q_UNUSED(name); const QString fileName = url.path(); if (m_recentFilesList.contains(fileName)) m_recentFilesList.move(m_recentFilesList.indexOf(fileName), 0); else { if (m_recentFilesList.count() >= m_numOfRecentFiles) m_recentFilesList.removeLast(); m_recentFilesList.prepend(fileName); } updateRecentFilesList(); } void RecentFilesAction::removeUrl(const QUrl &url) { m_recentFilesList.removeAll(url.path()); updateRecentFilesList(); } #endif ktikz/common/utils/colorbutton.h0000660000175000017500000000410611455414612021525 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_COLORBUTTON_H #define KTIKZ_COLORBUTTON_H #ifdef KTIKZ_USE_KDE #include class ColorButton : public KColorButton { Q_OBJECT public: explicit ColorButton(QWidget *parent = 0) : KColorButton(parent) {} explicit ColorButton(const QColor &color, QWidget *parent = 0) : KColorButton(color, parent) {} }; #else #include class ColorButton : public QToolButton { Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor) public: explicit ColorButton(QWidget *parent = 0); explicit ColorButton(const QColor &color, QWidget *parent = 0); QColor color() const; void setColor(const QColor &color); signals: void colorChanged(); protected: void paintEvent(QPaintEvent*); private: QColor m_color; private slots: void showColorDialog(); }; #endif #endif ktikz/common/utils/toggleaction.cpp0000660000175000017500000000476211455414612022175 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "toggleaction.h" #include "action.h" #include "icon.h" #ifdef KTIKZ_USE_KDE #include ToggleAction::ToggleAction(QObject *parent, const QString &name) : KToggleAction(parent) { if (!name.isEmpty()) Action::actionCollection()->addAction(name, this); } ToggleAction::ToggleAction(const QString &text, QObject *parent, const QString &name) : KToggleAction(text, parent) { if (!name.isEmpty()) Action::actionCollection()->addAction(name, this); } ToggleAction::ToggleAction(const Icon &icon, const QString &text, QObject *parent, const QString &name) : KToggleAction(icon, text, parent) { if (!name.isEmpty()) Action::actionCollection()->addAction(name, this); } #else ToggleAction::ToggleAction(QObject *parent, const QString &name) : QAction(parent) { init(name); } ToggleAction::ToggleAction(const QString &text, QObject *parent, const QString &name) : QAction(text, parent) { init(name); } ToggleAction::ToggleAction(const Icon &icon, const QString &text, QObject *parent, const QString &name) : QAction(icon, text, parent) { init(name); } void ToggleAction::init(const QString &name) { if (!name.isEmpty()) setObjectName(name); setCheckable(true); } #endif ktikz/common/utils/selectaction.h0000660000175000017500000000462011455414612021631 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_SELECTACTION_H #define KTIKZ_SELECTACTION_H class Icon; #ifdef KTIKZ_USE_KDE #include class SelectAction : public KSelectAction { Q_OBJECT public: explicit SelectAction(QObject *parent, const QString &name = 0); SelectAction(const QString &text, QObject *parent, const QString &name = 0); SelectAction(const Icon &icon, const QString &text, QObject *parent, const QString &name = 0); }; #else #include class QComboBox; class SelectAction : public QWidgetAction { Q_OBJECT public: explicit SelectAction(QObject *parent, const QString &name = 0); SelectAction(const QString &text, QObject *parent, const QString &name = 0); SelectAction(const Icon &icon, const QString &text, QObject *parent, const QString &name = 0); ~SelectAction(); void setEditable(bool editable); void removeAllActions(); void setItems(const QStringList &items); void setCurrentItem(int index); QStringList items() const; signals: void triggered(const QString &text); private slots: void setCurrentItem(); private: void init(const QString &name); QComboBox *m_selectCombo; }; #endif #endif ktikz/common/utils/selectaction.cpp0000660000175000017500000000715511455414612022172 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "selectaction.h" #include "action.h" #include "icon.h" #ifdef KTIKZ_USE_KDE #include SelectAction::SelectAction(QObject *parent, const QString &name) : KSelectAction(parent) { if (!name.isEmpty()) Action::actionCollection()->addAction(name, this); } SelectAction::SelectAction(const QString &text, QObject *parent, const QString &name) : KSelectAction(text, parent) { if (!name.isEmpty()) Action::actionCollection()->addAction(name, this); } SelectAction::SelectAction(const Icon &icon, const QString &text, QObject *parent, const QString &name) : KSelectAction(icon, text, parent) { if (!name.isEmpty()) Action::actionCollection()->addAction(name, this); } #else #include #include #include SelectAction::SelectAction(QObject *parent, const QString &name) : QWidgetAction(parent) { init(name); } SelectAction::SelectAction(const QString &text, QObject *parent, const QString &name) : QWidgetAction(parent) { init(name); setText(text); } SelectAction::SelectAction(const Icon &icon, const QString &text, QObject *parent, const QString &name) : QWidgetAction(parent) { init(name); setIcon(icon); setText(text); } void SelectAction::init(const QString &name) { if (!name.isEmpty()) setObjectName(name); m_selectCombo = new QComboBox; setDefaultWidget(m_selectCombo); connect(m_selectCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(setCurrentItem())); } SelectAction::~SelectAction() { delete m_selectCombo; } void SelectAction::setEditable(bool editable) { m_selectCombo->setEditable(editable); if (editable) connect(m_selectCombo->lineEdit(), SIGNAL(returnPressed()), this, SLOT(setCurrentItem())); } void SelectAction::setCurrentItem() { const QString text = m_selectCombo->lineEdit()->text(); emit triggered(text); } void SelectAction::removeAllActions() { m_selectCombo->clear(); } void SelectAction::setItems(const QStringList &items) { m_selectCombo->clear(); m_selectCombo->addItems(items); } void SelectAction::setCurrentItem(int index) { m_selectCombo->setCurrentIndex(index); m_selectCombo->lineEdit()->setText(m_selectCombo->currentText()); } QStringList SelectAction::items() const { QStringList itemList; for (int i = 0; i < m_selectCombo->count(); ++i) itemList << m_selectCombo->itemText(i); return itemList; } #endif ktikz/common/utils/action.h0000660000175000017500000000423711455414612020435 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_ACTION_H #define KTIKZ_ACTION_H class Icon; #ifdef KTIKZ_USE_KDE #include class KActionCollection; class Action : public KAction { Q_OBJECT public: explicit Action(QObject *parent, const QString &name = 0); Action(const QString &text, QObject *parent, const QString &name = 0); Action(const Icon &icon, const QString &text, QObject *parent, const QString &name = 0); static KActionCollection *actionCollection(); static void setActionCollection(KActionCollection *actionCollection); private: static KActionCollection *m_actionCollection; }; #else #include class Action : public QAction { Q_OBJECT public: explicit Action(QObject *parent, const QString &name = 0); Action(const QString &text, QObject *parent, const QString &name = 0); Action(const Icon &icon, const QString &text, QObject *parent, const QString &name = 0); }; #endif #endif ktikz/common/utils/toggleaction.h0000660000175000017500000000411011455414612021625 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_TOGGLEACTION_H #define KTIKZ_TOGGLEACTION_H class Icon; #ifdef KTIKZ_USE_KDE #include class ToggleAction : public KToggleAction { Q_OBJECT public: explicit ToggleAction(QObject *parent, const QString &name = 0); ToggleAction(const QString &text, QObject *parent, const QString &name = 0); ToggleAction(const Icon &icon, const QString &text, QObject *parent, const QString &name = 0); }; #else #include class ToggleAction : public QAction { Q_OBJECT public: explicit ToggleAction(QObject *parent, const QString &name = 0); ToggleAction(const QString &text, QObject *parent, const QString &name = 0); ToggleAction(const Icon &icon, const QString &text, QObject *parent, const QString &name = 0); private: void init(const QString &name); }; #endif #endif ktikz/common/utils/recentfilesaction.h0000660000175000017500000000525411455414612022661 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_RECENTFILESACTION_H #define KTIKZ_RECENTFILESACTION_H class Icon; class Url; #ifdef KTIKZ_USE_KDE #include class KActionCollection; class RecentFilesAction : public KRecentFilesAction { Q_OBJECT public: RecentFilesAction(QObject *parent); RecentFilesAction(const QString &text, QObject *parent); RecentFilesAction(const Icon &icon, const QString &text, QObject *parent); void createRecentFilesList() {} void loadEntries(); void saveEntries(); void addUrl(const Url &url, const QString &name = QString()); void removeUrl(const Url &url); signals: void urlSelected(const Url &url); private slots: void selectUrl(const KUrl &url); }; #else #include "action.h" class RecentFilesAction : public Action { Q_OBJECT public: RecentFilesAction(QObject *parent); RecentFilesAction(const QString &text, QObject *parent); RecentFilesAction(const Icon &icon, const QString &text, QObject *parent); ~RecentFilesAction(); void createRecentFilesList(); void loadEntries(); void saveEntries(); void addUrl(const QUrl &url, const QString &name = QString()); void removeUrl(const QUrl &url); signals: void urlSelected(const Url &url); private slots: void openRecentFile(); private: void createMenu(); void updateRecentFilesList(); QMenu *m_recentMenu; QList m_recentFileActions; QStringList m_recentFilesList; int m_numOfRecentFiles; }; #endif #endif ktikz/common/utils/filedialog.h0000660000175000017500000000500311455414612021247 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_FILEDIALOG_H #define KTIKZ_FILEDIALOG_H #include "url.h" #ifdef KTIKZ_USE_KDE #include class FileDialog : public KFileDialog { public: explicit FileDialog(QWidget *parent = 0, const QString &caption = QString(), const QString &directory = QString(), const QString &filter = QString()) : KFileDialog(directory, filter, parent, 0) { Q_UNUSED(caption) } static Url getOpenUrl(QWidget *parent = 0, const QString &caption = QString(), const Url &dir = Url(), const QString &filter = QString()); static Url getSaveUrl(QWidget *parent = 0, const QString &caption = QString(), const Url &dir = Url(), const QString &filter = QString()); }; #else #include class FileDialog : public QFileDialog { public: explicit FileDialog(QWidget *parent = 0, const QString &caption = QString(), const QString &directory = QString(), const QString &filter = QString()) : QFileDialog(parent, caption, directory, filter) {} static Url getOpenUrl(QWidget *parent = 0, const QString &caption = QString(), const Url &dir = Url(), const QString &filter = QString()); static Url getSaveUrl(QWidget *parent = 0, const QString &caption = QString(), const Url &dir = Url(), const QString &filter = QString()); }; #endif #endif ktikz/common/utils/url.cpp0000660000175000017500000000335011455414612020310 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "url.h" #ifdef KTIKZ_USE_KDE Url::Url() : KUrl() { } Url::Url(const QString &fileName) : KUrl(fileName) { } Url::Url(const KUrl &url) : KUrl(url) { } #else #include Url::Url() : QUrl() { } Url::Url(const QString &fileName) : QUrl(fileName) { } Url::Url(const QUrl &url) : QUrl(url) { } QString Url::fileName() const { return QFileInfo(QUrl::path()).fileName(); } QString Url::pathOrUrl() const { return QUrl::path(); } #endif ktikz/common/utils/action.cpp0000660000175000017500000000521011455414612020760 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "action.h" #include "icon.h" #ifdef KTIKZ_USE_KDE #include KActionCollection *Action::m_actionCollection = 0; Action::Action(QObject *parent, const QString &name) : KAction(parent) { if (m_actionCollection && !name.isEmpty()) m_actionCollection->addAction(name, this); } Action::Action(const QString &text, QObject *parent, const QString &name) : KAction(text, parent) { if (m_actionCollection && !name.isEmpty()) m_actionCollection->addAction(name, this); } Action::Action(const Icon &icon, const QString &text, QObject *parent, const QString &name) : KAction(icon, text, parent) { if (m_actionCollection && !name.isEmpty()) m_actionCollection->addAction(name, this); } KActionCollection *Action::actionCollection() { return m_actionCollection; } void Action::setActionCollection(KActionCollection *actionCollection) { m_actionCollection = actionCollection; } #else Action::Action(QObject *parent, const QString &name) : QAction(parent) { if (!name.isEmpty()) setObjectName(name); } Action::Action(const QString &text, QObject *parent, const QString &name) : QAction(text, parent) { if (!name.isEmpty()) setObjectName(name); } Action::Action(const Icon &icon, const QString &text, QObject *parent, const QString &name) : QAction(icon, text, parent) { if (!name.isEmpty()) setObjectName(name); } #endif ktikz/common/utils/standardaction.cpp0000660000175000017500000002711011455414612022504 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #include "standardaction.h" #ifdef KTIKZ_USE_KDE #include #include #include #else #include #endif #include "icon.h" namespace StandardAction { #ifdef KTIKZ_USE_KDE // XXX the following is an ugly hack, but I don't know how to promote a KAction to an Action Action *copyAction(KAction *action, const QObject *recvr, const char *slot) { Action *newAction = new Action(action->icon(), action->text(), action->parent()); newAction->setShortcut(action->shortcut()); newAction->setData(action->data()); newAction->setObjectName(action->objectName()); QObject::connect(newAction, SIGNAL(triggered()), recvr, slot); Action::actionCollection()->addAction(newAction->objectName(), newAction); return newAction; } Action *openNew(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::openNew(recvr, slot, parent), recvr, slot); } /* KAction *openNew(const QObject *recvr, const char *slot, QObject *parent) { KAction *action = KStandardAction::openNew(recvr, slot, parent); Action::actionCollection()->addAction(action->objectName(), action); return action; } */ Action *open(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::open(recvr, slot, parent), recvr, slot); } RecentFilesAction *openRecent(const QObject *recvr, const char *slot, QObject *parent) { KRecentFilesAction *action = KStandardAction::openRecent(recvr, slot, parent); RecentFilesAction *newAction = new RecentFilesAction(action->icon(), action->text(), action->parent()); newAction->setShortcut(action->shortcut()); newAction->setData(action->data()); newAction->setObjectName(action->objectName()); newAction->setToolBarMode(KRecentFilesAction::MenuMode); newAction->setToolButtonPopupMode(QToolButton::MenuButtonPopup); QObject::connect(newAction, SIGNAL(urlSelected(Url)), recvr, slot); Action::actionCollection()->addAction(newAction->objectName(), newAction); return newAction; } /* KRecentFilesAction *openRecent(const QObject *recvr, const char *slot, QObject *parent) { KRecentFilesAction *action = KStandardAction::openRecent(recvr, slot, parent); action->setToolBarMode(KRecentFilesAction::MenuMode); action->setToolButtonPopupMode(QToolButton::MenuButtonPopup); Action::actionCollection()->addAction(action->objectName(), action); return action; } */ Action *save(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::save(recvr, slot, parent), recvr, slot); } Action *saveAs(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::saveAs(recvr, slot, parent), recvr, slot); } Action *close(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::close(recvr, slot, parent), recvr, slot); } Action *quit(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::quit(recvr, slot, parent), recvr, slot); } Action *undo(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::undo(recvr, slot, parent), recvr, slot); } Action *redo(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::redo(recvr, slot, parent), recvr, slot); } Action *cut(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::cut(recvr, slot, parent), recvr, slot); } Action *copy(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::copy(recvr, slot, parent), recvr, slot); } Action *paste(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::paste(recvr, slot, parent), recvr, slot); } Action *selectAll(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::selectAll(recvr, slot, parent), recvr, slot); } Action *find(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::find(recvr, slot, parent), recvr, slot); } Action *findNext(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::findNext(recvr, slot, parent), recvr, slot); } Action *findPrev(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::findPrev(recvr, slot, parent), recvr, slot); } Action *replace(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::replace(recvr, slot, parent), recvr, slot); } Action *gotoLine(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::gotoLine(recvr, slot, parent), recvr, slot); } Action *zoomIn(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::zoomIn(recvr, slot, parent), recvr, slot); } Action *zoomOut(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::zoomOut(recvr, slot, parent), recvr, slot); } Action *preferences(const QObject *recvr, const char *slot, QObject *parent) { return copyAction(KStandardAction::preferences(recvr, slot, parent), recvr, slot); } #else Action *createAction(int which, const QObject *recvr, const char *slot, QObject *parent) { QString iconName; QString text; QKeySequence::StandardKey key = QKeySequence::UnknownKey; switch (which) { case 0: iconName = "document-new"; text = QObject::tr("&New"); key = QKeySequence::New; break; case 1: iconName = "document-open"; text = QObject::tr("&Open..."); key = QKeySequence::Open; break; case 2: iconName = "document-save"; text = QObject::tr("&Save"); key = QKeySequence::Save; break; case 3: iconName = "document-save-as"; text = QObject::tr("Save &As..."); break; case 4: iconName = "window-close"; text = QObject::tr("&Close"); key = QKeySequence::Close; break; case 5: iconName = "application-exit"; text = QObject::tr("&Quit"); break; case 6: iconName = "edit-undo"; text = QObject::tr("&Undo"); key = QKeySequence::Undo; break; case 7: iconName = "edit-redo"; text = QObject::tr("Re&do"); key = QKeySequence::Redo; break; case 8: iconName = "edit-cut"; text = QObject::tr("Cu&t"); key = QKeySequence::Cut; break; case 9: iconName = "edit-copy"; text = QObject::tr("&Copy"); key = QKeySequence::Copy; break; case 10: iconName = "edit-paste"; text = QObject::tr("&Paste"); key = QKeySequence::Paste; break; case 11: text = QObject::tr("Select &All"); key = QKeySequence::SelectAll; break; case 12: iconName = "edit-find"; text = QObject::tr("&Find..."); key = QKeySequence::Find; break; case 13: iconName = "go-down"; text = QObject::tr("Find &Next"); key = QKeySequence::FindNext; break; case 14: iconName = "go-up"; text = QObject::tr("Find Pre&vious"); key = QKeySequence::FindPrevious; break; case 15: text = QObject::tr("&Replace..."); key = QKeySequence::Replace; break; case 16: iconName = "go-jump"; text = QObject::tr("&Go to Line..."); break; case 17: iconName = "zoom-in"; text = QObject::tr("Zoom &In"); key = QKeySequence::ZoomIn; break; case 18: iconName = "zoom-out"; text = QObject::tr("Zoom &Out"); key = QKeySequence::ZoomOut; break; case 19: iconName = "configure"; text = QObject::tr("&Configure %1...").arg(QCoreApplication::applicationName()); break; } Action *action; if (!iconName.isEmpty()) action = new Action(Icon(iconName), text, parent); else action = new Action(text, parent); if (which == 5) action->setShortcut(QObject::tr("Ctrl+Q", "File|Quit")); else if (which == 16) action->setShortcut(QObject::tr("Ctrl+G", "Edit|Go to Line")); else if (which != 3 && which != 19) action->setShortcut(key); QObject::connect(action, SIGNAL(triggered()), recvr, slot); return action; } Action *openNew(const QObject *recvr, const char *slot, QObject *parent) { return createAction(0, recvr, slot, parent); } Action *open(const QObject *recvr, const char *slot, QObject *parent) { return createAction(1, recvr, slot, parent); } RecentFilesAction *openRecent(const QObject *recvr, const char *slot, QObject *parent) { RecentFilesAction *action = new RecentFilesAction(Icon("document-open-recent"), QObject::tr("&Open Recent"), parent); QObject::connect(action, SIGNAL(urlSelected(Url)), recvr, slot); return action; } Action *save(const QObject *recvr, const char *slot, QObject *parent) { return createAction(2, recvr, slot, parent); } Action *saveAs(const QObject *recvr, const char *slot, QObject *parent) { return createAction(3, recvr, slot, parent); } Action *close(const QObject *recvr, const char *slot, QObject *parent) { return createAction(4, recvr, slot, parent); } Action *quit(const QObject *recvr, const char *slot, QObject *parent) { return createAction(5, recvr, slot, parent); } Action *undo(const QObject *recvr, const char *slot, QObject *parent) { return createAction(6, recvr, slot, parent); } Action *redo(const QObject *recvr, const char *slot, QObject *parent) { return createAction(7, recvr, slot, parent); } Action *cut(const QObject *recvr, const char *slot, QObject *parent) { return createAction(8, recvr, slot, parent); } Action *copy(const QObject *recvr, const char *slot, QObject *parent) { return createAction(9, recvr, slot, parent); } Action *paste(const QObject *recvr, const char *slot, QObject *parent) { return createAction(10, recvr, slot, parent); } Action *selectAll(const QObject *recvr, const char *slot, QObject *parent) { return createAction(11, recvr, slot, parent); } Action *find(const QObject *recvr, const char *slot, QObject *parent) { return createAction(12, recvr, slot, parent); } Action *findNext(const QObject *recvr, const char *slot, QObject *parent) { return createAction(13, recvr, slot, parent); } Action *findPrev(const QObject *recvr, const char *slot, QObject *parent) { return createAction(14, recvr, slot, parent); } Action *replace(const QObject *recvr, const char *slot, QObject *parent) { return createAction(15, recvr, slot, parent); } Action *gotoLine(const QObject *recvr, const char *slot, QObject *parent) { return createAction(16, recvr, slot, parent); } Action *zoomIn(const QObject *recvr, const char *slot, QObject *parent) { return createAction(17, recvr, slot, parent); } Action *zoomOut(const QObject *recvr, const char *slot, QObject *parent) { return createAction(18, recvr, slot, parent); } Action *preferences(const QObject *recvr, const char *slot, QObject *parent) { return createAction(19, recvr, slot, parent); } #endif } ktikz/common/utils/lineedit.h0000660000175000017500000000207511455414612020753 0ustar fhackenbergerfhackenberger/**************************************************************************** ** ** Copyright (c) 2007 Trolltech ASA ** Modified (c) 2009 by Glad Deschrijver ** ** Use, modification and distribution is allowed without limitation, ** warranty, liability or support of any kind. ** ****************************************************************************/ #ifndef KTIKZ_LINEEDIT_H #define KTIKZ_LINEEDIT_H #ifdef KTIKZ_USE_KDE #include class LineEdit : public KLineEdit { Q_OBJECT public: explicit LineEdit(const QString &text, QWidget *parent = 0); LineEdit(QWidget *parent = 0); }; #else #include class QToolButton; class LineEdit : public QLineEdit { Q_OBJECT public: explicit LineEdit(const QString &text, QWidget *parent = 0); LineEdit(QWidget *parent = 0); virtual QSize sizeHint() const; protected: void resizeEvent(QResizeEvent *event); private slots: void updateClearButton(const QString &text); private: void init(); QToolButton *m_clearButton; }; #endif #endif // LINEEDIT_H ktikz/common/utils/url.h0000660000175000017500000000322211455414612017753 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_URL_H #define KTIKZ_URL_H #ifdef KTIKZ_USE_KDE #include class Url : public KUrl { public: Url(); Url(const QString &fileName); Url(const KUrl &url); }; #else #include class Url : public QUrl { public: Url(); Url(const QString &fileName); Url(const QUrl &url); QString fileName() const; QString pathOrUrl() const; }; #endif #endif ktikz/common/utils/standardaction.h0000660000175000017500000000624111455414612022153 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_STANDARDACTION_H #define KTIKZ_STANDARDACTION_H #include "action.h" #include "recentfilesaction.h" namespace StandardAction { #ifdef KTIKZ_USE_KDE Action *copyAction(KAction *action, const QObject *recvr, const char *slot); #else Action *createAction(int which, const QObject *recvr, const char *slot, QObject *parent); #endif Action *openNew(const QObject *recvr, const char *slot, QObject *parent); Action *open(const QObject *recvr, const char *slot, QObject *parent); RecentFilesAction *openRecent(const QObject *recvr, const char *slot, QObject *parent); Action *save(const QObject *recvr, const char *slot, QObject *parent); Action *saveAs(const QObject *recvr, const char *slot, QObject *parent); Action *close(const QObject *recvr, const char *slot, QObject *parent); Action *quit(const QObject *recvr, const char *slot, QObject *parent); Action *undo(const QObject *recvr, const char *slot, QObject *parent); Action *redo(const QObject *recvr, const char *slot, QObject *parent); Action *cut(const QObject *recvr, const char *slot, QObject *parent); Action *copy(const QObject *recvr, const char *slot, QObject *parent); Action *paste(const QObject *recvr, const char *slot, QObject *parent); Action *selectAll(const QObject *recvr, const char *slot, QObject *parent); Action *find(const QObject *recvr, const char *slot, QObject *parent); Action *findNext(const QObject *recvr, const char *slot, QObject *parent); Action *findPrev(const QObject *recvr, const char *slot, QObject *parent); Action *replace(const QObject *recvr, const char *slot, QObject *parent); Action *gotoLine(const QObject *recvr, const char *slot, QObject *parent); Action *zoomIn(const QObject *recvr, const char *slot, QObject *parent); Action *zoomOut(const QObject *recvr, const char *slot, QObject *parent); Action *preferences(const QObject *recvr, const char *slot, QObject *parent); } #endif ktikz/common/utils/colordialog.h0000660000175000017500000000427111455414612021454 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_COLORDIALOG_H #define KTIKZ_COLORDIALOG_H #ifdef KTIKZ_USE_KDE #include class ColorDialog : public KColorDialog { public: ColorDialog(QWidget *parent) : KColorDialog(parent) {} static QColor getColor(bool *ok, const QColor &color, QWidget *parent) { Q_UNUSED(parent); QColor newColor = color; const int result = KColorDialog::getColor(newColor); *ok = (result == KColorDialog::Accepted); return newColor; } }; #else #include class ColorDialog : public QColorDialog { public: // Commented out for Qt 4.5 compatibility (should not be required, // as we don't instantiate ColorDialog directly anyway //ColorDialog(QWidget *parent) : QColorDialog(parent) {} static QColor getColor(bool *ok, const QColor &color, QWidget *parent) { QColor newColor = QColorDialog::getColor(color, parent); *ok = newColor.isValid(); return newColor; } }; #endif #endif ktikz/common/utils/icon.h0000660000175000017500000000356711455414612020115 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2009 by Glad Deschrijver * * * * * * 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 . * ***************************************************************************/ #ifndef KTIKZ_ICON_H #define KTIKZ_ICON_H #ifdef KTIKZ_USE_KDE #include class Icon : public KIcon { public: Icon(const QString &iconName) : KIcon(iconName) {} Icon(const QIcon ©) : KIcon(copy) {} Icon() : KIcon() {} }; #else #include class Icon : public QIcon { public: #if QT_VERSION >= 0x040600 Icon(const QString &iconName) : QIcon(QIcon::fromTheme(iconName, QIcon(":/icons/" + iconName + ".png"))) {} #else Icon(const QString &iconName) : QIcon(":/icons/" + iconName + ".png") {} #endif Icon(const QIcon ©) : QIcon(copy) {} Icon() : QIcon() {} }; #endif #endif ktikz/common/utils/colorbutton.cpp0000660000175000017500000000544311455414612022065 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Glad Deschrijver * * * * * * Original code from SpeedCrunch: * * Copyright (C) 2004 Ariya Hidayat * * (http://code.google.com/p/speedcrunch/) * * licensed under GPL v2 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 . * ***************************************************************************/ #include "colorbutton.h" #ifndef KTIKZ_USE_KDE #include #include #include #include ColorButton::ColorButton(QWidget *parent) : QToolButton(parent) { connect(this, SIGNAL(clicked()), this, SLOT(showColorDialog())); } ColorButton::ColorButton(const QColor &color, QWidget *parent) : QToolButton(parent) { setColor(color); connect(this, SIGNAL(clicked()), this, SLOT(showColorDialog())); } void ColorButton::showColorDialog() { const QColor newColor = QColorDialog::getColor(m_color, this); if (newColor.isValid()) setColor(newColor); } QColor ColorButton::color() const { return m_color; } void ColorButton::setColor(const QColor &color) { m_color = color; emit colorChanged(); update(); } void ColorButton::paintEvent(QPaintEvent *e) { QToolButton::paintEvent(e); if (!isEnabled()) return; QRect r = rect(); r.adjust(5, 5, -5, -5); QPainter painter(this); const QColor borderColor(QApplication::style()->standardPalette().color(QPalette::Normal, QPalette::Dark)); painter.setPen(borderColor); painter.drawRect(r); r.adjust(1, 1, 0, 0); painter.fillRect(r, m_color); } #endif ktikz/INSTALL0000660000175000017500000000521311455414615015406 0ustar fhackenbergerfhackenbergerThe following are required for compilation: - an ordinary C++ development environment (g++, make, C++ libraries and headers, ...) - cmake (if you want to install the KPart) - a standard LaTeX environment - a Qt 4 development environment (libraries, headers, qmake, ...): only QtCore, QtGui and QtXml are required, at least in version 4.4 - the poppler-qt4 libraries and headers - the kdelibs development environment (only if you want KDE integration and the KPart), at least in version 4.3 - the LaTeX pgf package (which includes TikZ) - the LaTeX preview package In Ubuntu you would obtain those by installing the following packages: - build-essential - cmake (if you want to install the KDE version) - libqt4-dev - qt4-dev-tools - libpoppler-qt4-dev - kdelibs5-dev (only if you want KDE integration and the KPart) - pgf - preview-latex-style Install the Qt-only (qtikz) application (using qmake): ------------------------------------------------------ 1. Edit the paths in conf.pri 2. Run the following commands (this will create an executable named qtikz): mkdir buildqt cd buildqt qmake ../qtikz.pro make sudo make install sudo update-mime-database /usr/share/mime Note that qmake will tell you where the files will be installed. If you don't like the installation directories, you can change them in the file conf.pri before running make. Make sure to make the changes in conf.pri before running make. In order to uninstall qtikz run the following commands in the build directory: sudo make uninstall sudo update-mime-database /usr/share/mime Install the KDE (ktikz) application and the KPart (using cmake): ---------------------------------------------------------------- Run the following commands (this will create an executable named ktikz and a KPart which will be loaded when clicking a *.pgf or *.tikz file in Konqueror): mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix` .. make sudo make install Because a new mimetype (text/x-pgf) is added to the system, as a user one may additionally have to run kbuildsycoca4 or restart KDE so that konqueror uses the KPart for this mimetype. In order to uninstall ktikz run the following commands in the build directory (the paths in the last two commands depend of course on where the files were installed, see the output of the make uninstall command for the correct paths): sudo make uninstall sudo update-mime-database /usr/share/mime You may additionally run the following command to remove the installation directories created during "make install" (WARNING: this will also remove the directories if they are not empty, use at your own risk): sudo make uninstalldirs ktikz/HACKING0000660000175000017500000000513211455414615015344 0ustar fhackenbergerfhackenbergerThis file contains notes for developers of ktikz. Generating the translation source files: ---------------------------------------- When you add/change/remove translatable strings in the C++ code, you must recreate the translation source files (app/*.ts and po/*.po). You must build the Qt-only version as described in INSTALL (but don't do 'make install' yet). Then run make ts to generate an updated version of the .ts files. Note that running lupdate app.pro in the app directory is only sufficient if you have not changed the file app/tikzcommands.xml (if you have changed this file, 'make ts' must be run so that the translatable strings in this file are also added to the .ts files). If you build the KDE version, the above steps must also be accomplished, but additionally you must run ./extract_messages.sh in the po directory to get the strings that only appear in the KDE version. The app/*.ts files can be edited using Qt Linguist, the po/*.po files can be edited using KDE's Lokalize. After editing the translation source files, they will be compiled and installed when you run (both for the Qt-only and the KDE version): make sudo make install Generating the documentation: ----------------------------- For the KDE version, all you need to do is edit the doc/*.docbook files. For the Qt-only version, the procedure is more complicated. After you have edited the *.docbook files, you must run ./generate-qt-doc.sh in the doc directory in order to regenerate the file doc/index.html. However, if the documentation is edited or if some features are added, then it might be necessary to change the "sed" lines in generate-qt-doc.sh before running this script. After generating the documentation, they will be compiled and installed when you run (both for the Qt-only and the KDE version): make sudo make install Generating the icons: --------------------- The app/icons/qtikz.svg and app/icons/ktikz.svg icons are derived from the accessories-text-editor icon in KDE's Oxygen icon set, in Inkscape the "Lorem ipsum..." text is removed and the QTikZ/KTikZ text is added using the Prociono font (http://www.fontsquirrel.com/fonts/Prociono). The PNG versions of these icons in different sizes are all obtained by opening the SVG versions in the GIMP, selecting the appropriate size when the SVG file is opened and saving the file as PNG. The Windows qtikz.ico version is obtained by converting qtikz.svg online at http://www.convertico.com (the free png2ico does not give a result of similar quality). The other icons (except qt-logo-22.png which is obtained from Qt) are obtained from KDE's Oxygen icon set. ktikz/LICENSE.GPL20000660000175000017500000004377411455414614016102 0ustar fhackenbergerfhackenberger GNU GENERAL PUBLIC LICENSE KTikZ is Copyright (C) 2007-2010 Florian Hackenberger and Glad Deschrijver. Contact: Florian Hackenberger (florian@hackenberger.at) Glad Deschrijver (glad.deschrijver@gmail.com) You may use, distribute and copy KTikZ under the terms of GNU General Public License version 2, which is displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, 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 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., 51 Franklin St, 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 Library General Public License instead of this License. ktikz/poppler-win32/0000771000175000017500000000000011455415074016775 5ustar fhackenbergerfhackenbergerktikz/templates/0000771000175000017500000000000011455415074016352 5ustar fhackenbergerfhackenbergerktikz/templates/cpp0000660000175000017500000000267011455414612017061 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * florian@hackenberger.at * * * * 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. * ***************************************************************************/ ktikz/templates/h0000660000175000017500000000267011455414612016526 0ustar fhackenbergerfhackenberger/*************************************************************************** * Copyright (C) 2007 by Florian Hackenberger * * florian@hackenberger.at * * * * 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. * ***************************************************************************/ ktikz/screenshot_v0.2.png0000660000175000017500000030112211455414615020003 0ustar fhackenbergerfhackenbergerPNG  IHDRd^y IDATxwxTU>iF$:*4uյ bUQĵ`muX@+E!O? Ly0ss{us(?#̼!B!m=fx:;6"!B!8F̼=(g^x:)vtLB!BqLع}+٫~!lB!BsLJ (ku%QrB!-&dvJ*+4hP+ټy3Ȩ#\!B!h+ RrefAl޼sTWB!ش~wD*N, n>5xLѡ vܩg5ZGmB$drB!ǦAƳgL9V_~EI!tM V֚WU}R I)W!Bql2$g㏣F:?,YFT̟0ݶJlD[T$d+B!8vuILV"!!ݒٴFLYZ~j_gF0>HyJ6 =d7aR1 13o|p-|1{smNm!TB!DS w> DFԍ+(b)j*C'R+*N9mz}zfgn$Yx핬[3g.AQY7Rĝ3|/j {/ۙ81Ɛ17o`NJ|ky7+f׷)סOf&v#>pcǍ z)YiętbJC7M3h{6WeZ +5'ޔ1*}@aʼngx -ΏWrE1e$_mԒ왷!$i 5 V|-#\p+] +!B*K PEAhR?jxY꼟/!ojOVCl%5m+ɤ3)vRIlj΃Xz㏷?#==xcޗ'Dvg/G7attVCCX}l?2FSTrF-67]ӓ1֐epz;#*{u?}N{'`2(To9n]s4E66~ZB1L?u ʢtIٴfGit?l,^SL?%^>2+zִ]5;3Ě\-W>n*֘\Ik 0BcSyI[V3q)PV\? @/cYmiV^e?P7LVn~XjE㚺bc]}V6\4os7k4Fxܶ?cr1u@u`>o9K51ٻÅuq奇A *lD(- uzh~-`bAdN]{~N)g2VW'ql4<17tn(fȄ2הѐ\jÌ[+0mMM#Աu_KNVQ*ϪU+rI !Ƅ^` v4>nME^烵XR27/ҍ\:" v<ĤD > &vVqh4ޥ߀&TOB!86(!ҽv{T`TQU]~#}ظJs>z%˗|؉smH{\6dt3U⻏S>I(OmgRf*3͛u{}wC4j(7ΰuTao$G^˜/熋2 Drl|NʟelٺDc17t8&mYFllܴ y Nq,'w" +;m jf_M#Աm^3C^qMy~`]5u>w&=ce&uh4~oך!cο1?CQ4bB֮],T_gIp#u˿`J[9$Z!G6kr`!+kTgA'kzLP^^N޾$LoRʙ^θF]R  qXm޼)ݎrc݊HKMӍV'"6h-7P\ZB K<% DYbqW{kE9vLLBWRЛj7p& s/‹JLj&Sg#%]nbPWoYe8^tHb,9',MTUm2j_HYAiJmʶ`l ou۰2oP'аGoP-6%nWeRUQDQ%cdtPm(`n֪J\ZStWљ1!B! esp Bc*1ToTTTw~4 D[,P^WUWC ,K2Ǣ( `0Gb4V_n=hh5PbzںI$)zbhj5UcFQ:uiMS48Lf3 pzMT:H)^&KR17DDrʸDtz}񊆨#sYQ&]駍cl-lI`ZX(h@ ZOSvlS')'fA_ݳXYVJtl\džj`2!u gMLbBh4(*(Z=ZgFbR( MB! 9{,)jh VeonrTlcG_١²:ASW '=d!&" }ђ Ob HH)).%_N@R\$1 !Bܷ.lٲ5,I[킢(G\G?^X>h!? [*90 Ħ#b`:I!BB&d!@7oiu%іrvMPBb㻶Y|I)#ch(Ct#1R)B!Dg2!&"|:=u}ڒ! ]BOB!HU/!+/-B!BPgWyi1]ضsB!XG?IMZB!B4B!B$!B!B" B!BtIȄB!HB&B!D2!B! m/gꨩ,/oZZ3&''B!OȎ#1`B!|9S3HJ˘rƲh"Ƅ1ʖ⋧)I_mx+qJF+歟PP@mk\ ]_I(B!1Fת;SЙb>GW_bpjjlk>6R!BwȢ _Ͼ H=SǺ oCF[`X4zfNd拿Q @Ϳ35=l ݸ #N9/ǝs=O嗌6Ab /_ڋr~fi׳`SN9պo>ksL;gyf!IK#}9F*ۧ&ʗ3u${d$0|5Q!Bӎ,eܿin7DìWRV6<OnB!Z٪m7|3cS#1o˪2nG/gDWđxPocpS-s_?#O㊇&9kk1ѩ]QC6W>t gC\s%B,g lgHT+o$z${ML}J4aJŌGû춅!^!B!H琕/BmVb(TnG4gk7c*n6f/ο)_}3U\x1mumt.OFupWٱd0qD Wn緐1>2V V˙:ͽ&. k_CD;QAB!h]Bh& >gFZGMcJ\LI@\%(q]ha]O`e~1]1*N]l*&xx\l.l?y"[Xgs4, hl*n[M!Bh9d~̜ʽiON2YjcDv|=9p݇+p6$]ydkaƝo,泗g)hqFV/n^/P}SDe0sA^qzGpc@tf[-; p;oܓED{+B!D (g^x:),g1"g\QȜoc`{,x.5sB!~b1]ط{٫~i嵴i(ɧ)AWG™g˹{ۉoУ ^6B!8!L˝)@96"z27x?s(BqM*Ga{/j%*2zU}/!UWеk !77Ʉfv0L&"""[r5אOYY( /RX _X,STTD|||bi\F[^$'Ti4W皦VZU{=.fsmϘ/ٜ9sj@u[gee1nܸV/B!:f5wՠ[s=FlF: Ǿī)wg1Y7!y][rkdR\^% Ml. Ky3G* <7NNC&`Zmmnm@Z.]PUUaIl.FEpAޤC_~iuB}vh4h4j/$''hPn!BqdhUϘTBjO}=,YD u8I~Wu 2D+Ud3tڇw~^Y8}}Do^Y.]f _,Ծ> ưb ^GFF']iӦ)/B!đMWYnxB` IDAT"j (I';Yu}:qOMJB!SQ“]8߃ۣFǍjut:j=*YYY8Nl6zш|x}5MUUɘNn?xl.F#kNrss !B~,R3![6+--@cӣJcuypۭxCuA!A^˸ ֭JrrrY"GUU ZK0jINNf߾}Á^ߺr dXX,.2233úFzzWTeǎ0xp$cB!Gv[e_ajp5H31a-}w^gϞhX`n/8ltvɦMؘ=z|{E!..}=񩬬n rHLLdӦ\s,E !BeŦRU2z=YYC\袋.b˖-?%׊Oҭ[7ZO[AzzzbÆ uz<{|A7`O\y$cB!ǀvYe{|7MڷW^ѣY7t.op8j_l6l6vǃ`h4b61LfFckٌNkqbq嗇5p$9-i__orծ,t:q\VEt z=љb89kW]LUUJb׮!{Ɍl[/[O4 uvP]\0?,zߵg1&ٌ9y Wa (ߺL)><4ãiLb:#M(:>Y/ȄQ-}$,_ 12Hz'B!:-YeQ!MXeQO>$a6gݏ fⴇ&ggI>%Nigsqk98K(gC fv++.Op:}OCh*~> XPBk7L],xy1W<µb.un1Nψ.#qP  c~bUʖC;X;Rm:+Q{q@iA/n"MHB&G&-{XC6&9K1C\"`bpRT?ot[eU'u͡_CŒ9e=+( jC"w/1sZ*u}}o2W@(fmp؏}ǐa,guQ9zA`TqҶnov1Wpq0#ҹKW(ʢ"D|nZAMUί~ɮl"s^Ym%/s:VכFG,E)G,IȄ6yuO,vngL>Nx<}1̊g WF0`wMMt\B.O +z޳do=1Ȋز_UyE tm\ /_{S9g ʬ, c*\98>~cé?-|Sa]{ ">CozN-<>Q_Dfs ]&6"aS<&z@"B!!h Pg\s#Us;Y~=#yΎj^.3"]1q`?3r15&1Vb91C[feK4a^wRZ|7ڹ o(B!:W_}Ś5kZt#<8ZBҠ 03<5a !1i۶m|x҉¾^K;K2N0ppF6waƔګhm.e-+{G/_nyK.IY2% vH2&B!Dk ACSZ,+{gep#;/|4;΍!p1qB^Ž> ,.\R!đd͚5-:gnaH!Dc::z̢NH2{wtB!Qj׷w޶ D!D³^B!BfL!B!:H(BiE!GzȄB!?!+[ʤ|8ch ׭;<ǣ !BNxaWb3HL7yOgS*eK( J\AK^3Ϳ߄B!2 'dܙ5G9o 0[KnUxm=TDc ,.b'}?TՊb'TE-i5hi۷=MǷ/0L"DvMϲ]t`Bdt c۹n!b6O!Di8!3vZPL^`4Uѓ0`]=<l*0օ;TAϸB.M~ۗxʚ !Bjdb߫)Rz,ٻ~ߨIRٛ)/o]~wJHluY؏);\En>,"1F2XUEEAi( Qǜqͫ y}Ϭ8ZCQPP m'SOO%+1ctc- WI=G+˂EәߑjF^xEH´cX=:u vig/we^v}CSm@g!;>t%FbϮw97?|YWi2szM8<}oO1ďM:0Hc)#ƪsk1B!ǸF2KtRrf&j6I΢t~a2踚^UEUm;/OPn.eE%Q{b.H ='bW/ٜZ66>[Ob<,y\r/?zl!9XB@*Oɞw"OsZiq.t}.9> U 6EVl]D鎏#L{` FT?9?geﻀ'fɮ23y+lUXkcߝDŽsߜ-+M[M6xn2;jh\Xܾ~"sVQ}!*>fw4z7Eݧ=fS Eb\6+r~Tlavex L?~Ҳ,O^V#Bq ktQmq\`;1)[/[O4 uvP]\0?,z@Po'{z|*PLs gqIq*eˡuܝnIuΊ}TY&cA ٯf3ԉ6RLnO'~*ċ{q@iA5mb{;N]vGD+ahr ]Pp0#7ٷJ~y+&')ʀVI²CڱsqaatB`Pa>L|CK7CE2t*(o_d zNl1B!ǰ&,{o84h a? %Bю;d.e@GV]kZ|p3?jNuSQ0EEöy'kCg xX GV;u4~44&_ [ĝ=嫹grCV]?µ5dW!B]2%frywCj@nK'X6ҳb~!ޛ9WPf=og^ՏܹF&r];9ŧS֬bs%ϞߍkqtNMlD"æϧxM 7OHA'dFքL\sK,\5YO6;l??-a] og㢪ǏFuwH5W4LjYA݌,p4@\5`対% k " ia< |9M}qwm੮θL}bvq]q {}SW?{9%zhN5v2:ݦvw,ﱇ~p/AM)^)dP\JpsXҗVNt{.f@,xAXC&|HFOR6\%9YRSSae_##_= iR";&x Ô) xu DŦ=U)"Rȷ)1K~ Yxi?e :楙\w-YyQVflnm.]bӦM~RuqF|||5j%+ݻ{ƅt9hX&`vG8TvF,D\7?a` @ì78EN^'YgH*\c)8FmSBѵYCaDOf罀c'*fGG -zXܞ62RE.~$|Mp̓gxKF߱|tfM HSA&R|pIzƮ   XX/  HD@&  HEAAkA1B&  H,#KdV{B՗64fAA9 ]+'Ч69d68QuPCVs/3̿AA1?yw?~Oͬ 4L% $Q]&ʬlTŜu SGY+/~oGBs;WL4'(՟\* }Ps׌%n` [ +wi!S&z{J2 x d]x1?%^"V⑞-4ve4c IZm慠/y-O*RTh N}?s>^/"' pٚDv%Uw'\"I$J5G)Phb/後?>qaBJ]fy Ƙow_p vgU֮F%v}md:5:@U C*1|wv$Tq-ޣ7ڜŖLهvN6غ`lBc%$z΍<9_2ޭuȃlthG@_V-C]]qà֦BRu6}~^ O!tT esT{7 T ;##}vRɶ#Z}yˠ׈.cUVE@eX5JVݎn8:Ѷx^:7OTV.iAAd\zFN嫪~q?WJ5{sN_U*T"ƌG^u7>.b 3Re̳Kqݏ8]./>x2k٬"N.͛MN"c8 yw?K޸}n#z9Jk/%sr.k!#ڔVT}d+ٝA#3^֗r<<ΠX}F״Ȃ|Olr̵EL 3( N/+\Vl2/ǐQ pADο>G|©})I?7&\Rc;V\w.@!&NJ;8yGX7ޜ EIO1+՟Gk3 PkQS5y-YqMjF;ce<>|j~_&7/'^&jΕ#  ?M=Z>@KΚ(L3uĦdNzo>"Urz!vN |mbשJ36y^[C S?_'Gl]\Zp;G ; C/ٝ%ͫo/Hჯm2$*n[o)%Xk},^L1f 㟱b\=cAO؇+k6 yi6_R(ٯb2Za^] dUa ncC!LY=l0vkpB!}36jKb~2<;_9f$߼<^{޾cQr8jnYߩn΍tV͊>W72/^ T6snS|ֿt} e^x1^ϑ?Z^wrpI)xط&Ez6-^.?bE%%i|,cF,9eѺO%U$\.Dyi/J]StO,  ŤLܓWx"BZ"o)u{?70y9/+ڿ;`KWYkW[f UzN惧;{/{zMcW YOq:! V]wtGyc 5#>)^)dPP5KU+,ksXߘ|glj5oYi~ <ޓU|\l\2/;n_13n_atzgs;ǾDͩNFosTPn}{ l?E=kHk:5W{"?>!^t( ͎XC&|HFOR6\%9YRSSae_##_=@] D5 `ӤDvLh)SoMSz)T\K `J!ߦп.QP>-d&`lJZƐ7jzڬCh^u'Mݒ%K7ovRlڴ/t@Rc6n܈FDuAQٽ{7r/]ݸ#M!khh"',|F?'zޡ)D1 Ij4_?sJ(;#b( ƚ7QƮ  ݧ[pDCV y$Y>y߽Eݔ}fRY*ŏc[ N_y|/|;6o@׬Iiכ  ]br@֤X*5I}5Ahĺ0A)   LAALAA45d  %֐ 4b.a--YI[21[ZP~-c<4Ʈ   4'@+Ӄ$&>?QF*s3K)3V]S/c3~.s*\ iz^\>mplۛ+?>  `8 +]eIxT?*T\GB +MUf7~&g>!6K[3y),{ 'Z2Qf8 u#!Kɹ+&:-  Z dv<;ΉI$r9"eS+mЩ\X\*ZъGzZ~SEљ-DD׮#~?#:cgVz]sw}n GuX]ӬelqhӇ PwκT{7 R;wGFZ$w_U*O#i ;E:*Rt_0Ǚ2W ]w>x.Wiꖧ/)}#q 뮪DDtޟN%a]+i/k'{BR ҔH$HPQ)_AA 0:.bٗQmK8s| nљ|L__NbI#wҲgJ5o+VdUoPA'[5OrۜKxq͛`*8[} ص7w0JUCIO1+՟Gk3 5V1G{%9 Ffjk9X&ɎCz&5۫]aܿfgɓ'fͧCf2 ex oiU\9HaT9GntOS*)2 r/B:#4z tѺIcVi #]xϡfkX9CY lٰ3U#e,&Y/bxdwkCA3) ͇ +zٓٙO/O,$-h.>JvKyR|O@ ro6AAI[98zB|$ZֶtsR2 v(((kU76vUXiQU`V4: Ǝ]/GZP2;nnORIz`jZkg'JkXWͺ/|R4Ҝ;ZuQ`˟b3e+G/SZv8UE -5]eMO"x=_ sf}>s;0>ugqߜU]/FԌMgӿq4EJ1SRx:Nß}Lhyp ($? ;3婞L pWոgőG1mo=oǍ;isp#Y7 Xa& nuI/פtwݙ:%٬&K䤢[8(o??XܦwQIIn/ufzp%+g!l.%\?#˧M#I]/ Dd^x1^ϑf&PQVHstY&Ab~u]6 s::v!fΗTF+}ĕ;a>ceS\^Y=cPUYN+8cuӕƔ>ЧtWX_b턔rjMٰoivz#/2.ci5 RQGkc  4 BArr2]{VPPqqq(Ʈ?+ .ΰ1ȶ5s|8k O. Ej frduXN90zZd}_?ϑ= m šOXM2.=گ~:T5==&f1?恫Ck'gpPQNPoy+vuƭ+NOmr4DK;nSǐew&vHWiŁFGƬhh8}!:L|Uc*k< 9 iGC\Rhn3(ȒH++ ThFdNҖ1(?Cb~,1Ve, X*D5d½*::ƮFOFFF|EDD]|IFOR6\%9YRSSUU~' IDAT-_zNO&oX[Sv#Ȣ7wS1iKxR$Ӯ)L+ C3y)Sov*Eu Ur-!)|C{Agɒ%̛7<<C=`uNN6mb ?37èQ)B3L\\( <==INNӓ(E.Lhh(( 2220B ::DPP( 96::___㉊"99 kw7̞={jIhh(r\oX|}}5XIJJ2xLddFTT:IOOgTȽpvuBF:Ǐ4u $.m:Ć+ɹb7\ϻjl֝yTb;G\՟\w̝M$]|F?'z>#XV|"ޘAhx ^ B][xgrrr $88 P(r2224ZKtt4DEEILL {!))m۶ՌDGGTV=Q.;؈sڠ ;_\.'>>H&66&5i>`U@WhX߂Kx2~dp#A!]uO=ݧm&e]H [ҺSv MC=D^^ɯ>|}}kn322jM+ucWigH||<۶my9S5#n:u4؛ Jj5ѾȚz Ơ}F*8 +LTDAAfJsI{F=r?66OO:TicYFFFDV񒓓kК 34x%'']S-#Pկ۶mC.<M.= =FRq! ` X:8R\diaaa$%%W=jл5&''gZ |}}k6Y`V}v0M```?4_" A{O`.cnQ?YPzarLsZh]hnrމ288>rs{o YEW+ZHϖXK2Le)y`kU.G_sڃl. tZ3t'%W{4IEg9n]`!?#RkbkZЪ*EwDp'DS Y_ >8((N겢ۛlWzsK?!EuSOT䅆Ğ={j(!+d  Třl=eػO-TOǓy 6t[ѪӬelqhӇ 0FDU `,o]|YLO=4OvM2ZK$Ȱulsk8cʔ)^s?}^e5Z}t'!3_MbG<4GE61֟XS̙1|JE' ݗi9_᧏W}Zзw'1:Xazy+Qc;##}vzŅ>(K]]ןBOh} ~L#q ۬Cq:O'e~IŰ.ؕ|!ΌqDY0Ç9|ɯ7P&۶m̡^*44Кi5ODLY;,)I})fumfBAi5'Ys—.s+o?{c(5g ,1撕ߩ*0,\E{-z"i8^49i0&s>9-Sey35Iɿ@s,g)64J#bޠ$'?SӚQ/?%ߵzj>yL4Pu 4^TUʅM<՗u⿺Ӝ:Be{6@٥,XTdCAt3v}TsCtos!&NJ;8yGX7ޜ,[i*e:{yʪO4x.v遬0|MJ}(SpRٚx-s'z Vz0VƱRg/y [!֐ Z,AlO}W6:? +ex߉Wzɴ>7T>՞k`[{eGS93JSx8 :9b̈́wІu7M^[€vUKzHz7 zo$!!|yz未~S AJs.7Ps*.!ݐAݮSwSos277쬐:yĬtHLfVŵf,, ]]m7] ]kX9CY lٰ3UkЌG}+[sg{s!Ш BNNɯד[f_׌mP(Fde)qaPK[ݟ[x{QD*JUx9SLۛ ظ ]O8絡zQغ¥o MOY.#˶fF!/7Xi:񓾩iR`B=mFB ~\371%E:]\96o/neR'^U=U.שŔ[Sj&yZÁk)0ڤx;(9WfbYwv#5߹V{ 7.?C$2zEZDn2SR2alcI=A&a$5dBsKLLѝ}}}-Dhh(5#bi;{APP.@fLw|K,PjRglIɹ=G4'#S$RWzJ4:R'umĕ;롌e?},2Cfyr\u}ٰoivz#2alk̓U#Ql+kȒHJJxA,~`y=k}AlGnd_wܾblWgz^4e $PaVDĠj3^v}_M==&f1?恫Ck'g[iKEAr:M9I+Yf!.XՌTM~=3x?@N >;aoLaC!LbM1lO2}:׷c_W[hi'9mUvZp7&e?}L!uսeiF՟GZqt}pͼ$xFq! c9x45FPUJSAadggZnݺѺu QT/ +WI~no=zT|Gue aa]mi w/y跐ǚغ Gg0Y"{]S;bҖ Hm]sW~=gNscXʢ*[UʵmJ -5(s,Y¼y2+]AA6mb ?_:q7nLJQFYނ ޽ ήn\H4[/d>zLBV<&V2?H;oyJ k|`ϼd6R,Jڎgveύ}h(}e##$y`LnܸUA{ti] kQ\H 0=; E_.~$X!Ԃ  4I`@&p Wǩ78p`#DeM=AAhJ,2 B#d  4p@ MB 99xC=\Z Ch∏G.HDDrxP(r"""`AAfAP/111w|H`` %F̄&qא#ć;֜Bcը,&m>^tP(,X#Ark*dl-~><|?C]]qà֦BWf+CdC>LXv/U%*$H4o*ŗU |p<]soڗ޾5Z~%v}md:51%͔~쇼}tDz236nUcMf`;u֥߻Y0lڹ=2ʠ$0zT~yZ#8Y"E #}}*˸;'[[\=&t1 OD]5Gj -O_KH/e~yB8)K.uƮE I-/TYW$ AEfh]F_A,2AWrLhB@$ݧ#Q qdd _V̭e_!p)'D;KVj,~r@B%ko\,IsƱ6)I1QnT~'&]'rαLy&04J#bޠ$'?SӚ[/Y.b⤭7(yU~ͩ{ȲBe{6@٥,XTdCAtQ| jQ1ߌ{Xp30KHH8Wiy'MΥ]z +L'_s}o֌ -h[>9[`p =b=CK:e}-SHzc `6$''G\\aaaz%99zk 1?JL∝{o]N՟;a0vrڮ C^%QS᳟옾*mqh;)g]F>o2<+|dZy*Wy~g)<CTl5V~b`3䈭7ޝKC'M^[€vUE5^v]\sF^R'O5,҃Wra\ {oPT\=B}b~ȕHYU{,bykόMO:2t::rp/>9زa+g ֠/}o,E֋9zc2ޜA0Chl<&..fWE}E@&4I sąA-mun%UKT ?jsęn7wqf.~콩A3j)n2J]v;C[AMA r1"l67Hv (i1Ox9k ]zuL󦍣 V-$h=.SX!׋tǹslbk_ \dۥNKsJbr+Q߄"}q?jn:*=W"]Hԋ&-#;u+(cK)>K'y 7G#Ke$A0Ch.68B&֐ MUdt')ryJ'%-fiN 9Zw+LKanS OZd'o{NRʷv{A|rʜo Zk{LMknLgͺ(O0O)PQqm;C[}k*&DPz>$;r+\]z'>͙[BkDHt˹4[%!~k'i|?Cr12/{c,(̔z1-RLKop2،M5 bϞ=r%''<4Z]ƧľJJr~Y$Ǵ{CūYL?ljuL;X;!ȺJ`!?nS|0f~Bc%3|oWrRR^?|4Y~25)@Č~*GY! g}mRubr6يcؙ9_R1z+M]Υ*9i'UkxP'a)*CE%7\F^d_LTYT#Qs Gc6X Bkp3㉏7p(.l!XcZz_ IDAT'Q)2/;n_13n_atz\##JfY:1(;L+ݟe{xGʷ =  4ɨIf$?7=Kjj*jY2.h4;}[cMlmK֏|#nKOŤ-IL{a*ZUNJ94;ύ]x,eިJABM XzS{Ԓ%K7o׮]3+]QQ6mb ?Tdݺu{ܸq7èQצM8qQQQuJ};BC-\;A0Mzz:wB29~?2fяĉ^Mk\ź3JLcc,3(;` @ڎgverTW0Ư߆jM.^'Y XzS{֐M=ƖAXXJeu%1## nN~֨Qo B+}fR5v=4K#ׯk e~u\I<9@?rʌ]қ &z%22aaa,##Hbbb(Y|M8FB#GAR\Ħ X񄅅T+ 1gSX&y~*XWn=ۊ YJ_1ќT)__75ALC)NO4z#@XF}j cd$T[j%Tql+#ԙ*/9AZ6VgY V@Nj3/}[3t'%W{DG" k?1dܛ[bTHmX'VW).M\ 8ݻ7v5fOO4zToݖ-Dy>[eܕ[[Uq&fgkggUdꂭ#6*0뿪4_BG'[a²(t|*Q!AyS.Z\@T8w?yk q/5Uނ*Uz\* /bbz=EŸse^sS,-ІnV8,ma{q4W@K/AoZBI'<}O/=_vV5}{ㄱxzWQ8lgOP(Ӛ 1)  Ph#a\^F<,غo!x~Pw(>q=c }u?㖥( Cel6e o^ Gb%d2>]ï8,l|(kl^F Xk[xrE1Lƪ`d'h׶_#B'x"B DLI%אQC*9QkE|\ܼR'ifYiȳ A͘ w ̯l_X`{=djaνH\T^8kxkY(N >S4m\lNP8AzP졭'r)J(?P(j3 \Uq":XG/O<>b'meZ@;!(|ʮHgt`j\~/OC^9_5jGųGFSq ӰM9>ʫ uY{GW^!*lYjȳ4Šz D*ߏ|/>NnӠ+#d8ʬy"@`@,>@Xf.q2V#ߴ#۸XڳɧP(AzP,'rAN+k wFi4CQ>=LDbwޔZ#3}2a=2jZY`b?VFth?}Ł{ Zybľsv@;u )vږM/K9à0|-07O^Fv*G09-'Ek[HE3A1N CVlWȑ=g%W7we_c/l=JǪUpuUWWoŲGtж Ƃoaaaxꩧ8ţhP( [dD,nD"q&QTHJJL&9L&-Oyt>a(AsC[Xچo sB/GRN q j DJn ɫXt)fϞ54 .] bb8-۵k6n܈,7Xp! >.^XxQe|%b9BP(nb5U?œO>c"553fJyy9233n: 46嶅ıcbHMMm䌙RPPgbΜ9;v,mZLN$B,;8@xnn.Ǝ9sٳ1Sz=RSS1yd;E#؃s$+A3^ %NJP( ō {P\FAp jKdffbذaƪ}ATB.#&&6+)))ׯRSSMjj*FH;!J!! ?P@RR{<ѣG#55.HMME~3{p^Q/t BHm8M*BP(7Bz4O?4233nfڵ$qNCtt442޽ =[LSWNp믍2&ݻh4Jz[e 0 BPZ=L;vl1r8qDOOdxǚp0ܹsSLqFIc4m޾v E0ei\{.{1'hIq:d<Bn`ω(58U2BP(8sY~~>-b{lhѢVh;Ԩ֍70c sR˶n7nƍN{Y;NGs2`,C:U:BP(J)?LqqmNt:J;vI-N;]RnY(?(@JP( BNNdѢG8%UќR;]ns?"//r ?i-( 8]n^^~G˥ƹUé^X}8O@>}Фv">5^,09Ɉt̒ q A='n AH) ::.\(<3<ً ڡ%(HDAQ2VcN_a>ΜϤW |CB6"^}h[4c1oA_־#|x.8I7J2J" 7|v3f N:gyEڹH4}:i{7ՔvM^VaDa5nE()!Z8[çAQ|yC;E^oƋүp9][ µgP`M@Pvy>}WO@} IDAT~b㗫(oJDU_}{xcXBjnI-6n܈k׮aҤI6#:C 7|ẺáC#22Y\]tAdd$9Ǐ78,ȑ#?~<:wl9l~{߿5X)K0Re0;< S(d z ?- oIi&v><3><1XqDcӇV@J2 7H_#~%ƪO zi ̇7_R|VCﺽ]6mn W #O$sRT5LFJn Ӷߘv\1S;^0ޚ<.]!ð&Nr-Y=w1l m^w`|V9,>sJiC5<0)Tqg%/1)LWF_Ί}sۻ*x_ٌju gVWZ)];Mϸi>fKьH}v{ǡcJ(4_AF=¦/k&<<MY2Z=Blݺ!ׯǼycHIIAnn.|J2=|p$''jX~={9L2ׯGNNn߾dDFFB(B*>NYdd$̙999X~=y̛7ׯVᅬy˗cHfեLҌHl9ݟ1H VSt7QƾoBr<4euJe(qq .jP'vG1V>57f,Y0-g5} 9S N(lI˃f2d%f-͸(ng!PG6\ڡW`sS٧.q\1=ӆ:}3k$m f㋍K_KLBYa!]_wnߵոReua~?sĬ"d\[򻧱iQ,^{>ނ*Uz\* PdzfS5ˆOӯ^/ifχ*.t3Q"l!l3}6=b'@ 9qvKyPpvp/* R|rl߾wڵkaflaP(1o}|r޽۷oˍ?ϟك-;d .ca_1F]6b\OxvƘ-C_ϸez/m#ï߼--( #}D芕7nKK{,d>vi.9^F Xk[xrgm{Gf 0V}0#;F1uD/W k ڿwdžGcs!S{ {vE=hl}6?o- }o-I(͎+"dh4{{D"Q?;..rrd2Yt:{XLB*=.WbTG=_)ɃLJ'/x\!"#Jù/Fqż-= |:B`e69SU;g! 1Fix 5JYuD/WA^I?||(y]\m.v[^DøU=1wp]#Ԏ56樁x)b:{óuwnƎq`_ 2 8nkgQmLy`ahMUQ7fK! yU YwE/k&"ʯ@VGTҢpEE{T*Jj܃ibSyRMD8ۿ?ІNk}H_u G>GR4Gwi*ڣ/"UWC<x п(|[ Rchn pm^NfV=J|ހφة.k"vB1/(95%Hw_' 3/9^{q55waLi8w_s޸/> qc172?C t3>0I : agɵ(zgGw{8U jM->.rڢTEGi멋L"R{_8D(_(bVaTdpm-xur9>_</یK҃<C5$غl;N嗣~(ڀ }+.E޹~BqmE/g6]y8sa(Udؿ!ҊeySB0~j5v /̜ į5S#ޅkd#G7FI| Pv7(/G:GFSCekY)l=ԛf bU!~;,43mze‚?ʬy"@`@,>@bw4LjORl-FȀTEsj"tE#/(Y E=X?01COg/ŕ #3}2a=*PcGQXѡAß>1haď;"ȯ1ЪM׶lz]:m׸n9٘@x#U6𻋟1 (Jv`sC#kI=x]zL{nan-{goaPloBG_>zLXԇ/GNؕSɱ/Ϣ}La{X(JDzu?f k=ʜo#4>CiOՓ9n ֜Vb@G6{4A_M31I i9B2Z=m3mљEQUH5`qFA\\T*hIU[}*IXh 9SQZyyyFʮ~Ir7oݝ!Rl DJ_:&C98* }>3e S0kR*ж]hN[J]']Kڢm!C{_鷊Pm!LGT_G+pwp^ng9v;wշgZ_ օBz\!E=g8c@K[TTD-"SUeDP !s-;B?) 30k[ʹdnΞbW6=bu􍯁;Ukh|]UGTowC qrʧPZ9ΎѢ͇- (ܭ֖tE#ߊO[e/k#\G% ٟc;«^\eM PWJ5|MkT7kymH9&~8+(녑OǺ o #^nØ-uDg.X cE`Gl.,-om\lʧP(M i,pjDNi̿IuQPX D~,qh$ bEGM;f]"4ɖ2 qqqot)lLG$µ|<DƹJq -!s5e]W gb?gv\荱ؒEXU^ CpU6~h^ _^E//Xq0Mhl̘%(؈=)q Oa)` ^MuX âRse58j{6JGV;씉b_;!9Jq!,'$))xSvP(-JJJBff&233DLPht^3E5Hc111FD"D"iR%n۶ @C2iL&ZRl_LLё6)sQڴsJh S!4Mm {OEDTGϐmOC*w#I;"q&2 ٻ 20ď&37B RHdd/qۋO&8[D zHR`B"#7iibֳ1'%/>'/+Yb0`:9)p'?JFfr>ui'S;F>Xw ^ڿsj˦ggku!W~ LB{O` v%!%f I~4ԙ,2R^Ax8lή0Ѯ-2eHWM'nK'zm ~ЭZl=w9a>Bx׸̋@rn "D" m`63齸szY{֍ ~%MXU:\(g0/ڡ|{#Eؼ+<Ί],%C8a^7U2[%`i&Byp9dQ(P*vbCR5V TjWB(bcc9WtFABB]Q.Lj4l*!y/NC\\j5튰16˦J vE).a_+H!=Gݨ6pGh߉WDq>ZRqYNw5F. !_%[|:`8_׹Ȱ1L1K2k^ 6."lv2CDylz6NKXL8*2]t2DrPA|D>E: Dd=$O=f uXk I'G}4m\lN]h̽)a#>>ޮ5h[CDbWrS$I&9ŦLdfT*mv:5M)/BV@c'x$Uv+\_;x$:vcwu8(y;ou4\/Ч(VfCUȼsPJuԼk(N.W/.v65/E @gox@NpMx@0x.z^W!W{Q0n FO,O< oZGC:XuփtkjMY)3 r, n.o%u* ca;"?{b{ㄱʯ@VGݺh$۸K{6BTRfB@8e?a+ d=QPTN+òeSlof HsU=ؔŽ2/vy2y葮_bVjӡ5[qz0x.M]{@]@~}5>п繕  cvk^TxmgnQYCPsgԮ `ք -߁< Z9Ku'FC3o| @L,YlfVbOo60I : agɵ(z(m6lԱ2bTi/̟2QZqqk:Fq9dnh4t:VcdY{6(b Sq8YZ_.[uX4 800__</یKo հ8"C')eq*yb(*BElx$])@Eu) "MoϦ؉k[.zyfjx?>err3B0~j5v /̜ į5S###_ 穸DŽOiX&uՆZo Y{GW^!*lYjf3M3?  qr^ ?WfcW\f!?2v~1V#ߴ)۸XڳɧPh}89bdVp sB 9lu"!Pԃa}3<A~&sĺ}x;xCX" t<=<RǪ݈ BP籯8oA+#~YA~0|h'u鸝eӋh{@o?.㴀0(6L7G/=&,GC L&b'w^1Ut凉 c Z]9u!X lz?Ȋ+?Ktgc.ͦ6l6+JDzu?f]]ZG8|_92]E"%7A 9+ ix7`V邴_@pI7kN+1 Ć]8c_'<<˗=| F܃RtsFbbb8eƙbaa ja1-JW:Ge*fNk_P8eJ?,>vTSp,8T^%JbNaFv*#F>[눴n=S2WH"\1\*IXh]K[{.)6 S<c8=}$$$8[e1_ IDAT]=(ڢMry.ghnRƲno GʬP;X]؈ ^w4Y0^Eت39me_+;3`4uUUMqDu#tv a"֞| B#dje1Dbj)'l!ܚJbqU0i+ZGzd]9>&ߠ($DqUxQ}̝\FN$RrM @>kbkU>Fa!+vChu9RO(BpZīT*c9c"P(-gEVR+βH$2Mt`aSD8H6kSX$ah2 RKK- OhaV1{j$q`s-L+l0{EFi _R!)) JҪLSDt 4=s`|1"))?MU*T*ZRRlijMjQZB08oh4Ԧs)?^2M3{ߜmSJ=!P( @,6?l ]LJpB|!.Y˘HFaW*"::脉Dm'2&&ys0%jHRcT؊`bcH{m8h.2 iiYŦ̼qĦr ݩQ( FEpppf9_~JHLLd0R&ܨ?gʷԟ%'߹bǒMMq3T̒M8GBЪdͦ:*WR~=d B<=d`"D)18D||qAm+ 2bWFGǚaͦ( L*c`X8d2rL8v!l|Z LPh5JfɦxĉG6u( Bi#45B68#h}0Za$aXsb<6,g-c:JR PLfqm0ǒT*73Xi\\̭DIIIHHH؆keEK65cLL d2q_ljI>2-[’ME"D"T*Q3mJi{kr((v=\r8ˑ8L>-ϵշg8}'߶RBP8B#d͏#%IX,ffgcn?.U 5M=8|L2W0))3>1vĦn=dշg 0CCƜ2gء5a>X5mzm8c_w毫-<2?>{O7`kTJ+!{0`+y`OKa Wbz0ujmJNv#HLȿg^ ^E"cqgء5g/HAdU #l5fHR|O Fg!xoruޢ9X5 E|*gRN+#|x.XڸsOQhEvF\ٟN-rT*(Js`9W4ZŤ׺ lԔvM^V0gv\hXtlI(kKv"h/}7CvEWV:q D #:/A={vy^Oa̳_Q!K:cᅎaQ(qYm:҆2Ep)` .u E}L29bPYJ=RF V0ڦqqqR\iS}6)S۔fYڒ$,AhaH7B!eCO |}l(l~OJ3c_硘 ,-0u #>/R/O(A"D,Y+]+o[OcHg>|A'8Nv(<^[#icS8-b@Ia;m(x&*V 5Yo΢άYb.YP&~Ia?*mL >>(b8"qDDJn "LmVh =`RLxfŻ}rhI7ni_G3V s!=Ҏa+|EVb{딱LGqgO<wڒsasXry)FcSWD9G%fpJ,͈Ėy3T0DEy1>>ql{&/CSi[fX? ^bmR\=7 |ϑ~Y1fڅi9gP̩2\p*gDaKZ7!(1koFn;RO@y&dDrmk^l NbK{.-C4(/H=ސ/jU7OZjKMDh)zJJ00ˤXX^kzQ1|qD1K -[6v̀~iW@K/A_mz[ÅNx&: :77Ÿ^{#؅k c='q%`i&By2 Śsŵ-pb9\kSk_@¦"GZrtNx*%:zl(v"UIڡ(I'Æ.7VB"{"QmޏѾɯuDa#r]e9ܵ:#;ăB&oJ* yup"\sabșbd5^}26l.9]d6v2CDylz6NKXL8*2]t2DrPA|>}ѦZ˦LFr9؞ 6ԒE6l@;mO OED\!rE Fu|ݓ^_=x|x*RZ/<L:bؼW跺@ a+QT͡d9 YOm@Aj5Xf'Sx LB\ګ;~ی"7ϭ!c0N pmk^\lKy6xߋ37!cjWb_PWs0kKNy  LnzGAcTw緎Vsuz x,d ETLs+^,3f⻰_0LxR΂~Xvr-J^?mۅ 6umpO(-tBi=d-T \X풒f\ b \t6SƵD:@bڕnJxcS=W)cZ8NNCll,8dSDh Q(Fs.YSl8ؔb/UB3 S_ 1&:~k}M嘾l!v.یKan հko?!̓Bl;"`(9%lXm>AWho\<~q?G>b'mgv6BQR|ʮ]#wu^O+ϛ'ÿ f&GTܛ4BЧaۿbꢹ[M>k+ę[Ģ6l6C =:b5X>NnӠ+#dv՟+ a+@`@,ݿyQa[VXTҧlbi&ByhjlpGv HHHRl$I$#VD`p\nt Lebejsa`3RiϒH$h4P fD#IL&Fi 4)ӟ_LLm8IeSƑd lmq2B,^2nO|&MHA gھ1{ Ѥii.[GW8yo$9҇弿#M 7_y$~'zISlw&)6X韫ҖM/b N>Sau$[F$ 7 =}o=ѫ qq_7jU]A؟]0kd&~Ȧ+r7K_/?)÷k=DD;G<{Xt؆ó ~cɁ널+ɨ5毡hl$' #=I;yG\.%[vኵc5;J">Nq:F{Z6Z$&&LFd2ILLl>%6H||q3~";;۸K.Dn;e->(XCTKo^A Zddd@<tĎ|~_$C- Q(w+cB54_h&٩Y8m!6Ũ#8* v[_]"G~=\ސJI!j~)| [{.)6L"d#:h϶(oAXXzfB~.]ÇF AP0i.aXwqQ_3 )(hi))eknvnmֶt;utL45 P`qf|<|}|_eӜhӬU|蝹i >jdh3I*Tln%f~:Yud @ݕ[Vd(ʻyUsm&)>==!t[BK|L!IȄBB!BG2!2!h$!B!:Y!Bu$vڮmH[͡wq8+\GK9kj,K&L*[;!D'+dB2O\+eF2úm+!~gKwj\̏'\CoP!C?3?Xno-LR.CGWھ휬 !DӶDRlexÃܸ,Ml˓t٤WP ݈ОT]obZh&ȈyhLۘ:J%'ֽC@D4c&W/)ܑ؟p?2pPӄ\_7l߾󷹒uGz`$rGI媾 A B?m;!sg\=Uk#MѓI<0Nm-OO0)_bn3@^4#_̮bNl)<0}Yp߇ۯ8<*/3Fҫ$~:u'Ī~=1VN1IDRQ+us\N뻹]LVȄiK[2̠7wPd;RL{wqe|\6r.f@㻯{H~y . *TXfzN|z8|!,x)V:32ᇿ令zZ+3cЧW Ӭ;`.J#gWu#]nJ 7kXEyJ)ۥ3\y`emM#2YW{z{&RvBM _Uwnm[RG(bhH*s塗QK,CyhP_*c);K)[j*{ߺAө2zRG%Jʡbj^\_G)*] .DǕۨMMMU*N|:o(Vj!DGkP>XEyPX !xwQ5RM̈/wІnEH"Ñ}x}J8f!.b># 1FF=rvTO՛U*ԗe{n6eΞiq5OD,][q3`緹#qZTxuΖӔUG_s8hxѿ3EY|uޒXe(2^, ƫ~_`V|7$קpZ_lM33gM%<[JO -$`~WGWyp%λ0f۸:5a1r }yP-^\ߦyvGqߴAunt>.껵]J!B2h'˸dd^ ﮫ?fJ*v`y]U Ԙhгr{ȫ2w;>>Gt  IDATYx6sTNH-vgSݺes DYo`j*N'`5uW`ⓧtFqoࣧ?|UD8xV鈻yiq*>k34Y)cGWug/{W9j,ŤL"~z9O$*I}yͲ_eӉ>wegLjk:Ao$lOn 2?ߐ0ЊzMXk(PhSWҸ}!.B&O #/|_t}of_2o`#^?} z7cdP}Uxܠ,-c~bfEo.{o_'Э*>g'FߙعS0a:ϓu]ťPr[ z$ߝq:8޸7Nto3n-MH@~^5O3qr7a̛dx_y}o222֎3vqomk㻠m WhEI}wg[|bto\ӾTZZZP+a_~%111L:G&Yjhuad;Ȟ?_?IJiN4Ꮏi*w4Qcv2VP*x6m73?:H2-+HwVh3IDfxgɒqnBtPB&OGX̮Z;oNpqHJr)ǯƳjT3܄$R`tqnBtPMY!2{OkA!.9@B&$=!t[BKeQ!IȄBB!BG2!2!h$!B!:Y!BG2!2!h<m&)\K`|}e"7! B?IBI9_frWVBB&nYTiD,f*B7 B?}LBEnYB!Z !DلLLKіBႬ !DhkyhFD6O!1ģ=!‰eyvGqߴA !-19s&3<6)PQyY!Bl !D{لL1IDŽB# BK9+Q%HnWB!ZߟVF!D}<:m&5?-%&# ! *)+))iB8ᙄ,$GB!D&d:ֶ z}K$ ϾeQ!l6c6$cV:fyL!Z<%Bt0$+//>B!Z$dB!D#ɖB !$dB~HB&Bt0 !DѼ/(LR$6y`߆Z?S$k 2LiD[!!hֽe1${¨l~xeNhTjtt<7Ty "X8q{|6s?n:\~u#^}$r,`o^cDǢE]r=B:w5Gp6E&v =~N3)&^3瘡zp߇ۯ&9Pqx 1^&Ӊԧ/Wx;AeSV\f* b0B.HOOoB!#`Je_=>A oz^!hl\(EzoeRW=a$Bw.D *TXfzN|z8|!,x%2)Ve~nkes *q<=و9Q[(;ko8&U9FYhNLc#SO_Nޟ5W?7iD A]un-gjE^i1;PyWd Xz^Ŋԍ{W4>}ᔫx]mӖJ ܲ(\?~!hH4ϻ;s)<䒯9VVd[NSZ|on=kw~t_d^̛ò#zg,$q/`)ĖŜ fz(%<*EdY2O锺O^G2x75)<9\sQyUG''0= )$[q$r|{g^AQ&\y}mZo'p}C=Ơ^t7-7clrǚQF 0yX緯8fz:?7b|1gsXJģ߲\vVmVP̠v|vl-^_k^[ QMu{⼾b}7Ek8e76?L]ж1ac6O~ëBw6:6GuJ2?YtmϷÙβ4y \Ͷ1owp^Yo@NS$Wv}Ĉ&,X)((-<<|Xh~j8/$&&Sz4n!UNSmժU-Bt}e̘1ZV[˴c(/d!B\ƌS !h:yB!BIȄ.55T)2))BD2!DЯ_?:w,eR&eR"eBVκCq^_F^Ek$Y/LʤLʚL!Z競 #AY2!B!h) ܲ(B!D2!B!h% !B!D+qah!B!RSSIOOwk߸8cW~ .) ӝsosFU[[K\ʥ\ʥܳ,K^_ugu״\ӖV./R.R.=c&~Jŗ=u #Peݧcxe>e|˃_ps+@>2%ݟZή,v}'bpŶw[d^OmPƞY|2Sßpq9֒i)r)r)l(t:t:@u:]V}+dPXXX.@aa˕7Yw(!(p5Mʥ\ʥ\WCۘq<#?0Z+<Ìg7uظ1ڇ|5`7muc8Ą;)2nh\y=P2c<=bUĵ<[1=qlib\X;//Oʥ\ʥ\;`… yG0 H~~>瓟ҥK{jյem'??N;ֺN.cٳ熿ԣeR.R.R޸r#p,_|_GItn,P~:ݺuk.\{RϝbM83؆Ícܻ;]Del?wr3`*%BCB55hBPMˁ<"R.R.ʺuZbjLQZI]xx[ϦA߲nr)r)ƕOE޸$Pl04AK;NpYΞ!''2&_߾L6:M/¾2#3rl.g~L|@S‹)p/5٤֒i)r)r)\/gɬedg, :u?@NjLnYBсYoYܸ:qCoNgήy/sKѭ|F?*橗1[Ǘs?-wԳxzBwTyY<2\Θ2v?3;O߼~=v;_?Jmb\gnr)r)SnHrsskk_VTTTEk]a}km][B!ȗ7?3Df?'W]cBeKo28P`}~~(÷pm6T?}|Eߗ %zoZMCr)r)Sn]&P9cX8{}ۓ2!;\wG>}~BĺURRuVSWVȄB_G)6ʢ|gDI2&xw[ҥ5=IȄB1#Ku <3 7:B!j~fҥnWS)uIB& b]w[;!@BB{p][ B!BϐL!B!Z$dB!BJ>Cm6=ұ!B!DԷo_ƌSNBfMbbbZ$0!B!233V&: 5:ujK%B!m^^^7cժU]k^!B!\&coP U,:"/gc Z;d c=_}u[!B4&3gNj [!3vzr/U2i+֓cP\9HnR"0b&gݲk3NSB =breLH× y]ivE؟e&vʵzmY}eϋ궴L6+1 as ROB!Bxlh{ vf9X>_Y% K;IickR@&%Od=3ٽg!VoCa߱Dh,vfR5 z k餱!Y̔kL3geZJ’k_g?E@@5B!nBfe)'u\FVQTcc@?p @T' ,e IDATi#'1x*kmZmY.jo5&WEzqd9A11![1ꮽQ=6I0Srh;Ӳ)"Iӆ?RFgƪU\}/x~O6Gwt]EGmWt&M;7hIüTӞ:]b j*ޔDϸD*g5"ߧa0WOaC(Jr۔p%\IBO{dm*{]B!BG ?jQl#c*Nbj0!n6D̐`ūҟ`ۺ#J4Q J3'%&AQXqhUuun~(+sIӹn(v1ޫdζk׆@ dhc voi6{ٵMXLُ޶T;>0xg2kb{3(4ٍIa4rV? ӝ@ mg&:ٷ%3mT(.Yk?Gy!B!D+1͵UI6wVY(=~Sd4: )8տ+i,BGmY)?E6?Gv뉾ff_ח46:FNՃ|9;FPahMOAJMTK c{V}m2L[ݿvv/Ʈx3F>y'T%B۱U*4(0q( }.{yQ //y9PB!&[AA j\JVշ+ ٹ$%ٹ+xNY} 4U45ַpp7,YsmT_lo4v2V*7ҕiy aYeX솬1|P0}Ϳ;iWDnw 3Ydsݾ]MPQYE|a߯mD#v #7Q^^u&T*@dwv1sTu Ck/}Ŋt^Տ~_B!Ěht:u:]2Yw(!(]x~Z/wJ!B!%o̟?s5^ii)-ofժUC օ} {v|IzU'W W$ɘB![ۛײ !B!DIB&B!D2!B!h%N.Xoka c=_}՘>~!Bqx [![ *aqGiYUS*Lڏ^l\֜a}LE2;ڶWKq6~G &e! #fl"q]4L/ !BǢE]י%dLJڕ{j͞XڟwSzJchBJ$rL M EX̔k;!+;͍2$`4Ʊ5G?]6e A!Bˣs ߃:lףϐyyRNQPslz o8$?Jas_0j+8J6o҅ҷH>CII?I1AKdLr6Ax5GϪ9Hî=xw RMI=YAmڵ7le[5@β 5v»xsd%CgQ:'*? 0He, Z"_A0o6}__p.gl.>LzW3kX(*a`<Ư/Jz_ y].9YI+YN c0HYUhlV#;VAiؽvBT6"ߠ%o JV:yXjT&_M}_A0o6}.j0 ɞC٘MLJNvRORL=ӫ +vѓWVjUXW[V3jh8FROcPG:93[ٰ+.!UϋMs>ޚcbB8ێA`eWUYiiǢÆP\s9?DOo 0tj|y ASyޭB!6VȪYʲ9j`NJ%ӎ(T>t9Ysf1mU+g3d tZ5+EA?SR/~W3s,k0jD:Ҥg#+7a1u87]Ǵd^vُ(f,}qӬ 7ٽWO̝]Ug2kb{ǧ(c&pC>K vZ۞9Sי|#J4Q #L =Jt#Sdf61gG_Ywu]KSsqyfcE|x=9Y/۬к:υB!DӆV,?)r: `(&3'W7c1 //g`ꋖ0_US(`„ΐCvU mXA$f/ @ y}g?uZQ˼AM(ZN(vִ]Ḿ=Ӧ7W6H{uc6sЦ-9oݘkA= 6^aTxl3xzۏ. ΕFHM(uyiB۟B!5 Y2s)YYf"Tݮ3_5i ҏWuh}فN􋿒Іap)+sg_Tzٴ|{:nY\jĢd34'/Q>(f3#e2LT8B9UsF = u0 `Ú8֥WUh͍yڽ&.uu i;7SwgYN1cG4ue\G`K/B!EZZZx<]Yw(!(]xNC͢U!B!Bj*̡>v=;n!B!B\ϐIBѹ!B!D 3 !B! B&B!DVecoB5|}]g֐~Z*rm96!Ba|Rq][8SA *aqG*L10]ݶlYfb\kQb'QOccy% o_=~F~\fw^'Ҝnj|LN.7)[O1cp֓eڋ_Q1쉘B!Sm;dJ[sT5ID4{`"gkMaϫjJchB+N[Ͱ)3 zW^gW 6S\s\*se͖ ;<~4M9_ߐ]Y,K;IickRr=Y6e A^nVGǰo<B!pCְT18LTxkQ\t}@:4&"WmEG͜RBvǢ6Srh;)')&qUΆ;Y5#iص'.X8i#'1.ko2k Sk%< r++Z&֚LLՎ8Ub o`R|Bs<1)8: cۏX@uZϱ%(Kn?7ɳePiBfIȄB!\+d ST*VEY ŋY8! RQctuiľ=`}(= LzvkLfMpo&@1c3fԡR'Ȕᾠ#J4Q #Lc32O0}"]mg&%۔{9CA3YopV~S̲Pqj~.U v~<2~u=clKa4's1̾-iB9栯P!B4Eo?iMq!+"շQkOO#`qL4@MPp' QC>NY` fu;xmWu6rrw:['m_(ZL( `TvTH^IcZ=_CgnmTh0PXaBQfVsyU}xE[AֹreQO2Fæ.ɜB![- e+~ ]Iٸ=F"AgcbK35`.%+Lgumzׄ!= Ru'@BS:bHY=7Pu(B5qKkZmaF = Ζҕi&lsTibLBv>Iv&\˾U}K_esԶHY=R|n25 z D+ ߝ[g9aČIZC?O9珦Ù=B!!SMu{⼾b}ޅaԩ-GӔHر\nR"0b&E/~Yfb\k s~\l>ݽrF0h8bCO!B@6|Ls7of_CJ8Y{߷ eI;IiωԣZ:vŭ-lʤLYM2:8WT<.c1h9&%sHNT`?!B!ZHX!0cKP|p% 5U_^ 4J9?DOo 0$RIH9YNPqL՛)=aO+!$r,DH" 0He, Z"_A0o6}H/j/Chԧ23encnŨ{޶&.\*?72?EA]#|W@c~nch%|.֪hTػ-0ſrp 6C_/ NՅcp sb: I0O[zy+~Y%m%|(bm*B!>pg 2]_|Z8{-Xt%NF-6"/Y0n4@TF.4- em e54c4PI&Pӏs $rf*{}5{qiS]MAS_=cPq{]yi\uIսW`FeƪT\Y k{][1B!b,<a_n$7̵QGIy;D[ W~$ F, )dF_1ZWɿz<ضjEzk?>ߵKYMCxSd|ΎQDpi637׹TWD`ȏà1íڸ__F?%B.'EiPpS#8T~k_5r3B {!a+YսB΃B!>x=d8=w2+)M. ˖i$SR^L7yGh&jgGŝv%&Ծ]` zubI/Ξ*1φe.qI?3vdp9kbu ʈ^|uާJ={I6ϲe3NxIXKd 6,}0?CҙϺyX@}!Ϗ=Σs8{+/l?;" o9B!-{ rǀqa:&2d^dG`MR$&RmLn`3=JLn&cv*O$.:{ضcX: FK4 .(]*I;^MlN:kNsAnw?٫ %,0Fhz IDATx;C Z/3&ӯB0wppg\b$J6^IbMW /1ﺃ7ok hoyg>;tzB!,,jcN\.pv.&+ؿ.tիilwE9)݄84-0F9L Ǜ#|3p3[Eʀ`Nl֯2`0(5]Kt~,Nә ioZ-$#j^RdĿĀN݌`;W߸!s<|(W<Չ`#'3OF#ݼC]YY*<%qW.5g{b!sB!(֒;EYnn.}}}E$@ϺQJZϧtQ/C'S~ryB|}X׹>=As%BBCv3ӓzߗmҝ R1e|t ] D7~eL6d&B!mvf PoYp aNL''g=n.-*u`8O{9TVf=tǸ5:,.g A_yB!b֖=d ~W>#DEmee_Nw]^@K܃4;ߔnjgS!B!l-,vR?Ow*c'8}Ŷ(2\Xk]4ܾ*!B!BPjLdB!B B!B|$dL!B!! F}覿B!8,^ =ISyU-#}'AEe H| .0Y, vldX_,=8O^=o{N^sp?>ߵ3~f!ԛ B!-t,::Z޹Y)9{rdW :dJʋIicqQ~E6ctO~;~WMOQŨ/K]-\z񘈵 ^Gh&jgv݋wr B!fy1hL`c`"yNZ5őa#Mg;v QW-71dL뤳4zضcOO7PPgwx>BRާۚz ] jV~U8qCdtwsv*Eu7SMWiYsңF&)HVTW,gļ7 !Bjl 2thVX#dv|7˩T-nu2O3X B/(Lť d>6^j޶&-4:,.g ]cYOymO邙eU.9>ڳAnIB!B,y/ʊhnn֭w 2K2%G쩧j-}+wy!4g$z=&1_;~?pO0)c4de[Y]x.+3`Feƪ79m )'/FIQK~f B!C cx,ۉکaAoӛ09kj6J'Ry9s VN@,酻79A_=l[a5(7ذ ơ}l^˅sS$s蛝dZGx<_mt=.3EĚBtէOҚ7EggKE+pGN@mD,grB!jL)ڟW^:Frch%??ҷn?O˽$C/B!,t̙3xs&L{v~CY?!B!B1_)˖%|B!B|@{ȄB!#T;d B!BC ST8O:?Jn8~\"B!\-ߐi?>ߵlު~IlݿXe M 15G7"Xsvr>8܉ (9\C[Yq'XQ!B|oȼ#vovFN;;俛fIdQ[h0@XK[))/&?#R17LeR=\"OhߵB!-Y;d'=jk"d5j NZb&U;n`3=JLn&cqMÈ0.x#mc$n}Y.O)&3z1i A2(X\N1ɗZmMԝ я|LO-GTf2 Y(R8Lj{xբSv*Eu>SMW0hL3]%i7S0h.xϛeB!Gjy͆a?_mՄås##;NW C㔼}9ky#v=16^GmktP`ܒ_qxs8huw31891u[wpH1)с Yi/e:edtpԧQTHyj_tٮ׾^OucQT;?=º!Xl H$X';zXB!!3Fbqb:؈6Ff D<\4;<ǭBs8+"&4MC3FEDaRwͯQBnm{z[Y]x.+6ťJgݲ~qheI](P̨ 8Xo}ϐy$Sr(Ξz*ҷrI^=mێ h.^b}X/B!Cf"h%~2U)4h<{s?6SX͟8(Z+F&S܉b[MlxQ. [,~tʚlǫcݰ 1zuDZ>@铜{FQ?&8QEp/GSTĥ!Ϋs\Ӄ-wkuݼ~cx2>CB!XfjL)ڟW^:Frch%??ҷ=!B!XCv->X<7T;((. CjŇ {Z 򤡆5q$\|бK`Ԝtܠ]HorI(ڧD3/Ξ*1^p`}B!bYfz ggjv%h) {*jw"=|9SHL1Ķuf5bLY ^;B B5^Էi#5s|^FNT IyE4pgt5kh-r;_n1v{x#uu;W1yک"͔{3{uoKűc0Gf'q~G4`ؽ.ԤɅv*Eu?%7K/-ؓ=6slڜr0q k -<`kg6hL !Bwnv7d(2m^@_G8 ͖Ap;ktY|hg hY [+o p aNLg]Q! f{_cvpv/Fxݣyk4yݖJXߔz62w0 迦ᵌ\˫)݀pB1_)fC478H($jr4-}1Seq~EI0ݵCc*ؘO+Dn.$gWfm+?Ӽ4Eu,I*j{7'Sۣ]9eyZ[πA37 cGX7kԩO˽B!xۖofd"&;.,[>eM*_F4wo"#)#)+&+[wYyTB&hhh(L h =x *n/`ɋKU9Nr('OkwzVƇc!9  6}T{2QXo˗YCWn'qxga(2\!BBwΜ9'>Xk]4ܾLC&BSTp gF?ŘB!{2VY)uϒLIwB!S,, !B!jvdA&B!!,t, STyղ㦿vE7 f,60'!BϖQǩSpxneц{N'ⷻyRT0ml,y ?p ﵞ^dkC!:C{MW\x} -)蹼]G%ÈD% vC%H3%ȓ%bR,Ƙ2.uMC.>wř8~n`*A}Ŋj7t|=zr~ !B=eɃFZ:$5# -6Lҝ ݸ!Tː"1DsQnb0yGh<8ctݣxk2ċ{ag`QuҧZH}Eqm'.z?1pE4pgt5kh-r;_H%e-SuS2r:`W%^Vv>Z]si}hwnP}!b(g?u)V8ϡog W۱Clq^? )|q o=^l[gm4)2ixt֜d=پRY`>e_a,]W ^I"ó}8/ZnpA(y=Gu5V|{Mf478H($h K(/b}ЄCgWg| g{:m%W!c6MC/dQߢ:ؘw=``dej@:5ǐ!ֳ9v¤sM.Pij =x *n/0yl`e|8Y1oeI'gl+zs6i~HK<R\x#@c ̥ mDNa_|M]1w οf [w~kiZV"IwMjϭmX2(,AJů߳:B[9ZJTr6ĒYHXnIZ3'>yLlF[sʿl#!/ jΞѪ鿃1SX?ql؅גg":œ)>ڱE+t'nc>Wn'qxg[fkƶlfcIf?_SڲRJu %p7&1}ӓނa<Bf5XML,ѺJe},6Xi\6~mS<;fqծ]yJ LV6¹S}=|4߲s IDAT) Z fU:"HANgۤ#c[!bF^ܬ[Rݟ?导t08J~~>3GL ʞCZ]Nm-KٗPuv.V4W0k.O{2\-B1BwΜ9'>Xk]4ܾ:8h[˩e)2Sݪ.][LBxL2&B!KC6Y)V~3z}X.!B;}ʢB!B|̖) B!BC,dn8~XY;B{K/)|}X1>ү7-dM\(:19y*@e~iN\7nhG4jNŹj}G;6+T]i 2S <3ϲi?X+' wA?# (vIjq!K蝜'96zZ-X_7ޡ%.3+b1kN4qMn7፶n-)f hXe̯yNQaz#h0~Qy;̴(.;͵FbHO1 ϳ=\v*2~璜t'vB\ZZڂv, ---hG08G q 6|hs{x13}J]UШw[*a hE6]FG8z܀a?_m9E+crÜκBAꎈ&3DOS$de4%d1>c}h᚞}}!n6Ƨ# /z'?iz"]~q'W^(i(y8rx-c?*g?GJ7z:I?XZi^MߚW@y}q ̓7k7\q_YmWJύ`8]- -tߛ:/+q|3\~i{!Bjln!$SrV(xqi1($jb#q `8|5a \L6Ff D<4޴i\uH˔f *#KMskO?C*DQ02tcU{pzaʴM`01 XL7Op οnu#H8|1JZlD+ԪϭmX2(,AJůd6lgՆm=t=v-vaGX̯iEFR$;o*z[ Nr('Okח8Td>!3_*_^!ﭥz_ m":œ)>¢4.c.9tҝ\ w b,$<d`4KznMΙcjuq؂᛺~[D Qf`51qhU-Lc *NP^L}45O5#{bg ،"bM؛M Tvw}")}p3u\8=uJ260G-N#ubDS W~$ FN b)cgK\*9S oJtj=qa+AY yiPsVeMNN?[5d>\K#,DF~|.B墶vދ"uUJZϧ3H=(.CխڹXL^.&"`.Oz[>x}e2W r^!9sO|.:i}u;dGKnN-&yhg)MxW}XNiB!{!B!Bel)vIB!BR=eQdB!BBLjyzՐG.M*?O{fVc}W."1;<B!Ē(v<:NvΆڪ9=62 M _'.<-yKW=2.zT XC9BghID ); +(<:b{=xLZX}Ŋj7t|5S pW؆g v5Nͼvr9y$SR^Lʔ6|6`c!B KCf[ `tX?+V //o-dM\@:19oSUUÍV[Ybr%n=ωf m|bu9:HǚqVeGamc|zUu*]VS8۹|X^JWjyM)񮠳" #OIrT;?\eo W?a4_Ds_Z|ޔFzJ8c}<{ $Ŭ9yTǝ[7܇7FֺĚ1hNL1ɲƯ?0dGz)`Z:ڸRS?(.;͵FbHOTX&Vym-vRΕ(Wo ouƱL.;?Q#juM˗5 ׮;Xگ/f_3hIce/ֶ;㒗=<Ϳt/')$3cνL^:1FÀyC>Wp|}ī1<ɒB̤-hb҂HXx}>^muuքc܅cp sb: I0K^!Cɏl&3DOS$d},dɿbkJ>^ϵϑ x0025 E@S\?k K(/b[.&%ơp7(_qMëiS[j(ǫ̓7k7\q_Y4LxpTzndxjaolŗ6[3C\i%|.֪hTػ-|=үN|hl:Q8AbykḺ#|W@c==}>5V|{?͟1s5}:L/:>~X y,BegvfbhEʀӍUЌ8@'Q|2s]Vm I Ä\,7i K[ &1L[tBs8+"&\/l7 Cf\VkŇ nJ!YZJpj?naIˠx)qڰU۵D؅WΘ Qd$E󦬢w\i0Lc5Hc/Ӛs>#i\~ӆ 4/1LmI}VbqZg3m?`\R"-A4Pz{C=5W9B,7dѺ~Afc}'iȞK)¢4.c.6Qw،"bM؛M Tvw}"2tjr31%p0Yټ. 羧NIP٦p>oY@9[SpWaک<@AAlh]%`۲i|j;GƱ!`K%gs*9MɓΘgWeC^Ԝ=ţUY3ml՘_|QdZGxo!}]<6ޖK|׻|~>B!xCv> !oL!B!#KCC&B!R=eQdB!BB-T;'ӫ>r__o;w"ㅎ{3oߜ~ތB!XeCqq=K%m=HSj>2.zTߋM|c> cz ?p 3Xҹ,sq!B;tghID/ӛ,_F<&b-yE Lfls dI)ocgc!q,a,ɔĦ8kbu+sA_.=V9bE5:x>^84ԡnr vmq!B,[KCf[ `tX?+V //o*9ww줮j\ #*_Ovrl>Fuq+LSy\kk$q.1a/nԵ|ʪT1L[z#I]6UUFa[\x;s7՟`r٩G;6+T]ik5:Gho&kskWk,8yЗv3گSYuۍ2A k[\k=<嬠Y$c8ҽT\ SIfʪL[zI̍údGΗ~$h%eu4WO_'&'k"׉ ̓U):/̛ŎpO6>h)Qk}qDëTʭF_ۧ 2S sj>eWpdO]'&{'Ve>:YB䵹j1 K=MgbwPa5'Os&FZX31o\撜Kpg?`!bCfXhiiAH$,<>zub1891uE$̓7k7\(r iWv5pM}B6^Gmkb`(r&vkm*?mc[ ߼H,x5:,>w 43Sc5Mw7HdfizJsL ,g`,M8tvt^j}PLuי7K^!CɏlއH_󇣾 ̿=1oqmǺ! rܵ>c~fϭ465(ic&?E!⽷T;d_ m\uiEFR$; &1LEҬaB7kv'_5SQ;ц>#N4c4PI&ԞopM;VS_=cPq{ `c+ñʄ/K2%G?o>c[׋}~W܁0.) y2&|i C굧G۵Az`Feƪo8o &"p284'5 N/}ojkpe5muA&^o.tDއӿWu KZ;H`Նڰ uG]ܮ%.c9撝B!x-7dѺ^M2QDn^u b,$\8bKx*ko`LqOv$٪7mȴryvlJ'݉ϕIޙFجSLm89ƒ̰e`4KznMΙcju' y:-"(3]kXd)uǃm>1XkC9TS`1bc}'iȞح6~mS<;fqծ]yJ ay],}O̡M3 |΁)t3*E$ kDe͔IGƱ!Vĥ9nJg\_s\!y/ʊhnn֭W)ڟW^:Frch%??ҙ# R{e! K㈷޽Eu}v4gh`(H *j1x1N&&5Tfj.;/}߫jqcdT h4QDx b7i444g>UVaZ^W.SKNQ:r_u800R<1X&ЎץOD5>6oS,"""Dg*++/"ՖA4֞ Y$1i}e6QQtXF*A?O/)'kS g* axhL$^]c6""""L dffQ:3p1޴s """+7U9""""""QLS5 b3d2wUyDyǽo@^ޘsimL;t͋zg|7I/x=0Ҥ3Niǔ6o.qg?~=q塼4XIJkc X'^]"""6ygF%ُCYIM/,*v3cP=3鉴cc7 nյf'I#8 Tk.~BͱxG=<wO;S}G:Z.Ch35 |N]"""vQ:zI`~-gsb~bͤ< ÞJAq,5Ru0kGCb6/;QJ7YJ dp̥]O=)E)/K$7\~ð\xgV", }sP~V%4%*+{!6q}ˣ,Lk9 wv9pEI^R_ptȹz'ۜZ38 V,{ MDY@BSF-n%ճtPu(9 Vmwe/dTWA1FKomoX,n"iWfaՋEDD^{3E&|>]Mx G/>b3nt'(; ~ Xho~FI2eXH_spO^^'o5 o qh)gn'ml(N'2|㰄4>nnz/z[K/ڈNzS?47sw+GKj^Vo,gLb+M` ,uwji[P{͖.J5²{#uH/!B'qۋ kl ͦpgCry}auіc,>^;|hXW6>[3ƶdzK]"""򦨫ׯ-״?ӟyxAcǎi36ln 3u*֑{=hL,hTq1s2V:L6Dg*++/"ՖA4֞qI;wUĘ5<ٚErr!}{K>8tF|A`s|YHFh 5Nsx[ wO;S}G:08')G7Gkqbr>\)\ߝs>A8hhaA.(q.]3XL%?D㮗4{ |ysRR82s,~ƏFĄ`K'.CI˄v?KKq7c7xE˙ÜhbJ2XUV?^3> )-C._mFKGaY֐8ߋDk9wm=-̢$/ie)X/yz~h=wm΁xqcoZ\tgn+gSY@5A/LË[F-n%ճtPu(¹*X"yx԰HUPROXB߰XDsoX2nsi뱃l,ZKo<=:Oѻf+\?q1spPZ % }6=C ~XԇC<&{*?5Ru0kGCb6ogY$]&rۙbu|Stj4^cuZv_X:hhr_*00mb%]yfvX*/`/\_l4ɏ%PbB56L$.`wBzo>d$g4o ]^07 AI3 o0r!qmGwyNFv] x k3Wxtޠ]+ht'N/~Ƿ oVl`.{e(q_]UGsI`FG-/s&/t.oH<V|#L~\ot<$sC30=K~7La)gn'ml(N'2Mqc'r9+FL2[P6' _~<1l_~>^&?ڹXJ:ώ늶=\[Kۆ!39/9y24/b{v&1r !/E#;ߘ-$ࢻ8,ab>鞤k mC178ZSdzv̡e"""F2ı2 N7|;&bcٻ8LYeU4lV颶n= Yld9W.3LΆ*mb6KrC'q(1aMM.ِ8X/z[X;/}Iۜ|WM--sY|&wl}fmɢ78_C겱|?TדnqܦOJi8<]d'䐟Kk;, BO|wxw7b !R? חߠ:% s'=ٸ8!1xi;I׶%Ecط4դ;:xXDDDHdѴ?ӟyxAcuSWyӆmm3pz= S俉9902he;9vu15#8ko::DDDd۷{;0t0D1e1 ({n0+#jbw6?EDDD1=x᳐j >Z]jÇlPHF3l$ɚErr ѧeOSCarx_|Έ/lj~~BͱxG=ӿhFl˜7"5-:zI[ǿM$=6zH!ϾN] #6琶;XͶszp[ٶk-!e;XͶ߽GG)zlc'4іt>OZ&^ % }6=%F { wr0'):_{b<&{*?űzHՅ▮ aۼvx~'Zf;Ki8,yǖl z qX&̆S\:q,wURM?x, Vp=bBJK0CEDDDdzLC=F88[=0p2;T{'N/~Ƿnl%4ظj6q-T]w煛ٵc 6LK6|u<>m1;ݗDa449/jLwݖ-|R mŃ[f'd ,7?z$D vW,/tЌ#lBi 7LCȈO9s;YncCq:1$zn:9oJ׋b_l.&-t.87Ӡsi o)p?&{⨞h00b)޲9IXL`gv_vc H iW`I늶=\[<;/ 3}I taA[lڹ_PONuHٯf&)oi_8Lp dcLCw4Mˋݎ8斂B.{͎&Ӡv,H=c c#1R7-h a/_MN5""""vC[ȷ9]r8o͢lUkgKFݚfgkؖ,ztcͷbc'8H#̷'Mp=tګ}+ 9'Z6 ,o}d؄->ex;u\Kh XmMc|3'ͼYKz:<救jo>Iz6.$vH ^aTN H \w{;dEmCP{jrZ)B'qiQ&{ɢi4?G'1]7)..fǎZьuSWyӆmm$he;9vu16u`5ݓT:yv/oa?^Z_#6U<&VDDD6+Wq`ngʕjC\BV^ T2 &0e}4gݣ㧤ܠ}o’z?NЋq%գggn m3w~yinB+,@0v@;&bm[M<|yq\Sd-_iÏ ]ĕnr6^gkŋg޽c:n߾}}TewOs?d~Sζ x~m/2dTΌq>|1k>ɾTVo ?/SUn@%_%q.S .pzMTd'[um$gkw6y TkHw=k &sjL{8hhaA.(qpǎ'1_S&sz|ODDD53{#n>C7%~CDܢwIsg" \p{:|)R'-ZdĆ>pM}5v:}# Ҩ?gb'˱::t Booa .s3)/RS3YEﳩ4/mvr8YF)76I1%mi>X;Ki8z̜n}멿(N~b@Y,8?GT]h!d }qpU3YA-] <Iy&xI+r2me6&c1_ȽqX۲ ]>ޙH" Ht+!ep\PHJzKY>@ڃύcfesnaJ%&0GzjM} 0:Xi>r6q#Vklx0ťi42)Gk391W49Empđd{dkʞJ'փ$aM_'oݡ)v0 ]QD~{Wy\Ҋjf_?c5vv*R-8Nj K>d)fm:hhr_/ty#cwr/Y3C``*ĮKRڱՁ2B"P-vpSNևذm ޯ8ظٖnsRXr'܂Ջ~.%EF"nLx.X];(9|Ee@>c;Cy|Og z4^O^#=~Q+&%< ~dže$_`dؗ=5Gl|- XV DDD-/3dd4|Jܺ3RbMn˄Co 嘠fd;ڊu,0?ɯDެDb Uݯ40b)޲9IXLbȵa!+mD~@P #qܡ7~q&!&X܌R@]ea>|Ds|=8sޅy?)(w}Z+\헩:[dzҘf'YύFwiYa˱hy$l"~7c~́Kn poZ`Oo7M],h7Eu|`a`$k?Sx:J-e<\whњ:lqa&)oi_8L(s'Ps[ziNiAț( +119ϐ`yp3)`> i,owd,Iۜ|dlcH*^-~Ħ-7̛Lܹ$%fR[rc/˥8_ˁQc|?a[RJCW/tc"~"88O% * Ki>ɦgxb"Z9=8y__^m_7z@J;}̱{IM$-~es{ye${Ce ǖ'qp1򈌴KHg_G,O m<}@oǹe,),cc7/ о 9'Œ-Q~ç[0e/ DJuO : 3Cf?