pax_global_header00006660000000000000000000000064137147563700014527gustar00rootroot0000000000000052 comment=a7a9ab8f4e88f3596637b06d3a0fc66def3d4dce GM-Assistant-1.2.3/000077500000000000000000000000001371475637000140045ustar00rootroot00000000000000GM-Assistant-1.2.3/.gitignore000066400000000000000000000002171371475637000157740ustar00rootroot00000000000000gm-assistant *.pro *.conf *.desktop *.entitlements Makefile ui_* qrc_* .* *.o moc_* *.qm *.log documentation/ doc/dev/ *.pdf *.aux *.out *.toc GM-Assistant-1.2.3/CHANGELOG000066400000000000000000000150121371475637000152150ustar00rootroot00000000000000Changes in version 1.2.3 * Combat manager - alternative ways to manipulate characters in the selection window - confirmation before closing a game if a combat is ongoing * renamed variables that were previously named 'interface' * bug fixes Changes in version 1.2.2 * Transitions - from Phonon to Qt Multimedia - from libxml++ to PocoXML * dropped dependency on libmagic * minor bug fixes Changes in version 1.2.1 * Transitions - CMake as a build system - Qt5 * Combat Manager - confirmation before leaving - fixed height of rows * Character table - single item/row/column selection - item/row operations disabled when column is selected (and vice-versa) * Others - Italian translation - newly created items/characters/properties automatically selected - file name added to the window title - simplification of the "About" window -> "About GM-Assistant" - new "About Qt" menu entry - some bug fixes Changes in version 1.2.0 * New features - possibility to undo/redo modifications - metadata added to the scenario - possibility to move characters and properties - new tools: dice simulator and combat manager - scenario file format changed to an archive containing all audio and image files - save of the expanded/collapsed state of items - confirmation before closing - possibility to choose the language of the interface * Interface changes - Scenario replaced by Plot - Skill replaced by Property - Player's name replaced by Short description - new shortcuts for item/character/property manipulations - reorganization of the View menu - ? menu renamed Help * Others - audio engine changed to Phonon Qt module - a lot of bug fixes Changes in version 1.1.9 - reorganization of the info dialog window to fit in low-resolution screens - auto-scrolling in table/tree widgets when adding/editing skill/character - new options added to the configure script - default working directory for Windows - new icon for the edition in table/tree widget - missing status tips added - "sound" replaced by "audio file" - better rescaling for non-SVG images - link to the web site updated - various bugs fixed Changes in version 1.1.8 - Interface menu renamed View - ambiguous shortcut to add an item modified (now Ins) - crash when trying to play music or move the slider without a selected file fixed - various interface bugs fixed Changes in version 1.1.7 - menu entries (with shortcuts) added - behaviour of tree widgets more coherent - pre-filling for the edition of items, skills or characters - full edition of items - bug with the display of the logo fixed - file extension automatically added when saving - better handling of sound errors - corrected and improved display of the slider and the position in the music - dependencies adapted to work on Debian, Fedora and ArchLinux - desktop file added - use of the GNU make standard environment variables C/CPP/CXX/LDFLAGS - various bug fixed Changes in version 1.1.6 - depencies modified to work on Fedora - error message added when a music file cannot be read - display of a default image when an image file cannot be read replaced by an error message - useless source files deleted Changes in version 1.1.5 - bug with image filenames of less than 3 characters fixed - fusion bug of games with missing files fixed Changes in version 1.1.4 - dependency on (rsvg-)convert made optional - SVG images display issue on Windows solved - behaviour of the Del key in the character table modified - Bug on start-up when the last opened file does not exist (Windows) fixed Changes in version 1.1.3 - installation process made more generic - README file splitted into README and README.install - compilation warnings eliminated - icon built during compilation Changes in version 1.1.2 - deletion or replacement of non-DFSG-compatible content - standardization of the installation process - manpage and detailed copyright added Changes in version 1.1.1 - Issue with non-existent recently opened files fixed Changes in version 1.1.0 - new menu to choose displayed widgets - basic settings support, with recently opened files, etc. - save files extension changed to .gma - new type of item to display pictures (with full-screen support) - new button to enable music looping - size of files limited to 1MB for sound effects, 20MB for others - new keyboard shortcuts and status tips Changes in version 1.0.15 - resizing bug in table widget fixed Changes in version 1.0.14 - the slider now accepts wheel events and clicks - modification of the child-adding method of trees - now requires SDL_mixer version >= 1.2.12 - reset of the sound engine when loading a game file Changes in version 1.0.13 - Dialog windows are no longer reset on minimizing/restoring Changes in version 1.0.12 - bug when right-clicking in the table widget fixed - restoration of the default behaviour of the table widget header when right-clicking Changes in version 1.0.11 - bug in finding translation files in non-linux systems fixed Changes in version 1.0.10: - resize problem for rows in the table of characters - reorganization of the menus of the table Changes in version 1.0.9: - bug when adding a new item at the root of a tree fixed Changes in version 1.0.8: - crash when moving an item into another (due to creation with bad parent) fixed (I hope definitively!) Changes in version 1.0.7: - crash when moving an item created with child (or into one) fixed - default widgets get automatically the focus in dialog windows - default work directory set to the executable's directory Changes in version 1.0.6: * Trees: - crash when moving an item into a previously moved one fixed - resize of the items when moved * Others - path (translations ans examples) issue on Linux when using a launcher solved Changes in version 1.0.5: - crash when typing 'Del' while editing an item fixed Changes in version 1.0.4: * Uninstallation: - 'make install' creates a log file which contains the list of the files to remove during uninstallation - 'make uninstall' removes only those files and the empty directories instead of a raw 'rm -r *' * Others: - the configure script displays the list of linked libraries Changes in version 1.0.3: - crash when moving an item in a following branch fixed - minor modifications of the french translation Changes in version 1.0.2: - crash when clicking an empty tree fixed Changes in version 1.0.1: * Trees: - drag & drop bug fixed - selected items can now be dragged - right-clicking an item selects it * Others: - non-player characters can be added in the table GM-Assistant-1.2.3/CMakeLists.txt000066400000000000000000000170121371475637000165450ustar00rootroot00000000000000#************************************************************************* # Copyright © 2017-2020 Vincent Prat # # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #************************************************************************ cmake_minimum_required (VERSION 3.1) # project information set (PROJECT_NAME GM-Assistant) project (${PROJECT_NAME}) # handling version set (VERSION_MAJOR 1) set (VERSION_MINOR 2) set (VERSION_PATCH 3) configure_file(sources/engine/Version.h.in Version.h) # options set (CMAKE_INCLUDE_CURRENT_DIR ON) set (CMAKE_AUTOMOC ON) set (CMAKE_AUTORCC ON) set (CMAKE_AUTOUIC ON) # source directory include_directories( sources/engine sources/engine/items sources/engine/modifications sources/misc sources/widgets sources/windows) set (PROJECT_SOURCES ressource.qrc sources/main.cpp sources/engine/Branch.cpp sources/engine/Character.cpp sources/engine/CharacterList.cpp sources/engine/FileMapping.cpp sources/engine/IOConfig.cpp sources/engine/Metadata.cpp sources/engine/PropertyList.cpp sources/engine/Scenario.cpp sources/engine/Tree.cpp sources/engine/Version.cpp sources/engine/items/FileItem.cpp sources/engine/items/ImageItem.cpp sources/engine/items/Item.cpp sources/engine/items/ItemFactory.cpp sources/engine/items/SoundItem.cpp sources/engine/modifications/CharacterModification.cpp sources/engine/modifications/MetadataModification.cpp sources/engine/modifications/Modification.cpp sources/engine/modifications/ModificationQueue.cpp sources/engine/modifications/NoteModification.cpp sources/engine/modifications/TreeModification.cpp sources/widgets/QCustomHeaderView.cpp sources/widgets/QCustomTableWidget.cpp sources/widgets/QCustomTextEdit.cpp sources/widgets/QCustomTreeWidget.cpp sources/widgets/QCustomTreeWidgetItem.cpp sources/windows/AboutDialog.cpp sources/windows/ChangeCharacterDialog.cpp sources/windows/ChangePropertyDialog.cpp sources/windows/CombatDialog.cpp sources/windows/DiceDialog.cpp sources/windows/ImageWindow.cpp sources/windows/ItemDialog.cpp sources/windows/MainWindow.cpp sources/windows/MetadataDialog.cpp sources/windows/SelectCharacterDialog.cpp) set (PROJECT_FORMS sources/windows/AboutDialog.ui sources/windows/ChangeCharacterDialog.ui sources/windows/ChangePropertyDialog.ui sources/windows/CombatDialog.ui sources/windows/DiceDialog.ui sources/windows/ItemDialog.ui sources/windows/MainWindow.ui sources/windows/MetadataDialog.ui sources/windows/SelectCharacterDialog.ui) # find libraries find_package(Qt5Widgets REQUIRED) find_package(Qt5Svg REQUIRED) find_package(Qt5Multimedia REQUIRED) # Poco find_path(POCO_INCLUDE_DIR NAMES Poco.h PATH_SUFFIXES Poco) if (${POCO_INCLUDE_DIR} STREQUAL POCO_INCLUDE_DIR-NOTFOUND) message(FATAL_ERROR "Could not find Poco.h.") endif() find_library(POCO_LIBRARY NAMES PocoFoundation) if (${POCO_LIBRARY} STREQUAL POCO_LIBRARY-NOTFOUND) message(FATAL_ERROR "Could not find PocoFoundation library.") endif() find_library(POCOZIP_LIBRARY NAMES PocoZip) if (${POCOZIP_LIBRARY} STREQUAL POCOZIP_LIBRARY-NOTFOUND) message(FATAL_ERROR "Could not find PocoZip library.") endif() find_library(POCOXML_LIBRARY NAMES PocoXML) if (${POCOXML_LIBRARY} STREQUAL POCOXML_LIBRARY-NOTFOUND) message(FATAL_ERROR "Could not find PocoXML library.") endif() include_directories( ${POCO_INCLUDE_DIR}) # linguist tools find_package(Qt5LinguistTools) if (${Qt5LinguistTools_FOUND}) # ts -> qm set (TRANSLATION_FILES translations/gmassistant_fr.ts translations/gmassistant_it.ts) qt5_add_translation(TRANSLATION_QM ${TRANSLATION_FILES}) # update of ts add_custom_target(update COMMAND ${Qt5_LUPDATE_EXECUTABLE} -no-obsolete ${PROJECT_SOURCES} ${PROJECT_FORMS} -ts ${TRANSLATION_FILES} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Updating translation files" VERBATIM) else() set (TRANSLATION_QM) endif() # executable set (EXEC_NAME gm-assistant) add_executable(${EXEC_NAME} ${PROJECT_SOURCES} ${TRANSLATION_QM}) # link libraries target_link_libraries(${EXEC_NAME} Qt5::Widgets Qt5::Svg Qt5::Multimedia ${POCO_LIBRARY} ${POCOZIP_LIBRARY} ${POCOXML_LIBRARY}) # installation set (BIN_DIR games) set (DATA_DIR share/games/${EXEC_NAME}) set (DOC_DIR share/doc/${EXEC_NAME}) set (MAN_DIR share/man) install(TARGETS ${EXEC_NAME} DESTINATION ${BIN_DIR}) install(FILES data/images/GMA.svg DESTINATION ${DATA_DIR}) install(FILES ${TRANSLATION_QM} translations/languages DESTINATION ${DATA_DIR}/translations) install(FILES doc/gm-assistant.6 DESTINATION ${MAN_DIR}/man6) # desktop file set (DESKTOP_FILE_IN ${CMAKE_CURRENT_SOURCE_DIR}/${EXEC_NAME}.desktop.in) set (DESKTOP_FILE ${CMAKE_CURRENT_BINARY_DIR}/${EXEC_NAME}.desktop) configure_file(${DESKTOP_FILE_IN} ${DESKTOP_FILE}) install(FILES ${DESKTOP_FILE} DESTINATION share/applications) # API documentation with Doxygen find_package(Doxygen) option(BUILD_API_DOC "Create the HTML-based API documentation (requires Doxygen)" ${DOXYGEN_FOUND}) if (${BUILD_API_DOC}) if (NOT ${DOXYGEN_FOUND}) message(FATAL_ERROR "Doxygen is needed to build the documentation.") endif() set (doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/dox.conf.in) set (doxyfile ${CMAKE_CURRENT_BINARY_DIR}/dox.conf) configure_file(${doxyfile_in} ${doxyfile}) add_custom_target(api COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile} COMMENT "Generating API documentation with Doxygen" VERBATIM) endif() # user guide with LATEX find_package(LATEX COMPONENTS PDFLATEX) option(BUILD_USERGUIDE "Build and install the PDF-based user guide (requires PDFLaTeX)" ${LATEX_PDFLATEX_FOUND}) if (${BUILD_USERGUIDE}) if (NOT ${LATEX_PDFLATEX_FOUND}) message(FATAL_ERROR "pdflatex is needed to build the user guide.") endif() # list of PDF files to build set (LIST_PDF) foreach (LANG en fr) set (TARGET_NAME userguide_${LANG}.pdf) set (TEXFILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/userguide_${LANG}.tex) set (TEX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/doc/userguide/${LANG}) configure_file(${TEX_PATH}/userguide.tex.in ${TEXFILE_NAME}) list (APPEND LIST_PDF ${TARGET_NAME}) add_custom_command(OUTPUT ${TARGET_NAME} COMMAND ${PDFLATEX_COMPILER} ${TEXFILE_NAME} > /dev/null COMMAND ${PDFLATEX_COMPILER} ${TEXFILE_NAME} > /dev/null COMMAND ${PDFLATEX_COMPILER} ${TEXFILE_NAME} > /dev/null MAIN_DEPENDENCY ${TEXFILE_NAME} COMMENT "Generating user guide: ${LANG}" VERBATIM) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} DESTINATION ${DOC_DIR}) endforeach() add_custom_target(userguide ALL DEPENDS ${LIST_PDF}) endif() GM-Assistant-1.2.3/COPYRIGHT000066400000000000000000000215321371475637000153020ustar00rootroot00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Contact: Vincent Prat Source: http://vivicoder.github.com/GM-Assistant License: GPL-3.0+ Copyright: 2011-2013 Vincent Prat & Simon Nicolas Files: * Copyright: 2011-2013 Vincent Prat & Simon Nicolas License: GPL-3.0+ Files: data/images/* Copyright: None License: CC0-1.0 Comment: add.svg: http://openclipart.org/detail/16950 check.svg: http://openclipart.org/detail/159733 down.svg: http://openclipart.org/detail/12114 failure.svg: http://openclipart.org/detail/166859 image.svg: http://openclipart.org/detail/25499 pencil.svg http://openclipart.org/detail/3297 remove.svg: http://openclipart.org/detail/91861 son.svg: http://openclipart.org/detail/24063 speaker.svg: http://openclipart.org/detail/168846 stop.svg: http://openclipart.org/detail/57745 uncheck.svg: http://openclipart.org/detail/33685 up.svg: http://openclipart.org/detail/12115 Files: data/images/empty.svg Copyright: None License: CC0-1.0 Comment: Created by Vincent Prat Files: data/images/GMA.svg Copyright: 2011 Vincent Prat License: GPL-3.0+ License: GPL-3.0+ 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 3 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 License: CC0-1.0 To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this work to the public domain worldwide. This work is distributed without any warranty. . CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. . Statement of Purpose . The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). . Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. . For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. . 1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: . i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; ii. moral rights retained by the original author(s) and/or performer(s); iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; v. rights protecting the extraction, dissemination, use and reuse of data in a Work; vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. . 2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. . 3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. . 4. Limitations and Disclaimers. . a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. GM-Assistant-1.2.3/LICENSE000066400000000000000000001045131371475637000150150ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. 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 state 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 3 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program 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, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . GM-Assistant-1.2.3/README000066400000000000000000000014231371475637000146640ustar00rootroot00000000000000Vincent Prat (ViviCoder) Simon Nicolas (Dramac) This software is designed to assist the Game Master in a tabletop role playing game. It enables to build structured scenarii with music, sound effects, image display, character table and to take notes all-in-one. It also provides useful tools such as a dice simulator and a combat manager. ***************** * LICENSE * ***************** This software is under the GNU General Public License v3 or later. See the LICENSE file for more information about this license. ********************** * REQUIREMENTS * ********************** Once installed (see README.install), to launch GM-Assistant you need: - C++ standard library - Qt5 library (including the Multimedia module) - Poco library (including the XML and Zip modules) GM-Assistant-1.2.3/README.install000066400000000000000000000010651371475637000163330ustar00rootroot00000000000000How to install GM-Assistant? ********************** * REQUIREMENTS * ********************** To compile, you need: - CMake - g++ and the C++ standard library (with development files) - Qt5 library, including the Multimedia module (with development files) - QtLinguist tools - Poco library, including the XML and Zip modules (with development files) ********************** * INSTRUCTIONS * ********************** To install GM-Assistant, execute the following commands: mkdir build cd build cmake .. make make install (may require super-user rights) GM-Assistant-1.2.3/data/000077500000000000000000000000001371475637000147155ustar00rootroot00000000000000GM-Assistant-1.2.3/data/images/000077500000000000000000000000001371475637000161625ustar00rootroot00000000000000GM-Assistant-1.2.3/data/images/GMA.svg000066400000000000000000003424701371475637000173210ustar00rootroot00000000000000 GM-Assistant logo image/svg+xml GM-Assistant logo Vincent Prat 2nd October 2011 GM-Assistant-1.2.3/data/images/add.svg000066400000000000000000000242621371475637000174410ustar00rootroot00000000000000 image/svg+xml Add 2005-10-30 Jean-Victor Balin jean.victor.balin@gmail.com icon add plus fr-FR GM-Assistant-1.2.3/data/images/check.svg000066400000000000000000000676521371475637000200000ustar00rootroot00000000000000 green tick image/svg+xml green tick 2011-07-27 Jakob Flierl Haken Häkchen Tick Public Domain GM-Assistant-1.2.3/data/images/down.svg000066400000000000000000000426251371475637000176630ustar00rootroot00000000000000 image/svg+xml Open Clip Art Library green single arrows set 2008-01-29T12:16:43 Not exactly a remix, just breaking up into separate files. http://openclipart.org/detail/12114/green-single-arrows-set-by-pitr-12114 pitr arrow arrow clip art clipart collection collection glossy glossy green green icon icon image media png public domain remix set set svg GM-Assistant-1.2.3/data/images/empty.svg000066400000000000000000000046321371475637000200460ustar00rootroot00000000000000 Empty image/svg+xml Empty Vincent Prat Mar. 24th, 2012 GM-Assistant-1.2.3/data/images/failure.svg000066400000000000000000001205611371475637000203370ustar00rootroot00000000000000 Red Cross image/svg+xml Red Cross 2011-01-06 Rygle - remixed from Green Cross by Jakob Flierl cross red wrong incorrect error retry alert problem Public Domain Rygle, Jakob Flierl GM-Assistant-1.2.3/data/images/image.svg000066400000000000000000000565251371475637000200020ustar00rootroot00000000000000 Etiquette Icons hash mime-types computer icons Andy Fitzsimon Andy Fitzsimon Andy Fitzsimon image/svg+xml en GM-Assistant-1.2.3/data/images/pencil.svg000066400000000000000000000623121371475637000201610ustar00rootroot00000000000000 image/svg+xml GM-Assistant-1.2.3/data/images/remove.svg000066400000000000000000000165261371475637000202120ustar00rootroot00000000000000 image/svg+xml Add 2005-10-30 Jean-Victor Balin jean.victor.balin@gmail.com icon add plus fr-FR GM-Assistant-1.2.3/data/images/son.svg000066400000000000000000000144561371475637000175140ustar00rootroot00000000000000 Arrow shape A simple purple arrow with a gradient emphasizing motion. arrowshapepurpleappiconarrowshapeicon Jeff Walden Jeff Walden Jeff Walden image/svg+xml en GM-Assistant-1.2.3/data/images/speaker.svg000066400000000000000000001175111371475637000203430ustar00rootroot00000000000000 image/svg+xml GM-Assistant-1.2.3/data/images/stop.svg000066400000000000000000000332401371475637000176720ustar00rootroot00000000000000 image/svg+xml GM-Assistant-1.2.3/data/images/uncheck.svg000066400000000000000000000407441371475637000203340ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz View Refresh reload refresh view GM-Assistant-1.2.3/data/images/up.svg000066400000000000000000000432371371475637000173400ustar00rootroot00000000000000 image/svg+xml Open Clip Art Library green single arrows set 2008-01-29T12:16:43 Not exactly a remix, just breaking up into separate files. http://openclipart.org/detail/12115/green-single-arrows-set-by-pitr-12115 pitr arrow arrow clip art clipart collection collection glossy glossy green green icon icon image media png public domain remix set set svg GM-Assistant-1.2.3/doc/000077500000000000000000000000001371475637000145515ustar00rootroot00000000000000GM-Assistant-1.2.3/doc/gm-assistant.6000066400000000000000000000014711371475637000172550ustar00rootroot00000000000000.TH GM-ASSISTANT 6 "February 28, 2020" .SH NAME gm-assistant \- game master assistant .SH SYNOPSIS .B gm-assistant .SH DESCRIPTION \fBGM-Assistant\fP is a software designed to assist the Game Master during tabletop role-playing games. It features item-based structured plot, history, music and sound effects, along with a character table and a note editor. It also provides useful tools such as a dice simulator and a combat manager. .PP It uses Qt5 for its graphical interface, the Qt5 Multimedia module for audio playback, PocoXML and PocoZip for its saves. .SH SEE ALSO For more information, see \fBhttp://gmassistant.free.fr\fP .SH AUTHOR GM-Assistant was written by Simon Nicolas and Vincent Prat. .PP This manual page was written by Vincent Prat , for the Debian project (and may be used by others). GM-Assistant-1.2.3/doc/userguide/000077500000000000000000000000001371475637000165455ustar00rootroot00000000000000GM-Assistant-1.2.3/doc/userguide/en/000077500000000000000000000000001371475637000171475ustar00rootroot00000000000000GM-Assistant-1.2.3/doc/userguide/en/images/000077500000000000000000000000001371475637000204145ustar00rootroot00000000000000GM-Assistant-1.2.3/doc/userguide/en/images/add_item.png000066400000000000000000000500221371475637000226670ustar00rootroot00000000000000PNG  IHDR' pHYs+tIME ;$tEXtCommentCreated with GIMPW IDATxw|$Ћ&"*wDfo{ "Uz/&HET A@!Rw۶c`!Ar|`g;Pр ]DC@ aӦM*ec w5B0HI0; EQ4MS<%THST b5 E`NJꪍR7wv`UW'UT޾|a7:דS~F[/x{(aYSy럢(dY$COMB(OZ慹)o(h,tZmݨZcVy{[3dᦊ??w !fOum;G ۳KM/>+mK| eBNWv^~ءi!w׫|y˲/ؽz !d;>eivs WoTQg=kKW@Q=YcTf'>rWmٮ{k~_ϿykGykT#J82s?z/3;gE`(a:>vy򋗯(\]V )Jq\J5oئݫ'}ahSxk^T/9[Rt@ݨHoa?MXj#j rrkXK]%IiZR)Ә-*a~~KNZՇSD0T sۦ -{wu#k栠/ x9nǁ^T-+SԿ[Yn#bѯeWDo'0)iV+2Rx={"R.H"0 s/:-8ݜ^ya5U co׉l'dIz'DZ'K%y`Я>iYKV:NN[v<տeJU;aC0UA:LuȽ8yup^ 5h^\A0! ?\D=U5LrOu:!8yԤy wYuznc{ݮAYB-4+ g$gMZB-oN#LV@rjۍwE=Z6<,< ޅV^XXXXX0A딝]D{ \DTA!ATA!APuU APuU :APuCU :A|S{.^?:^d|.z}%iTFn׋~O?Gy A< M5RՍ6+nMbw^|EQAl¸zʄ߹gf 1ѫ{wtBp^~F#滃֬Vy_́9 6_ˆuڷ_xAPuo4j ?G`بG~8aCԮͲl.O'Ozs^1l`ؿAjك,Y0?#3SW[_PPrڧ:=YlKfֲfQcyJRRS ==ײy'\.oզϜeKK~XĞ(+)fKۼad_xg걟抢x=!yaORP| z/֭+έ Vw\Μx`u`0W]+bPP`ƌz^y酑#nf䘱ykeoX[++0 `]JM rCEGG?3;rZZL{ᄂ[_a8leA$ý10[~/rC^ |i/4dynRis: xWZVW{ w צL1+eYo6ox ]v=zVKg~/fXG.\nߵg|~JQn؈} et< 0Bhެe6~S&4>l1L|ѫS&[´Z<}ʤK;~h4rV]M~i/g C4q~~~1Ϗ|卷h)XYYyqzZzGÇ ^zͤW^>dISGӦlij~~-wӇeYvĉ(H4hSRRڷoߜ !Ƚu<[,&$$:uڵk\f -Zjs nRKD:erp3JՊ :A!CT :A!CTA!ATA!HU@Uw3WRnQ% 5Ƒ~:5TUW\N)bfSE_Q@Adr=y6!Oj/ŧе!iUWF^͹=4RA&D!@ 7Z^9y^+++I|fY"(2a! 2!皽`)RSUW~_.fի$M$R+p_m'] l 3e,H*+C|%!o׵ZM!iDȄ{RVoA%D&IѨ,yiV(!9&&鈈ߍ8ݜۅÉ,ڑdeuu,4b|d5ZE12h40:ڸqcpV]QH= Hy7UZUdXc)PP EQ಻YmVktɛnmP\N[3zێ$uq*J)8n;wefeڿWOЩcqcFj|*Яkٜyˁ9vmZO8Ag-[:1))(0pݞy[!(NIEI+n,Y[gd~szaFO}%\t۝TL9wgZ?\p>̚37zSϝsL`( _̞e`-i+//-l=6aek7l0n,̘_jc97)+y ;$KIEI 3~h6 ?JVEBu! 6$Hwz){Xq&4l2MI>ÿ+G8nl2O??ܛ2YYٹy!!oBs-ɒL8AEt㭣:׽uHwA:<%X"2L6L <櫜miͽ,7mZg}Bȩgfϝ a,Ir@R;$SL/ʒ4O۶t-59 IRESSs*,Y"3++3+kOuz:|;?qɊYYYYKVl1+!1Q$n.[`*!Ys@:,'HJ)_:H|Gp` :8QyZeTye /*; \a7_C/Z|IJէgbܛr֭?yZzz~G!R-6ɩG.䆘@5"uLdBUMA%Q%* FFwWK=ѥ[z}q*|5j< }%gs-c\JϨԜIe2dJE"q|hVI*7K

a !Ye'g* j w&#F"04-K53CV&̄,˄ikXXW_Dm}9rȑ}UѣGoy~)1~_FJJQn%mddҚ5)Jk4ƔH-O@qHvZjjjB@,I p-aa4MDHGi4: N_)bCJa*WJQT׮]wi2| 5u*Å ErDeBB 1k2yT _t0]r-1]g&*!R؏?}$A(BDdA҄;\99sZn{PNȽrHNgԩ$+4B(ʂ P^3g>U[&Zll$Il+/Cq&ެEQ\|?bbB*g^qHAIzseAy?Ek4~ig-î~=oްnӺ5fi՚ujzׯ^)J -[SRV,zy Ք qH_~q8N8%Q22|HYqHT.d͜DagH(I%y^'*Uz|wi6{6Vj^wʕʎyЛqfVVad^H娮BeXzde$Vh2STjZMMM>=Kf9lj0GCfel6 9$۰{!3¬d97{iz6ߟq:!3Sv&QƜ@D$)<))%&TvzVMKOk5Yw~HyؽujtшrN9O ̙޽S[ꛯtf  Կ'fe<|˖8Qǟg!Rm]_|!9P4MDyYݸqٜ%c00:KOxY R6ĞgOYfZY(fW$$8Ƽh(Jr~(9:‰FQepH$oq<"H7?ӋvsY[5[K+:u7VDdr n0foVO^eLzr{RjVGA |5˫)YV;o͛}yJzIvuqOw3[EPu4>WڶmҶ-TDTA!ATA!APuU _<7B*H~S l csyir`#;˵׹z#D֑Y}A)bѫӵxCzhf"##gSQFM \[&,SDBh?rtSmʭ][GwH-K6P$$$,!4J!Fu-ɲl۫C-[`@*!7f~( "% $I5)FEl!!w IDATqXh8a&Tr/%:sZ 8bA_!DDJA  Ұ^b<l0 ':>D$SI6Do9|BoʥVF+fוrHN+/<3y}S@ "ФOLiݽo h|΂x+˂mߞpa7YЛriъUWFll TK_'78f WIvk<@ @n>;l>S߉p񒾃3v'N3'ЛriъGeB^T_5Pk kZ?g@&,$ /П?Ƈ1FxaBHBb?r?IFf֭zP.2Z1Bs]ˉ3drv?>xB(Bj&I'wZX)[{eY5O9j[N͋-f\ZkebfY(C ps@ p)$e; 'S wCu߬]]Q( 6DU :APuCT :A!r3῞{*::75{|0!:0'}5oA՚j~5a^Y]i&M+%~>w7۴ndZfR>cWÇ ڽm/?Eټ.̞52331!6A<uN@$,˄b^?q7F}<аQϿ8aa謬ܼА7_}Hk>G0!:qZVt53 ǏWWh8ޅy //o=.rt|ʊk veo>ظih? kժpkYм#̒jeYECvcڿC(ʲj֭[ê\tIy:m欮]ZjܲIeQ|MѓƏ=w~FBT!JUW 4ij4Yu8999eYјبQJj[^~}Z6-=}΂=զ1+!1QStQWgpRV`/YuH0 !m۶=uqd2)s裊 ʅjEqw8. @pj۴i`6u:cUWFDQtEQ/^1cFDDMyy99*% hZ]|[nƍ/]1FL6lX2''رc r9Pge1AA@^ =tPhhhzv{PPf_233Ϟ=k2˗,kξ^C(J_Sњi-[r}ɲe:ԠfΝ;wҥ۷-P˄< fMnݺKGHUJ;$+BSRRԩf hhPEQMS4c MMNܳg!KW'!UHuCr׮]z#Ay^]r5TÆ ;ydjjjB404MSEP4C M3 Z;v`X#Xnڣo3bC㐬lRR˲hFŨ( $PRhF4CSF!+3ab-),'&fq{c.T3qH.Vx4͵kBCCu)aT*J%B<ަ^z*ahC4EQ:&444!!jʩg>z:( /;xa# GOA/[>p؈F,^\aH%CrxsH0333aj (F bhQh02)JEFt4EŪ ä+7g={@(1z䔔^`^azf뉉[`kףlTj2 >xDUPQՄ %9aP*b=ɓ'朌6hj(BdIwŅX333.]jsrrfCť&UidF1++l6SN]KCCuZ-岦4l(11/KOO.]T}!EvH.LN:|3gL~WSS]N'ea:]XX,ˮXB]x񩧞 -{Gu]F%$$0 ӭ[̸8ժj$I & C )tAPu~W^w\fo߾,vۭ Oٳg@@]UWtȑ#AAAIII Ȳr;wnӦ WUWe3}c_=狙3&4~ofUkֽqӖ􌕋szܾkg`4,Zl톍ƍ@pH.Ly~yn˟܆߹ר=UѥR,e%I u#;4|[սZN뵗[,Y͛kX`0o=vl⸱&S)l wiY!eb*Dun[kڴ9 kbeVVvVV+==w`abR(׮_6 m]uCS8X,&I!nvH.ǴJR|t^]bg3f J!-[>v$FӳsJy^=iht--VϏކ!¦:-k` 8mS>iI.\}?lUرo%V-ccc ;$k׮$ɅW/0jA^9ɗhVDsK

M}`C7b>m#)ו023¼^g#ÐR?'O>pAo R`iRھ)ɑ63 i7P!HX,IIe^AAAbRb)Tzn4'!zw e/-9Zf *m,k5QxHaYӬ>n%$IR9$^6lYEQ&:Z&&K 'ja>B+BȦ&:Zב!浪ZA0U :APuCU :APuCT :A!CT :A!HMje9Z\Nn(5".*UP`Pz cfY.gM^ydM HSF]yCLǬK\׸Ab+eeeg5y ߗoi)UpʨܜV y&1?& VkT@k|__:VM HSFՉh 6qWC(I)c8t9k`@|kZ@J"j UW%B~_~q$B(BkcVVH@K~ݺ5+66?1M`:-\q{/8eQ8SN!cেhp 1_%TPFBrϜwÇY8z 3\Gohf` 'v\uիcg4dfyt۷oխ<:9s V89pmh(V͗ig~+7#UՕĹv"p-]$ҹIz:Ĉ_za' ׮\Xk4gkѷ;T*ECb:xPv?Y%tIDATϚueذJ|"NId Mg+Un^N4FkOM\99;+02e ˗.(XUcK[O3 aNZ99*iZqOGU\GVEpINt;:oY->>b(˗7'_̨n2؂Ch5gdd ڵؚ={qÆ(Qаe5,k|T:#L!8$]anvʵƾ0jЀeږ?OwnVvyVMyj{{h6))ybϻ\ 8Cv>>}Dl~_, ziB-oFYƶrednaY"!9?WK>P)&aJ;,^-($ŻA*E=c&cמX(Օd@壅_}FӗPTӈEN<:4~f~wLj:4L1S7ޝ:_u'ڵ-2cyTWC1xursrv|k2aYY !.Yf e9Lߵo0J^MYYDP.e`.MI[ty64䛕%j_FfO>c4{qΜyU+\%+V鸊a h~\Y&$˒,KDdY$$931 ϧ\}߾s~/,y68o{ѿoiƍ?xog7lٶ='7Azf%IzE^o $I7m>t6d'l=pl׺ Zm:$ yfhccSN܂'/pK[)/O: zRR?|ҧ&.p~WM<C Ze5, .W t͛iX`Џ9L~i|xh4NRxS&d 3ƌ>˯]Rғ8nD-qx#"K'(| HDI%Q"'` +++4$Tl (_<>9/K@J;vPf]i͙r]z:]yN˼(,P@ ˼( N[yQDdI$Q$OvrtaJ--1t(˪M&Z;* RVObR3Lf}+fPwiѼُǏ{[-?.]'2e _ qq6go quJP jBŋehݼ.0AW;oz9xof9՚Zv?$䳏>tb#Y+ו53>Z" @n0۶'D$ŹΝ8onT#j - ~<~Iơ!!F OuzO,_)S`٪Ux+\w:*fhFŨXZ#ɲ 2Q)iMZv 侯ь_]a !j}׮_vvTWȔ- ~k\@BoˁpcHQ^˩SQ-~@Nƞv-anNӰlZzu}FyڥSW6e`޺mg/Z<;8(XjyK-:)Ω(ѡUSܢ:#dJe,ƙEse7Qƒ9B[zsG-p[{?|{Pı㦦#~QVDS6oJ+PF9ABB ׼˲=~mՖEbiŝ ΔX4仞>s~T>wF0aN}0Y8kJꏏ]qyqr,g~_}hmooo|\\* yd OM%9<8u%-++"Z 4ФMB-^Vr+W=]iy~'^~MAseK>߽Ң>(,TY7h SSS=`o|s&^֝?LM2&BDQyzgTCVߺs+=-]6_4tغ=$RXXa EA>#dՙd޽99ڞ6~|hQ,UUO=,,10p5e{ɉ!L0E$!%hT3VhG k7TeGi< II%K'Ni5%eΝ33-=qRqOIU>WB$"TTݡGp9@AV~wwm>\,l ۶G8K9{HH̺uӌ~_WQkmuZ)--)doȎ&d!D N=,/J {pQIsm[8&wNw|G6}BBLii]@Q^~ҥ8iƂΙ>?8uJarZJZY/%3xgأ)N1`Qm'cS<NsGS$7@2V>c0AК͝faSDEqkkͦR·o7半 C 1\r@EIDH K1\Ƅ[ǯm^O-_YyUu>nwHZ(wYβeesssˠNbL$b)KONOQ@XgͺYY>{640@kh(de]\ hY)|Ԯ[;y}c.u#= vҤ{ݿhlPG0B 81$%e mi1imup$xh!1P\8pdNT8zTJUd5az=J]Z@\(!:6mpZ|/߯bpMxih)pd.:*Z’f$)8,P/hõc PTiõ2@CDm]5],%IXk%_P(Ȑt30 0޷` $ [@2..prssjkk\.ZDP(={իL&HD"d2\n}}h4XzѣG+++H$Bmm-;wބ Fж-Lfnn.''Gp8 6hs0 R999f'L"N 2$==Аb@TWWb, @X,b-`Xd6Юl"C@p$yyyB\.,n}}ˆ@:wX !}2 |dտbS~Q({l^ݶyPBN`&zk`w /`i6ZEYmǸ|SH$2L po(**}_Q6M$I$@x3"BAd2۟cWx!EV&ٴRAh.M𬦖,vz]7$gLr1o`>8"z^ҭ m-Mۉm,-;y1I)UYٹɷc0z.tGgt㘤26mTfcU"cC:I$<}~F<"JXYpne_zy{PY$)=a\ʍ26yѳr[o*)+Pd=\n^bS+*"OA,YRYY9p@Y"=N;N]4}kj>={ TU\6Q[HӤn_b@+oh=Μn^5Yqojksy=vVWU l` <A3 :>AT.D\@?_o?|2~>|x>^{6h>&21 !bguF {Z}EKP*w͊.B*Jj*Eє!{$"zBz]Nd9d y1rRQRRR_Oogz8M0C=|!`0 -I *DfIQÆ >7{^UvV:B}̩V0iH]r;Tu/U5M#(<*-~H ໪*O55CTu5PQi~4sďyxHY)\= fZT ,-)C-ݴ~Aq`v*J[՛ bf2"ƭ=uƛFCCBF׫S( QG1ڨ֤=6 ?twr!?q؜Y>%9H>)4rH{6-7KU5*R)x&U켿UX__ߚQ&Sau59f/0?:i)B(mBi! W]"cL&u!0e c<2:9FD5 !TU[,AL.-;kB($&b1#9:j"BlDTUuM=N֐u&/' 7n;#$6(*F!ҨS--ZS(eZT3Oga84ZyoE;ԚK7ڄ諫Mįn jjq)77"3 6KfffvvN^L&ߕ}⏧Q(Pmmm6ɔJOD")((D X,k~~`$.\ZvBHYYo~xտ1Хض#Lo7NHLL422"bzmJԡF5F.[cħi R(AL.-; !/0h4ťeC#B.vSG9Y$*,MG_(/G۫֕ˆ8P~OȡGH$ 1m@@rm! 7z 譕XM7ROVNG?}|/_1>FFn.-vͻtV6,^Gb+++O::ee%ΟG/;)I1^~AMg8/jhd}x9:##ǎۯGgEDM:I5RL{W'G|w?ضEӝk5mג+qe7%60,,"29F]]X3ӟ}K<[MTVgꕽ{Ÿ\.7$,<]YM744ૄU|"xH5y::wߞfi 4ZAa!=k=~puf:BMh^&\P4#BiZZsr󊊋{"KJMMFf;|萅,Z/&Ӷ-'E2J|B̕Ҳ26]{w9&d <&av>}p899{~o}$UAEE5:->&X\RpLhBjT6/ٟf@S%>&BXT".M- u\C&=.2pѣO>׆uk?}o::y>WTuttL_Pp=1DΎ3ee}|px)ߝR[}.Ax_YYIiΝy+ho7 !V[[|) !444Bg!VVV\z ~h-޿߯ѣBJJJFkf2t >w`'BX䘸x=]իKx/ :uم?|1{&a>t!؉W#''7xt~唔M*szdF7̯zx n4:Y+Íy| p } ƕ r q0K̇' dffB{Om o zz@o֞߻7Coy= hOiƦ9ϲ>|Xz\o&m2+55U s+CIWoڼn*[)m^wfFRXļ9# g2:o߀lOp-{v-7/oÖL7z-|OeljwY< 'Xܳ`HoUuӪkjClkjDllja0llG߻OkfIY/ޤ#v5q,WtOݔ഻a>=y<0!6yTYYMȟ!?f<{vܙ':=)z|'z;7]=#/]eb@P~^4}%l}}5UյVݾ- ''xc11ld\.7J7[MuPM޼{C׭7ݼi>? u o߾{DpI9v݋&ֻWF}nߞbeuaCŧ,fZҎOmﮝ? &3kh۸iׯE۫JN2o1.ؑzz)gL ܲqC)wiMWNyБC GyОl >=]CLRaaў~л89痝f>|k r73.2*ZYIymrKG:b*F vxk}R9sΎm[ݴ͗FӚ7#v:m kjj& HXiKAAAϞ=/߼p S`4!v97b`~"s^OÞ`nOff̯@ ozk ޠ= 7zހoO7D`}vD78RaX37oaa!y' ..?Lѽ]Ov bL`xII{3iv QI  7 7['5jm؞m6ͻwniY^ wﳌMͧ;:wA%t\7B -h\wX*75!|ԥ߹o<}Mp١:D}Da{L QZo^Vxȳ/49ii-o5e]:t/^Ug7q.s&%SyȨhg7 f_RiB )&82:FL" )2޼ \ydO-wL|}1TVoBi]`ߧϟ3,O+//ݫlR_֮ׯ<2UUIܼ<)ED"֮ZEihZkW<{!4w*eB(*&V%L_N M' _]b]OIFeѿ|>Q#Msr=~RYUh6f4HTQVNs FHNQq1B@__QmmLF/(D]C_OWhaQBHKS!ϱ٬%Lj<^a'.SV V3!"_wfݿ!F4A=|^FY>wޚ_#*%1CEG:: U*ɳooytE|?]1*+ߤؘH$>}<7/oKo-!,2ӧ'&Fs8?O_r¹L46޽/_64|371jDҚ۷=)b|h1G|_ TU׮Zv6~-ukt::֭zߞzwࠥˑcRҚ;^oƦsN\~P= f_5\RZjh`oa(\o/o/ >f\ ݶcC%ϥ5wޞc\ O޹ _7ӥ;rX_OQ>FFO'B 1e͚i3fC$ɥMr#FbhT>hO'srlvև}mm:r#BYq#-81|0zvNN&owep8cAQ#A\]DM[ z|7xႃ$sx9v O=x̓{BwqΞc .]8>+܅`Qwds㓎=ƷE#ʌСz#S&Om%/^D]MJL&#/]eb@P~^4}֭զD$lXnt=E|Qo4VUU-jQf gܳ٩fU,6jRݻBo߾A ttt┖ nSRZ*>r K ZG;}ÀkI !4䧟";۽/c^U v┩}mmuOuo|$$5 ʏ(3v?@'i il21q;;TQQQRR*,,ڳOڔZO9SXwߘLw>ZG;}f;զx7m;;m A=p2e|RT8VCC4\s=^ "i^o7=:aӻmb `#T͠ y7HړAZߤ0 x2eM"AA&Lz0HF x<^<O| ):6oֶ'۶u>nݿ x]Z$Ղ:E1PSSq2Eާ炃|`0roa数Foo%^i?7=a -2ͤxCδD_PnY.>^T /Gǎ;ֶrϪu덇ahH9E^NNMkf󲥊G8`zꍷ_MJFYMq-+JquvShz!k;U}.Ė^0,riYY>F֮fO^ 0̅.>IPLkjj-92HEEEh^h_ `88`[7S7^BΝ1mQթoRL \.@)+)Z!7Ľxꏽ{Op8B.x<%)7o߹nu'5-+%1!kS\_]UUudTt޽D])G~ 0~;ػkGThȘQǣFD;ЈHW^M>RYYYT^eQ<{rx6piǝ[`<>]G痵m=p,ܙ_x[2!]y{g66'>}f90d:~*ѣ/PCCajy>ycRy/㠁w ҦdQ-ƞ:{s-Ç g$&%+**[U; pp-).!b}~%?}p0 6ˍO fg;u}S @qIl gKQ F{9͘,.|̨{?PZZjhh~*1թ' 666F}ɰdk ‹/LA -0 )))FFF^ٱ&AZc.4>>GјNf ޮp]m|RLjjm[t% 9] Bzm ҂% fIo0]PϨWWzFJJJ2h%%%0itEET ,XRE.r%}=| u 1HeUDBJot:-**vL;D"ul6[hU*ARol6AF}~0b1L1}em __zA~d2͖` @MF^.!6t$ !vD"䌌L&p8YF -@ D2,//"'' -z.IENDB`GM-Assistant-1.2.3/doc/userguide/en/images/combat_preparation.png000066400000000000000000000457171371475637000250110ustar00rootroot00000000000000PNG  IHDR=ݳ pHYs+tIME 0itEXtCommentCreated with GIMPW IDATxwT{YM%6lHłXbnآ1yX1 "]X+hbEإm?lQVxX'M^Ԝ+7={6=3A=ɣ7mP/?srh1@`afڡS"KaefDoۤ'οII3>_Շ Хc_gXYvwg%X7:f?i6˽4Y$*Zٷk9/qH3V}{uѭk5~LcyƝ{_WO1 Sd'Y|vn Xl_^ o]Nls!atECzUoLrg\ymC_u qv9?[÷pڍzvA'8$ {vPZm*M_:kKO=?OM>iV/`k{91#sc5N%rr !f&(Ц5!MJz2f`zn:B~}Xx1EB!7h|%BCMt'-mrKW!| ygJ뱈|L$XY V-3gF|ooa WB|{{I{0YzfVNnyiuLG8?/$Gy*)_&K3 c#CZ*gdB,E~_TI:!dʢ꒷iz,b̐Aa}P(lڰ?mܰ,m5T+.ddBLX512$H32 W.q'OP tnsuV+J !dݎenISiT+TCek4izFV!DWWpO?Hm\cmi 4o'ϳG>]^Iψ6۶jEY|oel,-ߦIe2s|"Ҝu@M'T @6gG_YT,ً!; v+~2,!HR>V|p/*BÄELL!9FFF|I>!{͓=H\.Xg/wlsBZٷpv"ĜrEBgO9\y=tu\t o8~e9c&em׼wG^.˽ܕ={t07;ye ͗?T!Q[6Bt43;pae͚SƗuߑ|#iݢ|yP_Oބ.^pD^=47$@-&@ԒJOO}$:Li&&&|Z:::ōT*A#~Q4W&D"]]]wJ@ (RS]ȲJ5===)W*KU+iP=UԿv0Ps` VQT%swv >7E/kLiK|BsͲ ÔYZo1PvH. 00000000 '$OH'$OH< y$OH<Ԓ䩏w>?.WG$DE:<8uH<( b`'Oxyn^_(MO/?ʚ.,%52nR$z0nǞg 4k8!M>1Im$&>}W۴iܨ!D&!XZXB,--!IѽA k)i-"ޜP'B6lE]pnܨeL,IMMKMKkؠAWYfmjZoiBQ? 'k\RSLJ-{t ` ]P} 8AbhO&Blll߾deeBlme_]Cp{*)5-A4QCet՟srs]G.msrr| DٶsTc0 !XEQ{+wҺ673SW|$ܳ7'7W&zeKە=ѴIv΄}.x+W:%_އr񂂂c!>e_]Cس733333sǞuqԙ3/w…^?8ֻ caaqĉӦ=,Y`뎝AK6ܕK:`c&L");p'V_|[Z}==w=~DƩ'7 >wK1O~C8;wblY[[i)'òO31c!7DEZX"##===1{|$OH< y@ < y@щ݄ .YQ5JPݓ'B?L B5JP)pS!. J &O>{@dTtRN>yQ߻uQ@P*v~u%+[R,>l^5e<+W7'7wn^^>}ֲK.0]xVJP|ꇐA]pa~~gcNş:a+lۡWwz-2:ν{;>~|Pff}z:~S^fZ{=wow @=yZly->pat\MLLfNr֭=~ 335լ/XM#;|0a89z-͛+[BP9O/~ s ?zy'O槯’T#Jƍ5k}\tSk{{;-P!(@uO0pw,Z=auk]tl,_"W( SRRWF]˗~߯^K>{x7 524jѼy% 5/Uܶͮ!37zԊnܼyllǎyqc'# }aÆӧL."09b5kC6mTeC "##f 'Yg5JPYgH< y@ .)rI*Z<}h=yӷ%-V?VTn^YhYM*ZeQHDdiaԺ՟Osrs^ot6N--,@P<B|;?NL|IJG1>JJ ZKQ̥SQԮsSݽ{_)XCY>@:¨Wa=hpwQ6?oo=M |yN)Zn}//w"K`;*1~6yrǏ3!;A#BD*3׮].]6l̩S'lm;޽螻7))ooX/"C#Cy44|_i%(kݺ>~wmsXDy۷^Nڹ4tWIq{#Xo @MD"لs|2iÇ3q}D"Qt\MLLfNr-AmlJ{ʋKH76h޼ @ޠagΟWt 985'O6h[T`uP''BO~1qqE9n3qq=2sVOwON]\ܥ S)O*M?nؠD*\@sP M"iؠ~rkkkR,^A"T`uPWϚJkղ%!u˖G勗->uȝ/;˲zE@P"Oyb͛dq7bcogM9zՑF;*1~9y"x{lŅy=Ó+Ɔ))+X-{{&I$6mp* 07k^acrܼ]_O %RD*])Ďl @-Ozysq㔊zyV|4d۶ng+| M70atfMN+T$(6~ܘ=SIӦsCc8::9z؀N_v|o+"Q"##===+݄/MA  m< y" 6Su@AAAW.0Ppnf5͛+z1PnTFSLJWZ"S>(SJW]'$7ojs;}ROW/h]F\R0HM]:uQ?)]8K2Nl{ݼ+ؠph{ؘdỹe>@%3!(Un©u?_swMͽzzvv!ҕmZ[ZX ^4-#3é5FDŽ{[{|T^bYG=\] !1~9??0̮1qqƏ3IG #3._fMtJQԆ /D#;u]EQ?mٚp!ӽW3gSb;*1ҩ_EDHwo*(%5ũJh[4o{v3' `X_xY+BD:ݛ2,9~m[9@Br̵G=E*P}fZPĀs\v̬,Bȃ_v|"J~̵g;9ʽ[7ᮭ[bKH5o޾{ ];w^❆*u7nT EDxhDx?O+Sں݃ 4eV p/avȠs9[o؛a/EB2ӻ]-f|5;U%6F6zz9 'L6>rWZ/ u3(UbF$<&㓧)&=|H9M$4uL;:.3[]taP=CCñFIc͛c+͛.KH7֖/;J[4oR-|eIZ.d\vԄ/lUIF>O"-Sdހ&]%zHg&6Ƨ_oW:7//ϩu\E5&4lPx3RYD*?.܂T^\"j%ա~* wV=*x@#D ښqQ m~ϟlMuwm\h{ 2&]A q3C@HCk!<=\fiTw23i=(BbbZlIiݲezzz|yaE΁Kz)Me+INnڤ !bXl.OzV,Q)m5$UHw w7vָηH ;Zy7'r"nR`Lȫ Ϋ}KKys.(m,fꉄYo/ '0?g^*;@Eg,({To#uryw>V: Z~l˯5򌆆/ܡsUwTv½MF|*ۮR85v5W%,ѲUhVT|/ϾT:$meT{ P)zllur$Oik\Suj`?'Pu-|E}^(r_;&=?,Wjp-4%A|Ӯ n߹ӵLVWgcʑgWgN 2xUڏx){y]v_V'bB]VA)GS[ IDAT;,@ zZnk*ּz᥊NBBo)-yVy=cbb2 /zNrsk"ȿ)ܴ9dYcO{)㈀:@#h_ylн sPPJG=qa^=O4QIpi7ݺ;0%`YqQMP2JPqJT1JR1*eJ(Y榢Qєbii&7'w";?{Llvowl&Yi:V^n, =ē楏2Mkٽe M h@Ht 8q^:ะFV ʗ<B޿5x!d}GF< Êpa9!8r8\NBR0 p40 2,040Cl >iOy/xɁ666'W)!.`Ny2,lmN,4E΅ Ie֩ҺyΈOѻcm=-p҅˗? R7*ވT7C3[]Z|va5ÛobZTyqly()LUP@ȩJ& LA\N\I)RA+T*R*)RRQ*R*ZET2gϐ9991q [-ΞcP^nڿ5DVvvTwDhJr.GtHPz4,t g9Yb3q qYiM Ͷ즲"o侀?UbS"RYDP wяuر&~MrTA樌u\tw"~@P.KFB ET*JbU4R(R*d Eh)244МJpTԅv}wԴAFZ[Y4lЀ6%;^Zy,[CZZX8nukn !9W]ζ \rSkK cAI/Gh tl(E mm!Xh}䖶PHZt'Ѻ^"988<{bza'%5ʺa'@K|٠OKKnnF&6$+BHg֥?NJR*e'ܟ&·YǟNX{JxNn.8J? mǽ;a#mހ׮}ּydgk'|[=:gLBν{IRi!|;'OX}QWWBHLl﫤-wܹ{f/_O\:u?C_?'TӖ /B<|5sn<{ .S$B(tjؙS:{05uz̺qOQ::ܸ)Fk>}7o>5pb&M!Ϟؾ{O^mS]{C{vw-wܨ3Oþsnl:k zn߆ꅜ{C͡ y|-y"S9Ż^*;@Ew*vnTSgV*JqDP*2oL|q&.~"uh= 6}h&5K+̓Owu2,-$&vG=\]%ROv2*`‚sV~;wl۱|C{wGlcSSްg_DBBM >@ JsB4c,y4#2[]'u (d&w`k)~K[wM}V4v"2)r֡:7nް}|v=!CT֭fݺ ['Rg,~$l9f|dSiEt__c/;nZ?=8{)DT{HTUuMm((q4M "]i5:oס};D"ɁS}kV^'N$yM87rg'}D"Qt~̩SG 7pS)/.!auРy-\NJP҈*SlY"K//gj7xSۏ[s~S/mCNȒ-$0j֣% tӭWf| 4H5RzQ3;ŦoT7%s@vϕB Gu[$(i{HɫcEQ,R4M1ar,ܱ\_oW:7//ϩu\E !x֭OG mD}ʓJ;:6/J5AA'uN,ΑUg6<:5`gW}]Є}v_?0&VYGSZjRUEcMURTAqϋ'TĜ꒲R)T'!JpД"lK[tH6rϚJkղ%!u˖G勗-TYAJX֬~Rb|k)s֒fț_7!lo/dS7K~с;'01O/P}yRQT_w7\ҍ7/zQ#/^A-N::`!m%m]}-צ]nϽD>ol+7h&:Gf!ީPvc{}sJU=vbqM3][M.==˥KUwC]T6n #"~"{WU3O@#g9Yb(fcp,˦(; `4jJ0 #;;GDz,MEa(jP^ի-w޽wO&I1cdXMGQ@P鴔l&~8mFQ]ta c={G 3}[lWII[s0;_xEuY ݷ=/?А_@ā(a<=JWWxN!xs "hHY{ҩ˒ GDJ҆ haқ7S>kw˗5nԈ:R?-m{\:u?C5K.~lT.-</w-\l٘SN؊!v}޽[CN?J]{ԋn[^J ݷxJz}@Dx荛7f9wC6_9wc5xݺZVh؞s/|t uU tPРD*-޸D*Uiؠ~Y,ll{_j{; nԼc .L7˖O8aU&&yr0PD3hR~\066644LII]Ú~z͋/)zeߨm,J%R^顮~SpY,[Xv_h`\.O~veʸ=/^ 2S vm ٲcPBOƍ/Zҍ7/zQ#/^RdCBEK޾}۰aS&ul~='+79Z$5o޻et!t~k+^A3~ܘyy9㕸aPFHOOJo7!! uSff&AP%`S>'$OH< yV y-&O/_Zxi//]{?¥t0'yJz:pڌ6NvΟܳw01#tu[l"EݻM*]:u9zDA7)_%%-Y}%0]iFQԚu{yx{qP]β잰tv*\y#S/w EDxhDx?OS/y[/'wyk5/\l٘SN؊!v߽螻7\M}_%>x "<͛;rQލ$O#۔(.!!h;[[;[۠y&-]Tp쨑=y<:bv.&&&3Nq떺~мbV+.!$6lм9b1 O^`czfsun<h"tcan.;:+H*M?nؠD*U/(Jx֭OG ԏ5T@"HuyJjZ+mFS.\(qXl&9X\./[}ؑ;7_>weY"@Pj؊|&Y]`owı{nܸJ0eĨGFJHT-Y/rX18M"IHm^. aJJTZ}==6oHt`u׼xϞ-^ RH*A vm Q]{qOwIR&0:`B&M'(_+^m[^n3fsq`"&ptt6rȱ.1ԯGn-qg7ߖ;BY&$$c|n T7JLp{ '$OH<'$OH< y@H< y@ a4iZJjL.h vTS'-Iedf8rh223bok@P)8r273WT y-ODT'-eVJC05c (լ>f80ET'-߁\p<`'6'mq,b(2RM 8H0T r'pk;AqyA6{'>0׭nSfP҃׉c'OkkwbEF_?yHO:AC<͐?033EիO/(~qgi[4jIe$]ށQ?^7P3'w!C7}֣Hhڹ lnn^')6O/8C;q7nް&O8lP ҨVC3M VKN##X/!?oO iEe唃_݃IPI~{…3fm^ζf$Oy'u YBX0'7!&&C}9v:*p:͘:ӎ;X߾M:|Dެisf7_BQԞ+?_#:i|B0eZخ&&&|yyyMݱظľnG*+(lۿiOTǚֽ(W:.)=vAHS, ' i߬iiX4^AFWW7 pw˗5jؐr%wބWII+_{G_͘}XVvvMΚٸQ#fjN˲TÇ-Zr9-32TRr9PPJ%]EQE1*Jb(fMS%%:ոq#㎝2)i˦6EF;jd]b·{6W*eY<T'FN| ֝Sl۸v\YBa M340,M3ESCMETh(i-~O>F:{׋B͜6$pk7n+ϝ9w\>{twO7_ҕ'XXOxUB>1q B?;p%bf4U,MFL^ynp'X.~&,CuJiMۅU^^ 9 !\ӻr:!$\\>oϞigd0=%^#D%rs'J.JZJJ(VM>3'QѴeb-ǟ:q\jZچ?&M"8u;z s.!Ja+gdd,X^Æ Kn~-ZX[,c7@ JrЀ,-y54Z̉Q*W]~q )WXEu0/"ffSVvbY╫}gO̝5Ybz<$|Q";HP *J%MQ*s7mF0 P,i@Pܸ¹s,\V,~r;[qD:*%5a)oA>FEvz2&fƔ)|GRZ"Z5?8.ĺIyB@ϘW#B\πДЂċ:9vQcMmJkHs۶qd ~~]_OC;C7oݶ( yN^pi8%i@DHB ./All[~?{{yn޺m꤉oO,cõێ={ΚIٱ{on|s6CN4mҘ/fyP*uqꑠ~3}E".)C jbl6f6EJMۋ/_qs4vmw <㸞=\ϻ~y;y<{ٕK{٧Oxu? d嚵ic=44|_ؾ,$v2oڀl˗K|W ;8a:5p6WmruD4% 5sk$t3S sNiRRSZ9թiѼEH<@4mmeT*eZ1J\V@8ŀ|Ѐ'p]pr4<{`O'(+pDzlDPוsgb@o ,['e5Rm< JPn^|ko? nrM7w1>j/}|C|k$~o߃GrY&#u֭BT)>oS/^?l肹 !\xO;s(_W|rI{8NA H۷.7d@K ϟ>zܵk~O[4o|koCa6m~5̌g野nִɼf5nԈ0LDԡs.dQ#7>2ps;͜:ypc`j<  ðUn={.ӫ׽ԧ|߯Xɉz h>"rJ\x{ kmm7,\=ݽUGЮ]pVБv}{vI£'N>L|v}w4~ BH  y&TNne++\Nlִ)-U7 yyV%.SSVzFFGvzcfMb+4gs.N ݿPܜRvvE$M"4mFU@%|wViƩWF.pr֭՝~a_v蠅[uҶu?_+ׂko6tFF2؀MF ^d+n2;[/">TGE#6L|1YYYY'OĞ=;bǛ:ol-.\\2T;|ظc*^_P( $m;HK9?ps)yyC¾!v$~CQԋ~ܰ0'mWao#FD"|yS-ZoW8궧Jm`oQQQG*&Ħ[~>7n*2;pBX|B>ԏ/K@$z6qǸLn =DBOF0(X qNEEiT$2ϳaޙgV}cl'z4 CAN9v~d:6g7Y'`[,F+lhvo\ӆG~mI7?c(O].Iy2Xsu*˲f]~R} vQ Ap'0!unOn&!U(j` Q.%Mgw߄yiq=NtՁ~ۜ@ƿƃw'`-aRVe Yt:i&|>@܍ʯB/(OZqCl6+bՁ,^^#ދPUbXU% GQ5eRvw(O<(O(O<OZ,1QtpVIENDB`GM-Assistant-1.2.3/doc/userguide/en/images/dice_simulator.png000066400000000000000000000202761371475637000241340ustar00rootroot00000000000000PNG  IHDR#>( pHYs+tIME 4 tEXtCommentCreated with GIMPW IDATxy\O (jm}jj{k[ ZEEPb]\$lBYf?! 1Ofx̙gos,h4 'OF@3`0ϯCL&`jkk5͵kפR?7@h4+++ׯϧUTT\r%88wh4Nwܹ?~ 28Dyyyc0L b877^[[  ZW[[0 qp ĸ - 4°lNk]{qNJHq0 0rYsB׷h5 !9 Eh4wk<9s^-8[Js)[uu%'۶>OBGS"K`0t:|J`0Lf|L3L:0`0t/\.!z=Ng04t+’٢g2C D=Bx-YLw@uuu4|gOxtUuDv+H֙e Î7f؀~~_vRZ,6diQ~?-4 ^aX{3^uhSgwm5I)e ׇ2Ne,v~ypݿ>ۃ{aoZ~wh)aFDk=FwFir?nHb2߈4u+!"jZЩ>m=%qiebqqLWC)I3ӧMhYB?%E g\FE c†fLϤAfӚ;s$08!ЃMSvť*?!JJ-z{F%+/5~!1 )$w7>%HͶ"%_y{$F@+,>PZM]!n|Ŏ14Jh4d2Kx~ mqIJ]Q%B,X$,)SR"a AC |RPxϻeMNݼr9iC%&HZk* xAoYi]PHTTRZx 5-BK"n  VX\iǞS.w61<ԀMRhz15=X?6tBhU4Zn~:[~ü|wCq9{1m{B{`49f̈!|N?_Bkz !t s!kXlNl1)pQ,9zIqqFGyx:_jqGCv8{j.3&5sgNO޳Ʉ WY4[?+9m'_zOfi<cލBլ"SF 6EDD#"^i" jjj3,!Sz6M 0 to1 6`0}cӽ"p8t:6q[a!:Ԍb&wf~D1hȱc Yvcf`0,^୭7h4Z3݋m,F ) fB"t#=1 1 4 4 ( @i( @iJ4r%e%bFovQ&zzzKfmW4a\3dןѣ)?7f 2plWFB'򨫫+(,:{.~oZ.lw~|EܬVMNM9" 皣h4.r/wص5 S8K?}vЀ'r c#㋗?n̘aAC_njQqo:phd2m B%o%)¥LcdqǮ1#!.}zNSm)^Rp7/V{\ViiI[Ӛ47o6[q$ݻ|w) F]-Ƴ'?GGJK^Hv4~Bƭ[[7|y‚w Ȍi 7ߴn͏ׯwr+*g1)fڪk@Z'#󖕩Nܜt*;{f3z O yy}U<<<>53D[UjJޒ2,YV1#B0t2LJܞBC ۖ"q{j>Я{.p؜АpL2[iYci4Q(7 f6Ei埭,..i;3uJ%֒#+:3"4Ԭ ࠡӢP/gDŨIع` &s⸱wr \RZ6o Ӟ,? fތ]GZZZZxx=OV{XP SUxwo޾ٽ[wxe~z`` u{6}F-*rtVqI)yKE Lo,>#b0Zd~AEtȌG5#fB>4Z &O Fh5<u(M),*z .xSW_WYU Js9DBab%vprH(89%Rt:|Ճa`\^O/pqP( 0$ hT(tuW(d+׮P܄bփbJ{2+,*{ W^+,*Du񣸉VẀ^4עH)H|xX^65Pys,~6&B.μ*Ϣ T_ziEdQ3g =6!.#*̉c5).^B ,e`0lNJp4!]i{Ϟh4ӧ6MLyCs^}<ioP ˍ0^.Z0_!ifofys% 43ovT%O}BN#] Ϟ]0Gpem3m؄y3B4W:څio1cۣ?؋H"#zڛY&E)ȢRM ;0 L^8/oSbrqI gyMR-4&{KVb5J6]__Oh gofk["E)dQ֐J$& "c+Ɔ Y,VW^sҞ{LsM/b[k^yꊋKm؄2,cA.&9lmۓޜ <,tÖg55[Xs|h4ל ?NksEVa"0&j[2LNJIpB(h1Sߜ0dN4a>),1MUc)& mivI+i#ܸuO>f+/^}zIÂNfxs)i5ik 4d0ƅi׮ EQSVI?OVx1 HDZYYq #\} #]VD|p)'s59F"w|RVV& Li8 Ԏ 8tB L2U,85b8 zʴbLlZ!0#<|~MM@ W&555|>, 78Q 1yȽeMM 5e,Qʽԟxz[1ͅ`X:r2?@q'b* AiNL&$Lzk^w+PkB/P̦k/0NgJPkAidfCBQd3̆ a1 A=;dfC+ ) `njd̆Td(nW_h"(4x3 zK f>zf9"̢YUu T64jC~Qf9QcfO Rv{Wv)f䡃;vNhq؜$=lapqFjި~v(3իׯ՚E9!EEK?erdB|H(| jJk!9ms}VTVv~Ӓ :v 1'.6Z}^ONݑsB(8hhܬ7Y,|ܱB(ܹ!!'mIͩac.t QrZSٵA^?g6Eݺ}')%%iH(=*|yC1﫟9q948d=EL8Xڥ˧~`vbc?NeUh00G@ݸ+շOu6vק0lϾ'O6]qGٗaX޽s0lZ ݜ h{XBZ荪;vaG]ɉaǮ݄͗WOuh_7_~_e"eftH=[ lW]ii4QiqZ! aÉ0 qbX<+%qB\8 '٬KqϽS@gq!{ 1~駳|l)㧲͉y{zի1P+*+E +;tHgIr,6{iܣq$ְX,NGW"^Ģ\&S1 {GMIϹx#BCSUH6v!NjKJ|Ғ؄yfC}?g>`Nہ!kƎsCUj硈]Xl M+=%fm!JBE0-.^/ 蝖~k f7n@ȼ[Βezt'˼l^8~͵7Jنf&dK"'٨`yq=Z\4[?t)e*UJ=eAm;qEBO!m#PtH&1cqq]-!e2kDBabep8 B$Yk(M׷m߹SgV :FT%R>rI z͈A]doP2`( @is,IDAT4@iJ4xa"Т?w1jIENDB`GM-Assistant-1.2.3/doc/userguide/en/images/full_scenario.png000066400000000000000000001750461371475637000237640ustar00rootroot00000000000000PNG  IHDRZ pHYs+tIME 1(lNtEXtCommentCreated with GIMPW IDATxwXHeY:AN*"p6v)ԳwTMD`APr;^łt.9s{[.E)㓝Lf&o3IXEEE<<%%<|o M6m޼9QPP`߾}[__K.JJJ&%=zoݺeiiچb&&&߾}kllj'@`gg׭[7~ZKGG좢"\ZNEEj9>F/@]!J,  ug\.RZZZVD7==6.!@5•X*QPPPTTr\.WQQQeܯX,btb< UiW1Mz9V\xEdY)zjm/}{~Pp%X,֗Ҳcq?QPPSmx̩VB ^:1/o儐 xyߡNbST;#ü+" gE%m߫^b  9ohn]9O"U@p~,T¿~Y,٤l6r6~l6P|~yy9gH?L)))GYY*YIIIUe@ʨt*YYaX#V\ VAAj@ ~,,2I[% 27@Z9›a)i[V]MFm~`^EEEzX2+X,֗/_Dc4}={[I>oPߊK!*"ӲP ѧ3&5~ڡmo,z%\6rJ~alUHNMϰU 7=x2٤u+j֫Gc^K-畛i=|?fHP -]:'!LbRHqѣK'w:ۜŝجIc15V\V\F nq|bzf([l6ҍ?b/\jdo=к+YyNp<>!#+P_o$l6.gf ϦrĻvi[V&s|;2T'ޟo>pҽWWrm^UT$dׂ勌 kzL|囷mv'\̻;bRfxT.-m_>ݍuo[f9u)ŕXJ#BH.3]ytC_~+b`Pk****tbw2!v`*xŤu+*%svWϞoߦC:aӡn ¢⠵]y{{Eg_iԸmZlaΣ'?Q 86^ӅIC...lBn?|,\_8 =:w$!"k*ye{!8BEYIUEyHT2^MEe+BșĤ gQ&:TSQQQ; JH؀!l끄s1wslYY6ٸpljT4j5ݝF*+Lv-’ȡքs+~B@YH1a -$WSfy?A `'ꥪ5u"*//RVJ_=gxJ,@i7鳾6}3*5;K7m #l聋_@pu@`7Ȓj@P ׮!5<4l6UfGCstdCy>52&۔"*=;p 5Uᵨij1R+&h5HS8szf6!det gQDLʖ؀̜B*WWU!dVu 3o57 ]o+KK&jkQh5|YJnaܤcOQLڴvG;[;-$WSB #hj"yO2~ `X lv9)?~ܢIc9Xn]c/\|pr@ Eww RWS$JaQх !A x7FڰǪ<9uoε˜P7Y9ӴeN3<$Bk*|R$a^q륤ѿ,\ߠ%Y2$6@O[;-#zAQ1!D_W®c]-+&pev]i?ikBr>~bG~WwKi@i$w&}Oޖkwğ2ϙΘbڡ=@9t %,[ }7b,|m8f']:1/~˧ ?x:4xܨ_G@ g+rüM;ԿM>ߺH ݶ+MMlBQVR .\<ꄐT '9.q?#BxMEfU mfg5vDɗҢ⒐4yEw>^9YT !NjKJJ 8 ${Bb/$ 9u"!Ʋo]P&BM\_l!*)-+,.|?ԦUf܋tE[YNkqg!Uڝs*ǖ-ybY\.B䇳+ګ ԛ9 |=̞pJ,@%q7.=}&&Ue6?4oC _|Ke]B۬Ngq/udc7h̋7o 4J<Xrh!cި#6hijb-c# W\r.y,\f͠O쫭y2!cRBH֭XU8ҧ 9Z3'׫hV a]F•kzړ]S7eٲn Wַg7\ǂFzì<u_%xCo WF:T\ϼ;UτԲRϙkwn ͵c)Ts @jBUEy5>b"7Beςeoo=,KƓQ񪺺:!@|)iTUUlvIIpp|~QQUPPK;iIˣrY,pN%%%6-JKKTY"-(^'V\"f|~ii)N:3áIeJ:g>!Ȯj@ (++c%9vi[M웬~4juަy._cldWJp&_RVVac a{mv'\/zRwiiB P% _C9i$ޘW^^Nx5.\~6lK #VTT԰aijjBS#u<rUWWgKzLlJ(qa@ É` X3p% \:WbX3p% bk1+[;uJ7TGܹ?F:|evmwգ{J0Z1d>5g\.W8w U)booC{ĊۯOuV~)O {jM;>B0[3q&mjN@ . ;9вd G%.׬gO=SSE<|v=wN#MM*|53윦MfNMK>ݺU^͚5%g_(,,mn6{teej_{&]QPp9Nb<%C>'56eXtm^V8'O]|-B'^l5mU#ﭖ(++t*!d@~S'MTTTdH=xhwﴵƺ==n꤉GcNxp @qOl]n/??4uΝMkלOQҩ6i; ͝ӤqceeQ)*.3G;wnFFӦLvFWnp#/%͚桧7{ƴS'#ǏƜp=Z$njBŤˊ\W !ٽiubY<t9鳁<ϹջuݕeO6LKI3h8HS3++H]Ïx7$err~A!7<ѡ&!:/tfFD"XJx55;'5ݤqΝ: ?ҩ{555ڵI$ڹ]TH+*ͳ}=m9=ÜN[lYCQQ{޽z#ɲ'5H Bw3=w!q{bEٰi% GqW424ѵޢysBHڇt U).NGwHLhWEEqc+׮))q{qСnQtutz.s:6W.[*n߹ekjhɲ'M.TN B8zր>ronGп_MMq{u'$t\/BH~}:;1,VYټYžkneOڥ9r\8`EEERy `%$$ PW:XdtZueLZSM#:1յs j! 'É.A bXbA,X A,X@ [VvVvG:_r\ՀcFp8WC=k!kΛ֭aXrpLZKi'\}j*jԨU֮\Q8x@pcfxLE@]ѣqq-yd WWW{bNgamYӦ^|9U V :wL\Ffp{E_oP}oHXnݚ4n\c@ 8pzz .>{|OHo:vyݻDz<~TJNt$'BbT̬͚͝5g*SeXZZfzN:EUE>͞1=ر q !W];sTec]m{S}O@ 6vֵk='O Gg@2SU&1LYm۴j} _>wǝ=GZi˓?Z8;aW1'bcP^N8!Ǐz{&zN/**3IǟK.ԋ/ "X'OǮ^Q]MmΠA_ySx8@e܏wGпxB㨑jjcF"G@m=wΟ==s*Ǵc !n.jjjF)f:uvovQ?~"2>A]M_>w\]Z4or[ ",5aZ~bokKjIPۨ(/eri#{yyEŷ]t5kŚɯ^jٲ[׮e%et8Ԩnc[!*rss>~l x5UҲڱ_'Ktرyffx-Z71|rDԉCUUq^ƍub^J l۹+Ia1|TKKix_I#KՋ/4޿uzO +TKOH240040?@ǝ=eOWgijl1q}*}@A !\Ҁ{{?x5gvf ڻ+{- gGGFnCxžǎyϞw؁x]f, yi*mJ%;zޢş>skűÆ4g9aԗɯtgPG( $lk[;k[-[J'1ҥS?zJܸ2v?=~=̙cgM0nĸIY=b3WZP}v(++۰yˀCm#VoKmO-"O9yU%OnAZ|0,mVY[\\ > XD_U+J.5p'!=ؘnެifV5%^a323e\uEwS7>|X_ǝGBG}.sDN^UoCMZ?HkyTtwm?s|מ}bC[!+1Q~I{JM{oOMާ\nII 5#{_a̕@aͪZ4߰yKkQ^ِք!=}&-x>E^kdd|b*1:2G7S%%%uuӧݸu/s^*ؔwnYPgiM$6Ob*33sb:,PW/,,bN~HҹV,]z!| V8|kb Vyya0 >)1'O/?߸IM s.&%!A2r=XQoH;zf̌[R& !Cmffeefem@o߮]Դ5ja?vjjZ^~@檥U DܼyO~m5hLOYYӱ"Ϝq=Vʭ6ܹ{yp1׿iXZۘYd-_&K ۖHx͓Hӭ Ո9 C~A*s:K?{GWQIuV1}Xi1i .rOڳ4iBMU,VP!Ni->r3[edf"AlFZS߉DZ}Fy2\Wb'N>Cڰ[$7I[2jݍ\\ǻ= \ysP-{vqʌ#G7:\YZ*zbnr !qgNOر1N+--^JQQqoVXX$b]{v=?koKyyXJ\tG=9ψ"I(n߹?G ΰ&'1WW8}WyZj׳g_#g"-]*r@HPT҆.VoҾTUŖ>)卍 ܽjb_?feg]z)E^jG*Xln..W..}!̅3 ys|**.Y{BBٸ ncڴnoﭫN8Is8Yӧ=}򅄱.UKT*@5uƬ /斗m۹K΄s.t4iob"$J-G_bIxW_SѲŋKJTTT>|H_~NbLypDwEEE7b=h=Db$&y_O7[[a#I[ܴ١:K1<5-u;!d<+4V}z$*Pi5ݷl prup8ƺqNM4`$M[]r81ܽ'K0>ݤ;;fY.NKKk޼ir5(j,1!!= בҷ)򴴴7k*|$77F[]n!= ``op'\y]t8~voTo_lѲ7˗> s]Q~FTPKN?"wȗݹw?3+˗wbZ/M0D|>?䩴[}nC P|Am~,C]QŖVȕ!CgZSEл!::DM+߆Eƍ7[ޤv9Z7`"ŏ_/S}2~}{{1<uE["nCor%?{rs?[5P+c\8Ůbq%*ghI/BހZؒTߠx)Sz7WrW|v49l agF[ї zv1USS68yg}^գ;r;.@bcn޼in^+pԞT:{+>'x6ٸ۾~]-_ G'@RΝ9c"SS?xv9_|}Sfflo=GM8_XX|ΌC 6c걘99g?|{_HʻwZZn.ζCldhL/rUظCG~MV>s[Ђ"$P;u(!1qHBHYYٞФ+W!4Q 5{HE"VH0dBZ;eYAwWBCpNr_##G #uv8E"FEMM?۰@t9< ؚaX1 ؼ2VJEucgݹwӆчz}B߆a!YTo޾ݵ-p׶W_<PH{dlEb;eYAb뼜u*w.;)qjjj's!G7SKBRS޻?wY3 5էOrt9Og8;[A!'7ӧO<#Ryy͙edh4j䋗/D.$Ι1I3yPfO7{I+&c0dXvʲb<խkיӦŋC_&'Bc/,2rh%%%BHFFi·ӫ/;u(A ӧ]J墣MM())})-ZH6nX4mldDM7i\0!*$S']~㸱.XMMp3na+4аϞ/OHf`a*#CCr۴^|@ G"e!$1Zch!M__/5u)MWGCzz !itueaEUNy h p%{OlIIrFfї˘c\9|a~R޽+//%6MIx%{45S޽X&,ap]>ܽJhG-އ2v٘)o!Pifvɘ_*D+Bik>sמ}mv5=l6ظ`Atʈ_Xlo|Hhjls 1lڂX VTTM50dȐ:)KWh_kPCө7omnFMhK\\\E7[o/[z͊zߦ|rg-Jť|>?$<؂QQQTڽfIύpr>y4ZSCJ7jK̑jjK6597̬{7 տcn޼inn^>53gϥgdЯh.&]^vv-tKYdbO=u@_`:pFEG߽w1w'WՍ459yN9yj`M =xFBà ?lEo![tgm##zt3URRRWW=}ڍ[$.s4;bRl ĺq:r8wI7gg}}Ӊ 1w Pb =.ZzFZ]ЉO= / >r3QZ6#-ZnbR`+KI;u422d.AbAli}'@􋽝V# W._ڿo_*qe'mZVC]=`"2ᎀM7J\޷oUTtܐa8144N PI_A'm햯Zg-ݺyӊ5N3TDMMMEEÇ5795z qȑmxMYYEKWv^= SUQmOXr#28?`8vg(w0|;9c]O(//Q@q@`Kk;wQwM4v֭ilgjz\ͺjj\fV_@&kW@@ҵK=Ag{|i~]ץzzǺ^LLe8aT8f[8--y3yH uď\ǬݰiV:Eƒ+~eeeGB6m=}&nNd>HBHFFF9G NJǜ<;Qaſ6mj<@:<~k]JJJvٻ|@-߸+A,?ZtŮcx6\apQή.$r8D)YxΚy dzl=sH]eev%\H$X[͝=H-dohāܶ?l6[1u݀;^y3em$9MM0ca.R:Rn..nB/aΎ\كA~ bQ:ڄ}J޽{oֳ.ZfXg\PbgM0n҄2k5ڀ U9[vTf|e#s̺{Ȯu%$!iӦ޽snfM !GOp[&WDI~gjIW5qw6߾+&+tbtw33EU:P˗{KND߲@ B$+;?pYΞ ز@_4֍J9yFjsO9!E3w)EOHܲ: ,X8}j֒c]C#0AA17pQ"@buiY˗[Zz-!de޿޷?l;XX[Դr_D*"Sy4 W7@o-qWJ.|>?'772eUo֮+6\1a-5mֳ/4n(KkkTiYٺM bmk~ RıÆ4g9aԗɯ*Lg Faee[XYmPZVF,fp |8Ėz5s^ay Ρ9rL~&_vXa]ư.0yox]{zC QXYYن[Yȃ{5Jl}j:ĽFٸ5+wTjT:ǩߺq%Yztw%&vmmp\P~YYYY[!n @!6u ? #33#3s֭C[3MZ]-5[@}R\\|pW IDATE]͟oܤ9󚫯'doƍUTTƏu}3g_/CC_s Īu0y\89~Bx<'ݜ Ρw!!ly.{>1r ^2n W㭯ܘgijl1k+܎qgQ4Rl\%&Ot766vrusn֫'8>.;jt)-ҳ{wNnMNr ^I-}-[M6iuY7⾃w޳/ .]ҹc͚Um*-Z71|zZm)6blݼͩ􁖖@+y~k,*|Usghld ך׬]HhԈztw:ݬg5Qή+aeW@ B>~u&;7zeee7i҄!1t pM?nKKK;j,5{Kht;*<&*!$*:zXW Ρ4mb|Ee%-x<ךSH1,kdhQڽX_iqxyiY 51m)&_6mZR{{yYoumI8@]o#GЬiSBHQqh'Ǝ3sFHXxݶG?bjfAFOPY^M<%"y?{7;8U뷯[hpMӒvpKHH_cK@`NN·tmDtߦ%g}j6hoԴy'D0xKP@v'ѤqcMܴIYU[;k>Y VZVF[.--4O(ӯ`Kk;w{HԯOD7 '/H|B郞d@'1NFlԱÕר˻rO>iii:jki}FcN0B_65 " 6%EDOMXi/ tsuQRRBW2Űh`02xyǏBHfV^&m`RѣŞ:{ꄁ<G)CÒ_ yeHX&&t{ׯ)@IS7oqN bBgASA)S=zL9jÉTIII]]}i7nte_o}==i) >^>>6buuujZC]N bACae?lXl||YYY~~~>啖6iXZۘYdM/hdh(\GJVV6~EBHfM3HEE/(PSSv|>:o`⢴546VUw)K#!$6.?B:sc\.J_tI֭PW/(0xȋ(D>Rާjْ>s~ngzB>{ֺe+lGؚ!Шi_wiR۴Q|wC>~R\\ܺeKgAC]<WBu]^n]7nuP%%jjj***>!oCoXWB[ S; -!A{GFGլiW/IMMYp̨Q3=<^zuZ1*vghALRAliY!6Ԭ~]ץzzǺ^L,WS'lrsD4hDwyF\Q#Np'>|=6"B|':Nyfo@-l ԇ H'-=FRMڶ%ظCG~MV>s[Ђ>5uXGysijRǤGbNxgzLp8TIO {[ϙ1]YY3c걘99gE[KW&ӄ>},ΎԄ7L|r y/-REWia%X,ٳBÀ8 ///=I/ɓ`V|\M~upJʓEuut5g6!iCGĽ;fO6?{4=]]BȬiV?U̸sV-_fddH>e,/SPfM=j< ֬7@̚9$Υ"XBҗRj/}_P@aLӤqefddOF<adɒʾ7352PY=f-e"l!h2hWѦ~-eRrq۝5}9ם{{s:E'[fνybY[nc݋h%Cuq ,{WLL,(p5a[ 8 0q?0fv66/^:{L&~=U[S[z0zס#uujac B"/) ػ"KN < ?+* \@@>TȾ_p\~C1*ĵlqu_bbu3mr57;]/%)ici%Z-3ꎯcPYQ/ p} Ot >54,o#6 O mA՛`*+xjjjj9o񨬬`>|ihVn8tՇʢ R sOy9OAanl} D s3 s3rLLƆԹV׭g߼u[ScB/7oihhFu欙3F CSl߹Sa|B(!9yΝG&#BammmFgO#Nl'tb{;#FN4uL9S&M7.`1׿m>|92#3@_} s4VXUS+)$^F&*jvNE+%Akh-IHNazK4 oWD r)'OQЇ"+W,m7鰗tKn(ubtbtbte|W_ !PiܧB$E a7߿߅OJz訌s5yDdWRڳ/ҸҲ򴔤{T?_}r|\r|ۢf,/Bѓ'q%hJI)MMMM ) Ptee^Z: 54ݷy]\_b` wbtb% [\\\ZWr:k=+D]^EƥYn2B[\toO)II>>6֯޼Ϙ}ELTT\L OpsҳWDY^MoW,ZZW<\Pt>̮d\̾x^LT4a #s.빱0~zvss?NlMJN jgk3k u M$saJ{iieֶ+ӝ'N`k`k0y$Ǖ,/v}굾7wt-|||>T nɬvXD3G׍>y(<5454?2#3j]{{{CmgK /f\a$q (4~)*~sQL*$(49?ph Ty+ 8`~¶$%m ~VVVV?y6]a3|1N;Êha>! 9ÏvxT4{FDl#"2v*><2!=; ?/\|0?5!!]FF084{ggg)Qē(-+siڽ4sСK2A `NlQ[Q?f 2P(Eofcӿ-*?_yw6 "(+QeinK;=2aji))ІH064,/P@Ahv_{l,Lx;r6BHHPp.`Fرs}!!+#[-\ninn1E:z2RKZrrr"߽m4ӦyXPMz\zKk >ҧg h-1 .*((0 H@22{п Ϧ72QTQst**~G0KggKM4wniiaXݙty Uͭm>{v)3+RL@]KGSoIBr ^t+0\Ly;ttt32VJJ=IkDJiF'80vcvݙ%8߄źZ:ABߚ˷A[1a~ {E5}#.1k"%eޗX}XWKcciY|LĨB=+Y7zzH,E@@hn!w_}ߵ7#]C#ݥ O UUϥ$!fa$M;AlLtnN|%=ibcW߿G=aԴǏDG^J?sܽq+:ZZ\so܊VY`wmq ei)IqLDZ oC|RғώFGe%YE4TJ0:a υa,^h7fםY^2?OMOKI*--KHdу}Wu1_[/ROp? Em-!AAOoeffW2.4#FL]X _SS?!4OA!҅Kkde{o A|||.cF3z뭻w8A `N[;V2z{zHIJ񭰱~M_mi))!AA͛2%#-gci?>8쾅!1y&WIlrhRmO4^a/_lxFR/Np*vcvݙ%(/GVF`VWXpPl܉#F yWRVL?~Iss/W3$$B/_~I %TZ|쑡{ .WYgm~y&w*{d+*+C454%чN?!}181%5%>{RZD?4fЁp8A `NlaqemI 0)I>ZLTrĉ.ӻ 8Vbe4u7+׈a-ۍugLJM_%d_Bs/og+8rũii^zCU7g͘1NVv„OvmmvmYZZ*&&`UVUY#L v_]ׯR<\vFѓտ,P]mfeѱp|wg`F֐Nlp'& Cy0 Q/_L IDAT޴~55...[k+S\BKMMMj*[ݰ)*;oXzC[KyQ9W!5o޸[oONQDbRǏ< HŬ.3ųꓛ: !}XbNNUFKQϟoL*$(56::8(̑)*%_}wn}iӦ}_#7`)dc{ ;Y WeOs/k`pHcܜ7)*SP8{5h9[N={#W]UypR=LPBe^a)-//;D8)F2Bln999Cc89fρ,GD%;{Cq|6`&v!*"Bw:֡8y>BTW1uR:M  چXb?i>}VwbO Љ>}T,u}=%6yv2ҥeeN$"HGO= W[tb;  ؘZHҲơ9y~Iiً ޳-:P,N,`gV!CCB#Fx{zx{z`{lm NNNKssKssBvmTJN Y]V<<aʤInΛ'N}$1<ӧGŕfgnNbepŒq'roDvX9bejwtt,RS]ډY !zj;o\v\]] URH)&yRNwrBhx1axR]]䡘G={BA~B kVoN&%&;+c ΝyH^~'99b?z$]j=%3sUdL ֧psMMK~ B۷O765!89?l,&*o;_R`}$׶6v&LLIܸv\yyfU8?~$aVQJ{FV R!`e :;;'hX)qXJuuW嶒7nVz7ヤ$e}m{777-d5 ܅%fO2y `hdfh~V?;ḟ!*>`wVY!gP]gdV !uy V[ uFBBSoܺ=W^>hEBꑇbΙ?r$//oMmmHfD,+/ooo_Rwq0̎ WZVс H6JHg%(vj#:R]]#T0 БغCGb5Ո d=Љ;.f\_AȥSnΛUUBTU։sخ=Acƌ^fjz]/5 P]##-rr`?_I/`wMm8YYoDjV7757cupZY=n3BHmBK H*7{֚;UU d=6/tb8RSSĜhY]fl۸w~|%Elcڴi?~HrrrP|ST~|^gag_[yyx`0u}pb~)4wbN,קźmd2u֦M:zl۵tB'@'?ha3~y6/7oihh^u欙3F CC N,N,`/2oj@/2245! wvv>{\uBPFf *v/vo񸌬fǕ+['?~穾^^S&OL&G\ek62`Ttk!mś7n1aE0+9ZQЉ;Xʯ^BiaҼO #jI>d+>]鳣Qjjk#<ɞg_0}q ei)Iq'߽OK{[T"`E=z$1"x&@'3...- +9b5Ϟ".gek/"wrg`2"ɍ3g˗62rV>qƚq2cǎ6xyy~J@-$#-mS@"QגHQc!$!.>.܈Љ`TPFfoigrssc888_JWF1QъJlO+DE * Y^#|?Cr(zz1Bs8{̐mXQޗ|ϥZYY@xjkGԒH$ҁp<]GSkhxMmmMm0-MhawN;0B>y(<5454?2#3j]{{{s/qzŅZK ?~$?5,ϊz2tvxT?NlMJNo\v6ַ89dU+/Znc ?Kwrw@ijh8VD X_/\|0?5!!]FF084{ggg)Q?HJIgS;DE2 ?ő݇%XYY ӣ)*{{zxRFSSVw7>>>hf~JfYI';::4ݝ71.Ȩw%%cnjqt764,*ps}mFtSϳ> '8/-ɩ$8Y[=**kj~yτ/o#_v2"f1z ۸w~|%ElcڴiOՇ VW_'2V`j'BwH;zXqQRмBYeY //OIIZZ߻$AIoB.?X3<~|$:R32Y^2?OMOKI*--KH`FnjWyyz,33q1y1QC]Sϳ> '8;wDF󊎖&WrsU,;wÇөɩ a`Cwb)-Zfc{{۴iiӊ߿C<,(/(&:s.֦OkiiI;sVaA` >J4D󲮮niiQTQöY/)Ŷe`bV/Y^fS)*~g`bF_ScӧYi&xEU>XiCSEŬDXbb.~r7{)J}?TnoXu /{_J5±9Jd2M&(ͧP(>1Xca~AYyniYٿF{~c^Yy9A`} g‡Yl7 M,,c89ܠf6;eHS#[Ɲ8r,n| /_~/4ARO=J0DDDba}HuRRR4 G>=-/ǖkjjžklj}BaիVu!v:%g<9䩝aX0#}QF!I 0)IIc'M;;eTTVRfǎ[/!(ʝ{y;\̠9`U{v 465k໨g}GU{|"%**RUU=@ϡ;PyD]CbMr|0=NIvWW'k[bJ*BBq!/okeJX0#}։E!3=AKJdrQq60Y^2rB#M؜Ckim:poPoڇL=VHAR].$ >Ғr*y螂ԓ w ?4z(*~G&ߗ ح/Ս>|*Q%zxĔԝ>۱4Ov%%555QAX0#} "''Vqƭ_f33KP\yyښvuuwFxfulUz҄ ;3mغGDd 7z> gC̭l, 轿nܜ5c8Y١{ Ə>mڍ[5[ogiiÿ_L*BFFFXz{{IJH`)n.;v#vA* lQRZ:f̘Jv H@K Btm?y[T-#,40Kmp!bC̥?!2?>Y-f[K XbC"@3~_Եt4$$靝N/16U8]NQ9!)yNЁ2L_5M%۾#|6SQ;Bg|p`xN,ڤ$%mWZrF]u"@%$$%ә$Oi)Ieq U,2pxDEDHuup:)Љ-keٗ.\چ^}ELTT\L OOpiۖ-RRB7]%NGa刉nqu̾B_uVNVW֕|$ WotY;]0x/;} Z`ae-D;~ Vˑ^@G~sB$]qRckԋrǒKult#,.7o֒,onn?3 !tv;:ŭ;wG/l<ޥK%'J9v"}z=;zgC&8~")[U ,\@+j%>v-2}?zt>\(,1hť|>6Q#WBTWy(柖г/0bci?jb< ;|۰f)cE͞5݊G f^y: qAexvGdҋ/wtt :::.gea횱c0`5M$yyy-*SǏ bb[\s1l9s@]Ͻ}-/0GY9r|||ݸ*x}h8?ycHQf;'55Nk #x&v̄qo߽rߦO%.`9.Wƌ=ֆmMJ="((q횹4fF 暚kWf;lan&SC݋/<6`FZZFtwSV%ݷo??ss2KT11] xiBrJwY22.nn_bÏ>u)wP( IͰM$%$nܺí8W!)5n})II^^^fTVw"1؉^ouw?0`H}CB!90F%%A҃$@g_ 󉝔s?r$//oMmmHQBBeKC}eKJArrrR/ɓ䟧L9}.& WZV ldǬM]hBHC]=P9spppZY=gke; ͘o!A{htsc3zoZ-3܌6^jFFZz y~tЃAK&ichԴӣ-ݻJJ~kjkz{xM%$ =&, BSZZJku Tmm>,1''GGGZmܵHMu*4ݼ{+)bӦMcFceeW0 ##Fp`pɁP(+955[00[&}eޒi=\~`rl[`Igb{;,8 ܉ЉV ? `)*?455HL{[ٖs| XXzgMƝ:;:: xRFSSVw7>>>L ȹz֚ƏVKgcKR1+/' IDATw¯_s{_|D1ZzS;{ubXX vް;Kpiۖ-RRB7]3xy1kqAjjGF555uV`vbnpb>ۢ٤YP]mbaG-$#-maju(ʻ%))vF`^F,N,@577sv&)!&%)I.&*ZQY9iDPyE%q!'M⢷Oa>-06N\ZV孮PC}WCC^|GLeST>~^DQEѩzF& [@XxLMTFSFswϫ؉%Ʀj;w^E͈245/~6߽745'>3&f[<}Rfn% W+t K9gdzaS0k1`X9?I%%d2x,]W[+$0;kOc}I)]W_Ը*Xi ܍[nP('i_HP<}n޾M|$bm{-t N>]]]MhhjIYʹ0`^~{<BA`CK64B#?Jw}2oJ[[׶y U)Jggڍv=Vݑv,Mb*M$%Ʀ5IC7V> 'v6^z_<]"8vXlf*ycH: jI.ÐqԘ͗JԢ //$!u%gO\|M|""YZƝ8r,n|%%v1!Yʹ0xd29…i M1kiiI;sVaF#׭vSdddoSg9bgkbtZ[[e.03ž,=Db\ jݺ緵|oeQqÚuL4W*1% !TQQ8Wa\r(S#@"'WRH@_HMMsrre56::8P?8yq7>J&2mڴ]*GϷ}c#deK?_IZ.yxo`>TIIJuV'TUUE RT\zæ8I )ayyyJT3zxXeo?~lEeepH <]B3.v!T,泣t̘1 v .mYZZ*&&`/5Xʦcνq vmiH$A'ǭ;w45Q:}`Os񢛷pb?hj,3rqqLLދ=5b^Z'ǵNVR'H !Nh@3gNvlIi)ee^Z: 54ݷy544o7,1g(9:#ȎexA Qu"6 xo{?_ =}#GF:{É<-,zrϾรe'8!$*"B˄tB#wb0'/'0gc4iɉ sxxx6]s}fz{zHIJ񭰱~M]0h^XحNYkV;Y4{,<o!owwyyy~ev#Huu""c2N,`7CN>\<0}گOҧ1"7`].fOՇʦF]R#FT,u}=]&N431 SZZ[>|,QKJ&N@\{'::Cr CISsW%$<-|2yDef* aT׳3{SB~ꕠ\BBХqlq{-6/{FDl#"2vXJNWeҲ{g7\_X~H߃Eqpp{KmV SW-\{gΟ_ff2߾~z")y_Hnkkeq04-:\@YkmZYZY4/egv|hD\XN =,=!%{9_{{32N>aʤInΛ'N<YaGGYnΛG !4tW;<~cN\\\؃ %TZvΟ6[ˋnuײ.S;[v09 ү4X É;=~t*O;9WA><'(w]dIZrxc' <9uXLtyEEjiz=;Q|gC&8~")^ytxMƓ&O*0pXN @/sVy)f&Nbx/cnjaV˦ cFF-359vK=oo{ 57]-۽aj_6ef^k8BhuNخ k׌;Ԋ# Vt:=BB?JJH0܋`B<<<_ڰ7o?QT\Ԅ^d]}=2kjj/9zL4 U`3:ٹ7oY[,c=K}m{777-w}fP]-mlqĂwIӗLٍ[/?[ I'B0 2Ó[uQ߽O;{zn'z#G=GБX7lCC] K%$TV^>NV{iqpӺR'|.^旟L?=gd䓧jI$l/#;z؉; ;EoEEDTjPSSY$2V-}ۢ xnբb%I'Y<*h1зhj1JDE#9 5-#ё϶=0?51>-%,.!Ҳ򴔤{yyك1wދ-M7nEd,X;(}yIbܱGywn0 B?7HrppФspp2Cknn/|b&gMSW[ ?0ܕ0GG@@`5ߧ9 ¥m[HKI nt=ôn.bb[\]2};F\L͍2{!KFZҢ|yJKKa/_|I>**"қzf'kJ߃%N`rM?"1_~5e$9Ee 0=jeښckV8::9r.<ʻ0 <2]I1c NL>sBH[soihj?x,}=PΝ/Ç~Z*tk;|1^fyL bja~??+ BHx(NZZ~W#߼Kc#Bȇj K%2؆t-D_x-3NV2{!FDd,ˋ;˯_A< 'F,`3|b'yDdWRڳa$,_!p􈣽qrv4.B@@*!U+o]zp#>'߽OK{[T8'QVR/z {#C=Xf-@5X(!ŋ/\S/\dU s]|| .;SpNWo28I  wUTVb􅋉ǔWTRf"d77wkk+]__J}(!!ۋԲrr<\İ9YWruG"s5УO1?e c XvܹPGGǹl--QOi㪓Ϥ;]!$R-MWW[ ?@X8+e2BMĔԖʪ@eYGxԨ%% w9[PUk_@`ǏGFFGfdfYkooϽlܤ`מ?& WYYCUSKUSyGeeU_,LCCRc""cWX_ϽA܌}WUUոq֯Y+/o¾][SގU+/Znc ?2u!뼷z8v7oV<+;nll¾a`4h&XX3)~G"CCzvvv =>=S+l?5h]!m߹Sa|?{T|BD][, *"**ĂQ 4 MQ좲bC ҫ( HGܻy! s3;3y}%Zn]}M2`!#!b9iOj6-7RTUw ѣ{w"=gMw޲YFZDkZ>bw'?ysu=p߼nӖ"tف쬦ץKR#  k|oX0LNe׬9b "F[8;!!F1+z4(ս[7uˇ>T'etKK­8AH+z^xu2BճTI|Fmk$voЮ`gEIKK2HCȲUUmbok} LڽYLy&&W)A!ӦN=T2ݼ}'P4Ķdˉ]{j]!C #{۴t| XHJKKcu`v姟e6t\VV{4N[KҹsIIO:zxYygs/O{Q/G5Б]ÇDFǔM>Z#8gL {mQ.=#p8􌴎;ѵ.DE_#:]y q+2{ti:v`3!P_4<8h^cCCBoNI,!d@~繹P`/(}uf/@?߆F(|NaBZ#}nQZuKqh111MbBBm4O)_=؎z-+#9dhmR#C!F~pϟ?.ܸy`}Dv>} u$1QMJ:'7uvmbdhciiakp+!$pwF֭[:uϒ ׯ}N %;;zʔ+I3ow}0*gσ7`Gbe?e%{$!qDƙXYYZlԜ<}&3+@/*&?yFhӦNAT晴o9r-  ztSE>^+ 4:MB를wlJk8v\HR^vvCǶL[A[TUlnʟfeeeчcm-2JRRm\qFQ5&o1{wBw6Cbbٵ{n+}._flhض×^.5U^^~P k>ϲss稪pKxmB&Q%/u`2GjT%%%cCÙNw7;q!lXT4A[,D> m GsϙlŤbbbUUUчm F_$ԺP4q?q( o`mO6x4.}c4b!o YyE?~.o?}>OB?NJzF&# /_QTћC?1|Q3f~C5ؿoߧLj85 :׫gz^y?ԫgبm-MIIIiiy]n'V.PSUe2Sힿ|HCI,Hڍ'N̚y&ܜ3 !Ϟp7搡# yk*{VJJ˗/Ty^~>6 N,,hrr2c"|=^:?Bѯ}~y8Y)FwjYӝl..)32Gɂ~/ L.+@61[V^bLfVV^"Y;|8\Il X@ h Slm^z-IXy͸ɖk7n\ظ'm8B*++w[XN YZ8qژ /Z]H\#y Lh8܅o'a{'gsK~uz2:<2icPHxB<&^J5ge?{/@zvݻtuPokR?Q#JbqS, fÇ#3db"G쐰pr'A~ϝ%D:{ xSuNw׉Ccoc}:vg/^o؉xm ;PUUՈ)%?}5*<.  <bocC]E3| hRRR6>isMN_iS ͘rbNQ_ǏOwBWKyBW%EEjPUEB Y"ߩwARRKE(51"eddv4psrrfPhFLWWS"o*{[6w`2%6CFGEY[Zc%/m,-l/7m6v,ʆoj /E3!$+;*7ԣ {ܰf5ùs/iaW+))ymڠ,HmYQս[Z7/u_DU:dpXDdHX/-vN ?Xp9q=>}*>wgܗrrs}w ZkOz#x&mWWWBhtǏ5 >-wnRޖM KJvǷA\ڪ3i4ul1[  ??~u%ܗK- a|'ɓ ;&h1>Nn GAݸ9'7J'NOnܔY]]m-le1˗El6"(P^x6_Ko:fd]}7a &&&,۷6F65o<ƭu3ЧOfIBB-ܦ,FLnp&޻ʲ2x_A[ր_Hq~wM fsuV+ZHD*vFC\T.p6dvck``jfՊ;w|/555bbb o5|$ ր8`'@:[([@ O @ 4 m]  v.SsK떜iC_rD3$ZEѬ)sܾ8_RS,_gd2xHiN@MbkXdCri 345[&'7qM5:Ql UJʰaCO?}R^62si\hnfqC}q $  ~bGXRTSSSPXshнӕJc+7'O/[pcKZސ6VSl/[p+*+w J"!` Rޏ3 }+6_Ke|ۯ;-6:2*<[TyLll҃{O RF{bI,Pjjj BF羐а#1Q1w֠E ރ7k[ηk!_~yuyn=Y[n}A}#u)[}w ~I!:;~Ur)c#Y!-׍[-nk".&"W"[<ݔ<]HZCMUdN{بm-MIIIiiy]n޾Mp_f[MW!$w7%EE y(O/_D]MMVFfт|8dӉI,OC :p'O-X"|;矋(يlb|l^(kFD|@!7!HܱM^vwl7(߈|S8*JXnh"FԹ--;k#ǎUWWB8`c#o[[ޝYwt:vV^^~guurιyy[ ))/_/˼ 5 o_w*ԲjB*Ξdm>545}艠 8 ?|(*9|w@jot:5qI(JBfDķkAAAA/_{,ﺼXCƍ5>V~FC^l/r7}Q"Iۭkמ{\JL420wb( o[VVwgqu pԺo)*32ztNyظ.5{fi=#-&J5!AgP*ʻTUzts)5=q{7n^&LrzFF L_3eQfx3_e/=Ǚ:v4?/=$x_潟V*(//.20l*ˮ\Vo'J$egcͽg8&6v]-E LCw]Zˌ野>t8'7g+Vr214럓Ȱq]X,&i7Ve@n^^n^?bҤ[޾{WYYk{9qQQј y*..Yahӽ!o>fgNujx\DW) ݆?ul3 ޑp8# FYGHb[Ǐ#Kgbh3/??/?'`g L5#ױwZ/A_)+)}̙ЃG_"c2237yy7h?i~۽mr:>^x$_:O?5eS06! ﮋYuc+{ 16z1٩{nNN=1ͩq]]2pz3]]4|cZOsRWWs4d bVmrͺFg 3{XN[PYYw8hLԛN'x\tj9996]`4M/pX1O<ν{7#9~ԝbG u3gZ`$Є=9(+ۿ_QsN[lEfff.]̢&to_?K[{amiq/~sPg:;989B 8iOZ_; {;$* Xj50Re!)wr_]]=y(aV.[qЃ NS (/(pEگ5Lן# :u$عн{Đ[n!C;M0b25CSIN>]YQ9b0Eddd }3ǎrsCQUSC֠) gbiS**+}v.{vfo.tw}{:>~n !>?Blm,!kk?} ;̞5}Z W.[J;ٸaH-MLbS,luGRRR@qI աeFHb[;k+;k# L~$gG3?bMPZgbS^vvC((+K=ȱj#))imaAIOzw(TFi޽zQֽw$={ta::gϟޣ%G4" FE ߿Wʼw]nۂ.s쬭$%%oT+![g]t`vyvXDd޼7":&:<{sw!]4:7b<+lN;uk;1cֵ+!$h>{$Xh|tР!!w^JeG{o]kƆx5yFqII}oֵ ss稪pKxmDGGZv]jjLgI8l [Ç-^PH&O4̴st"L6777GHb]~P4oIGY#qǬ--CW!m.'' &30"Pw6rꏮPfϜ1{@#h .b#EoSg3VlO=?f,vP.O}dGl\ܻԺ3޷|HCȘCŠ~ff;+*+g{)@6~.QRR\-ii5U{ t3df!an{: ?oeKW[2<2v;-<ۨPBȚBR'|Dpj@dfe(tԮpѫGZ{|7%t蜛[lp&ĶRu3X\+r_?flѸɶV6;wWUUժ~s+q-n'B+W:yVSJKK9NԡN˩^Nh`jFy˼c&LsvBԸrok_=N[...qƭJ?";=#>-]IQzQrh; HbŗsjIzpﮝ!Ai1Gj~ ffQ#lvHX8!&":)"bb&O`XN|kkd؁('O.;Kcoc}:vg/^8ZA tݻ[L[qcM}|322?&F}srssrswwv$5HbIlkuj[xy[7ۅVPpuץkJJHXS%'hki2̿/_!ddd&0q8BH \稨(HKϞ1T;]俆[LHIIW^)@zkci_PP_?f̙;~2pSn{v1c]<=j$I,nL[rH]&lc5UպsWKyBMm $:tșk<#cEDG̛2hHOԸNMJJ?`5=^R2 .]x+KHH,]hE pF IDATG&8v]yBȦۦۮ]b[pˇeݿfJJ^6GZ=ܻW kVs8;`A [8;Nm14Mˉf.'o vݯ7ֻrrs}w&ֱqlm' k}ZZUUw6nƷM^R߿&袞8Ը|OrbѴ32iuegIK4Y\-9ƺֻK- a|'ɓqJՌ 7eetVW6u ݸ9'7J)q;hk]/ߩPS$zfVFW|[5U~>BЊkkIG-yo'111FM?FIyS˂T.uޭVۣ{7֨C[!!;'Gx. MNB\\[K3}ڧOhtGXĂ0f*kVx!ݫ'>{ in GHbˌ|-LME AhGI7鄧@FBGI,v*SsKk!CW|K^$ ]A ]>}y&J*{2l؏ڵ\4XhR qqIlohjfhjϿ{OsP{IvSk>ӍnRYY}h&$,lQ6m.++^9d(1cLvTVV86qO54Dw㌙) Pn?}mb'1c?b}W5.DQ+ Z>txxs-aB)$G7bv?>oniɻT?$~6*<4* p& A[kAU_˨/_ HbBurBHEŗ# HbۛظccÖnYHtRZZrO" Hbs:>~ˬ3866@['#-SRR|ߟ>}bXvν$iMJnj=qژ /Z]*!ci╫T<+)ӜߥrKx.5u BHzF[̭lM\qOSZZ*h|Wuuuxd ǎSu?.nj;qfju3:pwr6Ͻn=r`̄v]Hv6=^oG.͒p8LfC# HbەgǍ#L0{^'b bocCd>aOBw.+#<~T{!db"G쐰pA9eķz>֨м|!KxO]؉xm ;PUUŷ >6֧o~E}86-##$8(xg(B:h=f #+;7zHBHݗ_vv|Wee)))ɓ^B4LߗB222?8~@-O !/KHH\rikiBտ__I 5q꽤2N+ᯋQSU2Kޅly+…sTTegϘq ] -ſva+((fnPG: h>_ +5ݙ,ߩwARRKEwzhH(kK IIs+E1&^XFya)_BtvSP#竫-tXH+''i FbȘC222f 8V;**e HA^? m***x): [Z VHRRrpYY7! ݒG>h41ӧObNZi4ZYgD[4Kܻo999l h1Z{r8i4-:tLII[[Z Vƭk%%22C@@@x(!ŵ4߼}WN ̈́Fwԣ{7q怠iivVWrih'Il0;@weY:]AoڰS[Kmjj? Bz I,x/4wUĉ4jp8Ɵ>8|8FU7gvl\\~~!DJJ26*I= fz_PTtB#3DrڵOg0ۙ#Ь>N&ܻOz[z0wc[Lܼ. \֧ q'NfegXZ9glfǎhV4=4i@v-^ta;gΆϝO>+x@QZwަ^+̰:ee/s˓<,**=,|;[+ʪOB?QXתC'2r[IX!y1&#-Mw>EE[Mw\<-|捏ίlB@UU۷l|횐Ξ;3Wuܽ'NJu(h{)ʤ *505'ZII `+(iyZA5Ϝ;G͊~ }mOȁ ^={tvЯߚ9NrrN!y ?Ի߾yG7n٣fWXQS]cge)xyyeeZ3 /?{#CFr&x pY9 !3fR%t-dEѧYS$"23clhݻ{EDz?!JJ||&/_4,4.Ç]vb93 Fp84-3";;;';'B -Ig:?͚]VVVNUwsr4:w& s8 Lx YQiVThu6~GZB$eeɿE264 =v41B8SSAЫg+׮>///7R[ϝ=sFݷeW_/)- eeanNٽw_^^~qq!647/_]j*!DKS0!ӝ&L 9PXXXXX'@粲IIW{ Mu>EMh3cx!.ޯ.4!<*z 9Ο/ş4g按 ib׶/_:;N^-㧪b1qb_x'''w9s;0SRhn,V>UVVu$7nT[BLwBW?uj&߹{Op.:^cc'Or WIDKb(h{)ʤ m-&&ظ CMMd222r?z(ù}nqId?q]ôT{\$uŦ:BHbX$HbI,@@366n1701c4$ Ln On {)((xáh_|)++{o7$EEEERRRzzѣGݻwK ;i4:p8F';/ƍ:>rV~d+h\Q#Y7.@:{+W._\Vơit:.yAi"SAdc3XѽJI6l()4j5b$D~={Vf3 ]C.&&SQR=zhrrF:;?Kii8)4$u~!`1N )UU])..`0bt 1Ç5#6.]jjݷ[=wXICtG9Θ 搡|6TTV745345_QY)|}M'449$_BH+V7\|EQQN !w%Mu;jOchO󛠉<[wb%hbC;@ III1Rbbb Ñ=XVVp X&HHHjDFFz岥׭T'$4,++HLTLDݤ$޷nݹ?8(10-ۼɿ!?}_y*%%4U##>z/hיrrsKYrŅ3Ο:{N !ׯ>꥿ ~Qi~2q wb%hbC;@ Lt:>!%ի/_$%b4Bkjj3PSS[KkAbl"m![+z2̩v_w<ݔ<]H^sKwVWY5~c"4%%%vyNyy UT׬\= =oB&.AM|WltHbڿ BH20;Y9414KLԔ~.eee›2֝?n^^w:[ ))/_;漼|.sѹn9~=2o(Cc!CG ^}N7nО7! Nh& +6t$_YYkh4BF#tFν꭮FhFéӵ>| )qqk=7nVswٙzFȦZx()ei"djqMy= A>ۼpnu`hO󛠉KBB'7h4!I,@;קO[[[&Q]]USUUSSͩ.WWWdIKܻwztn1ioݷL |w쬷)߾{-C99L 75noFFX,&iW\[tVM/DDǔedfnnШ4iy̐$ڵ+Ù:u%%ş>}.--.)~ZECcڴifff4hciLg'ee%K[{)e0ۙ8i,ޜԽ[7'g'{̘$)G~}1gI+]2pz3]]4(]%W7 ޻ouأ&hZl[̚;oAG -cll܄-&$$" &>|t1:sI8%#[̚5o߾L&S$VRRܗ.?s< 淶2a&hb v-fEYY5--ݻ?~TN}ႎ:rCQQ=.ޭk=xhoHNrr6&ƄȘC /~.`kc9y9f?_PpY}8|ŸÆ̟3[JJJ`D,3ĘL)111Q,++[C8b ]Lp&ZOBw.+#<~T{!$p;޼}}8Z{۷l>u4Vk߼mtŭ~ ffQ#lvHX8|N=k#۽x-<|4.SQyT'O.;K9v'>^[#TUUEF;Q> 89AN xŗ/)^U|")!NB8F@-O !/KHH\rjkiB.8o"fϛ=RejE TU&O4\Vh|U/_r߽,k{I滪(+KIIYMut1¢"%%%n ]?g\YTe. QQQ=cƵ7(p914 BH2%a;Ȱ rs$$%Y?r85XreeeuWЯo`p07_p_kjb EnBUnMu5jEI$!DS'嗊 WKyoSkȘC222f 8Z"4Ӆz}YI,4_ILi;Ī*+hp8:]KKÇuWg2**^2H;2&ƭӒ.+;k.,Bƶi)kW`XV6ۻW kVs8;"(*32@Ke%%%MTp0@p914]2YꪚjNM5w}F&KZZFF޽{|[4p`GBw5z]{;zڻ(mJz(b9 "DR8^Q|mu37N۳ڊE זӹM[vn:*G+kHF*y#{\ BB0/>>oyo?ȉ_߹kW2 F=s#˗սw_^;[yx݉Db;#QFm߾}ɒ%7n|oD4M&-omQQYy 775\2yҪzZ3=؛߸be+E'mW<,**\8o=xL/++p} ut|ϷqF/ںu[N~c "֭5kVff8Śu܀A6{۷++WEfgg:tଡ0\t0.3gݻG]xbE#b33fxgcXuuW_akkkKKK~~ܹs b,3 88D,XD,XX b b@ b@@  " "D,"D,XD,XD)@@  " "D,"D,XD,XX b b@ b@@@  " "D,"D,XD,XX b b@ b@@   " "D,"D,XD,XX b b@ b@@  " " "D,"D,XD,XX b b@ b@@  " "D,"D,"D,XD,XX b b@ b@@  " "D,"D,XD,XD,XX b b@ b@@  " "D,"D,XD,XX{Yx̚5< ,Gb b b:1@/uhjnlmmimk ?^_P\TkrD,@ðq}G9kyyAtt彿7JKFD"& @ |cې!gM|Z4//(-){cַwl;X>='~_^^|옋,.X 3W"` ڳ E۹{G[{f]Fb /h]f @ ag MdR䰡Ú@ra'P'0 {X,uuaI ۮy9=/  {mmd2oĆaxШ {7ǎk*D,@ijj,**I=,ƚssZ\0 ѹHۮu"gA h$r&OɾD**,2"औ޷$|ݽoWYوQpM 0 #H$ EQXu?zf7&';'Jg[[Ņ%;; T*H$D2vh5W'8Ç^R5幚bh4mbj뒪)Çh4ϋ)ϋ+X@RU.W~ApeOgιӟ%/͜s]pW7o\U(T*ѣ^;v=C>zOGݽwϑX3;b#d2$RTv^?gOzj⢕LR7.֭ڗOwuxٵyoUkּ}QqUk^1#k^`޼ٯ:q<oim6th---/sM7Od2Fѿz]AP\TT[WwgA k`Pr:1UN r=g 7?o]5}~'~~͓]wYYk7g_=3k{onۖ[os9ǿ̱7mx{{{p,)5۷K jxBop8g_ Xji$9=߂;~zsX]=1=+=u1qgΝG\^ڰ#!=]/^D99؏rqp@x" l 6l0e%%.Ny ȑ!9! o 5^nF)))BdtC/9B霶ӧB-,]22z4^-Qp~w鲒R?_;. || D`t< K K`X`X*ʕ+Mrss+9&%0, Z:p` ޶-)-~ɓc[[pJJONp8UU%f^aL7޼i6gLB3V, K}L"O瞚dZk/+)-C??8~v+,flaelaIbaX,VphUJzw-tAT5R]@D~ ]'wy B =ܓRӈ_FQA۾xJTXBhڵk7l\ʻt;{xW}cB?^ER]ÒA7B߿'ʦo3X7v ĶL&wzU70TWJ %_kjʪjlzRRTӫkÆ ʪ.&8P])+[^QA$4`40f&XI8-d2̰H?^S[g?--B#jjj߶Ѣȫ&deGVT@JVvd7^ϟ1 ~>^'L4Q K_Kk,<n޾m`jll<})]QMB* V=qOOy@'WdeO Ho{5999-`XR34ij/a |b@E1O: KݙUɍ1c@nmG9޽o!-ueKWKNyScԵVȬ^@O`0Yt'.]mK$$$RƦ/>zH9̔Jgb$pOzI y9JOw{Pu|LMZa,> >Lg66b'*^={((ƪldu k&ai}ի㛷޵ UbCא'**u>~leol+h_{{;j`bflaϷ7sr-mtuNFnXHUX$stU7o3x҂yۖ488kҲrl|El˺Fҗ'̭mgh!iLgggl|IZqȍb}ozUM_'fa}'u0.&\N6͎OIuu'33S_`iM)ri!]gR㱤Ҳdzz2O '#0]`DAƟGVFhAΙx3gLMdI tf>zj`0B#޽C=xPG[˺Fҗ&[09-1n`0H#7zJʪd۷{_'fzIff&g>[IIiٵ%dacm[;WT`ۥeegkEv{{~jfePZ%y 8KU<6l6lK[z48k7nlܺ$359{lزS<]vV[WgT\R*yoȝ'%i?/h2d?[Bnn<~,P5sxGOKNg BVU^bu6N`Pxx9[z5.ϖ 0,a ??{׈ңUՆKںe13ypjj&TeU5=%QѓI':;Sκ/ԭEM֖1jc)""2vXڵ7?}!'{E҂7`/l`Lagm`?:.?yusduVNQǒS>.Ԙ6u22؄dNngg<}e~bbb,W8NƉKW~ikkb ,RƦ/~ #{AaDHpnY35iчXYeHMVPPHLJ0ؘ̬P=9{qѓiIlvRZ:~xѓ'1H`̖Boܹ? B;9OTQZ"pBxI,1ȧI|ذŋ,/_ / ߾{Bw2._޳c;_kbˏ ԰kk@1tӫW**?|_'K*)-mimE.'^hUF'-540w\1mZ. :ppέl^:~q؆畳y>RRR #palXS|pJ_{\vfc#z⿻'Cjp #P4#q MMMMG DYʪ*QRZ8}mKJ5OB|ٟ⒒9stQ;mwp7޼i&YV, hkkN K'ʶܿfZk/+)-π}Z!?~LLJs76]`urr;ΞsyyN.XQ/_rWbXa&fV)x9D8*bEҌ--"iX,z:;;c,lM2񴇨R -'̭mgh!&/I}7Nt,ISҍ- L̂YCA+w}}sD!XoYmdo޾52|r-&fs mܽw&\4G[{w ̬q1rlvl|y+6:/LLVYWpF -%ݟ~[;=%eeUVFZz2]4XRriYyz2==^\RBON!o!9-1n`0HCTO{H*}a*=E`;)辈y':;LMH{JF޽Fǎ>y~eed9g9sDFZzÖmΎϟt6WIQ1 bM$33~v\[p>e^gkv{{>IfC]+^bۍMM6vb2>(eevqIiX;p2Q`"N%C%J֮M`I}7Nt,IrJJPtefm{.# sl}]oQfm"0PM)ʶ?/'!!nRW_oKrSP.kg0c԰qct&+RultyH*^$*wcI;FMt@OKȬ_zP0~&FFW+:**g=y->:aC/WUUQ>LڋU+)*VԨO2](**TVUw{/AEYz$b lb܈;ѱ$eT !`0]A;/OK\bQfV M۶/ ٿOzĈVgK}Eؕm2RVl{WTXMvjsSpZd0a.ӅjIhh`0B##L---B#jjj߶Ѣמn_s$$^y':LpZi/6oQV^fBFhڳge.9;:$%%w;DfK}BVv$ʶ#{X^~--`(**nq- y{{EҜ=x߽w<]xѢc<|BƆ^EKxw=H`; yTT4mʔ>y':Y lע_Duism] Awue_pHtds떈[)(/p/ֽA|Wuss <( p`@ sgq1! }!7o~ Pkl {`X`X=Y٧-geI_j.2ap8syy]{Gko޿?{>{wn0~tB!+˳B3gh=}b66F}ގzLXYeHMVPPHLJƋ*z$y3HK:flFf5S!7DC=\]e<{$A_ߩ,I'*^={()~~RQQ}fl|Ѽy!C#f|ZnCjp #P4Q֖Q*lvyEC?(NI"7Yʪs,Ic662caBy5H\BcSScSӑC}7NfK_zYYeXj=%@O!4OOhBa5b5JקlEDEw opyc޹w_1n-ד$rssvZf]k[] 9XO7c+W!puo QS5M X6$*z /` i @X`:-0%>;xn`%%, ̖k`ROyvVxN0, 3 -xkkkikׯ KcbR鮠}X03c fcHKOߺ}O':;LMH{_ױҲdzz2ҽo۽{׍_}?mز*)*F9za*=㓜sN70]v䏛brdŚun" \}!O\"=dfzfjÏ1CJS/ gklllĶ۵tm;gvcSQKʰRdcҧ))-o_w]xaofm{z*jmm5oWT[WkRa2Q ew(KxN7`>|- [^DNBBv]} q-c0c԰qcDǒ3v䯋l䮋;P N'%eed֯]=G[g=yo[Zxɽ40a# w_]8&q!Ij`$ RreUI=鈰jkk'~J[r߻?bnڶ?I8-d2̰HZǒN03$4`40f&k;l6BHT:RRRuuA{!55o[ZhQ눰̌Mikã10["\EEEm\[[;nܸey{{EҜ=x߽wX2gij/b٦>^Exz }~}]ݟ7mW0!h.wnq6׺EKxw# trsqrw$0dnnnP"T}dMs! d:-hQMMMuQt! b0VU^bu &>G&^oΖ^~ C% K`X -!c}A2R]^Qqv'{;'{*=+_˰{{.34a>24o=(|soЖ1fήv z->14'@' /['HZGGPػr8ylhn{u"# +i.Y|EE6v+֬+kGWع/x kd/J/W󱍊/z7b ǂ6B7Jڿgix}lSO&+(($&%㓞KytEOƒ%cIiBU---;K .IARrѓ'1ȫ/H۽!YgԤEC=\]e<{(19CS1Hv'Ogj :55#`ŦffHIIO% >I܉ GO:E|0))ŋ=s:啁KUTGX7f&X?]66g/\Duvv^xΎ%VD*%%N74zܬUG " 68s!3ghHJJv:BB;!ҚãL_'K*)- \h! _Z~4n ~󦾮?nPRR$/d< ?|؞y<5#CZZzYO⿧`kq(:8hBdW,:uRnHWg[w矣scر[֯@T=]<=ݣ %CBjjM mמyz rrr_fa up8y74*a 򎭛I0,~b aI~hh`EO:/{~h?4Ǭ \Vx`XyDqIɜ9Cp) KR[[۰o8 Kee[ L۴J? :PCK';'^KW_IizbEҌ--"iX,3Nֶ3A~}11)AtWоvUtFSiY9}>"QZVnDS99gsrx<[',n=9޻KKW>9,36>N$-PE1T"=ٰeg/URT>r{/R[-xؘ݄+hk?"^y%%'ӓ%%.Tz7 2Dfٱԫ2!م"wﰒu;[Q~lfbbͺk7bhW.Ӿmw/뱣OKLNK{q|9 IcE`{5L0}9[[[Gl9noo$yJʰݶں:^S ٵ%daceTvƭ9NRj|߼z󨘘/Qˏ@yyylCBBlm;dvٌ.'z{׿\٨,e-355G .^k6zr<ݵm yQzr."CIqtYkWƦtƎ!6QHC/Wz&ަm'=bDKkY_HBQQF}DPeU5>a:::2eG|*Q;yTUQ>L_ǭvᒒcF/!.>wN1US$x?!`0]A; ?UՓ'(b=0l+!%%%))YWWt $aflAk`0H3c,?^S[+)+[^Qt߻?bnڶ@, mp! sSp--ùؼ}GYy9F~u[ZGԾmi E <(b=0";n>r'C@~>^'L4Q K߲q۷ L-ў+^c\tZqyF[v"M2{О=+SccQcSap.uu޴yql\|]X"OSt*=Lr:t( \3sC:-q1!~Oy Ho{5.%0,u%3 մ1BzppӰT[W2Fc&8NUuUm]d<*z>iDWgGݟ~YWp/#f񑑑 zo⵶QPc EԮݸ_G 9+\1w*7>Df|L7|s0<.&%DPj ;kk'{?~a-y'sr;;;->L'D֥+^t oCs˥~9MMW/^ndȾ lCRR2wB`̖ѣyzD{=( :>k&-qv;`cez"5YAA!1)øÇcc3NCQ<>3HK:fËzQ]`o[G"*jQrr!gY'Ą#'a/ZϿ|I`/%]$/gj#^~K=.zr 4lbA3, Ecڴ7]t[7KII:u]}q W|Gz$^qH|ž{WgKGEgea66X/{~*:::h`0"Es:t$.@KX[ZGb{S9qaØi4btuMw9NuMՈGMmtǒS22;޿@^kV'6 % | w`p͛xB?|u%0,0,'Om\4tȳu86uDr޶-)-~ɓ!:v8fU2'U_m0,bES5l[RZ1m΅wn!KJ5a"x_OY𨖔.[zw7*=+7o$yeҲbcچ}WxFlNj<]qU+MMzp ϖ]ٖ7k -_gZk/+)-?~leol+h_{{ZRҍ- L̂Y,O7o101khnf%KzS_`b5F -'̭mghAyB/-]}K[s; [X[XE>'0SiY9|ElI`!wsݦAwc*&yfo[ZS-߶P*Z]xo߽SpmC̬q1rlvl|"䬌/+)<{7lxKgsEzyO1ܾڶ{bo;;~,)<=L/.)'EL`Nم"whk_pmag$Ym"22F rΜSrΜ535UK2339kW9εWZV1}6Qecc#ޮm9WĶ,lUZVmͷw$l slM{{;IgkY?y(hܵ[;-,.)o!!076npR晚=p6lv+)lrG'D󏻨 sl}]]=DlBl x=]W_oZrm`2y>yTL̋/,:cjlt4!q ' N'%eed֯]=G[kLf#qc[0~&FFW+:**ԣ 8ľ(SUQ>LJF}DlyM۶/ ٿOzĈVO H\|آ'Owoems8?n׼$STT[XYUM%%njV5?_B\|ck7~&pY)V#GʮݰqmzsG,P69wWD#̬ U1?[ve.-2,tӶӢL& EYm萒:(%=ߚX;l6BH7V3cZ`FF SG[+v!dnfz0,\GKp^;wndhȮ#s(YmmmYK{d̖>InhKK+]EEEm\[[;nܸet_fM}ݹuKDTƭz\㺛͸c[Z[ϛ6իO{yg|h1^>!cCC_o/asjϞs4!djluHxXBM65>&z굯_7/ YwUAwW}!ёF0innn۸</sWĘdCZ'de0}̹uu&Fp`$MFG}3a tGtׯ_C@jr`a K` 14 `X]! лxaEDDF6eJbE1R^3|q1MzTnnPpHTX`XDDDG-psurRkj%<|\٩1mU+eed RƦ/Xk7~.s$c -W/<~kW8a< D5r˭ѣDzeUȑne]/dȺt嗶9:+.bbL<~wm<\H(V`cee0k& A >[z:3?w*+=DjBbR2ɓZՋBO440.|, IDATCr8ރˆܬfjҢS@T#pWs'i!Ϟ?'/tEOƒ%cIi(wTvӧғF$ T曦W^˗W.UQQ1b/NT2ʯWW,]:ZUUz'ysqQn|s4n߈ηzHûF"sw`;vlEDEw opAOJvvth~W$ Գϟ=~0ӲVQQQ5ѰrCIoNkffŕo߳7#>k3O_o\o drrrWxH\ׯğdùpr}CKn2ee+W9ZZ># +e[7?0M<}Kxb[1D@OgK`X`X=yj䢡C [T/V=(MAgaX WF^R1޹q483[Xm޾^Q~1d掇]]Ii;|W#yWY%os?~lz*=;qCwmmmþr/*ztMkW475A-}AUTPrv?~LLJs76Kb 5013JIKmZCK';'^KW_IiYj [X[XE>Xܿ"0]`DAbC>5/=OYY~6mnnnk8~vrzlMfI_sOb $wsݦAwcG%$޼};mK wۖL~%,`Q^-X5uRa>~DOIYu0.&\N6͎OIuu'33S_`iM)ri!]gR㱤Ҳdzz2]xVMnԗUYi[olsvt|쥳JG<|JO|pnZ3Ə/{߁舰3g<*$!+#c4 Y<%Y3Sii&prF%uy1S^VMtBgTgK2339LJJ˰]vή/Ʀ& ;lޡ.-+>[/ hllĶ۵tL'@T#7+{ҲO-/.)oS8y^ (;rW-V6x]uuUg6?ψʓ $/6CKES<$S$ sl}]]=I_Q(.K(I3mƽGʎԘ>MD O_P`bdtSL^rOYbxtX5uRx@nHEOb/UU/fwnݿP[[mWCèԨ窱^\ O;% 7%EE꿛igO돂_.#&9Iky с a̷ڵ} {4J$}ý˒ea~{]$-:~° ޼yw{WTXMv`f&CFfccxԡ~h͌MB#h FifbL^HY.& 7sSpZd0a4@0I-JJG=J=,<]?fd _yЛ;724dWsyy4J$={V[[[֩{aKMaѥ+lKC, K݇Kޅ:9n؅_@~>^JNnn M2R <|<|&MT"/{/?.ߎmB/ٳ[D9򓁡_` ]]@O.lٸ˖h^3>mj|LtLl6#*yT"tI)4CszTT4mʔn(F%D!tKuV(<ݰ|N }}|fЀP~0ZTSSS]}}x!~Y)kCL\aѪދY,!Y#}i_~ C% K`X{zܒb~9g<} -p]Zxմ1BzpD=(NCbR3 0,QQV1JfwKy35i(/>m*\0o⵶Q?c E=zkk[[?<`SDϠ%6-v 9O_oxP]Ss,9NiS׮Z)+#z++ϏT`0׬M?:|Y6GG{%X-Ksr^PQ\"JnHO7W 3S*p8 'J- P؛{<1 søÇcc޽UVzdĤdkjF&ffHII=Ixcl6;)-/ɓZՋB.OBC}^NR)(8_YyYO \$@A^^A^>0x&9B(啁KUTGX/$@^~ԧ(MӫWJJ?^EDT Y@/n޾ݻw.o{b-^X,hAb@9{|ä5;e^Xb>{O?Jrf[a/~Od2QYE;qet蘆FS]ɰICG8صuTVttݘI~KLN;}ꤷ:lcZgUz{n0ti^"ݫIPfʿVW~v򩮩)(,3g\g=ƍ"ИFMlo8\b2%&y<4>,ܕ?>X'X89KI)7N?+5qpZ]G%icjAaQ榴ǎgdf<}z}\[ryDBddnJ+((Lژ);q"!>.{,[.ݫIPQ~++.?۩<,-|g^P`;ܹ[׮>jhSxɔGǮ9OWf>p0.&:{#~zqr~qϩj#!M7|ˣɧ*gU(WVUyGUWT}ܷJ㺺#{5; Z9/?_.+ \PRYs_Hg#k%%N$WTZמig5q޽+*^>1~+9غ:*UKJKCc\]ۅ:{i+o]X&֭[ҽuM+}=?;m7O>o[B.駟TZ:EZtԗd5lcgk]{;ftjs~EWUKk|f=jYB8|Kڭg]u_tXmc{1^v!b}[oz5; ^斑9z{{?;uŖ5."uz~>4̖N2kKc꘲ў^~j_˓BCm<]ut*fMyEEyEEKs/_~{|BUU1k=G}իIh2,sV3S}TԴ4riTHƏGڊ'LK'j B4,}njDLl܄BwWiS"_2ybs*_6w1⍷^+)}ooZYW]2:&(lBN&Qnhhh0׮]ӧϋӟ.6)B.rw1^NLFVmY;׬yy66]&>к)RkJ5-dՖӆ20hО:-7 <K[_~aBZv9WKvXKGrMb Km-s6wљ[9, :`ddtۃ Bux c##ssg'O9yJWZY{ /BӬtfLZz^ylm[ZX̘6#Z[w_7n֭3_kZg7/ϘnӥKWghQ#333~ݶŮϳn?de=Tc?d)zxr223=GxqάB.]J89Zbi:JZz\-נ5LW/ueeMWS}5<濗IM/Ϙ>ANeUU[[cM%u کߔZĺ쥙"&N022]ÆINMKLN9[_B=p𐱱22;޳G֑KM ]\sssL]EujS|_,Bk^v-*rZG>χΟP(N\:fK-8.]JJKGqi5F) 5&wMo>c'/[>ȁ$`BhpmBC:u=;8oHp9R.~Kff&&&eJ:4O7Қu7HֳaZ{oeUXT3{՚EEr*NqI4 WKݟGLyFN*Άvv=8Lژ4B1iG ^ߐpIuqѴι_jQqun͚V}}f]ԳaZ{eZL~c ,,)-eg7eD-;:.XO̙t@xHp fx_NAN= 괞t潿pm[gs'x jY;wuNd)={KʔFm^gUR{=ܼ}mw\T i|KmE [%% XXKKKb b @,@,%% XXKKb b @,@,%% XXKKb b @,@,@,%% XXKKKb b @,@,%% XXKKb b @,@,%% XXKKb b @,@,@,%% XXKKKb b @,@,:NmX… L(@CZtHtg746W]P(atׯ?A,GdV.NZ2!iP(**422X;֭TY]7nޔ>zH&YYY w|Z똂"pw;>mee%=:W,pO 222:'5G##clw4pB9]}}1<O>kN9S(.LLL {²1Ws}zw鱮ȱC5Æ=:UUUmC{0`@KJ^_~x````ݹCv;H߿| nddc\(iڴM}M[븉 XXKKCIDATb b @,p?MQIENDB`GM-Assistant-1.2.3/doc/userguide/en/userguide.tex.in000066400000000000000000000501111371475637000222700ustar00rootroot00000000000000%************************************************************************* %* Copyright © 2012-2018 Vincent Prat & Simon Nicolas %* %* This document is free; 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 3 of the License, or %* (at your option) any later version. %* %* This document 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 document; if not, write to the Free Software Foundation, Inc., %* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. %************************************************************************* \documentclass[a4paper,12pt]{article} \usepackage[utf8]{inputenc} \usepackage{lmodern} \usepackage{graphicx} \usepackage{hyperref} \usepackage{xspace} \usepackage{html} \graphicspath{{@TEX_PATH@/images/}} \newcommand*{\GMA}{GM-Assistant\xspace} \newcommand*{\interfaceitem}[1]{\texttt{#1}} \newcommand*{\versionnumber}{1.2\xspace} \title{\GMA \versionnumber: user guide} \author{Simon Nicolas \and Vincent Prat} \date{5th January 2015} \begin{document} \maketitle \latex{\tableofcontents} \section{Introduction} A role-playing game is a rich and complex alchemy. The players have to be involved and the game master (GM) must perfectly master the rules and the scenario, remember previous events, anticipate the future, and improvise the present, following players' actions and choices. If during the game the GM has to look about a non-player character (NPC) something specific in the rules, music or sound effects on the computer, images in a folder, then the game slows down, the emulsion fails, and the players lose their focus. Do not deny it : role players are easily distracted. The solution is \GMA. \GMA (for \emph{Game Master Assistant}) is software designed to assist the GM. Its purpose is to simplify the GM’s life during the game by giving an easy access to relevant information and tools needed. The purpose of this user guide is to help the user (you, the GM) to get used to the software. A menu bar, presented in Section ~\ref{menu}, and six modules, detailed in Section~\ref{sec:modules}, compose the main window. The sofware includes additionnal tools presented in Section~\ref{sec:tools}. Finally, you can find the list of keyboard shortcuts in Appendix~\ref{sec:shortcuts}. \section{Menus} \label{menu} The menu bar of \GMA is quite similar to the one found in most applications. Let us detail them one by one. \subsection{Game} \label{sec:game} This menu gathers all the commands needed to manage your saves: \begin{description} \item[\interfaceitem{New}:]{Creates a new scenario file} \item[\interfaceitem{Reload}:]{Returns the open scenario file to the state of its last save} \item[\interfaceitem{Load}:]{Loads a scenario file} \item[\interfaceitem{Recent}:]{Offers the list of recently opened scenario files} \item[\interfaceitem{Save}:]{Saves the open scenario file} \item[\interfaceitem{Save as}:]{Saves the open scenario file as a new file} \item[\interfaceitem{Metadata}:]{Displays a window with data about the scenario, such as the title, the author, the creation date, a short abstract, the list of players and the date of the game} \item[\interfaceitem{Quit}:]{Closes the scenario file and the application} \end{description} \latex{\paragraph{The save file}} The save file \texttt{.gms} created is a file with everything included -- all the information and the auxiliary files (music, sound effects and images) -- so you can move it to another computer and use it without any trouble. \subsection{Edit} \label{sec:edit} This menu is here to help the user in creating the scenario file. Two actions are currently available: \begin{description} \item[\interfaceitem{Undo}:]{Cancels the last modification} \item[\interfaceitem{Redo}:]{Restores the last modification} \end{description} \subsection{View} \label{sec:view} This menu is here to choose the display options. \begin{description} \item[\interfaceitem{Interface}:]{Opens a list of predefined setups of modules (see Section \ref{sec:modules} for details on modules) \begin{description} \item[\interfaceitem{Full}:]{All 6 modules} \item[\interfaceitem{Simple}:]{\interfaceitem{Plot}, \interfaceitem{Music} and \interfaceitem{Sound effects}} \item[\interfaceitem{Music}:]{\interfaceitem{Music} and \interfaceitem{Sound effects}} \item[\interfaceitem{Creation}:]{\interfaceitem{Plot}, \interfaceitem{Characters} and \interfaceitem{Notes}} \item[\interfaceitem{No sound}:]{\interfaceitem{Plot}, \interfaceitem{History}, \interfaceitem{Characters} and \interfaceitem{Notes}} \end{description} } \item[\interfaceitem{Language}:]{Opens the list of languages available. At the moment, English and French are supported.} \end{description} \subsection{Tools} \label{sec:menu_tools} The menu gathers secondary tools. All the details are available in Section~\ref{sec:tools}. In the current version this menu includes: \begin{description} \item[\interfaceitem{Dice simulator}:]{to launch dice} \item[\interfaceitem{Combat manager}:]{to structure the progress of combats} \end{description} \subsection{Help} \label{sec:help} Opens general information on the software and its license. \section{Modules} \label{sec:modules} As already mentioned, there are 6 independent blocs we call modules, each dedicated to one functionality. Several modules are ``trees'', in which you can organize information. Possibilities given by these trees and items inside are explained in Section~\ref{item}. The list of modules includes: \begin{description} \item[\interfaceitem{Plot}:]{The plot tree is designed to show in an ordered manner the important events of the scenario with no limit in sub-levels} \item[\interfaceitem{History}:]{Same as the plot tree, designed for important events taken from previous games} \item[\interfaceitem{Notes}:]{Simple notepad to take notes during the scenario} \item[\interfaceitem{Characters}:]{A table designed to display the characters (players or NPC) with their important statistics} \item[\interfaceitem{Music}:]{A simple music player} \item[\interfaceitem{Sound effects}:]{A simple music player designed for short sounds like gunshots, bell ringing, screams, etc.} \end{description} All these modules are available in the main interface of the software. \begin{figure}[ht] \centerline{\includegraphics[width=\textwidth]{full_scenario}} \caption{Main window} \label{fig:interface} \end{figure} \subsection{Items} \label{item} Items are the basis of \GMA, since they are found almost everywhere in the software. It is therefore important to explain their specifics in the modules themselves. The definition of an item is the smallest element of something. In our case, an item is a line, an object of a module in the software. Each item has a state, giving a quick look of the failure or success of certain key events of the plot. The four states are: \interfaceitem{None}, \interfaceitem{In progress}, \interfaceitem{Failed} and \interfaceitem{Succeeded}. An item can also carry additional contents, following its type: \interfaceitem{Basic} (nothing more), \interfaceitem{Audio} (sounds or music) ou \interfaceitem{Image} (any kind of image). The modules using items are: \interfaceitem{Plot}, \interfaceitem{History}, \interfaceitem{Music} and \interfaceitem{Sound effects}. Right click on an item and the item menu appears. In this menu are the four states and three actions: \interfaceitem{Add}, \interfaceitem{Delete}, \interfaceitem{Edit}. If the type of the item is \interfaceitem{Audio} or \interfaceitem{Image}, two more actions are available: one to play the file (or show it) and one to export the file. For \interfaceitem{Audio} files, the action \interfaceitem{Play} only shows in modules \interfaceitem{Music} and \interfaceitem{Sound effects}. The action \interfaceitem{Add} gives access to the item creation window. \begin{figure}[ht] \centerline{\includegraphics[width=0.4\textwidth]{add_item}} \caption{Item creation window} \label{fig:ajout} \end{figure} This window can also be accessed by right clicking in the empty part of the module or pressing the \interfaceitem{Insert} key on the keyboard. The window is organized as follows: \begin{itemize} \item In \interfaceitem{Content} is are the information/description of the event; \item In \interfaceitem{State} is set the default state of the item; \item In \interfaceitem{Type} is chosen the type of the item: \interfaceitem{Basic} (just text), \interfaceitem{Music}, or \interfaceitem{Image}. The last two unlock the ``File'' entry to choose the file associated to the item; \item The \interfaceitem{Add} button adds the item after the selected item at the same level of the hierarchy; \item The \interfaceitem{Child} button adds the item after and as a child of the selected item; \item The \interfaceitem{Cancel} button cancels the creation. \end{itemize} It is important to see the difference between \interfaceitem{Add} and \interfaceitem{Child} buttons. This is how the tree is organized. Note: items can be moved by drag-and-drop. \subsection{Plot Tree} \label{sec:plot} The plot tree is, almost every time, the core of \GMA., where the detailed and structured plot elements are gathered, so no important element is forgotten. Figure ~\ref{arbre_scenar} shows an example of what is possible. \begin{figure}[ht] \centerline{\includegraphics[width=0.7\textwidth]{sample_scenario}} \caption{Example of scenario} \label{arbre_scenar} \end{figure} Each line is an item and one just needs to follow the item creation procedure described in Section~\ref{item} to organize the scenario. Do not forget that the state of an item can be modified during the game to keep track of the progression of players in the plot. It can be useful if the scenario goes across several game sessions. \subsection{History} \label{sec:history} The History tree is meant to keep track of important events that occurred in previous sessions, such as important encounters, a promise, a lie, etc. It is also possible to write down some elements of the players' past. In this way all these facts are quickly available to the GM. Technically, the History behavior is the same as the plot tree. \subsection{Notes} \label{sec:notes} The Notes module is a simple text editor. To write text, just left-click somewhere in the module to write any useful items to remember. For instance: “Mike insulted the museum director.” This module can also be used during the preparation of the scenario to add details to complex elements such as events, history or characters. \subsection{Characters} \label{sec:char} The Characters module is designed to show the list of the protagonists and the relevant information needed about them during the game. These data are called “properties” and can be either text or numbers. In the module, characters are lines and properties are columns. As for the tree modules, building the table is done by right-clicking on it. It shows a popup menu containing all the available actions. When the module is empty, the submenus \interfaceitem{Character} and \interfaceitem{Property} allow you to add a character or a property through the \interfaceitem{Add} action. A window pops up to enter the name. In the case of a character, a second entry is available to add a short detail such as the name of the character’s player. Once there is at least one character and one property, editable cells appear to receive the values of the properties. Right-click on a cell to open the same popup menu as before, which will now show the possibility to delete and edit the character or property. Please note that once a character or a property is created, a right click on the related upper band (horizontal for properties, vertical for characters) will directly open the corresponding submenu. \subsection{Music} \label{sec:music} The Music module is a simple music player for background music or continuous sounds (such as rain or wind). Please note it is only possible to play one sound at a time. The module is in two parts: a tree similar to \interfaceitem{Plot} and \interfaceitem{History} to organize the music and the player itself, made up of: \begin{itemize} \item a scroll bar and a counter showing the position in the music file, \item a button to control the playback, \item a checkbox to toggle the loop playback option. \end{itemize} When there is no music playing, \interfaceitem{Play} is written on the button. Push it to play the selected file, and the button will turn to \interfaceitem{Pause}. Click once again to pause, and the button will turn to \interfaceitem{Resume}. \subsection{Sound effects} \label{sec:fx} The Sound effects module is an even simpler music player, designed to play very short sounds such as gunshot, scream, etc. Unlike the Music module, there is only a tree; to play a sound, just double-click on a sound item. A sound can be played while music is playing in the Music module. But if a sound is played before another one is finished, the second one will replace the first one. There is no way to stop a sound before its natural end. \section{Tools} \label{sec:tools} Like modules, tools are meant to help the GM during games, but unlike them, they are not used to store data. The two tools available in the current version are a dice simulator (see Section~\ref{sec:dice}) and a combat manager (see Section~\ref{sec:combat}). \subsection{Dice simulator} \label{sec:dice} The dice simulator is a tool allowing the user to simulate directly in the software the random result of virtual dice. You will have all you need if you forget your dice or if you want to roll more dice than you have. To use it, select this option in the \interfaceitem{Tools} menu. A window similar to figure~\ref{simulateur_des} will open. \begin{figure}[ht] \centerline{\includegraphics[width=0.4\textwidth]{dice_simulator}} \caption{Dice simulator} \label{simulateur_des} \end{figure} This window allow the user to choose among these elements: \begin{description} \item[Die type:]{The number of faces of each die. If you are unfamiliar with concepts in role-playing games, d$n$ is a die with $n$ faces.} \item[Number of dice:]{The number of dice you will roll, maximum 10.} \end{description} \subsection{Combat manager} \label{sec:combat} In all role-playing games, fights are quite hard to manage. Indeed, the GM has to remember the order each character plays in, count the hit points and wounds of each protagonist, etc. To help the GM in this sometimes-hard task, \GMA offers the combat manager. As with the dice simulator, clicking the appropriate option in the \interfaceitem{Tools} menu opens the combat manager. Its use is in two steps: the selection of the different protagonists and the fight itself. \subsubsection{Selection of participants} A window similar to Figure~\ref{gestion_combat_choix} appears. The list of protagonists on the left side is automatically generated from the \interfaceitem{Characters} module. You have to select each protagonist involved in the fight to add it to the right side by clicking on \interfaceitem{Add}. If you make a mistake, you can remove a protagonist by clicking on it on the right side and then on the \interfaceitem{Remove} button. \begin{figure}[ht] \centerline{\includegraphics[width=1\textwidth]{combat_preparation}} \caption{Combat manager: selection of protagonists} \label{gestion_combat_choix} \end{figure} The order of the actors on the right side is the order in which they will act. Use the \interfaceitem{Up} and \interfaceitem{Down} buttons to order the list, which can be changed at any time during the fight. When you are ready, click \interfaceitem{OK} to move to the next step. \subsubsection{Fight} Now appears the Combat manager itself, as shown in Figure~\ref{gestion_combat_fight}. \begin{figure}[ht] \centerline{\includegraphics[width=0.4\textwidth]{combat_fight}} \caption{Combat manager: fight} \label{gestion_combat_fight} \end{figure} Again, the list of the different protagonists and column notes appears. It can be useful to note the wounds, hit points, or anything else you want to keep in mind. To use it, double click on the cell or press \interfaceitem{F2} when selected. Every turn, the name of the current protagonist is displayed. The \interfaceitem{Note} cell of this character appears in yellow. When the protagonist has finished its move, click on \interfaceitem{Next} button to go to the next protagonist. In case one protagonist has to quit the fight (death, run away) it can be removed by clicking on \interfaceitem{Delete} after selecting it. If at some point a protagonist wants to delay its action or if you have made a mistake, it is possible to move by dragging and dropping to the right place. The next protagonist automatically becomes active. When the fight is over, click on \interfaceitem{Close}. \section{Conclusion}\label{conclusions} \GMA is software built by role-players for role-players. We encourage you to try it to see if it suits you. If for any reason you are not satisfied with it, please note that we do our best. In any case, feel free to participate in the enhancement of this software by: \begin{itemize} \item Using the software, giving us your feedback, and making bug reports; \item Making this software known; \item Proposing new functionality; \item Reading and helping to write the guide; \item Translating the software and the user guide; \item Maintaining the website \url{http://gmassistant.free.fr}; \item Joining the dev team. \end{itemize} Contact us at \url{gmassistant@free.fr}. If you have a Github account, you can also follow the project, inspect the code, and report bugs on the project page: \url{http://github.com/ViviCoder/GM-Assistant}. Finally, if you want to be up-to-date about what concerns GM-Assistant, you can subscribe to the RSS: http://gmassistant.free.fr/feed. \url{http://gmassistant.free.fr/feed}. \appendix \section{List of keyboard shortcuts} \label{sec:shortcuts} \subsection{Menus} \begin{description} \item[\interfaceitem{Ctrl+B}:]{Combat manager} \item[\interfaceitem{Ctrl+D}:]{Dice simulator} \item[\interfaceitem{Ctrl+M}:]{Metadata} \item[\interfaceitem{Ctrl+N}:]{New game} \item[\interfaceitem{Ctrl+O}:]{Load} \item[\interfaceitem{Ctrl+Q}:]{Quit} \item[\interfaceitem{Ctrl+R}:]{Reload} \item[\interfaceitem{Ctrl+S}:]{Save} \item[\interfaceitem{Ctrl+Shift+S}:]{Save as} \item[\interfaceitem{Ctrl+Z}:]{Undo} \item[\interfaceitem{Ctrl+Shift+Z}:]{Redo} \item[\interfaceitem{F1}:]{About} \item[\interfaceitem{F5}:]{Full} \item[\interfaceitem{F6}:]{Simple} \item[\interfaceitem{F7}:]{Music} \item[\interfaceitem{F8}:]{Creation} \item[\interfaceitem{F9}:]{No sound} \end{description} \subsection{Trees} \begin{description} \item[\interfaceitem{Space}:]{Play (music or sound effects) or Show (Picture)} \item[\interfaceitem{Ins}:]{Add} \item[\interfaceitem{Del}:]{Delete} \item[\interfaceitem{+}:]{Unfold} \item[\interfaceitem{-}:]{Fold} \item[\interfaceitem{F2}:]{Simple edition} \item[\interfaceitem{Ctrl+F2}:]{Complete edition} \item[\interfaceitem{Ctrl+F5}:]{State \interfaceitem{None}} \item[\interfaceitem{Ctrl+F6}:]{State \interfaceitem{In progress}} \item[\interfaceitem{Ctrl+F7}:]{State \interfaceitem{Failed}} \item[\interfaceitem{Ctrl+F8}:]{State \interfaceitem{Succeeded}} \end{description} \subsection{Table} \begin{description} \item[\interfaceitem{Ctrl+Ins}:]{Add a property} \item[\interfaceitem{Ctrl+Shift+Ins}:]{Add a character} \item[\interfaceitem{Del}:]{Delete a cell} \item[\interfaceitem{Ctrl+Del}:]{Delete a property} \item[\interfaceitem{Ctrl+Shift+Del}:]{Delete a character} \item[\interfaceitem{F2}:]{Edit a cell} \item[\interfaceitem{Ctrl+F2}:]{Edit a property} \item[\interfaceitem{Ctrl+Shift+F2}:]{Edit a character} \end{description} \end{document} GM-Assistant-1.2.3/doc/userguide/fr/000077500000000000000000000000001371475637000171545ustar00rootroot00000000000000GM-Assistant-1.2.3/doc/userguide/fr/images/000077500000000000000000000000001371475637000204215ustar00rootroot00000000000000GM-Assistant-1.2.3/doc/userguide/fr/images/add_item.png000066400000000000000000000533241371475637000227040ustar00rootroot00000000000000PNG  IHDR6Qd pHYs+tIME 2rLftEXtCommentCreated with GIMPW IDATxy|u?$4WMRZ*E<\]QDP.rz "ޫK[eAD\wVhm5@iBχ'y|&ZBƍ @+uVBHEVc P1nSQ"z3A$ASqcߛF m;h]?P.B<mݳ/ۣUc~W}'$ oMGCnjT.5m 8 7-Xըx.rqh/ƲP6m$߆2  DQI/Iulv,#HVߚY4Mc9AcPDn\_Ux$ m61k&uKESd/L]Y\_ly3 u ) BZo? >;}=[]ǰw<B{M3ZOf~hHWTR4Q4e(hdxeU!:q)t $B67˽!Vg^Ee5{6oܱ#4or3+6lkkj>~ KNye՗pClܑvMHy~\Ͽ۸#ҪՏ%v9{c|s΢{kߥKͩԮݸeòm<OV|>бA}lT- z{1pC}ȿ>Eʆ֪2'd!K70B?\g8G?ѥ1GDQ ]E^I^9?r !TZ^%ttkc.][AHd5DBhOZ%AP'jnjh1"j'guy%lE˾]{ de \Pc 4ڷBgy23!/>K/\c<(^wY R"<>FR5&n.iスup{=KNؘs/[;ƶڱ.O:ޖ}oC qSA (i&%jji DzZoI.+ 7 A 0g!T*EQ ]j4MӴTՔ۷HMM2dl ZCG8 476QD(" @D (QD(" p[5}Qev˯*DQ _g<!t(}n4n~9/߯F>{-@ߤZ,L4R*{1xϾ{/,*>xäJM囯}GQqq{3u"jK12~ܽ{>bCnk 3hc=z_ݽWI[~V]k.p:3sgK|u˖׌С},Yc\_=b՚~\h-/@}z:B(yTF3jBhozzYZpb"B(Oٽ{juF끈 )..))-2ZTX D\@ʶ4A:NгSKlvu@_ٵgO?yz򊊈pÜmj4=4^Ii)T;L!6uUWW̜ҫڙvoOKC <:u:)Iz)/xO|9cF_r ;VTVX]3ܰ+Au:]:H= c㡟!22r)#k瞞i7OO=JzjxHppwIutRRW^xd=rdC_HMM4hlZ ;b,  @DQ (" Dp nQE (tv %2LRZcD|62$ hSm!J[QnՇGhu:gMv{EDT*aQk4$Iڊ7^խ=]DQUAAPuS"oZ*J(hY?yWTzk.m'E~RԺ[QhH[{GЊ# (h=]cQcQ@+ VhEo]#BBdƢXƢcQi_`, ]4*r&mR݌wˆ#B|: HWu(˃Bnu Ri2[ﭮ ; MǵVTZepF(" D@D @DQD(" D@D @Dxh뿀m@kzSm@3ۋ}jq?:'͈t:n*¦[?;iD򘝻v^xߧ#f<8@k(l.^pş}/(r5߻SÆ!w_޶۬E?ټ˒&Rsԩ ږPKW ƈ"ެ^/8܅F=srFZ5czɤhfLG~i`P*)Z' h4  53_F$I3MJDQdF67~zeeI<"rozzFLMPB`X6pnf9??k׮n[Ň>#c}>I**'''6696˲~ڲK 83_}hia隊r"GlLLͪZۣܹs^^nh44M MӴFlV5>>9ϿK|"FC#!߱㎴]>,\s2bYr^^*lhanb铝}EQz}DDDDD^Ebdgg'&&؜_{ϾÇU8l=!^5SIcǿ;>QIݺty<%2"B*lhaniyQ٬hHDJo2S2a_γkم[s;žpb"тDc  թtj^.X>~Sc9vЮh/v_,fj. QĄQ%"1Ecd-.J;֪$.&`b8NǃRT&)..N{SgiHK~oY. ]zF:Nfy͖U/ jFB f%X}Çw=::ŜT*zw4($ 9kѳJE2^"FE `"ڠ՚B4 B ٜNdTTTJ=>FOvὝLX|I]cBƄPѕ8F (6ҿ5j49ZW 8pݻz}\F+36TKWV{ATe+k#tΝ-F477gϞ<7tKk rssuAi'VDhu]Ϛ;V@Jr2@G2 Z[~uj 8N62nF9h8/K=RO cV]AP.7}c~~`sHB6m2I#ܵ[*8nu'&j:mO qkI&hVPU[EQ.+p= Qr(b fDvꓝBݥ`ruO:xv/]E k-mYًjn ٶպj2ЂEKRxvt&ϗ.B-5^=T^Q9u[<qڈ. ´` É!Q*+0-##CB!ǔ +ϼT G/͔&NmκoС+=cT𧟏}pK3^xùFtiR>BEUTTFFD>e84A3ET0 # !I hFDp"ˋ!mlغ'*rA2Z*9/'^XT'BHP0V\R*峦Ҳ2(=2JJKFIJBΙe֯SSJH4Xl6+JQDEQT*V566ѪjL((vMLpYΞXS/nw8jNpWwfFz\V^^Tq|ǻ>nM]384A3Esyyyv]4- 4Mk4fZ 1fyQ db ^W_9#%$HݽtR_jV^p:]Kr⒒⒒k=گuܑ9V|P/Xg "r l]q>}?0hRӁ1v\b$&&X=Hg*e$' 7WPe8Jij?Y fjC* /,PR_bhRF%|zM7V*0v̺ _|P:alT꬙?[uАɣϱzӫs?),*jo6ph+ Sjj[|iyQ٬hHDO:@G7PHѣGBB2z|>_? DQ$rA~xԻw~ЊDisTiIJK|y͗gn?փahEr<|lO!LBŋ1*JpA./^PTFwD`ZJn >r"I/O8p\n>0KEjj7 4Z"ab8NǃRT&)..)+޻˷W#Jz +uq獊;&`L2Lc=^:CKJ^y㭥.9}m+V5;;o߾zݻwGB.GAARK2-];)"E$g<{zFm嚵/͘8 VkJJlFIB攔K.53D9a0FE Bg4H<?Bщz{>Լvǟlٺ ?(0YYYFfs*Aܽ{^ =+*Bc)E#1W*EGQ2*uq;7J\;u<?ٳtz "!!!77[gw~}oCX0lj$0b9deY% z^$;CoYq:} 1lj,+0"ˊz/^'z'a-㟝4"y]ߧ#f \.WuZ|#RY9O0 pܹs^^nh44MK?/?l%WXyt -܊bsqaF^zwceX,Kbbb&Jc32 "R3UA@o⸱݄cm˯ = cSWg\ي;vMI## s?v: ۵D8A`Djj}hv:G5Fye Cu }[@x"HɱS!/Rj*Hs?zhP,k4333򪪪B:.&&o߾ 4O5bE;DR*EA<" E^{*cD!0 Q/I* !6| IDAT\8ה[7 0**..7F!/r*Z|>lBc{+ ^W @jEEz R,\Pr7u×ƫ?x{= |͛D[ӴrҬmRo2pW=qbȒE* v-8aBӹOةN" @DQ (QD" 6;+a,<V!ˁe90P3DTz2_A1uHK台DU/~#۱j B(+ Y;aO6at:=BHRL7A?QB؟{e`U;Јw#jx"Z?՚ݷo^zXPPpݻGGGG}Eh$>H`a4.[>` QttSPP`ZSRRf3BH0!d6SRR.]do#|gx-QNA@"PI҂5B#ow -辡ۂ­(0YYYFfs*Aܽ{^/ݿ|T]fBy!Th*祅N_6]TTr+&ۂVܞ={<- HHH֭}ę…E'x \.WzN{_>pn'T*>yǪY`9q#wE!^CmZ]]}gZ'h){vn_邳(vtBhV38g0AST>qtt׏"5r\s "A$<"Q{[Vy:|K4NXXş"Çs5 <+M:%@ EUTTFFD>҈j4aryC!$IaV×{*…Fk#*|n꽡QUg(51!HHE'lfI | cp:.Ykh4uٲuשZvi%$4T@+lڵ;/I**'''66* %BH (^y?egr93Ҥ 2֛/D4M3 #s.+/w9b8hg;P!t,ڹs缼<ݮhh~zy^5fZ ^/>C #pv{aaG0,(H^Y.Fݯi%##"ҭ៏44}|ǎ;v|>pيoxǏgh4z1v\b$&&m`ׂQA DA OH2 E/xNCJ OJ_nڴeNt꬙?[uАɣ1O^Λo(44M;ΣGfF# yw\6-11`04:Q:iE!D$)jexq K!(feYјWUUt111}|"M|<A2^NjJ[2L) *?}i=@G:SJd=sRS|Ng~!:MxqE*Hb(#h4&VUphEz^T?Xvf-=nZ1b4H#]~BBɫ&]q1ҥz7KmE&o>>9iX2HVvOL&m@>D@D @DQD(" D@D @Da@D (QD(4V#`"ZIDQ uEmҴJbͪ c~rÚՓ^m0 I#_c| {w8#>dA'icv~TrWTT<`-ׅfӆ(ig+2X|EǸ훿z81qŪ5QиdKOg# L^:}vK~8~ZN5_i]PNsgb;GFAz`D9N)SKv "Ʀ$~0L&!,,4GG# B&Q*Üm ap:x] {5_]ŗeeeekPS_|YYUzat:=BHRL8Bj۷o^(B PPPpݻGGGÞ:V5%%l6#xy!d6SRR.]doМT(0YYYFAJfMA 8pz{h|o{=?9"x1㆏NyǕUURL5{ MNȨ<|c%4y)&Nz~dEK|>8A DP_xraw8(Rc\V^uΝ;I%~2aCmjW/7~%[xؔ=;/tskՓ}GͶ~竖/;~TݞYY}/xAشy :!3z^AǢ(6 n(BH,]s遂'?_RYZZVQQkw?Hsռ4)3f?wFB)ϿkӧN#4wD5 0r\ tBhƴi#$ieTVVڳw嚵!t!'gMK%uΜ-[~hgNPBBJJKKEL~zQaѤikp-QٜߵkW-É}{1>$IJۂ[!88xLqs/|zZv#nj;w1O\lYI^p:cڷGN9M H呑>?#-3ܹs^^nh44M MӴFlV5>>BUUo⤧>OR)¢%?/yV?'ڍ^G^tպuw|NgmؐK<Z F^/0.bX,DQ[p,jwΛKO_e_|4o~Xhhʨ_O ڛF&j3fR2YJ~Z*uşغcghHѿT>r0 1c0]ILE4~MNѣfYHC;].fKLL4 ,a[vpUAqFeYјWUUt111}'MGןR${葐࿌8?MhEzWmY͐C:)O @DQD(" D@D @D]r㤩(aYV`NWoDYanL&++++**bYVPDFF'N<,O@D(//y~{a&88XP0 SYYT*{@DgϞ%?7o^TTIUU2dPPЅ ~N:={} nkԨQ:vײ<++KP9rdٲe !Ava,/FDFܽ{=sٳgt:ʨ a" BzipiΝW_?K.KrA3h楠jHX Bf9%%ҥKv=1EEE6-&&n7#I$H!  $ 2FD 򣣣݋1շpOZ{D8ptKk\DZ,+333iƏ1n6I($IB 0 "I$)PM&ñk.rss|Ƿimڍ|GhKmܞ={J.mߥt(ee5()-# ]?~$Rrrrbcceٸ8 1I$I$AR]TThZn0 RasXTT[7,fi/;3_}hia隊rzӾ=Bp]U}XXz=awt;wg5 M,\s2zҒU][v]qIIqI50#1ӧOvvŋEQz^EŒݻ,;n8ZpEQ"Ƙ" +%1Ƣh+,RT{>p@]?|ZÆ ޳oBY3<4vo0vh:cYN;˯+11'M# "55uРA3hv:G5F ye C=:mڴBk|߹d͚5J<<<=ZD2zeIѣGBB2z|>_S.h4 ,xƞ>{.<$T""xVO?jEEEaaaהφ.@h?FEz{>zu͟??L_۽EAA4M_>((?|"## F$GQKJJrssB(JQM&ӻtR\\7v1.^XUUzGIӴ|AAAje٪'N 6,88.6O:.??(QYz>O߿wް_Df(XS2 1_ DwT0 #BCEQ B `c_yNQE) χhX,N T*dn.?WZQi0UIT( HY}Çw=::AF^+$JV.dxQF\;T*agh VkJJ IcBA攔t$W""b̲|4bs !EV)xY:BUk_24rͲ1Ʃ۶ۻK3xƈz<gC(r\Z3F-dydr^SJ "!7ڊĉ ݵgǽ=?А]{.% #>dދ/L{y/7~Y-[j%BӥKu}tV֢y5knڼe)pVѕ! 8,&nbl>ŬDUJIДy/#˫x%Rb}YQ&R5)ʬLF 2V~~=(hZVO~NI减1u^ׇ͘6_~xFAѼ0_GhFaF.7B$jMWlzQ)eJhXX@6,4:kۅ6Z,.q~iYxe*a诳hҴ5GpQٜߵkW]w=~{[VcI0P:N򑑑>DƎnΝvFiZ\ 4Mk4fZo"QϧRJeaQђ?o/JKJKV_>l%WXyt h F^/cr,bILLl ۫kLxH^ MѣRcV]7eƋL6bg2Ç;Mzf"mzZfiyQ٬h? cjT"A F>M`0̜*}zpT/RƼ^c]1" Di5BNjnJ2p8"{ @߇Q$1DA"ERJWd5a, cߊm;^4'9yvmK}(ၥ+Vz7| ¦[/KƢEYCfL2M͙g4h0(ʔQIj 00ʂh`F6{RhEoi%-snDxልwVeƢbYr^ﺾy.`C+p~W>n۠M^{m7q&{ gtl春:u>Gjc{Ԑ.:_I[c48utQ6~UZRCD%F5?SZ]]m77&mE*ri48" ˥jU!(^|)5Q*F14$ڦ#j4: &d|: %BDxh9 |Ӊ/ACZQfn%ϢuNnoddlTb!DcBē=FٿL&C<3Ӿfd|>a./\x0[z?όn7R(Be}v}ջ3gܼsnŋ\y[v ;H@nC#0 ֎oӾՔM=_x(}mJ]y\W>K1ƈa1(PdPę$μd4f8fh`ԁ 0%̌1*6h骺u? a6M%۷ϭ񝻞]Ft 5[ZDL?!qڗ_BhkoѣBhm~B4?e*RJCFcsȑ 2jh57cO^~mmm|Wu27YYO%LBń`1s;F^*MݳߘALHxlQv޽-YU']16tE <=,^P*Eꩶ5x nUB!vk}4 Bˢ񴭝Zj|g^Tl,/5]x~hs,by1c<%Ąys#" A0n0_`qIS(S&}QP8bp ]}{]_mUҢ&d˿pxxlv|33WK?xwU .{xY#6!c8qbc- 2ݶEɯM5X!yO1cz;ؖ;^{7e{Z0?o+˗ H۶X(LNr+W0!9NRJ ظ^+/+:~tmRD'Ȳ}h@)0R " Lyc@0Ɣ`10 X骫]^1zTNHwyE^oq#]9oA#G}=ڠ F3W//>ejA\?_߇aX߼s? 5s橢J, &NMjg_ +(0PVNѦCR*=j]xXJ˲* ô~ab?@9Fc◛L[. ߝ6}ţGcssڜ6?Z*ZTr<}-Ν&DA٫V) *ʮ]wo3?Ғ9I*P/C4>+N*zwAѭ!>6R02q '/i3J[(jrs"#81vhs͟N߲e`>z:!^̏oo^i nfaZ&?;qlΚެݳ\t%+0dn27\)W0!H23F倸~.xooUS*7W(˲*R_Sm{gx)={b툈VKLŏO{P3/ &W<--"W.e [5l";ᑉR1^0yM8yff˴9;>Y@Bl1aV[v:3gKWh,طN055!sfͲrɺ66jRnPmT0 ȸ;W{jGʃM~ϦX5G${֜k׿ܴN{{`Wbǎg@uƥ^jQro(5xp{㠋Ғ٠Tdޮ]&ލβɐȸRAX֤?[wrwݟ=%Z}s1bѭ F;=lꤊ~xS_uTw(uu|T\(SXXzۢOZAZ3DK 3 B<a!l5ﻡ܊.#c#ر'R?#sc\Xֳ`iZB Y74@dX*ĉ>II#:ȵEE~٤R_"8<ؚ=-k[EqQ^ @, Q^Fs:>F>ݗ5 ,2tJ_jtشCw6nyς偁ru=RQ^,.%*]EBwSJ N] ѵ%|;sr`Ri;i?6hz1\NGu:s?ZmO%'w]9݇Ō`"`DH.]h#J7mR>`4FƍZD֥9hgYXVsL6^z_'E%Z@ۻw;ܨRP`*+㫪 #RDRRHx8t3;g.ʴ{&"~[<ӅdIwIU*ͦfR=%hZYyZ,JJt.']TWxUnK.˱uu Ru˻[rl>4$T%t9AAjq%M!doBZ׭~bHRk}}li{4]N(B(,4_D?˝)v1`[!D[VitQ`Y]a!ٗhp_H J ArQ $ A$H\TE%H  J ArQ $X$"$Hx8}+%hIENDB`GM-Assistant-1.2.3/doc/userguide/fr/images/gestion_combat_fight.png000066400000000000000000000262661371475637000253210ustar00rootroot00000000000000PNG  IHDR#i pHYs+tIME $tEXtCommentCreated with GIMPW IDATxwXoB $UAbD{YWް(RQPQv-EUD?l6B@ drrsν3KrӧO999UUU\. TUU{E"555?600R`&h=555o߾-**3f2&MRRR ! Ĭݻ@|2`aaahhH".hׯ_@ۡT]]Mx|>m# a60)|B L߫EJӄQPP  BVޟL6٭v~E_d@o`G_O|eQI)IAAMEYGm\Z#N/][J/P,vxYy2ƣFɤ{p3U $@ |?-M$I$HDx<Ӟuuu sl6S.D0xl6K,W(,QTMtG u壠@$&|>fDv&kҤ::  7 L? 8lC>Hq;, W1KhTl.gp~f8`"O}&7xpNZaq N9y !vZדKJ{vsu\طgBn !j? w")(4YI7K#NyiZcyy8b&CfF -q)(R) ̞l4F/qRRV]*3S߫kk{Ѯ/Ocn3fLl4[VjL4~'WñK#ϧP(D"QQQ;!a}{{{N3Lؕ]^g޾ܰbi|̍`$!8;|>?)ޙ+? 4qp`xdr=2m/?$]|>3so~b3?tZ|ӄH8w-?y&$;r:PYIoߎ{<>}*M{U.|}2_]}=*x'mYA]=o&NA')B K;i!y*JJfL.خM" C ܹa5B[[[$%Bl8l B(9sI ?W."`eCOB&O51B.K"i"lJ JO­;vj*T y6CRPq`lsˆ? rrt^`D8Z!SnRdzqIiIY9_0aM/,Fܺ?%۵f^pD̦=Db_Km34R Y,2SUVBJVSQC/]_&~SUS %YEY ALӄ((*F45s4su`f_VnAaUMjUM-BAI8{䮣 YW,p_/ab&5WHh"iEŬr6 !D&1&b(TI]V}8M66ݳ{\ҊJ RZQ)x6!tJTyEeMm퓗wv=!;w?F)RX*BZYYxiqXB&޾%֝>M}++*߯w/쀙&hǥvԯy\DiS"=m-3LMys)㨏 3O4!&nݡОk>y[)175PKc9dn w{Z.8v4+:pKKΤ7 3]0\n}}=~BYCC6q@P3{; !,:LpS.*ݡjhh 5>K(Mk L&XPxnC"|qv)ld갚`w|X)HLL|JNGbb" i> iJP4JP( @ii,4CIէ!In샖Q..j}qܾq=l+++;u6ًJLӾ'ڮ8ipƵ7;p2 خsNׯKܿ6n> GN_W"nުo4ni,]VD_+fn]O|ՙA9?kij._8!fBhDed2;wW"Jy޽zI /_r#6[ٴ{I k: "*O.{1۩555l_ᛒ"WRn^MHghkϛc1gl.}5./?|1x!Àd2y`=~ d['PYiM2#ءqܐaWoNz{ݺ:t"QG?Dd91+;<"?g>f(o?{k9ˡtP,=rDAaѹS~/^81σsRJ:H߷oЉ&&~'%))^~zz=?=1"\V>坔r bÙf U}@i!b9;jHlzrUL5UՕ+{?r+k)(YrcuXbݴ+] m5+S_ZTTT\`c)>IéʲK<4wt:N3TVU!Uuug ugQ1tZ_߮.[ G> PYYy.8dI-/T6w5y9onAA{Ҁ>yzD䥋!:K_!MK׆G;ܾMEEj=N zwfl mܼp8Y=7y؁G>`+Iglj*]ꔕ |OS&~rdVc=wFL\e+BC omUY3̹<^l|.=w7OD壢|>$hiiZΞllbǐKXX*tI]wԹ/l#yHIIOc>XRZZPXx:0pQn ͎G4+wcd^lNݖV64-W8;ADžJP@BYB{Iˡ|~럸|)))U`D@{(+Ib!4W,4@6=> > *=z2gi?_CIm0!ZhG6gQ1[&JodtѸݻ7nuTLldLl^~.ikcp HgWDF}e0lmmm1Wɓ3?lCFm&JJܻqDE>e4vLJb¸1czyGD=?G_$O2q%vxji7;9]JS۶|*]ѱWB9.ut@3DF#\/SUU]MQd2Y # N?JNiɓLZZ:s6+;[0{#FCh4P~AL~;8cS!՗kWH$GeƦ=y i@tl{ &2utr>f0utggżw`|MN|9< Ʌ4#ܹ@iPZWi0#ȭ74A z o !a ;KrԾ_+>zv uu5cWihh@Pi83l޺mu3ͧ˼rB>-,ʒE#՝>s.f5Es_مSNΖ_O>cT~-++ý8cMxs!V6w?P[[ۢr+*̘UQY)2mJQ93t9Fo{x##e%%ֆk|hsMsױ?'cɉIWu Sk|mxD%Fs8gϵh uiS&E0&&g/^\:,A GsO>8?t ͕cǖ`bD؅FRTUU5n+>z乱q ~{njj׭M{WPMOp11;\n8G;;9oٴݲqcٴ :4m[4i'_wXhG$6|v]abi{קoݻӧM}tusz);v=g@\is--4556uN pG|ّTU+&O KOyǻ^k`̹sӧM -,/?a|>Ǐx2zN3"&x={ױں:%%<#554_>zAϬl66Rn4vLuuuDTe(vI 3|HglTZZqѮ߶{87mmEwӰÜ.vrqB;D"a_sssWt5NL:-4|4|Zi|ivԧ5~ j2iR?TVUꆇwyF@D{PM>'e>(ȹO3A>#"O;pH[;S't)|ڌa#{ .C $b%]o 3U4Jgq`  iա8mZh}YzŠ<~aUuuKq[wY_g>?Çu65r޼}k~ 3U4wuuTmVivo=xh\))qwSSS5:!)'Ow]o> r, }*7W55UccǬl 3UtJn)5~Z]S-6i0"<4g+*OM"HHo޾8Xbaa`تK E0l3i4ܠl2XQEP li&m0::󭭂"jjk=~OiJd"8-0}TĪ>m}۷Y%%l6Ǐqc6{j}CS-LUHNfiz6zTUQ;PZRft[k+=G֮iKKWL2Χ%ejPz!2n)&>Mikq|ɉd|ZF#<|q( d4Ni=OOO:}vna_|ψ 1L>VY^ @ >#k͈ ЙQB(q f|O@i]Ci|PJk#JҺOs)!u= z:RpG[YvUUUw H;[1?U2?|rڛ7Fc[NE0Ӷz(//:W"fO XKC n,Zh~ȣݻ1<h[o_B/%$VUUM2u&%%%>s"m잿xyz*BHKSlTSalJiMNpgG!AɧGD<}_Bl49}zSKB7yhC}|?C<UJkJ(z1X[[uQCظm?ܽ[7u5֦޽_OJ޲iٲiSzۻcf6}NVUU֔. -?yť?otSo_IGg=u/_!W~}aìIJI钏J3/\hqYl6;Çm;ӏ(,**,*:.oJJ8\S Fvijhdeg7[JkJ§p X'FOO$6o577W__JW,}1o$i"O4>u+<3߳ tkee6)"֔.Ohbd<Mx]+"Z3Usl߽孓%Gz ¶Zkf 4H=-z?y쐋97xnJcx,?D( |J4i() !,{#|x@XC4iP45PZ{DJҺO $IDAT#J%qE(4yltaz[T;.:# Ϸ_$R|;^ jr@gRZaQђ.T*[ё \bi<7h+>8|ukMR544&noxs!V6w?P[[ps2fNݹ^r! xib|>c6l1o6q tҚAzY-=K0g/^\:,A-=]fcǩ'@=}b$S|BBgf6atPHJKtLA%EZ0-62EmSH\sk..q\/e͍䔶!Ymᚚ'-UaBmNi!ٳΝKy}f#׸),*j]\i&\v{{)J]]"Bb颖AiWav4L_`ǞVRd] 6M/: F5߼A()n.+Hήw1ҐA.\ ߫a$ʧ!,~b gM?SPXXPXx{t#On3ϻYWRZj8 $,w_:zN9-q=,]0eiBlNM +4k9_r{C/DVk#i4x1JOP4> ɡ}( :L3H@itɧhChK( @iJ4JP4( P( @i( @iJ%HG ^{m4ssfWG( P@Y~YZVp.$V>Ħ/F|> /?F d0 DH̬̆#Gity#?efe7 X%CˏA~7BHWG "ATZiY董55SQ :\ 2ho^X`(iz9\.F*ȡAD`( | am, "l'Wv[ Haip td|>ɕ HgGv2c֝<O|>8FD=DQ(rdS(ÆΛcih` Ԥ2@Μt)ZJdkv &t=YJ44QC: =::/_~yv"AtV% 2!8o\kWֱ ҚqZKM&"삊 BH]]}D,ٖ'Gf-c;QUUVVV.ss>PV^z .;rĈhcg_JTtiYY}6[ۻW/ٖi,BepXҤAk gW\dӉ.+H$t71WYY=2&ѽիs#"e㆞=z`M LyfѸ5n+g++HqAm^َ$}˜@ p\^ >lɌokvaanMxk7ג'*++=i9k֥t:|p~֓gϏ:uOFxxPJb|Jb<ܷ7I'nߵÇ슺tqO?afxW^8r`hr1leef25lH4|EesNo50( )8GYZ$Hp8|>\OJcO 6B&+++99.z9~Z: J7MR3tvwYA4ۊܕ$8 kV2Tuu6~;,)j7W g{6 "-װ~svv|>?󗘸ǎ ?tMg{N4Mx.\1 !D$444d2A0vj: 3S*a5N?k AY WjKٶ㍸X$a۵=rg.NNnX&2J"Jʄk1RDQ|5.X lYEY~(Ea6Ž7@ћMЦC{N\eb -y ۮ!Rx<^K};=xPZZp / <կ_ںG>o0bxMMm$EEž{cuuuJJT Tg m|"]` %\ .fY` &ͦ m47; t$$JmVv{?zrن--ц#7[ed@@TLͼ<3?̱pvvz,My[V]]nsҵzİL0okmlz.i1sGvs_(5(y ۮ{$7{ܳF !?@QWo^2k0>*B.o.CIIIi8 Õ;r4y4H!7hcHԮ˗:e>&):hY:~hùG"pܖa%~XRϏk2+Q] Yo))X~}$ɤ6 "cQԚ**'$55؍&QRRC())A$4Jekij)RuueL=kWM M1HYyYn DJ1u\7??E-]]]f7yϓym*%Ad46ݳ{~}I>ҩ uuubF mw1 urFNLϓCl9( @iJ4@iJ !6{wg A[IENDB`GM-Assistant-1.2.3/doc/userguide/fr/images/gestionnaire_combat_prep.png000066400000000000000000000464111371475637000261770ustar00rootroot00000000000000PNG  IHDR=“ pHYs+tIME 7l^tEXtCommentCreated with GIMPW IDATxwT;˲RkFcc``آ4Jang Uic6,}~;se;3RdYaW^~:;;eYP%陚V^],Q9992붶M41000@U&lؘJOO|rǎ0:T*չsZn-z򥳳3R%5<==b1 7kkrrr0QNN81q'(h!&`n [sK0 K$ !DRUe'an (J,K?U:}ًW ḡ$.BRV (o[rd{8[&362Y>oV"]qs¹.ynXܲ>rD@ųyk0u[qo>c7̫}yg&'TTOOO,S%˝T GD"zJB DoQ?ҠPia-q摧osnyz B$bHDɳ%xڇB, Wy8 `a6Бײl t'/jUQTM"g'OݭsvRLOO1g&$Hۖaƒy,Ny Ӥ6=:VhP(6üCOOKwqr>K5+ףNML~o/ӣۜ4QO$޵ӷiv~C9y:-#3|߆<;eשݯ{_.>(ܬEF}apFD{ z9m<ހիХs._}#XI/_ִaEsf劐CGmjTs":C塽?/vqryT..uWFzyLOSHr7a:jpԴLkΟ:?<޾Muڍ֭Usɜ[:t"&!)(ۜ#òzt{YĩRCQtɣ4_y;{)G8Hm#bζiV׫}(?z2i1X8Prƭ_ԨxN >(R.=~gy|Ǎ]5+;嫁}gͿ| !zU߂bQgB|H !ra\.W?-EBHnD>:BN]pb=&MHBF7240623Ы۬ј^&FFF> !1gbHx2X,DTzu>W*H4j}.m%ܸ{_X%l^Ɔ&FF8,m<[TwYc@Zf_w9P7M&$&'P]8>)9Tx4B0Y?’TB1qFԴ܅LGx7RB--VEf򴓘7uĀ~gL$ru|WŽ}HWebce)Բ( %1DBӴQ6Wwʏ'Z[Y&^R]^&$ .fkc>5=֚;aN%οIVVI2iLNXkOھ~)"g~(6kmɽvmw=󃭕%!$5=RF3W~\D޾#4mʳk'B3?d_j]B Ǖe4B2s7عM+BHX!/inV:xTT䊠E!4W*!&**{}=BvT}!zzzDOOOR}'^- k\T*VƄW~-:%O@}YB8ɑ'A)XA$TTo薧XAy^E!eY,ղeNꥁ[YӵZR{ !޽rl<:j)dϫw }qNhU< [(*,>|l^QF [7w,[дTl B$AàPɲ%-w>sK`n @-h%m0 - [@l %dKȖ-%dKȖ- [@TB]{zv?@ʼn,Cubq0ޮkNb N7\llյkh@%ΖY$"ğ-wD? f˰Æ62ْFLML @:qFvvX,QT SQ2BCLLL|W/)nkX[[YMK9xh |G411ޣ ejbҾm[Bțoj!]]%{.ׯ ˅-7:a.,-=}ӶN\A;rIs34cF051iղ!E9)Բj%[BʢG⒓ !V++KBHrrJ|Gڲci3D"QڵƎnڸ* Q %KКNݬօnakcCNGͳOqգ'OCw?CV08:8pTLqDbog7fA> lcc- ] 55w-Ϟ=LݳJyRvNNpܵ~^jlִ)!Ў%lݱ3\~̀ Kږ;ӷ"xWhԣ(e !&&*{WBȶAi驩i(\A.CE˂ Zii[v̽V+yysO7ªYӿ}敫:::x ۃ?~"ook },-,GD;𫯼JZmӻ)w+ Qh̼9oܲu ɓ{cUsvymHTPٲ%|LAѲt8PD_jN~/Z-<4};sy_&*իq'Tm Wh$&&~^gh~m-bXA;TJ]:vXqq:Yͷ0, @yGJG l %dKȖ-Tuuʘ .TYYE(BPѳ%BȐ!C0P5a*D!@2#qU;[rkf@dK9[ʽksw޻[y~D!(=YsfN{7~EQʖN]qcVſR^=o~'t0/##CK{ό<Krysr/ڣׇZvkz=kmK>BPs~Y,poߴh^8gާ#OFJ7mQݾvE~bfܼkNG""KDDvp773;wBvܺzTl)`3 hf```jj:e+׮i{$"*f|7\lbZ:hÇY%,{h<{ -" D!(ݝ `--,ݚ6Q/|MPeegg>{!)9@"qkdO12PQ䔔1~vvB}G _󛣃CvN[#[ё۶pԚ5jXXXkf㺵-nu5ws[lJeW_߾ycl6~tJa z{<yN* ܴE]+_8}b/qؘ۶]-g8۫j-hu$"*f|7\lz3=-nu-_kW֡G7dggΟ3h䰡< mtʄW]S_8o^5gg##ad 8;; O~ KG-YZZ&&%Uwu 'b-%$&z _f'/˝{Z3117ߏ/B᧟ׯMXkcc#<044TO>=|xƍO!++O | k,U=[jꛨcǧNqD"Q(BIMMU/wt߰nc*EiyZPuPUVOٷ ]tiVvv'ꨔё ~㎝8qqJCVK3Uz{r;hqq4M?{<`괔s7qsRyMM7^EP%$$.^=:T:[rtpٱ}Ν|njjִɮۄYlYPHxQX>[$f͝:i:-euВ+JֶMo*?0sX`kk3rsc)@Ayxxy111C BՔAQ*>q [@PRb |z Ua*vT9-T::o);;;8t I[&}|Zh?T<'$%$&*;FƎR{}J[ٙC7o**fQ4wBG{s֭AȖJIJIJMKm԰MԴ<&89TջVRjvL[ l Q38:ʖn߹{x)!Ҳ[.ݺtQ=thpԴ/~p޼:kB^~a󖛷n3,۲Es--- !nZϛ}螰Wj?̝۠]II_◅ jT9wP5ldanR X[ԫ[?a$ȶMmM |kB<\6b8~$uT7~%dȘ?L'f$f 4 }󖚻-ZJ2ګׯo߼16do]]u_0TtȣvRi-._SݧΘ{ύƜl߶W@ye66,U˲66(o0z_''aȶ.#<:މ˚ۻz#S B[qR>UQ|5._[nx ܐ^;l'GG##Æ>zDX'E37SS)_vM]~y՜ #-$nONPf) vo%,hd.MJAu<{Ŭ4>8nL KizOEGGLLL&My˸н{|`>8XJMn~9R3'ަi 9JvDž)BjHɫ}ϊKiz}BiFQTZ5>g~K,X;v%fYܻٝRV(7q?S 6HdDx>m?O%)S5sӄmdNV!ʠL7G^R^ʤwE!M|ܹԴ4aiSƍW+&&&FFF -/nP~{uEGR5+|&'|ڿћ)s=װ5ףj: !|02߾!C USZZZ4: IDATWڭS7\^vR1`i͇7љ3߶;PԆ=VÛ?6+(#1Uܫ+޴0GdLXpn' 2 QcCש/fj`RunqBt02J.dKԹ{ϪvyM4[H)N]cmLeT$-n؟s2-32%#'lZ?x[^xı.=zYiKыd9ރ(Tm"{xؗGM^ 9}vjGCJq+I)#qQyAJ={v́sSfUrŨ|_&ߡ-5]nE%BB2FNlOA(')oD w.;3iɢGCJ"aE?۷$}ϯ~z6dgYD!LMM?\fߔ5XQd#B}%ozJG(E()};뽣-'Yݻw?`YiӧN07/z,ҮLN]T|ޡR먊$%=Ⱦ7cH]ӯRA+TRE+URŪT89RJ]vQ1,ͪZEs 0 C,!3{yZ>~g/={:vEfyvĽ~aBʵk6T~1ё ُpD\dӶ!{{WX[k8^A*-iBZd2ZeԠ}%"zFHyΥ wTpuk--Zb߸3g04kϞ]!ӧN)z,ҮN9Q&T5%IYNLĄ SP +hiJ`YeYc9eeyḼPIHL|Y!۵{YbRڟ$?[[[[I~X}2MMMƎxz$q6Um֪5> L<\e_N'%2,ͱ,רҦn]#ҔGy~ԫokẍݾ]BGsKe2[cb inݦ~'q AP)斄=! ׅ㉒VT9 NI3JT1'TJ*ahU>YZXbXaFpe􉓙j:;zzgj';;[ȳ'%'N>+Eh'BjjKW&5l`@O]g*_uc65d *SfzGm)zzT*^АCwRU2;;" }=[Nz-z8&g1?E'g&Qjƃ%3TP$>ɐgiFdT4R*bh)B4T K Q1,*ceexREe>{|-vv’Ĥ2D"Wk+WBH|B\"W( uyroT觅.D%-Or䔔1~vvB}GP1y7mݖ9JLxY}233˛~ƥ[~ |޾{~Y336o} Svm۴kFx֪u !SBB#;vh?wL###iٷ?9%:>8˹B?$?>MZ3a(Oz/nXfv2:N67iwTf?jm4)zP( $䠐P"Ƣsn_S;6GM(fBȠΖ{_Qp]fMq1e`W!_Tרw !d˅Më篻dW3I윭$i̕o SME4vn"ž KyaTJpuB+Y<ljѼYXVc}\..-Q/.,۳oo-{٣Gч>)`o{Hx#QkVpvr"nȱ3r:y:nҥB]c LTfv M8J.Ixd=a8`dՍ:\yG\/}S̻.1,6kڴYӦ=z7 znL^6LZxؠLj*Ed@3?G_^J;@疊-,i9ah.)5zEA_'N`iiT5wT V?q+VRQwU3d&UmxjԧZ>M >rǚ;:` rS˲ 8[J΢x'䖚8XNSB- yJUm#9dl-R&lngR$"5kxWWIi)RQ[wf_"NYZ8O>5/>q&kT O{׭Rĸ;L<0,bWeDGnʻ#'B8D7Q=Z>KV UA-eKeN9}Aҷ*oӣ!RIU:gnu[lY7h?<i(JJep%1U3@bPբU`T)323խW}! PBep%];K KC*; "#3DJp*n&%(P*%h@ +K+ʪGG+K+e@,sK:²VU q 4P% 8˖^ڰy۷eruj1kNx *;(P7~'7nА|?+>T|:[ںc#~~J V-[*<~[n޺Ͱl̵]㸠Јϝ5HX{},zw5;}}IucΜÇ)JV>tOXrJKymЮĤ/~5W'&O VgMnϾ))W[ aPJ:[53@oSё'#I)~bfUn+|W^o<($7{wtբY-\|es Ouww:cV?7[s}۶KrݤS#-sΝР^2׮"nTl)#3S*ո*|OhfnS&rZG"lwSƪW͞9N*J1S?~Pn̙Ei[(X8o^5gg##ad 8;; O~Ph}30( HIyGo?!OOHL4.Wj/R99%%))2.Պf P`kk#<044$jj{RnTle1gώ52 }Ǯ\4+;{<7[蘿wjլ)9%%9%e=kKwu֮+JEUz{rŹNf*XZX+ hne [n R(u3jpaO?_~ڌ6\ںc#qp7l`ղ*Mv]zzvnZ:rW?V; _~={Nu6+`^FF}{6ZiGUurޭgȞ@n?/^"˵o$ [_7ws׸jg/^gWgςvW]~}捱1'|+/3@oSё'#Iߺs'4hǭ"($7{wtUoou0(tْRU'bbfϜnoggog7{bԫϙhdd4rGOh_'E37SS)_vM]~R[B'ܼr3IF  {g''s3M=[@"M7))JIy_YxR-9%EFx`hhT*/ڷ5w^]sS=02o7&&fȐ!_0 AY@dKȖ- [@l %dKȖ%dKȖ- [@ct\Ve^jOQB% [БԴF XTAHMK}cBB% [БĄF Y[T*;ֻ}dKB( [\fcmT* ,kcmSE Uƀ<<Dp- Dp-`R%]y)%Dp-.Pan%DJp8*Q;aQ*QN7?l @;:E=ˣY*Kޠ#$䇨O}(U:2'_ 'ce5h8:ݧ ]{z ׫7IK'=q<G*EމTo@O?4gkƞZ쾾oŹ=(/%On~e(K &ږkjX&I&W&|:5W*$~-T(4,̚u`hڑiI>/G9-[cm1W1 X=n|ZzKV\rE8Ȗ*^ݝUR!wS(BȍiJ%*1,'1,bYeiS14{;ϙ1c9M5J.OyT8'bF!;*xn,UHLIL:e=qPDQmCa2!5-rss3CF,[z蠁616Α m| kIDAT x>SZ5y[ *ƗUAӽ:-qʴi3vQ<dPǫ999ǎҒ-Cc"& Pa.aG E14EhE R3hsC3?@x`fjU'6eҎ]WfeeկׄZXbErrKj[*Paaae'2dޚP5_xfM)*>8j޴yyw(BeRߏ'Ļ4Ex-$_l 8111[^nApuJlMlvo;Y;5 ݻO׷w{r'7oyٳ:uB[*efbڷٍnw}İc{:s˸BnVT-qgac8xur\]ш!#Gwջ -TlX;wt{INn߽>=KV[觅M5˲[*ـD;dzq={D;^NU˖ܻEf7|PO,]?ڵjR<ߡm'O&$&:qTj``0_ߧϟ\81'O𷷳3117f+W&©K|'b-WR޿wt6d)ߛ;:qºff |\߉;vDf>s-99vH᱅РJR7^Բysmt|ly+R⥺uJKuҥYvG" EbR҆[i7oi~j50ZV~]89:.]{ٷUzYm"8~ӈrl΄."B>@EcAXPK‡ݴ ݺhD\g2 ̿7i 0>-J[U?duuK6$b+ -0!#5i 0yٔ7!P(4/݌RYe`C,\HK)Wgc;rڄzVtQP'-ۜ_\HKҹNt FE;q$INSC6Rzsl8 ]s;LEuvEѠZ3򦦌@$NgPv@Z Qe3$>q%i @Z -HK%!F҉߃gIENDB`GM-Assistant-1.2.3/doc/userguide/fr/images/scenario_complet.png000066400000000000000000001736101371475637000244650ustar00rootroot00000000000000PNG  IHDRZ pHYs+tIME ; 6TtEXtCommentCreated with GIMPW IDATxwXG@tDLbj 0X+bhE"EQcI4bt)wk6+~㳷7;mٝۙ]և\nUUՇ233KJJ\.hhrrrmڴi۶-Ñcedd=yD__{-Z@5W?ӧ2Ç:tj6,cu׉kjjٓ^૥SvII nWNIIry<r\.ZƂCXhp' ܉h!娊&PE_sVlŪ6܉iɱlڝxJUBHEE+!Œ.d!UUUUUU2go̴9Uu i{*6gIfCy􏠨9<sE]5DFىŝXɱX'b?fs8+.[YYrDŽBąQTTbnѢ{s8_N \.ZOp8,xj^\f+tI[q P yH\B&P]"sKK員hٹy6FtAnފ!YjAj$Ѵ@sSRZFQVRX ʞ6ifԫm<үoµ#,U /^9|`Ib~~zx$o_2؁'߼K4qȰt0TsIQX,Z]]q` 9ڰ,IZVˌqyGzY" f/^jVN! z& y+^rO$ʀی2suuƎbޗQߺ:N>1㧨^Pܾs11#+G_Wg(+ KX.qdȒ${g.y 8MX`M-KJ~Zŭ\ /x-ۼ^៹Wwbq'@rw{B۽$XEER:Wn݉do3\U7n%ՉZ]%%%:pii)Ŋr2j IT=91^>ubNS 񧮪Dt΋KJs-oH<3etsʇ<w8b'PR*LĜyS7ĥ$)?_tPDZGNFx?cYE7nGlg3/8f6npc|CDYz߾LIݼ^UYhU\vӕw<p $. Y䐸voHx䱘 ](~zn˭,\y0D&lCF$Χ"B f̴9?`:?uOWY ICM?aާ56C۷52Y*pQI dY?tv C_Ul6qq+ya !?g\n?BJ݁dNH"T> B96{PBȅ7̓$OKX%#,!dmD[%% .v!gufSc(pU0׃{)b7NIⴉ2Ԓ`2dIC1ʊ*JJ3'wOWNcX+ ma HKzN^~OZtNuS.;~;,io­.ǻtdz6gm1/ȥ&"8ujml6CS}Ӯ z$ CIy:mQI >'/?2)niJR{ 63ݓmiφrs !\.WUYWmw2r!WקgfFK4[B2ssDWfE㯊jM9Y-K9mM j[-›Wa|d>Y,96ETr?5l%E'$g޳G+W9xjezñV*M?%%" =BtQV,B _GϞGD ٿ"~=?0#]weug1  ym{UvFݿ7!(hAE"n=B¨B>+++SkU\BryyyS" %Q8%4cΌD~4nOyʪ3J$\jc@8fKI\B^LSyk hm1tħ’-ClQJJ+BO&>Lde2M8</ҕY+l5ѳ?%qdRGO}zry3g-_k3bo`%zԈ @*.k= e%] !ܪ*泓R)]zX6668*(oz~"}f9"-))SPPޘgj #//@ҤChтZ^^NΥ9GxBE%!3̵*Pv*5J$P'/y.~/2"LTZ[m n0Щsr8p!o*ǟ[ /.0nT^^ڪzϪTL,IrTScΩhSo62ߵCdH' ŝXY &n+q_{YYYI9VząP!s@? #qu.Ip%ݯYdqCVVV̘1G"rwHu ̰TXː%IꭾmFocx$2aq"C@<?vmkp꯹AfF}Ptlf9ݻt:N,,j}ZWTPP]CЯ)5*~5~' t_kK @: U@;hN,4 @;N,:N+;'gl-tbv~̝+[Q֍iT{dI2߈ (͡Љs֮1G3 :dsG/mߩ *@(kp>Sí?yeJjjn]$5zlOX~Ûiz(H+دV#lxy\O9k7ޖbQ닋9rca햹B^[j^Fͫ"Exقs !kKeek9rrvQӃuk !C t>M^^ `'?~ءRڶI:vͥ+W=xطw/:K"VUUGxd=]{t8ӧUUUݻ/ZR]*WoMBE.n&ȑGO78~آȕ˖;v O}NSCcäQVV#w,n]@-eN3g?{{ְCUU#3ǑQߧ߷:'GE}ޯߤDFzm"WlcC3zt̹s^;q޾5<$(''9{ncGCCtBBG2ub5Æ>1& mdgODyϿbGHr,5܉paѼjgθqveN+IgY0w]N:,]jIW7WTT8˗5󇌌?A !C gddJąsj:w+suڵS?r\יZZ^TPͿF[[SAA ;77OzKw,Ғe8qVfִYsu7P-VԲa+)f`oKI-hsyyMӧQcm51Od\%w`ᗯ^Bl6]L}j.o5uu677\[qhXd9U;BܱToG8G'VOOoۦ>ܢE BH^~~XG[CFF6m!2rhkimAFb(//OHDWNFF|%.N\WG' gn޾a***&9lژ!#ڽ&$MHtJݘj{tqZw^>Ǐw,n]@-e8Q{}MJ;t:~*,##w_xAsrssrsPWW dd 4tww~ 曫oHEE)+++**ffeٻ?x(77/77@jlƞ;uL^~~^~gb9;:0 v mˎoVUUBXlV]qR"YĎcf~ټ%##h'j>GаpfNkE'O0u|9g8 9L[dYQqhC-ZL4k6Ϟsq,8ztŰj78޶leeeŃ.vŹ>وWOI K_tbXtbXtbЉtbЉ@'Љ@'X@'Xk1b5*dÑII?W+Tգ[[7X,x7Ő!&p8hZ >IL\$M uݕ^PP0w+]'a}qd6[/?{?sNɽ+p|ѧ?ddjeo7amyb7VUEe񄐘xq04MEEEGG[bu-~A@p2d@ //ĵ`ն rvthۦpaw%hD 2'VG[B=@ޅ22!VNm8uWZz:v$l@?-GͿ>+3A dee4p(h;ԱtݺQcw9;M śrQW/+$,իI.[Zfeg bq\brrs<J57'OQIKOQWG'?#!DOOW\ MVoRR?|}gTxꚸjJu)%Ė;3237oXԴf|шĶTWnVَ#_PP)** t53+ivv}zF`ἹS&-f}yoDNIrZlӺu&ڳﻸ8; ai׶moXYZp#p&ΒF}:Ov`ފ a7v9&n}E#I"zqQ/_DŽݻ-שcG:LJj>zTRZM.CȐijs)kbsF`w%%onuNzg?s?CoBBz&pp_ >J  K}.Hx&}8ݳz'FZ 翙rOF^vi.?'O67oZZYح{Mk7nH{#"ѝo]<5?wVg޽w?2А2<{$BN,[g_зO'=yܬO{wswѰWW.[pl6[¯wjN]Oڱk+o^KZ)))M⯿X⮫C-'$x,YdIj} KRM:\KԖU7O\6RQQbȠa G=^pA֭554, svpu55 π6"54jzԲ.4:BYY1~}I3' MͿkf݃,lOWTTD}#[BFXZEZz@wϞxe';';?/@Uʨ=M[h`w%}&feFjj^NJlݪUFFJJJ']ȐF%IN "UV6zǝPw#apOÔ~DUy=ukA! W/%lXR={}#e= O:0JrW{BGyvBq4SUUUS8Kui>z}PF˖oRRڷk'wްn !du5Ii5痵k!]:w;萗ˇ^o3zN=YL(DQQQ;u,WMJؑ#k~㹛r"::G'O-Ͽٳ\\gg޽[7?d62k[{,Yܜş>~~?jOa;ɞȿ@ljJ\ QIHUz,Lkc#z, öwmvN]i+''WC%s%%" BHaQ2z5 /Ť_7NrvN"Ѳ%G5\<7Ne##Úg!*wĵ՞PdFͣȳ'Jm;p9)iE╤n]40З Hp'.l>pO{ײ qN:Kv.۵sr2c3PgLs1228Ŭo:o%'9kނ~}S&w̹Nh厸% MءŋR^^)'cŕo%//u(.}IO;W./]a E+׮5nLxڳ/ /.6*T[ ¼OKo20l˟ i0DttLL޽t/{i;KwY !Ԝ 7Eߺ?߷W/ۄZCT5(wBWyvBsuK 왓"@:w˗s*++OSp?|oتа -~ڷ`;n0 oЪu_yCMes&.-+SQQQRR!cEB`ki7))/_Zv̵!mT9 퓕3jTRtͅ锖o曋+I lv*++}&&v,W#GXb^_Uֿ|MJʆM[, aPR5cFSG=rSѮ3QΞ9G*sUeCT̬̬,0lŝP;RҞPh}G8o=VƨvVY3;yre?gy/'O w3Ə -xoo7a2Æ ٛm6m!\rUm޸ ˚{||VY=e夫yFQ?M`YKWJOOoӦͼٳd iI0>z9Nq2UmgLs=щ8Ov{>~囶m  rD;G\)oέ[@gWҿucXJFffGC45?nlZzTBcPaĭ!55UOOuK #%A۵msp^}Bwﻗ:Bڴn`@ppYo4I 0D:e:!r00lŝP;2Tȗf<;K{Bh?i^{d86IJ"##j1Ƅ&P+^3XR^^]AAFW&&&yyyui܂C?yw' _8EK}g-M}Z&MsRMꛖj-Kkiiָ%$$pgByĚ=MMS5 MiGHN:hMvy"}f[3R4! 6Qp<hp'+/EϝXtbZD ;(ES֦a#Gs_9ek H4~Vnh>N_G}nj߃\oϚ>}@?sr㖭;tpv#wT !!M{Ν媮F|>N8ñ'Uz͛{9&ZCP k0捽@)h۸Q՜^kjch\?XG[{Ѽfa>--poOVUUvmQKu :p?s(**Rr=}:'771C0$S\$“!dm?[[GE ;s(p ;q{nq88;'ZyXTJjꁽ>~ȱ(:~:h޽}n#_>G-:}g۷UVVG>}+1s0$!@'غ`=׽[ ***3Na '\J\8waVj+I Y0g夫t +**No˗]h\}5U93g޸yjZ|2D4<ѳGy|fk8;'Ȱ`w:/ld*'7JKSZhѢr33\\gJLd" @25mԃT<.*Љm"D>Xv8Ove*kXWW'-5!#m6:ڒEOOo_ OV|0DSHN,47K!eee*ʊYY{< >dd?@:x>9999~$ynjwoRR6mQ`6hbL/_nmyT'!.{'N,4/T!dہCnݮ9q댳@% }<|TYUէwu+WhhhD\.784LLlQQAW,]$f.^7̉(u55j姂SUQYn"~IYTTڀHNN677oJ [㖐ЌWVVşN80tum{v=XBk'Np!tu}GwnӝȨ>YYYy TITW:$YzM#1‚5,Xh~Q'vWoܘꊽluneTDX-ZPUU]0g;wDn}&feFjj^NJaN㤉O"TUU:}ޞ9f%::sg49 gxnz]' lnhaڣ;?}D[ ?ddN 1<ڶؾ夤Wu@9fb܈tbkNW='xs?o496-,_qA?D\vݬwnݢZXT4dǠU>o/VjGInajG177c8147x!pӧOoZ)//YXX4q3u㢶ex#ԡA?k[c5ee***JJJ>dl޶Ѳ囔[M[IIxʵeHݼo';m- '.,,Z!G 1 3v䘱>C;LZYYY@qVP}@} nmm>}jx쨱pYٞ>;xmٸGgϝv~f(..V.:գ{?45XVGG{dIW`Ӧ:*,,ZE{ l6kUmڴ7{p~Җ;}k$SQQqX$!dW̹1֣U={VXVڳBHff>?}=cţϜ{~daBǪ5Fƌ \D){^VVv p|'s1I]lx{GBSVY7~XzVEE> ~YFsf3>3 {e% !W[Y'rV i)#s5DMTfȐ;Ap]mF8{#G OM}FQDPWD8˗C -D$߽x/)|s;vR+CR߾:q8vr2xƍ3\|)hX7Cbz^?tĨ~Nt .K166ڴ6&8]ZV:ir $!7ߛP]LL^y]w]<OgU#dR]lldh޷dGM 0{}g1ge-a,nU5+99{|*iS6ytU"7XXOW}3gE'$ޥGXds\g frmmmBȔɎ!aʸw裸Xd/M';';?/@U8HgEOoRWӗ-vXxæ-_ׯ{Á?|abme]/SSٮ"RaTUKSagv{W=W#4N,}{{.iJHAQNM[#-#&AcA^i֧R/nLMlz4MsWet(+;^:X$ C` !?Ӂvn 9x(ǒͱ❞{l'O]y.&qn}{>s O=g֌imZ^| !;= - B(B.G6eADjÉ:cl VrC!ǍliaR:|hxCؾ۳:Uಕ_ъv>ruhz=CҴ{8Nq18xX1_fWTem9zwPL9zl䘱=3$$I>=zSg|NSAbBqdW@W&փ¹NDGN ;ɏ<k7<%5UȰ#ѝۉ6oSB#!aG"] >-^R_C{=0եÿ{Fw;_tۆ[ánK}\辔cҜ ܉meㆫ.şSSSӫ&,6KA^Mؑ-ZL0{>ݻ?ŋ;CjbbvmFhvXڸ1c@-GFE=x蠟oL`⦨x%|srƐ4M49o4yt$DΩHCϜD9;jC*b(IP@qn޺} #E IDAT_4u?o ز}g- x 0 +;+Φnz9Nqdldo/<ާuhߞwBYYcS5匊C4jZǻy;y歗b?sިyϏ$ɀT'xiΎ\.784LLlQQAW,]$`] >l󧬬oع\lm7m&%W+׮Ë֥s#i&=jl&%Ed⦜1$M9-M9obȀlS)..:qRYIJ^LռiҪɑ rrsugDZ,I߾SYY I `::99|qy\Ь4;fX,P-MM+{ l6kUmڴ7{5EҒzM۶ikiLqvԋiS]\g 71eDG'<&MЮ=-utBay>޵lUh?i^{M] V[j^ڴtiH r%pgO:Ľa1=wlf/L̞; !N>sBH!F,43H++Z1!!5̞`{6DPs/y;7_:Imܞ>}޾{W^7=R훍{[yßu |=񢂂!|;ׯRoS 惆?Nf?}S8q!o߽=|I}Ӿm@rryx(E+l[BBB9路i' - 6ސ.&?yJwb}Z, ߾{ߩc I `>xJ39ݾk} li`񒛷"˗7̻a\d9|t  H{[Ma3zN=ii}  ._I8`@srB;2Ξ:b_/OVʞ>7bSOT]}{#CB{S߾mۦ ::M.++9w^iiiJqRR[4N,&:5&@@H Ρ>hП(0XIjs|s?/ ncb=]]=]e_I|BǒzzzzK_H!Z)))M⯿q/PISՉT3~KKKUUUe5U;N HCC##30FL!#v=D.Gi7G(+;[&9t6IF[[ZPTT߄V]IIHCCRXTC9.JtbDIiIBTU [)+Ȱ/ZϬo̹VAALQQK}ݜii^ եÿ{V+ޱC?^^Sŋ;Pfsb :d03H&I8y=RZ?Jۃ!qy.^7))?.(,q]:w;YZZyNzG=}=}FFeHF Htһ5?#lGPhVNlQQio,qW0`[*]tbA+C,Xjڣ+oڶ-84L[Keӵ7OB6ӫJ+K.SEmQ6cn/Ny*,ݹL?nlZzTBcPߟJhԒyPfieeU1&$$1Bx㧏 &nkw5X?Ǐf9u}ZZߞ<2mۢT๳\OFSAwGwX/;'!4 jVoQ &&&yyyuXRBh߀cQR?}?sF&PFWt[lmv,찎ΡWO=J?GG̟3[[[9 ~]@2gq֭A 8DԬT =z̛JB^zUXTDzjIrqMlءcЉ@'޼md_֬RQQ)..;^dT\TOOo_ަPsMoguwj^.@'&_Txeee*ʊYY{ R]wnj<,)ZѾYgcTE]%lBJETT*Zc?EeT~qޭU}?ss9s_s ;QU]QxB#"mơ~'L.cw%ZLTiMm5''8D>{8`izw Ve$dΡZ ^~oDEn%[_\ۀgH%&λ"t tٗeeVɎqkk뎅uޜ`tY899Bxyy).1pu7wB*"TqIiOo \xyyBҲΎɩMMb]jjb~Y3gR/Dz8BҲ6{v'UUQv̌;O>w7o!T߻YRZˉ}$J3Brobbb21%٫1{Y1u*BhԴ ` 465mܹn a'?=wh`XA,\a`hKJ9ɓ.ҽDEf9|殧sJK'OϏ [>;;w#CCr \>,JMOKIMHK=J=SRp!t6.ؗee u|ll*͈MHNKIJ/( $%$hF*v͞5gܪl/w&.~oW'"&DtUǚ$ђl3j|׫ =}ݻ Rf^|쨨Bn>S6]?lq@N 08 svUߢA=wlmk[6 xMmٳ ~~|xlCH_]S;6?~$X oh)!A"&^KICaHLr1 &N Cdi--===uu'N\x1"o Y<(4)(4L]Ml5e CBTzUЁ!~ӏ?$$%'%Gx0dW^NqNlO~)08hE-cXN C0ocV'?է~ܱo9nG[V-rn7[nSL^[ɓrk,Y&tGf˗Y-gϚebnabn1ẇm梢zF&F+W ;ϞASkֿ/o<.od]Q{_G]8~bJjGGGm]'hix]Q]V^~sPfɌh:,X7,򤂲j(,-*.YYcfR<絬f===Cn^]FIu+׮}F}.M[?=.ys^+!pЈH=(*@#GM-ˤ/#$/dekK=Ǚm51jB,,,vvTђ% 301e0f` %>{v-qrrJ.]wHlBMM/J: .uuuwZ ,>^%yʃE !'׃bb7 vsq=|!%!y*"iBeUӾݻ}jt-6eF}𤋮%?ŒDIk_J.!=2!9%dԾ֔3 $ ?^Z% 7ƞA7͝p&m022⿯QKZXݸg=%hn\]]#B!XU H]۶"qF}Ç,BA\LK3/9٤OjdHx0Y$])&*e65,2,\+b32;:;yD\LLeݫV9qqqeF}^M Tn_PeÓ_OB7QMZ:+W+?믫YYf;,+*+)epmǸ#>zAݼy̵u<{-ϳuu:(;;~OEEEO=xEEDﻝGsmVgZr2IVVVNNνvz(7 x#7VP@;\<0;;/p)uaMZZ=\ɖD6+; Tl)L 滑ޅ^Poooƥ&?;l|T5ksKLӄ!K۞;g?ϟcϞ?;5SRYYYutB555+VB{~7L8y0"j"=,KA~3_|"yf7`ccC͘eWW׀ũ,=Ʀ&1QQlX?:=7,2ŋaRfnhl$MMr, &6.L,7*ҲxD [E:Nǀmr \}̙sgϹnݭ H9="6ceeEtOvs5ǂBG:=kLPӺښxĔԔXN=;<k 'm#CBVqF}؉ײn\!",ՙZ찶daaVBSG`Dh-G篩3{6Bv::aC\mmkTH VU=6?zUu? ~ :/ͬkeVhZ?R:)ew#3gT֭KMKs6ɠV0$c/HHmF3.Xp|Yx˻R@@@UYKԨ323Gikhhlڄxm-,$8zBzeu-614]-f02A,]^MĔN6={ IDATE~&/*"pܛGi9zUаƦƦ$͛z#dlڠ~,(ckkՔU646646 dӎd!J]p|54# 0u5Uyhi`;Ht fZN2+W]L>u?=y]Qt{JkGQZ#@yZ|Ih:ڴ?qq.+300=_%&hlބ׀Ii9܁=\{7`DG/ĸ[S[-&*NNlMm5/Q VDښ1q6SZ{dQZofgdĴAQ::rНo;yL;;;wX谴؆%ZZG[ vl3׏!/_%ݹc;( {>E%xUk ȃwHeuL߱2h2A/&\ᖛ;1rsqK.@td 0ё^ԏrsrƂXDF@XqA  {HcءM;a0`ra!޾%Lok ޾ג`;03 ”Z|65!mzɢ d!'L>2ݻw0oooڠy6J}yak`&\#!t<58Y>bWb7(ʪ*<[#@DLTg2101;{5Ch6sQQQ=##Ss+ʪ<[' !7łI bcc314 ;m51JP%}XXXd%Kff7g'7gabmB0L>p%QZ.者)C'n_ Ӊn8⿍~oCI`(}tb0tbY=0 x1kdu:fO?PWF8Kb'7<pL\wZ ;{bBWƆ*}8LlUu4^^Cu5U*.7is2eb5`VV gc89s]1Q#O߹']MӱqX:i^S[{6>_Oz{{%,͍ݻ܅޿7gٳf"z{{R޺ր v!RooZEVLLLXSOBh6fffҦ/oLϼ֍15U]Mvv)ӪkkDE X?K~\Vv>azv"ϝohh<u!t,8J_|ٳꀓcOwwlbҙxخc<<3/GGӠ#\\\I)4WQt ѠԴ F TTVFCO3'y!'2c SپPOcv O=A &yĂodzz "vر BLiniỳ=ۓo ]vX^?Nkww]-)S^r(ayw`;)!d²̔0=ӧMCikK%޼.",`];i~~;LJ ߀A];y9ASپPOcv .Ao'##CD !XCCN%鑔z.1%kﮝ+/^fa!!l[TDxqb$fy{^@@0CsK /_Ɯ++/omkC12~}<5"XYY>ƶ޾%l* &jf~< ~;ASپPOcv `@}}}SLq$Ja\_OEǃC/&SB|3f)!{f iknIHNQϼ|fn3OS !.zS_O#Gzthoo3w~~ں7j0o˘__zm< [;zeqP'7!%~ 4V}4};։ Aa'{zz^WTo*ʪ^7wUu5z(y92Z.)S͝KwB斨1T1u*ccn]xTԛֶ_LKBxgOF(Qěq*ۦo#OEUT7BFfggg}}C  B=B8И XhWbe3#1Qm[U22^~%ݜDC=}vmw26Џ>c)LLzZSƖL "OEoe=IcG=G;g|L>MO[eibd8K.Ysޞ5 xSOoR\Oݷ78Djڅiz:F J}qhA,`HMMUUUsss`dW_{~f*bUeBҽd jKrss ޸|--̇2tvu} cᖛ Ӊ-546F>#7?DJ,l`:1ܽ߶g) -.1vޝFVɥK tuWH-AlX0iil2~COoa.1CXPDpP[{{qIILl7EbmڗG`ꩮ`4>z|3'''Bh/7=R\bRsKO?:oPeUUDԩҞR="$e]S$8W'74>fΤ^ىp ĂIX.)w'OH@O888,,_HLI91cƆ_}߰/!J C(N6?\ \% [Ll܄ihD͞|sf;ږ>zL=wMW2.-opY|ǰ0@KOS%$^.DZZlЃl*Y7"{n޾S[Ww%S/Mq'9ĒҲcݰȓ *ʪ'зdf5JJײn = vX^qsK FF}^t⾾Kv6)ӶK&G[:vff7"V-Χ 8ǷJVNjznaa.fλ3#$Gz%UW<,JMG9ܼXps__ )SLLCRR[81y7OpJ B...]ݬr2'6ϝolj*)O2M=Ӹ">~7̼p#6!kmmm .XL6PwwwPhX[LLL&F6ٲC#^UT̘>}DJJٝzWUEf?333i?ww̽y !n=,Fߥd ϵԗ Oj2"k! tuRKֵ7Aeu6.AsR?llh0##m#d*G#>zAy:Ō ]օt]%%ƞ))O%7k2/_!JMU+5-4:2jfzOOO3XJb+Rc tJe}|o3{SQ?l &Ƨ$UVV&$ٸWcc_'cd`>מR_hi3 vZ=cs.7z _B=,..*.C]031utt]LZ&IaLmm?Ϟ(#ԔydoG%BH_BFFoo/B7ePEEDﻝ%%N(+;V_P@ޞ B&_vMZZ=\vP6+;ln: `ǽKZמR_hi3m, ?룿u+<vv6^^^Pk[TJ)쫗Hb.$8#\HIZJ ۓϝ?tT^F}ϟ?_˺qR6]0ZfY?2000'z12OMJMKjl% V[z:!~ZlOTvO? =熃a=+'#~~><[Uu aA塥/O5tiYp@x%!*XYsf9󹳿]31%U_G!TSS#Bj 4ްk^@;ܼh"x HfS٧G,QGKp늊 WU kljjlj )u|5TnFra6B0(4L]Ml5e CB)CCK_hi3ƹi#h,M`?9>Gl#'óUww oCJJX#Orss= 0tLHJ^~n<=5ɬB} UVߨ10$sw7r,A6!= -iyEe寰kTԔ7&$6rɯ>,D: b767}Y3ޖG5} ' ! %h 7ޖߞ00ʃ޽{# 0Aa9žf9ޖG5}7N+`+ ”4=B'.XA,nBϓ @ Jih'&W5? O324YL-L-ΞCiiھ\TTT\z kl㐛GEkkak[aqk[oHt`:/<`iqNJYˌKzwP===qIɤRΧU֞:O,BCH.]':eƴ|||g<*W.V~=;GIQJO;24֍'XA,[^{89wynwN35!{vZ0o.abɈ%eeanfZT\2 8hmr^Poo:k޳k {{b)jhh4܉$\YXHTYAa'xx]O|eٸrl/##㐛G}$fI}Eyp?\gOa&I􉅅 {{˻w@_!AA*u͘~B͛AEWQsv^%9+G{{7 m- )򙗯=`͔BeLh.A:`'z/&O>q޼  !'I3psWUW/7oP ;QU]Q"JkOFǼmn~}zPe1+<޼tvvrLL!4o@%%?}|;ۼsGf06N`DWbm ;va/N~ z۱)[6302zofNc;vĤU1NKY/~ 8r:ڎv6Q>}/yr5Sx}dÐ:5檩FD}}=qt*ilc---ڒ\CCC8#onffN ]\Xb ĂX0,ҲA_? Lp%L6`iӦF~O,1#)-[Z?Jnihldea\@Ww| b 0<.‚'ۋKJbb p P___lB]BAa7o111q7qrr"*+))+)/bcc)e8G\A,\ K?!`̎~ lXA,Kϼhgr>m!Gt:냇eV_9u7`Dh0Q?MmٳB5+a``;g <'E Ӊ$CӉrqq>Ӊ?J5&$%[aZ@`Pww7;0$TY}_։Mר)oLHN!oVTV?1^>|(B ~]Q_Ѐ(Oz Zf;,_VBi$eɖDCA)MZ:+W+?믫YY**+Ƒ$#*#rdVb2O:ZZ~^WTtwwp׫565565-ki--===uu'N\x1uEŀG'ؗ.3 vX^qsK ߯ߢ)*.YYcfR<ϵf===ۃ {Yv%Ս\>*^VRһq b':!]m -^(51>-%*6!K<_ur|lr|˲*5>gPz-Dj9nmeBȼU22԰-;`J{!Аly9CƑhap0n(9^[M۷K\Av ֮۵w)S}]̶[Z X?RRoȺt!MTDӋp/6}y,8`,!,"ˋi๜XQYUeA}} gb @ 65PݸJMMmQ@MMZ]]]]]]kUb!IO, .+IKި,+)Ir&-ªz+*[4tҭ;nGmJobVKeii3a/])~J1tJ#P ig_Ĝ%oe 0 Ǐʪ0H&Z(jIFa כt"+? }}}MH$[[~~>-uLN8*^>QSJI/(u>RSS޿WS3/C{ DӇ3 (=ÀanΎD`f̘m=~@dT}JSiFc;B0twwg^`| }%R${bbb32;:;hTZ5N1Q-[uFE%bb*7u^-Ύs׳I.һ :CAϟeݸ~)@m]' Kgg'477S`@Mm-ӫktJu!1I@xvYyNk|נL #s*#@MѶjxPL }}Xb=}ڴh,?೵1N~B55Μ.*);=w7%>v9007ua)a6~_)%}r$zZm&!.~<8XPȀbaf^`a_kYYX ;;iӦOdow9Ш3%$fϚEwN 3u5/dd \Q]o{JJX\DLT K0=ksvl3)IBI@DE%K:"8Dmp2#sglGBJA >;$8Au%!abha/{- 3' jjjWH\!UU]MXüyg)<(KL275w!55UUUuk544{=k 'ϟ?6]%#m,XۥF||ؠ-!.>AQRQY}+XYYὁ{S'",2{Z577'ՅR/RV^ng_J|BHn^PXD䅔d<[AA sL cA!grvC]vv?Bxp++AhT!t/l\<>zC/H@ngQ𡡞.;,<^L8ttV"f\`*3Ee 7!/'wݳrr2^5ooRpA/JUeeK s,}˦ou z{W˭rF[lBV{7n{A 2a0|wSVZK}!=C_Wg<4Oy? +d>PVZKtZIdbb:@sD@,wA @FG޻q  o<{/HSZzzEe%iʪ*'W5*j}fIϼACKZ^leY+*űd#i v&Q;Y ms3ߗu1\\n.>1"hg}:)Ӊ <˛zcOQ*N%?B[8M>0X WKJJ-[v* QzZr2IVVVNNνvRIDX';a0`r{b7KbbDwZ[Yx1a/^ck+B5_uuu Xl~P۷||34J,lJ,4Oկd\,ο[!GSA867>qꔛ4Kz:ZsWWW\RѠC>^$fbhv"8,:!qu CCCC<%itbAtkĀL͘B5gWrb{<!,3/mn%cr00ߟr>-;U2w!l}&Fba6N`q5&`xv9tdƍiɉ㻞wdhȭױxvv,KzwP===qI_s̆7 A,L'X/ݼ):sfϡ^%*&fҥ²b5mϮ3fL^UVN Bh׎{l-wP\V^~2 (`|@;t kО˻l;-B/^9WV^ֆ]LL -w/dG8͛3(`|{b |`#Gzthoo3 RN}ݻ'OzxGxd bƖcT66gc)e殪'J߼A=(>]"55<\]g^ʸr%a鳧0ZAA$oQUS[-&*NNlMm5'' :D>{8`izw'POwC[{;ѵ\-7n3JZ6* Bh.';o\܃W'-3g tb/#ʪS%=+{p%,x굶6Ey{vvvlWBRrR^UeD ˽yѩIjb_\S$8W'74>f$IiY765aS|$X)Z6 ĂIfb\-+ǯ(vE|3_ikk ?/FQYaQ1kBIiY쏲FO_>ìydL=U6nJJ=70q=,*VSV!]OG'ڕ+O"ʐV\Z~53'|Wâʪ؄Dc+Rc hs-ܻv5}vywFf 8F}|ѣ3%o96 ĎC>g`` Jg``'{Ç'Ŵ*1qNs*%!Xp}[<>} I|dw%'J-deeܻkg~a!QW8:psqw;ʹNvY9ge`yis-x~YTT{3Cv||iӉd4QJRO/}f5NNN4^^e%%e%%lٹ<,* xUQ1c暛7SAAJwFiʊlo9z/qsqoy<' -nNqI--?뼹sk3[H>|RJ K!;AMVTTt׳EFx񿏭!FF+"o DE q1Ʀ&<b9bf`lll3>>T#$(8̆ \ >iߑ<c!>>۷߽}쩨3 6nukd^d^EeBK1Qy٫dd=G3[λsHxp " _HT[+޺EvwMW2.-K7{Z|Cr~~B?x:G'eeGں1n{[;0M*ȯQ_Ccfk+Kk+W+SRzyXc1qgbymWȐӧM^ΆQhȬ3Ξs;/Oeݺ[-!!ADuBˠ&`\Oqˠ`ܒ?q*tllgg׏?331vyt  s97v: .uuuwZV,_ndjӣlanFzCBL=(*NRvn.~G&$Θ>?T{m5jmmæ`È]MJI1_~lƔs<#8jhh<4AryScǗtvvFÿ x[jr//PBrAoc⻷Xz0wlG[[- &JOAGxu,&[6e1p @?uR\7ʀPٻeF^^{gOwիV->ֶFElUm ƭٳf!M!Yu122D_̶P9( 3ۗ/9f&$5R |gr9 gbt]--Z314414pF<#dPuu ~\z`E̛;g<'Ow}*;jPeaS"nMM0 ~/{k' s\J{n޾S[Ww%r JC\=<_~`҂lmdVhooO>}`JfRX:1oWJ_lK}OH.L!$&&{bŌ̎gST\kep+XNV&)%-!9 W֋q`b\᭩&]e:V-Χ 8ǷJVNjcQ(/xMY}#QB@PL .Y|:2|wL)~!j-GQmnq1!'{[oC!_OꚚSgDxB ~^%%GaGBc/oCBkmmBv,w>?s{5xȽ?$RSSUUUG\C^\cDzd׃?{?p Vk*j݈u/q޸ {#*Yj[](llG4?HB@@񹜜{9禟OHժfu?ĴlorrJ>}/xP4>-~EZ:5-ԫW/))D{R 4A|zq6J~'555k7n޶U1ӹ~ h;p|OxqE-[HI+r11 A;qՓw70n\_.Qro5B nb|551ulظǏSb+(_v{&,ĩ5>tZBTZ}A+‹)tq9_ |3DZ"=]=w׬\!'ֹ7w{mcKPv~<ɓ P >er6}ʤP =D"ݴm{Fž>h޷{Y\۴yۦ yr9=}%˜;tG{&'$'?:\,xlxs vW&;?__֬QC ۷i3__Ko6nмj^ܑ-[=ossV-[ϳ6%M7VVx'g1v` 8H^r*۶vᢈkkkgQW[0ﺮz / IDAT[8;\,x%-_ffʩ_/]r^7ذ~=`bKHbP)$$&ZZX?k_PPnnq^^3߷ٓ?pjmWcġ-G,-+e@ աK< GCGRC*PBb /y>4o<JAcG:yQAxׄm]bM(>8>!҂-!I,]Ξ7?wyŭ;v~'C/FE$Û5m;YOyW޾ÑC7._YU?Rݻ~i{bA ANRSa>k%---MWWytn܅ ^M022244|*f M<֭Z1%ĢrwbKSULW11SR5TU磺~`T*kjdj>RP~ih"rԪY󛮮lt~CdTD" |Ɋmlݱ311)11i뎝۶ٴm{|BB|Bm۷m#+ܱƭ[_$lپ#v322T100[aidTT~ڊJFVSU>+#"#srrAi#|,ĢLlzuf٣HKkᒥbbx ܼm1cutz~6pn&  +߷OzfTY~ov[wny}nM:=%55TmE(6U+ZMUuZ:9-\,6.fs-GX`blQ,wܹO- _f{8}!nn q1^_m\P^X,vssc(}߾l%\%$@'' b1gbӖ;uǮVe 볂d &JW\)_SEŕ+W*{$8،4%["iټ簡LJZnn6ʃ$8٣wJ vIl1;Q*@ ;I,@ <-ޱBy+mXH-->ݽwg3 Frssg̞OM+M'w3ϕp~+g4$$c[4vjug6l͛tfL,rfO{ lDd:us޼yK߾mmrbI.]&'j9\)JǢ8׮4ԣy]{>vdk9vsvf_ڷ{豮={7ovQaO8d@vFggDYx``0έ/C[:9-_J}̹{?ڸe۷yw߻/"2*$h`+W!!7nھy㉣% |Hb'$ȯW\Q`zz𾀐{iPv:J+R lNiظvMMJ?~w7]ԴcvG /9z.LMLԴ?J-^~<$p_Ǝx]zU^{T+KtYiSdT8681{ MMLNx…;_.tbB KK' VV3N9zțSy5 Kd;{O'(VGM'vЀ9#BNNΑc,hn N|B$[[sؠC  6d@)3Z5>>AK 5/YXX 233՗?xkĶ.[|9>ȗTS#.>^W11 B8v+'bQpOF̪*y` KUՐb/,5ļٳ,1jب͛?Z_Umji5'?Uu_Щcs?_hPK[[-v ˺U>;l_{ڔNNTs(U[ (e_5m">ws/YYYS Q/j2c䔔v:_DTSJɨr;[M~rR1p91*j؉clmN;"<7._W{-_t== rbb4ʖ#PrBUM&z|mo͜o)~|ÑC7._\]zM 8 8{ACB T`jO\cO|W|)-]^ ȖkM\ (e^#GPЁqqY<3WRgNŭ^s'm"=#ի+|ޱZ]\:_O^޷w%}Ÿ?{tc)͛7]zRl-99ewKuܾ]eoҽg=߼%y$I溹= ?yJv\u@P3ev$QFFƣo:'N='~]; ?}A/_.9fU?^ȫ)Mٜ=uW-Z?~tX>W}rp*~qa[.aB~ΙYx,Zi)KZա9d@1YƎog_r?zG>ptv=ݸeKvFر;Vcp{{ h+y~}۴n5}֜w`Q3Fm;wKo}vv??q ֮;kl׮U]i ut~ͦtk""#'%vqzuX(A3eys^$88;5o~`^jOKK4}֜/_֬YshZ_5i2hD"qqv&+;k+07.?E9|QS_;bǚu~ XxQ;b 8w ?x}]9 (^?gEr==ӧΜ>5?UjԪ'W?UUS0;wܙ޲?-hii /#:Y~/_M[{"/.9,;9}owWM0-]>m`I]qwuqdwA(1rDR-b777f #==6vdeÇe _QHNe KJJ*ў/7oenN4mz..\ 9PLׯ{O?u֜]؉Y_j=uqtXh8 -#3b1gbl߼!r'+^/nwiS& >--]iS-Y&w Gxmۯ߼h2A$Zp~B-KžY)AxM˗au~$:P,TB2;$8֮8wr1u*ߵؿ ͚6 =q\ {z=bx5͜=wLAV>hѺYOx!pɲSӦu\(GTEÃ('Ng#ϙذO=+HUSe]IәS&&&_5i־`}}} ŋ_5mUȨwHK'[n]- QWGQșׯ_3Tzzz5xgO4kw'!T{gǏbXի{ߺab޻/(8(_vڍ ԬP̙`G5^DG]ܡGk6Ȯg^ίu%ԁbjjQR/ fDȩyM*^*ώ,j^ܑ /M4929%aVVMYD"IJ,†ڷmE.Σ<=Ib*&ܜ[>yr uXpr[ _l$¯.9whXRG[[qHbAˉ)~n=$9ob"ƌ9fȒ@?UB7esC 97 J/P,rgrrrڳWN ׬svm:l ׿f忿 }ž=sVž=IKO+Rw<zTB %&&sg͜hD"QVcG w x,<0?0IX,-w+ePˉ_uplYR4EWu|gE86l(Ա9gjfM=DVÛ5m"S4^GǦo۹k1J:qJ{{A?FrF,^f ӦM9+դxr)gbSRk+HTáFJJrUy6y' ص}۶KCO=m̬M۶AΑ}kwSZqq KkAY!.>,--wǙXĖQ3Xwio_]GGǬjն^GtRi=<{z_FF֝;^&ukаgΊմ`ia1i7o @.] _U\Pե]<}fа]z8uzg>庺K_bejlml"^͇,_DG˖#^X[Y_s}l;IlѠ~6 3+P+9vϻ|}V߳["(+Y;x[G7ٵӶ%A߼vϱ_5mqSȣuV.\PRڵwmwmt˷k ΝV[n]N|uVv1$$ -~{LUsfppذyK~܇ؾkwjj&[9}cmmmLnjۥ)mĤ7oX[[oP*11iӶ5* S&100ߧ0uh""#:_߄7ȱkgc#+Q=<=+;REtIU v;~MYY՚5m:w MիGw%K_::DVieqq5kԘ]2qCff6WаK7qT턊<-XrsT.`blQ,wܹx{U߃566ng_ŰJٜߔT#P41117/W5m쨧'[W^RRRD,G>{g+r劓Sy 0r77X\>V1RGm$HN V6m[335tuuF)(9]{SӦ1@zzybw}&\rJ% EIe_uLBf9wR(&{b$X+[ڶ޻߳߀b٢捔}8墷I,"77w;ml2OZ$m<9~bܛ1erpjj.;@p&8|Xמn;l䨰d幹tէˢӕ{ozmu~O7@YH9suuyFzЁ]lR5Ivv5:I IDATuvv70H^(إkN}fgg+^Vvu~ήݜ]Y痕-{B۱y ق:j&YU]1hGm} 5O lANQB5HbQWcġ-\%+  qO=,HإtK_޺qvi.oqhV̹{?ڸe|oujIO yzz𾀐{)=O? +{쭫e J먙dUݞxifߩ`-)JWTZfI, aLvvCzg̰^d꤉/\P9s 6oL{??x icG}}}cc c._*_{T+KK[Ԥ'CzObmeecm=m\Qֵ1uгJwF,6Z3gQSG$궶N|B$[[swX` v٭-PiqOIVo3++KK뿄B```)[~{RjG7o~o4ekc#_VEMz`o/[Yá6[>.>^i7XM:JgFU׭g.ӦtrRsU T+*-T[ [$?<L);[M~ٽ{fϛ?zLSRu,I$EMzbme":Nڂ D.(뾈R=++KyȨ UGn'+}RW-]铅Mj(]QiZ o*bĎn۷SSSSSSoܺdŊ~}z_oK?y ܁ ###CCWb)5IN~׬+(w좴NgNŭ^s'Ѥs/x.HARH5[PSPZBo*bLz20_acd Ajp:xp7.دh9/_Y8Eo]~ַ,--tBmQf_A:::CB&M H$.ΞÔq :Q:tm3fy*,]T+*-pЛ D...آX,vsscf+0-dJÇ5V^ R xQ͙T&PnHbQqq-1DkfP8 $Х+d3˙LI,]\!++KL@%SQ&;a( 6iدOoUKnsCOZ5ǎejjR&R2%55KMuLIl"K3222^DG:7z klmled$$&nپcӶmsgz3'ЄIrJ_JFFFLIld``P~ў}xEtذɓ СK)7o֩3m֝;wGFEU33swEqSeYvv=~Evmڌ+;'3JIҠ!SSS[p8vA}!''gsiinf l#gia1i^c]N0.𑄄D{G|PNiSkpP.[;zϝ9f JS˗KIM14Ңy+&Dĺܺ}Gxيݺ;/rמy7o]s,WMm$+Y;x[GyZe2COS!#"nXugACt,J9vϻ|}V߳["IA8x}}V'$[{׮^C!ڶ3˗W.]r,S;HUgԸ{fuΜRz %򝔾AvݻrbhX  ͫMN-ܲazzFFF# ~㦼ڔmml $,iNLJz捵Ռ) ֹ/Leeiiei9a̘.{O=;iX[[c1#Gvw &ıcٙ~4i#iƍɓ3-=}꤉v?=~3jeaa^J3Ԥײ+fAx{ž>MNIAKd޼Z5ق~fVlyɂ 2110&Mo+1)Vl_.!11KH$Ұo GZ^kffָQq^\GT UQʪwF,vlPt!~;(55g-'J~cZCyV͓5YU /_YZX233eXׅK}~T2+ͽrf޽?B J3&<ϜZ]M vqq)bqÆ YF/͓J'b͍=B|+ޣA>\*|pZ eجIIRK$Y׮.$6==K&&tPfe]y @*&$&&$&6m쨧DŽh(33KoZ4oo@8--RSSMMM[:RZ'"2= wutjejjzoL[{4HԸQS==}u޾}˞@û7j*Ә $ֱac#cTz浌 u`xWVFFפR1h񵉱IJJW_%X{ BIHo))&&-Z|̈́@xATmYׯy:15Hd^Zt040Ιy@Hb5'?jh1XY\N\^=f077g`&PƉb.'$XHb$@ $XI,$Hb $@ I,$Xgѵ[Gn%R$x p̩ #3Attt춴'$ )HY{|POGǼZF ^jwo$*XFPrB5ZLP1bQFF'wMHH\l  I >zϳ/o^M;ʿT)J8uĩӱqqV]]{vF$ɫM;&ᄄğNߙǎng7_ߕk橙g8*&Ҳgnݻvm@ձ}3goff͛г.O U4xW!dx z|ͮ=|jh))_Vz8'‘?lݱS$U33k1FV14*cJ*\1?i55kԣ4p'ܹ3Nܴu[F!7jy'N*6$,lז?>gg6ٽzҋSgBnXN{[jq˶ӡgy[ɡA8tXT:h ҈GPddd8}ZUsUwdJAHKK۽mcG< =sV{^Ys7^l 4 qV$/OUK -_,[PU͓gЯOoc#}p # 522ʿ?0fsssss1#GhxDxIAK^2n׮M듧D|u]:[YZjU4x,옭[;5B́V/2ȭV͚zzz:ve_5|Q8&TZ^NNmqjiiQ4PZ3.6Njff Tf&B\\bsss+FCx#°/y~gOMNJ '$(1[!NI$ţkϟ_ykϾ>k|CSZ2oXYZ~Fkk+M6agk<"2&6 qqD\T*_0=1 B5ZjoNMT$_zzz.l3Uu"]hAGl7}RYY<"".>޾zuy֪I`@U.Z:k7nH}YyUS<Ź MMM 9rDo\]5D=AضkwRRRRRҶ]_&zRJj}_ݣ w۴k7n̞7wAϙ}̩1FIMTQYʎ3AᇪꨉE`T(+;{޽%ŽI_'&&mݹKIhP...;y豎n_z{!#/nзT*ӡgǎ٫7mSnnLJ`_OϞ\.uI6o]ζo^)fU9~\֍/>o޼&x,e/HdV-[z,BSpnmyjnv 999znnܼU`$D... F;fYP6=9v| =;1ޅX,bP-[/6n& N)@ж߆MϞ?kԜi*ʀˉ I,$XI,$*boQ,3J_I5 Dp N,VR(u%VBVZſ[!K\_b777WPʒJLE'OHRH矷nݚ ķիW{{{ 4Y:7nxСCݓH$o֬ǏMLL5j, 񍜍 ;@i{˗.]zo_IOtҥy&55ӱy V^]{{PB,Pq&Jխ[bbbBCC]`i#iT 4&>AKKM6{ve@Yoܣߦ͓Ǐk׶MI4ΙX@Ruԩ_~ŋ/_Y[Zkii "T%iiYGFDFzϙۮS;8O=͛75]9v[/+;[V~AC=n۵gc'N.*R|S<4 jtmשkrssw ֫O[gEK+(&aS)$PhkkhkkH͚6355::ZU RFLLΚ9obDR.*uc ʕB;ؼ#qq+s ЖNNWΜ;߾gO1k+[w x,<0?0IX^YŋG Omw/E@EoFUA׮  w.8$ƭ[7o~,+ ״1^^MuY\[['>!uR͂sx)){TITEu)VVVV3N9zVpw3fWnjb2u.Pa3&x:1,ARҭEVWqzzFiiRinjZ~5cWN 4(;˖kp(ԺqqJW-dffʖ<|~Ǐ69Yv++OP@\|ly*{jj=mJK''H@oFUA yJ wbbzPa~s&gbT7k,W$A$ Z}}H T*jܸׯ7d%+V 222dJo,T5hme":Z"Z6Az$̞7Wq҅XYY;J'S&/ZwPGDUdP_DGklmN;"Z7._R?dU5 Jq& 2^znnnFF/sr$Inn47G#~idllbbr[Sv޽V|ӣ_\**fU?..|ǯYy |uo/H7#ի+|坝;^zݺΝes/x.XKu<7sJ#Ƞ&4Cz.{/Yyvvvӧ-P?dU5 Jq& 2VZRtСž&$$''}(mÇ֭[֭5ip` _ϝ5+Wڹt=nB f6ch1޾ AC=7J6A>A/G׽w_;}^܍[jaGyzwOwk9CV޶u|yK/]TxQi$QԄ44ԣ w{Oaij9_8w"y¬&+IT3&D...آX,vsscfm[BB۷oܸ{nm-]],#\t7440@|#)rlBT&y6KKLGEE]v73k֬˗/6mjnnD m\ClB An۴i,Jmllڷo<񍜍 {bpww4iR=tڧOww?P.bf) @=PA{ŷΝ;3JSjո'e۷oALOO$F"<~˗wD"խ_~f͞={fdd'0KHbEGG'$$>|_MJLȕ''_tÇ;v[nzzavCCOkXG>/5_I,ʽG~:44ڵk)I6"HJ HccwY͆ NG{zjHbPO/^L{ZKKK*RA$A~yܹ-[UV-V|fMr@1hРm,-uttDZR(Wum:Vv?x@GG[GGK[GKK;-# ==H#ֺ}rrr;6_ނ tuQKHLﳎhHbPlڷo1mm6m8;;KҴ*Utޝ@ W^LX.P;XHb$@ $XI,$Hb $@ I,$XHb @ I,$XHb$HbI,$XHb @ I,$XHb$@ $XI,$Hb $@ I,$XHb$@ $XI,$Hb $@ I,$޽GGU w" yB*U奵njU,EYVۮjZiKZ=,Tq*yGQIcJdna~!s;D,XX b b@ b@@@  " "D,"D,XD,XX b b@ b@@   " "D,"D,XD,XX b b@ b@@  " " "D,"D,XD,XX b b@ b@@  " "D,"D,"D,XD,XX b b@ b@@  " "D,"D,XD,{Fp(&LdeO,"D,"D,#N p56շ4ě (/,((P\g8"xEQ}Cm}Cg {X^^ Z{ҒҒ0 @d`޽|bY KK^ݺOol3u,1=vg^#ov:yyjjwȤxk|osȮW;om#71 1ovX,RVVgm& b2OT*L&/J-jl71cˉC]]M~~A"0/ٹaC ]sÆ2  pd2FlE{ 44z^mF b\aAT*jXVcc}^ns;EEA;kdkg)S JEQ, OQS bJiiۊK;tkOEQaAХX,Xb p:cIJUܜT*Sx?k.''X*J$d"Lfgggggd51g'8 t_V=ZYYYZѱ7X,+wa^ =j /ji<ޒNQ|m,ji{{b *-=Ap4N pIv7]#XEyeYIYu 55/oX{; b=oN[yAPVVQQ6psE b;ո 'yO,"D,"D,XD,|N,%bݤ < CD,mljuL465 **LGzԹٳ4IQߢg& XoP<(O2P<8({ȆX>ՐQXbOl Nmmm[lihhT*JF''M~闿c0(JRFĞ6m4tK.Q_~˖-F2(D,@&"6 [R)(?'a8r+Vt'MX_Qјѣna^iI b<҉yn>=BOxstq7կgD"okk"wQ55⩧}Xc!{bNFQ{7lX ~++&MptquݷBa"8&ΚyK}|ѯ߃ o77'''8m%K_|iMKKY3_y~<_Uss'>>C *fܰaԳW*zb铳Λvx<^H$~~3\EQX&49N]?i򊧞5糗]>1|Ok̝s]EEyEE9Uj;:]\;)T*ѥCw.[~Ygɟm>o.oŋ~аwW>zƽ?}D2Ox@@Ća2L`Y^⩧7n|=w5+6}khHRUϮUϮ>;.Aq}yd2GɾֶsGuo֡D"[ƌM/E{>p Y.|5{5\ZRRZRr[7K/}n++=s/pm+*}ˍ7x8ʂ qgxӼAҚ]Arü+.ο;L _8u:[可`D7߼hp'P0O0a oa^eE;v.[K_|^Ʌ.7l}ٶaV~f)vzEn&z앂 Kti.rouuݻcݴ bnkkA/F:NgէO猸8{G_t۝Eפs{ .[޿_ӯ~^~UW~KzSkwSSSAι8"vى{F\5}ߋϬX6y kVV^;kFtgկΘ~uzUWL◿̊eAvM_pUjg~Du{Nut=gDvvv7m?(7nڵknz󬬬;-a9ͽ[2dw_%=9sa8miSx8-Yd1Yf,Ú&mX7]<#ǜrܝi_'ӈ0,,,9pyE{iii9>p=y'0?b{'Y+NQ޽Ȯq C "Pى{}\~Ι}O1(UD,@&"6Q"dŒ'\x*L&3X@XZXZc ⓈATtnD6]~6t徟)r"8D]Q[[w%A\tfVeU--gG!\R99gPYUf3z&_< ݸvu~AAp!@r\gyyG"d_*4N;Zn.WA!w9!"FhGf\, >~5AeeB2/rM?E) :R)Lj*ARRRAl***|+L>vE^oYyEfkhij0CPQsf%$$j}JUUD2L@_5fh8qx/Gr>;TG ܹADU_Osl $."D,SәY =t̵ࡤrU"C4lm/_()*9{>s,=u^{.(x]d2K": y'OIKK<#s 0 OOOO/|25k{OA`Eό{!>Sϣ7/woKާFBroċ ŧgjJHHpҲҼg'WN]zRG{(Wp"BBBbP*@|>seecgh;/x󹑮T$]'NẔo@k&3(4:(45Ifc2M-SR9k᪔zr:@PH}}2h˘?>sPPX8e$Δc1c?d ^!#WuuG>ztۦzTs,[+ >jz,YJxBOtǏ[zBg2%|?M,pqv#d' O L 5+8u˗GZzuZN6N=s&+}Ȑ|}32j~w&o)nϟZ[$LJPSSOd擧3[pJBLL=^T\u(oISS{~h h9<~ܗeee/rwA'3_ru--y99rW,]bk?R׬\9xݳ</]ZWSsR/A=|UUV4t>{}84q„eKirYF $%%;Q[=D;R>IkѪmʛ0`@׼VW׸{/rȹ"M6Um'M!O],󛭲MMM6NΝ̬V^QI~CQUQ>lAjo{F*Nq xG";hLuMMȡg671jhl<}La4hFm-6h 颷pepRUXT@gѷSB~zW6]u,ve'{봟u--- c|W&hڴDo9;UVUhk{-L6v[;皛̮665-X|I:@SVVk.gǣ>{VFشn|&O /''qMu%1o6jts{+oز-&.ww>v8reoC7G;HHH 4HG{) *+)q 9矹/\ЙZz}>vNzg`0紧SFA477^->&zuoXn/cSSP7pcl\fl ֶFvknn'&XX3LJ 8dlfnjiJTM{ᆱ]dk&3(4:(45Ot8i1fME4KFf"/W3-M,H/5\A#߁<89aʴ鎮}|vy~Ȉ,+X,{iI %qIBgo{%'.14=59%![T:MՔw/p~QO?2x|B~AaJB\JBܳDg=g>LA^F8A#߁ ˍQ?~l?^ ͽcRiii`}&9`yl\XTLYε/( f9-z[ eUԳ|*9ϱ9qTUUg=gm0E/"QZ򸹹YЈ¢"6,fX,+*l(uq4 Ig0zzg^ }XCQmm"y\YUe7{hkCukWW`PE CTM STPظn>A F-g|ƹDi7[)ȴr>5bFkfbrq_OSs0}- h;Azzg^ %>e??edXKsPJPGIP[KKKoFۑ}NUZVNTM'l/7o%AjT%eۺmDiX\EƚoݴQh-0 h%hՙW=ǛLtۻ?doپ^`0aƎMJMknn.AIQǫBèt)[QPXb|lnjv0$`h)}UDӀɎOg 8h1wc A#/n]&]\y%`7M(#w"9Q͍k$%%oZQQ1lذeK|4͝b25t_D&nۼi\bۂ~LXۧ+=܃BÜ\HII-z=US 7lZQY5jݻDoOAΜN}A Jɓ_~%Ծs@BAȋ[IWg^ ?,YsDݾZ{ pk\'  z~ċ/0Eձ~ DMO?卍 O4pл}յlL6r:nfKJ+*G7Ju'x+(w, ޗnؠ=ޠCu]WZNшC[=mB֋@_?o\-jz,YJDYyGn*Er㝑U[Wf5fN=s&+}7tUvkmt2)AMM-6>zӧaWH"k3Yg?yb'𡯟z;ryQg=8aA1G/r\Ke[t }Qٗ.-R/kz{Eǧ EO^SRR8a²%AYF⿻ݲKuua>{.;*++d7 <~{:8tڂ|$##S]Sr(BP6ER9VJJKY,VaQ^x|'99RޯR99QiQbPQQv \W]ĵ;GBRr^ʪjmm|OKН~Bsss{xڟOC ?, >C"OM!Ӗo6Vu=v>XR= y^z>VWx_a)}^˗MG#ы >a.߽w鎟ĔԈ#Q+.Z0]4}|gyg`0|w/*D;`{^{ﺊ ̬ kWgdecߑ&Hѡwoܺ-//訤x(~[vSMwt糳m-.*.t.`mkod:k߾fkg2M-SR9#.2*.)ٸul}Ookk:cic;,9 36 {dRM̲#!/jT?ԅYe?wFSL,J=qbD}AjXm4\m}~e}ۛ7ohy]u~v3gp;!ܸV]Ȱ9_/ Pi>8bŊ^u\bRqIizjrJB[:Vm۝.]8s.KC]=Q< ɏ~}|,355d”gyyq T[wDE^1 M/" ݻ{_vѨso߽\\\D?x().H:H3BL3m}`289*si^K?^e?C@>Գ\g̲hmme٭3fYOMϙ!`Ԓ־}ghu.saQ1y\[Wg9Vg9)Fsy;>J}U2 96'N)jU^~g**+Ei|;(h:Yp!.,*kbl6Ų]uxvXEQ=K=C#*%#3kWJakk+;s_j mmxPGFe"kj8'10Sq}}sV ln4pM6Lf>暙\!wܗL4R}K_Ŭ3CȔ 7O/_oiiiii閖2t"4 @v uQ#GQZV.Llgg}rr f|6=b{ʕ/!}+W lؤԴ ?>I; Lf^~;tQje^`0AaB䫹EVVvU~|̶ )/oh 'MUT 573 owX, $Rcni>oQ/nM624|Ԕ~:cAcnjk %E¢"O޻J\OeJtmemqI**n ~wfgGIIVTT 6l2]{9.Z8ν{em!᛿ٮ6Zy-廬ӃLt\I̙^'OepÖUF۽_Mbfz/GƋAA!͢L=Wy#BC {444+u...]{d /Oud)@ yAw%:0  O{ +pwwu'B|'xcU 'D8+wl6{>jwBRrE?]̝$nkɇ,XO>!wrħxH; ӻfSO\`Jߥktl\IigKYڋX,֑c?t]JI |Q)>Kbm瑵0c?^YJx27ĖOH|I[[qVRTP sYĩ/^=jԺիFND[[[rډWgG{; ǩ̬FӗxKIIM=OAOѿަRgZXxgdf]b'' *GP_hXЮ|g>~48?98ŊON!ww>TIr.ROFEF {IӾιD\̹4h:H9qxԑ興>}sSN&%'PO{0$0 +W'E{3[pJBVS?z}PlTdiYYZ)jG /(,L=.t<}J.N/}/bBt/]ZWSsR/wn~?򥆆5sKXThs]F.h.~`k˙Z>ު**˖xӴ! --++x۽֬\9xݳ<2+}}hiQ6DvVMUu+~u55rDKTUUqN/}/bB{@{ coN$˯XI˩$h -2lΈaq/7>S lWRU׳g1 5y̨l j-7ȯ{sjEw;3Ao_hXlûǣ?ڳc;;si)vjUUÇ #Rhm&f=z2gUUT*ɭ+h?po65589]]],J-!;[YUfqU*Jnmm0`A{,;5A\-o_hX,6{Ḇ ?r"J IDATTRZb >@qI yMB7ER46:S[WW[W}Lh&Odʌ#ggM:SWyԱ$##S]Sr(BhML"*i( &蘙FTSf2jk#F0N=ԙ̖P @9"8 ~9;UVUhk{-$ wW]S3lm7.N+׮olj|yǼ.'%doѯs/lȣыmA}ٰvuԱ=TT `ںv斖.b5Xw%+VXӧwG58U 06J_rEHSJJN7oyGԁrEq1皛cXߗoM{K=*bퟋ{}c_:>\ 4^j 2\>;{}O]ϟ '՛~o6/A޾a˶^ӰÑ/{x&&[bJꤩ_'~(!"3oO^=8 ħnޞaꌬ.,yÚ ijjݸu[^^QIQ~nzSSOc3Q߀W3-S^כXX74'X巯|91̀Af榖֜K:A޽w].yu&&XX3L|dZZZZf271u|22l yyEhg8;:how*#%>uCEƙgQ3Ϟ3e /~Ȉ,+X,AP:Ĥ䔄nQݾ{b׮?w%%&%&”gyyq ě˘o$!ݺs'&*2r}Riii|,V6:cEYy9Ԅ)TNއl6b b,Ʈf:99k,ڒǂ9Ͷs/( ќk>ĩSUUU8a>U`^~l;=笗3(yjkkf=C#m3| (}{33_|ghDddf^<,wÇ4rԵ\3? vO?jYAj mmK8E+UPoZz9Gv|222}"ufֿ{WTyzxKKK|2O?|O)tƠƎC&:PXTd2lAbYpXx Q`Q펂BE-gcnjv0$`hiQ ᮟNeJtme)z9FP)Ύ7o6lز%>{9.Z8ν{nزjԈ~wmW&XYt\I̙^#J_Di3~  k7՛?@sC|':}[?ŋV"X?@OO}L + o}Y߼?,WԹ-('L +lTuEENA'!?w=^=<~Rl6;6bEqrvpqJ\҃v۶q#wo⯺{ uuZ-%b *gbn+z40lΈaq/7>S u[$6ii544nIMUjaATTVu.Aff ;vݴ~T).,󛭲MMM6NnPsSR 3Ϟ[bВ% t1G:RUUz(7BIi)pepRUXT)3DEF\T){w8J";hLuMMG;;<&Odʌ.,'QY"$PZ)e%%g'pepqr\v}cSyMv Iɝ{*u=9y^d1II9=|+.ʹ}ypow|jdo?h!߁ 9෇JNknna.?z='@|M?B~'ħ.7]#=yU;'\|71D$NubJj[M%qζw|bmO5Y^VDY֮jooc{x&ߵȝwLu njjq붼")&VfAL&L|dZZZZ~ηL'*Lf c3sSKk^{{{l|]~wLݼ}g3W,+;=CE^yB}C]|f_WovSMwt糳mMđ#H=qbD}_:3kaŧg8;:how*#Co߽\\\D&O/(LIKI{HġY%&&$ݼuJOKOatd u,V63GL8|z([ZZ+ۭ;wb"s/?(ְ=Wh&/7nFE%s3kx=2,4r_ +#)h5a>gNTb~Ay_0΁<ҟS[8igQTN['¢b򸶮r-M7ʿBO/֝; =se0Edb/_q^Yb%hkCuk ҇ ա;,Jsܣ.Gl۴䁌LkkX{mɯ|MV;|wn̬ }0>~Bw w 7O/btKK FHYy#j_suu5*JT&͆TQeTaTr5+WyK|9?A"Qܙ>3Ќ9|h/z\9, O=j?;6)5/@ a5 F ni>L475;V]SS]Ss04̔LTbaQ-fQUQvv{1̼-w/G?<q:Q,]|Sg|}mcg[Ynۼi\bۂ~o!_Mbfz/"=""{a:s;.LE ݽ}yb0'RRR ޹wLwvtXykEEŰaÖ- *䁲d݉>  Hb{g?j$OOMt[SBBbP*2\>quG2Oׯ߁`J|3o|TUW-X ?ikk?nU ;#3fS/rD-lv755L_黔G5}~x- >~*ϵNOI:@=ȰЫ]$C:LO'gX)=GFUЗOAt=[)ΣF?yTL 9rL -xG˗.QUU/*ҥ=;LR/kz{ ʜq$oNJx|nh ﯟKybfKD kWGݳ?@EE/7fsqr\v}cS v Iɝ{*u=KR*bfZN]9owbMA!@D!'@|@| ]E7>/٫W/yRTT boٻ ħgj{7/\466'%_fΎ_MD;zV`**zS֯^%ѥkLΧ^u 'ޫW/i廮ڼW^ ~bu;޾x7ߕ׮\I Eb?|뚕+ ڿe%%ә3c":|'X巯L{ᆱ]4%hoް;4y0ꡮW3-U}U}CM̲34Z块_@7fn߽~V;-f)%%n3636t/_[$I{IkkX'0:2|fŊ:Ko߽{kWzuy▦`289*%9Yf Lĭ;wb"s/?HTHVt-#BLL%nڶ҅s94#[MKr|z9gaΚmqQZ2Ϟ߲a! kWK'Ũex\Ssm[iJ` j2MKs:uL[[Ammmg.pvi0A6m5p@(lƵ~ gbzJ䉺 [t۷:- k]YYY_o_o6]PX]ABOvCj8EK^RQVkW"Ji\F QrsLL; j0A䁌[6;a<GFF*D:>:FBBQ#7Yc9FZJ'l/7o%﹢oi---222Ay^tlIZzML3 4Νmn;O6ZT, ܿO^N̜oQ^%Wܽw}_vsU^QqȑƉREEL&3/?dowX, $iEƎMJMknn. =KWMMM3 4v XXTDN6-`.ڱEVVvU~%~D)>=Ofd limUWS3{(u9;:HJJ߼bذa˖Fl5b]Ҷm޴?.1IUEmO?w / 0"4DhXۧf7ac+֬{w~-$<|7T^oQ@.?ťhkѝ;~ 3 z {df=رxEt10ѻݎ@|ArЃtǽq 2OO~ٟ+?hg48w~ȟ  >R"> {rq]sm%c~-O=e$%v# ~Ga|ghͭ쥟kqħ.;8om$X6s$ިf} jF_z˦enU &hhiFՊ5!;qO'3D\.r~QCIĂƩ߯¾/oaѿJSmJmZ?Cf~Dĵ_ͭ jIJ,ze%ݬN YCUxiM&OxXxW,rA$Qq!k(ϫn)-d"w)(r3 WyLQ}sޮq3} ^3a-mʶ&%}rɭIwbCM2`G_^qO!G_h0xHCf?r7TvMZsjm;"A#`40}7y/ ɣWvAzsqԻÒoT[<],}׸iSo_K7z}Y -mG~"nk嵍FT~ϕ]`40 +妟+_*}_^uCKg~7ڛZb2Jj!"RYի-;1ԻP,+U]:Rf O= ׫">WJ?-_\[R_5y\UA5joJ/i֠Z(/ӏ vO_B&yl %AXNAy9Sf0mo}hz|h$p˜mJ _J~ܘ^P5WF4yCնlg~#KLOQT;V;;~H$ݨ^j<$c A?22u6c`~/wTKvx]#Iꭚ#ndq}@P-OGu,<7k7BSQ| }׸S_{&}!~s=a%ި~T܈umd`E3UO|'z8\ z~7~u:&OS'fܫM8f\kawI]x'՛J]mx_{7y=|et ޾a˶6j~8G^8߄s\IDATuN76mѡ#/^r(?ᑃ.#ˤJ"/?zvrډrj8u>30*8e I ln1C ֬( o7oYz,w45ݩIje8p1c6[k3gcdb{{{l|]~)&VfAL&oRZ0̀Af榖։)~){'-L7NPQ4wo{'KJ6nflf>m-[_|ɷIU} s A%s߾p{] lΟ/ LfPhuPhkڗ ̲34Z块_@?2Ιs}8-=Çё33X,VԱX{iI %qIBoKL*.)MOMNIy떸}QR\[7DMDq-#BLL%nڶ҅s94#ۤNV`289*%9Yf 4%L w/p~QO?~<>!0%!.%!Y^^\B{Ν9 Lt]MTZZ0E+dN6F:9ǵuusm v|KBm@,/_)|K0ERhuNq4k4yg[YTaQ\fY,]ee}8JM_؜8uJҬ9Z ֒zFB]F/ >NI.*9]~J]hMP0TQÆ{wؾeJJSgxd_M^|TU,G QrsLL;ij/Yܱڗ8E`rε(/6222B]F{'Ο.Xii>] JYy# uu2QZZEFF\R%$$UNUZVN * ߒE;Q̝mn;O6Lܲ[Ş546mR'&:ϋ531IKOߺiВif/A}l6v}Fuu5jKJ˄lDl3.^|$PKK˟v_o2n¢"&e*pXx Q`["?;6)5/ ʬXXTķ^YfTQAaTDUhz'Ӧ |v6"++;p*?AM|AO)tƠƎ#nB+/((,dXAH{굹ꚚꚚfkt]3~ (#w"9QEY|ARRbÆ [ć:I\Y,,SSOEd͛%&-tE ݽ}y/X-p sr] %%p{Wu&w,2bŚu/^\`oof|k?mUs}!T%/P 7lZQY5jݻN{XDwO Lgp\rA,YsD]t]wG#>@OO z"'艺/^7_4 z1'@|fZXugu񧛗w7W лާhi8HPt-'(xS{x;TTkѝuS)6]ZVZQY>z\4558uZii/͜ٺŐd݉> LAaɓ p;466' $$$ /x{^ u ݻhlj񓔴d|zwȨP[Ww$G?)?fzOn+(ߖxyjkRRT42f89qа2᯿.Yb".])AMUu2{ЯfZXQ|aԁ&ʹ"+׮/,*-g!"~ׯ:LO'gX)dzg ;v~u-'[īpDĽCO|5yRXct=lv~wR]]zH]?ܻI+.jo7Ԕ&NlwWu\Pv0`+EħIBBb˗.qYH~{xwGxG{vlgw?v:-܎]Rnmm0`AJPh5'6-VM[~/Y,VUUuL\.JEs,X¢t%%mmmAHHve3z3---UUա"Do %xeO|YyP޿*+/=e|/En}ZEEy6m.۹s$$%wp[HܻfС6nޭY"$PZ)e%%g'$A\W]ԄH@wmݩi⳧Nu,`4h ;D|,+1Ƌ0#6[@|A._8AAIxa'@|@|M8b=7"ʵs{9[Ԧm۝.]8s.KC]=Q%>uFQZT\Rw]EҒSK6x|B~AaJB\JBܳD͵o| fo߽{kWz̝ -AФ=o"ʹZE]JKKcr$N_[[K777ǶN΅Eqm]\[0oTFs+*+(JKf9މ ܼv|gmgYg6QA6csԩ*s*BK4)|OZ״ :e:z >&%%גo䁌Lkk+y\YUe7TTM?##8w)T(-a0taCuɅ:wv y F-gDwd5;40 &.>:6NQAa5&WP hR7fZm-n!2TG𯿟 ݾVKs!ZZo, ܿO^N~%;` Qh9 Ҳrq{A[V^ηyjT2lbc?$@]~ޝGYHBЏUmQ:*KPTD ʡw0kmS9A& 5Cap(٬?nwꛫ_nJX;%W٭?Ó |t2gISs>p8?ذai=w?Gnl޲e߾}7m{?֩Spʴc23骙s[GQ5vf;wz1+wgQ΢gw&iOx7oFz kD$w1zR㧓An]CڳۺH.G٣F;cǎf͚6taO`}Κ3lпo[12ps{Wf͛yj=ڶ@EEE 9m;~AбC[8$3_~=v6?)0vS-)QF2zTp":ζ'ֿ?)OΟ=G>q8{n A{vuO }:t|}_SRRԩ$+m=wK_[kWRO# [>dpzuOEU/Ч/ RVVo2bܙ&W~]SRZ.)" lѢeKY6aA|}'VVVqcFׯW/{#GX={Z6o>ns>+ ɧnۖ/A߈9 7ʻo߾O-}w CvC U24}C?R3^,))=iӱFlQtffK7z$]6wȕ93f}_X;|Eԣ֮zZ2o7,;g9_o޼|e^ƒG˯|g3s-[bg[+?3٧*.) v~ԇ_}>Cv{M2k2q|g^}>$}JVFFzpA< mZRSSo>FdqF(սW7oN9t׮={4j$u}{䰡 33ff6,oNho1<+댺>[?[F ޤq㺧^رV GzRZkEmZǍݤqP(Խ ѣgeE~/O&Æ6hpxi׮ݑ 򫯞XtMiI3~͵k.>,_^nݑÆ^Զm*ݵqVVr&K7Y4`Ъpn%%M|X+#=T9֦UۆddTX;(d8\qG;@5[]j9s[ֻW~Qu5&NRP̦M)ɹ.++'; $ڑX5X X_;ܹeZʪNbΟˉbRi e]ӵ{sξk8KǑ^ѧ!' }}@@@'' }}}@@'' }}@@''' }}@@@'' }}}@@'' }}@@''' }}@@@'' }}@@''' }}@@@'' }}}@@'' }}@@''' }}@@@'' }}}@@'' }}@@@'' }} R'' }}}@@'' KQ|9IENDB`GM-Assistant-1.2.3/doc/userguide/fr/images/simulateur_de_des.png000066400000000000000000000206131371475637000246260ustar00rootroot00000000000000PNG  IHDR6Gt pHYs+tIME 5*.EtEXtCommentCreated with GIMPW IDATxw\(W;D1QcްFFEi DE5c4&Ƙ{#"El$hL~]c,QAsG5{!w_xmyv>Cjɓ'Z0 ggg֭[3LAQ(.]rww֭3@P(ܹSZZhϟr`h4J_O}8 999#Gуd]DnݢԀ ;01 qvat3Lbl (u|B*n *-`0 Fa.ThL&_X,kԔ̰(HIXVU6,`e} Z@Br )bnƝ[΁#?uK Q عk7գKǜiIK؅Eq8Zf24 qZM F0)\g2#8cV!i2# hVnpz{MX34uP+ʙ2jbhb/N3L:ҵ!/ǭBoiM^o(: vn&>q<[*pL''ΞQ*_krĈV^\xl|jFe`&Au33.e:S"nӟhfG,O?Љe;6̅KN.*I>8ԉ<BHM Og~E sAÆ&fDe:<&a)cCt?MʩV(LHH:uhhhEi׺ՆUV^q;)賚}٨Gr0 + >8n*IO:InBAluBh%䖂xť2HF$f /gRhPBjƧV6>>k>&a,NNNjڙv\TJtǫkLnW\L'3{tQkF}WnU$6 dBApfJ!T^YAmUPC$/cRh;88/^ҍ[ʺ::$/!Խt]Ֆ^Е[w4ZmLS`Z !T*UBZ.WggPeu #2!^YLT^qkɺ(DkT em| a栶*gŖrr_kݭ[! pE;xYZ?o )pbmK9{dFNMN[n%dXA#)Bm@Hȅ_!:m4tE3ʠ~8g:p}n!9CSTĝ!T]]l~`l:N<$oB&q\R&cXNNN< 0JEL;S<)X,"T*QjU9 ɉ`O(B(33}|Qq5t3ZVwF>eLVh4](zb꠶*Gj`F@4dF(($ H@D$ H(DHd8^\Z\XTP*%xH6%ť2yN]"1X /{p!$D¢.T*FխCwJX$S4+ZX$>6p~ ϢN=>IL1 CqYxQǗ\ծM"KF29 Ytp!JԨ_:}G0߮=ڷfnaf*1h!=~;.;>@&Q3͗BIT#E$Q촣h%ĮKMW*؄a*}N^Ty/5b jIiyv=&|GSjEENe2,9%S555o;+jsRF#&ߘ Ƙ`7jަ^ i41g`}IaB|A%J\=== ]J/Y%%S?nfhBxmc_ѣ|>B뻶~c4"AƑ7n^j{4Zm$2Scwl۱eW;oNaFؽmr7߸y<|!nZTV̚kkS 0EHW\.s+Wz;zzX.ό<},33J*8;O/K9Kpw6᠚hϜ1mH(DQӦUUEE;cJv:  pTUUDz2,//suu?X/KvtB"cܛ?<,َ>aT&? L= :y퍝ɽ(9 =<>Ă[&H.y 퍝iZ-9^ŅE>Z" Z&!È/ v䉪gU|s\.WiZ^Wh4ڄ"‰9!12\&<ȟ8b-[s>h499W1,]?2r{cEMÿEP*dɎA'K :vۉ=dPD0=.g47ݢ{Cnޭیٟh5GiWD=cEE3̱!׮x9yaX'qyLf7o&v _\R=S zчC3xP2P͢.-99yСV֒e{߯^8&n\VG++WzE=ӝwztQoʬ,u?gF:~^,}H4nG7`DT"z"{#u40]J]X4]dDMfk\.WTؠRGG/"FS(\.% ؄^- nh>VTVx;Bð¢BBf{I!+Hj^R/:>ڌ0LѨjZ~ ܿ$ H@Dftj jU`DžiѢYNdt /} .qS Bm[P̢T]yG QM(vpquk8.Ϫ2fAAA])fѨLݻ/ZO S84|gg:_ZrbbmKp@u9rгgU£b]H>e@JSQshF~~FTHupfʤ)6 P*GhϞU<\SSB dӎ#-Z&l\H(('WVV>'k*X0]rǟG6kr"[3R] 0><:42n^Ή9{ݺjRoZO8{7 >bIԌ LһY SJem|>o.YT ÐjC6#2Oas> ƅ7Ss.5q@O/&b~,ϝjFkJjNn-wl8;xˏco$i62ѐjڶi㩟2EX[~ÄGS7[s}6s6R˦vܭkIrDl_J?gv //4ZTΝ=K*%V@&3R !=#R,~~EXc0ryYEEOXMEC#Ə}1%X\X&>{w?rL76 !$==M$u:b7R !A.[o,I:pdg|juvNݱEve0TRN7DL>]bնɍbH'6Y!:FCi"Ѯ%_8+7}_IX,V7rș@Ey:5E[]w!zmCD}!k+֬}K|jF7BWY;!"wAa]MٱƢiR*# =x۟4/} NNN`+|-ۯ @+#wmݰi@ 3YT>ԋ;`.ؽ<=#L*˄BQ# 4#WsLXX$.+'_ZZ*ƆEX16esyq"qWW1\]]w;U+\]ݬ+ W]] pty<ч....'f8 ^ɐzJ B۹>zJ/, !WW[ v`8)frROH$$ڔ*H$ Z\ QՀެƢ`׀D$ H@l(BZd`BV(ī[A x̋"W 6 lcBZ !`tī2ؖx`+Z$%EE}&*m/ _ڋ &qV+޿ҫGiM ziDL4*f̞SZ*+eC!AuB3YfݺU+ 3QJiZl_.ZT*$$ޤFK nEׯ^9?g>}^cwqvXr>rZhh4EMukkkffvЈuu^RaCGV~f /?P}}{GϘ{OI  cQ@ ~:S=Xl**.ٶ!}wΘꥹzzeUAiЌ?;6j7HF:uں4'jT@ G^a]q3Nig></,8(-P'To4[Siڼ2n"ovNw]~#T]:fYfmΓ'&u6fK%Ͱ{******vר?'dxT>W}' hYr:h֥^@qI3fbw`OgtFzjn=`( *++ ]X3_]E DGW C D!^-JD`)=x`+Ȑ5x`SeR/ft$ H@DЁC f?,(h4.LP lz;DC8^\Z\XTP*yI$S/77Kk+%0JսX$nv޿0a&(.-ɻtL K{p!d}fz bD+{uR\z+ׯJPXTإScXCeE67Kk+%h"q^^Ǐ-: IF h4n@wL@e^^-[+ H\WW"4Vf:͒J:yosK5y+ܦ bD |LITӌ%  ~T /ڬL ~CyQDq0 Ú1 q+HH$uX0L6bf{7}g|xq+۵m3im[Wc |4ɁH巶z,'n28ܧOAJ61q)wFYc:>bLKZݮtWZ4Vj9`yMiTl$c["á8*B+Puϡ! 1HCƢ 1aƼ?ܸu[vuޜYnDLI?X^QѶΙZքl"Ox̊22e𰐔ՔV& 9`D 7䩟2V kdT, q XVc=Bo)j%-mW<`DQidryKDG&dmۼ`V-[6jG:i4Vh4U;]]:pIqb(.!L|uV׻g[S믵+S">r+ݭh%ܼu ~>vĊh4ZUTTuo nܼUU~}I#=̣̣YG W kdT, q̣sgE"OIydۦ6m|?%ըA#.^o38po…˖קwo5R2o+%JHZtٹesΝX,;y׮gGM`١Ay~/3##R ϟGY'gDJ<=|)p,$jTP7*Tԃ8<91^LB†\q#E}jUkԴbH,EMvs$ 44p4GBsgEK6<*PTΙ%<_AcFxBz0?ãķ?t:͍XfX*XeRD⒒QzI,"ϖ KJ>pܹ윯XD͟^z52S ֝V.f{ /+$VLnF=~N3u5֌n#DW0nEx5 Ÿ&ob>><=ܗ-Jix>%`0G ߰yˤ L U[#3ba̝.{)ZU$j/Ħ$j%-Lۃ+eQe-ҷaG尝KJإ[myWXTYul|Cؕ4OVg_п3Fj]Zkϟիj\z7i*N+a1l6XAtʲ`,Jp|^Ԫ:$X%]&n8ߞh;F+@o$c6ƌŶ5%oE`rњ@h~euHu7Ӱ’V+GyX)Q;ͧQyTK6A(V(>>>ׯ_Edj&Ǎt]D W uD[nP*l\.WTؠzH`IDAT %)JJ%Ң"@ؽ{`ںڲ27Zx/ 8lм%+*+[x%)JJ<%ZL[TTdd`0RSb*dP 0z BS-Y^X)QZʻUZ}GqJe&$Vpz\=@4͒J"jkk4fZ`<DH( Q( QDeee!> 6z4IENDB`GM-Assistant-1.2.3/doc/userguide/fr/userguide.tex.in000066400000000000000000000723561371475637000223140ustar00rootroot00000000000000%************************************************************************* %* Copyright © 2012-2018 Vincent Prat & Simon Nicolas %* %* This document is free; 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 3 of the License, or %* (at your option) any later version. %* %* This document 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 document; if not, write to the Free Software Foundation, Inc., %* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. %************************************************************************* \documentclass[a4paper,12pt]{article} \usepackage[french]{babel} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{graphicx} \usepackage{hyperref} \usepackage{xspace} \usepackage{html} \graphicspath{{@TEX_PATH@/images/}} \newcommand*{\GMA}{GM-Assistant\xspace} \newcommand*{\interfaceitem}[1]{\texttt{#1}} \newcommand*{\guillemets}[1]{\og #1\fg{}\xspace} \newcommand*{\versionnumber}{1.2\xspace} \title{\GMA \versionnumber, guide de l'utilisateur} \author{Simon Nicolas \and Vincent Prat} \date{25 décembre 2014} \begin{document} \maketitle \latex{\tableofcontents} \section{Introduction} Une partie de jeu de rôle est une alchimie riche et complexe. Les joueurs doivent être impliqués et investis et le maître de jeu (ou MJ) doit parfaitement maîtriser le système de règles, le scénario, se rappeler des évènements précédents, anticiper les évènements à venir, et improviser le présent en fonction des actions et choix des joueurs. Si en pleine partie le MJ doit chercher des détails sur un personnage, une précision sur un point de règle, des musiques d'ambiance ou des bruitages sur l'ordinateur, des images dans son classeur, ou autre, alors la partie ralentit, l'émulsion retombe, et les joueurs se dispersent. Ne niez pas, un rôliste se disperse vite. La solution est \GMA, pour \emph{Game Master Assistant} (en français, assistant au MJ). Son objectif est de simplifier la vie du MJ en mettant à sa disposition les informations et outils dont il peut avoir besoin pendant la partie. \GMA propose donc une interface où le MJ va pouvoir rassembler et ordonner toutes les informations, notes et fichiers (musiques, bruitages, images) qu'il estime utiles. Cette documentation a pour but d'aider l'utilisateur (c'est-à-dire vous) à se familiariser avec le logiciel. La fenêtre principale du logiciel comporte d'une part une barre de menus, qui sera développée dans la section~\ref{menu} et d'autre part 6 sous-parties que nous appellerons modules et qui seront présentés dans la section~\ref{sec:modules}. Le logiciel propose également un certain nombre d'outils annexes qui feront l'objet de la section~\ref{sec:outils}. Pour finir, en cas de besoin, vous pourrez trouver la liste des raccourcis clavier dans l'annexe~\ref{sec:raccourcis}. \section{Présentation des menus} \label{menu} La barre de menus de \GMA est similaire à celle que l'on trouve dans la plupart des logiciels. Nous allons maintenant détailler un par un les menus principaux, qui sont \interfaceitem{Jeu} (section~\ref{sec:jeu}), \interfaceitem{Édition} (section~\ref{sec:edition}), \interfaceitem{Affichage} (section~\ref{sec:affich}), \interfaceitem{Outils} (section~\ref{sec:menu_outils}) et \interfaceitem{Aide} (section~\ref{sec:aide}). \subsection{Jeu} \label{sec:jeu} Ce menu comprend tous les outils de gestion et de sauvegarde des fiches de scénarios créées avec \GMA. En voici la liste~: \begin{description} \item[\interfaceitem{Nouveau}~:]{crée une nouvelle fiche de scénario vide} \item[\interfaceitem{Recharger}~:]{restaure la fiche de scénario courante telle qu'elle était lors de la dernière sauvegarde} \item[\interfaceitem{Charger}~:]{charge une fiche de scénario stockée dans un fichier} \item[\interfaceitem{Récents}~:]{propose la liste des fiches de scénario récemment ouvertes} \item[\interfaceitem{Enregistrer}~:]{sauvegarde la fiche de scénario en cours d'édition} \item[\interfaceitem{Enregistrer sous}~:]{sauvegarde la fiche de scénario en cours d'édition dans un nouveau fichier} \item[\interfaceitem{Métadonnées}~:]{affiche une fenêtre permettant de noter le titre du scénario, son auteur, la date de création, une description sommaire, le jeu de rôle, la liste des joueurs et la date de jeu. L'idée est de rassembler des informations qui ne servent pas pendant la partie mais qui permettent de se souvenir de \guillemets{Qui~? Quand~? Comment~?}.} \item[\interfaceitem{Quitter}~:]{ferme la fiche de scénario en cours et quitte le logiciel} \end{description} \latex{\paragraph{Fichier de sauvegarde}} Le fichier de sauvegarde \texttt{.gms} créé est un fichier complet qui comprend toutes les informations qui sont dans la fiche de scénario et les fichiers annexes que vous y avez ajouté (musique, bruitages, images), lui permettant d'être déplacé d'un ordinateur à un autre sans risque de perte (un son manquant ou une image absente par exemple). \subsection{Édition} \label{sec:edition} Ce menu a pour but d'aider l'utilisateur lors de l'élaboration de la fiche de scénario. Il se compose de deux actions~: \begin{description} \item[\interfaceitem{Annuler}~:]{annule la dernière modification apportée} \item[\interfaceitem{Refaire}~:]{rétablit la dernière modification apportée après son annulation} \end{description} \subsection{Affichage} \label{sec:affich} Ce menu permet de choisir parmi différentes options d'affichage. Il se compose de deux sous-menus~: \begin{description} \item[\interfaceitem{Interface}~:]{ouvre la liste des arrangements de modules disponibles (voir la section~\ref{sec:modules} pour la description de chacun des modules). Chaque interface propose un appariement différent de modules~: \begin{description} \item[\interfaceitem{Complète}~:]{est composée des 6 modules} \item[\interfaceitem{Simple}~:]{est composée des modules \interfaceitem{Intrigue}, \interfaceitem{Musique} et \interfaceitem{Bruitage}} \item[\interfaceitem{Musique}~:]{est composée des modules \interfaceitem{Musique} et \interfaceitem{Bruitage}} \item[\interfaceitem{Conception}~:]{est composée des modules \interfaceitem{Intrigue}, \interfaceitem{Personnages} et \interfaceitem{Notes}} \item[\interfaceitem{Sans son}~:]{est composée des modules \interfaceitem{Intrigue}, \interfaceitem{Historique}, \interfaceitem{Personnages} et \interfaceitem{Notes}} \end{description} } \item[\interfaceitem{Langue}~:]{ouvre la liste des langues disponibles pour l'interface graphique du logiciel. Actuellement, seuls l'anglais et le français sont supportés.} \end{description} \subsection{Outils} \label{sec:menu_outils} Ce menu rassemble les différents outils annexes proposés par \GMA. Le fonctionnement de ces outils sera abordé en détail dans la section~\ref{sec:outils}. Dans la présente version du logiciel, le menu comprend~: \begin{description} \item[\interfaceitem{Simulateur de dés}~:]{permet de simuler le lancer d'un certain nombre de dés d'un certain type} \item[\interfaceitem{Gestionnaire de combat}~:]{outil permettant de structurer le déroulement des combat} \end{description} \subsection{Aide} \label{sec:aide} Ce menu donne accès aux informations générales sur le logiciel et sa licence. \section{Présentation des modules} \label{sec:modules} Comme évoqué précédemment, la fenêtre principale du logiciel est découpée en six modules indépendants et dédiés chacun à une fonctionnalité. Plusieurs de ces modules se présentent sous forme d'un arbre \guillemets{dépliable} permettant d'organiser des informations. Les possibilités offertes par ces arbres et les items qui les composent seront développées dans la section~\ref{item}. Voici la liste des modules présents dans cette version~: \begin{description} \item[\interfaceitem{Intrigue}~:]{arbre qui permet d'afficher de manière ordonnée les différents évènements important du scénario (voir la section~\ref{sec:intrigue} pour plus de détails)} \item[\interfaceitem{Historique}~:]{encore un arbre, qui a cette fois vocation à rappeler les évènements les plus marquants des scénarios précédents ou du passé des personnages (voir section~\ref{sec:historique})} \item[\interfaceitem{Notes}~:]{éditeur de texte simpliste qui permet de prendre des notes avant ou pendant la partie (voir section~\ref{sec:notes})} \item[\interfaceitem{Personnages}~:]{tableau permettant d'afficher les protagonistes avec leurs caractéristiques importantes (voir section~\ref{sec:perso})} \item[\interfaceitem{Musique}~:]{lecteur de musique simple pensé pour jouer des musiques d'ambiance (voir section~\ref{sec:musique})} \item[\interfaceitem{Bruitages}~:]{lecteur de musique encore plus simple pensé pour jouer des bruitages courts (voir section~\ref{sec:bruitages})} \end{description} Tout ces modules sont rassemblés dans l'interface par défaut du logiciel, comme on peut le voir sur la figure~\ref{fig:interface}, mais peuvent également être réorganisés grâce au sous-menu \interfaceitem{Interface} du menu \interfaceitem{Affichage} décrit précédemment dans la section~\ref{sec:affich}. \begin{figure}[ht] \centerline{\includegraphics[width=\textwidth]{scenario_complet}} \caption{Fen\^etre principale du logiciel avec une partie en cours} \label{fig:interface} \end{figure} \subsection{La notion d'item} \label{item} Les items sont à la base du fonctionnement de \GMA, il est donc approprié d'en expliquer le fonctionnement avant de détailler les modules. Par définition, un item désigne un élément minimal d'un ensemble. Dans notre cas, un item est une ligne, une entrée dans un des modules sous forme d'arbre du logiciel, qui sert à contenir une information textuelle, un son (musique ou bruitage), une image, etc. Les modules qui utilisent les items sont \interfaceitem{Intrigue}, \interfaceitem{Historique}, \interfaceitem{Musique} et \interfaceitem{Bruitage}. Chaque item se présente comme une ligne de texte, à laquelle est associé un état qui permet de prendre rapidement note du succès ou de l'échec de certains points clefs du scénario et d'en avoir une vision rapide. Les quatre états disponibles sont \interfaceitem{Aucun}, \interfaceitem{En cours}, \interfaceitem{Échoué} et \interfaceitem{Réussi}. Un item peut également comporter du contenu supplémentaire, selon son type, qui peut être \interfaceitem{Basique} (aucun contenu supplémentaire), \interfaceitem{Audio} (musiques et bruitages) ou \interfaceitem{Image} (n'importe quel type d'image). Lorsque vous cliquez avec le bouton droit de la souris sur un item apparaît le menu de gestion d'item. Ce menu contient les quatre états possible d'un item puis les trois actions \interfaceitem{Ajouter}, \interfaceitem{Supprimer} et \interfaceitem{Éditer}. Si l'item est de type \interfaceitem{Audio} ou \interfaceitem{Image}, deux actions supplémentaires sont présentes~: une pour jouer le fichier audio ou afficher l'image, et une autre pour exporter le fichier correspondant. Veuillez noter que pour les fichiers audio, l'action \interfaceitem{Jouer} n'apparaît que dans les modules \interfaceitem{Musique} et \interfaceitem{Bruitages}. L'action \interfaceitem{Ajouter} nous permet d'accéder à la fenêtre de création d'item (figure~\ref{fig:ajout}). \begin{figure}[ht] \centerline{\includegraphics[width=0.4\textwidth]{add_item}} \caption{Fen\^etre de cr\'eation d'item} \label{fig:ajout} \end{figure} Notez qu'il est également possible d'accéder à cette fenêtre en cliquant avec le bouton droit de la souris dans la partie vide du module ou en appuyant sur la touche \interfaceitem{Inser} de votre clavier. Voici comment s'organise cette fenêtre~: \begin{itemize} \item le cadre \interfaceitem{Contenu} reçoit la description de l'évènement~; \item le cadre \interfaceitem{État} permet de fixer l'état de l'item~; \item le cadre \interfaceitem{Type} permet de choisir le type de l'item et pour les items de type \interfaceitem{Audio} et \interfaceitem{Image} de sélectionner le fichier correspondant~; \item Le bouton \interfaceitem{Ajouter} ajoute l'item à la suite et au même niveau que l'item sur lequel on a cliqué avant d'ouvrir la fenêtre (si aucun item n'était sélectionné, ajoute simplement l'item à la suite au niveau le plus bas)~; \item Le bouton \interfaceitem{Enfant} ajoute l'item à la suite et sous l'item sur lequel on a cliqué précédemment, imbriqué dedans~; \item Le bouton \interfaceitem{Annuler} annule la création d'item en cours. \end{itemize} Il est important de bien saisir la différence entre les deux boutons \interfaceitem{Ajouter} et \interfaceitem{Enfant}, car c'est grâce à eux que vous organiserez les étapes de votre scénario. Une fois créés, les items sont également déplaçables au sein d'un même module par \guillemets{glisser-déposer}. L'action \interfaceitem{Éditer} ouvre une fenêtre similaire à celle de création d'item, la seule différence importante étant qu'il n'y a plus \interfaceitem{Ajouter} et \interfaceitem{Enfant}, mais uniquement un bouton \interfaceitem{Valider} permettant de valider l'édition. Si vous voulez uniquement modifier le texte d'un item, il vous suffit d'appuyer sur la touche \interfaceitem{F2} de votre clavier (la combinaison \interfaceitem{Ctrl+F2} ouvre quant à elle la fenêtre d'édition). \subsection{Intrigue} \label{sec:intrigue} L'arbre d'intrigue est dans la majorité des cas le cœur de \GMA. C'est en effet à cet endroit que vous pouvez entrer le plan détaillé et ordonné du scénario, de manière à ne jamais être perdu entre deux scènes ni oublier un élément. La figure~\ref{arbre_scenar} donne un aperçu de ce qu'il est possible de faire avec ce module. \begin{figure}[ht] \centerline{\includegraphics[width=0.7\textwidth]{scenario_type}} \caption{Plan sch\'ematique d'un sc\'enario} \label{arbre_scenar} \end{figure} Chaque ligne que vous voyez est un item, et il suffit donc de suivre la technique de création d'item présentée dans la section~\ref{item} pour ordonner son scénario. N'oubliez pas que vous pouvez modifier l'état des différents items composant l'intrigue au fur et à mesure que la partie avance pour garder une trace de la progression des personnages incarnés par vos joueurs (appelés PJ, par opposition aux PNJ, incarnés par le MJ). Cela peut s'avérer utile si le scénario s'étale sur plusieurs séances. \subsection{Historique} \label{sec:historique} L'arbre d'historique sert à préparer une liste des évènements importants ayant marqué les séances précédentes, commme les rencontres des personnages, une promesse faite par un PJ à un PNJ (ou l'inverse), etc. Il est également possible d'y inscrire des éléments du passé des personnages. De cette manière, toutes ces informations seront accessibles rapidement au MJ. D'un point de vue technique, il se comporte et s'utilise exactement de la même manière que l'arbre d'intrigue. \subsection{Notes} \label{sec:notes} Le module de prise de notes est un éditeur de texte simpliste (pour entrer du texte il suffit de cliquer avec le bouton gauche de la souris quelque part dans l'éditeur et d'écrire) qui permet de noter à la volée toute information utile à garder. Par exemple~: \guillemets{Sylvain a insulté le directeur du museum}. Ce module peut également être utilisé lors de la préparation d'une partie pour compléter certains éléments du scénario --- comme l'intrigue, l'historique ou encore les personnages --- avec des informations dont la longueur n'est pas adaptée aux modules correspondants. Par exemple, il est possible d'y écrire la description d'un personnage que les PJ rencontrent, ou une histoire qui leur est racontée par un PNJ. \subsection{Personnages} \label{sec:perso} Le module \interfaceitem{Personnages} est pensé pour accueillir la liste des protagonistes ainsi que les informations dont vous pourriez avoir besoin rapidement en cours de partie les concernant. Ces informations, appelées \guillemets{propriétés} dans le logiciel, peuvent se présenter sous forme de nombres ou sous forme de texte. Dans le module, les personnages correspondent à des lignes, et les propriétés à des colonnes. De la même manière que pour les modules sous forme d'arbre, la construction du tableau se fait à l'aide du clic droit de la souris. Cela affiche un menu déroulant permettant de choisir l'action voulue. Lorsque le module est vide, les sous-menus \interfaceitem{Personnages} et \interfaceitem{Propriétés} permettent d'ajouter un personnage ou une propriété grâce à l'action \interfaceitem{Ajouter}. Une fenêtre s'ouvrira alors, vous permettant de créer le personnage ou la propriété. Dans le cas d'un personnage, outre son nom, vous aurez la possibilité d'ajouter une courte description permettant de l'identifier facilement. Une fois qu'au moins un personnage et une propriété ont été créés apparaissent des cases éditables où l'on peut introduire les valeurs des différentes propriétés pour chaque personnage. Cliquer avec le bouton droit de la souris dans une de ces cases ouvrira le même menu déroulant que précédemment, avec en plus la possibilité de supprimer ou d'éditer le personnage ou la propriété correspondant. Notez qu'une fois un personnage ou une propriété créé, un clic droit sur le bandeau d'en-tête correspondant (horizontal pour les propriétés et vertical pour les personnages) ouvrira directement le sous-menu correspondant. \subsection{Musique} \label{sec:musique} Le module de musique est un lecteur de musique basique qui permet de jouer des musiques d'ambiance ou des sons continus (comme de la pluie ou du vent). Notez qu'il n'est possible de jouer qu'un seul morceau à la fois. Le module se divise en deux parties : un arbre similaire à l'\interfaceitem{Intrigue} et à l'\interfaceitem{Historique} permettant de hiérarchiser les différents morceaux, et le lecteur proprement dit, composé de~: \begin{itemize} \item une barre de défilement ainsi qu'un compteur qui indiquent la position dans le morceau en cours~; \item un bouton qui permet de contrôler la lecture~; \item une case à cocher permettant de jouer en boucle le morceau en cours. \end{itemize} Lorsqu'il n'y a pas de lecture en cours, il est écrit \interfaceitem{Lecture} sur le bouton. Cliquer dessus joue le morceau sélectionné dans l'arbre. Lors de la lecture, le texte du bouton est \interfaceitem{Pause}. Cliquer dessus met alors la lecture en pause et le texte du bouton devient \interfaceitem{Reprise}. Cliquer à nouveau reprend la lecture là où elle s'était arrêtée. Faire glisser le curseur de la barre de défilement permet de naviguer dans le morceau. \subsection{Bruitages} \label{sec:bruitages} Le module de bruitages est un lecteur de musique encore plus basique pensé pour jouer des sons très courts comme un coup de feu, un hurlement, une porte qui claque, \emph{etc.} Contrairement au module de musique, celui des bruitages ne comporte qu'un arbre. Pour jouer un bruitage, il suffit d'effectuer un double clic sur l'item audio voulu. Il est tout à fait possible de jouer un bruitage alors qu'une musique est en cours de lecture. En revanche, jouer un autre bruitage remplace immédiatement le bruitage en cours. Une autre différence par rapport au module de musique est qu'une fois un bruitage en cours de lecture, il n'est pas possible de l'arrêter. \section{Présentation des outils} \label{sec:outils} Tout comme les modules, les outils ont pour but de faciliter le travail du MJ lors de parties, mais contrairement à eux, ils ne servent pas à stocker d'informations. Les deux outils disponibles dans la présente version du logiciel sont un simulateur de dés (voir section~\ref{sec:des}) et un gestionnaire de combat (voir section~\ref{sec:combat}). \subsection{Simulateur de dés} \label{sec:des} Le simulateur de dés est un outil permettant de simuler directement dans le logiciel le résultat aléatoire de dés virtuels. Vous aurez ainsi tout ce qu'il vous faut si vous avez oublié vos dés ou si vous voulez en lancer plus à la fois que ce dont vous disposez. Pour l'utiliser, il suffit de sélectionner l'option correspondante du menu \interfaceitem{Outils}. Une fenêtre similaire à celle représentée sur la figure~\ref{simulateur_des} s'ouvre alors. \begin{figure}[ht] \centerline{\includegraphics[width=0.4\textwidth]{simulateur_de_des}} \caption{Simulateur de d\'es} \label{simulateur_des} \end{figure} Cette fenêtre permet de choisir les éléments suivants : \begin{description} \item[\interfaceitem{Type de dé}~:]{nombre de faces de chaque dé. Pour ceux qui ne seraient pas familiers avec les notations des rôlistes, d$n$ désigne un dé à $n$ faces.} \item[\interfaceitem{Nombre de dés}~:]{nombre de dés à lancer, jusqu'à concurrence de dix.} \end{description} Un simple clic sur le bouton \interfaceitem{Lancer} affiche le résultat donné par chacun des dés. Le bouton \interfaceitem{Mettre à zéro} permet quant à lui d'effacer le résultat de lancers précédents. Enfin, le bouton \interfaceitem{Fermer} sert à fermer le simulateur de dés une fois les lancers terminés. Notez que toute l'interface du logiciel reste accessible même lorsque le simulateur est ouvert. \subsection{Gestionnaire de combat} \label{sec:combat} Dans la plupart des jeux de rôle, les combats sont un peu compliqués à gérer. En effet, il faut garder en mémoire l'ordre dans lequel les différents personnages agissent pour être capable de dire à tout moment qui doit agir. Il faut également compter les points de vie des intervenants, les éventuelles blessures, \emph{etc.} Pour aider le MJ dans cette tâche parfois difficile, \GMA propose un outil conçu à cet effet~: le gestionnaire de combat. Tout comme pour le simulateur de dés, le gestionnaire de combat s'ouvre en sélectionnant l'option correspondante dans le menu \interfaceitem{Outils}. Son utilisation se divise en deux étapes~: la sélection des participants au combat dans un premier temps, puis le combat proprement dit. \subsubsection{Sélection des participants} La première fenêtre à apparaître ressemble à celle représentée sur la figure~\ref{gestion_combat_choix}. \begin{figure}[ht] \centerline{\includegraphics[width=1\textwidth]{gestionnaire_combat_prep}} \caption{Gestionnaire de combat~: s\'election des participants} \label{gestion_combat_choix} \end{figure} La liste des personnages de la colonne de gauche est générée automatiquement à partir des protagonistes entrés dans le module \interfaceitem{Personnages}. Il s'agit alors de choisir chaque participant au combat en le sélectionnant dans la colonne de gauche et en l'ajoutant à la colonne de droite en cliquant sur \interfaceitem{Ajouter}. En cas d'erreur, il est possible de retirer de la colonne de droite un personnage en le sélectionnant et en cliquant sur \interfaceitem{Retirer}. L'ordre dans lequel les différents acteurs figurent dans la colonne de droite est celui dans lequel ils agiront lors du combat. Veillez donc à bien ordonner la liste des participants en utilisant les boutons \interfaceitem{Haut} et \interfaceitem{Bas}, qui ont pour effet de monter et descendre le personnage sélectionné dans la liste. Sachez toutefois qu'il sera possible de changer l'ordre d'action en cours de combat. Une fois la préparation terminée, il suffit de cliquer sur \interfaceitem{OK} pour passer à l'étape suivante. \subsubsection{Combat} Apparaît maintenant le gestionnaire de combat lui-même, représenté sur la figure~\ref{gestion_combat_fight}. \begin{figure}[ht] \centerline{\includegraphics[width=0.4\textwidth]{gestion_combat_fight}} \caption{Gestionnaire de combat~: action} \label{gestion_combat_fight} \end{figure} On y retrouve la liste ordonnée de participants élaborée lors de l'étape précédente, avec en plus la possibilité d'ajouter une note pour chaque personnage dans la colonne \interfaceitem{Notes}. Cela peut s'avérer utile pour noter les blessures, les points de vie actuels, ou encore tout autre commentaire spécifique. Pour ce faire, il suffit de double-cliquer dans la case correspondante ou de taper \interfaceitem{F2} une fois la case sélectionnée. Le fonctionnement du gestionnaire est le suivant~: à chaque tour de combat la ligne \interfaceitem{Personnage actuel} indique quel personnage doit agir. La case de note du personnage en question apparaît alors sur fond jaunâtre. Lorsque ce personnage a fini d'agir, on clique sur \interfaceitem{Suivant} et le gestionnaire passe au personnage suivant. En cas de sortie du combat d'un personnage, par exemple en cas de fuite ou de mort, ce personnage peut être retiré simplement du gestionnaire en cliquant sur \interfaceitem{Supprimer} après l'avoir sélectionné. Si au cours du combat un personnage décide de retarder son action, ou si vous vous êtes trompé dans l'ordre d'action lors de la phase de sélection des participants, il est possible de déplacer un personnage au sein de la liste par glisser-déposer. Si c'était à ce personnage d'agir, le personnage suivant sera automatiquement sélectionné. Enfin, une fois le combat terminé, il suffit de cliquer sur \interfaceitem{Fermer}. \section{Conclusion}\label{conclusions} \GMA est un logiciel conçu par des rôlistes pour des rôlistes, c'est-à-dire vous. Si ce n'est déjà fait, nous vous encourageons à l'essayer. S'il vous plaît, que vous n'envisagez plus de jouer sans, tant mieux. Si pour une raison ou une autre ce n'est pas le cas, sachez que nous faisons de notre mieux. Dans tous les cas, vous êtes cordialement invités à participer à l'amélioration de ce logiciel et ce de plusieurs façons, selon vos compérences et votre motivation~: \begin{itemize} \item en utilisant le logiciel, en nous faisant part de vos impressions, et en signalant d'éventuels bogues~; \item en le faisant connaître autour de vous~; \item en proposant des fonctionnalités qui pourraient être intégrées à \GMA dans l'avenir~; \item en nous aidant à rédiger et relire la documentation~; \item en traduisant le logiciel et la documentation dans des langues qui ne sont pas encore supportées~; \item en maintenant à jour notre site web \url{http://gmassistant.free.fr}~; \item et enfin en rejoignant notre équipe de développeurs. \end{itemize} Si vous êtes intéressé, vous pouvez nous joindre à l'adresse \url{gmassistant@free.fr}. Si vous posséder un compte Github, vous pouvez également suivre l'avancement du projet, jeter un coup d'œil au code et signaler des bogues sur la page du projet \url{http://github.com/ViviCoder/GM-Assistant}. Enfin, si vous désirez être tenu au courant des dernières actualités concernant GM-Assistant, vous pouvez vous abonner à notre flux RSS (en anglais) \url{http://gmassistant.free.fr/feed}. \appendix \section{Liste des raccourcis clavier} \label{sec:raccourcis} \subsection{Menus} \begin{description} \item[\interfaceitem{Ctrl+B}~:]{Gestionnaire de combat} \item[\interfaceitem{Ctrl+D}~:]{Simulateur de dés} \item[\interfaceitem{Ctrl+M}~:]{Métadonnées} \item[\interfaceitem{Ctrl+N}~:]{Nouveau jeu} \item[\interfaceitem{Ctrl+O}~:]{Charger} \item[\interfaceitem{Ctrl+Q}~:]{Quitter} \item[\interfaceitem{Ctrl+R}~:]{Recharger} \item[\interfaceitem{Ctrl+S}~:]{Enregistrer} \item[\interfaceitem{Ctrl+Maj+S}~:]{Enregistrer} \item[\interfaceitem{Ctrl+Z}~:]{Annuler} \item[\interfaceitem{Ctrl+Maj+Z}~:]{Refaire} \item[\interfaceitem{F1}~:]{À propos} \item[\interfaceitem{F5}~:]{Interface complète} \item[\interfaceitem{F6}~:]{Interface simple} \item[\interfaceitem{F7}~:]{Interface avec musique} \item[\interfaceitem{F8}~:]{Interface de conception} \item[\interfaceitem{F9}~:]{Interface sans son} \end{description} \subsection{Arbres} \begin{description} \item[\interfaceitem{Espace}~:]{Jouer (musique ou son) ou afficher (image)} \item[\interfaceitem{Inser}~:]{Ajouter} \item[\interfaceitem{Suppr}~:]{Supprimer} \item[\interfaceitem{+}~:]{Déplier} \item[\interfaceitem{-}~:]{Replier} \item[\interfaceitem{F2}~:]{Édition simple} \item[\interfaceitem{Ctrl+F2}~:]{Édition complète} \item[\interfaceitem{Ctrl+F5}~:]{État \interfaceitem{Aucun}} \item[\interfaceitem{Ctrl+F6}~:]{État \interfaceitem{En cours}} \item[\interfaceitem{Ctrl+F7}~:]{État \interfaceitem{Échoué}} \item[\interfaceitem{Ctrl+F8}~:]{État \interfaceitem{Réussi}} \end{description} \subsection{Tableau} \begin{description} \item[\interfaceitem{Ctrl+Inser}~:]{Ajouter une propriété} \item[\interfaceitem{Ctrl+Maj+Inser}~:]{Ajouter un personnage} \item[\interfaceitem{Suppr}~:]{Effacer une cellule} \item[\interfaceitem{Ctrl+Suppr}~:]{Supprimer une propriété} \item[\interfaceitem{Ctrl+Maj+Suppr}~:]{Supprimer un personnage} \item[\interfaceitem{F2}~:]{Éditer une cellule} \item[\interfaceitem{Ctrl+F2}~:]{Éditer une propriété} \item[\interfaceitem{Ctrl+Maj+F2}~:]{Éditer un personnage} \end{description} \end{document} GM-Assistant-1.2.3/dox.conf.in000066400000000000000000003206231371475637000160600ustar00rootroot00000000000000# Doxyfile 1.8.13 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all text # before the first occurrence of this tag. Doxygen uses libiconv (or the iconv # built into libc) for the transcoding. See http://www.gnu.org/software/libiconv # for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = @PROJECT_NAME@ # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = @VERSION_MAJOR@.@VERSION_MINOR@ # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = @CMAKE_CURRENT_BINARY_DIR@ # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = YES # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = @CMAKE_CURRENT_SOURCE_DIR@ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, Javascript, # C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: # FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: # Fortran. In the later case the parser tries to guess whether the code is fixed # or free formatted code, this is the default for Fortran type files), VHDL. For # instance to make doxygen treat .inc files as Fortran files (default is PHP), # and .f files as C (default is Fortran), use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. # Minimum value: 0, maximum value: 99, default value: 0. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 0 # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = YES # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # (class|struct|union) declarations. If set to NO, these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong or incomplete # parameter documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = YES # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. # The default value is: NO. WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = @CMAKE_CURRENT_SOURCE_DIR@/sources # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: http://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, # *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, # *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. FILE_PATTERNS = *.h \ *.cpp # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # function all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see http://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the config file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # clang parser (see: http://clang.llvm.org/) for more accurate parsing at the # cost of reduced performance. This can be particularly helpful with template # rich C++ code for which doxygen's built-in parser lacks the necessary type # information. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse-libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that # the include paths will already be set by doxygen for the files and directories # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. CLANG_OPTIONS = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to YES can help to show when doxygen was last run and thus if the # documentation is up to date. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: http://developer.apple.com/tools/xcode/), introduced with # OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the master .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /

QSvgWidget
1 pushClose clicked() AboutDialog accept() 266 595 316 592 GM-Assistant-1.2.3/sources/windows/ChangeCharacterDialog.cpp000066400000000000000000000035611371475637000240140ustar00rootroot00000000000000/************************************************************************* * Copyright © 2011-2018 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #include "ChangeCharacterDialog.h" #include #include ChangeCharacterDialog::ChangeCharacterDialog(QWidget *parent): QDialog(parent) { setupUi(this); } void ChangeCharacterDialog::on_pushEdit_clicked() { if (editName->text()!="") { accept(); } else { QMessageBox::critical(this,QApplication::translate("changeCharacterDialog","Incomplete data",0),QApplication::translate("changeCharacterDialog","You must fill the content before validating.",0)); } } int ChangeCharacterDialog::exec(Character *character) { QString name, player; if (character) { name = character->name().c_str(); player = character->shortDescription().c_str(); } editName->setText(name); editName->setFocus(); editShort->setText(player); return QDialog::exec(); } void ChangeCharacterDialog::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { retranslateUi(this); } } GM-Assistant-1.2.3/sources/windows/ChangeCharacterDialog.h000066400000000000000000000046621371475637000234640ustar00rootroot00000000000000/************************************************************************* * Copyright © 2011-2013 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #ifndef HEADER_CHANGECHARACTERDIALOG #define HEADER_CHANGECHARACTERDIALOG #include "ui_ChangeCharacterDialog.h" #include "Character.h" /*! * \brief Dialog window for characters */ class ChangeCharacterDialog: public QDialog, private Ui::changeCharacterDialog { Q_OBJECT public: /*! * \brief Constructor * \param parent Parent widget */ ChangeCharacterDialog(QWidget *parent=0); /*! * \brief Getter for the character's name * \return Character's name */ inline QString name() const; /*! * \brief Getter for the short description of the character * \return Short description of the character */ inline QString shortDescription() const; public slots: /*! * \brief Slot for when the button is pressed */ void on_pushEdit_clicked(); /*! * \brief Overriden "exec" slot * \param character Character (used for pre-filling) * \return Result code * * Resets the interface and shows the window */ int exec(Character *character = 0); protected: /*! * \brief ChangeEvent handler * \param e Event to handle * * Updates the translation when changing language */ void changeEvent(QEvent *e); }; QString ChangeCharacterDialog::name() const { return editName->text(); } QString ChangeCharacterDialog::shortDescription() const { return editShort->text(); } #endif GM-Assistant-1.2.3/sources/windows/ChangeCharacterDialog.ui000066400000000000000000000045401371475637000236450ustar00rootroot00000000000000 changeCharacterDialog Qt::ApplicationModal 0 0 212 160 New name true QLayout::SetFixedSize Character's name: Short description: &Validate :/data/images/check.svg:/data/images/check.svg &Cancel :/data/images/stop.svg:/data/images/stop.svg pushCancel clicked() changeCharacterDialog reject() 124 96 192 74 GM-Assistant-1.2.3/sources/windows/ChangePropertyDialog.cpp000066400000000000000000000033631371475637000237440ustar00rootroot00000000000000/************************************************************************* * Copyright © 2011-2018 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #include "ChangePropertyDialog.h" #include #include ChangePropertyDialog::ChangePropertyDialog(QWidget *parent): QDialog(parent) { setupUi(this); } QString ChangePropertyDialog::text() const { return editName->text(); } void ChangePropertyDialog::on_pushEdit_clicked() { if (editName->text()!="") { accept(); } else { QMessageBox::critical(this,QApplication::translate("changePropertyDialog","Incomplete data",0),QApplication::translate("changePropertyDialog","You must fill the content before validating.",0)); } } int ChangePropertyDialog::exec(QString text) { editName->setText(text); editName->setFocus(); return QDialog::exec(); } void ChangePropertyDialog::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { retranslateUi(this); } } GM-Assistant-1.2.3/sources/windows/ChangePropertyDialog.h000066400000000000000000000037741371475637000234170ustar00rootroot00000000000000/************************************************************************* * Copyright © 2011-2013 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #ifndef HEADER_CHANGEPROPERTYDIALOG #define HEADER_CHANGEPROPERTYDIALOG #include "ui_ChangePropertyDialog.h" /*! * \brief Dialog window for properties */ class ChangePropertyDialog: public QDialog, private Ui::changePropertyDialog { Q_OBJECT public: /*! * \brief Constructor * \param parent Parent widget */ ChangePropertyDialog(QWidget *parent=0); /*! * \brief Getter for the text * \return Text of the QLineEdit */ QString text() const; public slots: /*! * \brief Slot for when the button is pressed */ void on_pushEdit_clicked(); /*! * \brief Overriden "exec" slot * \param text Pre-filled text * \return Result code * * Resets the interface and shows the window */ int exec(QString text=""); protected: /*! * \brief ChangeEvent handler * \param e Event to handle * * Updates the translation when changing language */ void changeEvent(QEvent *e); }; #endif GM-Assistant-1.2.3/sources/windows/ChangePropertyDialog.ui000066400000000000000000000041661371475637000236010ustar00rootroot00000000000000 changePropertyDialog Qt::ApplicationModal 0 0 217 118 New name true QLayout::SetFixedSize Name of the property: &Validate :/data/images/check.svg:/data/images/check.svg &Cancel :/data/images/stop.svg:/data/images/stop.svg pushCancel clicked() changePropertyDialog reject() 124 96 192 74 GM-Assistant-1.2.3/sources/windows/CombatDialog.cpp000066400000000000000000000114621371475637000222160ustar00rootroot00000000000000/************************************************************************* * Copyright © 2013-2020 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #include "CombatDialog.h" #include CombatDialog::CombatDialog(QWidget *parent): QDialog(parent) { setupUi(this); header = tableWidget->verticalHeader(); header->setSectionsMovable(true); header->setSectionResizeMode(QHeaderView::Fixed); connect(header, SIGNAL(sectionMoved(int, int, int)), this, SLOT(onCharacterMoved(int, int, int))); connect(header, SIGNAL(sectionDoubleClicked(int)), this, SLOT(onCharacterSelected(int))); } void CombatDialog::show(const QStringList &list) { iCharacter = 0; tableWidget->setRowCount(0); tableWidget->setRowCount(list.size()); int i = 0; for (QStringList::const_iterator it = list.begin(); it != list.end(); it++) { QTableWidgetItem *headerItem = new QTableWidgetItem(*it); QTableWidgetItem *item = new QTableWidgetItem(""); tableWidget->setVerticalHeaderItem(i, headerItem); tableWidget->setItem(i, 0, item); i++; } tableWidget->setCurrentCell(iCharacter, 0); pushRemove->setEnabled(tableWidget->rowCount() > 2); updateDisplay(); QDialog::show(); } void CombatDialog::on_pushNext_clicked() { iCharacter++; updateDisplay(); } void CombatDialog::updateDisplay() { // ensure that iCharacter lies within the permitted range iCharacter %= tableWidget->rowCount(); int logical = header->logicalIndex(iCharacter); for (int n = 0; n < tableWidget->rowCount(); n++) { if (n == logical) { tableWidget->item(n, 0)->setBackground(QPalette().color(QPalette::ToolTipBase)); } else { tableWidget->item(n, 0)->setBackground(QPalette().color(QPalette::Base)); } } label->setText(QApplication::translate("combatDialog", "Current character:", 0) + " "+tableWidget->verticalHeaderItem(logical)->text()+""); } void CombatDialog::onCharacterMoved(int, int oldVisualIndex, int newVisualIndex) { if (oldVisualIndex < iCharacter && newVisualIndex >= iCharacter) { iCharacter--; } else if (oldVisualIndex > iCharacter && newVisualIndex <= iCharacter) { iCharacter++; } else if (oldVisualIndex == iCharacter) { if (newVisualIndex < iCharacter) { on_pushNext_clicked(); } else { updateDisplay(); } } } void CombatDialog::on_pushRemove_clicked() { int n = tableWidget->rowCount(); if (n > 2) { int row = tableWidget->currentRow(); if (QMessageBox::question(this, QApplication::translate("combatDialog", "Confirmation", 0), QApplication::translate("combatDialog", "You are about to remove %1 from the combat manager. Are you sure you want to do it?", 0).arg(""+tableWidget->verticalHeaderItem(row)->text()+""), QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { tableWidget->removeRow(row); if (iCharacter > row) { iCharacter--; } if (n == 3) { pushRemove->setEnabled(false); } updateDisplay(); } } } void CombatDialog::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { retranslateUi(this); } } void CombatDialog::onCharacterSelected(int logicalIndex) { iCharacter = header->visualIndex(logicalIndex); updateDisplay(); } void CombatDialog::closeEvent(QCloseEvent *e) { if (QMessageBox::question(this, QApplication::translate("combatDialog", "Confirmation", 0), QApplication::translate("combatDialog", "You are about to close the combat manager. You will lose all information about the ongoing combat. Are you sure you want to do it?", 0), QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { e->accept(); } else { e->ignore(); } } void CombatDialog::on_pushClose_clicked() { close(); } GM-Assistant-1.2.3/sources/windows/CombatDialog.h000066400000000000000000000063101371475637000216570ustar00rootroot00000000000000/************************************************************************* * Copyright © 2013-2017 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #ifndef HEADER_COMBATDIALOG #define HEADER_COMBATDIALOG #include "ui_CombatDialog.h" #include /*! * \brief Dialog window which manages the action order in a turn-per-turn combat */ class CombatDialog: public QDialog, private Ui::combatDialog { Q_OBJECT private: //! Counter int iCharacter; //! Vertical header QHeaderView *header; protected: /*! * \brief ChangeEvent handler * \param e Event to handle * * Updates the translation when changing language */ void changeEvent(QEvent *e); /*! * \brief CloseEvent handler * \param e Event to handle * * Asks for confirmation before closing the dialog window */ void closeEvent(QCloseEvent *e); public: //! Default constructor CombatDialog(QWidget *parent); public slots: /*! * \brief Overriden slot for showing the dialog window * \param list List of involved characters * * Prepares the dialog window with the given list of characters */ void show(const QStringList &list); /*! * \brief Slot for when the Next button is clicked * * Goes to the next character to play */ void on_pushNext_clicked(); /*! * \brief Slot for when a character is moved * \param logicalIndex Logical index of the moved header section * \param oldVisualIndex Old visual index * \param newVisualIndex New visual index */ void onCharacterMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex); /*! * \brief Slot for when the Remove button is clicked * * Deletes the current character */ void on_pushRemove_clicked(); /*! * \brief Slot to update the display */ void updateDisplay(); /*! * \brief Slot for when a character is double-clicked * \param logicalIndex Logical index of the header section */ void onCharacterSelected(int logicalIndex); /*! * \brief Slot for when the Close button is clicked * * Closes the dialog window */ void on_pushClose_clicked(); }; #endif GM-Assistant-1.2.3/sources/windows/CombatDialog.ui000066400000000000000000000034611371475637000220510ustar00rootroot00000000000000 combatDialog 0 0 287 245 Combat manager Current character: QAbstractItemView::SingleSelection QAbstractItemView::SelectRows true Notes &Next true &Remove &Close GM-Assistant-1.2.3/sources/windows/DiceDialog.cpp000066400000000000000000000043041371475637000216520ustar00rootroot00000000000000/************************************************************************* * Copyright © 2013 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #include "DiceDialog.h" #include DiceDialog::DiceDialog(QWidget *parent): QDialog(parent) { setupUi(this); /* Initializes the random seed */ srand(time(0)); } void DiceDialog::on_pushThrow_clicked() { int faces; switch (comboType->currentIndex()) { case 0: faces = 2; break; case 1: faces = 3; break; case 2: faces = 4; break; case 3: faces = 6; break; case 4: faces = 8; break; case 5: faces = 10; break; case 6: faces = 12; break; case 7: faces = 20; break; default: faces = 100; } QString result; int nb = spinNumber->value(); for (int i = 0; i < nb; i++) { result += QString("%1").arg(rand() % faces + 1); if (i+1 < nb) { result += " "; } } lineResult->setText(result); } void DiceDialog::on_pushReset_clicked() { lineResult->setText(QString()); } void DiceDialog::show() { on_pushReset_clicked(); QDialog::show(); } void DiceDialog::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { retranslateUi(this); } } GM-Assistant-1.2.3/sources/windows/DiceDialog.h000066400000000000000000000037251371475637000213250ustar00rootroot00000000000000/************************************************************************* * Copyright © 2013 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #ifndef HEADER_DICEDIALOG #define HEADER_DICEDIALOG #include "ui_DiceDialog.h" /*! * \brief Dialog window for dice simulation */ class DiceDialog: public QDialog, private Ui::diceDialog { Q_OBJECT public: /*! * \brief Default constructor * \param parent Parent widget */ DiceDialog(QWidget *parent); public slots: /*! * \brief Slot for when the Generate button is clicked * * Generates the requested random numbers */ void on_pushThrow_clicked(); /*! * \brief Slot for when the Reset button is clicked * * Resets the results */ void on_pushReset_clicked(); /*! * \brief Overriden slot for showing the dialog window * * Resets the results */ void show(); protected: /*! * \brief ChangeEvent handler * \param e Event to handle * * Updates the translation when changing language */ void changeEvent(QEvent *e); }; #endif GM-Assistant-1.2.3/sources/windows/DiceDialog.ui000066400000000000000000000075771371475637000215240ustar00rootroot00000000000000 diceDialog 0 0 305 172 Dice simulator QLayout::SetFixedSize QFormLayout::AllNonFixedFieldsGrow Die type: 3 true d2 d3 d4 d6 d8 d10 d12 d20 d100 Number of dice: 1 10 true &Throw true &Reset &Close pushClose clicked() diceDialog close() 166 122 212 111 GM-Assistant-1.2.3/sources/windows/ImageWindow.cpp000066400000000000000000000071511371475637000221030ustar00rootroot00000000000000/************************************************************************* * Copyright © 2011-2020 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #include "ImageWindow.h" #include #include #include #include ImageWindow::ImageWindow(const std::string &pictureFileName, QWidget *parent): QLabel(parent), bError(false), sImageFileName(pictureFileName), bSvg(true), renderer(0) { setAlignment(Qt::AlignCenter); setWindowFlags(windowFlags()|Qt::Window); // setting background color to black QPalette newPalette(palette()); newPalette.setColor(QPalette::Window,QColor("black")); setPalette(newPalette); // displaying (or not) the picture if (sImageFileName.length() < 3 || !QFileInfo(sImageFileName.c_str()).exists()) { bError = true; return; } if (sImageFileName.substr(sImageFileName.length()-3,3) != "svg") { bSvg = false; pix = QPixmap(sImageFileName.c_str()); if (pix.isNull()) { // the image cannot be loaded bError = true; return; } else { setPixmap(pix); } } if (bSvg) { renderer = new QSvgRenderer(this); if (!renderer->load(QString(sImageFileName.c_str()))) { // unable to load the image bError = true; return; } resize(renderer->defaultSize()); // the size is fixed when the image does not exist QRectF rect = renderer->viewBoxF(); dAspectRatio = rect.width()/rect.height(); } showNormal(); } void ImageWindow::mouseReleaseEvent(QMouseEvent *) { if (!isFullScreen()) { setWindowState(Qt::WindowMaximized); showFullScreen(); } else { showNormal(); } } void ImageWindow::keyReleaseEvent(QKeyEvent *e) { switch (e->key()) { case Qt::Key_Escape: showNormal(); break; default: break; } } void ImageWindow::resizeEvent(QResizeEvent *e) { // overriden event handler QLabel::resizeEvent(e); // replacing the pixmap if (bSvg) { // scaling int w = width(); int h = w / dAspectRatio; if (h > height()) { h = height(); w = h * dAspectRatio; } QImage image(w, h, QImage::Format_ARGB32); image.fill(QPalette::Window); QPainter painter(&image); renderer->render(&painter); setPixmap(QPixmap::fromImage(image)); } else { setPixmap(pix.scaled(e->size(),Qt::KeepAspectRatio)); } } bool ImageWindow::error() const { return bError; } QSize ImageWindow::sizeHint() const { QRect screen = QApplication::desktop()->screenGeometry(this); return QSize(screen.width() / 2, (2 * screen.height() / 3)); } GM-Assistant-1.2.3/sources/windows/ImageWindow.h000066400000000000000000000054121371475637000215460ustar00rootroot00000000000000/************************************************************************* * Copyright © 2011-2020 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #ifndef HEADER_IMAGEWINDOW #define HEADER_IMAGEWINDOW #include #include #include #include #include /*! * \brief Window used to display an image */ class ImageWindow: public QLabel { private: /*! * Flag active if the image cannot be loaded */ bool bError; /*! * Image file name */ std::string sImageFileName; /*! * Flag active if the image is in the SVG format */ bool bSvg; /*! * Svg Renderer */ QSvgRenderer *renderer; /*! * Aspect ratio of the image */ double dAspectRatio; /*! * Reference pixmap for non-SVG images */ QPixmap pix; protected: /*! * \brief Mouse ReleaseEvent handler * \param e Mouse event raised * * Switches between full screen and normal */ void mouseReleaseEvent(QMouseEvent *e); /*! * \brief Key ReleaseEvent handler * \param e Key event raised */ void keyReleaseEvent(QKeyEvent *e); /*! * \brief Resize event handler * \param e Resize event raised */ void resizeEvent(QResizeEvent *e); public: /*! * \brief Constructor of the window * \param imageFileName Name of the file containing the image to show * \param parent Parent widget */ ImageWindow(const std::string &imageFileName, QWidget *parent=0); /*! * \brief Getter for the error flag * \return True if the image was not loaded correctly */ bool error() const; /*! * \brief Preferred size of the window * \return Default size */ QSize sizeHint() const override; }; #endif GM-Assistant-1.2.3/sources/windows/ItemDialog.cpp000066400000000000000000000150771371475637000217150ustar00rootroot00000000000000/************************************************************************* * Copyright © 2011-2018 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #include "ItemDialog.h" #include ItemDialog::ItemDialog(QWidget *parent): QDialog(parent), audioBrowser(new QFileDialog(this, QApplication::translate("itemDialog", "Select the audio file to associate to the item", 0))) { setupUi(this); // setting the audio browser up audioBrowser->setOption(QFileDialog::DontUseNativeDialog, true); audioBrowser->setFileMode(QFileDialog::ExistingFile); audioBrowser->setReadOnly(true); audioBrowser->setNameFilterDetailsVisible(false); } Item::State ItemDialog::state() const { if (radioNone->isChecked()) return Item::sNone; else if (radioProgress->isChecked()) return Item::sProgress; else if (radioFailure->isChecked()) return Item::sFailure; else return Item::sSuccess; } QString ItemDialog::text() const { return editItem->text(); } Item::Type ItemDialog::type() const { if (radioSound->isChecked()) return Item::tSound; else if (radioImage->isChecked()) return Item::tImage; else return Item::tBasic; } QString ItemDialog::fileName() const { QString result(editFile->text()); // file selected QString directory(QDir::current().path()); // current directory if (result.startsWith(directory)) { return result.replace(0,directory.length()+1,""); } return result; } void ItemDialog::on_pushChild_clicked() { if (editItem->text()!="") { if (radioBasic->isChecked() || editFile->text()!="") { rRes = rChild; accept(); } else { QMessageBox::critical(this,QApplication::translate("itemDialog","Incomplete data",0),QApplication::translate("itemDialog","You must select a file before validating.",0)); } } else { QMessageBox::critical(this,QApplication::translate("itemDialog","Incomplete data",0),QApplication::translate("itemDialog","You must fill the content before validating.",0)); } } void ItemDialog::on_pushBrother_clicked() { if (editItem->text()!="") { if (radioBasic->isChecked() || editFile->text()!="") { rRes = rBrother; accept(); } else { QMessageBox::critical(this,QApplication::translate("itemDialog","Incomplete data",0),QApplication::translate("itemDialog","You must select a file before validating.",0)); } } else { QMessageBox::critical(this,QApplication::translate("itemDialog","Incomplete data",0),QApplication::translate("itemDialog","You must fill the content before validating.",0)); } } ItemDialog::Result ItemDialog::selectionResult() const { return rRes; } void ItemDialog::on_radioBasic_clicked() { toolBrowse->setEnabled(false); } void ItemDialog::on_radioSound_clicked() { toolBrowse->setEnabled(true); editFile->setText(""); } void ItemDialog::on_radioImage_clicked() { toolBrowse->setEnabled(true); editFile->setText(""); } void ItemDialog::on_toolBrowse_clicked() { switch (type()) { case Item::tSound: { if (audioBrowser->exec()) { editFile->setText(audioBrowser->selectedFiles()[0]); } break; } case Item::tImage: { editFile->setText(QFileDialog::getOpenFileName(this,QApplication::translate("itemDialog","Select the image file to associate to the item",0),"",QApplication::translate("itemDialog","Image files (*.jpg *.jpeg *.png *.bmp *.svg)",0),0,QFileDialog::DontUseNativeDialog)); break; } default: break; } } int ItemDialog::exec(Item *item) { // initialization QString content, file; Item::Type itemType = Item::tBasic; Item::State itemState = Item::sNone; if (item) { setWindowTitle(QApplication::translate("itemDialog", "Edit the item", 0)); pushBrother->setVisible(false); pushChild->setIcon(QIcon(":/data/images/check.svg")); pushChild->setText(QApplication::translate("itemDialog", "&Validate", 0)); pushChild->setDefault(true); // pre-filling content = item->content().c_str(); itemType = item->type(); itemState = item->state(); if (itemType != Item::tBasic) { file = dynamic_cast(item)->fileName().c_str(); } } else { setWindowTitle(QApplication::translate("itemDialog", "Create a new item", 0)); pushBrother->setVisible(true); pushChild->setIcon(QIcon(":/data/images/son.svg")); pushChild->setText(QApplication::translate("itemDialog", "C&hild", 0)); pushBrother->setDefault(true); } // resets the window // state radioNone->setChecked(itemState == Item::sNone); radioProgress->setChecked(itemState == Item::sProgress); radioSuccess->setChecked(itemState == Item::sSuccess); radioFailure->setChecked(itemState == Item::sFailure); // type radioBasic->setChecked(itemType == Item::tBasic); radioSound->setChecked(itemType == Item::tSound); radioImage->setChecked(itemType == Item::tImage); // everuthing else toolBrowse->setEnabled(itemType != Item::tBasic); editItem->setText(content); editItem->setFocus(); editFile->setText(file); // shows it return QDialog::exec(); } void ItemDialog::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { retranslateUi(this); audioBrowser->setNameFilter(QApplication::translate("itemDialog", "Audio files (*)", 0)); } } GM-Assistant-1.2.3/sources/windows/ItemDialog.h000066400000000000000000000061331371475637000213530ustar00rootroot00000000000000/************************************************************************* * Copyright © 2011-2019 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #ifndef HEADER_ITEMDIALOG #define HEADER_ITEMDIALOG #include "ui_ItemDialog.h" #include "ItemFactory.h" #include /*! * \brief Dialog window for item creation */ class ItemDialog: public QDialog, private Ui::itemDialog { Q_OBJECT public: // result type enum Result {rBrother,rChild}; /*! * \brief Constructor * \param parent Parent widget * \param filter Filter for audio files */ ItemDialog(QWidget *parent=0); // accessors Item::State state() const; QString text() const; Item::Type type() const; /*! * \brief Getter for the name of the file * * If the file is within the current directory, returns the relative path */ QString fileName() const; Result selectionResult() const; public slots: void on_pushChild_clicked(); void on_pushBrother_clicked(); /*! * \brief Slot for the "Basic" radio button * * Sets the type of the item to tBasic */ void on_radioBasic_clicked(); /*! * \brief Slot for the "Sound" radio item * * Sets the type of the item to tSound */ void on_radioSound_clicked(); /*! * \brief Slot for the "Browse" tool button * * Opens a dialog window to select a file */ void on_toolBrowse_clicked(); /*! * \brief Slot for the "Image" radio item * * Sets the type of the item to tImage */ void on_radioImage_clicked(); /*! * \brief Overriden "exec" slot * \param item Item to be edited for pre-filling * \return Result code * * Resets the interface and shows the window */ int exec(Item *item = 0); protected: /*! * \brief ChangeEvent handler * \param e Event to handle * * Updates the translation when changing language */ void changeEvent(QEvent *e); private: //! Modal result Result rRes; //! Audio file browser QFileDialog *audioBrowser; }; #endif GM-Assistant-1.2.3/sources/windows/ItemDialog.ui000066400000000000000000000147521371475637000215470ustar00rootroot00000000000000 itemDialog Qt::ApplicationModal 0 0 325 483 Create a new item true QLayout::SetFixedSize Content State &None :/data/images/empty.svg:/data/images/empty.svg true &In progress :/data/images/uncheck.svg:/data/images/uncheck.svg &Failed :/data/images/failure.svg:/data/images/failure.svg &Succeeded :/data/images/check.svg:/data/images/check.svg Type &Basic :/data/images/empty.svg:/data/images/empty.svg true A&udio :/data/images/speaker.svg:/data/images/speaker.svg I&mage :/data/images/image.svg:/data/images/image.svg File: true false ... &Add :/data/images/add.svg:/data/images/add.svg C&hild :/data/images/son.svg:/data/images/son.svg &Cancel :/data/images/stop.svg:/data/images/stop.svg pushCancel clicked() itemDialog reject() 271 404 285 377 GM-Assistant-1.2.3/sources/windows/MainWindow.cpp000066400000000000000000000756261371475637000217610ustar00rootroot00000000000000/************************************************************************* * Copyright © 2011-2020 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #include "MainWindow.h" #include #include #include "QCustomTreeWidgetItem.h" #include "ItemFactory.h" #include #include #include #include "NoteModification.h" #include #include #include #include "MetadataModification.h" #include MainWindow::MainWindow(const QString &install_dir): QMainWindow(), musicPlayer(new QMediaPlayer(this)), soundPlayer(new QMediaPlayer(this)), pAboutDial(new AboutDialog(this)), pDiceDialog(new DiceDialog(this)), pCombatDialog(new CombatDialog(this)), smRecent(new QSignalMapper(this)), siCurrentMusic(0), tApplication(new QTranslator(this)), tSystem(new QTranslator(this)), sInstall(install_dir), smLanguage(new QSignalMapper(this)), pMetadataDialog(new MetadataDialog(this)), pItemDialog(new ItemDialog(this)) { pSelectCharacterDialog = new SelectCharacterDialog(this, pCombatDialog); setupUi(this); updateDisplay(); updateUndoRedo(); // interface action group QActionGroup *interfaceGroup = new QActionGroup(this); interfaceGroup->addAction(actionMusic); interfaceGroup->addAction(actionFull); interfaceGroup->addAction(actionSimple); interfaceGroup->addAction(actionDesign); interfaceGroup->addAction(actionNoMusic); // language action group QActionGroup *languageGroup = new QActionGroup(this); // Listing available translations QFile file(sInstall + "translations/languages"); QString locale = QLocale::system().name().section('_',0,0); bool locale_found = false; if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); while (!in.atEnd()) { QStringList parts = in.readLine().split(':'); if (parts.size() == 2) { QAction *action = new QAction(this); action->setText(parts[0]); action->setCheckable(true); languageGroup->addAction(action); if (parts[1] == locale) { action->setChecked(true); locale_found = true; } else if (parts[1].isEmpty() && !locale_found) { // default language: english action->setChecked(true); } menu_Language->addAction(action); menu_Language->setEnabled(true); // signal mapping connect(action, SIGNAL(triggered()), smLanguage, SLOT(map())); smLanguage->setMapping(action, parts[1]); } } file.close(); connect(smLanguage, SIGNAL(mapped(const QString&)), this, SLOT(translationRequested(const QString&))); } // Translators QApplication::installTranslator(tApplication); QApplication::installTranslator(tSystem); if (locale_found) { translationRequested(locale); } // connections connect(smRecent,SIGNAL(mapped(int)),this,SLOT(loadRecent(int))); connect(treePlot, SIGNAL(modificationDone(Modification*)), this, SLOT(registerModification(Modification*))); treePlot->installEventFilter(this); connect(treeHistory, SIGNAL(modificationDone(Modification*)), this, SLOT(registerModification(Modification*))); treeHistory->installEventFilter(this); connect(treeMusic, SIGNAL(modificationDone(Modification*)), this, SLOT(registerModification(Modification*))); treeMusic->installEventFilter(this); connect(treeFX, SIGNAL(modificationDone(Modification*)), this, SLOT(registerModification(Modification*))); treeFX->installEventFilter(this); connect(textNotes, SIGNAL(modificationDone(Modification*)), this, SLOT(registerModification(Modification*))); connect(textNotes, SIGNAL(unregistered()), this, SLOT(updateUndoRedo())); textNotes->installEventFilter(this); connect(tableStats, SIGNAL(modificationDone(Modification*)), this, SLOT(registerModification(Modification*))); tableStats->installEventFilter(this); // Item dialog treePlot->setItemDialogWindow(pItemDialog); treeHistory->setItemDialogWindow(pItemDialog); treeMusic->setItemDialogWindow(pItemDialog); treeFX->setItemDialogWindow(pItemDialog); // setting audio options treeMusic->setPlayingMethod(this, QCustomTreeWidget::pmMusic); treeFX->setPlayingMethod(this, QCustomTreeWidget::pmSound); connect(musicPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(onMusicPositionChanged(qint64))); connect(musicPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(onMusicDurationChanged(qint64))); connect(musicPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(onMusicStateChanged(QMediaPlayer::State))); connect(musicPlayer, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(displayError(QMediaPlayer::Error))); // loading settings QSettings settings; settings.beginGroup("directories"); QDir::setCurrent(settings.value("work").toString()); settings.endGroup(); settings.beginGroup("mainWindow"); resize(settings.value("size",size()).toSize()); if (settings.value("maximized",false).toBool()) { setWindowState(windowState() | Qt::WindowMaximized); } settings.endGroup(); settings.beginGroup("files"); slRecent = settings.value("recent").toStringList(); // display the recently opened games in the menu actionR_ecent->setMenu(new QMenu(this)); addRecent(""); sFileName = settings.value("last").toString(); if (!sFileName.isEmpty()) { // we load the game opened when GMA was closed on_action_Reload_triggered(); updateUndoRedo(); } settings.endGroup(); // menu updates connect(actionR_ecent->menu(),SIGNAL(aboutToShow()),this,SLOT(updateRecent())); // about Qt connect(actionAbout_Qt, SIGNAL(triggered(bool)), QApplication::instance(), SLOT(aboutQt())); } MainWindow::~MainWindow() { // saving settings QSettings settings; settings.beginGroup("directories"); settings.setValue("work",QDir::current().path()); settings.endGroup(); settings.beginGroup("mainWindow"); if (!isMaximized()) { settings.setValue("size",size()); } else { settings.setValue("size",sUnmaximizedSize); } settings.setValue("maximized",isMaximized()); settings.endGroup(); // updates the list of recently opened games settings.beginGroup("files"); settings.setValue("last",sFileName); settings.setValue("recent",slRecent); settings.endGroup(); } void MainWindow::clearLayout() { // Removing all the Widget from the Layout. GridLayout->removeWidget(gbCharacter); GridLayout->removeWidget(gbHistory); GridLayout->removeWidget(gbNote); GridLayout->removeWidget(gbPlot); GridLayout->removeWidget(gbSound); GridLayout->removeWidget(gbMusic); // Hiding the Widgets to prevent random showing. gbCharacter->hide(); gbHistory->hide(); gbMusic->hide(); gbNote->hide(); gbPlot->hide(); gbSound->hide(); } void MainWindow::on_actionMusic_triggered() { clearLayout(); GridLayout->addWidget(gbMusic,0,0); GridLayout->addWidget(gbSound,0,1); gbMusic->show(); gbSound->show(); sGame.setUserInterface(Scenario::uiMusic); actionMusic->setChecked(true); } void MainWindow::on_actionFull_triggered() { clearLayout(); GridLayout->addWidget(gbPlot,0,0); GridLayout->addWidget(gbNote,0,1); GridLayout->addWidget(gbCharacter,0,2); GridLayout->addWidget(gbHistory,1,0); GridLayout->addWidget(gbMusic,1,1); GridLayout->addWidget(gbSound,1,2); gbPlot->show(); gbNote->show(); gbCharacter->show(); gbHistory->show(); gbMusic->show(); gbSound->show(); sGame.setUserInterface(Scenario::uiFull); actionFull->setChecked(true); } void MainWindow::on_actionSimple_triggered() { clearLayout(); GridLayout->addWidget(gbPlot,0,0,2,1); GridLayout->addWidget(gbMusic,0,1); GridLayout->addWidget(gbSound,1,1); gbPlot->show(); gbMusic->show(); gbSound->show(); sGame.setUserInterface(Scenario::uiSimple); actionSimple->setChecked(true); } void MainWindow::on_actionDesign_triggered() { clearLayout(); GridLayout->addWidget(gbPlot,0,0,2,1); GridLayout->addWidget(gbCharacter,0,1); GridLayout->addWidget(gbNote,1,1); gbPlot->show(); gbCharacter->show(); gbNote->show(); sGame.setUserInterface(Scenario::uiDesign); actionDesign->setChecked(true); } void MainWindow::on_actionNoMusic_triggered() { clearLayout(); GridLayout->addWidget(gbPlot,0,0); GridLayout->addWidget(gbHistory,1,0); GridLayout->addWidget(gbCharacter,0,1); GridLayout->addWidget(gbNote,1,1); gbPlot->show(); gbHistory->show(); gbCharacter->show(); gbNote->show(); sGame.setUserInterface(Scenario::uiNoMusic); actionNoMusic->setChecked(true); } void MainWindow::on_actionAbout_triggered() { pAboutDial->exec(); } void MainWindow::on_action_Quit_triggered() { close(); } void MainWindow::on_action_Load_triggered() { if (canClose()) { QString file = QFileDialog::getOpenFileName(this,QApplication::translate("mainWindow","Select the file to open",0),QDir::current().path(),QApplication::translate("mainWindow","GM-Assistant files (*.gms *.gma);;XML files (*.xml)",0),0,QFileDialog::DontUseNativeDialog); if (!file.isEmpty()) { // changing current directory QDir::setCurrent(QFileInfo(file).dir().path()); try { sGame.fromFile(file.toStdString()); } catch (Poco::Exception &poco) { QMessageBox::critical(this,QApplication::translate("mainWindow","Error",0), QString(poco.displayText().c_str())); sGame.clear(); file = ""; } catch (std::exception &e) { QMessageBox::critical(this,QApplication::translate("mainWindow","Error",0),QApplication::translate("mainWindow","The game cannot be loaded correctly for the following reason:",0) + "\n\n" + QString(e.what()) + "\n\n" + QApplication::translate("mainWindow","The game will be loaded anyway, but some features might not work properly.",0)); sGame.fromFile(file.toStdString(), false); } updateDisplay(); mqQueue.clear(); addRecent(file); sFileName = file; updateUndoRedo(); if (!sGame.configuration().isValid()) { if (QMessageBox::warning(this, QApplication::translate("mainWindow", "Warning", 0), QApplication::translate("mainWindow", "The syntax of the game you have just loaded is not rigourously correct. Would you like to fix it now?"), QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { changeFormatIfNeeded(); } } } } } void MainWindow::save(bool askForUpdate) { if (sFileName.isEmpty()) { on_actionS_ave_as_triggered(); } else { try { if (askForUpdate && sGame.configuration().version() < Version() && QMessageBox::warning(this, QApplication::translate("mainWindow", "Warning", 0), QApplication::translate("mainWindow", "The game you want to save does not use the latest version of GM-Assistant files. Do you want to update it? If no, some features may not be saved properly."), QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { changeFormatIfNeeded(false); return; } sGame.toFile(sFileName.toStdString()); mqQueue.save(); action_Save->setEnabled(false); updateUndoRedo(); } catch (Poco::Exception &poco) { QMessageBox::critical(this,QApplication::translate("mainWindow","Error",0), QString(poco.displayText().c_str())); } } } void MainWindow::on_action_Save_triggered() { save(); } bool MainWindow::on_actionS_ave_as_triggered() { QString filters(QApplication::translate("mainWindow","GM-Assistant files (1.2) (*.gms)",0)); if (!sGame.configuration().isArchived()) { filters += QApplication::translate("mainWindow",";;GM-Assistant files (1.1) (*.gma);;GM-Assistant files (1.0) (*.xml)",0); } QFileDialog *dial = new QFileDialog(this,QApplication::translate("mainWindow","Select the file to save",0),QDir::current().path(), filters); dial->setOption(QFileDialog::DontUseNativeDialog, true); dial->setAcceptMode(QFileDialog::AcceptSave); if (dial->exec() == QFileDialog::Accepted) { QString file = dial->selectedFiles()[0]; // adding the suffix if not present QString sVersion = dial->selectedNameFilter().right(12); sVersion = sVersion.left(sVersion.indexOf(')')); Version version(sVersion.toStdString()); QString suffix = dial->selectedNameFilter().right(5).left(4); if (!file.endsWith(suffix)) { file.append(suffix); } try { sGame.setVersion(version); sGame.toFile(file.toStdString()); mqQueue.save(); action_Save->setEnabled(false); addRecent(file); sFileName = file; QDir::setCurrent(QFileInfo(sFileName).dir().path()); updateUndoRedo(); } catch (Poco::Exception &poco) { QMessageBox::critical(this,QApplication::translate("mainWindow","Error",0), QString(poco.displayText().c_str())); return false; } } else { return false; } delete dial; return true; } void MainWindow::on_action_New_triggered() { if (canClose()) { sGame.clear(); sGame.setUserInterface(Scenario::uiFull); updateDisplay(); mqQueue.clear(); addRecent(""); sFileName = ""; updateUndoRedo(); } } void MainWindow::updateDisplay() { switch (sGame.userInterface()) { case Scenario::uiFull: on_actionFull_triggered(); break; case Scenario::uiSimple: on_actionSimple_triggered(); break; case Scenario::uiMusic: on_actionMusic_triggered(); break; case Scenario::uiDesign: on_actionDesign_triggered(); break; case Scenario::uiNoMusic: on_actionNoMusic_triggered(); break; } treePlot->setTree(&sGame.plot()); textNotes->setNotes(&sGame.notes()); treeHistory->setTree(&sGame.history()); treeMusic->setTree(&sGame.music()); treeFX->setTree(&sGame.effects()); tableStats->setLists(&sGame.properties(),&sGame.characters()); musicPlayer->stop(); siCurrentMusic = 0; checkRepeat->setChecked(false); updateTimeDisplay(); } void MainWindow::on_buttonMusic_clicked() { switch (musicPlayer->state()) { case QMediaPlayer::PlayingState: { musicPlayer->pause(); buttonMusic->setText(QApplication::translate("mainWindow","&Resume",0)); break; } case QMediaPlayer::PausedState: { musicPlayer->play(); buttonMusic->setText(QApplication::translate("mainWindow","&Pause",0)); break; } default: { // we play the selected song (if it is a sound item) QTreeWidgetItem *qItem = treeMusic->currentItem(); if (qItem) { Item *item = dynamic_cast(qItem)->branch()->item(); if (item->type()==Item::tSound) { SoundItem *sItem = dynamic_cast(item); playMusic(sItem); } } } } } void MainWindow::updateTimeDisplay() { if (musicPlayer->state() == QMediaPlayer::StoppedState) { // resets the display labelPosition->setText("0:00/0:00"); buttonMusic->setText(QApplication::translate("mainWindow","&Play",0)); sliderMusic->setEnabled(false); } else { // update of the position display int position_s = musicPlayer->position() / 1000; int duration = musicPlayer->duration() / 1000; labelPosition->setText(QString("%1:%2/%3:%4").arg(position_s/60).arg(position_s%60,2,10,QChar('0')).arg(duration/60).arg(duration%60,2,10,QChar('0'))); } } void MainWindow::playMusic(const SoundItem *item) { if (item) { siCurrentMusic = item; musicPlayer->setMedia(QUrl::fromLocalFile(item->fileName().c_str())); musicPlayer->play(); } else { QMessageBox::critical(this,QApplication::translate("mainWindow","Error",0), QApplication::translate("mainWindow","Unable to play the file",0)); } } void MainWindow::stopMusic(const SoundItem *item) { if (item == siCurrentMusic) { siCurrentMusic = 0; musicPlayer->stop(); updateTimeDisplay(); } } void MainWindow::playSound(const SoundItem *item) { if (item) { soundPlayer->setMedia(QUrl::fromLocalFile(item->fileName().c_str())); soundPlayer->play(); } } void MainWindow::on_action_Reload_triggered() { if (!canClose()) { return; } if (sFileName.isEmpty()) { on_action_Load_triggered(); } else { QFileInfo file(sFileName); // test of the existence if (!file.exists()) { QMessageBox::critical(this,QApplication::translate("mainWindow","Error",0),QApplication::translate("mainWindow","The file \"%1\" does not exist.",0).arg(sFileName)); sFileName = ""; updateDisplay(); return; } // changing current directory QDir::setCurrent(file.dir().path()); try { sGame.fromFile(sFileName.toStdString()); } catch (Poco::Exception &poco) { QMessageBox::critical(this,QApplication::translate("mainWindow","Error",0), QString(poco.displayText().c_str())); sGame.clear(); sFileName = ""; } catch (std::exception &e) { QMessageBox::critical(this,QApplication::translate("mainWindow","Error",0),QApplication::translate("mainWindow","The game cannot be loaded correctly for the following reason:",0) + "\n\n" + QString(e.what()) + "\n\n" + QApplication::translate("mainWindow","The game will be loaded anyway, but some features might not work properly.",0)); sGame.fromFile(sFileName.toStdString(), false); } updateDisplay(); mqQueue.clear(); updateUndoRedo(); if (!sGame.configuration().isValid()) { if (QMessageBox::warning(this, QApplication::translate("mainWindow", "Warning", 0), QApplication::translate("mainWindow", "The syntax of the game you have just loaded is not rigourously correct. Would you like to fix it now?"), QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { changeFormatIfNeeded(); } } } } void MainWindow::resizeEvent(QResizeEvent *e) { sUnmaximizedSize = e->oldSize(); QMainWindow::resizeEvent(e); } void MainWindow::addRecent(const QString &fileName) { if (fileName == sFileName) { return; } // delete the new file if already present int index = slRecent.indexOf(fileName); if (index != -1) { slRecent.removeAt(index); } if (!sFileName.isEmpty()) { // reorder the previous file if already present, add if not index = slRecent.indexOf(sFileName); if (index != -1) { slRecent.move(index,0); } else { slRecent.insert(0,sFileName); } } } void MainWindow::updateRecent() { // update the display QMenu *menu = actionR_ecent->menu(); menu->clear(); int i=1; QAction *action; for (QStringList::iterator it=slRecent.begin(); it != slRecent.end(); it++) { QFileInfo file(*it); if (file.exists()) { // file exists, so we add it into the menu action = menu->addAction(QString("&%1 ").arg(i)+file.fileName()); // mapping smRecent->setMapping(action,i); connect(action,SIGNAL(triggered()),smRecent,SLOT(map())); action->setStatusTip(*it); i++; if (i == RECENT_NUMBER) { // deletes all remaining files in the list slRecent.erase(it,slRecent.end()); break; } } else { // mark the list item to be deleted (*it) = ""; } } // delete empty items from the list slRecent = slRecent.filter(QRegExp(".+")); } void MainWindow::loadRecent(int index) { if (canClose()) { QString file(slRecent[index-1]); addRecent(file); sFileName = file; // no more modification check needed mqQueue.save(); on_action_Reload_triggered(); } } void MainWindow::on_action_Undo_triggered() { updateModification(mqQueue.undo(), true); updateUndoRedo(); } void MainWindow::updateModification(Modification *modification, bool undo) { if (!modification) return; switch (modification->type()) { case Modification::tTree: { TreeModification* treeModif = dynamic_cast(modification); Tree *adr = &treeModif->tree(); if (adr == &sGame.plot()) { treePlot->updateModification(treeModif, undo); } else if (adr == &sGame.history()) { treeHistory->updateModification(treeModif, undo); } else if (adr == &sGame.music()) { treeMusic->updateModification(treeModif, undo); } else if (adr == &sGame.effects()) { treeFX->updateModification(treeModif, undo); } break; } case Modification::tNote: textNotes->updateModification(dynamic_cast(modification), undo); break; case Modification::tCharacter: tableStats->updateModification(dynamic_cast(modification), undo); break; default : break; } } void MainWindow::on_action_Redo_triggered() { updateModification(mqQueue.redo(), false); updateUndoRedo(); } void MainWindow::registerModification(Modification *modification) { mqQueue.add(modification); updateUndoRedo(); } void MainWindow::updateUndoRedo() { action_Undo->setEnabled(mqQueue.undoable()); action_Redo->setEnabled(mqQueue.redoable()); bool modified = !mqQueue.isUpToDate() || textNotes->unregisteredModification(); action_Save->setEnabled(modified); QString windowTitle("GM-Assistant - "); QString title(sGame.metadata().title().c_str()); QString fileName(QFileInfo(sFileName).absoluteFilePath()); if (sFileName.isEmpty()) { // if no file name is given, we put "New game" instead fileName = QApplication::translate("mainWindow", "New game", 0); } if (!title.isEmpty()) { // if there is a title, we put the file name in parentheses windowTitle += title + " (" + fileName + ")"; } else { // otherwise we just put the file name windowTitle += fileName; } if (modified) { windowTitle += "*"; } setWindowTitle(windowTitle); } bool MainWindow::eventFilter(QObject *source, QEvent *e) { if (e->type() == QEvent::KeyPress) { QKeyEvent *event = dynamic_cast(e); Qt::KeyboardModifiers modifiers = event->modifiers(); switch (event->key()) { case Qt::Key_Z: // undo - redo if (modifiers == Qt::ControlModifier) { if (source == textNotes) { textNotes->checkModification(); } if (mqQueue.undoable()) { on_action_Undo_triggered(); } return true; } else if (modifiers == (Qt::ControlModifier | Qt::ShiftModifier)) { if (source == textNotes) { textNotes->checkModification(); } if (mqQueue.redoable()) { on_action_Redo_triggered(); } return true; } break; case Qt::Key_V: if (source == textNotes && modifiers == Qt::ControlModifier) { textNotes->forcePaste(); } break; case Qt::Key_X: if (source == textNotes && modifiers == Qt::ControlModifier) { textNotes->forceCut(); } break; default: if (source == textNotes && modifiers & Qt::ControlModifier) { textNotes->checkModification(); } break; } } return QMainWindow::eventFilter(source, e); } bool MainWindow::canClose() { textNotes->clearFocus(); if (pCombatDialog->isVisible()) { // if the combat manager is opened, we try to close it if (!pCombatDialog->close()) { // if it is not closed, we cannot close the game return false; } } if (mqQueue.isUpToDate()) { // no need for confirmation return true; } switch (QMessageBox::question(this, QApplication::translate("mainWindow", "Confirmation", 0), QApplication::translate("mainWindow", "The current game has been modified since the last save. If you continue, unsaved changes will be discarded.", 0), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Save: save(); case QMessageBox::Discard: return true; default: return false; } } void MainWindow::closeEvent(QCloseEvent *e) { if (canClose()) { QMainWindow::closeEvent(e); } else { e->ignore(); } } void MainWindow::on_action_Dice_triggered() { pDiceDialog->show(); } void MainWindow::on_action_Combat_triggered() { pSelectCharacterDialog->show(sGame.characters()); } void MainWindow::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { retranslateUi(this); updateUndoRedo(); } } void MainWindow::translationRequested(const QString &suffix) { tApplication->load(sInstall + "translations/gmassistant_" + suffix); #ifdef _WIN32 tSystem->load(sInstall + "translations/qtbase_" + suffix); #else tSystem->load("qtbase_" + suffix, QLibraryInfo::location(QLibraryInfo::TranslationsPath)); #endif } void MainWindow::displayError(QMediaPlayer::Error error) { if (error != QMediaPlayer::NoError) { QMessageBox::critical(this, QApplication::translate("mainWindow", "Error", 0), musicPlayer->errorString()); } } void MainWindow::on_action_Metadata_triggered() { Metadata &metadata = sGame.metadata(); Metadata oldMetadata(metadata); if (pMetadataDialog->exec(oldMetadata) == QDialog::Accepted) { Metadata newMetadata = pMetadataDialog->metadata(); if (oldMetadata != newMetadata) { metadata = newMetadata; registerModification(new MetadataModification(metadata, newMetadata, oldMetadata)); } } } void MainWindow::changeFormatIfNeeded(bool askForUpdate) { IOConfig config = sGame.configuration(); if (askForUpdate) { sGame.setVersion(config.version()); } else { sGame.setVersion(Version()); } if (config.isArchived() == sGame.configuration().isArchived()) { save(askForUpdate); } else { // we need to choose another file if (!on_actionS_ave_as_triggered()) { // cancels the configuration change sGame.setConfig(config); } } } void MainWindow::changeCurrentMusic(const SoundItem *oldItem, const SoundItem *newItem) { if (oldItem == siCurrentMusic) { siCurrentMusic = newItem; } } void MainWindow::onMusicStateChanged(QMediaPlayer::State state) { switch (state) { case QMediaPlayer::PlayingState: { sliderMusic->setEnabled(true); buttonMusic->setText(QApplication::translate("mainWindow","&Pause",0)); break; } case QMediaPlayer::StoppedState: { if (checkRepeat->isChecked()) { playMusic(siCurrentMusic); } else { updateTimeDisplay(); } break; } default: break; } } void MainWindow::onMusicPositionChanged(qint64 position) { sliderMusic->setValue(position); updateTimeDisplay(); } void MainWindow::onMusicDurationChanged(qint64 duration) { sliderMusic->setMaximum(duration); updateTimeDisplay(); } void MainWindow::on_sliderMusic_sliderMoved(int position) { musicPlayer->setPosition(position); } GM-Assistant-1.2.3/sources/windows/MainWindow.h000066400000000000000000000300231371475637000214040ustar00rootroot00000000000000/************************************************************************* * Copyright © 2011-2020 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #ifndef HEADER_MAINWINDOW #define HEADER_MAINWINDOW #include "ui_MainWindow.h" #include "Scenario.h" #include "AboutDialog.h" #include "DiceDialog.h" #include "SelectCharacterDialog.h" #include #include #include "ModificationQueue.h" #include "ItemDialog.h" #include "MetadataDialog.h" #include // number of recently opened games stored #define RECENT_NUMBER 5 /*! * \brief Main window of the application */ class MainWindow: public QMainWindow, private Ui::mainWindow { private: //! Music player QMediaPlayer *musicPlayer; //! Sound player QMediaPlayer *soundPlayer; /*! * \brief File name of the current game */ QString sFileName; //! Information dialog window AboutDialog *pAboutDial; //! Dice simulation dialog window DiceDialog *pDiceDialog; //! Character selection dialog window SelectCharacterDialog *pSelectCharacterDialog; //! Combat manager dialog window CombatDialog *pCombatDialog; /*! * \brief Previous size of the window before being maximized */ QSize sUnmaximizedSize; /*! * \brief List of recently opened games */ QStringList slRecent; /*! * \brief Signal mapper for actions related to recently opened games */ QSignalMapper *smRecent; /*! * \brief SoundItem of the current music */ const SoundItem *siCurrentMusic; //! Queue of modifications ModificationQueue mqQueue; //! Application translator QTranslator *tApplication; //! System translator QTranslator *tSystem; //! Installation directory QString sInstall; //! Signal mapper for the available languages QSignalMapper *smLanguage; //! Metadata editor MetadataDialog *pMetadataDialog; //! Scenario Scenario sGame; //! Item editor ItemDialog *pItemDialog; /*! * \brief Game saver * \param askForUpdate Indicates if the user should be asked to update an outdated game * * Saves the game */ void save(bool askForUpdate = true); protected: // overriden methods /*! * \brief ResizeEvent handler * \param e Event raised * * Stores the old size for unmaximizing just after startup */ void resizeEvent(QResizeEvent *e); /*! * \brief Event filter * \param source Source of the event * \param e Event * * Intercepts locally handled events related to global shortcuts */ bool eventFilter(QObject *source, QEvent *e); /*! * \brief CloseEvent handler * \param e Event to handle * * Checks unsaved modifications before closing */ void closeEvent(QCloseEvent *e); /*! * \brief ChangeEvent handler * \param e Event to handle * * Updates the translation when changing language */ void changeEvent(QEvent *e); public: /*! * \brief Constructor of the main window * \param install_dir Installation directory * * Initializes various things */ MainWindow(const QString &install_dir); /*! * \brief Destructor of the main window * * Saves window's display parameters and other options before closing the application */ ~MainWindow(); Q_OBJECT private slots: // actions /*! * \brief Slot for cleaning the layout */ void clearLayout(); /*! * \brief Slot for "Music" menu item * * Change the layout to Music */ void on_actionMusic_triggered(); /*! * \brief Slot for "Simple" menu item * * Change the layout to Simple */ void on_actionSimple_triggered(); /*! * \brief Slot for "Full" menu item * * Change the layout to Full */ void on_actionFull_triggered(); /*! * \brief Slot for "Design" menu item * * Change the layout to Design */ void on_actionDesign_triggered(); /*! * \brief Slot for "NoMusic" menu item * * Change the layout to No Music */ void on_actionNoMusic_triggered(); void on_actionAbout_triggered(); /*! * \brief Slot for the "Quit" menu item * * Closes the application */ void on_action_Quit_triggered(); /*! * \brief Slot for the "Load" menu item * * Loads a game selected in a dialog window */ void on_action_Load_triggered(); /*! * \brief Slot for the "Save" menu item * * Saves the game */ void on_action_Save_triggered(); /*! * \brief Slot for the "Save as" menu item * \return True if a file has been chosen and saved * * Saves the game in a new file */ bool on_actionS_ave_as_triggered(); /*! * \brief Slot for the "New" menu item * * Opens an empty game */ void on_action_New_triggered(); /*! * \brief Slot for the "Reload" menu item * * Reloads the current game */ void on_action_Reload_triggered(); /*! * \brief Slot for the "Dice simulator" menu item * * Launches the dice simulator */ void on_action_Dice_triggered(); /*! * \brief Slot for the "Combat manager" menu item * * Launches the character selection dialog window before the combat manager */ void on_action_Combat_triggered(); /*! * \brief Slot for when the music button is clicked * * Play, pause or resume the current music */ void on_buttonMusic_clicked(); /*! * \brief Time display update in the music player */ void updateTimeDisplay(); /*! * \brief Display update * * Updates the display when the current game is changed or reloaded */ void updateDisplay(); // play music and sound /*! * \brief Play a music file associated with a SoundItem * \param item Pointer to the soundItem * * Plays the music file only if its duration is greater then zero */ void playMusic(const SoundItem *item); /*! * \brief Stop the music of a soundItem * \param item Pointer to the soundItem we want to stop */ void stopMusic(const SoundItem *item); /*! * \brief Play a sound file associated with a SoundItem * \param item Pointer to the soundItem */ void playSound(const SoundItem *item); /*! * \brief Recent files update when opening a new file * \param fileName File to be opened * * Adds the file to the list of the recently opened games */ void addRecent(const QString &fileName); /*! * \brief Recent files list update * * Deletes non-existent files in the list of recently opened files and limits their number */ void updateRecent(); /*! * \brief Slot for the "Recent" submenu items * \param index Index of the action triggered * * Loads the corresponding game */ void loadRecent(int index); /*! * \brief Slot for the Undo menu item * * Undoes the last modification */ void on_action_Undo_triggered(); /*! * \brief Slot for the Redo menu item * * Redoes the last undone modification */ void on_action_Redo_triggered(); /*! * \brief Slot for new modifications * \param modification Modification to register * * Pushes the new modification into the queue */ void registerModification(Modification *modification); /*! * \brief Slot for the update of undo/redo actions * * Enables or disables undo/redo actions */ void updateUndoRedo(); /*! * \brief Slot for the update after a modification * \param modification Modification which has just been made * \param undo True if undoing, false if redoing * * Updates the display of the right widget */ void updateModification(Modification *modification, bool undo); /*! * \brief Test before closing a game * \return True if the user wants to close * * If the game has been modified since the last save, the user is asked confirmation before closing */ bool canClose(); /*! * \brief Slot for when a language is selected * \param suffix Suffix of the language * * Retranslates the interface */ void translationRequested(const QString &suffix); /*! * \brief Slot for error messages from the music player * \param error Error to display */ void displayError(QMediaPlayer::Error error); /*! * \brief Slot for the Metadata menu item * * Displays the metadata editor */ void on_action_Metadata_triggered(); /*! * \brief Slot used to change a file format if needed * \param askForUpdate Indicates if the user is asked to update an outdated game * * If a new file format is needed to save the game, it asks for a new file. * If askForUpdate is false, it updates the game. */ void changeFormatIfNeeded(bool askForUpdate = true); /*! * \brief Slot to change the current sound item without modifying the playback * \param oldItem Old sound item * \param newItem New sound item */ void changeCurrentMusic(const SoundItem *oldItem, const SoundItem *newItem); /*! * \brief Slot used whenever the state of the music player changes * \param state New state of the music player * * It is used to detect when the playback starts and stops */ void onMusicStateChanged(QMediaPlayer::State state); /*! * \brief Slot used when the position in the music player has changed * \param position */ void onMusicPositionChanged(qint64 position); /*! * \brief Slot used when the duration in the music player has changed * \param duration */ void onMusicDurationChanged(qint64 duration); /*! * \brief Slot used when the slider is moved * \param position New position */ void on_sliderMusic_sliderMoved(int position); }; #endif GM-Assistant-1.2.3/sources/windows/MainWindow.ui000066400000000000000000000445231371475637000216040ustar00rootroot00000000000000 mainWindow 0 0 878 598 GM-Assistant :/data/images/GMA.svg:/data/images/GMA.svg Plot true true true QAbstractItemView::InternalMove Qt::MoveAction true true true 1 History true true true QAbstractItemView::InternalMove Qt::MoveAction true true true 1 Notes Qt::NoContextMenu false false Characters QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked QAbstractItemView::SingleSelection QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel Sound effects true true true QAbstractItemView::InternalMove Qt::MoveAction true true true 1 Music true true true QAbstractItemView::InternalMove Qt::MoveAction true true true 1 Qt::NoFocus Browse the music file 0 0 Qt::Horizontal Play/Pause/Resume the music &Play 0:00/0:00 Qt::AlignCenter Enable/Disable loop playing &Loop 0 0 878 24 &Game &Help &View false &Language &Interface &Edit &Tools &New Create a new game Ctrl+N &Load Load a game Ctrl+O &Save Save the current game Ctrl+S S&ave as Save the current game in a new file Ctrl+Shift+S &Quit Exit the application Ctrl+Q About &GM-Assistant Display information about GM-Assistant F1 &Reload Reload the current game Ctrl+R R&ecent Load a recently opened game true true &Full Tools shown: Plot, Notes, Characters, History, Music and Sound effects F5 true &Music Tools shown: Music and Sound effects F7 true &Simple Tools shown: Plot, Music and Sound effects F6 true &Design Tools shown: Plot, Characters and Notes F8 true &No Music Tools shown: Plot, Characters, History and Notes F9 &Undo Undo the last modification Ctrl+Z &Redo Redo the last undone modification Ctrl+Shift+Z &Dice simulator Throw virtual dices Ctrl+D &Combat manager Manage round per round combats Ctrl+B true &English &Metadata Edit the game metadata Ctrl+M About &Qt Display information about Qt QCustomTreeWidget QTreeWidget
QCustomTreeWidget.h
QCustomTableWidget QTableWidget
QCustomTableWidget.h
QCustomTextEdit QTextEdit
QCustomTextEdit.h
GM-Assistant-1.2.3/sources/windows/MetadataDialog.cpp000066400000000000000000000047761371475637000225430ustar00rootroot00000000000000/************************************************************************* * Copyright © 2013 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #include "MetadataDialog.h" MetadataDialog::MetadataDialog(QWidget *parent): QDialog(parent) { setupUi(this); } void MetadataDialog::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { retranslateUi(this); } } int MetadataDialog::exec(const Metadata &metadata) { mMetadata = metadata; // Updating the widgets lineTitle->setText(metadata.title().c_str()); lineAuthor->setText(metadata.author().c_str()); // Creation date Metadata::Date date = metadata.creationDate(); QDate qDate(date.year(), date.month(), date.day()); dateCreation->setDate(qDate); textDescription->setText(metadata.description().c_str()); lineRpg->setText(metadata.rpg().c_str()); linePlayers->setText(metadata.players().c_str()); // Game date date = metadata.gameDate(); qDate = QDate(date.year(), date.month(), date.day()); dateGame->setDate(qDate); return QDialog::exec(); } void MetadataDialog::accept() { mMetadata.setTitle(lineTitle->text().toStdString()); mMetadata.setAuthor(lineAuthor->text().toStdString()); QDate qDate = dateCreation->date(); mMetadata.setCreationDate(Metadata::Date(qDate.day(), qDate.month(), qDate.year())); mMetadata.setDescription(textDescription->toPlainText().toStdString()); mMetadata.setRpg(lineRpg->text().toStdString()); mMetadata.setPlayers(linePlayers->text().toStdString()); qDate = dateGame->date(); mMetadata.setGameDate(Metadata::Date(qDate.day(), qDate.month(), qDate.year())); // parent QDialog::accept(); } Metadata MetadataDialog::metadata() const { return mMetadata; } GM-Assistant-1.2.3/sources/windows/MetadataDialog.h000066400000000000000000000040361371475637000221750ustar00rootroot00000000000000/************************************************************************* * Copyright © 2013 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #ifndef HEADER_METADATADIALOG #define HEADER_METADATADIALOG #include "ui_MetadataDialog.h" #include "Metadata.h" /*! * \brief Metadata editor */ class MetadataDialog: public QDialog, private Ui::metadataDialog { private: //! Underlying metadata Metadata mMetadata; protected: /*! * \brief ChangeEvent handler * \param e Event to handle * * Updates the translation when changing language */ void changeEvent(QEvent *e); public: /*! * \brief Constructor * \param parent Parent widget */ MetadataDialog(QWidget *parent = 0); /*! * \brief Execution of the dialog window * \param metadata Current metadata * \return Result of the execution */ int exec(const Metadata &metadata); /*! * \brief Slot for when the modifications have been accepted * * Modifies the underlying metadata */ void accept(); /*! * \brief Getter for the metadata * \return Metadata */ Metadata metadata() const; }; #endif GM-Assistant-1.2.3/sources/windows/MetadataDialog.ui000066400000000000000000000106761371475637000223720ustar00rootroot00000000000000 metadataDialog 0 0 393 434 Game metadata QLayout::SetFixedSize Metadata QLayout::SetMaximumSize Title Author dd/MM/yyyy Creation date Description Players dd/MM/yyyy Game date Role-playing game Qt::LeftToRight QDialogButtonBox::Cancel|QDialogButtonBox::Ok true lineTitle lineAuthor dateCreation textDescription lineRpg linePlayers dateGame buttonBox buttonBox accepted() metadataDialog accept() 137 410 4 394 buttonBox rejected() metadataDialog reject() 284 417 324 393 GM-Assistant-1.2.3/sources/windows/SelectCharacterDialog.cpp000066400000000000000000000103461371475637000240450ustar00rootroot00000000000000/************************************************************************* * Copyright © 2013-2020 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #include "SelectCharacterDialog.h" #include #include SelectCharacterDialog::SelectCharacterDialog(QWidget *parent, CombatDialog *combatDialog): QDialog(parent), pCombat(combatDialog) { setupUi(this); } void SelectCharacterDialog::show(const CharacterList &list) { // ask confirmation before closing the combat manager if already open if (pCombat->isVisible()) { if (QMessageBox::question(this, QApplication::translate("selectCharacterDialog", "Confirmation", 0), QApplication::translate("selectCharacterDialog", "You are about to reset the combat manager. You will lose all information about the ongoing combat. Are you sure you want to do it?", 0), QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { reject(); return; } else { pCombat->setVisible(false); } } // initialisation listAll->clear(); for (CharacterList::const_iterator it = list.begin(); it != list.end(); it++) { listAll->addItem((*it).name().c_str()); } listInvolved->clear(); QDialog::show(); } void SelectCharacterDialog::accept() { int n = listInvolved->count(); if (n > 1) { QStringList list; for (int i = 0; i < n; i++) { list.append(listInvolved->item(i)->text()); } pCombat->show(list); QDialog::accept(); } else { QMessageBox::critical(this, QApplication::translate("selectCharacterDialog", "Uncompleted character selection", 0), QApplication::translate("selectCharacterDialog", "You have selected too few characters. There must be at least two of them.", 0)); } } void SelectCharacterDialog::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { retranslateUi(this); } } void SelectCharacterDialog::on_pushAdd_clicked() { QListWidgetItem *item = listAll->currentItem(); if (item) { int position = listInvolved->currentRow(); if (position < 0) { listInvolved->addItem(item->text()); } else { // if an item is selected in the list of involved characters, insert the new one just after and select it listInvolved->insertItem(position+1, item->text()); listInvolved->setCurrentRow(position+1); } } } void SelectCharacterDialog::on_pushRemove_clicked() { QListWidgetItem *item = listInvolved->currentItem(); if (item) { listInvolved->removeItemWidget(item); delete item; } } void SelectCharacterDialog::on_pushUp_clicked() { int n = listInvolved->currentRow(); if (n > 0) { QListWidgetItem *item = listInvolved->takeItem(n); listInvolved->insertItem(n - 1, item); listInvolved->setCurrentRow(n - 1); } } void SelectCharacterDialog::on_pushDown_clicked() { int n = listInvolved->currentRow(); if (n >= 0 && n < listInvolved->count()-1) { QListWidgetItem *item = listInvolved->takeItem(n); listInvolved->insertItem(n + 1, item); listInvolved->setCurrentRow(n + 1); } } void SelectCharacterDialog::on_listAll_itemDoubleClicked(QListWidgetItem*) { on_pushAdd_clicked(); } void SelectCharacterDialog::on_listInvolved_itemDoubleClicked(QListWidgetItem*) { on_pushRemove_clicked(); } GM-Assistant-1.2.3/sources/windows/SelectCharacterDialog.h000066400000000000000000000063671371475637000235220ustar00rootroot00000000000000/************************************************************************* * Copyright © 2013-2020 Vincent Prat & Simon Nicolas * * 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 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *************************************************************************/ #ifndef HEADER_SELECTCHARACTERDIALOG #define HEADER_SELECTCHARACTERDIALOG #include "ui_SelectCharacterDialog.h" #include "CharacterList.h" #include "CombatDialog.h" /*! * \brief Dialog window used to select the characters involved in a combat */ class SelectCharacterDialog: public QDialog, private Ui::selectCharacterDialog { Q_OBJECT private: //! Combat manager dialog window CombatDialog *pCombat; protected: /*! * \brief ChangeEvent handler * \param e Event to handle * * Updates the translation when changing language */ void changeEvent(QEvent *e); public: /*! * \brief Default constructor * \param parent Parent widget * \param combatDialog Combat dialog window */ SelectCharacterDialog(QWidget *parent, CombatDialog *combatDialog); public slots: /*! * \brief Overriden slot for showing the dialog window * \param list List of characters * * Prepares the dialog window with the given list of characters */ void show(const CharacterList &list); /*! * \brief Slot for the Add button * * Adds a character to the list of involved characters */ void on_pushAdd_clicked(); /*! * \brief Slot for the Remove button * * Removes a character from the list of involved characters */ void on_pushRemove_clicked(); /*! * \brief Slot for the Up button * * Put a character a slot higher */ void on_pushUp_clicked(); /*! * \brief Slot for the Down button * * Put a character a lot lower */ void on_pushDown_clicked(); // Overriden slot void accept(); /*! * \brief Slot for double-clicking an item in the character list * * Adds the double-clicked character to the list of involved characters */ void on_listAll_itemDoubleClicked(QListWidgetItem*); /*! * \brief Slot for double-clicking an item in the list of involved characters * * Removes the double-clicked character from the list of involved characters */ void on_listInvolved_itemDoubleClicked(QListWidgetItem*); }; #endif GM-Assistant-1.2.3/sources/windows/SelectCharacterDialog.ui000066400000000000000000000114001371475637000236700ustar00rootroot00000000000000 selectCharacterDialog 0 0 565 421 Character selection QLayout::SetFixedSize All characters &Add :/data/images/add.svg:/data/images/add.svg &Remove :/data/images/remove.svg:/data/images/remove.svg Involved characters true QAbstractItemView::InternalMove &Up :/data/images/up.svg:/data/images/up.svg &Down :/data/images/down.svg:/data/images/down.svg 0 0 Qt::LeftToRight QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() selectCharacterDialog accept() 221 399 115 392 buttonBox rejected() selectCharacterDialog reject() 355 404 458 390 GM-Assistant-1.2.3/translations/000077500000000000000000000000001371475637000165255ustar00rootroot00000000000000GM-Assistant-1.2.3/translations/gmassistant_fr.ts000066400000000000000000001303711371475637000221260ustar00rootroot00000000000000 AboutDialog About GM-Assistant À propos de GM-Assistant Version: Version : Original idea: Simon Nicolas Idée originale : Simon Nicolas Development: Vincent Prat Développement : Vincent Prat Translation: Vincent Prat (French), Matteo Bugli (Italian) Traduction : Vincent Prat (français), Matteo Bugli (italien) GM-Assistant is a free software designed to assist the Game Master during role-playing games. GM-Assistant est un logiciel libre conçu pour assister le Maître du Jeu lors de parties de jeu de rôle. License: GPLv3+ Licence : GPLv3+ &Close &Fermer changeCharacterDialog New name Nouveau nom Character's name: Nom du personnage : Short description: Description rapide : &Validate &Valider &Cancel A&nnuler You must fill the content before validating. Vous devez remplir le contenu avant de valider. Incomplete data Données incomplètes changePropertyDialog New name Nouveau nom Name of the property: Nom de la propriété : &Validate &Valider &Cancel A&nnuler You must fill the content before validating. Vous devez remplir le contenu avant de valider. Incomplete data Données incomplètes combatDialog Combat manager Gestionnaire de combat Notes Notes &Next &Suivant &Remove S&upprimer &Close &Fermer Current character: Personnage actuel : Confirmation Confirmation You are about to remove %1 from the combat manager. Are you sure you want to do it? Vous êtes sur le point de retirer %1 du gestionnaire de combat. Êtes-vous sûr de vouloir le faire ? You are about to close the combat manager. You will lose all information about the ongoing combat. Are you sure you want to do it? Vous êtes sur le point de fermer le gestionnaire de combat. Vous perdrez toutes les informations sur le combat en cours. Êtes-vous sûr de vouloir le faire ? customTable &Add &Ajouter &Property &Propriété Add a new property Ajoute une nouvelle propriété &Remove &Supprimer &Edit &Éditer Remove the property Supprime la propriété Edit the property Édite la propriété &Character P&ersonnage Add a new character Ajoute un nouveau personnage Remove the character Supprime le personnage Edit the character Édite le personnage customTree &None &Aucun Untag the item Retire toute étiquette de l'item In &progress En &cours Tag the item as being in progress Marque l'item comme étant en cours &Failed &Échoué Tag the item as failed Marque l'item comme échoué &Succeeded &Réussi Tag the item as succeeded Marque l'item comme réussi &Add A&jouter Add a new item Ajoute un nouvel item &Remove &Supprimer Remove the item Supprime l'item &Edit É&diter Edit the item Édite l'item E&xport E&xporter Export the file associated to the item Exporte le fichier associé à l'item Select where to export the file Sélectionnez où exporter le fichier Error Erreur Unable to export the file Impossible d'exporter le fichier Audio files can be played only in the Music and Sound effects modules. Les fichiers audios ne peuvent être joués que dans les modules Musique et Bruitages. Play the audio file Joue le fichier audio Unable to display the file Impossible d'afficher le fichier P&lay J&ouer Display the image Affiche l'image Disp&lay A&fficher included in the loaded file inclus dans le fichier chargé Double click to play the file Double-cliquez pour jouer le fichier Double click to show the file Double-cliquez pour afficher l'image diceDialog Dice simulator Simulateur de dés Die type: Type de dé : Number of dice: Nombre de dés : &Throw &Lancer &Reset &Mettre à zéro &Close &Fermer itemDialog Create a new item Créer un nouvel item Content Contenu State État &None &Aucun &In progress En &cours &Failed &Échoué &Succeeded &Réussi Type Type &Basic &Basique A&udio A&udio I&mage &Image File: Fichier : &Add A&jouter C&hild En&fant &Cancel A&nnuler Audio files (*) Fichiers audio (*) You must select a file before validating. Vous devez sélectionner un fichier avant de valider. You must fill the content before validating. Vous devez remplir le contenu avant de valider. Select the image file to associate to the item Sélectionnez le fichier image à associer à l'item Select the audio file to associate to the item Sélectionnez le fichier audio à associer à l'item Incomplete data Données incomplètes Image files (*.jpg *.jpeg *.png *.bmp *.svg) Fichiers image (*.jpg *.jpeg *.png *.bmp *.svg) Edit the item Éditer l'item &Validate &Valider mainWindow History Historique Sound effects Bruitages Music Musique Plot Intrigue Notes Notes Characters Personnages Browse the music file Navigue dans le fichier musical Play/Pause/Resume the music Joue/pause/reprend la musique &Play &Lecture Enable/Disable loop playing Active/désactive le jeu en boucle &Loop &Boucle &Game &Jeu &View &Affichage &Language &Langue &Interface &Interface &Edit &Édition &Tools &Outils &New &Nouveau Create a new game Crée un nouveau jeu &Load &Charger Load a game Charge un jeu &Save &Enregistrer Save the current game Sauvegarde le jeu en cours S&ave as Enregistrer &sous Save the current game in a new file Sauvegarde le jeu en cours dans un nouveau fichier &Quit &Quitter Exit the application Sort de l'application About &Qt À propos de &Qt Display information about Qt Informations à propos de Qt Display information about GM-Assistant Informations à propos de GM-Assistant &Reload &Recharger Reload the current game Recharge le jeu en cours R&ecent R&écents Load a recently opened game Charge un jeu ouvert récemment &Full &Complète Tools shown: Music and Sound effects Outils affichés : Musique et Bruitages Throw virtual dices Jette des dés virtuels &Combat manager &Gestionnaire de combat Manage round per round combats Gère les combats au tour par tour &English &Metadata &Métadonnées Edit the game metadata Édite les métadonnées du jeu &Help A&ide About &GM-Assistant À propos de &GM-Assistant Tools shown: Plot, Notes, Characters, History, Music and Sound effects Outils affichés : Intrigue, Notes, Personnages, Historique, Musique et Bruitages &Music &Musique &Simple &Simple Tools shown: Plot, Music and Sound effects Outils affichés : Intrigue, Musique et Bruitages &Design C&onception &Undo &Annuler Undo the last modification Annule la dernière modification &Redo &Refaire Redo the last undone modification Refait la dernière modification annulée &Dice simulator &Simulateur de dés Tools shown: Plot, Characters and Notes Outils affichés : Intrigue, Personnages et Notes &No Music S&ans son Tools shown: Plot, Characters, History and Notes Outils affichés : Intrigue, Personnages, Historique et Notes &Pause &Pause &Resume &Reprise Error Erreur Select the file to open Sélectionnez le fichier à ouvrir GM-Assistant files (*.gms *.gma);;XML files (*.xml) Fichiers GM-Assistant (*.gms *.gma);;Fichiers XML (*.xml) The game will be loaded anyway, but some features might not work properly. Le jeu va tout de même être chargé, mais certaines fonctionnalités peuvent ne pas fonctionner normalement. The game cannot be loaded correctly for the following reason: Le jeu n'a pas pu être chargé pour la raison suivante : Warning Attention The syntax of the game you have just loaded is not rigourously correct. Would you like to fix it now? La syntaxe du jeu que vous venez de charger n'est pas rigoureusement correcte. Voulez-vous la corriger maintenant ? The game you want to save does not use the latest version of GM-Assistant files. Do you want to update it? If no, some features may not be saved properly. Le jeu que vous voulez sauvegarder n'utilise pas la dernière version de fichiers GM-Assistant. Voulez-vous le mettre à jour ? Si non, certaines fonctionnalités peuvent ne pas être sauvegardées correctement. GM-Assistant files (1.2) (*.gms) Fichiers GM-Assistant (1.2) (*.gms) ;;GM-Assistant files (1.1) (*.gma);;GM-Assistant files (1.0) (*.xml) ;;Fichiers GM-Assistant (1.1) (*.gma);;Fichiers GM-Assistant (1.0) (*.xml) Select the file to save Sélectionnez le fichier à sauvegarder Unable to play the file Impossible de jouer le fichier The file "%1" does not exist. Le fichier "%1" n'existe pas. Confirmation Confirmation The current game has been modified since the last save. If you continue, unsaved changes will be discarded. Le jeu en cours a été modifié depuis la dernière sauvegarde. Si vous continuez, les changements non sauvegardés seront perdus. New game Nouveau jeu metadataDialog Game metadata Métadonnées du jeu Metadata Métadonnées Title Titre Author Auteur Creation date Date de création Description Description Players Joueurs Game date Date de jeu Role-playing game Jeu de rôle selectCharacterDialog Character selection Sélection de personnages All characters Tous les personnages &Add A&jouter &Remove &Retirer Involved characters Personnages impliqués &Up &Haut &Down &Bas Confirmation Confirmation You are about to reset the combat manager. You will lose all information about the ongoing combat. Are you sure you want to do it? Vous êtes sur le point de réinitialiser le gestionnaire de combat. Vous perdrez toutes les informations sur le combat en cours. Êtes-vous sûr de vouloir le faire ? Uncompleted character selection Sélection des personnages incomplète You have selected too few characters. There must be at least two of them. Vous avez sélectionné trop peu de personnages. Il doit y en avoir au moins deux. GM-Assistant-1.2.3/translations/gmassistant_it.ts000066400000000000000000001321621371475637000221330ustar00rootroot00000000000000 AboutDialog About GM-Assistant A proposito di GM-Assistant Version: Versione: Original idea: Simon Nicolas Idea originale: Simon Nicolas Development: Vincent Prat Sviluppo: Vincent Prat Translation: Vincent Prat (French), Matteo Bugli (Italian) Traduzione: Vincent Prat (francese), Matteo Bugli (italiano) GM-Assistant is a free software designed to assist the Game Master during role-playing games. GM-Assistant è un programma libero pensato per assistere il Game Master durante sessioni di giochi di ruolo. License: GPLv3+ Licensa: GPLv3+ &Close &Chiudi changeCharacterDialog New name Nuovo nome Character's name: Nome del personaggio: Short description: Breve descrizione: &Validate &Conferma &Cancel &Annulla You must fill the content before validating. Devi inserire il contenuto prima di confermare. Incomplete data Dati incompleti changePropertyDialog New name Nuovo nome Name of the property: Is property intended as an item or object, a characteristic...? Nome della proprietà: &Validate &Conferma &Cancel &Annulla You must fill the content before validating. Devi inserire il contenuto prima di confermare. Incomplete data Dati incompleti combatDialog Combat manager It sounds a little artificial, maybe we could stick with combat manager Gestore di combattimento Current character: Personaggio corrente: Notes Appunti &Next &Successivo &Remove &Rimuovi &Close &Chiudi Confirmation Conferma You are about to remove %1 from the combat manager. Are you sure you want to do it? Same combat manager doubt. Stai per rimuovere %1 dal gestore di combattimento. Sei sicuro di volerlo fare? You are about to close the combat manager. You will lose all information about the ongoing combat. Are you sure you want to do it? Stai per chiudere il gestore di combattimento. Perderai tutte le informazioni sul combattimento. Sei sicuro di volerlo fare? customTable &Property &Proprietà &Add &Aggiungi Add a new property Aggiungi una nuova proprietà &Remove &Rimuovi Remove the property Rimuovi la proprietà &Edit &Modifica Edit the property Modifica la proprietà &Character P&ersonaggio Add a new character Aggiungi un nuovo personaggio Remove the character Rimuovi il personaggio Edit the character Modifica il personaggio customTree Audio files can be played only in the Music and Sound effects modules. I file audio possono essere riprodotti solo nei moduli Musica e Effetti sonori. Unable to display the file Impossibile visualizzare il file Play the audio file Riproduci il file audio P&lay R&iproduci Display the image Visualizza l'immagine Disp&lay &Visualizza &None &Nessuno Untag the item What do you mean by tag? Rimuovi il segnalino dall'oggetto In &progress In &corso Tag the item as being in progress I assumed 'in progress' meant 'not ready yet, still working on it'. Segna l'oggetto come in corso &Failed &Fallito Tag the item as failed Segna l'oggetto come fallito &Succeeded &Riuscito Tag the item as succeeded Segna l'oggetto come riuscito &Add &Aggiungi Add a new item Aggiungi un nuovo oggetto &Remove R&imuovi Remove the item Rimuovi l'oggetto &Edit &Modifica Edit the item Modifica l'oggetto E&xport &Esporta Export the file associated to the item Esporta il file associato all'oggetto Select where to export the file Seleziona dove esportare il file Error Errore Unable to export the file Impossibile esportare il file included in the loaded file incluso nel file caricato Double click to play the file Doppio click per riprodurre il file Double click to show the file Doppio click per visualizzare il file diceDialog Dice simulator Simulatore di dadi Die type: Tipo di dado: Number of dice: Numero di dadi: &Throw &Lancia &Reset &Resetta &Close &Chiudi itemDialog Create a new item Crea un nuovo oggetto Content Contenuto State Stato &None &Nessuno &In progress In &corso &Failed &Fallito &Succeeded &Riuscito Type Tipo &Basic A more appropiate translation would maybe be "di base", but they are two words. Di &base A&udio A&udio I&mage &Immagine File: File: &Add &Aggiungi C&hild Ba&mbino &Cancel Annu&lla Select the audio file to associate to the item Seleziona il file audio da associare all'oggetto You must select a file before validating. Devi selezionare un file prima di confermare. Incomplete data Dati incompleti You must fill the content before validating. Devi inserire il contenuto prima di confermare. Select the image file to associate to the item Seleziona il file immagine da associare all'oggetto Image files (*.jpg *.jpeg *.png *.bmp *.svg) File immagine (*.jpg *.jpeg *.png *.bmp *.svg) Edit the item Modifica l'oggetto &Validate C&onferma Audio files (*) File audio (*) mainWindow Plot Trama History Does it refer to a list of previous actions/events or has it to do with the story? Cronologia Notes Appunti Characters Personaggi Sound effects Effetti sonori Music Musica Browse the music file Scorri il file musicale Play/Pause/Resume the music Riproduci/interrompi/riprendi la musica &Play &Riproduci Enable/Disable loop playing Attiva/Disattiva riproduzione continua &Loop The adjective "continua" used to render "loop playing" would be ambiguous here. &Loop &Game &Gioco &Help &Aiuto &View Is it intended as a verb? &Visualizza &Language &Lingua &Interface &Interfaccia &Edit &Modifica &Tools &Strumenti &New &Nuovo Create a new game Crea un nuovo gioco &Load &Carica Load a game Carica un gioco &Save &Salva Save the current game Salva il gioco corrente S&ave as S&alva come Save the current game in a new file Salva il gioco corrente in un nuovo file &Quit Esc&i Exit the application Esci dall'applicazione About &GM-Assistant A proposito di &GM-Assistant Display information about GM-Assistant Mostra informazioni riguardo GM-Assistant &Reload &Ricarica Reload the current game Ricarica il gioco corrente R&ecent R&ecente Load a recently opened game Carica un gioco aperto di recente &Full &Completo Tools shown: Plot, Notes, Characters, History, Music and Sound effects Strumenti visualizzati: Trama, Appunti, Personaggi, Cronologia, Musica ed Effetti sonori &Music &Musica Tools shown: Music and Sound effects Strumenti visualizzati: Musica ed Effetti sonori &Simple &Semplice Tools shown: Plot, Music and Sound effects Strumenti visualizzati: Trama, Musica ed Effetti sonori &Design What is the context here? &Progettazione Tools shown: Plot, Characters and Notes Strumenti visualizzati: Trama, Personaggi e Appunti &No Music &Niente musica Tools shown: Plot, Characters, History and Notes Strumenti visualizzati: Trama, Personaggi, Cronologia e Appunti &Undo &Annulla Undo the last modification Annulla l'ultima modifica &Redo &Ripeti Redo the last undone modification Ripeti l'ultima modifica annullata &Dice simulator &Simulatore di dadi Throw virtual dices Tira i dadi virtuali &Combat manager &Gestore di combattimento Manage round per round combats Gestisci i combattimenti round per round &English Is it required? The French file has no entry here &Inglese &Metadata &Metadati Edit the game metadata Modifica i metadati del gioco About &Qt A proposito di &Qt Display information about Qt Informazioni su Qt Error Errore Select the file to open Seleziona il file da aprire GM-Assistant files (*.gms *.gma);;XML files (*.xml) File GM-Assistant (*.gms *.gma);;File XML (*.xml) The game cannot be loaded correctly for the following reason: Il gioco non può essere caricato correttamente per i seguenti motivi: The game will be loaded anyway, but some features might not work properly. Il gioco sarà caricato comunque, ma alcuni aspetti potrebbero non funzionare correttamente. Warning Attenzione The syntax of the game you have just loaded is not rigourously correct. Would you like to fix it now? La sintassi del gioco che hai appena caricato non è rigorosamente corretta. Vuoi correggerla ora? The game you want to save does not use the latest version of GM-Assistant files. Do you want to update it? If no, some features may not be saved properly. Il gioco che vuoi salvare non utilizza la versione più recente di GM-Assistant. Vuoi aggiornarlo? Se no, alcuni aspetti potrebbero non essere salvati correttamente. GM-Assistant files (1.2) (*.gms) File GM-Assistant (1.2) (*.gms) ;;GM-Assistant files (1.1) (*.gma);;GM-Assistant files (1.0) (*.xml) ;;File GM-Assistant (1.1) (*.gma);;File GM-Assistant (1.0) (*.xml) Select the file to save Seleziona il file da salvare &Resume &Riprendi &Pause &Pausa Unable to play the file Impossibile riprodurre il file The file "%1" does not exist. Il file "%1" non esiste. New game Nuovo gioco Confirmation Conferma The current game has been modified since the last save. If you continue, unsaved changes will be discarded. Il gioco corrente è stato modificato dall'ultimo salvataggio. Se continui, le modifiche non salvate andranno perse. metadataDialog Game metadata Metadati del gioco Metadata Metadati Title Titolo Author Autore Creation date Data di creazione Description Descrizione Players Giocatori Game date Data del gioco Role-playing game Gioco di ruolo selectCharacterDialog Character selection Selezione del personaggio All characters Tutti i personaggi &Add Agg&iungi &Remove &Rimuovi Involved characters Personaggi coinvolti &Up &Su &Down &Giù Confirmation Conferma You are about to reset the combat manager. You will lose all information about the ongoing combat. Are you sure you want to do it? Stai per resettare il gestore di combattimento. Perderai tutte le informazioni sul combattimento in corso. Sei sicuro di volerlo fare? Uncompleted character selection Selezione dei personaggi incompleta You have selected too few characters. There must be at least two of them. Hai selezionato troppo pochi personaggi. Ce ne devono essere almeno due. GM-Assistant-1.2.3/translations/languages000066400000000000000000000000451371475637000204150ustar00rootroot00000000000000&English: &Français:fr &Italiano:it